feat: elevate spectra lab editorial polish
All checks were successful
Deploy / deploy (push) Successful in 1s

This commit is contained in:
Chen Gu
2026-04-25 17:54:36 +08:00
parent 385994ca46
commit 414164a28d
3 changed files with 117 additions and 41 deletions

View File

@@ -51,38 +51,38 @@
<main id="top" class="relative z-10 space-y-9 pb-6 md:space-y-12"> <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"> <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"> <div class="section-rule flex flex-col gap-2 pt-3 md:flex-row md:items-baseline md:justify-between">
<p class="smallcaps">Front-end concept / 2026</p> <p class="smallcaps">Front-end concept / 2026</p>
<p class="smallcaps">Issue 03 — Tailwind Adaptive Pass</p> <p class="smallcaps">Issue 03 — Tailwind Adaptive Pass</p>
</div> </div>
<div class="grid gap-6 border-t border-[color:var(--line)] pt-6 md:grid-cols-12 md:gap-6"> <div class="section-rule grid gap-6 pt-6 md:grid-cols-12 md:gap-6">
<div class="md:col-span-8"> <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]"> <h1 class="section-title max-w-[11ch] font-serif text-[2.4rem] font-bold leading-[1.02] md:text-[4.15rem] lg:text-[5.45rem]">
用 Tailwind 重建响应式秩序, 用 Tailwind 重建响应式秩序,
让你看到的和我看到的一样。 让你看到的和我看到的一样。
</h1> </h1>
<p class="mt-6 max-w-3xl text-[1.02rem] leading-[1.82] muted"> <p class="lede mt-6 text-[1.01rem] leading-[1.9] muted">
这轮把布局体系切到 Tailwind栅格、间距、断点、组件状态全部落成可复用的响应式规则。核心目标不是“更炫”而是减少端侧渲染差异让真实线上观感更稳定地贴近验收截图。 这轮把布局体系切到 Tailwind栅格、间距、断点、组件状态全部落成可复用的响应式规则。核心目标不是“更炫”而是减少端侧渲染差异让真实线上观感更稳定地贴近验收截图。
</p> </p>
</div> </div>
<aside class="ui-card md:col-span-4 md:col-start-10 p-5 self-end"> <aside class="ui-card card-tight md:col-span-4 md:col-start-10 p-5 self-end">
<p class="text-[0.96rem] leading-[1.75] muted"> <p class="text-[0.96rem] leading-[1.75] muted">
如果页面精细度只存在于截图里,那不是设计成功。真正成功是:你打开线上站,看到的质感能稳定复现。 如果页面精细度只存在于截图里,那不是设计成功。真正成功是:你打开线上站,看到的质感能稳定复现。
</p> </p>
</aside> </aside>
</div> </div>
<div class="grid gap-4 border-t border-[color:var(--line)] pt-6 md:grid-cols-3"> <div class="section-rule grid gap-4 pt-6 md:grid-cols-3">
<article class="ui-card p-5"> <article class="ui-card card-tight p-5">
<span class="smallcaps">Layout system</span> <span class="smallcaps">Layout system</span>
<p class="mt-3 text-[1rem] leading-[1.7]">Tailwind 断点统一驱动容器、列宽和间距,不再靠手写规则散点拼接。</p> <p class="mt-3 text-[1rem] leading-[1.7]">Tailwind 断点统一驱动容器、列宽和间距,不再靠手写规则散点拼接。</p>
</article> </article>
<article class="ui-card p-5"> <article class="ui-card card-tight p-5">
<span class="smallcaps">Visual consistency</span> <span class="smallcaps">Visual consistency</span>
<p class="mt-3 text-[1rem] leading-[1.7]">边框、材质、阴影和状态样式拆成组件类,减少页面局部漂移。</p> <p class="mt-3 text-[1rem] leading-[1.7]">边框、材质、阴影和状态样式拆成组件类,减少页面局部漂移。</p>
</article> </article>
<article class="ui-card p-5"> <article class="ui-card card-tight p-5">
<span class="smallcaps">Interaction parity</span> <span class="smallcaps">Interaction parity</span>
<p class="mt-3 text-[1rem] leading-[1.7]">交互钩子保持不变,行为和视觉在不同设备上更可预测。</p> <p class="mt-3 text-[1rem] leading-[1.7]">交互钩子保持不变,行为和视觉在不同设备上更可预测。</p>
</article> </article>
@@ -90,40 +90,40 @@
</section> </section>
<section id="statement" class="section reveal space-y-6"> <section id="statement" class="section reveal space-y-6">
<div class="border-t border-[color:var(--line)] pt-3"> <div class="section-rule pt-3">
<p class="smallcaps">Statement</p> <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> <h2 class="section-title mt-3 max-w-[18ch] font-serif text-[1.85rem] leading-[1.14] md:text-[2.85rem]">先收敛系统,再追求惊艳,页面才不会忽好忽坏。</h2>
</div> </div>
<div class="grid gap-6 border-t border-[color:var(--line)] pt-6 md:grid-cols-2"> <div class="section-rule grid gap-6 pt-6 md:grid-cols-2">
<p class="leading-[1.82] muted">你说“页面看起来不如截图好”这个反馈很关键。它通常不是单个颜色问题而是样式体系在不同环境下的稳定性不够。Tailwind 的价值就在于把这些变化收敛到确定的 utility + 断点规则里。</p> <p class="lede leading-[1.88] muted">你说“页面看起来不如截图好”这个反馈很关键。它通常不是单个颜色问题而是样式体系在不同环境下的稳定性不够。Tailwind 的价值就在于把这些变化收敛到确定的 utility + 断点规则里。</p>
<p class="leading-[1.82] muted">所以这版会优先保证不同屏幕尺寸下的排版和边界一致,再叠加动效和组件互动。先把基础稳定性拉起来,精细感才不会随机消失。</p> <p class="lede leading-[1.88] muted">所以这版会优先保证不同屏幕尺寸下的排版和边界一致,再叠加动效和组件互动。先把基础稳定性拉起来,精细感才不会随机消失。</p>
</div> </div>
</section> </section>
<section id="works" class="section reveal space-y-6"> <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 class="section-rule flex flex-col gap-3 pt-3 md:flex-row md:items-end md:justify-between">
<div> <div>
<p class="smallcaps">Selected Works</p> <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> <h2 class="section-title mt-3 max-w-[16ch] font-serif text-[1.85rem] leading-[1.14] md:text-[2.85rem]">四个切片,展示这页的结构与质感。</h2>
</div> </div>
<p class="text-sm muted">点击左侧卡片,右侧说明会联动更新。</p> <p class="text-sm muted">点击左侧卡片,右侧说明会联动更新。</p>
</div> </div>
<div class="grid gap-6 border-t border-[color:var(--line)] pt-6 md:grid-cols-12"> <div class="section-rule grid gap-6 pt-6 md:grid-cols-12">
<div class="work-list grid gap-3 md:col-span-5" role="tablist" aria-label="设计切片列表"> <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="首页像一本刊物的开篇大跨页:不是堆特效,而是用标题、说明、细线和留白一起建立一眼可感知的秩序。"> <button class="work-item ui-card card-tight is-active grid grid-cols-[44px_1fr] gap-3 p-4 text-left 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 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> <span><strong class="block text-[1.05rem]">Opening Spread</strong><small class="text-sm muted">封面感与主次节奏</small></span>
</button> </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="对比来自字重、列宽、材质与边界,而不是夸张颜色。暗红只作为标记,不作为表演。"> <button class="work-item ui-card card-tight grid grid-cols-[44px_1fr] gap-3 p-4 text-left 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 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> <span><strong class="block text-[1.05rem]">Quiet Contrast</strong><small class="text-sm muted">克制色彩,而非堆叠效果</small></span>
</button> </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="动效只承担两件事:提示切换、改善触感。页面不会为了证明自己会动而到处动。"> <button class="work-item ui-card card-tight grid grid-cols-[44px_1fr] gap-3 p-4 text-left 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 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> <span><strong class="block text-[1.05rem]">Measured Motion</strong><small class="text-sm muted">把运动当作排版的一部分</small></span>
</button> </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="结尾像一页真正收住的落版:不抢戏、不吵闹,只让页面在最后留下明确的材质与余味。"> <button class="work-item ui-card card-tight grid grid-cols-[44px_1fr] gap-3 p-4 text-left 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 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> <span><strong class="block text-[1.05rem]">Material Ending</strong><small class="text-sm muted">收尾比开始更能决定完成度</small></span>
</button> </button>
@@ -141,28 +141,28 @@
</section> </section>
<section id="system" class="section reveal space-y-6"> <section id="system" class="section reveal space-y-6">
<div class="border-t border-[color:var(--line)] pt-3"> <div class="section-rule pt-3">
<p class="smallcaps">System</p> <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> <h2 class="section-title mt-3 max-w-[16ch] font-serif text-[1.85rem] leading-[1.14] md:text-[2.85rem]">Tailwind 驱动的响应式系统,确保视觉稳定落地。</h2>
</div> </div>
<div class="grid gap-4 border-t border-[color:var(--line)] pt-6 md:grid-cols-3"> <div class="section-rule grid gap-4 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 card-tight p-5"><span class="smallcaps">Typography</span><p class="mt-3 text-[1rem] leading-[1.76] 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 card-tight p-5"><span class="smallcaps">Adaptive spacing</span><p class="mt-3 text-[1rem] leading-[1.76] 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> <article class="ui-card card-tight p-5"><span class="smallcaps">State style</span><p class="mt-3 text-[1rem] leading-[1.76] muted">选中、hover、联动反馈统一收口到组件状态不再零散散落。</p></article>
</div> </div>
</section> </section>
<section id="components" class="section reveal space-y-6"> <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 class="section-rule flex flex-col gap-3 pt-3 md:flex-row md:items-end md:justify-between">
<div> <div>
<p class="smallcaps">Components</p> <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> <h2 class="section-title mt-3 max-w-[18ch] font-serif text-[1.85rem] leading-[1.14] md:text-[2.85rem]">组件区做成一页真实样张,而不是功能展示板</h2>
</div> </div>
<p class="text-sm muted">块用于直接验证响应式组件的一致性</p> <p class="text-sm muted">里既要能交互,也要像真正可以交付的品牌样张</p>
</div> </div>
<div class="grid gap-6 border-t border-[color:var(--line)] pt-6 md:grid-cols-12"> <div class="section-rule grid gap-6 pt-6 md:grid-cols-12">
<div class="control-panel ui-card grid gap-5 p-5 md:col-span-5"> <div class="control-panel ui-card card-tight grid gap-5 p-5 md:col-span-5">
<div class="grid gap-2"> <div class="grid gap-2">
<p class="smallcaps">Layout tone</p> <p class="smallcaps">Layout tone</p>
<div class="flex flex-wrap gap-2" role="tablist" aria-label="布局语气切换"> <div class="flex flex-wrap gap-2" role="tablist" aria-label="布局语气切换">
@@ -200,15 +200,36 @@
</div> </div>
<div class="preview-panel grid gap-4 md:col-span-7"> <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="editorial-sheet ui-card p-5 md:p-6">
<div class="flex flex-col gap-6 md:flex-row md:items-start md:justify-between">
<div>
<p class="editorial-kicker">Issue note / editorial specimen</p>
<h3 class="section-title mt-3 max-w-[14ch] font-serif text-[1.5rem] leading-[1.12] md:text-[2rem]">同一套规则,应该在不同屏幕上都维持住版式气质。</h3>
</div>
<div class="min-w-[180px] border-l-0 pt-0 text-sm muted md:border-l md:border-[color:var(--line)] md:pl-5">
<p>Material study</p>
<p class="mt-2 editorial-note">更少的边框噪音,更稳定的段落宽度,更克制的层级阴影。</p>
</div>
</div>
<div class="editorial-spec mt-6 grid gap-4 py-4 md:grid-cols-[1.2fr_0.8fr] md:gap-6">
<p class="editorial-note">这一块不再只是“预览卡片”,而是模拟真实交付时的版心、旁注与状态信息如何共存。它需要可读,也要足够安静。</p>
<div class="grid gap-2 text-xs uppercase tracking-[0.16em] muted">
<span>Responsive parity</span>
<span>Quiet material</span>
<span>Editorial pacing</span>
</div>
</div>
</div>
<div id="previewCard" class="preview-card stage-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"> <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="previewTone">Balanced tone</span>
<span id="previewDensity">Density 02</span> <span id="previewDensity">Density 02</span>
</div> </div>
<div class="py-5 md:py-7"> <div class="py-5 md:py-7">
<p class="smallcaps">Live editorial specimen</p> <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> <h3 id="previewTitle" class="section-title mt-3 max-w-[14ch] font-serif text-[1.6rem] leading-[1.12] md:text-[2rem]">A layout that knows where to stop.</h3>
<p id="previewText" class="mt-3 leading-[1.8] muted">这一块不是静态说明,而是一张会随着交互变化的样张:它会根据布局语气、信息密度与材料色点,实时调整状态。</p> <p id="previewText" class="lede mt-3 leading-[1.86] muted">这一块不是静态说明,而是一张会随着交互变化的样张:它会根据布局语气、信息密度与材料色点,实时调整状态。</p>
</div> </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"> <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> <span id="previewAccentLabel">Accent / Oxblood</span>
@@ -217,15 +238,15 @@
</div> </div>
<div class="grid gap-3"> <div class="grid gap-3">
<details class="mini-module ui-card p-4" open> <details class="mini-module ui-card card-tight p-4" open>
<summary class="smallcaps cursor-pointer">Spacing rule</summary> <summary class="smallcaps cursor-pointer">Spacing rule</summary>
<p class="mt-2 text-sm leading-[1.75] muted">所有主要模块共享统一的竖向节奏,避免 section 间呼吸不一致。</p> <p class="mt-2 text-sm leading-[1.75] muted">所有主要模块共享统一的竖向节奏,避免 section 间呼吸不一致。</p>
</details> </details>
<details class="mini-module ui-card p-4"> <details class="mini-module ui-card card-tight p-4">
<summary class="smallcaps cursor-pointer">Border rule</summary> <summary class="smallcaps cursor-pointer">Border rule</summary>
<p class="mt-2 text-sm leading-[1.75] muted">边框只在建立层级时出现,不再无差别包裹全部区域。</p> <p class="mt-2 text-sm leading-[1.75] muted">边框只在建立层级时出现,不再无差别包裹全部区域。</p>
</details> </details>
<details class="mini-module ui-card p-4"> <details class="mini-module ui-card card-tight p-4">
<summary class="smallcaps cursor-pointer">Motion rule</summary> <summary class="smallcaps cursor-pointer">Motion rule</summary>
<p class="mt-2 text-sm leading-[1.75] muted">交互动画只做提示,不做夸张炫技。</p> <p class="mt-2 text-sm leading-[1.75] muted">交互动画只做提示,不做夸张炫技。</p>
</details> </details>

View File

@@ -51,6 +51,20 @@ body.light-mode {
@apply relative mx-auto w-[min(1320px,calc(100%-24px))] md:w-[min(1320px,calc(100%-48px))] pb-10; @apply relative mx-auto w-[min(1320px,calc(100%-24px))] md:w-[min(1320px,calc(100%-48px))] pb-10;
} }
.section-rule {
border-top: 1px solid var(--line);
}
.section-title {
text-wrap: balance;
letter-spacing: -0.028em;
}
.lede {
max-width: 58ch;
text-wrap: pretty;
}
.site-header { .site-header {
@apply sticky top-0 z-30 mb-2 border-b py-4 backdrop-blur-xl; @apply sticky top-0 z-30 mb-2 border-b py-4 backdrop-blur-xl;
width: 100vw; width: 100vw;
@@ -78,9 +92,39 @@ body.light-mode {
} }
.ui-card { .ui-card {
@apply border shadow-soft; @apply border;
border-color: var(--line); border-color: var(--line);
background: color-mix(in srgb, var(--panel) 92%, transparent); background: color-mix(in srgb, var(--panel) 94%, transparent);
box-shadow: 0 18px 40px rgba(0, 0, 0, 0.12);
}
.card-tight {
box-shadow: none;
background: color-mix(in srgb, var(--panel) 97%, transparent);
}
.stage-card {
background: color-mix(in srgb, var(--panel-2) 96%, transparent);
box-shadow: 0 24px 56px rgba(0, 0, 0, 0.16);
}
.editorial-sheet {
background: color-mix(in srgb, var(--panel) 90%, transparent);
}
.editorial-kicker {
@apply text-[10px] uppercase tracking-[0.22em];
color: var(--muted);
}
.editorial-spec {
border-top: 1px solid var(--line);
border-bottom: 1px solid var(--line);
}
.editorial-note {
@apply text-[0.95rem] leading-[1.75];
color: var(--muted);
} }
.muted { .muted {
@@ -99,6 +143,17 @@ body.light-mode {
background: var(--accent-soft); background: var(--accent-soft);
} }
.work-item,
.tone-chip,
.note-item,
.mini-module {
transition:
border-color 180ms ease,
background-color 180ms ease,
transform 180ms ease,
color 180ms ease;
}
.work-item.is-active .work-number, .work-item.is-active .work-number,
.work-item.is-active small { .work-item.is-active small {
color: var(--text); color: var(--text);

File diff suppressed because one or more lines are too long