# 暖记 (Warm Notes) — 完整设计规格文档 > **面向 LLM 的设计还原参考** — 本文档包含暖记手账日记 App 的完整视觉系统、组件规范、布局结构、交互状态和响应式行为。前端开发者(或 AI 编码助手)应以此文档为设计还原的唯一依据。 --- ## 1. 项目概览 | 属性 | 值 | |------|------| | App 名称 | 暖记 (Warm Notes) | | 定位 | 面向学生的多终端手账日记 App | | 视觉风格 | 温暖治愈 / 手绘插画风 | | 目标平台 | iOS、Android、iPad/平板、桌面客户端 | | 设计稿页面 | 27 页面(手机 14 + 平板 6 + 桌面 6 + 启动页 1) | | 主题系统 | 双主题:暖阳(默认)+ 松风 + 各自暗色模式 | | 技术约束 | 手机视口 390×844(iPhone 15 Pro),平板 1024×768,桌面 1440×900 | --- ## 2. 设计 Token 系统 ### 2.1 颜色系统 #### 主题 1:暖阳 (Warm Sun) — 默认 ```css :root { /* Surface 表面 */ --bg: #FFF8F0; /* 页面背景:暖白 */ --surface: #FFFFFF; /* 卡片/面板背景:纯白 */ --surface-warm: #FFF3E6; /* 温暖表面:浅橙,用于 hover 态和选中态背景 */ /* Foreground 前景 */ --fg: #2D2420; /* 主文字:深棕黑 */ --fg-2: #5C4F47; /* 次要文字:中棕 */ --muted: #7A6D63; /* 辅助文字:灰棕 */ --meta: #8B7E74; /* 元数据/标签文字:浅灰棕 */ /* Border 边框 */ --border: #E8DDD4; /* 标准边框 */ --border-soft: #F0E8DF; /* 柔和边框:分隔线、卡片边框 */ /* Accent 主色调 — 柔和珊瑚/赤陶橙 */ --accent: #E07A5F; /* 主强调色:珊瑚橙 */ --accent-on: #FFF8F0; /* 主强调色上的文字色 */ --accent-hover: #D06A4F; /* 主强调色 hover 态 */ --accent-active: #C05A3F; /* 主强调色 active/按下态 */ --accent-glow: rgba(224, 122, 95, 0.25); /* 强调色光晕 */ /* Secondary 辅助色 — 鼠尾草绿 */ --secondary: #81B29A; --secondary-soft: #D4E8DC; /* 浅绿背景 */ /* Tertiary 第三色 — 暖金 */ --tertiary: #F2CC8F; --tertiary-soft: #FBE8C8; /* 浅金背景 */ /* Rose 玫瑰色 */ --rose: #D4A5A5; --rose-soft: #F0DADA; /* 浅玫瑰背景 */ /* Semantic 语义色 */ --success: #5A9E7E; /* 成功/正向 */ --warn: #D4A843; /* 警告 */ --danger: #C93D3D; /* 危险/错误 */ } ``` #### 主题 2:松风 (Pine Wind) — 男学生向 激活方式:`document.documentElement.setAttribute('data-theme', 'pine')` ```css [data-theme="pine"] { --bg: #F2F3F0; /* 冷灰白背景 */ --surface: #FFFFFF; --surface-warm: #E9EAE6; --fg: #23272F; /* 深灰黑文字 */ --fg-2: #484E58; --muted: #6E7380; --meta: #8A8F9A; --border: #D5D2CD; --border-soft: #E3E1DC; --accent: #4A7B9D; /* 钢蓝色主强调 */ --accent-on: #FFFFFF; --accent-hover: #3F6A8A; --accent-active: #345A78; --accent-glow: rgba(74, 123, 157, 0.25); --secondary: #5B9E7A; /* 森林绿 */ --secondary-soft: #D6E8DE; --tertiary: #C49A3C; /* 琥珀金 */ --tertiary-soft: #F0E4C8; --rose: #7A8B6A; /* 橄榄绿 */ --rose-soft: #E0E8D8; } ``` #### 暗色模式 通过 `@media (prefers-color-scheme: dark)` 自动切换。暖阳暗色: ```css @media (prefers-color-scheme: dark) { :root:not([data-theme]) { --bg: #1A1614; --surface: #2A2520; --surface-warm: #332D28; --fg: #F0E8DF; --fg-2: #C4B8AA; --muted: #9B8E82; --meta: #7A6D63; --border: #3A3530; --border-soft: #302B26; --accent: #E8907A; /* 暗色下珊瑚橙偏亮 */ --accent-on: #1A1614; /* ...其余 token 自动适配 */ } } ``` **关键实现要点:** - 颜色系统全部通过 CSS 自定义属性(Custom Properties)定义,主题切换只需切换 `data-theme` 属性 - 所有组件和页面必须引用 CSS 变量,禁止硬编码颜色值 - 暗色模式跟随系统偏好自动切换,无需用户手动操作 --- ### 2.2 字体排版 ```css /* 字体家族 */ --font-display: "Quicksand", "Nunito", "SF Pro Rounded", -apple-system, system-ui, sans-serif; --font-body: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif; --font-mono: ui-monospace, "JetBrains Mono", monospace; --font-handwritten: "Caveat", "Kalam", cursive; /* 字号阶梯 */ --text-xs: 11px; /* 极小标签、元数据 */ --text-sm: 13px; /* 小号文字、辅助信息 */ --text-base: 15px; /* 正文基准 */ --text-md: 17px; /* 中号,强调正文 */ --text-lg: 20px; /* 小标题 */ --text-xl: 24px; /* 区域标题 */ --text-2xl: 30px; /* 页面标题 */ --text-3xl: 38px; /* 大标题 */ --text-4xl: 48px; /* 超大标题/展示用 */ /* 行高 */ --leading-body: 1.6; /* 正文行高 */ --leading-tight: 1.25; /* 紧凑行高,用于标题 */ ``` **字体使用规则:** - **Display (Quicksand)** — 页面标题、区域标题、Tab 标签、按钮文字。特征:圆润、几何感、友好 - **Body (Nunito)** — 正文段落、列表内容、描述文字。特征:清晰、可读性好 - **Handwritten (Caveat)** — 装饰性文字、心情区域标题、手写风标签。特征:手写感、温暖 - **Mono** — 仅用于数据展示、时间戳 **实现注意事项:** - Quicksand 和 Nunito 需从 Google Fonts 加载:`https://fonts.googleapis.com/css2?family=Quicksand:wght@400;500;600;700&family=Nunito:wght@400;500;600;700&display=swap` - Caveat 手写字体:`https://fonts.googleapis.com/css2?family=Caveat:wght@400;600;700&display=swap` - 字重使用:Regular (400), Medium (500), SemiBold (600), Bold (700) - 全局开启字体平滑:`-webkit-font-smoothing: antialiased` --- ### 2.3 间距系统 ```css --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px; --space-5: 20px; --space-6: 24px; --space-8: 32px; --space-10: 40px; --space-12: 48px; ``` **间距使用规则:** - `space-1` (4px):图标与文字间距、微调 - `space-2` (8px):紧凑元素间距、Checkbox 与文字 - `space-3` (12px):同行元素间距、内边距紧凑 - `space-4` (16px):标准卡片内边距、表单项间距 - `space-5` (20px):页面水平内边距、卡片间距 - `space-6` (24px):区域分隔、大卡片内边距 - `space-8` (32px):大区域分隔 - `space-10` (40px):页面级间距 --- ### 2.4 圆角 ```css --radius-sm: 10px; /* 小元素:输入框、小卡片 */ --radius-md: 16px; /* 标准卡片 */ --radius-lg: 22px; /* 大卡片、特殊区域 */ --radius-xl: 28px; /* 全宽面板、底部弹窗 */ --radius-pill: 9999px; /* 胶囊按钮、标签、头像 */ ``` **关键规则:** - 所有卡片和交互元素都有明显的圆角(最小 10px) - 按钮统一使用 pill 圆角(全圆) - 不使用直角矩形(除特殊装饰元素外) --- ### 2.5 阴影与高度 ```css --elev-soft: 0 2px 12px rgba(45, 36, 32, 0.06); /* 轻浮起:卡片默认 */ --elev-medium: 0 4px 20px rgba(45, 36, 32, 0.08); /* 中浮起:悬浮面板 */ --elev-float: 0 8px 32px rgba(45, 36, 32, 0.12); /* 高浮起:弹窗、模态 */ --shadow-accent: 0 4px 14px rgba(224, 122, 95, 0.25); /* 强调色阴影 */ --shadow-accent-hover: 0 6px 20px rgba(224, 122, 95, 0.35); --shadow-input-focus: 0 0 0 3px rgba(224, 122, 95, 0.2); --focus-ring: 0 0 0 3px rgba(224, 122, 95, 0.45); /* 焦点环 */ ``` --- ### 2.6 运动与动画 ```css --motion-fast: 150ms; /* 快速过渡:按钮、颜色变化 */ --motion-base: 250ms; /* 基准动画 */ --ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1); /* 弹性缓动:悬停、缩放 */ --ease-standard: cubic-bezier(0.2, 0, 0, 1); /* 标准缓动:位移、透明度 */ ``` **动画系统:** ```css /* 页面进入动画 */ @keyframes fadeIn { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: translateY(0); } } .anim-fade { animation: fadeIn 0.5s var(--ease-standard) both; } @keyframes slideUp { from { opacity: 0; transform: translateY(40px); } to { opacity: 1; transform: translateY(0); } } .anim-slide { animation: slideUp 0.6s var(--ease-bounce) both; } @keyframes scaleIn { from { opacity: 0; transform: scale(0.9); } to { opacity: 1; transform: scale(1); } } .anim-scale { animation: scaleIn 0.4s var(--ease-bounce) both; } /* 装饰浮动动画 */ @keyframes float { 0%, 100% { transform: translateY(0) rotate(0deg); } 50% { transform: translateY(-10px) rotate(5deg); } } ``` **动画延迟阶梯(用于列表/卡片错落进入):** - 第 1 项:`animation-delay: 0.1s` - 第 2 项:`animation-delay: 0.15s` - 第 3 项:`animation-delay: 0.2s` - 递增 0.05s --- ### 2.7 布局常量 ```css --container-max: 390px; /* 手机最大内容宽度 */ --safe-top: 54px; /* iOS 顶部安全区(含 Dynamic Island) */ --safe-bottom: 34px; /* iOS 底部安全区(含 Home Indicator) */ --tab-height: 56px; /* 底部 Tab 栏高度 */ --touch-min: 44px; /* 最小触控区域(WCAG 2.5.8) */ ``` --- ## 3. 组件规范 ### 3.1 iOS 设备框架 手机端页面以 iPhone 15 Pro 为基准: ``` 视口: 390 × 844 px Dynamic Island: 居中, 126×36px, 黑色圆角矩形, top:12px 状态栏: 高度 54px (--safe-top), 包含时间(左)、信号/电池图标(右) Home Indicator: 底部居中, 134×5px, 半透明, 距底部 8px ``` **实现要点:** - 每个手机屏幕页面固定 `width: 390px; height: 844px; overflow: hidden` - 内容区域上留 `--safe-top`,下留 `--tab-height + --safe-bottom` - Dynamic Island 使用绝对定位 + `z-index: 200` --- ### 3.2 状态栏 (Status Bar) ```html
``` 样式: - `display: flex; justify-content: space-between; align-items: center` - `padding: 14px 28px 0; height: var(--safe-top)` - `font-size: var(--text-sm); font-weight: 600` - 时间使用 `font-variant-numeric: tabular-nums` 保证等宽数字 --- ### 3.3 底部 Tab 栏 (Bottom Tab Bar) ```html ``` 样式规则: ``` 位置: absolute, bottom:0, width:100% 高度: calc(var(--tab-height) + var(--safe-bottom)) = 90px 背景: var(--surface) 上边框: 1px solid var(--border-soft) 布局: flex, justify-content: space-around ``` **Tab Item 样式:** - 默认态:`color: var(--muted)` - 选中态:`color: var(--accent)`,添加 `.active` 类 - 图标尺寸:24×24px - 文字:`font-size: var(--text-xs)` (11px) - 最小触控区域:44px **中间「写日记」按钮特殊处理:** - 使用独立圆形按钮,向上突出 tab 栏 - `width: 44px; height: 44px; border-radius: 50%` - `background: var(--accent)` - `margin-top: -16px`(向上突出) - 添加 `box-shadow: 0 4px 12px var(--shadow-accent)` 增强浮起感 - 图标颜色:`var(--accent-on)`(即背景色上方的文字色) --- ### 3.4 按钮 (Buttons) #### 主要按钮 (Primary) ```html ``` 样式: ``` padding: 14px 28px (标准) / 16px 48px (大型) border-radius: var(--radius-pill) = 9999px background: var(--accent) color: var(--accent-on) font-family: var(--font-display) font-size: var(--text-md) / var(--text-lg) font-weight: 600-700 min-height: 44px (满足触控要求) box-shadow: 0 4px 14px var(--shadow-accent) transition: all var(--motion-fast) ``` 交互状态: | 状态 | 样式 | |------|------| | Default | `background: var(--accent)` | | Hover | `background: var(--accent-hover); transform: translateY(-1px ~ -2px); box-shadow: 增大` | | Active | `background: var(--accent-active); transform: scale(0.97 ~ 0.98)` | | Focus | `box-shadow: var(--focus-ring)` | | Disabled | `opacity: 0.5; cursor: not-allowed` | #### 次要按钮 (Secondary) ``` background: var(--surface) color: var(--fg) border: 1.5px solid var(--border) Hover → border-color: var(--accent); color: var(--accent) ``` #### 幽灵按钮 (Ghost) ``` background: transparent color: var(--muted) Hover → color: var(--accent) ``` --- ### 3.5 卡片 (Cards) #### 标准卡片 ```html