{ "schemaVersion": 2, "generatedAt": "2026-05-13T00:00:00.000Z", "title": "Design System: haha-admin-mp", "extensions": { "colorMeta": { "amber-primary": { "role": "primary", "displayName": "Amber Primary", "canonical": "oklch(78% 0.17 85)", "tonalRamp": [ "oklch(20% 0.04 85)", "oklch(35% 0.08 85)", "oklch(48% 0.12 85)", "oklch(60% 0.15 85)", "oklch(70% 0.17 85)", "oklch(78% 0.17 85)", "oklch(88% 0.12 85)", "oklch(95% 0.04 85)" ] }, "amber-bg": { "role": "primary-bg", "displayName": "Amber Background", "canonical": "oklch(97% 0.02 85)", "tonalRamp": [ "oklch(98% 0.01 85)", "oklch(97% 0.02 85)", "oklch(96% 0.025 85)", "oklch(95% 0.03 85)", "oklch(94% 0.035 85)", "oklch(92% 0.05 85)", "oklch(90% 0.07 85)", "oklch(85% 0.1 85)" ] }, "orange-accent": { "role": "secondary", "displayName": "Orange Accent", "canonical": "oklch(62% 0.2 50)", "tonalRamp": [ "oklch(18% 0.05 50)", "oklch(30% 0.08 50)", "oklch(42% 0.12 50)", "oklch(52% 0.16 50)", "oklch(62% 0.2 50)", "oklch(72% 0.18 50)", "oklch(84% 0.1 50)", "oklch(94% 0.03 50)" ] }, "green-success": { "role": "semantic", "displayName": "Green Success", "canonical": "oklch(62% 0.17 160)", "tonalRamp": [ "oklch(18% 0.05 160)", "oklch(32% 0.08 160)", "oklch(45% 0.12 160)", "oklch(55% 0.15 160)", "oklch(62% 0.17 160)", "oklch(72% 0.15 160)", "oklch(84% 0.08 160)", "oklch(94% 0.03 160)" ] }, "red-error": { "role": "semantic", "displayName": "Red Error", "canonical": "oklch(55% 0.21 25)", "tonalRamp": [ "oklch(18% 0.06 25)", "oklch(28% 0.1 25)", "oklch(40% 0.15 25)", "oklch(50% 0.18 25)", "oklch(55% 0.21 25)", "oklch(65% 0.18 25)", "oklch(78% 0.1 25)", "oklch(93% 0.03 25)" ] }, "amber-warning": { "role": "semantic", "displayName": "Amber Warning", "canonical": "oklch(68% 0.16 75)", "tonalRamp": [ "oklch(18% 0.04 75)", "oklch(30% 0.07 75)", "oklch(44% 0.1 75)", "oklch(56% 0.13 75)", "oklch(68% 0.16 75)", "oklch(78% 0.14 75)", "oklch(86% 0.08 75)", "oklch(95% 0.03 75)" ] }, "slate-text-primary": { "role": "neutral-text", "displayName": "Slate Text Primary", "canonical": "oklch(25% 0.01 260)", "tonalRamp": [ "oklch(15% 0.01 260)", "oklch(20% 0.01 260)", "oklch(25% 0.01 260)", "oklch(35% 0.01 260)", "oklch(45% 0.01 260)", "oklch(60% 0.01 260)", "oklch(80% 0.005 85)", "oklch(94% 0.005 85)" ] }, "ash-page-bg": { "role": "neutral-bg", "displayName": "Ash Page Background", "canonical": "oklch(97% 0.005 85)", "tonalRamp": [ "oklch(99% 0.002 85)", "oklch(97% 0.005 85)", "oklch(95% 0.006 85)", "oklch(92% 0.007 85)", "oklch(88% 0.008 85)", "oklch(82% 0.008 85)", "oklch(72% 0.007 85)", "oklch(58% 0.006 85)" ] }, "white-card-bg": { "role": "neutral-surface", "displayName": "White Card Background", "canonical": "oklch(100% 0.002 85)", "tonalRamp": [ "oklch(100% 0 0)", "oklch(100% 0.002 85)", "oklch(98% 0.003 85)", "oklch(96% 0.004 85)", "oklch(93% 0.005 85)", "oklch(87% 0.006 85)", "oklch(76% 0.007 85)", "oklch(62% 0.006 85)" ] }, "ash-border": { "role": "neutral-border", "displayName": "Ash Border", "canonical": "oklch(90% 0.005 260)", "tonalRamp": [ "oklch(96% 0.003 260)", "oklch(93% 0.004 260)", "oklch(90% 0.005 260)", "oklch(85% 0.005 260)", "oklch(78% 0.005 260)", "oklch(68% 0.004 260)", "oklch(52% 0.003 260)", "oklch(32% 0.002 260)" ] } }, "typographyMeta": { "display": { "displayName": "Display", "purpose": "订单金额、统计大数。仅在关键数据上出现。" }, "headline": { "displayName": "Headline", "purpose": "页面标题、卡片标题、弹窗标题。" }, "title": { "displayName": "Title", "purpose": "主要正文、列表项名称、标签。最广泛的字号。" }, "body": { "displayName": "Body", "purpose": "正文信息、表单输入、描述文字。28rpx + 1.6 line-height。" }, "label": { "displayName": "Label", "purpose": "标签、徽章、meta 文字。22rpx + 0.02em letter-spacing。" } }, "shadows": [ { "name": "card-rest", "value": "0 2rpx 12rpx rgba(0,0,0,0.05)", "purpose": "所有卡片和可交互表面在静止态的标准阴影。" }, { "name": "card-subtle", "value": "0 2rpx 8rpx rgba(0,0,0,0.04)", "purpose": "轻量阴影,用于列表卡片之间的细微区分。" }, { "name": "bottom-bar", "value": "0 -2rpx 12rpx rgba(0,0,0,0.05)", "purpose": "固定底部栏的方向性阴影,指向上方。" }, { "name": "primary-glow", "value": "0 6rpx 20rpx rgba(255,193,7,0.4)", "purpose": "唯一彩色阴影。仅用于扫码FAB,暖金散射强调首要地位。" } ], "motion": [ { "name": "ease-press", "value": "opacity 0.15s ease", "purpose": "所有按钮和可点击元素的 active 态反馈。通过 opacity 变化而非 layout property 动画。" }, { "name": "ease-pulse", "value": "1.2s ease-in-out infinite", "purpose": "加载 pulse dots 的序列动画。不适用 ease-out-quart 因其为循环动画。" }, { "name": "ease-spin", "value": "1s linear infinite", "purpose": "加载 spinner 的旋转动画。" } ], "breakpoints": [ { "name": "mobile", "value": "375px-414px", "purpose": "微信小程序标准视口宽度。" } ] }, "components": [ { "name": "Primary Button", "kind": "button", "refersTo": "button-primary", "description": "页面级主操作:保存、退款、确认。暖金填充胶囊。", "html": "保存", "css": ".ds-btn-primary { background: #FFC107; border-radius: 48rpx; padding: 28rpx 0; display: flex; align-items: center; justify-content: center; transition: opacity 0.15s ease; cursor: pointer; } .ds-btn-primary:active { opacity: 0.8; } .ds-btn-primary-text { font-size: 32rpx; font-weight: 600; color: #1e293b; }" }, { "name": "Secondary Action Button", "kind": "button", "refersTo": "button-secondary", "description": "卡片内次级操作:查看详情、筛选、复制。填充底色无边框。", "html": "查看详情", "css": ".ds-btn-secondary { background: #f1f5f9; border-radius: 8rpx; padding: 8rpx 24rpx; display: inline-flex; align-items: center; justify-content: center; transition: opacity 0.15s ease; } .ds-btn-secondary:active { opacity: 0.7; } .ds-btn-secondary-text { font-size: 24rpx; color: #475569; font-weight: 500; }" }, { "name": "Surface Card", "kind": "card", "refersTo": "card-surface", "description": "信息容器。白色背景,微阴影,中等圆角。用于列表项和内容区。", "html": "标题内容文本行,展示关键信息。", "css": ".ds-card { background: #ffffff; border-radius: 16rpx; padding: 24rpx 32rpx; box-shadow: 0 2rpx 12rpx rgba(0,0,0,0.05); margin-bottom: 16rpx; } .ds-card:active { opacity: 0.7; } .ds-card-heading { display: block; font-size: 30rpx; font-weight: 600; color: #1e293b; margin-bottom: 8rpx; } .ds-card-body { display: block; font-size: 28rpx; color: #475569; line-height: 1.6; }" }, { "name": "Status Tag - Success", "kind": "chip", "refersTo": "status-tag-success", "description": "成功/正常/完成状态标签。绿底绿字。", "html": "已完成", "css": ".ds-tag { padding: 4rpx 16rpx; border-radius: 8rpx; font-size: 22rpx; font-weight: 500; display: inline-flex; align-items: center; justify-content: center; } .ds-tag-success { background: #ecfdf5; color: #10b981; }" }, { "name": "Status Tag - Warning", "kind": "chip", "refersTo": "status-tag-warning", "description": "待处理/未支付状态标签。琥珀底琥珀字。", "html": "待支付", "css": ".ds-tag { padding: 4rpx 16rpx; border-radius: 8rpx; font-size: 22rpx; font-weight: 500; display: inline-flex; align-items: center; justify-content: center; } .ds-tag-warning { background: #fffbeb; color: #f59e0b; }" }, { "name": "Status Tag - Error", "kind": "chip", "refersTo": "status-tag-error", "description": "失败/退款/故障状态标签。红底红字。", "html": "已退款", "css": ".ds-tag { padding: 4rpx 16rpx; border-radius: 8rpx; font-size: 22rpx; font-weight: 500; display: inline-flex; align-items: center; justify-content: center; } .ds-tag-error { background: #fef2f2; color: #ef4444; }" }, { "name": "Navigation Bar", "kind": "nav", "refersTo": null, "description": "固定顶部导航栏。居中标题,左侧返回箭头,支持安全区域。", "html": "页面标题", "css": ".ds-navbar { position: fixed; top: 0; left: 0; right: 0; z-index: 999; background: #ffffff; padding-top: env(safe-area-inset-top); } .ds-navback { width: 64rpx; height: 64rpx; display: flex; align-items: center; justify-content: center; border-radius: 50%; transition: background 0.15s; } .ds-navback:active { background: rgba(0,0,0,0.05); } .ds-navback-arrow { width: 20rpx; height: 20rpx; border-left: 4rpx solid #1e293b; border-bottom: 4rpx solid #1e293b; transform: rotate(45deg); margin-left: 8rpx; } .ds-navtitle { font-size: 34rpx; font-weight: 600; color: #1e293b; }" }, { "name": "Tab Bar", "kind": "nav", "refersTo": null, "description": "固定底部标签栏。4 个标准 Tab 围绕中央扫码 FAB。激活态变暖金。", "html": "工作台订单扫码设备我的", "css": ".ds-tabbar { position: fixed; bottom: 0; left: 0; right: 0; height: 120rpx; background: #ffffff; display: flex; align-items: center; justify-content: space-around; border-top: 1rpx solid #e2e8f0; padding-bottom: env(safe-area-inset-bottom); z-index: 999; box-shadow: 0 -2rpx 12rpx rgba(0,0,0,0.05); } .ds-tab { display: flex; flex-direction: column; align-items: center; justify-content: center; flex: 1; } .ds-tab-label { font-size: 20rpx; color: #1e293b; } .ds-tab-active .ds-tab-label { color: #FFC107; font-weight: 600; } .ds-tabbar-fab { position: relative; width: 120rpx; height: 120rpx; display: flex; flex-direction: column; align-items: center; justify-content: center; } .ds-fab-circle { width: 80rpx; height: 80rpx; background: linear-gradient(135deg, #FFC107, #FFA000); border-radius: 50%; box-shadow: 0 6rpx 20rpx rgba(255,193,7,0.4); transition: transform 0.2s; } .ds-fab-circle:active { transform: scale(0.92); } .ds-fab-label { font-size: 18rpx; color: #1e293b; font-weight: 500; }" }, { "name": "Text Input Field", "kind": "input", "refersTo": null, "description": "标准输入框。灰底,圆角,暖金 focus 边框。", "html": "", "css": ".ds-input { background: #f1f5f9; border: 1rpx solid #e2e8f0; border-radius: 12rpx; padding: 24rpx 28rpx; font-size: 28rpx; color: #1e293b; height: 80rpx; width: 100%; box-sizing: border-box; transition: border-color 0.15s; } .ds-input:focus { border-color: #FFC107; } .ds-input::placeholder { color: #cbd5e1; font-size: 24rpx; }" }, { "name": "Loading Pulse Dots", "kind": "custom", "refersTo": null, "description": "页面级加载指示器。三个序列脉冲圆点。", "html": "", "css": ".ds-loading { display: flex; justify-content: center; gap: 8rpx; padding: 60rpx 0; } .ds-pulse-dot { width: 9rpx; height: 9rpx; background: #cbd5e1; border-radius: 50%; animation: ds-pulse 1.2s ease-in-out infinite; } .ds-pulse-dot:nth-child(2) { animation-delay: 0.2s; } .ds-pulse-dot:nth-child(3) { animation-delay: 0.4s; } @keyframes ds-pulse { 0%, 80%, 100% { transform: scale(0.5); opacity: 0.4; } 40% { transform: scale(1); opacity: 1; } }" } ], "narrative": { "northStar": "The Warm Workshop", "overview": "haha-admin-mp 是 AI 智能零售柜系统的运营管理端。品牌语言与 haha-mp 消费者端一脉相承——琥珀暖金作为身份色,大面积留白托底,轻阴影赋予卡片可触感。设计不追求传统后台的功能堆砌,而是在移动端上呈现清晰、温暖、高效的信息结构。暖金不是装饰色,是信号色。它在关键操作(主按钮、激活态、扫码入口)上集中出现,其余区域用冷灰中性色后退,让操作者凭色彩就能感知界面优先级。", "keyCharacteristics": [ "暖金信号:琥珀色承载关键操作和选中态,其余区域用冷灰后退", "轻提感:卡片统一使用 2rpx 模糊 12rpx 偏移的微阴影,暗示可点击性", "移动优先文字:最小字号不低於 22rpx,触控区域不小于 44x44pt", "8rpx 基准间距:所有间距为该基准的整数倍,拒绝随意值", "与 haha-mp 共享色彩基因" ], "rules": [ { "name": "The Golden Signal Rule", "body": "暖金仅在交互关键点出现:主按钮、选中态、激活 Tab。其稀缺性制造信号效应。切勿将暖金用于大面积装饰或非交互内容。", "section": "colors" }, { "name": "The Tinted Neutral Rule", "body": "所有中性色向暖金方向偏移 0.005-0.01 chroma。纯黑 #000000 和纯白 #ffffff 被禁用。视频背景使用 --bg-secondary 而非 #000。", "section": "colors" }, { "name": "The Financial Data Rule", "body": "金额、统计数字永远使用 slate-text-primary,不使用红色或绿色。颜色仅携带语义状态(成功/失败),不携带价值判断。", "section": "colors" }, { "name": "The 28rpx Anchor Rule", "body": "正文基线和主要控件字号均锚定在 28rpx。向上取 30/32/36rpx 做标题,向下取 22/24rpx 做辅助。绝不使用 26rpx——它作为无意义的中间值被禁用。", "section": "typography" }, { "name": "The One Font Rule", "body": "整个系统使用单一字体栈。层次差异通过字号和 weight 表达,不通过字体切换表达。", "section": "typography" }, { "name": "The Shadows-As-State Rule", "body": "阴影在静止态统一微弱,在交互态通过 opacity 而非 elevation 变化反馈。不做悬浮升起动画。FAB 的暖金 glow shadow 是唯一的例外。", "section": "elevation" } ], "dos": [ "使用 8rpx 基准间距。所有 padding/margin/gap 必须是 8 的整数倍。", "使用 $spacing-N / $radius-* / $font-size-* SCSS token,不硬编码数值。", "为每个异步数据加载提供 loading 状态(pulse dots 或 spinner)。", "将暖金仅用于交互关键点。其力量来自克制。", "所有可点击卡片的 active 态使用 opacity: 0.7。", "页面使用 height: 100vh + flex column 布局,scroll-view 用 flex: 1; height: 0 填充剩余空间。", "固定底部元素使用 env(safe-area-inset-bottom) 留出安全区域。", "状态指示同时使用颜色 + 文字,不单纯依赖颜色(WCAG AA 兼容)。", "字体栈在所有页面 style 中统一声明为一行的 $font-stack 变量。" ], "donts": [ "使用 #000000 或 #ffffff。中性色向暖金方向偏移 0.005-0.01 chroma。", "对财务数字使用红色或绿色。金额统计永远用 #1e293b。", "使用 border-left 或 border-right 大于 1px 做彩色侧边条纹装饰。", "使用渐变文字 (background-clip: text)。", "使用 26rpx 字号。字号体系中没有这个中间值。", "在页面中使用原生