Files
jiu/design/prototype/index.html
T
wangjia 05203a9b5b
Design Source Checks / design-source (push) Failing after 14m23s
refactor: 原型迁移 .superpowers/prototype → design/prototype(与 CONTRACT 同目录)
- git mv 全目录(历史保留);.gitignore 收敛为整个 .superpowers/ 忽略
- 全仓 16 处引用同步(CI checks.yml / l1-sync / screens.mjs / hooks /
  CLAUDE.md / CONTRACT / SSR 模板注释 / docs / web 注释)
- 修 pre-commit 路径正则残留;5180 评审服务已切新路径
- 验证:check-ds 12 道 / l1-sync 6 道 / fidelity 抽查全过

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJ1g8XV1YhhmHRzhwWEW7o
2026-07-07 18:47:31 +08:00

557 lines
76 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN" data-theme="a">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>岩美酒库 · 设计系统</title>
<link rel="stylesheet" href="tokens.css">
<link rel="stylesheet" href="atoms.css">
<link rel="stylesheet" href="mobile-atoms.css">
<style>
body{margin:0; background:var(--bg); color:var(--text); font-family:var(--font); transition:background-color .28s; overflow-x:hidden;}
/* 顶部条 */
.ds-top{position:sticky; top:0; z-index:50; height:58px; background:var(--surface); border-bottom:1px solid var(--border); display:flex; align-items:center; gap:14px; padding:0 22px;}
.ds-brand{display:flex; align-items:center; gap:10px; font-weight:700; color:var(--heading); font-size:15px;}
.ds-brand .mk{width:28px; height:28px; border-radius:8px; background:linear-gradient(135deg,var(--primary),var(--primary-dark)); color:var(--on-primary); display:flex; align-items:center; justify-content:center; font-weight:800;}
.ds-tag{font-size:var(--fs-sm); color:var(--muted); padding-left:6px; border-left:1px solid var(--border);}
.theme-seg{margin-left:auto; display:flex; gap:4px; background:var(--bg); border:1px solid var(--border); border-radius:var(--r-pill); padding:3px;}
.theme-seg button{border:none; background:transparent; height:28px; padding:0 14px; border-radius:var(--r-pill); font-size:var(--fs-sm); color:var(--muted); cursor:pointer; font-family:var(--font); display:flex; align-items:center; gap:6px;}
.theme-seg button .d{width:10px; height:10px; border-radius:50%;}
.theme-seg button.on{background:var(--primary); color:var(--on-primary);}
.doc{display:flex; align-items:flex-start; max-width:1340px; margin:0 auto;}
.doc-nav{width:236px; flex:none; position:sticky; top:58px; height:calc(100vh - 58px); overflow:auto; border-right:1px solid var(--border); padding:18px 14px;}
.dgroup{font-size:var(--fs-xs); font-weight:700; color:var(--faint); letter-spacing:.6px; padding:14px 10px 6px;}
.dnav{display:block; padding:7px 10px; border-radius:var(--r-md); font-size:var(--fs-body); color:var(--muted); text-decoration:none; cursor:pointer;}
.dnav:hover{background:var(--bg); color:var(--text);}
.dnav.on{background:var(--brand50); color:var(--primary); font-weight:600;}
.doc-main{flex:1; min-width:0; padding:30px 40px 80px; max-width:1080px;}
.section{margin-bottom:46px; scroll-margin-top:74px;}
.section > h2{margin:0 0 4px; font-size:var(--fs-h1); color:var(--title);}
.section > .desc{margin:0 0 18px; font-size:var(--fs-body); color:var(--muted);}
.pcard{background:var(--surface); border:1px solid var(--border); border-radius:var(--r-lg); margin-bottom:16px; overflow:hidden;}
.pcard-h{display:flex; align-items:baseline; gap:10px; padding:13px 16px; border-bottom:1px solid var(--border-subtle);}
.pcard-h h3{margin:0; font-size:var(--fs-title); color:var(--heading);}
.pcard-h .tk{font-size:var(--fs-xs); color:var(--faint); font-family:var(--font-mono);}
.pcard-b{padding:18px 16px; display:flex; flex-wrap:wrap; gap:14px; align-items:center;}
/* 色板 */
.sw-grid{display:grid; grid-template-columns:repeat(auto-fill,minmax(150px,1fr)); gap:12px; width:100%;}
.sw{border:1px solid var(--border); border-radius:var(--r-md); overflow:hidden; background:var(--surface);}
.sw .band{display:block; width:100%; height:58px; box-shadow:inset 0 0 0 1px rgba(0,0,0,.07);}
.sw .m{padding:8px 10px;}
.sw .m .n{font-size:var(--fs-sm); color:var(--text); font-weight:600;}
.sw .m .v{font-size:var(--fs-xs); color:var(--faint); font-family:var(--font-mono);}
/* 字体梯度 */
.type-row{display:flex; align-items:baseline; gap:16px; padding:10px 0; border-bottom:1px solid var(--border-subtle); width:100%;}
.type-row .tk{width:160px; font-size:var(--fs-xs); color:var(--faint); font-family:var(--font-mono); flex:none;}
/* 间距/圆角 */
.scale{display:flex; flex-wrap:wrap; gap:18px; align-items:flex-end; width:100%;}
.scale .box{display:flex; flex-direction:column; align-items:center; gap:6px; font-size:var(--fs-xs); color:var(--muted);}
.scale .sq{background:var(--primary);}
.scale .rq{background:var(--brand50); border:1px solid var(--primary);}
.scale .sh{width:64px; height:48px; background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md);}
/* UI Kit 卡 */
.kit-grid{display:grid; grid-template-columns:repeat(auto-fill,minmax(240px,1fr)); gap:16px; width:100%;}
.kit{border:1px solid var(--border); border-radius:var(--r-lg); overflow:hidden; background:var(--surface); cursor:pointer; transition:border-color .15s, box-shadow .15s; text-decoration:none; color:inherit; display:block;}
.kit:hover{border-color:var(--brand400); box-shadow:var(--sh-2);}
.kit .thumb{height:130px; background:linear-gradient(135deg,var(--side-bg),var(--top-bg)); display:flex; align-items:center; justify-content:center; color:var(--on-primary);}
.kit .thumb svg{width:34px; height:34px; stroke-width:1.4; opacity:.92;}
.kit .kt{padding:12px 14px;}
.kit .kt b{display:block; font-size:var(--fs-body); color:var(--heading);}
.kit .kt span{font-size:var(--fs-xs); color:var(--muted);}
.kit.todo{opacity:.62;}
.kit.todo .thumb{background:var(--bg); color:var(--faint);}
.logo-lockup{display:flex; gap:16px; flex-wrap:wrap; width:100%;}
.lock{flex:1; min-width:220px; border-radius:var(--r-lg); padding:24px; display:flex; align-items:center; gap:12px; font-weight:800; font-size:20px;}
.lock .mk{width:40px; height:40px; border-radius:11px; display:flex; align-items:center; justify-content:center; font-weight:900;}
.lock.light{background:#F5F7FA; color:#1B2430;} .lock.light .mk{background:linear-gradient(135deg,#2563AC,#154072); color:#fff;}
.lock.dark{background:#15151C; color:#F6F6F9;} .lock.dark .mk{background:linear-gradient(135deg,#F5A300,#D98C00); color:#1A1408;}
.appicon{width:96px; height:96px; border-radius:22px; background:linear-gradient(135deg,var(--primary),var(--primary-dark)); color:var(--on-primary); display:flex; align-items:center; justify-content:center; font-size:44px; font-weight:900; box-shadow:var(--sh-2);}
/* 图标库网格 */
.icon-grid{display:grid; grid-template-columns:repeat(auto-fill,minmax(112px,1fr)); gap:10px; width:100%;}
.icell{display:flex; flex-direction:column; align-items:center; gap:7px; padding:14px 6px; border:1px solid var(--border); border-radius:var(--r-md); background:var(--surface);}
.icell svg{width:22px; height:22px; stroke:currentColor; fill:none; stroke-width:1.8; color:var(--heading);}
.icell span{font-size:var(--fs-xs); color:var(--muted); font-family:var(--font-mono); text-align:center; word-break:break-all;}
/* 屏幕分组标签 + 移动端预览(registry 用:把 .m-* 固定定位收进手机框内) */
.kit-sub{display:flex; align-items:center; gap:8px; font-size:var(--fs-sm); font-weight:700; color:var(--muted); margin:4px 2px 12px; letter-spacing:.4px;}
.kit-sub:not(:first-child){margin-top:26px;}
.kit-sub .ks-dot{width:7px; height:7px; border-radius:50%; background:var(--brand400);}
.mdemo{display:flex; gap:26px; flex-wrap:wrap; align-items:flex-start; width:100%;}
.mphone{position:relative; width:328px; height:600px; flex:none; border:1px solid var(--border); border-radius:26px; overflow:hidden; background:var(--page); box-shadow:var(--sh-2);}
.mphone .m-top, .mphone .m-tabbar{position:absolute; left:0; right:0; transform:none; max-width:none;}
.mphone .m-fab{position:absolute; left:auto; right:16px; transform:none;}
.mphone .m-page{height:100%; overflow:auto;}
.mcol{flex:1; min-width:248px; display:flex; flex-direction:column; gap:18px;}
.mcol .mlab{font-size:var(--fs-xs); color:var(--faint); font-family:var(--font-mono); margin-bottom:-8px;}
.msheet-demo{position:relative; border:1px solid var(--border); border-radius:var(--r-lg); overflow:hidden; background:var(--surface);}
</style>
</head>
<body>
<div class="ds-top">
<div class="ds-brand"><span class="mk"></span>岩美酒库</div>
<span class="ds-tag">设计系统 · Phase 0</span>
<div class="theme-seg" id="seg">
<button data-t="a"><span class="d" style="background:#2563AC"></span>A 经典蓝</button>
<button data-t="b"><span class="d" style="background:#F5A300"></span>B 琥珀</button>
<button data-t="c"><span class="d" style="background:#7C1F2C"></span>C 酒窖</button>
</div>
</div>
<div class="doc">
<nav class="doc-nav" id="docNav">
<div class="dgroup">UI Kit · 屏幕</div>
<a class="dnav" data-s="kit">桌面屏 · Desktop</a>
<a class="dnav" data-s="kit-m">移动屏 · Mobile</a>
<div class="dgroup">概览</div>
<a class="dnav" data-s="overview">Readme · 三层方法</a>
<div class="dgroup">品牌 Brand</div>
<a class="dnav" data-s="brand">Logo 锁版 / App 图标</a>
<div class="dgroup">色彩 Colors</div>
<a class="dnav" data-s="c-brand">品牌主色</a>
<a class="dnav" data-s="c-status">语义状态色</a>
<a class="dnav" data-s="c-neutral">中性 / 文本 / 描边</a>
<a class="dnav" data-s="c-chrome">导航 Chrome</a>
<div class="dgroup">字体 Type</div>
<a class="dnav" data-s="type">字体族 / 字号梯度</a>
<div class="dgroup">间距 Spacing</div>
<a class="dnav" data-s="spacing">圆角 / 间距 / 阴影</a>
<div class="dgroup">组件 Components</div>
<a class="dnav" data-s="comp">公用组件 · 桌面/移动共用</a>
<a class="dnav" data-s="m-comp">移动专属组件 .m-*</a>
<div class="dgroup">图标 Icons</div>
<a class="dnav" data-s="icons">图标库 · 全部</a>
</nav>
<main class="doc-main">
<section class="section" id="kit">
<h2>UI Kit · 桌面屏</h2><p class="desc">由原子组合而成的完整屏,点击进入可交互页面(随主题换色)。<b>桌面与移动共用同一套 tokens + 公用原子</b>,仅外壳/布局不同。</p>
<div class="kit-grid">
<a class="kit" href="screens/inventory.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-box-2"/></svg></div><div class="kt"><b>库存管理</b><span>桌面 · 筛选/弹窗/抽屉/分页</span></div></a>
<a class="kit" href="screens/stock-in-list.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-download"/></svg></div><div class="kt"><b>入库单列表</b><span>KPI / 状态筛选 / 单据抽屉</span></div></a>
<a class="kit" href="screens/stock-out-list.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-upload"/></svg></div><div class="kt"><b>出库单列表</b><span>客户 / 状态 / 明细抽屉</span></div></a>
<a class="kit" href="screens/partners.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic56"/></svg></div><div class="kt"><b>往来单位</b><span>供应商/客户 · 应收应付</span></div></a>
<a class="kit" href="screens/products.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic57"/></svg></div><div class="kt"><b>商品基础数据</b><span>名/系列/规格 · 香型筛选</span></div></a>
<a class="kit" href="screens/finance.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic17"/></svg></div><div class="kt"><b>财务管理</b><span>概览 · 趋势 / 应收应付 / 流水</span></div></a>
<a class="kit" href="screens/settings.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic58"/></svg></div><div class="kt"><b>系统设置</b><span>门店/用户/授权兑换券/偏好</span></div></a>
<a class="kit" href="screens/login.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic59"/></svg></div><div class="kt"><b>登录</b><span>双栏品牌 + 表单 · 三主题</span></div></a>
<a class="kit" href="screens/stock-in.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic60"/></svg></div><div class="kt"><b>新增入库单</b><span>录单 · 三级商品搜索/实时合计</span></div></a>
<a class="kit" href="screens/stock-out.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic60"/></svg></div><div class="kt"><b>新增出库单</b><span>录单 · 出库前库存校验</span></div></a>
<a class="kit" href="screens/inventory-check.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic61"/></svg></div><div class="kt"><b>库存盘点</b><span>实盘录入 · 差异盈亏</span></div></a>
<a class="kit" href="screens/product-detail.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic62"/></svg></div><div class="kt"><b>商品详情</b><span>库存分布 · 流水 · 价格历史</span></div></a>
<a class="kit" href="screens/devices.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic63"/></svg></div><div class="kt"><b>设备管理</b><span>打印机/扫码枪 · 连接状态</span></div></a>
<a class="kit" href="screens/notifications.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-bell"/></svg></div><div class="kt"><b>通知中心</b><span>列表 · 类型筛选 / 未读</span></div></a>
<a class="kit" href="screens/notification.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-bell"/></svg></div><div class="kt"><b>通知详情</b><span>正文 · 关联单据 / 操作</span></div></a>
<a class="kit" href="screens/about.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic24"/></svg></div><div class="kt"><b>关于我们</b><span>版本 · 更新日志 · 授权</span></div></a>
<a class="kit" href="screens/public-product.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic64"/></svg></div><div class="kt"><b>公开商品页 · 对外</b><span>扫码防伪验证(移动)</span></div></a>
<a class="kit" href="screens/public-shop.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic65"/></svg></div><div class="kt"><b>门店公开页 · 对外</b><span>门店商品目录(移动)</span></div></a>
<a class="kit" href="screens/register.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic66"/></svg></div><div class="kt"><b>注册新门店</b><span>开通向导 · 门店/管理员/授权</span></div></a>
<a class="kit" href="screens/users.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic45"/></svg></div><div class="kt"><b>用户管理</b><span>成员/角色 · 新增编辑弹窗</span></div></a>
<a class="kit" href="screens/pricing.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic07"/></svg></div><div class="kt"><b>购买授权</b><span>时长套餐 · 版本档位</span></div></a>
<a class="kit" href="screens/checkout.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic67"/></svg></div><div class="kt"><b>确认订单</b><span>下单 · 开票 · 无支付占位</span></div></a>
<a class="kit" href="screens/pay.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic08"/></svg></div><div class="kt"><b>收银台</b><span>订单信息 · 支付宝扫码 · 三态</span></div></a>
</div>
</section>
<section class="section" id="kit-m">
<h2>UI Kit · 移动屏</h2><p class="desc">移动端外壳:底部 tab 栏 / 顶栏 / 底部 sheet。<b>窄窗或设备模式(⌘⌥M · 390px)查看最佳</b>;宽屏会自动居中成手机列。</p>
<div class="kit-grid">
<a class="kit" href="screens/m-inventory.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-box-2"/></svg></div><div class="kt"><b>库存 · 移动</b><span>KPI / 卡片流 / 筛选 sheet</span></div></a>
<a class="kit" href="screens/m-stock-in-list.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-download"/></svg></div><div class="kt"><b>入库列表 · 移动</b><span>单据卡 / 状态 pill</span></div></a>
<a class="kit" href="screens/m-stock-in.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic60"/></svg></div><div class="kt"><b>入库录单 · 移动</b><span>全屏表单 / 底部操作条</span></div></a>
<a class="kit" href="screens/m-stock-out-list.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-upload"/></svg></div><div class="kt"><b>出库列表 · 移动</b><span>客户 / 状态 pill</span></div></a>
<a class="kit" href="screens/m-stock-out.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic60"/></svg></div><div class="kt"><b>出库录单 · 移动</b><span>库存校验 / 底部操作条</span></div></a>
<a class="kit" href="screens/m-finance.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic08"/></svg></div><div class="kt"><b>财务 · 移动</b><span>KPI / 应收应付 / 流水</span></div></a>
<a class="kit" href="screens/m-me.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic37"/></svg></div><div class="kt"><b>我的 · 移动</b><span>hub 入口 / 账号</span></div></a>
<a class="kit" href="screens/m-partners.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic56"/></svg></div><div class="kt"><b>往来单位 · 移动</b><span>供应商/客户 · 应收应付</span></div></a>
<a class="kit" href="screens/m-products.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic57"/></svg></div><div class="kt"><b>基础数据 · 移动</b><span>商品档案 / 商品介绍 tab</span></div></a>
<a class="kit" href="screens/m-inventory-check.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic61"/></svg></div><div class="kt"><b>库存盘点 · 移动</b><span>盘点单 / 盈亏差异</span></div></a>
<a class="kit" href="screens/m-devices.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic63"/></svg></div><div class="kt"><b>设备管理 · 移动</b><span>打印机/扫码枪 · 在线状态</span></div></a>
<a class="kit" href="screens/m-settings.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-gear"/></svg></div><div class="kt"><b>系统设置 · 移动</b><span>门店/偏好/数据 分组</span></div></a>
<a class="kit" href="screens/m-users.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic45"/></svg></div><div class="kt"><b>用户管理 · 移动</b><span>成员 / 角色</span></div></a>
<a class="kit" href="screens/m-notifications.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-bell"/></svg></div><div class="kt"><b>通知中心 · 移动</b><span>列表 / 类型 pill / 未读</span></div></a>
<a class="kit" href="screens/m-notification.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-bell"/></svg></div><div class="kt"><b>通知详情 · 移动</b><span>正文 / 关联单据 / 操作</span></div></a>
<a class="kit" href="screens/m-about.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic24"/></svg></div><div class="kt"><b>关于 · 移动</b><span>版本 / 更新日志 / 授权</span></div></a>
<a class="kit" href="screens/m-login.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic59"/></svg></div><div class="kt"><b>登录 · 移动</b><span>品牌 + 表单</span></div></a>
<a class="kit" href="screens/m-register.html"><div class="thumb"><svg viewBox="0 0 24 24"><use href="#i-ic66"/></svg></div><div class="kt"><b>注册新门店 · 移动</b><span>开通向导</span></div></a>
</div>
</section>
<section class="section" id="overview">
<h2>岩美酒库 · 设计系统</h2>
<p class="desc">三层方法:① <b>令牌层</b>(tokens.css,单源,按主题换色)→ ② <b>组件层</b>(atoms.css,所有屏复用)→ ③ <b>页面层</b>(screens/,只引用前两层)。先定底层原子,再组屏。右上角切 A/B/C 三主题,全站实时换色——这就是「改一处、全局生效」。</p>
<div class="pcard" style="border-color:var(--danger)">
<div class="pcard-h"><h3 style="color:var(--danger)">⛔ 设计系统铁律(单一真源)</h3><span class="tk">single source of truth</span></div>
<div class="pcard-b" style="display:block; color:var(--text); font-size:var(--fs-body); line-height:1.95;">
<div><b>1. 唯一来源。</b>所有页面用到的元素、组件、CSS 样式、颜色,<b>必须出自本设计系统</b>——颜色/间距/圆角/字号取自 <code>tokens.css</code> 的 CSS 变量,组件类取自 <code>atoms.css</code>,且都能在本页查到实样。</div>
<div><b>2. 先登记、后使用。</b>需要新元素/组件/样式/颜色时,<b>先加到本设计系统</b>(变量进 <code>tokens.css</code>、组件类进 <code>atoms.css</code>)并在本页登记展示,<b>之后</b>才能在 <code>screens/</code> 里引用。</div>
<div><b>3. 禁止系统外内容。</b>页面里<b>不允许</b>出现本系统不存在的类、硬编码颜色(<code>#hex</code>/<code>rgb()</code>,品牌 logo SVG 除外)、或一次性写死的内联尺寸/配色。<code>screens/*</code> 只 import <code>tokens.css</code> + <code>atoms.css</code>,只用已登记的变量与类。</div>
<div style="color:var(--muted)">违反任意一条即视为未完成——颜色不走 token、用了本页没有的组件、页面自带样式,都要先回到这里补登记。</div>
</div>
</div>
<div class="pcard"><div class="pcard-h"><h3>结构</h3><span class="tk">tokens.css · atoms.css · screens/*</span></div>
<div class="pcard-b" style="display:block; color:var(--muted); font-size:var(--fs-body); line-height:1.9;">
<div><code>tokens.css</code> — 三主题色阶 + 间距/圆角/阴影/字号(令牌层)</div>
<div><code>atoms.css</code> — 按钮·输入·Chip·徽章·KPI·表格·弹窗·抽屉·菜单(组件层)</div>
<div><code>screens/inventory.html</code> — 库存屏(页面层,import 上面两层)</div>
</div>
</div>
</section>
<section class="section" id="brand">
<h2>品牌 Brand</h2><p class="desc">三级品牌架构:<b>公司 岩美科技</b><b>产品 岩美酒库</b><b>门店租户</b>。下方为基于现有 logo 精修的标识系统。品牌色固定,不随界面 A/B/C 主题变化(仅提供反白变体)。</p>
<style>
.bmark{display:block;} .bmark svg{display:block;}
.arch{display:grid; grid-template-columns:repeat(auto-fit,minmax(190px,1fr)); gap:12px; width:100%; min-width:0;}
.arch .lvl{border:1px solid var(--border); border-radius:var(--r-md); padding:14px; background:var(--surface);}
.arch .lvl .k{font-size:var(--fs-xs); color:var(--faint); font-weight:700; letter-spacing:.5px;}
.arch .lvl .n{font-size:var(--fs-title); color:var(--heading); font-weight:700; margin:4px 0 2px;}
.arch .lvl .u{font-size:var(--fs-sm); color:var(--muted);}
.lock2{display:flex; align-items:center; gap:14px;}
.lock2 .wm{display:flex; flex-direction:column; line-height:1;}
.lock2 .wm .big{font-size:30px; font-weight:800; color:#0F3057; letter-spacing:3px;}
.lock2 .wm .big sup{font-size:12px; font-weight:600; letter-spacing:0;}
.lock2 .wm .sub{font-size:11px; font-weight:500; color:#6E7888; letter-spacing:2px; margin-top:5px;}
.lock2.prod .wm .big{font-size:26px; letter-spacing:2px;}
.panel-dark{background:#0F3057; border-radius:var(--r-md);}
.panel-dark .big{color:#fff!important;} .panel-dark .sub{color:#ADC9EA!important;}
.mono-row{display:flex; gap:18px; flex-wrap:wrap; align-items:center;}
.vchip{display:flex; flex-direction:column; align-items:center; gap:8px; font-size:var(--fs-xs); color:var(--muted);}
.vtile{border-radius:14px; overflow:hidden;}
.tenant{display:flex; gap:22px; flex-wrap:wrap;}
.tenant .row{display:flex; align-items:center; gap:11px;}
.tmono{width:40px; height:40px; border-radius:10px; display:flex; align-items:center; justify-content:center; color:#fff; font-weight:800; font-size:19px;}
.tenant .row b{color:var(--heading); font-size:var(--fs-body);} .tenant .row span{color:var(--muted); font-size:var(--fs-xs); display:block;}
.clear{position:relative; display:inline-block; padding:22px; background:repeating-linear-gradient(45deg,var(--bg),var(--bg) 6px,transparent 6px,transparent 12px); border:1px dashed var(--border); border-radius:var(--r-md);}
.ico-sizes{display:flex; gap:18px; align-items:flex-end;}
.ico{border-radius:22%; overflow:hidden; box-shadow:var(--sh-2);}
</style>
<div class="pcard"><div class="pcard-h"><h3>品牌架构</h3><span class="tk">公司 / 产品 / 门店 三级</span></div>
<div class="pcard-b"><div class="arch">
<div class="lvl"><div class="k">公司 COMPANY</div><div class="n">岩美科技</div><div class="u">软件厂商 · 官网/宣传/about · 企业 logo + 商标</div></div>
<div class="lvl"><div class="k">产品 PRODUCT</div><div class="n">岩美酒库</div><div class="u">SaaS 软件 · 窗口标题/登录/App 图标</div></div>
<div class="lvl"><div class="k">门店 TENANT</div><div class="n">鼎晟酒行 …</div><div class="u">购买软件的 toB 商店 · App 内左上角,每户自有名+标记</div></div>
</div></div></div>
<div class="pcard"><div class="pcard-h"><h3>企业 Logo · 现状(精修参考)</h3><span class="tk">现有标记 · 含商标 ™</span></div>
<div class="pcard-b" style="gap:30px">
<div class="lock2"><span class="bmark"><svg width="52" height="52" viewBox="0 0 64 64"><rect width="64" height="64" rx="15" fill="#0F3057"/><g stroke="#fff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"><path d="M14 33L23 16L32 25L41 16L50 33"/><path d="M15 41L49 41"/></g><circle cx="32" cy="48" r="3" fill="#8B2331"/></svg></span>
<div class="wm"><div class="big">岩美<sup></sup></div><div class="sub">岩美科技 · YANMEI TECH</div></div></div>
<div class="lock2 panel-dark" style="padding:18px 26px"><span class="bmark"><svg width="52" height="52" viewBox="0 0 64 64"><rect width="64" height="64" rx="15" fill="#fff"/><g stroke="#0F3057" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"><path d="M14 33L23 16L32 25L41 16L50 33"/><path d="M15 41L49 41"/></g><circle cx="32" cy="48" r="3" fill="#8B2331"/></svg></span>
<div class="wm"><div class="big">岩美<sup></sup></div><div class="sub">岩美科技 · YANMEI TECH</div></div></div>
</div></div>
<div class="pcard"><div class="pcard-h"><h3>产品 Logo · 岩美酒库</h3><span class="tk">现有锁版精修</span></div>
<div class="pcard-b" style="gap:30px">
<div class="lock2 prod"><span class="bmark"><svg width="50" height="50" viewBox="0 0 64 64"><rect width="64" height="64" rx="15" fill="#0F3057"/><g stroke="#fff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"><path d="M14 33L23 16L32 25L41 16L50 33"/><path d="M15 41L49 41"/></g><circle cx="32" cy="48" r="3" fill="#8B2331"/></svg></span>
<div class="wm"><div class="big">岩美酒库</div><div class="sub">酒水进销存管理系统</div></div></div>
</div></div>
<div class="pcard"><div class="pcard-h"><h3>门店标识 · 自动字号</h3><span class="tk">取门店名首字 · App 内左上角</span></div>
<div class="pcard-b"><div class="tenant">
<div class="row"><div class="tmono" style="background:linear-gradient(135deg,#1B4F8E,#0F3057)"></div><div><b>鼎晟酒行</b><span>DINGSHENG</span></div></div>
<div class="row"><div class="tmono" style="background:linear-gradient(135deg,#7C1F2C,#4A1420)"></div><div><b>茅韵名酒</b><span>MAOYUN</span></div></div>
<div class="row"><div class="tmono" style="background:linear-gradient(135deg,#D98C00,#9A6200)"></div><div><b>老李酒水批发</b><span>LAOLI</span></div></div>
</div></div></div>
<div class="pcard"><div class="pcard-h"><h3>标记变体 / App 图标</h3><span class="tk">主体 / 反白 / 单色 · 圆角图标</span></div>
<div class="pcard-b" style="gap:28px">
<div class="mono-row">
<div class="vchip"><span class="vtile"><svg width="60" height="60" viewBox="0 0 64 64"><rect width="64" height="64" rx="15" fill="#0F3057"/><g stroke="#fff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"><path d="M14 33L23 16L32 25L41 16L50 33"/><path d="M15 41L49 41"/></g><circle cx="32" cy="48" r="3" fill="#8B2331"/></svg></span>主体</div>
<div class="vchip"><span class="vtile"><svg width="60" height="60" viewBox="0 0 64 64"><rect width="64" height="64" rx="15" fill="#fff" stroke="#DCE2EB"/><g stroke="#0F3057" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"><path d="M14 33L23 16L32 25L41 16L50 33"/><path d="M15 41L49 41"/></g><circle cx="32" cy="48" r="3" fill="#8B2331"/></svg></span>反白</div>
<div class="vchip"><span class="vtile"><svg width="60" height="60" viewBox="0 0 64 64"><rect width="64" height="64" rx="15" fill="none"/><g stroke="#232934" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"><path d="M14 33L23 16L32 25L41 16L50 33"/><path d="M15 41L49 41"/></g><circle cx="32" cy="48" r="3" fill="#232934"/></svg></span>单色</div>
</div>
<div class="ico-sizes">
<div class="vchip"><span class="ico"><svg width="84" height="84" viewBox="0 0 64 64"><rect width="64" height="64" rx="15" fill="#0F3057"/><g stroke="#fff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"><path d="M14 33L23 16L32 25L41 16L50 33"/><path d="M15 41L49 41"/></g><circle cx="32" cy="48" r="3" fill="#8B2331"/></svg></span>App 图标 · 1024</div>
<div class="vchip"><span class="ico"><svg width="48" height="48" viewBox="0 0 64 64"><rect width="64" height="64" rx="15" fill="#0F3057"/><g stroke="#fff" stroke-width="4.5" stroke-linecap="round" stroke-linejoin="round" fill="none"><path d="M14 33L23 16L32 25L41 16L50 33"/><path d="M15 41L49 41"/></g></svg></span>64 · 省略酒滴</div>
<div class="vchip"><span class="ico"><svg width="30" height="30" viewBox="0 0 64 64"><rect width="64" height="64" rx="15" fill="#0F3057"/><g stroke="#fff" stroke-width="5.5" stroke-linecap="round" stroke-linejoin="round" fill="none"><path d="M16 32L23 18L32 26L41 18L48 32"/></g></svg></span>28 · 仅山形</div>
</div>
</div></div>
<div class="pcard"><div class="pcard-h"><h3>安全区 / 最小尺寸</h3><span class="tk">留白 = 标记高度的 1/3 · 最小 20px</span></div>
<div class="pcard-b"><span class="clear"><svg width="56" height="56" viewBox="0 0 64 64" style="display:block"><rect width="64" height="64" rx="15" fill="#0F3057"/><g stroke="#fff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"><path d="M14 33L23 16L32 25L41 16L50 33"/><path d="M15 41L49 41"/></g><circle cx="32" cy="48" r="3" fill="#8B2331"/></svg></span></div></div>
</section>
<section class="section" id="c-brand"><h2>品牌主色</h2><p class="desc">主操作色与品牌色阶,随主题切换。</p><div class="pcard"><div class="pcard-b"><div class="sw-grid" data-swatches="--primary,--primary-dark,--brand400,--brand50,--on-primary,--accent"></div></div></div></section>
<section class="section" id="c-status"><h2>语义状态色</h2><p class="desc">在售 / 预警 / 缺货 等状态。前景色与浅底成对。</p><div class="pcard"><div class="pcard-b"><div class="sw-grid" data-swatches="--success,--success-bg,--warn,--warn-bg,--danger,--danger-bg"></div></div></div></section>
<section class="section" id="c-neutral"><h2>中性 / 文本 / 描边</h2><p class="desc">背景层级、文本层级与分隔线。</p><div class="pcard"><div class="pcard-b"><div class="sw-grid" data-swatches="--page,--bg,--surface,--border,--border-subtle,--heading,--text,--muted,--faint"></div></div></div></section>
<section class="section" id="c-chrome"><h2>导航 Chrome</h2><p class="desc">顶栏与侧栏专属角色(与内容 surface 分离,故每主题可独立染色)。</p><div class="pcard"><div class="pcard-b"><div class="sw-grid" data-swatches="--top-bg,--top-fg,--side-bg,--side-fg,--side-active-bg,--side-active-fg"></div></div></div></section>
<section class="section" id="type">
<h2>字体 Type</h2><p class="desc">正文/中文系统字体;数据用等宽(库存数、金额)。下面是字号梯度。</p>
<div class="pcard"><div class="pcard-h"><h3>字号梯度</h3><span class="tk">--fs-display … --fs-xs</span></div>
<div class="pcard-b" style="display:block">
<div class="type-row"><span class="tk">--fs-display 28</span><span style="font-size:28px; font-weight:700; color:var(--heading)">岩美酒库 Display</span></div>
<div class="type-row"><span class="tk">--fs-h1 21</span><span style="font-size:21px; font-weight:700; color:var(--title)">页面标题 库存管理</span></div>
<div class="type-row"><span class="tk">--fs-h2 17</span><span style="font-size:17px; font-weight:600; color:var(--heading)">区块标题</span></div>
<div class="type-row"><span class="tk">--fs-title 15</span><span style="font-size:15px; font-weight:600; color:var(--heading)">卡片标题</span></div>
<div class="type-row"><span class="tk">--fs-body 13</span><span style="font-size:13px; color:var(--text)">正文与表格内容 · 茅台飞天 53°</span></div>
<div class="type-row"><span class="tk">--fs-sm 12</span><span style="font-size:12px; color:var(--muted)">次要说明 / 标签</span></div>
<div class="type-row"><span class="tk">mono</span><span style="font-size:15px; color:var(--heading); font-family:var(--font-mono)">¥2,640,000 · 1,284 SKU</span></div>
</div></div>
</section>
<section class="section" id="spacing">
<h2>间距 Spacing</h2><p class="desc">圆角 / 间距网格 / 阴影系统,全主题统一。</p>
<div class="pcard"><div class="pcard-h"><h3>圆角</h3><span class="tk">--r-sm … --r-xl</span></div><div class="pcard-b"><div class="scale" id="scaleRadius"></div></div></div>
<div class="pcard"><div class="pcard-h"><h3>间距网格</h3><span class="tk">--sp-1 … --sp-8</span></div><div class="pcard-b"><div class="scale" id="scaleSpace"></div></div></div>
<div class="pcard"><div class="pcard-h"><h3>阴影</h3><span class="tk">--sh-1 / --sh-2 / --sh-3</span></div><div class="pcard-b"><div class="scale">
<div class="box"><div class="sh" style="box-shadow:var(--sh-1)"></div>sh-1</div>
<div class="box"><div class="sh" style="box-shadow:var(--sh-2)"></div>sh-2</div>
<div class="box"><div class="sh" style="box-shadow:var(--sh-3)"></div>sh-3</div>
</div></div></div>
</section>
<section class="section" id="comp">
<h2>公用组件 Components</h2><p class="desc">来自 <code>atoms.css</code> 的原子,<b>桌面与移动共用</b>(按钮 / 输入 / 徽章 / 分段 / 菜单 / 弹窗等)。随主题换色。移动专属原子见下一节。</p>
<div class="pcard"><div class="pcard-h"><h3>按钮</h3><span class="tk">.btn .primary/.soft/.ghost/.danger/.sm</span></div><div class="pcard-b">
<div class="btn primary"><svg viewBox="0 0 24 24"><use href="#i-plus"/></svg>新增入库</div>
<div class="btn soft sm"><svg viewBox="0 0 24 24"><use href="#i-ic21"/></svg>详细搜索</div>
<div class="btn ghost">导出</div><div class="btn ghost sm">列设置</div><div class="btn danger">删除</div>
</div></div>
<div class="pcard"><div class="pcard-h"><h3>输入 / 搜索</h3><span class="tk">.input .searchbox .ctrl</span></div><div class="pcard-b">
<input class="input" style="max-width:220px" placeholder="商品名 / 拼音 / 编码">
<div class="searchbox" style="width:240px"><svg viewBox="0 0 24 24"><use href="#i-search"/></svg><input placeholder="搜索"></div>
<div class="ctrl" style="max-width:200px"><span class="ph">选择往来单位…</span><svg width="14" height="14" viewBox="0 0 24 24" stroke-width="2"><use href="#i-chevron-down"/></svg></div>
</div></div>
<div class="pcard"><div class="pcard-h"><h3>Switch 开关</h3><span class="tk">.switch .on · 布尔即时生效(库存⇄在售 挂售切换)· 2026-07-07</span></div><div class="pcard-b">
<button class="switch on" onclick="this.classList.toggle('on')" aria-label="switch demo"></button>
<button class="switch" onclick="this.classList.toggle('on')" aria-label="switch demo"></button>
<button class="switch" disabled aria-label="switch disabled"></button>
<span style="font-size:var(--fs-xs);color:var(--faint)">on / off / disabled(已售行无 switch</span>
</div></div>
<div class="pcard"><div class="pcard-h"><h3>分段切换 / 可搜索选择器</h3><span class="tk">.seg · .combo(录单网格用)</span></div><div class="pcard-b">
<div class="seg"><button class="on">入库</button><button>出库</button></div>
<div class="combo has" style="width:240px; flex:none"><input value="茅台 飞天 53°" readonly><span class="caf"><svg viewBox="0 0 24 24" stroke-width="2"><use href="#i-close"/></svg></span></div>
</div></div>
<div class="pcard"><div class="pcard-h"><h3>搜索下拉框(弹层)</h3><span class="tk">.combo + .combo-pop > .cp-search / .cp-body(单据头供应商/客户/仓库)</span></div><div class="pcard-b" style="align-items:flex-start; gap:20px">
<div class="combo" style="max-width:220px"><input placeholder="选择或搜索供应商…" readonly><span class="caf"><svg viewBox="0 0 24 24" stroke-width="2"><use href="#i-chevron-down"/></svg></span></div>
<div class="combo-pop" style="position:static; box-shadow:var(--sh-2); width:248px; display:flex">
<div class="cp-search"><svg viewBox="0 0 24 24"><use href="#i-search"/></svg><input value="mt" readonly></div>
<div class="cp-body"><div class="cp-list">
<div class="cp-item sel"><span class="nm">茅台<span class="hl">华东</span>总代</span><small>GYS002</small><svg class="ck" viewBox="0 0 24 24" stroke-width="2"><use href="#i-check"/></svg></div>
<div class="cp-item cur"><span class="nm">名烟名酒城</span><small>GYS004</small></div>
<div class="cp-item"><span class="nm">华润万家配送</span><small>GYS005</small></div>
</div><div class="cp-new"><svg viewBox="0 0 24 24" stroke-width="2"><use href="#i-plus"/></svg>新增「mt」到基础数据</div></div>
</div>
</div></div>
<div class="pcard"><div class="pcard-h"><h3>搜索下拉框 · 带结果统计</h3><span class="tk">data-summary="1" → .combo-pop > … + .cp-foot(内容多时启用,底部显示总返回条数)</span></div><div class="pcard-b" style="align-items:flex-start; gap:20px">
<div class="combo" style="max-width:220px"><input placeholder="选择或搜索供应商…" readonly><span class="caf"><svg viewBox="0 0 24 24" stroke-width="2"><use href="#i-chevron-down"/></svg></span></div>
<div class="combo-pop" style="position:static; box-shadow:var(--sh-2); width:248px; display:flex">
<div class="cp-search"><svg viewBox="0 0 24 24"><use href="#i-search"/></svg><input placeholder="搜索供应商…" readonly></div>
<div class="cp-body"><div class="cp-list">
<div class="cp-item sel"><span class="nm">鼎晟供应链</span><small>GYS001</small><svg class="ck" viewBox="0 0 24 24" stroke-width="2"><use href="#i-check"/></svg></div>
<div class="cp-item"><span class="nm">茅台华东总代</span><small>GYS002</small></div>
<div class="cp-item"><span class="nm">川酒集团批发</span><small>GYS003</small></div>
<div class="cp-item"><span class="nm">名烟名酒城</span><small>GYS004</small></div>
<div class="cp-item"><span class="nm">华润万家配送</span><small>GYS005</small></div>
</div></div>
<div class="cp-foot"><b>5</b> 条结果</div>
</div>
</div></div>
<div class="pcard"><div class="pcard-h"><h3>日期字段(滚轮选择)</h3><span class="tk">.datefield + .wheel-pop(年月日 · 单据/生产共用)· datewheel.js</span></div><div class="pcard-b" style="align-items:flex-start">
<div class="datefield" style="max-width:200px" data-val="2026-06-22"><span class="dval">2026-06-22</span><svg viewBox="0 0 24 24"><use href="#i-ic48"/></svg></div>
<div class="datefield" style="max-width:200px"><span class="dval ph">选择日期</span><svg viewBox="0 0 24 24"><use href="#i-ic48"/></svg></div>
<div class="wheel-pop show" style="position:static; box-shadow:none; width:248px"><div class="wheel-cols"><div class="wheel-center"></div>
<div class="wheel-col" style="overflow:hidden"><div class="wheel-item">2024</div><div class="wheel-item">2025</div><div class="wheel-item on">2026</div><div class="wheel-item">2027</div><div class="wheel-item">2028</div></div>
<div class="wheel-col" style="overflow:hidden"><div class="wheel-item">04</div><div class="wheel-item">05</div><div class="wheel-item on">06</div><div class="wheel-item">07</div><div class="wheel-item">08</div></div>
<div class="wheel-col" style="overflow:hidden"><div class="wheel-item">20</div><div class="wheel-item">21</div><div class="wheel-item on">22</div><div class="wheel-item">23</div><div class="wheel-item">24</div></div>
</div><div class="wheel-foot"><span class="wheel-today">今天</span><span class="wheel-ok">确定</span></div></div>
</div></div>
<div class="pcard"><div class="pcard-h"><h3>筛选 Chip</h3><span class="tk">.chip · 内嵌列头筛选入口</span></div><div class="pcard-b">
<div class="chip">全部品类</div>
<div class="chip on">分类 <span class="cv">浓香</span><svg viewBox="0 0 24 24"><use href="#i-chevron-down"/></svg></div>
<div class="chip">时间范围 <svg viewBox="0 0 24 24"><use href="#i-chevron-down"/></svg></div>
</div></div>
<div class="pcard"><div class="pcard-h"><h3>状态徽章 · 全部</h3><span class="tk">.badge .b-* · 对齐 schema 真实枚举 · 圆点已全局图标化(icons.js BADGE_ICON 单源映射自动注入,屏内无需手写 svg)</span></div><div class="pcard-b" style="display:block">
<div style="display:flex;flex-direction:column;gap:13px">
<div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap"><span style="width:160px;flex:none;font-size:var(--fs-xs);color:var(--muted);font-weight:600">库存三态 · status 落库</span><span class="badge b-在售">在售</span><span class="badge b-库存">库存</span><span class="badge b-已售">已售</span><span style="font-size:var(--fs-xs);color:var(--faint)">(在售=公开酒单展示;已售=卖光留痕;预警/缺货退出状态列,由数量染色承担)</span></div>
<div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap"><span style="width:160px;flex:none;font-size:var(--fs-xs);color:var(--muted);font-weight:600">库存 · 数量派生提示</span><span class="badge b-预警">预警</span><span class="badge b-缺货">缺货</span></div>
<div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap"><span style="width:160px;flex:none;font-size:var(--fs-xs);color:var(--muted);font-weight:600">单据 · 入库/出库</span><span class="badge b-草稿">草稿</span><span class="badge b-待审核">待审核</span><span class="badge b-已通过">已通过</span><span class="badge b-已驳回">已驳回</span></div>
<div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap"><span style="width:160px;flex:none;font-size:var(--fs-xs);color:var(--muted);font-weight:600">往来单位 · 启用停用</span><span class="badge b-启用">启用</span><span class="badge b-停用">停用</span><span class="badge b-供应商">供应商</span><span class="badge b-客户">客户</span><span class="badge b-两者">两者</span></div>
<div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap"><span style="width:160px;flex:none;font-size:var(--fs-xs);color:var(--muted);font-weight:600">用户角色</span><span class="badge b-管理员">管理员</span><span class="badge b-普通">普通</span><span class="badge b-只读">只读</span></div>
<div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap"><span style="width:160px;flex:none;font-size:var(--fs-xs);color:var(--muted);font-weight:600">设备在线状态</span><span class="badge b-在线">在线</span><span class="badge b-离线">离线</span></div>
<div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap"><span style="width:160px;flex:none;font-size:var(--fs-xs);color:var(--muted);font-weight:600">库存盘点</span><span class="badge b-进行中">进行中</span><span class="badge b-已完成">已完成</span></div>
<div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap"><span style="width:160px;flex:none;font-size:var(--fs-xs);color:var(--muted);font-weight:600">授权兑换券</span><span class="badge b-未使用">未使用</span><span class="badge b-已兑换">已兑换</span><span class="badge b-作废">作废</span></div>
<div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap"><span style="width:160px;flex:none;font-size:var(--fs-xs);color:var(--muted);font-weight:600">账单结清 · 收付</span><span class="badge b-未结清">未结清</span><span class="badge b-已结清">已结清</span><span class="badge b-收款">收款</span><span class="badge b-付款">付款</span></div>
<div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap"><span style="width:160px;flex:none;font-size:var(--fs-xs);color:var(--muted);font-weight:600">进价待定 · 调货暂估</span><span class="badge b-待定价">待定价</span><span class="pending-price">待定价</span><span style="font-size:var(--fs-xs);color:var(--faint)">(入库进价留空/0,确认进价后回填)</span></div>
<div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap"><span style="width:160px;flex:none;font-size:var(--fs-xs);color:var(--muted);font-weight:600">图标徽章 .bi · 图标替代圆点</span><span class="badge bi b-草稿"><svg class="ic"><use href="#i-ic06"/></svg>草稿</span><span class="badge bi b-待审核"><svg class="ic"><use href="#i-ic04"/></svg>待审核</span><span class="badge bi b-已通过"><svg class="ic"><use href="#i-check"/></svg>已审核</span><span class="badge bi b-已驳回"><svg class="ic"><use href="#i-close"/></svg>已拒绝</span><span class="badge bi b-预警"><svg class="ic"><use href="#i-undo"/></svg>部分退单</span><span class="badge bi b-缺货"><svg class="ic"><use href="#i-undo"/></svg>已退单</span><span class="badge bi b-待定价"><svg class="ic"><use href="#i-yen"/></svg>待定价</span></div>
<div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap"><span style="width:160px;flex:none;font-size:var(--fs-xs);color:var(--muted);font-weight:600">纯图标徽章 .ico · 移动卡片</span><span class="badge ico b-草稿"><svg class="ic"><use href="#i-ic06"/></svg></span><span class="badge ico b-待审核"><svg class="ic"><use href="#i-ic04"/></svg></span><span class="badge ico b-已通过"><svg class="ic"><use href="#i-check"/></svg></span><span class="badge ico b-已驳回"><svg class="ic"><use href="#i-close"/></svg></span><span class="badge ico b-预警"><svg class="ic"><use href="#i-undo"/></svg></span><span class="badge ico b-缺货"><svg class="ic"><use href="#i-undo"/></svg></span><span class="badge ico b-待定价"><svg class="ic"><use href="#i-yen"/></svg></span><span style="font-size:var(--fs-xs);color:var(--faint)">(图标映射:草稿=文件 待审核=时钟 已审核=勾 已拒绝=叉 退单=撤回箭头 待定价=¥)</span></div>
</div>
</div></div>
<div class="pcard"><div class="pcard-h"><h3>KPI 卡</h3><span class="tk">.kpi</span></div><div class="pcard-b">
<div class="kpi" style="width:200px"><div class="ic ic-info"><svg viewBox="0 0 24 24"><use href="#i-box"/></svg></div><div class="t">SKU 总数</div><div class="v">1,284</div><div class="d up">▲ 2.3%</div></div>
<div class="kpi alert" style="width:200px"><div class="ic ic-alert"><svg viewBox="0 0 24 24"><use href="#i-ic18"/></svg></div><div class="t">缺货预警</div><div class="v">17</div><div class="d down">需补货 6 项</div></div>
<div class="kpi warn" style="width:200px"><div class="ic ic-warn"><svg viewBox="0 0 24 24"><use href="#i-ic06"/></svg></div><div class="t">草稿单数</div><div class="v">2</div><div class="d">待提交审核</div></div>
</div></div>
<div class="pcard"><div class="pcard-h"><h3>表格行</h3><span class="tk">.table thead/tbody</span></div><div class="pcard-b" style="display:block">
<div class="table"><table><thead><tr><th>商品</th><th>分类</th><th class="num">库存</th><th><span class="fh filtered">状态 <svg class="funnel" viewBox="0 0 24 24"><use href="#i-ic68"/></svg></span></th></tr></thead><tbody>
<tr class="click"><td><div class="pname">茅台 飞天 53°</div><div class="pcode">MT-FT-500</div></td><td>酱香</td><td class="num"><span class="qty">128</span></td><td><span class="badge b-在售">在售</span></td></tr>
<tr class="click"><td><div class="pname">剑南春 水晶剑</div><div class="pcode">JNC-SJ-500</div></td><td>浓香</td><td class="num"><span class="qty low">8</span></td><td><span class="badge b-缺货">缺货</span></td></tr>
</tbody></table></div>
</div></div>
<div class="pcard"><div class="pcard-h"><h3>提示条</h3><span class="tk">.notice info/danger(草稿恢复 / 驳回)</span></div><div class="pcard-b" style="display:block">
<div class="notice info"><svg viewBox="0 0 24 24"><use href="#i-info"/></svg><div>检测到未提交的入库单草稿(06-21 11:20),是否恢复?</div><div class="nb"><span class="lk">恢复</span><span class="lk" style="color:var(--muted)">放弃</span></div></div>
<div class="notice danger" style="margin-bottom:0"><svg viewBox="0 0 24 24"><use href="#i-alert"/></svg><div>单据被驳回:单价高于近期采购价,请核实后重报。</div></div>
</div></div>
<div class="pcard"><div class="pcard-h"><h3>单据明细行(商品 / 系列规格分列)</h3><span class="tk">.lines .lr · .lcell .ln/.lcode/.lser/.lspec</span></div><div class="pcard-b" style="display:block">
<div class="lines" style="max-width:480px"><div class="lh" style="grid-template-columns:1fr 124px 40px 64px 78px"><span>商品 · 编码</span><span>系列 / 规格</span><span style="text-align:right">数量</span><span style="text-align:right">单价</span><span style="text-align:right">金额</span></div>
<div class="lr" style="grid-template-columns:1fr 124px 40px 64px 78px;align-items:start"><span class="lcell"><span class="ln">泸州老窖 特曲</span><span class="lcode">LZLJ-TQ-52-500</span></span><span class="lcell"><span class="lser">特曲</span><span class="lspec">52° 500ml×6</span></span><span style="text-align:right;font-family:var(--font-mono)">48</span><span style="text-align:right;font-family:var(--font-mono)">¥320</span><span class="amt">¥15,360</span></div>
</div>
</div></div>
<div class="pcard"><div class="pcard-h"><h3>抽屉操作分组</h3><span class="tk">.dactions · .dact-group/.dact-label/.dact-row(审核类 / 打印类)</span></div><div class="pcard-b" style="display:block">
<div class="dactions" style="margin-top:0">
<div class="dact-group"><span class="dact-label">单据审核</span><div class="dact-row"><div class="btn primary sm">审核通过</div><div class="btn danger sm">驳回</div><div class="btn ghost sm">结清</div><div class="btn danger sm">退单</div><div class="btn primary sm">提交审核</div></div></div>
<div class="dact-group"><span class="dact-label">打印</span><div class="dact-row"><div class="btn ghost sm"><svg viewBox="0 0 24 24"><use href="#i-ic49"/></svg>打印标签</div><div class="btn ghost sm"><svg viewBox="0 0 24 24"><use href="#i-ic50"/></svg>打印单据</div></div></div>
</div>
</div></div>
<div class="pcard"><div class="pcard-h"><h3>覆盖层(交互)</h3><span class="tk">.menu · .overlay/.modal · .drawer · .toast</span></div><div class="pcard-b">
<div class="btn ghost" onclick="demoMenu(event)">下拉菜单</div>
<div class="btn ghost" onclick="document.getElementById('demoModal').classList.add('show')">弹窗</div>
<div class="btn ghost" onclick="document.getElementById('demoDrawer').classList.add('show')">抽屉</div>
<div class="btn ghost" onclick="toast('操作成功 ✓')">Toast</div>
</div></div>
<div class="pcard"><div class="pcard-h"><h3>分页 / 移动卡 / 状态栏 / 通知 / 遮罩</h3><span class="tk">.pager · .mcard · .statusbar · .notify-pop · .drawer-mask (列表/壳层原子)</span></div><div class="pcard-b" style="display:block">
<div class="pager" style="max-width:360px"><span>每页 8 条 · 共 24</span><div class="pg"><button disabled></button><button class="cur">1</button><button>2</button><button>3</button><button></button></div></div>
<div class="mcard" style="max-width:360px;margin-top:14px"><div class="mcard-head"><span class="mt">茅台 飞天 53°</span><span class="msub">MT-FT-500</span><span class="badge b-在售" style="margin-left:auto">在售</span></div></div>
<div style="margin-top:16px"><div class="statusbar" style="position:static;border-radius:var(--r-md)"><div class="sb-group"><span class="sb-i"><svg viewBox="0 0 24 24"><use href="#i-ic44"/></svg><b>DSJH-001</b></span><span class="sb-i"><svg viewBox="0 0 24 24"><use href="#i-ic04"/></svg>当前 18:00:00</span></div><div class="sb-group right"><span class="sb-i ok"><svg viewBox="0 0 24 24"><use href="#i-cloud"/></svg>已连接</span></div></div></div>
<div style="margin-top:16px"><div class="notify-pop show" style="position:static;width:330px"><div class="np-head"><h4>通知</h4><span class="np-clear">全部已读</span></div><div class="np-list"><div class="np-item unread"><div class="np-ic warn"><svg viewBox="0 0 24 24"><use href="#i-ic18"/></svg></div><div class="np-tx"><div class="np-t">入库单 待审核</div><div class="np-d">茅台华东总代 · 3 项</div></div><div class="np-time">10 分钟前</div></div></div><div class="np-foot">查看全部</div></div></div>
<p style="font-size:var(--fs-xs);color:var(--muted);margin:18px 0 8px"><b>通知中心列表行</b> <code>.nt-item</code> / 类型图标 <code>.nt-ic</code>warn / danger / info / ok)—— 通知列表页与详情页共用,桌面/移动一致:</p>
<div style="max-width:460px"><a class="nt-item unread" style="cursor:default"><span class="nt-ic warn"><svg viewBox="0 0 24 24"><use href="#i-ic42"/></svg></span><div class="nt-bd"><div class="nt-t"><span class="nt-dot"></span><span class="nt-tt">入库单 RK-20260620-001 待审核</span><span class="nt-time">10 分钟前</span></div><div class="nt-d">茅台华东总代 · 3 项 · ¥48,360</div></div></a>
<a class="nt-item" style="cursor:default"><span class="nt-ic danger"><svg viewBox="0 0 24 24"><use href="#i-ic18"/></svg></span><div class="nt-bd"><div class="nt-t"><span class="nt-tt">五粮液 普五 库存预警</span><span class="nt-time">1 小时前</span></div><div class="nt-d">当前 6 件,低于安全库存 6</div></div></a></div>
<p style="font-size:var(--fs-xs);color:var(--muted);margin:14px 0 0">遮罩 <code>.drawer-mask</code>:抽屉/弹层背后的半透明背板,点击关闭。</p>
</div></div>
</section>
<section class="section" id="m-comp">
<h2>移动专属组件 .m-*</h2><p class="desc">来自 <code>mobile-atoms.css</code> 的移动专属原子,由 <code>mobile-shell.js</code> 装配外壳。<b>复用上方公用原子</b>(按钮/徽章/分段/输入),此处只展示移动新增的 <code>.m-*</code></p>
<div style="margin:0 0 16px"><a class="btn ghost" href="screens/mobile-kit.html"><svg viewBox="0 0 24 24"><use href="#i-ic62"/></svg>打开移动 UI Kit · 全部 .m-* 实机展示</a></div>
<div class="pcard"><div class="pcard-h"><h3>移动壳 + 列表(实机预览)</h3><span class="tk">.m-top · .m-tabbar · .m-page · .m-kpi · .m-search · .m-filters/.m-pill · .m-card/.m-row · .m-fab</span></div>
<div class="pcard-b" style="align-items:flex-start"><div class="mdemo">
<div class="mphone">
<div class="m-top"><div class="m-title">库存</div><div class="m-actions"><div class="m-ic"><svg viewBox="0 0 24 24"><use href="#i-shirt"/></svg></div><div class="m-ic"><svg viewBox="0 0 24 24"><use href="#i-bell"/></svg><span class="m-dot">3</span></div><div class="m-av"></div></div></div>
<div class="m-page has-tabs"><div class="m-scroll">
<div class="m-kpi">
<div class="k"><div class="kl">SKU 总数</div><div class="kv">1,284</div><div class="kd up">▲ 2.3%</div></div>
<div class="k"><div class="kl">库存货值</div><div class="kv">¥264万</div><div class="kd up">▲ 1.5%</div></div>
<div class="k"><div class="kl">在库数量</div><div class="kv">18,920</div><div class="kd"></div></div>
<div class="k"><div class="kl">缺货预警</div><div class="kv">17</div><div class="kd warn">需补货 6</div></div>
</div>
<div class="m-search" style="margin-top:12px"><svg viewBox="0 0 24 24"><use href="#i-search"/></svg><input placeholder="商品名 / 拼音 / 编码"></div>
<div class="m-filters"><div class="m-pill on">全部</div><div class="m-pill">酱香</div><div class="m-pill">浓香</div><div class="m-pill">清香</div></div>
<div class="m-section">商品 · 共 10</div>
<a class="m-card"><div class="m-row"><div class="mc-main"><div class="mc-nm">茅台 飞天 53°</div><div class="mc-sub">MT-FT-500 · 500ml×6</div></div><div class="mc-right"><span class="badge b-在售">在售</span><span class="mc-amt">128 件</span></div><div class="mc-chev"><svg viewBox="0 0 24 24"><use href="#i-chevron-right"/></svg></div></div></a>
<a class="m-card"><div class="m-row"><div class="mc-main"><div class="mc-nm">剑南春 水晶剑</div><div class="mc-sub">JNC-SJ-500 · 500ml×6</div></div><div class="mc-right"><span class="badge b-缺货">缺货</span><span class="mc-amt">8 件</span></div><div class="mc-chev"><svg viewBox="0 0 24 24"><use href="#i-chevron-right"/></svg></div></div></a>
</div></div>
<nav class="m-tabbar">
<a class="m-tab on"><svg viewBox="0 0 24 24"><use href="#i-box-2"/></svg><span>库存</span></a>
<a class="m-tab"><svg viewBox="0 0 24 24"><use href="#i-download"/></svg><span>入库</span></a>
<a class="m-tab"><svg viewBox="0 0 24 24"><use href="#i-upload"/></svg><span>出库</span></a>
<a class="m-tab"><svg viewBox="0 0 24 24"><use href="#i-ic08"/></svg><span>财务</span></a>
<a class="m-tab"><svg viewBox="0 0 24 24"><use href="#i-ic37"/></svg><span>我的</span></a>
</nav>
<div class="m-fab"><svg viewBox="0 0 24 24"><use href="#i-plus"/></svg></div>
</div>
<div class="mcol">
<div><div class="mlab">.m-form · .m-field · .m-input · .m-select</div>
<div class="m-form" style="margin-top:10px">
<div class="m-field"><label>商品名称</label><input class="m-input" placeholder="如:茅台 飞天"></div>
<div class="m-field"><label>分类(香型)</label><div class="m-select"><span>酱香</span><svg viewBox="0 0 24 24"><use href="#i-chevron-down"/></svg></div></div>
<div class="m-field" style="margin-bottom:0"><label>备注</label><textarea class="m-input" placeholder="选填…"></textarea></div>
</div></div>
<div><div class="mlab">.m-sheet-h · .m-opt(底部 sheet 内容)</div>
<div class="msheet-demo" style="margin-top:10px">
<div class="m-sheet-h"><h3>筛选 · 香型</h3><svg class="x" viewBox="0 0 24 24" stroke-width="2"><use href="#i-close"/></svg></div>
<div style="padding:4px 16px 8px">
<div class="m-opt sel">全部<svg class="ck" viewBox="0 0 24 24" stroke-width="2"><use href="#i-check"/></svg></div>
<div class="m-opt">酱香<svg class="ck" viewBox="0 0 24 24" stroke-width="2"><use href="#i-check"/></svg></div>
<div class="m-opt">浓香<svg class="ck" viewBox="0 0 24 24" stroke-width="2"><use href="#i-check"/></svg></div>
</div>
</div></div>
<div><div class="mlab">.m-hub(我的 · 功能入口)</div>
<div class="m-hub" style="margin-top:10px">
<a><span class="hic"><svg viewBox="0 0 24 24"><use href="#i-ic56"/></svg></span>往来单位<span class="hchev"><svg viewBox="0 0 24 24"><use href="#i-chevron-right"/></svg></span></a>
<a><span class="hic"><svg viewBox="0 0 24 24"><use href="#i-ic57"/></svg></span>基础数据<span class="hchev"><svg viewBox="0 0 24 24"><use href="#i-chevron-right"/></svg></span></a>
<a><span class="hic"><svg viewBox="0 0 24 24"><use href="#i-gear"/></svg></span>系统设置<span class="hchev"><svg viewBox="0 0 24 24"><use href="#i-chevron-right"/></svg></span></a>
</div></div>
<div><div class="mlab">.m-actionbar(全屏表单底部操作条)</div>
<div style="position:relative; border:1px solid var(--border); border-radius:var(--r-lg); overflow:hidden; margin-top:10px">
<div class="m-actionbar" style="position:relative; padding-bottom:12px">
<div style="flex:1; display:flex; flex-direction:column; line-height:1.2"><span style="font-size:var(--fs-xs); color:var(--muted)">合计</span><b style="font-size:var(--fs-title); color:var(--heading); font-family:var(--font-mono)">¥10,500</b></div>
<div class="btn ghost">存草稿</div><div class="btn primary">提交审核</div>
</div>
</div></div>
</div>
</div></div>
</div>
</section>
<section class="section" id="icons">
<h2>图标 Icons</h2><p class="desc">全部 92 个图标登记在 <code>screens/icons.js</code> 的 SVG sprite(单一真源)。各屏用 <code>&lt;svg&gt;&lt;use href="#i-xxx"/&gt;&lt;/svg&gt;</code> 引用——<b>改一处、全局生效</b>。新增图标先在此登记 symbol,再用 use 引用;门禁 ❽ 禁止内联图标。</p>
<div class="pcard"><div class="pcard-h"><h3>图标库 · 92 个</h3><span class="tk">icons.js &lt;symbol&gt; · &lt;use href="#i-*"&gt;</span></div><div class="pcard-b" style="display:block"><div class="icon-grid"><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-arrow-left"/></svg><span>i-arrow-left</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-bottle"/></svg><span>i-bottle</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-box"/></svg><span>i-box</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-box-2"/></svg><span>i-box-2</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-check"/></svg><span>i-check</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-chevron-down"/></svg><span>i-chevron-down</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-chevron-left"/></svg><span>i-chevron-left</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-chevron-right"/></svg><span>i-chevron-right</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-close"/></svg><span>i-close</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-download"/></svg><span>i-download</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-edit"/></svg><span>i-edit</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-eye"/></svg><span>i-eye</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-gear"/></svg><span>i-gear</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-megaphone"/></svg><span>i-megaphone</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-menu"/></svg><span>i-menu</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-plus"/></svg><span>i-plus</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-refresh"/></svg><span>i-refresh</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-search"/></svg><span>i-search</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-shield"/></svg><span>i-shield</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-shield-2"/></svg><span>i-shield-2</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-upload"/></svg><span>i-upload</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-bug"/></svg><span>i-bug</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-lightbulb"/></svg><span>i-lightbulb</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic01"/></svg><span>i-ic01</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic02"/></svg><span>i-ic02</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic03"/></svg><span>i-ic03</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic04"/></svg><span>i-ic04</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic05"/></svg><span>i-ic05</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic06"/></svg><span>i-ic06</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic07"/></svg><span>i-ic07</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic08"/></svg><span>i-ic08</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic09"/></svg><span>i-ic09</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic10"/></svg><span>i-ic10</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic11"/></svg><span>i-ic11</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic12"/></svg><span>i-ic12</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic13"/></svg><span>i-ic13</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic14"/></svg><span>i-ic14</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic15"/></svg><span>i-ic15</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic16"/></svg><span>i-ic16</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic17"/></svg><span>i-ic17</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic18"/></svg><span>i-ic18</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic19"/></svg><span>i-ic19</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic20"/></svg><span>i-ic20</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic21"/></svg><span>i-ic21</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic22"/></svg><span>i-ic22</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic23"/></svg><span>i-ic23</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic24"/></svg><span>i-ic24</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic25"/></svg><span>i-ic25</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic26"/></svg><span>i-ic26</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic27"/></svg><span>i-ic27</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic28"/></svg><span>i-ic28</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic29"/></svg><span>i-ic29</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic30"/></svg><span>i-ic30</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic31"/></svg><span>i-ic31</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic32"/></svg><span>i-ic32</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic33"/></svg><span>i-ic33</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic34"/></svg><span>i-ic34</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic35"/></svg><span>i-ic35</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic36"/></svg><span>i-ic36</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic37"/></svg><span>i-ic37</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic38"/></svg><span>i-ic38</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic39"/></svg><span>i-ic39</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic40"/></svg><span>i-ic40</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic41"/></svg><span>i-ic41</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic42"/></svg><span>i-ic42</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic43"/></svg><span>i-ic43</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic44"/></svg><span>i-ic44</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic45"/></svg><span>i-ic45</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic46"/></svg><span>i-ic46</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic47"/></svg><span>i-ic47</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic48"/></svg><span>i-ic48</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic49"/></svg><span>i-ic49</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic50"/></svg><span>i-ic50</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic51"/></svg><span>i-ic51</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic52"/></svg><span>i-ic52</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic53"/></svg><span>i-ic53</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic54"/></svg><span>i-ic54</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic55"/></svg><span>i-ic55</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic56"/></svg><span>i-ic56</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic57"/></svg><span>i-ic57</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic58"/></svg><span>i-ic58</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic59"/></svg><span>i-ic59</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic60"/></svg><span>i-ic60</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic61"/></svg><span>i-ic61</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic62"/></svg><span>i-ic62</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic63"/></svg><span>i-ic63</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic64"/></svg><span>i-ic64</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic65"/></svg><span>i-ic65</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic66"/></svg><span>i-ic66</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic67"/></svg><span>i-ic67</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic68"/></svg><span>i-ic68</span></div><div class="icell"><svg viewBox="0 0 24 24"><use href="#i-ic69"/></svg><span>i-ic69</span></div></div></div></div>
</section>
</main>
</div>
<!-- 组件演示:弹窗 / 抽屉 / toast -->
<div class="overlay" id="demoModal"><div class="modal"><div class="modal-head"><h3>弹窗示例</h3><svg class="x" viewBox="0 0 24 24" stroke-width="2" onclick="this.closest('.overlay').classList.remove('show')"><use href="#i-close"/></svg></div><div class="modal-body" style="color:var(--muted); font-size:var(--fs-body)">这是 <code>.modal</code> 原子。库存的「新增入库」即基于它。</div><div class="modal-foot"><div class="btn ghost" onclick="this.closest('.overlay').classList.remove('show')">取消</div><div class="btn primary" onclick="this.closest('.overlay').classList.remove('show'); toast('已保存 ✓')">保存</div></div></div></div>
<div class="drawer" id="demoDrawer"><div class="drawer-head"><h3>抽屉示例</h3><svg class="x" viewBox="0 0 24 24" stroke-width="2" onclick="this.closest('.drawer').classList.remove('show')"><use href="#i-close"/></svg></div><div class="drawer-body"><div class="drow"><span>编码</span><b>MT-FT-500</b></div><div class="drow"><span>库存</span><b>128 件</b></div><div class="drow"><span>状态</span><b><span class="badge b-在售">在售</span></b></div></div></div>
<div class="toast" id="toast"></div>
<script>
const THEMES={a:{n:'经典蓝'},b:{n:'琥珀'},c:{n:'酒窖'}};
function setTheme(t){ document.documentElement.dataset.theme=t; document.querySelectorAll('#seg button').forEach(b=>b.classList.toggle('on',b.dataset.t===t)); localStorage.setItem('jiu-theme',t); renderTokens(); }
document.querySelectorAll('#seg button').forEach(b=>b.onclick=()=>setTheme(b.dataset.t));
// 色板从实际 CSS 变量读取(换主题刷新)
function renderTokens(){
const cs=getComputedStyle(document.documentElement);
document.querySelectorAll('[data-swatches]').forEach(grid=>{
grid.innerHTML = grid.dataset.swatches.split(',').map(tok=>{
const v=cs.getPropertyValue(tok).trim();
return `<div class="sw"><div class="band" style="background:var(${tok})"></div><div class="m"><div class="n">${tok.replace('--','')}</div><div class="v">${v||'—'}</div></div></div>`;
}).join('');
});
}
// 圆角 / 间距 比例尺
function renderScales(){
const radii=[['sm',4],['md',6],['lg',10],['xl',14]];
document.getElementById('scaleRadius').innerHTML = radii.map(([n,px])=>`<div class="box"><div class="rq" style="width:56px;height:56px;border-radius:var(--r-${n})"></div>r-${n} · ${px}</div>`).join('');
const sp=[['1',4],['2',8],['3',12],['4',16],['5',20],['6',24],['8',32]];
document.getElementById('scaleSpace').innerHTML = sp.map(([n,px])=>`<div class="box"><div class="sq" style="width:var(--sp-${n});height:36px;border-radius:2px"></div>sp-${n} · ${px}</div>`).join('');
}
// 文档导航 scrollspy
const navLinks=[...document.querySelectorAll('.dnav')];
navLinks.forEach(a=>a.onclick=(e)=>{ e.preventDefault(); document.getElementById(a.dataset.s).scrollIntoView({behavior:'smooth',block:'start'}); });
const obs=new IntersectionObserver(es=>{ es.forEach(en=>{ if(en.isIntersecting){ const id=en.target.id; navLinks.forEach(a=>a.classList.toggle('on',a.dataset.s===id)); } }); },{rootMargin:'-60px 0px -75% 0px'});
document.querySelectorAll('.section').forEach(s=>obs.observe(s));
// 组件演示
let menuEl=null;
function demoMenu(e){ if(menuEl){menuEl.remove();menuEl=null;return;} const r=e.currentTarget.getBoundingClientRect(); menuEl=document.createElement('div'); menuEl.className='menu'; menuEl.style.left=r.left+'px'; menuEl.style.top=(r.bottom+6)+'px'; menuEl.innerHTML=['酱香','浓香','清香'].map((x,i)=>`<div class="menu-item ${i==1?'sel':''}">${i==1?'<svg class="ck" viewBox="0 0 24 24" stroke-width="2"><use href="#i-check"/></svg>':'<span style="width:16px"></span>'}${x}</div>`).join(''); document.body.appendChild(menuEl); }
document.addEventListener('click',e=>{ if(menuEl && !menuEl.contains(e.target) && !e.target.closest('[onclick^="demoMenu"]')) {menuEl.remove();menuEl=null;} });
let toastT; function toast(m){ const t=document.getElementById('toast'); t.textContent=m; t.classList.add('show'); clearTimeout(toastT); toastT=setTimeout(()=>t.classList.remove('show'),2000); }
document.addEventListener('keydown',e=>{ if(e.key==='Escape'){ document.querySelectorAll('.overlay.show,.drawer.show').forEach(x=>x.classList.remove('show')); } });
setTheme(localStorage.getItem('jiu-theme')||'a'); renderScales();
</script>
<script src="screens/icons.js"></script>
</body>
</html>