使用说明
AfterDS 2.0 组件库
一个基于AfterDS 2.0设计系统的、功能齐全且易于访问的组件库,采用React、TypeScript和Tailwind CSS构建。
组件
- 输入 - 具有多种状态和验证功能的文本输入
- 按钮 - 具有多种变体和状态的按钮组件
- 徽章 - 小型状态指示器,具有多种变体
- 手风琴 - 带有平滑动画的可折叠内容部分
- 警报 - 适用于不同情境的变体通知消息
特点/特性
输入组件
- 多个州默认状态、悬停状态、聚焦状态、错误状态、成功状态和禁用状态
- 柔性标签支持必填和可选字段指示器
- 辅助文本显示辅助文本、错误消息或成功消息
按钮组件
- 6个变体主要(Primary)、次要(Secondary)、大纲(Outline)、幽灵(Ghost)、链接(Link)和次要链接(Link Secondary)
- 2个尺寸小号(sm)和中号(md)
- 国家正常状态、悬停状态、聚焦状态、禁用状态和加载状态
- 破坏模式红色设计表示具有破坏性的操作
- 图标支持按钮文本前后的图标
- 加载状态内置加载旋转指示器
徽章组件
- 4种变体默认、次要、破坏性(或“危险”)和轮廓
- 2 形状圆形(药丸形)和方形(略带圆角)
- 国家正常状态、悬停状态和聚焦状态
- 紧凑设计小型、轻便的状态指示器
- 灵活内容支持文本、数字或图标
手风琴组件
- 2种模式单选(仅一项开启)或多选(多项开启)
- 流畅的动画动画展开/折叠过渡效果
- 国家关闭、打开和悬停
- 受控/不受控支持有控制和无控制的使用方式
- 可访问的完整的键盘导航和ARIA支持
- 灵活内容可以包含任何内容(文本、图像、表单等)
警报组件
- 2 种变体“Default and Destructive” 翻译成中文是“默认且具有破坏性”
- 灵活结构标题、描述或自定义内容
- 图标默认图标或自定义图标支持
- ARIA 支持为无障碍性设置正确的role="alert"
- 响应式的适应不同屏幕尺寸
将军
- 可访问的采用无障碍设计最佳实践构建
- TypeScript全面支持TypeScript,提供完整的类型定义
- Tailwind CSS使用Tailwind CSS设计,便于自定义
- 故事书交互式组件文档和测试
- Inter 字体使用Inter字体家族的专业排版
设计令牌(或设计变量)
该组件使用的是AfterDS 2.0设计令牌:
- 颜色自定义色板,符合设计系统
- **字体排印学(或简称“排版”)**具有定义字体大小和粗细的Inter字体系列
- 间距一致的间距尺度(2, 2.5, 3, 4 等)
- 边框半径定义的边框半径值(小、中、大)
安装
# Install dependencies
npm install
用法
输入组件
基本示例
import { Input } from './components/Input';
function MyForm() {
const [email, setEmail] = useState('');
return (
<Input
label="Email"
placeholder="Enter your email"
value={email}
onChange={(e) => setEmail(e.target.value)}
helperText="We'll never share your email"
/>
);
}
输入属性(或:传入属性)
| 属性 | 类型 | 默认值 | 描述 |
|---|---|---|---|
label |
string |
- | 输入框的标签文本 |
isRequired |
boolean |
false |
显示必填星号 (*) |
isOptional |
boolean |
false |
显示“(可选)”文本 |
helperText |
string |
- | 输入框下方的帮助文本 |
error |
string |
- | 错误信息(激活错误状态) |
success |
string |
- | 成功消息(激活成功状态) |
variant |
'default' | 'error' | 'success' |
'default' |
输入变体 |
fullWidth |
boolean |
false |
全宽输入 |
disabled |
boolean |
false |
禁用状态 |
所有标准的HTML输入属性也均受支持。
示例
必填字段
<Input
label="Email"
placeholder="Enter your email"
isRequired
helperText="This field is required"
/>
可选字段
<Input
label="Phone Number"
placeholder="Optional phone"
isOptional
helperText="For account recovery"
/>
错误状态
<Input
label="Email"
placeholder="user@example.com"
error="Please enter a valid email address"
/>
成功状态
<Input
label="Username"
placeholder="Choose username"
success="This username is available!"
/>
禁用状态
<Input
label="Username"
placeholder="Cannot edit"
disabled
helperText="This field is disabled"
/>
按钮组件
基本示例
import { Button } from './components/Button';
function MyApp() {
return (
<>
<Button variant="primary" size="md">
Click Me
</Button>
<Button variant="secondary" size="sm" isLoading>
Loading...
</Button>
</>
);
}
按钮属性(或按钮属性集)
| 属性 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| (翻译结果) | ------ | ------ | --------- |
按钮变体样式 size |
'sm' | 'md' |
'md' |
|
| 按钮尺寸 | destructive |
boolean |
false |
| 具有破坏性的动作设计(红色) | isLoading |
boolean |
false |
| 使用旋转图标显示加载状态 | iconBefore |
ReactNode |
|
| - | 按钮文字前的图标 | iconAfter |
ReactNode |
| - | 按钮文字后的图标 | fullWidth |
boolean |
| 宽度为全屏的按钮 | disabled |
boolean |
false |
| 禁用状态 |
所有标准的HTML按钮属性也都被支持。
按钮示例
const PlusIcon = () => (
<svg width="16" height="16" viewBox="0 0 16 16" fill="none">
<path d="M8 3.5V12.5M3.5 8H12.5" stroke="currentColor" strokeWidth="1.5"/>
</svg>
);
<Button variant="primary" iconBefore={<PlusIcon />} iconAfter={<PlusIcon />}>
Add Item
</Button>
带有图标
<Button variant="primary" destructive>
Delete Account
</Button>
破坏性行动
<Button variant="secondary" isLoading>
Processing...
</Button>
加载状态
<Button variant="link" size="md">
Learn More
</Button>
链接按钮
徽章组件
import { Badge } from './components/Badge';
function MyApp() {
return (
<>
<Badge variant="default">New</Badge>
<Badge variant="secondary">Beta</Badge>
<Badge variant="destructive">Error</Badge>
<Badge variant="outline">Draft</Badge>
</>
);
}
基本示例
徽章属性
| 属性 | 类型 | 默认值 | 描述 |
|------|------|---------|-------------| variant | 'default' \| 'secondary' \| 'destructive' \| 'outline' | 'default' |
| 徽章变体风格 | rounded | boolean | true |
| 完全圆角(药丸形)或轻微圆角 |
所有标准的HTML span属性也均受支持。
徽章示例
<Badge variant="default" rounded>Rounded</Badge>
<Badge variant="default" rounded={false}>Square</Badge>
圆角与方形
<Badge variant="default">Active</Badge>
<Badge variant="secondary">Pending</Badge>
<Badge variant="destructive">Failed</Badge>
<Badge variant="outline">Draft</Badge>
状态指示器
<Badge variant="default">1</Badge>
<Badge variant="secondary">12</Badge>
<Badge variant="destructive">99+</Badge>
带数字
<p>
New feature <Badge variant="default">New</Badge>
</p>
<p>
You have <Badge variant="destructive">3</Badge> errors
</p>
内联使用
手风琴组件
import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from './components/Accordion';
function FAQ() {
return (
<Accordion type="single">
<AccordionItem value="item-1">
<AccordionTrigger>Is it accessible?</AccordionTrigger>
<AccordionContent>
Yes. It adheres to the WAI-ARIA design pattern.
</AccordionContent>
</AccordionItem>
<AccordionItem value="item-2">
<AccordionTrigger>Is it styled?</AccordionTrigger>
<AccordionContent>
Yes. It comes with default styles that match the design system.
</AccordionContent>
</AccordionItem>
</Accordion>
);
}
基本示例
手风琴道具
手风琴(容器)
| 属性 | 类型 | 默认值 | 描述 |
|------|------|---------|-------------| type | 'single' \| 'multiple' | 'single' |
| 允许打开一个或多个项目 | defaultValue | string \| string[] |
| - | 默认打开的项目(未受控) | value | string \| string[] |
| - | 受控未结事项 | onValueChange | (value) => void |
| - | 当项目更改时的回调函数 |
“AccordionItem”翻译成中文是“折叠面板项”或“手风琴面板项”,具体取决于上下文和设计习惯,但通常指的是在用户界面中用于展示可折叠/展开内容的组件或项目
| 属性 | 类型 | 默认值 | 描述 |
|------|------|---------|-------------| value (翻译为中文可保持原样,因为表格标题通常不直接翻译,但为符合要求,可解释为:)|------|------|---------|-------------|(表格列标题,分别表示:)|------|(第一列)|------|(第二列)|---------|(第三列)|-------------|(第四列) string |
| disabled | - | 此项的唯一值(必填) | boolean | false |
|
| 禁用该项目 |
<Accordion type="single">
<AccordionItem value="item-1">
<AccordionTrigger>Question 1</AccordionTrigger>
<AccordionContent>Answer 1</AccordionContent>
</AccordionItem>
<AccordionItem value="item-2">
<AccordionTrigger>Question 2</AccordionTrigger>
<AccordionContent>Answer 2</AccordionContent>
</AccordionItem>
</Accordion>
手风琴示例
<Accordion type="multiple">
<AccordionItem value="item-1">
<AccordionTrigger>Question 1</AccordionTrigger>
<AccordionContent>Answer 1</AccordionContent>
</AccordionItem>
<AccordionItem value="item-2">
<AccordionTrigger>Question 2</AccordionTrigger>
<AccordionContent>Answer 2</AccordionContent>
</AccordionItem>
</Accordion>
单模式(仅打开一个项目)
<Accordion type="single" defaultValue="item-1">
{/* items... */}
</Accordion>
多重模式(多个项目打开)
const [value, setValue] = useState('item-1');
<Accordion type="single" value={value} onValueChange={setValue}>
{/* items... */}
</Accordion>
带有默认未结项目
受控手风琴
import { Alert } from './components/Alert';
function MyApp() {
return (
<>
<Alert
variant="default"
title="Heads up!"
description="You can add components to your app using the cli."
/>
<Alert
variant="destructive"
title="Error"
description="Your session has expired. Please log in again."
/>
</>
);
}
警报组件
基本示例
警报属性
| 属性 | 类型 | 默认值 | 描述 | variant |------|------|---------|-------------| 'default' \| 'destructive' | 'default' |
| title | 警告变体样式 | string |
| description | - | 警报标题 | string |
| icon | - | 警报描述/信息 | ReactNode |
|
| - | 自定义图标(未提供时使用默认图标) |
所有标准的HTML div属性也均受支持。
<Alert
variant="default"
title="Heads up!"
description="You can add components to your app using the cli."
/>
警报示例
<Alert
variant="destructive"
title="Error"
description="Your session has expired. Please log in again."
/>
默认警报
<Alert variant="default" title="Update Available" />
破坏性警报
<Alert
variant="destructive"
description="Something went wrong. Please try again."
/>
仅标题
<Alert
variant="default"
title="Custom"
description="Alert with custom icon"
icon={<CustomIcon />}
/>
仅描述
<Alert variant="default" title="Markdown Support">
<p>You can use custom content:</p>
<ul>
<li>Bullet points</li>
<li>Links and buttons</li>
</ul>
</Alert>
自定义图标
带有自定义内容
- 现场演示已部署的站点 主应用程序
- **:**https://guigonzalez.github.io/design-system-mcp/ 翻译为中文是:“https://guigonzalez.github.io/设计系统-MCP/”(注:实际网址翻译中,网址本身通常保持不变,这里的翻译仅针对网址描述部分进行,即“design-system-mcp”被翻译为“设计系统-MCP”,但实际使用时网址仍应保持原样)。不过,更常见的做法是直接保留网址不变,仅在需要解释或说明时提供中文描述。因此,简化的表述可以是:“该网址为:https://guigonzalez.github.io/design-system-mcp/” 故事书
: main https://guigonzalez.github.io/design-system-mcp/storybook/(中文可表述为:https://guigonzalez.github.io/design-system-mcp/storybook/(该网址指向一个设计系统的故事书页面))
两个网站都会通过GitHub Actions在每次推送时自动部署
分支。
npm run dev
发展 运行开发服务器 开放
http://localhost:5173 翻译为中文是:“本地主机:5173 端口”。不过,在中文语境中,我们通常不会直接这样翻译网址,而是会说“访问本地开发服务器的5173端口”或者“在本地运行的开发服务器上,通过5173端口访问”。但简化的翻译就是“本地主机:5173”
npm run storybook
查看演示。 运行 Storybook 开放
http://localhost:6006 翻译为中文是:“本地主机上的6006端口”。不过,通常我们不会直接这样翻译网址,而是根据上下文或用途来解释或描述它。在这个例子中,网址表示的是在本地计算机上运行的一个服务或应用,可以通过本地主机(localhost)和端口6006来访问
npm run build
查看Storybook。
npm run build-storybook
构建
构建Storybook main 部署
- 这个项目通过GitHub Actions自动部署到GitHub Pages。每次向(仓库)推送更改时
- 分支触发一个部署工作流,该工作流:
- 构建主应用程序
构建Storybook 将两者都部署到GitHub Pages如需详细的部署文档,请参阅
docs/deployment.md 翻译为中文是:“文档/部署指南.md” 或者 “docs/部署说明.md”(具体翻译可能根据上下文略有调整,但基本意思是“关于部署的文档文件”)
src/
├── components/
│ ├── Input/
│ │ ├── Input.tsx # Input component
│ │ ├── Input.stories.tsx # Input Storybook stories
│ │ └── index.ts # Exports
│ ├── Button/
│ │ ├── Button.tsx # Button component
│ │ ├── Button.stories.tsx # Button Storybook stories
│ │ └── index.ts # Exports
│ ├── Badge/
│ │ ├── Badge.tsx # Badge component
│ │ ├── Badge.stories.tsx # Badge Storybook stories
│ │ └── index.ts # Exports
│ ├── Accordion/
│ │ ├── Accordion.tsx # Accordion component
│ │ ├── Accordion.stories.tsx # Accordion Storybook stories
│ │ └── index.ts # Exports
│ └── Alert/
│ ├── Alert.tsx # Alert component
│ ├── Alert.stories.tsx # Alert Storybook stories
│ └── index.ts # Exports
├── index.css # Global styles & Tailwind
├── App.tsx # Demo app
└── main.tsx # Entry point
。
组件结构
定制化 tailwind.config.jsTailwind 配置
该组件使用了在(某处)定义的自定义 Tailwind 配置
colors: {
background: '#fcfaf8',
foreground: '#181818',
primary: { DEFAULT: '#ef6c00', foreground: '#ffffff' },
secondary: { DEFAULT: '#ffefd9', foreground: '#ef6c00' },
muted: { DEFAULT: '#f5f5f5', foreground: '#353535' },
destructive: { DEFAULT: '#dc2626', foreground: '#ffffff' },
success: { DEFAULT: '#16a34a', foreground: '#ffffff' },
accent: { DEFAULT: '#ffffff', foreground: '#181818' },
input: '#353535',
border: '#e7e5e4',
}
在那里,您可以自定义颜色、间距以及其他设计元素。
- 颜色标记/颜色代币
- 浏览器支持
- Chrome(最新版)
- Firefox(最新版)
Safari(最新版)
Edge(最新版)