@icen.ai/ui 0.9.0 → 0.10.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 (281) hide show
  1. package/AGENTS.md +138 -80
  2. package/README.md +66 -91
  3. package/dist/base.css +208 -179
  4. package/dist/behaviors/accordion.mjs +8 -8
  5. package/dist/behaviors/ai-branch.d.mts +1 -1
  6. package/dist/behaviors/ai-branch.mjs +1010 -94
  7. package/dist/behaviors/ai-chat.d.mts +7 -7
  8. package/dist/behaviors/ai-chat.mjs +1071 -161
  9. package/dist/behaviors/ai-composer.d.mts +44 -12
  10. package/dist/behaviors/ai-composer.mjs +1997 -524
  11. package/dist/behaviors/ai-core.d.mts +1 -1
  12. package/dist/behaviors/ai-core.mjs +1016 -107
  13. package/dist/behaviors/ai-diff.mjs +1019 -127
  14. package/dist/behaviors/ai-feedback.d.mts +1 -1
  15. package/dist/behaviors/ai-feedback.mjs +1035 -126
  16. package/dist/behaviors/ai-panel.d.mts +8 -8
  17. package/dist/behaviors/ai-panel.mjs +1284 -266
  18. package/dist/behaviors/ai-provider.mjs +1003 -101
  19. package/dist/behaviors/ai-threads.d.mts +1 -1
  20. package/dist/behaviors/ai-threads.mjs +1068 -154
  21. package/dist/behaviors/ai-tool.d.mts +2 -2
  22. package/dist/behaviors/ai-tool.mjs +2037 -396
  23. package/dist/behaviors/ai-tools.d.mts +89 -16
  24. package/dist/behaviors/ai-tools.mjs +4448 -372
  25. package/dist/behaviors/autocomplete.d.mts +53 -0
  26. package/dist/behaviors/autocomplete.mjs +1600 -0
  27. package/dist/behaviors/back-top.d.mts +1 -1
  28. package/dist/behaviors/back-top.mjs +951 -14
  29. package/dist/behaviors/carousel.d.mts +1 -1
  30. package/dist/behaviors/carousel.mjs +906 -11
  31. package/dist/behaviors/cascader.d.mts +48 -0
  32. package/dist/behaviors/cascader.mjs +1853 -0
  33. package/dist/behaviors/charts.d.mts +72 -8
  34. package/dist/behaviors/charts.mjs +1901 -256
  35. package/dist/behaviors/code-block.d.mts +36 -0
  36. package/dist/behaviors/code-block.mjs +1611 -0
  37. package/dist/behaviors/command-palette.d.mts +9 -6
  38. package/dist/behaviors/command-palette.mjs +161 -59
  39. package/dist/behaviors/context-menu.d.mts +9 -8
  40. package/dist/behaviors/context-menu.mjs +1112 -44
  41. package/dist/behaviors/controls.d.mts +13 -13
  42. package/dist/behaviors/controls.mjs +989 -130
  43. package/dist/behaviors/copy.d.mts +21 -2
  44. package/dist/behaviors/copy.mjs +1206 -42
  45. package/dist/behaviors/datatable.d.mts +53 -3
  46. package/dist/behaviors/datatable.mjs +1963 -207
  47. package/dist/behaviors/date-picker.d.mts +0 -1
  48. package/dist/behaviors/date-picker.mjs +1340 -293
  49. package/dist/behaviors/design.d.mts +54 -0
  50. package/dist/behaviors/design.mjs +109 -0
  51. package/dist/behaviors/dropdown.d.mts +5 -6
  52. package/dist/behaviors/dropdown.mjs +262 -110
  53. package/dist/behaviors/events.d.mts +120 -3
  54. package/dist/behaviors/events.mjs +47 -2
  55. package/dist/behaviors/feedback.d.mts +30 -0
  56. package/dist/behaviors/feedback.mjs +296 -0
  57. package/dist/behaviors/focus.d.mts +8 -0
  58. package/dist/behaviors/focus.mjs +24 -0
  59. package/dist/behaviors/form-validate.d.mts +102 -0
  60. package/dist/behaviors/form-validate.mjs +6091 -0
  61. package/dist/behaviors/i18n.d.mts +789 -0
  62. package/dist/behaviors/i18n.mjs +1711 -0
  63. package/dist/behaviors/icons.d.mts +93 -0
  64. package/dist/behaviors/icons.mjs +113 -0
  65. package/dist/behaviors/input.d.mts +9 -1
  66. package/dist/behaviors/input.mjs +1056 -60
  67. package/dist/behaviors/kb-access.d.mts +1 -1
  68. package/dist/behaviors/kb-access.mjs +2129 -239
  69. package/dist/behaviors/kb-acl.d.mts +6 -6
  70. package/dist/behaviors/kb-acl.mjs +1119 -179
  71. package/dist/behaviors/kb-answer.mjs +2070 -418
  72. package/dist/behaviors/kb-audit.d.mts +1 -1
  73. package/dist/behaviors/kb-audit.mjs +1076 -154
  74. package/dist/behaviors/kb-canvas.mjs +1100 -177
  75. package/dist/behaviors/kb-chain.mjs +1022 -100
  76. package/dist/behaviors/kb-checkpoint.d.mts +1 -1
  77. package/dist/behaviors/kb-checkpoint.mjs +1319 -169
  78. package/dist/behaviors/kb-chunks.mjs +1152 -213
  79. package/dist/behaviors/kb-citation.d.mts +1 -1
  80. package/dist/behaviors/kb-citation.mjs +1201 -179
  81. package/dist/behaviors/kb-clarify.mjs +1058 -130
  82. package/dist/behaviors/kb-conflict.mjs +1041 -119
  83. package/dist/behaviors/kb-connector.mjs +1104 -176
  84. package/dist/behaviors/kb-core.d.mts +6 -1
  85. package/dist/behaviors/kb-core.mjs +1077 -162
  86. package/dist/behaviors/kb-eval.mjs +1971 -144
  87. package/dist/behaviors/kb-explain.d.mts +1 -1
  88. package/dist/behaviors/kb-explain.mjs +1024 -102
  89. package/dist/behaviors/kb-filter.mjs +2008 -178
  90. package/dist/behaviors/kb-gap.d.mts +1 -1
  91. package/dist/behaviors/kb-gap.mjs +1043 -121
  92. package/dist/behaviors/kb-hittest.d.mts +1 -1
  93. package/dist/behaviors/kb-hittest.mjs +1093 -150
  94. package/dist/behaviors/kb-metadata.mjs +1052 -130
  95. package/dist/behaviors/kb-passage.d.mts +2 -2
  96. package/dist/behaviors/kb-passage.mjs +1101 -161
  97. package/dist/behaviors/kb-pipeline.d.mts +2 -2
  98. package/dist/behaviors/kb-pipeline.mjs +1082 -162
  99. package/dist/behaviors/kb-qa.mjs +1088 -160
  100. package/dist/behaviors/kb-rerank.mjs +1047 -114
  101. package/dist/behaviors/kb-retrieval.mjs +2063 -224
  102. package/dist/behaviors/kb-review.mjs +1990 -159
  103. package/dist/behaviors/kb-sandbox.d.mts +1 -1
  104. package/dist/behaviors/kb-sandbox.mjs +1026 -104
  105. package/dist/behaviors/kb-segment.mjs +1111 -179
  106. package/dist/behaviors/kb-select.d.mts +24 -0
  107. package/dist/behaviors/kb-select.mjs +1989 -0
  108. package/dist/behaviors/kb-sources.d.mts +1 -1
  109. package/dist/behaviors/kb-sources.mjs +1084 -170
  110. package/dist/behaviors/kb-sql.d.mts +1 -1
  111. package/dist/behaviors/kb-sql.mjs +1143 -226
  112. package/dist/behaviors/kb-trace.d.mts +1 -1
  113. package/dist/behaviors/kb-trace.mjs +1042 -128
  114. package/dist/behaviors/kb-visibility.mjs +1086 -158
  115. package/dist/behaviors/kb-who-can.mjs +1974 -137
  116. package/dist/behaviors/mentions.d.mts +93 -0
  117. package/dist/behaviors/mentions.mjs +2152 -0
  118. package/dist/behaviors/modal.d.mts +4 -3
  119. package/dist/behaviors/modal.mjs +1055 -33
  120. package/dist/behaviors/nav.d.mts +1 -1
  121. package/dist/behaviors/nav.mjs +6 -6
  122. package/dist/behaviors/notification.d.mts +16 -8
  123. package/dist/behaviors/notification.mjs +1615 -265
  124. package/dist/behaviors/panel.d.mts +4 -0
  125. package/dist/behaviors/panel.mjs +994 -0
  126. package/dist/behaviors/popover.d.mts +28 -5
  127. package/dist/behaviors/popover.mjs +225 -24
  128. package/dist/behaviors/select.d.mts +5 -2
  129. package/dist/behaviors/select.mjs +1410 -117
  130. package/dist/behaviors/sidebar.d.mts +1 -1
  131. package/dist/behaviors/sidebar.mjs +13 -13
  132. package/dist/behaviors/slider.d.mts +1 -1
  133. package/dist/behaviors/slider.mjs +9 -9
  134. package/dist/behaviors/split-pane.d.mts +1 -1
  135. package/dist/behaviors/split-pane.mjs +7 -7
  136. package/dist/behaviors/suggestions.d.mts +27 -0
  137. package/dist/behaviors/suggestions.mjs +1089 -0
  138. package/dist/behaviors/svg-parse.d.mts +14 -0
  139. package/dist/behaviors/svg-parse.mjs +37 -0
  140. package/dist/behaviors/tabs.d.mts +2 -2
  141. package/dist/behaviors/tabs.mjs +25 -25
  142. package/dist/behaviors/tag-input.d.mts +23 -5
  143. package/dist/behaviors/tag-input.mjs +1359 -104
  144. package/dist/behaviors/theme-switcher.d.mts +24 -0
  145. package/dist/behaviors/theme-switcher.mjs +1981 -0
  146. package/dist/behaviors/theme.d.mts +15 -8
  147. package/dist/behaviors/theme.mjs +390 -28
  148. package/dist/behaviors/toast.d.mts +24 -25
  149. package/dist/behaviors/toast.mjs +1266 -88
  150. package/dist/behaviors/tooltip.d.mts +4 -0
  151. package/dist/behaviors/tooltip.mjs +378 -0
  152. package/dist/behaviors/tree-select.d.mts +69 -0
  153. package/dist/behaviors/tree-select.mjs +1907 -0
  154. package/dist/behaviors/tree.d.mts +1 -1
  155. package/dist/behaviors/tree.mjs +15 -15
  156. package/dist/behaviors/upload.d.mts +3 -2
  157. package/dist/behaviors/upload.mjs +1076 -66
  158. package/dist/cli.mjs +5 -6
  159. package/dist/components/ai-chat.css +666 -573
  160. package/dist/components/ai-diff.css +153 -132
  161. package/dist/components/ai-panel.css +351 -343
  162. package/dist/components/ai-tool.css +393 -238
  163. package/dist/components/autocomplete.css +61 -0
  164. package/dist/components/autocomplete.mjs +3 -0
  165. package/dist/components/back-top.css +34 -31
  166. package/dist/components/badge.css +44 -41
  167. package/dist/components/breadcrumb.css +67 -46
  168. package/dist/components/btn.css +80 -74
  169. package/dist/components/card.css +117 -106
  170. package/dist/components/cascader.css +311 -0
  171. package/dist/components/cascader.mjs +3 -0
  172. package/dist/components/chart-area.css +8 -2
  173. package/dist/components/chart-bar.css +95 -33
  174. package/dist/components/chart-gauge.css +14 -11
  175. package/dist/components/chart-graph.css +20 -17
  176. package/dist/components/chart-heatmap.css +96 -90
  177. package/dist/components/chart-line.css +8 -3
  178. package/dist/components/chart-pie.css +9 -6
  179. package/dist/components/chart-radar.css +8 -5
  180. package/dist/components/chart-scatter.css +9 -6
  181. package/dist/components/chart-sparkline.css +5 -2
  182. package/dist/components/chart-stack.css +14 -11
  183. package/dist/components/charts.css +164 -73
  184. package/dist/components/code-block.css +418 -0
  185. package/dist/components/code-block.mjs +4 -0
  186. package/dist/components/command-palette.css +138 -117
  187. package/dist/components/content.css +257 -251
  188. package/dist/components/copy.css +72 -44
  189. package/dist/components/datatable.css +423 -181
  190. package/dist/components/date-picker.css +135 -104
  191. package/dist/components/empty.css +68 -65
  192. package/dist/components/feedback.css +201 -183
  193. package/dist/components/form-validate.css +120 -0
  194. package/dist/components/form-validate.mjs +3 -0
  195. package/dist/components/form.css +150 -127
  196. package/dist/components/icon.css +102 -0
  197. package/dist/components/icon.mjs +3 -0
  198. package/dist/components/input.css +159 -104
  199. package/dist/components/kb-agent.css +188 -173
  200. package/dist/components/kb-data.css +257 -253
  201. package/dist/components/kb-ground.css +197 -185
  202. package/dist/components/kb-ingest.css +334 -350
  203. package/dist/components/kb-ops.css +265 -259
  204. package/dist/components/kb-perm.css +260 -271
  205. package/dist/components/kb-search.css +317 -360
  206. package/dist/components/kb.css +120 -109
  207. package/dist/components/layout.css +85 -82
  208. package/dist/components/material-chinese.css +73 -0
  209. package/dist/components/material-soviet.css +76 -0
  210. package/dist/components/material.css +275 -0
  211. package/dist/components/media.css +220 -166
  212. package/dist/components/mentions.css +189 -0
  213. package/dist/components/mentions.mjs +3 -0
  214. package/dist/components/menu.css +113 -105
  215. package/dist/components/modal.css +107 -112
  216. package/dist/components/nav.css +118 -115
  217. package/dist/components/notification.css +238 -174
  218. package/dist/components/pagination.css +56 -53
  219. package/dist/components/panel.css +66 -63
  220. package/dist/components/panel.mjs +1 -0
  221. package/dist/components/pill.css +81 -71
  222. package/dist/components/popover.css +67 -53
  223. package/dist/components/scroll-area.css +113 -110
  224. package/dist/components/segmented.css +146 -143
  225. package/dist/components/select.css +206 -186
  226. package/dist/components/sidebar.css +137 -127
  227. package/dist/components/slider.css +117 -114
  228. package/dist/components/split-pane.css +112 -109
  229. package/dist/components/stat.css +112 -106
  230. package/dist/components/steps.css +109 -103
  231. package/dist/components/switch.css +138 -134
  232. package/dist/components/table.css +131 -107
  233. package/dist/components/tabs.css +114 -108
  234. package/dist/components/tag-input.css +48 -133
  235. package/dist/components/tag.css +81 -71
  236. package/dist/components/theme-switcher.css +105 -0
  237. package/dist/components/theme-switcher.mjs +3 -0
  238. package/dist/components/toast.css +100 -86
  239. package/dist/components/toolbar.css +45 -42
  240. package/dist/components/tooltip.css +102 -43
  241. package/dist/components/tooltip.mjs +1 -0
  242. package/dist/components/tree-select.css +416 -0
  243. package/dist/components/tree-select.mjs +3 -0
  244. package/dist/components/upload.css +135 -92
  245. package/dist/fonts/LICENSES/ark-pixel/OFL.txt +96 -0
  246. package/dist/fonts/LICENSES/cubic-11/OFL.txt +108 -0
  247. package/dist/fonts/LICENSES/galmuri/LICENSE.txt +93 -0
  248. package/dist/fonts/OFL.txt +96 -0
  249. package/dist/fonts/README.md +14 -0
  250. package/dist/fonts/fusion-pixel-12px-zh-hans.woff2 +0 -0
  251. package/dist/index.d.mts +28 -14
  252. package/dist/index.mjs +20705 -9601
  253. package/dist/react.d.mts +91 -0
  254. package/dist/react.mjs +8208 -0
  255. package/dist/registry.json +130 -13
  256. package/dist/tokens/chinese.css +44 -0
  257. package/dist/tokens/colors.css +365 -1222
  258. package/dist/tokens/design.css +109 -0
  259. package/dist/tokens/dtcg.json +11198 -0
  260. package/dist/tokens/figma.variables.json +7017 -0
  261. package/dist/tokens/icon-masks.css +78 -0
  262. package/dist/tokens/pixel.css +50 -0
  263. package/dist/tokens/soviet.css +44 -0
  264. package/dist/tokens/style-profiles.css +36 -547
  265. package/dist/tokens/themes.json +308 -0
  266. package/dist/tokens/tokens-studio.json +6728 -0
  267. package/dist/tokens/typography.css +21 -18
  268. package/dist/tokens.css +1555 -1801
  269. package/dist/ui.css +11975 -9831
  270. package/dist/vue.d.mts +344 -0
  271. package/dist/vue.mjs +7781 -0
  272. package/docs/spec/ai-input-experience.md +75 -0
  273. package/docs/spec/ai-native.md +238 -147
  274. package/docs/spec/design-philosophy.md +189 -0
  275. package/docs/spec/design-primitives.md +196 -0
  276. package/docs/spec/kb-family.md +147 -115
  277. package/package.json +43 -8
  278. package/dist/retro-effects.css +0 -255
  279. package/dist/tokens/retro-effects.css +0 -255
  280. package/docs/research/2026-10-03-ai-kb-components.md +0 -392
  281. package/docs/research/2026-10-03-kb-permissions.md +0 -992
@@ -1,123 +1,121 @@
1
+ @layer icen.components {
1
2
  /*
2
3
  * @icen.ai/ui — Component: date-picker(日期选择,与 behaviors/date-picker 配套)
3
4
  *
4
5
  * 契约:
5
- * <div class="date-picker" data-date-picker data-date-picker-input="id">
6
- * <button class="date-picker-trigger [--sm|--lg]" type="button" aria-haspopup="dialog">
7
- * <span class="date-picker-value">2026-07-29</span>
8
- * <svg class="date-picker-icon">…日历 svg…</svg>
6
+ * <div class="icen-date-picker" data-icen-date-picker>
7
+ * <button class="icen-date-picker-trigger [--sm|--lg]" type="button" aria-haspopup="dialog">
8
+ * <span class="icen-date-picker-value">2026-07-29</span>
9
+ * <svg class="icen-date-picker-icon">…日历 svg…</svg>
9
10
  * </button>
10
11
  * <input type="hidden" id="id" name="date" value="2026-07-29" />
11
12
  * </div>
12
13
  *
13
- * 或直接挂到普通 input(behavior 自动包裹触发器外观):
14
- * <input class="date-picker-input" data-date-picker value="2026-07-29" />
15
- *
16
14
  * behavior 渲染面板(portal 到 body):
17
- * <div class="date-picker-panel" role="dialog">
18
- * <div class="date-picker-head">
19
- * <button class="date-picker-nav" data-prev>‹</button>
20
- * <span class="date-picker-title">2026 年 7 月</span>
21
- * <button class="date-picker-nav" data-next>›</button>
15
+ * <div class="icen-date-picker-panel" role="dialog">
16
+ * <div class="icen-date-picker-head">
17
+ * <button class="icen-date-picker-nav" data-icen-prev>…shared chevron SVG…</button>
18
+ * <span class="icen-date-picker-title">2026 年 7 月</span>
19
+ * <button class="icen-date-picker-nav" data-icen-next>…shared chevron SVG…</button>
22
20
  * </div>
23
- * <div class="date-picker-weekdays">
21
+ * <div class="icen-date-picker-weekdays">
24
22
  * <span>一</span><span>二</span><span>三</span><span>四</span><span>五</span><span>六</span><span>日</span>
25
23
  * </div>
26
- * <div class="date-picker-grid">
27
- * <button class="date-picker-cell [.is-outside] [.is-today] [.is-selected] [.is-disabled]">15</button>
24
+ * <div class="icen-date-picker-grid">
25
+ * <button class="icen-date-picker-cell [.is-outside] [.is-today] [.is-selected] [.is-disabled]">15</button>
28
26
  * …
29
27
  * </div>
30
- * <div class="date-picker-foot">
31
- * <button class="date-picker-today">今天</button>
32
- * <button class="date-picker-clear">清除</button>
28
+ * <div class="icen-date-picker-foot">
29
+ * <button class="icen-date-picker-today">今天</button>
30
+ * <button class="icen-date-picker-clear">清除</button>
33
31
  * </div>
34
32
  * </div>
35
33
  *
36
34
  * 可选 data-*:
37
- * data-date-picker-format="yyyy-mm-dd" 显示格式
38
- * data-date-picker-min="2026-01-01" 最小可选日期
39
- * data-date-picker-max="2026-12-31" 最大可选日期
40
- * data-date-picker-week-start="0" 周首日(0=周日,1=周一,默认 1)
35
+ * data-icen-date-picker-format="yyyy-mm-dd" 显示格式
36
+ * data-icen-date-picker-min="2026-01-01" 最小可选日期
37
+ * data-icen-date-picker-max="2026-12-31" 最大可选日期
38
+ * data-icen-date-picker-week-start="0" 周首日(0=周日,1=周一,默认 1)
41
39
  */
42
40
 
43
- .date-picker {
41
+ .icen-date-picker {
44
42
  display: inline-block;
45
43
  position: relative;
46
44
  }
47
45
 
48
- .date-picker-trigger {
46
+ .icen-date-picker-trigger {
49
47
  display: inline-flex;
50
48
  align-items: center;
51
- gap: var(--density-space-xs);
49
+ gap: var(--icen-density-space-xs);
52
50
  width: 100%;
53
- height: var(--density-input-height-md);
54
- padding: 0 var(--density-space-sm);
55
- background: var(--token-control);
56
- border: 1px solid var(--token-outline-soft);
57
- border-radius: var(--radius-md);
58
- box-shadow: var(--token-shadow-inset);
59
- color: var(--token-text);
51
+ height: var(--icen-density-input-height-md);
52
+ padding: 0 var(--icen-density-space-sm);
53
+ background: var(--icen-token-control);
54
+ border: 1px solid var(--icen-token-outline-soft);
55
+ border-radius: var(--icen-radius-md);
56
+ box-shadow: var(--icen-token-shadow-inset);
57
+ color: var(--icen-token-text);
60
58
  font: inherit;
61
- font-size: var(--density-font-size-md);
59
+ font-size: var(--icen-density-font-size-md);
62
60
  cursor: pointer;
63
61
  -webkit-tap-highlight-color: transparent;
64
62
  transition: border-color var(--icen-tx-fast), box-shadow var(--icen-tx-fast);
65
63
  }
66
- .date-picker-trigger:hover { border-color: var(--icen-hover-border); }
67
- .date-picker-trigger.is-open {
64
+ .icen-date-picker-trigger:hover { border-color: var(--icen-hover-border); }
65
+ .icen-date-picker-trigger.is-open {
68
66
  border-color: var(--icen-control-focus-border);
69
67
  box-shadow: var(--icen-control-focus-shadow);
70
68
  }
71
- .date-picker-trigger:focus-visible {
69
+ .icen-date-picker-trigger:focus-visible {
72
70
  outline: none;
73
71
  border-color: var(--icen-control-focus-border);
74
72
  box-shadow: var(--icen-control-focus-shadow);
75
73
  }
76
- .date-picker-value {
74
+ .icen-date-picker-value {
77
75
  flex: 1;
78
- min-width: 0;
79
- text-align: left;
76
+ min-inline-size: 0;
77
+ text-align: start;
80
78
  overflow: hidden;
81
79
  text-overflow: ellipsis;
82
80
  white-space: nowrap;
83
81
  font-variant-numeric: tabular-nums;
84
82
  }
85
- .date-picker-value.is-empty { color: color-mix(in srgb, var(--token-text-faint) 60%, transparent); }
86
- .date-picker-icon { display: inline-flex; color: var(--token-text-faint); flex-shrink: 0; }
87
- .date-picker-icon svg { width: 14px; height: 14px; }
83
+ .icen-date-picker-value.is-empty { color: var(--icen-token-text-muted); }
84
+ .icen-date-picker-icon { display: inline-flex; color: var(--icen-token-text-faint); flex-shrink: 0; }
85
+ .icen-date-picker-icon svg { width: 14px; height: 14px; }
88
86
 
89
87
  /* 尺寸 */
90
- .date-picker-trigger.date-picker-trigger--sm { height: var(--density-input-height-sm); font-size: var(--density-font-size-sm); }
91
- .date-picker-trigger.date-picker-trigger--lg { height: var(--density-input-height-lg); font-size: var(--density-font-size-lg); }
88
+ .icen-date-picker-trigger.icen-date-picker-trigger--sm { height: var(--icen-density-input-height-sm); font-size: var(--icen-density-font-size-sm); }
89
+ .icen-date-picker-trigger.icen-date-picker-trigger--lg { height: var(--icen-density-input-height-lg); font-size: var(--icen-density-font-size-lg); }
92
90
 
93
91
  /* ── 面板 ── */
94
- .date-picker-panel {
92
+ .icen-date-picker-panel {
95
93
  position: fixed;
96
- z-index: var(--z-popover);
94
+ z-index: var(--icen-z-popover);
97
95
  width: 280px;
98
- padding: var(--density-space-sm);
99
- background: var(--token-card-strong);
100
- border: 1px solid var(--token-outline);
101
- border-radius: var(--radius-md);
102
- box-shadow: var(--token-shadow-overlay);
103
- font-size: var(--density-font-size-sm);
96
+ padding: var(--icen-density-space-sm);
97
+ background: var(--icen-token-card-strong);
98
+ border: 1px solid var(--icen-token-outline);
99
+ border-radius: var(--icen-radius-md);
100
+ box-shadow: var(--icen-token-shadow-overlay);
101
+ font-size: var(--icen-density-font-size-sm);
104
102
  animation: icen-pop-in var(--icen-tx-fast);
105
103
  }
106
104
 
107
- .date-picker-head {
105
+ .icen-date-picker-head {
108
106
  display: flex;
109
107
  align-items: center;
110
108
  justify-content: space-between;
111
- margin-bottom: var(--density-space-sm);
109
+ margin-bottom: var(--icen-density-space-sm);
112
110
  }
113
- .date-picker-title {
111
+ .icen-date-picker-title {
114
112
  font-weight: 600;
115
- color: var(--token-text);
113
+ color: var(--icen-token-text);
116
114
  font-variant-numeric: tabular-nums;
117
115
  flex: 1;
118
116
  text-align: center;
119
117
  }
120
- .date-picker-nav {
118
+ .icen-date-picker-nav {
121
119
  display: inline-flex;
122
120
  align-items: center;
123
121
  justify-content: center;
@@ -125,116 +123,149 @@
125
123
  height: 24px;
126
124
  padding: 0;
127
125
  border: 0;
128
- border-radius: var(--radius-xs);
126
+ border-radius: var(--icen-radius-xs);
129
127
  background: transparent;
130
- color: var(--token-text-muted);
131
- font-size: var(--density-font-size-md);
128
+ color: var(--icen-token-text-muted);
129
+ font-size: var(--icen-density-font-size-md);
132
130
  cursor: pointer;
133
131
  -webkit-tap-highlight-color: transparent;
134
132
  transition: color var(--icen-tx-fast), background-color var(--icen-tx-fast);
135
133
  }
136
- .date-picker-nav:hover { color: var(--token-text); background: var(--token-fill-1); }
137
- .date-picker-nav:focus-visible {
134
+ .icen-date-picker-nav:hover { color: var(--icen-token-text); background: var(--icen-token-fill-1); }
135
+ .icen-date-picker-nav:focus-visible {
138
136
  outline: none;
139
137
  box-shadow: var(--icen-ring);
140
138
  }
141
139
 
142
- .date-picker-weekdays {
140
+ .icen-date-picker-weekdays {
143
141
  display: grid;
144
142
  grid-template-columns: repeat(7, 1fr);
145
143
  gap: 2px;
146
144
  margin-bottom: 4px;
147
145
  }
148
- .date-picker-weekdays > span {
146
+ .icen-date-picker-weekdays > span {
149
147
  display: flex;
150
148
  align-items: center;
151
149
  justify-content: center;
152
150
  height: 24px;
153
- font-size: var(--density-font-size-xs);
154
- color: var(--token-text-faint);
151
+ font-size: var(--icen-density-font-size-xs);
152
+ color: var(--icen-token-text-faint);
155
153
  font-weight: 500;
156
154
  }
157
155
 
158
- .date-picker-grid {
156
+ .icen-date-picker-grid {
159
157
  display: grid;
160
158
  grid-template-columns: repeat(7, 1fr);
161
159
  gap: 2px;
162
160
  }
163
- .date-picker-cell {
161
+ .icen-date-picker-cell {
164
162
  display: flex;
165
163
  align-items: center;
166
164
  justify-content: center;
167
165
  height: 30px;
168
166
  padding: 0;
169
167
  border: 0;
170
- border-radius: var(--radius-sm);
168
+ border-radius: var(--icen-radius-sm);
171
169
  background: transparent;
172
- color: var(--token-text);
170
+ color: var(--icen-token-text);
173
171
  font: inherit;
174
- font-size: var(--density-font-size-sm);
172
+ font-size: var(--icen-density-font-size-sm);
175
173
  font-variant-numeric: tabular-nums;
176
174
  cursor: pointer;
177
175
  -webkit-tap-highlight-color: transparent;
178
176
  transition: background-color var(--icen-tx-fast), color var(--icen-tx-fast);
179
177
  }
180
- .date-picker-cell:hover { background: var(--token-fill-1); }
181
- .date-picker-cell.is-today {
182
- border: 1px solid var(--token-accent);
183
- color: var(--token-accent);
178
+ .icen-date-picker-cell:hover { background: var(--icen-token-fill-1); }
179
+ .icen-date-picker-cell.is-today {
180
+ border: 1px solid var(--icen-token-accent);
181
+ color: var(--icen-token-accent-text, var(--icen-token-accent-deep, var(--icen-token-accent)));
184
182
  font-weight: 600;
185
183
  }
186
- .date-picker-cell.is-selected {
187
- background: var(--token-accent);
188
- color: var(--token-on-accent);
184
+ .icen-date-picker-cell.is-selected {
185
+ background: var(--icen-token-accent-strong);
186
+ color: var(--icen-token-on-accent);
189
187
  font-weight: 600;
190
188
  }
191
- .date-picker-cell.is-selected.is-today { border-color: var(--token-on-accent); }
192
- .date-picker-cell.is-outside {
193
- color: var(--token-text-faint);
194
- opacity: 0.55;
189
+ .icen-date-picker-cell.is-selected.is-today { border-color: var(--icen-token-on-accent); }
190
+ .icen-date-picker-cell.is-outside {
191
+ color: var(--icen-token-text-muted);
192
+ opacity: 1;
195
193
  }
196
- .date-picker-cell.is-disabled {
197
- color: var(--token-text-faint);
194
+ .icen-date-picker-cell.is-disabled {
195
+ color: var(--icen-token-text-faint);
198
196
  opacity: 0.35;
199
197
  cursor: not-allowed;
200
198
  pointer-events: none;
201
199
  }
202
- .date-picker-cell:focus-visible {
200
+ .icen-date-picker-cell:focus-visible {
203
201
  outline: none;
204
202
  box-shadow: var(--icen-ring);
205
203
  }
206
204
 
207
- .date-picker-foot {
205
+ .icen-date-picker-foot {
208
206
  display: flex;
209
207
  justify-content: space-between;
210
- gap: var(--density-space-xs);
211
- margin-top: var(--density-space-sm);
212
- padding-top: var(--density-space-sm);
213
- border-top: 1px solid var(--token-line-soft);
214
- }
215
- .date-picker-today,
216
- .date-picker-clear {
217
- padding: 4px var(--density-space-sm);
208
+ gap: var(--icen-density-space-xs);
209
+ margin-top: var(--icen-density-space-sm);
210
+ padding-top: var(--icen-density-space-sm);
211
+ border-top: 1px solid var(--icen-token-line-soft);
212
+ }
213
+ .icen-date-picker-today,
214
+ .icen-date-picker-clear {
215
+ padding: 4px var(--icen-density-space-sm);
218
216
  border: 0;
219
- border-radius: var(--radius-xs);
217
+ border-radius: var(--icen-radius-xs);
220
218
  background: transparent;
221
- color: var(--token-accent);
219
+ color: var(--icen-token-accent-strong);
222
220
  font: inherit;
223
- font-size: var(--density-font-size-xs);
221
+ font-size: var(--icen-density-font-size-xs);
224
222
  cursor: pointer;
225
223
  -webkit-tap-highlight-color: transparent;
226
224
  transition: background-color var(--icen-tx-fast);
227
225
  }
228
- .date-picker-today:hover,
229
- .date-picker-clear:hover { background: var(--token-fill-1); }
230
- .date-picker-today:focus-visible,
231
- .date-picker-clear:focus-visible {
226
+ .icen-date-picker-today:hover,
227
+ .icen-date-picker-clear:hover { background: var(--icen-token-fill-1); }
228
+ .icen-date-picker-today:focus-visible,
229
+ .icen-date-picker-clear:focus-visible {
232
230
  outline: none;
233
231
  box-shadow: var(--icen-ring);
234
232
  }
235
- .date-picker-clear { color: var(--token-text-muted); }
233
+ .icen-date-picker-clear { color: var(--icen-token-text-muted); }
236
234
 
237
235
  @media (prefers-reduced-motion: reduce) {
238
- .date-picker-panel { animation: none; }
239
- .date-picker-cell { transition: none; }
236
+ .icen-date-picker-panel { animation: none; }
237
+ .icen-date-picker-cell { transition: none; }
238
+ }
239
+
240
+ /* Calendar rows preserve real grid semantics. A single date joins the tab order;
241
+ logical arrows move within the month without exposing 42 separate tab stops. */
242
+ .icen-date-picker-panel { width: 300px; overflow: auto; overscroll-behavior: contain; }
243
+ .icen-date-picker-grid { display: flex; flex-direction: column; gap: 2px; }
244
+ .icen-date-picker-week { display: grid; grid-template-columns: repeat(7,minmax(0,1fr)); gap: 2px; }
245
+ .icen-date-picker-week > span { min-inline-size: 0; }
246
+ .icen-date-picker-cell { inline-size: 100%; block-size: 34px; }
247
+ .icen-date-picker-nav { inline-size: 30px; block-size: 30px; flex: 0 0 30px; }
248
+ .icen-date-picker-nav > svg { inline-size: 16px; block-size: 16px; }
249
+ .icen-date-picker-icon { inline-size: 20px; block-size: 20px; align-items: center; justify-content: center; }
250
+ .icen-date-picker-icon > svg { inline-size: 16px; block-size: 16px; }
251
+ .icen-date-picker-nav:disabled, .icen-date-picker-today:disabled, .icen-date-picker-clear:disabled { opacity: .4; cursor: default; }
252
+ .icen-date-picker-nav:disabled:hover, .icen-date-picker-today:disabled:hover, .icen-date-picker-clear:disabled:hover { background: transparent; }
253
+ .icen-date-picker-trigger[aria-disabled="true"] { opacity: .5; cursor: not-allowed; }
254
+ .icen-date-picker-cell.is-outside.is-selected { opacity: 1; color: var(--icen-token-on-accent); }
255
+ .icen-date-picker-panel:focus-visible { outline: 2px solid var(--icen-token-accent); outline-offset: 2px; }
256
+ .icen-date-picker-empty { margin-block: var(--icen-density-space-sm) 0; color: var(--icen-token-text-muted); text-align: center; }
257
+ .icen-date-picker-panel[dir="rtl"] .icen-date-picker-nav > svg { transform: scaleX(-1); }
258
+ @media (pointer: coarse) {
259
+ .icen-date-picker-panel { width: 344px; }
260
+ .icen-date-picker-trigger { min-block-size: 44px; }
261
+ .icen-date-picker-cell { min-block-size: 44px; }
262
+ .icen-date-picker-nav { min-inline-size: 44px; min-block-size: 44px; }
263
+ .icen-date-picker-today, .icen-date-picker-clear { min-inline-size: 44px; min-block-size: 44px; }
264
+ }
265
+ @media (forced-colors: active) {
266
+ :root .icen-date-picker-panel { background: Canvas; color: CanvasText; border-color: CanvasText; box-shadow: none; backdrop-filter: none; -webkit-backdrop-filter: none; }
267
+ .icen-date-picker-cell.is-selected { forced-color-adjust: none; background: Highlight; color: HighlightText; }
268
+ .icen-date-picker-cell:disabled, .icen-date-picker-nav:disabled, .icen-date-picker-today:disabled, .icen-date-picker-clear:disabled { color: GrayText; opacity: 1; }
269
+ }
270
+
240
271
  }
@@ -1,131 +1,134 @@
1
+ @layer icen.components {
1
2
  /*
2
3
  * @icen.ai/ui — Component: empty(空状态 / 无数据 / 404 / 错误 / 维护中)
3
4
  *
4
5
  * 完整契约:
5
- * <div class="empty [.empty--sm|.empty--lg]
6
- * [.empty--error|.empty--404|.empty--search|.empty--maintenance|.empty--network]">
7
- * <div class="empty-icon">…svg…</div> ← 可选,缺省显示默认占位
8
- * <h3 class="empty-title">暂无数据</h3>
9
- * <p class="empty-desc">描述文案(可选)</p>
10
- * <div class="empty-action"> ← 可选:操作按钮位
11
- * <button class="btn btn-primary">…</button>
12
- * <button class="btn">…</button>
6
+ * <div class="icen-empty [.icen-empty--sm|.icen-empty--lg]
7
+ * [.icen-empty--error|.icen-empty--404|.icen-empty--search|.icen-empty--maintenance|.icen-empty--network]">
8
+ * <div class="icen-empty-icon">…svg…</div> ← 可选,缺省显示默认占位
9
+ * <h3 class="icen-empty-title">暂无数据</h3>
10
+ * <p class="icen-empty-desc">描述文案(可选)</p>
11
+ * <div class="icen-empty-action"> ← 可选:操作按钮位
12
+ * <button class="icen-btn icen-btn-primary">…</button>
13
+ * <button class="icen-btn">…</button>
13
14
  * </div>
14
15
  * </div>
15
16
  *
16
17
  * 类型预设(改图标底色与基调):
17
- * .empty--error 错误(红底图标)
18
- * .empty--404 404(中性大字)
19
- * .empty--search 搜索无结果
20
- * .empty--maintenance 维护中(warning 底)
21
- * .empty--network 网络错误(info 底)
18
+ * .icen-empty--error 错误(红底图标)
19
+ * .icen-empty--404 404(中性大字)
20
+ * .icen-empty--search 搜索无结果
21
+ * .icen-empty--maintenance 维护中(warning 底)
22
+ * .icen-empty--network 网络错误(info 底)
22
23
  *
23
24
  * 规格源自 opengal src/presentation/ui/data/display.tsx 的 EmptyState。
24
25
  */
25
26
 
26
- .empty {
27
+ .icen-empty {
27
28
  display: flex;
28
29
  flex-direction: column;
29
30
  align-items: center;
30
31
  justify-content: center;
31
32
  text-align: center;
32
- padding: var(--density-space-lg) var(--density-space-md);
33
+ padding: var(--icen-density-space-lg) var(--icen-density-space-md);
33
34
  }
34
- .empty--sm { padding: var(--density-space-md); }
35
- .empty--lg { padding: 64px var(--density-space-md); }
35
+ .icen-empty--sm { padding: var(--icen-density-space-md); }
36
+ .icen-empty--lg { padding: 64px var(--icen-density-space-md); }
36
37
 
37
38
  /* ── 图标 ── */
38
- .empty-icon {
39
+ .icen-empty-icon {
39
40
  width: 48px;
40
41
  height: 48px;
41
- border-radius: var(--radius-lg);
42
- background: var(--token-card);
43
- border: 1px solid var(--token-outline-soft);
44
- box-shadow: var(--token-shadow-inset);
42
+ border-radius: var(--icen-radius-lg);
43
+ background: var(--icen-token-card);
44
+ border: 1px solid var(--icen-token-outline-soft);
45
+ box-shadow: var(--icen-token-shadow-inset);
45
46
  display: flex;
46
47
  align-items: center;
47
48
  justify-content: center;
48
- color: var(--token-text-faint);
49
- margin-bottom: var(--density-space-md);
49
+ color: var(--icen-token-text-faint);
50
+ margin-bottom: var(--icen-density-space-md);
50
51
  }
51
- .empty--lg .empty-icon { width: 64px; height: 64px; }
52
- .empty--sm .empty-icon { width: 36px; height: 36px; margin-bottom: var(--density-space-sm); }
53
- .empty-icon svg { width: 24px; height: 24px; }
54
- .empty--lg .empty-icon svg { width: 32px; height: 32px; }
55
- .empty--sm .empty-icon svg { width: 18px; height: 18px; }
52
+ .icen-empty--lg .icen-empty-icon { width: 64px; height: 64px; }
53
+ .icen-empty--sm .icen-empty-icon { width: 36px; height: 36px; margin-bottom: var(--icen-density-space-sm); }
54
+ .icen-empty-icon svg { width: 24px; height: 24px; }
55
+ .icen-empty--lg .icen-empty-icon svg { width: 32px; height: 32px; }
56
+ .icen-empty--sm .icen-empty-icon svg { width: 18px; height: 18px; }
56
57
 
57
58
  /* ── 类型预设 ── */
58
- .empty--error .empty-icon {
59
- background: color-mix(in srgb, var(--token-error) 10%, transparent);
60
- border-color: color-mix(in srgb, var(--token-error) 20%, transparent);
61
- color: var(--token-error);
59
+ .icen-empty--error .icen-empty-icon {
60
+ background: color-mix(in srgb, var(--icen-token-error) 10%, transparent);
61
+ border-color: color-mix(in srgb, var(--icen-token-error) 20%, transparent);
62
+ color: var(--icen-token-error);
62
63
  }
63
- .empty--maintenance .empty-icon {
64
- background: color-mix(in srgb, var(--token-warning) 10%, transparent);
65
- border-color: color-mix(in srgb, var(--token-warning) 20%, transparent);
66
- color: var(--token-warning);
64
+ .icen-empty--maintenance .icen-empty-icon {
65
+ background: color-mix(in srgb, var(--icen-token-warning) 10%, transparent);
66
+ border-color: color-mix(in srgb, var(--icen-token-warning) 20%, transparent);
67
+ color: var(--icen-token-warning);
67
68
  }
68
- .empty--network .empty-icon {
69
- background: color-mix(in srgb, var(--token-info) 10%, transparent);
70
- border-color: color-mix(in srgb, var(--token-info) 20%, transparent);
71
- color: var(--token-info);
69
+ .icen-empty--network .icen-empty-icon {
70
+ background: color-mix(in srgb, var(--icen-token-info) 10%, transparent);
71
+ border-color: color-mix(in srgb, var(--icen-token-info) 20%, transparent);
72
+ color: var(--icen-token-info);
72
73
  }
73
- .empty--search .empty-icon {
74
- background: var(--token-fill-1);
75
- color: var(--token-text-muted);
74
+ .icen-empty--search .icen-empty-icon {
75
+ background: var(--icen-token-fill-1);
76
+ color: var(--icen-token-text-muted);
76
77
  }
77
78
 
78
79
  /* ── 标题与描述 ── */
79
- .empty-title {
80
- font-size: var(--density-font-size-md);
80
+ .icen-empty-title {
81
+ font-size: var(--icen-density-font-size-md);
81
82
  font-weight: 500;
82
- color: var(--token-text);
83
+ color: var(--icen-token-text);
83
84
  margin: 0;
84
85
  line-height: 1.4;
85
86
  }
86
- .empty--error .empty-title { color: var(--token-error); }
87
- .empty-desc {
88
- font-size: var(--density-font-size-sm);
89
- color: var(--token-text-muted);
87
+ .icen-empty--error .icen-empty-title { color: var(--icen-token-error); }
88
+ .icen-empty-desc {
89
+ font-size: var(--icen-density-font-size-sm);
90
+ color: var(--icen-token-text-muted);
90
91
  margin: 4px 0 0;
91
92
  max-width: 280px;
92
93
  line-height: 1.5;
93
94
  }
94
95
 
95
96
  /* ── 操作区 ── */
96
- .empty-action {
97
- margin-top: var(--density-space-md);
97
+ .icen-empty-action {
98
+ margin-top: var(--icen-density-space-md);
98
99
  display: flex;
99
- gap: var(--density-space-xs);
100
+ gap: var(--icen-density-space-xs);
100
101
  flex-wrap: wrap;
101
102
  justify-content: center;
102
103
  }
103
104
 
104
105
  /* ── 404 大数字 ── */
105
- .empty--404 .empty-title {
106
+ .icen-empty--404 .icen-empty-title {
106
107
  font-size: 72px;
107
108
  font-weight: 800;
108
- font-family: var(--font-heading);
109
+ font-family: var(--icen-font-heading);
109
110
  line-height: 1;
110
111
  letter-spacing: -0.02em;
111
- color: var(--token-text-faint);
112
- margin-bottom: var(--density-space-sm);
112
+ color: var(--icen-token-text-faint);
113
+ margin-bottom: var(--icen-density-space-sm);
113
114
  }
114
- .empty--404 .empty-icon { display: none; }
115
+ .icen-empty--404 .icen-empty-icon { display: none; }
115
116
 
116
117
  /* ── 插画背景(使用方可用渐变背景替代图标) ── */
117
- .empty--illustrated {
118
+ .icen-empty--illustrated {
118
119
  background: radial-gradient(ellipse at center,
119
- color-mix(in srgb, var(--token-accent) 6%, transparent) 0%,
120
+ color-mix(in srgb, var(--icen-token-accent) 6%, transparent) 0%,
120
121
  transparent 70%);
121
- border-radius: var(--radius-lg);
122
+ border-radius: var(--icen-radius-lg);
122
123
  }
123
124
 
124
125
  /* ── 内嵌模式(empty 嵌入卡片/面板内时无 padding) ── */
125
- .empty--inline {
126
- padding: var(--density-space-md) var(--density-space-sm);
126
+ .icen-empty--inline {
127
+ padding: var(--icen-density-space-md) var(--icen-density-space-sm);
127
128
  }
128
129
 
129
130
  @media (max-width: 480px) {
130
- .empty--404 .empty-title { font-size: 56px; }
131
+ .icen-empty--404 .icen-empty-title { font-size: 56px; }
132
+ }
133
+
131
134
  }