@ptengine/design-components 0.3.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 (197) hide show
  1. package/README.md +309 -0
  2. package/components.json +21 -0
  3. package/dist/components/ui/accordion.d.ts +8 -0
  4. package/dist/components/ui/accordion.d.ts.map +1 -0
  5. package/dist/components/ui/alert-dialog.d.ts +21 -0
  6. package/dist/components/ui/alert-dialog.d.ts.map +1 -0
  7. package/dist/components/ui/alert.d.ts +9 -0
  8. package/dist/components/ui/alert.d.ts.map +1 -0
  9. package/dist/components/ui/aspect-ratio.d.ts +4 -0
  10. package/dist/components/ui/aspect-ratio.d.ts.map +1 -0
  11. package/dist/components/ui/attachment.d.ts +26 -0
  12. package/dist/components/ui/attachment.d.ts.map +1 -0
  13. package/dist/components/ui/avatar.d.ts +10 -0
  14. package/dist/components/ui/avatar.d.ts.map +1 -0
  15. package/dist/components/ui/badge.d.ts +10 -0
  16. package/dist/components/ui/badge.d.ts.map +1 -0
  17. package/dist/components/ui/breadcrumb.d.ts +22 -0
  18. package/dist/components/ui/breadcrumb.d.ts.map +1 -0
  19. package/dist/components/ui/bubble.d.ts +19 -0
  20. package/dist/components/ui/bubble.d.ts.map +1 -0
  21. package/dist/components/ui/button-group.d.ts +13 -0
  22. package/dist/components/ui/button-group.d.ts.map +1 -0
  23. package/dist/components/ui/button.d.ts +13 -0
  24. package/dist/components/ui/button.d.ts.map +1 -0
  25. package/dist/components/ui/calendar.d.ts +9 -0
  26. package/dist/components/ui/calendar.d.ts.map +1 -0
  27. package/dist/components/ui/card.d.ts +9 -0
  28. package/dist/components/ui/card.d.ts.map +1 -0
  29. package/dist/components/ui/carousel.d.ts +23 -0
  30. package/dist/components/ui/carousel.d.ts.map +1 -0
  31. package/dist/components/ui/chart.d.ts +63 -0
  32. package/dist/components/ui/chart.d.ts.map +1 -0
  33. package/dist/components/ui/checkbox.d.ts +5 -0
  34. package/dist/components/ui/checkbox.d.ts.map +1 -0
  35. package/dist/components/ui/collapsible.d.ts +6 -0
  36. package/dist/components/ui/collapsible.d.ts.map +1 -0
  37. package/dist/components/ui/command.d.ts +81 -0
  38. package/dist/components/ui/command.d.ts.map +1 -0
  39. package/dist/components/ui/context-menu.d.ts +28 -0
  40. package/dist/components/ui/context-menu.d.ts.map +1 -0
  41. package/dist/components/ui/dialog.d.ts +22 -0
  42. package/dist/components/ui/dialog.d.ts.map +1 -0
  43. package/dist/components/ui/direction.d.ts +8 -0
  44. package/dist/components/ui/direction.d.ts.map +1 -0
  45. package/dist/components/ui/drawer.d.ts +23 -0
  46. package/dist/components/ui/drawer.d.ts.map +1 -0
  47. package/dist/components/ui/dropdown-menu.d.ts +28 -0
  48. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  49. package/dist/components/ui/empty.d.ts +13 -0
  50. package/dist/components/ui/empty.d.ts.map +1 -0
  51. package/dist/components/ui/field.d.ts +25 -0
  52. package/dist/components/ui/field.d.ts.map +1 -0
  53. package/dist/components/ui/hover-card.d.ts +7 -0
  54. package/dist/components/ui/hover-card.d.ts.map +1 -0
  55. package/dist/components/ui/input-group.d.ts +13 -0
  56. package/dist/components/ui/input-group.d.ts.map +1 -0
  57. package/dist/components/ui/input-otp.d.ts +35 -0
  58. package/dist/components/ui/input-otp.d.ts.map +1 -0
  59. package/dist/components/ui/input.d.ts +5 -0
  60. package/dist/components/ui/input.d.ts.map +1 -0
  61. package/dist/components/ui/item.d.ts +24 -0
  62. package/dist/components/ui/item.d.ts.map +1 -0
  63. package/dist/components/ui/kbd.d.ts +5 -0
  64. package/dist/components/ui/kbd.d.ts.map +1 -0
  65. package/dist/components/ui/label.d.ts +6 -0
  66. package/dist/components/ui/label.d.ts.map +1 -0
  67. package/dist/components/ui/marker.d.ts +13 -0
  68. package/dist/components/ui/marker.d.ts.map +1 -0
  69. package/dist/components/ui/menubar.d.ts +29 -0
  70. package/dist/components/ui/menubar.d.ts.map +1 -0
  71. package/dist/components/ui/message-scroller.d.ts +26 -0
  72. package/dist/components/ui/message-scroller.d.ts.map +1 -0
  73. package/dist/components/ui/message.d.ts +11 -0
  74. package/dist/components/ui/message.d.ts.map +1 -0
  75. package/dist/components/ui/native-select.d.ts +4 -0
  76. package/dist/components/ui/native-select.d.ts.map +1 -0
  77. package/dist/components/ui/navigation-menu.d.ts +13 -0
  78. package/dist/components/ui/navigation-menu.d.ts.map +1 -0
  79. package/dist/components/ui/pagination.d.ts +35 -0
  80. package/dist/components/ui/pagination.d.ts.map +1 -0
  81. package/dist/components/ui/popover.d.ts +8 -0
  82. package/dist/components/ui/popover.d.ts.map +1 -0
  83. package/dist/components/ui/progress.d.ts +5 -0
  84. package/dist/components/ui/progress.d.ts.map +1 -0
  85. package/dist/components/ui/radio-group.d.ts +6 -0
  86. package/dist/components/ui/radio-group.d.ts.map +1 -0
  87. package/dist/components/ui/resizable.d.ts +24 -0
  88. package/dist/components/ui/resizable.d.ts.map +1 -0
  89. package/dist/components/ui/scroll-area.d.ts +6 -0
  90. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  91. package/dist/components/ui/search-input.d.ts +23 -0
  92. package/dist/components/ui/search-input.d.ts.map +1 -0
  93. package/dist/components/ui/select.d.ts +14 -0
  94. package/dist/components/ui/select.d.ts.map +1 -0
  95. package/dist/components/ui/separator.d.ts +5 -0
  96. package/dist/components/ui/separator.d.ts.map +1 -0
  97. package/dist/components/ui/sheet.d.ts +28 -0
  98. package/dist/components/ui/sheet.d.ts.map +1 -0
  99. package/dist/components/ui/sidebar.d.ts +70 -0
  100. package/dist/components/ui/sidebar.d.ts.map +1 -0
  101. package/dist/components/ui/skeleton.d.ts +4 -0
  102. package/dist/components/ui/skeleton.d.ts.map +1 -0
  103. package/dist/components/ui/slider.d.ts +5 -0
  104. package/dist/components/ui/slider.d.ts.map +1 -0
  105. package/dist/components/ui/sonner.d.ts +6 -0
  106. package/dist/components/ui/sonner.d.ts.map +1 -0
  107. package/dist/components/ui/spinner.d.ts +7 -0
  108. package/dist/components/ui/spinner.d.ts.map +1 -0
  109. package/dist/components/ui/switch.d.ts +5 -0
  110. package/dist/components/ui/switch.d.ts.map +1 -0
  111. package/dist/components/ui/table.d.ts +11 -0
  112. package/dist/components/ui/table.d.ts.map +1 -0
  113. package/dist/components/ui/tabs.d.ts +13 -0
  114. package/dist/components/ui/tabs.d.ts.map +1 -0
  115. package/dist/components/ui/textarea.d.ts +5 -0
  116. package/dist/components/ui/textarea.d.ts.map +1 -0
  117. package/dist/components/ui/toggle-group.d.ts +13 -0
  118. package/dist/components/ui/toggle-group.d.ts.map +1 -0
  119. package/dist/components/ui/toggle.d.ts +13 -0
  120. package/dist/components/ui/toggle.d.ts.map +1 -0
  121. package/dist/components/ui/tooltip.d.ts +8 -0
  122. package/dist/components/ui/tooltip.d.ts.map +1 -0
  123. package/dist/hooks/use-mobile.d.ts +2 -0
  124. package/dist/hooks/use-mobile.d.ts.map +1 -0
  125. package/dist/index.cjs +82 -0
  126. package/dist/index.d.ts +71 -0
  127. package/dist/index.d.ts.map +1 -0
  128. package/dist/index.js +20969 -0
  129. package/dist/lib/utils.d.ts +4 -0
  130. package/dist/lib/utils.d.ts.map +1 -0
  131. package/llms.txt +173 -0
  132. package/package.json +125 -0
  133. package/src/components/ui/accordion.tsx +51 -0
  134. package/src/components/ui/alert-dialog.tsx +115 -0
  135. package/src/components/ui/alert.tsx +48 -0
  136. package/src/components/ui/aspect-ratio.tsx +5 -0
  137. package/src/components/ui/attachment.tsx +186 -0
  138. package/src/components/ui/avatar.tsx +57 -0
  139. package/src/components/ui/badge.tsx +40 -0
  140. package/src/components/ui/breadcrumb.tsx +101 -0
  141. package/src/components/ui/bubble.tsx +123 -0
  142. package/src/components/ui/button-group.tsx +74 -0
  143. package/src/components/ui/button.tsx +64 -0
  144. package/src/components/ui/calendar.tsx +63 -0
  145. package/src/components/ui/card.tsx +55 -0
  146. package/src/components/ui/carousel.tsx +252 -0
  147. package/src/components/ui/chart.tsx +323 -0
  148. package/src/components/ui/checkbox.tsx +26 -0
  149. package/src/components/ui/collapsible.tsx +9 -0
  150. package/src/components/ui/command.tsx +136 -0
  151. package/src/components/ui/context-menu.tsx +187 -0
  152. package/src/components/ui/dialog.tsx +103 -0
  153. package/src/components/ui/direction.tsx +15 -0
  154. package/src/components/ui/drawer.tsx +98 -0
  155. package/src/components/ui/dropdown-menu.tsx +186 -0
  156. package/src/components/ui/empty.tsx +75 -0
  157. package/src/components/ui/field.tsx +175 -0
  158. package/src/components/ui/hover-card.tsx +27 -0
  159. package/src/components/ui/input-group.tsx +80 -0
  160. package/src/components/ui/input-otp.tsx +67 -0
  161. package/src/components/ui/input.tsx +24 -0
  162. package/src/components/ui/item.tsx +118 -0
  163. package/src/components/ui/kbd.tsx +21 -0
  164. package/src/components/ui/label.tsx +19 -0
  165. package/src/components/ui/marker.tsx +67 -0
  166. package/src/components/ui/menubar.tsx +218 -0
  167. package/src/components/ui/message-scroller.tsx +206 -0
  168. package/src/components/ui/message.tsx +85 -0
  169. package/src/components/ui/native-select.tsx +29 -0
  170. package/src/components/ui/navigation-menu.tsx +120 -0
  171. package/src/components/ui/pagination.tsx +108 -0
  172. package/src/components/ui/popover.tsx +31 -0
  173. package/src/components/ui/progress.tsx +23 -0
  174. package/src/components/ui/radio-group.tsx +36 -0
  175. package/src/components/ui/resizable.tsx +40 -0
  176. package/src/components/ui/scroll-area.tsx +44 -0
  177. package/src/components/ui/search-input.tsx +97 -0
  178. package/src/components/ui/select.tsx +151 -0
  179. package/src/components/ui/separator.tsx +24 -0
  180. package/src/components/ui/sheet.tsx +124 -0
  181. package/src/components/ui/sidebar.tsx +704 -0
  182. package/src/components/ui/skeleton.tsx +9 -0
  183. package/src/components/ui/slider.tsx +41 -0
  184. package/src/components/ui/sonner.tsx +45 -0
  185. package/src/components/ui/spinner.tsx +21 -0
  186. package/src/components/ui/switch.tsx +27 -0
  187. package/src/components/ui/table.tsx +95 -0
  188. package/src/components/ui/tabs.tsx +119 -0
  189. package/src/components/ui/textarea.tsx +23 -0
  190. package/src/components/ui/toggle-group.tsx +55 -0
  191. package/src/components/ui/toggle.tsx +40 -0
  192. package/src/components/ui/tooltip.tsx +30 -0
  193. package/src/hooks/use-mobile.ts +19 -0
  194. package/src/index.ts +414 -0
  195. package/src/lib/utils.ts +7 -0
  196. package/src/styles/tokens.css +360 -0
  197. package/tailwind.preset.js +235 -0
@@ -0,0 +1,360 @@
1
+ /**
2
+ * PT-AI-Components (@ptengine/pt-ai-components) — Design Token 唯一数据源
3
+ *
4
+ * 三层嵌套架构,色值物理上只存在于最底的原语层(单一真值源):
5
+ *
6
+ * ③ shadcn 兼容别名(--pt-background / --pt-primary / --pt-border …)
7
+ * 供库内组件(Button / Input …)沿用 shadcn 类名。**只引用语义层**,
8
+ * 自身不存值、不带透明度、无明暗差异(明暗差异全部在语义层)。
9
+ * 声明在 `.pt-ui` 作用域块:库不写任何 :root/html 级样式,
10
+ * 使 var() 替换在各作用域内用当地语义值发生(见该块前的注释)。
11
+ *
12
+ * ② PTEngine 语义层(--pt-text/bg/border/interaction/chart/link/role-*)
13
+ * 设计系统语义色。**统一「未包裹」形态**(不写 rgb() 外壳):
14
+ * · 实色 → 纯通道引用: --pt-brand: var(--pt-green-500);
15
+ * · 需要透明度 → 通道 + alpha:--pt-text-strong: var(--pt-black) / 0.9;
16
+ * 透明度只在这一层定义。light / dark 差异通过 .dark 覆盖语义 Token 实现。
17
+ *
18
+ * ① PTEngine 原语层 Primitives(唯一存最终色值的一层,与主题无关)
19
+ * **只存纯通道三元组**(如 --pt-green-500: 37 172 0),不含任何透明度
20
+ * (原 white/N、black/N 透明档位已删除,透明度改由语义层 `/ a` 表达)。
21
+ * 改色只需改这一层,三层自动跟随 = single source of truth。
22
+ * 注:原语在 `.pt-ui` 声明;`.pt-ui.dark` 只覆盖语义层,原语靠继承取用。
23
+ * HEX 仅在 /tokens 展示页由运行时计算标注,**不参与代码**。
24
+ *
25
+ * 消费规则(rgb() 外壳只在最外层包一次,永不嵌套):
26
+ * · preset 里实色别名 → rgb(var(--x) / <alpha-value>),支持 bg-primary/90;
27
+ * · 自带透明度的别名(border / input / sidebar-border)→ rgb(var(--x)),
28
+ * 不再叠 <alpha-value>(否则双 alpha 非法);
29
+ * · 在 Tailwind 之外直接使用任何 Token(内联 style / JS / SVG)→
30
+ * 自己包一层:color: rgb(var(--pt-text-strong))。
31
+ *
32
+ * 消费方在入口处 `import '@ptengine/pt-ai-components/styles/tokens.css'`。
33
+ * 纯 .pt-ui/.pt-ui.dark(不套 @layer)以避免 cascade layer 副作用。
34
+ * 接入:给 <html>(推荐,浮层 portal 可达)或子树容器挂 `.pt-ui` 类;深浅切换加/去 `.dark` 类。全部变量 --pt- 前缀,与宿主零撞名。
35
+ */
36
+
37
+ /* ── 字体 Typography · --pt-font-sans 按语言切换(由 html lang 驱动)──
38
+ * 品牌字体(源自 Figma Type/Mode 的 family 变量):EN 'Inter' /
39
+ * JA 'Noto Sans JP' / ZH 'Noto Sans SC'。'Inter' 在 CJK 栈中置前:
40
+ * 拉丁字符与数字三语统一用 Inter,CJK 字符落到 JP/SC;各栈保留
41
+ * 同语言系统字体回退(webfont 未加载完时观感不劣化)。
42
+ * 字体文件由消费方应用加载(next/font / fontsource / <link>),库只
43
+ * 声明栈;中国大陆环境需自托管 Noto Sans SC,详见 README。 */
44
+ .pt-ui {
45
+ --pt-font-sans: 'Inter', system-ui, -apple-system, sans-serif;
46
+ }
47
+ :lang(ja) {
48
+ --pt-font-sans: 'Inter', 'Noto Sans JP', 'Hiragino Kaku Gothic ProN', 'Yu Gothic', Meiryo,
49
+ sans-serif;
50
+ }
51
+ :lang(zh) {
52
+ --pt-font-sans: 'Inter', 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', sans-serif;
53
+ }
54
+ /* ── 行高 Line height · 同字号按语言可不同(preset fontSize 引用)──
55
+ * .pt-ui = English 基准(Figma Text Styles)。
56
+ * 现行策略:ja / zh 暂与 English 一致——未覆盖的档位自动沿用
57
+ * .pt-ui 值,因此无需显式声明。后续按语言精修时,在下方
58
+ * :lang(ja) / :lang(zh) 块中只填与英文不同的档位即可全站生效。 */
59
+ .pt-ui {
60
+ --pt-lh-2xs: 16px;
61
+ --pt-lh-xs: 20px;
62
+ --pt-lh-sm: 20px;
63
+ --pt-lh-base: 24px;
64
+ --pt-lh-lg: 28px;
65
+ --pt-lh-xl: 32px;
66
+ --pt-lh-2xl: 36px;
67
+ --pt-lh-3xl: 40px;
68
+ --pt-lh-4xl: 48px;
69
+ --pt-lh-5xl: 56px;
70
+ --pt-lh-6xl: 72px;
71
+ --pt-lh-7xl: 72px;
72
+ --pt-lh-8xl: 96px;
73
+ --pt-lh-9xl: 128px;
74
+ }
75
+ /* 精修预留位(示例::lang(ja) { --pt-lh-sm: 24px; }):
76
+ * :lang(ja) { }
77
+ * :lang(zh) { } */
78
+ /* 嵌套语言孤岛(如英文页里一段 lang="ja" 的区域):显式带 lang 的
79
+ * 元素重新解析 var,字体随该区域语言切换。 */
80
+ [lang] {
81
+ font-family: var(--pt-font-sans), system-ui, sans-serif;
82
+ }
83
+
84
+ /* ── ③ shadcn 兼容别名 · 全部引用语义层,自身无明暗差异 ────────
85
+ * 选择器含 .dark 的原因:CSS var() 替换发生在「声明所在元素」上,
86
+ * 后代继承的是已替换的结果。若只在作用域根声明,嵌套 .dark 容器会
87
+ * 继承到按亮色语义烘焙的值。让同一份声明同时作用于 .light/.dark
88
+ * 作用域,替换就会在该作用域内用当地语义值重新发生(零重复代码)。 */
89
+ .pt-ui {
90
+ --pt-background: var(--pt-bg-default);
91
+ --pt-foreground: var(--pt-fg-default);
92
+ --pt-card: var(--pt-bg-box);
93
+ --pt-card-foreground: var(--pt-fg-default);
94
+ --pt-popover: var(--pt-bg-box);
95
+ --pt-popover-foreground: var(--pt-fg-default);
96
+ --pt-primary: var(--pt-bg-strong); /* 高强调黑(暗色自动反白) */
97
+ --pt-primary-foreground: var(--pt-text-inverse);
98
+ --pt-brand: var(--pt-brand); /* 品牌绿,供 Brand 场景(bg-brand) */
99
+ --pt-brand-foreground: var(--pt-text-stable);
100
+ --pt-secondary: var(--pt-bg-secondary);
101
+ --pt-secondary-foreground: var(--pt-fg-default);
102
+ --pt-muted: var(--pt-bg-secondary);
103
+ --pt-muted-foreground: var(--pt-fg-muted);
104
+ --pt-accent: var(--pt-interaction-hover); /* 交互高亮=中性叠加(黑/白 + alpha,百分比见语义层) */
105
+ --pt-accent-foreground: var(--pt-fg-default);
106
+ --pt-destructive: var(--pt-bg-danger-standard);
107
+ --pt-destructive-foreground: var(--pt-text-stable);
108
+ --pt-border: var(--pt-border-default);
109
+ --pt-input: var(--pt-border-input);
110
+ --pt-ring: var(--pt-interaction-focus); /* 焦点环=中性(黑90%/白90%),自带 alpha */
111
+ --pt-chart-1: var(--pt-chart-1);
112
+ --pt-chart-2: var(--pt-chart-2);
113
+ --pt-chart-3: var(--pt-chart-3);
114
+ --pt-chart-4: var(--pt-chart-4);
115
+ --pt-chart-5: var(--pt-chart-5);
116
+ --pt-sidebar: var(--pt-bg-box);
117
+ --pt-sidebar-foreground: var(--pt-fg-default);
118
+ --pt-sidebar-primary: var(--pt-bg-strong);
119
+ --pt-sidebar-primary-foreground: var(--pt-text-inverse);
120
+ --pt-sidebar-accent: var(--pt-interaction-hover);
121
+ --pt-sidebar-accent-foreground: var(--pt-fg-default);
122
+ --pt-sidebar-border: var(--pt-border-default);
123
+ --pt-sidebar-ring: var(--pt-interaction-focus);
124
+ }
125
+
126
+ .pt-ui {
127
+ --pt-radius: 10px; /* px 硬值:rem 会被宿主根字号缩放 */
128
+ --pt-radius-md: calc(var(--pt-radius) - 2px); /* 8px:default/lg 档控件 */
129
+ --pt-radius-sm: calc(var(--pt-radius) - 4px); /* 6px:sm 档控件 */
130
+
131
+ /* ── ② PTEngine 语义层(Light)· 未包裹形态,全部引用原语 ──── */
132
+ /* role(角色:补齐 shadcn 别名所需的语义映射,纯通道或通道+alpha) */
133
+ --pt-brand: var(--pt-green-500);
134
+ --pt-fg-default: var(--pt-black);
135
+ --pt-fg-muted: var(--pt-neutral-600);
136
+ --pt-bg-secondary: var(--pt-neutral-50);
137
+ --pt-border-default: var(--pt-neutral-100);
138
+ --pt-border-input: var(--pt-neutral-100);
139
+ /* text */
140
+ --pt-text-strong: var(--pt-black) / 0.9;
141
+ --pt-text-standard: var(--pt-black) / 0.7;
142
+ --pt-text-tage: var(--pt-black) / 0.6;
143
+ --pt-text-weak: var(--pt-black) / 0.4;
144
+ --pt-text-disabled: var(--pt-black) / 0.3;
145
+ --pt-text-stable: var(--pt-white);
146
+ --pt-text-inverse: var(--pt-white);
147
+ --pt-text-brand: var(--pt-lime-800);
148
+ --pt-text-brand-standar: var(--pt-lime-500);
149
+ --pt-text-neutral: var(--pt-neutral-700);
150
+ --pt-text-success: var(--pt-green-700);
151
+ --pt-text-success-standar: var(--pt-green-500);
152
+ --pt-text-danger: var(--pt-red-700);
153
+ --pt-text-danger-standar: var(--pt-red-600);
154
+ --pt-text-warning: var(--pt-orange-700);
155
+ --pt-text-warning-standar: var(--pt-orange-500);
156
+ --pt-text-information: var(--pt-blue-700);
157
+ --pt-text-information-standar: var(--pt-blue-500);
158
+ --pt-text-ai: var(--pt-fuchsia-700);
159
+ --pt-text-ai-standar: var(--pt-fuchsia-500);
160
+ /* background */
161
+ --pt-bg-default: var(--pt-white);
162
+ --pt-bg-box: var(--pt-white);
163
+ --pt-bg-strong: var(--pt-neutral-950);
164
+ --pt-bg-neutral: var(--pt-black) / 0.08;
165
+ --pt-bg-weak: var(--pt-black) / 0.03;
166
+ --pt-bg-disable: var(--pt-black) / 0.1;
167
+ --pt-bg-selected: var(--pt-black) / 0.08; /* 选中/激活底层=中性 8%(与 hover 同色,靠状态层叠加区分:激活+hover≈16%) */
168
+ --pt-bg-brand-subtler: var(--pt-lime-100);
169
+ --pt-bg-brand-subtle: var(--pt-lime-300);
170
+ --pt-bg-brand-standard: var(--pt-lime-500);
171
+ --pt-bg-neutral-subtler: var(--pt-neutral-500) / 0.2;
172
+ --pt-bg-positive-subtler: var(--pt-green-500) / 0.2;
173
+ --pt-bg-positive-subtle: var(--pt-green-300);
174
+ --pt-bg-positive-standard: var(--pt-green-500);
175
+ --pt-bg-danger-subtler: var(--pt-red-500) / 0.2;
176
+ --pt-bg-danger-subtle: var(--pt-red-300);
177
+ --pt-bg-danger-standard: var(--pt-red-600);
178
+ --pt-bg-warning-subtler: var(--pt-orange-500) / 0.2;
179
+ --pt-bg-warning-subtle: var(--pt-orange-300);
180
+ --pt-bg-warning-standard: var(--pt-orange-500);
181
+ --pt-bg-information-subtler: var(--pt-blue-500) / 0.2;
182
+ --pt-bg-information-subtle: var(--pt-blue-300);
183
+ --pt-bg-information-standard: var(--pt-blue-500);
184
+ --pt-bg-ai-subtler: var(--pt-fuchsia-500) / 0.2;
185
+ --pt-bg-ai-subtle: var(--pt-fuchsia-300);
186
+ --pt-bg-ai-standard: var(--pt-fuchsia-500);
187
+ /* border */
188
+ --pt-border-strong: var(--pt-black) / 0.9;
189
+ --pt-border-neutral: var(--pt-black) / 0.2;
190
+ --pt-border-weak: var(--pt-black) / 0.08;
191
+ --pt-border-inverse: var(--pt-white);
192
+ --pt-border-brand: var(--pt-lime-200);
193
+ --pt-border-success: var(--pt-green-100);
194
+ --pt-border-danger: var(--pt-red-100);
195
+ --pt-border-warning: var(--pt-orange-100);
196
+ --pt-border-information: var(--pt-blue-100);
197
+ --pt-border-ai: var(--pt-fuchsia-100);
198
+ /* interaction */
199
+ --pt-interaction-hover: var(--pt-black) / 0.08;
200
+ --pt-interaction-press: var(--pt-black) / 0.1;
201
+ --pt-interaction-focus: var(--pt-black) / 0.9;
202
+ --pt-interaction-reversal-hover: var(--pt-white) / 0.08;
203
+ --pt-interaction-reversal-press: var(--pt-white) / 0.1;
204
+ --pt-interaction-reversal-focus: var(--pt-white) / 0.9;
205
+ /* chart */
206
+ --pt-chart-0: var(--pt-black);
207
+ --pt-chart-1: var(--pt-green-500);
208
+ --pt-chart-2: var(--pt-lime-500);
209
+ --pt-chart-3: var(--pt-orange-500);
210
+ --pt-chart-4: var(--pt-blue-500);
211
+ --pt-chart-5: var(--pt-fuchsia-500);
212
+ /* link */
213
+ --pt-link-blue: var(--pt-blue-500);
214
+ --pt-link-green: var(--pt-green-500);
215
+
216
+ /* ── ① PTEngine 原语层 Primitives(纯通道三元组,唯一真值源)──
217
+ * 底层调色板(取自 Figma「Primitives」集合,单一模式,与主题无关,
218
+ * 只在 .pt-ui 声明、不随 .dark 变化)。上面两层从这里取值。
219
+ * 不含透明度——透明度由语义层以 `var(--pt-x) / a` 表达。 */
220
+ /* base */
221
+ --pt-white: 255 255 255;
222
+ --pt-black: 16 28 31;
223
+ /* neutral */
224
+ --pt-neutral-50: 243 244 244;
225
+ --pt-neutral-100: 231 232 233;
226
+ --pt-neutral-200: 207 210 210;
227
+ --pt-neutral-300: 183 187 188;
228
+ --pt-neutral-400: 159 164 165;
229
+ --pt-neutral-500: 135 141 143;
230
+ --pt-neutral-600: 112 119 121;
231
+ --pt-neutral-700: 88 96 98;
232
+ --pt-neutral-800: 64 73 76;
233
+ --pt-neutral-900: 40 51 53;
234
+ --pt-neutral-950: 28 39 42;
235
+ /* red */
236
+ --pt-red: 255 71 71;
237
+ --pt-red-50: 255 237 237;
238
+ --pt-red-100: 255 218 218;
239
+ --pt-red-200: 255 181 181;
240
+ --pt-red-300: 255 145 145;
241
+ --pt-red-400: 255 108 108;
242
+ --pt-red-500: 255 71 71;
243
+ --pt-red-600: 207 62 63;
244
+ --pt-red-700: 159 54 55;
245
+ --pt-red-800: 112 45 47;
246
+ --pt-red-900: 64 37 39;
247
+ --pt-red-950: 28 30 33;
248
+ /* orange */
249
+ --pt-orange: 255 144 59;
250
+ --pt-orange-50: 255 244 235;
251
+ --pt-orange-100: 255 233 216;
252
+ --pt-orange-200: 255 211 177;
253
+ --pt-orange-300: 255 188 137;
254
+ --pt-orange-400: 255 166 98;
255
+ --pt-orange-500: 255 144 59;
256
+ --pt-orange-600: 207 121 53;
257
+ --pt-orange-700: 159 98 48;
258
+ --pt-orange-800: 112 74 42;
259
+ --pt-orange-900: 64 51 37;
260
+ --pt-orange-950: 28 34 32;
261
+ /* lime */
262
+ --pt-lime: 200 240 80;
263
+ --pt-lime-50: 249 253 237;
264
+ --pt-lime-100: 244 252 220;
265
+ --pt-lime-200: 233 249 185;
266
+ --pt-lime-300: 222 246 150;
267
+ --pt-lime-400: 211 243 115;
268
+ --pt-lime-500: 200 240 80;
269
+ --pt-lime-600: 163 198 70;
270
+ --pt-lime-700: 126 155 60;
271
+ --pt-lime-800: 90 113 51;
272
+ --pt-lime-900: 53 70 41;
273
+ --pt-lime-950: 25 39 33;
274
+ /* green */
275
+ --pt-green: 37 172 0;
276
+ --pt-green-50: 233 247 229;
277
+ --pt-green-100: 211 238 204;
278
+ --pt-green-200: 168 222 153;
279
+ --pt-green-300: 124 205 102;
280
+ --pt-green-400: 81 189 51;
281
+ --pt-green-500: 37 172 0;
282
+ --pt-green-600: 33 143 6;
283
+ --pt-green-700: 29 114 12;
284
+ --pt-green-800: 24 86 19;
285
+ --pt-green-900: 20 57 25;
286
+ --pt-green-950: 17 35 29;
287
+ /* blue */
288
+ --pt-blue: 34 145 248;
289
+ --pt-blue-50: 233 244 254;
290
+ --pt-blue-100: 211 233 254;
291
+ --pt-blue-200: 167 211 252;
292
+ --pt-blue-300: 122 189 251;
293
+ --pt-blue-400: 78 167 249;
294
+ --pt-blue-500: 34 145 248;
295
+ --pt-blue-600: 30 122 205;
296
+ --pt-blue-700: 27 98 161;
297
+ --pt-blue-800: 23 75 118;
298
+ --pt-blue-900: 20 51 74;
299
+ --pt-blue-950: 17 34 42;
300
+ /* fuchsia */
301
+ --pt-fuchsia: 191 99 243;
302
+ --pt-fuchsia-50: 249 239 254;
303
+ --pt-fuchsia-100: 242 224 253;
304
+ --pt-fuchsia-200: 229 193 250;
305
+ --pt-fuchsia-300: 217 161 248;
306
+ --pt-fuchsia-400: 204 130 245;
307
+ --pt-fuchsia-500: 191 99 243;
308
+ --pt-fuchsia-600: 156 85 201;
309
+ --pt-fuchsia-700: 121 71 158;
310
+ --pt-fuchsia-800: 86 56 116;
311
+ --pt-fuchsia-900: 51 42 73;
312
+ --pt-fuchsia-950: 25 32 42;
313
+ }
314
+
315
+ /* ── .dark:只覆盖语义层(别名与原语零重复声明)─────────────── */
316
+ .pt-ui.dark,
317
+ .dark .pt-ui {
318
+ /* role */
319
+ --pt-fg-default: var(--pt-white);
320
+ --pt-fg-muted: var(--pt-neutral-400);
321
+ --pt-bg-secondary: var(--pt-neutral-800);
322
+ --pt-border-default: var(--pt-white) / 0.1;
323
+ --pt-border-input: var(--pt-white) / 0.15;
324
+ /* text */
325
+ --pt-text-strong: var(--pt-white) / 0.9;
326
+ --pt-text-standard: var(--pt-white) / 0.7;
327
+ --pt-text-tage: var(--pt-white) / 0.6;
328
+ --pt-text-weak: var(--pt-white) / 0.4;
329
+ --pt-text-disabled: var(--pt-white) / 0.3;
330
+ --pt-text-inverse: var(--pt-black);
331
+ /* background */
332
+ --pt-bg-default: var(--pt-neutral-950);
333
+ --pt-bg-box: var(--pt-black);
334
+ --pt-bg-strong: var(--pt-white);
335
+ --pt-bg-neutral: var(--pt-white) / 0.08;
336
+ --pt-bg-weak: var(--pt-white) / 0.03;
337
+ --pt-bg-disable: var(--pt-white) / 0.1;
338
+ --pt-bg-selected: var(--pt-white) / 0.08; /* 暗色:中性白 8% */
339
+ /* border */
340
+ --pt-border-strong: var(--pt-white) / 0.9;
341
+ --pt-border-neutral: var(--pt-white) / 0.2;
342
+ --pt-border-weak: var(--pt-white) / 0.08;
343
+ --pt-border-inverse: var(--pt-black);
344
+ /* interaction */
345
+ --pt-interaction-hover: var(--pt-white) / 0.08;
346
+ --pt-interaction-press: var(--pt-white) / 0.1;
347
+ --pt-interaction-focus: var(--pt-white) / 0.9;
348
+ --pt-interaction-reversal-hover: var(--pt-black) / 0.08;
349
+ --pt-interaction-reversal-press: var(--pt-black) / 0.1;
350
+ --pt-interaction-reversal-focus: var(--pt-black) / 0.9;
351
+ /* 状态色(暗色):文字 700→500 提亮;20% 透明底继承亮色定义,双模式自适应。 */
352
+ --pt-text-neutral: var(--pt-neutral-500);
353
+ --pt-text-success: var(--pt-green-500);
354
+ --pt-text-danger: var(--pt-red-500);
355
+ --pt-text-warning: var(--pt-orange-500);
356
+ --pt-text-information: var(--pt-blue-500);
357
+ --pt-text-ai: var(--pt-fuchsia-500);
358
+ /* chart */
359
+ --pt-chart-0: var(--pt-white);
360
+ }
@@ -0,0 +1,235 @@
1
+ import tailwindcssAnimate from 'tailwindcss-animate';
2
+ import plugin from 'tailwindcss/plugin';
3
+
4
+ /**
5
+ * 状态层 State Layer(Material 式交互反馈):
6
+ * 组件加 `state-layer` 类后,hover 在原样式上「叠加」一层
7
+ * --pt-interaction-hover,按下(active)叠加 --pt-interaction-press
8
+ * (黑/白中性叠加,具体百分比以 tokens.css 语义层为准)。
9
+ * 原背景不被替换:实色按钮 hover 变深、透明表面 hover 出现浅灰,
10
+ * 一条规则全组件通用。覆盖层用 ::after + opacity 过渡(平滑),
11
+ * 圆角继承宿主,不拦截鼠标。
12
+ *
13
+ * 描边宿主(有 1px+ 边框)需把叠层向外扩到 border box,否则叠层缩在
14
+ * padding box(边框内侧)却仍用外圆角,圆角处与边框内圆弧不同心(错位约边框宽)。
15
+ * 描边变体自行声明 `[--pt-state-layer-border:<边框宽>]`(如 1px);默认 0 = 实色宿主不外扩。
16
+ */
17
+ const stateLayerPlugin = plugin(({ addUtilities }) => {
18
+ addUtilities({
19
+ '.state-layer': {
20
+ position: 'relative',
21
+ isolation: 'isolate',
22
+ '&::after': {
23
+ content: '""',
24
+ position: 'absolute',
25
+ inset: 'calc(-1 * var(--pt-state-layer-border, 0px))',
26
+ 'border-radius': 'inherit',
27
+ 'background-color': 'rgb(var(--pt-interaction-hover))',
28
+ opacity: '0',
29
+ transition: 'opacity 150ms',
30
+ 'pointer-events': 'none'
31
+ },
32
+ '&:hover::after': {
33
+ opacity: '1'
34
+ },
35
+ '&:active::after': {
36
+ 'background-color': 'rgb(var(--pt-interaction-press))',
37
+ opacity: '1'
38
+ },
39
+ /* 禁用时不生成叠层(配合 disabled:cursor-not-allowed:
40
+ * 鼠标事件保留以显示 🚫 光标,但悬停不得有任何反馈)。 */
41
+ '&:disabled::after': {
42
+ content: 'none'
43
+ }
44
+ },
45
+ /* 反转版:深色表面(如高强调黑按钮)用 reversal 交互 Token
46
+ * (亮色下白8%/10%;暗色下该表面反白,reversal 自动变黑8%/10%)。 */
47
+ '.state-layer-inverse': {
48
+ position: 'relative',
49
+ isolation: 'isolate',
50
+ '&::after': {
51
+ content: '""',
52
+ position: 'absolute',
53
+ inset: 'calc(-1 * var(--pt-state-layer-border, 0px))',
54
+ 'border-radius': 'inherit',
55
+ 'background-color': 'rgb(var(--pt-interaction-reversal-hover))',
56
+ opacity: '0',
57
+ transition: 'opacity 150ms',
58
+ 'pointer-events': 'none'
59
+ },
60
+ '&:hover::after': {
61
+ opacity: '1'
62
+ },
63
+ '&:active::after': {
64
+ 'background-color': 'rgb(var(--pt-interaction-reversal-press))',
65
+ opacity: '1'
66
+ },
67
+ '&:disabled::after': {
68
+ content: 'none'
69
+ }
70
+ }
71
+ });
72
+ });
73
+
74
+ /**
75
+ * PT-AI-Components (@ptengine/pt-ai-components) Tailwind 预设
76
+ *
77
+ * 消费方 tailwind.config:presets: [shadcnPreset]
78
+ * Token 值定义在 src/styles/tokens.css(唯一数据源);此文件只做
79
+ * 「CSS 变量 → Tailwind 颜色键」的映射。
80
+ *
81
+ * 颜色取自 Ptengine AI Design System。shadcn 兼容别名在 tokens.css 里以
82
+ * 未包裹形态存储(纯通道,或通道+alpha),这里包一层 rgb():
83
+ * · 纯通道别名 → `rgb(var(--x) / <alpha-value>)`,支持 /alpha 工具类(bg-primary/90)
84
+ * · 自带 alpha 的别名(border / input / ring / accent / sidebar 同类)→
85
+ * 裸 `rgb(var(--x))`——再套 <alpha-value> 会产生非法双 alpha
86
+ *
87
+ * @type {import('tailwindcss').Config}
88
+ */
89
+ export default {
90
+ darkMode: ['class'],
91
+ theme: {
92
+ extend: {
93
+ colors: {
94
+ border: 'rgb(var(--pt-border))',
95
+ input: 'rgb(var(--pt-input))',
96
+ ring: 'rgb(var(--pt-ring))',
97
+ background: 'rgb(var(--pt-background) / <alpha-value>)',
98
+ foreground: 'rgb(var(--pt-foreground) / <alpha-value>)',
99
+ primary: {
100
+ DEFAULT: 'rgb(var(--pt-primary) / <alpha-value>)',
101
+ foreground: 'rgb(var(--pt-primary-foreground) / <alpha-value>)'
102
+ },
103
+ brand: {
104
+ DEFAULT: 'rgb(var(--pt-brand) / <alpha-value>)',
105
+ foreground: 'rgb(var(--pt-brand-foreground) / <alpha-value>)'
106
+ },
107
+ secondary: {
108
+ DEFAULT: 'rgb(var(--pt-secondary) / <alpha-value>)',
109
+ foreground: 'rgb(var(--pt-secondary-foreground) / <alpha-value>)'
110
+ },
111
+ destructive: {
112
+ DEFAULT: 'rgb(var(--pt-destructive) / <alpha-value>)',
113
+ foreground: 'rgb(var(--pt-destructive-foreground) / <alpha-value>)'
114
+ },
115
+ muted: {
116
+ DEFAULT: 'rgb(var(--pt-muted) / <alpha-value>)',
117
+ foreground: 'rgb(var(--pt-muted-foreground) / <alpha-value>)'
118
+ },
119
+ accent: {
120
+ DEFAULT: 'rgb(var(--pt-accent))',
121
+ foreground: 'rgb(var(--pt-accent-foreground) / <alpha-value>)'
122
+ },
123
+ popover: {
124
+ DEFAULT: 'rgb(var(--pt-popover) / <alpha-value>)',
125
+ foreground: 'rgb(var(--pt-popover-foreground) / <alpha-value>)'
126
+ },
127
+ card: {
128
+ DEFAULT: 'rgb(var(--pt-card) / <alpha-value>)',
129
+ foreground: 'rgb(var(--pt-card-foreground) / <alpha-value>)'
130
+ },
131
+ chart: {
132
+ 1: 'rgb(var(--pt-chart-1) / <alpha-value>)',
133
+ 2: 'rgb(var(--pt-chart-2) / <alpha-value>)',
134
+ 3: 'rgb(var(--pt-chart-3) / <alpha-value>)',
135
+ 4: 'rgb(var(--pt-chart-4) / <alpha-value>)',
136
+ 5: 'rgb(var(--pt-chart-5) / <alpha-value>)'
137
+ },
138
+ sidebar: {
139
+ DEFAULT: 'rgb(var(--pt-sidebar) / <alpha-value>)',
140
+ foreground: 'rgb(var(--pt-sidebar-foreground) / <alpha-value>)',
141
+ primary: 'rgb(var(--pt-sidebar-primary) / <alpha-value>)',
142
+ 'primary-foreground': 'rgb(var(--pt-sidebar-primary-foreground) / <alpha-value>)',
143
+ accent: 'rgb(var(--pt-sidebar-accent))',
144
+ 'accent-foreground': 'rgb(var(--pt-sidebar-accent-foreground) / <alpha-value>)',
145
+ border: 'rgb(var(--pt-sidebar-border))',
146
+ ring: 'rgb(var(--pt-sidebar-ring))'
147
+ }
148
+ },
149
+ borderRadius: {
150
+ lg: 'var(--pt-radius)',
151
+ md: 'calc(var(--pt-radius) - 2px)',
152
+ sm: 'calc(var(--pt-radius) - 4px)'
153
+ },
154
+ /* 语义层描边 Token 的工具类(如 hover:border-strong)。
155
+ * 值自带 alpha,只包一层 rgb()。 */
156
+ borderColor: {
157
+ strong: 'rgb(var(--pt-border-strong))',
158
+ neutral: 'rgb(var(--pt-border-neutral))',
159
+ weak: 'rgb(var(--pt-border-weak))'
160
+ },
161
+ /* 语义层交互/状态 Token 的背景工具类(如 active:bg-press、disabled:bg-disable)。
162
+ * 状态色 subtler 底=语义色 500 @ 20%(token 自带 alpha,只包 rgb()),
163
+ * 双模式共用一份定义,供 Badge/Alert 等状态表面用。 */
164
+ backgroundColor: {
165
+ press: 'rgb(var(--pt-interaction-press))',
166
+ disable: 'rgb(var(--pt-bg-disable))',
167
+ selected: 'rgb(var(--pt-bg-selected))',
168
+ 'neutral-subtler': 'rgb(var(--pt-bg-neutral-subtler))',
169
+ 'positive-subtler': 'rgb(var(--pt-bg-positive-subtler))',
170
+ 'danger-subtler': 'rgb(var(--pt-bg-danger-subtler))',
171
+ 'warning-subtler': 'rgb(var(--pt-bg-warning-subtler))',
172
+ 'information-subtler': 'rgb(var(--pt-bg-information-subtler))',
173
+ 'ai-subtler': 'rgb(var(--pt-bg-ai-subtler))'
174
+ },
175
+ /* 状态色文字(亮色 700 档 / 暗色 500 档,随 token 切换)。 */
176
+ textColor: {
177
+ weak: 'rgb(var(--pt-text-weak))',
178
+ disabled: 'rgb(var(--pt-text-disabled))',
179
+ neutral: 'rgb(var(--pt-text-neutral) / <alpha-value>)',
180
+ success: 'rgb(var(--pt-text-success) / <alpha-value>)',
181
+ danger: 'rgb(var(--pt-text-danger) / <alpha-value>)',
182
+ warning: 'rgb(var(--pt-text-warning) / <alpha-value>)',
183
+ information: 'rgb(var(--pt-text-information) / <alpha-value>)',
184
+ ai: 'rgb(var(--pt-text-ai) / <alpha-value>)'
185
+ },
186
+ /* 字体族接 tokens.css 的 --pt-font-sans(按 html lang 切换三语字体栈)。 */
187
+ fontFamily: {
188
+ sans: ['var(--pt-font-sans)', 'system-ui', 'sans-serif']
189
+ },
190
+ /* 字阶整表覆盖 = Figma「Type/Mode + Text Styles」(design/tokens.json)。
191
+ * 与 Tailwind 默认的差异:新增 2xs=12;xs 为 13(非 12);
192
+ * xl 及以上行高/字号按设计表。
193
+ * 字号三语一致;行高走 tokens.css 的 --pt-lh-* 变量,
194
+ * :lang(ja)/:lang(zh) 可按语言覆盖(同字号不同行高)。 */
195
+ fontSize: {
196
+ '2xs': ['12px', 'var(--pt-lh-2xs)'],
197
+ xs: ['13px', 'var(--pt-lh-xs)'],
198
+ sm: ['14px', 'var(--pt-lh-sm)'],
199
+ base: ['16px', 'var(--pt-lh-base)'],
200
+ lg: ['18px', 'var(--pt-lh-lg)'],
201
+ xl: ['20px', 'var(--pt-lh-xl)'],
202
+ '2xl': ['24px', 'var(--pt-lh-2xl)'],
203
+ '3xl': ['28px', 'var(--pt-lh-3xl)'],
204
+ '4xl': ['32px', 'var(--pt-lh-4xl)'],
205
+ '5xl': ['40px', 'var(--pt-lh-5xl)'],
206
+ '6xl': ['48px', 'var(--pt-lh-6xl)'],
207
+ '7xl': ['56px', 'var(--pt-lh-7xl)'],
208
+ '8xl': ['64px', 'var(--pt-lh-8xl)'],
209
+ '9xl': ['72px', 'var(--pt-lh-9xl)']
210
+ },
211
+ /* Radix Accordion 高度过渡(内容高度由 Radix 以 CSS 变量注入);
212
+ * caret-blink 为 InputOTP 假光标闪烁。 */
213
+ keyframes: {
214
+ 'accordion-down': {
215
+ from: { height: '0' },
216
+ to: { height: 'var(--radix-accordion-content-height)' }
217
+ },
218
+ 'accordion-up': {
219
+ from: { height: 'var(--radix-accordion-content-height)' },
220
+ to: { height: '0' }
221
+ },
222
+ 'caret-blink': {
223
+ '0%,70%,100%': { opacity: '1' },
224
+ '20%,50%': { opacity: '0' }
225
+ }
226
+ },
227
+ animation: {
228
+ 'accordion-down': 'accordion-down 0.2s ease-out',
229
+ 'accordion-up': 'accordion-up 0.2s ease-out',
230
+ 'caret-blink': 'caret-blink 1.25s ease-out infinite'
231
+ }
232
+ }
233
+ },
234
+ plugins: [tailwindcssAnimate, stateLayerPlugin]
235
+ };