Commit 5bf68247 by pangchong

docs(ai-assistant): 更新 AI 助手知识库及主题色彩规范文档

- 完善主题配置章节,增加基于 tailwind.ui.config.ts 的亮暗主题色彩体系完整参考
- 详细列出核心容器颜色、文字图标颜色及填充边框色阶体系,规范对应 Tailwind 类名
- 明确 1~7 级色阶体系及其对应扩展类名说明,增强视觉一致性指导
- 新增 AI 智能助手知识库同步规范,要求功能改动时必须同步更新问答数据库
- 规范 AI 助手问答准确性要求,确保描述与界面和代码交互保持 100% 一致
- 细化关键字、拼音、标签联动设置,优化上下文感知推荐准确度
- 约束 AI 助手的快捷动作绑定,实现问答与操作闭环体验
- 优化 AiAssistant 组件样式,全面采用 themeVars 颜色变量及 color-mix 函数实现柔和色彩过渡
- 统一对话内容、按钮及高亮提示色彩的设计,提升界面视觉统一性和交互反馈
- 调整 FAQ 分类顺序及命名,新增表格编辑与节点树分类,改进分类逻辑
- 扩展 FAQ 数据库中元素插入说明,增强插图与模板插入步骤的细节描述
- 改进步骤列表渲染,支持子项目缩进及更清晰的编号与项目符号展示
- 多处调整文字颜色与交互样式,提升信息层次感与用户操作体验
parent 88ed2cfd
......@@ -79,21 +79,72 @@
- **状态/提示色**:使用 `text-danger` (或 `text-danger-x``text-danger-6` 对应系统错误色)、`text-success` (成功色)、`text-warning` (警示色),严禁使用 `text-red-600` 等固定原生色。
- **特定技术手册/PDF呈现例外**:在渲染特定技术手册节点(如 `DocNodeRenderer` 内的 `WARNING`, `CAUTION`, `NOTE`, `EFFECT`, `CONEFFECT`, `SBEFF`, `SBEFFC`, `REFBLOCK`, `REFINT`, `REFEXT`, `GRPHCREF`, `EIN` 以及 PDF 特定的表格、签字点等)时,其渲染样式必须严格以手册/PDF规范文件下的物理颜色、物理边框或字体样式定义为主(例如:警告 `WARNING` 必须为固定红 `red`,警戒 `CAUTION` 必须为 `#ff6a00`,注意 `NOTE` 必须为蓝色 `blue`,适用性说明 `EFFECT` / `SBEFF` 等必须为红色斜体 `color: red; font-style: italic;`,引用及功能号 `REFBLOCK` / `REFINT` / `REFEXT` / `GRPHCREF` / `EIN` 等必须为蓝色 `color: blue`,且功能号 `EIN` 必须带下划线,签字表必须是硬编码的 `border-black` 黑实线等)。对于此类具有强制色彩与表现形式规范的节点,**必须使用具体的物理样式属性(如 style="color: red;")进行精确定制,严禁使用 Tailwind/Naive UI 随暗黑模式等主题自适应的颜色类名或变量(如 text-primary, text-danger, text-red-600 等)**,以确保手册呈现的技术准确性与 PDF 导出的一致性。其他常规 UI 框架及骨架情况方可采用系统内置主题配置。
### 主题配置参考
系统内置的亮暗主题颜色配置如下,可通过主题变量自适应:
| 属性名称 | 亮色主题 (Light) | 暗色主题 (Dark) |
| ---------------- | ------------------------ | --------------------------- |
| **primaryColor** | `#165DFF` | `#3c7eff` |
| **successColor** | `#00B42A` | `#3c7eff` |
| **warningColor** | `#FF7D00` | `#f2c97d` |
| **errorColor** | `#F53F3F` | `#e88080` |
| **dividerColor** | `#e8eaed` | `rgba(255, 255, 255, 0.09)` |
| **borderColor** | `#dee2e6` | `rgba(255, 255, 255, 0.24)` |
| **bodyColor** | `#f5f7fa` | `rgb(16, 16, 20)` |
| **cardColor** | `#fff` | `rgb(24, 24, 28)` |
| **inputColor** | `rgba(255, 255, 255, 1)` | `rgba(255, 255, 255, 0.1)` |
### 主题配置完整参考 (基于 `tailwind.ui.config.ts`)
系统内置的亮暗主题色彩体系如下,可通过 `useThemeVars()` 或自适应 CSS/Tailwind 变量使用:
#### 1. 核心语义与容器颜色 (Core & Container Tokens)
| 属性名称 (`GlobalThemeOverrides['common']`) | 亮色主题 (Light) | 暗色主题 (Dark) | 对应 Tailwind / 用途说明 |
| :--- | :--- | :--- | :--- |
| **primaryColor** | `#165DFF` | `#3c7eff` | `bg-primary` / `text-primary` 主题主色 (第 6 级) |
| **primaryColorHover** | `#4080FF` | `#7fe7c4` | `hover:bg-primary-hover` 悬浮主色 |
| **primaryColorPressed** | `#0E42D2` | `#5acea7` | `active:bg-primary-pressed` 点击激活主色 |
| **primaryColorSuppl** | `#94BFFF` | `rgb(42, 148, 125)` | 辅助主色 |
| **infoColor** | `#2080f0` | `#70c0e8` | `bg-info` / `text-info` 信息状态色 |
| **successColor** | `#00B42A` | `#3c7eff` | `bg-success` / `text-success` 成功状态色 |
| **warningColor** | `#FF7D00` | `#f2c97d` | `bg-warning` / `text-warning` 警示状态色 |
| **errorColor** | `#F53F3F` | `#e88080` | `bg-danger` / `text-danger` 错误/危险色 |
| **dividerColor** | `#e8eaed` | `rgba(255, 255, 255, 0.09)` | `border-divider` 分割线颜色 |
| **borderColor** | `#dee2e6` | `rgba(255, 255, 255, 0.24)` | `border-base` 基础边框颜色 |
| **bodyColor** | `#f5f7fa` | `rgb(16, 16, 20)` | `bg-body` 页面底色 |
| **cardColor** | `#fff` | `rgb(24, 24, 28)` | `bg-card` 卡片容器背景色 |
| **modalColor** | `#fff` | `rgb(44, 44, 50)` | 对话框与弹窗背景色 |
| **popoverColor** | `#fff` | `rgb(72, 72, 78)` | 气泡悬浮窗背景色 |
| **tableColor** | `#fff` | `rgb(24, 24, 28)` | 表格单元格背景色 |
| **tableHeaderColor** | `rgb(250, 250, 252)` | `rgba(255, 255, 255, 0.06)` | 表格表头背景色 |
| **inputColor** | `rgba(255, 255, 255, 1)` | `rgba(255, 255, 255, 0.1)` | 输入框背景色 |
| **actionColor** | `rgb(250, 250, 252)` | `rgba(255, 255, 255, 0.06)` | 动作操作区背景色 |
| **tabColor** | `rgb(247, 247, 250)` | `rgba(255, 255, 255, 0.04)` | Tab 栏背景色 |
| **codeColor** | `rgb(244, 244, 248)` | `rgba(255, 255, 255, 0.12)` | 代码块背景色 |
| **hoverColor** | `rgb(243, 243, 245)` | `rgba(255, 255, 255, 0.09)` | 通用悬浮高亮色 |
| **pressedColor** | `rgb(237, 237, 239)` | `rgba(255, 255, 255, 0.05)` | 通用按下激活色 |
| **tagColor** | `#eee` | `rgba(51, 51, 51, 1)` | 标签默认背景色 |
#### 2. 文字、图标与状态颜色 (Text, Icons & Interactive)
| 属性名称 | 亮色主题 (Light) | 暗色主题 (Dark) | 对应 Tailwind / 用途说明 |
| :--- | :--- | :--- | :--- |
| **textColorBase** | `#000` | `#fff` | 基础文字绝对黑/白基准色 |
| **textColor1** | `#1D2129` | `rgba(255, 255, 255, 0.9)` | `text-color1` / `text-primary` 主标题与重要正文 |
| **textColor2** | `#4E5969` | `rgba(255, 255, 255, 0.82)` | `text-color2` / `text-regular` 次要文字与常规描述 |
| **textColor3** | `#86909C` | `rgba(255, 255, 255, 0.52)` | `text-color3` / `text-secondary` 辅助说明与次要标签 |
| **textColorDisabled** | `#C9CDD4` | `rgba(255, 255, 255, 0.38)` | `text-color4` 禁用状态文字 |
| **placeholderColor** | `rgba(194, 194, 194, 1)` | `rgba(255, 255, 255, 0.38)` | 占位符提示文字颜色 |
| **iconColor** | `rgba(194, 194, 194, 1)` | `rgba(255, 255, 255, 0.38)` | 默认图标颜色 |
| **iconColorHover** | `rgba(146, 146, 146, 1)` | `rgba(255, 255, 255, 0.475)` | 图标悬浮颜色 |
| **scrollbarColor** | `rgba(0, 0, 0, 0.25)` | `rgba(255, 255, 255, 0.2)` | 滚动条轨道与滑块颜色 |
#### 3. 填充、边框与背景梯度体系 (Fill, Border, Text & Bg Scales)
| 变量分类 | 梯度级别 | 亮色主题 (Light) | 暗色主题 (Dark) | 对应 Tailwind 类名 |
| :--- | :--- | :--- | :--- | :--- |
| **填充色阶 (Fill)** | `colorFill1`<br>`colorFill2`<br>`colorFill3`<br>`colorFill4` | `#f7f8fa`<br>`#f2f3f5`<br>`#e5e6eb`<br>`#c9cdd4` | `#17171a`<br>`#2e2e30`<br>`#484849`<br>`#5f5f60` | `bg-fill-1` (最浅/浅灰底)<br>`bg-fill-2` (卡片/次级背景)<br>`bg-fill-3` (悬浮/激活背景)<br>`bg-fill-4` (深阶填充) |
| **边框色阶 (Border)** | `colorBorder1`<br>`colorBorder2`<br>`colorBorder3`<br>`colorBorder4` | `#f2f3f5`<br>`#e5e6eb`<br>`#c9cdd4`<br>`#86909c` | `#2e2e30`<br>`#484849`<br>`#5f5f60`<br>`#929293` | `border-color1` (极浅细线)<br>`border-color2` (常规卡片边框)<br>`border-color3` (输入框/高亮边框)<br>`border-color4` (深色强边框) |
| **文字色阶 (Text)** | `colorText1`<br>`colorText2`<br>`colorText3`<br>`colorText4` | `#1d2129`<br>`#4e5969`<br>`#86909c`<br>`#c9cdd4` | `#f6f6f6`<br>`#c5c5c5`<br>`#929293`<br>`#5f5f60` | `text-color1` (主标题正文)<br>`text-color2` (常规文字)<br>`text-color3` (辅助弱文字)<br>`text-color4` (极弱/禁用文字) |
| **背景层级 (Bg)** | `colorBg1` ~ `colorBg5` | 全部为 `#ffffff` | `#17171A`<br>`#232324`<br>`#2A2A2B`<br>`#313132`<br>`#373739` | `bg-bg1` ~ `bg-bg5` (暗黑模式由浅至深的5级层叠背景) |
#### 4. 1~7 级色阶体系 (Arco / Tailwind Color Scales)
| 体系名称 | 亮色色阶 (Light: 1 $\rightarrow$ 7) | 暗色色阶 (Dark: 1 $\rightarrow$ 7) | 对应 Tailwind 扩展类名 |
| :--- | :--- | :--- | :--- |
| **主色阶 (Primary)** | `#E8F3FF` $\rightarrow$ `#BEDAFF` $\rightarrow$ `#94BFFF` $\rightarrow$ `#6AA1FF` $\rightarrow$ `#4080FF` $\rightarrow$ **`#165DFF` (6)** $\rightarrow$ `#000D4D` | `#000d4d` $\rightarrow$ `#041b79` $\rightarrow$ `#0e32a6` $\rightarrow$ `#1d4dd2` $\rightarrow$ `#306fff` $\rightarrow$ **`#3c7eff` (6)** $\rightarrow$ `#689fff` | `bg-primary-1` ~ `bg-primary-7`<br>`text-primary-1` ~ `text-primary-7` |
| **成功色阶 (Success)** | `#E8FFEA` $\rightarrow$ `#AFF0B5` $\rightarrow$ `#7BE188` $\rightarrow$ `#4CD263` $\rightarrow$ `#23C343` $\rightarrow$ **`#00B42A` (6)** $\rightarrow$ `#004D1C` | `#004d1c` $\rightarrow$ `#046625` $\rightarrow$ `#0a802d` $\rightarrow$ `#129a37` $\rightarrow$ `#1db440` $\rightarrow$ **`#27c346` (6)** $\rightarrow$ `#50d266` | `bg-success-1` ~ `bg-success-7`<br>`text-success-1` ~ `text-success-7` |
| **警示色阶 (Warning)** | `#FFF3E8` $\rightarrow$ `#FDDDC3` $\rightarrow$ `#FCC59F` $\rightarrow$ `#F99057` $\rightarrow$ `#F99057` $\rightarrow$ **`#F77234` (6)** $\rightarrow$ `#CC5120` | `#4d1b00` $\rightarrow$ `#793004` $\rightarrow$ `#a64b0a` $\rightarrow$ `#d26913` $\rightarrow$ `#ff8d1f` $\rightarrow$ **`#ff9626` (6)** $\rightarrow$ `#ffb357` | `bg-warning-1` ~ `bg-warning-7`<br>`text-warning-1` ~ `text-warning-7` |
| **错误色阶 (Danger)** | `#FFECE8` $\rightarrow$ `#FDCDC5` $\rightarrow$ `#FBACA3` $\rightarrow$ `#F98981` $\rightarrow$ `#F76560` $\rightarrow$ **`#F53F3F` (6)** $\rightarrow$ `#CB272D` | `#4d000a` $\rightarrow$ `#770611` $\rightarrow$ `#a1161f` $\rightarrow$ `#cb2e34` $\rightarrow$ `#f54e4e` $\rightarrow$ **`#f76965` (6)** $\rightarrow$ `#f98d86` | `bg-danger-1` ~ `bg-danger-7`<br>`text-danger-1` ~ `text-danger-7` |
| **链接色阶 (Link)** | `#E8F7FF` $\rightarrow$ `#C3E7FE` $\rightarrow$ `#9FD4FD` $\rightarrow$ `#7BC0FC` $\rightarrow$ `#57A9FB` $\rightarrow$ **`#3491FA` (6)** $\rightarrow$ `#206CCF` | `#000d4d` $\rightarrow$ `#041b79` $\rightarrow$ `#0e32a6` $\rightarrow$ `#1d4dd2` $\rightarrow$ `#306fff` $\rightarrow$ **`#3c7eff` (6)** $\rightarrow$ `#689fff` | `bg-link-1` ~ `bg-link-7`<br>`text-link-1` ~ `text-link-7` |
---
......@@ -316,3 +367,17 @@ export const COMPOSITE_CONTAINER_MAP: Record<string, string[]> = {
- **多文本节点 / 混合内容**(节点内部包含多个被子 Element 元素分隔的独立文本片段,如 `<REFBLOCK>文本1<REFINT/>文本2</REFBLOCK>`):**必须**保留 `-txt-` 虚拟文本节点,以便用户精确定位到具体的文本片段。右键点击具体文本片段时展示 `目标: #text`,并在下拉层级列表中展示并打勾该具体 `#text` 选项。
- **目标节点名称展示格式**:在右键菜单 Header 顶部及相关面板展示目标节点名称时,实体 XML 节点名称**必须**统一附带尖括号格式(如 `目标: <REFBLOCK>`),保持与大纲树和层级列表一致的视觉识别。
- **层级切换响应式刷新**:右键菜单 Header 选项的 Key 必须包含 `activeNodeId` 动态后缀(如 `key: `headerTarget:${activeNodeId}``),以保证用户在下拉层级列表中手动切换选择父/子/文本节点时,菜单顶部的 `目标: <XXX>` 标题能实时联动更新。
---
## 24. AI 智能助手知识库同步规范 (强制)
- **知识库同步原则 (强制)**:每当系统中进行任何功能改动(修改已有功能逻辑、交互形式、弹窗表单字段、参数配置、快捷键或导出规则等)或新增功能(新增工具栏按钮、新增 XML 标签支持、新增右键菜单项、新增批量/单节点工具、新增偏好设置项等)时,**必须且强制同步更新** [AiAssistant/constants/index.ts](file:///e:/refactor-Editor/Ifar-Xml-Editor/src/layouts/components/AiAssistant/constants/index.ts) 中的 AI 助手问答知识库(`FAQ_DATABASE``FAQ_CATEGORIES``HOT_QUESTIONS`)。
- **真实准确性与步骤闭环**
- AI 助手的问答描述、操作步骤(`steps`)与注意事项(`highlights`**必须与系统代码和界面真实交互 100% 保持一致**,严禁凭空假设或遗留过时的陈旧描述。
- 涉及具体弹窗或交互时,必须准确描述字段名、可选配置项(如单选/多选、勾选框、下拉选项)及执行后的系统行为。
- **检索词、拼音与标签联动 (`keywords`, `synonyms`, `contextTags`)**
- `keywords` 必须同时覆盖中文全称、行业英文术语及**全拼与拼音首字母缩写**(例如:表格配置 `['表格', 'table', 'bg', 'biaoge']`,附图 `['附图', 'graphic', 'ft', 'futu', 'tp']`)。
- `contextTags` 必须准确配置关联的 XML 标签名(如 `PARAC``TABLE``GRAPHIC``SIGNOFF` 等),以确保用户在编辑器或节点树中选中特定标签时,AI 助手能自动触发上下文感知推荐。
- **快捷动作绑定 (`actions`)**:若新增或修改的功能支持从 AI 助手气泡中一键呼出(通过 `eventBus` 触发,如 `trigger_insert_graphic``trigger_open_settings``trigger_undo` 等),必须在 `actions` 字段中配置对应的快捷动作按钮,实现“问答即操作”的闭环体验。
......@@ -3,10 +3,11 @@ export type MessageSender = 'user' | 'bot' | 'system'
export type FaqCategory =
| 'all'
| 'insert' // 元素插入与排版
| 'file' // 文件与导出
| 'table' // 表格高级编辑
| 'tree' // 节点树与大纲
| 'translate' // 翻译与对比
| 'tree' // 节点树与结构
| 'settings' // 快捷键与设置
| 'file' // 文件与导出
| 'settings' // 设置与快捷键
export interface FaqAction {
label: string
......@@ -20,7 +21,7 @@ export interface FaqItem {
category: FaqCategory
categoryName: string
title: string
keywords: string[] // 匹配关键词(含拼音缩写)
keywords: string[] // 匹配关键词(含中文、英文与拼音缩写)
synonyms?: string[] // 别名或相似句式
answer: string // 回答富文本/步骤详情
steps?: string[] // 步骤式说明
......@@ -49,6 +50,12 @@ export interface CategoryInfo {
icon?: string
}
export interface StepItemParsed {
isSubItem: boolean
stepNumber?: number
text: string
}
export interface MatchResult {
type: 'exact' | 'candidates' | 'none'
bestMatch: FaqItem | null
......@@ -59,14 +66,17 @@ export interface MatchResult {
export const FAQ_CATEGORIES: CategoryInfo[] = [
{ key: 'all', label: '全部问题' },
{ key: 'insert', label: '元素与排版' },
{ key: 'file', label: '文件与导出' },
{ key: 'table', label: '表格编辑' },
{ key: 'tree', label: '节点树与大纲' },
{ key: 'translate', label: '翻译与对比' },
{ key: 'tree', label: '节点树结构' },
{ key: 'file', label: '文件与导出' },
{ key: 'settings', label: '设置与快捷键' }
]
export const FAQ_DATABASE: FaqItem[] = [
// ══════════════ 1. 元素插入与排版 (insert) ══════════════
// ══════════════════════════════════════════════════════════════
// 1. 元素插入与排版 (insert)
// ══════════════════════════════════════════════════════════════
{
id: 'faq_insert_mode',
category: 'insert',
......@@ -74,9 +84,9 @@ export const FAQ_DATABASE: FaqItem[] = [
title: '“内部”和“下方”插入模式有什么区别?',
keywords: ['插入模式', '内部', '下方', '模式', '子节点', '同级', '层级', '位置', 'moshi', 'neibu', 'xiafang', 'cr'],
synonyms: ['怎么选择插入位置', '内部插入和下方插入', '怎么插到里面', '怎么插到同级', '同级还是子级'],
answer: '在顶部工具栏最左侧,您可以随时切换当前节点的【插入模式】:',
answer: '在顶部工具栏最左侧,您可以随时切换当前选中节点的【插入模式】:',
steps: [
'【内部】:将新元素作为当前选中节点的“子元素”插入(如果选中节点支持包含子级)。',
'【内部】:将新元素作为当前选中节点的“子元素”插入(如果选中节点支持包含子级结构)。',
'【下方】:将新元素作为当前选中节点的“同级下一个元素”插入(并列同层关系)。'
],
highlights: ['若要在已有步骤中补充段落或附图,请选“内部”;若要新建下一步骤或段落,请选“下方”。'],
......@@ -87,40 +97,20 @@ export const FAQ_DATABASE: FaqItem[] = [
id: 'faq_insert_graphic',
category: 'insert',
categoryName: '元素与排版',
title: '如何插入工卡附图(GRAPHIC)?',
title: '如何插入工卡附图(GRAPHIC)与查看大图?',
keywords: ['插入图片', '附图', 'graphic', '图片', '图纸', '插图', '装配图', '原理图', 'gnbr', 'ft', 'futu', 'tp', 'tupian', 'tuzhi'],
synonyms: ['怎么加图片', '怎么插入附图', '添加工卡图纸', '图片怎么上传', '图纸怎么插入'],
answer: '工卡支持插入航空器部件装配原理图、图纸附图等图形节点(<GRAPHIC>)。',
synonyms: ['怎么加图片', '怎么插入附图', '添加工卡图纸', '图片怎么上传', '图纸怎么插入', '查看附图大图'],
answer: '工卡支持插入航空器部件装配原理图、图纸附图等图形节点(<GRAPHIC>),并提供富文本悬浮大图预览。',
steps: [
'在左侧节点树或中间编辑区,选中需要插入图片的目标节点。',
'在顶部工具栏点击【附图】按钮。',
'在弹出的“插入附图”窗口中,输入或选择图号标识(如 GNBR/Graphic Name)、标题及排版尺寸。',
'点击【确定插入】,系统将自动生成对应的 GRAPHIC 节点并渲染大图预览。'
'在弹出的“插入图片”窗口中,可按需勾选携带【适用性说明 <EFFECT>】与【标题 <TITLE>】。',
'点击【上传图片】选择本地图片资源并自动完成服务上传与图号关联,点击确定后即可插入完整附图。'
],
highlights: ['支持在富文本中直接悬浮预览大图与图纸编号。'],
highlights: ['支持在富文本中直接悬浮预览大图与图纸编号,打印与离线 HTML 导出时均保持高清晰度。'],
actions: [{ label: '插入附图', type: 'event', payload: 'trigger_insert_graphic' }],
relatedQuestions: ['faq_insert_mode', 'faq_insert_table', 'faq_insert_inline_ref'],
contextTags: ['GRAPHIC', 'GRPHCREF'],
isHot: true
},
{
id: 'faq_insert_table',
category: 'insert',
categoryName: '元素与排版',
title: '如何插入和编辑表格(TABLE)?',
keywords: ['表格', 'table', '插入表格', '行', '列', '单元格', '合并单元格', '表头', 'cals', 'bg', 'biaoge', 'tgroup', 'row', 'entry'],
synonyms: ['怎么建表格', '如何画表格', '添加表格', '修改表格', '加行加列'],
answer: '系统内置完整的专业航空表格生成器,支持自定义行列数与对齐方式。',
steps: [
'选中目标位置,点击顶部工具栏的【表格】按钮。',
'设置表格的行数、列数、表头样式(如 REFERENCE / QTY / DESIGNATION 等)。',
'点击确认后即可生成表格。在编辑区中可直接点击单元格录入中英文文字。',
'支持在表格操作区进行增删行、增删列及边框调整。'
],
highlights: ['表格导出时将严格转换为符合 DTD 规范的 CALS Table / OASIS Table 格式。'],
actions: [{ label: '插入表格', type: 'event', payload: 'trigger_insert_table' }],
relatedQuestions: ['faq_insert_mode', 'faq_insert_signoff', 'faq_insert_record_line'],
contextTags: ['TABLE', 'TGROUP', 'THEAD', 'TBODY', 'ROW', 'ENTRY', 'COLSPEC'],
relatedQuestions: ['faq_insert_mode', 'faq_insert_inline_ref', 'faq_preview_card'],
contextTags: ['GRAPHIC', 'GRPHCREF', 'TXTGRPHC'],
isHot: true
},
{
......@@ -132,28 +122,45 @@ export const FAQ_DATABASE: FaqItem[] = [
synonyms: ['怎么插步骤', '双语对照怎么写', '添加步骤模板', '常用模板', '步骤怎么加'],
answer: '复合模板可快速生成标准的 STEP(步骤)、PARAC(中文段落)与 PARA(英文段落)复合结构。',
steps: [
'选中父级节点或目标步骤后,点击顶部工具栏的【模板】按钮。',
'选择预设模板类型(如标准检修步骤、警告提示 WARNING、注意说明 NOTE 等)。',
'点击应用后,系统自动在当前位置插入中英文对照的规范结构。'
'选中父级节点(如 TASK 或 SUBTASK)后,点击顶部工具栏的【模板】按钮。',
'在模板库弹窗中选择预设模板类型(如标准检修步骤、拆装程序、安全检查等)。',
'点击【应用模板】,系统自动在当前位置插入符合 DTD 规范的中英文双语对照结构。'
],
highlights: ['使用模板可大幅减少手动编写 XML 标签的工作量,且 100% 符合 DTD 结构规范。'],
highlights: ['使用模板可大幅减少手动编写 XML 标签的工作量,且 100% 符合航空标准 DTD 结构。'],
actions: [{ label: '打开模板库', type: 'event', payload: 'trigger_insert_template' }],
relatedQuestions: ['faq_batch_translate', 'faq_insert_fragment', 'faq_insert_alert'],
relatedQuestions: ['faq_save_as_template', 'faq_batch_translate', 'faq_insert_alert'],
contextTags: ['STEP', 'TASK', 'SUBTASK', 'PRETOPIC', 'TOPIC'],
isHot: true
},
{
id: 'faq_save_as_template',
category: 'insert',
categoryName: '元素与排版',
title: '如何将当前节点保存为自定义模板供日后复用?',
keywords: ['保存为模板', '自定义模板', '模板管理', '复用', '新建模板', 'bcwmb', 'zidingyi', 'moban'],
synonyms: ['怎么把当前节点存为模板', '怎么收藏步骤', '做成公共模板', '常用步骤保存'],
answer: '系统支持将任意编写好的复杂节点及其完整子树一键保存到本地模板库中:',
steps: [
'在左侧节点树中,右键点击想要保存的结构节点(如精心编写的 STEP 或 TASK)。',
'在右键菜单中选择【保存为模板】。',
'在弹出对话框中输入模板名称、分类(如机械/电气/电子)及说明描述。',
'保存成功后,可在顶部工具栏【模板】库的“自定义模板”分类中随时一键调用插入。'
],
highlights: ['自定义模板会自动剔除特定的唯一 ID 并在复用插入时生成全新节点 ID,防止节点冲突。'],
relatedQuestions: ['faq_insert_template', 'faq_node_tree_ops']
},
{
id: 'faq_insert_signoff',
category: 'insert',
categoryName: '元素与排版',
title: '如何插入质量签字栏(SIGNOFF)?',
title: '如何插入质量签字确认栏(SIGNOFF)?',
keywords: ['签字', '签字点', 'signoff', '签章', '工作者', '检查者', 'per.by', 'insp.by', '签署', '质检', 'qz', 'qianzi'],
synonyms: ['怎么加签字栏', '工作者签字', '检查者签字', '添加签署框', '签字表格'],
answer: '质量签字栏用于在工卡关键步骤后附加工作者(Per.By)、检查者(Insp.By)或质量员签章框。',
answer: '质量签字栏用于在工卡关键步骤后附加工作者(Per.By)、检查者(Insp.By)或检验员签章框。',
steps: [
'在需要签字确认的步骤节点处,点击顶部工具栏的【签字点】按钮。',
'选择签字类型(单人签署、双人互检、带工卡编号签章栏等)。',
'确认后自动生成标准工卡签字表格,打印和预览时均可完整呈现。'
'在弹窗中选择符合航空规范的【签字等级 (CK-LEVEL)】。',
'确认后自动生成标准工卡签字表格,打印和预览时均呈现为符合航空物理黑实线边框标准。'
],
highlights: ['导出的签字栏在纸质打印与电子签署场景下均采用符合规范的物理黑实线边框保障。'],
actions: [{ label: '插入签字点', type: 'event', payload: 'trigger_insert_signoff' }],
......@@ -165,28 +172,13 @@ export const FAQ_DATABASE: FaqItem[] = [
category: 'insert',
categoryName: '元素与排版',
title: '如何插入单选 / 多选项组(SELECTION)?',
keywords: [
'单选',
'多选',
'选项组',
'selection',
'checkbox',
'radio',
'选择题',
'勾选项',
'符合性',
'xx',
'xuanxiang',
'dx',
'danxuan',
'duoxuan'
],
keywords: ['单选', '多选', '选项组', 'selection', 'checkbox', 'radio', '选择题', '勾选项', '符合性', 'xx', 'xuanxiang', 'dx', 'danxuan', 'duoxuan'],
synonyms: ['怎么加勾选框', '添加单选框', '插入选项', '添加符合性检查', '多选框'],
answer: '选项组用于在工卡执行中提供符合性判断(如“合格/不合格”、“换件/原装”)。',
steps: [
'定位到需要添加选择分支的节点,点击工具栏【选项组】。',
'设置选项模式(单选 Radio / 多选 Checkbox),并添加各个选项的中英文描述。',
'点击插入后,工卡中将展示规范的勾选卡片。'
'定位到需要添加选择分支的节点,点击顶部工具栏【选项组】。',
'在弹窗中设置【标题 (TAG)】、【单选/多选 (MULTI)】、【排列方式 (横向/纵向)】及【是否必填】。',
'点击插入后,工卡中将生成规范的勾选卡片容器,供机务人员在操作时确认符合性。'
],
actions: [{ label: '插入选项组', type: 'event', payload: 'trigger_insert_selection' }],
relatedQuestions: ['faq_insert_record_line', 'faq_insert_signoff'],
......@@ -201,9 +193,9 @@ export const FAQ_DATABASE: FaqItem[] = [
synonyms: ['怎么加填空下划线', '记录实测数据', '添加测量值', '下划线输入', '实测值'],
answer: '数据记录项用于生成带有下划线填报区域和工程单位(如 mm、Ω、V、psi)的数据输入行。',
steps: [
'点击工具栏的【数据记录项】按钮。',
'输入测试项目名称(如“电阻测量值”)、预设默认值与单位(如“Ω”)。',
'生成后将在工卡中展示规范的下划线填空区域。'
'在左侧树或编辑区定位到目标位置(如步骤内部)。',
'点击顶部工具栏的【数据记录项】按钮,系统在 DTD 校验通过后自动就地插入标准记录项。',
'在编辑区中可直接录入测试项目名称、预设值与工程单位,生成规范的下划线填空区域。'
],
relatedQuestions: ['faq_insert_signoff', 'faq_insert_selection'],
contextTags: ['RECORD-LINE', 'RECORD', 'RECORD-ITEMS']
......@@ -231,9 +223,9 @@ export const FAQ_DATABASE: FaqItem[] = [
title: '如何自定义插入 XML 代码片段?',
keywords: ['xml片段', '代码片段', 'fragment', '源码插入', 'warning', 'caution', 'note', '手写xml', 'pd', 'pianduan', 'daima'],
synonyms: ['怎么直接写xml', '插入自定义代码', '粘贴xml标签', '手写标签'],
answer: '如果您有准备好的 XML 片段(例如整段 WARNING 或特殊标签),可以使用 XML 片段工具快速注入。',
answer: '如果您有准备好的 XML 片段(例如整段 WARNING 或特殊标签结构),可以使用 XML 片段工具快速注入。',
steps: [
'在工具栏点击【XML片段】按钮。',
'在顶部工具栏点击【XML片段】按钮。',
'在弹出编辑器中粘贴或编写 XML 字符串(支持代码高亮与自动缩进)。',
'系统会自动校验 XML 语法合法性并转换为节点树,插入到指定位置。'
],
......@@ -254,257 +246,362 @@ export const FAQ_DATABASE: FaqItem[] = [
'【NOTE(注意)】:代表操作要点与补充说明,呈现为蓝色物理着色。',
'可通过顶部工具栏【模板】选择或使用【XML片段】直接注入。'
],
highlights: ['此类具有强制规范色彩的节点在暗黑模式及 PDF 导出时均保持标准物理颜色呈现。'],
highlights: ['此类具有强制规范色彩的节点在暗黑模式及 PDF/HTML 导出时均保持标准物理颜色呈现。'],
actions: [{ label: '打开模板库', type: 'event', payload: 'trigger_insert_template' }],
relatedQuestions: ['faq_insert_template', 'faq_insert_fragment'],
contextTags: ['WARNING', 'CAUTION', 'NOTE']
relatedQuestions: ['faq_insert_note_variants', 'faq_insert_template', 'faq_insert_fragment'],
contextTags: ['WARNING', 'CAUTION', 'NOTE'],
isHot: true
},
{
id: 'faq_insert_note_variants',
category: 'insert',
categoryName: '元素与排版',
title: '什么是 HNANOTE、ACPANOTE 等特殊 NOTE 变体标签?',
keywords: ['note变体', 'hnanote', 'acpanote', 'apapnote', 'eappnote', 'intnote', 'specnote', 'bt', 'bianti'],
synonyms: ['特殊note标签', 'hnanote怎么用', '各类note区别', '注意变体标签'],
answer: '航空 DTD 中为适应不同的机型与业务规范,定义了多种 NOTE 变体标签:',
steps: [
'【HNANOTE】:海南航空等特定航司定制注意事项。',
'【ACPANOTE / APAPNOTE】:针对飞机改装与特定批次程序的专用说明。',
'【INTNOTE / SPECNOTE】:内部参考说明与技术规范专用附注。',
'渲染器会自动采用 NOTE 的标准蓝底框样式并展示其专属业务标签名。'
],
relatedQuestions: ['faq_insert_alert', 'faq_dtd_validate'],
contextTags: ['HNANOTE', 'ACPANOTE', 'APAPNOTE', 'EAPPNOTE', 'INTNOTE', 'SPECNOTE']
},
{
id: 'faq_insert_inline_ref',
category: 'insert',
categoryName: '元素与排版',
title: '如何在文本中插入交叉引用(REFBLOCK / REFINT)与功能号(EIN)?',
keywords: [
'引用',
'refblock',
'refint',
'refext',
'ein',
'功能号',
'grphcref',
'交叉引用',
'附图引用',
'yy',
'yinyong',
'gnh',
'gongnenghao'
],
synonyms: ['怎么加引用', '怎么关联其他章节', '插入功能号', '图纸引用'],
keywords: ['引用', 'refblock', 'refint', 'refext', 'ein', '功能号', 'grphcref', '交叉引用', '附图引用', 'yy', 'yinyong', 'gnh', 'gongnenghao'],
synonyms: ['怎么加引用', '怎么关联其他章节', '插入功能号', '图纸引用', '添加适用性'],
answer: '在富文本编辑段落(PARAC/PARA)中,支持插入符合航空标准的一系列行内引用与标识:',
steps: [
'【REFBLOCK / REFINT / REFEXT】:内部与外部交叉引用,以蓝色文本呈现。',
'【EIN / EINMFR】:电气与功能识别号,以蓝色带下划线格式呈现。',
'【GRPHCREF】:工卡附图引用,点击可联动弹出对应附图大图。',
'【EFFECT / CONEFFECT】:适用性说明,以红色斜体格式规范呈现。'
'【EFFECT / CONEFFECT】:适用性说明,以红色斜体格式规范呈现。',
'【TOR / TORVALUE】:扭矩力矩值标注。'
],
highlights: ['所有行内元素均可在文本块编辑器中就地编辑与删除。'],
relatedQuestions: ['faq_insert_graphic', 'faq_node_locate'],
contextTags: ['REFBLOCK', 'REFINT', 'REFEXT', 'EIN', 'GRPHCREF', 'EFFECT']
highlights: ['所有行内元素均可在文本块编辑器中以胶囊卡片(Pill)形式就地编辑与删除。'],
relatedQuestions: ['faq_insert_sub_super', 'faq_text_block_editor', 'faq_insert_graphic'],
contextTags: ['REFBLOCK', 'REFINT', 'REFEXT', 'EIN', 'EINMFR', 'GRPHCREF', 'EFFECT', 'CONEFFECT', 'TOR', 'TORVALUE']
},
{
id: 'faq_insert_sub_super',
category: 'insert',
categoryName: '元素与排版',
title: '如何在富文本中插入上标(SUPER)与下标(SUB)?',
keywords: ['上标', '下标', 'super', 'sub', 'superscript', 'subscript', '平方', '化学式', 'sb', 'shangbiao', 'xb', 'xiabiao'],
synonyms: ['怎么打上标', '怎么打下标', '公式上下标', '平方米符号'],
answer: '系统支持标准航空 DTD 的上标(SUPER / SUPERSCRIPT)与下标(SUB / SUBSCRIPT)排版:',
steps: [
'在段落编辑器(TextBlockEditor)中,将光标移动到需要插入上下标的位置。',
'插入 `<SUPER>`(如面积单位 $m^2$)或 `<SUB>`(如化学式 $H_2O$)。',
'在编辑区与最终打印预览中均会精准渲染为垂直偏移的上下标字体。'
],
relatedQuestions: ['faq_insert_inline_ref', 'faq_text_block_editor'],
contextTags: ['SUPER', 'SUPERSCRIPT', 'SUB', 'SUBSCRIPT']
},
{
id: 'faq_insert_list',
category: 'insert',
categoryName: '元素与排版',
title: '如何插入和管理多级有序/无序列表(LIST1-LIST7)?',
keywords: ['列表', 'list', 'list1', 'l1item', '有序列表', '无序列表', '层级缩进', '多级列表', 'lb', 'liebiao'],
synonyms: ['怎么加列表', '多级序号', '缩进列表', '列表条目'],
keywords: ['列表', 'list', 'list1', 'l1item', '有序列表', '无序列表', '层级缩进', '多级列表', 'unlist', 'numlist', 'lb', 'liebiao'],
synonyms: ['怎么加列表', '多级序号', '缩进列表', '列表条目', '加项目符号'],
answer: '系统全面支持 DTD 标准的 1~7 级有序列表(LIST1 ~ LIST7)与无序列表(UNLITEM):',
steps: [
'在节点树右键选择【插入子节点】 $\\rightarrow$ 【LIST1】。',
'在节点树右键选择【添加子节点】 $\\rightarrow$ 【LIST1】。',
'在列表容器下插入列表条目(如 L1ITEM、L2ITEM)。',
'系统在右侧编辑区自动计算层级缩进并渲染多层中英文列表结构。'
'系统在右侧编辑区自动计算层级缩进,并按罗马数字(i, ii..)、字母(a, b..)、阿拉伯数字自动计算编号。'
],
highlights: ['支持多层级嵌套与无序列表混合排版,层级缩进与打印样式严格对齐。'],
relatedQuestions: ['faq_node_tree_ops', 'faq_insert_template'],
contextTags: ['LIST1', 'LIST2', 'LIST3', 'LIST4', 'LIST5', 'LIST6', 'LIST7', 'L1ITEM', 'UNLITEM']
contextTags: ['LIST1', 'LIST2', 'LIST3', 'LIST4', 'LIST5', 'LIST6', 'LIST7', 'L1ITEM', 'UNLITEM', 'UNLIST', 'NUMLIST']
},
// ══════════════ 2. 文件管理与导出 (file) ══════════════
{
id: 'faq_import_xml',
category: 'file',
categoryName: '文件与导出',
title: '如何导入外部 XML 文件?',
keywords: ['导入', '上传', '打开', 'import', 'xml导入', '加载工卡', '本地文件', 'dr', 'daoru', 'sc', 'shangchuan'],
synonyms: ['怎么上传xml', '导入工卡文件', '怎么打开本地xml', '打开已有工卡'],
answer: '系统支持一键导入符合规范的标准工卡 XML 文件,并自动解析为可视化节点树。',
id: 'faq_composite_containers',
category: 'insert',
categoryName: '元素与排版',
title: '什么是复合结构特殊容器(CBDATA / TED / CON / EXPD 等)?',
keywords: ['复合容器', 'cbdata', 'ted', 'con', 'graphic', 'eindata', 'expd', '断路器', '工具', '消耗品', 'fh', 'fuhe', 'dlq', 'duanluqi'],
synonyms: ['怎么加断路器', '工具清单怎么做', '消耗品表格', '复合结构说明', '零件爆炸图数据'],
answer: '针对航空标准中具有固定多列结构或成对渲染的特殊业务实体,系统采用复合结构容器:',
steps: [
'点击工具栏的【导入 XML】按钮。',
'在弹出的文件选择器中选中您的 `.xml` 文件。',
'系统解析成功后,左侧节点树和右侧可视化编辑区将立即同步更新内容。'
'【CBDATA】:电路断路器数据行(包含 PAN、CBNAME、CB、CBLOC 四列数据)。',
'【TED】:专用工具行(包含 TOOLNAME 工具名与 TOOLNBR 件号)。',
'【CON】:消耗品材料行(包含 CONNAME 消耗品名与 CONNBR 件号)。',
'【EINDATA】:功能号适用性行(包含 EIN 功能号与相关属性)。',
'【EXPD】:爆炸图零件项(包含 EXPDNAME、CSN 与 ITEMNBR)。'
],
highlights: ['导入前建议使用【本地暂存】保存当前未完成的编辑内容,以防被覆盖。'],
actions: [{ label: '导入 XML 文件', type: 'event', payload: 'trigger_import_xml' }],
relatedQuestions: ['faq_export_xml', 'faq_stash_manager'],
isHot: true
highlights: ['复合容器下的各个子元素均支持就地独立编辑、独立高亮与属性联动。'],
relatedQuestions: ['faq_node_locate', 'faq_insert_table'],
contextTags: ['CBDATA', 'TED', 'CON', 'EINDATA', 'EXPD', 'CBSUBLST']
},
{
id: 'faq_export_xml',
category: 'file',
categoryName: '文件与导出',
title: '如何导出编辑好的工卡 XML 文件?',
keywords: ['导出', '下载', 'export', '保存为xml', '导出xml', '生成xml', '保存工卡', 'dc', 'daochu', 'xz', 'xiazai'],
synonyms: ['怎么下载xml', '工卡怎么导出', '保存到本地电脑', '下载xml文件'],
answer: '系统会将当前可视化的所有节点与属性实时序列化为符合航空规范的完整 XML 文件。',
id: 'faq_text_block_editor',
category: 'insert',
categoryName: '元素与排版',
title: '富文本混合内容(Mixed Content)与行内标签卡片是如何编辑的?',
keywords: ['混合内容', 'mixed content', 'textblock', '富文本', '行内标签', '胶囊', '切片', '双语对照', 'fwb', 'fuwenben', 'qp', 'qiepian'],
synonyms: ['文本块怎么编辑', '段落里怎么插标签', '行内标签怎么改', '段落编辑器用法'],
answer: 'TextBlockEditor 采用智能切片(Slices)架构处理纯文本与行内标签的混合内容:',
steps: [
'在工具栏点击【导出 XML】按钮。',
'弹出下载确认窗口,可自定义导出文件名(默认带有时间戳,如 `WORK_CARD_YYYYMMDDHHmmss.xml`)。',
'点击下载即可保存到本地磁盘。'
'文本内容与行内标签被切片为独立的交互卡片,直观呈现。',
'点击行内标签卡片可直接修改其属性(如 REFINT 目标、EIN 件号)。',
'点击卡片右侧删除按钮可快速移除该行内标签。',
'中英文段落(PARAC 与 PARA)上下并列展示,方便对照校对。'
],
highlights: ['导出的 XML 严格包含 XML 声明及 DTD 格式标准。'],
actions: [{ label: '立即导出 XML', type: 'event', payload: 'trigger_export_xml' }],
relatedQuestions: ['faq_import_xml', 'faq_download_html', 'faq_preview_card'],
isHot: true
highlights: ['失焦时自动将切片序列化回标准 XML 混合内容结构,杜绝 XML 标签闭合错误。'],
relatedQuestions: ['faq_insert_inline_ref', 'faq_insert_sub_super', 'faq_node_single_translate'],
contextTags: ['PARA', 'PARAC', 'TITLE', 'TITLEC', 'TXTLINE']
},
{
id: 'faq_preview_card',
category: 'file',
categoryName: '文件与导出',
title: '如何预览工卡的实际排版和打印效果?',
keywords: ['预览', 'preview', '预览工卡', '查看效果', '打印预览', '查看排版', 'a4预览', 'yl', 'yulan', 'dy', 'dayin'],
synonyms: ['怎么看打印效果', '预览工卡长什么样', '全屏预览', '打印效果'],
answer: '点击工具栏显著的蓝色【预览工卡】按钮,即可进入全屏工卡排版预览模式。',
id: 'faq_empty_markers',
category: 'insert',
categoryName: '元素与排版',
title: '修订标记(REVST / REVEND)等空标签在工卡中起到什么作用?',
keywords: ['修订标记', 'revst', 'revend', '空标签', 'empty', 'cocst', 'cocend', 'coceff', 'xd', 'xiuding', 'kbq', 'kongbiaoqian'],
synonyms: ['revst是什么', '修订起止标签', '空标记节点', '修订竖线'],
answer: '在航空手册中,空标记节点(DTD contentModel = EMPTY)用于标识业务元数据:',
steps: [
'点击工具栏右上方的【预览工卡】。',
'系统将在全屏弹窗中以真实 A4/打印样式渲染整份工卡(包含表格、附图、双语对照、签字栏及分页符)。',
'在预览窗口中可直接调用系统打印(Ctrl+P)或缩放查看。'
'【REVST / REVEND】:标记工卡修订内容的起点与终点,在打印时呈现为页边修订黑竖线(Revision Bar)。',
'【COCST / COCEND】:适航符合性确认标记。',
'【ISEMPTY / DELETED】:废弃或空白占位标记。',
'系统在渲染时智能过滤空文本,避免产生界面杂乱,同时完整保留其 XML 语义。'
],
actions: [{ label: '立即预览工卡', type: 'event', payload: 'trigger_preview' }],
relatedQuestions: ['faq_download_html', 'faq_export_xml'],
relatedQuestions: ['faq_dtd_validate', 'faq_export_xml'],
contextTags: ['REVST', 'REVEND', 'COCST', 'COCEND', 'COCEFF', 'ISEMPTY', 'DELETED']
},
// ══════════════════════════════════════════════════════════════
// 2. 表格高级编辑 (table)
// ══════════════════════════════════════════════════════════════
{
id: 'faq_insert_table',
category: 'table',
categoryName: '表格编辑',
title: '如何插入和创建标准航空表格(TABLE)?',
keywords: ['表格', 'table', '插入表格', '行', '列', '表头', 'cals', 'tgroup', 'thead', 'tbody', 'row', 'entry', 'bg', 'biaoge'],
synonyms: ['怎么建表格', '如何画表格', '添加表格', '新建表格', '航空表格'],
answer: '系统内置完整的专业航空 CALS 表格生成器,支持自定义行列数与初始化单元格段落结构。',
steps: [
'在左侧树或编辑区选中目标位置,点击顶部工具栏的【表格】按钮。',
'设置表格的初始【行数】(1~50)、【列数】(1~20),并勾选单元格初始化的子段落标签(如 PARAC、PARA)。',
'点击确认后即可生成表格,在右侧可视化编辑区中直接呈现。'
],
highlights: ['导出的表格严格遵循 CALS Table / OASIS Table 航空 DTD 标准规范。'],
actions: [{ label: '插入表格', type: 'event', payload: 'trigger_insert_table' }],
relatedQuestions: ['faq_table_cell_edit', 'faq_table_merge_cells', 'faq_table_row_col_ops'],
contextTags: ['TABLE', 'TGROUP', 'THEAD', 'TBODY', 'ROW', 'ENTRY', 'COLSPEC'],
isHot: true
},
{
id: 'faq_download_html',
category: 'file',
categoryName: '文件与导出',
title: '如何下载离线 HTML 格式工卡?',
keywords: ['下载html', 'html', '离线查看', '网页版', '下载网页', '静态工卡', '单文件', 'lx', 'lixian', 'wye'],
synonyms: ['怎么导出html', '下载离线网页', '保存为html', '导出网页'],
answer: '【下载html】功能会将整份工卡及其所有排版样式打包为一个独立的单文件 HTML。',
id: 'faq_table_cell_edit',
category: 'table',
categoryName: '表格编辑',
title: '单元格如何就地编辑与双语输入?',
keywords: ['单元格编辑', '输入文字', '表格修改', '就地编辑', '双语表格', 'dyg', 'danyange', 'sr', 'shuru'],
synonyms: ['怎么改单元格内容', '表格里怎么写字', '单元格怎么改', '表格双语输入'],
answer: '系统支持极速直观的单元格就地(In-place)编辑模式:',
steps: [
'点击工具栏的【下载html】按钮。',
'浏览器将下载包含完整样式表、中英文排版、附图的 `.html` 文件。',
'双击该 HTML 文件即可在任何无网电脑、手机或平板浏览器中直接查阅与打印。'
'鼠标直接点击任意单元格,单元格即可获得焦点并进入编辑状态。',
'录入中文或英文文本,光标离开(Blur)或切换单元格时系统自动保存。',
'支持在单元格内同时包含中文(PARAC)和英文(PARA)双语段落。'
],
actions: [{ label: '下载 HTML', type: 'event', payload: 'trigger_download_html' }],
relatedQuestions: ['faq_preview_card', 'faq_export_xml']
highlights: ['编辑内容实时同步至底层 XML 数据树中,支持快捷键 Ctrl+Z 撤销修改。'],
relatedQuestions: ['faq_table_cell_selection', 'faq_table_merge_cells', 'faq_shortcuts'],
contextTags: ['ENTRY', 'ROW', 'TABLE']
},
{
id: 'faq_stash_manager',
category: 'file',
categoryName: '文件与导出',
title: '什么是“本地暂存(Stash)”?如何防丢失?',
keywords: ['暂存', '本地暂存', 'stash', '草稿', '恢复', '防丢失', '版本', '历史暂存', '备份', 'zc', 'zancun', 'cg', 'caogao'],
synonyms: ['怎么存草稿', '电脑关了数据还在吗', '怎么备份当前工卡', '恢复暂存', '暂存版本'],
answer: '本地暂存功能类似于 Git Stash,能够将您当前编辑的工卡快照保存在本地浏览器中,防止意外刷新或关闭导致数据丢失。',
id: 'faq_table_cell_selection',
category: 'table',
categoryName: '表格编辑',
title: '如何单选、多选(Ctrl+点击)单元格?',
keywords: ['单元格多选', '选择单元格', 'ctrl点击', '多选', '批量选择', 'dx', 'duoxuan', 'xz', 'xuanze'],
synonyms: ['怎么选多个单元格', '按住ctrl选单元格', '连续选中单元格', '多选做合并'],
answer: '表格支持灵活的单选与多选单元格交互,为批量操作与单元格合并提供支持:',
steps: [
'在工具栏点击【本地暂存】按钮。',
'点击“新建暂存”,输入备注名称(如“发动机大修第一版”),系统立即保存当前完整状态。',
'随时可在暂存列表中查看历史快照、对比变动或一键【恢复】到对应版本。'
'【单选】:直接点击任意单元格即可选中。',
'【多选】:按住键盘【Ctrl】键(Mac 上为 Command 键),依次点击多个单元格进行多选。',
'选中多个单元格后,右键或点击工具栏可进行批量合并或格式设置。'
],
highlights: ['暂存数据存储在本地持久化存储中,即使关闭浏览器或重启电脑也能随时找回。'],
actions: [{ label: '打开本地暂存', type: 'event', payload: 'trigger_stash' }],
relatedQuestions: ['faq_export_xml', 'faq_compare_card'],
highlights: ['选中的单元格会以主色调高亮边框和半透明背景醒目呈现。'],
relatedQuestions: ['faq_table_merge_cells', 'faq_table_cell_edit', 'faq_shortcuts'],
contextTags: ['ENTRY', 'TABLE']
},
{
id: 'faq_table_merge_cells',
category: 'table',
categoryName: '表格编辑',
title: '如何进行多单元格合并(跨行跨列)及选择保留内容?',
keywords: ['合并单元格', '合并', '跨行', '跨列', 'colspan', 'rowspan', '保留内容', 'morerows', 'namest', 'nameend', 'hb', 'hebing'],
synonyms: ['怎么合并单元格', '把两个格子合并', '跨行跨列怎么做', '合并保留哪些文字'],
answer: '系统提供强大的 TableMergeModal 合并弹窗,支持自由跨行跨列合并与内容保留策略:',
steps: [
'按住【Ctrl】键点击选中需要合并的相邻单元格。',
'右键选择【合并单元格】打开合并管理弹窗。',
'选择合并后保留的内容策略:',
' · 【保留全部】:将所有被合并单元格中的文本以换行拼接保留。',
' · 【仅保留首格】:仅保留左上角第一个单元格的文本,清空其余。',
' · 【自定义】:手动勾选需要保留的单元格内容。',
'点击确认后,系统自动生成合规的 `morerows` 与 `namest/nameend` 属性。'
],
highlights: ['严格遵循 CALS Table 规范,保证导出到外部系统时不发生表格错位。'],
relatedQuestions: ['faq_table_split_cell', 'faq_table_cell_selection', 'faq_table_batch_ops'],
contextTags: ['ENTRY', 'ROW', 'TGROUP', 'TABLE'],
isHot: true
},
{
id: 'faq_xml_size',
category: 'file',
categoryName: '文件与导出',
title: '如何查看当前工卡的文档体积与字数统计?',
keywords: ['大小', '体积', '文档统计', 'xml大小', '字数', '节点数', '性能', 'dx', 'daxiao', 'tj', 'tiji'],
synonyms: ['怎么看工卡有多大', '文件大小', '查看字数'],
answer: '在顶部工具栏右侧偏好设置旁,实时显示当前文档的序列化大小(如 `18.5 KB`)。',
id: 'faq_table_split_cell',
category: 'table',
categoryName: '表格编辑',
title: '如何拆分已合并的单元格?',
keywords: ['拆分单元格', '取消合并', '拆分', '还原单元格', 'split', 'cf', 'chaifen'],
synonyms: ['怎么把合并的格子拆开', '取消单元格合并', '拆分表格'],
answer: '对于已合并(包含跨行或跨列)的单元格,可以随时一键拆分还原:',
steps: [
'系统在每次编辑、新增节点或修改文本后,后台自动计算当前 XML 树的完整体积。',
'如果工卡体积过大,可通过折叠非当前编辑节点或拆分子工卡提升编辑流畅度。'
'选中已经合并的单元格。',
'右键菜单中选择【拆分单元格】。',
'系统会自动移除 `morerows` 与 `namest/nameend` 跨度属性,补齐被占位的独立单元格并保留原始内容。'
],
relatedQuestions: ['faq_export_xml', 'faq_shortcuts']
relatedQuestions: ['faq_table_merge_cells', 'faq_table_cell_edit'],
contextTags: ['ENTRY', 'ROW', 'TABLE']
},
// ══════════════ 3. 翻译与对比 (translate) ══════════════
{
id: 'faq_batch_translate',
category: 'translate',
categoryName: '翻译与对比',
title: '如何进行中英文“批量翻译”?',
keywords: ['翻译', '批量翻译', 'translate', '中英文', '英译中', '中译英', '自动翻译', '语言', 'para', 'parac', 'fy', 'fanyi', 'plfy'],
synonyms: ['怎么一键翻译', '自动把英文转中文', '中英文对照生成', '批量翻译工卡'],
answer: '系统提供智能航空术语批量翻译引擎,能够一键扫描工卡中所有待翻译节点并自动填入对应译文。',
id: 'faq_table_row_col_ops',
category: 'table',
categoryName: '表格编辑',
title: '如何快速插入行、插入列或追加行列?',
keywords: ['插入行', '插入列', '增行', '增列', '删除行', '删除列', '追加行', '追加列', 'zh', 'zenghang', 'zl', 'zenglie'],
synonyms: ['怎么加一行', '怎么加一列', '怎么删掉一行', '末尾追加行', '末尾追加列'],
answer: '在表格任意单元格上右键,可呼出丰富的行列操作上下文菜单:',
steps: [
'在顶部工具栏点击【批量翻译】按钮。',
'系统弹窗展示待翻译词条统计(英文段落 PARA 与中文段落 PARAC)。',
'点击开始翻译,系统后台自动调用航空专业翻译服务,并高亮展示翻译进度。',
'翻译完成后可一键应用回工卡树中。'
'【在上方插入行 / 在下方插入行】:在当前行相邻位置插入新行。',
'【在末尾追加行】:在表格最底部快速新增一行。',
'【在左侧插入列 / 在右侧插入列】:在当前列相邻位置插入新列并自动重算列宽。',
'【在末尾追加列】:在表格最右侧追加新列。',
'【删除行 / 删除列】:安全删除当前所在行或所在列。'
],
highlights: ['翻译结果优先匹配专业航空机务词典,确保术语标准规范。'],
actions: [{ label: '批量翻译', type: 'event', payload: 'trigger_batch_translate' }],
relatedQuestions: ['faq_extract_translate', 'faq_search_translate'],
isHot: true
highlights: ['系统在增删列时会自动同步维护 `<COLSPEC>` 规范列表,确保列宽定义完整。'],
relatedQuestions: ['faq_table_batch_ops', 'faq_table_colspec', 'faq_table_merge_cells'],
contextTags: ['ROW', 'ENTRY', 'COLSPEC', 'TABLE']
},
{
id: 'faq_extract_translate',
category: 'translate',
categoryName: '翻译与对比',
title: '如何“提取翻译”对照条目?',
keywords: ['提取翻译', '对照表', 'extract', '词条提取', '双语对照', '导出词条', '语料', 'tqfy', 'tiqu'],
synonyms: ['怎么把翻译单独导出来', '提取所有中英文', '导出双语表'],
answer: '提取翻译功能可将整份工卡中的全部中英文对照对(PARA / PARAC)汇总抽取为结构化清单。',
id: 'faq_table_batch_ops',
category: 'table',
categoryName: '表格编辑',
title: '如何使用批量操作弹窗一次性增删多行 / 多列?',
keywords: ['批量增删', '批量加行', '批量加列', '批量删除行', '批量操作', 'tablebatch', 'pl', 'piliang'],
synonyms: ['怎么一次加5行', '批量插入多列', '一次删多行', '表格批量管理'],
answer: '通过 TableBatchModal 弹窗可以极其高效地批量操作大型表格:',
steps: [
'点击工具栏的【提取翻译】按钮。',
'在弹出面板中浏览工卡内所有的双语对照条目。',
'支持按关键词检索、筛选未翻译条目,或复制/导出对照清单。'
'在单元格右键菜单中选择【批量操作】 $\\rightarrow$ 【批量插入/删除】。',
'在弹出的批量操作窗口中,输入想要插入或删除的数量(如“插入 10 行”)。',
'点击确认,系统瞬间在当前位置完成连续多行/多列的生成或清理。'
],
actions: [{ label: '提取翻译对照', type: 'event', payload: 'trigger_extract_translate' }],
relatedQuestions: ['faq_batch_translate', 'faq_search_translate']
relatedQuestions: ['faq_table_row_col_ops', 'faq_table_cell_selection'],
contextTags: ['TABLE', 'ROW', 'ENTRY', 'TGROUP']
},
{
id: 'faq_search_translate',
category: 'translate',
categoryName: '翻译与对比',
title: '如何“搜索翻译”数据库与专业词典?',
keywords: ['搜索翻译', '查词典', '术语库', '词库', 'search translate', '航空术语', '词汇查询', 'ssfy', 'sousuo', 'cidian'],
synonyms: ['怎么查专业单词', '机务词汇查询', '搜索翻译库', '专业英语查词'],
answer: '内置航空机务专业翻译语料库,可随时查询专业术语的标准中文/英文翻译。',
id: 'faq_table_cell_alignment',
category: 'table',
categoryName: '表格编辑',
title: '如何调整单元格文本对齐方式(左对齐/居中/右对齐/两端对齐)?',
keywords: ['对齐', '居中', '左对齐', '右对齐', '两端对齐', 'align', 'valign', '排版', 'dq', 'duiqi', 'jz', 'juzhong'],
synonyms: ['单元格文字怎么居中', '表格文字靠右', '对齐方式怎么改', '水平对齐'],
answer: '系统支持精准设置单元格的水平与垂直对齐属性:',
steps: [
'点击工具栏的【搜索翻译】按钮。',
'输入中文或英文关键词(例如“Torque wrench”、“Safety wire”、“液压管路”)。',
'即时查看权威匹配释义与上下文例句,并支持一键复制到剪贴板。'
'选中需要调整对齐的单元格(支持单选或 Ctrl 多选)。',
'在右侧属性抽屉或右键【对齐方式】中选择:',
' · 【左对齐 (Left)】:适合常规文本描述。',
' · 【居中对齐 (Center)】:适合序号、数量 QTY、状态标记。',
' · 【右对齐 (Right)】:适合数值、件号与金额。',
' · 【两端对齐 (Justify)】:适合长段落排版。'
],
actions: [{ label: '搜索翻译词典', type: 'event', payload: 'trigger_search_translate' }],
relatedQuestions: ['faq_batch_translate', 'faq_extract_translate']
highlights: ['对齐设置将直接转换为 CALS 标准属性 `align="center"` 等,导出时永久保留。'],
relatedQuestions: ['faq_table_cell_edit', 'faq_attribute_editor'],
contextTags: ['ENTRY', 'COLSPEC']
},
{
id: 'faq_compare_card',
category: 'translate',
categoryName: '翻译与对比',
title: '如何使用“对比工卡”查看两份工卡的差异?',
keywords: ['对比', '对比工卡', 'compare', 'diff', '版本对比', '改动', '差异', '修改记录', '比对', 'db', 'duibi', 'chayi'],
synonyms: ['怎么看修改了哪里', '两份工卡怎么对比', '比对不同版本', '差异对比'],
answer: '对比工卡功能基于强大的 Diff 算法,直观高亮展示两份工卡在节点结构、文本内容、表格及属性上的增删改变动。',
id: 'faq_table_colspec',
category: 'table',
categoryName: '表格编辑',
title: '表格列宽调整与 COLSPEC 规范是如何工作的?',
keywords: ['列宽', 'colspec', 'colwidth', '列宽调整', '比例分配', '表格宽度', 'lk', 'liewan', 'kb', 'kuanbi'],
synonyms: ['怎么调列宽', '列宽太窄怎么变宽', '表格各列宽度比例', 'colspec是什么'],
answer: '航空 CALS 表格通过 `<COLSPEC>` 标签定义每列的名称(colname)与宽度比例(colwidth):',
steps: [
'在工具栏点击【对比工卡】按钮。',
'选择或上传待比对的目标工卡文件(也可以选择与本地暂存版本比对)。',
'系统以双栏分屏或统一 Diff 视图展示:绿色表示新增、红色表示删除、黄色表示修改。'
'系统在生成表格时,根据列数自动计算等宽或标准比例(如 `1*`, `2*` 或具体毫米/英寸)。',
'在右侧属性面板中选中 COLSPEC 节点,可直接修改其 `colwidth` 属性值。',
'渲染器会自动根据列宽权重进行弹性伸缩排版,在打印与 PDF 导出时保持完美比例。'
],
actions: [{ label: '打开对比工卡', type: 'event', payload: 'trigger_compare' }],
relatedQuestions: ['faq_stash_manager', 'faq_export_xml'],
isHot: true
relatedQuestions: ['faq_table_row_col_ops', 'faq_table_alignment'],
contextTags: ['COLSPEC', 'TGROUP', 'TABLE']
},
{
id: 'faq_table_complex_cells',
category: 'table',
categoryName: '表格编辑',
title: '表格单元格内如何嵌套列表、警告块或附图等复杂内容?',
keywords: ['复杂单元格', '单元格嵌套', '表格嵌列表', '表格嵌图片', 'complex entry', 'fz', 'fuzadanyange'],
synonyms: ['表格里能放图片吗', '单元格里加列表', '单元格放警告', '复杂表格内容'],
answer: '本系统深度支持 CALS 表格的高级复杂特性(Complex Entry):',
steps: [
'当单元格内包含 `<UNLIST>`(无序列表)、`<LIST1>`(有序列表)、`<WARNING>`(警告块)或 `<GRAPHIC>`(附图)等复杂子标签时。',
'系统自动切换为高级 DocNodeRenderer 渲染引擎,在单元格内呈现完整的富文本块与可视化卡片。',
'支持在单元格内部进行多级缩进、列表条目增删及大图查看。'
],
highlights: ['完美突破普通表格仅能输入单行文本的限制,100% 满足航空技术手册复杂表格规范。'],
relatedQuestions: ['faq_insert_table', 'faq_insert_list', 'faq_insert_alert'],
contextTags: ['ENTRY', 'UNLIST', 'LIST1', 'WARNING', 'GRAPHIC']
},
// ══════════════ 4. 节点树与结构 (tree) ══════════════
// ══════════════════════════════════════════════════════════════
// 3. 节点树与大纲 (tree)
// ══════════════════════════════════════════════════════════════
{
id: 'faq_node_tree_ops',
category: 'tree',
categoryName: '节点树结构',
categoryName: '节点树与大纲',
title: '左侧节点树有哪些操作?右键菜单怎么用?',
keywords: ['节点树', '右键菜单', '删除节点', '重命名', '复制', '剪切', '粘贴', '新增节点', '结构树', 'jds', 'jiedian', 'yj', 'youjian'],
synonyms: ['怎么删节点', '右键有哪些功能', '怎么复制节点', '修改节点名称', '树菜单'],
answer: '左侧节点树展示工卡的层级骨架(DOM 树结构),支持丰富的右键上下文菜单操作:',
steps: [
'【右键菜单】:在任意节点上右键,可选择:',
' · 向上插入同级节点 / 向下插入同级节点',
' · 插入子节点(如在 TASK 下插入 STEP)',
' · 复制 (Copy) / 剪切 (Cut) / 粘贴 (Paste)',
' · 重命名节点标签名 / 删除节点 (Delete)',
' · 快速查看并编辑该节点的 XML 属性'
'【查看与辅助】:查看XML源码、查看DTD规则模型、中文节点智能翻译回填。',
'【复制 / 粘贴 / 暂存】:复制节点、粘贴到上方/下方/内部、粘贴XML代码、本地单节点暂存。',
'【节点编辑与结构调整】:编辑节点属性、添加子节点、插入到上方/下方、编辑顺序(上移/下移)。',
'【更多与删除】:保存为模板、删除当前节点(受 DTD 规范安全拦截保护)。'
],
highlights: ['在节点树中点击任意节点,右侧编辑区会自动平滑滚动并聚焦居中高亮。'],
relatedQuestions: ['faq_doc_outline_view', 'faq_node_drag', 'faq_batch_delete_safety', 'faq_node_check_rule'],
isHot: true
},
{
id: 'faq_doc_outline_view',
category: 'tree',
categoryName: '节点树与大纲',
title: '什么是“Word 风格大纲视图”?如何与 XML 节点树切换?',
keywords: ['word大纲', '大纲视图', '大纲', 'outline', '目录', '章节导航', '切换大纲', 'dg', 'dagang', 'ml', 'mulu'],
synonyms: ['word模式在哪里', '怎么看文章目录', '大纲导航', '如何切换到大纲视图', '章节列表'],
answer: '在左侧面板顶部,提供【🌳 XML 节点树】与【📑 Word 大纲】两种视图模式一键切换:',
steps: [
'点击左侧面板顶部的【📑 Word 大纲】按钮。',
'系统自动滤除底层技术标签,以类似 Word 导航窗格的树形大纲展示各章节(TASK、SUBTASK、STEP 及段落标题)。',
'点击任意大纲条目,右侧编辑区瞬间平滑滚动至对应章节。',
'支持在大纲视图中直接进行关键词与章节序号过滤搜索。'
],
highlights: ['在节点树中点击任意节点,右侧编辑区会自动平滑滚动并聚焦到该节点。'],
relatedQuestions: ['faq_node_drag', 'faq_dtd_validate', 'faq_node_locate']
highlights: ['适合不熟悉 XML 语法的业务人员快速阅读与定位整篇工卡结构。'],
relatedQuestions: ['faq_node_tree_ops', 'faq_tree_search_filter', 'faq_node_locate'],
isHot: true
},
{
id: 'faq_node_drag',
category: 'tree',
categoryName: '节点树结构',
categoryName: '节点树与大纲',
title: '如何通过拖拽调整节点的先后顺序或层级?',
keywords: ['拖拽', '拖动', '移动节点', '排序', '调整顺序', 'drag', '改变层级', '重排', 'tz', 'tuozhuai', 'paixu'],
synonyms: ['怎么把步骤往前移', '节点怎么上下拖动', '调整步骤顺序', '拖动节点'],
......@@ -515,12 +612,78 @@ export const FAQ_DATABASE: FaqItem[] = [
'松开鼠标即可完成重排,右侧文档内容将实时自动更新排版。'
],
highlights: ['操作失误无需担心,可随时按快捷键 Ctrl+Z 撤销回拖拽前的状态。'],
relatedQuestions: ['faq_node_tree_ops', 'faq_shortcuts']
relatedQuestions: ['faq_node_move_order', 'faq_shortcuts', 'faq_node_tree_ops']
},
{
id: 'faq_tree_search_filter',
category: 'tree',
categoryName: '节点树与大纲',
title: '如何快速搜索与过滤节点树或大纲章节?',
keywords: ['搜索节点', '过滤树', '查找标签', '过滤大纲', 'search tree', 'ss', 'sousuo', 'gl', 'guolv'],
synonyms: ['怎么搜节点', '按名字找节点', '搜索步骤', '节点过滤'],
answer: '左侧面板顶部配备了高效的实时搜索过滤输入框:',
steps: [
'在左侧搜索框中输入节点标签名(如 `STEP`、`TABLE`)、属性或文本内容。',
'节点树将实时高亮匹配项,并自动折叠无关节点,仅保留包含匹配项的分支。',
'在大纲模式下,输入中文或英文关键词可即时过滤对应章节大纲。'
],
relatedQuestions: ['faq_doc_outline_view', 'faq_node_tree_ops']
},
{
id: 'faq_tree_batch_mode',
category: 'tree',
categoryName: '节点树与大纲',
title: '如何进入“批量管理”模式勾选多个节点?',
keywords: ['批量管理', '多选节点', '批量删除', '勾选树', 'batch mode', 'pl', 'piliang', 'gx', 'gouxuan'],
synonyms: ['怎么多选节点', '怎么一次删好几个步骤', '勾选多个节点', '批量模式在哪'],
answer: '在 XML 节点树视图中,支持多选勾选与批量管理:',
steps: [
'点击左侧面板搜索栏右侧的【批量管理】按钮。',
'树节点左侧将出现复选勾选框,可逐一勾选需要操作的节点。',
'顶部操作栏实时显示“已选择 N 个节点”。',
'点击【删除选中】按钮,系统将调出 DTD 安全分析诊断并执行批量安全删除。'
],
highlights: ['点击【取消】可随时退出批量管理模式并清空选区。'],
relatedQuestions: ['faq_batch_delete_safety', 'faq_node_tree_ops']
},
{
id: 'faq_batch_delete_safety',
category: 'tree',
categoryName: '节点树与大纲',
title: '系统如何进行 DTD 批量删除安全合规性诊断?被拦截节点怎么处理?',
keywords: ['批量删除', '安全删除', 'dtd拦截', '合规诊断', '必填约束', 'batch delete', 'aq', 'anquan', 'lj', 'lanjie'],
synonyms: ['为什么有些节点不能删', '批量删除报错', 'dtd拦截原因', '安全合规检查'],
answer: '为了防止误删导致 XML 文件不符合航空 DTD 规范,系统内置了强大的 BatchDeleteConfirmModal 诊断引擎:',
steps: [
'在批量删除确认时,系统会自动分析所有选中节点在其父级容器中的 DTD 约束规则。',
'精准分类为两组:',
' · 【可安全删除节点(Safe Nodes)】:删除后父节点仍完全符合 DTD 规范。',
' · 【被拦截节点(Blocked Nodes)】:若删除将导致父节点缺少必填子元素(如删除 TASK 唯一的 STEP)。',
'弹窗会详尽列出拦截原因,用户可一键剔除被拦截项,仅对安全节点执行删除,杜绝损坏工卡数据结构。'
],
highlights: ['这是保障航空工业级工卡数据 100% 合规与结构稳固的核心安全屏障。'],
relatedQuestions: ['faq_tree_batch_mode', 'faq_node_check_rule', 'faq_dtd_validate'],
isHot: true
},
{
id: 'faq_node_move_order',
category: 'tree',
categoryName: '节点树与大纲',
title: '如何使用右键菜单【编辑顺序】进行节点上移或下移?',
keywords: ['上移', '下移', '编辑顺序', '微调顺序', 'moveup', 'movedown', 'sy', 'shangyi', 'xy', 'xiayi'],
synonyms: ['怎么把节点往上挪', '怎么把节点往下挪', '步骤上移下移'],
answer: '除了鼠标拖拽外,右键菜单提供了更精准的按步移动方式:',
steps: [
'右键点击目标节点,悬浮在【编辑顺序】子菜单上。',
'选择【上移】或【下移】。',
'系统会自动依据 DTD 规则判断是否允许移动(如已处于首位或末位时按钮自动置灰禁用)。'
],
relatedQuestions: ['faq_node_drag', 'faq_node_tree_ops']
},
{
id: 'faq_node_locate',
category: 'tree',
categoryName: '节点树结构',
categoryName: '节点树与大纲',
title: '节点树点击后编辑区是如何精确定位与高亮的?',
keywords: ['定位', '联动', '滚动居中', '高亮', '最近块', '祖先链', 'focus', '选中', 'dw', 'dingwei', 'gl', 'gaoliang'],
synonyms: ['怎么跳到选中位置', '为什么点击没反应', '编辑区怎么联动', '滚动定位'],
......@@ -533,76 +696,343 @@ export const FAQ_DATABASE: FaqItem[] = [
relatedQuestions: ['faq_node_tree_ops', 'faq_composite_containers']
},
{
id: 'faq_dtd_validate',
id: 'faq_node_view_xml',
category: 'tree',
categoryName: '节点树与大纲',
title: '如何查看单个节点的原生 XML 源代码片段并复制?',
keywords: ['查看xml', 'xml源码', '节点源码', 'viewxml', '复制代码', 'ck', 'chakan', 'dm', 'daima'],
synonyms: ['怎么看这个节点的xml', '导出单个节点代码', '查看当前标签xml', '复制xml片段'],
answer: '无需导出整份文件,可随时快速查看任意单个节点及其子树的纯原生 XML:',
steps: [
'在左侧树或右侧编辑区,右键点击目标节点。',
'在菜单中选择【查看XML】。',
'在弹出的 ViewXmlModal 窗口中查阅格式化与语法高亮后的 XML 源代码。',
'点击窗口右下角【复制 XML】按钮即可一键复制到系统剪贴板。'
],
highlights: ['查看虚拟辅助节点(如分页符)时同样支持查看对应的特殊排版 XML。'],
relatedQuestions: ['faq_node_check_rule', 'faq_insert_fragment', 'faq_export_xml']
},
{
id: 'faq_node_check_rule',
category: 'tree',
categoryName: '节点树与大纲',
title: '如何查看节点的 DTD 语法模型与约束规则(Check Rule)?',
keywords: ['查看规则', 'check rule', 'dtd规则', '内容模型', 'contentmodel', '必填属性', '允许子标签', 'ckgz', 'guize'],
synonyms: ['这个标签能放什么', '怎么看dtd约束', '查看标签语法', '允许插入哪些子元素'],
answer: 'CheckRuleModal 弹窗为技术人员提供了权威的 DTD 规范在线查阅手册:',
steps: [
'右键点击任意 XML 节点,选择【查看规则】。',
'弹窗将完整展示:',
' · 【节点名称】:如 `<TASK>`、`<STEP>` 等。',
' · 【原始内容模型 (Raw Model)】:如 `(TITLE?, PARAC*, PARA*, SUBTASK*)`。',
' · 【人类可读解析】:以通俗中文解释该节点支持的子元素类型、出现频次与排列顺序。',
' · 【属性约束】:列出必填属性(REQUIRED)与可选属性(IMPLIED)。'
],
highlights: ['编写遇到 DTD 校验不通过时,查看规则是快速排查原因的最佳工具。'],
relatedQuestions: ['faq_dtd_validate', 'faq_batch_delete_safety', 'faq_attribute_editor']
},
{
id: 'faq_node_single_translate',
category: 'tree',
categoryName: '节点树与大纲',
title: '如何对单个中文节点进行即时智能翻译回填?',
keywords: ['单个翻译', '节点翻译', '单条翻译', '英译中', 'translatetag', 'translate node', 'dgfy', 'dantiao', 'parac翻译'],
synonyms: ['怎么只翻译这一句', '单个段落翻译', '快速翻译选中节点', 'PARAC翻译', '回填翻译'],
answer: '除了全篇批量翻译外,系统支持对单个中文节点进行即时翻译回填:',
steps: [
'确保文档中已有中文节点(如 PARAC、TITLEC 等),且同级存在对应的英文原文节点(如 PARA、TITLE)。',
'在左侧树【中文节点】、编辑区中文段落右键,或选中文本时光标上方浮现的选区工具栏中,选择【智能翻译】。',
'系统后台将自动提取对应英文节点的原文并调用航空翻译服务,翻译结果将即时回填到当前中文节点中。'
],
highlights: ['单节点翻译响应极快,无需等待全篇扫描,适合单步精细校对。'],
relatedQuestions: ['faq_batch_translate', 'faq_extract_translate', 'faq_search_translate'],
contextTags: ['PARAC', 'TITLEC']
},
{
id: 'faq_node_single_stash',
category: 'tree',
categoryName: '节点树与大纲',
title: '如何对单个关键节点进行本地暂存与快照回退?',
keywords: ['单节点暂存', '局部暂存', '节点草稿', '快照回退', 'stashnode', 'jbzc', 'jiedianzancun'],
synonyms: ['怎么只存这一个步骤', '单个节点备份', '暂存当前段落', '节点版本还原'],
answer: '针对某一段耗时较长或正在调试的大型复杂表格/任务,支持局部独立暂存:',
steps: [
'右键点击目标节点,在菜单中选择【本地暂存】。',
'在 StashNodeModal 弹窗中输入快照备注(如“复杂线缆表格第2版”)。',
'随后可随时打开暂存记录查看变动 Diff,或单独【恢复】该节点,完全不影响文档中其他已完成的部分。'
],
relatedQuestions: ['faq_stash_manager', 'faq_compare_card', 'faq_shortcuts']
},
{
id: 'faq_node_copy_paste',
category: 'tree',
categoryName: '节点树结构',
title: '系统如何进行 DTD 规范语法校验与防错?',
keywords: ['dtd', '校验', '合法性', '规范', '报错', 'validate', '格式检查', '语法', '防错', 'jy', 'jiaoyan', 'gf', 'guifan'],
synonyms: ['工卡格式对不对', '怎么检查错误', '标签不合规怎么办', '语法检查'],
answer: '系统内置完整的航空标准 DTD 校验规则引擎。',
categoryName: '节点树与大纲',
title: '如何复制节点并在其他位置粘贴(支持上方/下方/内部)?',
keywords: ['复制节点', '粘贴节点', '剪贴板', '粘贴xml', 'copynode', 'pastenode', 'fz', 'fuzhi', 'zt', 'zhantie'],
synonyms: ['怎么复制整个步骤', '复制到别的地方', '怎么粘贴步骤', '粘贴到上方下方'],
answer: '节点树提供完整的结构剪贴板机制:',
steps: [
'在新增或修改节点时,系统会自动依据 DTD 规则判断该节点允许包含的子标签与必须属性。',
'若存在不符合规范的嵌套关系或遗漏必填属性,系统会在属性面板及节点树上给出醒目的黄色/红色预警提示。',
'点击工具栏上的校验功能即可查看全篇工卡的合规诊断报告。'
'【复制】:右键任意节点选择【复制节点】。',
'【粘贴】:在目标节点上右键选择【粘贴节点】,可精确指定:',
' · 【粘贴到上方】:作为目标节点的上一同级兄弟节点。',
' · 【粘贴到下方】:作为目标节点的下一同级兄弟节点。',
' · 【粘贴到内部】:作为目标节点的子节点插入。'
],
relatedQuestions: ['faq_insert_fragment', 'faq_node_tree_ops', 'faq_attribute_editor']
highlights: ['系统在粘贴时会自动递归遍历并生成全新的唯一节点 ID,彻底杜绝 ID 重复冲突。'],
relatedQuestions: ['faq_node_tree_ops', 'faq_insert_fragment']
},
{
id: 'faq_attribute_editor',
category: 'tree',
categoryName: '节点树结构',
categoryName: '节点树与大纲',
title: '如何查看和修改 XML 节点的属性(Attribute)?',
keywords: ['属性', 'attribute', 'applic', 'id', 'revision', '修改属性', '节点属性', 'sx', 'shuxing'],
synonyms: ['怎么改属性', '修改节点id', '添加适用性属性', '属性面板在哪里'],
synonyms: ['怎么改属性', '修改节点id', '添加适用性属性', '属性面板在哪里', '属性抽屉'],
answer: '在左侧节点树或右侧编辑区选中节点后:',
steps: [
'右键点击节点选择【编辑属性】,或在右侧属性抽屉中直接查看。',
'面板将列出该 DTD 节点支持的所有标准属性(如 APPLIC、KEY、NBR、REV 等)。',
'输入或修改属性值后,系统将实时同步更新至 XML 数据树中。'
'枚举型属性自动以下拉框呈现,自由文本型属性支持实时录入,修改后即时同步到 XML 树中。'
],
relatedQuestions: ['faq_node_tree_ops', 'faq_dtd_validate']
relatedQuestions: ['faq_node_tree_ops', 'faq_node_check_rule', 'faq_dtd_validate']
},
{
id: 'faq_composite_containers',
id: 'faq_tree_color_icons',
category: 'tree',
categoryName: '节点树结构',
title: '什么是复合结构特殊容器(CBDATA / TED / CON 等)?',
keywords: ['复合容器', 'cbdata', 'ted', 'con', 'graphic', 'eindata', 'expd', '断路器', '工具', '消耗品', 'fh', 'fuhe', 'dlq', 'duanluqi'],
synonyms: ['怎么加断路器', '工具清单怎么做', '消耗品表格', '复合结构说明'],
answer: '针对航空标准中具有固定多列结构或成对渲染的特殊业务实体,系统采用复合结构容器:',
categoryName: '节点树与大纲',
title: '节点树上的红色、蓝色、绿色高亮及各类图标代表什么?',
keywords: ['树颜色', '节点图标', '红色节点', '蓝色节点', '绿色节点', '视觉规范', 'tb', 'tubiao', 'ys', 'yanse'],
synonyms: ['节点颜色代表什么', '为什么有些节点是红色的', '蓝色节点是什么', '图标含义'],
answer: '系统在节点树上采用了严谨的航空工业级语义色彩规范:',
steps: [
'【CBDATA】:电路断路器数据行(包含 PAN、CBNAME、CB、CBLOC 四列)。',
'【TED】:专用工具行(包含 TOOLNAME 工具名与 TOOLNBR 件号)。',
'【CON】:消耗品材料行(包含 CONNAME 消耗品名与 CONNBR 件号)。',
'【EINDATA】:功能号适用性行(包含 EIN 功能号与相关属性)。'
'【🔴 红色系】:警示与适用性约束节点(WARNING、EFFECT、CONEFFECT、SBEFF 等),提醒注意安全与适用构型。',
'【🔵 蓝色系】:注意事项与引用节点(NOTE、REFBLOCK、REFINT、EIN、GRPHCREF 等)。',
'【🟢 绿色系】:富媒体与图表节点(GRAPHIC 附图、TABLE 表格等)。',
'各节点左侧配有专属语义图标(如书本、警示三角、图片、表格、齿轮等),便于快速辨识。'
],
highlights: ['复合容器下的各个子元素均支持就地独立编辑、独立高亮与定位。'],
relatedQuestions: ['faq_node_locate', 'faq_insert_table'],
contextTags: ['CBDATA', 'TED', 'CON', 'EINDATA', 'EXPD']
relatedQuestions: ['faq_node_tree_ops', 'faq_insert_alert']
},
// ══════════════════════════════════════════════════════════════
// 4. 翻译与对比 (translate)
// ══════════════════════════════════════════════════════════════
{
id: 'faq_batch_translate',
category: 'translate',
categoryName: '翻译与对比',
title: '如何进行中英文“批量翻译”?',
keywords: ['翻译', '批量翻译', 'translate', '中英文', '英译中', '中译英', '自动翻译', '语言', 'para', 'parac', 'fy', 'fanyi', 'plfy'],
synonyms: ['怎么一键翻译', '自动把英文转中文', '中英文对照生成', '批量翻译工卡', '全篇翻译'],
answer: '系统提供智能航空术语批量翻译引擎,能够一键扫描工卡中所有指定标签并自动调用翻译服务回填。',
steps: [
'在顶部工具栏点击【批量翻译】按钮。',
'在弹窗中配置【翻译模型】、【翻译方向】、【目标翻译标签】(勾选 PARA、TITLE 等)、【标签后缀】、【并行处理模式】及【保存至 Milvus 数据库】选项。',
'点击【开始翻译】,控制台实时流式输出各节点翻译日志,工具栏图标同步显示加载动画。',
'翻译完成后,可一键【直接导入编辑器】、【下载 XML 文件】或【重新翻译】。'
],
highlights: ['翻译结果优先匹配专业航空机务词典,确保术语标准规范。'],
actions: [{ label: '批量翻译', type: 'event', payload: 'trigger_batch_translate' }],
relatedQuestions: ['faq_extract_translate', 'faq_search_translate', 'faq_node_single_translate'],
isHot: true
},
{
id: 'faq_extract_translate',
category: 'translate',
categoryName: '翻译与对比',
title: '如何“提取翻译”对照条目并导出语料表?',
keywords: ['提取翻译', '对照表', 'extract', '词条提取', '双语对照', '导出词条', '语料', 'tqfy', 'tiqu'],
synonyms: ['怎么把翻译单独导出来', '提取所有中英文', '导出双语表', '导出翻译清单'],
answer: '提取翻译功能可将工卡中的双语对照对汇总抽取,支持生成 Excel 表格或直接入库至 Milvus 向量数据库。',
steps: [
'点击顶部工具栏的【提取翻译】按钮。',
'配置需要提取的【标签对】(默认 PARA -> PARAC,支持自由添加/删除自定义标签对)。',
'按需勾选【生成 Excel 文件】与【导入至 Milvus 数据库】(可指定分区名)。',
'点击【开始提取】,完成后可查看提取统计与前 10 条数据预览,并一键下载 Excel 语料表。'
],
actions: [{ label: '提取翻译对照', type: 'event', payload: 'trigger_extract_translate' }],
relatedQuestions: ['faq_batch_translate', 'faq_search_translate']
},
{
id: 'faq_search_translate',
category: 'translate',
categoryName: '翻译与对比',
title: '如何使用“搜索翻译”云端数据库 (Milvus) 与维护语料?',
keywords: ['搜索翻译', '查词典', '术语库', '词库', 'search translate', '航空术语', '词汇查询', 'milvus', 'ssfy', 'sousuo', 'cidian'],
synonyms: ['怎么查专业单词', '机务词汇查询', '搜索翻译库', '专业英语查词', '查机务字典', '语料库管理'],
answer: '内置 Milvus 双语翻译云端数据库中心,支持相似度检索、手动录入与批量清理:',
steps: [
'点击顶部工具栏的【搜索翻译】按钮打开双语数据库面板。',
'【检索双语翻译】:输入中文或英文,设置检索模式(精确/模糊/混合)与翻译方向,即时查看匹配得分与相似度,支持一键复制或单条删除。',
'【新增翻译对照】:手动录入英文原文与中文翻译,一键持久化写入云端数据库。',
'【批量删除】:提供图形化过滤条件(按文本或分区过滤),安全批量物理清理数据库。'
],
actions: [{ label: '搜索翻译词典', type: 'event', payload: 'trigger_search_translate' }],
relatedQuestions: ['faq_batch_translate', 'faq_extract_translate'],
isHot: true
},
{
id: 'faq_compare_card',
category: 'translate',
categoryName: '翻译与对比',
title: '如何使用“对比工卡”查看两份工卡的差异?',
keywords: ['对比', '对比工卡', 'compare', 'diff', '版本对比', '改动', '差异', '修改记录', '比对', 'db', 'duibi', 'chayi'],
synonyms: ['怎么看修改了哪里', '两份工卡怎么对比', '比对不同版本', '差异对比', '版本差异'],
answer: '对比工卡功能基于强大的 Diff 算法,直观高亮展示两份工卡在节点结构、文本内容、表格及属性上的增删改变动。',
steps: [
'在顶部工具栏点击【对比工卡】按钮。',
'选择或上传待比对的目标工卡文件(也可以选择与本地暂存版本比对)。',
'系统以双栏分屏或统一 Diff 视图展示:绿色表示新增、红色表示删除、黄色表示修改。'
],
highlights: ['支持统计新增项数、删除项数与修改项数,改动一览无余。'],
actions: [{ label: '打开对比工卡', type: 'event', payload: 'trigger_compare' }],
relatedQuestions: ['faq_stash_manager', 'faq_export_xml'],
isHot: true
},
{
id: 'faq_translate_configs',
category: 'translate',
categoryName: '翻译与对比',
title: '智能翻译支持哪些高级配置(分区选择、模糊匹配阈值等)?',
keywords: ['翻译设置', '翻译配置', '分区选择', '模糊匹配', '阈值', 'partition', 'fuzzy score', 'fysz', 'shezhi'],
synonyms: ['怎么改翻译参数', '翻译精确度设置', '机务词库分区选择'],
answer: '系统翻译引擎支持深度专业化配置:',
steps: [
'【专业词库分区 (partition_names)】:可指定优先匹配波音、空客或通用航空语料分区。',
'【模糊匹配阈值 (fuzzy_score_threshold)】:调节词条匹配敏感度(默认 0.85)。',
'【自动入库】:翻译确认后的优质句对可选择自动沉淀到数据库中,不断丰富企业语料资产。'
],
relatedQuestions: ['faq_batch_translate', 'faq_search_translate']
},
// ══════════════════════════════════════════════════════════════
// 5. 文件管理与导出 (file)
// ══════════════════════════════════════════════════════════════
{
id: 'faq_import_xml',
category: 'file',
categoryName: '文件与导出',
title: '如何导入外部 XML 文件?',
keywords: ['导入', '上传', '打开', 'import', 'xml导入', '加载工卡', '本地文件', 'dr', 'daoru', 'sc', 'shangchuan'],
synonyms: ['怎么上传xml', '导入工卡文件', '怎么打开本地xml', '打开已有工卡'],
answer: '系统支持一键导入符合规范的标准工卡 XML 文件,并自动解析为可视化节点树。',
steps: [
'点击顶部工具栏的【导入 XML】按钮。',
'在弹出的文件选择器中选中您的 `.xml` 文件。',
'系统解析成功后,左侧节点树和右侧可视化编辑区将立即同步更新内容。'
],
highlights: ['导入前建议使用【本地暂存】保存当前未完成的编辑内容,以防被覆盖。'],
actions: [{ label: '导入 XML 文件', type: 'event', payload: 'trigger_import_xml' }],
relatedQuestions: ['faq_export_xml', 'faq_stash_manager'],
isHot: true
},
{
id: 'faq_export_xml',
category: 'file',
categoryName: '文件与导出',
title: '如何导出编辑好的工卡 XML 文件?',
keywords: ['导出', '下载', 'export', '保存为xml', '导出xml', '生成xml', '保存工卡', 'dc', 'daochu', 'xz', 'xiazai'],
synonyms: ['怎么下载xml', '工卡怎么导出', '保存到本地电脑', '下载xml文件'],
answer: '系统会将当前可视化的所有节点与属性实时序列化为符合航空规范的完整 XML 文件。',
steps: [
'在顶部工具栏点击【导出 XML】按钮。',
'弹出下载确认窗口,可自定义导出文件名(默认带有时间戳,如 `WORK_CARD_YYYYMMDDHHmmss.xml`)。',
'点击下载即可保存到本地磁盘。'
],
highlights: ['导出的 XML 严格包含 XML 声明及 DTD 格式标准,可直接提交至生产系统。'],
actions: [{ label: '立即导出 XML', type: 'event', payload: 'trigger_export_xml' }],
relatedQuestions: ['faq_import_xml', 'faq_download_html', 'faq_preview_card'],
isHot: true
},
{
id: 'faq_preview_card',
category: 'file',
categoryName: '文件与导出',
title: '如何预览工卡的实际排版和打印效果?',
keywords: ['预览', 'preview', '预览工卡', '查看效果', '打印预览', '查看排版', 'a4预览', 'yl', 'yulan', 'dy', 'dayin'],
synonyms: ['怎么看打印效果', '预览工卡长什么样', '全屏预览', '打印效果'],
answer: '点击顶部工具栏醒目的蓝色【预览工卡】按钮,即可进入全屏工卡排版预览模式。',
steps: [
'点击工具栏右上方的【预览工卡】。',
'系统将在全屏弹窗中以真实 A4 打印样式渲染整份工卡(包含表格、附图、双语对照、物理黑实线签字栏及分页符)。',
'在预览窗口中可直接调用系统打印(Ctrl+P)或缩放查阅。'
],
actions: [{ label: '立即预览工卡', type: 'event', payload: 'trigger_preview' }],
relatedQuestions: ['faq_download_html', 'faq_export_xml', 'faq_insert_pagebreak'],
isHot: true
},
{
id: 'faq_download_html',
category: 'file',
categoryName: '文件与导出',
title: '如何下载离线 HTML 格式工卡?',
keywords: ['下载html', 'html', '离线查看', '网页版', '下载网页', '静态工卡', '单文件', 'lx', 'lixian', 'wye'],
synonyms: ['怎么导出html', '下载离线网页', '保存为html', '导出网页'],
answer: '【下载html】功能会将整份工卡及其所有排版样式打包为一个独立的单文件 HTML。',
steps: [
'点击顶部工具栏的【下载html】按钮。',
'浏览器将下载包含完整样式表、中英文排版、附图的 `.html` 文件。',
'双击该 HTML 文件即可在任何无网电脑、手机或平板浏览器中直接查阅与打印。'
],
actions: [{ label: '下载 HTML', type: 'event', payload: 'trigger_download_html' }],
relatedQuestions: ['faq_preview_card', 'faq_export_xml']
},
{
id: 'faq_stash_manager',
category: 'file',
categoryName: '文件与导出',
title: '什么是“本地暂存(Stash)”?如何防丢失?',
keywords: ['暂存', '本地暂存', 'stash', '草稿', '恢复', '防丢失', '版本', '历史暂存', '备份', 'zc', 'zancun', 'cg', 'caogao'],
synonyms: ['怎么存草稿', '电脑关了数据还在吗', '怎么备份当前工卡', '恢复暂存', '暂存版本'],
answer: '本地暂存功能类似于 Git Stash,能够将您当前编辑的工卡快照保存在本地浏览器中,防止意外刷新或关闭导致数据丢失。',
steps: [
'在顶部工具栏点击【本地暂存】按钮。',
'点击“新建暂存”,输入备注名称(如“发动机大修第一版”),系统立即保存当前完整状态。',
'随时可在暂存列表中查看历史快照、对比变动或一键【恢复】到对应版本。'
],
highlights: ['暂存数据存储在本地持久化存储中,即使关闭浏览器或重启电脑也能随时找回。'],
actions: [{ label: '打开本地暂存', type: 'event', payload: 'trigger_stash' }],
relatedQuestions: ['faq_export_xml', 'faq_compare_card'],
isHot: true
},
{
id: 'faq_xml_size',
category: 'file',
categoryName: '文件与导出',
title: '如何查看当前工卡的文档体积与字数统计?',
keywords: ['大小', '体积', '文档统计', 'xml大小', '字数', '节点数', '性能', 'dx', 'daxiao', 'tj', 'tiji'],
synonyms: ['怎么看工卡有多大', '文件大小', '查看字数'],
answer: '在顶部工具栏右侧偏好设置旁,实时显示当前文档的序列化大小(如 `18.5 KB`)。',
steps: [
'系统在每次编辑、新增节点或修改文本后,后台自动计算当前 XML 树的完整体积。',
'如果工卡体积过大,可通过折叠非当前编辑节点或拆分子工卡提升编辑流畅度。'
],
relatedQuestions: ['faq_export_xml', 'faq_shortcuts']
},
{
id: 'faq_remote_bridge',
category: 'file',
categoryName: '文件与导出',
title: '系统如何与 CEP / GX 远程系统进行工卡拉取与在线保存对接?',
keywords: ['远程系统', 'cep', 'gx', '在线保存', '接口对接', 'bridge', '云端同步', 'yc', 'yuancheng', 'jk', 'jiekou'],
synonyms: ['怎么保存到系统服务器', '工卡系统同步', '远程加载工卡', 'cep系统对接'],
answer: '系统内置完善的企业级 API Bridge 网关,支持与生产系统深度集成:',
steps: [
'【自动拉取】:通过 URL 参数或 Bridge 接口自动拉取远程工卡 XML 并在编辑器中呈现。',
'【在线保存】:支持直接调用保存接口将编辑后的工卡及模板持久化至远程服务器。',
'【图片上传】:附图上传直接与远程图片服务器(TD_JC_CEP_UPLOAD_IMG)联动。'
],
relatedQuestions: ['faq_import_xml', 'faq_export_xml']
},
// ══════════════ 5. 设置与快捷键 (settings) ══════════════
// ══════════════════════════════════════════════════════════════
// 6. 设置与快捷键 (settings)
// ══════════════════════════════════════════════════════════════
{
id: 'faq_shortcuts',
category: 'settings',
categoryName: '设置与快捷键',
title: '工卡 XML 编辑器有哪些常用快捷键?',
keywords: [
'快捷键',
'键盘快捷键',
'ctrl+z',
'ctrl+y',
'ctrl+shift+d',
'ctrl+f',
'撤销',
'重做',
'主题切换',
'shortcuts',
'kjj',
'kuaijiejian',
'cx',
'chexiao'
],
keywords: ['快捷键', '键盘快捷键', 'ctrl+z', 'ctrl+y', 'ctrl+shift+d', 'ctrl+f', '撤销', '重做', '主题切换', 'shortcuts', 'kjj', 'kuaijiejian', 'cx', 'chexiao'],
synonyms: ['有哪些按键操作', '撤销重做快捷键', '快捷键列表', '搜索快捷键', '深色模式快捷键'],
answer: '熟练使用快捷键可大幅提升工卡编写效率:',
steps: [
......@@ -610,54 +1040,89 @@ export const FAQ_DATABASE: FaqItem[] = [
'【Ctrl + Y】 或 【Ctrl + Shift + Z】:重做恢复(Redo)',
'【Ctrl + Shift + D】:快速切换深色 / 浅色主题模式',
'【Ctrl + F】:全局搜索与定位文本内容',
'【Ctrl + 鼠标点击】:在表格中多选单元格',
'【Esc】:关闭当前打开的弹窗或退出搜索'
],
highlights: ['工具栏顶部同样提供了显式的【撤销】、【重做】与【亮暗色切换】图标按钮。'],
relatedQuestions: ['faq_theme_settings', 'faq_stash_manager'],
highlights: ['顶部工具栏同样提供了显式的【撤销】、【重做】与【亮暗色切换】图标按钮。'],
actions: [{ label: '撤销上一步', type: 'event', payload: 'trigger_undo' }],
relatedQuestions: ['faq_undo_redo', 'faq_theme_settings', 'faq_stash_manager'],
isHot: true
},
{
id: 'faq_undo_redo',
category: 'settings',
categoryName: '设置与快捷键',
title: '时光机“撤销”与“重做”功能是如何工作的?',
keywords: ['撤销', '重做', 'undo', 'redo', '时光机', '历史记录', '回退', 'cx', 'chexiao', 'cz', 'zhongzuo'],
synonyms: ['怎么撤销修改', '怎么恢复刚才删的内容', '误删怎么挽回', '撤销重做机制'],
answer: '系统内置完整的历史操作快照时光机栈:',
steps: [
'任何节点的增删、属性修改、文本编辑、拖拽重排或表格合并均会自动压入历史快照栈中。',
'点击工具栏上的【撤销】图标或按【Ctrl + Z】可瞬间回退到上一状态。',
'点击【重做】图标或按【Ctrl + Y】可恢复刚刚撤销的操作。'
],
actions: [{ label: '立即撤销 (Ctrl+Z)', type: 'event', payload: 'trigger_undo' }],
relatedQuestions: ['faq_shortcuts', 'faq_stash_manager']
},
{
id: 'faq_theme_settings',
category: 'settings',
categoryName: '设置与快捷键',
title: '如何切换暗黑模式、主题色或调整字号?',
keywords: [
'暗黑模式',
'黑夜模式',
'明亮模式',
'主题色',
'换皮肤',
'字体大小',
'字号',
'偏好设置',
'皮肤',
'ah',
'anhei',
'zhuti',
'zt',
'zh'
],
keywords: ['暗黑模式', '黑夜模式', '明亮模式', '主题色', '换皮肤', '字体大小', '字号', '偏好设置', '皮肤', 'ah', 'anhei', 'zhuti', 'zt', 'zh'],
synonyms: ['怎么开夜间模式', '怎么改颜色', '字体太小怎么变大', '偏好设置在哪里', '改字体'],
answer: '系统支持极高自由度的界面个性化定制:',
answer: '系统支持极高自由度的界面个性化定制与偏好管理:',
steps: [
'【明暗切换】:点击顶部工具栏右上角的【太阳/月亮】图标,即可瞬间在亮色与暗色模式间切换。',
'【偏好设置】:点击右上角【设置齿轮】图标打开抽屉:',
' · 主题色板:可自由挑选数十种品牌色(科技蓝、极光绿、活力橙等)或自定义 HEX 颜色。',
' · 字体大小:滑动滑块实时调整全局界面字号(12px ~ 20px)。',
' · 辅助模式:支持一键开启【色弱模式】或【灰色模式】。',
' · 界面布局:自定义左侧节点树的默认展开宽度与自动折叠阈值。'
' · 【外观 Tab】:浅色/深色/系统主题模式、14 种预设品牌色与 HEX 取色器、字号步进调节(±)、色弱/灰色模式。',
' · 【编辑区 Tab】:插入节点自动展开、表格新增列默认宽度比、树菜单收缩阈值、默认展开宽度及最大宽度占比。',
' · 【快捷键 Tab】:常用快捷键速查。',
' · 【偏好导入/导出】:抽屉底部支持一键【复制】与【导入】偏好 JSON 配置。'
],
actions: [{ label: '打开偏好设置', type: 'event', payload: 'trigger_open_settings' }],
relatedQuestions: ['faq_shortcuts', 'faq_accessibility_modes', 'faq_auto_expand_setting'],
isHot: true
},
{
id: 'faq_primary_colors',
category: 'settings',
categoryName: '设置与快捷键',
title: '如何使用预设品牌色板或自定义 HEX 主题颜色?',
keywords: ['主题色', '品牌色', '个性化颜色', '自定义颜色', '取色器', 'hex', 'zts', 'zhutise'],
synonyms: ['怎么换主题颜色', '换个绿色主题', '自定义主题色', '拾色器在哪'],
answer: '在偏好设置抽屉中,提供专业的设计系统色板:',
steps: [
'打开右上角【偏好设置】抽屉。',
'在“主题色板”中点击选择喜欢的预设色彩(经典蓝、极光绿、优雅紫、热烈红等)。',
'或点击自定义颜色选择器输入专属 HEX 色值(如 `#1890ff`),全系统组件瞬间换肤。'
],
actions: [{ label: '打开偏好设置', type: 'event', payload: 'trigger_open_settings' }],
relatedQuestions: ['faq_theme_settings', 'faq_theme_page_preview']
},
{
id: 'faq_font_size_slider',
category: 'settings',
categoryName: '设置与快捷键',
title: '如何调整全局界面字体大小?',
keywords: ['字体大小', '字号', '文字缩放', '变大字', '变小字', '步进加减', 'ztdx', 'zitidaxiao', 'zh', 'zihao'],
synonyms: ['字太小看不清', '怎么放大字体', '调整字体大小', '字号按钮'],
answer: '为了保障不同分辨率屏幕与工作人员的阅读舒适度,系统支持字体精细步进缩放:',
steps: [
'点击右上角【偏好设置】齿轮图标打开抽屉。',
'在外观选项卡中,点击“字体大小”旁边的【-】或【+】按钮(默认 14px)。',
'整篇工卡树、大纲、富文本编辑器与表格文字将即时等比缩放并自动持久化记忆。'
],
actions: [{ label: '打开偏好设置', type: 'event', payload: 'trigger_open_settings' }],
relatedQuestions: ['faq_theme_settings']
},
{
id: 'faq_accessibility_modes',
category: 'settings',
categoryName: '设置与快捷键',
title: '如何开启色弱模式或灰色模式?',
keywords: ['色弱模式', '灰色模式', '辅助功能', '无障碍', '颜色过滤', '高对比度', 'sr', 'seruo', 'huise', 'hs', 'wza'],
synonyms: ['色盲模式怎么开', '黑白模式', '怎么开灰色模式'],
synonyms: ['色盲模式怎么开', '黑白模式', '怎么开灰色模式', '无障碍模式'],
answer: '为了方便各类视觉需求的工作人员,系统内置了无障碍辅助模式:',
steps: [
'点击右上角【偏好设置】齿轮图标打开设置抽屉。',
......@@ -682,11 +1147,56 @@ export const FAQ_DATABASE: FaqItem[] = [
],
actions: [{ label: '打开偏好设置', type: 'event', payload: 'trigger_open_settings' }],
relatedQuestions: ['faq_node_tree_ops', 'faq_theme_settings']
},
{
id: 'faq_splitter_resize',
category: 'settings',
categoryName: '设置与快捷键',
title: '如何拖拽调整左右分栏面板宽度或快速折叠?',
keywords: ['分栏', '左右分栏', '拖拽宽度', 'splitter', '折叠左侧', '展开面板', 'fl', 'fenlan', 'zd', 'zhedie'],
synonyms: ['左边太宽了怎么调窄', '怎么收起左侧树', '分割线怎么拖动', '隐藏左侧大纲'],
answer: '左侧大纲树与右侧编辑区之间配有高性能可拖拽 Splitter 分割条:',
steps: [
'【拖拽调整】:鼠标悬浮在中间分割线上,按住左键左右拖动即可自由调整左右两栏宽度比例。',
'【一键折叠/展开】:点击分割线中央的收起小箭头,即可一键将左侧树折叠,腾出全屏区域用于编辑。',
'系统会自动持久化保存您偏好的分栏比例。'
],
relatedQuestions: ['faq_theme_settings', 'faq_node_tree_ops']
},
{
id: 'faq_scroll_to_top',
category: 'settings',
categoryName: '设置与快捷键',
title: '节点树与大纲内容很长时如何一键回到顶部?',
keywords: ['回到顶部', '置顶', '快速回顶', 'scroll to top', 'hddb', 'huidaodingbu', 'zd', 'zhiding'],
synonyms: ['怎么快速滚到最上面', '一键置顶', '回顶部按钮'],
answer: '对于长篇复杂工卡,系统提供了极速一键置顶能力:',
steps: [
'当左侧树或 Word 大纲向下滚动超过 300px 时,右下角将自动浮现蓝色的【回到顶部】悬浮球。',
'点击该悬浮球,面板将以平滑阻尼动画瞬间滚动回最顶部。'
],
relatedQuestions: ['faq_node_locate', 'faq_doc_outline_view']
},
{
id: 'faq_theme_page_preview',
category: 'settings',
categoryName: '设置与快捷键',
title: '如何查看系统的完整设计规范与主题色彩展示页?',
keywords: ['设计规范', '主题展示页', 'token', 'naive ui', '色彩规范', 'theme preview', 'sjguifan', 'zhutiyes'],
synonyms: ['设计系统页面在哪里', '查看所有颜色', '主题规范展示'],
answer: '系统内置了完整的设计系统规范展示页:',
steps: [
'在浏览器地址栏访问 `/theme` 路由即可进入主题设计系统展示大屏。',
'展示内容包含 Naive UI 全部语义化颜色(Primary, Info, Success, Warning, Error)、字阶规范、圆角与阴影 Token,并支持一键复制色值。'
],
relatedQuestions: ['faq_theme_settings', 'faq_primary_colors']
}
]
export const DEFAULT_WELCOME_MESSAGE = `您好!我是工卡 XML 编辑器的 **AI 智能客服小助手** 🤖
很高兴为您服务!我已经全面掌握了本系统的所有功能,无论您遇到任何排版、编辑、翻译、对比或导出问题,都可以直接向我提问。
很高兴为您服务!我已经全面掌握了本系统的所有功能(包含表格高级合并拆分、Word 大纲、DTD 安全分析、富文本行内切片、多级列表、工卡版本比对、智能翻译及偏好设置等)。
无论您遇到任何排版、编辑、翻译、对比或导出问题,都可以直接向我提问。
💡 **猜你想问(点击即可快速解答):**`
......
import type { FaqItem, FaqCategory, ChatMessage, FaqAction, MatchResult } from '../constants'
import type { FaqItem, FaqCategory, ChatMessage, FaqAction, MatchResult, StepItemParsed } from '../constants'
import { FAQ_CATEGORIES, FAQ_DATABASE, HOT_QUESTIONS } from '../constants'
import { useEditorStore } from '@/store/editor'
import { useAiAssistantStore } from '@/store/aiAssistant'
import { storeToRefs } from 'pinia'
/**
* 文本清洗规范化
......@@ -185,6 +184,32 @@ export const getSuggestions = (input: string, limit = 5): FaqItem[] => {
}
/**
* 结构化解析步骤文本,识别主步骤与子项目
*/
export const parseStepItems = (steps: string[]): StepItemParsed[] => {
const result: StepItemParsed[] = []
let mainIndex = 0
for (const rawStep of steps) {
const isSub = /^[\s\t]*[·•\-\*]/.test(rawStep)
if (isSub) {
result.push({
isSubItem: true,
text: rawStep.replace(/^[\s\t]*[·•\-\*]\s*/, '')
})
} else {
mainIndex++
result.push({
isSubItem: false,
stepNumber: mainIndex,
text: rawStep
})
}
}
return result
}
/**
* AI 助手核心业务与交互逻辑 Hook(极致丝滑流式动效架构)
*/
export const useAiAssistant = () => {
......@@ -646,10 +671,13 @@ export const useAiAssistant = () => {
if (msg.faq) {
textToCopy = `【${msg.faq.title}】\n${msg.faq.answer}`
if (msg.faq.steps && msg.faq.steps.length > 0) {
textToCopy += `\n\n操作指引:\n` + msg.faq.steps.map((s, idx) => `${idx + 1}. ${s}`).join('\n')
const parsed = parseStepItems(msg.faq.steps)
textToCopy +=
`\n\n操作指引:\n` +
parsed.map((s) => (s.isSubItem ? ` • ${s.text}` : `${s.stepNumber}. ${s.text}`)).join('\n')
}
if (msg.faq.highlights && msg.faq.highlights.length > 0) {
textToCopy += `\n\n提示:\n` + msg.faq.highlights.join('\n')
textToCopy += `\n\n提示:\n` + msg.faq.highlights.map((h) => `• ${h}`).join('\n')
}
}
......@@ -701,6 +729,7 @@ export const useAiAssistant = () => {
dialogCount,
selectedNodeTag: computed(() => editorStore.selectedNode?.tagName),
FAQ_CATEGORIES,
parseStepItems,
handleBadgeMouseDown,
handleBadgeTouchStart,
handleWindowMouseDown,
......
......@@ -20,7 +20,7 @@
class="mr-3 px-3 py-1.5 rounded-full bg-card border border-divider shadow-lg text-xs font-medium text-color1 flex items-center gap-1.5 whitespace-nowrap shrink-0 opacity-90 group-hover:opacity-100 group-hover:scale-105 transition-all duration-200 pointer-events-none"
:style="{
borderColor: `color-mix(in srgb, ${themeVars.primaryColor} 30%, transparent)`,
boxShadow: `0 4px 16px ${themeVars.primaryColor}20`
boxShadow: `0 4px 16px color-mix(in srgb, ${themeVars.primaryColor} 20%, transparent)`
}"
>
<span class="inline-block w-2 h-2 rounded-full bg-success animate-pulse shrink-0"></span>
......@@ -43,10 +43,10 @@
<div
class="absolute inset-0 rounded-full animate-ping-slow pointer-events-none"
:style="{
borderColor: themeVars.primaryColor,
borderColor: `color-mix(in srgb, ${themeVars.primaryColor} 80%, white)`,
borderWidth: '2px',
borderStyle: 'solid',
opacity: 0.35
boxShadow: `0 0 12px color-mix(in srgb, ${themeVars.primaryColor} 80%, transparent)`
}"
></div>
<!-- 未读小红点 -->
......@@ -155,7 +155,7 @@
activeCategory === cat.key
? {
backgroundColor: themeVars.primaryColor,
boxShadow: `0 2px 6px ${themeVars.primaryColor}40`
boxShadow: `0 2px 6px color-mix(in srgb, ${themeVars.primaryColor} 40%, transparent)`
}
: {}
"
......@@ -168,9 +168,12 @@
<!-- 当前选中节点上下文感知专属建议栏 -->
<div
v-if="selectedNodeTag && contextFaqs.length > 0"
class="px-3 py-1.5 bg-primary/10 border-b border-divider flex items-center justify-between gap-2 shrink-0 text-xs"
class="px-3 py-1.5 border-b border-divider flex items-center justify-between gap-2 shrink-0 text-xs"
:style="{
backgroundColor: `color-mix(in srgb, ${themeVars.primaryColor} 10%, transparent)`
}"
>
<div class="flex items-center gap-1.5 truncate text-primary font-medium text-[11px]">
<div class="flex items-center gap-1.5 truncate font-medium text-[11px]" :style="{ color: themeVars.primaryColor }">
<n-icon class="shrink-0"><flash-outline /></n-icon>
<span class="truncate">当前选中 &lt;{{ selectedNodeTag }}&gt; 专属指南:</span>
</div>
......@@ -179,7 +182,7 @@
v-for="cFaq in contextFaqs"
:key="cFaq.id"
type="button"
class="px-2 py-0.5 text-[10px] rounded bg-card border border-divider text-color2 hover:text-primary hover:border-primary transition-colors focus:outline-none"
class="px-2 py-0.5 text-[10px] rounded bg-card border border-divider text-color2 hover:text-color1 transition-colors focus:outline-none"
@click="handleAskQuestion(cFaq.title)"
>
{{ cFaq.title.length > 8 ? cFaq.title.slice(0, 8) + '…' : cFaq.title }}
......@@ -195,7 +198,12 @@
class="flex items-center justify-between px-2.5 py-1 rounded-lg bg-fill-2/50 text-[10px] text-color3 border border-divider/40"
>
<span>已保留最近 {{ dialogCount }} 轮对话(超出 4 轮自动修剪)</span>
<button type="button" class="text-primary hover:underline font-medium focus:outline-none" @click="handleNewChat">
<button
type="button"
class="hover:underline font-medium focus:outline-none"
:style="{ color: themeVars.primaryColor }"
@click="handleNewChat"
>
清空开启新对话
</button>
</div>
......@@ -207,13 +215,16 @@
class="max-w-[82%] px-3.5 py-2.5 rounded-2xl rounded-tr-sm text-xs leading-relaxed shadow-sm text-white break-words"
:style="{
backgroundColor: themeVars.primaryColor,
boxShadow: `0 2px 8px ${themeVars.primaryColor}30`
boxShadow: `0 2px 8px color-mix(in srgb, ${themeVars.primaryColor} 30%, transparent)`
}"
>
{{ msg.content }}
</div>
<div
class="w-7 h-7 rounded-full bg-primary/20 flex items-center justify-center text-primary text-xs font-bold shrink-0"
class="w-7 h-7 rounded-full flex items-center justify-center text-white text-xs font-bold shrink-0"
:style="{
backgroundColor: themeVars.primaryColor
}"
>
</div>
......@@ -237,7 +248,7 @@
>
<!-- 分类、标题与复制按钮 -->
<div v-if="msg.faq" class="pb-1.5 border-b border-divider flex items-center justify-between">
<span class="font-bold text-primary flex items-center gap-1 truncate pr-1">
<span class="font-bold flex items-center gap-1 truncate pr-1" :style="{ color: themeVars.primaryColor }">
<n-icon class="text-sm shrink-0"><help-circle-outline /></n-icon>
<span class="truncate">{{ msg.faq.title }}</span>
</span>
......@@ -249,7 +260,7 @@
<template #trigger>
<button
type="button"
class="text-color3 hover:text-primary transition-colors p-0.5 rounded focus:outline-none"
class="text-color3 hover:text-color1 transition-colors p-0.5 rounded focus:outline-none"
@click="handleCopyMessage(msg)"
>
<n-icon size="14"><copy-outline /></n-icon>
......@@ -273,24 +284,40 @@
<div class="text-[11px] font-bold text-color1 flex items-center gap-1">
<span>📋 操作指引:</span>
</div>
<div
v-for="(step, sIdx) in msg.faq.steps"
:key="sIdx"
class="text-[11px] text-color2 flex items-start gap-1.5 leading-normal"
>
<span class="text-primary font-bold shrink-0">{{ sIdx + 1 }}.</span>
<span class="flex-1">{{ step }}</span>
<div class="space-y-1">
<template v-for="(step, sIdx) in parseStepItems(msg.faq.steps)" :key="sIdx">
<!-- 子项目 (带缩进与小圆点) -->
<div
v-if="step.isSubItem"
class="text-[11px] text-color2 flex items-start gap-1.5 leading-relaxed pl-3.5"
>
<span class="text-color3 font-bold shrink-0"></span>
<span class="flex-1 text-left break-words">{{ step.text }}</span>
</div>
<!-- 主步骤 (带序号) -->
<div v-else class="text-[11px] text-color2 flex items-start gap-1.5 leading-relaxed">
<span class="font-bold shrink-0" :style="{ color: themeVars.primaryColor }">{{ step.stepNumber }}.</span>
<span class="flex-1 text-left break-words">{{ step.text }}</span>
</div>
</template>
</div>
</div>
<!-- 重点提示 -->
<div
v-if="msg.faq?.highlights && msg.faq.highlights.length > 0"
class="p-2 rounded bg-warning/10 border border-warning/20 text-[11px] text-warning space-y-0.5"
class="p-2 rounded-lg text-[11px] space-y-1"
:style="{
backgroundColor: `color-mix(in srgb, ${themeVars.warningColor} 12%, transparent)`,
borderColor: `color-mix(in srgb, ${themeVars.warningColor} 30%, transparent)`,
borderWidth: '1px',
borderStyle: 'solid',
color: themeVars.warningColor
}"
>
<div v-for="(h, hIdx) in msg.faq.highlights" :key="hIdx" class="flex items-start gap-1">
<span class="font-bold">💡 提示:</span>
<span>{{ h }}</span>
<div v-for="(h, hIdx) in msg.faq.highlights" :key="hIdx" class="flex items-start gap-1.5 leading-relaxed">
<span class="font-bold shrink-0 whitespace-nowrap">💡 提示:</span>
<span class="flex-1 text-left break-words">{{ h }}</span>
</div>
</div>
......@@ -300,7 +327,10 @@
v-for="(act, aIdx) in msg.faq.actions"
:key="aIdx"
type="button"
class="px-2.5 py-1 rounded text-xs font-semibold bg-primary text-white hover:bg-primary-hover active:bg-primary-pressed transition-all shadow-sm hover:shadow flex items-center gap-1 focus:outline-none"
class="px-2.5 py-1 rounded text-xs font-semibold text-white transition-all shadow-sm hover:shadow flex items-center gap-1 focus:outline-none"
:style="{
backgroundColor: themeVars.primaryColor
}"
@click="handleTriggerAction(act)"
>
<n-icon><arrow-forward-outline /></n-icon>
......@@ -320,11 +350,14 @@
v-for="item in msg.matchedFaqs"
:key="item.id"
type="button"
class="w-full text-left px-2 py-1.5 rounded-lg text-xs text-primary hover:bg-primary-1 hover:text-primary-pressed transition-colors flex items-center justify-between group focus:outline-none"
class="w-full text-left px-2.5 py-1.5 rounded-lg text-xs hover:bg-fill-2 transition-colors flex items-center justify-between group focus:outline-none"
:style="{ color: themeVars.primaryColor }"
@click="handleAskQuestion(item.title)"
>
<span class="truncate flex-1">🔹 {{ item.title }}</span>
<n-icon class="text-color3 group-hover:text-primary transition-colors shrink-0 ml-1">
<span class="flex-1 leading-relaxed text-left break-words">🔹 {{ item.title }}</span>
<n-icon
class="text-color3 group-hover:text-color1 transition-colors shrink-0 ml-1.5 opacity-60 group-hover:opacity-100"
>
<chevron-forward-outline />
</n-icon>
</button>
......@@ -339,15 +372,22 @@
<div class="text-[11px] font-semibold text-color3 flex items-center gap-1">
<span>猜你想继续了解:</span>
</div>
<div class="flex flex-wrap gap-1">
<div class="space-y-1.5">
<template v-for="rId in msg.faq.relatedQuestions" :key="rId">
<button
v-if="getRelatedFaq(rId)"
type="button"
class="px-2 py-1 rounded-md text-[11px] bg-card border border-divider text-color2 hover:text-primary hover:border-primary transition-all focus:outline-none"
class="w-full text-left px-2.5 py-1.5 rounded-lg text-[11px] bg-card hover:bg-fill-2 border border-divider hover:border-color3 text-color2 hover:text-color1 transition-all flex items-center justify-between group focus:outline-none shadow-xs"
@click="handleAskQuestion(getRelatedFaq(rId)!.title)"
>
{{ getRelatedFaq(rId)!.title }}
<span class="flex-1 leading-relaxed text-left break-words">
<span :style="{ color: themeVars.primaryColor }">🔹</span> {{ getRelatedFaq(rId)!.title }}
</span>
<n-icon
class="text-color3 group-hover:text-color1 transition-colors shrink-0 ml-1.5 opacity-60 group-hover:opacity-100"
>
<chevron-forward-outline />
</n-icon>
</button>
</template>
</div>
......@@ -357,7 +397,7 @@
<div v-if="msg.faq" class="flex items-center justify-between text-[11px] text-color3 pt-0.5">
<button
type="button"
class="hover:text-primary transition-colors flex items-center gap-1 focus:outline-none"
class="hover:text-color1 transition-colors flex items-center gap-1 focus:outline-none"
@click="handleCopyMessage(msg)"
>
<n-icon size="12"><copy-outline /></n-icon>
......@@ -367,8 +407,17 @@
<span class="text-[10px]">有解答疑惑吗?</span>
<button
type="button"
class="flex items-center gap-1 px-1.5 py-0.5 rounded border border-divider hover:text-primary hover:border-primary transition-colors focus:outline-none"
:class="{ 'text-primary border-primary font-bold bg-primary-1': msg.feedback === 'helpful' }"
class="flex items-center gap-1 px-1.5 py-0.5 rounded border border-divider transition-colors focus:outline-none"
:class="msg.feedback === 'helpful' ? 'font-bold' : 'hover:border-color3 text-color3 hover:text-color1'"
:style="
msg.feedback === 'helpful'
? {
color: themeVars.primaryColor,
borderColor: themeVars.primaryColor,
backgroundColor: `color-mix(in srgb, ${themeVars.primaryColor} 15%, transparent)`
}
: {}
"
@click="handleFeedback(msg, 'helpful')"
>
<n-icon><thumbs-up-outline /></n-icon>
......@@ -376,10 +425,17 @@
</button>
<button
type="button"
class="flex items-center gap-1 px-1.5 py-0.5 rounded border border-divider hover:text-error hover:border-error transition-colors focus:outline-none"
:class="{
'text-error border-error font-bold bg-error/10': msg.feedback === 'unhelpful'
}"
class="flex items-center gap-1 px-1.5 py-0.5 rounded border border-divider transition-colors focus:outline-none"
:class="msg.feedback === 'unhelpful' ? 'font-bold' : 'hover:border-color3 text-color3 hover:text-color1'"
:style="
msg.feedback === 'unhelpful'
? {
color: themeVars.errorColor,
borderColor: themeVars.errorColor,
backgroundColor: `color-mix(in srgb, ${themeVars.errorColor} 15%, transparent)`
}
: {}
"
@click="handleFeedback(msg, 'unhelpful')"
>
<n-icon><thumbs-down-outline /></n-icon>
......@@ -489,7 +545,10 @@
<button
type="button"
class="h-9 px-3.5 rounded-xl bg-primary text-white text-xs font-semibold flex items-center justify-center gap-1 hover:bg-primary-hover active:bg-primary-pressed disabled:opacity-40 disabled:hover:bg-primary transition-all focus:outline-none shadow-sm"
class="h-9 px-3.5 rounded-xl text-white text-xs font-semibold flex items-center justify-center gap-1 transition-all focus:outline-none shadow-sm disabled:opacity-40"
:style="{
backgroundColor: themeVars.primaryColor
}"
:disabled="!inputQuery.trim() || isTyping"
@click="handleSend"
>
......@@ -503,7 +562,8 @@
<button
v-if="isStreaming"
type="button"
class="text-primary font-medium hover:underline focus:outline-none flex items-center gap-0.5"
class="font-medium hover:underline focus:outline-none flex items-center gap-0.5"
:style="{ color: themeVars.primaryColor }"
@click="skipStreaming"
>
<span>⏩ 点击跳过打字</span>
......@@ -512,7 +572,7 @@
<button
type="button"
class="hover:text-primary transition-colors focus:outline-none"
class="hover:text-color1 transition-colors focus:outline-none"
@click="handleAskQuestion('工卡 XML 编辑器有哪些常用快捷键?')"
>
⌨️ 快捷键说明
......@@ -568,6 +628,7 @@ const {
dialogCount,
selectedNodeTag,
FAQ_CATEGORIES,
parseStepItems,
handleBadgeMouseDown,
handleBadgeTouchStart,
handleWindowMouseDown,
......
......@@ -597,6 +597,15 @@ onMounted(() => {
eventBus.on('trigger_open_settings', () => {
appStore.settingsOpen = true
})
eventBus.on('trigger_undo', () => {
if (canUndo.value) editorStore.undo()
})
eventBus.on('trigger_redo', () => {
if (canRedo.value) editorStore.redo()
})
eventBus.on('trigger_toggle_theme', () => {
appStore.isDark = !appStore.isDark
})
})
</script>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment