跳至正文

设计与开发指南

墨序设计系统

创易共享的设计原则、语义 token 与 Vue 组件。为设计和开发提供同一套依据,让界面保持清晰,让注意力留给创作。

共享组件
68
主题
浅色 / 深色
密度
compact / default / reading

设计基础

用语义说明信息,用墨线表达关系。颜色、字形和密度随内容职责变化,组件结构与可访问性保持一致。

语义颜色

中性表面承载内容,紫墨指向行动;完成、提醒与错误使用各自的反馈色。浅色与深色使用同一组语义名称。

画布

background

页面环境

纸张

card

独立内容表面

紫墨

primary

主操作与选中

完成

success

确认成功结果

提醒

warning

需要留意的状态

危险

destructive

失败与破坏性操作

使用 bg-primary、text-primary-foreground 等成对 token。状态同时提供文字或图标,不能只由颜色传达。

排版角色

font-ui 与 font-display 承担界面,font-editorial 承担作品与引文,font-data 承担参数和短标签。字体使用完整系统回退栈。

清楚的操作,安静的界面。

font-ui / 界面与控件

雨停之后,故事继续。

font-editorial / 作品正文

v2 / 2026-10-13 / 128

font-data / 数字与短标签示例

墨线与形状

墨线表示当前位置、焦点和内容关系。用留白组织普通内容,独立对象才使用容器。

border / brand-line
常规分隔与当前内容关系。
radius-control / radius-panel
控件与内容容器分别使用共享圆角。
ring / motion-standard
明确的键盘焦点与短暂操作反馈。

容器密度

通过 data-density 设置局部环境。未指定尺寸的组件跟随容器,显式 size 保持自身尺寸;密度不缩小必要的触控区域。

紧凑

compact

信息流、排行与筛选

默认

default

账户、设置与通用表单

阅读

reading

文稿、创作与内容编辑

字号与阅读节奏

共享主题的字号、行高与推荐字重,单位为像素
用途 / utility字号 / 行高字重
辅助标签text-caption12 / 18500
字段标签text-label14 / 20500
列表摘要text-body-sm14 / 22400
通用正文text-body16 / 26400
局部标题text-title-sm20 / 28600
面板标题text-title-md24 / 32600
页面标题text-title32 / 40600

中文正文使用自然换行与完整回退字体。长篇阅读单行约 28–34 个汉字,数字对比列用 tabular-nums。

间距与响应式

间距以 4px 为基础单位。图标与文字常用 gap-2,字段和列表常用 gap-3 / gap-4,区块使用 gap-6 / gap-8。

小于 768px
按任务采用移动结构,正文单列;触控目标至少 44px,窄屏输入正文至少 16px。
768–1023px
作为过渡区,由内容决定保留单列还是展开布局。
1024px 起
逐步展开侧栏和多列;页面继续消费 layout-page-max 与 layout-gutter。
交互环境
以媒体查询响应粗指针、减少动效与高对比偏好;布局不依赖 User-Agent。

响应式与可访问性

布局优先移动端,标题自然换行;主要触控目标至少 44px。键盘焦点始终可见,字段错误关联到控件,减少动效偏好下保留完整内容与状态。

尺寸与状态

对照真实控件的强调层级、尺寸与状态。颜色说明用途,文字说明结果;焦点、禁用、只读和错误分别表达不同含义。

按钮层级与尺寸

主操作用 default,次要操作用 outline;destructive 表示有破坏性影响的动作。

尚未操作

xs
sm
default
lg
xl

精细指针下,五档高度为 28 / 32 / 36 / 40 / 48px。粗指针下主要触控目标补足 44px;未指定 size 的按钮随容器密度变化。

操作状态

加载由 Spinner、文字和 aria-busy 组合。禁用要说明原因,并在任务结束后恢复操作和焦点。

示例可以继续操作

用 Tab 查看焦点,Enter 或 Space 激活。等待演示由你手动结束,不提交业务请求。

字段状态

可聚焦、可选择复制。

不接收输入与键盘焦点。

错误保留输入内容与修正机会。Field 的 data-invalid、控件的 aria-invalid、关联的 FieldError 一起维护。

文稿操作

组合导航、视图切换和操作反馈。翻页在边界禁用,收藏即时更新,完成与归档状态由文字和控件共同表达。

模式说明

翻阅、收藏与状态反馈

Breadcrumb 表示位置,ToggleGroup 切换视图,Dialog 与菜单承载次级操作。主按钮表达当前文稿状态。

  1. 01 浏览章节与目录
  2. 02 收藏值得回看的段落
  3. 03 标记文稿状态
文稿操作示例
仅用于交互演示
草稿

示例文稿

城南的末班车

Chapter 01 / 03

雨停之后

雨停时,街角的钟比平时慢了两分钟。她合上手里的旧地图,决定沿着那条从未走过的路回家。

01 / 03

01 / Button + Button Group

翻页有边界,完成文稿才使用最明确的操作。

02 / Toggle + Toggle Group

收藏即时生效;正文与目录保留清晰的选中状态。

03 / Menu + Dialog

次要操作收进菜单,预览则在当前文稿之上展开。

交互结果仅在本页生效;完整组件见上方展厅。

Tab 可逐项体验交互

编辑与保存

Field 组织标签与控件,修改后显示未保存状态,预览通过 Dialog 保留当前上下文。示例只在本页生效。

示例更改已记录

组合规则

  • 标签通过 for 与输入控件建立对应关系。
  • 保存是当前主操作,预览使用次级按钮。
  • 状态由文字表达,不只依赖颜色。
  • 真实应用的数据提交、持久化和失败恢复由业务层负责。

Field / Input / Textarea / Button / Dialog

情境模式

观察组件在条件检查、筛选和表单校验中的组合方式。示例数据不提交业务服务,也不表示已开放的产品功能。

创作态 · 阅读密度

条件满足后开放主操作

清单告诉创作者还需要完成什么。满足条件后,操作才会变得可用。

  • 用 reading 密度保留阅读与确认空间。
  • Checkbox 持有检查项,Progress 由完成项数派生。
  • 条件未满足时说明原因;成功结果保留在当前任务附近。

Button / Checkbox / Progress / Alert

作品 · 城南的末班车

发布准备

草稿

1 / 3 项已完成

完成清单后可继续

使用指南

设计、组件和实现沿用同一份规范。基础能力由共享 UI 持有,产品数据、权限和业务流程留在应用内。

先按任务选择组件

执行动作 / 访问页面
Button / 链接

动作保留 Enter 与 Space,跳转保留新标签页和链接语义。

即时设置 / 提交前确认
Switch / Checkbox

是否立即生效决定控件,不以外形选择。

切换内容 / 选择选项
Tabs / ToggleGroup

页签切换内容面板,选项组改变一个值。

少量互斥 / 多选 / 查找
RadioGroup / Checkbox / Combobox

按选项数量、选择规则和搜索需求决定。

持续说明 / 临时结果
Alert / Sonner

关键错误留在任务附近,短暂通知只补充结果。

预览任务 / 确认影响
Dialog / AlertDialog

预览保留上下文,确认先说明影响与取消方式。

按子路径导入组件

先查阅已有组件,再按实际用途组合。共享包直接导出 Vue 与 TypeScript 源码,由应用构建。

import { Button } from '@chuangyi/ui/button';
import { Field, FieldLabel } from '@chuangyi/ui/field';
import { Input } from '@chuangyi/ui/input';

接入样式与字体

styles.css 提供主题、reset 与共享组件的 utility。字体按应用需要单独加载,避免默认下载完整中文字库。

@import 'tailwindcss';
@import '@chuangyi/ui/styles.css';

/* 需要思源字体的应用单独接入。 */
@import '@chuangyi/ui/fonts.css';

字体是可选入口,不做全局 preload。当前 Landing 与 Work 接入,Hub 使用系统回退字体;采用前评估字库体积与布局位移。

完整字段组合

email 与 error 由业务层持有;错误保留用户输入,并关联到实际控件。导入 FieldError 与 FieldDescription 后组合如下。

<Field :data-invalid="Boolean(error)">
  <FieldLabel for="contact-email">接收邮箱</FieldLabel>
  <Input
    id="contact-email"
    v-model="email"
    name="contact-email"
    type="email"
    autocomplete="email"
    :aria-invalid="Boolean(error)"
    :aria-describedby="error ? 'email-error' : 'email-help'"
  />
  <FieldError v-if="error" id="email-error">{{ error }}</FieldError>
  <FieldDescription v-else id="email-help">
    用于接收作品更新。
  </FieldDescription>
</Field>

复用多个字段时,每组 id 必须唯一。提交失败聚焦第一个错误;请求进行时防止重复提交,失败后允许重试。

密度由容器决定

同一容器内的控件共享密度,只有确需稳定尺寸的工具栏或表单才显式指定 size。

<div data-density="compact">
  <Button variant="outline">筛选作品</Button>
  <Button size="lg">固定尺寸的操作</Button>
</div>

组合的责任边界

  • 共享组件管理结构、键盘、焦点、浮层与主题。
  • 应用管理数据、校验、权限、持久化、请求与失败恢复。
  • 跨页签保留的字段值放在父层;列表项与消息使用稳定标识。
  • 页壳统一挂载通知和主题入口,关键正文保持可预渲染。

使用语义 token

布局使用 Tailwind utility,表面、文字、操作和反馈使用语义颜色。容器通过 data-density 选择密度;不在业务页面建立第二套色值与尺寸。

维护规范与示例

设计契约见 packages/ui/DESIGN.md,主题实现见 packages/ui/src/theme.css。组件 API、token 或交互变化时,同时校准规范、展厅实例与使用说明。目录完整性测试会核对每个组件族与导出名称。