Files
stack/design-refs/mockup/design-system.html
T

296 lines
21 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">
<head>
<meta charset="utf-8">
<title>设计系统 · 孟菲斯 × 拟物卡 · stack idealjs</title>
<style>
/* ====== 页面基座 ====== */
@page { size: 1280px 800px; margin: 0; }
*, *::before, *::after { box-sizing: border-box; }
html, body {
margin: 0; padding: 0; width: 1280px;
background: #f0f0ef;
font-family: "Noto Sans CJK SC", "PingFang SC", "Microsoft YaHei", sans-serif;
color: #1a1a1a;
-webkit-font-smoothing: antialiased;
}
.page { width: 1280px; height: 800px; position: relative; background: #f0f0ef; overflow: hidden; page-break-after: always; }
.page:last-child { page-break-after: auto; }
@media screen {
html { height: auto; display: flex; justify-content: center; background: #f0f0ef; }
body { transform-origin: top center; scale: min(1, calc(100vw / 1280px)); margin: 0 auto; box-shadow: 0 0 48px rgba(15, 23, 42, 0.18); }
}
.pagenum { position: absolute; bottom: 26px; right: 40px; font-size: 13px; color: #8a8a8a; letter-spacing: 2px; }
.footline { position: absolute; bottom: 26px; left: 40px; font-size: 13px; color: #8a8a8a; letter-spacing: 1px; }
.story-head { position: absolute; top: 36px; left: 40px; right: 40px; }
.story-head .tag {
display: inline-block; font-size: 15px; font-weight: 700; color: #6d28d9;
background: #efe6fb; border-radius: 8px; padding: 3px 12px;
font-family: "DejaVu Sans Mono", "Noto Sans CJK SC", monospace;
}
.story-head h2 { margin: 8px 0 4px; font-size: 28px; font-weight: 800; color: #1a1a1a; }
.story-head .desc { font-size: 14.5px; color: #6b6b6b; }
.canvas { background: #fbfbfa; border: 1px dashed #cfcfcd; border-radius: 18px; padding: 20px 22px; position: absolute; }
.panel { background: #ffffff; border-radius: 18px; padding: 18px 20px; box-shadow: 0 1px 2px rgba(26,26,26,0.06); }
.panel h3 { margin: 0 0 10px; font-size: 16px; font-weight: 700; color: #1a1a1a; }
.note { display: flex; gap: 10px; align-items: flex-start; margin-bottom: 8px; }
.note .idx {
flex: none; width: 22px; height: 22px; border-radius: 50%;
background: #1a1a1a; color: #ffffff; font-size: 13px; font-weight: 700;
display: flex; align-items: center; justify-content: center; margin-top: 1px;
}
.note .txt { font-size: 13px; line-height: 1.55; color: #3d3d3d; }
.note .txt b { color: #1a1a1a; }
table.spec { width: 100%; border-collapse: collapse; font-size: 12px; color: #3d3d3d; }
table.spec th { text-align: left; font-weight: 700; color: #1a1a1a; border-bottom: 2px solid #d5d5d3; padding: 5px 8px 5px 0; }
table.spec td { border-bottom: 1px solid #ececea; padding: 4px 8px 4px 0; vertical-align: top; }
table.spec td.k { color: #1a1a1a; font-weight: 600; white-space: nowrap; }
table.spec code { font-family: "DejaVu Sans Mono", monospace; font-size: 11.5px; background: #f4f2fa; color: #6d28d9; border-radius: 5px; padding: 1px 5px; }
/* ====== 系统元素 ====== */
.pillar-label { font-size: 13.5px; font-weight: 700; color: #1a1a1a; margin-bottom: 8px; }
.pillar-label i { font-style: normal; font-weight: 400; font-size: 11.5px; color: #6b6b6b; margin-left: 8px; }
.pair { display: flex; border: 2px solid #111111; border-radius: 10px; overflow: hidden; }
.pair div { width: 72px; height: 34px; }
.shapechip { text-align: center; }
.shapechip .box {
width: 44px; height: 44px; margin: 0 auto; border-radius: 10px; background: #ffffff;
border: 2px solid #111111; display: flex; align-items: center; justify-content: center;
}
.shapechip .sn { font-size: 11px; font-weight: 700; margin-top: 5px; }
.shapechip .sm { font-size: 9.5px; color: #6b6b6b; margin-top: 1px; line-height: 1.35; }
.mscard {
background: #fff9f0; border: 2px solid #111111; border-radius: 14px;
box-shadow: 0 3px 0 #ffffff, 0 5px 0 #eadfc4, 7px 8px 0 #111111;
padding: 11px; position: absolute;
}
.mscard .mszone {
height: 128px; border-radius: 8px; position: relative;
border: 3px solid #111111;
box-shadow: inset 0 3px 8px rgba(26,26,26,0.30), inset 0 -1px 0 rgba(255,255,255,0.55);
display: flex; align-items: center; justify-content: center;
}
.mscard .mszone span { font-size: 30px; }
.mscard .mst { display: flex; align-items: center; gap: 7px; margin-top: 9px; }
.mscard .mst .tri { width: 0; height: 0; border-left: 6px solid transparent; border-right: 6px solid transparent; border-bottom: 10px solid #111111; }
.mscard .mst b { font-size: 14px; flex: 1; color: #2b1d10; text-shadow: 0 1px 1px rgba(255,255,255,0.9); }
.mscard .dots { display: flex; gap: 4px; }
.mscard .dots i { width: 7px; height: 7px; border-radius: 50%; border: 1.5px solid #111111; background: #fff; }
.mscard .dots i.on { background: #111111; }
.entry-badge2 {
position: absolute; top: -11px; left: -11px; width: 24px; height: 24px; border-radius: 50%;
background: #111111; color: #ffd93d; font-size: 12px; font-weight: 800;
display: flex; align-items: center; justify-content: center; border: 2px solid #fff9f0;
}
.msticket {
width: 216px; background: #fff9f0; border: 2px solid #111111; border-radius: 12px;
box-shadow: 5px 5px 0 #111111; position: absolute; padding: 10px 12px;
}
.msticket h4 { margin: 0 0 6px; font-size: 12px; font-weight: 800; letter-spacing: 1px; }
.msticket .row { display: flex; gap: 6px; font-size: 10.5px; color: #3d3d3d; margin-bottom: 4px; line-height: 1.45; }
.msticket .row b { flex: none; color: #111; }
.msline { stroke: #111111; stroke-width: 2.5; fill: none; }
.msstation { stroke: #111111; stroke-width: 2; }
</style>
</head>
<body>
<!-- ================= P1 系统总纲 ================= -->
<div class="page">
<div class="story-head">
<span class="tag">&lt;DesignSystem /&gt;</span>
<h2>设计系统 · 孟菲斯 × 拟物卡 · v1.0</h2>
<div class="desc">定稿:鲜艳碰撞的孟菲斯骨架,拟物纸质课程卡为入口载体;线条是关系;形状承载语义、散落空白。一切扩展围绕 ai-era-tutorial:卡头即靶子,票券即指派。</div>
</div>
<div class="canvas" style="top: 138px; left: 40px; width: 880px; height: 594px;">
<div class="pillar-label">支柱一 · 色彩 <i>鲜艳、碰撞——三组撞色对,黑描边统一收束,大底永远是纸色</i></div>
<div style="display:flex; gap:18px; margin-bottom:16px; align-items:flex-start;">
<div>
<div class="pair"><div style="background:#ff6b6b;"></div><div style="background:#4ecdc4;"></div></div>
<div style="font-size:9.5px; color:#6b6b6b; margin-top:4px;">撞色对 1 · coral × teal</div>
</div>
<div>
<div class="pair"><div style="background:#ffd93d;"></div><div style="background:#a78bfa;"></div></div>
<div style="font-size:9.5px; color:#6b6b6b; margin-top:4px;">撞色对 2 · mustard × violet</div>
</div>
<div>
<div class="pair"><div style="background:#ff8fab;"></div><div style="background:#5b8def;"></div></div>
<div style="font-size:9.5px; color:#6b6b6b; margin-top:4px;">撞色对 3 · pink × blue</div>
</div>
<div style="flex:1; font-size:11.5px; color:#3d3d3d; line-height:1.6; padding-top:2px;">
<b>规则</b>:相邻色块必须来自不同撞色对;<b>ink #111</b> 描边收束一切鲜艳;大面积底色只有纸色 <b>#FFF9F0</b> 与白。
</div>
</div>
<div class="pillar-label">支柱二 · 形状即语义 <i>孟菲斯形状对内容下定义,散落于空白——装饰即语义</i></div>
<div style="display:grid; grid-template-columns:repeat(7, 1fr); gap:8px; margin-bottom:16px;">
<div class="shapechip"><div class="box"><svg width="26" height="24"><path d="M13 2 L25 22 L1 22 Z" fill="#ff6b6b" stroke="#111" stroke-width="2"/></svg></div><div class="sn">▲ 靶子</div><div class="sm">目标,卡头打头</div></div>
<div class="shapechip"><div class="box"><svg width="26" height="24"><circle cx="8" cy="12" r="5" fill="#ffd93d" stroke="#111" stroke-width="2"/><circle cx="19" cy="12" r="5" fill="#fff9f0" stroke="#111" stroke-width="2"/></svg></div><div class="sn">● 积木</div><div class="sm">清单点列,实=已学</div></div>
<div class="shapechip"><div class="box"><svg width="26" height="24"><circle cx="13" cy="12" r="8" fill="none" stroke="#4ecdc4" stroke-width="4"/><circle cx="13" cy="12" r="8" fill="none" stroke="#111" stroke-width="1.5"/></svg></div><div class="sn">○ 预期</div><div class="sm">可核对的结果</div></div>
<div class="shapechip"><div class="box"><svg width="28" height="24"><path d="M2 16 q3 -12 6 0 t6 0 t6 0 t6 0" fill="none" stroke="#5b8def" stroke-width="3" stroke-linecap="round"/></svg></div><div class="sn">~ 代理区</div><div class="sm">交给 agent</div></div>
<div class="shapechip"><div class="box"><svg width="26" height="24"><rect x="2" y="8" width="22" height="8" fill="#ff8fab" stroke="#111" stroke-width="2"/></svg></div><div class="sn">▬ 价值区</div><div class="sm">就地写过程</div></div>
<div class="shapechip"><div class="box"><svg width="26" height="24"><path d="M2 18 L7 6 L12 18 L17 6 L22 18" fill="none" stroke="#ff6b6b" stroke-width="3" stroke-linejoin="round"/></svg></div><div class="sn">⌇ 脱靶</div><div class="sm">脱靶提醒,跟指派</div></div>
<div class="shapechip"><div class="box"><svg width="26" height="24"><path d="M13 3 v20 M3 13 h20" stroke="#a78bfa" stroke-width="3.5" stroke-linecap="round"/><path d="M13 3 v20 M3 13 h20" stroke="#111" stroke-width="1.2"/></svg></div><div class="sn">+ 指派</div><div class="sm">位置/预期/场景</div></div>
</div>
<div class="pillar-label">支柱三 · 卡片 <i>核心:教程的入口载体——孟菲斯骨架 + 拟物纸感,卡头三件套即靶子</i></div>
<div style="display:flex; gap:26px; margin-bottom:14px; align-items:flex-start;">
<div class="mscard" style="position:static; width:300px;">
<div class="mszone" style="background:#ff6b6b;">
<span>🌐</span>
<svg style="position:absolute; right:6px; bottom:6px;" width="18" height="18"><circle cx="9" cy="9" r="6" fill="none" stroke="#fff9f0" stroke-width="3"/><circle cx="9" cy="9" r="6" fill="none" stroke="#111" stroke-width="1.2"/></svg>
<span style="position:absolute; left:6px; top:5px; font-size:8.5px; color:#fff9f0; font-weight:700; letter-spacing:1px;">预期结果 · GIF</span>
</div>
<div class="mst">
<span class="tri"></span>
<b>快速开始</b>
<span class="dots"><i class="on"></i><i class="on"></i><i class="on"></i><i></i></span>
</div>
</div>
<div style="flex:1; font-size:11.5px; color:#3d3d3d; line-height:1.5;">
<div style="margin-bottom:7px;"><b>卡头三件套 = 靶子</b>:▲ 目标(标题旁三角)+ ○ 预期结果(16:9 相框 GIF)+ ● 积木进度(四点,实心=已学)。</div>
<div style="margin-bottom:7px;"><b>孟菲斯</b>:2px 黑描边、7px 硬投影、章节撞色只进相框。</div>
<div><b>拟物</b>:米白纸面 #FFF9F0、纸叠三层边、相框凹槽内阴影、标题压凹白影、完成=打孔票。</div>
</div>
</div>
<div class="pillar-label">支柱四 · 线条 <i>关系,不可缺——横平竖直 + R8 小圆角 + 站点半嵌卡边 + 并行不合并</i></div>
<svg width="700" height="52" viewBox="0 0 700 52">
<path class="msline" d="M 10 38 H 120 A 8 8 0 0 0 128 30 V 22 A 8 8 0 0 1 136 14 H 500"/>
<path class="msline" d="M 10 38 H 424 A 8 8 0 0 1 432 30 V 26 A 8 8 0 0 0 440 18 H 497"/>
<circle class="msstation" cx="10" cy="38" r="6" fill="#ffd93d"/>
<circle class="msstation" cx="260" cy="38" r="6" fill="#4ecdc4"/>
<rect class="msstation" x="494" y="8" width="7" height="22" rx="3.5" fill="#ff6b6b"/>
</svg>
<div style="font-size:11px; color:#6b6b6b; margin-top:4px;">黑 2.5px 实线;站点=描边圆点四色轮换、半嵌卡边;多线入同一卡口 → 胶囊(端头半圆、线止于胶囊边)。</div>
</div>
<div style="position:absolute; top: 138px; left: 948px; width: 292px;" class="panel">
<h3>决策记录</h3>
<div class="note" style="margin-bottom:6px;"><span class="idx">1</span><span class="txt"><b>为什么孟菲斯</b>:教程漫长,鲜艳与碰撞给持续的情绪燃料;形状体系天然可承载语义。</span></div>
<div class="note" style="margin-bottom:6px;"><span class="idx">2</span><span class="txt"><b>为什么拟物卡</b>:卡是拥有物——纸叠、相框与打孔票给学习以实体感。</span></div>
<div class="note" style="margin-bottom:0;"><span class="idx">3</span><span class="txt"><b>分工</b>:孟菲斯管背景与情绪,拟物管卡片与票券,黑描边统一两者。</span></div>
</div>
<div style="position:absolute; top: 400px; left: 948px; width: 292px;" class="panel">
<h3>全局规则</h3>
<div class="note" style="margin-bottom:6px;"><span class="idx">1</span><span class="txt"><b>鲜艳预算</b>:彩色只上形状、描边内与相框;大底纸色。</span></div>
<div class="note" style="margin-bottom:6px;"><span class="idx">2</span><span class="txt"><b>装饰即语义</b>:每个散落形状都必须有含义(见支柱二)。</span></div>
<div class="note" style="margin-bottom:6px;"><span class="idx">3</span><span class="txt"><b>无锁</b>:状态是推荐不是门槛——完成=打孔,未开始=无孔,卡片永远可入(死原则)。</span></div>
<div class="note" style="margin-bottom:0;"><span class="idx">4</span><span class="txt"><b>不用色彩渐变</b>:立体感靠描边、硬投影与内阴影。</span></div>
</div>
<div class="footline">设计系统 · DesignSystem · stack idealjs</div>
<div class="pagenum">01 / 02</div>
</div>
<!-- ================= P2 skill 映射 + 组合样张 ================= -->
<div class="page">
<div class="story-head">
<span class="tag">&lt;DesignSystem /&gt;</span>
<h2>系统 × ai-era-tutorial · 概念到组件的映射</h2>
<div class="desc">教程结构的每个概念都有对应的视觉组件:靶子落在卡头三件套,代理区是波浪,脱靶是之字注,指派学习是三行票——组合样张见左。</div>
</div>
<div class="canvas" style="top: 138px; left: 40px; width: 880px; height: 594px; padding: 0; overflow: hidden; background:#fff9f0;">
<svg style="position:absolute; left:0; top:0;" width="880" height="594" viewBox="0 0 880 594">
<path d="M 700 50 l 16 28 h -32 z" fill="#ffd93d" stroke="#111" stroke-width="2.5"/>
<circle cx="812" cy="96" r="8" fill="#4ecdc4" stroke="#111" stroke-width="2"/>
<circle cx="838" cy="82" r="5" fill="#ff8fab" stroke="#111" stroke-width="2"/>
<circle cx="826" cy="118" r="4" fill="#ffd93d" stroke="#111" stroke-width="2"/>
<path d="M 30 300 q 8 -22 16 0 t16 0 t16 0 t16 0" fill="none" stroke="#5b8def" stroke-width="3" stroke-linecap="round"/>
<path d="M 762 270 l 10 20 22 3 -16 15 4 22 -20 -11 -20 11 4 -22 -16 -15 22 -3 z" fill="#a78bfa" stroke="#111" stroke-width="2"/>
<path d="M 60 540 L 68 522 L 76 540 L 84 522 L 92 540" fill="none" stroke="#ff6b6b" stroke-width="3" stroke-linejoin="round"/>
<circle cx="480" cy="52" r="10" fill="none" stroke="#4ecdc4" stroke-width="4"/><circle cx="480" cy="52" r="10" fill="none" stroke="#111" stroke-width="1.5"/>
<path d="M 624 470 v22 M613 481 h22" stroke="#a78bfa" stroke-width="4" stroke-linecap="round"/><path d="M 624 470 v22 M613 481 h22" stroke="#111" stroke-width="1.2"/>
<path d="M 810 250 v20 M800 260 h20" stroke="#5b8def" stroke-width="4" stroke-linecap="round"/><path d="M 810 250 v20 M800 260 h20" stroke="#111" stroke-width="1.2"/>
<path class="msline" d="M 290 180 H 320 A 8 8 0 0 0 328 172 V 116 A 8 8 0 0 1 336 108 H 380"/>
<path class="msline" d="M 290 180 H 380"/>
<path class="msline" d="M 630 108 H 648 A 8 8 0 0 1 656 116 V 236 A 8 8 0 0 0 664 244 H 700"/>
<circle class="msstation" cx="293" cy="180" r="6" fill="#ffd93d"/>
<circle class="msstation" cx="378" cy="108" r="6" fill="#4ecdc4"/>
<circle class="msstation" cx="378" cy="180" r="6" fill="#ff8fab"/>
<rect class="msstation" x="697" y="233" width="7" height="22" rx="3.5" fill="#ff6b6b"/>
</svg>
<div class="mscard" style="left:40px; top:110px; width:250px;">
<span class="entry-badge2">①</span>
<div class="mszone" style="background:#ff6b6b;"><span>🌐</span>
<span style="position:absolute; left:6px; top:5px; font-size:8.5px; color:#fff9f0; font-weight:700; letter-spacing:1px;">预期结果 · GIF</span>
</div>
<div class="mst"><span class="tri"></span><b>快速开始</b><span class="dots"><i class="on"></i><i class="on"></i><i class="on"></i><i></i></span></div>
</div>
<div class="mscard" style="left:380px; top:44px; width:250px; transform:rotate(-1deg);">
<span class="entry-badge2">②</span>
<div class="mszone" style="background:#ff8fab;"><span>⚛️</span></div>
<div class="mst"><span class="tri"></span><b>React</b><span class="dots"><i class="on"></i><i class="on"></i><i></i><i></i></span></div>
</div>
<div class="mscard" style="left:700px; top:44px; width:140px;">
<div class="mszone" style="height:78px; background:#4ecdc4;"><span style="font-size:22px;">🔗</span></div>
<div class="mst"><span class="tri"></span><b style="font-size:12px;">全栈基础</b></div>
</div>
<div class="msticket" style="left:380px; top:250px;">
<h4>+ 指派学习 · 认知基础</h4>
<div class="row"><b>位置</b><span>包管理家族:npm 的坐标与邻居</span></div>
<div class="row"><b>预期</b><span>能说清 lockfile 锁住了什么</span></div>
<div class="row" style="margin-bottom:0;"><b>场景</b><span>加一个依赖 / 换源重装</span></div>
</div>
<div style="position:absolute; left:40px; top:420px; width:300px;">
<div style="display:flex; align-items:center; gap:8px;">
<svg width="34" height="20"><path d="M2 16 L8 4 L14 16 L20 4 L26 16 L32 4" fill="none" stroke="#ff6b6b" stroke-width="3" stroke-linejoin="round"/></svg>
<b style="font-size:12px;">脱靶提醒</b>
</div>
<div style="font-size:11px; color:#3d3d3d; line-height:1.6; margin-top:6px;">常见脱靶:装了但没跑。脱靶的样子——命令成功、页面空白;此时缺的是"真机验收"这块积木。</div>
</div>
<div style="position:absolute; left:380px; top:420px; display:flex; align-items:center; gap:8px;">
<svg width="40" height="20"><path d="M2 12 q5 -16 10 0 t10 0 t10 0" fill="none" stroke="#5b8def" stroke-width="3" stroke-linecap="round"/></svg>
<span style="font-size:11px; color:#3d3d3d;"><b>代理区</b>:安装交给 agent,只验收产物</span>
</div>
<div style="position:absolute; left:640px; top:420px; display:flex; align-items:center; gap:8px;">
<svg width="34" height="20"><rect x="2" y="6" width="30" height="9" fill="#ff8fab" stroke="#111" stroke-width="2"/></svg>
<span style="font-size:11px; color:#3d3d3d;"><b>价值区</b>:过程就地写清</span>
</div>
<div style="position:absolute; left:40px; top:562px; font-size:10.5px; color:#8a7a5c;">形状散落于空白,每个都有含义:▲ 靶子 · ● 积木 · ○ 预期 · ~ 代理区 · ▬ 价值区 · ⌇ 脱靶 · + 指派</div>
</div>
<div style="position:absolute; top: 138px; left: 948px; width: 292px;" class="panel">
<h3>概念 → 组件映射</h3>
<table class="spec">
<tr><th>skill 概念</th><th>组件</th></tr>
<tr><td class="k">靶子先行</td><td>卡头三件套:▲ 目标 + ○ 16:9 预期区 + ● 积木点列</td></tr>
<tr><td class="k">步骤=目标+验收</td><td>卡内验收行(○ 空环待勾)</td></tr>
<tr><td class="k">代理区</td><td>~ 波浪带,标注"交给 agent"</td></tr>
<tr><td class="k">价值区</td><td>▬ 实心条,过程就地展开</td></tr>
<tr><td class="k">指派学习</td><td>+ 三行票:位置 / 预期 / 场景</td></tr>
<tr><td class="k">脱靶提醒</td><td>⌇ 之字注,跟在指派后</td></tr>
<tr><td class="k">认知基础</td><td>底座纹与"真机验收"章</td></tr>
<tr><td class="k">死原则</td><td>无锁:状态=推荐,卡永远可入</td></tr>
</table>
</div>
<div style="position:absolute; top: 528px; left: 948px; width: 292px;" class="panel">
<h3>组合规则</h3>
<div class="note" style="margin-bottom:6px;"><span class="idx">1</span><span class="txt"><b>入口徽章</b> ①②③:读者画像的推荐起点,非强制。</span></div>
<div class="note" style="margin-bottom:6px;"><span class="idx">2</span><span class="txt"><b>撞色在框内</b>:章节撞色只进 16:9 相框,卡面纸色。</span></div>
<div class="note" style="margin-bottom:0;"><span class="idx">3</span><span class="txt"><b>形状不压内容</b>:散落形状只在空白,密度 ≤ 每屏 8 个。</span></div>
</div>
<div class="footline">设计系统 · DesignSystem · stack idealjs</div>
<div class="pagenum">02 / 02</div>
</div>
</body>
</html>