@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
@@ -0,0 +1,76 @@
1
+ @layer icen.components {
2
+ /* 苏式 material adapter. DOM contract: html[data-icen-style="soviet"] with
3
+ * existing ICEN components or [data-icen-material="content|chrome|floating"].
4
+ * Structural emphasis belongs to frame/header/action, not long-form text.
5
+ */
6
+ :root[data-icen-style="soviet"] {
7
+ --icen-press: translateY(1px);
8
+ --icen-press-soft: translateY(1px);
9
+ --icen-hover-border: var(--icen-token-line-strong);
10
+ --icen-hover-border-strong: var(--icen-token-text);
11
+ --icen-ring: 0 0 0 2px var(--icen-token-surface), 0 0 0 4px var(--icen-token-accent);
12
+ --icen-ring-soft: 0 0 0 2px var(--icen-token-accent-subtle);
13
+ --icen-control-focus-shadow: inset 0 -2px 0 var(--icen-token-accent);
14
+ --icen-control-focus-border: var(--icen-token-accent);
15
+ }
16
+ :root[data-icen-style="soviet"] :is([data-icen-material],.icen-menu,.icen-popover,.icen-select-panel,.icen-date-picker-panel,.icen-autocomplete-panel,.icen-cascader-panel,.icen-tree-select-panel,.icen-mentions-panel,.icen-ai-composer-popup,.icen-command-palette,.icen-card--glass,.icen-nav) {
17
+ background: var(--icen-token-surface);
18
+ border-color: var(--icen-token-line-strong);
19
+ backdrop-filter: none;
20
+ -webkit-backdrop-filter: none;
21
+ }
22
+ :root[data-icen-style="soviet"] :is(h1,h2,h3,h4,h5,h6,.icen-card-title,.icen-modal-title) {
23
+ font-family: var(--icen-font-heading);
24
+ font-weight: 750;
25
+ letter-spacing: var(--icen-letter-spacing-heading);
26
+ line-height: var(--icen-line-height-heading);
27
+ }
28
+ /* Only display text is condensed; labels, forms and paragraphs stay comfortable. */
29
+ :root[data-icen-style="soviet"] :is(h1,h2) { font-stretch: condensed; }
30
+ :root[data-icen-style="soviet"] :is(.icen-btn,.icen-page-tab,.icen-panel-title,.icen-table th) {
31
+ font-family: var(--icen-font-body);
32
+ font-weight: 650;
33
+ letter-spacing: .035em;
34
+ }
35
+ :root[data-icen-style="soviet"] :is(.icen-btn,.icen-input-wrap,.icen-textarea-wrap,.icen-select-trigger,.icen-segmented) { border-width: 2px; }
36
+ :root[data-icen-style="soviet"] :is(.icen-btn-ghost,.icen-btn-link) { border-color: transparent; }
37
+ :root[data-icen-style="soviet"] :is(.icen-card,.icen-panel,[data-icen-material="content"]) {
38
+ border-color: var(--icen-token-line);
39
+ border-block-start: 3px solid var(--icen-token-line-strong);
40
+ box-shadow: none;
41
+ }
42
+ :root[data-icen-style="soviet"] .icen-card--elevated { box-shadow: var(--icen-token-shadow-card); }
43
+ :root[data-icen-style="soviet"] :is(.icen-card.is-selected,.icen-card--interactive:focus-within) { box-shadow: var(--icen-ring); }
44
+ :root[data-icen-style="soviet"] .icen-panel-title {
45
+ color: var(--icen-token-text);
46
+ padding-block: var(--icen-density-space-md);
47
+ border-block-end: 2px solid var(--icen-token-line);
48
+ }
49
+ :root[data-icen-style="soviet"] .icen-panel.is-collapsed .icen-panel-title { border-block-end-color: transparent; }
50
+ :root[data-icen-style="soviet"] .icen-modal { border: 2px solid var(--icen-token-line-strong); }
51
+ :root[data-icen-style="soviet"] :is(.icen-switch,.icen-switch-thumb) { border-radius: var(--icen-radius-sm); }
52
+ :root[data-icen-style="soviet"] :is(.icen-segmented-item.is-active,.icen-segmented-item[aria-checked="true"],.icen-toggle-group-btn.is-active) {
53
+ background: var(--icen-token-surface);
54
+ box-shadow: inset 0 -3px 0 var(--icen-token-accent), inset 0 0 0 1px var(--icen-token-line);
55
+ }
56
+ :root[data-icen-style="soviet"] .icen-tabs:not(.icen-tabs--cards):not(.icen-tabs--segment):not(.icen-tabs--vertical) .icen-page-tab { border-block-end-width: 3px; }
57
+ :root[data-icen-style="soviet"] :is(.icen-btn,.icen-menu-item,.icen-select-option,.icen-segmented-item):focus-visible {
58
+ outline: 2px solid var(--icen-token-accent);
59
+ outline-offset: 3px;
60
+ }
61
+ @media (prefers-reduced-motion: reduce) {
62
+ :root[data-icen-style="soviet"] { --icen-press: none; --icen-press-soft: none; }
63
+ }
64
+ @media (forced-colors: active) {
65
+ :root[data-icen-style="soviet"] :is([data-icen-material],.icen-card,.icen-panel,.icen-menu,.icen-popover,.icen-select-panel,.icen-date-picker-panel,.icen-autocomplete-panel,.icen-cascader-panel,.icen-tree-select-panel,.icen-mentions-panel,.icen-ai-composer-popup,.icen-command-palette,.icen-modal,.icen-nav) {
66
+ background: Canvas;
67
+ color: CanvasText;
68
+ border-color: CanvasText;
69
+ box-shadow: none;
70
+ }
71
+ :root[data-icen-style="soviet"] :is(.icen-segmented-item[aria-checked="true"],.icen-segmented-item.is-active,.icen-toggle-group-btn.is-active) { outline: 2px solid Highlight; outline-offset: -2px; }
72
+ :root[data-icen-style="soviet"] :focus-visible { outline: 2px solid Highlight; outline-offset: 3px; }
73
+ :root[data-icen-style="soviet"] :is(.icen-card.is-selected,.icen-card--interactive:focus-within) { box-shadow: none; outline: 2px solid Highlight; outline-offset: 2px; }
74
+ }
75
+
76
+ }
@@ -0,0 +1,275 @@
1
+ @layer icen.components {
2
+ /* Material contract (default 现代 primitive; theme via data-icen-preset):
3
+ * <section data-icen-material="content|chrome|floating">arbitrary content</section>
4
+ * content = opaque reading; chrome = translucent navigation; floating = temporary
5
+ * operations. HTML primitives need no JS. Existing components consume the same
6
+ * recipes automatically. Force opaque via html[data-icen-transparency="reduced"].
7
+ * This file ships with tokens.css as well as ui.css; kit consumers need no extras.
8
+ */
9
+ /* The base layer also defines interaction defaults. Keep the primitive's
10
+ * interaction recipe in the components layer so separately imported base.css
11
+ * cannot quietly restore a different press/focus model. */
12
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) {
13
+ --icen-press: scale(.985);
14
+ --icen-press-soft: scale(.99);
15
+ --icen-hover-border: var(--icen-token-line);
16
+ --icen-hover-border-strong: var(--icen-token-line-strong);
17
+ --icen-ring: 0 0 0 2px var(--icen-token-surface), 0 0 0 4px var(--icen-token-accent);
18
+ --icen-ring-soft: 0 0 0 3px var(--icen-token-accent-subtle);
19
+ --icen-control-focus-border: var(--icen-token-accent);
20
+ --icen-control-focus-shadow: var(--icen-token-shadow-inset), var(--icen-ring-soft);
21
+ --icen-disabled-opacity: .48;
22
+ }
23
+ /* Selection is a contained surface, never a check glyph. ARIA remains the source
24
+ * of truth for keyboard/assistive technology; focus has its own outer outline. */
25
+ :root :is(.icen-theme-switcher-option[aria-pressed="true"], .icen-select-option.is-selected, .icen-cascader-item.is-selected, .icen-cascader-item.is-active, .icen-tree-select-row.is-selected, .icen-tree-select-row.is-checked, .icen-menu-item[aria-checked="true"], .icen-menu-item--checked:not([aria-checked="false"]), .icen-ai-composer-popup-option[aria-selected="true"], .icen-kb-checkpoint-menu-item.is-checked) {
26
+ background: var(--icen-token-accent-subtle);
27
+ color: var(--icen-token-text);
28
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--icen-token-accent) 65%, var(--icen-token-line-soft));
29
+ }
30
+ :root :is(.icen-select-option.is-focused, .icen-cascader-item.is-focused, .icen-tree-select-row.is-focused) { outline: 1px solid var(--icen-token-outline); outline-offset: -3px; }
31
+
32
+ /* Native selection controls keep native values, keyboard behavior and mixed state,
33
+ * but their selected geometry is an inset core rather than an OS check glyph. */
34
+ :root :is(input.icen-dt-check, input.icen-choice-box, .icen-form input[type="checkbox"], input[data-icen-kb-segment-clean]) {
35
+ appearance: none;
36
+ box-sizing: border-box;
37
+ inline-size: 16px;
38
+ block-size: 16px;
39
+ flex: 0 0 auto;
40
+ border: 1.5px solid var(--icen-token-outline);
41
+ border-radius: var(--icen-radius-xs);
42
+ padding: 3px;
43
+ background: var(--icen-token-surface);
44
+ background-clip: content-box;
45
+ cursor: pointer;
46
+ }
47
+ :root :is(input.icen-dt-check, input.icen-choice-box, .icen-form input[type="checkbox"], input[data-icen-kb-segment-clean]):checked {
48
+ border-color: var(--icen-token-accent);
49
+ background-color: var(--icen-token-accent);
50
+ }
51
+ :root :is(input.icen-dt-check, input.icen-choice-box, .icen-form input[type="checkbox"], input[data-icen-kb-segment-clean]):indeterminate {
52
+ border-color: var(--icen-token-accent);
53
+ background-color: transparent;
54
+ background-image: linear-gradient(var(--icen-token-accent),var(--icen-token-accent));
55
+ background-size: 8px 2px;
56
+ background-position: center;
57
+ background-repeat: no-repeat;
58
+ }
59
+ :root :is(input.icen-dt-check, input.icen-choice-box, .icen-form input[type="checkbox"], input[data-icen-kb-segment-clean]):focus-visible { outline: 2px solid var(--icen-token-accent); outline-offset: 2px; }
60
+ @media (forced-colors: active) {
61
+ :root :is(.icen-theme-switcher-option[aria-pressed="true"], .icen-select-option.is-selected, .icen-cascader-item.is-selected, .icen-tree-select-row.is-selected, .icen-tree-select-row.is-checked, .icen-menu-item[aria-checked="true"], .icen-ai-composer-popup-option[aria-selected="true"], .icen-kb-checkpoint-menu-item.is-checked) { outline: 3px double Highlight; outline-offset: -3px; }
62
+ :root :is(input.icen-dt-check, input.icen-choice-box, .icen-form input[type="checkbox"], input[data-icen-kb-segment-clean]) { forced-color-adjust: none; border-color: CanvasText; background-color: Canvas; }
63
+ :root :is(input.icen-dt-check, input.icen-choice-box, .icen-form input[type="checkbox"], input[data-icen-kb-segment-clean]):checked { background-color: Highlight; }
64
+ :root :is(input.icen-dt-check, input.icen-choice-box, .icen-form input[type="checkbox"], input[data-icen-kb-segment-clean]):indeterminate { background-image: linear-gradient(Highlight,Highlight); }
65
+ }
66
+
67
+ /* Component display rules must not override native hidden semantics. Preserve
68
+ * until-found so browser find-in-page can reveal intentionally searchable content. */
69
+ :where([class^="icen-"], [class*=" icen-"])[hidden]:not([hidden="until-found"]) {
70
+ display: none !important; /* guard:allow-important native hidden must win over component display:flex/grid */
71
+ }
72
+ :root[data-icen-design-changing] *,
73
+ :root[data-icen-design-changing] *::before,
74
+ :root[data-icen-design-changing] *::after {
75
+ transition: none !important; /* guard:allow-important palette changes must not pass through unreadable intermediate colors */
76
+ }
77
+ :root body {
78
+ font-family: var(--icen-font-body);
79
+ font-variant-numeric: normal;
80
+ font-size: var(--icen-density-font-size-md);
81
+ line-height: var(--icen-line-height-body);
82
+ letter-spacing: var(--icen-letter-spacing-body);
83
+ background: var(--icen-token-canvas);
84
+ color: var(--icen-token-text);
85
+ }
86
+ :root :is(h1,h2,h3,h4,h5,h6) {
87
+ font-family: var(--icen-font-heading);
88
+ letter-spacing: var(--icen-letter-spacing-heading);
89
+ line-height: var(--icen-line-height-heading);
90
+ text-wrap: balance;
91
+ }
92
+ :root :is(button,input,textarea,select) { font-family: var(--icen-font-body); }
93
+ :root [data-icen-material] {
94
+ background: var(--icen-token-surface);
95
+ color: var(--icen-token-text);
96
+ border: 1px solid var(--icen-token-outline-soft);
97
+ border-radius: var(--icen-radius-lg);
98
+ }
99
+ :root :is([data-icen-material="content"],.icen-card) {
100
+ background: var(--icen-token-surface);
101
+ box-shadow: none;
102
+ }
103
+ /* Opaque fallback is the default. Enable transparency only with browser support. */
104
+ :root :is([data-icen-material="chrome"],[data-icen-material="floating"],.icen-menu,.icen-popover,.icen-select-panel,.icen-date-picker-panel,.icen-autocomplete-panel,.icen-cascader-panel,.icen-tree-select-panel,.icen-mentions-panel,.icen-ai-composer-popup,.icen-command-palette,.icen-card--glass,.icen-nav) {
105
+ background: var(--icen-token-surface);
106
+ border-color: var(--icen-token-material-edge);
107
+ box-shadow: var(--icen-token-material-light), var(--icen-token-shadow-elevated);
108
+ backdrop-filter: none;
109
+ -webkit-backdrop-filter: none;
110
+ }
111
+ :root [data-icen-material="chrome"] { box-shadow: var(--icen-token-material-light); }
112
+ :root .icen-nav[data-icen-scroll-reactive]:not(.is-scrolled) {
113
+ background: var(--icen-token-surface);
114
+ backdrop-filter: none;
115
+ -webkit-backdrop-filter: none;
116
+ }
117
+ @supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
118
+ :root :is([data-icen-material="chrome"],[data-icen-material="floating"],.icen-menu,.icen-popover,.icen-select-panel,.icen-date-picker-panel,.icen-autocomplete-panel,.icen-cascader-panel,.icen-tree-select-panel,.icen-mentions-panel,.icen-ai-composer-popup,.icen-command-palette,.icen-card--glass,.icen-nav) {
119
+ background: var(--icen-token-surface-glass);
120
+ backdrop-filter: blur(var(--icen-design-glass-blur)) saturate(1.15);
121
+ -webkit-backdrop-filter: blur(var(--icen-design-glass-blur)) saturate(1.15);
122
+ }
123
+ }
124
+ :root .icen-nav { box-shadow: var(--icen-token-material-light); }
125
+ :root .icen-btn {
126
+ --btn-border-hover: var(--icen-token-line);
127
+ gap: var(--icen-density-space-sm);
128
+ border-radius: var(--icen-radius-md);
129
+ letter-spacing: 0;
130
+ }
131
+ :root .icen-btn-primary { --btn-border-hover: var(--icen-token-accent-strong); }
132
+ :root :is(.icen-btn-ghost,.icen-btn-link) { --btn-border-hover: transparent; }
133
+ :root .icen-btn-link { --btn-fg: var(--icen-token-accent-text); }
134
+ :root .icen-btn-primary:hover:not(:focus-visible) { box-shadow: none; }
135
+ :root .icen-btn:active:not(:disabled):not([aria-disabled="true"]):not([data-icen-disabled]):not(.is-loading) { transform: var(--icen-press-soft); }
136
+ :root .icen-btn-danger:hover { color: var(--icen-token-error); background: var(--icen-token-error-muted); }
137
+ :root .icen-segmented { padding: var(--icen-density-space-xs); gap: var(--icen-density-space-xs); }
138
+ :root .icen-segmented-item { border-radius: max(0px, calc(var(--icen-radius-md) - var(--icen-density-space-xs) - 1px)); }
139
+ :root :is(.icen-segmented-item.is-active,.icen-segmented-item[aria-checked="true"],.icen-toggle-group-btn.is-active) {
140
+ background: var(--icen-token-surface);
141
+ color: var(--icen-token-text);
142
+ box-shadow: var(--icen-token-shadow-card);
143
+ }
144
+ :root :is(.icen-menu,.icen-popover,.icen-select-panel) { border-radius: var(--icen-radius-lg); }
145
+ :root .icen-modal {
146
+ border-radius: var(--icen-radius-xl);
147
+ box-shadow: var(--icen-token-material-light), var(--icen-token-shadow-overlay);
148
+ }
149
+ :root :is(.icen-modal-backdrop,.icen-command-palette-backdrop) {
150
+ background: var(--icen-token-scrim);
151
+ backdrop-filter: none;
152
+ -webkit-backdrop-filter: none;
153
+ }
154
+ :root .icen-card--elevated { box-shadow: var(--icen-token-shadow-card); }
155
+ :root .icen-card--interactive:hover { transform: none; border-color: var(--icen-token-line); }
156
+ :root .icen-card--interactive:focus-within { box-shadow: var(--icen-ring); }
157
+ :root .icen-switch-thumb { background: var(--icen-token-text-muted); }
158
+ :root .icen-switch[aria-checked="true"] .icen-switch-thumb { background: var(--icen-token-on-accent); }
159
+ :root .icen-input-wrap--sm { padding-inline: var(--icen-density-space-sm); }
160
+ /* 现代: small controls have a legible edge and a quiet, tactile surface. Keep
161
+ * these optical refinements local to the default primitive; other primitives
162
+ * supply their own surface physics without fighting a global component rule. */
163
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) .icen-btn:not(.icen-btn-ghost):not(.icen-btn-link) {
164
+ box-shadow: inset 0 1px 0 color-mix(in srgb, var(--icen-token-top-highlight) 45%, transparent), 0 1px 2px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .35), transparent);
165
+ }
166
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) .icen-btn:focus-visible {
167
+ box-shadow: var(--icen-ring);
168
+ }
169
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) .icen-btn:active:not(:disabled):not([aria-disabled="true"]):not([data-icen-disabled]):not(.is-loading) {
170
+ box-shadow: var(--icen-token-shadow-inset);
171
+ }
172
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) .icen-btn:active:focus-visible {
173
+ box-shadow: var(--icen-token-shadow-inset), var(--icen-ring);
174
+ }
175
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) :is(.icen-input-wrap,.icen-textarea-wrap) {
176
+ padding-inline: var(--icen-density-space-md);
177
+ }
178
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) :is(.icen-input,.icen-textarea)::placeholder {
179
+ color: var(--icen-token-text-faint);
180
+ opacity: 1;
181
+ }
182
+ /* Data readability is explicit, never applied to every numeral in prose. */
183
+ :root :is(.icen-numeric,.icen-table,.icen-datatable,.icen-stat-num) { font-variant-numeric: lining-nums tabular-nums; }
184
+ /* Any translucent material has an opaque alternative, including native controls. */
185
+ :root[data-icen-transparency="reduced"] :is([data-icen-material],.icen-menu,.icen-popover,.icen-select-panel,.icen-date-picker-panel,.icen-autocomplete-panel,.icen-cascader-panel,.icen-tree-select-panel,.icen-mentions-panel,.icen-ai-composer-popup,.icen-command-palette,.icen-card--glass,.icen-nav) {
186
+ background: var(--icen-token-surface);
187
+ backdrop-filter: none;
188
+ -webkit-backdrop-filter: none;
189
+ }
190
+ @media (prefers-reduced-transparency: reduce) {
191
+ :root :is([data-icen-material],.icen-menu,.icen-popover,.icen-select-panel,.icen-date-picker-panel,.icen-autocomplete-panel,.icen-cascader-panel,.icen-tree-select-panel,.icen-mentions-panel,.icen-ai-composer-popup,.icen-command-palette,.icen-card--glass,.icen-nav) {
192
+ background: var(--icen-token-surface);
193
+ backdrop-filter: none;
194
+ -webkit-backdrop-filter: none;
195
+ }
196
+ }
197
+ @media (prefers-reduced-motion: reduce) {
198
+ :root *, :root *::before, :root *::after {
199
+ animation-duration: .01ms !important; /* guard:allow-important accessibility override must beat component animation */
200
+ transition-duration: .01ms !important; /* guard:allow-important accessibility override must beat component transition */
201
+ scroll-behavior: auto !important; /* guard:allow-important reduced motion includes scrolling */
202
+ }
203
+ }
204
+ @media (pointer: coarse) {
205
+ :root :is(.icen-btn,.icen-segmented-item,.icen-menu-item,.icen-modal-close) { min-block-size: var(--icen-density-input-height-md); }
206
+ /* Preserve the switch's visual geometry, expand its pointer target instead. */
207
+ :root .icen-switch::before {
208
+ content: '';
209
+ position: absolute;
210
+ inset-block: calc((100% - 44px) / 2);
211
+ inset-inline: 0;
212
+ }
213
+ }
214
+ @media (forced-colors: active) {
215
+ :root :focus-visible { outline: 2px solid Highlight; outline-offset: 2px; }
216
+ :root :is([data-icen-material],.icen-menu,.icen-popover,.icen-card--glass) {
217
+ background: Canvas;
218
+ color: CanvasText;
219
+ border-color: CanvasText;
220
+ box-shadow: none;
221
+ backdrop-filter: none;
222
+ -webkit-backdrop-filter: none;
223
+ }
224
+ :root .icen-segmented-item[aria-checked="true"] { outline: 2px solid Highlight; }
225
+ }
226
+
227
+ /* Pixel adapters: inherit palette, replace surface physics. */
228
+ :root[data-icen-style="pixel"] :is([data-icen-material],.icen-menu,.icen-popover,.icen-select-panel,.icen-date-picker-panel,.icen-autocomplete-panel,.icen-cascader-panel,.icen-tree-select-panel,.icen-mentions-panel,.icen-ai-composer-popup,.icen-command-palette,.icen-card--glass,.icen-nav) {
229
+ background: var(--icen-token-surface);
230
+ border-color: var(--icen-token-line-strong);
231
+ backdrop-filter: none;
232
+ -webkit-backdrop-filter: none;
233
+ }
234
+ :root[data-icen-style="pixel"] :is(.icen-btn,.icen-input-wrap,.icen-textarea-wrap,.icen-select-trigger,.icen-segmented,[data-icen-material],.icen-card,.icen-modal) {
235
+ border-width: 2px;
236
+ border-radius: var(--icen-radius-md);
237
+ }
238
+ :root[data-icen-style="pixel"] :is(.icen-btn,.icen-input-wrap,.icen-select-trigger) { box-shadow: var(--icen-token-shadow-card); }
239
+ :root[data-icen-style="pixel"] :is(.icen-btn-ghost,.icen-btn-link) { box-shadow: none; }
240
+ :root[data-icen-style="pixel"] .icen-btn:active:not(:disabled):not([aria-disabled="true"]) { box-shadow: none; }
241
+ :root[data-icen-style="pixel"] .icen-btn:focus-visible { box-shadow: var(--icen-ring); }
242
+ :root[data-icen-style="pixel"] .icen-input-wrap:focus-within { box-shadow: var(--icen-control-focus-shadow); }
243
+ :root[data-icen-style="pixel"] :is(h1,h2,h3,h4,h5,h6) { font-weight: 400; letter-spacing: 0; }
244
+ :root[data-icen-style="pixel"] h1 { font-size: 48px; }
245
+ :root[data-icen-style="pixel"] :is(h2,h3) { font-size: 24px; }
246
+ :root[data-icen-style="pixel"] :is(button,input,select,textarea) { font-weight: 400; }
247
+ :root[data-icen-style="pixel"] .icen-segmented-item { border-radius: var(--icen-radius-md); }
248
+ :root[data-icen-style="pixel"] :is(.icen-switch,.icen-switch-thumb) { border-radius: var(--icen-radius-md); }
249
+ :root[data-icen-style="pixel"] :is(.icen-avatar,.icen-stat-icon) { border-radius: var(--icen-radius-md); }
250
+ /* Halftone is reserved for selected/structural surfaces, never under long text. */
251
+ :root[data-icen-style="pixel"] .icen-segmented {
252
+ background-color: var(--icen-token-bg-soft);
253
+ background-image: repeating-linear-gradient(135deg,transparent 0 2px,var(--icen-token-line-soft) 2px 3px,transparent 3px 5px);
254
+ }
255
+ :root[data-icen-style="pixel"] :is(.icen-toast,.icen-notification,.icen-tooltip,.icen-date-picker-panel,.icen-menu,.icen-popover) {
256
+ border: 2px solid var(--icen-token-line-strong);
257
+ box-shadow: var(--icen-token-shadow-elevated);
258
+ }
259
+ :root[data-icen-style="pixel"] :is(.icen-menu-item,.icen-select-option) { border-radius: var(--icen-radius-md); }
260
+ :root[data-icen-style="pixel"] :is(.icen-menu-item,.icen-select-option).is-focused {
261
+ outline: 2px solid var(--icen-token-accent);
262
+ outline-offset: -2px;
263
+ }
264
+ :root[data-icen-style="pixel"] :is(.icen-progress-track,.icen-slider-track) {
265
+ border: 1px solid var(--icen-token-line-strong);
266
+ border-radius: var(--icen-radius-md);
267
+ background-image: repeating-linear-gradient(90deg,transparent 0 3px,var(--icen-token-line-soft) 3px 4px);
268
+ }
269
+ /* Standalone outline, including when shadows disappear in forced colors. */
270
+ :root[data-icen-style="pixel"] :focus-visible { outline: 2px solid var(--icen-token-accent); outline-offset: 3px; }
271
+ @media (max-width: 640px) {
272
+ :root[data-icen-style="pixel"] h1 { font-size: 36px; }
273
+ }
274
+
275
+ }