259 lines
19 KiB
HTML
259 lines
19 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="UTF-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||
<title>Spectra Lab</title>
|
||
<meta
|
||
name="description"
|
||
content="Spectra Lab — Tailwind 驱动的响应式编辑感页面,强调一致的对齐系统与克制交互。"
|
||
/>
|
||
<script>
|
||
if (location.pathname === '/spectra-lab') {
|
||
location.replace('/spectra-lab/' + location.search + location.hash);
|
||
}
|
||
</script>
|
||
<link rel="preconnect" href="https://fonts.googleapis.cn" />
|
||
<link rel="preconnect" href="https://fonts.gstatic.cn" crossorigin />
|
||
<link
|
||
href="https://fonts.googleapis.cn/css2?family=Inter:wght@400;500;600;700;800&family=Noto+Serif+SC:wght@500;700&display=swap"
|
||
rel="stylesheet"
|
||
/>
|
||
<link rel="stylesheet" href="styles.css" />
|
||
</head>
|
||
<body>
|
||
<div class="shell">
|
||
<header class="site-header">
|
||
<div class="site-header__inner">
|
||
<a class="inline-flex items-center gap-3 text-[0.95rem] font-bold uppercase tracking-[0.15em]" href="#top" aria-label="Spectra Lab 首页">
|
||
<span class="h-[10px] w-[10px] rounded-full bg-[color:var(--accent)] shadow-[0_0_0_6px_var(--accent-soft)]"></span>
|
||
<span>Spectra Lab</span>
|
||
</a>
|
||
<nav class="hidden items-center gap-5 text-sm md:flex">
|
||
<a class="muted hover:text-[color:var(--text)]" href="#statement">Statement</a>
|
||
<a class="muted hover:text-[color:var(--text)]" href="#works">Works</a>
|
||
<a class="muted hover:text-[color:var(--text)]" href="#system">System</a>
|
||
<a class="muted hover:text-[color:var(--text)]" href="#components">Components</a>
|
||
<a class="muted hover:text-[color:var(--text)]" href="#closing">Closing</a>
|
||
</nav>
|
||
<button
|
||
id="modeToggle"
|
||
class="mode-toggle w-fit border border-[color:var(--line)] px-3 py-2 text-sm text-[color:var(--muted)] transition hover:border-[color:var(--line-strong)] hover:bg-[color:var(--accent-soft)] hover:text-[color:var(--text)]"
|
||
type="button"
|
||
aria-label="切换页面模式"
|
||
>
|
||
Light Mode
|
||
</button>
|
||
</div>
|
||
</header>
|
||
|
||
<div class="grid-overlay" aria-hidden="true"></div>
|
||
|
||
<main id="top" class="relative z-10 space-y-9 pb-6 md:space-y-12">
|
||
<section class="hero reveal space-y-6 pt-2 md:space-y-8">
|
||
<div class="flex flex-col gap-2 border-t border-[color:var(--line)] pt-3 md:flex-row md:items-baseline md:justify-between">
|
||
<p class="smallcaps">Front-end concept / 2026</p>
|
||
<p class="smallcaps">Issue 03 — Tailwind Adaptive Pass</p>
|
||
</div>
|
||
|
||
<div class="grid gap-6 border-t border-[color:var(--line)] pt-6 md:grid-cols-12 md:gap-6">
|
||
<div class="md:col-span-8">
|
||
<h1 class="font-serif text-[2.4rem] font-bold leading-[1.05] tracking-[-0.03em] md:text-[4.3rem] lg:text-[5.8rem]">
|
||
用 Tailwind 重建响应式秩序,
|
||
让你看到的和我看到的一样。
|
||
</h1>
|
||
<p class="mt-6 max-w-3xl text-[1.02rem] leading-[1.82] muted">
|
||
这轮把布局体系切到 Tailwind:栅格、间距、断点、组件状态全部落成可复用的响应式规则。核心目标不是“更炫”,而是减少端侧渲染差异,让真实线上观感更稳定地贴近验收截图。
|
||
</p>
|
||
</div>
|
||
<aside class="ui-card md:col-span-4 md:col-start-10 p-5 self-end">
|
||
<p class="text-[0.96rem] leading-[1.75] muted">
|
||
如果页面精细度只存在于截图里,那不是设计成功。真正成功是:你打开线上站,看到的质感能稳定复现。
|
||
</p>
|
||
</aside>
|
||
</div>
|
||
|
||
<div class="grid gap-4 border-t border-[color:var(--line)] pt-6 md:grid-cols-3">
|
||
<article class="ui-card p-5">
|
||
<span class="smallcaps">Layout system</span>
|
||
<p class="mt-3 text-[1rem] leading-[1.7]">Tailwind 断点统一驱动容器、列宽和间距,不再靠手写规则散点拼接。</p>
|
||
</article>
|
||
<article class="ui-card p-5">
|
||
<span class="smallcaps">Visual consistency</span>
|
||
<p class="mt-3 text-[1rem] leading-[1.7]">边框、材质、阴影和状态样式拆成组件类,减少页面局部漂移。</p>
|
||
</article>
|
||
<article class="ui-card p-5">
|
||
<span class="smallcaps">Interaction parity</span>
|
||
<p class="mt-3 text-[1rem] leading-[1.7]">交互钩子保持不变,行为和视觉在不同设备上更可预测。</p>
|
||
</article>
|
||
</div>
|
||
</section>
|
||
|
||
<section id="statement" class="section reveal space-y-6">
|
||
<div class="border-t border-[color:var(--line)] pt-3">
|
||
<p class="smallcaps">Statement</p>
|
||
<h2 class="mt-3 max-w-4xl font-serif text-[1.9rem] leading-[1.18] tracking-[-0.02em] md:text-[3rem]">先收敛系统,再追求惊艳,页面才不会忽好忽坏。</h2>
|
||
</div>
|
||
<div class="grid gap-6 border-t border-[color:var(--line)] pt-6 md:grid-cols-2">
|
||
<p class="leading-[1.82] muted">你说“页面看起来不如截图好”,这个反馈很关键。它通常不是单个颜色问题,而是样式体系在不同环境下的稳定性不够。Tailwind 的价值就在于把这些变化收敛到确定的 utility + 断点规则里。</p>
|
||
<p class="leading-[1.82] muted">所以这版会优先保证不同屏幕尺寸下的排版和边界一致,再叠加动效和组件互动。先把基础稳定性拉起来,精细感才不会随机消失。</p>
|
||
</div>
|
||
</section>
|
||
|
||
<section id="works" class="section reveal space-y-6">
|
||
<div class="flex flex-col gap-3 border-t border-[color:var(--line)] pt-3 md:flex-row md:items-end md:justify-between">
|
||
<div>
|
||
<p class="smallcaps">Selected Works</p>
|
||
<h2 class="mt-3 max-w-4xl font-serif text-[1.9rem] leading-[1.18] tracking-[-0.02em] md:text-[3rem]">四个切片,展示这页的结构与质感。</h2>
|
||
</div>
|
||
<p class="text-sm muted">点击左侧卡片,右侧说明会联动更新。</p>
|
||
</div>
|
||
|
||
<div class="grid gap-6 border-t border-[color:var(--line)] pt-6 md:grid-cols-12">
|
||
<div class="work-list grid gap-3 md:col-span-5" role="tablist" aria-label="设计切片列表">
|
||
<button class="work-item ui-card is-active grid grid-cols-[44px_1fr] gap-3 p-4 text-left transition hover:translate-x-1 hover:border-[color:var(--line-strong)] hover:bg-[color:var(--accent-soft)]" type="button" aria-selected="true" data-title="Opening Spread" data-index="01" data-copy="首页像一本刊物的开篇大跨页:不是堆特效,而是用标题、说明、细线和留白一起建立一眼可感知的秩序。">
|
||
<span class="work-number text-xs tracking-[0.14em] muted">01</span>
|
||
<span><strong class="block text-[1.05rem]">Opening Spread</strong><small class="text-sm muted">封面感与主次节奏</small></span>
|
||
</button>
|
||
<button class="work-item ui-card grid grid-cols-[44px_1fr] gap-3 p-4 text-left transition hover:translate-x-1 hover:border-[color:var(--line-strong)] hover:bg-[color:var(--accent-soft)]" type="button" aria-selected="false" data-title="Quiet Contrast" data-index="02" data-copy="对比来自字重、列宽、材质与边界,而不是夸张颜色。暗红只作为标记,不作为表演。">
|
||
<span class="work-number text-xs tracking-[0.14em] muted">02</span>
|
||
<span><strong class="block text-[1.05rem]">Quiet Contrast</strong><small class="text-sm muted">克制色彩,而非堆叠效果</small></span>
|
||
</button>
|
||
<button class="work-item ui-card grid grid-cols-[44px_1fr] gap-3 p-4 text-left transition hover:translate-x-1 hover:border-[color:var(--line-strong)] hover:bg-[color:var(--accent-soft)]" type="button" aria-selected="false" data-title="Measured Motion" data-index="03" data-copy="动效只承担两件事:提示切换、改善触感。页面不会为了证明自己会动而到处动。">
|
||
<span class="work-number text-xs tracking-[0.14em] muted">03</span>
|
||
<span><strong class="block text-[1.05rem]">Measured Motion</strong><small class="text-sm muted">把运动当作排版的一部分</small></span>
|
||
</button>
|
||
<button class="work-item ui-card grid grid-cols-[44px_1fr] gap-3 p-4 text-left transition hover:translate-x-1 hover:border-[color:var(--line-strong)] hover:bg-[color:var(--accent-soft)]" type="button" aria-selected="false" data-title="Material Ending" data-index="04" data-copy="结尾像一页真正收住的落版:不抢戏、不吵闹,只让页面在最后留下明确的材质与余味。">
|
||
<span class="work-number text-xs tracking-[0.14em] muted">04</span>
|
||
<span><strong class="block text-[1.05rem]">Material Ending</strong><small class="text-sm muted">收尾比开始更能决定完成度</small></span>
|
||
</button>
|
||
</div>
|
||
|
||
<article class="work-stage md:col-span-7">
|
||
<div class="stage-card ui-card relative overflow-hidden p-6 md:p-8">
|
||
<p class="smallcaps">Current focus</p>
|
||
<div id="workIndex" class="mt-3 text-[3.6rem] leading-[0.95] md:text-[6.3rem] text-[color:color-mix(in_srgb,var(--accent)_74%,var(--text)_26%)]">01</div>
|
||
<h3 id="workTitle" class="font-serif text-[1.8rem] leading-tight md:text-[2.5rem]">Opening Spread</h3>
|
||
<p id="workCopy" class="mt-3 leading-[1.8] muted">首页像一本刊物的开篇大跨页:不是堆特效,而是用标题、说明、细线和留白一起建立一眼可感知的秩序。</p>
|
||
</div>
|
||
</article>
|
||
</div>
|
||
</section>
|
||
|
||
<section id="system" class="section reveal space-y-6">
|
||
<div class="border-t border-[color:var(--line)] pt-3">
|
||
<p class="smallcaps">System</p>
|
||
<h2 class="mt-3 max-w-4xl font-serif text-[1.9rem] leading-[1.18] tracking-[-0.02em] md:text-[3rem]">Tailwind 驱动的响应式系统,确保视觉稳定落地。</h2>
|
||
</div>
|
||
<div class="grid gap-4 border-t border-[color:var(--line)] pt-6 md:grid-cols-3">
|
||
<article class="ui-card p-5"><span class="smallcaps">Typography</span><p class="mt-3 text-[1rem] leading-[1.7] muted">衬线标题 + 无衬线正文,结构层次稳定且阅读负担更低。</p></article>
|
||
<article class="ui-card p-5"><span class="smallcaps">Adaptive spacing</span><p class="mt-3 text-[1rem] leading-[1.7] muted">间距通过断点阶梯控制,避免在手机端失衡、在桌面端发散。</p></article>
|
||
<article class="ui-card p-5"><span class="smallcaps">State style</span><p class="mt-3 text-[1rem] leading-[1.7] muted">选中、hover、联动反馈统一收口到组件状态,不再零散散落。</p></article>
|
||
</div>
|
||
</section>
|
||
|
||
<section id="components" class="section reveal space-y-6">
|
||
<div class="flex flex-col gap-3 border-t border-[color:var(--line)] pt-3 md:flex-row md:items-end md:justify-between">
|
||
<div>
|
||
<p class="smallcaps">Components</p>
|
||
<h2 class="mt-3 max-w-4xl font-serif text-[1.9rem] leading-[1.18] tracking-[-0.02em] md:text-[3rem]">交互组件区:可切换、可反馈、可验证。</h2>
|
||
</div>
|
||
<p class="text-sm muted">这块用于直接验证响应式组件的一致性。</p>
|
||
</div>
|
||
|
||
<div class="grid gap-6 border-t border-[color:var(--line)] pt-6 md:grid-cols-12">
|
||
<div class="control-panel ui-card grid gap-5 p-5 md:col-span-5">
|
||
<div class="grid gap-2">
|
||
<p class="smallcaps">Layout tone</p>
|
||
<div class="flex flex-wrap gap-2" role="tablist" aria-label="布局语气切换">
|
||
<button class="tone-chip is-active border border-[color:var(--line)] px-3 py-2 text-sm transition hover:border-[color:var(--line-strong)] hover:bg-[color:var(--accent-soft)]" type="button" data-tone="quiet">Quiet</button>
|
||
<button class="tone-chip border border-[color:var(--line)] px-3 py-2 text-sm transition hover:border-[color:var(--line-strong)] hover:bg-[color:var(--accent-soft)]" type="button" data-tone="balanced">Balanced</button>
|
||
<button class="tone-chip border border-[color:var(--line)] px-3 py-2 text-sm transition hover:border-[color:var(--line-strong)] hover:bg-[color:var(--accent-soft)]" type="button" data-tone="dramatic">Dramatic</button>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="grid gap-2">
|
||
<label class="smallcaps" for="densityRange">Information density</label>
|
||
<input id="densityRange" class="density-range w-full accent-[color:var(--accent)]" type="range" min="1" max="3" step="1" value="2" />
|
||
<div class="flex items-center justify-between text-xs muted">
|
||
<span>Airy</span><span id="densityValue">Balanced</span><span>Dense</span>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="grid gap-2">
|
||
<p class="smallcaps">Material accent</p>
|
||
<div class="flex flex-wrap gap-2">
|
||
<button class="swatch is-active h-8 w-8 rounded-full border border-[color:var(--line)] shadow-[inset_0_0_0_4px_rgba(255,255,255,0.08)]" type="button" data-accent="#7f2f2f" style="--swatch:#7f2f2f;background:var(--swatch)"></button>
|
||
<button class="swatch h-8 w-8 rounded-full border border-[color:var(--line)] shadow-[inset_0_0_0_4px_rgba(255,255,255,0.08)]" type="button" data-accent="#3f5a73" style="--swatch:#3f5a73;background:var(--swatch)"></button>
|
||
<button class="swatch h-8 w-8 rounded-full border border-[color:var(--line)] shadow-[inset_0_0_0_4px_rgba(255,255,255,0.08)]" type="button" data-accent="#6c6250" style="--swatch:#6c6250;background:var(--swatch)"></button>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="grid gap-2">
|
||
<p class="smallcaps">Editorial notes</p>
|
||
<div class="grid gap-2">
|
||
<button class="note-item is-active border border-[color:var(--line)] px-3 py-2 text-left text-sm transition hover:border-[color:var(--line-strong)] hover:bg-[color:var(--accent-soft)]" type="button" data-note="封面对齐决定第一印象。">封面对齐决定第一印象。</button>
|
||
<button class="note-item border border-[color:var(--line)] px-3 py-2 text-left text-sm transition hover:border-[color:var(--line-strong)] hover:bg-[color:var(--accent-soft)]" type="button" data-note="组件数量增加后,更需要统一边框逻辑。">组件数量增加后,更需要统一边框逻辑。</button>
|
||
<button class="note-item border border-[color:var(--line)] px-3 py-2 text-left text-sm transition hover:border-[color:var(--line-strong)] hover:bg-[color:var(--accent-soft)]" type="button" data-note="交互反馈应该像纸页翻动,而不是界面在炫耀。">交互反馈应该像纸页翻动,而不是界面在炫耀。</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="preview-panel grid gap-4 md:col-span-7">
|
||
<div id="previewCard" class="preview-card ui-card p-5 md:p-6" data-tone="balanced" data-density="2">
|
||
<div class="flex flex-col gap-1 border-b border-[color:var(--line)] pb-3 text-xs uppercase tracking-[0.16em] muted sm:flex-row sm:items-center sm:justify-between">
|
||
<span id="previewTone">Balanced tone</span>
|
||
<span id="previewDensity">Density 02</span>
|
||
</div>
|
||
<div class="py-5 md:py-7">
|
||
<p class="smallcaps">Live editorial specimen</p>
|
||
<h3 id="previewTitle" class="mt-3 font-serif text-[1.65rem] leading-tight md:text-[2.1rem]">A layout that knows where to stop.</h3>
|
||
<p id="previewText" class="mt-3 leading-[1.8] muted">这一块不是静态说明,而是一张会随着交互变化的样张:它会根据布局语气、信息密度与材料色点,实时调整状态。</p>
|
||
</div>
|
||
<div class="flex flex-col gap-2 border-t border-[color:var(--line)] pt-3 text-xs uppercase tracking-[0.16em] muted sm:flex-row sm:items-center sm:justify-between">
|
||
<span id="previewAccentLabel">Accent / Oxblood</span>
|
||
<strong id="previewNote" class="max-w-[30ch] text-[11px] font-semibold normal-case tracking-normal text-[color:var(--text)]">封面对齐决定第一印象。</strong>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="grid gap-3">
|
||
<details class="mini-module ui-card p-4" open>
|
||
<summary class="smallcaps cursor-pointer">Spacing rule</summary>
|
||
<p class="mt-2 text-sm leading-[1.75] muted">所有主要模块共享统一的竖向节奏,避免 section 间呼吸不一致。</p>
|
||
</details>
|
||
<details class="mini-module ui-card p-4">
|
||
<summary class="smallcaps cursor-pointer">Border rule</summary>
|
||
<p class="mt-2 text-sm leading-[1.75] muted">边框只在建立层级时出现,不再无差别包裹全部区域。</p>
|
||
</details>
|
||
<details class="mini-module ui-card p-4">
|
||
<summary class="smallcaps cursor-pointer">Motion rule</summary>
|
||
<p class="mt-2 text-sm leading-[1.75] muted">交互动画只做提示,不做夸张炫技。</p>
|
||
</details>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section id="closing" class="section reveal">
|
||
<div class="rounded-none border border-[rgba(0,0,0,0.08)] bg-[color:var(--paper)] p-6 text-[color:var(--ink)] shadow-soft md:p-9">
|
||
<p class="smallcaps text-[rgba(20,20,20,0.72)]">Closing</p>
|
||
<h2 class="mt-3 max-w-4xl font-serif text-[1.9rem] leading-[1.18] tracking-[-0.02em] md:text-[3rem]">引入 Tailwind 之后,页面在不同端的表现更可控、更一致。</h2>
|
||
<p class="mt-4 max-w-4xl leading-[1.82] text-[rgba(20,20,20,0.72)]">这一版核心不是换皮,而是让响应式策略和组件状态都进入标准化轨道。你再看线上效果时,看到的会更接近我本地验收看到的实际结果。</p>
|
||
<div class="mt-6 flex flex-col gap-2 border-t border-[rgba(20,20,20,0.12)] pt-4 text-xs uppercase tracking-[0.16em] text-[rgba(20,20,20,0.72)] sm:flex-row sm:items-center sm:justify-between">
|
||
<span>Spectra Lab / Tailwind adaptive pass</span>
|
||
<span>Built for layout parity.</span>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</main>
|
||
|
||
<footer class="reveal mt-4 flex flex-col gap-1 border-t border-[color:var(--line)] pt-4 text-sm muted sm:flex-row sm:items-center sm:justify-between">
|
||
<span>Spectra Lab</span>
|
||
<span id="modeLabel">Editorial Dark</span>
|
||
</footer>
|
||
</div>
|
||
|
||
<script src="app.js"></script>
|
||
</body>
|
||
</html>
|