@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
@@ -0,0 +1,649 @@
1
+ /*
2
+ * @icen.ai/ui — kb-data.css(问数域:kb-sql / kb-answer / kb-clarify / kb-explain)
3
+ * 共享原语在 kb.css(.kb-row/.kb-num/.kb-chip/.kb-badge/.kb-fold-head/.kb-notice…),
4
+ * 本文件只做本域专属结构。DOM 契约见 docs/spec/kb-family.md §5.15–5.18 与各 behavior 头注释。
5
+ *
6
+ * 域内色彩纪律(spec §2 数字域):
7
+ * - 数字本身永远中性色(.kb-num / 结果表右对齐列),success 只表达「可信资产」(认证徽章);
8
+ * - SQL 着色是语法层级信号不是装饰:全部 color-mix 半透明降饱和(kw=accent /
9
+ * str=success / num=warning / fn=info / cmt=faint);
10
+ * - 修正卡 = warning 边框(告警语义);权限提示不可关闭(诚实呈现,无 dismiss 样式钩子)。
11
+ * 只消费 --token-* / --radius-* / --density-* / --font-mono;明暗自适应走 token 与 .dark 档。
12
+ */
13
+
14
+ /* ═══════════════════ kb-sql · 生成 SQL 卡片 ═══════════════════ */
15
+
16
+ .kb-sql {
17
+ display: flex;
18
+ flex-direction: column;
19
+ gap: 8px;
20
+ min-width: 0;
21
+ padding: 10px 12px;
22
+ border: 1px solid var(--token-line-soft);
23
+ border-radius: var(--radius-md, 10px);
24
+ background: var(--token-surface);
25
+ }
26
+
27
+ .kb-sql-head {
28
+ display: flex;
29
+ align-items: center;
30
+ gap: 8px;
31
+ flex-wrap: wrap;
32
+ min-height: 24px;
33
+ }
34
+
35
+ .kb-sql-title {
36
+ font-size: 13px;
37
+ font-weight: 600;
38
+ color: var(--token-text);
39
+ white-space: nowrap;
40
+ }
41
+
42
+ .kb-sql-tables {
43
+ display: inline-flex;
44
+ align-items: center;
45
+ gap: 4px;
46
+ flex-wrap: wrap;
47
+ min-width: 0;
48
+ }
49
+
50
+ .kb-sql-actions {
51
+ display: inline-flex;
52
+ align-items: center;
53
+ gap: 6px;
54
+ margin-left: auto;
55
+ flex: 0 0 auto;
56
+ }
57
+
58
+ /* ghost 图标钮(复制/编辑/应用/确认共用底座) */
59
+ .kb-sql-btn {
60
+ display: inline-flex;
61
+ align-items: center;
62
+ gap: 4px;
63
+ min-height: 22px;
64
+ padding: 2px 8px;
65
+ font: inherit;
66
+ font-size: 11.5px;
67
+ color: var(--token-text-muted);
68
+ background: transparent;
69
+ border: 1px solid var(--token-line-soft);
70
+ border-radius: var(--radius-sm, 6px);
71
+ cursor: pointer;
72
+ white-space: nowrap;
73
+ }
74
+ .kb-sql-btn:hover:not(:disabled) {
75
+ color: var(--token-text);
76
+ border-color: var(--token-line);
77
+ background: var(--token-bg-soft);
78
+ }
79
+ .kb-sql-btn:focus-visible {
80
+ outline: 2px solid var(--token-accent);
81
+ outline-offset: 1px;
82
+ }
83
+ .kb-sql-btn:disabled {
84
+ opacity: 0.55;
85
+ cursor: default;
86
+ }
87
+ .kb-sql-btn-icon,
88
+ .kb-sql-btn-icon svg {
89
+ width: 12px;
90
+ height: 12px;
91
+ flex: 0 0 auto;
92
+ }
93
+ .kb-sql-btn--run {
94
+ color: var(--token-accent);
95
+ border-color: color-mix(in srgb, var(--token-accent) 45%, transparent);
96
+ }
97
+ .kb-sql-btn--run:hover:not(:disabled) {
98
+ color: var(--token-accent);
99
+ border-color: var(--token-accent);
100
+ background: var(--token-accent-subtle, transparent);
101
+ }
102
+ /* 修正卡内的主行动(一屏一个 accent 级操作:此处告警色承载) */
103
+ .kb-sql-btn--apply {
104
+ color: var(--token-warning);
105
+ border-color: color-mix(in srgb, var(--token-warning) 45%, transparent);
106
+ background: var(--token-warning-muted, transparent);
107
+ }
108
+ .kb-sql-btn--apply:hover:not(:disabled) {
109
+ color: var(--token-warning);
110
+ border-color: var(--token-warning);
111
+ }
112
+
113
+ /* SQL 码块:浅色 bg-soft / 深色更深一档(.dark 类,与 tokens 同机制) */
114
+ .kb-sql-code {
115
+ margin: 0;
116
+ padding: 10px 12px;
117
+ background: var(--token-bg-soft);
118
+ border: 1px solid var(--token-line-soft);
119
+ border-radius: var(--radius-sm, 6px);
120
+ font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
121
+ font-size: 12px;
122
+ line-height: 1.65;
123
+ color: var(--token-text);
124
+ white-space: pre;
125
+ overflow: auto;
126
+ max-height: 320px;
127
+ tab-size: 2;
128
+ }
129
+ .dark .kb-sql-code {
130
+ background: color-mix(in srgb, var(--token-bg) 85%, black);
131
+ border-color: color-mix(in srgb, var(--token-line-soft) 70%, transparent);
132
+ }
133
+
134
+ /* 语法 token:color-mix 半透明降饱和(语法层级,非装饰) */
135
+ .kb-sql-tok--kw { color: color-mix(in srgb, var(--token-accent) 85%, transparent); }
136
+ .kb-sql-tok--str { color: color-mix(in srgb, var(--token-success) 82%, transparent); }
137
+ .kb-sql-tok--num { color: color-mix(in srgb, var(--token-warning) 85%, transparent); }
138
+ .kb-sql-tok--fn { color: color-mix(in srgb, var(--token-info) 88%, transparent); }
139
+ .kb-sql-tok--cmt { color: color-mix(in srgb, var(--token-text-faint) 72%, transparent); font-style: italic; }
140
+
141
+ /* 修正卡(warning 边框:「修复已就绪」心智) */
142
+ .kb-sql-fix {
143
+ display: flex;
144
+ flex-direction: column;
145
+ gap: 8px;
146
+ padding: 8px 10px;
147
+ border: 1px solid color-mix(in srgb, var(--token-warning) 45%, transparent);
148
+ border-radius: var(--radius-sm, 6px);
149
+ background: color-mix(in srgb, var(--token-warning) 5%, transparent);
150
+ }
151
+ .kb-sql-fix-head {
152
+ display: flex;
153
+ align-items: center;
154
+ gap: 8px;
155
+ flex-wrap: wrap;
156
+ }
157
+ .kb-sql-fix-title {
158
+ display: inline-flex;
159
+ align-items: center;
160
+ gap: 6px;
161
+ font-size: 12px;
162
+ color: var(--token-warning);
163
+ }
164
+ .kb-sql-fix-title svg {
165
+ width: 13px;
166
+ height: 13px;
167
+ flex: 0 0 auto;
168
+ }
169
+ .kb-sql-fix-title + .kb-sql-btn,
170
+ .kb-sql-fix-head .kb-sql-btn {
171
+ margin-left: auto;
172
+ }
173
+ .kb-sql-fix-diff {
174
+ min-width: 0;
175
+ border-radius: var(--radius-sm, 6px);
176
+ overflow: hidden;
177
+ }
178
+ .kb-sql-fix-diff .ai-diff-file {
179
+ border: 1px solid var(--token-line-soft);
180
+ }
181
+
182
+ /* 编辑态:pre ↔ textarea 同尺寸心智(mono) */
183
+ .kb-sql-editor {
184
+ display: flex;
185
+ flex-direction: column;
186
+ gap: 8px;
187
+ }
188
+ .kb-sql-editor[hidden] {
189
+ display: none;
190
+ }
191
+ .kb-sql-textarea {
192
+ width: 100%;
193
+ min-height: 132px;
194
+ padding: 10px 12px;
195
+ font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
196
+ font-size: 12px;
197
+ line-height: 1.65;
198
+ color: var(--token-text);
199
+ background: var(--token-bg-soft);
200
+ border: 1px solid var(--token-line);
201
+ border-radius: var(--radius-sm, 6px);
202
+ resize: vertical;
203
+ tab-size: 2;
204
+ }
205
+ .kb-sql-textarea:focus-visible {
206
+ outline: 2px solid var(--token-accent);
207
+ outline-offset: -1px;
208
+ }
209
+ .kb-sql-editor-actions {
210
+ display: flex;
211
+ justify-content: flex-end;
212
+ gap: 8px;
213
+ }
214
+ .kb-sql.is-editing .kb-sql-fix {
215
+ display: none; /* 编辑当前 SQL 时隐藏旧版修复对比,避免双修离心 */
216
+ }
217
+
218
+ /* ═══════════════════ kb-clarify · 澄清反问卡 ═══════════════════ */
219
+
220
+ .kb-clarify {
221
+ display: flex;
222
+ flex-direction: column;
223
+ gap: 8px;
224
+ padding: 10px 12px;
225
+ border: 1px dashed var(--token-line-dashed, var(--token-line-soft));
226
+ border-radius: var(--radius-sm, 6px);
227
+ background: var(--token-bg-soft);
228
+ }
229
+ .kb-clarify.is-answered {
230
+ border-style: solid;
231
+ border-color: color-mix(in srgb, var(--token-accent) 30%, transparent);
232
+ }
233
+ .kb-clarify-q {
234
+ display: flex;
235
+ align-items: flex-start;
236
+ gap: 6px;
237
+ font-size: 13px;
238
+ color: var(--token-text);
239
+ line-height: 1.6;
240
+ }
241
+ .kb-clarify-qicon,
242
+ .kb-clarify-qicon svg {
243
+ width: 14px;
244
+ height: 14px;
245
+ flex: 0 0 auto;
246
+ margin-top: 2px;
247
+ color: var(--token-accent);
248
+ }
249
+ .kb-clarify-qtext {
250
+ min-width: 0;
251
+ }
252
+ .kb-clarify-opts {
253
+ display: flex;
254
+ flex-wrap: wrap;
255
+ gap: 6px;
256
+ }
257
+ .kb-clarify-opt {
258
+ font: inherit;
259
+ font-size: 12px;
260
+ min-height: 24px;
261
+ padding: 3px 12px;
262
+ color: var(--token-text-muted);
263
+ background: var(--token-surface);
264
+ border: 1px solid var(--token-line-soft);
265
+ border-radius: 999px;
266
+ cursor: pointer;
267
+ transition: color 0.16s ease-out, border-color 0.16s ease-out, background 0.16s ease-out;
268
+ }
269
+ .kb-clarify-opt:hover:not(:disabled) {
270
+ color: var(--token-text);
271
+ border-color: color-mix(in srgb, var(--token-accent) 45%, transparent);
272
+ }
273
+ .kb-clarify-opt:focus-visible {
274
+ outline: 2px solid var(--token-accent);
275
+ outline-offset: 1px;
276
+ }
277
+ .kb-clarify-opt.is-picked {
278
+ color: var(--token-accent);
279
+ border-color: color-mix(in srgb, var(--token-accent) 55%, transparent);
280
+ background: var(--token-accent-subtle, transparent);
281
+ }
282
+ .kb-clarify-opt:disabled {
283
+ opacity: 0.55;
284
+ cursor: default;
285
+ }
286
+ .kb-clarify-resolved {
287
+ font-size: 12px;
288
+ color: var(--token-text-muted);
289
+ }
290
+ .kb-clarify-picked {
291
+ font-weight: 600;
292
+ color: var(--token-text);
293
+ }
294
+ .kb-clarify-reason {
295
+ font-size: 11.5px;
296
+ color: var(--token-text-faint);
297
+ }
298
+
299
+ /* ═══════════════════ kb-explain · 口径解释折叠 ═══════════════════ */
300
+
301
+ .kb-explain {
302
+ min-width: 0;
303
+ border: 1px solid var(--token-line-soft);
304
+ border-radius: var(--radius-sm, 6px);
305
+ background: var(--token-bg-soft);
306
+ overflow: hidden;
307
+ }
308
+ .kb-explain-head {
309
+ border-radius: 0;
310
+ }
311
+ .kb-explain-head:hover {
312
+ border-radius: var(--radius-sm, 6px);
313
+ }
314
+ .kb-explain-title {
315
+ white-space: nowrap;
316
+ overflow: hidden;
317
+ text-overflow: ellipsis;
318
+ }
319
+ .kb-explain-body {
320
+ display: flex;
321
+ flex-direction: column;
322
+ gap: 8px;
323
+ padding: 4px 10px 10px 28px;
324
+ }
325
+ .kb-explain-group {
326
+ display: flex;
327
+ align-items: baseline;
328
+ gap: 6px;
329
+ flex-wrap: wrap;
330
+ }
331
+ .kb-explain-group-label {
332
+ flex: 0 0 auto;
333
+ min-width: 2.5em;
334
+ font-size: 11px;
335
+ color: var(--token-text-faint);
336
+ }
337
+ .kb-explain-metrics {
338
+ display: flex;
339
+ flex-direction: column;
340
+ gap: 4px;
341
+ padding-top: 8px;
342
+ border-top: 1px dashed var(--token-line-dashed, var(--token-line-soft));
343
+ }
344
+ .kb-explain-metric {
345
+ display: flex;
346
+ align-items: center;
347
+ gap: 10px;
348
+ flex-wrap: wrap;
349
+ font-size: 12.5px;
350
+ }
351
+ .kb-explain-metric-name {
352
+ color: var(--token-text);
353
+ font-weight: 500;
354
+ }
355
+ .kb-explain-metric-ref {
356
+ font-size: 11.5px;
357
+ color: var(--token-accent);
358
+ text-decoration: none;
359
+ border-bottom: 1px solid color-mix(in srgb, var(--token-accent) 35%, transparent);
360
+ }
361
+ .kb-explain-metric-ref:hover {
362
+ border-bottom-color: var(--token-accent);
363
+ }
364
+ .kb-explain-count {
365
+ flex: 0 0 auto;
366
+ }
367
+
368
+ /* ═══════════════════ kb-answer · 答案组合容器 ═══════════════════ */
369
+
370
+ .kb-answer {
371
+ display: flex;
372
+ flex-direction: column;
373
+ gap: 12px;
374
+ min-width: 0;
375
+ font-size: 13px;
376
+ }
377
+
378
+ /* 徽章区 */
379
+ .kb-answer-badges {
380
+ display: flex;
381
+ align-items: center;
382
+ gap: 8px;
383
+ flex-wrap: wrap;
384
+ }
385
+ .kb-verified {
386
+ display: inline-flex;
387
+ align-items: center;
388
+ gap: 8px;
389
+ flex-wrap: wrap;
390
+ padding: 0;
391
+ font: inherit;
392
+ background: none;
393
+ border: none;
394
+ cursor: pointer;
395
+ text-align: left;
396
+ }
397
+ .kb-verified:focus-visible {
398
+ outline: 2px solid var(--token-accent);
399
+ outline-offset: 3px;
400
+ border-radius: var(--radius-sm, 6px);
401
+ }
402
+ .kb-verified-via {
403
+ font-size: 11.5px;
404
+ color: var(--token-text-muted);
405
+ }
406
+ .kb-verified-note {
407
+ font-size: 11.5px;
408
+ color: var(--token-text-faint);
409
+ }
410
+ .kb-verified-hint {
411
+ font-size: 11px;
412
+ color: var(--token-text-faint);
413
+ border-left: 2px solid var(--token-line-soft);
414
+ padding-left: 8px;
415
+ }
416
+ .kb-verified:hover .kb-verified-via {
417
+ color: var(--token-text);
418
+ }
419
+
420
+ /* 权限提示(行级过滤 + 脱敏列;不可关闭) */
421
+ .kb-perm {
422
+ display: flex;
423
+ align-items: center;
424
+ gap: 8px;
425
+ flex-wrap: wrap;
426
+ width: 100%;
427
+ padding: 4px 8px;
428
+ border-radius: var(--radius-sm, 6px);
429
+ background: var(--token-bg-soft);
430
+ font-size: 11.5px;
431
+ color: var(--token-text-muted);
432
+ }
433
+ .kb-perm-icon,
434
+ .kb-perm-icon svg {
435
+ width: 12px;
436
+ height: 12px;
437
+ flex: 0 0 auto;
438
+ color: var(--token-text-faint);
439
+ }
440
+ .kb-perm-mask {
441
+ display: inline-flex;
442
+ align-items: center;
443
+ gap: 4px;
444
+ flex-wrap: wrap;
445
+ }
446
+ .kb-perm-mask-label {
447
+ color: var(--token-text-faint);
448
+ }
449
+ .kb-perm-mask .kb-chip {
450
+ border-color: color-mix(in srgb, var(--token-warning) 35%, transparent);
451
+ }
452
+
453
+ /* 正文与简化引用角标(与 kb-ground 域 .kb-citation 类名一致;默认弱化,hover 点亮) */
454
+ .kb-answer-body {
455
+ font-size: 13px;
456
+ line-height: 1.75;
457
+ color: var(--token-text);
458
+ white-space: pre-wrap;
459
+ overflow-wrap: anywhere;
460
+ }
461
+ .kb-answer-body .kb-citation {
462
+ font-size: 10.5px;
463
+ line-height: 1;
464
+ margin: 0 1px;
465
+ padding: 1px 5px;
466
+ color: var(--token-text-faint);
467
+ background: var(--token-bg-soft);
468
+ border: 1px solid var(--token-line-soft);
469
+ border-radius: 999px;
470
+ cursor: default;
471
+ transition: color 0.16s ease-out, border-color 0.16s ease-out;
472
+ }
473
+ .kb-answer-body .kb-citation:hover {
474
+ color: var(--token-accent);
475
+ border-color: color-mix(in srgb, var(--token-accent) 45%, transparent);
476
+ }
477
+
478
+ /* 槽位 */
479
+ .kb-answer-clarify,
480
+ .kb-answer-explain {
481
+ min-width: 0;
482
+ }
483
+
484
+ /* 结果表:滚动容器 + sticky 表头 + 数字列右对齐(数字永远中性色) */
485
+ .kb-answer-results {
486
+ display: flex;
487
+ flex-direction: column;
488
+ gap: 6px;
489
+ min-width: 0;
490
+ }
491
+ .kb-result-meta {
492
+ display: flex;
493
+ align-items: center;
494
+ gap: 10px;
495
+ flex-wrap: wrap;
496
+ }
497
+ .kb-result-export {
498
+ display: inline-flex;
499
+ gap: 6px;
500
+ margin-left: auto;
501
+ }
502
+ .kb-result-export-btn {
503
+ font: inherit;
504
+ font-size: 11.5px;
505
+ min-height: 22px;
506
+ padding: 2px 8px;
507
+ color: var(--token-text-muted);
508
+ background: transparent;
509
+ border: 1px solid var(--token-line-soft);
510
+ border-radius: var(--radius-sm, 6px);
511
+ cursor: pointer;
512
+ }
513
+ .kb-result-export-btn:hover:not(:disabled) {
514
+ color: var(--token-text);
515
+ border-color: var(--token-line);
516
+ background: var(--token-bg-soft);
517
+ }
518
+ .kb-result-export-btn:focus-visible {
519
+ outline: 2px solid var(--token-accent);
520
+ outline-offset: 1px;
521
+ }
522
+ .kb-result-export-btn:disabled {
523
+ opacity: 0.55;
524
+ cursor: default;
525
+ }
526
+ .kb-result-scroll {
527
+ overflow: auto;
528
+ max-height: 360px;
529
+ border: 1px solid var(--token-line-soft);
530
+ border-radius: var(--radius-sm, 6px);
531
+ background: var(--token-surface);
532
+ }
533
+ .kb-result-table {
534
+ width: 100%;
535
+ border-collapse: separate;
536
+ border-spacing: 0;
537
+ font-size: 12.5px;
538
+ }
539
+ .kb-result-table th {
540
+ position: sticky;
541
+ top: 0;
542
+ z-index: 1;
543
+ padding: 6px 10px;
544
+ background: var(--token-bg-soft);
545
+ border-bottom: 1px solid var(--token-line-soft);
546
+ font-size: 11.5px;
547
+ font-weight: 600;
548
+ color: var(--token-text-muted);
549
+ text-align: left;
550
+ white-space: nowrap;
551
+ }
552
+ .kb-result-table td {
553
+ padding: 5px 10px;
554
+ border-bottom: 1px solid color-mix(in srgb, var(--token-line-soft) 50%, transparent);
555
+ color: var(--token-text);
556
+ white-space: nowrap;
557
+ }
558
+ .kb-result-table tbody tr:last-child td {
559
+ border-bottom: none;
560
+ }
561
+ .kb-result-table tbody tr:hover td {
562
+ background: var(--token-bg-soft);
563
+ }
564
+ /* 数字列:等宽 + tabular-nums + 右对齐(值本身中性色) */
565
+ .kb-result-table th.kb-num,
566
+ .kb-result-table td.kb-num {
567
+ font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
568
+ font-variant-numeric: tabular-nums;
569
+ text-align: right;
570
+ }
571
+ .kb-result-null {
572
+ color: var(--token-text-faint);
573
+ }
574
+ .kb-result-truncated {
575
+ padding: 2px 8px;
576
+ }
577
+
578
+ /* 图表区(renderChart 复用;类型切换 chips) */
579
+ .kb-answer-chart {
580
+ display: flex;
581
+ flex-direction: column;
582
+ gap: 8px;
583
+ min-width: 0;
584
+ }
585
+ .kb-chart-switch {
586
+ display: flex;
587
+ align-items: center;
588
+ gap: 6px;
589
+ }
590
+ .kb-chart-chip {
591
+ font: inherit;
592
+ font-size: 11.5px;
593
+ min-height: 22px;
594
+ padding: 2px 10px;
595
+ color: var(--token-text-muted);
596
+ background: transparent;
597
+ border: 1px solid var(--token-line-soft);
598
+ border-radius: 999px;
599
+ cursor: pointer;
600
+ transition: color 0.16s ease-out, border-color 0.16s ease-out, background 0.16s ease-out;
601
+ }
602
+ .kb-chart-chip:hover {
603
+ color: var(--token-text);
604
+ border-color: var(--token-line);
605
+ }
606
+ .kb-chart-chip:focus-visible {
607
+ outline: 2px solid var(--token-accent);
608
+ outline-offset: 1px;
609
+ }
610
+ .kb-chart-chip.is-active {
611
+ color: var(--token-accent);
612
+ border-color: color-mix(in srgb, var(--token-accent) 55%, transparent);
613
+ background: var(--token-accent-subtle, transparent);
614
+ }
615
+ .kb-chart-mount {
616
+ min-height: 0;
617
+ }
618
+
619
+ /* 追问建议 */
620
+ .kb-answer-followups {
621
+ display: flex;
622
+ align-items: center;
623
+ gap: 6px;
624
+ flex-wrap: wrap;
625
+ }
626
+ .kb-followups-label {
627
+ font-size: 11.5px;
628
+ color: var(--token-text-faint);
629
+ }
630
+ .kb-followup {
631
+ cursor: pointer;
632
+ transition: border-color 0.16s ease-out, color 0.16s ease-out;
633
+ }
634
+ .kb-followup:hover {
635
+ color: var(--token-text);
636
+ border-color: color-mix(in srgb, var(--token-accent) 45%, transparent);
637
+ }
638
+ .kb-followup:focus-visible {
639
+ outline: 2px solid var(--token-accent);
640
+ outline-offset: 1px;
641
+ }
642
+
643
+ /* ═══════════════════ 密度档 ═══════════════════ */
644
+
645
+ [data-density='compact'] .kb-sql { padding: 8px 10px; gap: 6px; }
646
+ [data-density='compact'] .kb-result-table th { padding: 4px 8px; }
647
+ [data-density='compact'] .kb-result-table td { padding: 3px 8px; }
648
+ [data-density='compact'] .kb-answer { gap: 8px; }
649
+ [data-density='compact'] .kb-clarify { padding: 8px 10px; }
@@ -0,0 +1,4 @@
1
+ // @icen.ai/ui — kit: kb-eval(CSS + behavior 一行入口;构建产物,勿手改)
2
+ import './kb-ops.css';
3
+ import './kb.css';
4
+ export * from '../behaviors/kb-eval.mjs';
@@ -0,0 +1,4 @@
1
+ // @icen.ai/ui — kit: kb-explain(CSS + behavior 一行入口;构建产物,勿手改)
2
+ import './kb-data.css';
3
+ import './kb.css';
4
+ export * from '../behaviors/kb-explain.mjs';
@@ -0,0 +1,4 @@
1
+ // @icen.ai/ui — kit: kb-filter(CSS + behavior 一行入口;构建产物,勿手改)
2
+ import './kb-search.css';
3
+ import './kb.css';
4
+ export * from '../behaviors/kb-filter.mjs';
@@ -0,0 +1,4 @@
1
+ // @icen.ai/ui — kit: kb-gap(CSS + behavior 一行入口;构建产物,勿手改)
2
+ import './kb-ops.css';
3
+ import './kb.css';
4
+ export * from '../behaviors/kb-gap.mjs';