本节将介绍如何参与 Tailwind CSS 社区生态建设,包括插件开发、组件贡献、文档建设等方面。
插件开发
插件基础结构
// plugins/myPlugin.js
const plugin = require('tailwindcss/plugin')
module.exports = plugin(function({ addUtilities, addComponents, theme }) {
// 添加工具类
addUtilities({
'.custom-utility': {
padding: theme('spacing.4'),
backgroundColor: theme('colors.blue.500'),
color: theme('colors.white'),
borderRadius: theme('borderRadius.lg')
}
})
// 添加组件
addComponents({
'.custom-component': {
backgroundColor: theme('colors.white'),
borderRadius: theme('borderRadius.lg'),
padding: theme('spacing.6'),
boxShadow: theme('boxShadow.lg')
}
})
}, {
// 配置项
theme: {
extend: {
colors: {
custom: {
100: '#f0f9ff',
500: '#0ea5e9',
900: '#0c4a6e'
}
}
}
}
})
插件发布流程
// package.json
{
"name": "tailwindcss-custom-plugin",
"version": "1.0.0",
"main": "index.js",
"files": [
"index.js",
"styles.css"
],
"peerDependencies": {
"tailwindcss": "^3.0.0"
},
"scripts": {
"build": "postcss styles.css -o dist/styles.css",
"test": "jest",
"prepublishOnly": "npm run build && npm test"
}
}
组件贡献
组件开发规范
// components/CustomButton.tsx
interface CustomButtonProps {
variant?: 'primary' | 'secondary';
size?: 'sm' | 'md' | 'lg';
className?: string;
children: React.ReactNode;
}
const CustomButton: React.FC<CustomButtonProps> = ({
variant = 'primary',
size = 'md',
className = '',
children
}) => {
const baseStyles = 'inline-flex items-center justify-center rounded-lg font-medium transition-colors'
const variantStyles = {
primary: 'bg-blue-500 text-white hover:bg-blue-600',
secondary: 'bg-gray-100 text-gray-900 hover:bg-gray-200'
}
const sizeStyles = {
sm: 'px-3 py-1.5 text-sm',
md: 'px-4 py-2 text-base',
lg: 'px-6 py-3 text-lg'
}
return (
<button
className={[
baseStyles,
variantStyles[variant],
sizeStyles[size],
className
].join(' ')}
>
{children}
</button>
)
}
export default CustomButton
组件文档规范
# CustomButton
可定制的按钮组件,支持多种样式变体和尺寸。
## 安装
npm install @your-org/custom-button
## 使用
import CustomButton from '@your-org/custom-button'
function App() {
return (
<CustomButton
variant="primary"
size="md"
className="my-custom-class"
>
点击我
</CustomButton>
)
}
## Props
| 属性 | 类型 | 默认值 | 说明 |
|----------|----------|-----------|----------|
| variant | string | 'primary' | 按钮变体 |
| size | string | 'md' | 按钮尺寸 |
| className| string | '' | 自定义类名 |
| children | ReactNode| - | 按钮内容 |
文档建设
文档站点结构
// docs/components/Layout.tsx
const Layout: React.FC = ({ children }) => {
return (
<div className="min-h-screen bg-white">
{/* 导航栏 */}
<nav className="bg-white shadow-sm">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="flex justify-between h-16">
<div className="flex">
<div className="flex-shrink-0 flex items-center">
<img
className="h-8 w-auto"
src="/logo.svg"
alt="Logo"
/>
</div>
<div className="hidden sm:ml-6 sm:flex sm:space-x-8">
<a
href="#"
className="border-blue-500 text-gray-900 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium"
>
文档
</a>
{/* 更多导航项 */}
</div>
</div>
</div>
</div>
</nav>
{/* 主要内容 */}
<div className="py-10">
<main>
<div className="max-w-7xl mx-auto sm:px-6 lg:px-8">
{children}
</div>
</main>
</div>
</div>
)
}
MDX 集成示例
// docs/pages/components/button.mdx
import { CustomButton } from '@/components'
# 按钮组件
按钮用于触发操作或事件。
## 基础用法
<CustomButton>默认按钮</CustomButton>
<CustomButton>默认按钮</CustomButton>
变体
<div className="space-x-4">
<CustomButton variant="primary">主要按钮</CustomButton>
<CustomButton variant="secondary">次要按钮</CustomButton>
</div>
<CustomButton variant="primary">主要按钮</CustomButton>
<CustomButton variant="secondary">次要按钮</CustomButton>
## API
| 参数 | 说明 | 类型 | 默认值 |
|----------|---------|---------|----------|
| variant | 变体样式 | string | 'primary'|
| size | 尺寸 | string | 'md' |
社区互动
Issue 模板
# Issue 模板
## 问题类型
- [ ] Bug 报告
- [ ] 功能请求
- [ ] 文档改进
- [ ] 其他
## 问题描述
[详细描述你的问题]
## 复现步骤
1. [第一步]
2. [第二步]
3. [更多步骤...]
## 期望行为
[描述你期望看到的结果]
## 实际行为
[描述实际发生的情况]
## 环境信息
- Tailwind CSS 版本:
- Node.js 版本:
- 浏览器版本:
- 操作系统:
## 其他信息
[其他相关信息]
Pull Request 模板
# Pull Request 模板
## 变更说明
[描述这个 PR 做了什么]
## 变更类型
- [ ] Bug 修复
- [ ] 新功能
- [ ] 代码优化
- [ ] 文档更新
- [ ] 其他
## 检查清单
- [ ] 代码遵循项目规范
- [ ] 添加了必要的测试
- [ ] 更新了相关文档
- [ ] 所有测试通过
- [ ] 变更已经在本地测试
## 关联 Issue
Fixes #[issue number]
## 截图(如果适用)
[添加截图]
## 其他说明
[其他需要说明的内容]
最佳实践
插件开发
- 遵循命名规范
- 完善的文档
- 充分的测试
组件贡献
- 组件职责单一
- 接口设计合理
- 样式可定制
文档建设
- 结构清晰
- 示例完整
- 及时更新
社区参与
- 积极回应问题
- 遵循贡献规范
- 维护友好氛围