This document is shown in its original Chinese; an English translation is pending.
Architecture and concepts
FlareMo Design System (Ember)
FlareMo 设计系统(Ember)
产品设计原则:简约不简单,克制不放肆。
FlareMo 的视觉语言叫 Ember:界面保持安静,暖调中性色承担约 90% 的表面,品牌火焰色(橙 → 珊瑚,取自 logo 渐变)只出现在关键动作和状态上。克制是高级感的主要来源。
色彩
所有 token 定义在 apps/web/src/index.css,用 oklch 书写,.dark 类切换暗色。
- 品牌色阶
--flame-50~--flame-700+--flame-coral(Tailwind 类flame-*)。--flame-500是亮色模式主行动色(白底对比度达标),暗色模式用--flame-400。 - 中性色带暖调(hue 60–80,小 chroma),不要用纯灰。
- 语义色:
primary/secondary/muted/accent/destructive/success/warning/info及各自的-foreground。 - 品牌渐变
--gradient-brand(Tailwind 类bg-brand-gradient)只允许出现在四处:logo、主 CTA(如发送按钮)、置顶标记、选中态指示条。一屏最多一个渐变 CTA。 - 悬浮/hover 的品牌浅底用
accent(亮色 flame-50 / 暗色 flame 深底),不要用冷灰。
字体与排版
- 字体栈:Geist Variable + CJK 回退,按语言域分派——
--font-cjk与--font-cjk-serif在:root/:root:lang(ja)/:root:lang(ko)三处分别定义,日韩各拿自己的字形。新增 UI 文本不要绕过font-sans;分享卡插件另可选sans/heading/serif/mono四档。 - 全站统一排版阶梯(Type Scale):
- Display / 统计大数:
text-2xl leading-none font-semibold tabular-nums - 页面大标题 (H1):
text-lg sm:text-xl font-semibold tracking-tight - 弹窗/区域大标题 (H2):
text-base font-semibold tracking-tight - 分组标签 (H3/Label):
text-xs font-medium text-muted-foreground(去除全大写与非拉丁宽字距) - 侧边栏与主导航项:统一为
h-9 rounded-lg px-2.5 text-sm,图标基准尺寸统一为size-4 shrink-0;未激活态为text-muted-foreground hover:bg-muted hover:text-foreground,激活态统一使用柔和的bg-accent text-accent-foreground font-medium(主侧边栏与设置页侧边栏统一遵循此规则,严禁设置页使用高饱和实心大橙块或 iOS 仿生五彩图标徽章)。 - 正文与描述:笔记正文 15px / leading-7(
.memo-markdown已固化);UI 说明文案text-sm leading-relaxed。 - 辅助信息/时间戳/徽标:
text-xs,严禁低于 12px 的翻译文本。
- Display / 统计大数:
- 字号下限:12px(
text-xs)用于一切会被翻译的文案。 10px/11px 只允许承载纯数字、计数徽标与键盘符号(<kbd>里的↑↓/↵/esc)——汉字在 12px 以下笔画开始粘连,而中文是主力语言,这条是硬线(typography.test.ts会扫源码拦截)。 - 字距:
tracking-tight只对拉丁语系成立。汉字字面几乎占满 em 框、两侧留白极小,负字距会让笔画多的字粘连;因此[dir="rtl"]与:lang(zh/ja/ko)各有一条归零规则。这两条必须写在@layer base之外——它们要覆盖@layer utilities里的.tracking-*,而 CSS 分层规则中后声明的层永远胜过前一层、与特异性无关,写在 base 里会被工具类无声盖掉(历史上这两条都因此失效过,测试已加回归守卫)。
形状与层级
- 圆角基准
--radius: 0.75rem:控件 8px(md)、卡片/composer 12px(xl)、浮层 14px、标签 chip 全圆角。 - 层级规则:页面
bg-background→ 卡片bg-card + shadow-xs→ 浮层bg-popover + shadow-lg。亮色模式用暖调阴影(--shadow-xs/sm/md/lg);暗色模式不用阴影表达层级——.dark的 shadow token 置近零,靠表面明度阶梯(实测值 0.155 / 0.21 / 0.235)+ 发丝线区分层级。 - 分隔用发丝线
border-border/60,不要用粗重边框。
动效
token:animate-rise(200ms expo 入场)、animate-fade(140ms)、animate-scale-in(140ms spring,小元素)、animate-shimmer(骨架屏)。
规则:
- 只动
transform和opacity;交互反馈 ≤140ms,入场 ≤320ms。 - 列表入场用 stagger(每张卡延迟
index * 35ms,上限 8 张,见MemoCard的indexprop)。 - hover 位移不超过 2px;按钮按压用已有的
active:translate-y-px。 - 全局 reduced-motion 兜底为准(
index.css的prefers-reduced-motion: reduce块关停全部动画/过渡);新增大型编排动画仍需显式motion-safe:前缀,零散 transition 不必逐处加前缀。 - 不要在组件里写内联
animate-[...]魔法字符串,统一用上面的 token。
组件约定
- 基于 shadcn(radix-nova)+ cva,新组件先进
apps/web/src/components/ui/。 Button的brand变体是渐变 CTA,一屏最多一个;Badge的flame变体用于标签 chip。- 笔记编辑是就地编辑(in-place),不要新开 Dialog;
Esc取消、Cmd/Ctrl+Enter保存。 - 骨架屏用
Skeleton(shimmer),不要用animate-pulse。 - 破坏性操作必须二次确认(AlertDialog);变更用乐观更新 + toast 反馈。
文案
- 中文用全角标点,省略号用
…;英文用 sentence case。 - 产品内统一叫"记录 / note",不要混用"笔记/便签/memo"(代码标识符除外)。官网中文文案同样遵守("记录"而非"笔记")。
- 空状态文案要给出下一步动作(例:"在上方写下第一条记录"),不要只写"暂无内容"。
- 性能/容量宣称全站单一口径:官网延迟宣称基准为 sub-100ms;禁用"永不""终生""取之不竭""最优解"类绝对化词(对照
docs/design-principle-rollout.md)。
官网(Paper 体系)
官网 apps/site 运行独立于 Ember 的自建 token 体系:signal/ink/mist/paper(hex 而非 oklch,见 apps/site/src/styles/tokens.css)。视觉语言同源(火焰色点睛、界面安静),但不与应用共刷同一套变量。官网遵守与 Ember 等价的克制尺子(来源:docs/design-principle-rollout.md 第 0 节):
- 一屏一个渐变:任何视口内品牌渐变最多 1 处 CTA + 0–1 处品牌识别元素(logo、渐变标题行);光晕(blur-3xl 环境光)一屏最多 1 处,且不与渐变标题同屏。
- 无装饰性循环动画:无限循环只允许骨架屏 shimmer、真实状态指示(录音中、上传中)、录音波形;呼吸灯小圆点全站禁止。
- hover 光效每屏限额:cursor 聚光灯类组件单页最多 4 张卡使用,不与渐变标题同屏。
- 入场动效覆盖 ≤ 50%:单页被 Reveal/PopIn 包裹的区块过半即超标,必须留完全不动的区块。
- 数字不许浮夸:性能/容量宣称全站单一口径(见文案节)。
- 同款模板不连用:badge/heading/subtitle 三件套一页内连续复用 ≤ 2 次;一个视觉内不得有重复/相似标题。
全局 reduced-motion 兜底在 apps/site/src/styles/tokens.css;AnimatedNumber 等数字组件必须显式传 locale,避免 SSR/hydration 格式漂移。
