设计令牌与组件清单
PVQ-UI 设计令牌与组件清单(模块文档 / 组件 API 说明)
状态:组件 API 人类可读说明(库 1.2.0) 机器可读唯一真源:
site/inc/components.json(官网画廊数据驱动,新增组件只改 JSON,画廊自动出现)。本文件引用 JSON,不再手抄示例。 用途:人类查阅组件 API / 设计令牌;判断"某组件是否已存在"以components.json为准。 关联:《PVQ-UI项目规则.md》(铁律,§2.3 定义 JSON 为唯一真源)、《PVQ-UI组件库开发方案.md》§3.5(架构)、《组件提取对照表.md》(旧→新映射)、《PVQ-UI组件库调用手册.md》(插件实操)
0. 文档地位
- 本文件是
pvq-ui组件 API 的人类可读说明;机器可读的唯一真源是site/inc/components.json(含组件 id / 名称 / 层 / 稳定性 / 示例 HTML,官网画廊遍历它渲染)。 - 任何"这个组件库有没有 / 叫什么类"的问题,以
components.json为准;它里面没有的,才进入"新增组件"流程(先文档 → 再代码,见《PVQ-UI项目规则》§1)。本文件的示例仅作阅读参考,真值随 JSON 同步。 - 稳定性标记:
stable(承诺不破坏改)/experimental(接口可能调整,引用建议锁版本)。首版基线全部stable。
1. 当前库版本
1.2.0。在 1.1.2 基础上新增删除按钮二次确认(data-pvq-confirm,破坏性操作防护,1.2.0 新增)。1.1.x 演进:1.1.0 选择器 Select、1.1.1 Tabs 胶囊化、1.1.2 Tabs 淡边框对齐 pvq-wp。旧插件名仅在《组件提取对照表.md》§6 作为迁移映射出现。- 旧插件名(
.pvq-btn-primary、.pvq-card-header、.pvq-connection-status等)不在本表,仅在《组件提取对照表.md》§6 作为迁移映射出现。
2. 设计令牌(:root 全集,base 层 pvq-ui.css)
取值以 wolai
admin-settings.css:11-62为基线;标注【合并】的为从 pvq-wp / threads 吸收(库首版新增)。库是纯令牌提供方,不假设--pvq-theme-*存在。令牌只加不删(见《项目规则》§2.4)。
2.1 主色系(森林绿)
| 令牌 | 值 | 说明 |
|---|---|---|
--pvq-primary |
#608062 |
主色 |
--pvq-primary-hover |
#4f6b51 |
主色 hover |
--pvq-primary-light |
rgba(96,128,98,0.08) |
主色浅底 |
--pvq-primary-soft |
rgba(96,128,98,0.12) |
主色柔底 |
--pvq-primary-glow |
rgba(96,128,98,0.20) |
主色辉光(focus / 阴影) |
--pvq-primary-gradient |
linear-gradient(135deg,#608062,#7a9e7c) |
主色渐变 |
--pvq-primary-gradient-hover |
linear-gradient(135deg,#4f6b51,#6b8e6d) |
主色渐变 hover |
2.2 语义色
| 令牌 | 值 | 说明 |
|---|---|---|
--pvq-success |
#4a8c5c |
成功 |
--pvq-success-light |
rgba(74,140,92,0.08) |
成功浅底 |
--pvq-danger |
#c45454 |
危险 |
--pvq-danger-light |
rgba(196,84,84,0.08) |
危险浅底 |
--pvq-warning |
#c49a2e |
警告 |
--pvq-warning-light |
rgba(196,154,46,0.08) |
警告浅底 |
--pvq-info |
#5a8a9a |
信息 |
--pvq-info-light |
rgba(90,138,154,0.08) |
信息浅底 |
2.3 中性色
| 令牌 | 值 | 说明 |
|---|---|---|
--pvq-bg |
#f4f5f2 |
页面背景 |
--pvq-surface |
#ffffff |
卡片 / 表面 |
--pvq-surface-hover |
#fafaf8 |
表面 hover |
--pvq-border |
#dfe3dc |
边框 |
--pvq-border-light |
#eaecea |
浅边框 / 分隔 |
--pvq-text |
#1e2a1f |
主文本 |
--pvq-text-secondary |
#5c6b5e |
次文本 |
--pvq-text-muted |
#94a396 |
弱文本 |
2.4 圆角
| 令牌 | 值 |
|---|---|
--pvq-radius-sm |
8px |
--pvq-radius |
12px |
--pvq-radius-lg |
16px |
--pvq-radius-xl |
20px |
--pvq-radius-pill【合并 pvq-wp】 |
999px |
2.5 阴影
| 令牌 | 值 |
|---|---|
--pvq-shadow-sm |
0 1px 3px rgba(30,42,31,0.04) |
--pvq-shadow |
0 2px 8px rgba(30,42,31,0.06) |
--pvq-shadow-md |
0 4px 20px rgba(30,42,31,0.08) |
--pvq-shadow-lg |
0 8px 32px rgba(30,42,31,0.12) |
--pvq-shadow-primary |
0 4px 16px rgba(96,128,98,0.25) |
2.6 缓动与过渡
| 令牌 | 值 |
|---|---|
--pvq-ease |
cubic-bezier(0.4,0,0.2,1) |
--pvq-ease-bounce |
cubic-bezier(0.34,1.56,0.64,1) |
--pvq-ease-magnet |
cubic-bezier(0.34,1.3,0.55,1) |
--pvq-ease-smooth |
cubic-bezier(0.25,0.1,0.25,1) |
--pvq-transition |
all 0.25s var(--pvq-ease) |
--pvq-transition-fast |
all 0.15s var(--pvq-ease) |
--pvq-transition-slow |
all 0.4s var(--pvq-ease-smooth) |
2.7 尺寸补充
| 令牌 | 值 | 说明 |
|---|---|---|
--pvq-input-h【合并 threads】 |
40px |
输入控件高度基准 |
3. 组件清单(按层)
层说明:
pvq-ui(base) 全场景;pvq-ui-admin/pvq-ui-editor/pvq-ui-frontend为场景层,依赖 base。
3.1 Base 层(pvq-ui.css)
按钮 Button · stable
- 类:
.pvq-btn - 修饰符:
--primary--secondary--danger--warning--ghost--sm--icon - 组合:
.pvq-btn-group(按钮组,右对齐) - 删除按钮:复用
.pvq-btn--danger+fa-trash图标;破坏性操作建议加data-pvq-confirm二次确认(见下「删除按钮二次确认」) - 示例:
<button class="pvq-btn pvq-btn--primary"><i class="fas fa-save"></i> 保存</button> <div class="pvq-btn-group"> <button class="pvq-btn pvq-btn--secondary">取消</button> <button class="pvq-btn pvq-btn--primary">保存</button> </div> <!-- 删除按钮:文字版 / 图标-only 版 / 小号版 --> <button class="pvq-btn pvq-btn--danger"><i class="fas fa-trash"></i> 删除</button> <button class="pvq-btn pvq-btn--danger pvq-btn--icon"><i class="fas fa-trash"></i></button> <button class="pvq-btn pvq-btn--danger pvq-btn--sm"><i class="fas fa-trash"></i> 删除</button>
删除按钮二次确认(破坏性操作防护)· stable(1.2.0 新增行为)
- 行为:给任意按钮加
data-pvq-confirm="确认文案",库 JS 接管二次确认,避免误触删除 / 整页表单提交。任意.pvq-btn(不限于 danger)均可加。 - 交互(库 JS,捕获阶段
preventDefault+stopPropagation,见下「WordPress 注意」):- 首次点击:仅进入「确认态」——按钮就地变为实色危险红(
.pvq-btn--armed)+ 文案替换为确认语(如「确定删除?」),不触发原行为;设 3 秒自动取消。 - 确认态内再次点击:恢复外观并放行原行为(表单提交 / 插件自有
click监听照常执行)。 - 超时(3s)/ 按
Esc/ 点击页面其它处:自动取消,恢复原样。
- 首次点击:仅进入「确认态」——按钮就地变为实色危险红(
- 修饰符:
.pvq-btn--armed(确认态实色红,库自动加 / 去,插件勿手写)。 - 示例:
<button class="pvq-btn pvq-btn--danger" data-pvq-confirm="确定删除该项?"> <i class="fas fa-trash"></i> 删除 </button> - WordPress 注意:若按钮位于 WP
<form>内(如upload.php),首次点击由库在捕获阶段preventDefault,避免整页重载;确认态内第二次点击才放行。插件无需额外处理。 - 设计意图:破坏性操作统一防护,各插件不重复造轮子;纯
data-*增强,不破坏既有按钮样式与提交逻辑。
卡片 Card · stable
- 类:
.pvq-card - 子元素:
.pvq-card__header.pvq-card__icon.pvq-card__icon--{primary,success,warning,info,danger}.pvq-card__title.pvq-card__desc.pvq-card__action - 示例:
<div class="pvq-card"> <div class="pvq-card__header"> <span class="pvq-card__icon pvq-card__icon--primary"><i class="fas fa-cog"></i></span> <div> <h3 class="pvq-card__title">连接设置</h3> <p class="pvq-card__desc">配置账号信息</p> </div> </div> <div class="pvq-card__action"> <button class="pvq-btn pvq-btn--primary">保存</button> </div> </div>
表单 Field / Input · stable
- 类:
.pvq-field.pvq-field__label.pvq-field__help.pvq-input.pvq-input__wrap.pvq-input__wrap--has-icon.pvq-input__icon.pvq-input__toggle - 示例:
<div class="pvq-field"> <label class="pvq-field__label">API Token</label> <div class="pvq-input__wrap pvq-input__wrap--has-icon"> <i class="pvq-input__icon fas fa-key"></i> <input class="pvq-input" type="text" placeholder="请输入"> </div> <p class="pvq-field__help">在设置页获取你的 Token。</p> </div>
选择器 Select(自定义下拉,渐进增强原生 select)· experimental
- 类:
.pvq-select(包裹原生<select>,库自动初始化).pvq-select__trigger.pvq-select__text.pvq-select__arrow.pvq-select__dropdown.pvq-select__option.pvq-select--open.pvq-select__option--selected.pvq-select__option--disabled - 结构:
.pvq-select内放一个原生<select>(保留其name/value/disabled,表单照常提交);库 JS 自动把它增强为自定义下拉,原生 select 仅视觉隐藏、DOM 仍存在,选中即同步原生 select 的value并派发change。 - 交互(库 JS,原生事件委托、无 jQuery):点击 trigger 开/关;打开时箭头翻转、空间不足自动向上弹(flip)、右边界贴合、滚动/缩放重定位;键盘 Enter/Space 切换、ArrowDown 打开、Esc 关闭;点击外部关闭;同时只开一个。
- 可访问性:首版
experimental为简易键盘(triggertabindex=0+ Enter/Space/Esc),role=listbox/option、aria-expanded、方向键在选项间移动留待 stable 时补齐。 - 下拉面板挂
<body>(position:fixed):为绕过 WP metabox 的overflow:hidden裁剪,非 jQuery 特性,原生版同样如此。 - 示例:
<div class="pvq-select"> <select name="threads_sync_settings[mode]"> <option value="auto">自动同步</option> <option value="manual" selected>手动同步</option> <option value="off">关闭</option> </select> </div>
开关 Switch(语义化,纯 CSS)· stable
- 结构:
.pvq-switch包<input type="checkbox" class="pvq-switch__input">+<span class="pvq-switch__slider"> - 行布局:
.pvq-switch-row.pvq-switch-row__label.pvq-switch-row__desc - 行为:纯 CSS,由
:checked控制,零 JS;可访问性最好(真实 checkbox)。 - 示例:
<div class="pvq-switch-row"> <div> <div class="pvq-switch-row__label">启用同步</div> <div class="pvq-switch-row__desc">开启后自动同步内容</div> </div> <label class="pvq-switch"> <input type="checkbox" class="pvq-switch__input" checked> <span class="pvq-switch__slider"></span> </label> </div>
状态指示 Status · stable
- 类:
.pvq-status--{success,warning,error}.pvq-status__dot - 示例:
<span class="pvq-status pvq-status--success"><span class="pvq-status__dot"></span> 已连接</span>
徽标 Badge · stable【新增】
- 类:
.pvq-badge;可选修饰符--primary等(默认主色浅底) - 示例:
<span class="pvq-badge">v1.3.18</span>
横幅 Banner(原 connection-status)· stable
- 类:
.pvq-banner--{success,danger,warning,info}.pvq-banner__dot.pvq-banner__title.pvq-banner__text - 映射:connected→
--success、disconnected→--danger、unconfigured→--warning - 示例:
<div class="pvq-banner pvq-banner--success"> <span class="pvq-banner__dot"></span> <div><div class="pvq-banner__title">已连接</div><div class="pvq-banner__text">账号验证通过</div></div> </div>
提示 Alert(原 test-result)· stable
- 类:
.pvq-alert--{success,error,loading}+ 显隐类.pvq-alert--show - 示例:
<div class="pvq-alert pvq-alert--show pvq-alert--success"><i class="fas fa-check"></i> 测试通过</div>
统计 Stat(原 cache-stat)· stable
- 类:
.pvq-stat-grid.pvq-stat.pvq-stat__value.pvq-stat__label - 示例:
<div class="pvq-stat-grid"> <div class="pvq-stat"><div class="pvq-stat__value">128</div><div class="pvq-stat__label">已同步</div></div> <div class="pvq-stat"><div class="pvq-stat__value">12</div><div class="pvq-stat__label">待处理</div></div> </div>
帮助 Help(原 help-card)· stable
- 类:
.pvq-help.pvq-help__icon.pvq-help__title.pvq-help__text - 示例:
<div class="pvq-help"> <i class="pvq-help__icon fas fa-lightbulb"></i> <div><div class="pvq-help__title">小贴士</div><div class="pvq-help__text">首次使用请先配置 Token。</div></div> </div>
范围 Range · stable(场景层 admin 引用,见 §3.2)
- 类:
.pvq-range.pvq-range__group.pvq-range__value.pvq-range__labels - 示例:
<div class="pvq-range__group"> <input type="range" class="pvq-range" min="1" max="100" value="50"> <span class="pvq-range__value">50</span> </div> <div class="pvq-range__labels"><span>慢</span><span>快</span></div>
分隔 Divider · stable
- 类:
.pvq-divider
转圈 Spinner · stable
- 类:
.pvq-spinner;动画@keyframes pvq-spin
元信息列表 Meta-list(原 system-info)· stable
- 类:
.pvq-meta-list.pvq-meta-list__row.pvq-meta-list__key.pvq-meta-list__value.pvq-meta-list__value--{ok,bad} - 示例:
<div class="pvq-meta-list"> <div class="pvq-meta-list__row"><span class="pvq-meta-list__key">PHP</span><span class="pvq-meta-list__value pvq-meta-list__value--ok">8.1</span></div> </div>
动画 Animations · stable
@keyframes pvq-spin(转圈)、pvq-pulse(状态点)、pvq-shimmer(光泽)、pvq-slideDown/Up、pvq-cardEnter、pvq-tabEnter、pvq-iconBounce、pvq-badgePulse、pvq-resultSlide、pvq-logoAppear、pvq-lightbulb、pvq-detectBarEnter- base 层另含
@media (prefers-reduced-motion: reduce)全局降级。
3.2 Admin 层(pvq-ui-admin.css)
设置页骨架 Settings · stable
- 类:
.pvq-settings.pvq-settings__header.pvq-settings__logo.pvq-settings__title-group.pvq-settings__title.pvq-settings__subtitle.pvq-settings__version-badge.pvq-settings__footer.pvq-settings__footer-info.pvq-settings__footer-links.pvq-settings__footer-link.pvq-settings__footer-link--disabled
选项卡 + 磁吸滑块 Tabs · stable
- 类:
.pvq-tabs.pvq-tabs__slider.pvq-tab.pvq-tab--active.pvq-tab__icon.pvq-tab-content.pvq-tab-content--active - 交互:库 JS 委托点击切换 + 移动滑块(见《调用手册》§5)。
- 形态:分段控件式胶囊(pill)。容器
.pvq-tabs、磁吸滑块.pvq-tabs__slider、tab.pvq-tab均为全圆角(--pvq-radius-pill: 999px);容器width: fit-content紧凑跟随内容(不撑满整行)、1px--pvq-border-light淡边框(与pvq-wp一致);激活态靠滑块主色渐变垫底、文字白,未激活灰字、hover浅主色底。JS 仅按offsetLeft/offsetWidth定位滑块,圆角变化不影响逻辑。参考pvq-wp选项卡实现(1.1.1 起由矩形圆角改为胶囊,1.1.2 起边框对齐 pvq-wp 淡边框)。 - 示例:
<div class="pvq-tabs"> <span class="pvq-tabs__slider"></span> <button class="pvq-tab pvq-tab--active" data-pvq-tab="general"><i class="pvq-tab__icon fas fa-cog"></i> 常规</button> <button class="pvq-tab" data-pvq-tab="advanced"><i class="pvq-tab__icon fas fa-sliders-h"></i> 高级</button> </div> <div class="pvq-tab-content pvq-tab-content--active" data-pvq-tab-panel="general">…</div> <div class="pvq-tab-content" data-pvq-tab-panel="advanced">…</div>
范围 Range · stable(见 §3.1,admin 设置页常用,随 admin 层提供)
3.3 Editor 层(pvq-ui-editor.css)
块骨架 Block · stable
- 类:
.pvq-block-placeholder.pvq-block-loading.pvq-block-empty.pvq-block-preview.pvq-block-frame - 说明:通用块编辑占位 / 加载 / 空态 / 预览 / 边框,供各插件块复用。
3.4 Frontend 层(pvq-ui-frontend.css)
内容组件 · stable
- 类:
.pvq-callout.pvq-callout__icon.pvq-callout__content.pvq-quote.pvq-prose - 说明:前端通用内容展示(提示框 / 引用 / 正文排版)。
4. 不在库内(留在插件自有)
以下强绑定各自数据模型 / 业务逻辑,不进库,但要求改用 --pvq-* 令牌保持一致风格:
- wolai 专有:
.pvq-wolai-*、.pvq-token-info、.pvq-detect-bar、.pvq-status-available/-unavailable、.pvq-wolai-callout等。 - 各插件业务逻辑专有样式,留在插件,不回流库。
5. 新增组件流程(库增量贡献)
- 先查本表确认不存在。
- 在
doc/开发文档/或本表写组件条目(API / 类 / 令牌 / 示例),先标experimental。 - 写 CSS/JS(BEM 双横线、统一令牌、
pvq-动画前缀)。 - bump 版本(MINOR),同步
CHANGELOG.md与readme.md(版本三处同步)。 - 经 1~2 个插件验证后,本表稳定性改为
stable。
详见《PVQ-UI项目规则.md》§1、§5、§8 与《库演进治理方案.md》§4。