@icen.ai/ui 0.8.0 → 0.9.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 (228) hide show
  1. package/AGENTS.md +63 -14
  2. package/README.md +17 -9
  3. package/dist/base.css +4 -3
  4. package/dist/behaviors/accordion.d.mts +5 -2
  5. package/dist/behaviors/accordion.mjs +36 -11
  6. package/dist/behaviors/ai-branch.d.mts +19 -0
  7. package/dist/behaviors/ai-branch.mjs +217 -0
  8. package/dist/behaviors/ai-chat.d.mts +11 -7
  9. package/dist/behaviors/ai-chat.mjs +134 -51
  10. package/dist/behaviors/ai-composer.d.mts +28 -3
  11. package/dist/behaviors/ai-composer.mjs +399 -229
  12. package/dist/behaviors/ai-core.d.mts +9 -4
  13. package/dist/behaviors/ai-core.mjs +21 -8
  14. package/dist/behaviors/ai-diff.d.mts +2 -2
  15. package/dist/behaviors/ai-diff.mjs +172 -41
  16. package/dist/behaviors/ai-feedback.d.mts +26 -0
  17. package/dist/behaviors/ai-feedback.mjs +303 -0
  18. package/dist/behaviors/ai-panel.d.mts +26 -9
  19. package/dist/behaviors/ai-panel.mjs +211 -110
  20. package/dist/behaviors/ai-provider.mjs +54 -48
  21. package/dist/behaviors/ai-threads.d.mts +38 -0
  22. package/dist/behaviors/ai-threads.mjs +319 -0
  23. package/dist/behaviors/ai-tool.d.mts +12 -4
  24. package/dist/behaviors/ai-tool.mjs +316 -263
  25. package/dist/behaviors/ai-tools.d.mts +9 -6
  26. package/dist/behaviors/ai-tools.mjs +264 -155
  27. package/dist/behaviors/back-top.mjs +16 -1
  28. package/dist/behaviors/carousel.d.mts +5 -2
  29. package/dist/behaviors/carousel.mjs +53 -26
  30. package/dist/behaviors/charts.d.mts +170 -22
  31. package/dist/behaviors/charts.mjs +1016 -150
  32. package/dist/behaviors/command-palette.d.mts +40 -6
  33. package/dist/behaviors/command-palette.mjs +143 -15
  34. package/dist/behaviors/context-menu.d.mts +21 -4
  35. package/dist/behaviors/context-menu.mjs +122 -38
  36. package/dist/behaviors/controls.d.mts +59 -0
  37. package/dist/behaviors/controls.mjs +601 -0
  38. package/dist/behaviors/copy.d.mts +5 -2
  39. package/dist/behaviors/copy.mjs +37 -12
  40. package/dist/behaviors/datatable.d.mts +12 -0
  41. package/dist/behaviors/datatable.mjs +226 -43
  42. package/dist/behaviors/date-picker.d.mts +2 -2
  43. package/dist/behaviors/date-picker.mjs +171 -32
  44. package/dist/behaviors/dropdown.d.mts +6 -2
  45. package/dist/behaviors/dropdown.mjs +164 -25
  46. package/dist/behaviors/events.d.mts +523 -0
  47. package/dist/behaviors/events.mjs +208 -0
  48. package/dist/behaviors/input.mjs +25 -12
  49. package/dist/behaviors/kb-access.d.mts +34 -0
  50. package/dist/behaviors/kb-access.mjs +569 -0
  51. package/dist/behaviors/kb-acl.d.mts +50 -0
  52. package/dist/behaviors/kb-acl.mjs +405 -0
  53. package/dist/behaviors/kb-answer.d.mts +38 -0
  54. package/dist/behaviors/kb-answer.mjs +2055 -0
  55. package/dist/behaviors/kb-audit.d.mts +23 -0
  56. package/dist/behaviors/kb-audit.mjs +375 -0
  57. package/dist/behaviors/kb-canvas.d.mts +44 -0
  58. package/dist/behaviors/kb-canvas.mjs +589 -0
  59. package/dist/behaviors/kb-chain.d.mts +15 -0
  60. package/dist/behaviors/kb-chain.mjs +270 -0
  61. package/dist/behaviors/kb-checkpoint.d.mts +16 -0
  62. package/dist/behaviors/kb-checkpoint.mjs +342 -0
  63. package/dist/behaviors/kb-chunks.d.mts +31 -0
  64. package/dist/behaviors/kb-chunks.mjs +475 -0
  65. package/dist/behaviors/kb-citation.d.mts +38 -0
  66. package/dist/behaviors/kb-citation.mjs +677 -0
  67. package/dist/behaviors/kb-clarify.d.mts +20 -0
  68. package/dist/behaviors/kb-clarify.mjs +248 -0
  69. package/dist/behaviors/kb-conflict.d.mts +22 -0
  70. package/dist/behaviors/kb-conflict.mjs +284 -0
  71. package/dist/behaviors/kb-connector.d.mts +17 -0
  72. package/dist/behaviors/kb-connector.mjs +375 -0
  73. package/dist/behaviors/kb-core.d.mts +529 -0
  74. package/dist/behaviors/kb-core.mjs +890 -0
  75. package/dist/behaviors/kb-eval.d.mts +22 -0
  76. package/dist/behaviors/kb-eval.mjs +408 -0
  77. package/dist/behaviors/kb-explain.d.mts +11 -0
  78. package/dist/behaviors/kb-explain.mjs +243 -0
  79. package/dist/behaviors/kb-filter.d.mts +31 -0
  80. package/dist/behaviors/kb-filter.mjs +587 -0
  81. package/dist/behaviors/kb-gap.d.mts +27 -0
  82. package/dist/behaviors/kb-gap.mjs +273 -0
  83. package/dist/behaviors/kb-hittest.d.mts +34 -0
  84. package/dist/behaviors/kb-hittest.mjs +409 -0
  85. package/dist/behaviors/kb-metadata.d.mts +29 -0
  86. package/dist/behaviors/kb-metadata.mjs +326 -0
  87. package/dist/behaviors/kb-passage.d.mts +41 -0
  88. package/dist/behaviors/kb-passage.mjs +529 -0
  89. package/dist/behaviors/kb-pipeline.d.mts +18 -0
  90. package/dist/behaviors/kb-pipeline.mjs +381 -0
  91. package/dist/behaviors/kb-qa.d.mts +26 -0
  92. package/dist/behaviors/kb-qa.mjs +332 -0
  93. package/dist/behaviors/kb-rerank.d.mts +20 -0
  94. package/dist/behaviors/kb-rerank.mjs +315 -0
  95. package/dist/behaviors/kb-retrieval.d.mts +49 -0
  96. package/dist/behaviors/kb-retrieval.mjs +746 -0
  97. package/dist/behaviors/kb-review.d.mts +44 -0
  98. package/dist/behaviors/kb-review.mjs +451 -0
  99. package/dist/behaviors/kb-sandbox.d.mts +33 -0
  100. package/dist/behaviors/kb-sandbox.mjs +325 -0
  101. package/dist/behaviors/kb-segment.d.mts +32 -0
  102. package/dist/behaviors/kb-segment.mjs +499 -0
  103. package/dist/behaviors/kb-sources.d.mts +27 -0
  104. package/dist/behaviors/kb-sources.mjs +373 -0
  105. package/dist/behaviors/kb-sql.d.mts +43 -0
  106. package/dist/behaviors/kb-sql.mjs +948 -0
  107. package/dist/behaviors/kb-trace.d.mts +16 -0
  108. package/dist/behaviors/kb-trace.mjs +414 -0
  109. package/dist/behaviors/kb-visibility.d.mts +44 -0
  110. package/dist/behaviors/kb-visibility.mjs +403 -0
  111. package/dist/behaviors/kb-who-can.d.mts +32 -0
  112. package/dist/behaviors/kb-who-can.mjs +379 -0
  113. package/dist/behaviors/modal.d.mts +24 -5
  114. package/dist/behaviors/modal.mjs +76 -10
  115. package/dist/behaviors/nav.d.mts +1 -1
  116. package/dist/behaviors/nav.mjs +33 -7
  117. package/dist/behaviors/notification.d.mts +20 -4
  118. package/dist/behaviors/notification.mjs +53 -73
  119. package/dist/behaviors/popover.d.mts +39 -3
  120. package/dist/behaviors/popover.mjs +90 -4
  121. package/dist/behaviors/select.d.mts +4 -2
  122. package/dist/behaviors/select.mjs +161 -24
  123. package/dist/behaviors/sidebar.d.mts +5 -2
  124. package/dist/behaviors/sidebar.mjs +43 -13
  125. package/dist/behaviors/slider.d.mts +5 -2
  126. package/dist/behaviors/slider.mjs +54 -43
  127. package/dist/behaviors/split-pane.d.mts +6 -2
  128. package/dist/behaviors/split-pane.mjs +62 -21
  129. package/dist/behaviors/tabs.d.mts +3 -2
  130. package/dist/behaviors/tabs.mjs +65 -14
  131. package/dist/behaviors/tag-input.d.mts +5 -2
  132. package/dist/behaviors/tag-input.mjs +61 -21
  133. package/dist/behaviors/theme.d.mts +13 -2
  134. package/dist/behaviors/theme.mjs +48 -4
  135. package/dist/behaviors/toast.d.mts +30 -8
  136. package/dist/behaviors/toast.mjs +74 -7
  137. package/dist/behaviors/tree.d.mts +5 -2
  138. package/dist/behaviors/tree.mjs +38 -15
  139. package/dist/behaviors/upload.mjs +21 -23
  140. package/dist/cli.mjs +1 -1
  141. package/dist/components/ai-branch.mjs +3 -0
  142. package/dist/components/ai-chat.css +295 -0
  143. package/dist/components/ai-feedback.mjs +3 -0
  144. package/dist/components/ai-panel.css +218 -1
  145. package/dist/components/ai-threads.mjs +3 -0
  146. package/dist/components/ai-tool-call.mjs +1 -1
  147. package/dist/components/badge.css +1 -1
  148. package/dist/components/breadcrumb.css +0 -32
  149. package/dist/components/chart-calendar.mjs +1 -2
  150. package/dist/components/chart-graph.css +57 -0
  151. package/dist/components/chart-graph.mjs +4 -0
  152. package/dist/components/chart-map.mjs +3 -0
  153. package/dist/components/chart-pie.css +0 -6
  154. package/dist/components/chart-scatter.mjs +1 -1
  155. package/dist/components/charts.css +33 -1
  156. package/dist/components/charts.mjs +1 -0
  157. package/dist/components/content.css +3 -16
  158. package/dist/components/datatable.css +1 -1
  159. package/dist/components/date-picker.css +1 -1
  160. package/dist/components/kb-access.mjs +4 -0
  161. package/dist/components/kb-acl.mjs +4 -0
  162. package/dist/components/kb-agent.css +481 -0
  163. package/dist/components/kb-answer.mjs +4 -0
  164. package/dist/components/kb-audit.mjs +4 -0
  165. package/dist/components/kb-canvas.mjs +4 -0
  166. package/dist/components/kb-chain.mjs +4 -0
  167. package/dist/components/kb-checkpoint.mjs +4 -0
  168. package/dist/components/kb-chunks.mjs +4 -0
  169. package/dist/components/kb-citation.mjs +4 -0
  170. package/dist/components/kb-clarify.mjs +4 -0
  171. package/dist/components/kb-conflict.mjs +4 -0
  172. package/dist/components/kb-connector.mjs +4 -0
  173. package/dist/components/kb-data.css +649 -0
  174. package/dist/components/kb-eval.mjs +4 -0
  175. package/dist/components/kb-explain.mjs +4 -0
  176. package/dist/components/kb-filter.mjs +4 -0
  177. package/dist/components/kb-gap.mjs +4 -0
  178. package/dist/components/kb-ground.css +566 -0
  179. package/dist/components/kb-hittest.mjs +4 -0
  180. package/dist/components/kb-ingest.css +898 -0
  181. package/dist/components/kb-metadata.mjs +4 -0
  182. package/dist/components/kb-ops.css +548 -0
  183. package/dist/components/kb-passage.mjs +4 -0
  184. package/dist/components/kb-perm.css +444 -0
  185. package/dist/components/kb-pipeline.mjs +4 -0
  186. package/dist/components/kb-qa.mjs +4 -0
  187. package/dist/components/kb-rerank.mjs +4 -0
  188. package/dist/components/kb-retrieval.mjs +4 -0
  189. package/dist/components/kb-review.mjs +4 -0
  190. package/dist/components/kb-sandbox.mjs +4 -0
  191. package/dist/components/kb-search.css +940 -0
  192. package/dist/components/kb-segment.mjs +4 -0
  193. package/dist/components/kb-sources.mjs +4 -0
  194. package/dist/components/kb-sql.mjs +4 -0
  195. package/dist/components/kb-trace.mjs +4 -0
  196. package/dist/components/kb-visibility.mjs +4 -0
  197. package/dist/components/kb-who-can.mjs +4 -0
  198. package/dist/components/kb.css +252 -0
  199. package/dist/components/kb.mjs +9 -0
  200. package/dist/components/notification.css +2 -3
  201. package/dist/components/pagination.css +3 -1
  202. package/dist/components/pagination.mjs +1 -0
  203. package/dist/components/rating.mjs +1 -0
  204. package/dist/components/segmented.css +9 -1
  205. package/dist/components/segmented.mjs +1 -1
  206. package/dist/components/select.css +67 -4
  207. package/dist/components/steps.css +13 -3
  208. package/dist/components/steps.mjs +1 -0
  209. package/dist/components/switch.css +3 -1
  210. package/dist/components/switch.mjs +1 -0
  211. package/dist/components/table.mjs +1 -0
  212. package/dist/components/tabs.css +23 -0
  213. package/dist/components/tag-input.css +1 -6
  214. package/dist/components/upload.css +0 -15
  215. package/dist/index.d.mts +48 -11
  216. package/dist/index.mjs +13205 -3615
  217. package/dist/registry.json +366 -15
  218. package/dist/retro-effects.css +3 -16
  219. package/dist/tokens/retro-effects.css +3 -16
  220. package/dist/tokens/style-profiles.css +3 -2
  221. package/dist/tokens/typography.css +2 -0
  222. package/dist/tokens.css +5 -2
  223. package/dist/ui.css +5713 -267
  224. package/docs/research/2026-10-03-ai-kb-components.md +392 -0
  225. package/docs/research/2026-10-03-kb-permissions.md +992 -0
  226. package/docs/spec/ai-native.md +7 -4
  227. package/docs/spec/kb-family.md +443 -0
  228. package/package.json +2 -2
@@ -399,7 +399,7 @@
399
399
  user-select: none;
400
400
  }
401
401
 
402
- /* 大号变体(常驻工具栏/头部用) */
402
+ /* 大号变体(消费方变体,常驻头部大号环;behavior 不产出,由使用方手写标记) */
403
403
  .ai-usage-ring--lg {
404
404
  width: 44px;
405
405
  height: 44px;
@@ -680,3 +680,220 @@
680
680
  .ai-context { transition: none; }
681
681
  .ai-item-status { animation: none; }
682
682
  }
683
+
684
+ /* ══════════════ ai-feedback · 回答反馈(§5.27,behaviors/ai-feedback.ts) ══════════════ */
685
+
686
+ /*
687
+ * <div class="ai-feedback [.is-done]">
688
+ * <div class="ai-feedback-votes">
689
+ * <button class="ai-feedback-vote is-up [.is-picked]" aria-pressed>svg</button>
690
+ * <button class="ai-feedback-vote is-down [.is-picked]" aria-pressed>svg</button>
691
+ * </div>
692
+ * <div class="ai-feedback-reasons" hidden>
693
+ * <button class="ai-feedback-chip [.is-picked]">答案有误</button>…
694
+ * <button class="ai-feedback-submit">提交</button>
695
+ * </div>
696
+ * <div class="ai-feedback-done" hidden>感谢反馈,已关联到该条回答的追踪记录</div>
697
+ * </div>
698
+ * 双钮 28px;is-picked accent 边;.is-done 终态隐藏控件只留小字感谢文案。
699
+ */
700
+
701
+ .ai-feedback {
702
+ display: inline-flex;
703
+ flex-wrap: wrap;
704
+ align-items: center;
705
+ gap: var(--density-space-sm);
706
+ min-width: 0;
707
+ }
708
+
709
+ .ai-feedback-votes {
710
+ display: inline-flex;
711
+ gap: 4px;
712
+ }
713
+
714
+ /* 双钮:28px 方形图标钮 */
715
+ .ai-feedback-vote {
716
+ display: inline-flex;
717
+ align-items: center;
718
+ justify-content: center;
719
+ width: 28px;
720
+ height: 28px;
721
+ padding: 0;
722
+ border: 1px solid var(--token-line-soft);
723
+ border-radius: var(--radius-sm);
724
+ background: transparent;
725
+ color: var(--token-text-muted);
726
+ cursor: pointer;
727
+ transition:
728
+ color var(--icen-tx-fast),
729
+ border-color var(--icen-tx-fast),
730
+ background-color var(--icen-tx-fast),
731
+ opacity var(--icen-tx-fast);
732
+ }
733
+ .ai-feedback-vote svg {
734
+ width: 14px;
735
+ height: 14px;
736
+ }
737
+ .ai-feedback-vote:hover {
738
+ color: var(--token-text);
739
+ border-color: var(--icen-hover-border);
740
+ background: var(--token-fill-1);
741
+ }
742
+ .ai-feedback-vote:focus-visible {
743
+ outline: none;
744
+ box-shadow: var(--icen-ring);
745
+ }
746
+ /* 锁定:对侧禁用降透明;选中侧 accent 边 + 浅 accent 底 */
747
+ .ai-feedback-vote:disabled {
748
+ opacity: 0.45;
749
+ cursor: default;
750
+ background: transparent;
751
+ border-color: var(--token-line-soft);
752
+ }
753
+ .ai-feedback-vote.is-picked {
754
+ color: var(--token-accent);
755
+ border-color: var(--token-accent);
756
+ background: color-mix(in srgb, var(--token-accent) 10%, transparent);
757
+ }
758
+
759
+ /* 踩因枚举 chips + 提交(点 👎 展开) */
760
+ .ai-feedback-reasons {
761
+ display: inline-flex;
762
+ flex-wrap: wrap;
763
+ align-items: center;
764
+ gap: var(--density-space-xs);
765
+ min-width: 0;
766
+ }
767
+ .ai-feedback-reasons[hidden] {
768
+ display: none;
769
+ }
770
+ .ai-feedback-chip {
771
+ padding: 2px 10px;
772
+ border: 1px solid var(--token-line-soft);
773
+ border-radius: var(--radius-full);
774
+ background: transparent;
775
+ color: var(--token-text-muted);
776
+ font-size: var(--density-font-size-xs);
777
+ line-height: 1.5;
778
+ cursor: pointer;
779
+ transition:
780
+ color var(--icen-tx-fast),
781
+ border-color var(--icen-tx-fast),
782
+ background-color var(--icen-tx-fast);
783
+ }
784
+ .ai-feedback-chip:hover {
785
+ color: var(--token-text);
786
+ border-color: var(--icen-hover-border);
787
+ }
788
+ .ai-feedback-chip:focus-visible {
789
+ outline: none;
790
+ box-shadow: var(--icen-ring);
791
+ }
792
+ .ai-feedback-chip.is-picked {
793
+ color: var(--token-accent);
794
+ border-color: var(--token-accent);
795
+ background: color-mix(in srgb, var(--token-accent) 10%, transparent);
796
+ }
797
+
798
+ /* 提交钮:小号 ghost(accent 留给状态,非主行动不铺实底) */
799
+ .ai-feedback-submit {
800
+ padding: 2px 12px;
801
+ border: 1px solid var(--token-line);
802
+ border-radius: var(--radius-full);
803
+ background: transparent;
804
+ color: var(--token-text);
805
+ font-size: var(--density-font-size-xs);
806
+ line-height: 1.5;
807
+ cursor: pointer;
808
+ transition:
809
+ color var(--icen-tx-fast),
810
+ border-color var(--icen-tx-fast),
811
+ background-color var(--icen-tx-fast);
812
+ }
813
+ .ai-feedback-submit:hover {
814
+ color: var(--token-accent);
815
+ border-color: var(--token-accent);
816
+ background: color-mix(in srgb, var(--token-accent) 8%, transparent);
817
+ }
818
+ .ai-feedback-submit:focus-visible {
819
+ outline: none;
820
+ box-shadow: var(--icen-ring);
821
+ }
822
+
823
+ /* 已提交终态:小字感谢文案,控件隐藏 */
824
+ .ai-feedback-done {
825
+ font-size: var(--density-font-size-2xs);
826
+ color: var(--token-text-faint);
827
+ }
828
+ .ai-feedback-done[hidden] {
829
+ display: none;
830
+ }
831
+ .ai-feedback.is-done .ai-feedback-votes,
832
+ .ai-feedback.is-done .ai-feedback-reasons {
833
+ display: none;
834
+ }
835
+
836
+ /* ══════════════ ai-usage-metrics · 派生指标明细行(§5.27,renderAiUsage) ══════════════ */
837
+
838
+ /* 图例下 mono 一行:TTFT 0.8s · 42 tok/s · finish: stop */
839
+ .ai-usage-metrics {
840
+ font-family: var(--font-mono);
841
+ font-size: 11.5px;
842
+ color: var(--token-text-faint);
843
+ font-variant-numeric: tabular-nums;
844
+ letter-spacing: 0.01em;
845
+ }
846
+
847
+ /* ══════════════ ai-todo-check · done 描边勾(§5.27,renderAiTodo) ══════════════ */
848
+
849
+ /* 与 .ai-item-status 同位替换:done 时显勾隐点(:has 守卫——静态手写 DOM 无勾时保留状态点);
850
+ * pathLength=1 → stroke-dasharray 1,.is-anim 做 stroke-dashoffset 描边动画(480ms 一次不循环) */
851
+ .ai-todo-check {
852
+ position: relative;
853
+ display: none;
854
+ flex-shrink: 0;
855
+ width: 8px;
856
+ height: 8px;
857
+ color: var(--token-success);
858
+ }
859
+ .ai-todo-check svg {
860
+ position: absolute;
861
+ inset: 0;
862
+ margin: auto;
863
+ width: 12px;
864
+ height: 12px;
865
+ }
866
+ .ai-todo-check path {
867
+ stroke-dasharray: 1;
868
+ }
869
+ .ai-todo-item.is-done .ai-todo-check {
870
+ display: inline-flex;
871
+ }
872
+ .ai-todo-item.is-done:has(.ai-todo-check) > .ai-item-status {
873
+ display: none;
874
+ }
875
+ .ai-todo-check.is-anim path {
876
+ animation: ai-todo-check-draw var(--ai-todo-check-duration, 480ms) var(--ease-out) 1 forwards;
877
+ }
878
+ @keyframes ai-todo-check-draw {
879
+ from {
880
+ stroke-dashoffset: 1;
881
+ }
882
+ to {
883
+ stroke-dashoffset: 0;
884
+ }
885
+ }
886
+
887
+ /* ── 动效守卫(§5.27 新增段) ── */
888
+
889
+ @media (prefers-reduced-motion: reduce) {
890
+ .ai-feedback-vote,
891
+ .ai-feedback-chip,
892
+ .ai-feedback-submit {
893
+ transition: none;
894
+ }
895
+ .ai-todo-check.is-anim path {
896
+ animation: none;
897
+ stroke-dashoffset: 0;
898
+ }
899
+ }
@@ -0,0 +1,3 @@
1
+ // @icen.ai/ui — kit: ai-threads(CSS + behavior 一行入口;构建产物,勿手改)
2
+ import './ai-chat.css';
3
+ export * from '../behaviors/ai-threads.mjs';
@@ -1,2 +1,2 @@
1
1
  // @icen.ai/ui — kit: ai-tool-call(CSS + behavior 一行入口;构建产物,勿手改)
2
- import './ai-tool-call.css';
2
+ import './ai-tool.css';
@@ -22,7 +22,7 @@
22
22
  * </span>
23
23
  *
24
24
  * 变体:--dot 纯圆点 / --sm 小号 / --lg 大号 / --bottom 底部角
25
- * 语义色:--success(在线)/ --warning / --error / --accent
25
+ * 语义色:--success(在线)/ --warning / --error / --info / --accent
26
26
  */
27
27
 
28
28
  .badge-host {
@@ -105,38 +105,6 @@
105
105
  background: var(--token-fill-1);
106
106
  }
107
107
 
108
- /* ── 溢出下拉(behavior 可选:点击 … 展开被折叠的中间路径) ── */
109
- .breadcrumb-dropdown {
110
- position: relative;
111
- }
112
- .breadcrumb-dropdown-menu {
113
- position: absolute;
114
- top: calc(100% + 4px);
115
- left: 0;
116
- min-width: 160px;
117
- padding: 4px;
118
- background: var(--token-card-strong);
119
- border: 1px solid var(--token-outline);
120
- border-radius: var(--radius-md);
121
- box-shadow: var(--token-shadow-overlay);
122
- z-index: var(--z-popover);
123
- animation: icen-pop-in var(--icen-tx-fast);
124
- }
125
- .breadcrumb-dropdown-menu[hidden] { display: none; }
126
- .breadcrumb-dropdown-menu a {
127
- display: block;
128
- padding: 4px var(--density-space-sm);
129
- font-size: var(--density-font-size-sm);
130
- color: var(--token-text-muted);
131
- text-decoration: none;
132
- border-radius: var(--radius-sm);
133
- transition: background-color var(--icen-tx-fast), color var(--icen-tx-fast);
134
- }
135
- .breadcrumb-dropdown-menu a:hover {
136
- background: var(--token-fill-1);
137
- color: var(--token-text);
138
- }
139
-
140
108
  /* ── 面包屑分隔符变体 ── */
141
109
  .breadcrumb--slash .breadcrumb-sep::after { content: '/'; }
142
110
  .breadcrumb--arrow .breadcrumb-sep::after { content: '→'; }
@@ -1,5 +1,4 @@
1
1
  // @icen.ai/ui — kit: chart-calendar(CSS + behavior 一行入口;构建产物,勿手改)
2
- import './chart-calendar.css';
3
- import './charts.css';
4
2
  import './chart-heatmap.css';
3
+ import './charts.css';
5
4
  export { renderCalendar } from '../behaviors/charts.mjs';
@@ -0,0 +1,57 @@
1
+ /*
2
+ * @icen.ai/ui — Component: chart-graph(知识图谱 / 力导向 node-link 专属样式)
3
+ * 依赖:charts.css(基座 .chart / tooltip / [data-chart-mark] 交互态 / 可切换图例)
4
+ *
5
+ * DOM 由 behaviors/charts.ts 的 renderGraph 构建:
6
+ * .chart-graph > svg(360×260 viewBox)
7
+ * ├ g.chart-graph-edges > line.chart-graph-edge(line-soft,簇隐藏联动 .is-off)
8
+ * └ g.chart-graph-nodes > g.chart-graph-node(transform 定位)
9
+ * ├ circle.chart-graph-dot(簇调色;r = 6 + weight 归一 × 12)
10
+ * ├ circle.chart-graph-hit(透明命中圆)+ <title>
11
+ * 布局确定性(同数据同布局,无随机源);拖拽 = pointer + 局部松弛(rAF,
12
+ * 拖拽节点 .is-drag 描边 accent)。
13
+ */
14
+
15
+ .chart-graph svg {
16
+ width: 100%;
17
+ height: auto;
18
+ display: block;
19
+ }
20
+
21
+ /* 边:不参与命中(交互只留节点),任一端簇隐藏时淡化 */
22
+ .chart-graph-edge {
23
+ pointer-events: none;
24
+ transition: opacity var(--icen-tx-fast);
25
+ }
26
+ .chart-graph-edge.is-off {
27
+ opacity: 0.1;
28
+ }
29
+
30
+ /* 节点:拖拽抓手(触屏禁默认手势,pointer 拖拽不滚动页面) */
31
+ .chart-graph .chart-graph-node {
32
+ cursor: grab;
33
+ touch-action: none;
34
+ }
35
+ .chart-graph .chart-graph-node:active {
36
+ cursor: grabbing;
37
+ }
38
+ .chart-graph-dot {
39
+ transition: stroke var(--icen-tx-fast), stroke-width var(--icen-tx-fast);
40
+ }
41
+ /* hover:描边换前景色(bindDatumEvents 挂 .is-hover) */
42
+ .chart-graph-node.is-hover .chart-graph-dot {
43
+ stroke: var(--token-text);
44
+ stroke-width: 2;
45
+ }
46
+ /* 拖拽态:accent 描边 */
47
+ .chart-graph-node.is-drag .chart-graph-dot {
48
+ stroke: var(--token-accent);
49
+ stroke-width: 2.5;
50
+ }
51
+
52
+ @media (prefers-reduced-motion: reduce) {
53
+ .chart-graph-edge,
54
+ .chart-graph-dot {
55
+ transition: none;
56
+ }
57
+ }
@@ -0,0 +1,4 @@
1
+ // @icen.ai/ui — kit: chart-graph(CSS + behavior 一行入口;构建产物,勿手改)
2
+ import './chart-graph.css';
3
+ import './charts.css';
4
+ export { renderGraph, layoutGraph } from '../behaviors/charts.mjs';
@@ -0,0 +1,3 @@
1
+ // @icen.ai/ui — kit: chart-map(CSS + behavior 一行入口;构建产物,勿手改)
2
+ import './charts.css';
3
+ export { renderMap } from '../behaviors/charts.mjs';
@@ -18,9 +18,3 @@
18
18
  height: 132px;
19
19
  flex-shrink: 0;
20
20
  }
21
- .chart-donut-center {
22
- font-variant-numeric: tabular-nums;
23
- text-anchor: middle;
24
- fill: var(--token-text);
25
- font-weight: 600;
26
- }
@@ -1,4 +1,4 @@
1
1
  // @icen.ai/ui — kit: chart-scatter(CSS + behavior 一行入口;构建产物,勿手改)
2
2
  import './chart-scatter.css';
3
3
  import './charts.css';
4
- export { renderScatter } from '../behaviors/charts.mjs';
4
+ export { renderScatter, renderMap } from '../behaviors/charts.mjs';
@@ -78,7 +78,7 @@
78
78
  font-variant-numeric: tabular-nums;
79
79
  }
80
80
 
81
- /* ── 调色盘:多系列图(donut/stack/line/radar)由 behavior 选用 ── */
81
+ /* ── 调色盘:手写 markup 调色盘;behavior 走 charts.ts PALETTE_VARS 内联同值(两处值需人工同步) ── */
82
82
  .chart-tone-1 { --chart-tone: var(--token-accent); }
83
83
  .chart-tone-2 { --chart-tone: var(--token-accent-cold); }
84
84
  .chart-tone-3 { --chart-tone: var(--token-success); }
@@ -170,3 +170,35 @@ svg circle[data-chart-mark].is-hover { stroke-width: 3; }
170
170
  text-decoration: line-through;
171
171
  }
172
172
  .chart-legend--toggle .is-off .chart-legend-dot { opacity: 0.3; }
173
+
174
+ /* ═══ 知识图谱 / 嵌入地图追加区(graph 专属在独立 chart-graph.css;此处为 map 变体)═══ */
175
+
176
+ /*
177
+ * chart-map:embedding 2D 散点(renderMap)—— renderScatter 的去轴变体:
178
+ * 无刻度文字、只留细虚线网格(预投影坐标的刻度无意义);点 4px 半透明
179
+ * (fill-opacity .7,高密度层叠可辨)。DOM 由 behaviors/charts.ts 的
180
+ * renderMap 构建(.chart-map > svg > g.chart-map-point > dot + hit + title)。
181
+ * 样式并入基座(map 无独立 css,与 chart-calendar 并入 chart-heatmap 同策略)。
182
+ */
183
+ .chart-map svg {
184
+ width: 100%;
185
+ height: auto;
186
+ display: block;
187
+ }
188
+ .chart-map .chart-map-point {
189
+ cursor: pointer;
190
+ }
191
+ .chart-map-dot {
192
+ transition: transform var(--icen-tx-fast);
193
+ transform-box: fill-box;
194
+ transform-origin: center;
195
+ }
196
+ .chart-map-point.is-hover .chart-map-dot {
197
+ transform: scale(1.5);
198
+ }
199
+
200
+ @media (prefers-reduced-motion: reduce) {
201
+ .chart-map-dot {
202
+ transition: none;
203
+ }
204
+ }
@@ -10,4 +10,5 @@ import './chart-stack.css';
10
10
  import './chart-gauge.css';
11
11
  import './chart-sparkline.css';
12
12
  import './chart-scatter.css';
13
+ import './chart-graph.css';
13
14
  export * from '../behaviors/charts.mjs';
@@ -3,6 +3,9 @@
3
3
  *
4
4
  * 包含:kbd(按键)/ code-inline(行内代码)/ list(分隔列表)/ accordion(手风琴,behaviors/accordion 配套)/
5
5
  * timeline(时间线)/ desc(描述列表)/ tree(树形,behaviors/tree 配套)
6
+ * markup API 变体(正文"增强"段,behavior 不产出、由手写 markup 消费):
7
+ * .accordion--cards / .code-inline--success|--warning|--error /
8
+ * .timeline--right|--alternate|--sm / .timeline-extra / .timeline-dot--sm 及 dot 语义色(--error 等)
6
9
  * 规格源自 opengal src/presentation/ui/data/exhibit.tsx 与 data/display.tsx。
7
10
  */
8
11
 
@@ -531,22 +534,6 @@
531
534
  background: var(--token-outline-soft);
532
535
  }
533
536
 
534
- /* 树节点复选框(checkbox tree) */
535
- .tree-checkbox {
536
- width: 14px;
537
- height: 14px;
538
- flex-shrink: 0;
539
- margin-right: 2px;
540
- }
541
-
542
- /* 树拖拽视觉态 */
543
- .tree-node.is-dragging {
544
- opacity: 0.5;
545
- }
546
- .tree-node.is-drop-target {
547
- box-shadow: inset 0 -2px var(--token-accent);
548
- }
549
-
550
537
  /* 树搜索高亮 */
551
538
  .tree-label mark {
552
539
  background: color-mix(in srgb, var(--token-warning) 30%, transparent);
@@ -418,7 +418,7 @@
418
418
  background: color-mix(in srgb, var(--token-accent-subtle) 82%, var(--token-fill-1));
419
419
  }
420
420
 
421
- /* ── 行状态类(rowClassName 产出) ── */
421
+ /* ── 行状态类(rowClassName 产出;--danger/--warning/--success 同族语义行底色) ── */
422
422
  .dt-row--danger { background: color-mix(in srgb, var(--token-error) 6%, transparent) !important; }
423
423
  .dt-row--danger:hover { background: color-mix(in srgb, var(--token-error) 10%, transparent) !important; }
424
424
  .dt-row--warning { background: color-mix(in srgb, var(--token-warning) 6%, transparent) !important; }
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * 契约:
5
5
  * <div class="date-picker" data-date-picker data-date-picker-input="id">
6
- * <button class="date-picker-trigger" type="button" aria-haspopup="dialog">
6
+ * <button class="date-picker-trigger [--sm|--lg]" type="button" aria-haspopup="dialog">
7
7
  * <span class="date-picker-value">2026-07-29</span>
8
8
  * <svg class="date-picker-icon">…日历 svg…</svg>
9
9
  * </button>
@@ -0,0 +1,4 @@
1
+ // @icen.ai/ui — kit: kb-access(CSS + behavior 一行入口;构建产物,勿手改)
2
+ import './kb-perm.css';
3
+ import './kb.css';
4
+ export * from '../behaviors/kb-access.mjs';
@@ -0,0 +1,4 @@
1
+ // @icen.ai/ui — kit: kb-acl(CSS + behavior 一行入口;构建产物,勿手改)
2
+ import './kb-perm.css';
3
+ import './kb.css';
4
+ export * from '../behaviors/kb-acl.mjs';