A内容块
行内代码
正文里夹一个短标识时用。视觉与既有 .article-body code 保持一致。
改配色只需动 --brand 一处;构建命令是 pnpm build,产物在 .output/public。
代码块
头部显示语言 + 右侧「复制」按钮;超宽行在块内横向滚动,不撑破页面。
# 改完前台必须重建,否则线上还是旧产物(PIT-079)
git add -A && git commit -m "feat: 内容样式"
ssh lighthouse "bash /root/rebuild-web.sh"
# 判断"真上线":比对源 / 产物时间戳,别只信脚本回显(PIT-011)
stat -c '%y %n' app/assets/css/content.cssSQL 语句
左侧品牌色竖条 + 关键字着色。手写 span 静态示例——项目不引第三方高亮库, 这里只用于看视觉效果。
-- 取最近 20 篇免费文章
SELECT c.id, c.title, c.category_id, c.create_time
FROM ba_content c
WHERE c.is_paid = 0
AND c.status = 'normal'
ORDER BY c.create_time DESC
LIMIT 20;下面这条是超宽单行(约 200 字符):375px 下应当在块内横滚,页面本身不出现横向滚动。
SELECT id, title, category_id, is_paid, create_time, update_time, cover, slug, summary, view_count, sort, author FROM ba_content WHERE category_id IN (12, 13, 14, 18, 22, 23, 25, 28, 29) ORDER BY c.create_time DESC;引用
两个新方向,都彻底去掉底色 —— 常规 blockquote 靠"左竖条 + 淡底"承载引用语义, 这里改由排版标记承载:超大引号定锚点、悬挂缩进定层次、出处挪出正文区。 配色零新增 token,与 V2 的克制基调一致。
Q1 · 摘录式 doc-pull
三点不同:① 只有上下一对细线,没有底色也没有左竖条,像书里的 pull-quote 被"夹"在正文里; ② 超大半透明引号作排版锚点(它占位、定基线、给眼睛一个入口,不是装饰); ③ 出处右侧竖排 —— 中文传统"边批"读法,把出处从"底部一行小字"变成一条纵向坐标。
记录"正确的做法"只能帮人做对一次;记录"错误的做法"才能防止反复踩。
所以每条踩坑记录里,"❌ 已排除方案"那一栏比"解决方案"更值钱。
Q2 · 页边注式 doc-marg
两栏:左窄栏放编号 + 竖线,右栏正文。像论文的页边注 / 法律文本的条款标记 —— 适合"引权威来源",因为出处与正文平级并列,而不是屈居页脚。 左侧竖线用品牌色渐隐(--brand → 透明),给"这是引用"一个不发散的提示。
付费正文绝不能出现在任何静态 HTML 中 —— 这不是"注意一下",是硬约束。
判据是渲染后 DOM,不是 curl | grep: 该页走 SPA 兜底时,静态 HTML 只是个 3408 字节的空壳。
项目约定 · 硬约束 1 / PIT-143提示 / 警告
第四版主推侧锚(V3 方案稿 A 原版):去掉底色与边框, 状态色只留在一条竖线和一个图标上,档名单独一行、正文落灰 —— 颜色只承担识别,不承担阅读。 前三版(大块淡底 / 只留顶线 / 全饱和号牌)为什么不够,在 5.9 有量化对照。 五档 = 说明 / 信息 / 成功 / 警告 / 错误,配色全走 token ⇒ 暗色自动适配。
5.1 侧锚(主推) · Alert theme="anchor" —— 正文里插入用
三个部件:① 竖线浮空(2px 圆头,撑满内容整高,容器零底色零边框零内边距)· ② 档名占行(图标 + 档名并排一行,不与正文挤在一起)· ③ 正文落灰(档名深色 + 字重 600,正文 --c-text-2)。 层次靠字重 + 灰阶而不是色块 ⇒ 五档叠起来也是安静的,不会变成五道荧光笔痕。 不传 title 时档名自动取状态名 —— 不依赖颜色也能读(色盲 / 灰度打印 / 截图转黑白都可用)。
说明
信息
成功
警告
错误
5.2 强度轴 · 档位越"重",线越粗也越实
两轴叠加:线宽(2px / 3px)× 实度(34% / 62% / 100%)。 取值全部挂在状态槽位 --al-rail-w / --al-rail-o,与 --al-bar 在同一处单点 ⇒ 五档不会各自漂移(项目约定硬约束 6)。 下面每行的线就是真取该档槽位画的,不是贴图。
| 档位 | 线 | 线宽 × 实度 | 何时用 |
|---|---|---|---|
| 说明 | 2px × 34% | 补充材料,可读可不读 | |
| 信息 | 2px × 34% | 背景知识,先懂原理再动手 | |
| 成功 | 2px × 62% | 推荐做法,或"已完成" | |
| 警告 | 2px × 62% | 代价大,先看一眼再继续 | |
| 错误 | 3px × 100% | 已出错或不可逆 |
⚠️ 如实记录两个照原稿保留的取舍(用户点名要 A 原版,本轮未改): ① 说明与信息两档强度完全相同 ⇒ 五档实际只有 3 个视觉层级; ② 分级用的是不透明度而不是纯线宽 ⇒ 浅底上 34% 的线偏像"褪色 / 没渲染好"。 两条都有现成修法(把 thin 再降一档 / 改成纯线宽分级),要改说一声。
5.3 带标题 · 带强调的真实用法
传了 title 就用标题当档名(更贴合业务), 没传就落到状态名。灰正文里的加粗会自动回到深色 —— 否则"强调"落在灰上等于没强调;行内代码同样降到正文灰,不抢正文。 侧锚无壳,所以放在任何底色上都不打架(页面底 / 卡片 / 浮层通用)。
重建前台前必须先提交
付费正文绝不能进静态 HTML
5.4 密度测试 · doc-anchor-stack--tight —— 一屏连排 8 条会不会脏
这是稿子末尾点名的「最该看的一节」:提醒类真正容易失控的不是单条好不好看, 而是连排时会不会碎成一堆彩色片子。侧锚把颜色压到"一根线 + 一个图标", 所以连排 8 条读下来仍是一条安静的竖线阵列,节奏由灰阶而不是色相切分。
紧凑档 · 8 条连排(卡片内 = 有底色的场景)
说明
信息
成功
警告
错误
信息
警告
成功
5.5 浮层轻提醒 · Toast —— 不阻断,告知"刚才那件事的结果"
Toast 内部复用同一套侧锚(theme="anchor") ⇒ 浮层与正文里的提醒是同一套语言,不是两套设计。 外壳这一步做了中性化:原本外壳自带一条 3px 状态色条, 叠加侧锚的竖线会并排成双线,所以外壳退成中性细边 (浮层身份由底色 + 阴影承担),状态色只出现在竖线与图标上。 底部那条倒计时线随 duration 收缩, 把"还剩多久自动关"从隐藏状态变成可见信息;实现是纯 CSS 动画(时长由组件写进内联 --tp),不引 JS 计时器 ⇒ 不用 Toast 时零成本。 传 :duration="0"(常显)时不渲染这条线。 下方为看清效果做了循环播放(真实使用只走一次)。 真实使用默认 position:fixed,此处 :fixed="false" 落在展示框内。
会员 3 天后到期
5.6 表单行内反馈 —— 与五档同色,只是更小更贴身(无底无色条,仅着色文字)
标题不能为空
格式正确
5.7 极轻 · 状态胶囊 · Alert theme="pill" —— 正文行内的指向,比侧锚更轻
场景:"点这个""注意第 3 步"这种极轻的指向性提示 —— 上侧锚太重、纯文字又看不出是提示。胶囊小、同色、不打断阅读节奏(三个状态都可在句中用)。
点右侧
这一步不能跳过
生成完毕
5.8 说明气泡 · doc-tipbox —— 纯 CSS、零 JS
触发方式三种:鼠标悬停 · 键盘 Tab 聚焦(:focus-within)· 显式加 .is-open 常显。方向由 data-side 决定,支持 top / bottom / left / right。 箭头用旋转方块而不是 border 三角 —— 三角在暗色模式会露白边。 第 1 个是 .is-open 常显示意,其余请直接悬停或按 Tab。
现期量基期量 ×(1 + 增长率)。题干说"同比增长"时用它。
PIT 编号踩坑记录的稳定锚点,形如 PIT-144;改名不改号,所以引用永远有效。
悬停这里默认方向。空间不够时再换 data-side。
键盘 Tab 也能出不依赖鼠标 —— 触屏与键盘用户同样可达。
5.9 备选与存档 —— 前几版各留一条,便于对比为什么换掉
下面四条都还在代码里(改 theme 就切), 不是删掉的死代码 —— 只是不再是默认选择。
第一版 · 三槽色块 theme="inline"
信息(蓝)
❌ 病根:淡底与页面对比度只有 1.00 ~ 1.10 : 1 (信息档 1.00:1 = 边界不可见),饱和度 1% ~ 13% ⇒ 面积大、饱和极低:看不出形状也看不出差别,叠五条像五道荧光笔痕。
第二版 · 无壳旁注 theme="hollow"
信息(蓝)
❌ 病根:顶线对比度四档严重不均 —— 信息档 --c-info-line 只有 2.02 : 1(几乎看不见), 警告 / 错误档却有 6.3 ~ 6.4:1 ⇒ 同一组里有的"有框"有的"没框"; 且容器边界消失后,一条提醒退化成普通列表项。
第三版 · 号牌式 theme="flag"
信息(蓝)
❌ 病根:号牌虽然有力,但它与正文的排版轴不是同一条 —— 号牌自身有 padding,视觉重心落在左侧那一块, 连排时五块实心色各自抢焦点;且它的宽度随状态名长短变化, 一组里"信息 / 错误"两块宽度不同,左边缘对不齐正文。
第三版 · 实心横版 theme="slab"
信息(蓝)
❌ 病根:只适合页面级单条公告(一次只出现一条)。 它的面积决定了"这是全站最重要的一件事"—— 日常提醒用它属于把最高音量用在最小的事上,多条叠起来直接互相打架。
B交互组件
按钮
5 个变体 × 3 档尺寸 × 6 种状态。风格对齐既有 .theme-btn(圆角用 --radius-ctl)。
变体
尺寸 · 块级
状态(前 3 个是真交互,鼠标移上去 / Tab 聚焦试)
标签 / 徽章
标签沿用既有 .tag 的 5px 圆角与字号; .doc-tag-lg 用 14px 胶囊(对齐 .sub-tag)。
语义变体
尺寸
徽章(数字 / 圆点)
卡片
基础形态对齐既有 .card(12px 圆角 + 0.5px 细线),浮起用 --shadow-sm。
可点击
悬停会 translateY(-2px) + 加阴影,与既有 .card:hover 同款手感。表单
input / textarea / select / checkbox / radio / switch × 默认 · 聚焦 · 禁用 · 错误 · 成功。 聚焦环用 --c-fill-info 做 3px 外发光,不新造颜色。
辅助说明文字,12px、--c-text-3。
这一行用 --c-accent —— main.css 无 --c-err-* token。
绿色取 --c-ok-fg,与"免费"标签同源。
勾选 / 单选 / 开关
C数据与结构
列表 / 步骤条
有序 / 无序 / 勾选式(含"已完成"删除线)/ 步骤条(已完成 · 当前 · 未开始)。
有序 + 无序
- 先查陷阱(--traps)
- 再开验证方案
- 最后才动代码
- 路径与命令都真实可达
- 每行都有期望值
勾选式(含已完成)
- 验证方案已闭环
- 八项巡检全绿
- 首页临时入口未撤(待办 #72)
步骤条
- 1查陷阱
- 2写方案
- 3改代码
- 4部署验证
导航
面包屑 / 标签页 / 分页。面包屑对齐既有 .breadcrumb 的 13px 与 6px 间距。
面包屑
标签页
分页
表格
窄屏横滚发生在容器内(.doc-table-wrap),页面本身不出现横向滚动 —— 这是 PIT-026 / PIT-027 的结论:不要用 overflow:hidden 掩盖, 也不要用 nowrap 撑宽,而是给表格一个自带横滚的容器。
| 标题 | 分类 | 状态 | 浏览 |
|---|---|---|---|
| 离差平方和与方差的关系 | 资料分析 | 免费 | 1,284 |
| 线性插值在图表题里的取巧 | 数量关系 | 付费 | 963 |
| 逻辑填空:转折词的三种误用 | 判断推理 | 免费 | 742 |
模态框 / 阻断确认
与 05 提示 / 警告 同族 —— ModalAlert 就是"五档提醒"的阻断形态,配色、图标、动效全部复用同一套。 只做视觉:不劫持滚动、不引 JS;真实弹窗由调用方负责显隐与焦点管理。
危险操作确认(state="error")—— 确认按钮借用按钮组件的 doc-danger,不为提醒组件另造按钮色板
纯告知(state="info" :single="true")—— 单按钮,无需用户做选择
D基础与状态
排版层级 + 间距刻度
四级标题 + 正文 / 辅助 / 等宽 / 强调 / 链接 / 按键 + 分隔线。字号沿用站内既有梯度。
H1 · 22px / 500
H2 · 18px / 500
H3 · 16px / 500
H4 · 14.5px / 500
正文段落 · 13.5px / 行高 1.85 / --c-text-2。 这里放两行以便观察行高与段距是否舒服。
辅助文字 · 12.5px / --c-text-3
等宽 · 12.5px —— ba_content / /sukiyous.php
强调用 500 字重 + --c-text; 链接用品牌色 + 半像素下划线; 按键 Ctrl + Shift + R。
间距刻度(4 / 8 / 12 / 16 / 24 / 32)
状态(骨架屏 / 空态)
加载中用骨架(无第三方库,纯 CSS 呼吸动画);无数据用空态,虚线框不与任何实心边框冲突。
骨架屏
空态
可以先写一篇,或换一个分类看看。
样式文件:app/assets/css/content.css · 本版模板:app/components/DocBoard.vue (作用域 .doc-board)· 参照版模板:app/components/DocGallery.vue (作用域 .doc-gallery)。