```preset-meta { "name": "liquid-glass", "label": "Liquid Glass", "fingerprint": { "shadow": "inset-highlight", "border": "hairline-translucent", "motion": "rise-and-settle", "density": "low", "contrast": "high-on-aurora" }, "match_signals": [ { "kind": "hairline_border", "weight": 0.20 }, { "kind": "minimal_decoration", "weight": 0.15 }, { "kind": "shadow_zero_blur", "weight": 0.10 } ], "requires_capabilities": [ { "kind": "block_installed", "block": "liquid-glass-widgets", "verify_file": "hyperframes/compositions/liquid-glass-widgets.html", "verify_lib": "hyperframes/compositions/lib/liquid-glass.iife.js", "auto_install": "npx hyperframes add liquid-glass-widgets", "alternates": ["liquid-glass-notification", "liquid-glass-context-menu", "liquid-glass-media-controls", "ios26-liquid-glass", "macos-tahoe-liquid-glass", "vfx-liquid-glass"] }, { "kind": "env_var_set", "var": "PRODUCER_HEADLESS_SHELL_PATH", "reason": "WebGPU-capable browser (Brave / Chrome Canary). Cannot auto-install — varies by OS / user environment.", "auto_install": null } ], "best_for": ["premium SaaS", "AI products", "hardware launches", "futuristic tech", "consumer apps with depth"], "avoid_for": ["print-feel brands", "low-power render targets", "warm hand-crafted registers"], "chromeFonts": { "googleFontsHref": "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500&display=swap", "display": "Inter", "body": "Inter", "script": "Inter", "mono": "JetBrains Mono" } } ``` > `chromeFonts` makes the doc chrome render in the preset's native fonts; brand fonts still apply to §6 components. Liquid-glass is a single-face system: Inter does display + body + script (refuses hand-script — refraction smears thin strokes), JetBrains Mono for metadata. > Liquid-glass auto-infers normally now (its `match_signals` light up on > hairline-border + minimal-decoration sites), **but** `requires_capabilities` > in the preset-meta gates auto-selection: build-design.mjs sets `combined=0` > > - `capabilities_missing=[...]` when (a) `lib/liquid-glass.iife.js` is absent > or (b) `$PRODUCER_HEADLESS_SHELL_PATH` is unset. The design-system subagent > auto-runs `npx hyperframes add liquid-glass-widgets` when liquid-glass wins > review and the block is missing; the env var is OS-specific and falls to > the user — agent reports it as an anomaly in the completion summary. ## §A Director's intent Frosted glass over moving color. Surfaces are weightless — light passes **through** them, not off them. Type sits on glass; glass sits on aurora; aurora carries the brand. No element is the canvas; depth is the canvas. **One reading layer at a time.** A scene has glass surfaces (panels, pills, cards) floating over an animated color field. The eye reads what's on the glass, not the glass itself. Decoration is reserved for the aurora — the surfaces stay neutral, just specular highlight + edge-light + chromatic fringe at the rim. **Entry motion**: soft upward translate + scale 0.86→1.0 with `back.out(1.04)` — overshoot tiny on purpose. Hard cuts and bouncy springs break the wetness. ## §B Decoration tokens (merge into design.html `:root`) **Wiring contract.** The `liquid-glass.iife.js` shader reads exactly these raw `--lg-*` properties per panel: `--lg-blur`, `--lg-refraction`, `--lg-corner-radius`, `--lg-z-radius`, `--lg-specular`, `--lg-fresnel`, `--lg-edge-highlight`, `--lg-chrom-aberration`, `--lg-saturation`, `--lg-tint`, `--lg-brightness`, `--lg-shadow-opacity`, `--lg-shadow-spread`, `--lg-shadow-offset-y`, `--lg-opacity`, `--lg-distortion`, `--lg-bevel-mode`. Three archetypes are declared here with archetype-namespaced keys (`--lg-widget-*`, `--lg-notif-*`, `--lg-menu-*`). Each component selects its archetype by aliasing the raw keys, e.g. `--lg-blur: var(--lg-widget-blur)`. Tune a knob here → all panels of that archetype move together. Brand-DNA coupling (e.g. saturation tracking brand vibrancy) goes here too — anchored on `--brand-*` and resolved once, consumed by every component. ```css /* Aurora canvas — overwrites brutalism/editorial canvas. */ --liquid-bg-deep: #0a0218; /* mandatory dark base — aurora needs blackpoint */ --liquid-bg-fallback: linear-gradient(160deg, #0a0218 0%, #15082a 60%, #062035 100%); /* ── Archetype 1: WIDGET ──────────────────────────────────────── ≤ 280px panels: stat cards, pill chips, small toggles. */ --lg-widget-blur: 0.42; --lg-widget-refraction: 0.82; --lg-widget-specular: 0.34; --lg-widget-fresnel: 1.25; --lg-widget-edge-highlight: 0.26; --lg-widget-chrom-aberration: 0.08; --lg-widget-saturation: 0.38; --lg-widget-corner-radius: 28; --lg-widget-z-radius: 46; /* ── Archetype 2: NOTIFICATION / OVERLAY ──────────────────────── 280-600px floating panels needing cast shadow: toasts, banners, media bars, sliders. */ --lg-notif-blur: 0.22; --lg-notif-refraction: 0.6; --lg-notif-specular: 0.2; --lg-notif-fresnel: 0.9; --lg-notif-edge-highlight: 0.1; --lg-notif-chrom-aberration: 0.05; --lg-notif-saturation: 0.25; --lg-notif-corner-radius: 36; --lg-notif-z-radius: 38; --lg-notif-shadow-opacity: 0.35; --lg-notif-shadow-spread: 14; --lg-notif-shadow-offset-y: 4; /* ── Archetype 3: MENU / DENSE CONTENT ────────────────────────── ≥ 350px panels with text rows / list / dense UI. Desaturate + tint up so near-black ink stays legible on the lightened glass. */ --lg-menu-blur: 0.56; --lg-menu-refraction: 0.52; --lg-menu-specular: 0.26; --lg-menu-fresnel: 1; --lg-menu-edge-highlight: 0.2; --lg-menu-chrom-aberration: 0.035; --lg-menu-saturation: -0.24; --lg-menu-tint: 0.88; --lg-menu-brightness: 0.54; --lg-menu-corner-radius: 30; --lg-menu-z-radius: 48; /* Type colors on glass */ --ink-on-glass: rgba(255, 255, 255, 0.96); --ink-on-glass-soft: rgba(255, 255, 255, 0.74); --ink-on-light-glass: rgb(0, 7, 14); /* for menu/light-tinted glass */ --text-shadow-glass: 0 2px 12px rgba(0, 0, 0, 0.42); /* ── Glass-surface rim / highlight palette ────────────────────── The text-overlay rim fakes (§H "inner rim" exception) and small chrome glyphs read from these white-at-low-alpha + dark-base tokens, so every component overlay surface is token-strict and moves together if the glass register is re-tuned. NOT the IIFE panel itself (that's the shader) — these are the CSS rim/highlight layers painted on the transparent .text-overlay above each panel. */ --lg-rim-hi: rgba(255, 255, 255, 0.5); /* brightest inset highlight */ --lg-rim-hi-soft: rgba(255, 255, 255, 0.48); --lg-rim-mid: rgba(255, 255, 255, 0.36); /* hairline edge / border */ --lg-rim-mid-soft: rgba(255, 255, 255, 0.34); --lg-rim-edge: rgba(255, 255, 255, 0.18); /* glass-panel hairline border */ --lg-rim-glow: rgba(255, 255, 255, 0.32); /* radial glint / inset highlight */ --lg-rim-lo: rgba(255, 255, 255, 0.28); /* gradient stop / faint edge */ --lg-rim-lo-soft: rgba(255, 255, 255, 0.26); --lg-rim-track: rgba(255, 255, 255, 0.24); /* slider/sep rail fill */ --lg-rim-faint: rgba(255, 255, 255, 0.16); /* mid gradient stop */ --lg-rim-glint: rgba(255, 255, 255, 0.14); /* toggle-pill base wash */ --lg-rim-ghost: rgba(255, 255, 255, 0.1); /* lowest gradient stop */ --lg-rim-haze: rgba(255, 255, 255, 0.09); /* lower inner bevel */ --lg-rim-mist: rgba(255, 255, 255, 0.08); /* inset under-glow */ --lg-rim-veil: rgba(255, 255, 255, 0.06); /* faintest fill */ --lg-rim-trace: rgba(255, 255, 255, 0.055); /* media-panel base wash */ --lg-rim-dust: rgba(255, 255, 255, 0.04); /* near-zero gradient stop */ --lg-glass-tint-menu: rgba(255, 255, 255, 0.15); /* light-tinted menu panel base */ --lg-glint-white: #fff; /* pure-white glint: slider fill, active toggle text, avatar ink */ --lg-glint-glow: rgba(255, 255, 255, 0.88); /* slider icon stroke */ --lg-glint-halo: rgba(255, 255, 255, 0.5); /* slider-fill glow */ --lg-base-veil: rgba(9, 18, 31, 0.2); /* dark base wash under widget rim */ --lg-base-shadow: rgba(0, 0, 0, 0.24); /* album-art cast shadow */ --lg-base-shadow-deep: rgba(0, 0, 0, 0.32); /* glass-panel cast shadow */ --lg-kbd-ink: rgba(0, 7, 14, 0.82); /* near-black kbd glyph on light glass */ --lg-light-emboss: rgba(255, 255, 255, 0.26); /* light-glass text emboss */ ``` **Picking the right archetype.** Panel diameter is the deciding factor, not content: - ≤ 280px (chip, button, small stat, toggle) → **widget** - 280-600px floating over content (toast, alert, media-bar, slider) → **notification** (needs shadow) - ≥ 350px containing text rows / list / dense UI (menu, popover) → **menu** (desaturate + tint up) ## §D Font pairing fallback (if brand fonts not on Google Fonts) - **display**: `'Inter'` wght 800 · `'SF Pro Display'` (system) · `'Geist'` - **body**: `'Inter'` wght 500-650 · `'Public Sans'` · `'DM Sans'` - **mono**: `'JetBrains Mono'` · `'Geist Mono'` Liquid glass is **type-on-glass, not type-as-hero**. Body weight runs heavier than usual (550-700) because anti-aliasing fights with refraction — thin weights smear. Letterspacing 0 to -0.01em; never tight. ## §T Type-role atlas (Phase 4b reads this to size text correctly) The atlas is the **sole authoring source** for non-component text. Do NOT invent ad-hoc sizes — weight under 550 at body scale collapses through the IIFE shader. Every role assumes text over glass/aurora: `text-shadow: var(--text-shadow-glass)` is the default on all legibility-critical roles. ```type-roles [ { "id": "display-cover", "family": "display", "purpose": "cover hero on aurora — type sits on glass card or floats directly on the aurora", "px_min": 96, "px_max": 180, "weight": 800, "leading": "0.95", "tracking": "-0.01em", "case": "sentence", "sample_html": "
The lead carries one idea per panel. Heavier weight than usual — refraction softens edges.
" }, { "id": "label-eyebrow", "family": "body", "purpose": "uppercase tracked label above a headline (panel eyebrow / section label)", "px_min": 24, "px_max": 28, "weight": 650, "leading": "1.2", "tracking": "0.18em", "case": "upper", "sample_html": "