@icen.ai/ui 0.8.1 → 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 (141) hide show
  1. package/AGENTS.md +49 -6
  2. package/README.md +12 -9
  3. package/dist/behaviors/ai-branch.d.mts +19 -0
  4. package/dist/behaviors/ai-branch.mjs +217 -0
  5. package/dist/behaviors/ai-chat.d.mts +8 -6
  6. package/dist/behaviors/ai-chat.mjs +68 -8
  7. package/dist/behaviors/ai-composer.mjs +108 -20
  8. package/dist/behaviors/ai-feedback.d.mts +26 -0
  9. package/dist/behaviors/ai-feedback.mjs +303 -0
  10. package/dist/behaviors/ai-panel.d.mts +15 -1
  11. package/dist/behaviors/ai-panel.mjs +26 -0
  12. package/dist/behaviors/ai-threads.d.mts +38 -0
  13. package/dist/behaviors/ai-threads.mjs +319 -0
  14. package/dist/behaviors/ai-tool.mjs +5 -0
  15. package/dist/behaviors/ai-tools.mjs +5 -0
  16. package/dist/behaviors/charts.d.mts +103 -1
  17. package/dist/behaviors/charts.mjs +795 -0
  18. package/dist/behaviors/events.d.mts +193 -0
  19. package/dist/behaviors/kb-access.d.mts +34 -0
  20. package/dist/behaviors/kb-access.mjs +569 -0
  21. package/dist/behaviors/kb-acl.d.mts +50 -0
  22. package/dist/behaviors/kb-acl.mjs +405 -0
  23. package/dist/behaviors/kb-answer.d.mts +38 -0
  24. package/dist/behaviors/kb-answer.mjs +2055 -0
  25. package/dist/behaviors/kb-audit.d.mts +23 -0
  26. package/dist/behaviors/kb-audit.mjs +375 -0
  27. package/dist/behaviors/kb-canvas.d.mts +44 -0
  28. package/dist/behaviors/kb-canvas.mjs +589 -0
  29. package/dist/behaviors/kb-chain.d.mts +15 -0
  30. package/dist/behaviors/kb-chain.mjs +270 -0
  31. package/dist/behaviors/kb-checkpoint.d.mts +16 -0
  32. package/dist/behaviors/kb-checkpoint.mjs +342 -0
  33. package/dist/behaviors/kb-chunks.d.mts +31 -0
  34. package/dist/behaviors/kb-chunks.mjs +475 -0
  35. package/dist/behaviors/kb-citation.d.mts +38 -0
  36. package/dist/behaviors/kb-citation.mjs +677 -0
  37. package/dist/behaviors/kb-clarify.d.mts +20 -0
  38. package/dist/behaviors/kb-clarify.mjs +248 -0
  39. package/dist/behaviors/kb-conflict.d.mts +22 -0
  40. package/dist/behaviors/kb-conflict.mjs +284 -0
  41. package/dist/behaviors/kb-connector.d.mts +17 -0
  42. package/dist/behaviors/kb-connector.mjs +375 -0
  43. package/dist/behaviors/kb-core.d.mts +529 -0
  44. package/dist/behaviors/kb-core.mjs +890 -0
  45. package/dist/behaviors/kb-eval.d.mts +22 -0
  46. package/dist/behaviors/kb-eval.mjs +408 -0
  47. package/dist/behaviors/kb-explain.d.mts +11 -0
  48. package/dist/behaviors/kb-explain.mjs +243 -0
  49. package/dist/behaviors/kb-filter.d.mts +31 -0
  50. package/dist/behaviors/kb-filter.mjs +587 -0
  51. package/dist/behaviors/kb-gap.d.mts +27 -0
  52. package/dist/behaviors/kb-gap.mjs +273 -0
  53. package/dist/behaviors/kb-hittest.d.mts +34 -0
  54. package/dist/behaviors/kb-hittest.mjs +409 -0
  55. package/dist/behaviors/kb-metadata.d.mts +29 -0
  56. package/dist/behaviors/kb-metadata.mjs +326 -0
  57. package/dist/behaviors/kb-passage.d.mts +41 -0
  58. package/dist/behaviors/kb-passage.mjs +529 -0
  59. package/dist/behaviors/kb-pipeline.d.mts +18 -0
  60. package/dist/behaviors/kb-pipeline.mjs +381 -0
  61. package/dist/behaviors/kb-qa.d.mts +26 -0
  62. package/dist/behaviors/kb-qa.mjs +332 -0
  63. package/dist/behaviors/kb-rerank.d.mts +20 -0
  64. package/dist/behaviors/kb-rerank.mjs +315 -0
  65. package/dist/behaviors/kb-retrieval.d.mts +49 -0
  66. package/dist/behaviors/kb-retrieval.mjs +746 -0
  67. package/dist/behaviors/kb-review.d.mts +44 -0
  68. package/dist/behaviors/kb-review.mjs +451 -0
  69. package/dist/behaviors/kb-sandbox.d.mts +33 -0
  70. package/dist/behaviors/kb-sandbox.mjs +325 -0
  71. package/dist/behaviors/kb-segment.d.mts +32 -0
  72. package/dist/behaviors/kb-segment.mjs +499 -0
  73. package/dist/behaviors/kb-sources.d.mts +27 -0
  74. package/dist/behaviors/kb-sources.mjs +373 -0
  75. package/dist/behaviors/kb-sql.d.mts +43 -0
  76. package/dist/behaviors/kb-sql.mjs +948 -0
  77. package/dist/behaviors/kb-trace.d.mts +16 -0
  78. package/dist/behaviors/kb-trace.mjs +414 -0
  79. package/dist/behaviors/kb-visibility.d.mts +44 -0
  80. package/dist/behaviors/kb-visibility.mjs +403 -0
  81. package/dist/behaviors/kb-who-can.d.mts +32 -0
  82. package/dist/behaviors/kb-who-can.mjs +379 -0
  83. package/dist/components/ai-branch.mjs +3 -0
  84. package/dist/components/ai-chat.css +295 -0
  85. package/dist/components/ai-feedback.mjs +3 -0
  86. package/dist/components/ai-panel.css +217 -0
  87. package/dist/components/ai-threads.mjs +3 -0
  88. package/dist/components/chart-graph.css +57 -0
  89. package/dist/components/chart-graph.mjs +4 -0
  90. package/dist/components/chart-map.mjs +3 -0
  91. package/dist/components/chart-scatter.mjs +1 -1
  92. package/dist/components/charts.css +32 -0
  93. package/dist/components/charts.mjs +1 -0
  94. package/dist/components/kb-access.mjs +4 -0
  95. package/dist/components/kb-acl.mjs +4 -0
  96. package/dist/components/kb-agent.css +481 -0
  97. package/dist/components/kb-answer.mjs +4 -0
  98. package/dist/components/kb-audit.mjs +4 -0
  99. package/dist/components/kb-canvas.mjs +4 -0
  100. package/dist/components/kb-chain.mjs +4 -0
  101. package/dist/components/kb-checkpoint.mjs +4 -0
  102. package/dist/components/kb-chunks.mjs +4 -0
  103. package/dist/components/kb-citation.mjs +4 -0
  104. package/dist/components/kb-clarify.mjs +4 -0
  105. package/dist/components/kb-conflict.mjs +4 -0
  106. package/dist/components/kb-connector.mjs +4 -0
  107. package/dist/components/kb-data.css +649 -0
  108. package/dist/components/kb-eval.mjs +4 -0
  109. package/dist/components/kb-explain.mjs +4 -0
  110. package/dist/components/kb-filter.mjs +4 -0
  111. package/dist/components/kb-gap.mjs +4 -0
  112. package/dist/components/kb-ground.css +566 -0
  113. package/dist/components/kb-hittest.mjs +4 -0
  114. package/dist/components/kb-ingest.css +898 -0
  115. package/dist/components/kb-metadata.mjs +4 -0
  116. package/dist/components/kb-ops.css +548 -0
  117. package/dist/components/kb-passage.mjs +4 -0
  118. package/dist/components/kb-perm.css +444 -0
  119. package/dist/components/kb-pipeline.mjs +4 -0
  120. package/dist/components/kb-qa.mjs +4 -0
  121. package/dist/components/kb-rerank.mjs +4 -0
  122. package/dist/components/kb-retrieval.mjs +4 -0
  123. package/dist/components/kb-review.mjs +4 -0
  124. package/dist/components/kb-sandbox.mjs +4 -0
  125. package/dist/components/kb-search.css +940 -0
  126. package/dist/components/kb-segment.mjs +4 -0
  127. package/dist/components/kb-sources.mjs +4 -0
  128. package/dist/components/kb-sql.mjs +4 -0
  129. package/dist/components/kb-trace.mjs +4 -0
  130. package/dist/components/kb-visibility.mjs +4 -0
  131. package/dist/components/kb-who-can.mjs +4 -0
  132. package/dist/components/kb.css +252 -0
  133. package/dist/components/kb.mjs +9 -0
  134. package/dist/index.d.mts +37 -2
  135. package/dist/index.mjs +8555 -205
  136. package/dist/registry.json +325 -3
  137. package/dist/ui.css +5451 -45
  138. package/docs/research/2026-10-03-ai-kb-components.md +392 -0
  139. package/docs/research/2026-10-03-kb-permissions.md +992 -0
  140. package/docs/spec/kb-family.md +443 -0
  141. package/package.json +2 -2
@@ -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';
@@ -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';
@@ -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';
@@ -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';
@@ -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';