UI 组件库 · 候选版 V2

组件库

本站正文与内容区可复用的 UI 组件集中预览。样式源 = app/assets/css/content.css(本版作用域 .doc-board),颜色全部取自 main.css 的 token ⇒ 亮色 / 暗色自动一致。

15 节4 组亮 / 暗双主题对照参照版 V1 →

A内容块

01

行内代码

正文里夹一个短标识时用。视觉与既有 .article-body code 保持一致。

改配色只需动 --brand 一处;构建命令是 pnpm build,产物在 .output/public。

02

代码块

头部显示语言 + 右侧「复制」按钮;超宽行在块内横向滚动,不撑破页面。

bash
# 改完前台必须重建,否则线上还是旧产物(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.css
03

SQL 语句

左侧品牌色竖条 + 关键字着色。手写 span 静态示例——项目不引第三方高亮库, 这里只用于看视觉效果。

sql
-- 取最近 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 下应当在块内横滚,页面本身不出现横向滚动。

sql · 超宽单行
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;
04

引用

两个新方向,都彻底去掉底色 —— 常规 blockquote 靠"左竖条 + 淡底"承载引用语义, 这里改由排版标记承载:超大引号定锚点、悬挂缩进定层次、出处挪出正文区。 配色零新增 token,与 V2 的克制基调一致。

Q1 · 摘录式 doc-pull

三点不同:① 只有上下一对细线,没有底色也没有左竖条,像书里的 pull-quote 被"夹"在正文里; ② 超大半透明引号作排版锚点(它占位、定基线、给眼睛一个入口,不是装饰); ③ 出处右侧竖排 —— 中文传统"边批"读法,把出处从"底部一行小字"变成一条纵向坐标。

记录"正确的做法"只能帮人做对一次;记录"错误的做法"才能防止反复踩。

所以每条踩坑记录里,"❌ 已排除方案"那一栏比"解决方案"更值钱。

踩坑记录 / README.md §2.3

Q2 · 页边注式 doc-marg

两栏:左窄栏放编号 + 竖线,右栏正文。像论文的页边注 / 法律文本的条款标记 —— 适合"引权威来源",因为出处与正文平级并列,而不是屈居页脚。 左侧竖线用品牌色渐隐(--brand → 透明),给"这是引用"一个不发散的提示。

01

付费正文绝不能出现在任何静态 HTML 中 —— 这不是"注意一下",是硬约束。

判据是渲染后 DOM,不是 curl | grep: 该页走 SPA 兜底时,静态 HTML 只是个 3408 字节的空壳。

项目约定 · 硬约束 1 / PIT-143
05

提示 / 警告

第四版主推侧锚(V3 方案稿 A 原版):去掉底色与边框, 状态色只留在一条竖线和一个图标上,档名单独一行、正文落灰 —— 颜色只承担识别,不承担阅读。 前三版(大块淡底 / 只留顶线 / 全饱和号牌)为什么不够,在 5.9 有量化对照。 五档 = 说明 / 信息 / 成功 / 警告 / 错误,配色全走 token ⇒ 暗色自动适配。

5.1 侧锚(主推) · Alert theme="anchor" —— 正文里插入用

三个部件:① 竖线浮空(2px 圆头,撑满内容整高,容器零底色零边框零内边距)· ② 档名占行(图标 + 档名并排一行,不与正文挤在一起)· ③ 正文落灰(档名深色 + 字重 600,正文 --c-text-2)。 层次靠字重 + 灰阶而不是色块 ⇒ 五档叠起来也是安静的,不会变成五道荧光笔痕。 不传 title 时档名自动取状态名 —— 不依赖颜色也能读(色盲 / 灰度打印 / 截图转黑白都可用)。

说明

最轻的一档,只做补充,不暗示任何倾向。

信息

背景知识,或"为什么这样做"。竖线取 --brand,与站内主色同源。

成功

推荐做法、省时间的捷径,或"已完成"。沿用站内"免费 / 成功"标签的绿。

警告

会出错、会返工、代价大的地方。沿用站内"付费 / 待处理"标签的橙。

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 就用标题当档名(更贴合业务), 没传就落到状态名。灰正文里的加粗会自动回到深色 —— 否则"强调"落在灰上等于没强调;行内代码同样降到正文灰,不抢正文。 侧锚无壳,所以放在任何底色上都不打架(页面底 / 卡片 / 浮层通用)。

重建前台前必须先提交

改动没提交就部署,线上跑的是哪一版事后查不出来。 先 git commit,再跑 rebuild-web.sh。

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 步"这种极轻的指向性提示 —— 上侧锚太重、纯文字又看不出是提示。胶囊小、同色、不打断阅读节奏(三个状态都可在句中用)。

点右侧

下载原始数据
可以拿到未清洗的表格。

这一步不能跳过

先改库再改代码
,顺序反了会白改一遍。

生成完毕

耗时 0.8 秒
,无需手动刷新。

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"

信息(蓝)

去掉底色,只留一条 1px 顶线 + 大图标。

❌ 病根:顶线对比度四档严重不均 —— 信息档 --c-info-line 只有 2.02 : 1(几乎看不见), 警告 / 错误档却有 6.3 ~ 6.4:1 ⇒ 同一组里有的"有框"有的"没框"; 且容器边界消失后,一条提醒退化成普通列表项。

第三版 · 号牌式 theme="flag"

信息

信息(蓝)

颜色集中到一小块全饱和实心号牌上。

❌ 病根:号牌虽然有力,但它与正文的排版轴不是同一条 —— 号牌自身有 padding,视觉重心落在左侧那一块, 连排时五块实心色各自抢焦点;且它的宽度随状态名长短变化, 一组里"信息 / 错误"两块宽度不同,左边缘对不齐正文。

第三版 · 实心横版 theme="slab"

信息(蓝)

整块实心 + 全部反白。

❌ 病根:只适合页面级单条公告(一次只出现一条)。 它的面积决定了"这是全站最重要的一件事"—— 日常提醒用它属于把最高音量用在最小的事上,多条叠起来直接互相打架。

B交互组件

06

按钮

5 个变体 × 3 档尺寸 × 6 种状态。风格对齐既有 .theme-btn(圆角用 --radius-ctl)。

变体

尺寸 · 块级

状态(前 3 个是真交互,鼠标移上去 / Tab 聚焦试)

07

标签 / 徽章

标签沿用既有 .tag 的 5px 圆角与字号; .doc-tag-lg 用 14px 胶囊(对齐 .sub-tag)。

语义变体

默认描边信息免费 / 成功付费 / 待处理错误

尺寸

小中(默认)大(胶囊)

徽章(数字 / 圆点)

399+✓
08

卡片

基础形态对齐既有 .card(12px 圆角 + 0.5px 细线),浮起用 --shadow-sm。

基础卡片
只有头 + 体。最常用的一档,用于承载一段说明或一个入口。
带阴影
加 doc-card-raised ⇒ 常态就浮起(--shadow-sm)。

可点击

悬停会 translateY(-2px) + 加阴影,与既有 .card:hover 同款手感。
选中态
边框转品牌色 —— 用于单选卡片、当前项高亮。
长内容
卡片体自适应高度;同排卡片用 grid 等宽。这里放一段稍长的文字用于观察换行与行高: 行高 1.8、字号 13.5px,与正文辅助文字一致,避免"组件和正文两套排版"。
09

表单

input / textarea / select / checkbox / radio / switch × 默认 · 聚焦 · 禁用 · 错误 · 成功。 聚焦环用 --c-fill-info 做 3px 外发光,不新造颜色。

辅助说明文字,12px、--c-text-3。

勾选 / 单选 / 开关

开关禁用

C数据与结构

10

列表 / 步骤条

有序 / 无序 / 勾选式(含"已完成"删除线)/ 步骤条(已完成 · 当前 · 未开始)。

有序 + 无序

  1. 先查陷阱(--traps)
  2. 再开验证方案
  3. 最后才动代码
  • 路径与命令都真实可达
  • 每行都有期望值

勾选式(含已完成)

  • 验证方案已闭环
  • 八项巡检全绿
  • 首页临时入口未撤(待办 #72)

步骤条

  • 1查陷阱
  • 2写方案
  • 3改代码
  • 4部署验证
11

导航

面包屑 / 标签页 / 分页。面包屑对齐既有 .breadcrumb 的 13px 与 6px 间距。

面包屑

标签页

全部
免费
付费
草稿(禁用)

分页

上一页123…12下一页
12

表格

窄屏横滚发生在容器内(.doc-table-wrap),页面本身不出现横向滚动 —— 这是 PIT-026 / PIT-027 的结论:不要用 overflow:hidden 掩盖, 也不要用 nowrap 撑宽,而是给表格一个自带横滚的容器。

标题分类状态浏览
离差平方和与方差的关系资料分析免费1,284
线性插值在图表题里的取巧数量关系付费963
逻辑填空:转折词的三种误用判断推理免费742
13

模态框 / 阻断确认

与 05 提示 / 警告 同族 —— ModalAlert 就是"五档提醒"的阻断形态,配色、图标、动效全部复用同一套。 只做视觉:不劫持滚动、不引 JS;真实弹窗由调用方负责显隐与焦点管理。

危险操作确认(state="error")—— 确认按钮借用按钮组件的 doc-danger,不为提醒组件另造按钮色板

纯告知(state="info" :single="true")—— 单按钮,无需用户做选择

已提交审核

通常 1 个工作日内出结果,结果会发到你的会员中心。

D基础与状态

14

排版层级 + 间距刻度

四级标题 + 正文 / 辅助 / 等宽 / 强调 / 链接 / 按键 + 分隔线。字号沿用站内既有梯度。

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)

4px · 图标与文字之间
8px · 同组控件之间
12px · 卡片内边距下限
16px · 卡片 / 段落之间
24px · 区块之间
32px · 大章节之间
15

状态(骨架屏 / 空态)

加载中用骨架(无第三方库,纯 CSS 呼吸动画);无数据用空态,虚线框不与任何实心边框冲突。

骨架屏

空态

◌ 这个分类下还没有内容

可以先写一篇,或换一个分类看看。

样式文件:app/assets/css/content.css · 本版模板:app/components/DocBoard.vue (作用域 .doc-board)· 参照版模板:app/components/DocGallery.vue (作用域 .doc-gallery)。