@icen.ai/ui 0.9.0 → 0.11.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 (431) hide show
  1. package/AGENTS.md +82 -254
  2. package/LICENSE +21 -0
  3. package/README.md +60 -96
  4. package/dist/base.css +258 -188
  5. package/dist/behaviors/accordion.mjs +8 -8
  6. package/dist/behaviors/ai-branch.d.mts +1 -1
  7. package/dist/behaviors/ai-branch.mjs +1011 -94
  8. package/dist/behaviors/ai-chat.d.mts +9 -9
  9. package/dist/behaviors/ai-chat.mjs +1122 -169
  10. package/dist/behaviors/ai-composer.d.mts +47 -15
  11. package/dist/behaviors/ai-composer.mjs +2018 -534
  12. package/dist/behaviors/ai-core.d.mts +1 -1
  13. package/dist/behaviors/ai-core.mjs +1017 -107
  14. package/dist/behaviors/ai-diff.mjs +1020 -127
  15. package/dist/behaviors/ai-feedback.d.mts +1 -1
  16. package/dist/behaviors/ai-feedback.mjs +1036 -126
  17. package/dist/behaviors/ai-panel.d.mts +10 -10
  18. package/dist/behaviors/ai-panel.mjs +1285 -266
  19. package/dist/behaviors/ai-provider.d.mts +1 -1
  20. package/dist/behaviors/ai-provider.mjs +1004 -101
  21. package/dist/behaviors/ai-threads.d.mts +1 -1
  22. package/dist/behaviors/ai-threads.mjs +1069 -154
  23. package/dist/behaviors/ai-tool.d.mts +3 -3
  24. package/dist/behaviors/ai-tool.mjs +2087 -413
  25. package/dist/behaviors/ai-tools.d.mts +89 -16
  26. package/dist/behaviors/ai-tools.mjs +5365 -380
  27. package/dist/behaviors/autocomplete.d.mts +53 -0
  28. package/dist/behaviors/autocomplete.mjs +1601 -0
  29. package/dist/behaviors/back-top.d.mts +1 -1
  30. package/dist/behaviors/back-top.mjs +952 -14
  31. package/dist/behaviors/carousel.d.mts +1 -1
  32. package/dist/behaviors/carousel.mjs +914 -12
  33. package/dist/behaviors/cascader.d.mts +48 -0
  34. package/dist/behaviors/cascader.mjs +1867 -0
  35. package/dist/behaviors/charts.d.mts +72 -8
  36. package/dist/behaviors/charts.mjs +1953 -272
  37. package/dist/behaviors/code-block.d.mts +36 -0
  38. package/dist/behaviors/code-block.mjs +1619 -0
  39. package/dist/behaviors/command-palette.d.mts +9 -6
  40. package/dist/behaviors/command-palette.mjs +164 -62
  41. package/dist/behaviors/context-menu.d.mts +10 -9
  42. package/dist/behaviors/context-menu.mjs +1113 -44
  43. package/dist/behaviors/controls.d.mts +21 -21
  44. package/dist/behaviors/controls.mjs +1024 -134
  45. package/dist/behaviors/copy.d.mts +21 -2
  46. package/dist/behaviors/copy.mjs +1207 -42
  47. package/dist/behaviors/datatable.d.mts +55 -5
  48. package/dist/behaviors/datatable.mjs +2033 -212
  49. package/dist/behaviors/date-picker.d.mts +0 -1
  50. package/dist/behaviors/date-picker.mjs +1341 -293
  51. package/dist/behaviors/design.d.mts +54 -0
  52. package/dist/behaviors/design.mjs +109 -0
  53. package/dist/behaviors/dropdown.d.mts +5 -6
  54. package/dist/behaviors/dropdown.mjs +262 -110
  55. package/dist/behaviors/events.d.mts +127 -10
  56. package/dist/behaviors/events.mjs +58 -3
  57. package/dist/behaviors/feedback.d.mts +30 -0
  58. package/dist/behaviors/feedback.mjs +296 -0
  59. package/dist/behaviors/focus.d.mts +8 -0
  60. package/dist/behaviors/focus.mjs +24 -0
  61. package/dist/behaviors/form-validate.d.mts +111 -0
  62. package/dist/behaviors/form-validate.mjs +1746 -0
  63. package/dist/behaviors/i18n.d.mts +790 -0
  64. package/dist/behaviors/i18n.mjs +1713 -0
  65. package/dist/behaviors/icons.d.mts +93 -0
  66. package/dist/behaviors/icons.mjs +113 -0
  67. package/dist/behaviors/input.d.mts +9 -1
  68. package/dist/behaviors/input.mjs +1059 -60
  69. package/dist/behaviors/kb-access.d.mts +3 -3
  70. package/dist/behaviors/kb-access.mjs +2135 -239
  71. package/dist/behaviors/kb-acl.d.mts +8 -8
  72. package/dist/behaviors/kb-acl.mjs +1120 -179
  73. package/dist/behaviors/kb-answer.d.mts +2 -2
  74. package/dist/behaviors/kb-answer.mjs +2120 -435
  75. package/dist/behaviors/kb-audit.d.mts +3 -3
  76. package/dist/behaviors/kb-audit.mjs +1077 -154
  77. package/dist/behaviors/kb-canvas.d.mts +3 -3
  78. package/dist/behaviors/kb-canvas.mjs +1101 -177
  79. package/dist/behaviors/kb-chain.d.mts +2 -2
  80. package/dist/behaviors/kb-chain.mjs +1023 -100
  81. package/dist/behaviors/kb-checkpoint.d.mts +3 -3
  82. package/dist/behaviors/kb-checkpoint.mjs +1320 -169
  83. package/dist/behaviors/kb-chunks.d.mts +2 -2
  84. package/dist/behaviors/kb-chunks.mjs +1153 -213
  85. package/dist/behaviors/kb-citation.d.mts +3 -3
  86. package/dist/behaviors/kb-citation.mjs +1221 -185
  87. package/dist/behaviors/kb-clarify.d.mts +2 -2
  88. package/dist/behaviors/kb-clarify.mjs +1059 -130
  89. package/dist/behaviors/kb-conflict.d.mts +2 -2
  90. package/dist/behaviors/kb-conflict.mjs +1042 -119
  91. package/dist/behaviors/kb-connector.d.mts +2 -2
  92. package/dist/behaviors/kb-connector.mjs +1105 -176
  93. package/dist/behaviors/kb-core.d.mts +7 -2
  94. package/dist/behaviors/kb-core.mjs +1078 -162
  95. package/dist/behaviors/kb-eval.d.mts +2 -2
  96. package/dist/behaviors/kb-eval.mjs +1977 -144
  97. package/dist/behaviors/kb-explain.d.mts +3 -3
  98. package/dist/behaviors/kb-explain.mjs +1037 -104
  99. package/dist/behaviors/kb-filter.d.mts +2 -2
  100. package/dist/behaviors/kb-filter.mjs +2014 -178
  101. package/dist/behaviors/kb-gap.d.mts +3 -3
  102. package/dist/behaviors/kb-gap.mjs +1044 -121
  103. package/dist/behaviors/kb-hittest.d.mts +3 -3
  104. package/dist/behaviors/kb-hittest.mjs +1095 -151
  105. package/dist/behaviors/kb-metadata.mjs +1058 -130
  106. package/dist/behaviors/kb-passage.d.mts +4 -4
  107. package/dist/behaviors/kb-passage.mjs +1102 -161
  108. package/dist/behaviors/kb-pipeline.d.mts +4 -4
  109. package/dist/behaviors/kb-pipeline.mjs +1083 -162
  110. package/dist/behaviors/kb-qa.mjs +1089 -160
  111. package/dist/behaviors/kb-rerank.d.mts +2 -2
  112. package/dist/behaviors/kb-rerank.mjs +1048 -114
  113. package/dist/behaviors/kb-retrieval.d.mts +2 -2
  114. package/dist/behaviors/kb-retrieval.mjs +2079 -226
  115. package/dist/behaviors/kb-review.d.mts +2 -2
  116. package/dist/behaviors/kb-review.mjs +1996 -159
  117. package/dist/behaviors/kb-sandbox.d.mts +3 -3
  118. package/dist/behaviors/kb-sandbox.mjs +1033 -105
  119. package/dist/behaviors/kb-segment.d.mts +2 -2
  120. package/dist/behaviors/kb-segment.mjs +1112 -179
  121. package/dist/behaviors/kb-select.d.mts +24 -0
  122. package/dist/behaviors/kb-select.mjs +1995 -0
  123. package/dist/behaviors/kb-sources.d.mts +3 -3
  124. package/dist/behaviors/kb-sources.mjs +1085 -170
  125. package/dist/behaviors/kb-sql.d.mts +3 -3
  126. package/dist/behaviors/kb-sql.mjs +1144 -226
  127. package/dist/behaviors/kb-trace.d.mts +3 -3
  128. package/dist/behaviors/kb-trace.mjs +1051 -131
  129. package/dist/behaviors/kb-visibility.d.mts +2 -2
  130. package/dist/behaviors/kb-visibility.mjs +1087 -158
  131. package/dist/behaviors/kb-who-can.d.mts +2 -2
  132. package/dist/behaviors/kb-who-can.mjs +1980 -137
  133. package/dist/behaviors/mentions.d.mts +93 -0
  134. package/dist/behaviors/mentions.mjs +2153 -0
  135. package/dist/behaviors/modal.d.mts +4 -3
  136. package/dist/behaviors/modal.mjs +1056 -33
  137. package/dist/behaviors/nav.d.mts +1 -1
  138. package/dist/behaviors/nav.mjs +6 -6
  139. package/dist/behaviors/notification.d.mts +16 -8
  140. package/dist/behaviors/notification.mjs +1629 -268
  141. package/dist/behaviors/panel.d.mts +4 -0
  142. package/dist/behaviors/panel.mjs +995 -0
  143. package/dist/behaviors/popover.d.mts +28 -5
  144. package/dist/behaviors/popover.mjs +225 -24
  145. package/dist/behaviors/scroll-area.d.mts +17 -0
  146. package/dist/behaviors/scroll-area.mjs +59 -0
  147. package/dist/behaviors/select.d.mts +5 -2
  148. package/dist/behaviors/select.mjs +1416 -117
  149. package/dist/behaviors/sidebar.d.mts +1 -1
  150. package/dist/behaviors/sidebar.mjs +13 -13
  151. package/dist/behaviors/slider.d.mts +1 -1
  152. package/dist/behaviors/slider.mjs +12 -12
  153. package/dist/behaviors/split-pane.d.mts +1 -1
  154. package/dist/behaviors/split-pane.mjs +9 -7
  155. package/dist/behaviors/suggestions.d.mts +27 -0
  156. package/dist/behaviors/suggestions.mjs +1090 -0
  157. package/dist/behaviors/svg-parse.d.mts +14 -0
  158. package/dist/behaviors/svg-parse.mjs +37 -0
  159. package/dist/behaviors/tabs.d.mts +2 -2
  160. package/dist/behaviors/tabs.mjs +35 -25
  161. package/dist/behaviors/tag-input.d.mts +23 -5
  162. package/dist/behaviors/tag-input.mjs +1360 -104
  163. package/dist/behaviors/theme-switcher.d.mts +24 -0
  164. package/dist/behaviors/theme-switcher.mjs +1996 -0
  165. package/dist/behaviors/theme.d.mts +15 -8
  166. package/dist/behaviors/theme.mjs +406 -30
  167. package/dist/behaviors/toast.d.mts +24 -25
  168. package/dist/behaviors/toast.mjs +1267 -88
  169. package/dist/behaviors/tooltip.d.mts +4 -0
  170. package/dist/behaviors/tooltip.mjs +378 -0
  171. package/dist/behaviors/tree-select.d.mts +69 -0
  172. package/dist/behaviors/tree-select.mjs +1921 -0
  173. package/dist/behaviors/tree.d.mts +1 -1
  174. package/dist/behaviors/tree.mjs +18 -18
  175. package/dist/behaviors/upload.d.mts +3 -2
  176. package/dist/behaviors/upload.mjs +1077 -66
  177. package/dist/behaviors/url-safety.d.mts +8 -0
  178. package/dist/behaviors/url-safety.mjs +11 -0
  179. package/dist/cli.mjs +5 -6
  180. package/dist/components/accordion.d.mts +2 -0
  181. package/dist/components/ai-branch.d.mts +2 -0
  182. package/dist/components/ai-chat.css +682 -582
  183. package/dist/components/ai-chat.d.mts +2 -0
  184. package/dist/components/ai-composer.d.mts +2 -0
  185. package/dist/components/ai-context.d.mts +2 -0
  186. package/dist/components/ai-context.mjs +1 -0
  187. package/dist/components/ai-diff.css +153 -132
  188. package/dist/components/ai-diff.d.mts +2 -0
  189. package/dist/components/ai-feedback.d.mts +2 -0
  190. package/dist/components/ai-files.d.mts +2 -0
  191. package/dist/components/ai-message.d.mts +2 -0
  192. package/dist/components/ai-panel.css +353 -343
  193. package/dist/components/ai-reasoning.d.mts +2 -0
  194. package/dist/components/ai-subagent.d.mts +2 -0
  195. package/dist/components/ai-subagent.mjs +1 -0
  196. package/dist/components/ai-threads.d.mts +2 -0
  197. package/dist/components/ai-todo.d.mts +2 -0
  198. package/dist/components/ai-todo.mjs +1 -0
  199. package/dist/components/ai-tool-call.d.mts +2 -0
  200. package/dist/components/ai-tool-call.mjs +1 -0
  201. package/dist/components/ai-tool.css +397 -242
  202. package/dist/components/ai-usage.d.mts +2 -0
  203. package/dist/components/alert.d.mts +2 -0
  204. package/dist/components/autocomplete.css +61 -0
  205. package/dist/components/autocomplete.d.mts +2 -0
  206. package/dist/components/autocomplete.mjs +3 -0
  207. package/dist/components/avatar.d.mts +2 -0
  208. package/dist/components/back-top.css +74 -40
  209. package/dist/components/back-top.d.mts +2 -0
  210. package/dist/components/badge.css +44 -41
  211. package/dist/components/badge.d.mts +2 -0
  212. package/dist/components/breadcrumb.css +85 -46
  213. package/dist/components/breadcrumb.d.mts +2 -0
  214. package/dist/components/btn.css +105 -94
  215. package/dist/components/btn.d.mts +2 -0
  216. package/dist/components/card.css +124 -113
  217. package/dist/components/card.d.mts +2 -0
  218. package/dist/components/carousel.d.mts +2 -0
  219. package/dist/components/cascader.css +332 -0
  220. package/dist/components/cascader.d.mts +2 -0
  221. package/dist/components/cascader.mjs +3 -0
  222. package/dist/components/chart-area.css +54 -2
  223. package/dist/components/chart-area.d.mts +2 -0
  224. package/dist/components/chart-bar.css +147 -38
  225. package/dist/components/chart-bar.d.mts +2 -0
  226. package/dist/components/chart-calendar.d.mts +2 -0
  227. package/dist/components/chart-gauge.css +36 -13
  228. package/dist/components/chart-gauge.d.mts +2 -0
  229. package/dist/components/chart-graph.css +35 -20
  230. package/dist/components/chart-graph.d.mts +2 -0
  231. package/dist/components/chart-heatmap.css +67 -39
  232. package/dist/components/chart-heatmap.d.mts +2 -0
  233. package/dist/components/chart-line.css +62 -3
  234. package/dist/components/chart-line.d.mts +2 -0
  235. package/dist/components/chart-map.d.mts +2 -0
  236. package/dist/components/chart-pie.css +38 -6
  237. package/dist/components/chart-pie.d.mts +2 -0
  238. package/dist/components/chart-radar.css +57 -5
  239. package/dist/components/chart-radar.d.mts +2 -0
  240. package/dist/components/chart-scatter.css +47 -7
  241. package/dist/components/chart-scatter.d.mts +2 -0
  242. package/dist/components/chart-sparkline.css +25 -2
  243. package/dist/components/chart-sparkline.d.mts +2 -0
  244. package/dist/components/chart-stack.css +27 -13
  245. package/dist/components/chart-stack.d.mts +2 -0
  246. package/dist/components/charts.css +220 -84
  247. package/dist/components/charts.d.mts +2 -0
  248. package/dist/components/code-block.css +420 -0
  249. package/dist/components/code-block.d.mts +2 -0
  250. package/dist/components/code-block.mjs +4 -0
  251. package/dist/components/command-palette.css +150 -122
  252. package/dist/components/command-palette.d.mts +2 -0
  253. package/dist/components/content.css +274 -263
  254. package/dist/components/context-menu.d.mts +2 -0
  255. package/dist/components/copy.css +73 -45
  256. package/dist/components/copy.d.mts +2 -0
  257. package/dist/components/datatable.css +457 -202
  258. package/dist/components/datatable.d.mts +2 -0
  259. package/dist/components/date-picker.css +136 -105
  260. package/dist/components/date-picker.d.mts +2 -0
  261. package/dist/components/desc.d.mts +2 -0
  262. package/dist/components/dropdown.d.mts +2 -0
  263. package/dist/components/empty.css +72 -69
  264. package/dist/components/empty.d.mts +2 -0
  265. package/dist/components/feedback.css +211 -191
  266. package/dist/components/form-validate.css +134 -0
  267. package/dist/components/form-validate.d.mts +2 -0
  268. package/dist/components/form-validate.mjs +3 -0
  269. package/dist/components/form.css +157 -131
  270. package/dist/components/form.d.mts +2 -0
  271. package/dist/components/icon.css +113 -0
  272. package/dist/components/icon.d.mts +2 -0
  273. package/dist/components/icon.mjs +3 -0
  274. package/dist/components/input.css +163 -108
  275. package/dist/components/input.d.mts +2 -0
  276. package/dist/components/kb-access.d.mts +2 -0
  277. package/dist/components/kb-acl.d.mts +2 -0
  278. package/dist/components/kb-agent.css +300 -206
  279. package/dist/components/kb-answer.d.mts +2 -0
  280. package/dist/components/kb-audit.d.mts +2 -0
  281. package/dist/components/kb-canvas.d.mts +2 -0
  282. package/dist/components/kb-chain.d.mts +2 -0
  283. package/dist/components/kb-checkpoint.d.mts +2 -0
  284. package/dist/components/kb-chunks.d.mts +2 -0
  285. package/dist/components/kb-citation.d.mts +2 -0
  286. package/dist/components/kb-clarify.d.mts +2 -0
  287. package/dist/components/kb-conflict.d.mts +2 -0
  288. package/dist/components/kb-connector.d.mts +2 -0
  289. package/dist/components/kb-data.css +431 -315
  290. package/dist/components/kb-eval.d.mts +2 -0
  291. package/dist/components/kb-explain.d.mts +2 -0
  292. package/dist/components/kb-filter.d.mts +2 -0
  293. package/dist/components/kb-gap.d.mts +2 -0
  294. package/dist/components/kb-ground.css +333 -229
  295. package/dist/components/kb-hittest.d.mts +2 -0
  296. package/dist/components/kb-ingest.css +613 -434
  297. package/dist/components/kb-metadata.d.mts +2 -0
  298. package/dist/components/kb-ops.css +422 -302
  299. package/dist/components/kb-passage.d.mts +2 -0
  300. package/dist/components/kb-perm.css +374 -314
  301. package/dist/components/kb-pipeline.d.mts +2 -0
  302. package/dist/components/kb-qa.d.mts +2 -0
  303. package/dist/components/kb-rerank.d.mts +2 -0
  304. package/dist/components/kb-retrieval.d.mts +2 -0
  305. package/dist/components/kb-review.d.mts +2 -0
  306. package/dist/components/kb-sandbox.d.mts +2 -0
  307. package/dist/components/kb-search.css +653 -459
  308. package/dist/components/kb-segment.d.mts +2 -0
  309. package/dist/components/kb-sources.d.mts +2 -0
  310. package/dist/components/kb-sql.d.mts +2 -0
  311. package/dist/components/kb-trace.d.mts +2 -0
  312. package/dist/components/kb-visibility.d.mts +2 -0
  313. package/dist/components/kb-who-can.d.mts +2 -0
  314. package/dist/components/kb.css +170 -135
  315. package/dist/components/kb.d.mts +2 -0
  316. package/dist/components/kbd.d.mts +2 -0
  317. package/dist/components/layout.css +86 -83
  318. package/dist/components/layout.d.mts +2 -0
  319. package/dist/components/list.d.mts +2 -0
  320. package/dist/components/material-chinese.css +83 -0
  321. package/dist/components/material-soviet.css +86 -0
  322. package/dist/components/material.css +318 -0
  323. package/dist/components/media-card.d.mts +2 -0
  324. package/dist/components/media.css +225 -176
  325. package/dist/components/mentions.css +190 -0
  326. package/dist/components/mentions.d.mts +2 -0
  327. package/dist/components/mentions.mjs +3 -0
  328. package/dist/components/menu.css +121 -109
  329. package/dist/components/modal.css +116 -118
  330. package/dist/components/modal.d.mts +2 -0
  331. package/dist/components/nav.css +136 -129
  332. package/dist/components/nav.d.mts +2 -0
  333. package/dist/components/notification.css +247 -177
  334. package/dist/components/notification.d.mts +2 -0
  335. package/dist/components/pagination.css +62 -57
  336. package/dist/components/pagination.d.mts +2 -0
  337. package/dist/components/panel.css +70 -68
  338. package/dist/components/panel.d.mts +2 -0
  339. package/dist/components/panel.mjs +1 -0
  340. package/dist/components/pill.css +83 -72
  341. package/dist/components/pill.d.mts +2 -0
  342. package/dist/components/popover.css +80 -57
  343. package/dist/components/popover.d.mts +2 -0
  344. package/dist/components/progress.d.mts +2 -0
  345. package/dist/components/rating.d.mts +2 -0
  346. package/dist/components/result.d.mts +2 -0
  347. package/dist/components/scroll-area.css +29 -54
  348. package/dist/components/scroll-area.d.mts +2 -0
  349. package/dist/components/scroll-area.mjs +1 -0
  350. package/dist/components/segmented.css +167 -146
  351. package/dist/components/segmented.d.mts +2 -0
  352. package/dist/components/select.css +250 -191
  353. package/dist/components/select.d.mts +2 -0
  354. package/dist/components/sidebar.css +157 -143
  355. package/dist/components/sidebar.d.mts +2 -0
  356. package/dist/components/skeleton.d.mts +2 -0
  357. package/dist/components/slider.css +135 -128
  358. package/dist/components/slider.d.mts +2 -0
  359. package/dist/components/spinner.d.mts +2 -0
  360. package/dist/components/split-pane.css +120 -108
  361. package/dist/components/split-pane.d.mts +2 -0
  362. package/dist/components/stat.css +116 -109
  363. package/dist/components/stat.d.mts +2 -0
  364. package/dist/components/steps.css +114 -108
  365. package/dist/components/steps.d.mts +2 -0
  366. package/dist/components/switch.css +192 -149
  367. package/dist/components/switch.d.mts +2 -0
  368. package/dist/components/table.css +158 -112
  369. package/dist/components/table.d.mts +2 -0
  370. package/dist/components/tabs.css +143 -116
  371. package/dist/components/tabs.d.mts +2 -0
  372. package/dist/components/tag-input.css +52 -133
  373. package/dist/components/tag-input.d.mts +2 -0
  374. package/dist/components/tag.css +90 -72
  375. package/dist/components/tag.d.mts +2 -0
  376. package/dist/components/theme-switcher.css +105 -0
  377. package/dist/components/theme-switcher.d.mts +2 -0
  378. package/dist/components/theme-switcher.mjs +3 -0
  379. package/dist/components/timeline.d.mts +2 -0
  380. package/dist/components/toast.css +115 -97
  381. package/dist/components/toast.d.mts +2 -0
  382. package/dist/components/toolbar.css +47 -43
  383. package/dist/components/toolbar.d.mts +2 -0
  384. package/dist/components/tooltip.css +103 -43
  385. package/dist/components/tooltip.d.mts +2 -0
  386. package/dist/components/tooltip.mjs +1 -0
  387. package/dist/components/tree-select.css +439 -0
  388. package/dist/components/tree-select.d.mts +2 -0
  389. package/dist/components/tree-select.mjs +3 -0
  390. package/dist/components/tree.d.mts +2 -0
  391. package/dist/components/upload.css +138 -97
  392. package/dist/components/upload.d.mts +2 -0
  393. package/dist/fonts/LICENSES/ark-pixel/OFL.txt +96 -0
  394. package/dist/fonts/LICENSES/cubic-11/OFL.txt +108 -0
  395. package/dist/fonts/LICENSES/galmuri/LICENSE.txt +93 -0
  396. package/dist/fonts/OFL.txt +96 -0
  397. package/dist/fonts/README.md +14 -0
  398. package/dist/fonts/fusion-pixel-12px-zh-hans.woff2 +0 -0
  399. package/dist/index.d.mts +85 -70
  400. package/dist/index.mjs +17330 -5773
  401. package/dist/react.d.mts +91 -0
  402. package/dist/react.mjs +8307 -0
  403. package/dist/registry.json +918 -70
  404. package/dist/tokens/chinese.css +44 -0
  405. package/dist/tokens/colors.css +371 -1222
  406. package/dist/tokens/design.css +209 -0
  407. package/dist/tokens/dtcg.json +15926 -0
  408. package/dist/tokens/figma.variables.json +10779 -0
  409. package/dist/tokens/icon-masks.css +78 -0
  410. package/dist/tokens/pixel.css +53 -0
  411. package/dist/tokens/scrollbars.css +40 -0
  412. package/dist/tokens/soviet.css +44 -0
  413. package/dist/tokens/style-profiles.css +36 -547
  414. package/dist/tokens/themes.json +308 -0
  415. package/dist/tokens/tokens-studio.json +11648 -0
  416. package/dist/tokens/typography.css +21 -18
  417. package/dist/tokens.css +1783 -1806
  418. package/dist/ui.css +14796 -10750
  419. package/dist/vue.d.mts +344 -0
  420. package/dist/vue.mjs +7876 -0
  421. package/docs/spec/ai-input-experience.md +75 -0
  422. package/docs/spec/ai-native.md +238 -147
  423. package/docs/spec/design-philosophy.md +189 -0
  424. package/docs/spec/design-primitives.md +196 -0
  425. package/docs/spec/kb-family.md +147 -115
  426. package/docs/spec/scrollbars.md +46 -0
  427. package/package.json +56 -8
  428. package/dist/retro-effects.css +0 -255
  429. package/dist/tokens/retro-effects.css +0 -255
  430. package/docs/research/2026-10-03-ai-kb-components.md +0 -392
  431. package/docs/research/2026-10-03-kb-permissions.md +0 -992
@@ -40,6 +40,12 @@ interface PanelSizing {
40
40
  /** 高度上限 */
41
41
  maxHeight?: number;
42
42
  }
43
+ /** Reveal an item inside one explicit scrollport. Never scrolls document ancestors;
44
+ * use this instead of scrollIntoView for portalled menus and nested listboxes. */
45
+ declare function revealPopoverItem(item: HTMLElement, scrollport: HTMLElement, opts?: {
46
+ focus?: boolean;
47
+ axis?: 'block' | 'inline' | 'both';
48
+ }): void;
43
49
  /** 从元素读取 data-panel-* 尺寸属性(非法/缺失字段跳过,不抛异常)。 */
44
50
  declare function readPanelSizing(el: Element | null | undefined): PanelSizing;
45
51
  /** 合并尺寸:程序面 overrides 优先于属性面(undefined 字段不覆盖)。 */
@@ -52,7 +58,7 @@ declare function sizingToLayout<T extends {
52
58
  }>(sizing: PanelSizing, opts: T): T;
53
59
  /** 把尺寸契约内联到自建面板(dropdown / context-menu / date-picker 等 fixed 面板)。
54
60
  * 传 null 复位全部内联尺寸——单例面板跨实例复用时防「上次的设置串味」。
55
- * 视口守卫:width / maxWidth 一律夹到 视口宽 − 24px(窄屏上过大的 data-panel-width 不溢出,
61
+ * 视口守卫:width / maxWidth 一律夹到 视口宽 − 24px(窄屏上过大的 data-icen-panel-width 不溢出,
56
62
  * 与 computePopoverLayout 的 availableWidth 同一纪律,不再两套标准)。 */
57
63
  declare function applyPanelSizing(panel: HTMLElement, sizing: PanelSizing | null): void;
58
64
  interface PopoverLayout {
@@ -68,15 +74,32 @@ interface OpenPopoverOptions extends PopoverLayoutOptions {
68
74
  sizing?: PanelSizing;
69
75
  /** 关闭(含外点/Esc 触发的关闭)后的回调 */
70
76
  onClose?: () => void;
77
+ /** Optional initial focus inside an interactive panel. */
78
+ initialFocus?: HTMLElement;
79
+ /** Restore the anchor only if the panel still owns focus; default true. */
80
+ restoreFocus?: boolean;
71
81
  }
72
82
  /** 视口智能布局:返回 {side, left, top, width, maxHeight}。
73
83
  * 纵向侧(top/bottom):选侧按上下空间,宽按 min/max 夹取,高按内容预期。
74
84
  * 横向侧(left/right):锚点左右翻转,宽取 min(无内容测量,横向侧取下限),
75
85
  * 高占满可用空间,纵向按 align(start/center/end;stretch 视作 start)贴锚。 */
76
86
  declare function computePopoverLayout(anchor: PopoverRect, viewport: PopoverViewport, opts?: PopoverLayoutOptions): PopoverLayout;
77
- /** 打开浮层:panel 移入 body 并按 anchor 布局;重复调用同一 panel 为先关后开。 */
87
+ /** Shared ownership for action menus: opening one retires the previous renderer
88
+ * without stealing focus. The release handle cannot release a newer owner. */
89
+ declare function claimMenuFocus(close: () => void): () => void;
90
+ /** 打开浮层:panel 移入 body 并按 anchor 布局;重复调用同一 panel 为先关后开;
91
+ * 退场中重开从当前动画位置续接(复用既有门户记录,不重复插占位)。 */
78
92
  declare function openPopover(panel: HTMLElement, options: OpenPopoverOptions): void;
79
- /** 关闭浮层:移除监听并把 panel 还原到打开前的位置与 hidden 状态。 */
80
- declare function closePopover(panel: HTMLElement): void;
93
+ /** 关闭浮层:视觉先退场(可被打断重开),finalize 再还原门户;焦点与 onClose 立即结算。
94
+ * immediate: true 供卸载/销毁路径——跳过退场直接 finalize(拆页时不把面板留在 body)。 */
95
+ declare function closePopover(panel: HTMLElement, opts?: {
96
+ immediate?: boolean;
97
+ }): void;
98
+ /**
99
+ * 声明式浮层委托:<button data-icen-popover-target="panelId"> 点击开关 .icen-popover 面板,
100
+ * 同步触发器 aria-haspopup/aria-expanded/aria-controls;面板内 .icen-popover-close 点击关闭。
101
+ * 同一 root 重复调用返回同一销毁函数;销毁摘除委托并关闭本作用域打开的浮层。SSR 下返回 no-op。
102
+ */
103
+ declare function initPopover(root?: ParentNode): () => void;
81
104
 
82
- export { type OpenPopoverOptions, type PanelSizing, type PopoverAlign, type PopoverLayout, type PopoverLayoutOptions, type PopoverRect, type PopoverSide, type PopoverViewport, applyPanelSizing, closePopover, computePopoverLayout, openPopover, readPanelSizing, resolvePanelSizing, sizingToLayout };
105
+ export { type OpenPopoverOptions, type PanelSizing, type PopoverAlign, type PopoverLayout, type PopoverLayoutOptions, type PopoverRect, type PopoverSide, type PopoverViewport, applyPanelSizing, claimMenuFocus, closePopover, computePopoverLayout, initPopover, openPopover, readPanelSizing, resolvePanelSizing, revealPopoverItem, sizingToLayout };
@@ -1,10 +1,32 @@
1
1
  // src/behaviors/popover.ts
2
+ function revealPopoverItem(item, scrollport, opts = {}) {
3
+ if (typeof document === "undefined") return;
4
+ if (opts.focus) item.focus({ preventScroll: true });
5
+ const rect = item.getBoundingClientRect(), bounds = scrollport.getBoundingClientRect();
6
+ const style = getComputedStyle(scrollport);
7
+ const inset = (value, extent) => {
8
+ const amount = Number.parseFloat(value) || 0;
9
+ return value.endsWith("%") ? amount * extent / 100 : amount;
10
+ };
11
+ if (opts.axis !== "inline") {
12
+ const top = bounds.top + scrollport.clientTop + inset(style.scrollPaddingTop, scrollport.clientHeight);
13
+ const bottom = bounds.top + scrollport.clientTop + scrollport.clientHeight - inset(style.scrollPaddingBottom, scrollport.clientHeight);
14
+ if (rect.top < top) scrollport.scrollTop -= top - rect.top;
15
+ else if (rect.bottom > bottom) scrollport.scrollTop += rect.bottom - bottom;
16
+ }
17
+ if (opts.axis === "inline" || opts.axis === "both") {
18
+ const left = bounds.left + scrollport.clientLeft + inset(style.scrollPaddingLeft, scrollport.clientWidth);
19
+ const right = bounds.left + scrollport.clientLeft + scrollport.clientWidth - inset(style.scrollPaddingRight, scrollport.clientWidth);
20
+ if (rect.left < left) scrollport.scrollLeft -= left - rect.left;
21
+ else if (rect.right > right) scrollport.scrollLeft += rect.right - right;
22
+ }
23
+ }
2
24
  var PANEL_SIZING_ATTRS = {
3
- width: "data-panel-width",
4
- minWidth: "data-panel-min",
5
- maxWidth: "data-panel-max",
6
- minHeight: "data-panel-min-height",
7
- maxHeight: "data-panel-max-height"
25
+ width: "data-icen-panel-width",
26
+ minWidth: "data-icen-panel-min",
27
+ maxWidth: "data-icen-panel-max",
28
+ minHeight: "data-icen-panel-min-height",
29
+ maxHeight: "data-icen-panel-max-height"
8
30
  };
9
31
  function readPanelSizing(el) {
10
32
  const out = {};
@@ -85,10 +107,10 @@ function computePopoverLayout(anchor, viewport, opts = {}) {
85
107
  const preferredSide = opts.side ?? "top";
86
108
  const align = opts.align ?? "start";
87
109
  if (preferredSide === "left" || preferredSide === "right") {
110
+ const minWidth2 = Math.max(1, opts.minWidth ?? DEFAULT_MIN_WIDTH);
88
111
  const availableLeft = Math.max(0, anchor.left - margin - offset);
89
112
  const availableRight = Math.max(0, viewport.width - anchor.right - margin - offset);
90
- const side2 = (preferredSide === "left" ? availableLeft : availableRight) >= DEFAULT_MIN_WIDTH ? preferredSide : preferredSide === "left" ? "right" : "left";
91
- const minWidth2 = Math.max(1, opts.minWidth ?? DEFAULT_MIN_WIDTH);
113
+ const side2 = (preferredSide === "left" ? availableLeft : availableRight) >= minWidth2 ? preferredSide : preferredSide === "left" ? "right" : "left";
92
114
  const maxWidth2 = Math.min(
93
115
  Math.max(opts.maxWidth ?? DEFAULT_MAX_WIDTH, minWidth2),
94
116
  side2 === "left" ? availableLeft : availableRight
@@ -117,7 +139,7 @@ function computePopoverLayout(anchor, viewport, opts = {}) {
117
139
  const minHeight = Math.min(Math.max(80, opts.minHeight ?? DEFAULT_MIN_HEIGHT), availableHeight);
118
140
  const requestedMaxHeight = Math.max(minHeight, opts.maxHeight ?? DEFAULT_MAX_HEIGHT);
119
141
  const fallbackHeight = Math.min(260, requestedMaxHeight);
120
- const contentHeight = Math.max(opts.contentHeightHint ?? 0, fallbackHeight);
142
+ const contentHeight = opts.contentHeightHint != null && opts.contentHeightHint > 0 ? opts.contentHeightHint : fallbackHeight;
121
143
  const desiredHeight = clamp(contentHeight, minHeight, Math.min(requestedMaxHeight, availableHeight));
122
144
  const side = chooseSide(preferredSide, availableTop, availableBottom, desiredHeight);
123
145
  const sideSpace = side === "top" ? availableTop : availableBottom;
@@ -134,6 +156,16 @@ function computePopoverLayout(anchor, viewport, opts = {}) {
134
156
  return { side, left, top, width, maxHeight };
135
157
  }
136
158
  var openPanels = /* @__PURE__ */ new Map();
159
+ var closingPanels = /* @__PURE__ */ new Map();
160
+ var EXIT_FALLBACK_MS = 240;
161
+ var menuCloser = null;
162
+ function claimMenuFocus(close) {
163
+ menuCloser?.();
164
+ menuCloser = close;
165
+ return () => {
166
+ if (menuCloser === close) menuCloser = null;
167
+ };
168
+ }
137
169
  function rectFromElement(el) {
138
170
  const r = el.getBoundingClientRect();
139
171
  return { left: r.left, top: r.top, right: r.right, bottom: r.bottom, width: r.width, height: r.height };
@@ -151,21 +183,54 @@ function relayout(state) {
151
183
  closePopover(state.panel);
152
184
  return;
153
185
  }
154
- const layout = computePopoverLayout(
186
+ let layout = computePopoverLayout(
155
187
  anchor,
156
188
  { width: window.innerWidth, height: window.innerHeight },
157
189
  state.opts
158
190
  );
159
191
  const { panel } = state;
192
+ const scrollPositions = [panel, ...panel.querySelectorAll("*")].filter((node) => node.scrollTop !== 0 || node.scrollLeft !== 0).map((node) => ({ node, top: node.scrollTop, left: node.scrollLeft }));
193
+ panel.style.width = `${layout.width}px`;
194
+ if (state.opts.contentHeightHint == null && (layout.side === "top" || layout.side === "bottom")) {
195
+ panel.style.maxHeight = `${Math.min(state.opts.maxHeight ?? DEFAULT_MAX_HEIGHT, Math.max(80, window.innerHeight - (state.opts.margin ?? 12) * 2))}px`;
196
+ const measured = panel.offsetHeight;
197
+ if (measured > 0) layout = computePopoverLayout(anchor, { width: window.innerWidth, height: window.innerHeight }, { ...state.opts, contentHeightHint: measured });
198
+ }
160
199
  panel.style.left = `${layout.left}px`;
161
- panel.style.top = `${layout.top}px`;
162
200
  panel.style.width = `${layout.width}px`;
163
201
  panel.style.maxHeight = `${layout.maxHeight}px`;
164
- panel.dataset.side = layout.side;
202
+ let top = layout.top;
203
+ const actualHeight = panel.offsetHeight;
204
+ if (actualHeight > 0 && (layout.side === "top" || layout.side === "bottom")) {
205
+ const desired = layout.side === "top" ? anchor.top - (state.opts.offset ?? 8) - actualHeight : anchor.bottom + (state.opts.offset ?? 8);
206
+ const margin = state.opts.margin ?? 12;
207
+ top = clamp(desired, margin, window.innerHeight - margin - actualHeight);
208
+ }
209
+ panel.style.top = `${top}px`;
210
+ for (const pos of scrollPositions) {
211
+ pos.node.scrollTop = pos.top;
212
+ pos.node.scrollLeft = pos.left;
213
+ }
214
+ panel.dataset.icenSide = layout.side;
165
215
  panel.style.visibility = state.prevVisibility;
166
216
  }
167
- function onWindowChange() {
168
- openPanels.forEach(relayout);
217
+ function observeOpenPanel(state) {
218
+ if (typeof ResizeObserver === "undefined") return;
219
+ state.resizeObserver = new ResizeObserver(() => {
220
+ if (state.layoutFrame != null) return;
221
+ state.layoutFrame = window.requestAnimationFrame(() => {
222
+ state.layoutFrame = void 0;
223
+ if (openPanels.get(state.panel) === state) relayout(state);
224
+ });
225
+ });
226
+ state.resizeObserver.observe(state.panel);
227
+ if (state.anchor instanceof Element) state.resizeObserver.observe(state.anchor);
228
+ }
229
+ function onWindowChange(event) {
230
+ openPanels.forEach((state) => {
231
+ if (event?.type === "scroll" && event.target instanceof Node && state.panel.contains(event.target)) return;
232
+ relayout(state);
233
+ });
169
234
  }
170
235
  function onOutsidePointerDown(e) {
171
236
  const target = e.target;
@@ -177,18 +242,40 @@ function onOutsidePointerDown(e) {
177
242
  });
178
243
  }
179
244
  function onKeyDown(e) {
180
- if (e.key !== "Escape") return;
245
+ if (e.key !== "Escape" || e.defaultPrevented || e.isComposing || e.keyCode === 229 || menuCloser) return;
181
246
  const states = Array.from(openPanels.values());
182
247
  const top = states[states.length - 1];
183
248
  if (top) {
184
249
  e.preventDefault();
250
+ e.stopPropagation();
185
251
  closePopover(top.panel);
186
252
  }
187
253
  }
188
254
  function openPopover(panel, options) {
189
255
  if (typeof document === "undefined") return;
256
+ const pending = closingPanels.get(panel);
257
+ if (pending) {
258
+ window.clearTimeout(pending.timer);
259
+ panel.removeEventListener("transitionend", pending.onEnd);
260
+ closingPanels.delete(panel);
261
+ delete panel.dataset.icenState;
262
+ openPanels.set(panel, pending.state);
263
+ panel.hidden = false;
264
+ panel.style.visibility = "hidden";
265
+ relayout(pending.state);
266
+ observeOpenPanel(pending.state);
267
+ if (openPanels.size === 1) {
268
+ window.addEventListener("resize", onWindowChange);
269
+ window.addEventListener("scroll", onWindowChange, true);
270
+ document.addEventListener("pointerdown", onOutsidePointerDown, true);
271
+ window.addEventListener("keydown", onKeyDown, true);
272
+ }
273
+ const ifs = options.initialFocus;
274
+ if (ifs && panel.contains(ifs)) ifs.focus({ preventScroll: true });
275
+ return;
276
+ }
190
277
  if (openPanels.has(panel)) closePopover(panel);
191
- const { anchor, onClose, sizing, ...rest } = options;
278
+ const { anchor, onClose, sizing, initialFocus, restoreFocus, ...rest } = options;
192
279
  const layoutOpts = sizingToLayout(resolvePanelSizing(panel, sizing), rest);
193
280
  const placeholder = document.createComment("popover-anchor");
194
281
  panel.parentNode?.insertBefore(placeholder, panel);
@@ -201,25 +288,25 @@ function openPopover(panel, options) {
201
288
  onClose,
202
289
  placeholder,
203
290
  wasHidden,
204
- prevVisibility
291
+ prevVisibility,
292
+ returnFocus: restoreFocus === false ? null : anchor instanceof HTMLElement ? anchor : document.activeElement instanceof HTMLElement ? document.activeElement : null
205
293
  };
206
294
  openPanels.set(panel, state);
207
295
  document.body.appendChild(panel);
208
296
  panel.hidden = false;
209
297
  panel.style.visibility = "hidden";
210
298
  relayout(state);
299
+ observeOpenPanel(state);
300
+ if (initialFocus && panel.contains(initialFocus)) initialFocus.focus({ preventScroll: true });
211
301
  if (openPanels.size === 1) {
212
302
  window.addEventListener("resize", onWindowChange);
213
303
  window.addEventListener("scroll", onWindowChange, true);
214
304
  document.addEventListener("pointerdown", onOutsidePointerDown, true);
215
- window.addEventListener("keydown", onKeyDown);
305
+ window.addEventListener("keydown", onKeyDown, true);
216
306
  }
217
307
  }
218
- function closePopover(panel) {
219
- if (typeof document === "undefined") return;
220
- const state = openPanels.get(panel);
221
- if (!state) return;
222
- openPanels.delete(panel);
308
+ function finalizeClose(panel, state) {
309
+ delete panel.dataset.icenState;
223
310
  panel.style.visibility = state.prevVisibility;
224
311
  if (typeof state.wasHidden === "string") panel.setAttribute("hidden", state.wasHidden);
225
312
  else panel.hidden = state.wasHidden;
@@ -227,25 +314,139 @@ function closePopover(panel) {
227
314
  panel.style.top = "";
228
315
  panel.style.width = "";
229
316
  panel.style.maxHeight = "";
230
- delete panel.dataset.side;
317
+ delete panel.dataset.icenSide;
231
318
  if (state.placeholder.parentNode) {
232
319
  state.placeholder.parentNode.insertBefore(panel, state.placeholder);
233
320
  state.placeholder.remove();
234
321
  }
322
+ }
323
+ function closePopover(panel, opts) {
324
+ if (typeof document === "undefined") return;
325
+ const state = openPanels.get(panel);
326
+ if (!state) return;
327
+ openPanels.delete(panel);
328
+ state.resizeObserver?.disconnect();
329
+ if (state.layoutFrame != null) {
330
+ window.cancelAnimationFrame(state.layoutFrame);
331
+ state.layoutFrame = void 0;
332
+ }
333
+ const ownsFocus = panel.contains(document.activeElement);
334
+ if (ownsFocus && state.returnFocus?.isConnected) state.returnFocus.focus({ preventScroll: true });
235
335
  if (openPanels.size === 0) {
236
336
  window.removeEventListener("resize", onWindowChange);
237
337
  window.removeEventListener("scroll", onWindowChange, true);
238
338
  document.removeEventListener("pointerdown", onOutsidePointerDown, true);
239
- window.removeEventListener("keydown", onKeyDown);
339
+ window.removeEventListener("keydown", onKeyDown, true);
240
340
  }
241
341
  state.onClose?.();
342
+ const calm = opts?.immediate || typeof window !== "undefined" && typeof window.matchMedia === "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
343
+ if (calm || !panel.isConnected) {
344
+ finalizeClose(panel, state);
345
+ return;
346
+ }
347
+ panel.dataset.icenState = "closing";
348
+ const finalize = () => {
349
+ const pending = closingPanels.get(panel);
350
+ if (!pending || pending.state !== state) return;
351
+ window.clearTimeout(pending.timer);
352
+ panel.removeEventListener("transitionend", pending.onEnd);
353
+ closingPanels.delete(panel);
354
+ finalizeClose(panel, state);
355
+ };
356
+ const onEnd = (event) => {
357
+ if (event.target === panel && event.propertyName === "opacity") finalize();
358
+ };
359
+ panel.addEventListener("transitionend", onEnd);
360
+ closingPanels.set(panel, {
361
+ state,
362
+ timer: window.setTimeout(finalize, EXIT_FALLBACK_MS),
363
+ onEnd
364
+ });
365
+ }
366
+ var popoverScopes = /* @__PURE__ */ new WeakMap();
367
+ var popoverDefaults = /* @__PURE__ */ new WeakMap();
368
+ function rememberPopoverDefaults(panel) {
369
+ let defaults = popoverDefaults.get(panel);
370
+ if (!defaults) {
371
+ const side = panel.dataset.icenSide;
372
+ const align = panel.getAttribute("data-icen-align");
373
+ defaults = {
374
+ side: side === "top" || side === "bottom" || side === "left" || side === "right" ? side : void 0,
375
+ align: align === "start" || align === "center" || align === "end" ? align : void 0
376
+ };
377
+ popoverDefaults.set(panel, defaults);
378
+ }
379
+ return defaults;
380
+ }
381
+ function initPopover(root) {
382
+ if (typeof document === "undefined") return () => {
383
+ };
384
+ const scope = root ?? document;
385
+ const existing = popoverScopes.get(scope);
386
+ if (existing) return existing;
387
+ const opened = /* @__PURE__ */ new Map();
388
+ const dismissHandlers = /* @__PURE__ */ new Map();
389
+ const watchDismiss = (panel) => {
390
+ if (dismissHandlers.has(panel)) return;
391
+ const handler = (event) => {
392
+ const target = event.target;
393
+ if (!(target instanceof Element)) return;
394
+ if (target.closest(".icen-popover-close, [data-icen-popover-dismiss]")) closePopover(panel);
395
+ };
396
+ panel.addEventListener("click", handler);
397
+ dismissHandlers.set(panel, handler);
398
+ };
399
+ const onClick = (event) => {
400
+ const target = event.target;
401
+ if (!(target instanceof Element)) return;
402
+ const trigger = target.closest("[data-icen-popover-target]");
403
+ if (!trigger || !scope.contains(trigger)) return;
404
+ const id = trigger.getAttribute("data-icen-popover-target") ?? "";
405
+ const panel = document.getElementById(id);
406
+ if (!panel || !panel.classList.contains("icen-popover")) return;
407
+ if (openPanels.has(panel)) {
408
+ closePopover(panel);
409
+ return;
410
+ }
411
+ const defaults = rememberPopoverDefaults(panel);
412
+ const sideAttr = trigger.getAttribute("data-icen-side");
413
+ const alignAttr = trigger.getAttribute("data-icen-align");
414
+ if (!trigger.hasAttribute("aria-haspopup")) trigger.setAttribute("aria-haspopup", "dialog");
415
+ trigger.setAttribute("aria-expanded", "true");
416
+ if (panel.id) trigger.setAttribute("aria-controls", panel.id);
417
+ opened.set(panel, trigger);
418
+ watchDismiss(panel);
419
+ openPopover(panel, {
420
+ anchor: trigger,
421
+ side: sideAttr ?? defaults.side ?? "bottom",
422
+ align: alignAttr ?? defaults.align ?? "start",
423
+ initialFocus: panel.querySelector("[data-icen-autofocus], [autofocus]") ?? void 0,
424
+ onClose: () => {
425
+ opened.delete(panel);
426
+ trigger.setAttribute("aria-expanded", "false");
427
+ }
428
+ });
429
+ };
430
+ scope.addEventListener("click", onClick);
431
+ const dispose = () => {
432
+ scope.removeEventListener("click", onClick);
433
+ for (const panel of [...opened.keys()]) closePopover(panel, { immediate: true });
434
+ for (const [panel, handler] of dismissHandlers) panel.removeEventListener("click", handler);
435
+ dismissHandlers.clear();
436
+ popoverScopes.delete(scope);
437
+ };
438
+ popoverScopes.set(scope, dispose);
439
+ return dispose;
242
440
  }
243
441
  export {
244
442
  applyPanelSizing,
443
+ claimMenuFocus,
245
444
  closePopover,
246
445
  computePopoverLayout,
446
+ initPopover,
247
447
  openPopover,
248
448
  readPanelSizing,
249
449
  resolvePanelSizing,
450
+ revealPopoverItem,
250
451
  sizingToLayout
251
452
  };
@@ -0,0 +1,17 @@
1
+ /** Native scrolling with delegated activity tracking; no replacement tracks or wheel interception. */
2
+ interface ScrollAreaOptions {
3
+ /** Delegation scope. Defaults to document; includes future descendants. */
4
+ root?: Document | HTMLElement;
5
+ /** Idle delay in milliseconds. Local data-icen-scrollbar-delay wins; CSS token is the fallback. */
6
+ idleDelay?: number;
7
+ }
8
+ /**
9
+ * Enables idle hiding for every native scroller in a scope, including portalled
10
+ * panels when mounted on document. Idempotent, SSR-safe, returns cleanup.
11
+ * CSS-only use keeps scrollbars visible; enabled scopes default to scroll mode.
12
+ * Local data-icen-scrollbars selects
13
+ * auto (scroll/hover/focus), scroll (scroll/focus), visible, or hidden.
14
+ */
15
+ declare function initScrollArea(options?: ScrollAreaOptions): () => void;
16
+
17
+ export { type ScrollAreaOptions, initScrollArea };
@@ -0,0 +1,59 @@
1
+ // src/behaviors/scroll-area.ts
2
+ var mounted = /* @__PURE__ */ new WeakSet();
3
+ var noop = () => {
4
+ };
5
+ var isDocument = (node) => node?.nodeType === 9;
6
+ function initScrollArea(options = {}) {
7
+ if (typeof document === "undefined" || typeof window === "undefined") return noop;
8
+ const root = options.root ?? document;
9
+ if (mounted.has(root)) return noop;
10
+ mounted.add(root);
11
+ const host = isDocument(root) ? root.documentElement : root;
12
+ const previous = host.getAttribute("data-icen-scrollbars-ready");
13
+ host.setAttribute("data-icen-scrollbars-ready", "");
14
+ const pending = /* @__PURE__ */ new Map();
15
+ const restore = (el, value) => {
16
+ if (value === null) el.removeAttribute("data-icen-scroll-active");
17
+ else el.setAttribute("data-icen-scroll-active", value);
18
+ };
19
+ const onScroll = (event) => {
20
+ const el = isDocument(event.target) ? event.target.documentElement : event.target;
21
+ if (!(el instanceof HTMLElement)) return;
22
+ for (let node = el; node; node = node.parentElement) {
23
+ if (!mounted.has(node)) continue;
24
+ if (node !== root) return;
25
+ break;
26
+ }
27
+ const old = pending.get(el);
28
+ if (old) clearTimeout(old.timer);
29
+ const before = old ? old.previous : el.getAttribute("data-icen-scroll-active");
30
+ el.setAttribute("data-icen-scroll-active", "");
31
+ const local = el.closest("[data-icen-scrollbar-delay]")?.dataset.icenScrollbarDelay;
32
+ const token = getComputedStyle(el).getPropertyValue("--icen-token-scrollbar-idle-delay").trim();
33
+ const parsed = local !== void 0 ? Number(local) : options.idleDelay ?? (token ? Number.parseFloat(token) * (token.endsWith("ms") ? 1 : token.endsWith("s") ? 1e3 : 1) : 900);
34
+ const delay = Number.isFinite(parsed) ? Math.max(0, Math.min(6e4, parsed)) : 900;
35
+ const timer = setTimeout(() => {
36
+ restore(el, before);
37
+ pending.delete(el);
38
+ }, delay);
39
+ pending.set(el, { timer, previous: before });
40
+ };
41
+ root.addEventListener("scroll", onScroll, { capture: true, passive: true });
42
+ let disposed = false;
43
+ return () => {
44
+ if (disposed) return;
45
+ disposed = true;
46
+ root.removeEventListener("scroll", onScroll, true);
47
+ for (const [el, state] of pending) {
48
+ clearTimeout(state.timer);
49
+ restore(el, state.previous);
50
+ }
51
+ pending.clear();
52
+ if (previous === null) host.removeAttribute("data-icen-scrollbars-ready");
53
+ else host.setAttribute("data-icen-scrollbars-ready", previous);
54
+ mounted.delete(root);
55
+ };
56
+ }
57
+ export {
58
+ initScrollArea
59
+ };
@@ -1,6 +1,9 @@
1
- /** 为 root 下每个 [data-select] 容器初始化(root 自身是 [data-select] 也算)。
1
+ /** 为 root 下每个 [data-icen-select] 容器初始化(root 自身是 [data-icen-select] 也算)。
2
2
  * 返回销毁函数:摘除本次初始化容器的全部监听并复位幂等标记(可重新 init);
3
3
  * 最后一个容器销毁时同时摘除 document 级单例委托。 */
4
4
  declare function initSelect(root?: ParentNode): () => void;
5
+ /** Resync authored selection classes, labels and form values without emitting a
6
+ * user-change event. Child/text/native-disabled changes are observed automatically. */
7
+ declare function refreshSelect(root?: ParentNode): void;
5
8
 
6
- export { initSelect };
9
+ export { initSelect, refreshSelect };