@lark-apaas/coding-steering 0.1.52-alpha.20260916121812 → 0.1.52
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/package.json +6 -6
- package/steering/nestjs-react-fullstack/skills/app-init-feasibility-guide/SKILL.md +2 -1
- package/steering/nestjs-react-fullstack/skills/coding-guide/SKILL.md +22 -9
- package/steering/nestjs-react-fullstack/skills/design-guide/SKILL.md +188 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/broadsheet.md +311 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/claude-editorial-research.md +375 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/corporate-blueprint.md +252 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/crimson-frosted-glass.md +221 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/cybernetic-vault-terminal.md +74 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/dashboard.md +233 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/digital-e-guide.md +349 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/flowbite.md +179 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/frontend-design.md +66 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/handwritten-sketch.md +211 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/industry.md +346 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/metabase.md +220 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/minimal-jade.md +205 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/nebula-crimson.md +306 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/nexuscore-analytics.md +74 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/organic-minimalism.md +251 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/phosphor-hud.md +214 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/pm-spec.md +233 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/pop-art.md +264 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/token-mapping.md +68 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/warm-elegance.md +215 -0
- package/steering/nestjs-react-fullstack/skills/design-guide/references/wild-orange.md +203 -0
- package/steering/nestjs-react-fullstack/skills/plugin-guide/SKILL.md +3 -1
- package/steering/nestjs-react-fullstack/skills_local/coding-guide/SKILL.md +9 -7
- package/steering/vite-react/skills/plugin-guide/SKILL.md +2 -5
package/package.json
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lark-apaas/coding-steering",
|
|
3
|
-
"version": "0.1.52
|
|
3
|
+
"version": "0.1.52",
|
|
4
4
|
"description": "Stack-specific steering content for miaoda-coding templates",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
7
7
|
"steering"
|
|
8
8
|
],
|
|
9
|
-
"scripts": {
|
|
10
|
-
"lint:md": "markdownlint 'steering/**/*.md' --ignore 'steering/**/skills/**' --ignore 'steering/**/skills_common/**' --ignore 'steering/**/skills_local/**'"
|
|
11
|
-
},
|
|
12
9
|
"devDependencies": {
|
|
13
10
|
"markdownlint-cli": "^0.47.0"
|
|
14
11
|
},
|
|
@@ -20,5 +17,8 @@
|
|
|
20
17
|
"miaoda",
|
|
21
18
|
"coding-steering"
|
|
22
19
|
],
|
|
23
|
-
"license": "MIT"
|
|
24
|
-
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"scripts": {
|
|
22
|
+
"lint:md": "markdownlint 'steering/**/*.md' --ignore 'steering/**/skills/**' --ignore 'steering/**/skills_common/**' --ignore 'steering/**/skills_local/**'"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -71,7 +71,7 @@ available-agents:
|
|
|
71
71
|
| 实时多人编辑、毫秒级协同 | 弱实时刷新、提交后同步 |
|
|
72
72
|
| 原生 App、桌面端、浏览器插件 | Web 应用、响应式页面 |
|
|
73
73
|
| 服务端持久写本地文件 | 平台文件服务、数据库、临时 `/tmp` |
|
|
74
|
-
|
|
|
74
|
+
| 在 `constructor`、`onModuleInit`、`onApplicationBootstrap` 中执行或直接发起下载大文件、全量同步或批量迁移 | 使用平台支持的独立异步任务或外部触发机制;不得在钩子内用 `void Promise`、异步 IIFE、定时器等方式后台发起 |
|
|
75
75
|
| 无凭证调用受限第三方系统 | 要求用户提供 API、凭证或授权方式 |
|
|
76
76
|
| 自建账号体系绕过平台登录 | 使用平台内置身份与权限 |
|
|
77
77
|
| 多语言 i18n、深浅色主题切换(非平台内置) | 需自行实现并计入工作量;规格中先确认是否必要 |
|
|
@@ -113,6 +113,7 @@ available-agents:
|
|
|
113
113
|
- 角色权限:查看、创建、编辑、删除、导出、配置等操作的分配。
|
|
114
114
|
- 集成点:飞书、多维表格、AI、内网接口、OpenAPI、自动化触发。
|
|
115
115
|
- 边界与限制:不支持的能力、外部依赖、数据权限边界。
|
|
116
|
+
- 启动约束:若有下载大文件、全量同步或批量迁移,规格中明确由平台支持的独立异步任务或外部触发机制执行;不得在 `constructor`、`onModuleInit` 或 `onApplicationBootstrap` 中执行或直接发起,声明为 `async`、使用 `void Promise`、异步 IIFE 或定时器均不符合要求。
|
|
116
117
|
- 交给 Code agent 时标明需要加载的专项 skill(表格、表单、图表、插件、权限、文件、自动化)。
|
|
117
118
|
- 需要 native addon 时:确认它提供覆盖 linux-x64 / glibc 的预编译二进制并记录包名与版本;没有预编译二进制、装的时候要现场编译的不能用。
|
|
118
119
|
|
|
@@ -139,6 +139,11 @@ shared/ # 前后端共享的目录
|
|
|
139
139
|
- **import 类型前必须确认实际导出**:先读取文件确认类型名称存在且拼写一致,禁止臆造类型名
|
|
140
140
|
- 属性统一 camelCase(禁止 snake_case),server 端 schema 的 snake_case 不应泄漏到接口类型
|
|
141
141
|
- shared 目录是前后端共享文件,**禁止反向引用** `@server/*`、`@client/*` 等路径别名
|
|
142
|
+
- **请求 DTO 中的 shared 字符串联合别名**:`shared/api.interface.ts` 是前后端契约权威。带 `class-validator` 的 NestJS 请求 DTO 字段若对应 shared 字符串字面量联合 `type` alias,不把 imported alias 直接写在 DTO 属性上;改用等价 inline literal union + `@IsString()` + `@IsIn([...])`,DTO class 仍 `implements` shared 请求接口。
|
|
143
|
+
- ❌ `type!: ExpressionElementType`
|
|
144
|
+
- ✅ `@IsString()` + `@IsIn(['tile', 'operator'])` + `type!: 'tile' | 'operator'`
|
|
145
|
+
- **机械核对**:先数 shared alias 字面量个数 N,inline union 和 `@IsIn` 数组都必须恰好 N 个,且每个字面量完全一致;数量或名称不等就是错,不能只写“不得窄于”。
|
|
146
|
+
- 边界:shared 真实 `enum` 用 `@IsEnum(EnumName)`;嵌套 DTO 用 `@ValidateNested()` + `@Type(() => XxxDto)`;普通对象字段用 `@IsObject()`;Date 转换按 `@Type(() => Date)` 处理。禁止用 `@Type(() => String)` 只为绕过 lint。
|
|
142
147
|
|
|
143
148
|
## 代码质量约束
|
|
144
149
|
|
|
@@ -210,6 +215,16 @@ dev server 只代理 `/api`、`/openapi`、`/__innerapi__`(外加 legacy 的 `
|
|
|
210
215
|
|
|
211
216
|
另外,`UserSelect` 弹层是**搜索驱动**的:不输关键词时列表为空属预期行为,不是接口挂了。
|
|
212
217
|
|
|
218
|
+
## 应用访问入口(404 / 白屏先看这里)
|
|
219
|
+
|
|
220
|
+
沙箱内页面入口、API 入口、NestJS 端口不是一回事,禁止用 `5173/3000/8001/8080` 枚举猜测。
|
|
221
|
+
|
|
222
|
+
- **看页面 / 白屏 / 交互**:优先用截图、视觉检查或 E2E 工具,并只传相对路径;工具会打开沙箱真实预览入口(E2E 走 8080 nginx/openresty 鉴权代理)。不要用 `curl` 拿 HTML 判断页面是否渲染。
|
|
223
|
+
- **测后端接口**:优先用接口测试工具,只传以 `/api` 或 `/openapi` 开头的业务路径;工具会自动拼 `CLIENT_BASE_PATH`、选择正确 dev 端口,并补 CSRF 与用户身份。
|
|
224
|
+
- **必须手写 curl 调 `/api/*` 时**:打 client dev server,不要打 NestJS `SERVER_PORT`;URL 必须带 `$CLIENT_BASE_PATH`,并同时带 `Cookie: suda-csrf-token=<X>` 与 `X-Suda-Csrf-Token: <X>`(两值字面相等)。漏 basePath 是 404,漏 CSRF 是 403,都不是业务代码 bug,不要为此改 csrf 中间件或给接口加白名单。
|
|
225
|
+
- **不要直连 NestJS 端口**:会绕过 dev server / 网关注入,`x-larkgw-suda-webuser` 缺失后 `userContext.userId` 为空,依赖身份的接口会误判。
|
|
226
|
+
- **判断服务是否启动**:看 `client-devserver` / `server-devserver` 日志的 ready / 编译成功。裸端口访问返回 404 或连不上(只监听 IPv6 等)都不能当服务故障的依据;同一 URL 连续两次同状态码就换排查方向,不要 `sleep` + curl 重试。
|
|
227
|
+
|
|
213
228
|
## 质量保障流程
|
|
214
229
|
|
|
215
230
|
通用提交前检查(代码检查 / 接口测试 / 读日志确认无错误)见系统任务流程约束;本栈具体落点:
|
|
@@ -263,10 +278,9 @@ dev server 只代理 `/api`、`/openapi`、`/__innerapi__`(外加 legacy 的 `
|
|
|
263
278
|
- **三方集成**:调用第三方 API 需在后端实现,使用 @nestjs/axios
|
|
264
279
|
- **能力边界**:服务端不支持文件上传(FaaS 限制),前端用 dataloom SDK 上传,服务端仅保存元信息
|
|
265
280
|
- **环境判断**:`process.env.NODE_ENV === "production"` 表示生产环境
|
|
266
|
-
-
|
|
267
|
-
- **启动关键路径**:`bootstrap`、`onModuleInit` 和 `OnApplicationBootstrap` 只做必须的同步装配,不得执行 DDL、全量数据同步、长轮询或无界外部请求。应用应尽早 `listen()`;非关键预热放到后台任务,外部调用必须有超时、错误日志和降级路径
|
|
281
|
+
- **运行时文件系统(CRITICAL)**:生产 FaaS 中 `process.cwd()` 指向只读部署目录 `/opt/bytefaas`;禁止在该目录或项目目录下创建或写入 `uploads`、`logs`、缓存等,也禁止“先写工作目录,失败再回退 `/tmp`”。临时文件、下载内容和处理中间产物必须直接写入 `/tmp` 下的独立目录
|
|
268
282
|
- **服务端运行时资源文件**(字体 / 证书 / 模板 / wasm 等需在运行时读取的非代码文件,CRITICAL — 发布后静默失效根因):① 必须在 `nest-cli.json` 的 `assets` 中声明(如 `{"include": "assets/<dir>/**/*", "outDir": "dist/server"}`),否则不会进 `dist/` 构建产物;② 路径用 `__dirname` 相对**编译产物**定位(如 `path.join(__dirname, "../assets/...")`),**禁止 `process.cwd()` 相对源码路径**——dev 跑源码能命中、发布跑 `dist/` 会落空;③ 资源缺失或加载失败必须 **fail-loud**(抛错或明确错误日志),禁止 `catch` 后静默返回残缺产物
|
|
269
|
-
- **启动生命周期**:`constructor`、`onModuleInit` 和 `onApplicationBootstrap`
|
|
283
|
+
- **启动生命周期**:`bootstrap`、`constructor`、`onModuleInit` 和 `onApplicationBootstrap` 都位于服务启动或就绪关键路径,应快速完成,只做必要且确定的装配、内存初始化和配置校验;不得在其中执行或直接发起 DDL、下载大文件、全量同步、批量迁移、长轮询或无界外部请求。仅将钩子声明为 `async`,或在钩子内用 `void Promise`、异步 IIFE、定时器等 fire-and-forget 写法启动任务,都不算移出启动流程;耗时工作必须由平台支持的独立异步任务或外部触发机制执行
|
|
270
284
|
|
|
271
285
|
## 日志约定
|
|
272
286
|
|
|
@@ -368,7 +382,11 @@ await db.select().from(users).where(eq(users.adminUser, userId));
|
|
|
368
382
|
- **Drizzle raw `sql` 参数不走列 encoder**:绑定 schema 列的 helper 会编码;raw `sql` 的 `${...}` 只是 driver 参数。Date / custom type 进 raw SQL 前先转 driver-safe 标量(时间用 ISO string)或改回 helper;`user_profile` 仍按上一小节专表处理。
|
|
369
383
|
- raw SQL 聚合、`filter (...)`、`CASE WHEN`、窗口函数或复杂 where 涉及 Date / custom type 时,按 `raw-sql-boundary-audit` 审计,并实际调用对应 API 验证 HTTP 200,避免隐藏 500。
|
|
370
384
|
|
|
371
|
-
-
|
|
385
|
+
- **时间字段:写库前查 `schema.ts`,别按 SQL 列名猜**(drizzle-date-boundary-v1)。用 `typeof table.$inferInsert` / `$inferSelect` 看这列在 TS 里是 `Date` 还是 `string`——custom type 会改掉默认映射。
|
|
386
|
+
- 列是 `Date`、DTO 给字符串 → 转成 `Date` 再写,非法值抛 `BadRequestException`,update 保留 `null`。
|
|
387
|
+
- 列是 `string` → 原样写,别转 `Date`。
|
|
388
|
+
- 读出 `Date` → 出口 `.toISOString()`;读出 `string` → 原样返回。`shared/api.interface.ts` 里两类都声明为 `string`。
|
|
389
|
+
- `toDriver` 收得比应用类型宽,但 `.values()` / `.set()` 只认 `$inferInsert`;别靠放宽 custom type 消错。
|
|
372
390
|
|
|
373
391
|
- **禁止删类型注解消除报错**(`as unknown as T` 同禁):典型症状是「改完 service,错误跑到 controller 了」——错误没有转移,是校验点被往外推了一层;推到最外层删完,报错归零而契约失守。
|
|
374
392
|
|
|
@@ -627,11 +645,6 @@ import { axiosForBackend } from '@lark-apaas/client-toolkit/utils/getAxiosForBac
|
|
|
627
645
|
// ✅ axiosForBackend.get('/api/users') / .post(...) 等实例方法(axiosForBackend 是 axios.create 返回的实例)
|
|
628
646
|
```
|
|
629
647
|
|
|
630
|
-
- `axiosForBackend.get<T>()` 等方法的 `T` 是完整 HTTP response body,即 `response.data` 的类型。
|
|
631
|
-
- 调用前核对 controller、service 返回值和 `shared` 类型;信息不足时,依据实际运行响应决定提取层级。
|
|
632
|
-
- 具名 flat body 读取 `response.data`;仅当具名合同明确声明 `{ data: T }` envelope 时,才读取 `response.data.data`。
|
|
633
|
-
- 不要临时添加匿名内联 wrapper 适配提取代码,也不要全局替换或禁止 `response.data.data`;按接口合同提取。
|
|
634
|
-
|
|
635
648
|
- **前后端联调**:编写前端 API 对接代码前**必须先读取后端接口定义**,禁止对后端接口请求进行兜底和过度封装
|
|
636
649
|
- **全栈项目禁止 mock 数据**:只要有服务端接口就当全栈对待,严禁 mock。纯前端项目(静态展示、无后端)可以使用 mock
|
|
637
650
|
- **提交前检查 mock 残留**:禁止硬编码用户 ID、项目 ID 等 mock 数据。提交前确认无 `"user_xxx"`、`"project_1"` 等占位值
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: design-guide
|
|
3
|
+
description: 写第一个页面、组件或样式文件之前确定并记录视觉方向:沿用已有设计、遵循用户指定、匹配预置风格,或交给 frontend-design 自行设计。
|
|
4
|
+
steering: true
|
|
5
|
+
steering-topic: frontend_design
|
|
6
|
+
match-template-name: nestjs-react-fullstack
|
|
7
|
+
control-by-feature-ab: true
|
|
8
|
+
hook: SessionStart
|
|
9
|
+
available-agents:
|
|
10
|
+
- Code
|
|
11
|
+
metadata:
|
|
12
|
+
display-names:
|
|
13
|
+
zh-CN: 设计指南
|
|
14
|
+
en-US: Design Guide
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# 设计指南
|
|
18
|
+
|
|
19
|
+
写第一个页面、组件或样式文件之前,先确定应用要呈现什么样子。设计要有明确特点,并适合当前产品。
|
|
20
|
+
|
|
21
|
+
仅修改现有应用的数据、功能或局部内容,且用户没有要求调整整体视觉时,沿用已有设计,不重新匹配风格,也不改写已有设计方向。新增页面或组件本身不代表需要换风格。
|
|
22
|
+
|
|
23
|
+
需要确定新的视觉方向时,先理解产品做什么、给谁使用、最重要的任务是什么,以及用户期望的氛围和使用感受。设计元素可以来自产品相关的材料、工具、物品和常用说法。推断必须有用户需求或已知上下文作为依据,不补写用户没有表达的审美偏好。
|
|
24
|
+
|
|
25
|
+
## 选择设计方向
|
|
26
|
+
|
|
27
|
+
按以下顺序判断:
|
|
28
|
+
|
|
29
|
+
### 1. 遵循用户明确指定的方向
|
|
30
|
+
|
|
31
|
+
用户点名某个预置风格时,直接采用该风格。用户要求还原或沿用某个参考设计,或已经给出足以确定整体视觉方向的配色、排版与组件形态时,按用户指定执行。
|
|
32
|
+
|
|
33
|
+
“高级一点”“有科技感”“活泼一些”“偏深色”等属于偏好线索,不是完整方案;“深色背景”“绿色主色”等局部要求需要保留,但仍应在这些要求内继续匹配预置风格或自行设计。截图、附件或产品链接只有在用户明确要求参考其视觉时,才作为视觉方向;只用于提供功能或内容时,不据此判断用户指定了风格。
|
|
34
|
+
|
|
35
|
+
### 2. 匹配预置风格
|
|
36
|
+
|
|
37
|
+
用户没有给出完整方案时,不要看到某类应用就固定选择一种风格。先从下面四方面找出 2–4 个都可能合适的预置风格:
|
|
38
|
+
|
|
39
|
+
1. 页面主要用途:操作、分析数据、阅读内容、填写表单或展示产品。
|
|
40
|
+
2. 用户想要的感觉:冷静或亲和、克制或张扬、明亮或深色、现代或杂志感。
|
|
41
|
+
3. 实际使用情况:频繁操作或沉浸浏览、内容紧凑或留白较多、主要在电脑使用或经常在窄屏使用。
|
|
42
|
+
4. 产品自身特点:所属行业、常见物品、材料、目标用户和常用说法能否自然融入该风格。
|
|
43
|
+
|
|
44
|
+
索引只帮助初步选择,不表示某类应用只能使用某个风格。同一种应用通常有多个合理候选。比较候选时,先按主要界面机制缩小范围,而不是按行业名称决定:
|
|
45
|
+
|
|
46
|
+
- 高频操作、表格和表单为主:区分标准组件化软件、温和紧凑的指标工作台、开阔的数据分析画布、绿色轻影的任务与指标面板。
|
|
47
|
+
- 报告、知识和连续阅读为主:区分冷静的纸面规格文档、人文研究编辑界面、杂志式纸张层次、新闻印刷结构。
|
|
48
|
+
- 强视觉展示或沉浸浏览为主:区分深色技术面板、毛玻璃舞台、明暗叙事区块、粗边硬影或漫画拼贴。
|
|
49
|
+
- 轻量查询、填写或个人工具:只有大留白、超大圆角、自然色和稀疏结构确实适合主要操作时,才使用对应的有机方向;需要密集表格或连续高频操作时,回到操作型候选。
|
|
50
|
+
|
|
51
|
+
在相邻候选之间,按下面的视觉机制完成最后比较;这些差异只解释已有索引,不改变各风格含义:
|
|
52
|
+
|
|
53
|
+
- 明亮操作与数据界面:区分标准化中圆角组件与完整明暗模式、暖米白细边无影的紧凑指标台、绿色轻影指标卡、开阔浅蓝分析区域、直角蓝线编号结构和工程图纸标记。
|
|
54
|
+
- 深色技术与分析界面:区分绿色终端语法、蓝黑圆角嵌套面板、紫色紧凑直角面板、红色毛玻璃舞台和明暗交替的深红叙事区块。
|
|
55
|
+
- 文档与编辑界面:区分冷灰蓝单栏规格纸、人文奶油研究界面、旋转纸卡杂志层次和黑白新闻印刷结构。
|
|
56
|
+
- 轻量与表达型界面:区分白底超大圆角自然留白、暖黄渐变与深浅卡片、手写纸张、黑白橙粗边硬影和高饱和漫画拼贴。
|
|
57
|
+
|
|
58
|
+
采用一个风格,需要能说明需求中的哪些特征与该风格的布局密度、组件几何、主要配色关系、排版、材质、交互方式或标志性细节相呼应。清晰层级、熟悉控件、现代、专业、简洁、易用和响应式属于所有合格界面的基础质量,只用于检查可用性,不能单独作为区分预置风格的证据。一个颜色、一个形容词,或登录、保存、增删改查、统计等单个普通功能也不能单独决定风格。
|
|
59
|
+
|
|
60
|
+
如果多项操作共同决定了主界面的长期结构,例如持续使用的表格与表单、筛选和批量操作、多角色工作区、审批与状态流转、排期与资源分配、看板拖拽,那么由此形成的布局密度、组件形态和交互节奏属于呈现约束,可以作为候选的正向证据;仍需比较相邻候选,不能只按企业应用类别决定。
|
|
61
|
+
|
|
62
|
+
同一组中的候选如果仍只能用共同的业务用途或基础质量解释,无法用上述视觉或结构证据区分,就使用 frontend-design。否则选择差异证据最具体、同时不影响使用效率的一项;如果最初只找到一个候选,再找一个用途相近和一个感觉相近的候选进行比较,不要随机选择。
|
|
63
|
+
|
|
64
|
+
选定后,完整读取对应的 `references/<风格英文名>.md` 和 `references/token-mapping.md`。允许根据实际内容调整信息密度、间距、尺寸和局部布局;决定风格辨识度的主要配色关系、核心材质和标志形态应保持一致。需要替换这些主要元素才能适配时,不采用该风格。
|
|
65
|
+
|
|
66
|
+
### 3. 使用 frontend-design
|
|
67
|
+
|
|
68
|
+
没有明确贴合的预置风格,或核实完整规格后发现需要替换主要视觉元素才能满足需求时,直接读取 `references/frontend-design.md`,按其中的方法确定产品主题、质感、配色和最有辨识度的设计元素。保留用户已经表达的局部要求和偏好。
|
|
69
|
+
|
|
70
|
+
frontend-design 只需定下基础设计要素(主题、质感、配色、签名元素),不要在 `design.md` 里展开成预置风格那样的完整规格文档;具体色值、字体、组件样式变量落进主题样式文件,`design.md` 与 `AGENTS.md` 只保留精简概述。
|
|
71
|
+
|
|
72
|
+
不需要为了召回而选出一个风格,也不需要逐一排除全部预置风格。
|
|
73
|
+
|
|
74
|
+
## 保存设计方向
|
|
75
|
+
|
|
76
|
+
命中预置风格时,用 `bash` 工具把你刚完整读取的那个风格文件**复制**成应用根目录的 `design.md`,并在首行加入受管标识 `<!-- miaoda-design-guide: managed preset=<风格英文名> -->`。不要用 `write` 逐字重写整份规格——既浪费上下文,也容易和源文件产生偏差。复制命令示例(`<刚读取的风格文件路径>` 用你实际读取的那个 references 路径替换):
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
{ printf '<!-- miaoda-design-guide: managed preset=<风格英文名> -->\n'; cat "<刚读取的风格文件路径>"; } > design.md
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
覆盖前先检查现有 `design.md`:
|
|
83
|
+
|
|
84
|
+
- 文件不存在时直接生成。
|
|
85
|
+
- 首行是受管标识时,可以用上面的命令重新生成;切换风格时同样用新风格文件完整覆盖。
|
|
86
|
+
- 首行没有受管标识时,将它视为用户文件,不覆盖;停止写入并说明冲突。
|
|
87
|
+
|
|
88
|
+
frontend-design 自定义方向没有可复制的源文件,只把基础设计要素写进 `design.md`,不要展开成预置风格那样的完整规格。
|
|
89
|
+
|
|
90
|
+
后续只引用项目中的 `design.md`。先确认 `design.md` 写入成功,再更新 `AGENTS.md`。
|
|
91
|
+
|
|
92
|
+
需要确定新视觉方向时,在 `AGENTS.md` 中保留唯一一个简短的 `## 设计方向` 章节。已有章节时更新,不重复追加;已有多个同名章节时停止并说明冲突。根据实际情况选择一种格式:
|
|
93
|
+
|
|
94
|
+
```markdown
|
|
95
|
+
## 设计方向
|
|
96
|
+
|
|
97
|
+
- 预置风格:`design.md`(<风格中文名>)
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
```markdown
|
|
101
|
+
## 设计方向
|
|
102
|
+
|
|
103
|
+
- 用户指定:<一句话说清用户给的方向与来源,如“用户附件设计稿:深蓝主色 + 卡片式布局”>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
```markdown
|
|
107
|
+
## 设计方向
|
|
108
|
+
|
|
109
|
+
- 自定义:产品主题 <一句话> / 质感 <一句话> / 配色 <主色与基础色,给色值> / 辨识度设计 <一句话>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
用户点名预置风格时使用“预置风格”格式。完整的自定义视觉方案使用“用户指定”格式。frontend-design 生成的方向使用“自定义”格式。具体颜色和样式变量写入主题样式文件,不写入 `AGENTS.md`。
|
|
113
|
+
|
|
114
|
+
## 页面适配底线
|
|
115
|
+
|
|
116
|
+
- 先让桌面宽屏拥有完整的信息层级和合理密度,再设计窄屏重排;不要把桌面端做成放大的手机单列页。
|
|
117
|
+
- 页面宽度要跟随窗口变化并设置最大宽度;网格要能自动增减列数;在内容排不下时切换布局。主要布局不要写死宽高。
|
|
118
|
+
- 窄屏优先改变排列、折叠次要信息和收纳导航,不缩小到不可读;除数据表格等必要区域外,不产生整页横向滚动。
|
|
119
|
+
- 生成持续可见的桌面左侧菜单时,最好增加收起和展开操作,并优先复用模板已有的侧栏组件;用户明确要求固定菜单时除外。
|
|
120
|
+
- 按钮和其他可点击区域要足够大。固定侧栏、悬浮装饰、超大标题和多栏内容在窄屏都要有明确的调整方式。
|
|
121
|
+
|
|
122
|
+
界面图形和状态标识不使用 emoji,使用项目现有图标或文字。
|
|
123
|
+
|
|
124
|
+
## 风格索引
|
|
125
|
+
|
|
126
|
+
索引只概括视觉特征,不限定业务场景。具体规格与例外以对应风格文件为准。
|
|
127
|
+
|
|
128
|
+
- `phosphor-hud` **赛博光幕**
|
|
129
|
+
视觉:近黑背景与深灰表面,霓虹绿通过透明度变化建立层级 / 等宽正文、超粗标题、全大写标签与方括号语法 / 主体组件零圆角,细线边框、L 型转角与发光效果 / CRT 扫描线、胶片噪点、终端式标记 / 机械、冷峻、工业化
|
|
130
|
+
|
|
131
|
+
- `industry` **工业图纸**
|
|
132
|
+
视觉:冷灰白图纸底与单一钢蓝构成技术色调,深钢蓝仅作分节强调 / Barlow Condensed 压缩标题搭配 Barlow 正文和等宽标记 / 直角发丝线框,卡片与图框可带四角套准十字 / 内容照片双色化、工程编号和制图标记增强识别 / 冷静、工程化、精确
|
|
133
|
+
|
|
134
|
+
- `cybernetic-vault-terminal` **赛博机库**
|
|
135
|
+
视觉:深蓝黑画布、藏蓝表面、白色主文字与灰色辅助文字,天蓝和亮蓝用于主要行动 / Inter 中等字重大标题与常规正文,JetBrains Mono 承载小型技术标签 / 24px 圆角卡片与细边框,控件采用约 23px 圆角或胶囊形态 / 紧凑的嵌套面板与突出数值 / 冷峻、理性
|
|
136
|
+
|
|
137
|
+
- `nexuscore-analytics` **核心分析**
|
|
138
|
+
视觉:近黑画布与深灰表面,白色主文字、灰色辅助文字,紫色集中于主要行动 / Inter 中等字重大标题与常规正文,JetBrains Mono 承载小型标签 / 8px 圆角卡片与控件,细边框区分嵌套表面 / 紧凑的模块化面板、清晰的信息层级与数值强调 / 冷静、紧凑
|
|
139
|
+
|
|
140
|
+
- `crimson-frosted-glass` **暗黑毛玻璃**
|
|
141
|
+
视觉:黑底叠加模糊背景图与渐变遮罩,白色文字、亮红强调 / 超大粗体无衬线标题,紧字距,大数值突出 / 半透明白色毛玻璃卡片,24px 大圆角与细边框,卡片不依赖投影分层 / 透景层次、大幅图卡与数据块组合 / 沉浸、鲜明、具有空间深度
|
|
142
|
+
|
|
143
|
+
- `nebula-crimson` **深红星云**
|
|
144
|
+
视觉:白色、浅灰与近黑大面积交替,暗酒红用于品牌区块和重点信息 / 超粗巨型标题与紧字距,全大写宽字距小标签 / 中到大圆角面板,暗区半透明玻璃容器,局部柔和或品牌色投影 / 全幅明暗交替、网格线、局部碳纤维纹理与深红模糊光斑 / 庄重、浓烈、富有叙事节奏
|
|
145
|
+
|
|
146
|
+
- `dashboard` **陶土净台**
|
|
147
|
+
视觉:暖米白底、纯白卡片与暖黑文字,陶土橙集中于主按钮和主图表,次级图表采用中性色 / 系统无衬线字体,常规正文与中等字重小标题,大数字收紧字距,小标签全大写宽字距 / 10px 圆角卡片、6px 圆角控件,1px 暖灰边框,无投影 / 疏朗的指标面板与细线表格,以灰度、大小写和字距建立层级 / 温润、干净、克制
|
|
148
|
+
|
|
149
|
+
- `minimal-jade` **简约翡翠**
|
|
150
|
+
视觉:浅灰蓝底、纯白卡片、草绿主强调,次级图表系列用灰阶,深绿和红色用于限定的趋势与状态表达 / 无衬线粗体大标题,JetBrains Mono 等宽数字与表格数字对齐 / 12px 圆角白卡、浅阴影,边框悬停时由透明转浅灰 / 卡片轻微上浮,首要图表系列草绿、其余按黑色透明度递减,局部草绿装饰条 / 简洁、清晰、理性
|
|
151
|
+
|
|
152
|
+
- `metabase` **湖光蓝调**
|
|
153
|
+
视觉:纯白与极浅蓝平面,深蓝墨字,明亮蓝色用于主按钮和交互焦点 / Lato 人文无衬线字体,粗体标题与常规正文形成清晰层级 / 小到中圆角,1px 半透明中性边框,平铺卡片轻投影,浮层采用更深漫射阴影 / 浅蓝静区、实底蓝主按钮与描边次按钮 / 通透、清爽、平和
|
|
154
|
+
|
|
155
|
+
- `corporate-blueprint` **蓝图**
|
|
156
|
+
视觉:冷浅灰画布、白色卡片、深蓝主强调,图表以蓝色深浅层级为主,状态标签保留语义色 / 无衬线大标题与小号全大写宽字距标签,数值列等宽对齐 / 主卡片零圆角、顶部 3px 深蓝边线,配轻阴影与细分隔线 / 深蓝渐变头部、斜切几何装饰与编号章节 / 秩序、严谨、精确
|
|
157
|
+
|
|
158
|
+
- `pm-spec` **规格蓝本**
|
|
159
|
+
视觉:冷灰蓝底、白色纸面与深墨文字,靛紫用于小面积结构性强调 / Charter 衬线标题与引用,无衬线正文,等宽体承载全大写微标签 / 10px 圆角卡片、1px 细边框,无投影,引用块配强调色左边线 / 单栏纸面文档流、紧凑正文、元信息条与局部分栏信息块 / 严肃、克制、秩序感
|
|
160
|
+
|
|
161
|
+
- `claude-editorial-research` **陶色书卷**
|
|
162
|
+
视觉:暖奶油画布、米色卡片与暖近黑产品面,陶土珊瑚用于主按钮和强调色块 / 常规字重衬线展示标题配负字距,人文无衬线正文,代码采用等宽体 / 中等圆角、发丝边框,层次主要来自表面色差,投影稀疏 / 奶油与深色表面交替,整块珊瑚强调卡与深色代码窗 / 温和、沉思、社论感
|
|
163
|
+
|
|
164
|
+
- `digital-e-guide` **暖陶刊物**
|
|
165
|
+
视觉:暖陶粉径向渐变背景,奶油纸卡与暖黑文字,马克红主强调、暖橙少量辅助 / Cormorant 大衬线标题与斜体强调,DM Serif Text 衬线正文,等宽体承载元信息 / 4px 微圆角纸卡、长柔阴影与发丝分隔线 / 纸卡交替微旋,双栏正文、外缘引文卡与圆贴纸形成摊开杂志的层次 / 温暖、文艺、印刷感
|
|
166
|
+
|
|
167
|
+
- `broadsheet` **新闻大报**
|
|
168
|
+
视觉:纸白与近黑墨色为主,青、洋红和工艺黄只作克制点色 / Source Serif 4 衬线字体贯穿标题、正文和控件,主要靠字阶与留白建立层级 / 1–4px 微圆角、细线分隔,卡片仅用于真正离散的条目 / CMYK 套印偏移、网点图像和印版标记形成新闻印刷签名 / 理性、编辑感、公共信息气质
|
|
169
|
+
|
|
170
|
+
- `organic-minimalism` **有机极简**
|
|
171
|
+
视觉:纯白画布与浅暖灰绿表面,柔和石灰绿强调激活态、按钮和结果 / 简洁无衬线排版,标题与数值通过字重和字号区分 / 40–48px 超大圆角主卡片,极淡边框与浅阴影 / 大留白、极简线性图标、稀疏装饰 / 自然、轻盈、松弛
|
|
172
|
+
|
|
173
|
+
- `warm-elegance` **暖调精致**
|
|
174
|
+
视觉:暖米、暖灰与暖黄渐变背景,白色卡片与深灰黑反转区,黄色点缀主行动和活跃信息 / 无衬线标题与正文,轻字重大数值、等宽辅助数据,局部斜体小标签 / 32px 主卡片与 24px 深色嵌入卡片,浅区轻投影,深区更强投影与局部光晕 / 深浅卡片对比,纤细胶囊柱图、环形进度与磨砂玻璃标签 / 温暖、柔和、安心
|
|
175
|
+
|
|
176
|
+
- `flowbite` **Flowbite**
|
|
177
|
+
视觉:白色与浅灰表面、深灰标题,蓝色主按钮和链接,支持对应暗色配色 / Inter 无衬线排版,超粗大标题配紧字距,正文常规字重 / 规整中圆角,以 8px 为主,1px 浅边框与轻投影 / 实底蓝按钮、浅蓝徽章、浅灰输入框,组件形态统一 / 清晰、规整、务实
|
|
178
|
+
|
|
179
|
+
- `handwritten-sketch` **手绘草稿**
|
|
180
|
+
视觉:米黄纸底、白色卡片与墨黑文字,标记笔红、钢笔蓝和便利贴黄点缀 / Kalam 手写标题与 Patrick Hand 手写正文,中文使用系统字体兜底 / 不规则弯曲圆角、3px 墨黑粗边与零模糊偏移硬阴影 / 圆点纸纹、微旋卡片、透明胶带、图钉和波浪下划线,局部黑板反色 / 亲和、轻松、手工感
|
|
181
|
+
|
|
182
|
+
- `wild-orange` **橙色野性**
|
|
183
|
+
视觉:纯白画布、黑色文字与粗边,橙色主强调搭配少量浅橙和灰阶 / 粗体大写无衬线标题,Playfair 斜体衬线点缀装饰文字与小数值 / 直角卡片、2–4px 黑色粗边、4–8px 零模糊硬阴影 / 几何装饰圆、橙色横幅、圆形编号,卡片按压式位移与阴影收缩 / 自信、大胆、图形感
|
|
184
|
+
|
|
185
|
+
- `pop-art` **波普艺术**
|
|
186
|
+
视觉:明亮黄色主背景,白色卡片,红、绿、蓝高饱和色块搭配纯黑 / 漫画展示字体、超粗标题与醒目标签,中文使用无衬线兜底 / 粗黑描边、零模糊偏移硬阴影,大圆角卡片与胶囊按钮搭配直角色块 / 半色调网点、轻微倾斜的拼贴标题、按压位移交互 / 热烈、直接、漫画感
|
|
187
|
+
|
|
188
|
+
这份列表只用于初步选择。选定后,颜色、圆角、字号、组件样式和例外情况一律以对应风格文件为准。
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: alpha
|
|
3
|
+
name: broadsheet
|
|
4
|
+
name_zh: 新闻大报
|
|
5
|
+
description: 网页新闻纸风格:纸白底、Source Serif 4 衬线字与近黑墨色构成主体,青与洋红仅作克制点色;页面层级主要依靠字阶和留白,图像可使用 CMYK 套印偏移与网点处理。
|
|
6
|
+
colors:
|
|
7
|
+
bg: "#f3f2f2"
|
|
8
|
+
surface: "#eae9e9"
|
|
9
|
+
text: "#201e1d"
|
|
10
|
+
accent: "#0088b0"
|
|
11
|
+
accent-dark: "#006786"
|
|
12
|
+
accent-2: "#d6006c"
|
|
13
|
+
process-yellow: "#edbb00"
|
|
14
|
+
neutral-dark: "#2d2b2b"
|
|
15
|
+
typography:
|
|
16
|
+
heading:
|
|
17
|
+
fontFamily: "'Source Serif 4', 'Noto Serif SC', 'Songti SC', system-ui, serif"
|
|
18
|
+
fontWeight: "600"
|
|
19
|
+
body:
|
|
20
|
+
fontFamily: "'Source Serif 4', 'Noto Serif SC', 'Songti SC', system-ui, serif"
|
|
21
|
+
fontSize: "15px"
|
|
22
|
+
lineHeight: "1.5"
|
|
23
|
+
h1:
|
|
24
|
+
fontSize: "42px"
|
|
25
|
+
h2:
|
|
26
|
+
fontSize: "32px"
|
|
27
|
+
h3:
|
|
28
|
+
fontSize: "25px"
|
|
29
|
+
spacing:
|
|
30
|
+
space-1: "5px"
|
|
31
|
+
space-2: "10px"
|
|
32
|
+
space-3: "15px"
|
|
33
|
+
space-4: "20px"
|
|
34
|
+
space-6: "30px"
|
|
35
|
+
space-8: "40px"
|
|
36
|
+
rounded:
|
|
37
|
+
sm: "1px"
|
|
38
|
+
md: "2px"
|
|
39
|
+
lg: "4px"
|
|
40
|
+
components:
|
|
41
|
+
primary-button:
|
|
42
|
+
background: "{colors.accent}"
|
|
43
|
+
color: "{colors.bg}"
|
|
44
|
+
fontFamily: "{typography.heading.fontFamily}"
|
|
45
|
+
card:
|
|
46
|
+
background: "{colors.surface}"
|
|
47
|
+
description: "仅用于真正离散的条目,不作为页面布局容器"
|
|
48
|
+
cmyk-image:
|
|
49
|
+
description: "CMYK 分色印版错位叠印与网点处理;完整结构和依赖见来源规格"
|
|
50
|
+
anchors:
|
|
51
|
+
- id: paper-and-ink
|
|
52
|
+
type: token
|
|
53
|
+
desc: 纸白底与近黑墨色形成新闻纸基调
|
|
54
|
+
- id: serif-everywhere
|
|
55
|
+
type: token
|
|
56
|
+
desc: 标题、正文与界面控件统一使用衬线字族
|
|
57
|
+
- id: restrained-process-colors
|
|
58
|
+
type: pattern
|
|
59
|
+
desc: 青与洋红只作小面积点色,同一组件不同时出现
|
|
60
|
+
- id: whitespace-hierarchy
|
|
61
|
+
type: pattern
|
|
62
|
+
desc: 页面结构主要依靠字阶与留白,不依赖框盒
|
|
63
|
+
- id: cmyk-registration
|
|
64
|
+
type: component
|
|
65
|
+
desc: 图像使用套印偏移分色版与新闻纸网点
|
|
66
|
+
- id: square-paper-components
|
|
67
|
+
type: component
|
|
68
|
+
desc: 组件圆角接近零,维持印刷纸面感
|
|
69
|
+
gaps:
|
|
70
|
+
- 原始 styles.css、print-plates.js、_ds_bundle.js 与模板资产未随 markdown 提供;CMYK 签名效果的完整滤镜代码无法从二手描述还原,接入时需使用来源资产。
|
|
71
|
+
- 暗色模式未定义。
|
|
72
|
+
exceptions:
|
|
73
|
+
- 工艺黄仅用于 CMYK 分色、印版数字等印刷处理,不进入正文或界面 chrome。
|
|
74
|
+
- 卡片仅用于真正离散的列表条目,不作为页面结构容器。
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Overview
|
|
78
|
+
|
|
79
|
+
网页上的新闻纸:纸白、墨色、衬线字阶和通透留白构成主体,青与洋红作为印刷点色,CMYK 套印图像提供签名视觉。
|
|
80
|
+
|
|
81
|
+
## Colors
|
|
82
|
+
|
|
83
|
+
页面使用 {colors.bg} 纸底与 {colors.text} 墨色;{colors.accent} 和 {colors.accent-2} 小面积点色,同一小组件只使用其中一种。段落级青字使用 {colors.accent-dark}。
|
|
84
|
+
|
|
85
|
+
## Typography
|
|
86
|
+
|
|
87
|
+
@import url('https://miaoda.feishu.cn/fonts/css2?family=Noto+Serif+SC:wght@400;600&family=Source+Serif+4:ital,wght@0,400;0,600;1,400&display=swap');
|
|
88
|
+
|
|
89
|
+
HARD REQUIREMENT:字体加载与字体族分工禁止替换。标题、正文和界面 chrome 均使用 {typography.heading.fontFamily};中文多行标题行高不低于 1.05,正文不低于 1.5,中文负字距归零。
|
|
90
|
+
|
|
91
|
+
## Layout
|
|
92
|
+
|
|
93
|
+
内容左对齐并保留宽松右侧留白,主要依靠字号层级和间距组织,不用卡片或分割线搭建页面结构。
|
|
94
|
+
|
|
95
|
+
## Elevation & Depth
|
|
96
|
+
|
|
97
|
+
使用源规格的墨色调柔投影;页面结构主要依靠留白,离散条目需要分层时才使用投影。
|
|
98
|
+
|
|
99
|
+
## Shapes
|
|
100
|
+
|
|
101
|
+
圆角接近零,保留纸张与印刷物的硬朗边缘;图片可使用 CMYK 套印偏移和网点处理。
|
|
102
|
+
|
|
103
|
+
## Components
|
|
104
|
+
|
|
105
|
+
按钮、标签、原生表单、离散条目卡片、表格和对话框的精确规格见下方“来源规格”。CMYK 图像依赖来源中的 print-plates.js 与滤镜资产。
|
|
106
|
+
|
|
107
|
+
## Hard Rules
|
|
108
|
+
|
|
109
|
+
- 同一小组件只使用青或洋红中的一种。
|
|
110
|
+
- 正文青色使用 {colors.accent-dark};工艺黄只进入印刷处理。
|
|
111
|
+
- 页面结构由字阶与留白组织,卡片仅承载真正离散的条目。
|
|
112
|
+
- Source Serif 4 真斜体随正文字重加载,不使用合成斜体。
|
|
113
|
+
|
|
114
|
+
## Exceptions
|
|
115
|
+
|
|
116
|
+
- 工艺黄只用于 CMYK 分色、印版数字等印刷处理。
|
|
117
|
+
- 真正离散的列表条目可使用 surface 卡片与源规格投影。
|
|
118
|
+
|
|
119
|
+
## Source Specification
|
|
120
|
+
|
|
121
|
+
以下内容从用户提供的原始 design.md 原样保留,仅将标题层级下调以纳入 DSM v1 单文件结构。
|
|
122
|
+
|
|
123
|
+
### 一句话定位
|
|
124
|
+
|
|
125
|
+
网页上的新闻纸。纸白底上全篇 Source Serif 4 近黑墨色,四色印刷的青与洋红作为**点色**小面积、克制地用(印刷处理里再补一个工艺黄)。页面结构**不用框、不用分割线**——层级只来自衬线字阶和留白。唯一印线的地方是头版活件:landing 上日期栏两侧的粗-细线对,满墨强度。图片按自己的**套印偏移印版**输出。
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
### 1. 颜色
|
|
130
|
+
|
|
131
|
+
#### 基础角色
|
|
132
|
+
|
|
133
|
+
| Token | 值 | 用途 |
|
|
134
|
+
| --- | --- | --- |
|
|
135
|
+
| `--color-bg` | `#f3f2f2` | 纸白底 |
|
|
136
|
+
| `--color-surface` | `#eae9e9` | 卡片 / 面板填充 |
|
|
137
|
+
| `--color-text` | `#201e1d` | 墨色正文 |
|
|
138
|
+
| `--color-accent` | `#0088b0` | 青 —— 交互元素专用 |
|
|
139
|
+
| `--color-accent-2` | `#d6006c` | 洋红 —— 更罕用的第二点色 |
|
|
140
|
+
| `--color-process-yellow` | `#edbb00` | 第三道工艺墨,**仅印刷处理**用(CMYK 分色、印版数字);正文与界面 chrome 永不取它 |
|
|
141
|
+
| `--color-divider` | `text` 16% 混合 | 1px 细线 |
|
|
142
|
+
|
|
143
|
+
**双点色,但不许同框**:一个小组件里不能同时出现青和洋红。
|
|
144
|
+
|
|
145
|
+
#### 色阶(OKLCH 同一感知明度轴,同 step 视觉重量一致)
|
|
146
|
+
|
|
147
|
+
**Neutral** `#f8f4f4` · `#eae7e7` · `#d7d3d3` · `#bab6b6` · `#9b9797` · `#7d7979` · `#605d5d` · `#444141` · `#2d2b2b`
|
|
148
|
+
|
|
149
|
+
**Accent(青)** `#e9f8ff` · `#cbeeff` · `#99e0ff` · `#62c5ee` · `#38a6cf` · `#1186ac` · `#006786` · `#004961` · `#0a303e`
|
|
150
|
+
|
|
151
|
+
**Accent-2(洋红)** `#fff1f4` · `#ffdee6` · `#ffc0d0` · `#ff90b1` · `#ff458e` · `#d82071` · `#aa0b56` · `#790e3d` · `#4b1528`
|
|
152
|
+
|
|
153
|
+
用法规则:
|
|
154
|
+
- 100–300 → 浅色填充、hover 底、细边框
|
|
155
|
+
- 500 → 该角色基准
|
|
156
|
+
- 700–900 → 浅色填充上的文字、按下态
|
|
157
|
+
- 优先取色阶 step,不要临时 `color-mix()`
|
|
158
|
+
|
|
159
|
+
#### 对比度红线
|
|
160
|
+
|
|
161
|
+
accent 对纸底只到 **3:1** —— 够图标、大字号、界面 chrome,**不够正文**。段落级青字必须用 `--color-accent-700`(`#006786`)。
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
### 2. 字体
|
|
166
|
+
|
|
167
|
+
| Token | 值 |
|
|
168
|
+
| --- | --- |
|
|
169
|
+
| `--font-heading` | `"Source Serif 4", system-ui, sans-serif` |
|
|
170
|
+
| `--font-heading-weight` | `600` |
|
|
171
|
+
| `--font-body` | `"Source Serif 4", system-ui, sans-serif` |
|
|
172
|
+
|
|
173
|
+
单一字族,字重 400 / 600 分层,**真斜体按正文字重载入**(引言和强调走衬线的斜体声音,绝不用合成倾斜)。
|
|
174
|
+
|
|
175
|
+
从 Google Fonts 载入:`Source+Serif+4:ital,wght@0,400;0,600;1,400`
|
|
176
|
+
|
|
177
|
+
#### 字号阶梯
|
|
178
|
+
|
|
179
|
+
| 元素 | 字号 | 备注 |
|
|
180
|
+
| --- | --- | --- |
|
|
181
|
+
| h1 | 42px | |
|
|
182
|
+
| h2 | 32px | |
|
|
183
|
+
| h3 | 25px | |
|
|
184
|
+
| h4 | 20px | |
|
|
185
|
+
| h5 | 16px | |
|
|
186
|
+
| h6 | 13px | **全大写**,letter-spacing 0.08em |
|
|
187
|
+
| body | 15px | |
|
|
188
|
+
| figcaption | 11px | text 55% |
|
|
189
|
+
| `.card-title` | 17px | heading 族 600 |
|
|
190
|
+
| `.card-kicker` | 10px | 大写,ls 0.1em,青色 |
|
|
191
|
+
| `.btn` / `.input` | 14px | 刻意同字号——注册行里两者并排 |
|
|
192
|
+
| `.tag` | 11px | |
|
|
193
|
+
| `.table th` | 11px | 大写,ls 0.08em,text 60% |
|
|
194
|
+
|
|
195
|
+
**不许为界面 chrome 引入无衬线字**——衬线本身就是 chrome。
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
### 3. 间距与圆角
|
|
200
|
+
|
|
201
|
+
密度 **1.25×**(宽松,已烘进变量):
|
|
202
|
+
|
|
203
|
+
```
|
|
204
|
+
--space-1: 5px --space-2: 10px --space-3: 15px
|
|
205
|
+
--space-4: 20px --space-6: 30px --space-8: 40px
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
圆角几乎为零:`--radius-sm: 1px` / `--radius-md: 2px` / `--radius-lg: 4px`
|
|
209
|
+
|
|
210
|
+
**不许压缩这套通透的间距**。
|
|
211
|
+
|
|
212
|
+
### 4. 阴影
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
--shadow-sm: 0 1px 2px (#2d2b2b 14%)
|
|
216
|
+
--shadow-md: 0 3px 10px (#2d2b2b 16%)
|
|
217
|
+
--shadow-lg: 0 12px 32px (#2d2b2b 22%)
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
墨色调柔投影,已针对纸底调过。工具类 `.elev-sm / -md / -lg`。不要自造 box-shadow。
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
### 5. 布局方向
|
|
225
|
+
|
|
226
|
+
- **左对齐、不对称**:标题齐左,内容贴左边缘,留白留在右侧
|
|
227
|
+
- **区块之间只用留白**,不用分割线、不用卡片
|
|
228
|
+
- deck 分节页 = 印版的打样余白:**页面保持纸白**(本系统没有深色面**)**,靠印刷活件承担断点——右侧一片套印偏移的网点场、`.cmyk-num` 印版数字、十级黑白灰梯、八格色标、一个星形套准标
|
|
229
|
+
- 多数幻灯片把第一笔墨锚在同一个左上角落点,真正的套准标记落在纸张边缘
|
|
230
|
+
|
|
231
|
+
### 6. 图像处理
|
|
232
|
+
|
|
233
|
+
| 类名 | 说明 |
|
|
234
|
+
| --- | --- |
|
|
235
|
+
| `.cmyk` | **主打处理** —— 照片印成四张套印偏移的分色版。结构:`figure.cmyk` 内五份同图,第一份作布局尺子(`opacity:0`,保留在无障碍树里承载 alt),其余四份分别标 `.sep-c/.sep-m/.sep-y/.sep-k`;分色由 `print-plates.js` 的 SVG `feColorMatrix` 实时抽取,错开数像素后 multiply 叠到纸底,最后过一层 3px 网点 |
|
|
236
|
+
| `.cmyk` + `.print` | 单图版本:`figure.cmyk > .print > image-slot`,用一个复合滤镜 `#sep-all` 处理可替换的单张图。hover 时印版回套准(印刷工在灯台上验套准),reduced-motion / 触屏下退化为直接切到清晰原图 |
|
|
237
|
+
| `.cmyk-num` | 印版数字:**只三版 C/M/Y,没有黑版** —— 暗部完全来自三色 multiply 叠加,边缘毛刺就是套印漂移。结构:`.cmyk-num` 内一个 `.paper` span(纸白,用偏移 text-shadow 拼出字形并集)+ 三个 `.plate` span;自带 `--cmyk-num-ground` 兜底纸底 |
|
|
238
|
+
| `.halftone` | 简版新闻纸网点(`grayscale(.35) contrast(1.15)` + 3px 径向网点 multiply),**给界面截图用** |
|
|
239
|
+
|
|
240
|
+
`.cmyk` 依赖 `print-plates.js` 的 filter defs 在文档里。模板页通过编译好的 `_ds_bundle.js` 自动拿到;直接 link `styles.css` 的页面要自己在样式表旁加 `<script src="print-plates.js"></script>`(data-URI 滤镜引用在 Chromium 下不成立,外部文件引用跨引擎不可靠)。
|
|
241
|
+
|
|
242
|
+
### 7. 组件
|
|
243
|
+
|
|
244
|
+
| 类名 | 说明 |
|
|
245
|
+
| --- | --- |
|
|
246
|
+
| `.btn` + `.btn-primary / -secondary / -ghost / -icon / -block` | primary 是实心青填充,文字 `--color-bg`;字体用 heading 族 600 / 14px;`.btn-icon` 36×36 |
|
|
247
|
+
| `.tag` + `.tag-accent / -accent-2 / -neutral / -outline` | 色阶染色小标签(100 底 + 800 字) |
|
|
248
|
+
| `.field` + `label` / `.input` / `.radio` + `.dot` / `.seg` + `.seg-opt` | 原生元素表单,无脚本。`.input` 36px 高、surface 底、caret 用青;placeholder 明确定为 text 65%(实测 4.8:1,浏览器默认灰过不了小字 4.5:1) |
|
|
249
|
+
| `.card` + `.card-kicker / -title / -body / -meta`;`.elev-sm/md/lg` | surface 填充卡。**只用于真正离散的条目**(如列表项),绝不用来搭布局 |
|
|
250
|
+
| `.nav` + `.nav-brand` | 顶栏,`border-bottom: none`(刻意) |
|
|
251
|
+
| `.table` | 大写细字表头 + 8% 墨行线,hover 行底 4% |
|
|
252
|
+
| `.dialog-backdrop` + `.dialog`(`-title / -body / -actions`) | 最高层模态 |
|
|
253
|
+
| `.hr` | 1px 细线,存在但本系统偏好留白——**避免使用** |
|
|
254
|
+
| `.text-muted` | text 55% |
|
|
255
|
+
|
|
256
|
+
#### 交互态(已内建,不要逐页重写)
|
|
257
|
+
|
|
258
|
+
- `.btn-primary` hover → `--color-accent-600`;active → `--color-accent-700`
|
|
259
|
+
- `.btn-secondary` hover → text 7%;active → 14%
|
|
260
|
+
- `.btn-ghost` hover → 青 10%;active → 18%
|
|
261
|
+
- `.input:hover` → 边框 text 45%;`:focus-visible` → 青边框,`outline-offset: 0`
|
|
262
|
+
- `.radio input:checked + .dot` → 青填充 + `inset 0 0 0 4px var(--color-bg)` 做出内圈
|
|
263
|
+
- `.seg-opt:has(input:checked)` → 青底 + 纸色字
|
|
264
|
+
- 键盘焦点:`:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px }`
|
|
265
|
+
- `::selection` → 青 30%
|
|
266
|
+
- disabled → `opacity: 0.45` + `cursor: not-allowed`
|
|
267
|
+
- `a` → 青,`text-underline-offset: 3px`;`.nav a:hover` / `[aria-current=page]` → 青
|
|
268
|
+
|
|
269
|
+
### 8. 图标
|
|
270
|
+
|
|
271
|
+
Phosphor(phosphoricons.com),**统一用 duotone 字重**。
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
### 禁止清单
|
|
276
|
+
|
|
277
|
+
1. 用线、边框或框盒搭页面结构 —— 页面是一张摊开的大报
|
|
278
|
+
2. 同一个小组件里同时用青和洋红
|
|
279
|
+
3. 压缩间距(密度 1.25× 是刻意的)
|
|
280
|
+
4. 为界面 chrome 引入无衬线字
|
|
281
|
+
5. `.card` 当布局容器
|
|
282
|
+
6. `.hr` 当主要分隔手段
|
|
283
|
+
7. 正文级文字用 `--color-accent` 本值(要用 `-700`)
|
|
284
|
+
8. 工艺黄出现在正文或界面 chrome 里
|
|
285
|
+
9. 合成斜体(用真斜体)
|
|
286
|
+
10. 硬编码 hex / 字体名 / px(token 里已有的)
|
|
287
|
+
|
|
288
|
+
### 接入方式
|
|
289
|
+
|
|
290
|
+
```html
|
|
291
|
+
<helmet>
|
|
292
|
+
<link rel="stylesheet" href="_ds/broadsheet-fed8f2ec-b6d6-4630-b717-2d074781ac94/styles.css">
|
|
293
|
+
<script src="_ds/broadsheet-fed8f2ec-b6d6-4630-b717-2d074781ac94/_ds_bundle.js"></script>
|
|
294
|
+
</helmet>
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
组件直接在模板里挂载:
|
|
298
|
+
|
|
299
|
+
```html
|
|
300
|
+
<x-import component-from-global-scope="Broadsheet_broads.Button" hint-size="auto,40px">Label</x-import>
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### 可用模板
|
|
304
|
+
|
|
305
|
+
- `templates/deck/` —— 23 页演示起点:封面、目录、分节页、分栏、四宫格、数据表、SVG 图表、分色印版页、出血图、引言、结尾
|
|
306
|
+
- `templates/landing/` —— 单页落地页(虚构产品 Daybreak,晨间新闻摘要):衬线 hero、日期栏与索引头、功能分栏、分色照片、注册收尾
|
|
307
|
+
|
|
308
|
+
## Do's and Don'ts
|
|
309
|
+
|
|
310
|
+
- Do:按上述 token 与签名组件实现视觉语言,并根据用户内容组织信息。
|
|
311
|
+
- Don't:不要为套用示例而改变用户内容的业务语义。
|