行内引用
行内引用角标 .kb-citation + hover 引用卡:renderCitationText(el, text, sources) 把含 [3] 的答案文本切成「文本节点 + 角标」混合流(流式安全:delta 边界的 "[3" 自然留在文本段,增量重渲该 el 即可),sources 同时写入模块级注册表供 hover 卡取数;hover ≥300ms 经 popover portal 浮 .kb-citation-card(类型图标 / 域名 / 引文 ≤150 字 / 官方·过期·受限徽标,受限引文打码);超界编号自动降级 .is-dead 灰显不可点——「不信任模型生成编号」纪律。点击派 icen:kb-citation-open { citation }。
答案正文由 renderCitationText 注入角标 —— 悬停角标 ≥300ms 看引用卡(官方 / 过期 / 受限三种徽标态),点击派事件;末尾 [9] 超出来源数,降级为灰显死角标
<p class="demo-label" style="margin:0 0 8px">答案正文由 renderCitationText 注入角标 —— 悬停角标 ≥300ms 看引用卡(官方 / 过期 / 受限三种徽标态),点击派事件;末尾 [9] 超出来源数,降级为灰显死角标</p><div class="kb-quote" id="demo-kb-citation-answer" style="font-size:13px;line-height:2.1"></div><div class="toolbar" style="margin-top:12px"> <span class="toolbar-label" id="demo-kb-citation-log">事件日志:悬停 / 点击任一活角标</span></div> 安装
bun add @icen.ai/ui pnpm add @icen.ai/ui npm install @icen.ai/ui yarn add @icen.ai/ui 一行引入该组件(CSS 与 behavior 自动带上,无需关心内部 CSS 文件名):
import { initKbCitation } from '@icen.ai/ui/kit/kb-citation';initKbCitation(); 也可以用脚手架直接打印引入行:
bunx --bun @icen.ai/ui add kb-citation
Astro 项目注意:kit 入口里的 CSS import 在页面 <script> 里会被 Astro 的 client bundle 摇掉——请改在布局 frontmatter 里引 CSS(import '@icen.ai/ui/components/kb-ground.css';),JS 行为仍可走 kit。Vite SPA / webpack 项目无此问题。
用法
import { initKbCitation, renderCitationText } from '@icen.ai/ui/kit/kb-citation';initKbCitation(); // root 级委托:click → icen:kb-citation-open;hover ≥300ms 浮引用卡(幂等 + 返回销毁函数) // 把含 [n] 的答案文本渲染成「文本 + 角标」混合流;sources 写入注册表(hover 卡数据源)renderCitationText(el, '按《供应商准入手册》需三证审核与验厂 [1],Q3 起新增 ESG 项 [2]…', [ { id: 's1', index: 1, title: '供应商准入手册 v3.2', url: 'https://confluence.corp/pages/vendor-onboarding', kind: 'wiki', official: true, date: '2026-09-28', useCount: 2, citedText: '新供应商准入需通过三证审核并完成现场验厂,评分低于 60 分不予通过。' }, { id: 's2', index: 2, title: '2026 Q3 采购政策更新纪要', kind: 'doc', date: '2026-09-21', citedText: '自 Q3 起准入评分新增 ESG 维度,权重 15%。' },]);// 超界编号(如 [9])自动降级 <sup class="kb-citation is-dead">(灰显、aria-hidden、不可点)// 单独造角标:renderCitationMark(3) → <button class="kb-citation" data-cite="3">3</button>// 注册表读写(答案区与来源列表共享数据源):setKbCitationSources(sources) / getKbCitationSources()// hover 卡兜底增强:initKbCitation(root, { getCard(citation) { return fetchDetail(citation); } })