draftgo-cli 3.0.55 → 4.0.1
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.
- package/README.md +112 -316
- package/package.json +5 -5
- package/resources/skill/SKILL.md +25 -24
- package/resources/skill/init/SKILL.md +5 -10
- package/resources/skill/manifest.json +2 -2
- package/resources/skill/references/aihub.md +10 -5
- package/resources/skill/references/chat-sdk.md +10 -0
- package/resources/skill/references/checkout.md +4 -4
- package/resources/skill/references/custom-services.md +65 -226
- package/resources/skill/references/data.md +3 -2
- package/resources/skill/references/frontend.md +96 -490
- package/resources/skill/references/mcp.md +39 -103
- package/resources/skill/references/runtime.md +3 -2
- package/resources/skill/story/SKILL.md +1 -2
- package/src/apiContractCache.js +112 -0
- package/src/cli.js +1 -21
- package/src/commandRegistry.js +6 -11
- package/src/commands/api.js +28 -8
- package/src/commands/check.js +1 -10
- package/src/commands/customService.js +2 -4
- package/src/commands/delete.js +23 -46
- package/src/commands/deploy.js +1 -1
- package/src/commands/help.js +16 -31
- package/src/commands/init.js +4 -10
- package/src/commands/listTargets.js +1 -1
- package/src/commands/local.js +2 -6
- package/src/commands/map.js +0 -11
- package/src/commands/status.js +1 -1
- package/src/commands/uninstall.js +3 -3
- package/src/commands/update.js +1 -1
- package/src/commands/verify.js +43 -21
- package/src/commands/{verifyUi.js → visualVerify.js} +28 -116
- package/src/commands/worklog.js +86 -0
- package/src/customServices.js +150 -33
- package/src/{localdev → localRuntime}/detect.js +1 -1
- package/src/{localdev → localRuntime}/mysqlClient.js +1 -1
- package/src/{localdev → localRuntime}/services.js +1 -1
- package/src/projectConfig.js +2 -0
- package/src/{installers/index.js → targets.js} +3 -5
- package/src/worklog.js +274 -0
- package/src/workspaceHealth.js +1 -1
- package/src/worktree/index.js +81 -51
- package/src/changelog.js +0 -276
- package/src/commands/changelog.js +0 -24
- package/src/commands/localDev.js +0 -9
- package/src/commands/sync.js +0 -46
- package/src/commands/task.js +0 -408
- package/src/commands/verifyUiCompat.js +0 -16
- /package/src/{localdev → localRuntime}/compose.js +0 -0
- /package/src/{localdev → localRuntime}/index.js +0 -0
|
@@ -6,252 +6,106 @@ version: 2.0.0
|
|
|
6
6
|
|
|
7
7
|
# DraftGo 前端开发规范
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
本文件只保留 DraftGo 前端特有的运行契约和操作边界。架构见 `architecture.md`,iframe、认证和路由见 `runtime.md` / `app-api.md`,动态 DB 见 `data.md`。根 `SKILL.md` 的交付与验收规则优先,不在此重复增加浏览器动作。
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
> 架构原理 → `references/architecture.md`
|
|
13
|
-
> App API / Token / 路由 / 运行时 → `references/runtime.md` · `references/app-api.md`
|
|
14
|
-
> 动态 DB / filters → `references/data.md`
|
|
15
|
-
> 安全边界 → 本文件“必须 / 禁止”与 `references/runtime.md`;自定义服务权限与审计见 `references/custom-services.md`
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## 页面开发强制规则
|
|
20
|
-
|
|
21
|
-
### 真实闭环(强制)
|
|
22
|
-
|
|
23
|
-
- 页面必须有可访问 route,从真实入口可达(导航/首页/后台菜单/相关按钮至少一处)
|
|
24
|
-
- 按钮、表单、搜索、筛选、分页、提交、删除等交互默认真实有效
|
|
25
|
-
- 涉及异步数据、提交、搜索、筛选或接口调用时,必须覆盖相关加载态/空态/错误态/成功态,不能只堆静态卡片
|
|
26
|
-
- 展示可维护内容时主动判断是否需要后台管理页 + 同一份真实数据
|
|
27
|
-
- 业务模块尽量不要复制大量同构工作台;列表、详情、编辑、管理页优先按任务差异设计结构、密度和操作区
|
|
28
|
-
- 无法实现真实闭环时停止开发,向用户说明阻塞点;确认为平台限制、可复用经验或连续排查失败时再写入 `.draftgo/lessons/`
|
|
29
|
-
|
|
30
|
-
### 数据型页面可用性约束(强制)
|
|
31
|
-
|
|
32
|
-
数据型页面必须保证主要操作可达、滚动边界清晰,并使分页、批量操作或保存控件在空数据、少量数据和长列表状态下始终可用。横向溢出不能把核心操作藏到不可达区域,加载态、空态、错误态和成功态都必须保持页面结构稳定。
|
|
33
|
-
|
|
34
|
-
具体信息架构、DOM、组件、布局和视觉风格由 Agent 根据任务目标、受众、数据规模和现有资源自主设计。CLI 与 Skill 不提供页面骨架,也不指定工作台、表格页或其他固定页面结构。
|
|
35
|
-
|
|
36
|
-
### 文本与图标换行控制(强制)
|
|
37
|
-
|
|
38
|
-
按钮、标签、导航项、状态徽章等**小范围整体区域**内的文本和图标,**禁止自动换行**:
|
|
39
|
-
|
|
40
|
-
```css
|
|
41
|
-
/* ✅ 不换行,整体在同行显示 */
|
|
42
|
-
.btn-content { white-space: nowrap; }
|
|
43
|
-
|
|
44
|
-
/* ❌ 允许换行 → 宽度不足时文本/图标散落,视觉参差不齐 */
|
|
45
|
-
.btn-content { white-space: normal; } /* 默认即 normal,必须显式覆盖 */
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
**常见中招场景**:
|
|
49
|
-
- 按钮内文字 + 图标(`提交` + `→` 换行变两行)
|
|
50
|
-
- 操作行内的多个 icon+文字 组合(不同按钮高度不一)
|
|
51
|
-
- 标签/徽章内文字换行导致错位
|
|
52
|
-
- 表单字段名 + 输入框 并排时字段名换行
|
|
53
|
-
|
|
54
|
-
**判断标准**:这块内容在视觉上是一个整体(属于同一个操作、同一个标签、同一个单元),就不应该因为容器宽度被拆开。整行拆行是可以的,但**同组内的子元素不能拆行**。
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
### 移动端与多端适配(按页面目标与影响范围)
|
|
59
|
-
|
|
60
|
-
移动端适配是产品与受众判断,不是所有页面的固定验收门。公众页面、可能从手机访问的业务页面、已有响应式断点,或本次修改涉及布局、导航和弹窗时,应认真处理窄屏;明确的桌面工作台、仅改文案或数据逻辑时,不要机械增加移动端检查。
|
|
61
|
-
|
|
62
|
-
响应式实现只规定结果,不提供固定配方:
|
|
63
|
-
|
|
64
|
-
- 内容使用可用空间并避免整页横向溢出;容器宽度、断点和边距沿用现有设计系统,或根据真实内容和目标设备确定。
|
|
65
|
-
- 并排区域必须在目标窄屏上保持阅读顺序、核心操作和导航可达;是否堆叠、隐藏次要信息或调整密度由 Agent 自主设计。
|
|
66
|
-
- 按钮、链接和导航项应提供适合目标设备的操作区域,相邻操作避免误触。
|
|
67
|
-
- 字体、标题层级和间距在目标视口保持清晰且不遮挡内容,不预设统一字号或间距尺度。
|
|
68
|
-
- 表格、代码和其他超宽内容应在合理边界内可访问,不能让核心操作因溢出而不可达。
|
|
69
|
-
- 弹窗和抽屉在目标视口内完整可用,长内容有明确滚动边界。
|
|
70
|
-
|
|
71
|
-
需要浏览器证据时按页面受众和现有断点运行 `draftgo verify <type> <id> --url <url>`;只有验收确实覆盖多端时加 `--viewport both`,不要机械遍历与任务无关的视口。业务 HTML 位于 iframe 时默认 `--frame auto` 会检查顶层和可见 iframe,`--selector` 可直接定位业务 DOM。
|
|
72
|
-
|
|
73
|
-
### 导航与系统页边界(强制)
|
|
74
|
-
|
|
75
|
-
- 顶部导航已有内置资源时,先通过 MCP 查询导航元数据;需要分析或编辑完整 HTML 时执行 `draftgo checkout nav <id>`,读取 worktree 文件。需要新导航时优先基于现有结构创建或复刻,而不是直接改坏内置导航。
|
|
76
|
-
- 导航栏通常要同时考虑未登录 / 已登录 / 管理员三种状态,以及收起 / 展开状态;普通用户不显示管理后台入口,管理员额外显示管理后台入口。
|
|
77
|
-
- 管理端侧边栏通常基于现有内置侧边栏修改,新增业务管理路由优先追加或局部调整;删除系统内置页面入口前先确认影响。
|
|
78
|
-
- 业务页面内可以做局部二级导航或侧边栏,但必须考虑外部导航已存在且可单独配置,避免重复渲染全局导航。
|
|
79
|
-
- 系统内置页面通常不改;确需修改登录、设置、权限、用户、系统配置等页面时,先说明影响、验证方式和保留的管理员能力。
|
|
80
|
-
- 页面风格不要照搬管理侧内置页面;业务前台按业务用户和品牌语境设计,管理侧按操作效率和信息密度设计。
|
|
11
|
+
## 页面决策
|
|
81
12
|
|
|
82
13
|
### 页面身份与创建
|
|
83
14
|
|
|
84
|
-
业务新页面默认是数据库中的完整 HTML
|
|
15
|
+
业务新页面默认是数据库中的完整 HTML 页面。先结合用户意图与 MCP 中的标题、route、用途和入口判断目标:
|
|
85
16
|
|
|
86
|
-
- 用户指定页面、ID、已有 route
|
|
87
|
-
- 用户明确要求新增,或需求需要独立 route
|
|
88
|
-
-
|
|
17
|
+
- 用户指定页面、ID、已有 route,或现有页面职责明确一致:修改已有页面,确认唯一 ID 后 checkout。
|
|
18
|
+
- 用户明确要求新增,或需求需要独立 route 且定向搜索无合适页面:通过实时 API 创建,取得 ID 后 checkout;完整 HTML 仍只走 checkout/commit。
|
|
19
|
+
- “做一个功能页面”本身不等于新增,也不等于修改。证据足够时直接推进;多个候选会导致不同产品结果时再向用户澄清。
|
|
89
20
|
|
|
90
|
-
|
|
21
|
+
搜索只需按标题、route 或用途逐步缩小范围。Checkout 应对应已确认的目标资源;新资源先创建并取得 ID。不要枚举无关页面。
|
|
91
22
|
|
|
92
|
-
###
|
|
23
|
+
### 入口与导航
|
|
93
24
|
|
|
94
|
-
-
|
|
95
|
-
-
|
|
96
|
-
-
|
|
97
|
-
-
|
|
25
|
+
- 新页面应从真实业务入口可达:公开页接导航、首页或相关操作;后台页接后台导航或管理菜单。隐藏页、回调页和链接直达页可按产品目的不绑定全局入口。
|
|
26
|
+
- 多页面功能应让列表、详情、新建、编辑或管理流程互相走通。
|
|
27
|
+
- 顶部导航先用 MCP 定位;需要完整 HTML 时 `draftgo checkout nav <id>`。新增业务入口优先局部调整现有导航,不破坏系统入口。
|
|
28
|
+
- 导航按产品需要处理未登录、已登录、管理员及收起状态。普通用户不得看到管理入口。
|
|
29
|
+
- 业务页面可有局部导航,但不要重复渲染外部全局导航。修改登录、设置、权限、用户、系统配置等内置页面前先核对影响和管理员能力。
|
|
98
30
|
|
|
99
|
-
|
|
31
|
+
导航资源根元素使用:
|
|
100
32
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
-
|
|
33
|
+
| 属性 | 含义 |
|
|
34
|
+
|---|---|
|
|
35
|
+
| `data-nav-position="top\|side"` | 必填位置 |
|
|
36
|
+
| `data-nav-width="220px"` | 可选侧栏展开宽度,默认 260px |
|
|
37
|
+
| `data-nav-collapsed-width="64px"` | 可选收起宽度,默认 72px |
|
|
104
38
|
|
|
105
|
-
|
|
39
|
+
链接使用 `href` 与 `data-page-route`,避免用硬编码 `onclick` 模拟路由。
|
|
106
40
|
|
|
107
|
-
|
|
41
|
+
### 首页特例
|
|
108
42
|
|
|
109
|
-
|
|
43
|
+
`page_1_root.html` 若仍保留 DraftGo 默认文案、系统介绍和未定制品牌,可按用户目标改造;已经定制时只改需求范围。不要只凭文件名判断。
|
|
110
44
|
|
|
111
|
-
|
|
112
|
-
- 主动考虑适量动效能否帮助用户理解层级、状态变化、空间关系和操作结果。没有明确体验收益时可以不用,不为动效而动效。
|
|
113
|
-
- 动效可按场景使用 CSS transition/animation、Web Animations API、组件库能力或 GSAP;具体方案由 Agent 根据页面需要决定。
|
|
114
|
-
- 动效不能阻塞操作、掩盖等待或造成明显布局跳动;关键状态不能只靠动画表达,并为 `prefers-reduced-motion` 提供降级。
|
|
115
|
-
- 修改既有页面时尊重原有产品语言和交互习惯;新增体验应与页面目标一致,而不是机械套用统一模板。
|
|
45
|
+
## 体验结果
|
|
116
46
|
|
|
117
|
-
|
|
47
|
+
任何前端页面的开发都应从用户体验出发。根据用户、核心任务、频率、数据规模和目标设备决定信息架构、组件、布局与视觉,不套固定页面骨架。
|
|
118
48
|
|
|
119
|
-
|
|
49
|
+
- 按钮、表单、搜索、筛选、分页、提交和删除等已呈现交互应真实有效;主要流程必须闭环。
|
|
50
|
+
- 异步流程覆盖相关加载、空数据、错误、成功、无权限和重试状态,不能因请求延迟或失败整页空白。
|
|
51
|
+
- 数据型页面应让主要操作、分页、批量操作和保存控件在空、短、长列表下都可达;滚动边界明确,横向溢出不能隐藏核心操作。
|
|
52
|
+
- 展示可维护内容时判断是否需要管理入口并复用同一份真实数据。列表、详情和编辑结构按任务差异设计,不复制大量同构工作台。
|
|
53
|
+
- 按钮、标签、导航项、徽章等视觉整体内部使用 `white-space: nowrap`;整组可换行,但图标与文字不能被拆散。
|
|
54
|
+
- 空态需有明确文案和下一步操作;自定义空态用 flex 对齐图标与文字,不依赖 `text-align` 居中块级图标。
|
|
55
|
+
- 弹窗和抽屉把滚动放在内容区,避免双滚动条;flex 内容区使用 `min-height: 0` 保持滚动可用。
|
|
56
|
+
- 下拉选择使用组件库选择器或可访问的自定义弹层,不使用浏览器默认 `<select>`。
|
|
120
57
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
### 必须
|
|
124
|
-
- 完整 HTML 文档结构(`<html><head><body>`)
|
|
125
|
-
- 静态资源用本地路径(见下方资源清单)
|
|
126
|
-
- 配色优先使用系统主题语义 token `var(--dg-*)`,并同时适配浅色 / 深色模式
|
|
127
|
-
- 弹窗用 `App.confirm()` / `App.toast()`,禁止 `window.alert/confirm/prompt`
|
|
128
|
-
- 弹窗/抽屉优先做成无外层滚动条,滚动控制在内容区
|
|
129
|
-
- 页面初始渲染展示默认状态(骨架屏),不能因请求延迟空白
|
|
130
|
-
|
|
131
|
-
### 禁止
|
|
132
|
-
- ❌ 境外 CDN(googleapis / jsdelivr / cdnjs / unpkg);优先使用 `/assets/` 本地资源,确需外部资源时使用可信的国内镜像并固定版本
|
|
133
|
-
- ❌ `window.alert/confirm/prompt`
|
|
134
|
-
- ❌ `App()` 写法 → ✅ `const App = window.parent?.App`
|
|
135
|
-
- ❌ `window.location.search` 读参数 → ✅ `window.__DG_ROUTE_CONTEXT__.query`
|
|
136
|
-
- ❌ 页面内 `window.location.href=...` 跳转 → ✅ `window.parent.location.href=...`
|
|
137
|
-
- ❌ 把 TSX、ESM import、npm 依赖或构建产物直接写进数据库 HTML;需要 React 时使用基座内置的 React UMD 与兼容组件库
|
|
138
|
-
- ❌ 硬编码颜色值 → ✅ `var(--dg-*)`
|
|
139
|
-
- ❌ 在业务页面实现全局浮窗/客服/统计脚本 → ✅ `frontend_global_*` 固定槽位
|
|
140
|
-
- ❌ 在业务页面重写 Toast 组件 → ✅ 使用 `App.toast()`,视觉、位置、大小、透明度、时长通过 `frontend_global_toast_*` 系统配置统一调整
|
|
58
|
+
### 响应式
|
|
141
59
|
|
|
142
|
-
|
|
60
|
+
移动端是产品范围,不是固定验收门。公众页面、手机访问场景或已有响应式布局应处理窄屏;明确桌面工作台或仅改数据逻辑时不机械增加多端工作。
|
|
143
61
|
|
|
144
|
-
|
|
62
|
+
在目标设备上保证:无整页横向溢出;阅读顺序和核心操作可达;表格/代码等宽内容有可访问滚动边界;弹窗完整可用;文字、导航和操作区不重叠。断点、堆叠和密度由真实内容及现有设计系统决定。
|
|
145
63
|
|
|
146
|
-
###
|
|
64
|
+
### 动效
|
|
147
65
|
|
|
148
|
-
|
|
149
|
-
- **业务页面和导航 HTML**存储在数据库资源中,由壳层以 iframe 运行。它们必须是完整的原生 HTML 文档,不能写入 TSX、ESM import、npm 依赖或 Vite 构建产物。
|
|
150
|
-
- 数据库页面需要 React 时,只能使用下方内置的 React 18 UMD 资源和 `window.React` / `window.ReactDOM`。不要把壳层的 React 19 npm 依赖、外部 CDN 或其他 React 版本混入页面。
|
|
151
|
-
- 只有用户明确要求修改 DraftGo 壳层前端时,才处理 `frontend/` 源码。
|
|
66
|
+
动效仅用于解释层级、状态、空间关系或操作结果。可用 CSS、Web Animations、组件库或内置 GSAP,并为 `prefers-reduced-motion` 降级;不得阻塞操作、掩盖等待、引发布局跳动或成为唯一状态表达。
|
|
152
67
|
|
|
153
|
-
|
|
68
|
+
GSAP 从 `/assets/vendor/gsap/gsap.min.js` 先加载核心,再按需加载插件并 `gsap.registerPlugin(...)`。可用插件:`ScrollTrigger`、`ScrollToPlugin`、`Draggable`、`Flip`、`SplitText`、`MorphSVGPlugin`、`MotionPathPlugin`、`DrawSVGPlugin`、`Observer`、`EasePack`、`CustomEase`、`TextPlugin`。页面卸载时 kill timeline/trigger;同一属性不要同时由 CSS transition 与 GSAP 控制。
|
|
154
69
|
|
|
155
|
-
|
|
156
|
-
|---|---:|---|---|
|
|
157
|
-
| Ant Design | 5.29.3 | React 18 UMD,导出 `window.antd` | `/assets/antd/reset.css`、`/assets/react/react.min.js`、`/assets/react-dom/react-dom.min.js`、`/assets/dayjs/dayjs.min.js`、`/assets/antd/antd.min.js` |
|
|
158
|
-
| Basecoat UI | 1.0.2 | HTML + CSS/JS,导出 `window.basecoat` | `/assets/vendor/basecoat/basecoat.min.css`、`/assets/vendor/basecoat/basecoat.min.js` |
|
|
159
|
-
| Oat UI | 0.7.0 | Web Components,导出 `window.ot` | `/assets/vendor/oat/oat.min.css`、`/assets/vendor/oat/oat.min.js` |
|
|
70
|
+
## 运行形态
|
|
160
71
|
|
|
161
|
-
|
|
72
|
+
- DraftGo 壳层位于 `frontend/`,使用 React 19 + Vite 8 + Tailwind CSS 4。只有用户明确要求修改壳层时才编辑该源码。
|
|
73
|
+
- 业务页面与导航存储为数据库中的完整 HTML 文档,由壳层在 iframe 中运行。不得写入 TSX、ESM import、npm 依赖或 Vite 构建产物。
|
|
74
|
+
- 数据库页面需要 React 时,只能使用内置 React 18 UMD 的 `window.React` / `window.ReactDOM`;不要混入壳层 React 19 或其他版本。
|
|
75
|
+
- 页面使用 `const App = window.parent?.App`。参数读取 `window.__DG_ROUTE_CONTEXT__.query`;页面跳转使用父窗口;登出调用 `await App.logout()`。
|
|
162
76
|
|
|
163
|
-
|
|
77
|
+
## 必须与禁止
|
|
164
78
|
|
|
165
|
-
|
|
79
|
+
必须:
|
|
166
80
|
|
|
167
|
-
-
|
|
168
|
-
- `
|
|
169
|
-
-
|
|
81
|
+
- 提交完整 `<html><head><body>` 文档,静态资源使用下方本地路径。
|
|
82
|
+
- 默认使用 `var(--dg-*)` 主题 token,并支持浅色/深色;用户输入或不可信 HTML 经 DOMPurify 净化。
|
|
83
|
+
- 使用 `App.confirm()`、`App.toast()` 或对应反馈 API;关键状态不能只靠颜色或动画。
|
|
84
|
+
- 初始渲染立即显示稳定的加载状态。
|
|
170
85
|
|
|
171
|
-
|
|
172
|
-
<!-- Basecoat:组件 CSS 在前,DraftGo 主题适配层在后 -->
|
|
173
|
-
<link href="/assets/vendor/basecoat/basecoat.min.css" rel="stylesheet">
|
|
174
|
-
<link href="/assets/adapters/draftgo-theme.css" rel="stylesheet">
|
|
175
|
-
<script src="/assets/adapters/draftgo-ui.js"></script>
|
|
176
|
-
<script src="/assets/vendor/basecoat/basecoat.min.js" defer></script>
|
|
86
|
+
禁止:
|
|
177
87
|
|
|
178
|
-
|
|
179
|
-
|
|
88
|
+
- 境外 CDN(googleapis、jsdelivr、cdnjs、unpkg);品牌图标的明确例外见资源章节。
|
|
89
|
+
- `window.alert/confirm/prompt`、`App()`、`window.location.search`、页面内直接 `window.location.href=...`。
|
|
90
|
+
- 把 TSX、ESM、npm 依赖或构建产物写进数据库 HTML。
|
|
91
|
+
- 在业务页面实现全局浮窗、客服、统计脚本或重复 Toast;使用 `frontend_global_*` 槽位和系统配置。
|
|
92
|
+
- 用无作用域 CSS 覆盖组件库内部 hover、focus、disabled、error 状态。
|
|
180
93
|
|
|
181
|
-
|
|
182
|
-
<!-- Oat:同样让主题适配层位于组件 CSS 之后 -->
|
|
183
|
-
<link href="/assets/vendor/oat/oat.min.css" rel="stylesheet">
|
|
184
|
-
<link href="/assets/adapters/draftgo-theme.css" rel="stylesheet">
|
|
185
|
-
<script src="/assets/adapters/draftgo-ui.js"></script>
|
|
186
|
-
<script src="/assets/vendor/oat/oat.min.js" defer></script>
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
## 本地静态资源清单
|
|
94
|
+
## 组件与资源
|
|
190
95
|
|
|
191
|
-
|
|
192
|
-
|---|---|
|
|
193
|
-
| `/assets/tailwindcss.js` | Tailwind CSS 运行时 |
|
|
194
|
-
| `/assets/antd/reset.css` | Ant Design 5.29.3 reset CSS(antd 必须) |
|
|
195
|
-
| `/assets/react/react.min.js` | React 18 UMD → `window.React` |
|
|
196
|
-
| `/assets/react-dom/react-dom.min.js` | ReactDOM 18 UMD → `window.ReactDOM` |
|
|
197
|
-
| `/assets/dayjs/dayjs.min.js` | dayjs → antd DatePicker 依赖 |
|
|
198
|
-
| `/assets/antd/antd.min.js` | Ant Design 5.29.3 UMD → `window.antd` |
|
|
199
|
-
| `/assets/adapters/draftgo-ui.js` | DraftGo UI 适配器;提供 `window.DraftGoUI`、组件库按需加载和 AntD 主题接入 |
|
|
200
|
-
| `/assets/adapters/draftgo-theme.css` | Basecoat / Oat 到 DraftGo `--dg-*` 主题 token 的 CSS 映射;应后于对应组件 CSS 加载 |
|
|
201
|
-
| `/assets/vendor/basecoat/basecoat.min.css` + `basecoat.min.js` | Basecoat UI 1.0.2,原生 HTML 组件库 |
|
|
202
|
-
| `/assets/vendor/oat/oat.min.css` + `oat.min.js` | Oat UI 0.7.0,Web Components 组件库 |
|
|
203
|
-
| `/assets/fontawesome/css/all.min.css` | FontAwesome 6 |
|
|
204
|
-
| `/assets/icons/{name}.svg` | 内置精选 SVG 图标库(kebab-case 命名) |
|
|
205
|
-
| `/assets/icons/manifest.json` | 图标库映射清单 |
|
|
206
|
-
| `/assets/fonts/inter.css` | Inter 字体 |
|
|
207
|
-
| `/assets/fonts/lexend.css` | Lexend 字体 |
|
|
208
|
-
| `/assets/fonts/plus-jakarta-sans.css` | Plus Jakarta Sans |
|
|
209
|
-
| `/assets/fonts/plus-jakarta-sans-jetbrains-mono.css` | Plus Jakarta Sans + JetBrains Mono |
|
|
210
|
-
| `/assets/vendor/marked/marked.min.js` | Markdown 解析 |
|
|
211
|
-
| `/assets/vendor/highlightjs/highlight.min.js` | 代码语法高亮(highlight.js) |
|
|
212
|
-
| `/assets/vendor/prism/prism.min.js` | 轻量代码高亮(Prism.js) |
|
|
213
|
-
| `/assets/vendor/dompurify/purify.min.js` | HTML 净化,渲染用户输入前必须过一遍 |
|
|
214
|
-
| `/assets/vendor/html2canvas/html2canvas.min.js` | html2canvas 1.4.1,页面截图 / DOM 导出图片 |
|
|
215
|
-
| `/assets/draftgo-chat.js` | DraftGo Chat SDK 完整版,注册 `<dg-chat>` 与 `DraftGoChat` |
|
|
216
|
-
| `/assets/vendor/gsap/gsap.min.js` | GSAP 核心(先于其他 GSAP 插件加载) |
|
|
217
|
-
| `/assets/vendor/gsap/ScrollTrigger.min.js` | GSAP ScrollTrigger |
|
|
218
|
-
| `/assets/vendor/gsap/ScrollToPlugin.min.js` | GSAP ScrollTo |
|
|
219
|
-
| `/assets/vendor/gsap/Draggable.min.js` | GSAP Draggable |
|
|
220
|
-
| `/assets/vendor/gsap/Flip.min.js` | GSAP Flip |
|
|
221
|
-
| `/assets/vendor/gsap/SplitText.min.js` | GSAP SplitText |
|
|
222
|
-
| `/assets/vendor/gsap/MorphSVGPlugin.min.js` | GSAP MorphSVG |
|
|
223
|
-
| `/assets/vendor/gsap/MotionPathPlugin.min.js` | GSAP MotionPath |
|
|
224
|
-
| `/assets/vendor/gsap/DrawSVGPlugin.min.js` | GSAP DrawSVG |
|
|
225
|
-
| `/assets/vendor/gsap/Observer.min.js` | GSAP Observer(统一手势/滚动监听) |
|
|
226
|
-
| `/assets/vendor/gsap/EasePack.min.js` | GSAP 扩展缓动(Bounce/Elastic 等) |
|
|
227
|
-
| `/assets/vendor/gsap/CustomEase.min.js` | GSAP 自定义缓动曲线 |
|
|
228
|
-
| `/assets/vendor/gsap/TextPlugin.min.js` | GSAP 打字机效果 |
|
|
229
|
-
|
|
230
|
-
**图标用法**:
|
|
231
|
-
```html
|
|
232
|
-
<!-- 跟随文字颜色(推荐) -->
|
|
233
|
-
<span aria-hidden="true" style="width:16px;height:16px;display:inline-block;background:currentColor;-webkit-mask:url('/assets/icons/fingerprint.svg') center/contain no-repeat;mask:url('/assets/icons/fingerprint.svg') center/contain no-repeat;"></span>
|
|
234
|
-
<!-- 保留原色 -->
|
|
235
|
-
<img src="/assets/icons/fingerprint.svg" alt="" width="16" height="16">
|
|
236
|
-
```
|
|
96
|
+
### 内置组件库
|
|
237
97
|
|
|
238
|
-
|
|
98
|
+
| 名称 | 版本与形态 | 本地资源 |
|
|
99
|
+
|---|---|---|
|
|
100
|
+
| Ant Design | 5.29.3,React 18 UMD,`window.antd` | `/assets/antd/reset.css`、React、ReactDOM、dayjs、`/assets/antd/antd.min.js` |
|
|
101
|
+
| Basecoat UI | 1.0.2,HTML/CSS/JS,`window.basecoat` | `/assets/vendor/basecoat/basecoat.min.css`、`basecoat.min.js` |
|
|
102
|
+
| Oat UI | 0.7.0,Web Components,`window.ot` | `/assets/vendor/oat/oat.min.css`、`oat.min.js` |
|
|
239
103
|
|
|
240
|
-
|
|
241
|
-
<!-- SVG,保留品牌原色 -->
|
|
242
|
-
<img src="https://registry.npmmirror.com/@lobehub/icons-static-svg/1.91.0/files/icons/openai.svg" alt="OpenAI" width="18" height="18">
|
|
243
|
-
<img src="https://registry.npmmirror.com/@lobehub/icons-static-svg/1.91.0/files/icons/anthropic.svg" alt="Anthropic" width="18" height="18">
|
|
244
|
-
<img src="https://registry.npmmirror.com/@lobehub/icons-static-svg/1.91.0/files/icons/deepseek-color.svg" alt="DeepSeek" width="18" height="18">
|
|
245
|
-
```
|
|
104
|
+
`/assets/adapters/draftgo-ui.js` 提供 `window.DraftGoUI` 与 `DraftGoUI.load('antd'|'basecoat'|'oat')`。Basecoat/Oat 的 `/assets/adapters/draftgo-theme.css` 必须位于对应组件 CSS 之后。组件选择取决于任务,不强制套用。
|
|
246
105
|
|
|
247
|
-
|
|
106
|
+
### Ant Design 契约
|
|
248
107
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
Ant Design 5.29.3 已内置为 UMD 包(`window.antd`)。
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
### ① 依赖加载顺序(缺一不可,顺序不可乱)
|
|
108
|
+
手工加载顺序不可变:
|
|
255
109
|
|
|
256
110
|
```html
|
|
257
111
|
<link href="/assets/antd/reset.css" rel="stylesheet">
|
|
@@ -261,303 +115,55 @@ Ant Design 5.29.3 已内置为 UMD 包(`window.antd`)。
|
|
|
261
115
|
<script src="/assets/antd/antd.min.js"></script>
|
|
262
116
|
```
|
|
263
117
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
### ② DraftGo 主题接入
|
|
267
|
-
|
|
268
|
-
用 `antd.ConfigProvider` 包裹根组件,读取 `App.theme` 和 CSS 变量 `--dg-accent`,实现 dark/light 自动切换和主题色联动:
|
|
269
|
-
|
|
270
|
-
```javascript
|
|
271
|
-
const App = window.parent?.App;
|
|
272
|
-
|
|
273
|
-
function getAntdThemeConfig() {
|
|
274
|
-
const isDark = App?.theme === 'dark';
|
|
275
|
-
const accent = getComputedStyle(document.documentElement)
|
|
276
|
-
.getPropertyValue('--dg-accent').trim() || '#27272a';
|
|
277
|
-
return {
|
|
278
|
-
algorithm: isDark ? antd.theme.darkAlgorithm : antd.theme.defaultAlgorithm,
|
|
279
|
-
token: { colorPrimary: accent }
|
|
280
|
-
};
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
const Root = () => {
|
|
284
|
-
const [themeConfig, setThemeConfig] = React.useState(getAntdThemeConfig);
|
|
285
|
-
React.useEffect(() => {
|
|
286
|
-
const ob = new MutationObserver(() => setThemeConfig(getAntdThemeConfig()));
|
|
287
|
-
ob.observe(document.documentElement, {
|
|
288
|
-
attributes: true, attributeFilter: ['style', 'class', 'data-theme']
|
|
289
|
-
});
|
|
290
|
-
return () => ob.disconnect();
|
|
291
|
-
}, []);
|
|
292
|
-
return React.createElement(antd.ConfigProvider, { theme: themeConfig },
|
|
293
|
-
React.createElement(YourApp)
|
|
294
|
-
);
|
|
295
|
-
};
|
|
296
|
-
ReactDOM.createRoot(document.getElementById('root')).render(React.createElement(Root));
|
|
297
|
-
```
|
|
298
|
-
|
|
299
|
-
### ③ 组件状态样式的单一所有权
|
|
300
|
-
|
|
301
|
-
交互组件的 hover、focus、disabled、error 等状态,在同一视觉属性上只能由一个层级负责。组件库已经管理内部 DOM 和状态样式时,业务页不得再以 CSS 介入同一状态的边框、轮廓、阴影、背景或颜色;否则 CSS 层叠会把两套状态效果同时呈现,或在组件升级后产生不可预期的覆盖。
|
|
302
|
-
|
|
303
|
-
- 使用 AntD 等组件库时,组件库是状态样式的所有者。主题联动和样式调整走 `ConfigProvider`、design token 或组件公开的配置 API,不为其内部结构补写全局或通用选择器。
|
|
304
|
-
- 自建组件时,业务页才是状态样式的所有者;状态规则必须收敛到该组件的专有类或页面根容器内,不能影响其他组件或页面。
|
|
305
|
-
- 改动前先确认所有权;同一状态属性不得同时由 token/API 和 CSS 覆盖定义。若必须接管第三方组件样式,先移除或禁用原有对应效果,再用有作用域的规则完整接管。
|
|
306
|
-
|
|
307
|
-
### ④ DraftGo 平台反馈 API 对照
|
|
308
|
-
|
|
309
|
-
| antd 原生 | 对应平台 API |
|
|
310
|
-
|-----------|------|
|
|
311
|
-
| `Modal.confirm(...)` | `await App.confirm(msg, title)` |
|
|
312
|
-
| `Modal.info / warning(...)` | `App.showModal(msg, title)` |
|
|
313
|
-
| `message.success(...)` | `App.showSuccess(msg)` |
|
|
314
|
-
| `message.error(...)` | `App.showError(msg)` |
|
|
315
|
-
| `message.info / warning(...)` | `App.showInfo / showWarning(msg)` |
|
|
316
|
-
|
|
317
|
-
Tooltip(hover 浮层)无对应 App API,保留 antd 原生。
|
|
318
|
-
|
|
319
|
-
### ⑤ 禁止 ESM 方式加载 antd
|
|
320
|
-
|
|
321
|
-
```html
|
|
322
|
-
<!-- ❌ 禁止 —— antd ESM 版 Button 是 object 而非 React 组件 -->
|
|
323
|
-
<script type="module">
|
|
324
|
-
import * as antd from 'https://cdn.jsdelivr.net/npm/antd@6.x/+esm';
|
|
325
|
-
</script>
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
---
|
|
329
|
-
|
|
330
|
-
## 空状态(Empty State)规范
|
|
331
|
-
|
|
332
|
-
**触发:页面需要展示"暂无数据"、"列表为空"等空状态**
|
|
333
|
-
|
|
334
|
-
### ❌ 禁止写法(图标偏左 bug)
|
|
335
|
-
|
|
336
|
-
```javascript
|
|
337
|
-
// 错误:display:block 使 <i> 变为块级元素,text-align:center 对块级元素无效 → 图标偏左
|
|
338
|
-
h('div', { style: { textAlign: 'center' } },
|
|
339
|
-
h('i', { className: 'fa-solid fa-plug', style: { display: 'block' } }),
|
|
340
|
-
'暂无数据'
|
|
341
|
-
)
|
|
342
|
-
```
|
|
343
|
-
|
|
344
|
-
### antd 页面:`antd.Empty` 示例
|
|
118
|
+
不要加载 `antd.min.css`、ESM/CDN AntD 或其他版本。根组件使用 `antd.ConfigProvider`,根据 `App.theme` 选择 `antd.theme.darkAlgorithm/defaultAlgorithm`,并把 `--dg-accent` 传给 `token.colorPrimary`;监听根元素的 `style/class/data-theme` 变化以刷新主题。
|
|
345
119
|
|
|
346
|
-
|
|
347
|
-
const { Empty } = antd;
|
|
120
|
+
组件库是其内部状态样式的唯一所有者:优先用 ConfigProvider、design token 或公开 API。自建组件才由页面 CSS 管理状态,且规则限定在组件类或页面根内。
|
|
348
121
|
|
|
349
|
-
|
|
350
|
-
locale={{ emptyText: React.createElement(Empty, {
|
|
351
|
-
image: Empty.PRESENTED_IMAGE_SIMPLE,
|
|
352
|
-
description: '暂无数据'
|
|
353
|
-
}) }}
|
|
354
|
-
|
|
355
|
-
// 独立空状态区域
|
|
356
|
-
React.createElement(Empty, {
|
|
357
|
-
image: Empty.PRESENTED_IMAGE_SIMPLE,
|
|
358
|
-
description: '暂无 API,点击右上角「新增」开始注册'
|
|
359
|
-
})
|
|
360
|
-
```
|
|
361
|
-
|
|
362
|
-
### ✅ 非 antd 页面 / 自定义样式:flexbox 容器(禁止用 text-align 居中图标)
|
|
363
|
-
|
|
364
|
-
```html
|
|
365
|
-
<style>
|
|
366
|
-
.dg-empty {
|
|
367
|
-
display: flex; flex-direction: column;
|
|
368
|
-
align-items: center; justify-content: center;
|
|
369
|
-
padding: 48px 24px; gap: 10px;
|
|
370
|
-
color: var(--dg-text-muted);
|
|
371
|
-
}
|
|
372
|
-
.dg-empty-icon { font-size: 28px; opacity: .4; }
|
|
373
|
-
.dg-empty-text { font-size: 13px; }
|
|
374
|
-
</style>
|
|
375
|
-
|
|
376
|
-
<div class="dg-empty">
|
|
377
|
-
<i class="fa-solid fa-plug dg-empty-icon"></i>
|
|
378
|
-
<span class="dg-empty-text">暂无数据</span>
|
|
379
|
-
</div>
|
|
380
|
-
```
|
|
381
|
-
|
|
382
|
-
```javascript
|
|
383
|
-
// React h() 写法
|
|
384
|
-
h('div', { style: { display:'flex', flexDirection:'column', alignItems:'center',
|
|
385
|
-
justifyContent:'center', padding:'48px 24px', gap:10, color:'var(--dg-text-muted)' } },
|
|
386
|
-
h('i', { className: 'fa-solid fa-plug', style: { fontSize:28, opacity:.4 } }),
|
|
387
|
-
h('span', { style: { fontSize:13 } }, '暂无数据')
|
|
388
|
-
)
|
|
389
|
-
```
|
|
390
|
-
|
|
391
|
-
> **核心原则**:图标居中必须用 `align-items: center`(flexbox),不能依赖 `text-align: center` + `display: block`。
|
|
392
|
-
|
|
393
|
-
---
|
|
394
|
-
|
|
395
|
-
## GSAP 动效规范
|
|
396
|
-
|
|
397
|
-
GSAP 是 DraftGo 内置动效库。使用时遵守以下加载和清理约束。
|
|
398
|
-
|
|
399
|
-
加载规则:
|
|
400
|
-
- 核心 `gsap.min.js` 必须首先加载,其余插件按需选加
|
|
401
|
-
- 使用插件前必须调用 `gsap.registerPlugin(...)`
|
|
402
|
-
- GSAP 优先使用 `/assets/vendor/gsap/` 本地路径;确需 CDN 时优先使用国内镜像引入
|
|
403
|
-
|
|
404
|
-
```html
|
|
405
|
-
<script src="/assets/vendor/gsap/gsap.min.js"></script>
|
|
406
|
-
<script src="/assets/vendor/gsap/ScrollTrigger.min.js"></script>
|
|
407
|
-
<script>
|
|
408
|
-
gsap.registerPlugin(ScrollTrigger);
|
|
409
|
-
</script>
|
|
410
|
-
```
|
|
411
|
-
|
|
412
|
-
### 常用模式速查
|
|
413
|
-
|
|
414
|
-
**页面入场(卡片/列表逐个淡入上移)**
|
|
415
|
-
```javascript
|
|
416
|
-
gsap.from('.card', {
|
|
417
|
-
y: 30, opacity: 0, duration: 0.5, stagger: 0.08,
|
|
418
|
-
ease: 'power2.out', clearProps: 'all'
|
|
419
|
-
});
|
|
420
|
-
```
|
|
421
|
-
|
|
422
|
-
**滚动触发(元素进入视口时播放)**
|
|
423
|
-
```javascript
|
|
424
|
-
gsap.from('.section', {
|
|
425
|
-
scrollTrigger: { trigger: '.section', start: 'top 80%' },
|
|
426
|
-
y: 40, opacity: 0, duration: 0.6, ease: 'power3.out'
|
|
427
|
-
});
|
|
428
|
-
```
|
|
429
|
-
|
|
430
|
-
**Timeline 编排(多步骤有序动画)**
|
|
431
|
-
```javascript
|
|
432
|
-
const tl = gsap.timeline({ defaults: { ease: 'power2.out', duration: 0.4 } });
|
|
433
|
-
tl.from('.title', { y: -20, opacity: 0 })
|
|
434
|
-
.from('.subtitle', { y: -10, opacity: 0 }, '-=0.2')
|
|
435
|
-
.from('.btn', { scale: 0.9, opacity: 0 }, '-=0.1');
|
|
436
|
-
```
|
|
437
|
-
|
|
438
|
-
**数字滚动(计数器)**
|
|
439
|
-
```javascript
|
|
440
|
-
gsap.to({ val: 0 }, {
|
|
441
|
-
val: 9527, duration: 1.5, ease: 'power1.out',
|
|
442
|
-
onUpdate() { el.textContent = Math.round(this.targets()[0].val).toLocaleString(); }
|
|
443
|
-
});
|
|
444
|
-
```
|
|
445
|
-
|
|
446
|
-
**按钮 hover 微交互**
|
|
447
|
-
```javascript
|
|
448
|
-
document.querySelectorAll('.btn').forEach(btn => {
|
|
449
|
-
btn.addEventListener('mouseenter', () => gsap.to(btn, { scale: 1.04, duration: 0.2 }));
|
|
450
|
-
btn.addEventListener('mouseleave', () => gsap.to(btn, { scale: 1, duration: 0.2 }));
|
|
451
|
-
});
|
|
452
|
-
```
|
|
453
|
-
|
|
454
|
-
**SplitText 逐字入场**
|
|
455
|
-
```javascript
|
|
456
|
-
gsap.registerPlugin(SplitText);
|
|
457
|
-
const split = new SplitText('.headline', { type: 'chars' });
|
|
458
|
-
gsap.from(split.chars, { opacity: 0, y: 20, stagger: 0.04, duration: 0.5, ease: 'back.out(1.7)' });
|
|
459
|
-
```
|
|
460
|
-
|
|
461
|
-
### 注意事项
|
|
462
|
-
|
|
463
|
-
- 动画时长:微交互 0.15–0.25s,元素入场 0.4–0.6s,页面级过渡 0.6–1s
|
|
464
|
-
- `clearProps: 'all'` 适合只播一次的入场动画,避免 inline style 污染后续样式
|
|
465
|
-
- 页面卸载时清理:`ScrollTrigger.getAll().forEach(t => t.kill())`
|
|
466
|
-
- 不要同一元素混用 CSS transition 和 GSAP tween(会产生竞争)
|
|
467
|
-
- 不要为动效而动效;动画必须服务于体验,不能影响可用性
|
|
468
|
-
|
|
469
|
-
---
|
|
470
|
-
|
|
471
|
-
## 颜色 Token(强制)
|
|
472
|
-
|
|
473
|
-
| Token | 用途 |
|
|
122
|
+
| AntD | 平台反馈 |
|
|
474
123
|
|---|---|
|
|
475
|
-
|
|
|
476
|
-
|
|
|
477
|
-
|
|
|
478
|
-
|
|
|
479
|
-
|
|
480
|
-
配色决策顺序:
|
|
481
|
-
|
|
482
|
-
- 默认优先采用系统主题 token,让页面继承当前站点的 `App.theme` 与 `App.colorScheme`
|
|
483
|
-
- 页面与系统 token 明显不搭配、品牌要求、用户明确指定或图表需要区分多系列时,允许使用自主配色
|
|
484
|
-
- 自主配色必须提供浅色与深色两套变量或覆盖,不能只在当前主题下看起来正常
|
|
485
|
-
- 自主配色仍优先落成页面局部 CSS 变量,再由组件引用,避免把 hex / rgb 散落在样式里
|
|
486
|
-
- 所有正文、按钮、输入框、状态提示的文字对比度必须达到 WCAG AA(正文 4.5:1)
|
|
124
|
+
| `Modal.confirm` | `await App.confirm(msg, title)` |
|
|
125
|
+
| `Modal.info/warning` | `App.showModal(msg, title)` |
|
|
126
|
+
| `message.success/error` | `App.showSuccess/showError(msg)` |
|
|
127
|
+
| `message.info/warning` | `App.showInfo/showWarning(msg)` |
|
|
487
128
|
|
|
488
|
-
|
|
129
|
+
Tooltip 可保留组件库原生实现。
|
|
489
130
|
|
|
490
|
-
|
|
131
|
+
### 本地资源
|
|
491
132
|
|
|
492
|
-
|
|
493
|
-
// 读取(仅需 JS 分支时才读)
|
|
494
|
-
const theme = App?.theme; // 'light' | 'dark'
|
|
495
|
-
const scheme = App?.colorScheme; // 'dark-gray-white' | 'deep-blue-white' | ...
|
|
496
|
-
|
|
497
|
-
// 切换
|
|
498
|
-
App.applyTheme('dark');
|
|
499
|
-
App.setColorScheme('deep-blue-white');
|
|
500
|
-
```
|
|
501
|
-
|
|
502
|
-
---
|
|
503
|
-
|
|
504
|
-
## 导航栏开发
|
|
505
|
-
|
|
506
|
-
| 属性 | 说明 |
|
|
133
|
+
| 能力 | 路径 |
|
|
507
134
|
|---|---|
|
|
508
|
-
|
|
|
509
|
-
|
|
|
510
|
-
|
|
|
135
|
+
| Tailwind runtime | `/assets/tailwindcss.js` |
|
|
136
|
+
| React/AntD | `/assets/react/react.min.js`、`/assets/react-dom/react-dom.min.js`、`/assets/dayjs/dayjs.min.js`、`/assets/antd/antd.min.js` |
|
|
137
|
+
| UI adapters | `/assets/adapters/draftgo-ui.js`、`/assets/adapters/draftgo-theme.css` |
|
|
138
|
+
| Basecoat/Oat | `/assets/vendor/basecoat/*`、`/assets/vendor/oat/*` |
|
|
139
|
+
| Icons/fonts | `/assets/fontawesome/css/all.min.css`、`/assets/icons/{name}.svg`、`/assets/icons/manifest.json`、`/assets/fonts/*.css` |
|
|
140
|
+
| Markdown/code | `/assets/vendor/marked/marked.min.js`、`/assets/vendor/highlightjs/highlight.min.js`、`/assets/vendor/prism/prism.min.js` |
|
|
141
|
+
| HTML/security/export | `/assets/vendor/dompurify/purify.min.js`、`/assets/vendor/html2canvas/html2canvas.min.js` |
|
|
142
|
+
| Chat | `/assets/draftgo-chat.js` |
|
|
143
|
+
| Motion | `/assets/vendor/gsap/*.js` |
|
|
511
144
|
|
|
512
|
-
|
|
513
|
-
<aside data-nav-position="side" data-nav-width="220px">
|
|
514
|
-
<a href="/dashboard" data-page-route="/dashboard">仪表盘</a>
|
|
515
|
-
</aside>
|
|
516
|
-
```
|
|
145
|
+
通用图标优先使用本地图标或 FontAwesome。模型/Provider 品牌标识可用固定版本的 LobeHub `@lobehub/icons-static-svg` npmmirror URL;不得用 `latest`,也不得替代通用 UI 图标。
|
|
517
146
|
|
|
518
|
-
|
|
147
|
+
## 主题
|
|
519
148
|
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
-
|
|
523
|
-
-
|
|
524
|
-
-
|
|
149
|
+
| Token | 用途 |
|
|
150
|
+
|---|---|
|
|
151
|
+
| `--dg-bg-base/page/surface` | 背景层级 |
|
|
152
|
+
| `--dg-text-primary/secondary/muted` | 文字层级 |
|
|
153
|
+
| `--dg-accent/hover/subtle` | 主题色 |
|
|
154
|
+
| `--dg-border/success/error/warning` | 边框与状态 |
|
|
525
155
|
|
|
526
|
-
|
|
156
|
+
壳层已把变量注入 `<head>`,直接使用即可。默认继承 `App.theme` 与 `App.colorScheme`。品牌或图表需要自主配色时,先定义页面局部变量并提供 light/dark 两套值;正文和交互文字保持 WCAG AA。不要把 hex/rgb 散落在组件样式中。
|
|
527
157
|
|
|
528
158
|
## AIHub 页面 SDK
|
|
529
159
|
|
|
530
|
-
|
|
160
|
+
AI 对话 UI 使用:
|
|
531
161
|
|
|
532
162
|
```html
|
|
533
163
|
<script src="/assets/draftgo-chat.js"></script>
|
|
534
164
|
<dg-chat protocol="draftgo-agent" agent-id="AGENT_ID"></dg-chat>
|
|
535
165
|
```
|
|
536
166
|
|
|
537
|
-
动态创建使用 `DraftGoChat.create()`;无 UI
|
|
538
|
-
|
|
539
|
-
---
|
|
540
|
-
|
|
541
|
-
## 退出登录
|
|
542
|
-
|
|
543
|
-
```javascript
|
|
544
|
-
const App = window.parent?.App;
|
|
545
|
-
await App.logout(); // 请求服务端登出、清理认证状态、触发 auth 事件并跳转配置的登录页
|
|
546
|
-
```
|
|
547
|
-
|
|
548
|
-
---
|
|
549
|
-
|
|
550
|
-
## 加载体验
|
|
551
|
-
|
|
552
|
-
- 初始渲染必须先展示骨架屏,再异步填数据
|
|
553
|
-
- 禁止因请求失败导致整页空白
|
|
554
|
-
- 空态必须有明确文案 + 后续操作入口,不能留空或只有 loading
|
|
555
|
-
- 若父级是 flex 工作区,空态容器应 `flex:1` 承接剩余空间,避免高度塌陷
|
|
556
|
-
- 弹窗/抽屉内容区建议隐藏外层滚动条,把滚动控制在内容区:`overflow:hidden` + 内部 `overflow:auto; min-height:0`,避免双滚动条和粗糙滚动体验
|
|
557
|
-
|
|
558
|
-
## 选择器与表单体验
|
|
559
|
-
|
|
560
|
-
- 严禁使用浏览器默认的 `<select>` 控件;下拉选择必须使用组件库提供的选择器或自定义弹层菜单
|
|
561
|
-
- 确保触发态、浮层、选中态、禁用态和键盘操作都与页面风格及可访问性要求一致
|
|
167
|
+
动态创建使用 `DraftGoChat.create()`;无 UI 文本或图片调用可用同一脚本的 `DraftGoAI` 兼容门面。完整事件、会话和安全契约见 `chat-sdk.md`,Agent `spec` 见 `aihub.md`。
|
|
562
168
|
|
|
563
|
-
|
|
169
|
+
平台请求与反馈见 `app-api.md`;iframe 路由、认证与全局层见 `runtime.md`;动态 DB、`scope=mine`、筛选和关系见 `data.md`。
|