来源列表
来源列表 .kb-sources:--row 答案上方横排 / --rail 侧栏纵列两种布局;useCount 降序(被引 ×N,同计数稳定原序);徽标覆盖 官方(accent 线框)/ 相对时间(>90 天自动 stale 加警示点)/ 受限(锁形徽标 + 申请访问按钮,行壳降级 role=button 补 Enter/Space 键控);onlyCited 只保留被引过的来源(流式「随流填充」),空集给引导空态。点击来源行 / 申请访问 → icen:kb-source-open { source }(与冲突组、原文抽屉同一事件契约)。
事件日志:点击来源行或受限行的「申请访问」
<div class="toolbar" style="margin-bottom:10px"> <span class="toolbar-label">布局</span> <button class="btn btn-sm btn-primary" type="button" data-kb-sources-variant="row">row 横排</button> <button class="btn btn-sm" type="button" data-kb-sources-variant="rail">rail 纵列</button> <span class="toolbar-spacer"></span> <label style="display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--token-text-muted)"><input type="checkbox" id="demo-kb-sources-only">onlyCited(随流填充)</label></div><div id="demo-kb-sources-box" style="max-width:600px"></div><p class="demo-label" id="demo-kb-sources-log" style="margin-top:10px">事件日志:点击来源行或受限行的「申请访问」</p> 安装
bun add @icen.ai/ui pnpm add @icen.ai/ui npm install @icen.ai/ui yarn add @icen.ai/ui 一行引入该组件(CSS 与 behavior 自动带上,无需关心内部 CSS 文件名):
import { initKbSources } from '@icen.ai/ui/kit/kb-sources';initKbSources(); 也可以用脚手架直接打印引入行:
bunx --bun @icen.ai/ui add kb-sources
Astro 项目注意:kit 入口里的 CSS import 在页面 <script> 里会被 Astro 的 client bundle 摇掉——请改在布局 frontmatter 里引 CSS(import '@icen.ai/ui/components/kb-ground.css';),JS 行为仍可走 kit。Vite SPA / webpack 项目无此问题。
用法
import { renderKbSources, initKbSources } from '@icen.ai/ui/kit/kb-sources';initKbSources(); // 委托点击 → icen:kb-source-open { source };受限行补 Enter/Space 键控(幂等 + 销毁函数) renderKbSources(el, sources, { variant: 'row', // 'row' 答案上方横排(默认)| 'rail' 侧栏纵列 onlyCited: false, // true = 只保留被引过的来源(useCount > 0,流式随流填充) onOpen: (source) => openPassage(source), // 与事件双通道});// 来源对象即 kb-core KbCitation:official / date(>90 天自动 stale)/ permission 受限加锁与申请入口// 排序:useCount 降序(被引 ×N);空数组渲染 .kb-empty「下一条答案引用的段落将出现在这里」