@ptengine/design-components 0.5.3 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/COMPONENTS-DESIGN-SYSTEM.md +329 -0
  2. package/README.md +11 -176
  3. package/dist/components/ui/prompt-picker.d.ts.map +1 -1
  4. package/dist/components/ui/search-input.d.ts +2 -2
  5. package/dist/components/ui/select.d.ts +1 -1
  6. package/dist/components/ui/select.d.ts.map +1 -1
  7. package/dist/index.cjs +2 -77
  8. package/dist/index.js +2082 -20894
  9. package/llms.txt +20 -0
  10. package/package.json +3 -2
  11. package/src/components/ui/accordion.tsx +2 -2
  12. package/src/components/ui/alert-dialog.tsx +2 -2
  13. package/src/components/ui/alert.tsx +2 -2
  14. package/src/components/ui/attachment.tsx +4 -4
  15. package/src/components/ui/avatar.tsx +3 -3
  16. package/src/components/ui/badge.tsx +1 -1
  17. package/src/components/ui/breadcrumb.tsx +1 -1
  18. package/src/components/ui/bubble.tsx +2 -2
  19. package/src/components/ui/button-group.tsx +1 -1
  20. package/src/components/ui/button.tsx +4 -4
  21. package/src/components/ui/calendar.tsx +3 -3
  22. package/src/components/ui/card.tsx +1 -1
  23. package/src/components/ui/chart.tsx +2 -2
  24. package/src/components/ui/command.tsx +5 -5
  25. package/src/components/ui/context-menu.tsx +6 -6
  26. package/src/components/ui/dialog.tsx +2 -2
  27. package/src/components/ui/drawer.tsx +2 -2
  28. package/src/components/ui/dropdown-menu.tsx +6 -6
  29. package/src/components/ui/empty.tsx +3 -3
  30. package/src/components/ui/field.tsx +6 -6
  31. package/src/components/ui/input-group.tsx +3 -3
  32. package/src/components/ui/input-otp.tsx +1 -1
  33. package/src/components/ui/input.tsx +1 -1
  34. package/src/components/ui/item.tsx +3 -3
  35. package/src/components/ui/kbd.tsx +1 -1
  36. package/src/components/ui/label.tsx +1 -1
  37. package/src/components/ui/marker.tsx +1 -1
  38. package/src/components/ui/menubar.tsx +7 -7
  39. package/src/components/ui/message.tsx +3 -3
  40. package/src/components/ui/native-select.tsx +1 -1
  41. package/src/components/ui/navigation-menu.tsx +1 -1
  42. package/src/components/ui/prompt-picker.tsx +6 -4
  43. package/src/components/ui/search-input.tsx +2 -2
  44. package/src/components/ui/select.tsx +3 -3
  45. package/src/components/ui/sheet.tsx +2 -2
  46. package/src/components/ui/sidebar.tsx +9 -9
  47. package/src/components/ui/table.tsx +2 -2
  48. package/src/components/ui/tabs.tsx +3 -3
  49. package/src/components/ui/textarea.tsx +1 -1
  50. package/src/components/ui/toggle.tsx +4 -4
  51. package/src/components/ui/tooltip.tsx +1 -1
@@ -0,0 +1,329 @@
1
+ # PT Components Design System — 组件设计规范
2
+
3
+ > **真值源**:本文件。对外发布的 `llms.txt` 由本文件派生 —— 改这里必须同步它(见文末「本文件的生长规则」)。
4
+ > **怎么装、怎么用、有哪些组件** → [README.md](./README.md)
5
+ > **代码约定与协作流程** → [CLAUDE.md](./CLAUDE.md)
6
+
7
+ ---
8
+
9
+ ## 0 这份文件管什么,不管什么
10
+
11
+ 本库服务**多个产品**,不专属于任何一个。由此得出三条边界:
12
+
13
+ - **只写「产品无关」的规范** —— 组件的结构、交互状态、可访问性、token 的槽位与语义、
14
+ 尺度刻度。判据是一句话:
15
+
16
+ > 把这条规则里的产品名换成另一个产品,还成立吗?
17
+ > **成立 → 属于本文件;不成立 → 属于那个产品自己的设计文件。**
18
+
19
+ - **不写任何单一产品的品牌取值与产品级模式** —— 具体品牌色值、品牌渐变、信息架构、
20
+ 页面模板、领域交互,一律归各产品自己的设计文件(如 `apps/x/design.md`)。
21
+ - **依赖单向**:产品的设计文件引用本文件;**本文件不引用、也不受任何产品设计文件约束**。
22
+ 本库仓内不得出现指向某个产品仓文件的规范性引用。
23
+
24
+ **token 是这条边界的接口**:本库定义槽位存在、它在哪些组件的哪些态上生效;
25
+ 产品决定它取什么值。换个产品换一套值就换了皮,本库一行不改。
26
+
27
+ ---
28
+
29
+ ## Token 的硬规矩
30
+
31
+ - **唯一数据源是 `src/styles/tokens.css`** —— 三层嵌套(③ shadcn 别名 → ② PTEngine
32
+ 语义层 → ① 原语层纯通道三元组)。透明度只在语义层以 `var(--pt-x) / a` 表达,
33
+ 明暗差异只在语义层覆盖。`tailwind.preset.js` 定义 Token → Tailwind 颜色键映射。
34
+ 完整说明见 `tokens.css` 文件头注释。
35
+ - **尺度一律写 px 硬值,不用 `rem`** —— `rem` 会被宿主根字号缩放。本库要挂到不同宿主上,
36
+ 宿主的根字号不受我们控制(apps/x 就是 14px),用 `rem` 会让同一个组件在不同产品里
37
+ 大小不一。圆角、字号、控件高度、间距全部适用。
38
+ - **缺档就加档,不写任意值** —— 需要一个刻度上没有的数,是加档位,不是就地写
39
+ `rounded-[18px]` / `text-[15px]`。就地写会让每处各写各的数,刻度失效。
40
+
41
+ ---
42
+
43
+ ## 品牌视觉基调
44
+
45
+ 可以概括成「**克制、编辑感、内容优先**」——让整个界面看起来冷静、不吵:
46
+
47
+ - **近黑文字 + 暖灰中性色为绝对主体**,界面安静、不抢内容。文字灰阶全部由同一个
48
+ 近黑原语(`--pt-black`)配不同透明度得来(strong 90% / standard 70% / weak 40%),
49
+ 面与描边走 neutral 色阶与黑色低透明度叠加。
50
+ - **彩色是稀缺资源、按功能发放,而不是用来装饰**。品牌绿只给 Brand 场景(`bg-brand`)、
51
+ 语义色只表达状态(success / danger / warning / information / AI 角色 Token)、
52
+ chart 色板只给数据。没有功能含义的地方不出现彩色。
53
+ - **大字号标题 + 充足留白建立层级**,而非靠色块、分隔线与阴影。字阶见下方
54
+ Typography;Card / 表单控件等根元素无阴影也是同一原则的落地。
55
+
56
+ 新增组件或调整 variant 时先对照这三条:一个改动如果让界面「变吵」了
57
+ (多了一种装饰性颜色、多了一层非浮层阴影、层级靠色块而非字阶),方向就是错的。
58
+
59
+ ---
60
+
61
+ ## 交互状态规范(新组件接入必读)
62
+
63
+ 交互反馈统一走「状态层 State Layer」+ 中性交互 Token,**禁止**沿用 shadcn 官方的
64
+ 替换式写法(`hover:bg-primary/90`、`hover:bg-*/80` 等)。拷官方组件进来时按此适配:
65
+
66
+ | 官方写法 | 本库写法 | 说明 |
67
+ |---|---|---|
68
+ | `hover:bg-primary/90` / `hover:bg-*/80` | 变体类里加 `state-layer` | hover 在原样式上叠加 `--pt-interaction-hover`,active 自动叠加 `--pt-interaction-press`(定义见 `tailwind.preset.js`) |
69
+ | `hover:bg-accent hover:text-accent-foreground`(outline/ghost 等) | `state-layer` | 同上,文字色不再切换 |
70
+ | `focus:bg-accent` / `data-[highlighted]:bg-accent`(菜单项、下拉选项) | **保留原写法** | Radix 键盘高亮机制依赖 focus/highlighted 态;`--accent` 已指向 `--pt-interaction-hover`,效果与叠加一致 |
71
+ | `focus-visible:ring-ring` 等焦点环 | **保留原写法** | `--ring` 已指向 `--pt-interaction-focus`(中性 90%) |
72
+ | 持久「选中 / 激活 / 开」态(`data-[state=selected/on]`、`data-[active=true]`) | 元素底色用 `bg-selected` | `--pt-bg-selected` = 中性 8%,**与 hover 同色**;因为 hover 走 state-layer(叠加层而非替换背景),选中态被悬停时两层叠加 ≈ 16%,天然区分「选中」与「悬停」。**不要用品牌绿等彩色表达选中**(彩色只给 Brand / 语义 / 数据)。前提是该元素的 hover 必须是 state-layer 叠加;若 hover 仍是 `hover:bg-*` 替换式,则改用叠加式,或另加区分(如 sidebar 当前项用 `font-medium`) |
73
+ | 纯文字反馈(link 变体 `hover:underline`) | **保留原写法** | 不加状态层 |
74
+
75
+ ## Button 变体词汇(与 shadcn 官方的差异)
76
+
77
+ | 本库 variant | 样式 | 对应官方 |
78
+ |---|---|---|
79
+ | `default`(Primary) | 高强调黑,暗色反白,反转状态层 | 官方 default(本库 `--primary` 指向黑) |
80
+ | `brand` | 品牌绿 | 无(本库新增,`bg-brand`) |
81
+ | `secondary` | 描边白底 | 官方 **outline** 的样式 |
82
+ | `tertiary` | 灰底弱强调 | 官方 **secondary** 的样式 |
83
+
84
+ 拷官方组件/示例进来时:`variant="outline"` → `variant="secondary"`;
85
+ 官方 `variant="secondary"` 的场景按语义改用 `tertiary`。`--primary` 槽位为黑色,
86
+ 品牌绿一律走 `--brand` / `bg-brand`。
87
+
88
+ 想定制某组件观感(配色 / 尺寸 / 圆角),改该组件 cva `variants` 里的类即可全站生效;
89
+ Primary(黑,暗色反白)这类深色表面用 `state-layer-inverse`,其余用 `state-layer`。
90
+
91
+ 百分比只维护在 `src/styles/tokens.css` 语义层(`--pt-interaction-hover/press/focus`),
92
+ 调整后组件与 `/tokens` 展示页自动跟随。
93
+
94
+ ---
95
+
96
+ ## 圆角 Radius(六档)
97
+
98
+ | 类名 | 值 | 用在 |
99
+ |---|---|---|
100
+ | `rounded-sm` | 6px | sm 档控件(24px 高) |
101
+ | `rounded-md` | 8px | default / lg 档控件(32 / 40px 高) |
102
+ | `rounded-lg` | 10px | 卡片、弹窗、浮层 —— 基准档 |
103
+ | `rounded-12` | 12px | 更柔和的面板 |
104
+ | `rounded-16` | 16px | 页面级外壳、对话坞 |
105
+ | `rounded-20` | 20px | 需要强调圆润的大面 |
106
+
107
+ 正圆用 `rounded-full`。可视对照与选档指南见 playground 的 **Radius** 页。
108
+
109
+ **为什么大档位用 px 命名而不是 `xl` / `2xl`**:Tailwind 默认 `rounded-xl`=12px、
110
+ `rounded-2xl`=16px,与本库需要的 16 / 20 同名不同值。沿用 t 恤码会让从 shadcn / Tailwind
111
+ 生态抄来的代码**静默偏移几 px** —— 不报错、不警告,只是看着「有点不对」,极难自查。
112
+ `rounded-12/16/20` 在两边都不存在,不可能撞。
113
+
114
+ **两种产生方式有意混用**(改值前必读):
115
+
116
+ ```
117
+ --pt-radius 10px 手写,基准
118
+ --pt-radius-md calc(基准 − 2px) 派生 → 8px
119
+ --pt-radius-sm calc(基准 − 4px) 派生 → 6px
120
+ --pt-radius-12 12px 固定,不跟随基准
121
+ --pt-radius-16 16px 固定,不跟随基准
122
+ --pt-radius-20 20px 固定,不跟随基准
123
+ ```
124
+
125
+ 派生那套来自 shadcn(一个 `--radius` 旋钮整体缩放,档间恒差 2px);后加的三档要的是
126
+ 「更细的尺子」而不是「可整体缩放的比例」,且基准自建库起从未调过,那个旋钮实际没人用。
127
+ **后果**:真去调基准时,前三档会动、后三档不动 —— 这个分裂是有意的,不是漏改。要统一
128
+ 应把前三档也写死,而不是把后三档改成 calc(那会让 `rounded-16` 在基准变化后不再是 16px)。
129
+
130
+ ⚠️ **缺档就加档,不要硬写 `rounded-[18px]` 这类任意值**,否则每个面板各写各的数,刻度失效。
131
+
132
+ ---
133
+
134
+ ## 字体 Typography(中/日/英三语)
135
+
136
+ 品牌字体(源自 Figma `Type/Mode` 的 family 变量):EN `Inter` / JA `Noto Sans JP` /
137
+ ZH `Noto Sans SC`。库侧在 `tokens.css` 以 `--font-sans` + `:lang()` 声明三语字体栈
138
+ (`'Inter'` 置前,拉丁字符与数字三语统一用 Inter,CJK 落到 JP/SC;各栈带同语言
139
+ 系统字体回退),preset 将 `fontFamily.sans` 接到 `var(--font-sans)`。
140
+ 组件不声明字体,全部继承。(Figma 中 `family/code` / `family/metric` 亦为 Inter;
141
+ 代码展示场景仍保留等宽 `font-mono`,未用 Inter 覆盖。)
142
+
143
+ **字阶**(preset `fontSize` 整表覆盖,源自 Figma Text Styles,机读存档
144
+ `design/tokens.json`,**在源码仓里、不随 npm 包分发**):`2xs 12/16 · xs 13/20 · sm 14/20 · base 16/24 · lg 18/28 ·
145
+ xl 20/32 · 2xl 24/36 · 3xl 28/40 · 4xl 32/48 · 5xl 40/56 · 6xl 48/72 · 7xl 56/72 ·
146
+ 8xl 64/96 · 9xl 72/128`。与 Tailwind 默认的差异:新增 `2xs`;**`xs` 为 13px**(非 12);
147
+ `xl` 起行高/字号按设计表。字重五档:light 300 / normal 400 / medium 500 / semibold 600 / bold 700。
148
+
149
+ **行高按语言可分**:字号三语一致;行高走 `tokens.css` 的 `--lh-*` 变量
150
+ (`:root` = English 基准)。现行策略 ja/zh 沿用 English 值;后续精修时在
151
+ `:lang(ja)` / `:lang(zh)` 预留块中只填与英文不同的档位,全站自动生效,
152
+ 组件零改动(机制已验证:同字号、按语言不同行高)。
153
+
154
+ **消费方应用需要做的三件事:**
155
+
156
+ 1. **正确设置 `<html lang>`**(`en` / `zh-CN` / `ja`,i18n 框架切语言时同步更新)——
157
+ 字体栈按它切换,组件零改动。
158
+ 2. **加载字体文件**(库不打包字体):Next.js 用 `next/font/google`,或 fontsource /
159
+ `<link>` 引 Google Fonts。加载 300/400/500/600/700 五档字重。
160
+ 3. **中国大陆环境自托管 `Noto Sans SC`**(Google Fonts 大陆不可达),并做
161
+ unicode-range 子集切片(CJK 全量单字重为 MB 级)。
162
+
163
+ ## 组件内建文案的本地化(库不做 i18n,消费方传译文)
164
+
165
+ 个别组件自带可见文案或读屏(sr-only / aria-label)标签。库不引 i18n 框架,
166
+ 统一做法是**通过 prop 传入、默认英文**——做多语界面时把译文传进去,不传保持
167
+ 英文,对现有代码零影响。
168
+
169
+ | 组件 | prop | 默认值 |
170
+ |---|---|---|
171
+ | `SearchInput` | `clearLabel` | Clear |
172
+ | `PaginationPrevious` / `PaginationNext` | `label` | Previous / Next |
173
+ | `PaginationEllipsis` / `BreadcrumbEllipsis` | `label` | More pages / More |
174
+ | `DialogContent` / `SheetContent` | `closeLabel` | Close |
175
+ | `CarouselPrevious` / `CarouselNext` | `label` | Previous slide / Next slide |
176
+ | `SidebarTrigger` / `SidebarRail` | `label` | Toggle sidebar |
177
+ | `MessageScrollerButton` | `label` | Scroll to end / Scroll to start |
178
+ | `Spinner` | `label` | Loading |
179
+
180
+ ```tsx
181
+ <PaginationPrevious label={t('上一页')} />
182
+ <DialogContent closeLabel={t('关闭')}>…</DialogContent>
183
+ ```
184
+
185
+ 新组件若要内建文案,照此约定加 prop,不要写死字符串。
186
+
187
+ ---
188
+
189
+ ## 组件的行为契约
190
+
191
+ 以下几条约束的是**界面的行为**,不是某个组件的样式。适用范围要说清楚:
192
+
193
+ > 它们约束的是**用这套设计系统做出来的界面**,而不只是"用到了本库组件的地方"。
194
+ > 消费方手写的界面同样适用 —— 一个自己搭的加载态,和用了 `Spinner` 的加载态,
195
+ > 对用户来说没有区别,规则不该因为实现方式不同而失效。
196
+
197
+ ### 反馈:可点的看得出来,不可点的不要装
198
+
199
+ 可操作元素必须给出明确的交互反馈(hover / focus / active / disabled 四态齐全);
200
+ **没有实际功能的元素不得产生交互暗示** —— 不给手型光标、不给 hover 变化。
201
+
202
+ 本库的 state-layer 机制是这条的落地手段;这一节写的是它为什么必须做:
203
+ 交互暗示是用户判断"这能点吗"的唯一线索。给不能点的东西加暗示等于骗点击;
204
+ 能点的东西没有暗示,等于这个功能不存在。
205
+
206
+ ### 异步操作:三个状态一个都不能少
207
+
208
+ 任何触发请求的交互,都要显式设计三态:
209
+
210
+ | 状态 | 做法 |
211
+ |---|---|
212
+ | 进行中 | 按钮进 loading(同时禁掉重复点击),或区域上 skeleton。**禁止全屏遮罩式 spinner**,除非该操作真的锁死整页 |
213
+ | 成功 | 轻提示(toast),2–3 秒自动消失。成功是常态,不要用弹框打断 |
214
+ | 失败 | 必须说清**发生了什么**和**能做什么**(重试 / 换个输入 / 联系支持)。禁止只写"操作失败" |
215
+
216
+ 缺任何一态,用户都会卡在"它到底动没动"的疑问里,然后重复点击。
217
+
218
+ ### 空态:说清为什么空,并给出下一步
219
+
220
+ `Empty` 不是用来显示"暂无数据"的。它至少要回答两件事:
221
+
222
+ 1. **为什么空** —— 还没创建过 / 筛选后无结果 / 数据还在采集中,这三种是不同的文案。
223
+ 2. **下一步做什么** —— 对应给出创建入口 / 清除筛选 / 查看接入文档。
224
+
225
+ 空白处不要填装饰性插画。空态是用户最需要指引的时刻,也是最容易被做成死路的地方。
226
+
227
+ ### 颜色不能单独承载含义
228
+
229
+ 状态、涨跌、分类等信息**不得只靠颜色区分**,必须同时配图标、文字或形状。
230
+
231
+ 色盲用户、打印稿、低对比度屏幕上,只有颜色的信息等于没有信息。这是可访问性底线,
232
+ 不是风格偏好。本库的语义色(success / danger / warning / information)和 chart 色板
233
+ 是最容易违反这条的地方 —— 用它们的时候,检查一下拿掉颜色后信息还在不在。
234
+
235
+ ### 破坏性操作分两档
236
+
237
+ | | 做法 |
238
+ |---|---|
239
+ | **不可逆**(删除) | 二次确认(`AlertDialog`),确认按钮用错误色,文案写明操作对象 |
240
+ | **可逆**(移出列表、归档) | 不弹框,操作后给一个带撤销入口的 toast |
241
+
242
+ 一刀切地弹框,会让用户练成盲点确认,真正危险的那次也照点不误。
243
+
244
+ ### 权限三态
245
+
246
+ 同一个界面对不同权限的人应呈现三种形态,且必须可区分:
247
+
248
+ | 态 | 呈现 |
249
+ |---|---|
250
+ | **可编辑** | 正常交互,控件全部可用 |
251
+ | **只读** | 内容照常可读,控件不呈现为可交互(不是灰掉的按钮,是没有按钮);需要时说明为什么只读 |
252
+ | **无权限** | 内容不呈现,给出一句说明和申请路径 |
253
+
254
+ ⚠️ **只读不等于禁用**:禁用态(`disabled`)表达"现在不能用,但你有权用,条件不满足";
255
+ 只读表达"你没有这个权限"。两者用同一种灰色,会让用户一直等一个永远不会亮的按钮。
256
+ (参考 Carbon 的 enabled / read-only / disabled 三分。)
257
+
258
+ ---
259
+
260
+ ## 使用规约(消费方必读)
261
+
262
+ 本库经 npm 分发,消费方装的是**锁定的版本号**。因此改动的传播分两段,
263
+ 别把它们当成一回事:
264
+
265
+ | | 怎么发生 |
266
+ |---|---|
267
+ | **你在本地看到改动** | 开了覆盖开关就是即时的(见上一节),零流程 |
268
+ | **产品真正用上新版本** | 发版(打 tag → CI 发 npm)+ 消费方升版本号装一次,**不会自动** |
269
+
270
+ 第二段的手动闸门是有意的:库里手滑改错一行,不该让全线产品下次构建就跟着炸。
271
+
272
+ 要让改动能顺畅传播下去,业务项目使用时须遵守:
273
+
274
+ 1. **只从包入口引用**:`import { Button } from '@ptengine/design-components'`。
275
+ **禁止**把组件源码复制进业务项目——复制即与库脱钩,后续更新不再同步。
276
+ 2. **观感全部交给库**:颜色、字体、字号、圆角、阴影一律由组件与 token 提供。
277
+ 业务代码**禁止**硬编码色值(`#xxx` / `rgb()`)、字体名、字阶之外的字号;
278
+ 需要色彩语义时用 preset 暴露的 token 类(`text-muted-foreground`、
279
+ `bg-secondary`、`border-weak`、`bg-brand` 等)。
280
+ 3. **`className` 只做布局**:透传 className 用于宽度、间距、栅格、对齐等;
281
+ **不要**用它改组件观感(如 `bg-red-500`、`shadow-lg`、`rounded-full`)。
282
+ 观感不满足 → 到库里改 variant / token(全站生效),不在调用处打补丁。
283
+ 4. **不覆盖 CSS 变量**:业务侧不得重定义 `--pt-*` 或别名变量;`tokens.css`
284
+ 只在应用入口引一次,不复制、不改内容;主题切换只用 `.dark` 类。
285
+ 唯一豁免:`--pt-z-overlay / --pt-z-popup / --pt-z-tooltip` 三个浮层
286
+ z-index 集成钩子本就设计为由宿主赋值(见 [README](./README.md) 「接入」第 4 步)。
287
+ 5. **缺组件到库里加**:需要新组件时按 [README](./README.md) 的「加组件」流程落到本库
288
+ (结构对齐 shadcn + 按交互状态规范适配),不在 app 内单独手写同类组件。
289
+
290
+ > 破坏性变更(variant 改名、导出项调整等)会在库侧 commit 说明中标注,
291
+ > 消费方按提示迁移。
292
+
293
+ ### 规约的执行
294
+
295
+ 机器强制现状:**ESLint 层在 apps/x**(`apps/x/eslint.config.js`「组件库治理」块:
296
+ 禁直引 Radix / cva、禁深路径引库内部文件、封死 antd;存量 `src/components/ui/**`
297
+ 豁免,随迁移批次收紧)。那批存量副本的清理是搬仓之后的下一期工作。
298
+
299
+ ---
300
+
301
+ ## 本文件的生长规则
302
+
303
+ ### 与 `llms.txt` 的派生关系(硬约束)
304
+
305
+ `llms.txt` 是**对外产物** —— 它随 npm 包发布,外部 AI 从
306
+ `https://unpkg.com/@ptengine/design-components/llms.txt` 直接读它来生成 UI。
307
+
308
+ - **本文件是真值源,`llms.txt` 是它的派生物。**
309
+ - 目前**没有生成脚本,靠手工同步**。改了本文件里任何一条硬规范(基调 / token 规矩 /
310
+ 交互状态 / Button 词汇 / 圆角 / 字阶 / 消费方规约),**必须在同一个提交里更新
311
+ `llms.txt`**。
312
+ - 漏同步的后果是**静默的**:库内规范已经变了,而外部(以及任何读 llms.txt 的 AI)
313
+ 仍按旧规范生成代码,没有任何报错,要等到有人肉眼发现"生成出来的东西不对"才暴露。
314
+
315
+ ### 规范候选的提名(AI 在本仓工作时的义务)
316
+
317
+ 在本仓做任何组件工作时,留意有没有一条可以推广的规范正在浮现 ——
318
+ 重复出现的取舍、理由明显可推广的决策、代码里普遍存在但没写下来的隐性惯例。
319
+
320
+ 提名格式(出现在工作汇报末尾):
321
+
322
+ > 💡 **候选规范**:〔规则一句话〕
323
+ > **为什么**:〔理由〕
324
+ > **证据**:〔≥1 个真实出处〕
325
+ > **建议归入**:〔本文件的哪一节〕
326
+ > **过边界判据了吗**:〔换个产品还成立?成立才该进本文件〕
327
+
328
+ **纪律**:提名 ≠ 生效。AI 绝不自行把候选规范写进本文件 —— 提名后等人类点头,
329
+ 点头了才回填。一次工作最多提名 1–2 条,拿不准就不提。
package/README.md CHANGED
@@ -12,24 +12,16 @@
12
12
  - **源码随包分发**:`files` 含全量 `src`,消费方的 Tailwind 扫的是源码而非压缩产物
13
13
  (压缩会改写 class 字符串,扫 `dist` 会漏类)。开发期还可用本地覆盖开关直连源码,
14
14
  见下方「在 apps/x 里联调本组件库」。
15
- - **Token 唯一数据源**:`src/styles/tokens.css` 定义所有 CSS 变量——三层嵌套架构(③ shadcn 别名 → ② PTEngine 语义层 → ① 原语层纯通道三元组),透明度只在语义层以 `var(--pt-x) / a` 表达,明暗差异只在语义层覆盖;`tailwind.preset.js` 定义 Token → Tailwind 颜色键映射(实色套 `<alpha-value>`,自带透明度的只包 `rgb()`)。详见 tokens.css 文件头注释。
15
+ - **Token 唯一数据源**:`src/styles/tokens.css` 定义所有 CSS 变量;`tailwind.preset.js` 定义 Token → Tailwind 颜色键映射。三层架构与硬规矩见 [组件设计规范](./COMPONENTS-DESIGN-SYSTEM.md),完整定义见 `tokens.css` 文件头注释。
16
16
  - 保留可选 `pnpm build`(vite lib + d.ts),供独立发布。
17
17
 
18
- ## 品牌视觉基调
18
+ ## 设计规范
19
19
 
20
- 可以概括成「**克制、编辑感、内容优先**」——让整个界面看起来冷静、不吵:
20
+ 设计侧的硬规范 —— 设计基调、Token 规矩、交互状态、Button 变体词汇、圆角刻度、字阶、
21
+ 组件内建文案的本地化、消费方规约 —— 统一在 **[组件设计规范](./COMPONENTS-DESIGN-SYSTEM.md)**。
21
22
 
22
- - **近黑文字 + 暖灰中性色为绝对主体**,界面安静、不抢内容。文字灰阶全部由同一个
23
- 近黑原语(`--pt-black`)配不同透明度得来(strong 90% / standard 70% / weak 40%),
24
- 面与描边走 neutral 色阶与黑色低透明度叠加。
25
- - **彩色是稀缺资源、按功能发放,而不是用来装饰**。品牌绿只给 Brand 场景(`bg-brand`)、
26
- 语义色只表达状态(success / danger / warning / information / AI 角色 Token)、
27
- chart 色板只给数据。没有功能含义的地方不出现彩色。
28
- - **大字号标题 + 充足留白建立层级**,而非靠色块、分隔线与阴影。字阶见下方
29
- Typography;Card / 表单控件等根元素无阴影也是同一原则的落地。
30
-
31
- 新增组件或调整 variant 时先对照这三条:一个改动如果让界面「变吵」了
32
- (多了一种装饰性颜色、多了一层非浮层阴影、层级靠色块而非字阶),方向就是错的。
23
+ 本库服务**多个产品**,这份规范只写产品无关的部分;某个产品自己的品牌取值与产品级
24
+ 模式归它自己的设计文件,**对本库无约束力**。
33
25
 
34
26
  ## 接入(所有消费方一致)
35
27
 
@@ -76,7 +68,7 @@ pnpm add @ptengine/design-components
76
68
  menubar / hover-card)< `--pt-z-tooltip`(tooltip),未设置时回退 `50`。
77
69
  宿主在自己的全局样式里赋值即可接入既有阶梯(apps/x 设 1000 / 1050 / 1070,
78
70
  见其 `src/styles/variables.css`),数值须保持 overlay < popup < tooltip。
79
- 这三个变量是「使用规约 4:不覆盖 CSS 变量」的**唯一豁免**——它们是布局
71
+ 这三个变量是 [组件设计规范](./COMPONENTS-DESIGN-SYSTEM.md) 「使用规约」第 4 条(不覆盖 CSS 变量)的**唯一豁免**——它们是布局
80
72
  集成钩子,不是观感 token,本就设计为由宿主赋值。
81
73
 
82
74
  > **包里没有编译好的 CSS**:观感全靠消费方自己的 Tailwind 编译 + `tokens.css` 变量。
@@ -105,45 +97,6 @@ PT_DESIGN_COMPONENTS_SRC=/你的路径/design-components
105
97
  忘了自己设过 → 「apps/x 里看到的不是发布版的样子」。两种都难自查,
106
98
  改组件前先确认当前是哪种模式。
107
99
 
108
- ## 使用规约(消费方必读)
109
-
110
- 本库经 npm 分发,消费方装的是**锁定的版本号**。因此改动的传播分两段,
111
- 别把它们当成一回事:
112
-
113
- | | 怎么发生 |
114
- |---|---|
115
- | **你在本地看到改动** | 开了覆盖开关就是即时的(见上一节),零流程 |
116
- | **产品真正用上新版本** | 发版(打 tag → CI 发 npm)+ 消费方升版本号装一次,**不会自动** |
117
-
118
- 第二段的手动闸门是有意的:库里手滑改错一行,不该让全线产品下次构建就跟着炸。
119
-
120
- 要让改动能顺畅传播下去,业务项目使用时须遵守:
121
-
122
- 1. **只从包入口引用**:`import { Button } from '@ptengine/design-components'`。
123
- **禁止**把组件源码复制进业务项目——复制即与库脱钩,后续更新不再同步。
124
- 2. **观感全部交给库**:颜色、字体、字号、圆角、阴影一律由组件与 token 提供。
125
- 业务代码**禁止**硬编码色值(`#xxx` / `rgb()`)、字体名、字阶之外的字号;
126
- 需要色彩语义时用 preset 暴露的 token 类(`text-muted-foreground`、
127
- `bg-secondary`、`border-weak`、`bg-brand` 等)。
128
- 3. **`className` 只做布局**:透传 className 用于宽度、间距、栅格、对齐等;
129
- **不要**用它改组件观感(如 `bg-red-500`、`shadow-lg`、`rounded-full`)。
130
- 观感不满足 → 到库里改 variant / token(全站生效),不在调用处打补丁。
131
- 4. **不覆盖 CSS 变量**:业务侧不得重定义 `--pt-*` 或别名变量;`tokens.css`
132
- 只在应用入口引一次,不复制、不改内容;主题切换只用 `.dark` 类。
133
- 唯一豁免:`--pt-z-overlay / --pt-z-popup / --pt-z-tooltip` 三个浮层
134
- z-index 集成钩子本就设计为由宿主赋值(见「消费方接入」第 5 步)。
135
- 5. **缺组件到库里加**:需要新组件时按下方「加组件」流程落到本库
136
- (结构对齐 shadcn + 按交互状态规范适配),不在 app 内单独手写同类组件。
137
-
138
- > 破坏性变更(variant 改名、导出项调整等)会在库侧 commit 说明中标注,
139
- > 消费方按提示迁移。
140
-
141
- ### 规约的执行
142
-
143
- 机器强制现状:**ESLint 层在 apps/x**(`apps/x/eslint.config.js`「组件库治理」块:
144
- 禁直引 Radix / cva、禁深路径引库内部文件、封死 antd;存量 `src/components/ui/**`
145
- 豁免,随迁移批次收紧)。那批存量副本的清理是搬仓之后的下一期工作。
146
-
147
100
  ## 使用
148
101
 
149
102
  ```tsx
@@ -158,130 +111,12 @@ import { Button, Input, Label, cn } from '@ptengine/design-components';
158
111
 
159
112
  沿用 shadcn 目录约定,把组件放到 `src/components/ui/`,用 `cn()` 合并类名、`cva` 管理 variants,然后在 `src/index.ts` 导出。`components.json` 已配好,也可用 `npx shadcn@latest add <component>` 落到本库再按需定制。
160
113
 
161
- ### 交互状态规范(新组件接入必读)
162
-
163
- 交互反馈统一走「状态层 State Layer」+ 中性交互 Token,**禁止**沿用 shadcn 官方的
164
- 替换式写法(`hover:bg-primary/90`、`hover:bg-*/80` 等)。拷官方组件进来时按此适配:
165
-
166
- | 官方写法 | 本库写法 | 说明 |
167
- |---|---|---|
168
- | `hover:bg-primary/90` / `hover:bg-*/80` | 变体类里加 `state-layer` | hover 在原样式上叠加 `--pt-interaction-hover`,active 自动叠加 `--pt-interaction-press`(定义见 `tailwind.preset.js`) |
169
- | `hover:bg-accent hover:text-accent-foreground`(outline/ghost 等) | `state-layer` | 同上,文字色不再切换 |
170
- | `focus:bg-accent` / `data-[highlighted]:bg-accent`(菜单项、下拉选项) | **保留原写法** | Radix 键盘高亮机制依赖 focus/highlighted 态;`--accent` 已指向 `--pt-interaction-hover`,效果与叠加一致 |
171
- | `focus-visible:ring-ring` 等焦点环 | **保留原写法** | `--ring` 已指向 `--pt-interaction-focus`(中性 90%) |
172
- | 持久「选中 / 激活 / 开」态(`data-[state=selected/on]`、`data-[active=true]`) | 元素底色用 `bg-selected` | `--pt-bg-selected` = 中性 8%,**与 hover 同色**;因为 hover 走 state-layer(叠加层而非替换背景),选中态被悬停时两层叠加 ≈ 16%,天然区分「选中」与「悬停」。**不要用品牌绿等彩色表达选中**(彩色只给 Brand / 语义 / 数据)。前提是该元素的 hover 必须是 state-layer 叠加;若 hover 仍是 `hover:bg-*` 替换式,则改用叠加式,或另加区分(如 sidebar 当前项用 `font-medium`) |
173
- | 纯文字反馈(link 变体 `hover:underline`) | **保留原写法** | 不加状态层 |
174
-
175
- ### Button 变体词汇(与 shadcn 官方的差异)
176
-
177
- | 本库 variant | 样式 | 对应官方 |
178
- |---|---|---|
179
- | `default`(Primary) | 高强调黑,暗色反白,反转状态层 | 官方 default(本库 `--primary` 指向黑) |
180
- | `brand` | 品牌绿 | 无(本库新增,`bg-brand`) |
181
- | `secondary` | 描边白底 | 官方 **outline** 的样式 |
182
- | `tertiary` | 灰底弱强调 | 官方 **secondary** 的样式 |
183
-
184
- 拷官方组件/示例进来时:`variant="outline"` → `variant="secondary"`;
185
- 官方 `variant="secondary"` 的场景按语义改用 `tertiary`。`--primary` 槽位为黑色,
186
- 品牌绿一律走 `--brand` / `bg-brand`。
187
-
188
- 想定制某组件观感(配色 / 尺寸 / 圆角),改该组件 cva `variants` 里的类即可全站生效;
189
- Primary(黑,暗色反白)这类深色表面用 `state-layer-inverse`,其余用 `state-layer`。
114
+ 新组件必须按 [组件设计规范](./COMPONENTS-DESIGN-SYSTEM.md) 的「交互状态规范」与「Button 变体词汇」适配,
115
+ 不要沿用 shadcn 官方的替换式 hover 写法。
190
116
 
191
117
  > **注**:组件源码内不写决策/过程注释(playground 会原样展示源码给使用者),
192
- > 规范与决策记录统一沉淀在本 README;`/** */` 形式的 props 说明属于 API 文档,保留。
193
-
194
- 百分比只维护在 `src/styles/tokens.css` 语义层(`--pt-interaction-hover/press/focus`),
195
- 调整后组件与 `/tokens` 展示页自动跟随。
196
-
197
- ## 圆角 Radius(六档)
198
-
199
- | 类名 | 值 | 用在 |
200
- |---|---|---|
201
- | `rounded-sm` | 6px | sm 档控件(24px 高) |
202
- | `rounded-md` | 8px | default / lg 档控件(32 / 40px 高) |
203
- | `rounded-lg` | 10px | 卡片、弹窗、浮层 —— 基准档 |
204
- | `rounded-12` | 12px | 更柔和的面板 |
205
- | `rounded-16` | 16px | 页面级外壳、对话坞 |
206
- | `rounded-20` | 20px | 需要强调圆润的大面 |
207
-
208
- 正圆用 `rounded-full`。可视对照与选档指南见 playground 的 **Radius** 页。
209
-
210
- **为什么大档位用 px 命名而不是 `xl` / `2xl`**:Tailwind 默认 `rounded-xl`=12px、
211
- `rounded-2xl`=16px,与本库需要的 16 / 20 同名不同值。沿用 t 恤码会让从 shadcn / Tailwind
212
- 生态抄来的代码**静默偏移几 px** —— 不报错、不警告,只是看着「有点不对」,极难自查。
213
- `rounded-12/16/20` 在两边都不存在,不可能撞。
214
-
215
- **两种产生方式有意混用**(改值前必读):
216
-
217
- ```
218
- --pt-radius 10px 手写,基准
219
- --pt-radius-md calc(基准 − 2px) 派生 → 8px
220
- --pt-radius-sm calc(基准 − 4px) 派生 → 6px
221
- --pt-radius-12 12px 固定,不跟随基准
222
- --pt-radius-16 16px 固定,不跟随基准
223
- --pt-radius-20 20px 固定,不跟随基准
224
- ```
225
-
226
- 派生那套来自 shadcn(一个 `--radius` 旋钮整体缩放,档间恒差 2px);后加的三档要的是
227
- 「更细的尺子」而不是「可整体缩放的比例」,且基准自建库起从未调过,那个旋钮实际没人用。
228
- **后果**:真去调基准时,前三档会动、后三档不动 —— 这个分裂是有意的,不是漏改。要统一
229
- 应把前三档也写死,而不是把后三档改成 calc(那会让 `rounded-16` 在基准变化后不再是 16px)。
230
-
231
- ⚠️ **缺档就加档,不要硬写 `rounded-[18px]` 这类任意值**,否则每个面板各写各的数,刻度失效。
232
-
233
- ## 字体 Typography(中/日/英三语)
234
-
235
- 品牌字体(源自 Figma `Type/Mode` 的 family 变量):EN `Inter` / JA `Noto Sans JP` /
236
- ZH `Noto Sans SC`。库侧在 `tokens.css` 以 `--font-sans` + `:lang()` 声明三语字体栈
237
- (`'Inter'` 置前,拉丁字符与数字三语统一用 Inter,CJK 落到 JP/SC;各栈带同语言
238
- 系统字体回退),preset 将 `fontFamily.sans` 接到 `var(--font-sans)`。
239
- 组件不声明字体,全部继承。(Figma 中 `family/code` / `family/metric` 亦为 Inter;
240
- 代码展示场景仍保留等宽 `font-mono`,未用 Inter 覆盖。)
241
-
242
- **字阶**(preset `fontSize` 整表覆盖,源自 Figma Text Styles,机读存档
243
- `design/tokens.json`,**在源码仓里、不随 npm 包分发**):`2xs 12/16 · xs 13/20 · sm 14/20 · base 16/24 · lg 18/28 ·
244
- xl 20/32 · 2xl 24/36 · 3xl 28/40 · 4xl 32/48 · 5xl 40/56 · 6xl 48/72 · 7xl 56/72 ·
245
- 8xl 64/96 · 9xl 72/128`。与 Tailwind 默认的差异:新增 `2xs`;**`xs` 为 13px**(非 12);
246
- `xl` 起行高/字号按设计表。字重五档:light 300 / normal 400 / medium 500 / semibold 600 / bold 700。
247
-
248
- **行高按语言可分**:字号三语一致;行高走 `tokens.css` 的 `--lh-*` 变量
249
- (`:root` = English 基准)。现行策略 ja/zh 沿用 English 值;后续精修时在
250
- `:lang(ja)` / `:lang(zh)` 预留块中只填与英文不同的档位,全站自动生效,
251
- 组件零改动(机制已验证:同字号、按语言不同行高)。
252
-
253
- **消费方应用需要做的三件事:**
254
-
255
- 1. **正确设置 `<html lang>`**(`en` / `zh-CN` / `ja`,i18n 框架切语言时同步更新)——
256
- 字体栈按它切换,组件零改动。
257
- 2. **加载字体文件**(库不打包字体):Next.js 用 `next/font/google`,或 fontsource /
258
- `<link>` 引 Google Fonts。加载 300/400/500/600/700 五档字重。
259
- 3. **中国大陆环境自托管 `Noto Sans SC`**(Google Fonts 大陆不可达),并做
260
- unicode-range 子集切片(CJK 全量单字重为 MB 级)。
261
-
262
- ### 组件内建文案的本地化(库不做 i18n,消费方传译文)
263
-
264
- 个别组件自带可见文案或读屏(sr-only / aria-label)标签。库不引 i18n 框架,
265
- 统一做法是**通过 prop 传入、默认英文**——做多语界面时把译文传进去,不传保持
266
- 英文,对现有代码零影响。
267
-
268
- | 组件 | prop | 默认值 |
269
- |---|---|---|
270
- | `SearchInput` | `clearLabel` | Clear |
271
- | `PaginationPrevious` / `PaginationNext` | `label` | Previous / Next |
272
- | `PaginationEllipsis` / `BreadcrumbEllipsis` | `label` | More pages / More |
273
- | `DialogContent` / `SheetContent` | `closeLabel` | Close |
274
- | `CarouselPrevious` / `CarouselNext` | `label` | Previous slide / Next slide |
275
- | `SidebarTrigger` / `SidebarRail` | `label` | Toggle sidebar |
276
- | `MessageScrollerButton` | `label` | Scroll to end / Scroll to start |
277
- | `Spinner` | `label` | Loading |
278
-
279
- ```tsx
280
- <PaginationPrevious label={t('上一页')} />
281
- <DialogContent closeLabel={t('关闭')}>…</DialogContent>
282
- ```
283
-
284
- 新组件若要内建文案,照此约定加 prop,不要写死字符串。
118
+ > 规范与决策记录统一沉淀在 [组件设计规范](./COMPONENTS-DESIGN-SYSTEM.md);`/** */` 形式的 props
119
+ > 说明属于 API 文档,保留。
285
120
 
286
121
  ## 现有组件(shadcn 官方清单已全量覆盖)
287
122
 
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-picker.d.ts","sourceRoot":"","sources":["../../../src/components/ui/prompt-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,MAAM,WAAW,gBAAgB;IAC7B,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC9B;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IAC7F,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B;;;OAGG;IACH,MAAM,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACzC;;;;OAIG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAwCD,QAAA,MAAM,YAAY,0FAkIjB,CAAC;AAGF,OAAO,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"prompt-picker.d.ts","sourceRoot":"","sources":["../../../src/components/ui/prompt-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,MAAM,WAAW,gBAAgB;IAC7B,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC9B;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IAC7F,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B;;;OAGG;IACH,MAAM,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACzC;;;;OAIG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AA0CD,QAAA,MAAM,YAAY,0FAkIjB,CAAC;AAGF,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import * as React from 'react';
2
2
  declare const SIZE_CLASSES: {
3
- readonly sm: "h-[24px] px-[8px] rounded-[var(--pt-radius-sm)] [&_input]:text-[12px] [&_input]:leading-[16px]";
3
+ readonly sm: "h-[24px] px-[8px] rounded-[var(--pt-radius-sm)] [&_input]:text-2xs";
4
4
  readonly default: "h-[32px] px-[10px]";
5
- readonly lg: "h-[40px] px-[12px] [&_input]:text-[14px] [&_input]:leading-[20px]";
5
+ readonly lg: "h-[40px] px-[12px] [&_input]:text-sm";
6
6
  };
7
7
  export interface SearchInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | 'type' | 'size'> {
8
8
  /** 尺寸:sm 24px(行内)· default 32px(常规)· lg 36px(页面级主搜索) */
@@ -17,7 +17,7 @@ declare const SelectValue: React.ForwardRefExoticComponent<SelectPrimitive.Selec
17
17
  *
18
18
  * `w-full` 不在里面:Select 自己要撑满容器,而筛选器通常按内容宽。各自加。
19
19
  */
20
- export declare const selectTriggerClassName = "flex h-[32px] items-center justify-between whitespace-nowrap rounded-[var(--pt-radius-md)] border border-input bg-transparent px-[12px] py-[8px] text-[13px] leading-[20px] ring-offset-background transition-colors placeholder:text-muted-foreground enabled:hover:border-neutral focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 aria-[invalid=true]:border-destructive aria-[invalid=true]:text-destructive aria-[invalid=true]:enabled:hover:border-destructive aria-[invalid=true]:focus-visible:ring-destructive/30 [&>span]:line-clamp-1";
20
+ export declare const selectTriggerClassName = "flex h-[32px] items-center justify-between whitespace-nowrap rounded-[var(--pt-radius-md)] border border-input bg-transparent px-[12px] py-[8px] text-xs ring-offset-background transition-colors placeholder:text-muted-foreground enabled:hover:border-neutral focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 aria-[invalid=true]:border-destructive aria-[invalid=true]:text-destructive aria-[invalid=true]:enabled:hover:border-destructive aria-[invalid=true]:focus-visible:ring-destructive/30 [&>span]:line-clamp-1";
21
21
  declare const SelectTrigger: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
22
22
  declare const SelectScrollUpButton: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectScrollUpButtonProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
23
23
  declare const SelectScrollDownButton: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectScrollDownButtonProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
@@ -1 +1 @@
1
- {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../../src/components/ui/select.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAK1D,QAAA,MAAM,MAAM,uCAAuB,CAAC;AAEpC,QAAA,MAAM,WAAW,yGAAwB,CAAC;AAE1C,QAAA,MAAM,WAAW,0GAAwB,CAAC;AAE1C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,sBAAsB,6lBAC2jB,CAAC;AAE/lB,QAAA,MAAM,aAAa,oKAejB,CAAC;AAGH,QAAA,MAAM,oBAAoB,qKAWxB,CAAC;AAGH,QAAA,MAAM,sBAAsB,uKAW1B,CAAC;AAGH,QAAA,MAAM,aAAa,8JA6BjB,CAAC;AAGH,QAAA,MAAM,WAAW,4JASf,CAAC;AAGH,QAAA,MAAM,UAAU,2JAmBd,CAAC;AAGH,QAAA,MAAM,eAAe,gKASnB,CAAC;AAGH,OAAO,EACH,MAAM,EACN,WAAW,EACX,WAAW,EACX,aAAa,EACb,aAAa,EACb,WAAW,EACX,UAAU,EACV,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACzB,CAAC"}
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../../src/components/ui/select.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAK1D,QAAA,MAAM,MAAM,uCAAuB,CAAC;AAEpC,QAAA,MAAM,WAAW,yGAAwB,CAAC;AAE1C,QAAA,MAAM,WAAW,0GAAwB,CAAC;AAE1C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,sBAAsB,0kBACwiB,CAAC;AAE5kB,QAAA,MAAM,aAAa,oKAejB,CAAC;AAGH,QAAA,MAAM,oBAAoB,qKAWxB,CAAC;AAGH,QAAA,MAAM,sBAAsB,uKAW1B,CAAC;AAGH,QAAA,MAAM,aAAa,8JA6BjB,CAAC;AAGH,QAAA,MAAM,WAAW,4JASf,CAAC;AAGH,QAAA,MAAM,UAAU,2JAmBd,CAAC;AAGH,QAAA,MAAM,eAAe,gKASnB,CAAC;AAGH,OAAO,EACH,MAAM,EACN,WAAW,EACX,WAAW,EACX,aAAa,EACb,aAAa,EACb,WAAW,EACX,UAAU,EACV,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACzB,CAAC"}