diff --git a/site/index.html b/site/index.html index 6597b64..28cc11c 100644 --- a/site/index.html +++ b/site/index.html @@ -57,6 +57,18 @@ --text: #eef1f8; --text-dim: #a7b0c4; --text-muted: #77809a; + /* 示意图节点面:深色下上浅下深,模拟受光 */ + --dv-card-a: rgba(30, 41, 66, 0.92); + --dv-card-b: rgba(17, 24, 44, 0.92); + --dv-sheen: rgba(255, 255, 255, 0.10); + /* 示意图玻璃面板 */ + --fig-bg: linear-gradient(165deg, rgba(30, 41, 66, 0.62), rgba(12, 18, 34, 0.72)); + --fig-border: rgba(255, 255, 255, 0.10); + --fig-shadow: rgba(0, 0, 0, 0.85); + --fig-inner-top: rgba(255, 255, 255, 0.10); + --fig-inner-bottom: rgba(0, 0, 0, 0.35); + --fig-glow: rgba(56, 189, 248, 0.10); + --fig-grain: 0.16; --code-bg: rgba(6, 10, 22, 0.85); --code-fg: #cdd3f5; --nav-bg: rgba(7, 11, 22, 0.72); @@ -83,6 +95,17 @@ --bg-card-hi: rgba(255, 255, 255, 0.9); --border: rgba(15, 23, 42, 0.10); --border-hi: rgba(37, 99, 235, 0.45); + /* 浅色下受光方向相反:上近白、下微灰 */ + --dv-card-a: rgba(255, 255, 255, 0.98); + --dv-card-b: rgba(240, 245, 253, 0.98); + --dv-sheen: rgba(255, 255, 255, 0.85); + --fig-bg: linear-gradient(165deg, rgba(255, 255, 255, 0.88), rgba(236, 242, 252, 0.92)); + --fig-border: rgba(15, 23, 42, 0.08); + --fig-shadow: rgba(15, 23, 42, 0.55); + --fig-inner-top: rgba(255, 255, 255, 0.95); + --fig-inner-bottom: rgba(15, 23, 42, 0.06); + --fig-glow: rgba(37, 99, 235, 0.08); + --fig-grain: 0.08; --text: #0d1526; --text-dim: #48546c; --text-muted: #78849a; @@ -432,45 +455,159 @@ letter-spacing: -0.01em; } .alt-copy p { margin: 0; color: var(--text-dim); line-height: 1.8; } - .alt-visual { min-width: 0; } - .alt-visual svg { width: 100%; height: auto; display: block; } + /* ── 示意图容器:玻璃面板 ── + 为什么不再把 SVG 裸放在页面上:平面矢量图形浮在平坦背景上, + 无论内部怎么画都像线框图。给一层带内高光、分层投影与颗粒的玻璃底, + 图形才像「浮在界面上」。 */ + .alt-visual { + position: relative; + min-width: 0; + padding: 1.15rem 1.15rem 0.95rem; + border-radius: var(--radius-lg); + background: var(--fig-bg); + border: 1px solid var(--fig-border); + /* 三层叠加:外投影(飘起来) + 内上高光(顶部受光) + 内下暗(厚度) */ + box-shadow: + 0 18px 40px -18px var(--fig-shadow), + 0 2px 6px -2px var(--fig-shadow), + inset 0 1px 0 var(--fig-inner-top), + inset 0 -1px 0 var(--fig-inner-bottom); + backdrop-filter: blur(8px); + -webkit-backdrop-filter: blur(8px); + overflow: hidden; + } + /* 顶部柔光:让面板有「受光面」 */ + .alt-visual::before { + content: ""; + position: absolute; + inset: -40% -10% auto -10%; + height: 70%; + background: radial-gradient(ellipse 60% 100% at 50% 0%, var(--fig-glow), transparent 70%); + pointer-events: none; + } + /* 细微颗粒:抿掉矢量图的「塑料感」 */ + .alt-visual::after { + content: ""; + position: absolute; + inset: 0; + pointer-events: none; + opacity: var(--fig-grain); + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)' opacity='0.5'/%3E%3C/svg%3E"); + } + .alt-visual svg { position: relative; z-index: 1; width: 100%; height: auto; display: block; } .dv-note { - margin: 0.6rem 0 0; + position: relative; + z-index: 1; + margin: 0.55rem 0 0; text-align: center; - font-size: 0.75rem; + font-size: 0.74rem; color: var(--text-muted); + font-family: var(--font-mono); } @media (max-width: 860px) { .alt { grid-template-columns: 1fr; gap: 1.6rem; margin-top: 2.6rem; } .alt.flip .alt-copy, .alt.flip .alt-visual { order: 0; } } + /* ── 共享 SVG defs 的取值(随主题切换)── */ + .g-card-a { stop-color: var(--dv-card-a); } + .g-card-b { stop-color: var(--dv-card-b); } + .g-cyan-a { stop-color: rgba(6, 182, 212, 0.28); } + .g-cyan-b { stop-color: rgba(6, 182, 212, 0.08); } + .g-blue-a { stop-color: rgba(59, 130, 246, 0.28); } + .g-blue-b { stop-color: rgba(59, 130, 246, 0.08); } + .g-violet-a { stop-color: rgba(139, 92, 246, 0.30); } + .g-violet-b { stop-color: rgba(139, 92, 246, 0.09); } + .g-gold-a { stop-color: rgba(245, 158, 11, 0.26); } + .g-gold-b { stop-color: rgba(245, 158, 11, 0.07); } + .g-sheen-a { stop-color: var(--dv-sheen); } + .g-sheen-b { stop-color: rgba(255, 255, 255, 0); } + .f-shadow { flood-color: rgba(0, 0, 0, 0.55); flood-opacity: 0.5; } + :root[data-theme="light"] .f-shadow { flood-color: rgba(15, 23, 42, 0.9); flood-opacity: 0.18; } + .f-glowtint { flood-color: var(--brand-cyan); flood-opacity: 0.35; } + /* ── 示意图图元 ── */ .dv-bound { fill: none; stroke: var(--border); stroke-width: 1.5; stroke-dasharray: 6 5; } - .dv-box { fill: var(--bg-card); stroke: var(--border-hi); stroke-width: 1.4; } - .dv-accent { fill: rgba(6, 182, 212, 0.10); stroke: var(--brand-cyan); } - .dv-run { fill: rgba(59, 130, 246, 0.10); stroke: var(--brand-blue); } - .dv-l4 { fill: rgba(139, 92, 246, 0.13); stroke: var(--brand-violet); } - .dv-l3 { fill: rgba(59, 130, 246, 0.11); stroke: var(--brand-blue); } - .dv-l2 { fill: rgba(6, 182, 212, 0.10); stroke: var(--brand-cyan); } - .dv-l1 { fill: rgba(245, 158, 11, 0.10); stroke: var(--brand-gold); } + /* 节点:渐变面 + 分层投影 */ + .dv-box { + fill: url(#gCard); + stroke: var(--border-hi); + stroke-width: 1.3; + filter: url(#fShadow); + transition: stroke .3s var(--ease), filter .3s var(--ease); + } + /* 悬停:描边提亮 + 光晕,证明它不是一张死的图 */ + @media (hover: hover) { + .dv-box:hover { + stroke: var(--brand-cyan); + filter: url(#fLift); + } + } + .dv-accent { fill: url(#gCyan); stroke: var(--brand-cyan); } + .dv-run { fill: url(#gBlue); stroke: var(--brand-blue); } + .dv-l4 { fill: url(#gViolet); stroke: var(--brand-violet); } + .dv-l3 { fill: url(#gBlue); stroke: var(--brand-blue); } + .dv-l2 { fill: url(#gCyan); stroke: var(--brand-cyan); } + .dv-l1 { fill: url(#gGold); stroke: var(--brand-gold); } .dv-t { fill: var(--text); font-size: 15px; font-weight: 700; text-anchor: middle; } .dv-ts { fill: var(--text); font-size: 12.5px; font-weight: 600; text-anchor: middle; } + /* 左对齐变体:L1–L4 那种「编号 + 说明」的行必须左对齐, + 用 middle 会让长的那行(L4 内核独占 · 立即打断)直接溢出框外。 */ + .dv-tsl { fill: var(--text); font-size: 12px; font-weight: 600; text-anchor: start; } .dv-s { fill: var(--text-muted); font-size: 10.5px; text-anchor: middle; } .dv-lab { fill: var(--text-dim); font-size: 11px; text-anchor: middle; } .dv-labs { fill: var(--text-muted); font-size: 9.5px; text-anchor: middle; } .dv-cap { fill: var(--text-muted); font-size: 10px; } - .dv-seg { fill: rgba(119,128,154,.07); stroke: var(--border-hi); stroke-width: 1.4; stroke-dasharray: 5 4; } - .dv-hd { fill: rgba(139,92,246,.12); stroke: var(--brand-violet); } - .dv-ar { fill: rgba(6,182,212,.09); stroke: var(--border-hi); } + .dv-seg { fill: url(#gCard); stroke: var(--border-hi); stroke-width: 1.4; } + .dv-hd { fill: url(#gViolet); stroke: var(--brand-violet); } + .dv-ar { fill: url(#gCyan); stroke: var(--border-hi); } .dv-off { fill: none; stroke: var(--border); stroke-width: 1.2; stroke-dasharray: 4 4; } .dv-offt { fill: var(--text-muted); font-size: 11.5px; text-anchor: middle; text-decoration: line-through; } .dv-no path { stroke: var(--brand-gold); stroke-width: 1.6; opacity: .85; } .dv-line { fill: none; stroke: var(--border-hi); stroke-width: 1.4; } + /* 流动的虚线:让连接线看起来「有东西在跑」而不是静止装饰 */ + .dv-dash, + .dv-arrow { animation: dashFlow 1.4s linear infinite; } + @keyframes dashFlow { to { stroke-dashoffset: -16; } } + /* 推荐:reduce 下停掉 */ + @media (prefers-reduced-motion: reduce) { + .dv-dash, .dv-arrow { animation: none; } + } .dv-dash { stroke-dasharray: 4 4; } .dv-pk { fill: none; stroke: var(--brand-gold); stroke-width: 2; } .dv-arrow { fill: none; stroke: var(--brand-cyan); stroke-width: 1.6; stroke-dasharray: 4 4; } .dv-x { fill: var(--text-muted); font-size: 10px; text-anchor: middle; } + /* 级别徽标:L1–L4 */ + .dv-badge { + fill: var(--text); + font-family: var(--font-mono); + font-size: 11.5px; + font-weight: 700; + text-anchor: start; + } + /* 右侧场景标注 */ + .dv-end { fill: var(--text-muted); font-size: 9.5px; text-anchor: end; } + /* 背景强度条:越靠上越亮,用高度表现紧迫度 */ + .dv-gauge-bg { fill: rgba(119, 128, 154, 0.07); } + .dv-g1 { fill: rgba(245, 158, 11, 0.07); } + .dv-g2 { fill: rgba(6, 182, 212, 0.07); } + .dv-g3 { fill: rgba(59, 130, 246, 0.07); } + .dv-g4 { fill: rgba(139, 92, 246, 0.10); } + /* 抢占线的起点圆点 */ + .dv-pkdot { fill: var(--brand-gold); } + .dv-pkcap { + fill: var(--brand-gold); + font-size: 9.5px; + text-anchor: middle; + letter-spacing: 0.08em; + } + @media (prefers-reduced-motion: no-preference) { + .dv-pkdot { animation: pkPulse 1.8s ease-in-out infinite; } + @keyframes pkPulse { + 0%, 100% { opacity: 1; r: 3.5; } + 50% { opacity: .55; r: 4.5; } + } + } /* ── 三层记忆:用品牌三色 ── */ .layers { display: grid; gap: 0.9rem; } @@ -1447,6 +1584,59 @@ + + +
- - - L4 内核独占 · 立即打断 - - L3 高优先级 - - L2 重要 - - L1 可等 + + + + + + + + + - 高 → 低 - - 正在跑 - 现场压栈 - - 抢占 → 稍后恢复 + + + + + L4 + 内核独占 · 立即打断 + panic + + + L3 + 需及时处理 + 交互 + + + L2 + 消息类 + QQ / 邮件 + + + L1 + 完全可等 + 批量任务 + + + + + + 抢占 + + + 正在跑的任务 + 被抢占 + 现场压入中断栈 · 稍后从栈顶原样恢复