Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Applies the Aetherweave design system — Black Bleak Modern Extremism edition — (obsidian tokens, dark liquid glass, monochromatic typography, motion, accessibility, components) to UI, CSS, content, and design artifacts. Use when the user mentions Aetherweave, skills design.md, dark luxury extremism, --aw-* tokens, liquid void glass, black mono abstract UI, or asks for branding consistent with this repository's spec.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 438% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 486% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 909% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 1217% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 717% | 0% |
Version 3.0 — 2026 Edition | Black Bleak Modern Extremism Pivot Supersedes v2.0 (warm-earth edition) and Style Guide v1.1
> This document is the single source of truth for every interface, artifact, website, application, stage visual, print, and spatial experience produced under the Aetherweave identity. It is written to be consumed by AI agents and human designers alike. Every token, rule, component spec, and edge case is defined explicitly — no "use judgment," no "it depends," unless a decision tree is provided. > > This version pivots Aetherweave into its most extreme form: ultra-dark, bleakly opulent, monochromatically hypnotic. The warm-earth + jewel palette is retired. Obsidian dominates. Stark contrast and metallic glints carry dopamine.
When rules appear to conflict, resolve in this order:
prefers-reduced-motion fallback.prefers-reduced-transparency fallback for the dark liquid glass system.Philosophy → Tokens → Visual Language → Dark Liquid Glass system → Layout → Typography → Components → Motion → Imagery → Responsive → Themes → Accessibility → Edge Cases → Code Patterns → Quality Checklist.
Aetherweave is a luxury abstract design language synthesizing silk-print craftsmanship, spatial computing fluidity, and culturally expansive storytelling — now channeled through an extreme black monochromatic lens. It retains the masterful layering, narrative depth, and luxurious craftsmanship of the original silk-heritage synthesis (multi-layered storytelling, hand-rendered intricacy, emotional resonance), but delivered as obsidian depth, high-contrast starkness, and hypnotic intensity that commands the eye, rewards prolonged gaze, and triggers dopamine through discovery, rhythm, and perceptual tension.
This is dark luxury extremism: bleak yet opulent, somber yet addictive. Rick Owens' void silhouettes fused with Reinhardt's near-black monochromes and modern cyber-goth dark-glass interfaces — surfaces that pull you in, layered energy maps that reveal new detail the longer you stare, tactile-digital tension that feels ancient and futuristic at once.
Mantra: Weave the void. Layer the infinite dark. Illuminate with stark intensity.
Five non-negotiables:
Dopamine stimulation mechanics:
| Principle | Rule of thumb | Anti-pattern | |---|---|---| | Layer before you flatten | If a surface is one plane of black, add another shade. | Flat single-tone blacks; "dark mode" as inverted light mode. | | Breath is the abyss | Negative space is deep void, not empty whitespace. | Edge-to-edge density; gray filler. | | Refract, don't reflect | Dark surfaces blur what's behind; they don't mirror it. | Hard glass/chrome effects; neon reflections. | | Gesture, not geometry alone | Pair every grid/tessellation with an organic void flow. | Pure geometric grids with no gesture. | | Obsidian first, metallic as accent | Black dominance (≥90% surface area); stark white + metallic threads carry all dopamine. | Any chromatic hue; warmth creeping back in. | | Stark contrast is structure | High-contrast edges are the house voice; low-contrast fog is failure. | Muddy grays; mid-contrast sludge. | | Motion with intent | No animation without narrative purpose. | Decorative motion loops; generic fade-ins. | | Detail survives zoom | Micro-texture visible at 100%, macro-composition reads at 25%. | Smooth gradients only; pure flat blacks. | | Bleak, never cold | Warmth-of-craft lives in texture and gesture, not color. | Sterile cyberpunk; corporate dark-mode. |
All tokens are CSS custom properties, prefixed --aw-. These are the only values permitted in production. The palette is strictly monochromatic.
--aw-[category]-[variant]-[state?]-[scale?]Examples: --aw-color-obsidian-500, --aw-space-6, --aw-radius-lg, --aw-shadow-void-hover.
| Token | Hex | OKLCH | Role | |---|---|---|---| | --aw-color-abyss | #000003 | 1% 0.004 270 | Deepest void. Hero ground. | | --aw-color-obsidian-900 | #050508 | 5% 0.005 270 | Near-deepest. Primary dark surface. | | --aw-color-obsidian-800 | #0A0A0E | 8% 0.006 270 | Canvas default. | | --aw-color-obsidian-700 | #101016 | 11% 0.008 275 | Sunken surface. | | --aw-color-jet-700 | #13131A | 13% 0.008 275 | Raised surface floor. | | --aw-color-jet-600 | #18181F | 16% 0.009 275 | Elevated surface. | | --aw-color-jet-500 | #1D1D25 | 19% 0.009 275 | Standard card fill. | | --aw-color-ink-umber-500 | #1A1612 | 15% 0.008 45 | Hint-warm black (≤2% of any comp). | | --aw-color-midnight-slate-600 | #1B1D28 | 18% 0.012 260 | Hint-cool black (≤2% of any comp). | | --aw-color-charcoal-500 | #252530 | 24% 0.012 275 | Borders, inactive, dividers. | | --aw-color-charcoal-400 | #2F2F3A | 28% 0.013 275 | Active dividers. | | --aw-color-graphite-400 | #3A3A46 | 33% 0.013 275 | Muted foreground. | | --aw-color-graphite-300 | #4A4A55 | 40% 0.012 275 | Secondary text on deep black. | | --aw-color-soot-300 | #5F5F6B | 48% 0.011 275 | Tertiary text on deep black. | | --aw-color-ash-400 | #7A7A85 | 58% 0.010 275 | Disabled label on dark. | | --aw-color-ash-300 | #9A9AA3 | 68% 0.008 275 | Muted body on dark. |
Usage covenant: at any zoom, ≥90% of pixels in a meaningful surface must come from abyss through charcoal-500. The two "hint" blacks (ink-umber, midnight-slate) are restricted to subtle warmth/coolness bias inside a texture or noise layer, never flat fills.
| Token | Hex | Role | |---|---|---| | --aw-color-bone-50 | #FAF8F2 | Purest stark edge (rare, ≤2% surface area) | | --aw-color-bone-100 | #F0EDE3 | Primary body text on obsidian | | --aw-color-bone-200 | #E3DFD2 | Secondary text on obsidian | | --aw-color-ash-cream | #C9C4B5 | Tertiary text, subtitles | | --aw-color-pale-fog | #AFA99A | Muted editorial voice |
Stark edges are the sole carrier of high-contrast dopamine. They replace what jewels did in v2.0. They must never wash across more than 8% of a meaningful surface — they are edges, strokes, gestures, type. Not fills.
| Token | Hex | Role | |---|---|---| | --aw-color-silver-thread | #B5B2AC | Default metallic hairline | | --aw-color-silver-deep | #6D6B66 | Shadowed silver | | --aw-color-chrome-glint | #D6D3CC | Brightest metallic refraction | | --aw-color-platinum-300 | #E3E0DA | Rare luxury glint (≤1% surface area) | | --aw-color-gunmetal-500 | #4A4A52 | Structural metallic weight | | --aw-color-gunmetal-700 | #2E2E36 | Gunmetal shadow |
Metallics are the only non-black, non-bone chroma allowed. They're what makes the void feel luxurious rather than austere.
| Token | Hex | Role | |---|---|---| | --aw-color-ember-danger | #6B1F1F | Destructive action / critical error fill | | --aw-color-ember-edge | #A23535 | Destructive-action edge + icon stroke |
The ember palette exists only to meet WCAG status-differentiation requirements for destructive UX. It must never be used decoratively, in marketing, on brand surfaces, or in data visualization. If a designer is tempted to use it outside role="alert" or a confirmed-destructive button, the answer is no — use tone, iconography, and typography weight instead.
| Token | Hex | Role | |---|---|---| | --aw-color-glint-cold | #C9D1D6 | Cold-spectrum refraction (near-silver) | | --aw-color-glint-warm | #D6CFC2 | Warm-spectrum refraction (near-bone) | | --aw-color-glint-ghost | #E8E5DE | Ghost refraction highlight |
No saturated hues. All glints sit within the grayscale-to-bone spectrum, distinguished only by micro temperature shifts. Used for prism edges on Tier-3 glass, hero motif shimmers, and focus-state light-through-void effects.
css/* Surfaces */ --aw-bg-canvas: var(--aw-color-obsidian-800); /* page base */ --aw-bg-surface: var(--aw-color-obsidian-900); /* recessed surface */ --aw-bg-sunken: var(--aw-color-abyss); /* deepest sunken */ --aw-bg-raised: var(--aw-color-jet-600); /* cards at rest */ --aw-bg-elevated: var(--aw-color-jet-500); /* cards on hover */ --aw-bg-inverse: var(--aw-color-bone-100); /* extreme-contrast inversion — use sparingly */ /* Foreground */ --aw-fg-primary: var(--aw-color-bone-100); --aw-fg-secondary: var(--aw-color-bone-200); --aw-fg-muted: var(--aw-color-ash-cream); --aw-fg-disabled: var(--aw-color-graphite-400); --aw-fg-inverse: var(--aw-color-obsidian-900); /* on inverse bg only */ --aw-fg-accent: var(--aw-color-chrome-glint); /* the stark dopamine edge */ --aw-fg-link: var(--aw-color-bone-50); /* underlined silver */ /* Borders */ --aw-border-subtle: rgba(240, 237, 227, 0.06); --aw-border-default: rgba(240, 237, 227, 0.12); --aw-border-strong: rgba(240, 237, 227, 0.24); --aw-border-silver: var(--aw-color-silver-thread); --aw-border-glint: rgba(214, 211, 204, 0.35); /* Status (tonal-first, ember reserved for danger only) */ --aw-status-success: var(--aw-color-platinum-300); /* paired with ✓ iconography */ --aw-status-info: var(--aw-color-chrome-glint); /* paired with ◐ iconography */ --aw-status-warning: var(--aw-color-silver-thread);/* paired with △ iconography */ --aw-status-danger: var(--aw-color-ember-edge); /* only chromatic status */
Status design covenant: Because four of the five status tokens are tonal siblings, every status treatment must pair with a unique icon shape + a typography weight shift. Color alone never carries status.
Type families:
css--aw-font-display: "Gotham", "Montserrat", "Work Sans", system-ui, sans-serif; --aw-font-body: "Neue Haas Grotesk", "Helvetica Neue", Helvetica, Arial, system-ui, sans-serif; --aw-font-mono: "JetBrains Mono", "SF Mono", "Berkeley Mono", ui-monospace, monospace; --aw-font-etched: "Gotham", "Montserrat", system-ui, sans-serif; /* rare, for void pull quotes — always italic, always ultralight */
Scale (modular, 1.250 major third on desktop, 1.200 minor third on mobile):
| Token | Desktop | Mobile | Line-height | Letter-spacing | Weight | |---|---|---|---|---|---| | --aw-text-display-2xl | 84px / 5.25rem | 52px | 1.00 | -0.04em | 200 | | --aw-text-display-xl | 64px / 4rem | 42px | 1.02 | -0.035em | 250 | | --aw-text-display-lg | 48px / 3rem | 34px | 1.06 | -0.03em | 300 | | --aw-text-display-md | 36px / 2.25rem | 28px | 1.12 | -0.02em | 300 | | --aw-text-display-sm | 28px / 1.75rem | 24px | 1.2 | -0.015em | 400 | | --aw-text-body-lg | 18px / 1.125rem| 17px | 1.6 | 0.005em | 400 | | --aw-text-body-md | 16px / 1rem | 16px | 1.65 | 0.01em | 400 | | --aw-text-body-sm | 14px / 0.875rem| 14px | 1.55 | 0.02em | 400 | | --aw-text-caption | 12px / 0.75rem | 12px | 1.45 | 0.08em | 500 | | --aw-text-micro | 10px / 0.625rem| 10px | 1.4 | 0.14em | 600 |
Typographic bleak rules:
--aw-font-display). Body uses the Neue Haas Grotesk stack (--aw-font-body). Mono is for code, data, technical specs only. Etched is reserved for ≤1 use per page, always italic, always ≥ 28px, always ultralight (200).css--aw-space-0: 0; --aw-space-px: 1px; --aw-space-0-5: 2px; --aw-space-1: 4px; --aw-space-2: 8px; --aw-space-3: 12px; --aw-space-4: 16px; --aw-space-5: 20px; --aw-space-6: 24px; --aw-space-8: 32px; --aw-space-10: 40px; --aw-space-12: 48px; --aw-space-16: 64px; --aw-space-20: 80px; --aw-space-24: 96px; --aw-space-32: 128px; --aw-space-40: 160px; --aw-space-48: 192px; --aw-space-64: 256px;
Rhythm rules (bleak spacing skews wider than v2.0):
--aw-space-4.--aw-space-20 minimum desktop, --aw-space-12 mobile.--aw-space-32 desktop / --aw-space-16 mobile. Void breath is extreme.15px, no 37px.css--aw-radius-none: 0; /* preferred for extremism moments */ --aw-radius-sm: 2px; /* tighter than v2.0 */ --aw-radius-md: 6px; --aw-radius-lg: 12px; /* default component radius */ --aw-radius-xl: 20px; --aw-radius-2xl: 32px; --aw-radius-pill: 9999px; --aw-radius-void-a: 63% 37% 54% 46% / 55% 48% 52% 45%; --aw-radius-void-b: 38% 62% 41% 59% / 44% 39% 61% 56%;
Default component radius: --aw-radius-lg (12px). Sharp 0-radius corners are encouraged on architectural surfaces (hero panels, modals in extreme mode). Pills reserved for tags, avatars, status dots. Void radii reserved for decorative biomorphic masks, never interactive controls.
Aetherweave v3.0 shadows are deep black, sharp, and high-contrast. No warm cast. Shadows now also carry a secondary hairline glint on top-edge for luxury definition against the void.
css--aw-shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.55); --aw-shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.60), 0 0 0 1px rgba(240, 237, 227, 0.04); --aw-shadow-md: 0 10px 28px rgba(0, 0, 0, 0.70), 0 0 0 1px rgba(240, 237, 227, 0.06); --aw-shadow-lg: 0 22px 52px rgba(0, 0, 0, 0.80), 0 0 0 1px rgba(240, 237, 227, 0.08); --aw-shadow-xl: 0 40px 96px rgba(0, 0, 0, 0.88), 0 0 0 1px rgba(240, 237, 227, 0.10); /* Specialty: void inset for sunken surfaces */ --aw-shadow-inset-void: inset 0 2px 8px rgba(0, 0, 0, 0.70); /* Specialty: silver thread outline for luxury emphasis (use sparingly) */ --aw-shadow-silver-thread: 0 0 0 1px rgba(181, 178, 172, 0.45), 0 12px 32px rgba(0, 0, 0, 0.75); /* Specialty: chrome-glint top highlight — signature dopamine hairline on raised surfaces */ --aw-shadow-chrome-glint: inset 0 1px 0 rgba(214, 211, 204, 0.14); /* Focus: metallic halo around focused element */ --aw-shadow-focus: 0 0 0 2px var(--aw-color-chrome-glint), 0 0 0 5px rgba(214, 211, 204, 0.22);
Elevation map: | Level | Token | Use | |---|---|---| | 0 | none | Inline text, inherent-flow elements | | 1 | --aw-shadow-xs | Subtle borders, resting inputs | | 2 | --aw-shadow-sm + chrome-glint | Cards at rest | | 3 | --aw-shadow-md + chrome-glint | Cards on hover, dropdowns | | 4 | --aw-shadow-lg | Modals, popovers | | 5 | --aw-shadow-xl + silver-thread | Full-screen sheets, hero overlays |
css--aw-blur-xs: 4px; --aw-blur-sm: 12px; --aw-blur-md: 24px; --aw-blur-lg: 44px; --aw-blur-xl: 72px; --aw-saturate-glass: 0.6; /* DESATURATE — v3.0 pulls color OUT of what's behind */ --aw-brightness-glass: 0.58; /* DARKEN what's refracted */ --aw-contrast-glass: 1.18; /* Boost contrast for dopamine edge */
Dark liquid glass inverts v2.0's glass philosophy: rather than brightening and saturating what's beneath, v3.0 pulls everything toward the void, then stakes high-contrast edges and hairlines. What sits behind a panel becomes a shadow of itself — the panel's chrome-glint edge is the hero.
css--aw-z-hide: -1; --aw-z-base: 0; --aw-z-raised: 10; --aw-z-dropdown: 100; --aw-z-sticky: 200; --aw-z-overlay: 300; --aw-z-modal: 400; --aw-z-popover: 500; --aw-z-toast: 600; --aw-z-tooltip: 700; --aw-z-debug: 9999;
css--aw-bp-xs: 480px; --aw-bp-sm: 640px; --aw-bp-md: 768px; --aw-bp-lg: 1024px; --aw-bp-xl: 1280px; --aw-bp-2xl: 1536px; --aw-bp-3xl: 1920px;
Mobile-first. Media queries use min-width only.
css--aw-width-prose: 64ch; /* tighter than v2.0 for extremism */ --aw-width-narrow: 640px; --aw-width-content: 960px; --aw-width-wide: 1200px; --aw-width-full: 1440px; --aw-width-cinema: 1760px;
css--aw-opacity-0: 0; --aw-opacity-3: 0.03; --aw-opacity-6: 0.06; --aw-opacity-12: 0.12; --aw-opacity-24: 0.24; --aw-opacity-48: 0.48; --aw-opacity-72: 0.72; --aw-opacity-92: 0.92; --aw-opacity-100: 1;
Micro-opacities (3, 6, 12) are critical to bleak extremism — they're how you layer 10+ near-black strata without mud.
Every meaningful surface (page, hero, major section, hero product card) must contain at least 5 of these 7 elements. Minor surfaces (buttons, inputs) may carry fewer, inherited from context.
Hero surfaces carry 8 to 18 distinct strata. Count includes: abyss wash, noise grain, impasto ridge, pattern layer, motif layer(s), dark glass panel, foreground content, metallic thread, gestural overlay, refractive glint, void dot-field, edge-mask.
Fewer than 8: feels flat — add depth. More than 18: feels chaotic — consolidate.
Every Aetherweave surface carries micro-texture. Use at least two of these per meaningful surface:
0.06 opacity fractal noise SVG, mix-blend-mode: overlay on dark. (Heavier than v2.0's 0.04 — bleak texture is the voice.)0.04 opacity.0.06 opacity, rotated randomly (scratched into the void).obsidian-700 at 0.12 opacity on abyss.0.05 opacity, simulating refractive flecks.Reference CSS — fractal noise overlay on dark:
css.aw-texture-void-grain::before { content: ''; position: absolute; inset: 0; background-image: url('/textures/aw-noise-fractal.svg'); mix-blend-mode: overlay; opacity: 0.06; pointer-events: none; z-index: 1; }
Negative space in v3.0 is not blank — it is the void. It actively carries tension.
--aw-space-8 above any heading display-md or larger.Abyss areas may carry a single sub-5% opacity textural element (noise, lone dot-field, distant gestural mark) — but must never hold secondary content. The void is sacred.
| Motif ID | Description | Typical use | |---|---|---| | aw-motif-void-prism | Near-black light-bending planes with chrome-glint edges, 7–12 rays | Hero focal points | | aw-motif-sonic-void | Rhythmic wave lines carved through blackness, variable amplitude | Audio/music contexts | | aw-motif-abyss-migration | Mehretu-esque layered trajectory lines flowing through dark | Data, journeys, systems | | aw-motif-dot-abyss | Scattered dots in varying black densities, meditative | Background texture | | aw-motif-ink-void-flow | Single continuous gestural line disappearing into dark | Accent, dividers | | aw-motif-shadow-tessellation | Etched geometric repeat with 1–3 variations on jet ground | Borders, patterns | | aw-motif-ink-splash-void | Organic ink bloom in charcoal-on-jet | Accent, backgrounds | | aw-motif-biomorph-shadow | Amoeba/cell/leaf organic shape emerging from void | Containers, masks | | aw-motif-bricolage-void | Collage of fragmented matte/gloss black rectangles | Cultural/archival feel | | aw-motif-refract-glint | Singular platinum light-bend (extreme-rare) | Singular luxury moment |
All motifs are original inventions rendered in extreme black. Motifs are SVG assets stored at /assets/motifs/{motif-id}.svg. They accept CSS custom property color overrides via currentColor or var(--aw-motif-color) — which defaults to var(--aw-color-charcoal-500).
The refractive dark glass panel is Aetherweave v3.0's signature digital surface. Three tiers — all frosted black, desaturating and darkening what sits behind them.
Use: sticky headers, tooltips, subtle overlays.
css.aw-glass-veil { background: rgba(10, 10, 14, 0.62); backdrop-filter: blur(var(--aw-blur-sm)) saturate(var(--aw-saturate-glass)) brightness(var(--aw-brightness-glass)) contrast(var(--aw-contrast-glass)); -webkit-backdrop-filter: blur(var(--aw-blur-sm)) saturate(var(--aw-saturate-glass)) brightness(var(--aw-brightness-glass)) contrast(var(--aw-contrast-glass)); border: 1px solid rgba(240, 237, 227, 0.06); border-top-color: rgba(214, 211, 204, 0.14); /* chrome-glint top hairline */ box-shadow: var(--aw-shadow-sm); }
Use: cards, modals, dropdown content.
css.aw-glass-pane { background: linear-gradient( 135deg, rgba(10, 10, 14, 0.78) 0%, rgba(5, 5, 8, 0.66) 100% ); backdrop-filter: blur(var(--aw-blur-md)) saturate(var(--aw-saturate-glass)) brightness(var(--aw-brightness-glass)) contrast(var(--aw-contrast-glass)); -webkit-backdrop-filter: blur(var(--aw-blur-md)) saturate(var(--aw-saturate-glass)) brightness(var(--aw-brightness-glass)) contrast(var(--aw-contrast-glass)); border: 1px solid rgba(240, 237, 227, 0.10); border-top-color: rgba(214, 211, 204, 0.22); box-shadow: var(--aw-shadow-md), inset 0 1px 0 rgba(214, 211, 204, 0.12); border-radius: var(--aw-radius-lg); }
Use: hero panels, feature showcases, singular extremism moments. Max 1 per view.
css.aw-glass-prism-void { position: relative; background: linear-gradient( 135deg, rgba(10, 10, 14, 0.82) 0%, rgba(29, 29, 37, 0.52) 50%, rgba(5, 5, 8, 0.78) 100% ); backdrop-filter: blur(var(--aw-blur-lg)) saturate(0.4) brightness(0.5) contrast(1.25); border-radius: var(--aw-radius-xl); border: 1px solid transparent; background-clip: padding-box; box-shadow: var(--aw-shadow-xl), var(--aw-shadow-silver-thread); } .aw-glass-prism-void::before { /* monochrome refractive edge */ content: ''; position: absolute; inset: -1px; border-radius: inherit; padding: 1px; background: conic-gradient( from 180deg at 50% 50%, var(--aw-color-glint-cold), var(--aw-color-silver-thread), var(--aw-color-platinum-300), var(--aw-color-gunmetal-500), var(--aw-color-glint-warm), var(--aw-color-glint-cold) ); opacity: 0.35; -webkit-mask: linear-gradient(#000, #000) content-box, linear-gradient(#000, #000); mask: linear-gradient(#000, #000) content-box, linear-gradient(#000, #000); -webkit-mask-composite: xor; mask-composite: exclude; pointer-events: none; }
The prism-void ring is the only place where multiple metallic hues co-exist — forming a bleak rainbow across the grayscale-to-platinum spectrum. No chromatic hues enter this gradient.
When [data-theme="inverse"] is active (Section 12.3 — a rare bone-dominant inversion), glass inverts to:
rgba(245, 243, 238, 0.72) (bone-on-bone)rgba(29, 29, 37, 0.24) (jet hairline)rgba(255, 255, 255, 0.55)backdrop-filter support)css@supports not (backdrop-filter: blur(1px)) { .aw-glass-veil, .aw-glass-pane, .aw-glass-prism-void { background: var(--aw-bg-raised); box-shadow: var(--aw-shadow-md); border-color: var(--aw-border-default); } }
--aw-blur-xl on scrollable content — kills FPS on mid-range devices.prefers-reduced-transparency: reduce is set. Fall back to solid --aw-bg-raised with a chrome-glint top border.12-column fluid grid. Gutters scale with breakpoint:
| Breakpoint | Columns | Gutter | Margin | |---|---|---|---| | xs / sm | 4 | 16px | 16px | | md | 8 | 20px | 24px | | lg | 12 | 24px | 40px | | xl / 2xl | 12 | 32px | 64px | | 3xl | 12 | 40px | auto (capped at --aw-width-cinema) |
css.aw-container { width: 100%; max-width: var(--aw-width-full); margin-inline: auto; padding-inline: var(--aw-space-4); } @media (min-width: 768px) { .aw-container { padding-inline: var(--aw-space-6); } } @media (min-width: 1024px) { .aw-container { padding-inline: var(--aw-space-10); } } @media (min-width: 1536px) { .aw-container { padding-inline: var(--aw-space-16); } }
Every section has inherent vertical padding via tokens. Don't override with margin hacks. Abyss breath is wider than v2.0.
css.aw-section { padding-block: var(--aw-space-20); } .aw-section--hero { padding-block: var(--aw-space-32) var(--aw-space-24); } .aw-section--compact { padding-block: var(--aw-space-12); } @media (min-width: 1024px) { .aw-section { padding-block: var(--aw-space-32); } .aw-section--hero { padding-block: var(--aw-space-48) var(--aw-space-40); } }
Aetherweave v3.0 layouts are extremely asymmetrically balanced — more often than centered. For hero sections, prefer 8/4 or 9/3 splits over 6/6. Center only for singular statement moments where the subject demands axis-dominance.
Every full-bleed section carries one architectural edge: a 1px silver-thread hairline, a thin charcoal rule, or a vertical gutter of abyss. This edge defines the rhythm of the composition. Never ship a section without one.
role="heading" aria-level.--aw-text-body-md, --aw-fg-primary, measure capped at --aw-width-prose (64ch).Display text uses --aw-font-display (Gotham stack), extremely tight tracking, ultralight weight. It floats in the void — never shrink line-height below 1.00 at display-2xl. Display copy should feel almost disembodied.
css.aw-display-2xl { font: 200 var(--aw-text-display-2xl) / 1.00 var(--aw-font-display); letter-spacing: -0.04em; color: var(--aw-color-bone-100); }
css.aw-pull-quote { font-family: var(--aw-font-etched); font-style: italic; font-weight: 200; font-size: clamp(1.75rem, 3vw, 2.5rem); line-height: 1.35; color: var(--aw-color-ash-cream); border-inline-start: 1px solid var(--aw-color-silver-thread); padding-inline-start: var(--aw-space-6); max-width: 52ch; }
css.aw-dropcap::first-letter { font-family: var(--aw-font-display); font-weight: 200; font-size: 5.5em; line-height: 0.82; float: inline-start; padding-inline-end: var(--aw-space-3); padding-block-start: var(--aw-space-2); color: var(--aw-color-bone-50); }
css.aw-link { color: var(--aw-fg-link); text-decoration: underline; text-decoration-thickness: 1px; text-decoration-color: rgba(181, 178, 172, 0.45); /* silver-thread */ text-underline-offset: 0.18em; transition: text-decoration-color 220ms var(--aw-ease-silk), color 220ms var(--aw-ease-silk); } .aw-link:hover { color: var(--aw-color-chrome-glint); text-decoration-color: var(--aw-color-chrome-glint); } .aw-link:focus-visible { /* see Section 14.3 */ }
Use tabular numerals for tables, data, timestamps, prices: font-variant-numeric: tabular-nums. Oldstyle numerals are prohibited in v3.0 — they introduce organic warmth that conflicts with extremism. Only lining + tabular numerals.
Caption and micro tiers default to all-caps for structural moments (eyebrow labels, section indicators, metadata):
css.aw-caption-eyebrow { font: 600 var(--aw-text-micro) / 1.4 var(--aw-font-body); letter-spacing: 0.14em; text-transform: uppercase; color: var(--aw-color-silver-thread); }
Every component is specified with: anatomy, default state, all interactive states, variants, sizes, do's, don'ts, edge cases. All components default to obsidian surfaces, bone text, silver-thread borders, chrome-glint hover.
[optional leading icon] [label] [optional trailing icon] — padding, radius, border, fill, shadow.
--aw-fg-accent..aw-glass-pane fill, silver-thread border on hover..aw-link semantically a button.| Size | Height | Padding-inline | Font | Icon size | |---|---|---|---|---| | xs | 28px | 10px | body-sm | 14px | | sm | 36px | 14px | body-sm | 16px | | md | 44px | 20px | body-md | 18px | | lg | 52px | 28px | body-md | 20px | | xl | 64px | 36px | body-lg | 24px |
--aw-shadow-focus)css.aw-btn-void { display: inline-flex; align-items: center; gap: var(--aw-space-2); height: 44px; padding-inline: var(--aw-space-5); border-radius: var(--aw-radius-lg); border: 1px solid rgba(181, 178, 172, 0.35); background: linear-gradient(180deg, var(--aw-color-obsidian-700) 0%, var(--aw-color-obsidian-900) 100%); color: var(--aw-color-bone-100); font: 500 var(--aw-text-body-md) / 1 var(--aw-font-body); letter-spacing: 0.02em; box-shadow: var(--aw-shadow-sm), inset 0 1px 0 rgba(214, 211, 204, 0.14); cursor: pointer; transition: transform 220ms var(--aw-ease-silk), box-shadow 220ms var(--aw-ease-silk), border-color 220ms var(--aw-ease-silk), background 220ms var(--aw-ease-silk); } .aw-btn-void:hover { transform: translateY(-1px); border-color: var(--aw-color-chrome-glint); box-shadow: var(--aw-shadow-md), inset 0 1px 0 rgba(214, 211, 204, 0.22); background: linear-gradient(180deg, var(--aw-color-jet-600) 0%, var(--aw-color-obsidian-800) 100%); } .aw-btn-void:active { transform: translateY(0); box-shadow: var(--aw-shadow-xs); } .aw-btn-void:focus-visible { outline: 2px solid var(--aw-color-chrome-glint); outline-offset: 3px; } .aw-btn-void:disabled { opacity: 0.35; cursor: not-allowed; transform: none; }
css.aw-btn-destructive { /* same structure as aw-btn-void, with ember fill */ background: linear-gradient(180deg, var(--aw-color-ember-edge) 0%, var(--aw-color-ember-danger) 100%); border: 1px solid rgba(240, 237, 227, 0.24); color: var(--aw-color-bone-100); }
aria-label, add aspect-ratio: 1, same height as sized counterpart.type="button" unless it's the submit.--aw-space-3 gap minimum.[label] [optional description] [leading-icon? input trailing-icon/action?] [helper text / error]
Default → Hover → Focus → Filled → Error → Disabled → Read-only.
css.aw-field-input { width: 100%; height: 44px; padding: 0 var(--aw-space-4); border-radius: var(--aw-radius-md); border: 1px solid var(--aw-border-default); background: var(--aw-color-obsidian-900); color: var(--aw-fg-primary); font: 400 var(--aw-text-body-md) / 1.4 var(--aw-font-body); box-shadow: var(--aw-shadow-inset-void); transition: border-color 180ms var(--aw-ease-silk), box-shadow 180ms var(--aw-ease-silk); } .aw-field-input::placeholder { color: var(--aw-fg-muted); } .aw-field-input:hover { border-color: var(--aw-border-strong); } .aw-field-input:focus-visible { outline: none; border-color: var(--aw-color-chrome-glint); box-shadow: 0 0 0 3px rgba(214, 211, 204, 0.22), var(--aw-shadow-inset-void); } .aw-field-input[aria-invalid="true"] { border-color: var(--aw-color-ember-edge); box-shadow: 0 0 0 3px rgba(162, 53, 53, 0.20); } .aw-field-input:disabled { opacity: 0.4; cursor: not-allowed; background: var(--aw-bg-sunken); }
html<div class="aw-field"> <label class="aw-field__label" for="email">EMAIL ADDRESS</label> <p class="aw-field__description">We'll never share this.</p> <input id="email" class="aw-field-input" type="email" aria-describedby="email-help" /> <p id="email-help" class="aw-field__helper">Use the address linked to your account.</p> </div>
Label is always visible (no placeholder-as-label), rendered as .aw-caption-eyebrow all-caps treatment. If space demands, use floating label variant — floating label animates from placeholder position to eyebrow position via 220ms silk ease.
-webkit-box-shadow: 0 0 0 1000px var(--aw-color-obsidian-900) inset; -webkit-text-fill-color: var(--aw-fg-primary);text-overflow: ellipsis only on read-only; editable fields scroll horizontally.aria-pressed, switches type between password and text.Same as input, but: min-height: 120px; padding-block: var(--aw-space-3); resize: vertical;. Character counter if maxLength set: bottom-right, --aw-text-caption, turns ember-edge at 90% full.
Custom only — never rely on native <select> for aesthetic parity. Built on a listbox pattern with full ARIA.
.aw-glass-pane panel, --aw-shadow-lg, max-height 280px, scrollable.rgba(214, 211, 204, 0.06), selected rgba(214, 211, 204, 0.14) + silver-thread leading line (2px).--aw-radius-sm (checkbox), full pill (radio).--aw-border-strong, --aw-color-obsidian-900 fill.--aw-color-bone-100, obsidian-900 checkmark (hand-drawn SVG, not geometric ✓). The inversion is the dopamine — a tiny bright square in the void.--aw-color-obsidian-700 track, graphite-300 thumb.--aw-color-bone-100 track, obsidian-900 thumb with silver-thread hairline — extreme inversion.[optional media] [header: title + optional subtitle] [body] [optional footer]
--aw-bg-raised, 1px --aw-border-subtle, no shadow.--aw-shadow-sm + chrome-glint inset, no border.--aw-shadow-md, translateY(-2px), chrome-glint border intensifies, 260ms.css.aw-card { position: relative; padding: var(--aw-space-6); border-radius: var(--aw-radius-lg); background: var(--aw-bg-raised); border: 1px solid var(--aw-border-subtle); box-shadow: var(--aw-shadow-sm), var(--aw-shadow-chrome-glint); overflow: hidden; isolation: isolate; /* prevents motif bleed */ } .aw-card__title { font: 300 var(--aw-text-display-sm) / 1.2 var(--aw-font-display); color: var(--aw-fg-primary); letter-spacing: -0.015em; } .aw-card__subtitle { font: 400 var(--aw-text-body-sm) / 1.4 var(--aw-font-body); color: var(--aw-fg-secondary); margin-block-start: var(--aw-space-1); } .aw-card__body { margin-block-start: var(--aw-space-4); color: var(--aw-fg-primary); } .aw-card__footer { margin-block-start: var(--aw-space-6); display: flex; gap: var(--aw-space-3); align-items: center; }
--aw-color-silver-thread, 40% opacity).aw-motif-dot-abyss or aw-motif-ink-void-flow, 10% opacity, absolute top-right, 80×80px.--aw-color-platinum-300 2×2px dot in a non-obvious corner (Easter-egg dopamine).rgba(0, 0, 0, 0.72) + backdrop-filter: blur(12px) saturate(0.5)..aw-glass-pane, max-width 560px (md), 720px (lg), 960px (xl), 100vw on mobile (bottom sheet).--aw-space-8 desktop, --aw-space-6 mobile.display-md ultralight), close button top-right.opacity: 0 → 1 (180ms linear)
scale: 0.96 → 1 (320ms silk-ease)
translateY: 16px → 0 (320ms silk-ease)
blur (backdrop): 0px → 12px (320ms silk-ease)Overlay fades independently (180ms).
Reverse, 180ms for both.
tabindex="-1").role="dialog" aria-modal="true" aria-labelledby="…".Status variants carry a leading 3px vertical bar in status token color (silver-thread for info, platinum for success, silver-deep for warning, ember-edge for danger) and a 16px status icon. Never color-only.
--aw-text-body-sm, .aw-glass-veil bg, silver-thread border..aw-glass-veil when scrolled > 20px.Hamburger → full-screen sheet with .aw-glass-prism-void, large display links (display-md ultralight on abyss), stagger-in animation 60ms delay between items.
--aw-border-subtle divider between items.grid-template-rows: 0fr → 1fr (modern) with max-height fallback.--aw-bg-sunken, .aw-caption-eyebrow treatment, silver-thread bottom border (1px).--aw-bg-canvas and --aw-bg-raised (zebra at ~40% opacity differentiation).--aw-radius-void-a variant for brand moments.--aw-font-display ultralight, on an obsidian gradient bg derived from name hash (all gradients stay within obsidian-900 → jet-500 range — never chromatic).--aw-space-1 --aw-space-3 padding, --aw-text-caption uppercase (eyebrow treatment).--aw-color-obsidian-900.aw-prism-shimmer).--aw-color-chrome-glint over --aw-color-obsidian-700 track.--aw-color-obsidian-700.--aw-color-jet-500 → --aw-color-jet-600, 1.6s linear infinite.display-sm ultralight bone-100, bleakly confident copy (never "No results"; prefer "Nothing in the void yet — step in.").body-md, --aw-fg-secondary.aw-motif-ink-splash-void with ember-edge stroke at 25% opacity (the single chromatic exception).--aw-font-display ultralight.aw-motif-void-prism SVG, rotating 3s linear, with subtle pulsing scale 0.98→1.02, strokes in chrome-glint at 60% opacity.ease, no linear except for opacity crossfades)css--aw-ease-silk: cubic-bezier(0.22, 0.61, 0.36, 1.00); /* default — everything */ --aw-ease-weave: cubic-bezier(0.65, 0.00, 0.35, 1.00); /* entrances */ --aw-ease-thread: cubic-bezier(0.16, 1.00, 0.30, 1.00); /* generous overshoot feel */ --aw-ease-prism: cubic-bezier(0.76, 0.00, 0.24, 1.00); /* dramatic reveal */ --aw-ease-hush: cubic-bezier(0.25, 0.10, 0.25, 1.00); /* exits, dismissals */ --aw-ease-void: cubic-bezier(0.85, 0.00, 0.15, 1.00); /* extremism reveal — v3.0 signature */
css--aw-dur-instant: 80ms; /* toggle flashes */ --aw-dur-quick: 180ms; /* hover, focus, micro */ --aw-dur-base: 260ms; /* most component motion */ --aw-dur-slow: 420ms; /* modals, sheets */ --aw-dur-slower: 680ms; /* page-level transitions */ --aw-dur-epic: 1400ms; /* hero entrances — longer in bleak */
css@keyframes aw-fade-in { from { opacity: 0; } to { opacity: 1; } } @keyframes aw-rise-in { from { opacity: 0; transform: translateY(16px); } to { opacity: 1; transform: translateY(0); } } @keyframes aw-void-condense { from { opacity: 0; transform: scale(0.92); filter: blur(8px); } to { opacity: 1; transform: scale(1); filter: blur(0); } } @keyframes aw-prism-shimmer { 0% { background-position: -200% 50%; } 100% { background-position: 200% 50%; } } @keyframes aw-void-pulse { 0%, 100% { opacity: 0.5; transform: scale(1); } 50% { opacity: 1; transform: scale(1.02); } } @keyframes aw-gestural-draw { from { stroke-dashoffset: var(--aw-path-length); } to { stroke-dashoffset: 0; } } @keyframes aw-refract-drift { 0%, 100% { transform: translate3d(0, 0, 0) rotate(0deg); } 33% { transform: translate3d(10px, -14px, 0) rotate(1.5deg); } 66% { transform: translate3d(-8px, 10px, 0) rotate(-1deg); } } @keyframes aw-spinner-sweep { 0% { stroke-dasharray: 1 150; stroke-dashoffset: 0; } 50% { stroke-dasharray: 90 150; stroke-dashoffset: -35; } 100% { stroke-dasharray: 90 150; stroke-dashoffset: -125; } } @keyframes aw-chrome-glint-sweep { from { background-position: -120% 0; opacity: 0.0; } 20% { opacity: 0.8; } to { background-position: 120% 0; opacity: 0.0; } }
The v3.0 page-load hero pattern, replacing v2.0's "Silk Settle":
--aw-color-abyss.aw-gestural-draw), staggered 80ms, 1400ms total.aw-void-condense) with 260ms delay after marks complete, 680ms duration, --aw-ease-void.aw-chrome-glint-sweep, 1200ms, runs once).Total orchestration: content condenses out of the void rather than settling onto a surface. The chrome-glint at the end is the dopamine.
Use IntersectionObserver at threshold: 0.15. Element receives .aw-reveal--in-view which triggers aw-void-condense with --aw-ease-weave, 680ms.
css.aw-reveal { opacity: 0; transform: scale(0.96) translateY(16px); filter: blur(4px); } .aw-reveal--in-view { animation: aw-void-condense var(--aw-dur-slower) var(--aw-ease-weave) forwards; }
Never animate every child — pick anchors. Too much scroll motion fatigues the extremism.
aw-chrome-glint-sweep on gradient border hover (once per hover).css@media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important; } .aw-reveal { opacity: 1; transform: none; filter: none; } .aw-refract-drift { animation: none; } }
Preserve opacity crossfades (≤ 120ms) for essential state changes.
Use only on hero motifs. Max 20% translate on scroll. Always will-change: transform only during scroll. Disabled under reduced-motion.
#0A0A0E, lift highlights only on edges (silver rim-light), desaturate globally by ~40%, add subtle film grain at 4% opacity.--aw-radius-lg corners, 1px silver-thread border.--aw-color-abyss on bottom 30% via linear-gradient mask.--aw-color-bone-200. Muted: --aw-color-ash-cream. Active/hover: --aw-color-chrome-glint.stroke-linejoin: round), rounded caps (stroke-linecap: round).currentColor, fill currentColor at 0.18 opacity.vh, dvh, svh) for full-height surfaces; prefer dvh where supported.| Component | xs/sm (mobile) | md (tablet) | lg+ (desktop) | |---|---|---|---| | Nav | Hamburger prism-void sheet | Condensed horizontal | Full horizontal | | Grid | 1–2 col | 2–3 col | 3–4+ col | | Hero type | display-xl (200wt) | display-xl (200wt) | display-2xl (200wt) | | Modal | Bottom sheet | Centered dialog | Centered dialog | | Card grid gap | space-4 | space-5 | space-6 | | Side nav | Hidden / overlay | Collapsed | Expanded | | Table | Card-per-row | Horizontal scroll | Full grid | | Abyss breath | 30% viewport min | 40% viewport min | 45% viewport min |
Display sizes use clamp():
css--aw-text-display-2xl-fluid: clamp(2.75rem, 1.5rem + 4.5vw, 5.25rem);
Prefer container queries for components reused across layouts:
css.aw-card-container { container-type: inline-size; } @container (min-width: 480px) { .aw-card { padding: var(--aw-space-8); } }
css@media (hover: hover) and (pointer: fine) { /* cursor-device styles */ } @media (hover: none) and (pointer: coarse) { .aw-btn-void:hover { transform: none; } /* avoid phantom hover */ }
The obsidian palette from Section 3.2 IS the default theme. There is no "dark mode toggle" in v3.0 — the void is the baseline. Defined above as :root.
A rare inversion used only for printable surfaces, accessibility preference (prefers-contrast: more + user opt-in), or regulated contexts. This is not a marketing theme.
css[data-theme="inverse"] { --aw-bg-canvas: var(--aw-color-bone-100); --aw-bg-surface: var(--aw-color-bone-50); --aw-bg-sunken: #E8E5DE; --aw-bg-raised: #FFFFFF; --aw-bg-elevated: #FFFFFF; --aw-bg-inverse: var(--aw-color-obsidian-900); --aw-fg-primary: var(--aw-color-obsidian-900); --aw-fg-secondary: var(--aw-color-graphite-400); --aw-fg-muted: var(--aw-color-graphite-300); --aw-fg-inverse: var(--aw-color-bone-100); --aw-fg-accent: var(--aw-color-obsidian-900); --aw-fg-link: var(--aw-color-obsidian-900); --aw-border-subtle: rgba(29, 29, 37, 0.06); --aw-border-default: rgba(29, 29, 37, 0.14); --aw-border-strong: rgba(29, 29, 37, 0.30); --aw-shadow-sm: 0 2px 6px rgba(29, 29, 37, 0.10), 0 1px 2px rgba(29, 29, 37, 0.06); --aw-shadow-md: 0 10px 26px rgba(29, 29, 37, 0.14), 0 2px 6px rgba(29, 29, 37, 0.08); --aw-shadow-lg: 0 22px 50px rgba(29, 29, 37, 0.18), 0 4px 12px rgba(29, 29, 37, 0.10); }
Metallic threads remain identical — silver reads luxurious against both void and bleached ground. Ember-danger darkens to #4A1313 in inverse for contrast.
css@media (prefers-contrast: more) { :root { --aw-border-subtle: rgba(240, 237, 227, 0.24); --aw-border-default: rgba(240, 237, 227, 0.45); --aw-fg-secondary: var(--aw-color-bone-50); --aw-fg-muted: var(--aw-color-ash-cream); } .aw-glass-veil, .aw-glass-pane, .aw-glass-prism-void { background: var(--aw-bg-raised); backdrop-filter: none; border: 2px solid var(--aw-border-strong); } }
default (void) and inverse (bleached). There is no "light mode" in the traditional sense.background-color and color for 260ms silk ease globally when theme changes.localStorage. prefers-color-scheme is ignored for Aetherweave brand surfaces — the void is intentional, not system-driven. For utility/admin/documentation contexts, respecting system preference is permissible.prefers-contrast: more → automatic high-contrast adjustment on top of whichever theme is active.Aetherweave v3.0 is extreme by default but must also serve dense data contexts (dashboards, admin, analytics) without losing the void aesthetic.
css[data-density="comfortable"] { /* default */ } [data-density="compact"] { --aw-row-height: 36px; --aw-form-height: 36px; --aw-padding-scale: 0.75; } [data-density="spacious"] { --aw-row-height: 56px; --aw-form-height: 52px; --aw-padding-scale: 1.25; }
Data viz in v3.0 is strictly monochromatic with pattern differentiation.
obsidian-900 → bone-100 (8 steps), light-through-void. Darkest to brightest.obsidian-900 → charcoal-500 → bone-100 (neutral midpoint is charcoal, not white).--aw-border-subtle, dashed 2/3.--aw-text-caption, --aw-fg-muted..aw-glass-pane.<feTurbulence> distortion on stroke), chrome-glint.display-sm ultralight, --aw-font-display.bone-100 on obsidian-800 = 17:1 ✓. ash-cream on obsidian-800 = 8.9:1 ✓. soot-300 on obsidian-800 = 3.2:1 ✗ (reserve for non-text decorative only).--aw-shadow-focus silver halo.outline: none without replacement.css.aw-focus-ring:focus-visible { outline: 2px solid var(--aw-color-chrome-glint); outline-offset: 3px; box-shadow: var(--aw-shadow-focus); border-radius: inherit; }
<button> for buttons, <a> for links, <input> for inputs.<header>, <nav>, <main>, <aside>, <footer>.aria-hidden="true".aria-label.role="status" (polite) or role="alert" (assertive).aria-busy="true".aria-describedby links input to error message, aria-invalid="true".prefers-reduced-motion — fall back to crossfades under 120ms.prefers-reduced-transparency — disable backdrop-filter, use solid --aw-bg-raised + silver-thread border.Because v3.0's palette is monochromatic, status signaling never relies on color alone:
All four carry redundant signals. Color-blind users receive full information from tone + shape + weight.
padding-inline-start, not padding-left. margin-block-end, not margin-bottom.Intl APIs.overflow-wrap: anywhere.-webkit-line-clamp, always paired with fade-to-abyss mask.--aw-color-abyss — the void is instant.--aw-font-display and --aw-font-body.<style> setting html { background: #0A0A0E; }..aw-btn-destructive + secondary-etched cancel, not instant undo only).--aw-width-cinema with decorative motifs + abyss filling margins.Print inverts to bleached void — void-on-paper is not printable.
css@media print { *, *::before, *::after { background: transparent !important; color: #000 !important; box-shadow: none !important; backdrop-filter: none !important; } html, body { background: #FFFFFF !important; color: #000000 !important; } .aw-nav, .aw-footer, .aw-toast, .aw-modal { display: none !important; } body { font-family: "Neue Haas Grotesk", Helvetica, Arial, sans-serif; } a::after { content: " (" attr(href) ")"; font-size: 0.85em; color: #555; } .aw-glass-veil, .aw-glass-pane, .aw-glass-prism-void { background: transparent !important; border: 1px solid #999 !important; } }
css:root { color-scheme: dark; /* browser chrome stays dark by default */ /* All --aw-* tokens from Section 3 injected here */ } html { font-family: var(--aw-font-body); background: var(--aw-bg-canvas); color: var(--aw-fg-primary); scroll-behavior: smooth; } body { min-height: 100dvh; line-height: var(--aw-text-body-md); } *, *::before, *::after { box-sizing: border-box; } /* Guarantee the void appears before any JS runs — prevents light-flash */ html { background: #0A0A0E; }
aw-.aw-* tokens; do not use Tailwind's default palette (which is too chromatic) in production components.js// tailwind.config.js (conceptual) theme: { colors: { obsidian: { 700:'#101016', 800:'#0A0A0E', 900:'#050508' }, jet: { 500:'#1D1D25', 600:'#18181F', 700:'#13131A' }, charcoal: { 400:'#2F2F3A', 500:'#252530' }, graphite: { 300:'#4A4A55', 400:'#3A3A46' }, soot: { 300:'#5F5F6B' }, ash: { 300:'#9A9AA3', 400:'#7A7A85' }, bone: { 50:'#FAF8F2', 100:'#F0EDE3', 200:'#E3DFD2' }, silver: { thread:'#B5B2AC', deep:'#6D6B66' }, chrome: { glint:'#D6D3CC' }, platinum: { 300:'#E3E0DA' }, gunmetal: { 500:'#4A4A52', 700:'#2E2E36' }, ember: { danger:'#6B1F1F', edge:'#A23535' }, // abyss is the default bg, not a utility color }, fontFamily: { display: ['Gotham', 'Montserrat', 'Work Sans', 'system-ui', 'sans-serif'], body: ['Neue Haas Grotesk', 'Helvetica Neue', 'Helvetica', 'Arial', 'system-ui', 'sans-serif'], }, fontWeight: { ultralight: 200, light: 300, regular: 400, medium: 500, }, borderRadius: { sm:'2px', md:'6px', lg:'12px', xl:'20px', '2xl':'32px' }, spacing: { /* 4px scale */ }, boxShadow: { /* void shadows */ }, }
--aw-* tokens (no hex, no magic numbers).inverse theme.prefers-reduced-motion.prefers-reduced-transparency.prefers-contrast: more.jsfunction voidCondense(root) { const prefersReduced = matchMedia('(prefers-reduced-motion: reduce)').matches; if (prefersReduced) { root.classList.add('aw-settled'); return; } const layers = root.querySelectorAll('[data-aw-layer]'); layers.forEach((el, i) => { el.style.animationDelay = `${i * 80}ms`; el.classList.add('aw-void-condense'); }); const paths = root.querySelectorAll('[data-aw-gesture]'); paths.forEach((p, i) => { const len = p.getTotalLength(); p.style.setProperty('--aw-path-length', len); p.style.strokeDasharray = len; p.style.animationDelay = `${300 + i * 80}ms`; p.classList.add('aw-gestural-draw'); }); const glintTarget = root.querySelector('[data-aw-chrome-sweep]'); if (glintTarget) { glintTarget.style.animationDelay = '2100ms'; glintTarget.classList.add('aw-chrome-glint-sweep'); } }
html<!-- In <head>, BEFORE any CSS link --> <style>html{background:#0A0A0E;color:#F0EDE3;}</style>
The void must render instantly. A flash of light is a brand failure.
/src
/styles
/tokens
colors.css
typography.css
spacing.css
motion.css
shadows.css
/base
reset.css
globals.css
typography.css
/components
button.css
card.css
input.css
modal.css
…
/patterns
glass-void.css
motifs.css
textures-void.css
/themes
default-void.css
inverse-bleached.css
high-contrast.css
aetherweave.css (entry point, imports above)
/assets
/motifs (svg motif library — rendered in charcoal/silver by default)
/textures (fractal noise, woven thread, impasto void)
/fonts
/icons
/components
[framework components, consume tokens]Tokens live in tokens.json (Design Tokens Community Group format) and are transformed via Style Dictionary to:
One source → many outputs. Never duplicate token values across platforms.
Aesthetic (Bleak Extremism)
Technical
--aw-* tokens.Narrative
#000 as a background — always --aw-color-abyss (#000003) or --aw-color-obsidian-800. Pure #000 has no texture affordance.#FFF anywhere. Always --aw-color-bone-50 at absolute purest.height / width where transform or grid-template-rows suffices.ease or linear as default transition timing.!important except in reduced-motion/reduced-transparency/print overrides.Any deviation requires written justification in the PR, named approver, and a proposal to either codify (update this doc) or revert within the next sprint. Deviations never become informal norms. Introducing any chromatic hue outside ember-danger requires two approvers and an explicit opt-in at the artifact level.
This spec is semver. Major = breaking token rename or removal, or aesthetic pivot (like v2→v3). Minor = additive tokens or components. Patch = fixes, clarifications. Each release has a migration guide.
terracotta-500 brand → obsidian-800 + chrome-glint accentcream-veil canvas → obsidian-800 canvasink-charcoal text → bone-100 text (contrast inverts)gold-thread → silver-threadruby-500 danger → ember-edge dangersapphire-500 link → bone-50 link (underline in silver-thread)When an AI agent is generating code, designs, or content for an Aetherweave v3.0 project:
Palette Stars — Abyss #000003 · Obsidian-800 #0A0A0E · Jet-500 #1D1D25 · Charcoal-500 #252530 · Bone-100 #F0EDE3 · Silver-Thread #B5B2AC · Chrome-Glint #D6D3CC · Platinum-300 #E3E0DA · Ember-Edge #A23535 (danger only)
Default Motion — 260ms cubic-bezier(0.22, 0.61, 0.36, 1.00)
Default Radius — 12px (tighter than v2.0; 0-radius encouraged for architectural surfaces)
Default Shadow — deep black cast with chrome-glint inset highlight
Default Breath — --aw-space-20 between sections; ≥45% hero viewport as abyss
Default Glass — Tier 2 Pane (dark, desaturating, darkening, high-contrast edge)
Signature Motion — Void Condense on hero load, chrome-glint sweep as payoff
Signature Detail — 1px silver-thread hairline + chrome-glint top-inset on feature surfaces
Signature Texture — 6% fractal noise, overlay blend on obsidian
Signature Type — Ultralight (200) display, floating in the void
Non-Negotiable — Obsidian ≥90% · Stark edge ≤8% · Metallic ≤2% · Chromatic hue = 0% (except sanctioned ember)
Aetherweave Design System — Living Document Black Bleak Modern Extremism Pivot, 2026 Update proposals via the governance process (Section 18.3).
Other measured skills in the registry, with their headline benchmark lift.