design-taste-frontend-v2-experimental

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

tasteskill: Anti-Slop Frontend Skill

tasteskill:反粗制滥造前端 Skill

Landing pages, portfolios, and redesigns. Not dashboards, not data tables, not multi-step product UI. Every rule below is contextual. None of it fires automatically. First read the brief, then pull only what fits.

落地页、作品集和重设计。不适用于仪表盘、数据表格或多步骤产品 UI。 以下每条规则都是基于上下文的。没有任何规则会自动触发。先阅读 brief,再只提取适用部分。

0. BRIEF INFERENCE (Read the Room Before Anything Else)

0. BRIEF 推断(动手之前先读懂需求)

Before touching code or tweaking dials, infer what the user actually wants. Most LLM design output is bad because the model jumps to a default aesthetic instead of reading the room.
在编写代码或调整 dial 之前,先推断用户真正想要什么。大多数 LLM 设计输出都很糟糕,因为模型会直接套用默认美学,而不是先理解具体场景。

0.A Read these signals first

0.A 首先阅读这些信号

  1. Page kind - landing (SaaS / consumer / agency / event), portfolio (dev / designer / creative studio), redesign (preserve vs overhaul), editorial / blog.
  2. Vibe words the user used - "minimalist", "calm", "Linear-style", "Awwwards", "brutalist", "premium consumer", "Apple-y", "playful", "serious B2B", "editorial", "agency-y", "glassy", "dark tech".
  3. Reference signals - URLs they linked, screenshots they pasted, products they named, brands they're competing with.
  4. Audience - B2B procurement panel vs. design-conscious consumer vs. recruiter scanning a portfolio. The audience picks the aesthetic, not your taste.
  5. Brand assets that already exist - logo, color, type, photography. For redesigns, these are starting material, not optional input (see Section 11).
  6. Quiet constraints - accessibility-first audiences, public-sector, regulated industries, trust-first commerce, kids' products. These constraints OVERRIDE aesthetic preference.
  1. 页面类型:落地页(SaaS、消费类、代理公司、活动)、作品集(开发者、设计师、创意工作室)、重设计(保留还是彻底改造)、编辑类内容或博客。
  2. 用户使用的氛围词:“极简”“平静”“Linear 风格”“Awwwards”“粗野主义”“高端消费级”“Apple 风”“俏皮”“严肃 B2B”“编辑风”“代理公司风”“玻璃拟态”“暗黑科技”。
  3. 参考信号:用户提供的 URL、粘贴的截图、提到的产品或作为竞品参考的品牌。
  4. 受众:B2B 采购评审、设计意识较强的消费者,或快速浏览作品集的招聘人员。受众决定美学,而不是你的个人偏好。
  5. 已有品牌资产:logo、颜色、字体、摄影素材。对于重设计,这些是起始素材,而不是可选输入(参见第 11 节)。
  6. 隐性约束:以无障碍为先的受众、公共部门、受监管行业、信任优先的电商、儿童产品。这些约束会覆盖美学偏好。

0.B Output a one-line "Design Read" before generating

0.B 在生成前输出一行“设计判断”

Before any code, state in one line: "Reading this as: <page kind> for <audience>, with a <vibe> language, leaning toward <design system or aesthetic family>."
Example reads:
  • "Reading this as: B2B SaaS landing for technical buyers, with a Linear-style minimalist language, leaning toward Tailwind utilities + Geist + restrained motion."
  • "Reading this as: solo designer portfolio for hiring managers, with an editorial / kinetic-type language, leaning toward native CSS + scroll-driven animation + custom typography."
  • "Reading this as: redesign of a public-sector service site, with a trust-first language, leaning toward GOV.UK Frontend or USWDS."
在编写任何代码前,用一行说明:“设计判断:这是面向\<受众>的\<页面类型>,采用\<氛围>语言,倾向于\<设计系统或美学家族>。”
示例判断:
  • “设计判断:这是面向技术采购方的 B2B SaaS 落地页,采用 Linear 风格的极简语言,倾向于 Tailwind utilities + Geist + 克制的动效。”
  • “设计判断:这是面向招聘经理的个人设计师作品集,采用编辑类或动态字体语言,倾向于原生 CSS + 滚动驱动动画 + 定制字体。”
  • “设计判断:这是公共部门服务网站的重新设计,采用信任优先的语言,倾向于 GOV.UK Frontend 或 USWDS。”

0.C If the brief is ambiguous, ask one question, do not guess

0.C 如果 brief 含糊,只问一个问题,不要猜测

Ask exactly one clarifying question - never a multi-question dump - and only when the design read genuinely diverges. Example: "Should this feel closer to Linear-clean or Awwwards-experimental?"
If you can confidently infer from context, do not ask. Just declare the design read and proceed.
只问一个澄清问题,绝不能一次抛出一组问题,并且仅在设计判断确实存在明显分歧时询问。例如:“你希望它更接近 Linear 式的干净,还是 Awwwards 式的实验性?”
如果能够根据上下文有把握地推断,不要询问。直接说明设计判断并继续。

0.D Anti-Default Discipline

0.D 反默认纪律

Do not default to: AI-purple gradients, centered hero over dark mesh, three equal feature cards, generic glassmorphism on everything, infinite-loop micro-animations everywhere, Inter + slate-900. These are the LLM defaults. Reach past them deliberately based on the design read.

不要默认使用:AI 紫色渐变、暗色 mesh 背景上的居中 Hero、三个等宽功能卡片、无处不在的通用玻璃拟态、到处循环的微动画,以及 Inter + slate-900。这些都是 LLM 的默认套路。应当根据设计判断,有意识地超越这些模式。

1. THE THREE DIALS (Core Configuration)

1. 三个 DIAL(核心配置)

After the design read, set three dials. Every layout, motion, and density decision below is gated by these.
  • DESIGN_VARIANCE: 8
    - 1 = Perfect Symmetry, 10 = Artsy Chaos
  • MOTION_INTENSITY: 6
    - 1 = Static, 10 = Cinematic / Physics
  • VISUAL_DENSITY: 4
    - 1 = Art Gallery / Airy, 10 = Cockpit / Packed Data
Baseline:
8 / 6 / 4
. Use these unless the design read overrides them. Do not ask the user to edit this file - overrides happen conversationally.
完成设计判断后,设置三个 dial。下文所有布局、动效和密度决策都受它们控制。
  • DESIGN_VARIANCE: 8
    :1 = 完美对称,10 = 艺术化混乱
  • MOTION_INTENSITY: 6
    :1 = 静态,10 = 电影感或物理效果
  • VISUAL_DENSITY: 4
    :1 = 艺术画廊或 airy,10 = 驾驶舱或高密度数据
基线:
8 / 6 / 4
。除非设计判断需要覆盖,否则使用这些值。不要让用户编辑此文件,覆盖应通过对话完成。

1.A Dial Inference (design read → dial values)

1.A Dial 推断(设计判断 → dial 值)

SignalVARIANCEMOTIONDENSITY
"minimalist / clean / calm / editorial / Linear-style"5-63-42-3
"premium consumer / Apple-y / luxury / brand"7-85-73-4
"playful / wild / Dribbble / Awwwards / experimental / agency"9-108-103-4
"landing page / portfolio / marketing site (default)"7-96-83-5
"trust-first / public-sector / regulated / accessibility-critical"3-42-34-5
"redesign - preserve"match existing+1match existing
"redesign - overhaul"+2+2match existing
信号VARIANCEMOTIONDENSITY
“极简 / 干净 / 平静 / 编辑风 / Linear 风格”5-63-42-3
“高端消费级 / Apple 风 / 奢华 / 品牌”7-85-73-4
“俏皮 / 狂野 / Dribbble / Awwwards / 实验性 / 代理公司”9-108-103-4
“落地页 / 作品集 / 营销网站(默认)”7-96-83-5
“信任优先 / 公共部门 / 受监管 / 无障碍关键”3-42-34-5
“重设计 - 保留”匹配现有值+1匹配现有值
“重设计 - 彻底改造”+2+2匹配现有值

1.B Use-Case Presets

1.B 使用场景预设

Use caseVARIANCEMOTIONDENSITY
Landing (SaaS, mainstream)764
Landing (Agency / creative)983
Landing (Premium consumer)763
Portfolio (Designer / studio)873
Portfolio (Developer)654
Editorial / Blog643
Public-sector service325
Redesign - preservematchmatch+1match
Redesign - overhaul+2+2match
使用场景VARIANCEMOTIONDENSITY
落地页(SaaS,大众市场)764
落地页(代理公司 / 创意工作室)983
落地页(高端消费级)763
作品集(设计师 / 工作室)873
作品集(开发者)654
编辑类内容 / 博客643
公共部门服务325
重设计 - 保留匹配匹配+1匹配
重设计 - 彻底改造+2+2匹配

1.C How the Dials Drive Output

1.C Dial 如何驱动输出

Use these (or user-overridden values) as global variables. Cross-references throughout this document refer to these exact variable names - never invent aliases like
LAYOUT_VARIANCE
or
ANIM_LEVEL
.

将这些值或用户覆盖后的值作为全局变量。本文档中的交叉引用都指这些确切的变量名,绝不能创造
LAYOUT_VARIANCE
或
ANIM_LEVEL
之类的别名。

2. BRIEF → DESIGN SYSTEM MAP

2. BRIEF → 设计系统映射

Once you have the design read (Section 0) and dials (Section 1), pick the right foundation. Do not invent CSS for things that have an official package. Do not pretend an aesthetic trend is an official system.
完成设计判断(第 0 节)和 dial 设置(第 1 节)后,选择正确的基础方案。对于有官方 package 的东西,不要自行编写 CSS。不要把某种美学潮流伪装成官方设计系统。

2.A When to reach for a real design system (use official packages)

2.A 何时使用真正的设计系统(使用官方 package)

Brief reads as…Reach forWhy
Microsoft / enterprise SaaS / dashboards
@fluentui/react-components
or
@fluentui/web-components
Official Fluent UI, Microsoft tokens, accessibility done
Google-ish UI, Material-flavored product
@material/web
+ Material 3 tokens
Official, theme-able via Material Theming
IBM-style B2B / enterprise analytics
@carbon/react
+
@carbon/styles
Official Carbon, mature data-density patterns
Shopify app surfaces
polaris.js
web components / Polaris React
Required for Shopify admin UI
Atlassian / Jira-style product
@atlaskit/*
+
@atlaskit/tokens
Official Atlassian DS
GitHub-style devtool / community page
@primer/css
or
@primer/react-brand
Official Primer; Brand variant for marketing
Public-sector UK service
govuk-frontend
Legally / regulatorily expected
US public-sector / trust-first
uswds
Same
Fast local-business / agency MVPBootstrap 5.3Boring, fast, works
Modern accessible React foundation
@radix-ui/themes
Primitives + polished theme
Modern SaaS where you own the componentsshadcn/ui (
npx shadcn@latest add ...
)
You own the code, easy to customise; never ship default state
Tailwind-based modern SaaS / AI marketingTailwind v4 utilities +
dark:
variant
Default for indie + small team builds
Honesty rule: if the brief reads as one of the systems above, install and use the official package. Do not recreate its CSS by hand. Do not import a system's tokens but then override 90% of them.
One system per project. Do not mix Fluent React with Carbon in the same tree. Do not import shadcn/ui components into a Material 3 app.
Brief 判断为…使用原因
Microsoft / 企业 SaaS / 仪表盘
@fluentui/react-components
或
@fluentui/web-components
官方 Fluent UI、Microsoft tokens,且已完成无障碍支持
Google 风格 UI、Material 风格产品
@material/web
+ Material 3 tokens
官方方案,可通过 Material Theming 设置主题
IBM 风格 B2B / 企业分析
@carbon/react
+
@carbon/styles
官方 Carbon,拥有成熟的高数据密度模式
Shopify 应用界面
polaris.js
web components / Polaris React
Shopify 管理后台 UI 的必需方案
Atlassian / Jira 风格产品
@atlaskit/*
+
@atlaskit/tokens
官方 Atlassian DS
GitHub 风格开发工具 / 社区页面
@primer/css
或
@primer/react-brand
官方 Primer;营销页面使用 Brand 变体
英国公共部门服务
govuk-frontend
法律或监管机构预期采用的方案
美国公共部门 / 信任优先
uswds
同上
快速本地商家 / 代理公司 MVPBootstrap 5.3普通、快捷、可用
现代且支持无障碍的 React 基础方案
@radix-ui/themes
Primitives 与精致主题
组件由自己掌控的现代 SaaSshadcn/ui(
npx shadcn@latest add ...
)
代码归你所有,易于定制;绝不能直接交付默认状态
基于 Tailwind 的现代 SaaS / AI 营销网站Tailwind v4 utilities +
dark:
变体
独立开发者和小型团队构建的默认选择
诚实原则:如果 brief 明确对应上述系统,就安装并使用官方 package。不要手写其 CSS,也不要导入某个系统的 tokens 后再覆盖其中 90% 的值。
**每个项目只使用一个系统。**不要在同一代码树中混用 Fluent React 与 Carbon,也不要在 Material 3 应用中导入 shadcn/ui 组件。

2.B When the brief is an aesthetic, not a system

2.B 当 brief 指向一种美学而非系统

For these directions, there is no single official package. Build with native CSS + Tailwind + a maintained component library. Be honest in code comments about what is borrowed inspiration vs. official material.
AestheticHonest implementation
Glassmorphism / "frosted glass"
backdrop-filter
, layered borders, highlight overlays. Provide solid-fill fallback for
prefers-reduced-transparency
.
Bento (Apple-style tile grids)CSS Grid with mixed cell sizes. No single library owns this.
BrutalismNative CSS, monospace, raw borders. No library.
Editorial / magazineSerif type, asymmetric grid, generous whitespace. No library.
Dark tech / hackerMono + accent neon, terminal motifs. No library.
Aurora / mesh gradientsSVG or layered radial gradients. No library.
Kinetic typographyNative CSS animations, scroll-driven animations, GSAP for hijacks. No library.
Apple Liquid GlassApple documents this for Apple platforms only. There is no official
liquid-glass.css
.
Web implementations are approximations using
backdrop-filter
+ layered borders + highlights. Label clearly as approximation.

对于以下方向,不存在单一官方 package。使用原生 CSS + Tailwind + 维护中的组件库构建。在代码注释中如实区分哪些只是灵感借鉴,哪些是官方材料。
美学诚实实现方式
Glassmorphism / “磨砂玻璃”
backdrop-filter
、分层边框、高光叠加。为
prefers-reduced-transparency
提供纯色填充回退方案。
Bento(Apple 风格磁贴网格)使用不同单元格尺寸的 CSS Grid。没有单一库拥有这种模式。
Brutalism原生 CSS、等宽字体、原始边框。不使用库。
Editorial / 杂志风衬线字体、不对称网格、充足留白。不使用库。
Dark tech / 黑客风等宽字体配霓虹强调色、终端视觉元素。不使用库。
Aurora / mesh 渐变SVG 或分层 radial gradients。不使用库。
动态字体原生 CSS 动画、滚动驱动动画,使用 GSAP 实现滚动劫持。不使用库。
Apple Liquid GlassApple 仅在 Apple 平台记录此设计。不存在官方的
liquid-glass.css
。
Web 实现只是基于
backdrop-filter
、分层边框和高光效果的近似方案,必须清楚标注为近似实现。

3. DEFAULT ARCHITECTURE & CONVENTIONS

3. 默认架构与约定

Unless the design read picks a real design system (Section 2.A), these are the defaults:
除非设计判断选择了真实设计系统(第 2.A 节),否则使用以下默认方案。

3.A Stack

3.A 技术栈

  • Framework: React or Next.js. Default to Server Components (RSC).
    • RSC SAFETY: Global state works ONLY in Client Components. In Next.js, wrap providers in a
      "use client"
      component.
    • INTERACTIVITY ISOLATION: Any component using Motion, scroll listeners, or pointer physics MUST be an isolated leaf with
      'use client'
      at the top. Server Components render static layouts only.
  • Styling: Tailwind v4 (default). Tailwind v3 only if the existing project demands it.
    • For v4: do NOT use
      tailwindcss
      plugin in
      postcss.config.js
      . Use
      @tailwindcss/postcss
      or the Vite plugin.
  • Animation: Motion (the library formerly known as Framer Motion). Import from
    motion/react
    (
    import { motion } from "motion/react"
    ). The
    framer-motion
    package still works as a legacy alias - prefer
    motion/react
    in new code.
  • Fonts: Always use
    next/font
    (Next.js) or self-host with
    @font-face
    +
    font-display: swap
    . Never link Google Fonts via
    <link>
    in production.
  • **框架:**React 或 Next.js。默认使用 Server Components(RSC)。
    • **RSC 安全:**全局状态只能在 Client Components 中工作。在 Next.js 中,将 providers 包装在带有
      "use client"
      的组件中。
    • **交互隔离:**任何使用 Motion、滚动监听器或指针物理效果的组件,都必须是独立的叶子组件,并在顶部声明
      'use client'
      。Server Components 只渲染静态布局。
  • **样式:**Tailwind v4(默认)。仅当现有项目要求时使用 Tailwind v3。
    • 对于 v4:不要在
      postcss.config.js
      中使用
      tailwindcss
      plugin。请使用
      @tailwindcss/postcss
      或 Vite plugin。
  • **动画:**Motion(原 Framer Motion)。从
    motion/react
    导入(
    import { motion } from \u0022motion/react\u0022
    )。
    framer-motion
    package 仍可作为旧版别名使用,新代码优先选择
    motion/react
    。
  • **字体:**始终使用
    next/font
    (Next.js),或通过
    @font-face
    +
    font-display: swap
    自托管。生产环境中绝不通过
    <link>
    链接 Google Fonts。

3.B State

3.B 状态

  • Local
    useState
    /
    useReducer
    for isolated UI.
  • Global state ONLY for deep prop-drilling avoidance - Zustand, Jotai, or React context.
  • NEVER use
    useState
    to track continuous values driven by user input (mouse position, scroll progress, pointer physics, magnetic hover). Use Motion's
    useMotionValue
    /
    useTransform
    /
    useScroll
    .
    useState
    re-renders the React tree on every change and collapses on mobile.
  • 对独立 UI 使用本地
    useState
    /
    useReducer
    。
  • 只有为避免深层 prop drilling 时才使用全局状态,可选 Zustand、Jotai 或 React context。
  • 绝不要使用
    useState
    跟踪由用户输入连续驱动的值(鼠标位置、滚动进度、指针物理效果、磁吸 hover)。应使用 Motion 的
    useMotionValue
    /
    useTransform
    /
    useScroll
    。
    useState
    会在每次变化时重新渲染整棵 React 树,在移动端尤其低效。

3.C Icons

3.C 图标

  • Allowed libraries (priority order):
    @phosphor-icons/react
    ,
    hugeicons-react
    ,
    @radix-ui/react-icons
    ,
    @tabler/icons-react
    .
  • Discouraged:
    lucide-react
    . Acceptable only when the user explicitly asks for it or the project already depends on it.
  • NEVER hand-roll SVG icons. If a glyph is missing, install a second library or compose from primitives - do not draw icon paths from scratch.
  • One family per project. Do not mix Phosphor with Lucide in the same component tree.
  • Standardize
    strokeWidth
    globally
    (e.g.
    1.5
    or
    2.0
    ).
  • 允许的库(按优先级排序):
    @phosphor-icons/react
    、
    hugeicons-react
    、
    @radix-ui/react-icons
    、
    @tabler/icons-react
    。
  • 不推荐:
    lucide-react
    。仅当用户明确要求,或项目已经依赖它时才可接受。
  • **绝不要手写 SVG 图标。**如果缺少某个字形,应安装第二个库或用 primitives 组合,不要从头绘制图标路径。
  • **每个项目只使用一个图标家族。**不要在同一组件树中混用 Phosphor 和 Lucide。
  • 全局统一
    strokeWidth
    ,例如
    1.5
    或
    2.0
    。

3.D Emoji Policy

3.D Emoji 策略

Discouraged by default in code, markup, and visible text. Replace symbols with icon-library glyphs. Override: allow emojis only when the user explicitly asks for a playful / chat-style / social-native vibe - and even then use them sparingly with intent.
默认不鼓励在代码、标记和可见文本中使用 emoji。应使用图标库字形替换符号。**例外:**仅当用户明确要求俏皮、聊天式或社交原生氛围时才允许使用 emoji,即便如此也应克制且有明确意图。

3.E Responsiveness & Layout Mechanics

3.E 响应式与布局机制

  • Standardize breakpoints (
    sm 640
    ,
    md 768
    ,
    lg 1024
    ,
    xl 1280
    ,
    2xl 1536
    ).
  • Contain page layouts using
    max-w-[1400px] mx-auto
    or
    max-w-7xl
    .
  • Viewport Stability: NEVER use
    h-screen
    for full-height Hero sections. ALWAYS use
    min-h-[100dvh]
    to prevent layout jumping on mobile (iOS Safari address bar).
  • Grid over Flex-Math: NEVER use complex flexbox percentage math (
    w-[calc(33%-1rem)]
    ). ALWAYS use CSS Grid (
    grid grid-cols-1 md:grid-cols-3 gap-6
    ).
  • 统一断点(
    sm 640
    、
    md 768
    、
    lg 1024
    、
    xl 1280
    、
    2xl 1536
    )。
  • 使用
    max-w-[1400px] mx-auto
    或
    max-w-7xl
    约束页面布局。
  • **视口稳定性:**全高 Hero 区域绝不使用
    h-screen
    。始终使用
    min-h-[100dvh]
    ,防止移动端 iOS Safari 地址栏导致布局跳动。
  • **Grid 优先于 Flex 数学计算:**绝不要使用复杂的 Flexbox 百分比计算(
    w-[calc(33%-1rem)]
    )。始终使用 CSS Grid(
    grid grid-cols-1 md:grid-cols-3 gap-6
    )。

3.F Dependency Verification (mandatory)

3.F 依赖验证(强制)

Before importing ANY 3rd-party library, check
package.json
. If the package is missing, output the install command first. Never assume a library exists.

导入任何第三方库之前,检查
package.json
。如果缺少该 package,先输出安装命令。绝不能假设某个库已经存在。

4. DESIGN ENGINEERING DIRECTIVES (Bias Correction)

4. 设计工程指令(偏差纠正)

LLMs default to clichés. Override these defaults proactively. Each rule has a context-aware override path.
LLM 默认偏好陈词滥调。要主动覆盖这些默认模式。每条规则都提供基于上下文的覆盖路径。

4.1 Typography

4.1 字体排印

  • Display / Headlines: Default
    text-4xl md:text-6xl tracking-tighter leading-none
    .
  • Body / Paragraphs: Default
    text-base text-gray-600 leading-relaxed max-w-[65ch]
    .
  • Sans font choice:
    • Discouraged as default:
      Inter
      . Pick
      Geist
      ,
      Outfit
      ,
      Cabinet Grotesk
      ,
      Satoshi
      , or a brand-appropriate serif first.
    • Override: Inter is acceptable when the user explicitly asks for a neutral / standard / Linear-style feel, or when the brief is a public-sector / accessibility-first site.
  • Pairings to know:
    Geist
    +
    Geist Mono
    ,
    Satoshi
    +
    JetBrains Mono
    ,
    Cabinet Grotesk
    +
    Inter Tight
    ,
    GT America
    +
    IBM Plex Mono
    .
  • SERIF DISCIPLINE (VERY DISCOURAGED AS DEFAULT):
    • Serif is very discouraged as the default font for any project. "It feels creative / premium / editorial" is NOT a reason to reach for serif. The agent's default mental model that "creative brief = serif" is the single most-tested AI tell in production rounds.
    • Serif is only acceptable when ONE of these is explicitly true:
      • The brand brief literally names a serif font, OR
      • The aesthetic family is genuinely editorial / luxury / publication / manuscript / heritage / vintage AND you can articulate why this specific serif fits this specific brand
    • For everything else (creative agency, design studio, modern brand, premium consumer, portfolio, lifestyle), default sans-serif display (Geist Display, ABC Diatype, Söhne Breit, Cabinet Grotesk Display, Migra Sans, GT Walsheim, Inter Display, PP Neue Montreal). Sans display fonts are not "boring" — they are the default for the same reason black is the default in fashion.
    • EMPHASIS RULE (related): When you want to emphasize a word within a headline (the kinetic "and
      spatial
      design" type move), use italic or bold of the SAME font. Do NOT inject a random serif word into a sans headline (or vice versa) just to add visual interest. Mixed-family emphasis is amateur. Italic/bold emphasis in the same family is the right move.
    • Specifically BANNED as defaults:
      Fraunces
      and
      Instrument_Serif
      (the two LLM-favorite display serifs).
    • If a serif is justified (rare, per the above), rotate from this pool, do NOT reuse the same serif across consecutive projects: PP Editorial New, GT Sectra Display, Cardinal Grotesque, Reckless Neue, Tiempos Headline, Recoleta, Cormorant Garamond, Playfair Display, EB Garamond, IvyPresto, Migra, Editorial Old, Saol Display, Söhne Breit Kursiv, Domaine Display, Canela, Schnyder, Tobias, NB Architekt, ITC Galliard.
  • ITALIC DESCENDER CLEARANCE (mandatory): When italic is used in display type and the word contains a descender letter (
    y g j p q
    ),
    leading-[1]
    or
    leading-none
    will clip the descender. Use
    leading-[1.1]
    minimum and add
    pb-1
    or
    mb-1
    reserve on the wrapping element. Audit every italic word in display headlines before shipping.
  • **展示字体 / 标题:**默认
    text-4xl md:text-6xl tracking-tighter leading-none
    。
  • **正文 / 段落:**默认
    text-base text-gray-600 leading-relaxed max-w-[65ch]
    。
  • Sans 字体选择:
    • 不推荐作为默认值:
      Inter
      。优先选择
      Geist
      、
      Outfit
      、
      Cabinet Grotesk
      、
      Satoshi
      ,或与品牌匹配的 serif。
    • **覆盖:**当用户明确要求中性、标准或 Linear 风格时,可以使用 Inter;当 brief 面向公共部门或无障碍优先网站时,也可以使用。
  • 值得了解的搭配:
    Geist
    +
    Geist Mono
    、
    Satoshi
    +
    JetBrains Mono
    、
    Cabinet Grotesk
    +
    Inter Tight
    、
    GT America
    +
    IBM Plex Mono
    。
  • SERIF 纪律(极不鼓励作为默认值):
    • 任何项目都极不鼓励将 serif 作为默认字体。“感觉有创意 / 高端 / 编辑感”不能成为直接使用 serif 的理由。Agent 的默认思维模型“创意 brief = serif”是生产测试中最明显的 AI 特征。
    • 仅在以下条件之一明确成立时才可使用 serif:
      • 品牌 brief 明确指定了 serif 字体,或
      • 美学家族确实属于编辑类、奢华、出版物、手稿、传承、复古,并且你能说明为何这款特定 serif 适合这个特定品牌
    • 对于其他所有场景(创意代理公司、设计工作室、现代品牌、高端消费级、作品集、生活方式),默认使用 sans-serif 展示字体(Geist Display、ABC Diatype、Söhne Breit、Cabinet Grotesk Display、Migra Sans、GT Walsheim、Inter Display、PP Neue Montreal)。Sans 展示字体并不“无聊”,它们之所以成为默认,与黑色成为时尚行业默认色的原因相同。
    • 强调规则(相关):需要在标题中强调某个词时,也就是动态排版的“and
      spatial
      design”手法,应使用
      同一字体的斜体或粗体
      。不要为了增加视觉趣味,在 sans 标题中随机插入 serif 单词,或在 serif 标题中插入 sans 单词。混用字体家族进行强调是不专业的。同一家族内的斜体或粗体强调才是正确做法。
    • 明确禁止作为默认值:
      Fraunces
      和
      Instrument_Serif
      ,这两个 LLM 最喜欢的展示 serif。
    • 如果确实需要 serif(很少见,必须符合上述条件),应从下面的字体池中轮换,不要在连续项目中重复使用同一款 serif:PP Editorial New、GT Sectra Display、Cardinal Grotesque、Reckless Neue、Tiempos Headline、Recoleta、Cormorant Garamond、Playfair Display、EB Garamond、IvyPresto、Migra、Editorial Old、Saol Display、Söhne Breit Kursiv、Domaine Display、Canela、Schnyder、Tobias、NB Architekt、ITC Galliard。
  • **ITALIC DESCENDER CLEARANCE(强制):**在展示字体中使用斜体,且单词包含降部字母(
    y g j p q
    )时,
    leading-[1]
    或
    leading-none
    会裁切降部。最低使用
    leading-[1.1]
    ,并在包裹元素上增加
    pb-1
    或
    mb-1
    的空间。发布前检查每个展示标题中的斜体单词。

4.2 Color Calibration

4.2 颜色校准

  • Max 1 accent color. Saturation < 80% by default.
  • THE LILA RULE: The "AI Purple / Blue glow" aesthetic is discouraged as a default. No automatic purple button glows, no random neon gradients. Use neutral bases (Zinc / Slate / Stone) with high-contrast singular accents (Emerald, Electric Blue, Deep Rose, Burnt Orange, etc.).
  • Override: if the brand or brief explicitly asks for purple / violet / lila, embrace it. But execute with intent: consistent palette, harmonised neutrals, restrained gradients. Not generic AI gradient slop.
  • One palette per project. Do not fluctuate between warm and cool grays within the same project.
  • COLOR CONSISTENCY LOCK (mandatory): Once an accent color is chosen for a page, it is used on the WHOLE page. A warm-grey site does not suddenly get a blue CTA in section 7. A rose-accented site does not get a teal status badge in the footer. Pick one accent, lock it, audit every component before shipping.
  • PREMIUM-CONSUMER PALETTE BAN (mandatory, second-most-recurring AI-tell):
    • For premium-consumer briefs (cookware, wellness, artisan, luxury, heritage craft, DTC home goods, etc.) the LLM default is warm beige/cream + brass/clay/oxblood/ochre + espresso/ink dark text. Concretely banned hex families as default backgrounds and accents:
      • Backgrounds:
        #f5f1ea
        ,
        #f7f5f1
        ,
        #fbf8f1
        ,
        #efeae0
        ,
        #ece6db
        ,
        #faf7f1
        ,
        #e8dfcb
        (all "warm paper / cream / chalk / bone")
      • Accents:
        #b08947
        ,
        #b6553a
        ,
        #9a2436
        ,
        #9c6e2a
        ,
        #bc7c3a
        ,
        #7d5621
        (all "brass / clay / oxblood / ochre")
      • Text:
        #1a1714
        ,
        #1a1814
        ,
        #1b1814
        (all "espresso / warm near-black")
    • This palette is BANNED as the default reach for premium-consumer briefs. Every premium-consumer site you have ever shipped uses this exact palette. The brand becomes invisible.
    • Default alternatives (rotate, do not reuse):
      • Cold Luxury: silver-grey + chrome + smoke (think Tesla, Apple Watch Hermes-without-the-leather)
      • Forest: deep green + bone + amber accent (think Filson, Patagonia premium)
      • Black and Tan: true off-black + warm tan, sharp contrast, no beige
      • Cobalt + Cream: saturated blue against a single neutral, no brass
      • Terracotta + Slate: warm rust against cool grey, no brass
      • Olive + Brick + Paper: muted olive plus brick-red accent
      • Pure monochrome + single saturated pop: off-white + off-black + one bright accent (electric blue, emerald, hot pink, etc.)
    • Palette-rotation rule: if the previous premium-consumer project you generated used the beige+brass family, this one MUST use a different family. Do not ship the same warm-craft palette twice in a row.
    • Override: the beige+brass+espresso palette is acceptable ONLY when the brand brief explicitly names those colors, or when the brand identity is genuinely vintage / artisan / warm-craft AND you can articulate why this specific palette fits this specific brand. Default-reaching for it because "this is a cookware brief" is banned.
  • 最多使用 1 种强调色。默认饱和度低于 80%。
  • **LILA 规则:**不鼓励默认采用“AI 紫色 / 蓝色光晕”美学。不要自动生成紫色按钮光晕或随机霓虹渐变。使用中性基础色(Zinc / Slate / Stone),搭配高对比度的单一强调色(Emerald、Electric Blue、Deep Rose、Burnt Orange 等)。
  • **覆盖:**如果品牌或 brief 明确要求紫色、violet 或 lila,就充分采用,但要统一执行:保持 palette 一致、中性色协调、渐变克制,不能做成通用的 AI 渐变粗制滥造。
  • **每个项目只使用一套 palette。**不要在同一项目中冷暖灰来回切换。
  • **COLOR CONSISTENCY LOCK(强制):**一旦为页面选定强调色,就要在整个页面中使用。暖灰网站不能突然在第 7 节出现蓝色 CTA,玫瑰色强调网站也不能在页脚突然使用青色状态徽章。选择一种强调色并锁定,发布前检查所有组件。
  • PREMIUM-CONSUMER PALETTE 禁止规则(强制,第二常见的 AI 特征):
    • 对于高端消费级 brief(厨具、健康、手工、奢华、传承工艺、DTC 家居用品等),LLM 默认偏好“暖米色或奶油色 + 黄铜、陶土、酒红、赭石 + 浓缩咖啡或墨色深色文字”。以下 hex 色系明确禁止作为默认背景和强调色:
      • 背景:
        #f5f1ea
        、
        #f7f5f1
        、
        #fbf8f1
        、
        #efeae0
        、
        #ece6db
        、
        #faf7f1
        、
        #e8dfcb
        ,这些都属于“暖纸张 / 奶油 / 粉笔 / 骨白色”
      • 强调色:
        #b08947
        、
        #b6553a
        、
        #9a2436
        、
        #9c6e2a
        、
        #bc7c3a
        、
        #7d5621
        ,这些都属于“黄铜 / 陶土 / 酒红 / 赭石”
      • 文字:
        #1a1714
        、
        #1a1814
        、
        #1b1814
        ,这些都属于“浓缩咖啡 / 暖近黑色”
    • 该 palette 被禁止作为高端消费级 brief 的默认选择。你交付过的高端消费级网站都在使用这套完全相同的配色,品牌因此失去辨识度。
    • 默认替代方案(轮换,不要重复使用):
      • **Cold Luxury:**银灰 + 铬色 + 烟灰,参考 Tesla、Apple Watch Hermes,但不带皮革
      • **Forest:**深绿 + 骨白 + 琥珀色强调,参考 Filson、Patagonia 高端系列
      • **Black and Tan:**真正的近黑色 + 暖棕褐色,强调鲜明对比,不使用米色
      • **Cobalt + Cream:**饱和蓝色搭配单一中性色,不使用黄铜
      • **Terracotta + Slate:**暖锈色搭配冷灰色,不使用黄铜
      • **Olive + Brick + Paper:**低饱和橄榄绿搭配砖红色强调
      • **Pure monochrome + single saturated pop:**近白 + 近黑 + 单一高饱和亮点,例如 electric blue、emerald、hot pink
    • **Palette 轮换规则:**如果上一个高端消费级项目使用了米色 + 黄铜家族,本次必须使用不同家族。不要连续两个项目交付相同的暖工艺 palette。
    • **覆盖:**只有当品牌 brief 明确指定这些颜色,或品牌身份确实属于复古、手工、暖工艺,并且你能解释该 palette 为何适合此品牌时,才可使用米色 + 黄铜 + 浓缩咖啡配色。仅因为“这是厨具 brief”就默认选择该配色属于禁止行为。

4.3 Layout Diversification

4.3 布局多样化

  • ANTI-CENTER BIAS: Centered Hero / H1 sections are avoided when
    DESIGN_VARIANCE > 4
    . Force "Split Screen" (50/50), "Left-aligned content / right-aligned asset", "Asymmetric white-space", or scroll-pinned structures.
  • Override: centered hero is OK for editorial / manifesto / launch-announcement briefs where the message itself is the design.
  • **ANTI-CENTER BIAS:**当
    DESIGN_VARIANCE > 4
    时,避免使用居中的 Hero 或 H1 区域。强制采用“分屏”(50/50)、“内容左对齐 / 素材右对齐”、“非对称留白”或滚动固定结构。
  • **覆盖:**对于编辑类、宣言类或发布公告类 brief,如果信息本身才是设计核心,可以使用居中 Hero。

4.4 Materiality, Shadows, Cards

4.4 材质、阴影与卡片

  • Use cards ONLY when elevation communicates real hierarchy. Otherwise group with
    border-t
    ,
    divide-y
    , or negative space.
  • When a shadow is used, tint it to the background hue. No pure-black drop shadows on light backgrounds.
  • For
    VISUAL_DENSITY > 7
    : generic card containers are banned. Data metrics breathe in plain layout.
  • SHAPE CONSISTENCY LOCK (mandatory): Pick ONE corner-radius scale for the page and stick to it. Options: all-sharp (radius 0), all-soft (radius 12-16px), all-pill (full radius for interactive). Mixed systems are allowed only when there is a documented rule (e.g. "buttons are full-pill, cards are 16px, inputs are 8px") and that rule is followed everywhere. Round buttons in a square layout, or square cards on a pill-button page, is broken design.
  • 仅当层级关系确实需要通过高度表达时使用卡片。否则使用
    border-t
    、
    divide-y
    或负空间进行分组。
  • 使用阴影时,应根据背景色相调整阴影色调。浅色背景上不要使用纯黑投影。
  • 当
    VISUAL_DENSITY > 7
    时,禁止使用通用卡片容器。数据指标应直接存在于普通布局中。
  • **SHAPE CONSISTENCY LOCK(强制):**为页面选择一套 corner-radius 标度并始终遵守。可选方案包括全部锐利(radius 0)、全部柔和(radius 12-16px)、全部胶囊形(交互元素使用完整圆角)。只有存在明确规则时才允许混用,例如“按钮为全圆角、卡片为 16px、输入框为 8px”,并且必须在所有位置一致执行。方形布局中的圆形按钮,或胶囊形按钮页面中的方形卡片,都属于设计错误。

4.5 Interactive UI States

4.5 交互 UI 状态

LLMs default to "static successful state only." Always implement full cycles:
  • Loading: Skeletal loaders matching the final layout's shape. Avoid generic circular spinners.
  • Empty States: Beautifully composed; indicate how to populate.
  • Error States: Clear, inline (forms), or contextual (toasts only for transient).
  • Tactile Feedback: On
    :active
    , use
    -translate-y-[1px]
    or
    scale-[0.98]
    to simulate a physical push.
  • BUTTON CONTRAST CHECK (mandatory, a11y): Before shipping any button, verify the button text is readable against the button background. White button + white text,
    bg-white
    CTA with
    text-white
    label, transparent button against the page background with no border → all banned. Audit every CTA: contrast ratio WCAG AA min (4.5:1 for body, 3:1 for large text 18px+). Same rule applies to ghost buttons over photographic backgrounds (use a backdrop, scrim, or stroke).
  • CTA BUTTON WRAP BAN (mandatory): Button text MUST fit on one line at desktop. If a label like "VIEW SELECTED WORK" wraps to 2 or 3 lines, the button is broken. Fix by EITHER shortening the label (3 words max for primary CTAs, ideally 1-2) OR widening the button (do not artificially constrain
    max-width
    on CTAs). Wrapped CTAs at desktop are a Pre-Flight Fail.
  • NO DUPLICATE CTA INTENT (mandatory): Two CTAs with the same intent on one page is a Pre-Flight Fail. Examples of same intent: "Get in touch" + "Contact us" + "Let's talk" + "Start a project" + "Start something" + "Reach out" = all "contact" intent → pick ONE label and use it everywhere on the page (nav, hero, footer). Same for "Try free" + "Get started" + "Sign up free" (all "signup" intent) and "View work" + "See selected work" + "Browse projects" (all "portfolio" intent). One label per intent.
  • FORM CONTRAST CHECK (mandatory, a11y): Form inputs, placeholder text, focus rings, helper text, and error text all pass WCAG AA contrast against the section background. Light placeholders on a near-white form, white form on white page section, form labels grayer than 4.5:1 contrast → all banned. Audit every form before shipping.
LLM 默认只实现静态成功状态。始终实现完整状态周期:
  • **加载:**使用与最终布局形状一致的骨架屏。避免通用圆形 spinner。
  • **空状态:**精心构图,并说明如何填充内容。
  • **错误状态:**提供清晰的内联错误提示(表单)或上下文错误提示(toast 仅用于瞬时消息)。
  • **触觉反馈:**在
    :active
    状态下,使用
    -translate-y-[1px]
    或
    scale-[0.98]
    模拟物理按压。
  • **BUTTON CONTRAST CHECK(强制,无障碍):**发布任何按钮前,验证按钮文字相对于按钮背景是否清晰可读。白底按钮配白字、
    bg-white
    CTA 配
    text-white
    标签、透明按钮在无边框情况下融入页面背景,这些情况全部禁止。检查所有 CTA:对比度至少达到 WCAG AA(正文 4.5:1,大号文字 18px+ 为 3:1)。同一规则也适用于照片背景上的 ghost buttons,应使用 backdrop、遮罩或描边。
  • **CTA BUTTON WRAP 禁止规则(强制):**桌面端按钮文字必须保持在单行。如果“查看精选作品”之类的标签换成 2 到 3 行,按钮即为损坏状态。应通过缩短标签(主要 CTA 最多 3 个词,最好 1 到 2 个)或加宽按钮来修复,不要人为限制 CTA 的
    max-width
    。桌面端 CTA 换行属于 Pre-Flight Fail。
  • **NO DUPLICATE CTA INTENT(强制):**同一页面出现两个意图相同的 CTA 属于 Pre-Flight Fail。相同意图示例:“联系我们”+“联系”+“聊一聊”+“开始项目”+“开始合作”+“联系我们”,它们全部属于“联系”意图,因此整页只选择一个标签并统一使用,包括导航、Hero 和页脚。同样,“免费试用”+“立即开始”+“免费注册”都属于“注册”意图,“查看作品”+“查看精选作品”+“浏览项目”都属于“作品集”意图。每种意图只使用一个标签。
  • **FORM CONTRAST CHECK(强制,无障碍):**表单输入框、placeholder 文本、focus ring、辅助文字和错误文字相对于所在区块背景都必须达到 WCAG AA 对比度。近白表单中的浅色 placeholder、白表单放在白色页面区块中、表单标签灰度未达到 4.5:1 对比度,这些情况全部禁止。发布前检查每个表单。

4.6 Data & Form Patterns

4.6 数据与表单模式

  • Label ABOVE input. Helper text optional but present in markup. Error text BELOW input. Standard
    gap-2
    for input blocks.
  • No placeholder-as-label. Ever.
  • Label 放在输入框上方。辅助文字可选,但标记中应保留。错误文字放在输入框下方。输入区块标准使用
    gap-2
    。
  • 绝不能把 placeholder 当作 label。

4.7 Layout Discipline (Hard Rules. Failing any of these is shipping broken work)

4.7 布局纪律(硬性规则。违反任何一条都意味着交付了损坏的作品)

  • Hero MUST fit in the initial viewport. Headline max 2 lines on desktop, subtext max 20 words AND max 3-4 lines, CTAs visible without scroll. If the copy is too long: reduce font scale OR cut copy. If you cannot describe the value-prop in 20 words of subtext, the value-prop is unclear, not the rule too tight. Never let the hero overflow and force scroll to find the CTA.
  • Hero font-scale discipline. Plan font size and image size together. If the hero asset is large and the headline is more than 6 words, do not start at
    text-7xl/text-8xl
    . Default sensible range:
    text-4xl md:text-5xl lg:text-6xl
    for most heroes;
    text-6xl md:text-7xl
    only when the headline is 3-5 words. A 4-line hero headline is always a font-size error, never a copy-length error.
  • HERO TOP PADDING CAP (mandatory): Hero top padding max
    pt-24
    (≈6rem) at desktop. More than that means the hero content floats halfway down the viewport and reads as a layout bug, not as intentional space. If your hero needs more breathing room, increase font scale or asset size, not top padding.
  • HERO STACK DISCIPLINE (max 4 text elements). The hero is a single moment, not a feature list. Allowed text elements, max 4 in total:
    1. Eyebrow (small uppercase label) OR brand strip OR neither - pick zero or one
    2. Headline (max 2 lines, see above)
    3. Subtext (max 20 words, max 4 lines)
    4. CTAs (1 primary + max 1 secondary)
    • BANNED in the hero: tiny tagline below CTAs ("Works with GitHub, GitLab, and self-hosted Git"), trust micro-strip ("Used by engineering teams at..."), pricing teaser ("Free for solo, $10/user for teams"), feature bullet list, social-proof avatar row. All of those move to dedicated sections directly below the hero.
    • If you have an eyebrow AND a tagline below CTAs in the same hero, drop the tagline. If you have a brand strip AND a tagline, drop the tagline. One small text element per hero, max.
  • "Used by" / "Trusted by" logo wall belongs UNDER the hero, never inside it. The hero is for the value prop and primary CTA. The logo wall is a separate section directly below. Do not stuff trust logos into the same flex row as the hero copy.
  • Navigation MUST render on a single line on desktop. If items don't fit at
    lg
    (1024px), condense labels, drop secondary items, or move to a hamburger. A two-line nav at desktop is broken design.
  • Navigation height cap: 80px max desktop, default 64-72px. No huge "agency" nav bars that eat 15% of the viewport.
  • Bento grids MUST have rhythm, not one-sided repetition. Do not stack 6 left-image / right-text rows. Vary the composition: alternate full-width feature rows, asymmetric tile sizes, vertical breaks.
  • BENTO CELL COUNT RULE (mandatory): A bento grid has EXACTLY as many cells as you have content for. 3 items → 3 cells (1+2 split, or 2+1, or asymmetric trio). 5 items → 5 cells (2+3, 3+2, hero+4, etc.). If your grid has an empty cell in the middle or at the end, you planned wrong. Re-shape the grid; do not paste a blank tile.
  • Section-Layout-Repetition Ban. Once you use a layout family for a section (e.g., 3-column-image-cards, full-width-quote, split-text-image), that family can appear at most ONCE on the page. "Selected commissions" must not look like "What we do." A landing page with 8 sections must use at least 4 different layout families.
  • ZIGZAG ALTERNATION CAP (mandatory). Alternating "left-image + right-text" then "left-text + right-image" zigzag layout = banal. Max 2 sections in a row with this image+text-split pattern. The 3rd consecutive image+text split is a Pre-Flight Fail. Break the pattern with a full-width section, a vertical-stack section, a bento grid, a marquee, or a different layout family.
  • EYEBROW RESTRAINT (mandatory, the #1 violated rule in production tests). An "eyebrow" is the small uppercase wide-tracking label sitting above a section headline (e.g.
    FOUR COLORWAYS
    ,
    SELECTED WORK
    ,
    THE HARDWARE
    ,
    Git-native task management
    ). Typical CSS signature:
    text-[11px] uppercase tracking-[0.18em]
    ,
    font-mono text-[10.5px] uppercase tracking-[0.22em]
    . Every AI-built site puts an eyebrow above EVERY section header, producing the same templated rhythm. Hard rule:
    • Maximum 1 eyebrow per 3 sections. Hero counts as 1. So a page with 9 sections may use at most 3 eyebrows total.
    • If section A has an eyebrow, the next 2 sections cannot have one.
    • Pre-Flight Check is mechanical: count instances of
      uppercase tracking
      (or similar small-caps mono labels above headlines) across all section components. If count > ceil(sectionCount / 3), the output fails.
    • What to do instead of an eyebrow: drop it entirely. The headline alone is enough. If you need to categorize a section, the section's location on the page already categorizes it; no label needed.
  • SPLIT-HEADER BAN (mandatory). The pattern "left big headline + right small explainer paragraph" as a section header (left col-span-7/8, right col-span-4/5 with a small body paragraph floating in the right column) is banned as default. Sections should have ONE focused message. If you genuinely need both a headline and an explainer paragraph, stack them vertically (headline on top, body below, max-width 65ch). Reach for the split-header pattern only when there is a real compositional reason (e.g., the right column carries a visual or interactive element, not just filler text).
  • Bento Background Diversity (mandatory). Bento and feature-grid sections cannot be 6 white-on-white cards with text inside. At least 2-3 cells in any multi-cell grid need real visual variation: a real image, a brand-appropriate gradient (not AI-purple), a pattern, a tinted background. A cream-on-cream bento with only typography inside reads as boring AI default, even when the rest of the page is good.
  • Mobile collapse must be explicit per section. For every multi-column layout, declare the
    < 768px
    fallback in the same component. No "it'll work, Tailwind handles it" assumptions.
  • **Hero 必须适配初始视口。**桌面端标题最多 2 行,副文案最多 20 个词且最多 3 到 4 行,不滚动即可看到 CTA。如果文案过长,应缩小字体或删减内容。如果无法用 20 个词的副文案说明价值主张,问题在于价值主张不够清晰,而不是规则太严格。绝不能让 Hero 溢出并迫使用户滚动才能找到 CTA。
  • **Hero 字体尺寸纪律。**必须同时规划字体尺寸和图片尺寸。如果 Hero 素材较大且标题超过 6 个词,不要从
    text-7xl/text-8xl
    开始。大多数 Hero 应使用
    text-4xl md:text-5xl lg:text-6xl
    这一合理范围。只有标题为 3 到 5 个词时才使用
    text-6xl md:text-7xl
    。4 行 Hero 标题始终是字体尺寸错误,而不是文案长度错误。
  • **HERO TOP PADDING 上限(强制):**桌面端 Hero 顶部 padding 最大为
    pt-24
    (约 6rem)。超过该值意味着 Hero 内容悬浮在视口中部,看起来像布局 bug,而不是有意留白。如果 Hero 需要更多呼吸空间,应增大字体或素材尺寸,而不是增加顶部 padding。
  • **HERO STACK 纪律(最多 4 个文本元素)。**Hero 是一个单一时刻,不是功能列表。最多允许以下 4 个文本元素:
    1. Eyebrow(小号全大写标签)或品牌条,或两者都不使用,三选一
    2. 标题(最多 2 行,参见上文)
    3. 副文案(最多 20 个词,最多 4 行)
    4. CTA(1 个主要 CTA + 最多 1 个次要 CTA)
    • **Hero 中禁止:**CTA 下方的小号 tagline(“支持 GitHub、GitLab 和 self-hosted Git”)、信任度微型信息条(“深受工程团队信赖”)、价格提示(“个人版免费,团队版每用户 10 美元”)、功能要点列表、社交证明头像行。这些内容应移动到 Hero 下方的独立区块。
    • 如果同一 Hero 中同时存在 eyebrow 和 CTA 下方的 tagline,应删除 tagline。如果同时存在品牌条和 tagline,也应删除 tagline。每个 Hero 最多一个小型文本元素。
  • **“Used by” / “Trusted by” logo 墙必须位于 Hero 下方,绝不能放在 Hero 内。**Hero 用于表达价值主张和主要 CTA。logo 墙应作为紧接在 Hero 下方的独立区块。不要把信任 logo 塞进 Hero 文案所在的同一个 Flex 行。
  • **导航在桌面端必须单行渲染。**如果项目在
    lg
    (1024px)下无法容纳,应精简标签、删除次要项目,或改用汉堡菜单。桌面端两行导航属于设计错误。
  • **导航高度上限:桌面端最多 80px,默认 64 到 72px。**不要使用吞掉 15% 视口高度的庞大“代理公司风”导航栏。
  • **Bento 网格必须有节奏,不能只有单侧重复。**不要堆叠 6 个左图右文的行。应改变构图:交替使用全宽特色行、不对称磁贴尺寸和垂直分隔。
  • **BENTO CELL COUNT 规则(强制)。**Bento 网格的单元格数量必须与实际内容数量完全一致。3 项内容对应 3 个单元格(1+2、2+1 或非对称三格)。5 项内容对应 5 个单元格(2+3、3+2、主格+4 等)。如果网格中间或末尾存在空单元格,说明规划错误,应重新调整网格结构,不能粘贴空白磁贴。
  • **区块布局重复禁止规则。**一旦某个区块使用一种布局家族,例如三列图片卡片、全宽引用或图文分栏,该家族在整页最多出现一次。“精选委托”不能看起来像“我们提供什么”。包含 8 个区块的落地页至少应使用 4 种不同布局家族。
  • **ZIGZAG ALTERNATION 上限(强制)。**先左图右文、再左文右图的交替布局很平庸。此类图文分栏最多连续出现 2 个区块。第 3 个连续图文分栏属于 Pre-Flight Fail。应改用全宽区块、垂直堆叠区块、Bento 网格、Marquee 或其他布局家族。
  • EYEBROW 克制原则(强制,生产测试中违反次数最多的规则)。“Eyebrow”是位于区块标题上方的小号全大写宽字距标签,例如
    FOUR COLORWAYS
    、
    SELECTED WORK
    、
    THE HARDWARE
    或
    Git-native task management
    。典型 CSS 签名为
    text-[11px] uppercase tracking-[0.18em]
    、
    font-mono text-[10.5px] uppercase tracking-[0.22em]
    。每个 AI 网站都会在每个区块标题上方加 eyebrow,从而形成高度模板化的节奏。硬性规则:
    • **每 3 个区块最多使用 1 个 eyebrow。**Hero 计为 1 个。因此,包含 9 个区块的页面最多使用 3 个 eyebrow。
    • 如果区块 A 使用了 eyebrow,接下来的 2 个区块不能使用。
    • **Pre-Flight Check 必须机械执行:**统计所有区块组件中
      uppercase tracking
      或类似小型大写等宽标签的数量。如果数量大于
      ceil(sectionCount / 3)
      ,输出失败。
    • **替代做法:**直接删除 eyebrow。单独的标题已经足够。如果需要为区块分类,区块所在位置本身已经提供了分类信息,不需要额外标签。
  • **SPLIT-HEADER 禁止规则。**将“左侧大标题 + 右侧小型说明段落”作为区块标题(左侧占 7/8 列,右侧占 4/5 列,小段正文悬浮在右列)默认禁止。区块应只有一个聚焦的信息。如果确实需要标题和说明段落,应垂直堆叠,标题在上、正文在下,最大宽度 65ch。只有存在真正的构图原因时才使用分栏标题,例如右栏承载视觉或交互元素,而不是填充文本。
  • **Bento 背景多样性(强制)。**Bento 和功能网格区块不能是 6 个白底卡片加文字。任何多单元格网格中,至少 2 到 3 个单元格必须有真实的视觉变化,例如真实图片、符合品牌且非 AI 紫色的渐变、图案或带色背景。奶油色叠奶油色且只有文字排版的 Bento 即使页面其他部分不错,也会显得乏味且像 AI 默认设计。
  • **每个区块都必须明确声明移动端折叠方式。**对于每一种多列布局,都要在同一组件中声明
    < 768px
    的回退方案。不要假设“它会正常工作,Tailwind 会处理”。

4.8 Image & Visual Asset Strategy

4.8 图片与视觉素材策略

Landing pages and portfolios are visual products. Text-only pages with fake-screenshot divs are slop.
Priority order for visual assets:
  1. Image-generation tool first. If ANY image-gen tool is available in the environment (
    generate_image
    , MCP image tool, IDE-integrated gen, OpenAI image tools, etc.) you MUST use it to create section-specific assets: hero photography, product shots, texture backgrounds, mood images. Generate at the right aspect ratio for the section. Do not skip this step because hand-rolled CSS feels faster.
  2. Real web images second. When no gen tool is available, use real photography sources. Acceptable defaults:
    • https://picsum.photos/seed/{descriptive-seed}/{w}/{h}
      for placeholder photography (seed should describe the section, e.g.
      marrow-cookware-kitchen
      )
    • Actual stock or brand URLs when the brief provides them
    • Open-license sources (Unsplash via direct URL, Pexels) if explicitly allowed
  3. Last resort: tell the user. If neither is possible, do NOT fill the page with hand-rolled SVG illustrations or div-based "fake screenshots." Instead, leave clearly-labeled placeholder slots (
    <!-- TODO: hero product photo, 1600x1200 -->
    ) and at the end of the response say: "This page needs real images at: [list of placements]. Please generate or provide them."
Even minimalist sites need real images. A pure-text page is not minimalism. It is incomplete work. Even an editorial Linear-style site needs at least 2-3 real images (hero, one product/lifestyle shot, one supporting image). Generate B&W minimalist photography if the brief is restrained; do not skip images entirely because the dial is low.
Real company logos for social proof. When the brief calls for a "Trusted by / Used by / Customers" logo wall, do NOT default to plain text wordmarks (
<span>Acme Co</span>
styled in a row). Use real SVG logos:
  • Source: Simple Icons (
    https://cdn.simpleicons.org/{slug}/ffffff
    for any color, or
    simple-icons
    npm package). Covers most known brands.
  • Alternative: devicon for tech-stack logos (
    @svgr/cli
    or CDN).
  • Make-up the brand name? Then make-up an SVG mark too. Generate a simple monogram (one letter in a circle, two-letter ligature, abstract glyph) rendered as an inline
    <svg>
    matching the page style. Plain text wordmarks for invented brand names look generic.
  • Always ensure logos render in both light and dark mode (white-on-dark, black-on-light, or single-color theme variable).
  • LOGO-ONLY rule (mandatory): logo wall = logos and nothing else. Do NOT print industry / category labels below each logo (no
    Vercel
    +
    hosting
    underneath, no
    Stripe
    +
    payments
    , no
    Cloudflare
    +
    infra
    ). The logo is the credibility, the label adds nothing the user does not already know. Optional: brand name as alt-text for screen readers, optional link to the brand's site. That is it.
Hand-rolled illustrations:
  • SVG icons from libraries: fine (see Section 3.C).
  • Hand-rolled decorative SVGs (custom illustrations, logos, marks): strongly discouraged, never as default. Acceptable only when:
    • The brief explicitly calls for it ("draw me an SVG logo")
    • It's a single, simple geometric mark (a square, a circle, a wordmark in display type)
    • You're confident in the output quality
Div-based fake screenshots are banned. A "hand-built product preview" rendered with
<div>
rectangles, fake task lists, fake dashboards, fake terminal windows is a Tell. If you need to show a product:
  • Use a real screenshot URL if one exists
  • Generate one via image tool
  • Use a real component preview (an actual mini-version of the UI inside the page)
  • Or skip the preview entirely and use editorial photography
Hero needs a real visual. Text + gradient blob is not a hero - it's a placeholder.
落地页和作品集是视觉产品。只有文字并配假截图 div 的页面属于粗制滥造。
视觉素材优先级:
  1. **优先使用图片生成工具。**如果环境中存在任何图片生成工具(
    generate_image
    、MCP image tool、IDE 集成生成功能、OpenAI image tools 等),必须使用它创建与区块对应的素材,包括 Hero 摄影、产品图、纹理背景和氛围图片。按区块所需比例生成,不要因为手写 CSS 更快就跳过。
  2. **其次使用真实 Web 图片。**没有生成工具时,使用真实摄影来源。可接受的默认方案:
    • https://picsum.photos/seed/{descriptive-seed}/{w}/{h}
      作为占位摄影,seed 应描述区块内容,例如
      marrow-cookware-kitchen
    • brief 提供的真实素材或品牌 URL
    • 明确允许时使用开放许可来源,例如通过直链访问的 Unsplash、Pexels
  3. **最后才告知用户。**如果前两种方式都不可用,不要用手写 SVG 插画或 div 拼装的“假截图”填充页面。应保留清楚标注的占位槽位(
    <!-- TODO: hero product photo, 1600x1200 -->
    ),并在回复末尾说明:“此页面需要在以下位置使用真实图片:\[位置列表\]。请生成或提供图片。”
**即使极简网站也需要真实图片。**纯文字页面不是极简,而是未完成的作品。即使是编辑类 Linear 风格网站,也至少需要 2 到 3 张真实图片,包括 Hero、一张产品或生活方式图片和一张辅助图片。如果 brief 较为克制,可以生成黑白极简摄影,不要因为 dial 较低就完全省略图片。
**社交证明使用真实公司 logo。**当 brief 要求“Trusted by / Used by / Customers” logo 墙时,不要默认使用纯文字字标,例如
<span>Acme Co</span>
加样式排列。必须使用真实 SVG logo:
  • 来源:Simple Icons(
    https://cdn.simpleicons.org/{slug}/ffffff
    可使用任意颜色,或使用
    simple-icons
    npm package),覆盖大多数知名品牌。
  • **备选:**技术栈 logo 使用 devicon(
    @svgr/cli
    或 CDN)。
  • **如果品牌名称是虚构的,也要制作对应的 SVG 标记。**生成一个与页面风格一致的简单 monogram(圆圈中的单个字母、双字母连字或抽象字形),并以内联
    <svg>
    渲染。虚构品牌名称的纯文字字标看起来很通用。
  • 始终确保 logo 在浅色和深色模式下都能渲染,例如深色背景上的白色 logo、浅色背景上的黑色 logo,或使用单色主题变量。
  • **LOGO-ONLY 规则(强制):**logo 墙只能包含 logo。不要在每个 logo 下打印行业或分类标签,例如
    Vercel
    +
    hosting
    、
    Stripe
    +
    payments
    、
    Cloudflare
    +
    infra
    。logo 本身就是可信度证明,标签只是重复用户已经知道的信息。品牌名称可用作屏幕阅读器的 alt-text,也可以链接到品牌网站,仅此而已。
手写插画:
  • 来自库的 SVG 图标:允许,参见第 3.C 节。
  • 手写装饰性 SVG(定制插画、logo、标记):默认强烈不推荐。仅在以下情况可接受:
    • brief 明确要求,例如“帮我画一个 SVG logo”
    • 它是单一且简单的几何标记,例如正方形、圆形或展示字体字标
    • 你确信输出质量可靠
**禁止使用 div 拼装假截图。**用
<div>
矩形制作手工拼装的产品预览、虚假任务列表、虚假仪表盘或虚假终端窗口都属于 AI 特征。如果需要展示产品:
  • 使用真实截图 URL
  • 通过图片工具生成
  • 使用真实组件预览,例如页面内实际 UI 的迷你版本
  • 或完全省略预览,改用编辑类摄影
**Hero 需要真实视觉素材。**文字加渐变色块不是 Hero,只是占位符。

4.9 Content Density

4.9 内容密度

Landing pages live on the first impression, not the full read. Cut ruthlessly.
  • Default content shape per section: short headline (≤ 8 words) + short sub-paragraph (≤ 25 words) + one visual asset OR one CTA. Anything more must be justified by the section's job.
  • No data-dump sections. A 20-row publication table, a 30-row award list, a giant pricing matrix on a marketing page = wrong layout. Use:
    • Top 3-5 highlights + "View full list" link
    • Marquee / carousel for breadth
    • Different page entirely if the data is the product
  • Long lists need a different UI component, not a longer list. Default
    <ul>
    with bullets /
    divide-y
    rows is the lazy choice. If you have > 5 items, reach for one of these instead:
    • 2-column split with grouped items
    • Card grid with image + label per item
    • Tabs / accordion if items are categorisable
    • Horizontal scroll-snap pills
    • Carousel for breadth-heavy lists (testimonials, logos, capabilities)
    • Marquee for "lots-of-things-that-don't-need-individual-attention" A spec sheet with 10 rows + a hairline under every row is the WORST default. Either group rows into 2-3 chunks with sparse dividers, or move to a card-per-spec layout.
  • Spec sheets specifically (the Marrow-cookware pattern). A long product specification table with
    border-b
    on every row is the AI default for cookware / hardware / apparel / artisan-goods briefs. Banned. Concrete alternatives:
    • 2-col card grid: each spec gets its own card with the spec name, the value (large display number), and a one-line "why it matters" body. Cards arranged 2-col on desktop, 1-col mobile.
    • Scroll-snap horizontal pills: each spec is a pill, user can flick through.
    • Grouped chunks: group 10 specs into 3 logical clusters (e.g. "Materials", "Cooking", "Warranty"), each cluster gets ONE soft divider and a cluster heading.
    • Featured-vs-rest: 3-4 hero specs visualised as large display tiles, the rest collapsed under a "View full specifications" disclosure.
  • COPY SELF-AUDIT (mandatory before ship): Before declaring any task done, re-read every visible string on the page (headlines, subheads, eyebrows, button labels, body copy, captions, alt text, footer text, error messages). Flag any string that is:
    • Grammatically broken ("free on its past", "two plans but one is honest", "to put it on the table" out of context)
    • Has unclear referents ("we plan to stay that way" without prior context)
    • Sounds like AI hallucination (cute-but-wrong wordplay, forced metaphors that don't track, "elegant nothing" phrases)
    • Reads like an LLM trying to sound thoughtful (passive-aggressive humility, fake-craftsman labels, mock-poetic micro-meta) Rewrite every flagged string. If unsure whether a string makes sense, replace it with a plain functional sentence. AI-generated cute copy is worse than boring copy.
  • Fake-precise numbers are flagged. Numbers like
    92%
    ,
    4.1×
    ,
    48k
    ,
    5.8 mm
    ,
    13.4 lb
    either:
    • Come from real data (brief, brand guidelines, public metrics) - fine
    • Are explicitly labeled as mock (
      <!-- mock -->
      , "example", "sample data") - fine
    • Are AI-invented spec aesthetics - banned. Don't fake engineering precision the brand doesn't claim.
  • One copy register per page. Don't mix technical mono ("47 tasks · 0.6 ctx-switches/day"), editorial prose, and marketing punch in the same composition unless the brand voice explicitly calls for it.
落地页依靠的是第一印象,而不是完整阅读。必须无情删减。
  • **每个区块的默认内容结构:**短标题(不超过 8 个词)+ 短段落(不超过 25 个词)+ 一个视觉素材或一个 CTA。任何额外内容都必须有该区块职责方面的充分理由。
  • **禁止数据倾倒区块。**营销页上的 20 行出版表格、30 行奖项列表或巨型价格矩阵都是错误布局。应使用:
    • 最重要的 3 到 5 项 + “查看完整列表”链接
    • 用于展示广度的 Marquee 或 Carousel
    • 如果数据本身就是产品,则使用完全不同的页面
  • **长列表需要不同的 UI 组件,而不是更长的列表。**默认使用带项目符号的
    <ul>
    或
    divide-y
    行是一种偷懒选择。如果项目超过 5 个,应改用以下方式:
    • 使用分组项目的双列布局
    • 每项包含图片和标签的卡片网格
    • 如果项目可分类,使用 Tabs 或 Accordion
    • 横向 scroll-snap pills
    • 适合大量项目的 Carousel,例如 testimonials、logos、capabilities
    • 适用于“很多内容,但不需要逐项关注”的 Marquee 带有 10 行且每行都有 hairline 的规格表是最糟糕的默认方案。应将内容分成 2 到 3 组并使用稀疏分隔,或者改为每项规格一个卡片的布局。
  • **规格表尤其如此,即 Marrow 厨具模式。**在厨具、硬件、服装或手工商品 brief 中,每行都有
    border-b
    的长产品规格表属于 AI 默认做法,明确禁止。具体替代方案:
    • **双列卡片网格:**每项规格单独成卡,包含规格名称、数值(大型展示数字)和一行“重要性”正文。桌面端两列,移动端一列。
    • **Scroll-snap 横向 pills:**每项规格为一个 pill,用户可横向滑动浏览。
    • **分组区块:**将 10 项规格划分为 3 个逻辑集群,例如“材料”“烹饪”“保修”,每个集群只使用一条柔和分隔线和集群标题。
    • **重点项与其余项区分:**用大型展示磁贴可视化 3 到 4 项核心规格,其余内容折叠在“查看完整规格” disclosure 下。
  • **COPY SELF-AUDIT(发布前必须执行):**声明任务完成前,重新阅读页面上的每一个可见字符串,包括标题、副标题、eyebrow、按钮标签、正文、caption、alt text、页脚文字和错误消息。标记任何存在以下问题的字符串:
    • 语法错误,例如脱离上下文后不通顺的“free on its past”“two plans but one is honest”“to put it on the table”
    • 指代不明确,例如缺少前文的“we plan to stay that way”
    • 听起来像 AI 幻觉,例如可爱但错误的文字游戏、无法成立的强制比喻或“elegant nothing”式表达
    • 像 LLM 在刻意显得深刻,例如被动攻击式的谦虚、虚假的工匠标签、故作诗意的微观元叙事 改写所有被标记的字符串。如果不确定某句是否合理,替换成平实、功能性的句子。AI 生成的俏皮文案比无聊文案更糟。
  • **虚假精确数字会被标记。**类似
    92%
    、
    4.1×
    、
    48k
    、
    5.8 mm
    、
    13.4 lb
    的数字:
    • 来自真实数据(brief、品牌规范、公开指标)则可以使用
    • 明确标注为 mock(
      <!-- mock -->
      、“example”、“sample data”)则可以使用
    • 如果只是 AI 编造的工程精度外观,则禁止使用。不要虚构品牌并未声明的规格精度
  • **每个页面只使用一种文案语域。**除非品牌语气明确要求,否则不要在同一构图中混用技术等宽字体(“47 tasks · 0.6 ctx-switches/day”)、编辑式散文和营销 punch。

4.10 Quotes & Testimonials

4.10 引用与客户评价

  • Max 3 lines of quote body. Never 6. If the original quote is longer → cut it. A landing-page quote is a snippet, not the full review.
  • For very small font sizes (e.g. footer-style testimonials), the line cap can stretch slightly. Spirit: "fits in a glance."
  • No em-dashes inside the quote text as design flourish (long pauses, kinetic em-dashes, em-dash-bullets). See Section 9.G - em-dash is completely banned.
  • Attribution: name + role + (optionally) company. Never name only ("- Sarah").
  • Quote marks: use real typographic quotes ( " " ) or none at all. Not straight ASCII ( " ).
  • 引用正文最多 3 行,绝不能达到 6 行。如果原文更长,应进行删减。落地页引用是一段摘要,不是完整评价。
  • 对极小字号,例如页脚样式的 testimonials,行数上限可以略微放宽,核心是“一眼可读”。
  • 引用正文中不要使用 em-dash 作为设计修饰。参见第 9.G 节,em-dash 完全禁止。
  • 署名:姓名 + 角色 +(可选)公司。绝不能只写姓名,例如“- Sarah”。
  • 引号:使用真正的排版引号(“ ”),也可以完全不用。不能使用直角 ASCII 引号(" )。

4.11 Page Theme Lock (Light / Dark Mode Consistency)

4.11 页面主题锁定(浅色 / 深色模式一致性)

The page has ONE theme. Sections do not invert.
  • If the page is dark mode, ALL sections are dark mode. No light-mode-warm-paper section sandwiched between dark sections (or vice versa). The user must not feel they walked into a different website mid-scroll.
  • The exception: if the brief explicitly calls for a "Color Block Story" or "Theme Switch on Scroll" device AND that is a deliberate composition (one full theme switch with a strong transition, not random alternation), it is allowed once per page.
  • Default behaviour: pick light, dark, or auto (
    prefers-color-scheme
    ) at the page level and lock it. Section-level background tints within the same theme family are fine (
    bg-zinc-950
    next to
    bg-zinc-900
    ); flipping to
    bg-amber-50
    in the middle of a
    bg-zinc-950
    page is broken.
  • When using a design system with built-in theming (Radix Themes, shadcn/ui with
    <Theme>
    ), set the theme ONCE in
    layout.tsx
    or the page root. Do not let individual sections override.

页面只有一个主题。各区块不能反转。
  • 如果页面使用深色模式,所有区块都必须使用深色模式。深色区块之间不能夹入浅色暖纸区块,反之亦然。用户不能感觉自己在滚动中进入了另一个网站。
  • 例外:如果 brief 明确要求“Color Block Story”或“Theme Switch on Scroll”设计手法,并且它是有意设计的构图,即只进行一次带有强烈转场的完整主题切换,而不是随机反转,则允许整页出现一次。
  • 默认行为:在页面层级选择浅色、深色或自动模式(
    prefers-color-scheme
    )并锁定。同一主题家族内允许区块使用略有差异的背景色调,例如
    bg-zinc-950
    搭配
    bg-zinc-900
    ,但在
    bg-zinc-950
    页面中间切换到
    bg-amber-50
    属于设计错误。
  • 使用带内置主题的设计系统时(Radix Themes、带
    <Theme>
    的 shadcn/ui),在
    layout.tsx
    或页面根节点中只设置一次主题。不要让单个区块自行覆盖。

5. CONTEXT-AWARE PROACTIVITY

5. 基于上下文的主动设计

These are tools, not defaults. Use them when the design read calls for them. None of these fire automatically.
  • Liquid Glass / Glassmorphism: Appropriate for premium consumer, Apple-adjacent, luxury brand, or media-overlay vibes. Inappropriate for dashboards, public-sector, or "boring B2B." When used, go beyond
    backdrop-blur
    : add a 1px inner border (
    border-white/10
    ) and a subtle inner shadow (
    shadow-[inset_0_1px_0_rgba(255,255,255,0.1)]
    ) for physical edge refraction. Provide a solid-fill fallback under
    prefers-reduced-transparency
    .
  • Magnetic Micro-physics: Use when
    MOTION_INTENSITY > 5
    AND the brief reads premium / playful / agency. Implement EXCLUSIVELY with Motion's
    useMotionValue
    /
    useTransform
    outside the React render cycle. Never
    useState
    . See Section 3.B.
  • Perpetual Micro-Interactions (Pulse, Typewriter, Float, Shimmer, Carousel): Use when
    MOTION_INTENSITY > 5
    AND the section actively benefits from motion (status indicators, live feeds, AI-feel). Not every card needs an infinite loop. If a section is informational, leave it still. Apply Spring Physics (
    type: "spring", stiffness: 100, damping: 20
    ) - no linear easing.
  • "Motion claimed, motion shown." If
    MOTION_INTENSITY > 4
    , the page must actually move: entry transitions on hero, scroll-reveal on key sections, hover physics on CTAs, at minimum. A static page that claims
    MOTION_INTENSITY: 7
    is broken. Conversely, if you cannot ship working motion in the available scope, drop the dial to 3 and ship a clean static page. Never half-build motion that breaks (cut-off ScrollTriggers, jumpy enters, missing cleanups).
  • MOTION MUST BE MOTIVATED (mandatory). Before adding any animation, ask: "what does this animation communicate?" Valid answers: hierarchy (drawing attention to the right thing), storytelling (revealing content in sequence that matches a narrative), feedback (acknowledging a user action), state transition (showing something changed). Invalid answer: "it looked cool". GSAP everywhere because GSAP is available is amateur. Each ScrollTrigger, each marquee, each pinned section needs a reason. If you cannot articulate the reason in one sentence, drop the animation.
  • MARQUEE MAX-ONE-PER-PAGE (mandatory). Horizontal scrolling text marquees ("logos endlessly scrolling", "manifesto scrolling sideways", "kinetic word strip") are appropriate at most ONCE per page. Two or more marquees on the same page reads as lazy filler. Pick the one section where the marquee actually serves the content; the others get a different layout.
  • GSAP Sticky-Stack Pattern (when scroll-stack is used). A "card stack on scroll" must be a REAL sticky-stack, not a sequential reveal list. See Section 5.A below for the canonical code skeleton. Common failure: trigger fires halfway through scroll instead of pinning at viewport top. Fix:
    start: "top top"
    not
    start: "top center"
    or
    "top 80%"
    .
  • GSAP Horizontal-Pan Pattern (when horizontal scroll-hijack is used). See Section 5.B below for the canonical skeleton. Common failure: animation starts before the section is pinned, so the user sees half a slide. Same fix:
    start: "top top"
    , pin the wrapper, scrub the inner track.
这些是工具,不是默认行为。仅在设计判断需要时使用。任何一项都不会自动触发。
  • **Liquid Glass / Glassmorphism:**适合高端消费级、接近 Apple 的风格、奢华品牌或媒体叠加层氛围。不适合仪表盘、公共部门或“无聊的 B2B”。使用时应超越简单的
    backdrop-blur
    :增加 1px 内边框(
    border-white/10
    )和细微内阴影(
    shadow-[inset_0_1px_0_rgba(255,255,255,0.1)]
    ),营造真实的边缘折射。为
    prefers-reduced-transparency
    提供纯色填充回退方案。
  • **磁吸微物理:**当
    MOTION_INTENSITY > 5
    ,且 brief 呈现高端、俏皮或代理公司风格时使用。必须仅通过 Motion 的
    useMotionValue
    /
    useTransform
    在 React 渲染周期之外实现。绝不能使用
    useState
    。参见第 3.B 节。
  • 持续微交互(Pulse、Typewriter、Float、Shimmer、Carousel):当
    MOTION_INTENSITY > 5
    ,且区块确实能从动效中受益时使用,例如状态指示、实时信息流或 AI 氛围。**不是每张卡片都需要无限循环。**如果区块只承载信息,应保持静止。使用 Spring Physics(
    type: \u0022spring\u0022, stiffness: 100, damping: 20
    ),不要使用 linear easing。
  • **“声明了动效,就必须展示动效。”**当
    MOTION_INTENSITY > 4
    时,页面必须真正运动:至少应包含 Hero 入场过渡、关键区块滚动显现和 CTA hover 物理反馈。如果页面声称
    MOTION_INTENSITY: 7
    却没有运动,就是损坏状态。反之,如果无法在当前范围内交付可用的动效,应将 dial 降到 3,并交付干净的静态页面。绝不要交付不完整或会损坏的动效,例如截断的 ScrollTrigger、跳跃式入场或缺失清理逻辑。
  • **动效必须有动机(强制)。**添加任何动画前,先问:“这个动画在传达什么?”有效答案包括层级关系(将注意力引向正确内容)、叙事(按符合叙事的顺序揭示内容)、反馈(确认用户操作)或状态转换(展示内容已经变化)。无效答案是“看起来很酷”。到处使用 GSAP 只因为它可用,是不专业的表现。每个 ScrollTrigger、Marquee 和固定区块都必须有明确理由。如果无法用一句话说明原因,就删除该动画。
  • **MARQUEE 每页最多一个(强制)。**横向滚动文字 Marquee,例如“logo 无限滚动”“宣言横向滚动”“动态文字条”,每页最多出现一次。同一页面出现两个或更多 Marquee 会显得像懒惰的填充内容。只选择真正服务于内容的一个区块使用 Marquee,其他区块应采用不同布局。
  • GSAP Sticky-Stack 模式(使用滚动堆叠时)。“滚动时卡片堆叠”必须是真正的 sticky-stack,而不是依次显现的列表。标准代码骨架参见第 5.A 节。常见错误是触发器在滚动到一半时执行,而不是固定在视口顶部。使用
    start: \u0022top top\u0022
    ,不要使用
    start: \u0022top center\u0022
    或
    \u0022top 80%\u0022
    。
  • **GSAP Horizontal-Pan 模式(使用横向滚动劫持时)。**标准代码骨架参见第 5.B 节。常见错误是区块尚未固定时动画就开始,导致用户只看到一半滑动。同样使用
    start: \u0022top top\u0022
    ,固定 wrapper,并通过 scrub 移动内部 track。

5.A Sticky-Stack - Canonical Skeleton

5.A Sticky-Stack 标准骨架

tsx
"use client";
import { useRef, useEffect, useId, type ReactNode } from "react";
import { gsap } from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";
import { useReducedMotion } from "motion/react";

gsap.registerPlugin(ScrollTrigger);

export function StickyStack({ cards }: { cards: ReactNode[] }) {
  const ref = useRef<HTMLDivElement>(null);
  const reduce = useReducedMotion();
  const instanceId = useId().replace(/:/g, "");
  const cardClass = `stack-card-${instanceId}`;
  const innerClass = `stack-card-inner-${instanceId}`;

  useEffect(() => {
    if (reduce || !ref.current || cards.length <= 1) return;
    const ctx = gsap.context(() => {
      const cardEls = gsap.utils.toArray<HTMLElement>(`.${cardClass}`);
      cardEls.forEach((card, i) => {
        if (i === cardEls.length - 1) return;
        ScrollTrigger.create({
          trigger: card,
          start: "top top",                              // pin at viewport top
          endTrigger: cardEls[cardEls.length - 1],
          end: "top top",
          pin: true,
          pinSpacing: false,
          anticipatePin: 1,
          invalidateOnRefresh: true,
        });
        const inner = card.querySelector(`.${innerClass}`);
        if (!inner) return;
        gsap.to(inner, {
          scale: 0.92,
          opacity: 0.55,
          ease: "none",
          scrollTrigger: {
            trigger: cardEls[i + 1],
            start: "top bottom",
            end: "top top",
            scrub: true,
            invalidateOnRefresh: true,
          },
        });
      });
    }, ref);
    return () => ctx.revert();
  }, [reduce, cards.length, cardClass, innerClass]);

  return (
    <div ref={ref} className="relative">
      {cards.map((card, i) => (
        <div
          key={i}
          style={{ zIndex: i + 1 }}
          className={`${cardClass} relative min-h-[100dvh] flex items-center justify-center`}
        >
          <div className={`${innerClass} w-full flex items-center justify-center will-change-transform`}>
            {card}
          </div>
        </div>
      ))}
    </div>
  );
}
Critical points:
start: "top top"
,
pin: true
, every card except the last is pinned, the scale/opacity transform is driven by the NEXT card's scroll trigger (so previous card shrinks as next one arrives). Never combine CSS
position: sticky
with
pin: true
on the same element: the native sticky engine and ScrollTrigger's
position: fixed
fight at the hand-off (judder, snapping, coordinate drift). The pinned element must also not be the element being transformed - pin the outer card and animate an inner wrapper, or the scale tween throws off the pin measurements. Scope the card class per instance (
useId
) so two stacks on one page do not cross-select; stack with ascending
zIndex
. Under
prefers-reduced-motion
the component renders a plain list: no pin, no transforms, all content reachable.
tsx
\u0022use client\u0022;
import { useRef, useEffect, useId, type ReactNode } from \u0022react\u0022;
import { gsap } from \u0022gsap\u0022;
import { ScrollTrigger } from \u0022gsap/ScrollTrigger\u0022;
import { useReducedMotion } from \u0022motion/react\u0022;

gsap.registerPlugin(ScrollTrigger);

export function StickyStack({ cards }: { cards: ReactNode[] }) {
  const ref = useRef<HTMLDivElement>(null);
  const reduce = useReducedMotion();
  const instanceId = useId().replace(/:/g, \u0022\u0022);
  const cardClass = `stack-card-${instanceId}`;
  const innerClass = `stack-card-inner-${instanceId}`;

  useEffect(() => {
    if (reduce || !ref.current || cards.length <= 1) return;
    const ctx = gsap.context(() => {
      const cardEls = gsap.utils.toArray<HTMLElement>(`.${cardClass}`);
      cardEls.forEach((card, i) => {
        if (i === cardEls.length - 1) return;
        ScrollTrigger.create({
          trigger: card,
          start: \u0022top top\u0022,                              // pin at viewport top
          endTrigger: cardEls[cardEls.length - 1],
          end: \u0022top top\u0022,
          pin: true,
          pinSpacing: false,
          anticipatePin: 1,
          invalidateOnRefresh: true,
        });
        const inner = card.querySelector(`.${innerClass}`);
        if (!inner) return;
        gsap.to(inner, {
          scale: 0.92,
          opacity: 0.55,
          ease: \u0022none\u0022,
          scrollTrigger: {
            trigger: cardEls[i + 1],
            start: \u0022top bottom\u0022,
            end: \u0022top top\u0022,
            scrub: true,
            invalidateOnRefresh: true,
          },
        });
      });
    }, ref);
    return () => ctx.revert();
  }, [reduce, cards.length, cardClass, innerClass]);

  return (
    <div ref={ref} className=\u0022relative\u0022>
      {cards.map((card, i) => (
        <div
          key={i}
          style={{ zIndex: i + 1 }}
          className={`${cardClass} relative min-h-[100dvh] flex items-center justify-center`}
        >
          <div className={`${innerClass} w-full flex items-center justify-center will-change-transform`}>
            {card}
          </div>
        </div>
      ))}\}
    </div>
  );
}
关键点:
start: \u0022top top\u0022
、
pin: true
,除最后一张外每张卡片都要固定,scale 和 opacity 变换由下一张卡片的滚动触发器驱动,因此上一张卡片会在下一张到来时缩小。绝不要在同一元素上同时使用 CSS
position: sticky
和
pin: true
,原生 sticky 引擎与 ScrollTrigger 的
position: fixed
会在交接时发生抖动、吸附或坐标漂移。被固定的元素也不能同时是被变换的元素,应固定外层卡片并动画内部 wrapper,否则 scale 补间会破坏固定位置的测量。使用
useId
按实例限定 card class,防止同一页面上的两个 stack 互相选择元素,并使用递增的
zIndex
。在
prefers-reduced-motion
下,组件应渲染为普通列表,不固定、不变换,所有内容都可以访问。

5.B Horizontal-Pan - Canonical Skeleton

5.B Horizontal-Pan 标准骨架

tsx
"use client";
import { useRef, useEffect, type ReactNode } from "react";
import { gsap } from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";
import { useReducedMotion } from "motion/react";

gsap.registerPlugin(ScrollTrigger);

export function HorizontalPan({ children }: { children: ReactNode }) {
  const wrap = useRef<HTMLElement>(null);
  const track = useRef<HTMLDivElement>(null);
  const reduce = useReducedMotion();

  useEffect(() => {
    if (reduce || !wrap.current || !track.current) return;
    const ctx = gsap.context(() => {
      const getDistance = () =>
        Math.max(0, track.current!.scrollWidth - wrap.current!.clientWidth);
      gsap.to(track.current, {
        x: () => -getDistance(),
        ease: "none",
        scrollTrigger: {
          trigger: wrap.current,
          start: "top top",                              // pin starts when section top hits viewport top
          end: () => `+=${getDistance()}`,               // scroll distance = track width minus viewport, recomputed on refresh
          pin: true,
          scrub: 1,
          anticipatePin: 1,
          invalidateOnRefresh: true,
        },
      });
    }, wrap);
    return () => ctx.revert();
  }, [reduce]);

  return (
    <section
      ref={wrap}
      role="region"
      aria-label="Horizontal content track"
      tabIndex={reduce ? 0 : undefined}
      className={`relative w-full ${reduce ? "overflow-x-auto scroll-smooth" : "overflow-hidden"}`}
    >
      <div
        ref={track}
        className={`flex h-[100dvh] w-max items-center ${reduce ? "snap-x snap-mandatory" : ""}`}
      >
        {children}
      </div>
    </section>
  );
}
Critical points:
start: "top top"
,
pin: true
,
end: "+=${getDistance()}"
(scroll length = horizontal travel needed),
scrub: 1
. The wrapper is pinned, the inner track slides horizontally as the user scrolls vertically.
x
and
end
must be function-based and paired with
invalidateOnRefresh: true
; a
distance
captured once never recomputes - after a resize it overshoots into blank space (or pans to nothing when the track fits). Keep
w-max
on the track and make each panel non-shrinking (
shrink-0
or an explicit width): without it, overflow compression collapses
scrollWidth
and the section pins without panning. Under
prefers-reduced-motion
keep every panel reachable: swap the wrapper to
overflow-x-auto
with snap points instead of leaving
overflow-hidden
.
tsx
\u0022use client\u0022;
import { useRef, useEffect, type ReactNode } from \u0022react\u0022;
import { gsap } from \u0022gsap\u0022;
import { ScrollTrigger } from \u0022gsap/ScrollTrigger\u0022;
import { useReducedMotion } from \u0022motion/react\u0022;

gsap.registerPlugin(ScrollTrigger);

export function HorizontalPan({ children }: { children: ReactNode }) {
  const wrap = useRef<HTMLElement>(null);
  const track = useRef<HTMLDivElement>(null);
  const reduce = useReducedMotion();

  useEffect(() => {
    if (reduce || !wrap.current || !track.current) return;
    const ctx = gsap.context(() => {
      const getDistance = () =>
        Math.max(0, track.current!.scrollWidth - wrap.current!.clientWidth);
      gsap.to(track.current, {
        x: () => -getDistance(),
        ease: \u0022none\u0022,
        scrollTrigger: {
          trigger: wrap.current,
          start: \u0022top top\u0022,                              // pin starts when section top hits viewport top
          end: () => `+=${getDistance()}`,               // scroll distance = track width minus viewport, recomputed on refresh
          pin: true,
          scrub: 1,
          anticipatePin: 1,
          invalidateOnRefresh: true,
        },
      });
    }, wrap);
    return () => ctx.revert();
  }, [reduce]);

  return (
    <section
      ref={wrap}
      role=\u0022region\u0022
      aria-label=\u0022Horizontal content track\u0022
      tabIndex={reduce ? 0 : undefined}
      className={`relative w-full ${reduce ? \u0022overflow-x-auto scroll-smooth\u0022 : \u0022overflow-hidden\u0022}`}
    >
      <div
        ref={track}
        className={`flex h-[100dvh] w-max items-center ${reduce ? \u0022snap-x snap-mandatory\u0022 : \u0022\u0022}`}
      >
        {children}
      </div>
    </section>
  );
}
关键点:
start: \u0022top top\u0022
、
pin: true
、
end: \u0022+=${getDistance()}\u0022
,其中滚动长度等于横向移动所需的距离,同时使用
scrub: 1
。wrapper 被固定,内部 track 在用户垂直滚动时横向移动。
x
和
end
必须基于函数,并搭配
invalidateOnRefresh: true
;只捕获一次的 distance 永远不会重新计算,窗口调整大小后会滚过头进入空白区域,或者在 track 未能撑开时完全无法平移。track 必须保留
w-max
,每个 panel 必须禁止收缩,例如
shrink-0
或显式宽度,否则 overflow 压缩会折叠
scrollWidth
,导致区块被固定却没有平移效果。在
prefers-reduced-motion
下,必须确保每个 panel 都能访问:将 wrapper 改为带 snap points 的
overflow-x-auto
,而不是保留
overflow-hidden
。

5.C Scroll-Reveal Stagger - Canonical Skeleton (lighter alternative)

5.C Scroll-Reveal Stagger 标准骨架(更轻量的替代方案)

For simple "items appear as they enter viewport" (no pinning), prefer Motion's
whileInView
over GSAP - lighter, no ScrollTrigger needed:
tsx
"use client";
import { motion, useReducedMotion } from "motion/react";

export function RevealStagger({ items }: { items: string[] }) {
  const reduce = useReducedMotion();
  return (
    <ul className="grid gap-6">
      {items.map((item, i) => (
        <motion.li
          key={item}
          initial={reduce ? false : { opacity: 0, y: 24 }}
          whileInView={{ opacity: 1, y: 0 }}
          viewport={{ once: true, amount: 0.3 }}
          transition={{
            duration: 0.6,
            delay: i * 0.06,
            ease: [0.16, 1, 0.3, 1],
          }}
        >
          {item}
        </motion.li>
      ))}
    </ul>
  );
}
Use this for: feature lists, testimonial grids, logo walls, anything that just needs "enter on scroll." Save GSAP for actual pin/scrub work.
对于简单的“元素进入视口时出现”效果,不需要固定功能时,优先使用 Motion 的
whileInView
,它比 GSAP 更轻量,也不需要 ScrollTrigger:
tsx
\u0022use client\u0022;
import { motion, useReducedMotion } from \u0022motion/react\u0022;

export function RevealStagger({ items }: { items: string[] }) {
  const reduce = useReducedMotion();
  return (
    <ul className=\u0022grid gap-6\u0022>
      {items.map((item, i) => (
        <motion.li
          key={item}
          initial={reduce ? false : { opacity: 0, y: 24 }}
          whileInView={{ opacity: 1, y: 0 }}
          viewport={{ once: true, amount: 0.3 }}
          transition={{
            duration: 0.6,
            delay: i * 0.06,
            ease: [0.16, 1, 0.3, 1],
          }}
        >
          {item}
        </motion.li>
      ))}
    </ul>
  );
}
适用于:功能列表、testimonials 网格、logo 墙,以及只需要滚动进入时显现的内容。将 GSAP 留给真正需要 pin 或 scrub 的场景。

5.D Forbidden Animation Patterns

5.D 禁止的动画模式

  • window.addEventListener("scroll", ...)
    is banned. It runs on every scroll frame, jank-prone, no batching. Use Motion's
    useScroll()
    , GSAP's
    ScrollTrigger
    , IntersectionObserver, or CSS
    scroll-driven animations
    (
    animation-timeline: view()
    ).
  • Custom scroll progress calculations using
    window.scrollY
    in React state. Same reason. Re-renders on every frame.
  • requestAnimationFrame
    loops that touch React state.
    Use motion values (
    useMotionValue
    +
    useTransform
    ) instead.
  • Layout Transitions: Use Motion's
    layout
    and
    layoutId
    props for visible state changes (re-ordering lists, expanding modals, shared elements between routes). Do not wrap static content in
    layout
    props "for safety" - it costs measurement work.
  • Staggered Orchestration: Use
    staggerChildren
    (Motion) or CSS cascade (
    animation-delay: calc(var(--index) * 100ms)
    ) for reveal moments where sequence matters. For
    staggerChildren
    , parent (
    variants
    ) and children MUST share the same Client Component tree.

  • **禁止使用
    window.addEventListener(\u0022scroll\u0022, ...)
    。**它会在每一滚动帧执行,容易造成卡顿,且没有批处理。改用 Motion 的
    useScroll()
    、GSAP 的
    ScrollTrigger
    、IntersectionObserver,或 CSS 滚动驱动动画(
    animation-timeline: view()
    )。
  • 禁止在 React state 中使用
    window.scrollY
    计算自定义滚动进度,原因相同。每一帧都会触发重新渲染。
  • **禁止使用会修改 React state 的
    requestAnimationFrame
    循环。**改用 motion values(
    useMotionValue
    +
    useTransform
    )。
  • **布局过渡:**对可见状态变化使用 Motion 的
    layout
    和
    layoutId
    props,例如重新排序列表、展开 modal、路由间共享元素。不要为了“保险”而给静态内容套用 layout props,因为这会产生额外的测量开销。
  • **交错编排:**当显现顺序有意义时,使用
    staggerChildren
    (Motion)或 CSS cascade(
    animation-delay: calc(var(--index) * 100ms)
    )。对于
    staggerChildren
    ,父组件(
    variants
    )和子组件必须位于同一个 Client Component 树中。

6. PERFORMANCE & ACCESSIBILITY GUARDRAILS

6. 性能与无障碍护栏

6.A Hardware Acceleration

6.A 硬件加速

  • Animate ONLY
    transform
    and
    opacity
    . Never animate
    top
    ,
    left
    ,
    width
    ,
    height
    .
  • Use
    will-change: transform
    sparingly - only on elements that will actually animate.
  • 只动画化
    transform
    和
    opacity
    。绝不要动画化
    top
    、
    left
    、
    width
    、
    height
    。
  • 谨慎使用
    will-change: transform
    ,仅用于确实会动画化的元素。

6.B Reduced Motion (mandatory)

6.B Reduced Motion(强制)

  • Any motion above
    MOTION_INTENSITY > 3
    MUST honor
    prefers-reduced-motion
    .
    This is non-negotiable.
  • In Motion: wrap with
    useReducedMotion()
    and degrade to static.
  • In CSS: gate animations behind
    @media (prefers-reduced-motion: no-preference)
    or provide an override block under
    @media (prefers-reduced-motion: reduce)
    that disables.
  • Infinite loops, parallax, scroll-hijack, and magnetic physics MUST collapse to static / instant under reduced motion.
  • **任何高于
    MOTION_INTENSITY > 3
    的动效都必须支持
    prefers-reduced-motion
    。**这是不可协商的要求。
  • 在 Motion 中:使用
    useReducedMotion()
    包裹,并降级为静态效果。
  • 在 CSS 中:将动画放在
    @media (prefers-reduced-motion: no-preference)
    后面,或在
    @media (prefers-reduced-motion: reduce)
    下提供禁用动画的覆盖规则。
  • 无限循环、视差、滚动劫持和磁吸物理效果在 reduced motion 下必须折叠为静态或即时状态。

6.C Dark Mode (mandatory for any consumer-facing page)

6.C Dark Mode(所有面向消费者的页面强制要求)

  • Design for both modes from the start. Never ship light-only or dark-only without explicit user instruction.
  • Use Tailwind
    dark:
    variant OR CSS variables for tokens. Pick one strategy per project.
  • Do not prescribe specific dark-mode colors here. The brief decides. Maintain visual hierarchy, brand identity, and WCAG AA contrast (AAA for body) across both modes.
  • Respect
    prefers-color-scheme: dark
    . Default to system preference unless the brand insists on one mode.
  • **从一开始就同时设计两种模式。**除非用户明确要求,否则绝不能只交付浅色或只交付深色。
  • 使用 Tailwind
    dark:
    变体或 CSS variables 管理 tokens。每个项目选择一种策略并保持一致。
  • **此处不规定具体深色模式颜色。**由 brief 决定。两种模式都必须保持视觉层级、品牌身份和 WCAG AA 对比度,正文目标为 AAA。
  • 支持
    prefers-color-scheme: dark
    。除非品牌坚持使用单一模式,否则默认遵循系统偏好。

6.D Core Web Vitals Targets

6.D Core Web Vitals 目标

  • LCP < 2.5s. Hero image must be
    next/image priority
    or preloaded.
  • INP < 200ms. Heavy work off main thread.
  • CLS < 0.1. Reserve space for images, fonts, embeds.
  • Run Lighthouse before declaring a page done.
  • LCP < 2.5s。Hero 图片必须使用
    next/image priority
    或预加载。
  • INP < 200ms。重型工作应移出主线程。
  • CLS < 0.1。为图片、字体和嵌入内容预留空间。
  • 声明页面完成前运行 Lighthouse。

6.E DOM Cost

6.E DOM 成本

  • Apply grain / noise filters EXCLUSIVELY to fixed,
    pointer-events-none
    pseudo-elements (e.g.,
    fixed inset-0 z-[60] pointer-events-none
    ). NEVER on scrolling containers - continuous GPU repaints destroy mobile FPS.
  • Be aware of bundle size. Motion is not tiny. Three.js is large. Lazy-load anything that's not above-the-fold.
  • 仅在固定的
    pointer-events-none
    伪元素上应用颗粒或噪点滤镜,例如
    fixed inset-0 z-[60] pointer-events-none
    。绝不要应用于滚动容器,持续的 GPU 重绘会破坏移动端帧率。
  • 注意 bundle 大小。Motion 并不轻量,Three.js 体积很大。所有不在首屏之下的内容都应懒加载。

6.F Z-Index Restraint

6.F Z-Index 约束

NEVER spam arbitrary
z-50
or
z-10
. Use z-index strictly for systemic layer contexts (sticky navbars, modals, overlays, grain). Document the z-index scale in a project constants file.

绝不要随意添加
z-50
或
z-10
。z-index 只能用于系统性的层级上下文,例如 sticky navbar、modal、overlay 和 grain。在项目 constants 文件中记录 z-index 标度。

7. DIAL DEFINITIONS (Technical Reference)

7. DIAL 定义(技术参考)

DESIGN_VARIANCE (Level 1-10)

DESIGN_VARIANCE(等级 1-10)

  • 1-3 (Predictable): Symmetrical CSS Grid (12-col, equal fr-units), equal paddings, centered alignment.
  • 4-7 (Offset):
    margin-top: -2rem
    overlaps, varied image aspect ratios (4:3 next to 16:9), left-aligned headers over center-aligned data.
  • 8-10 (Asymmetric): Masonry layouts, CSS Grid with fractional units (
    grid-template-columns: 2fr 1fr 1fr
    ), massive empty zones (
    padding-left: 20vw
    ).
  • MOBILE OVERRIDE: For levels 4-10, asymmetric layouts above
    md:
    MUST collapse to strict single-column (
    w-full
    ,
    px-4
    ,
    py-8
    ) on viewports
    < 768px
    .
  • **1-3(可预测):**对称 CSS Grid(12 列、等比例 fr units)、统一 padding、居中对齐。
  • **4-7(偏移):**使用
    margin-top: -2rem
    制造重叠,使用不同图片宽高比,例如 4:3 搭配 16:9,标题左对齐而数据居中对齐。
  • **8-10(非对称):**Masonry 布局、使用分数单位的 CSS Grid(
    grid-template-columns: 2fr 1fr 1fr
    )、大面积空白区域(
    padding-left: 20vw
    )。
  • **移动端覆盖:**对于等级 4 到 10,
    md:
    以上的不对称布局在
    < 768px
    视口下必须折叠为严格单列(
    w-full
    、
    px-4
    、
    py-8
    )。

MOTION_INTENSITY (Level 1-10)

MOTION_INTENSITY(等级 1-10)

  • 1-3 (Static): No automatic animations. CSS
    :hover
    and
    :active
    states only.
    prefers-reduced-motion
    is the default mode anyway.
  • 4-7 (Fluid CSS):
    transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.3s cubic-bezier(0.16, 1, 0.3, 1)
    (name the properties; never
    transition: all
    , which also animates layout properties off the GPU, see 6.A).
    animation-delay
    cascades for load-ins.
  • 8-10 (Advanced Choreography): Complex scroll-triggered reveals, parallax, scroll-driven animation (CSS
    animation-timeline
    or GSAP ScrollTrigger). Use Motion hooks. NEVER use
    window.addEventListener('scroll')
    - it is a hard ban, not a "prefer-not." See Section 5.D for the allowed alternatives.
  • **1-3(静态):**不自动播放动画。仅使用 CSS
    :hover
    和
    :active
    状态。
    prefers-reduced-motion
    本来就是默认模式。
  • 4-7(流畅 CSS):
    transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.3s cubic-bezier(0.16, 1, 0.3, 1)
    ,明确指定属性,绝不能使用
    transition: all
    ,因为它还会动画化非 GPU 加速的布局属性,参见第 6.A 节。使用
    animation-delay
    级联实现入场效果。
  • **8-10(高级编排):**复杂的滚动触发显现、视差、滚动驱动动画(CSS
    animation-timeline
    或 GSAP ScrollTrigger)。使用 Motion hooks。绝不能使用
    window.addEventListener('scroll')
    ,这是硬性禁令,而不是“不推荐”。允许的替代方案参见第 5.D 节。

VISUAL_DENSITY (Level 1-10)

VISUAL_DENSITY(等级 1-10)

  • 1-3 (Art Gallery): Lots of white space. Huge section gaps (
    py-32
    to
    py-48
    ). Expensive, clean.
  • 4-7 (Daily App): Standard web app spacing (
    py-16
    to
    py-24
    ).
  • 8-10 (Cockpit): Tight paddings. No card boxes; 1px lines separate data. Mandatory:
    font-mono
    for all numbers.

  • **1-3(艺术画廊):**大量留白。超大区块间距(
    py-32
    到
    py-48
    )。昂贵且干净。
  • **4-7(日常 App):**标准 Web App 间距(
    py-16
    到
    py-24
    )。
  • **8-10(驾驶舱):**紧凑 padding。不使用卡片盒子,使用 1px 分隔线区分数据。强制所有数字使用
    font-mono
    。

8. DARK MODE PROTOCOL

8. DARK MODE 协议

Dual-mode by default. Never assume light-only unless the brief is print-emulating editorial.
默认支持双模式。除非 brief 是模拟印刷品的编辑类设计,否则绝不能假定仅使用浅色模式。

8.A Token Strategy (pick one, stick to it)

8.A Token 策略(选择一种并保持一致)

  • Tailwind
    dark:
    variant
    (default for utility-first projects): every color utility paired with its dark variant (
    bg-white dark:bg-zinc-950
    ,
    text-gray-900 dark:text-gray-100
    ).
  • CSS variables (for shadcn/ui, Radix Themes, or component libraries with theming): define semantic tokens (
    --surface
    ,
    --surface-elevated
    ,
    --text-primary
    ,
    --accent
    ) and swap values under
    [data-theme="dark"]
    or
    @media (prefers-color-scheme: dark)
    .
  • Tailwind
    dark:
    变体
    (utility-first 项目的默认方案):每个颜色 utility 都搭配 dark 变体,例如
    bg-white dark:bg-zinc-950
    、
    text-gray-900 dark:text-gray-100
    。
  • CSS variables(适用于 shadcn/ui、Radix Themes 或带主题能力的组件库):定义语义 tokens,例如
    --surface
    、
    --surface-elevated
    、
    --text-primary
    、
    --accent
    ,并在
    [data-theme=\u0022dark\u0022]
    或
    @media (prefers-color-scheme: dark)
    下替换值。

8.B Do Not Prescribe Specific Colors Here

8.B 此处不规定具体颜色

The brief and brand decide. This skill enforces only:
  • Contrast - WCAG AA minimum for body text, AAA target for hero copy.
  • Hierarchy parity - visual hierarchy that works in light must work in dark. If a CTA pops in light, it pops in dark.
  • Brand fidelity - primary brand color stays recognisable. Don't desaturate the brand into a dark mode.
  • No pure
    #000000
    and no pure
    #ffffff
    - use off-black (zinc-950, near-black warm gray) and off-white. Pure values kill depth.
Brief 和品牌决定颜色。本 skill 只强制以下规则:
  • **对比度:**正文至少达到 WCAG AA,Hero 文案以 AAA 为目标。
  • **层级一致性:**在浅色模式下有效的视觉层级,在深色模式下也必须有效。如果 CTA 在浅色模式下很醒目,在深色模式下也必须同样醒目。
  • **品牌忠实度:**主要品牌色应保持可识别。不要为了适配深色模式而降低品牌色饱和度。
  • 不使用纯
    #000000
    和纯
    #ffffff
    ,使用近黑色(zinc-950、暖调近黑灰色)和近白色。纯色值会破坏空间深度。

8.C Default Mode

8.C 默认模式

Respect
prefers-color-scheme
unless the brand insists. Add a manual toggle if either mode would lose key brand expression.
除非品牌坚持,否则遵循
prefers-color-scheme
。如果任一模式都会损失关键品牌表达,可以添加手动切换。

8.D Test in Both Modes Before Finishing

8.D 完成前在两种模式下测试

Open the page in both modes during development. Do not ship a page you've only seen in one mode.

开发过程中要在两种模式下打开页面。不要只在一个模式下查看后就发布。

9. AI TELLS (Forbidden Patterns)

9. AI 特征(禁止模式)

Avoid these signatures unless the brief explicitly asks for them.
除非 brief 明确要求,否则避免以下特征。

9.A Visual & CSS

9.A 视觉与 CSS

  • NO neon / outer glows by default. Use inner borders or subtle tinted shadows.
  • NO pure black (
    #000000
    ).
    Off-black, zinc-950, or charcoal.
  • NO oversaturated accents. Desaturate to blend with neutrals.
  • NO excessive gradient text for large headers.
  • NO custom mouse cursors. Outdated, accessibility-hostile, perf-hostile.
  • 默认禁止霓虹或外发光。改用内边框或轻微的带色阴影。
  • **禁止纯黑色(
    #000000
    )。**使用近黑色、zinc-950 或 charcoal。
  • **禁止过度饱和的强调色。**降低饱和度,使其与中性色融合。
  • 大标题禁止使用过度渐变文字。
  • **禁止自定义鼠标光标。**这种做法过时、对无障碍不友好,而且影响性能。

9.B Typography

9.B 字体排印

  • AVOID Inter as default. See Section 4.1. Override path exists.
  • NO oversized H1s that just scream. Control hierarchy with weight + color, not raw scale.
  • Serif constraints: Serif for editorial / luxury / publication. Not for dashboards.
  • **避免将 Inter 作为默认字体。**参见第 4.1 节。存在覆盖路径。
  • **禁止单纯为了制造视觉冲击而使用超大 H1。**通过字重与颜色控制层级,而不是只扩大字号。
  • **Serif 约束:**Serif 适用于编辑类、奢华和出版物,不适用于仪表盘。

9.C Layout & Spacing

9.C 布局与间距

  • Mathematically perfect padding and margins. No floating elements with awkward gaps.
  • NO 3-column equal feature cards. The generic "three identical cards horizontally" feature row is banned. Use 2-column zig-zag, asymmetric grid, scroll-pinned, or horizontal-scroll alternative.
  • 避免数学上过于完美的 padding 和 margin。不要让元素漂浮在尴尬的间隙中。
  • **禁止三列等宽功能卡片。**通用的“三个相同卡片横向排列”功能行已被禁止。改用双列 zigzag、非对称网格、scroll-pinned 或横向滚动替代方案。

9.D Content & Data ("Jane Doe" Effect)

9.D 内容与数据(“Jane Doe 效应”)

  • NO generic names. "John Doe", "Sarah Chan", "Jack Su" → use creative, realistic, locale-appropriate names.
  • NO generic avatars. No SVG "egg" or Lucide user icons → use believable photo placeholders or specific styling.
  • NO fake-perfect numbers. Avoid
    99.99%
    ,
    50%
    ,
    1234567
    . Use organic, messy data (
    47.2%
    ,
    +1 (312) 847-1928
    ).
  • NO startup-slop brand names. "Acme", "Nexus", "SmartFlow", "Cloudly" → invent contextual, premium names that sound real.
  • NO filler verbs. "Elevate", "Seamless", "Unleash", "Next-Gen", "Revolutionize" → concrete verbs only.
  • **禁止通用姓名。**不要使用“John Doe”“Sarah Chan”“Jack Su”,应使用有创意、真实且符合地域的名称。
  • **禁止通用头像。**不要使用 SVG “egg” 或 Lucide 用户图标,应使用可信的照片占位素材或明确的个性化样式。
  • **禁止虚假完美数字。**避免
    99.99%
    、
    50%
    、
    1234567
    ,使用自然且略带凌乱的数据,例如
    47.2%
    、
    +1 (312) 847-1928
    。
  • **禁止创业粗制滥造品牌名。**不要使用“Acme”“Nexus”“SmartFlow”“Cloudly”,应创造符合语境、具有高端感且听起来真实的名字。
  • **禁止填充型动词。**不要使用“Elevate”“Seamless”“Unleash”“Next-Gen”“Revolutionize”,只使用具体动词。

9.E External Resources & Components

9.E 外部资源与组件

  • NO hand-rolled SVG icons. Use Phosphor / HugeIcons / Radix / Tabler. Lucide on explicit request only.
  • Hand-rolled decorative SVGs strongly discouraged as default (see Section 4.8).
  • NO div-based fake screenshots. Never build a fake product UI out of
    <div>
    rectangles to simulate a screenshot. Use real images, generated images, or skip the preview.
  • NO broken Unsplash links. Use
    https://picsum.photos/seed/{descriptive-string}/{w}/{h}
    , or generated photo placeholders, or actual assets.
  • shadcn/ui customization: Allowed, but NEVER in default state. Customize radii, colors, shadows, typography to the project aesthetic.
  • Production-Ready Cleanliness: Code visually clean, memorable, meticulously refined.
  • **禁止手写 SVG 图标。**使用 Phosphor、HugeIcons、Radix 或 Tabler。只有用户明确要求时才使用 Lucide。
  • 默认强烈不建议手写装饰性 SVG,参见第 4.8 节。
  • **禁止使用 div 拼装假截图。**绝不能使用
    <div>
    矩形制作虚假的 screenshot 式产品 UI。应使用真实图片、生成图片,或直接省略预览。
  • **禁止失效的 Unsplash 链接。**使用
    https://picsum.photos/seed/{descriptive-string}/{w}/{h}
    、生成的图片占位素材,或真实素材。
  • **shadcn/ui 定制:**允许使用,但绝不能交付默认状态。应根据项目美学定制 radii、颜色、阴影和字体排印。
  • **生产级整洁度:**代码应在视觉上干净、有辨识度,并经过细致打磨。

9.F Production-Test Tells (banned outright)

9.F 生产测试特征(直接禁止)

These patterns came out of real LLM-generated landing-page tests. They are the signatures the model defaults to when it tries to "look designed." Treat them as hard bans unless the brief explicitly calls for one.
Hero & top-of-page
  • NO version labels in the hero.
    V0.6
    ,
    v2.0
    ,
    BETA
    ,
    INVITE-ONLY PREVIEW
    ,
    EARLY ACCESS
    ,
    ALPHA
    - banned as default eyebrows. Only acceptable when the brief is explicitly about a product launch / preview status.
  • NO "Brand · No. 01"-style sub-eyebrows. "Marrow · No. 01 · The 6-quart" type micro-meta lines. Skip them.
Section numbering & micro-labels
  • NO section-number eyebrows.
    00 / INDEX
    ,
    001 · Capabilities
    ,
    002 · Featured commission
    ,
    06 · how it works
    ,
    05 · The honest table
    - banned. Eyebrows should name the topic in plain language, not enumerate.
  • NO
    01 / 4
    -style pagination on images or bento tiles.
    If the user can count, they don't need the label.
  • NO
    Scroll · 001 Capabilities
    -style scroll cues.
    A simple arrow or "Scroll" is enough; no section-number prefix.
  • NO "Index of Work, 2018 - 2026"-style range labels as eyebrows. Just say what the section is.
Separators & dots
  • The middle-dot (
    ·
    ) is rationed.
    Maximum 1 per line in metadata strips. Do NOT use it as the default separator for everything ("foo · bar · baz · qux · quux"). If you need a separator family, prefer line breaks, hairlines, or columns.
  • NO decorative colored status dots on every list/nav/badge. A colored dot before "ONE Q4 SLOT OPEN" or before every nav link, or every task row - banned by default. Acceptable only when the dot conveys actual semantic state (a server status, an availability flag) and is used sparingly.
Em-dashes & typography flourishes
  • NO em-dash (
    —
    ) as a design element OR anywhere else.
    See Section 9.G below for the complete, non-negotiable ban. The em-dash character is forbidden in headlines, eyebrows, pills, body copy, quotes, attribution, captions, button text, and alt text. Use the regular hyphen (
    -
    ).
  • NO
    <br>
    -broken-and-italicized headlines
    as a default "design move." "for thirty<br>years." type splits. Headlines should read naturally first, get clever only when the brief demands it.
  • NO vertical rotated text ("INDEX OF WORK, 2018 - 2026" rotated 90°). Agency-portfolio cliché. Use it only when the brief is explicitly agency / Awwwards / experimental AND it serves a real composition purpose.
  • NO crosshair / hairline grid lines as decoration. Vertical and horizontal lines drawn just to make the page "feel designed" - banned. Use them only when they organize real content.
Fake product previews
  • NO div-based fake product UI in the hero (fake task list, fake terminal, fake dashboard built from styled divs). It is the #1 LLM-design Tell. Use a real screenshot, a generated image, a real component preview, or none at all.
  • NO fake version footers ("v0.6.2-rc.1", "last sync 4s ago · main") inside fake screenshots. Adds nothing, screams AI.
Marketing-copy Tells
  • NO "Quietly in use at" / "Quietly trusted by" social-proof headers. Use natural language: "Trusted by", "Used at", "Customers include", or skip the heading entirely if the logos speak.
  • NO "From the field" / "Field notes" / "Currently on the bench" / "On our desks" / "Loose plates" style poetic labels on quote, blog, or sidebar sections. Reads as performative-craftsman. Use plain functional labels ("Testimonials", "Latest writing", "Now working on") or skip the label.
  • NO "We respect the French ones"-style mock-humble industry-references in body copy. Cute and AI-y.
  • NO weather / locale strips ("LIS 14:23 · 18°C") in headers/footers unless the brief is explicitly about a place / time-zone-distributed studio.
  • NO micro-meta-sentences under eyebrows. Sentences like "Each of these is a feature we ship today, not a roadmap promise. The list will stay short on purpose." sitting under a section heading are clutter. Eyebrow + Headline + Body is enough.
  • NO generic step labels. "Stage 1 / Stage 2 / Stage 3", "Step 1 / Step 2 / Step 3", "Phase 01 / Phase 02 / Phase 03", "Pass One / Pass Two / Pass Three". Banned. The actual step content is the label. If you must show progression, use the verb-noun directly ("Install", "Configure", "Ship") not "Stage 1: Install".
Pills, labels and version stamps
  • NO pills/labels/tags overlaid on images. No
    <span>
    overlays on photos with tags like
    Brand · 02
    ,
    PLATE · BRAND
    ,
    Field notes - journal
    . Either let the image speak alone, or add a caption directly below (outside the image).
  • NO photo-credit captions as decoration. Strings like
    Field study no. 12 · Ines Caetano
    ,
    Plate 03 · House archive
    ,
    Frame XII · 35mm
    under stock/picsum images are pretentious. Photo credit is allowed ONLY when there is a real photographer being credited for a real photo (with permission). Otherwise: skip the caption or use a one-line functional caption ("The 6-quart, in Sage.").
  • NO version footers on marketing pages. Footer strings like
    v1.4.2
    ,
    Build 0048
    ,
    last sync 4s ago · main
    are CLI / devtool fixtures, not landing-page content. Banned on marketing/landing/portfolio pages.
  • NO "Reservation 412 of 800"-style live-stock counters as decoration. Only if the brief is explicitly a limited-run waitlist with real data.
Decoration text strips
  • NO decoration text strip at hero bottom. Patterns like
    BRAND. MOTION. SPATIAL.
    ,
    TYPE / FORM / MOTION
    ,
    DESIGN · BUILD · SHIP
    ,
    ESTD. 2018 · LISBON · BRAND. MOTION. SPATIAL.
    as a small mono-caps strip across the bottom of the hero are an agency-portfolio cliché. Banned by default. Only acceptable when the strip carries real, navigable links (sticky bottom nav) or real status info (cookie banner, build info on a docs site).
  • NO floating top-right sub-text in section headings. Pattern: section has a giant left-aligned headline; in the top-right corner of the same section header there is a small explainer paragraph floating with no clear alignment to anything else. That floater is the Tell. Either put the sub-text directly under the headline, or build a clean 2-column header (left: headline, right: aligned body), but not a tiny corner paragraph.
Lists, dividers and scoring
  • NO
    border-t
    +
    border-b
    on every row of a long list / spec table.
    Pick one (bottom-border between rows OR top-border above the group) and use it sparsely. A 10-row spec table with hairlines under each row is the laziest layout - see Section 4.9 for alternative UI components.
  • NO scoring/progress bars with filled background tracks as comparison visuals. If you need to show "X out of Y" comparisons, prefer a number + small icon, or a tiny inline bar WITHOUT a background track. Big filled
    bg-zinc-200
    tracks with a partial fill on top are dashboard-UI clutter on a landing page.
Locale, time, scroll cues
  • Locale / city-name / time / weather strips are banned for 99% of briefs. "Lisbon, working with founders" in the hero, "1200-690 Lisbon, Portugal" in the footer, "Lisbon 14:23 · 18°C" in the nav. These are agency-portfolio decoration tells. Allowed ONLY when: the brief explicitly describes a globally-distributed studio with timezone-relevant work, OR a travel-focused brand, OR a real-world physical venue. A single contact-address mention in the footer is fine; an atmospheric locale strip is not.
  • Scroll cues are banned.
    Scroll
    ,
    ↓ scroll
    ,
    Scroll to explore
    ,
    Scroll to walk through it
    , animated mouse-wheel icons. If the user has not scrolled yet, they are looking at the hero. They know what scroll is. The bottom of the viewport does not need a label.
  • ZERO decorative status dots by default. A coloured dot before nav items, before list rows, before badges, before status labels is a Tell. Only acceptable when conveying real semantic state (a live indicator on actual server status, a live availability flag) and limited to one per page section.
以下模式来自真实的 LLM 生成落地页测试,是模型试图“看起来像经过设计”时产生的标志。除非 brief 明确要求,否则一律视为硬性禁令。
Hero 与页面顶部
  • Hero 中禁止版本标签。
    V0.6
    、
    v2.0
    、
    BETA
    、
    INVITE-ONLY PREVIEW
    、
    EARLY ACCESS
    、
    ALPHA
    默认禁止。只有当 brief 明确涉及产品发布或预览状态时才可接受。
  • **禁止“Brand · No. 01”式子 eyebrow。**不要使用“Marrow · No. 01 · The 6-quart”这类微型元信息行。
区块编号与微型标签
  • 禁止使用区块编号 eyebrow。
    00 / INDEX
    、
    001 · Capabilities
    、
    002 · Featured commission
    、
    06 / how it works
    、
    05 / The honest table
    均被禁止。Eyebrow 应使用平实语言说明主题,而不是进行枚举。
  • **禁止在图片或 Bento 磁贴上使用
    01 / 4
    式分页。**如果用户能够自行计数,就不需要标签。
  • **禁止使用
    Scroll · 001 Capabilities
    式滚动提示。**简单箭头或“Scroll”已经足够,不要添加区块编号前缀。
  • **禁止将“Index of Work, 2018 - 2026”式范围标签用作 eyebrow。**直接说明区块主题即可。
分隔符与圆点
  • **中点(
    ·
    )应受到限制。**每行元信息最多使用 1 个。不要将其作为所有内容的默认分隔符,例如“foo · bar · baz · qux · quux”。需要分隔时,优先使用换行、hairline 或分栏。
  • **禁止在每个列表、导航或徽章前添加装饰性彩色状态圆点。**例如在“ONE Q4 SLOT OPEN”或每个导航项、任务行前添加彩色圆点,默认禁止。只有圆点表达真实语义状态,例如服务器状态或可用性标记时才能使用,并且要少量使用。
Em-dash 与字体修饰
  • **绝不能将 em-dash(
    —
    )作为设计元素,也绝不能在其他任何位置使用。**完整规则参见第 9.G 节。禁止在标题、eyebrow、pills、正文、引用、署名、caption、按钮文字和 alt text 中使用 em-dash。改用普通连字符(
    -
    )。
  • 默认**禁止使用
    <br>
    分割并斜体化标题作为设计动作。**例如“for thirty\<br>years.”式拆分。标题应首先自然易读,只有 brief 明确要求时才使用巧妙表达。
  • 禁止使用垂直旋转文字,例如“INDEX OF WORK, 2018 - 2026”旋转 90 度。这是代理公司作品集的陈词滥调。只有当 brief 明确要求代理公司、Awwwards 或实验性风格,并且它服务于真实的构图目的时才可使用。
  • **禁止使用十字准星或 hairline 网格线作为装饰。**只为营造“设计感”而绘制的水平和垂直线均被禁止。只有在它们用于组织真实内容时才可使用。
虚假产品预览
  • Hero 中禁止使用 div 拼装的虚假产品 UI,例如用带样式的 div 制作虚假任务列表、终端或仪表盘。这是首要 AI 设计特征。使用真实截图、生成图片、真实组件预览,或者完全不展示。
  • 禁止在虚假截图中使用虚假版本页脚,例如“v0.6.2-rc.1”“last sync 4s ago · main”。这些信息毫无意义,只会暴露 AI 痕迹。
营销文案特征
  • **禁止使用“Quietly in use at”或“Quietly trusted by”式社交证明标题。**改用自然语言,例如“Trusted by”“Used at”“Customers include”,或者在 logo 本身已经足够时省略标题。
  • **禁止在引用、博客或侧边栏区块使用“From the field”“Field notes”“Currently on the bench”“On our desks”“Loose plates”式诗意标签。**这些内容会显得像刻意的工匠姿态。使用平实的功能性标签,例如“Testimonials”“Latest writing”“Now working on”,或者省略标签。
  • **禁止在正文中使用“We respect the French ones”式假装谦虚的行业引用。**这种表达可爱但 AI 感明显。
  • 除非 brief 明确描述特定地点或跨时区运营的工作室,否则禁止在 Header 或 Footer 中使用天气、地区信息条,例如
    LIS 14:23 · 18°C
    。
  • **禁止在 eyebrow 下方使用微型元信息句子。**例如“Each of these is a feature we ship today, not a roadmap promise. The list will stay short on purpose.” 放在区块标题下只会制造 clutter。Eyebrow + Headline + Body 已经足够。
  • 禁止使用通用步骤标签。“Stage 1 / Stage 2 / Stage 3”“Step 1 / Step 2 / Step 3”“Phase 01 / Phase 02 / Phase 03”“Pass One / Pass Two / Pass Three” 均被禁止。实际步骤内容就是标签。如果必须展示流程,直接使用动词加名词,例如“Install”“Configure”“Ship”,不要使用“Stage 1: Install”。
Pills、标签与版本戳
  • **禁止在图片上叠加 pills、labels 或 tags。**不要在照片上叠加
    Brand · 02
    、
    PLATE · BRAND
    、
    Field notes - journal
    等
    <span>
    。让图片独立表达,或在图片下方添加 caption。
  • **禁止使用装饰性照片署名 caption。**例如在 stock 或 picsum 图片下使用
    Field study no. 12 · Ines Caetano
    、
    Plate 03 · House archive
    、
    Frame XII · 35mm
    。只有真实摄影师确实创作了该照片并获得许可时才可署名,否则应省略,或使用一行功能性 caption,例如“The 6-quart, in Sage.”。
  • 营销页面禁止版本页脚。
    v1.4.2
    、
    Build 0048
    、
    last sync 4s ago · main
    等页脚字符串属于 CLI 或开发工具界面元素,不属于落地页内容。
  • **禁止将“Reservation 412 of 800”式实时库存计数器用作装饰。**只有当 brief 明确说明这是基于真实数据的限量候补名单时才可使用。
装饰性文字条
  • **禁止在 Hero 底部使用装饰性文字条。**例如
    BRAND. MOTION. SPATIAL.
    、
    TYPE / FORM / MOTION
    、
    DESIGN · BUILD · SHIP
    、
    ESTD. 2018 · LISBON · BRAND. MOTION. SPATIAL.
    这种横跨 Hero 底部的小号等宽大写文字,是代理公司作品集的典型陈词滥调,默认禁止。只有该文字条承载真实可导航链接,例如 sticky bottom nav,或真实状态信息,例如 cookie banner、文档站点的 build info,才可使用。
  • **禁止在区块标题右上角悬浮小号文字。**典型模式是区块有一个巨大的左对齐标题,右上角却漂浮一段没有明确对齐关系的小字。这是明显的 AI 特征。应将小字直接放在标题下方,或构建干净的二栏标题,左侧标题,右侧对齐正文,不要使用微型角落段落。
列表、分隔线与评分
  • **禁止在长列表或规格表的每一行同时使用
    border-t
    和
    border-b
    。**选择其中一种,行间使用 bottom border 或分组上方使用 top border,并且稀疏使用。10 行规格表每行都加 hairline 是最偷懒的布局,替代方案参见第 4.9 节。
  • **禁止使用带填充背景轨道的评分或进度条作为对比视觉。**如果需要展示“X out of Y”式对比,优先使用数字加小图标,或使用不带背景轨道的细小内联条。大型填充式
    bg-zinc-200
    轨道加部分填充,在落地页中属于 dashboard UI clutter。
地区、时间与滚动提示
  • **99% 的 brief 都禁止地区、城市名、时间和天气信息条。**例如 Hero 中的“Lisbon, working with founders”,Footer 中的“1200-690 Lisbon, Portugal”,导航中的“Lisbon 14:23 · 18°C”。这些属于代理公司作品集的装饰性 AI 特征。只有当 brief 明确描述跨时区运营的全球工作室、旅行相关品牌或真实线下场所时才允许。Footer 中提及一次联系地址没有问题,但不能用氛围化地区信息条。
  • 禁止滚动提示。
    Scroll
    、
    ↓ scroll
    、
    Scroll to explore
    、
    Scroll to walk through it
    、动画鼠标滚轮图标都不允许。如果用户还没有滚动,说明他正在看 Hero。用户知道需要滚动,视口底部不需要额外标签。
  • **默认禁止使用零装饰性状态圆点。**导航项、列表行、徽章和状态标签前的彩色圆点都是 AI 特征。只有传达真实语义状态时才能使用,例如真实服务器状态的 live indicator 或 live availability flag,并且每个区块最多限制为一个。

9.G EM-DASH BAN (the single most-violated Tell)

9.G EM-DASH 禁止规则(最常被违反的 AI 特征)

Em-dash (
—
) is COMPLETELY banned.
It is the LLM's signature stylistic crutch and it is the #1 visual Tell in production tests. There is no "limited use" allowance, no "natural language frequency" allowance, no "in body copy is fine" allowance. None.
  • Banned in headlines. Use a period or a comma.
  • Banned in eyebrows / labels / pills / button text / image captions / nav items. Replace with line breaks, columns, or hairlines.
  • Banned in body copy. Restructure the sentence: two sentences with a period, OR a comma, OR parentheses, OR a colon.
  • Banned in quote attribution. Use a normal hyphen with spaces (
    -
    ) or a line break + smaller-weight name.
  • Banned in en-dash form too (
    –
    ) when used as a separator.
    Date ranges (
    2018-2026
    ) use a hyphen. Number ranges (
    €40-80k
    ) use a hyphen.
The ONLY permitted dash characters on the page are:
  • Regular hyphen
    -
    (for compound words, ranges, line dividers in markup)
  • Minus sign in math (
    -5°C
    )
If your output contains a single
—
or
–
anywhere visible to the user, the output fails the Pre-Flight Check and must be rewritten.
This rule is non-negotiable. The agent has historically ignored em-dash limits when phrased as "use sparingly." The phrasing here is binary: zero em-dashes.

**Em-dash(
—
)被完全禁止。**它是 LLM 典型的风格拐杖,也是生产测试中排名第一的视觉特征。不存在“有限使用”例外,也不存在“自然语言频率控制”例外,更不存在“正文中可以使用”例外。
  • **标题中禁止。**使用句号或逗号。
  • **Eyebrow、labels、pills、按钮文字、图片 caption、导航项中禁止。**改用换行、分栏或 hairline。
  • **正文中禁止。**重构句子:拆成两个使用句号的句子,或使用逗号、括号、冒号。
  • **引用署名中禁止。**使用带空格的普通连字符(
    -
    ),或换行后使用较小字重的姓名。
  • **作为分隔符时,en-dash(
    –
    )同样禁止。**日期范围(
    2018-2026
    )使用连字符。数字范围(
    €40-80k
    )使用连字符。
页面上唯一允许的 dash 字符是:
  • 普通连字符
    -
    ,用于复合词、范围和标记中的行分隔
  • 数学中的负号,例如
    -5°C
如果输出中任何用户可见位置出现一个
—
或
–
,输出就会未通过 Pre-Flight Check,必须重写。
此规则不可协商。历史上,当规则被表述为“谨慎使用”时,Agent 经常无视 em-dash 限制。这里的要求是二元的:零 em-dash。

10. REFERENCE VOCABULARY (Pattern Names the Agent Should Know)

10. 参考词汇表(Agent 应当掌握的 Pattern 名称)

This is a vocabulary, not a library. The agent should KNOW these pattern names to communicate about them, design with them in mind, and reach for them when the design read calls for them. Implementations and code sketches live in the Block Library (Section 12), which is populated iteratively.
这是一个词汇表,不是库。Agent 应了解这些 pattern 名称,以便沟通、构思,并在设计判断需要时调用。具体实现和代码草图位于第 12 节的 Block Library 中,该库会逐步补充。

Hero Paradigms

Hero 范式

  • Asymmetric Split Hero - Text on one side, asset on the other, generous white space.
  • Editorial Manifesto Hero - Large type, no asset, almost-poster.
  • Video / Media Mask Hero - Type cut out as mask over video background.
  • Kinetic-Type Hero - Animated typography as the primary visual.
  • Curtain-Reveal Hero - Hero parts on scroll like a curtain.
  • Scroll-Pinned Hero - Hero stays pinned while content scrolls behind.
  • Asymmetric Split Hero:文字位于一侧,素材位于另一侧,保留充足留白。
  • Editorial Manifesto Hero:大型字体,无素材,近似海报。
  • Video / Media Mask Hero:文字作为遮罩叠在视频背景上。
  • Kinetic-Type Hero:动态字体作为主要视觉。
  • Curtain-Reveal Hero:Hero 各部分在滚动时像幕布一样展开。
  • Scroll-Pinned Hero:Hero 保持固定,内容从其后方滚动。

Navigation & Menus

导航与菜单

  • Mac OS Dock Magnification - Edge nav, icons scale fluidly on hover.
  • Magnetic Button - Pulls toward cursor.
  • Gooey Menu - Sub-items detach like viscous liquid.
  • Dynamic Island - Morphing pill for status / alerts.
  • Contextual Radial Menu - Circular menu expanding at click point.
  • Floating Speed Dial - FAB springing into curved secondary actions.
  • Mega Menu Reveal - Full-screen dropdown, stagger-fade content.
  • Mac OS Dock Magnification:边缘导航,图标在 hover 时缩放。
  • Magnetic Button:向光标方向吸附。
  • Gooey Menu:子项像黏性液体一样分离。
  • Dynamic Island:用于状态或提醒的 Morphing pill。
  • Contextual Radial Menu:从点击位置展开的圆形菜单。
  • Floating Speed Dial:FAB 弹入弧形次级操作区。
  • Mega Menu Reveal:全屏 dropdown,使用交错淡入。

Layout & Grids

布局与网格

  • Bento Grid - Asymmetric tile grouping (Apple Control Center).
  • Masonry Layout - Staggered grid, no fixed row height.
  • Chroma Grid - Borders / tiles with subtle animating gradients.
  • Split-Screen Scroll - Two halves sliding in opposite directions.
  • Sticky-Stack Sections - Sections that pin and stack on scroll.
  • Bento Grid:非对称磁贴分组,参考 Apple Control Center。
  • Masonry Layout:交错网格,没有固定行高。
  • Chroma Grid:带有细微动态渐变的边框或磁贴。
  • Split-Screen Scroll:两半内容向相反方向滑动。
  • Sticky-Stack Sections:滚动时固定并堆叠的区块。

Cards & Containers

卡片与容器

  • Parallax Tilt Card - 3D tilt tracking mouse coordinates.
  • Spotlight Border Card - Borders illuminate under cursor.
  • Glassmorphism Panel - Frosted glass with inner refraction.
  • Holographic Foil Card - Iridescent rainbow shift on hover.
  • Tinder Swipe Stack - Physical card stack, swipe-away.
  • Morphing Modal - Button expands into its own dialog.
  • Parallax Tilt Card:根据鼠标坐标进行 3D 倾斜。
  • Spotlight Border Card:边框在光标下被照亮。
  • Glassmorphism Panel:带内部折射的磨砂玻璃。
  • Holographic Foil Card:hover 时产生虹彩偏移。
  • Tinder Swipe Stack:具有物理堆叠和滑走效果的卡片栈。
  • Morphing Modal:按钮扩展为自身对应的 dialog。

Scroll Animations

滚动动画

  • Sticky Scroll Stack - Cards stick and physically stack.
  • Horizontal Scroll Hijack - Vertical scroll → horizontal pan.
  • Locomotive / Sequence Scroll - Video / 3D sequence tied to scrollbar.
  • Zoom Parallax - Central background image zooming on scroll.
  • Scroll Progress Path - SVG line drawing along scroll.
  • Liquid Swipe Transition - Page transition like viscous liquid.
  • Sticky Scroll Stack:卡片在滚动时固定并产生物理堆叠效果。
  • Horizontal Scroll Hijack:垂直滚动转为横向平移。
  • Locomotive / Sequence Scroll:视频或 3D 序列与滚动条同步。
  • Zoom Parallax:中央背景图随滚动缩放。
  • Scroll Progress Path:SVG 线条随滚动绘制。
  • Liquid Swipe Transition:页面以黏性液体方式过渡。

Galleries & Media

Gallery 与媒体

  • Dome Gallery - 3D panoramic gallery.
  • Coverflow Carousel - 3D carousel with angled edges.
  • Drag-to-Pan Grid - Boundless draggable canvas.
  • Accordion Image Slider - Narrow strips expanding on hover.
  • Hover Image Trail - Mouse leaves popping image trail.
  • Glitch Effect Image - RGB-channel shift on hover.
  • Dome Gallery:3D 全景 gallery。
  • Coverflow Carousel:带有倾斜边缘的 3D carousel。
  • Drag-to-Pan Grid:可拖动平移的无边界 canvas。
  • Accordion Image Slider:窄条在 hover 时展开。
  • Hover Image Trail:鼠标离开时弹出图片轨迹。
  • Glitch Effect Image:hover 时进行 RGB 通道偏移。

Typography & Text

字体与文字

  • Kinetic Marquee - Endless text bands reversing on scroll.
  • Text Mask Reveal - Massive type as transparent window to video.
  • Text Scramble Effect - Matrix-style decoding on load / hover.
  • Circular Text Path - Text curving along spinning circle.
  • Gradient Stroke Animation - Outlined text with running gradient.
  • Kinetic Typography Grid - Letters dodging the cursor.
  • Kinetic Marquee:循环反向滚动的文字带。
  • Text Mask Reveal:大型字体作为视频上的透明窗口。
  • Text Scramble Effect:加载或 hover 时进行 Matrix 风格解码。
  • Circular Text Path:文字沿旋转圆弧排列。
  • Gradient Stroke Animation:描边文字运行渐变。
  • Kinetic Typography Grid:字母避开光标。

Micro-Interactions & Effects

微交互与效果

  • Particle Explosion Button - CTA shatters into particles on success.
  • Liquid Pull-to-Refresh - Reload indicator like detaching droplets.
  • Skeleton Shimmer - Shifting light reflection across placeholders.
  • Directional Hover-Aware Button - Fill enters from cursor's exact side.
  • Ripple Click Effect - Wave from click coordinates.
  • Animated SVG Line Drawing - Vectors drawing themselves in real time.
  • Mesh Gradient Background - Organic lava-lamp blobs.
  • Lens Blur Depth - Background UI blurred to focus foreground action.
  • Particle Explosion Button:成功时 CTA 炸裂为粒子。
  • Liquid Pull-to-Refresh:以脱离水滴的方式展示刷新指示器。
  • Skeleton Shimmer:光线在占位内容上移动。
  • Directional Hover-Aware Button:填充从光标所在方向进入。
  • Ripple Click Effect:从点击坐标扩散波纹。
  • Animated SVG Line Drawing:矢量图在实时绘制自身。
  • Mesh Gradient Background:像熔岩灯一样变化的有机色块。
  • Lens Blur Depth:背景 UI 模糊,以聚焦前景操作。

Animation Library Choice

动画库选择

  • Motion (
    motion/react
    )
    - default for UI / Bento / state-change motion.
  • GSAP + ScrollTrigger - for full-page scrolltelling and scroll hijacks. Isolate in dedicated leaf components with
    useEffect
    cleanup.
  • Three.js / WebGL - for canvas backgrounds and 3D scenes. Same isolation rule.
  • NEVER mix GSAP / Three.js with Motion in the same component tree. They fight over the same frames.

  • Motion(
    motion/react
    )
    :UI、Bento 和状态变化动效的默认选择。
  • GSAP + ScrollTrigger:用于全页面 scrolltelling 和滚动劫持。隔离在专用叶子组件中,并使用
    useEffect
    清理。
  • Three.js / WebGL:用于 canvas 背景和 3D 场景。采用同样的隔离规则。
  • **绝不要在同一组件树中混用 GSAP / Three.js 与 Motion。**它们会争抢同一帧的渲染控制权。

11. REDESIGN PROTOCOL

11. 重设计协议

This skill handles greenfield builds AND redesigns. Misclassifying the mode is the single biggest source of bad redesign output.
本 skill 同时支持全新构建和重设计。错误判断模式是造成糟糕重设计输出的最大单一原因。

11.A Detect the Mode (first action)

11.A 检测模式(第一步)

  • Greenfield - no existing site, or full overhaul approved. Dial baseline from Section 1.
  • Redesign - Preserve - modernise without breaking the brand. Audit first, extract brand tokens, evolve gradually.
  • Redesign - Overhaul - new visual language on top of existing content. Treat as greenfield for visuals; preserve content and IA.
If ambiguous, ask once: "Should this redesign preserve the existing brand, or are we starting visually from scratch?"
  • 全新构建:没有现有网站,或已批准彻底改造。dial 基线来自第 1 节。
  • 重设计 - 保留:在不让品牌失效的前提下进行现代化改造。先审计,提取品牌 tokens,逐步演进。
  • 重设计 - 彻底改造:在现有内容之上建立新的视觉语言。视觉层面按全新构建处理,同时保留内容和 IA。
如果存在歧义,只询问一次:“这次重设计应保留现有品牌,还是从视觉上重新开始?”

11.B Audit Before Touching

11.B 动手前先审计

Document the current state before proposing changes:
  • Brand tokens - primary / accent colors, type stack, logo treatment, radii.
  • Information architecture - page tree, primary nav, key conversion paths.
  • Content blocks - what exists, what's doing work, what's filler.
  • Patterns to preserve - signature interactions, recognisable hero, copy voice.
  • Patterns to retire - AI-slop tells, broken layouts, dead links, generic stock imagery, perf traps.
  • Dial reading of the existing site - infer current
    DESIGN_VARIANCE
    /
    MOTION_INTENSITY
    /
    VISUAL_DENSITY
    . That's your starting point, not the baseline.
  • SEO baseline - current ranking pages, meta titles, structured data, OG cards. SEO migration is the #1 redesign risk.
提出更改之前,先记录当前状态:
  • 品牌 tokens:主要颜色与强调色、字体栈、logo 处理方式、radii。
  • 信息架构:页面树、主要导航、关键转化路径。
  • 内容区块:现有内容、发挥作用的内容以及填充内容。
  • 需要保留的模式:标志性交互、可识别 Hero、文案语气。
  • 需要淘汰的模式:AI 粗制滥造特征、损坏布局、失效链接、通用 stock 图片、性能陷阱。
  • 现有网站的 dial 判断:推断当前的
    DESIGN_VARIANCE
    /
    MOTION_INTENSITY
    /
    VISUAL_DENSITY
    。这是起点,而不是默认基线。
  • SEO 基线:当前排名页面、meta titles、结构化数据和 OG cards。SEO 迁移是重设计的首要风险。

11.C Preservation Rules

11.C 保留规则

  • Do not change information architecture unless asked. Keep page slugs, anchor IDs, primary nav labels stable for SEO and muscle memory.
  • Extract brand colors before applying Section 4.2. A brand that is already purple stays purple - apply the LILA RULE's override.
  • Preserve copy voice unless asked for a rewrite. Visual modernisation ≠ content rewrite.
  • Honor existing accessibility wins. Do not regress focus states, alt text, keyboard nav, contrast.
  • Respect existing analytics events. Do not rename buttons, form fields, section IDs that downstream tracking depends on.
  • 除非用户要求,不要更改信息架构。为保持 SEO 和用户肌肉记忆,应保持页面 slugs、anchor IDs 和主要导航标签稳定。
  • 应用第 4.2 节前先提取品牌颜色。已经使用紫色的品牌仍然是紫色,应应用 LILA RULE 的覆盖路径。
  • 除非用户要求重写,否则保留文案语气。视觉现代化不等于内容重写。
  • **保留已有的无障碍成果。**不要让 focus states、alt text、键盘导航或对比度退化。
  • **尊重现有 analytics events。**不要重命名下游分析所依赖的按钮、表单字段或区块 ID。

11.D Modernisation Levers (priority order)

11.D 现代化杠杆(按优先级)

Apply in order - stop when the brief is satisfied:
  1. Typography refresh - biggest visual lift per unit of risk.
  2. Spacing & rhythm - increase section padding, fix vertical rhythm.
  3. Color recalibration - desaturate, unify neutrals, keep brand accent.
  4. Motion layer - add
    MOTION_INTENSITY
    -appropriate micro-interactions to existing components.
  5. Hero & key-section recomposition - restructure top-of-funnel using Section 10 vocabulary.
  6. Full block replacement - only when the existing block is unsalvageable.
按顺序应用,满足 brief 后即可停止:
  1. 字体排印更新:以较低风险获得最大的视觉提升。
  2. 间距与节奏:增加区块 padding,修复垂直节奏。
  3. 颜色重新校准:降低饱和度,统一中性色,保留品牌强调色。
  4. 动效层:为现有组件添加符合
    MOTION_INTENSITY
    的微交互。
  5. Hero 与关键区块重组:使用第 10 节词汇重新组织转化漏斗顶部。
  6. 完整替换区块:仅当现有区块无法挽救时执行。

11.E Decision Tree: Targeted Evolution vs Full Redesign

11.E 决策树:渐进式演进还是全面重设计

  • IA, content, and SEO sound → targeted evolution (Levers 1-4). ~70% of value at ~40% of risk.
  • Visual debt is structural (broken IA, no design system, broken mobile) → full redesign with strict content preservation.
  • Brand itself is changing → greenfield.
  • IA、内容和 SEO 状态良好时,采用渐进式演进(杠杆 1 到 4),约获得 70% 的价值,风险约为全面重设计的 40%。
  • 视觉债务属于结构性问题,例如 IA 损坏、没有设计系统、移动端损坏时,执行全面重设计,同时严格保留内容。
  • 品牌本身正在改变时,采用全新构建。

11.F What Never Changes Silently

11.F 不得静默修改的内容

Never modify without explicit user approval:
  • URL structure / route slugs.
  • Primary nav labels.
  • Form field names or order (breaks analytics + autofill).
  • Brand logo or wordmark.
  • Existing legal / consent / cookie copy.

未经用户明确批准,绝不能修改:
  • URL 结构或 route slugs。
  • 主要导航标签。
  • 表单字段名称或顺序,因为它们会影响分析记录和自动填充。
  • 品牌 logo 或字标。
  • 现有法律、同意或 cookie 文案。

12. THE BLOCK LIBRARY (Contract - Implementations Land Here Iteratively)

12. BLOCK LIBRARY(契约,实现逐步落到这里)

The Reference Vocabulary (Section 10) names patterns. The Block Library implements them with real props, real motion specs, and real code sketches.
Status: schema defined here. Blocks will be added iteratively. Do not freelance new blocks without following this schema.
第 10 节的参考词汇表用于命名 Patterns。Block Library 通过真实 props、真实动效规格和真实代码草图实现它们。
**状态:**此处已定义 schema。Blocks 将逐步添加。不得在不遵循此 schema 的情况下自行设计新 block。

12.A File Location

12.A 文件位置

skills/taste-skill/blocks/
  hero/
    asymmetric-split.md
    editorial-manifesto.md
    kinetic-type.md
    ...
  feature/
    bento-grid.md
    sticky-scroll-stack.md
    zig-zag.md
    ...
  social-proof/
  pricing/
  cta/
  footer/
  navigation/
  portfolio/
  transition/
skills/taste-skill/blocks/
  hero/
    asymmetric-split.md
    editorial-manifesto.md
    kinetic-type.md
    ...
  feature/
    bento-grid.md
    sticky-scroll-stack.md
    zig-zag.md
    ...
  social-proof/
  pricing/
  cta/
  footer/
  navigation/
  portfolio/
  transition/

12.B Required Frontmatter

12.B 必需的 Frontmatter

yaml
---
name: asymmetric-split-hero
category: hero
dial_compatibility:
  variance: [6, 10]
  motion: [3, 10]
  density: [2, 5]
when_to_use: "Landing pages with one strong asset and one strong message. Default hero for SaaS, agency, premium consumer."
not_for: "Editorial / manifesto launches where the message IS the design."
stack: ["react", "next", "tailwind", "motion"]
---
yaml
---
name: asymmetric-split-hero
category: hero
dial_compatibility:
  variance: [6, 10]
  motion: [3, 10]
  density: [2, 5]
when_to_use: \u0022Landing pages with one strong asset and one strong message. Default hero for SaaS, agency, premium consumer.\u0022
not_for: \u0022Editorial / manifesto launches where the message IS the design.\u0022
stack: [\u0022react\u0022, \u0022next\u0022, \u0022tailwind\u0022, \u0022motion\u0022]
---

12.C Required Body Sections

12.C 必需的正文区块

  1. Visual sketch - short ASCII or description of the layout.
  2. Props API - the component's interface.
  3. Code sketch - minimal working implementation (Server Component default, Client island for motion).
  4. Mobile fallback - explicit collapse rules for
    < 768px
    .
  5. Motion variants - one variant per
    MOTION_INTENSITY
    band (1-3, 4-7, 8-10). Reduced-motion fallback explicit.
  6. Dark-mode notes - token strategy specific to this block.
  7. Anti-patterns - common ways this block goes wrong.
  8. References - links to real examples in production.
  1. 视觉草图:简短 ASCII 图或布局描述。
  2. Props API:组件接口。
  3. 代码草图:最小可用实现,默认使用 Server Component,动效使用 Client island。
  4. 移动端回退方案:明确说明
    < 768px
    时的折叠规则。
  5. 动效变体:
    MOTION_INTENSITY
    每个区间对应一个变体,即 1-3、4-7、8-10。明确说明 reduced-motion 回退方案。
  6. 深色模式说明:该 block 专用的 token 策略。
  7. 反模式:该 block 常见的错误实现方式。
  8. 参考资料:生产环境中的真实示例链接。

12.D Block-Library Discipline

12.D Block Library 纪律

  • One block per file. No multi-block files.
  • Every block must work standalone (drop it into a page, it renders).
  • Every block must pass the Pre-Flight Check (Section 14).
  • Blocks that depend on a design system from Section 2.A live under
    blocks/<category>/<name>--<system>.md
    (e.g.
    feature/bento-grid--material.md
    ).

  • 一个文件只放一个 block。禁止多 block 文件。
  • 每个 block 都必须能够独立工作,即放入页面后即可渲染。
  • 每个 block 都必须通过 Pre-Flight Check(第 14 节)。
  • 依赖第 2.A 节设计系统的 blocks 存放在
    blocks/<category>/<name>--<system>.md
    下,例如
    feature/bento-grid--material.md
    。

13. OUT OF SCOPE

13. 不在范围内

This skill is NOT for:
  • Dashboards / dense product UI / admin panels (use Fluent, Carbon, Atlassian, or Polaris from Section 2.A).
  • Data tables (use TanStack Table or AG Grid).
  • Multi-step forms / wizards (use Form-specific patterns; this skill won't make them better).
  • Code editors (use Monaco / CodeMirror with their official skinning).
  • Native mobile (use Apple HIG / Material directly).
  • Realtime collab UIs (presence, cursors, OT-aware - different problem class).
If the brief is one of the above, say so explicitly, point to the right tool, and only apply this skill's marketing-page / about-page / landing-page parts to the surfaces where they apply.

本 skill 不适用于:
  • 仪表盘、高密度产品 UI 或管理面板,应使用第 2.A 节中的 Fluent、Carbon、Atlassian 或 Polaris。
  • 数据表格,应使用 TanStack Table 或 AG Grid。
  • 多步骤表单或 wizard,应使用专门的表单模式,本 skill 无法改善这些问题。
  • 代码编辑器,应使用 Monaco 或 CodeMirror 及其官方 skin。
  • 原生移动端,应直接使用 Apple HIG 或 Material。
  • 实时协作 UI,例如 presence、cursors、OT-aware 场景,它们属于不同问题类别。
如果 brief 属于上述范围,必须明确说明,指出正确工具,并且只对适用的页面表面应用本 skill 的营销页、关于页或落地页部分。

14. FINAL PRE-FLIGHT CHECK

14. 最终 PRE-FLIGHT CHECK

Run this matrix before outputting code. This is the last filter.
THIS IS NOT OPTIONAL. Run every box. If any box fails, the output is not done.
  • Brief inference declared (Section 0.B one-liner)?
  • Dial values explicit and reasoned from the brief, not silently using baseline?
  • Design system chosen from Section 2 if applicable, or aesthetic labeled honestly?
  • Redesign mode detected and audit performed (if applicable, Section 11)?
  • ZERO em-dashes (
    —
    ) anywhere on the page.
    Headlines, eyebrows, pills, body, quotes, attribution, captions, buttons, alt text. Zero. (Section 9.G - non-negotiable.)
  • Page Theme Lock: ONE theme (light, dark, or auto) for the whole page. No section flips to inverted mode mid-page (Section 4.11)?
  • Color Consistency Lock: one accent color used identically across all sections (Section 4.2)?
  • Shape Consistency Lock: one corner-radius system applied consistently (Section 4.4)?
  • Button Contrast Check: every CTA text is readable against its background (no white-on-white, WCAG AA 4.5:1)?
  • CTA Button Wrap: no CTA label wraps to 2+ lines at desktop?
  • Form Contrast Check: form inputs, placeholders, focus rings, labels all pass WCAG AA against the section background?
  • Serif discipline: if a serif is used, it is NOT Fraunces or Instrument_Serif (or it is, with explicit brand justification)? Different serif from your previous project?
  • Premium-consumer palette check: if the brief is premium-consumer (cookware / wellness / artisan / luxury), the palette is NOT the AI-default beige+brass+oxblood+espresso family? Different family from your previous premium-consumer project?
  • Italic descender clearance: every italic word with
    y g j p q
    has
    leading-[1.1]
    min +
    pb-1
    reserve?
  • Hero fits the viewport: headline ≤ 2 lines, subtext ≤ 20 words AND ≤ 4 lines, CTA visible without scroll, font scale planned around image?
  • Hero top padding: max
    pt-24
    at desktop, hero content does not float halfway down the viewport?
  • Hero stack discipline: max 4 text elements in hero (eyebrow OR brand strip, headline, subtext, CTAs)? No tiny tagline below CTAs, no trust micro-strip in hero?
  • EYEBROW COUNT (mechanical): count instances of
    uppercase tracking
    micro-labels above section headlines across all components. Count ≤ ceil(sectionCount / 3)? Hero counts as 1.
  • Split-Header Ban: no "left big headline + right small explainer paragraph" pattern as a section header (vertical stack instead)?
  • Zigzag Alternation Cap: no 3+ consecutive sections with the same image+text-split layout?
  • No Duplicate CTA Intent: no two CTAs with the same intent ("Get in touch" + "Let's talk" both on page = Fail)?
  • Logo wall = logo only: no industry / category labels printed below logos?
  • Bento Background Diversity: at least 2-3 bento cells have real visual variation (image, gradient, pattern), not all white-on-white text cards?
  • "Used by / Trusted by" logo wall lives UNDER the hero, not inside it, uses REAL SVG logos (Simple Icons / devicon) or generated SVG marks, NOT plain text wordmarks?
  • Copy Self-Audit: every visible string re-read, no grammatically-broken or AI-hallucinated phrases ("free on its past" type) shipped?
  • Motion motivated: every animation can be justified in one sentence (hierarchy / storytelling / feedback / state transition), no GSAP-for-show?
  • Marquee max-one-per-page: no two horizontal marquees on the same page?
  • Navigation on ONE line at desktop, height ≤ 80px?
  • Section-Layout-Repetition check: no two sections share the same layout family (at least 4 different families across 8 sections)?
  • Bento has rhythm AND exact cell count (N items → N cells, no empty cells in middle or at end)?
  • Long lists use the right UI component (not default
    <ul>
    with
    divide-y
    for > 5 items - see Section 4.9 alternatives)?
  • Real images used (gen-tool first, then Picsum-seed, then explicit placeholder slots) - NO div-based fake screenshots, NO hand-rolled decorative SVGs, NO pure-text minimalism?
  • No pills/labels overlaid on images (no
    Plate · Brand
    , no
    Field notes - journal
    )?
  • No photo-credit captions as decoration (
    Field study no. 12 · Ines Caetano
    )?
  • No version footers (
    v1.4.2
    ,
    Build 0048
    ) on marketing pages?
  • No micro-meta-sentences under eyebrows ("Each of these is a feature we ship today...")?
  • No decoration text strip at hero bottom (
    BRAND. MOTION. SPATIAL.
    )?
  • No floating top-right sub-text in section headings?
  • No scoring/progress bars with filled background tracks as comparison visuals?
  • No locale / city-name / time / weather strips unless brief is genuinely globally-distributed or place-focused?
  • No scroll cues (
    Scroll
    ,
    ↓ scroll
    ,
    Scroll to explore
    )?
  • No version labels in hero (V0.6, BETA, INVITE-ONLY) unless the brief is a launch?
  • No section-numbering eyebrows (
    00 / INDEX
    ,
    001 · Capabilities
    ,
    06 · how it works
    )?
  • No decorative dots (zero by default, only for real semantic state)?
  • No
    border-t
    +
    border-b
    on every row
    of long lists / spec tables?
  • Content density sane: no 20-row data tables, no fake-precise specs without justification, ≤ 25-word sub-paragraphs by default?
  • Quotes ≤ 3 lines of body, attribution clean (no em-dash)?
  • Motion claimed = motion shown: if
    MOTION_INTENSITY > 4
    , page actually animates, not just claimed?
  • GSAP sticky-stack / horizontal-pan implemented per Section 5.A / 5.B canonical skeleton (
    start: "top top"
    ,
    pin: true
    , correct scrub)?
  • No
    window.addEventListener('scroll')
    - using Motion
    useScroll()
    / ScrollTrigger / IntersectionObserver / CSS scroll-driven animations only?
  • Reduced motion wrapped for everything
    MOTION_INTENSITY > 3
    ?
  • Dark mode tokens defined and tested in both modes?
  • Mobile collapse explicit (
    w-full
    ,
    px-4
    ,
    max-w-7xl mx-auto
    ) for high-variance layouts?
  • Viewport stability:
    min-h-[100dvh]
    , never
    h-screen
    ?
  • useEffect
    animations
    have strict cleanup functions?
  • Empty / loading / error states provided?
  • Cards omitted in favor of spacing where possible?
  • Icons from an allowed library only (Phosphor / HugeIcons / Radix / Tabler), no hand-rolled SVG paths?
  • Motion isolated in client-leaf components with
    'use client'
    at the top, memoized?
  • No AI Tells from Section 9 (Inter as default, AI-purple, three-equal cards, Jane Doe, Acme, "Quietly in use at")?
  • Core Web Vitals plausibly hit (LCP < 2.5s, INP < 200ms, CLS < 0.1)?
  • One design system per project (no Material + shadcn mixed)?
If a single checkbox cannot be honestly ticked, the page is not done. Fix it before delivering.

输出代码前运行此矩阵。这是最后一道过滤。
这不是可选项。必须检查每一项。任何一项失败,输出都未完成。
  • Brief 推断已声明,即第 0.B 节的一行设计判断?
  • Dial 值已明确给出,并且是根据 brief 推导,而不是默默使用基线?
  • 适用时已从第 2 节选择设计系统,或如实标注了美学方向?
  • 适用时已检测重设计模式并完成审计,参见第 11 节?
  • 页面上零 em-dash(
    —
    )
    。标题、eyebrow、pills、正文、引用、署名、caption、按钮、alt text 均为零,参见第 9.G 节的不可协商规则。
  • Page Theme Lock:整页只有一个主题,即浅色、深色或自动模式,滚动过程中没有区块切换为反转模式,参见第 4.11 节?
  • Color Consistency Lock:所有区块使用完全一致的单一强调色,参见第 4.2 节?
  • Shape Consistency Lock:一致应用一套 corner-radius 系统,参见第 4.4 节?
  • Button Contrast Check:每个 CTA 文字相对于背景都清晰可读,不存在白底白字,WCAG AA 达到 4.5:1?
  • CTA Button Wrap:桌面端没有 CTA 标签换成 2 行或更多?
  • Form Contrast Check:表单输入框、placeholder、focus ring 和 label 相对于区块背景均达到 WCAG AA?
  • Serif 纪律:如果使用 serif,它不是 Fraunces 或 Instrument_Serif,除非有明确的品牌理由?与上一个项目使用了不同的 serif?
  • Premium-consumer palette 检查:如果 brief 属于高端消费级,如厨具、健康、手工或奢华,palette 不是 AI 默认的米色 + 黄铜 + 酒红 + 浓缩咖啡家族?与上一个高端消费级项目使用了不同家族?
  • Italic descender clearance:每个包含
    y g j p q
    的斜体单词至少使用
    leading-[1.1]
    ,并预留
    pb-1
    空间?
  • Hero 适配视口:标题不超过 2 行,副文案不超过 20 个词且不超过 4 行,无需滚动即可看到 CTA,字号与图片共同规划?
  • Hero top padding:桌面端不超过
    pt-24
    ,Hero 内容没有悬浮在视口中部?
  • Hero stack 纪律:Hero 最多包含 4 个文本元素,即 eyebrow 或品牌条、标题、副文案和 CTA?CTA 下方没有小号 tagline,也没有信任度微型信息条?
  • EYEBROW COUNT 机械检查:统计所有组件中位于区块标题上方的
    uppercase tracking
    微型标签,数量不超过
    ceil(sectionCount / 3)
    ,Hero 计为 1?
  • Split-Header 禁止规则:不存在“左侧大标题 + 右侧小型说明段落”作为区块标题的情况,改为垂直堆叠?
  • Zigzag Alternation 上限:没有 3 个或更多连续区块使用相同的图文分栏布局?
  • No Duplicate CTA Intent:页面没有两个意图相同的 CTA,例如同时出现“Get in touch”和“Let's talk”?
  • Logo wall 只包含 logo:没有在 logo 下打印行业或分类标签?
  • Bento Background Diversity:至少 2 到 3 个 Bento 单元格具有真实视觉变化,例如图片、渐变或图案,而不是全部使用白底文字卡片?
  • “Used by / Trusted by” logo 墙位于 Hero 下方而不是内部,使用真实 SVG logo(Simple Icons 或 devicon)或生成的 SVG 标记,而不是纯文字字标?
  • Copy Self-Audit:重新阅读所有可见字符串,没有发布语法损坏或 AI 幻觉式短语,例如“free on its past”类型表达?
  • 动效有明确动机:每个动画都能用一句话解释其目的,即层级、叙事、反馈或状态转换,而不是为了炫技使用 GSAP?
  • Marquee 每页最多一个:同一页面没有两个横向 Marquee?
  • 桌面端导航单行显示,高度不超过 80px?
  • Section-Layout-Repetition 检查:没有两个区块共享同一种布局家族,8 个区块至少使用 4 种布局家族?
  • Bento 有节奏且单元格数量准确,即 N 项内容对应 N 个单元格,中间或末尾没有空单元格?
  • 长列表使用正确的 UI 组件,项目超过 5 个时没有默认使用带
    divide-y
    的
    <ul>
    ,参见第 4.9 节替代方案?
  • 使用真实图片,优先使用 gen-tool,其次使用 Picsum-seed,最后使用明确的占位槽位;没有 div 拼装的假截图,没有手写装饰性 SVG,没有纯文字极简页面?
  • 图片上没有叠加 pills 或 labels,例如没有“Plate · Brand”或“Field notes - journal”?
  • 没有装饰性照片署名 caption,例如没有“Field study no. 12 · Ines Caetano”?
  • 营销页面没有版本页脚,例如没有
    v1.4.2
    、
    Build 0048
    ?
  • eyebrow 下方没有微型元信息句子,例如没有“Each of these is a feature we ship today...”?
  • Hero 底部没有装饰性文字条,例如没有
    BRAND. MOTION. SPATIAL.
    ?
  • 区块标题右上角没有悬浮小号文字?
  • 没有带填充背景轨道的评分或进度条作为对比视觉?
  • 没有地区、城市名、时间或天气信息条,除非 brief 确实面向全球分布式或地点型业务?
  • 没有滚动提示,例如没有
    Scroll
    、
    ↓ scroll
    、
    Scroll to explore
    ?
  • Hero 没有版本标签,例如没有
    V0.6
    、
    BETA
    、
    INVITE-ONLY
    ,除非 brief 涉及发布?
  • 没有区块编号 eyebrow,例如没有
    00 / INDEX
    、
    001 · Capabilities
    、
    06 / how it works
    ?
  • 没有装饰性圆点,默认数量为零,只有真实语义状态才允许?
  • 长列表或规格表每一行没有同时使用
    border-t
    和
    border-b
    ?
  • 内容密度合理,没有 20 行数据表格,没有未经证实的虚假精确规格,副段落默认不超过 25 个词?
  • 引用正文不超过 3 行,署名干净且没有 em-dash?
  • 声明了动效就展示了动效,如果
    MOTION_INTENSITY > 4
    ,页面确实会动画,而不只是口头声明?
  • GSAP sticky-stack 和 horizontal-pan 按第 5.A、5.B 节标准骨架实现,使用
    start: \u0022top top\u0022
    、
    pin: true
    和正确的 scrub?
  • 没有
    window.addEventListener('scroll')
    ,只使用 Motion
    useScroll()
    、ScrollTrigger、IntersectionObserver 或 CSS 滚动驱动动画?
  • Reduced motion 已包裹所有
    MOTION_INTENSITY > 3
    的动效?
  • Dark mode tokens 已定义,并在两种模式下完成测试?
  • 移动端折叠方式明确,高差异度布局使用
    w-full
    、
    px-4
    、
    max-w-7xl mx-auto
    ?
  • 视口稳定,使用
    min-h-[100dvh]
    ,绝不使用
    h-screen
    ?
  • useEffect
    动画
    具有严格的 cleanup functions?
  • 已提供 empty、loading 和 error states?
  • 尽可能使用间距替代卡片?
  • 图标仅来自允许的库,即 Phosphor、HugeIcons、Radix 或 Tabler,没有手写 SVG paths?
  • Motion 隔离在顶部声明
    'use client'
    的叶子组件中,并进行了 memoize?
  • 不存在第 9 节中的 AI Tells,例如默认 Inter、AI 紫色、三张等宽卡片、Jane Doe、Acme 或“Quietly in use at”?
  • Core Web Vitals 有达到目标的可能,即 LCP < 2.5s、INP < 200ms、CLS < 0.1?
  • 每个项目只使用一个设计系统,没有混用 Material 和 shadcn?
如果任何一项无法诚实勾选,页面就未完成。必须先修复再交付。

APPENDICES - Real Source-Backed Reference Material

附录:真实来源支持的参考资料

The sections below are vendored reference content. They give the agent real install commands, real canonical doc links, and real working starter snippets for each design system named in Section 2. Use them to ground decisions in production reality, not training-data fiction.
以下章节是收录的参考内容,为 Agent 提供真实的安装命令、官方文档链接,以及第 2 节所列每个设计系统的可用起始代码。应使用这些内容让决策立足于生产现实,而不是训练数据中的虚构内容。

Appendix A - Install Commands per Design System

附录 A:各设计系统的安装命令

bash
undefined
bash
undefined

Material Web (Material 3)

Material Web (Material 3)

npm install @material/web
npm install @material/web

Fluent UI React (v9)

Fluent UI React (v9)

npm install @fluentui/react-components
npm install @fluentui/react-components

Fluent UI Web Components (framework-free)

Fluent UI Web Components (framework-free)

npm install @fluentui/web-components @fluentui/tokens
npm install @fluentui/web-components @fluentui/tokens

IBM Carbon

IBM Carbon

npm install @carbon/react @carbon/styles
npm install @carbon/react @carbon/styles

Radix Themes

Radix Themes

npm install @radix-ui/themes
npm install @radix-ui/themes

shadcn/ui (open code, owned components)

shadcn/ui (open code, owned components)

npx shadcn@latest init npx shadcn@latest add button card badge separator input
npx shadcn@latest init npx shadcn@latest add button card badge separator input

Primer CSS (GitHub product/devtool UI)

Primer CSS (GitHub product/devtool UI)

npm install --save @primer/css
npm install --save @primer/css

Primer Brand (GitHub marketing UI)

Primer Brand (GitHub marketing UI)

npm install @primer/react-brand
npm install @primer/react-brand

GOV.UK Frontend

GOV.UK Frontend

npm install govuk-frontend
npm install govuk-frontend

USWDS (US Web Design System)

USWDS (US Web Design System)

npm install uswds
npm install uswds

Atlassian Design System (Atlaskit)

Atlassian Design System (Atlaskit)

yarn add @atlaskit/css-reset @atlaskit/tokens @atlaskit/button @atlaskit/badge @atlaskit/section-message @atlaskit/card
yarn add @atlaskit/css-reset @atlaskit/tokens @atlaskit/button @atlaskit/badge @atlaskit/section-message @atlaskit/card

Bootstrap 5.3

Bootstrap 5.3

npm install bootstrap
npm install bootstrap

Shopify Polaris Web Components (Shopify apps only)

Shopify Polaris Web Components (Shopify apps only)

Add this to your app HTML head:

Add this to your app HTML head:

<meta name="shopify-api-key" content="%SHOPIFY_API_KEY%" />

<meta name=\u0022shopify-api-key\u0022 content=\u0022%SHOPIFY_API_KEY%\u0022 />

<script src="https://cdn.shopify.com/shopifycloud/polaris.js"></script>

undefined
undefined

Appendix B - Canonical Sources (read these before reinventing)

附录 B:官方来源(不要重新发明之前先阅读)

Material Web

Material Web

Fluent UI

Fluent UI

Carbon

Carbon

Shopify Polaris

Shopify Polaris

Atlassian

Atlassian

Primer

Primer

GOV.UK

GOV.UK

USWDS

USWDS

Bootstrap

Bootstrap

Tailwind

Tailwind

Radix

Radix

shadcn/ui

shadcn/ui

Native CSS / W3C standards

Native CSS / W3C standards

Apple Liquid Glass (Apple platforms only)

Apple Liquid Glass(仅限 Apple 平台)

Appendix C - Apple Liquid Glass: Honest Web Approximation

附录 C:Apple Liquid Glass:诚实的 Web 近似实现

Do not treat random CSS snippets as official Apple Liquid Glass.
绝不要把随机 CSS 片段当成官方 Apple Liquid Glass。

What is official

哪些是官方的

Apple documents Liquid Glass inside Apple's Human Interface Guidelines and Developer Documentation for Apple platforms. It is a dynamic material used across Apple platform UI. Apple's native implementation belongs to Apple platform APIs and system components, not a public web CSS package.
Relevant official docs:
  • Apple Human Interface Guidelines → Materials
  • Apple Developer Documentation → Liquid Glass
  • Apple Developer Documentation → Adopting Liquid Glass
  • SwiftUI → Material
Apple 在面向 Apple 平台的 Human Interface Guidelines 和 Developer Documentation 中记录了 Liquid Glass。它是 Apple 平台 UI 中使用的动态材质。Apple 的原生实现属于 Apple 平台 API 和系统组件,而不是公开的 Web CSS package。
相关官方文档:
  • Apple Human Interface Guidelines → Materials
  • Apple Developer Documentation → Liquid Glass
  • Apple Developer Documentation → Adopting Liquid Glass
  • SwiftUI → Material

What is NOT official

哪些不是官方的

There is no
liquid-glass.css
from Apple for normal websites.
A web approximation can use:
  • backdrop-filter
  • transparent backgrounds
  • layered borders
  • highlight overlays
  • gradients
  • motion
  • strong contrast fallbacks
But that is web glassmorphism / frosted-glass approximation, not official Apple Liquid Glass. Label it as such in comments.
Apple 没有为普通网站提供
liquid-glass.css
。
Web 近似实现可以使用:
  • backdrop-filter
  • 透明背景
  • 分层边框
  • 高光叠加
  • 渐变
  • 动效
  • 强对比度回退方案
但它是 Web glassmorphism 或磨砂玻璃近似实现,不是官方 Apple Liquid Glass。必须在注释中清楚标明。

Safer web approximation skeleton

更安全的 Web 近似实现骨架

css
.liquid-glass-web-approx {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  border-radius: 999px;
  border: 1px solid rgb(255 255 255 / .32);
  background:
    linear-gradient(135deg, rgb(255 255 255 / .30), rgb(255 255 255 / .08)),
    rgb(255 255 255 / .12);
  backdrop-filter: blur(24px) saturate(180%) contrast(1.05);
  -webkit-backdrop-filter: blur(24px) saturate(180%) contrast(1.05);
  box-shadow:
    inset 0 1px 0 rgb(255 255 255 / .48),
    inset 0 -1px 0 rgb(255 255 255 / .12),
    0 18px 60px rgb(0 0 0 / .18);
}

.liquid-glass-web-approx::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  border-radius: inherit;
  background:
    radial-gradient(circle at 20% 0%, rgb(255 255 255 / .55), transparent 34%),
    linear-gradient(90deg, rgb(255 255 255 / .18), transparent 42%, rgb(255 255 255 / .14));
  pointer-events: none;
}

.liquid-glass-web-approx::after {
  content: "";
  position: absolute;
  inset: 1px;
  border-radius: inherit;
  border: 1px solid rgb(255 255 255 / .14);
  pointer-events: none;
}

@media (prefers-color-scheme: dark) {
  .liquid-glass-web-approx {
    border-color: rgb(255 255 255 / .18);
    background:
      linear-gradient(135deg, rgb(255 255 255 / .16), rgb(255 255 255 / .04)),
      rgb(15 23 42 / .42);
    box-shadow:
      inset 0 1px 0 rgb(255 255 255 / .22),
      0 18px 60px rgb(0 0 0 / .42);
  }
}

@media (prefers-reduced-transparency: reduce) {
  .liquid-glass-web-approx {
    background: rgb(255 255 255 / .96);
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }
}
Important:
prefers-reduced-transparency
has uneven browser support; test it. Always provide enough contrast even without blur.

End of appendices. Install commands above are reality anchors. The Apple Liquid Glass skeleton is a labeled approximation, not an Apple-issued package. For canonical docs per design system, consult the system's official docs (links in Section 2 plus Appendix B).
css
.liquid-glass-web-approx {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  border-radius: 999px;
  border: 1px solid rgb(255 255 255 / .32);
  background:
    linear-gradient(135deg, rgb(255 255 255 / .30), rgb(255 255 255 / .08)),
    rgb(255 255 255 / .12);
  backdrop-filter: blur(24px) saturate(180%) contrast(1.05);
  -webkit-backdrop-filter: blur(24px) saturate(180%) contrast(1.05);
  box-shadow:
    inset 0 1px 0 rgb(255 255 255 / .48),
    inset 0 -1px 0 rgb(255 255 255 / .12),
    0 18px 60px rgb(0 0 0 / .18);
}

.liquid-glass-web-approx::before {
  content: \u0022\u0022;
  position: absolute;
  inset: 0;
  z-index: -1;
  border-radius: inherit;
  background:
    radial-gradient(circle at 20% 0%, rgb(255 255 255 / .55), transparent 34%),
    linear-gradient(90deg, rgb(255 255 255 / .18), transparent 42%, rgb(255 255 255 / .14));
  pointer-events: none;
}

.liquid-glass-web-approx::after {
  content: \u0022\u0022;
  position: absolute;
  inset: 1px;
  border-radius: inherit;
  border: 1px solid rgb(255 255 255 / .14);
  pointer-events: none;
}

@media (prefers-color-scheme: dark) {
  .liquid-glass-web-approx {
    border-color: rgb(255 255 255 / .18);
    background:
      linear-gradient(135deg, rgb(255 255 255 / .16), rgb(255 255 255 / .04)),
      rgb(15 23 42 / .42);
    box-shadow:
      inset 0 1px 0 rgb(255 255 255 / .22),
      0 18px 60px rgb(0 0 0 / .42);
  }
}

@media (prefers-reduced-transparency: reduce) {
  .liquid-glass-web-approx {
    background: rgb(255 255 255 / .96);
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }
}
重要提示:
prefers-reduced-transparency
的浏览器支持程度不一致,需要实际测试。即使没有 blur,也必须始终提供足够的对比度。

**附录结束。**上述安装命令是现实依据。Apple Liquid Glass 骨架属于明确标注的近似实现,不是 Apple 发布的 package。有关各设计系统的官方文档,请参阅第 2 节和附录 B 中的链接。",