From bdc23f02c7088c64c0283361a4f07cdabb27fce5 Mon Sep 17 00:00:00 2001 From: Paul Bakaus Date: Mon, 30 Mar 2026 16:52:11 -0700 Subject: [PATCH] Redesign Antidote section: horizontal disclosure, gallery sidebar, detection callout - Replace tabbed pattern viewer with animated horizontal disclosure (inspired by jh3y/XJWNMOO): CSS Grid column transitions, hover to expand, rotated vertical labels, icon anchored at bottom - Don't/Do toggle in each panel (defaults to Don't) - Gallery of Shame as 2-column thumbnail sidebar beside the disclosure - Detection callout as horizontal strip below - Responsive: stacks at 1060px, gallery becomes 3-col grid - Remove all em dashes from anti-pattern text (AI slop tell) Co-Authored-By: Claude Opus 4.6 (1M context) --- .agents/skills/impeccable/SKILL.md | 68 ++-- .claude/skills/impeccable/SKILL.md | 68 ++-- .codex/skills/impeccable/SKILL.md | 68 ++-- .cursor/skills/impeccable/SKILL.md | 68 ++-- .gemini/skills/impeccable/SKILL.md | 68 ++-- .kiro/skills/impeccable/SKILL.md | 68 ++-- .opencode/skills/impeccable/SKILL.md | 68 ++-- .pi/skills/impeccable/SKILL.md | 68 ++-- .trae-cn/skills/impeccable/SKILL.md | 68 ++-- .trae/skills/impeccable/SKILL.md | 68 ++-- public/app.js | 173 ++++------ public/css/main.css | 458 ++++++++++++++++++++------- public/css/styles.css | 2 +- public/index.html | 55 +++- source/skills/impeccable/SKILL.md | 68 ++-- 15 files changed, 832 insertions(+), 604 deletions(-) diff --git a/.agents/skills/impeccable/SKILL.md b/.agents/skills/impeccable/SKILL.md index f7e88c29c..dca3c0588 100644 --- a/.agents/skills/impeccable/SKILL.md +++ b/.agents/skills/impeccable/SKILL.md @@ -12,12 +12,12 @@ This skill guides creation of distinctive, production-grade frontend interfaces Design skills produce generic output without project context. You MUST have confirmed design context before doing any design work. -**Required context** — every design skill needs at minimum: +**Required context** (every design skill needs at minimum): - **Target audience**: Who uses this product and in what context? - **Use cases**: What jobs are they trying to get done? - **Brand personality/tone**: How should the interface feel? -Individual skills may require additional context — check the skill's preparation section for specifics. +Individual skills may require additional context. Check the skill's preparation section for specifics. **CRITICAL**: You cannot infer this context by reading the codebase. Code tells you what was built, not who it's for or what it should feel like. Only the creator can provide this context. @@ -36,7 +36,7 @@ Commit to a BOLD aesthetic direction: - **Constraints**: Technical requirements (framework, performance, accessibility). - **Differentiation**: What makes this UNFORGETTABLE? What's the one thing someone will remember? -**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work—the key is intentionality, not intensity. +**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work. The key is intentionality, not intensity. Then implement working code that is: - Production-grade and functional @@ -53,9 +53,9 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis **DO**: Use a modular type scale with fluid sizing (clamp) **DO**: Vary font weights and sizes to create clear visual hierarchy -**DON'T**: Use overused fonts—Inter, Roboto, Arial, Open Sans, system defaults +**DON'T**: Use overused fonts like Inter, Roboto, Arial, Open Sans, or system defaults **DON'T**: Use monospace typography as lazy shorthand for "technical/developer" vibes -**DON'T**: Put large icons with rounded corners above every heading—they rarely add value and make sites look templated +**DON'T**: Put large icons with rounded corners above every heading. They rarely add value and make sites look templated ### Color & Theme → *Consult [color reference](reference/color-and-contrast.md) for OKLCH, palettes, and dark mode.* @@ -63,64 +63,64 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis Commit to a cohesive palette. Dominant colors with sharp accents outperform timid, evenly-distributed palettes. **DO**: Use modern CSS color functions (oklch, color-mix, light-dark) for perceptually uniform, maintainable palettes -**DO**: Tint your neutrals toward your brand hue—even a subtle hint creates subconscious cohesion -**DON'T**: Use gray text on colored backgrounds—it looks washed out; use a shade of the background color instead -**DON'T**: Use pure black (#000) or pure white (#fff)—always tint; pure black/white never appears in nature +**DO**: Tint your neutrals toward your brand hue. Even a subtle hint creates subconscious cohesion +**DON'T**: Use gray text on colored backgrounds; it looks washed out. Use a shade of the background color instead +**DON'T**: Use pure black (#000) or pure white (#fff). Always tint; pure black/white never appears in nature **DON'T**: Use the AI color palette: cyan-on-dark, purple-to-blue gradients, neon accents on dark backgrounds -**DON'T**: Use gradient text for "impact"—especially on metrics or headings; it's decorative rather than meaningful -**DON'T**: Default to dark mode with glowing accents—it looks "cool" without requiring actual design decisions +**DON'T**: Use gradient text for "impact," especially on metrics or headings. It's decorative rather than meaningful +**DON'T**: Default to dark mode with glowing accents. It looks "cool" without requiring actual design decisions ### Layout & Space → *Consult [spatial reference](reference/spatial-design.md) for grids, rhythm, and container queries.* -Create visual rhythm through varied spacing—not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. +Create visual rhythm through varied spacing, not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. -**DO**: Create visual rhythm through varied spacing—tight groupings, generous separations +**DO**: Create visual rhythm through varied spacing: tight groupings, generous separations **DO**: Use fluid spacing with clamp() that breathes on larger screens **DO**: Use asymmetry and unexpected compositions; break the grid intentionally for emphasis -**DON'T**: Wrap everything in cards—not everything needs a container -**DON'T**: Nest cards inside cards—visual noise, flatten the hierarchy -**DON'T**: Use identical card grids—same-sized cards with icon + heading + text, repeated endlessly -**DON'T**: Use the hero metric layout template—big number, small label, supporting stats, gradient accent -**DON'T**: Center everything—left-aligned text with asymmetric layouts feels more designed -**DON'T**: Use the same spacing everywhere—without rhythm, layouts feel monotonous +**DON'T**: Wrap everything in cards. Not everything needs a container +**DON'T**: Nest cards inside cards. Visual noise; flatten the hierarchy +**DON'T**: Use identical card grids (same-sized cards with icon + heading + text, repeated endlessly) +**DON'T**: Use the hero metric layout template (big number, small label, supporting stats, gradient accent) +**DON'T**: Center everything. Left-aligned text with asymmetric layouts feels more designed +**DON'T**: Use the same spacing everywhere. Without rhythm, layouts feel monotonous ### Visual Details **DO**: Use intentional, purposeful decorative elements that reinforce brand -**DON'T**: Use glassmorphism everywhere—blur effects, glass cards, glow borders used decoratively rather than purposefully -**DON'T**: Use rounded elements with thick colored border on one side—a lazy accent that almost never looks intentional -**DON'T**: Use sparklines as decoration—tiny charts that look sophisticated but convey nothing meaningful -**DON'T**: Use rounded rectangles with generic drop shadows—safe, forgettable, could be any AI output -**DON'T**: Use modals unless there's truly no better alternative—modals are lazy +**DON'T**: Use glassmorphism everywhere (blur effects, glass cards, glow borders used decoratively rather than purposefully) +**DON'T**: Use rounded elements with thick colored border on one side. A lazy accent that almost never looks intentional +**DON'T**: Use sparklines as decoration. Tiny charts that look sophisticated but convey nothing meaningful +**DON'T**: Use rounded rectangles with generic drop shadows. Safe, forgettable, could be any AI output +**DON'T**: Use modals unless there's truly no better alternative. Modals are lazy ### Motion → *Consult [motion reference](reference/motion-design.md) for timing, easing, and reduced motion.* Focus on high-impact moments: one well-orchestrated page load with staggered reveals creates more delight than scattered micro-interactions. -**DO**: Use motion to convey state changes—entrances, exits, feedback +**DO**: Use motion to convey state changes: entrances, exits, feedback **DO**: Use exponential easing (ease-out-quart/quint/expo) for natural deceleration **DO**: For height animations, use grid-template-rows transitions instead of animating height directly -**DON'T**: Animate layout properties (width, height, padding, margin)—use transform and opacity only -**DON'T**: Use bounce or elastic easing—they feel dated and tacky; real objects decelerate smoothly +**DON'T**: Animate layout properties (width, height, padding, margin). Use transform and opacity only +**DON'T**: Use bounce or elastic easing. They feel dated and tacky; real objects decelerate smoothly ### Interaction → *Consult [interaction reference](reference/interaction-design.md) for forms, focus, and loading patterns.* -Make interactions feel fast. Use optimistic UI—update immediately, sync later. +Make interactions feel fast. Use optimistic UI: update immediately, sync later. -**DO**: Use progressive disclosure—start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) +**DO**: Use progressive disclosure. Start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) **DO**: Design empty states that teach the interface, not just say "nothing here" **DO**: Make every interactive surface feel intentional and responsive -**DON'T**: Repeat the same information—redundant headers, intros that restate the heading -**DON'T**: Make every button primary—use ghost buttons, text links, secondary styles; hierarchy matters +**DON'T**: Repeat the same information (redundant headers, intros that restate the heading) +**DON'T**: Make every button primary. Use ghost buttons, text links, secondary styles; hierarchy matters ### Responsive → *Consult [responsive reference](reference/responsive-design.md) for mobile-first, fluid design, and container queries.* **DO**: Use container queries (@container) for component-level responsiveness -**DO**: Adapt the interface for different contexts—don't just shrink it -**DON'T**: Hide critical functionality on mobile—adapt the interface, don't amputate it +**DO**: Adapt the interface for different contexts, not just shrink it +**DON'T**: Hide critical functionality on mobile. Adapt the interface, don't amputate it ### UX Writing → *Consult [ux-writing reference](reference/ux-writing.md) for labels, errors, and empty states.* @@ -136,7 +136,7 @@ Make interactions feel fast. Use optimistic UI—update immediately, sync later. A distinctive interface should make someone ask "how was this made?" not "which AI made this?" -Review the DON'T guidelines above—they are the fingerprints of AI-generated work from 2024-2025. +Review the DON'T guidelines above. They are the fingerprints of AI-generated work from 2024-2025. --- @@ -146,7 +146,7 @@ Match implementation complexity to the aesthetic vision. Maximalist designs need Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices across generations. -Remember: the model is capable of extraordinary creative work. Don't hold back—show what can truly be created when thinking outside the box and committing fully to a distinctive vision. +Remember: the model is capable of extraordinary creative work. Don't hold back. Show what can truly be created when thinking outside the box and committing fully to a distinctive vision. --- diff --git a/.claude/skills/impeccable/SKILL.md b/.claude/skills/impeccable/SKILL.md index e3b166a56..ca34f75ab 100644 --- a/.claude/skills/impeccable/SKILL.md +++ b/.claude/skills/impeccable/SKILL.md @@ -12,12 +12,12 @@ This skill guides creation of distinctive, production-grade frontend interfaces Design skills produce generic output without project context. You MUST have confirmed design context before doing any design work. -**Required context** — every design skill needs at minimum: +**Required context** (every design skill needs at minimum): - **Target audience**: Who uses this product and in what context? - **Use cases**: What jobs are they trying to get done? - **Brand personality/tone**: How should the interface feel? -Individual skills may require additional context — check the skill's preparation section for specifics. +Individual skills may require additional context. Check the skill's preparation section for specifics. **CRITICAL**: You cannot infer this context by reading the codebase. Code tells you what was built, not who it's for or what it should feel like. Only the creator can provide this context. @@ -36,7 +36,7 @@ Commit to a BOLD aesthetic direction: - **Constraints**: Technical requirements (framework, performance, accessibility). - **Differentiation**: What makes this UNFORGETTABLE? What's the one thing someone will remember? -**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work—the key is intentionality, not intensity. +**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work. The key is intentionality, not intensity. Then implement working code that is: - Production-grade and functional @@ -53,9 +53,9 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis **DO**: Use a modular type scale with fluid sizing (clamp) **DO**: Vary font weights and sizes to create clear visual hierarchy -**DON'T**: Use overused fonts—Inter, Roboto, Arial, Open Sans, system defaults +**DON'T**: Use overused fonts like Inter, Roboto, Arial, Open Sans, or system defaults **DON'T**: Use monospace typography as lazy shorthand for "technical/developer" vibes -**DON'T**: Put large icons with rounded corners above every heading—they rarely add value and make sites look templated +**DON'T**: Put large icons with rounded corners above every heading. They rarely add value and make sites look templated ### Color & Theme → *Consult [color reference](reference/color-and-contrast.md) for OKLCH, palettes, and dark mode.* @@ -63,64 +63,64 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis Commit to a cohesive palette. Dominant colors with sharp accents outperform timid, evenly-distributed palettes. **DO**: Use modern CSS color functions (oklch, color-mix, light-dark) for perceptually uniform, maintainable palettes -**DO**: Tint your neutrals toward your brand hue—even a subtle hint creates subconscious cohesion -**DON'T**: Use gray text on colored backgrounds—it looks washed out; use a shade of the background color instead -**DON'T**: Use pure black (#000) or pure white (#fff)—always tint; pure black/white never appears in nature +**DO**: Tint your neutrals toward your brand hue. Even a subtle hint creates subconscious cohesion +**DON'T**: Use gray text on colored backgrounds; it looks washed out. Use a shade of the background color instead +**DON'T**: Use pure black (#000) or pure white (#fff). Always tint; pure black/white never appears in nature **DON'T**: Use the AI color palette: cyan-on-dark, purple-to-blue gradients, neon accents on dark backgrounds -**DON'T**: Use gradient text for "impact"—especially on metrics or headings; it's decorative rather than meaningful -**DON'T**: Default to dark mode with glowing accents—it looks "cool" without requiring actual design decisions +**DON'T**: Use gradient text for "impact," especially on metrics or headings. It's decorative rather than meaningful +**DON'T**: Default to dark mode with glowing accents. It looks "cool" without requiring actual design decisions ### Layout & Space → *Consult [spatial reference](reference/spatial-design.md) for grids, rhythm, and container queries.* -Create visual rhythm through varied spacing—not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. +Create visual rhythm through varied spacing, not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. -**DO**: Create visual rhythm through varied spacing—tight groupings, generous separations +**DO**: Create visual rhythm through varied spacing: tight groupings, generous separations **DO**: Use fluid spacing with clamp() that breathes on larger screens **DO**: Use asymmetry and unexpected compositions; break the grid intentionally for emphasis -**DON'T**: Wrap everything in cards—not everything needs a container -**DON'T**: Nest cards inside cards—visual noise, flatten the hierarchy -**DON'T**: Use identical card grids—same-sized cards with icon + heading + text, repeated endlessly -**DON'T**: Use the hero metric layout template—big number, small label, supporting stats, gradient accent -**DON'T**: Center everything—left-aligned text with asymmetric layouts feels more designed -**DON'T**: Use the same spacing everywhere—without rhythm, layouts feel monotonous +**DON'T**: Wrap everything in cards. Not everything needs a container +**DON'T**: Nest cards inside cards. Visual noise; flatten the hierarchy +**DON'T**: Use identical card grids (same-sized cards with icon + heading + text, repeated endlessly) +**DON'T**: Use the hero metric layout template (big number, small label, supporting stats, gradient accent) +**DON'T**: Center everything. Left-aligned text with asymmetric layouts feels more designed +**DON'T**: Use the same spacing everywhere. Without rhythm, layouts feel monotonous ### Visual Details **DO**: Use intentional, purposeful decorative elements that reinforce brand -**DON'T**: Use glassmorphism everywhere—blur effects, glass cards, glow borders used decoratively rather than purposefully -**DON'T**: Use rounded elements with thick colored border on one side—a lazy accent that almost never looks intentional -**DON'T**: Use sparklines as decoration—tiny charts that look sophisticated but convey nothing meaningful -**DON'T**: Use rounded rectangles with generic drop shadows—safe, forgettable, could be any AI output -**DON'T**: Use modals unless there's truly no better alternative—modals are lazy +**DON'T**: Use glassmorphism everywhere (blur effects, glass cards, glow borders used decoratively rather than purposefully) +**DON'T**: Use rounded elements with thick colored border on one side. A lazy accent that almost never looks intentional +**DON'T**: Use sparklines as decoration. Tiny charts that look sophisticated but convey nothing meaningful +**DON'T**: Use rounded rectangles with generic drop shadows. Safe, forgettable, could be any AI output +**DON'T**: Use modals unless there's truly no better alternative. Modals are lazy ### Motion → *Consult [motion reference](reference/motion-design.md) for timing, easing, and reduced motion.* Focus on high-impact moments: one well-orchestrated page load with staggered reveals creates more delight than scattered micro-interactions. -**DO**: Use motion to convey state changes—entrances, exits, feedback +**DO**: Use motion to convey state changes: entrances, exits, feedback **DO**: Use exponential easing (ease-out-quart/quint/expo) for natural deceleration **DO**: For height animations, use grid-template-rows transitions instead of animating height directly -**DON'T**: Animate layout properties (width, height, padding, margin)—use transform and opacity only -**DON'T**: Use bounce or elastic easing—they feel dated and tacky; real objects decelerate smoothly +**DON'T**: Animate layout properties (width, height, padding, margin). Use transform and opacity only +**DON'T**: Use bounce or elastic easing. They feel dated and tacky; real objects decelerate smoothly ### Interaction → *Consult [interaction reference](reference/interaction-design.md) for forms, focus, and loading patterns.* -Make interactions feel fast. Use optimistic UI—update immediately, sync later. +Make interactions feel fast. Use optimistic UI: update immediately, sync later. -**DO**: Use progressive disclosure—start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) +**DO**: Use progressive disclosure. Start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) **DO**: Design empty states that teach the interface, not just say "nothing here" **DO**: Make every interactive surface feel intentional and responsive -**DON'T**: Repeat the same information—redundant headers, intros that restate the heading -**DON'T**: Make every button primary—use ghost buttons, text links, secondary styles; hierarchy matters +**DON'T**: Repeat the same information (redundant headers, intros that restate the heading) +**DON'T**: Make every button primary. Use ghost buttons, text links, secondary styles; hierarchy matters ### Responsive → *Consult [responsive reference](reference/responsive-design.md) for mobile-first, fluid design, and container queries.* **DO**: Use container queries (@container) for component-level responsiveness -**DO**: Adapt the interface for different contexts—don't just shrink it -**DON'T**: Hide critical functionality on mobile—adapt the interface, don't amputate it +**DO**: Adapt the interface for different contexts, not just shrink it +**DON'T**: Hide critical functionality on mobile. Adapt the interface, don't amputate it ### UX Writing → *Consult [ux-writing reference](reference/ux-writing.md) for labels, errors, and empty states.* @@ -136,7 +136,7 @@ Make interactions feel fast. Use optimistic UI—update immediately, sync later. A distinctive interface should make someone ask "how was this made?" not "which AI made this?" -Review the DON'T guidelines above—they are the fingerprints of AI-generated work from 2024-2025. +Review the DON'T guidelines above. They are the fingerprints of AI-generated work from 2024-2025. --- @@ -146,7 +146,7 @@ Match implementation complexity to the aesthetic vision. Maximalist designs need Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices across generations. -Remember: Claude is capable of extraordinary creative work. Don't hold back—show what can truly be created when thinking outside the box and committing fully to a distinctive vision. +Remember: Claude is capable of extraordinary creative work. Don't hold back. Show what can truly be created when thinking outside the box and committing fully to a distinctive vision. --- diff --git a/.codex/skills/impeccable/SKILL.md b/.codex/skills/impeccable/SKILL.md index 511181276..fb4b00c4e 100644 --- a/.codex/skills/impeccable/SKILL.md +++ b/.codex/skills/impeccable/SKILL.md @@ -11,12 +11,12 @@ This skill guides creation of distinctive, production-grade frontend interfaces Design skills produce generic output without project context. You MUST have confirmed design context before doing any design work. -**Required context** — every design skill needs at minimum: +**Required context** (every design skill needs at minimum): - **Target audience**: Who uses this product and in what context? - **Use cases**: What jobs are they trying to get done? - **Brand personality/tone**: How should the interface feel? -Individual skills may require additional context — check the skill's preparation section for specifics. +Individual skills may require additional context. Check the skill's preparation section for specifics. **CRITICAL**: You cannot infer this context by reading the codebase. Code tells you what was built, not who it's for or what it should feel like. Only the creator can provide this context. @@ -35,7 +35,7 @@ Commit to a BOLD aesthetic direction: - **Constraints**: Technical requirements (framework, performance, accessibility). - **Differentiation**: What makes this UNFORGETTABLE? What's the one thing someone will remember? -**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work—the key is intentionality, not intensity. +**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work. The key is intentionality, not intensity. Then implement working code that is: - Production-grade and functional @@ -52,9 +52,9 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis **DO**: Use a modular type scale with fluid sizing (clamp) **DO**: Vary font weights and sizes to create clear visual hierarchy -**DON'T**: Use overused fonts—Inter, Roboto, Arial, Open Sans, system defaults +**DON'T**: Use overused fonts like Inter, Roboto, Arial, Open Sans, or system defaults **DON'T**: Use monospace typography as lazy shorthand for "technical/developer" vibes -**DON'T**: Put large icons with rounded corners above every heading—they rarely add value and make sites look templated +**DON'T**: Put large icons with rounded corners above every heading. They rarely add value and make sites look templated ### Color & Theme → *Consult [color reference](reference/color-and-contrast.md) for OKLCH, palettes, and dark mode.* @@ -62,64 +62,64 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis Commit to a cohesive palette. Dominant colors with sharp accents outperform timid, evenly-distributed palettes. **DO**: Use modern CSS color functions (oklch, color-mix, light-dark) for perceptually uniform, maintainable palettes -**DO**: Tint your neutrals toward your brand hue—even a subtle hint creates subconscious cohesion -**DON'T**: Use gray text on colored backgrounds—it looks washed out; use a shade of the background color instead -**DON'T**: Use pure black (#000) or pure white (#fff)—always tint; pure black/white never appears in nature +**DO**: Tint your neutrals toward your brand hue. Even a subtle hint creates subconscious cohesion +**DON'T**: Use gray text on colored backgrounds; it looks washed out. Use a shade of the background color instead +**DON'T**: Use pure black (#000) or pure white (#fff). Always tint; pure black/white never appears in nature **DON'T**: Use the AI color palette: cyan-on-dark, purple-to-blue gradients, neon accents on dark backgrounds -**DON'T**: Use gradient text for "impact"—especially on metrics or headings; it's decorative rather than meaningful -**DON'T**: Default to dark mode with glowing accents—it looks "cool" without requiring actual design decisions +**DON'T**: Use gradient text for "impact," especially on metrics or headings. It's decorative rather than meaningful +**DON'T**: Default to dark mode with glowing accents. It looks "cool" without requiring actual design decisions ### Layout & Space → *Consult [spatial reference](reference/spatial-design.md) for grids, rhythm, and container queries.* -Create visual rhythm through varied spacing—not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. +Create visual rhythm through varied spacing, not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. -**DO**: Create visual rhythm through varied spacing—tight groupings, generous separations +**DO**: Create visual rhythm through varied spacing: tight groupings, generous separations **DO**: Use fluid spacing with clamp() that breathes on larger screens **DO**: Use asymmetry and unexpected compositions; break the grid intentionally for emphasis -**DON'T**: Wrap everything in cards—not everything needs a container -**DON'T**: Nest cards inside cards—visual noise, flatten the hierarchy -**DON'T**: Use identical card grids—same-sized cards with icon + heading + text, repeated endlessly -**DON'T**: Use the hero metric layout template—big number, small label, supporting stats, gradient accent -**DON'T**: Center everything—left-aligned text with asymmetric layouts feels more designed -**DON'T**: Use the same spacing everywhere—without rhythm, layouts feel monotonous +**DON'T**: Wrap everything in cards. Not everything needs a container +**DON'T**: Nest cards inside cards. Visual noise; flatten the hierarchy +**DON'T**: Use identical card grids (same-sized cards with icon + heading + text, repeated endlessly) +**DON'T**: Use the hero metric layout template (big number, small label, supporting stats, gradient accent) +**DON'T**: Center everything. Left-aligned text with asymmetric layouts feels more designed +**DON'T**: Use the same spacing everywhere. Without rhythm, layouts feel monotonous ### Visual Details **DO**: Use intentional, purposeful decorative elements that reinforce brand -**DON'T**: Use glassmorphism everywhere—blur effects, glass cards, glow borders used decoratively rather than purposefully -**DON'T**: Use rounded elements with thick colored border on one side—a lazy accent that almost never looks intentional -**DON'T**: Use sparklines as decoration—tiny charts that look sophisticated but convey nothing meaningful -**DON'T**: Use rounded rectangles with generic drop shadows—safe, forgettable, could be any AI output -**DON'T**: Use modals unless there's truly no better alternative—modals are lazy +**DON'T**: Use glassmorphism everywhere (blur effects, glass cards, glow borders used decoratively rather than purposefully) +**DON'T**: Use rounded elements with thick colored border on one side. A lazy accent that almost never looks intentional +**DON'T**: Use sparklines as decoration. Tiny charts that look sophisticated but convey nothing meaningful +**DON'T**: Use rounded rectangles with generic drop shadows. Safe, forgettable, could be any AI output +**DON'T**: Use modals unless there's truly no better alternative. Modals are lazy ### Motion → *Consult [motion reference](reference/motion-design.md) for timing, easing, and reduced motion.* Focus on high-impact moments: one well-orchestrated page load with staggered reveals creates more delight than scattered micro-interactions. -**DO**: Use motion to convey state changes—entrances, exits, feedback +**DO**: Use motion to convey state changes: entrances, exits, feedback **DO**: Use exponential easing (ease-out-quart/quint/expo) for natural deceleration **DO**: For height animations, use grid-template-rows transitions instead of animating height directly -**DON'T**: Animate layout properties (width, height, padding, margin)—use transform and opacity only -**DON'T**: Use bounce or elastic easing—they feel dated and tacky; real objects decelerate smoothly +**DON'T**: Animate layout properties (width, height, padding, margin). Use transform and opacity only +**DON'T**: Use bounce or elastic easing. They feel dated and tacky; real objects decelerate smoothly ### Interaction → *Consult [interaction reference](reference/interaction-design.md) for forms, focus, and loading patterns.* -Make interactions feel fast. Use optimistic UI—update immediately, sync later. +Make interactions feel fast. Use optimistic UI: update immediately, sync later. -**DO**: Use progressive disclosure—start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) +**DO**: Use progressive disclosure. Start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) **DO**: Design empty states that teach the interface, not just say "nothing here" **DO**: Make every interactive surface feel intentional and responsive -**DON'T**: Repeat the same information—redundant headers, intros that restate the heading -**DON'T**: Make every button primary—use ghost buttons, text links, secondary styles; hierarchy matters +**DON'T**: Repeat the same information (redundant headers, intros that restate the heading) +**DON'T**: Make every button primary. Use ghost buttons, text links, secondary styles; hierarchy matters ### Responsive → *Consult [responsive reference](reference/responsive-design.md) for mobile-first, fluid design, and container queries.* **DO**: Use container queries (@container) for component-level responsiveness -**DO**: Adapt the interface for different contexts—don't just shrink it -**DON'T**: Hide critical functionality on mobile—adapt the interface, don't amputate it +**DO**: Adapt the interface for different contexts, not just shrink it +**DON'T**: Hide critical functionality on mobile. Adapt the interface, don't amputate it ### UX Writing → *Consult [ux-writing reference](reference/ux-writing.md) for labels, errors, and empty states.* @@ -135,7 +135,7 @@ Make interactions feel fast. Use optimistic UI—update immediately, sync later. A distinctive interface should make someone ask "how was this made?" not "which AI made this?" -Review the DON'T guidelines above—they are the fingerprints of AI-generated work from 2024-2025. +Review the DON'T guidelines above. They are the fingerprints of AI-generated work from 2024-2025. --- @@ -145,7 +145,7 @@ Match implementation complexity to the aesthetic vision. Maximalist designs need Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices across generations. -Remember: GPT is capable of extraordinary creative work. Don't hold back—show what can truly be created when thinking outside the box and committing fully to a distinctive vision. +Remember: GPT is capable of extraordinary creative work. Don't hold back. Show what can truly be created when thinking outside the box and committing fully to a distinctive vision. --- diff --git a/.cursor/skills/impeccable/SKILL.md b/.cursor/skills/impeccable/SKILL.md index b78fe17fc..5330034a7 100644 --- a/.cursor/skills/impeccable/SKILL.md +++ b/.cursor/skills/impeccable/SKILL.md @@ -10,12 +10,12 @@ This skill guides creation of distinctive, production-grade frontend interfaces Design skills produce generic output without project context. You MUST have confirmed design context before doing any design work. -**Required context** — every design skill needs at minimum: +**Required context** (every design skill needs at minimum): - **Target audience**: Who uses this product and in what context? - **Use cases**: What jobs are they trying to get done? - **Brand personality/tone**: How should the interface feel? -Individual skills may require additional context — check the skill's preparation section for specifics. +Individual skills may require additional context. Check the skill's preparation section for specifics. **CRITICAL**: You cannot infer this context by reading the codebase. Code tells you what was built, not who it's for or what it should feel like. Only the creator can provide this context. @@ -34,7 +34,7 @@ Commit to a BOLD aesthetic direction: - **Constraints**: Technical requirements (framework, performance, accessibility). - **Differentiation**: What makes this UNFORGETTABLE? What's the one thing someone will remember? -**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work—the key is intentionality, not intensity. +**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work. The key is intentionality, not intensity. Then implement working code that is: - Production-grade and functional @@ -51,9 +51,9 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis **DO**: Use a modular type scale with fluid sizing (clamp) **DO**: Vary font weights and sizes to create clear visual hierarchy -**DON'T**: Use overused fonts—Inter, Roboto, Arial, Open Sans, system defaults +**DON'T**: Use overused fonts like Inter, Roboto, Arial, Open Sans, or system defaults **DON'T**: Use monospace typography as lazy shorthand for "technical/developer" vibes -**DON'T**: Put large icons with rounded corners above every heading—they rarely add value and make sites look templated +**DON'T**: Put large icons with rounded corners above every heading. They rarely add value and make sites look templated ### Color & Theme → *Consult [color reference](reference/color-and-contrast.md) for OKLCH, palettes, and dark mode.* @@ -61,64 +61,64 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis Commit to a cohesive palette. Dominant colors with sharp accents outperform timid, evenly-distributed palettes. **DO**: Use modern CSS color functions (oklch, color-mix, light-dark) for perceptually uniform, maintainable palettes -**DO**: Tint your neutrals toward your brand hue—even a subtle hint creates subconscious cohesion -**DON'T**: Use gray text on colored backgrounds—it looks washed out; use a shade of the background color instead -**DON'T**: Use pure black (#000) or pure white (#fff)—always tint; pure black/white never appears in nature +**DO**: Tint your neutrals toward your brand hue. Even a subtle hint creates subconscious cohesion +**DON'T**: Use gray text on colored backgrounds; it looks washed out. Use a shade of the background color instead +**DON'T**: Use pure black (#000) or pure white (#fff). Always tint; pure black/white never appears in nature **DON'T**: Use the AI color palette: cyan-on-dark, purple-to-blue gradients, neon accents on dark backgrounds -**DON'T**: Use gradient text for "impact"—especially on metrics or headings; it's decorative rather than meaningful -**DON'T**: Default to dark mode with glowing accents—it looks "cool" without requiring actual design decisions +**DON'T**: Use gradient text for "impact," especially on metrics or headings. It's decorative rather than meaningful +**DON'T**: Default to dark mode with glowing accents. It looks "cool" without requiring actual design decisions ### Layout & Space → *Consult [spatial reference](reference/spatial-design.md) for grids, rhythm, and container queries.* -Create visual rhythm through varied spacing—not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. +Create visual rhythm through varied spacing, not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. -**DO**: Create visual rhythm through varied spacing—tight groupings, generous separations +**DO**: Create visual rhythm through varied spacing: tight groupings, generous separations **DO**: Use fluid spacing with clamp() that breathes on larger screens **DO**: Use asymmetry and unexpected compositions; break the grid intentionally for emphasis -**DON'T**: Wrap everything in cards—not everything needs a container -**DON'T**: Nest cards inside cards—visual noise, flatten the hierarchy -**DON'T**: Use identical card grids—same-sized cards with icon + heading + text, repeated endlessly -**DON'T**: Use the hero metric layout template—big number, small label, supporting stats, gradient accent -**DON'T**: Center everything—left-aligned text with asymmetric layouts feels more designed -**DON'T**: Use the same spacing everywhere—without rhythm, layouts feel monotonous +**DON'T**: Wrap everything in cards. Not everything needs a container +**DON'T**: Nest cards inside cards. Visual noise; flatten the hierarchy +**DON'T**: Use identical card grids (same-sized cards with icon + heading + text, repeated endlessly) +**DON'T**: Use the hero metric layout template (big number, small label, supporting stats, gradient accent) +**DON'T**: Center everything. Left-aligned text with asymmetric layouts feels more designed +**DON'T**: Use the same spacing everywhere. Without rhythm, layouts feel monotonous ### Visual Details **DO**: Use intentional, purposeful decorative elements that reinforce brand -**DON'T**: Use glassmorphism everywhere—blur effects, glass cards, glow borders used decoratively rather than purposefully -**DON'T**: Use rounded elements with thick colored border on one side—a lazy accent that almost never looks intentional -**DON'T**: Use sparklines as decoration—tiny charts that look sophisticated but convey nothing meaningful -**DON'T**: Use rounded rectangles with generic drop shadows—safe, forgettable, could be any AI output -**DON'T**: Use modals unless there's truly no better alternative—modals are lazy +**DON'T**: Use glassmorphism everywhere (blur effects, glass cards, glow borders used decoratively rather than purposefully) +**DON'T**: Use rounded elements with thick colored border on one side. A lazy accent that almost never looks intentional +**DON'T**: Use sparklines as decoration. Tiny charts that look sophisticated but convey nothing meaningful +**DON'T**: Use rounded rectangles with generic drop shadows. Safe, forgettable, could be any AI output +**DON'T**: Use modals unless there's truly no better alternative. Modals are lazy ### Motion → *Consult [motion reference](reference/motion-design.md) for timing, easing, and reduced motion.* Focus on high-impact moments: one well-orchestrated page load with staggered reveals creates more delight than scattered micro-interactions. -**DO**: Use motion to convey state changes—entrances, exits, feedback +**DO**: Use motion to convey state changes: entrances, exits, feedback **DO**: Use exponential easing (ease-out-quart/quint/expo) for natural deceleration **DO**: For height animations, use grid-template-rows transitions instead of animating height directly -**DON'T**: Animate layout properties (width, height, padding, margin)—use transform and opacity only -**DON'T**: Use bounce or elastic easing—they feel dated and tacky; real objects decelerate smoothly +**DON'T**: Animate layout properties (width, height, padding, margin). Use transform and opacity only +**DON'T**: Use bounce or elastic easing. They feel dated and tacky; real objects decelerate smoothly ### Interaction → *Consult [interaction reference](reference/interaction-design.md) for forms, focus, and loading patterns.* -Make interactions feel fast. Use optimistic UI—update immediately, sync later. +Make interactions feel fast. Use optimistic UI: update immediately, sync later. -**DO**: Use progressive disclosure—start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) +**DO**: Use progressive disclosure. Start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) **DO**: Design empty states that teach the interface, not just say "nothing here" **DO**: Make every interactive surface feel intentional and responsive -**DON'T**: Repeat the same information—redundant headers, intros that restate the heading -**DON'T**: Make every button primary—use ghost buttons, text links, secondary styles; hierarchy matters +**DON'T**: Repeat the same information (redundant headers, intros that restate the heading) +**DON'T**: Make every button primary. Use ghost buttons, text links, secondary styles; hierarchy matters ### Responsive → *Consult [responsive reference](reference/responsive-design.md) for mobile-first, fluid design, and container queries.* **DO**: Use container queries (@container) for component-level responsiveness -**DO**: Adapt the interface for different contexts—don't just shrink it -**DON'T**: Hide critical functionality on mobile—adapt the interface, don't amputate it +**DO**: Adapt the interface for different contexts, not just shrink it +**DON'T**: Hide critical functionality on mobile. Adapt the interface, don't amputate it ### UX Writing → *Consult [ux-writing reference](reference/ux-writing.md) for labels, errors, and empty states.* @@ -134,7 +134,7 @@ Make interactions feel fast. Use optimistic UI—update immediately, sync later. A distinctive interface should make someone ask "how was this made?" not "which AI made this?" -Review the DON'T guidelines above—they are the fingerprints of AI-generated work from 2024-2025. +Review the DON'T guidelines above. They are the fingerprints of AI-generated work from 2024-2025. --- @@ -144,7 +144,7 @@ Match implementation complexity to the aesthetic vision. Maximalist designs need Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices across generations. -Remember: the model is capable of extraordinary creative work. Don't hold back—show what can truly be created when thinking outside the box and committing fully to a distinctive vision. +Remember: the model is capable of extraordinary creative work. Don't hold back. Show what can truly be created when thinking outside the box and committing fully to a distinctive vision. --- diff --git a/.gemini/skills/impeccable/SKILL.md b/.gemini/skills/impeccable/SKILL.md index 357830bac..5932578e2 100644 --- a/.gemini/skills/impeccable/SKILL.md +++ b/.gemini/skills/impeccable/SKILL.md @@ -9,12 +9,12 @@ This skill guides creation of distinctive, production-grade frontend interfaces Design skills produce generic output without project context. You MUST have confirmed design context before doing any design work. -**Required context** — every design skill needs at minimum: +**Required context** (every design skill needs at minimum): - **Target audience**: Who uses this product and in what context? - **Use cases**: What jobs are they trying to get done? - **Brand personality/tone**: How should the interface feel? -Individual skills may require additional context — check the skill's preparation section for specifics. +Individual skills may require additional context. Check the skill's preparation section for specifics. **CRITICAL**: You cannot infer this context by reading the codebase. Code tells you what was built, not who it's for or what it should feel like. Only the creator can provide this context. @@ -33,7 +33,7 @@ Commit to a BOLD aesthetic direction: - **Constraints**: Technical requirements (framework, performance, accessibility). - **Differentiation**: What makes this UNFORGETTABLE? What's the one thing someone will remember? -**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work—the key is intentionality, not intensity. +**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work. The key is intentionality, not intensity. Then implement working code that is: - Production-grade and functional @@ -50,9 +50,9 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis **DO**: Use a modular type scale with fluid sizing (clamp) **DO**: Vary font weights and sizes to create clear visual hierarchy -**DON'T**: Use overused fonts—Inter, Roboto, Arial, Open Sans, system defaults +**DON'T**: Use overused fonts like Inter, Roboto, Arial, Open Sans, or system defaults **DON'T**: Use monospace typography as lazy shorthand for "technical/developer" vibes -**DON'T**: Put large icons with rounded corners above every heading—they rarely add value and make sites look templated +**DON'T**: Put large icons with rounded corners above every heading. They rarely add value and make sites look templated ### Color & Theme → *Consult [color reference](reference/color-and-contrast.md) for OKLCH, palettes, and dark mode.* @@ -60,64 +60,64 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis Commit to a cohesive palette. Dominant colors with sharp accents outperform timid, evenly-distributed palettes. **DO**: Use modern CSS color functions (oklch, color-mix, light-dark) for perceptually uniform, maintainable palettes -**DO**: Tint your neutrals toward your brand hue—even a subtle hint creates subconscious cohesion -**DON'T**: Use gray text on colored backgrounds—it looks washed out; use a shade of the background color instead -**DON'T**: Use pure black (#000) or pure white (#fff)—always tint; pure black/white never appears in nature +**DO**: Tint your neutrals toward your brand hue. Even a subtle hint creates subconscious cohesion +**DON'T**: Use gray text on colored backgrounds; it looks washed out. Use a shade of the background color instead +**DON'T**: Use pure black (#000) or pure white (#fff). Always tint; pure black/white never appears in nature **DON'T**: Use the AI color palette: cyan-on-dark, purple-to-blue gradients, neon accents on dark backgrounds -**DON'T**: Use gradient text for "impact"—especially on metrics or headings; it's decorative rather than meaningful -**DON'T**: Default to dark mode with glowing accents—it looks "cool" without requiring actual design decisions +**DON'T**: Use gradient text for "impact," especially on metrics or headings. It's decorative rather than meaningful +**DON'T**: Default to dark mode with glowing accents. It looks "cool" without requiring actual design decisions ### Layout & Space → *Consult [spatial reference](reference/spatial-design.md) for grids, rhythm, and container queries.* -Create visual rhythm through varied spacing—not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. +Create visual rhythm through varied spacing, not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. -**DO**: Create visual rhythm through varied spacing—tight groupings, generous separations +**DO**: Create visual rhythm through varied spacing: tight groupings, generous separations **DO**: Use fluid spacing with clamp() that breathes on larger screens **DO**: Use asymmetry and unexpected compositions; break the grid intentionally for emphasis -**DON'T**: Wrap everything in cards—not everything needs a container -**DON'T**: Nest cards inside cards—visual noise, flatten the hierarchy -**DON'T**: Use identical card grids—same-sized cards with icon + heading + text, repeated endlessly -**DON'T**: Use the hero metric layout template—big number, small label, supporting stats, gradient accent -**DON'T**: Center everything—left-aligned text with asymmetric layouts feels more designed -**DON'T**: Use the same spacing everywhere—without rhythm, layouts feel monotonous +**DON'T**: Wrap everything in cards. Not everything needs a container +**DON'T**: Nest cards inside cards. Visual noise; flatten the hierarchy +**DON'T**: Use identical card grids (same-sized cards with icon + heading + text, repeated endlessly) +**DON'T**: Use the hero metric layout template (big number, small label, supporting stats, gradient accent) +**DON'T**: Center everything. Left-aligned text with asymmetric layouts feels more designed +**DON'T**: Use the same spacing everywhere. Without rhythm, layouts feel monotonous ### Visual Details **DO**: Use intentional, purposeful decorative elements that reinforce brand -**DON'T**: Use glassmorphism everywhere—blur effects, glass cards, glow borders used decoratively rather than purposefully -**DON'T**: Use rounded elements with thick colored border on one side—a lazy accent that almost never looks intentional -**DON'T**: Use sparklines as decoration—tiny charts that look sophisticated but convey nothing meaningful -**DON'T**: Use rounded rectangles with generic drop shadows—safe, forgettable, could be any AI output -**DON'T**: Use modals unless there's truly no better alternative—modals are lazy +**DON'T**: Use glassmorphism everywhere (blur effects, glass cards, glow borders used decoratively rather than purposefully) +**DON'T**: Use rounded elements with thick colored border on one side. A lazy accent that almost never looks intentional +**DON'T**: Use sparklines as decoration. Tiny charts that look sophisticated but convey nothing meaningful +**DON'T**: Use rounded rectangles with generic drop shadows. Safe, forgettable, could be any AI output +**DON'T**: Use modals unless there's truly no better alternative. Modals are lazy ### Motion → *Consult [motion reference](reference/motion-design.md) for timing, easing, and reduced motion.* Focus on high-impact moments: one well-orchestrated page load with staggered reveals creates more delight than scattered micro-interactions. -**DO**: Use motion to convey state changes—entrances, exits, feedback +**DO**: Use motion to convey state changes: entrances, exits, feedback **DO**: Use exponential easing (ease-out-quart/quint/expo) for natural deceleration **DO**: For height animations, use grid-template-rows transitions instead of animating height directly -**DON'T**: Animate layout properties (width, height, padding, margin)—use transform and opacity only -**DON'T**: Use bounce or elastic easing—they feel dated and tacky; real objects decelerate smoothly +**DON'T**: Animate layout properties (width, height, padding, margin). Use transform and opacity only +**DON'T**: Use bounce or elastic easing. They feel dated and tacky; real objects decelerate smoothly ### Interaction → *Consult [interaction reference](reference/interaction-design.md) for forms, focus, and loading patterns.* -Make interactions feel fast. Use optimistic UI—update immediately, sync later. +Make interactions feel fast. Use optimistic UI: update immediately, sync later. -**DO**: Use progressive disclosure—start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) +**DO**: Use progressive disclosure. Start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) **DO**: Design empty states that teach the interface, not just say "nothing here" **DO**: Make every interactive surface feel intentional and responsive -**DON'T**: Repeat the same information—redundant headers, intros that restate the heading -**DON'T**: Make every button primary—use ghost buttons, text links, secondary styles; hierarchy matters +**DON'T**: Repeat the same information (redundant headers, intros that restate the heading) +**DON'T**: Make every button primary. Use ghost buttons, text links, secondary styles; hierarchy matters ### Responsive → *Consult [responsive reference](reference/responsive-design.md) for mobile-first, fluid design, and container queries.* **DO**: Use container queries (@container) for component-level responsiveness -**DO**: Adapt the interface for different contexts—don't just shrink it -**DON'T**: Hide critical functionality on mobile—adapt the interface, don't amputate it +**DO**: Adapt the interface for different contexts, not just shrink it +**DON'T**: Hide critical functionality on mobile. Adapt the interface, don't amputate it ### UX Writing → *Consult [ux-writing reference](reference/ux-writing.md) for labels, errors, and empty states.* @@ -133,7 +133,7 @@ Make interactions feel fast. Use optimistic UI—update immediately, sync later. A distinctive interface should make someone ask "how was this made?" not "which AI made this?" -Review the DON'T guidelines above—they are the fingerprints of AI-generated work from 2024-2025. +Review the DON'T guidelines above. They are the fingerprints of AI-generated work from 2024-2025. --- @@ -143,7 +143,7 @@ Match implementation complexity to the aesthetic vision. Maximalist designs need Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices across generations. -Remember: Gemini is capable of extraordinary creative work. Don't hold back—show what can truly be created when thinking outside the box and committing fully to a distinctive vision. +Remember: Gemini is capable of extraordinary creative work. Don't hold back. Show what can truly be created when thinking outside the box and committing fully to a distinctive vision. --- diff --git a/.kiro/skills/impeccable/SKILL.md b/.kiro/skills/impeccable/SKILL.md index f1a551fbb..43c688767 100644 --- a/.kiro/skills/impeccable/SKILL.md +++ b/.kiro/skills/impeccable/SKILL.md @@ -10,12 +10,12 @@ This skill guides creation of distinctive, production-grade frontend interfaces Design skills produce generic output without project context. You MUST have confirmed design context before doing any design work. -**Required context** — every design skill needs at minimum: +**Required context** (every design skill needs at minimum): - **Target audience**: Who uses this product and in what context? - **Use cases**: What jobs are they trying to get done? - **Brand personality/tone**: How should the interface feel? -Individual skills may require additional context — check the skill's preparation section for specifics. +Individual skills may require additional context. Check the skill's preparation section for specifics. **CRITICAL**: You cannot infer this context by reading the codebase. Code tells you what was built, not who it's for or what it should feel like. Only the creator can provide this context. @@ -34,7 +34,7 @@ Commit to a BOLD aesthetic direction: - **Constraints**: Technical requirements (framework, performance, accessibility). - **Differentiation**: What makes this UNFORGETTABLE? What's the one thing someone will remember? -**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work—the key is intentionality, not intensity. +**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work. The key is intentionality, not intensity. Then implement working code that is: - Production-grade and functional @@ -51,9 +51,9 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis **DO**: Use a modular type scale with fluid sizing (clamp) **DO**: Vary font weights and sizes to create clear visual hierarchy -**DON'T**: Use overused fonts—Inter, Roboto, Arial, Open Sans, system defaults +**DON'T**: Use overused fonts like Inter, Roboto, Arial, Open Sans, or system defaults **DON'T**: Use monospace typography as lazy shorthand for "technical/developer" vibes -**DON'T**: Put large icons with rounded corners above every heading—they rarely add value and make sites look templated +**DON'T**: Put large icons with rounded corners above every heading. They rarely add value and make sites look templated ### Color & Theme → *Consult [color reference](reference/color-and-contrast.md) for OKLCH, palettes, and dark mode.* @@ -61,64 +61,64 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis Commit to a cohesive palette. Dominant colors with sharp accents outperform timid, evenly-distributed palettes. **DO**: Use modern CSS color functions (oklch, color-mix, light-dark) for perceptually uniform, maintainable palettes -**DO**: Tint your neutrals toward your brand hue—even a subtle hint creates subconscious cohesion -**DON'T**: Use gray text on colored backgrounds—it looks washed out; use a shade of the background color instead -**DON'T**: Use pure black (#000) or pure white (#fff)—always tint; pure black/white never appears in nature +**DO**: Tint your neutrals toward your brand hue. Even a subtle hint creates subconscious cohesion +**DON'T**: Use gray text on colored backgrounds; it looks washed out. Use a shade of the background color instead +**DON'T**: Use pure black (#000) or pure white (#fff). Always tint; pure black/white never appears in nature **DON'T**: Use the AI color palette: cyan-on-dark, purple-to-blue gradients, neon accents on dark backgrounds -**DON'T**: Use gradient text for "impact"—especially on metrics or headings; it's decorative rather than meaningful -**DON'T**: Default to dark mode with glowing accents—it looks "cool" without requiring actual design decisions +**DON'T**: Use gradient text for "impact," especially on metrics or headings. It's decorative rather than meaningful +**DON'T**: Default to dark mode with glowing accents. It looks "cool" without requiring actual design decisions ### Layout & Space → *Consult [spatial reference](reference/spatial-design.md) for grids, rhythm, and container queries.* -Create visual rhythm through varied spacing—not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. +Create visual rhythm through varied spacing, not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. -**DO**: Create visual rhythm through varied spacing—tight groupings, generous separations +**DO**: Create visual rhythm through varied spacing: tight groupings, generous separations **DO**: Use fluid spacing with clamp() that breathes on larger screens **DO**: Use asymmetry and unexpected compositions; break the grid intentionally for emphasis -**DON'T**: Wrap everything in cards—not everything needs a container -**DON'T**: Nest cards inside cards—visual noise, flatten the hierarchy -**DON'T**: Use identical card grids—same-sized cards with icon + heading + text, repeated endlessly -**DON'T**: Use the hero metric layout template—big number, small label, supporting stats, gradient accent -**DON'T**: Center everything—left-aligned text with asymmetric layouts feels more designed -**DON'T**: Use the same spacing everywhere—without rhythm, layouts feel monotonous +**DON'T**: Wrap everything in cards. Not everything needs a container +**DON'T**: Nest cards inside cards. Visual noise; flatten the hierarchy +**DON'T**: Use identical card grids (same-sized cards with icon + heading + text, repeated endlessly) +**DON'T**: Use the hero metric layout template (big number, small label, supporting stats, gradient accent) +**DON'T**: Center everything. Left-aligned text with asymmetric layouts feels more designed +**DON'T**: Use the same spacing everywhere. Without rhythm, layouts feel monotonous ### Visual Details **DO**: Use intentional, purposeful decorative elements that reinforce brand -**DON'T**: Use glassmorphism everywhere—blur effects, glass cards, glow borders used decoratively rather than purposefully -**DON'T**: Use rounded elements with thick colored border on one side—a lazy accent that almost never looks intentional -**DON'T**: Use sparklines as decoration—tiny charts that look sophisticated but convey nothing meaningful -**DON'T**: Use rounded rectangles with generic drop shadows—safe, forgettable, could be any AI output -**DON'T**: Use modals unless there's truly no better alternative—modals are lazy +**DON'T**: Use glassmorphism everywhere (blur effects, glass cards, glow borders used decoratively rather than purposefully) +**DON'T**: Use rounded elements with thick colored border on one side. A lazy accent that almost never looks intentional +**DON'T**: Use sparklines as decoration. Tiny charts that look sophisticated but convey nothing meaningful +**DON'T**: Use rounded rectangles with generic drop shadows. Safe, forgettable, could be any AI output +**DON'T**: Use modals unless there's truly no better alternative. Modals are lazy ### Motion → *Consult [motion reference](reference/motion-design.md) for timing, easing, and reduced motion.* Focus on high-impact moments: one well-orchestrated page load with staggered reveals creates more delight than scattered micro-interactions. -**DO**: Use motion to convey state changes—entrances, exits, feedback +**DO**: Use motion to convey state changes: entrances, exits, feedback **DO**: Use exponential easing (ease-out-quart/quint/expo) for natural deceleration **DO**: For height animations, use grid-template-rows transitions instead of animating height directly -**DON'T**: Animate layout properties (width, height, padding, margin)—use transform and opacity only -**DON'T**: Use bounce or elastic easing—they feel dated and tacky; real objects decelerate smoothly +**DON'T**: Animate layout properties (width, height, padding, margin). Use transform and opacity only +**DON'T**: Use bounce or elastic easing. They feel dated and tacky; real objects decelerate smoothly ### Interaction → *Consult [interaction reference](reference/interaction-design.md) for forms, focus, and loading patterns.* -Make interactions feel fast. Use optimistic UI—update immediately, sync later. +Make interactions feel fast. Use optimistic UI: update immediately, sync later. -**DO**: Use progressive disclosure—start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) +**DO**: Use progressive disclosure. Start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) **DO**: Design empty states that teach the interface, not just say "nothing here" **DO**: Make every interactive surface feel intentional and responsive -**DON'T**: Repeat the same information—redundant headers, intros that restate the heading -**DON'T**: Make every button primary—use ghost buttons, text links, secondary styles; hierarchy matters +**DON'T**: Repeat the same information (redundant headers, intros that restate the heading) +**DON'T**: Make every button primary. Use ghost buttons, text links, secondary styles; hierarchy matters ### Responsive → *Consult [responsive reference](reference/responsive-design.md) for mobile-first, fluid design, and container queries.* **DO**: Use container queries (@container) for component-level responsiveness -**DO**: Adapt the interface for different contexts—don't just shrink it -**DON'T**: Hide critical functionality on mobile—adapt the interface, don't amputate it +**DO**: Adapt the interface for different contexts, not just shrink it +**DON'T**: Hide critical functionality on mobile. Adapt the interface, don't amputate it ### UX Writing → *Consult [ux-writing reference](reference/ux-writing.md) for labels, errors, and empty states.* @@ -134,7 +134,7 @@ Make interactions feel fast. Use optimistic UI—update immediately, sync later. A distinctive interface should make someone ask "how was this made?" not "which AI made this?" -Review the DON'T guidelines above—they are the fingerprints of AI-generated work from 2024-2025. +Review the DON'T guidelines above. They are the fingerprints of AI-generated work from 2024-2025. --- @@ -144,7 +144,7 @@ Match implementation complexity to the aesthetic vision. Maximalist designs need Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices across generations. -Remember: Claude is capable of extraordinary creative work. Don't hold back—show what can truly be created when thinking outside the box and committing fully to a distinctive vision. +Remember: Claude is capable of extraordinary creative work. Don't hold back. Show what can truly be created when thinking outside the box and committing fully to a distinctive vision. --- diff --git a/.opencode/skills/impeccable/SKILL.md b/.opencode/skills/impeccable/SKILL.md index 08bec3905..3deb5092f 100644 --- a/.opencode/skills/impeccable/SKILL.md +++ b/.opencode/skills/impeccable/SKILL.md @@ -12,12 +12,12 @@ This skill guides creation of distinctive, production-grade frontend interfaces Design skills produce generic output without project context. You MUST have confirmed design context before doing any design work. -**Required context** — every design skill needs at minimum: +**Required context** (every design skill needs at minimum): - **Target audience**: Who uses this product and in what context? - **Use cases**: What jobs are they trying to get done? - **Brand personality/tone**: How should the interface feel? -Individual skills may require additional context — check the skill's preparation section for specifics. +Individual skills may require additional context. Check the skill's preparation section for specifics. **CRITICAL**: You cannot infer this context by reading the codebase. Code tells you what was built, not who it's for or what it should feel like. Only the creator can provide this context. @@ -36,7 +36,7 @@ Commit to a BOLD aesthetic direction: - **Constraints**: Technical requirements (framework, performance, accessibility). - **Differentiation**: What makes this UNFORGETTABLE? What's the one thing someone will remember? -**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work—the key is intentionality, not intensity. +**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work. The key is intentionality, not intensity. Then implement working code that is: - Production-grade and functional @@ -53,9 +53,9 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis **DO**: Use a modular type scale with fluid sizing (clamp) **DO**: Vary font weights and sizes to create clear visual hierarchy -**DON'T**: Use overused fonts—Inter, Roboto, Arial, Open Sans, system defaults +**DON'T**: Use overused fonts like Inter, Roboto, Arial, Open Sans, or system defaults **DON'T**: Use monospace typography as lazy shorthand for "technical/developer" vibes -**DON'T**: Put large icons with rounded corners above every heading—they rarely add value and make sites look templated +**DON'T**: Put large icons with rounded corners above every heading. They rarely add value and make sites look templated ### Color & Theme → *Consult [color reference](reference/color-and-contrast.md) for OKLCH, palettes, and dark mode.* @@ -63,64 +63,64 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis Commit to a cohesive palette. Dominant colors with sharp accents outperform timid, evenly-distributed palettes. **DO**: Use modern CSS color functions (oklch, color-mix, light-dark) for perceptually uniform, maintainable palettes -**DO**: Tint your neutrals toward your brand hue—even a subtle hint creates subconscious cohesion -**DON'T**: Use gray text on colored backgrounds—it looks washed out; use a shade of the background color instead -**DON'T**: Use pure black (#000) or pure white (#fff)—always tint; pure black/white never appears in nature +**DO**: Tint your neutrals toward your brand hue. Even a subtle hint creates subconscious cohesion +**DON'T**: Use gray text on colored backgrounds; it looks washed out. Use a shade of the background color instead +**DON'T**: Use pure black (#000) or pure white (#fff). Always tint; pure black/white never appears in nature **DON'T**: Use the AI color palette: cyan-on-dark, purple-to-blue gradients, neon accents on dark backgrounds -**DON'T**: Use gradient text for "impact"—especially on metrics or headings; it's decorative rather than meaningful -**DON'T**: Default to dark mode with glowing accents—it looks "cool" without requiring actual design decisions +**DON'T**: Use gradient text for "impact," especially on metrics or headings. It's decorative rather than meaningful +**DON'T**: Default to dark mode with glowing accents. It looks "cool" without requiring actual design decisions ### Layout & Space → *Consult [spatial reference](reference/spatial-design.md) for grids, rhythm, and container queries.* -Create visual rhythm through varied spacing—not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. +Create visual rhythm through varied spacing, not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. -**DO**: Create visual rhythm through varied spacing—tight groupings, generous separations +**DO**: Create visual rhythm through varied spacing: tight groupings, generous separations **DO**: Use fluid spacing with clamp() that breathes on larger screens **DO**: Use asymmetry and unexpected compositions; break the grid intentionally for emphasis -**DON'T**: Wrap everything in cards—not everything needs a container -**DON'T**: Nest cards inside cards—visual noise, flatten the hierarchy -**DON'T**: Use identical card grids—same-sized cards with icon + heading + text, repeated endlessly -**DON'T**: Use the hero metric layout template—big number, small label, supporting stats, gradient accent -**DON'T**: Center everything—left-aligned text with asymmetric layouts feels more designed -**DON'T**: Use the same spacing everywhere—without rhythm, layouts feel monotonous +**DON'T**: Wrap everything in cards. Not everything needs a container +**DON'T**: Nest cards inside cards. Visual noise; flatten the hierarchy +**DON'T**: Use identical card grids (same-sized cards with icon + heading + text, repeated endlessly) +**DON'T**: Use the hero metric layout template (big number, small label, supporting stats, gradient accent) +**DON'T**: Center everything. Left-aligned text with asymmetric layouts feels more designed +**DON'T**: Use the same spacing everywhere. Without rhythm, layouts feel monotonous ### Visual Details **DO**: Use intentional, purposeful decorative elements that reinforce brand -**DON'T**: Use glassmorphism everywhere—blur effects, glass cards, glow borders used decoratively rather than purposefully -**DON'T**: Use rounded elements with thick colored border on one side—a lazy accent that almost never looks intentional -**DON'T**: Use sparklines as decoration—tiny charts that look sophisticated but convey nothing meaningful -**DON'T**: Use rounded rectangles with generic drop shadows—safe, forgettable, could be any AI output -**DON'T**: Use modals unless there's truly no better alternative—modals are lazy +**DON'T**: Use glassmorphism everywhere (blur effects, glass cards, glow borders used decoratively rather than purposefully) +**DON'T**: Use rounded elements with thick colored border on one side. A lazy accent that almost never looks intentional +**DON'T**: Use sparklines as decoration. Tiny charts that look sophisticated but convey nothing meaningful +**DON'T**: Use rounded rectangles with generic drop shadows. Safe, forgettable, could be any AI output +**DON'T**: Use modals unless there's truly no better alternative. Modals are lazy ### Motion → *Consult [motion reference](reference/motion-design.md) for timing, easing, and reduced motion.* Focus on high-impact moments: one well-orchestrated page load with staggered reveals creates more delight than scattered micro-interactions. -**DO**: Use motion to convey state changes—entrances, exits, feedback +**DO**: Use motion to convey state changes: entrances, exits, feedback **DO**: Use exponential easing (ease-out-quart/quint/expo) for natural deceleration **DO**: For height animations, use grid-template-rows transitions instead of animating height directly -**DON'T**: Animate layout properties (width, height, padding, margin)—use transform and opacity only -**DON'T**: Use bounce or elastic easing—they feel dated and tacky; real objects decelerate smoothly +**DON'T**: Animate layout properties (width, height, padding, margin). Use transform and opacity only +**DON'T**: Use bounce or elastic easing. They feel dated and tacky; real objects decelerate smoothly ### Interaction → *Consult [interaction reference](reference/interaction-design.md) for forms, focus, and loading patterns.* -Make interactions feel fast. Use optimistic UI—update immediately, sync later. +Make interactions feel fast. Use optimistic UI: update immediately, sync later. -**DO**: Use progressive disclosure—start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) +**DO**: Use progressive disclosure. Start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) **DO**: Design empty states that teach the interface, not just say "nothing here" **DO**: Make every interactive surface feel intentional and responsive -**DON'T**: Repeat the same information—redundant headers, intros that restate the heading -**DON'T**: Make every button primary—use ghost buttons, text links, secondary styles; hierarchy matters +**DON'T**: Repeat the same information (redundant headers, intros that restate the heading) +**DON'T**: Make every button primary. Use ghost buttons, text links, secondary styles; hierarchy matters ### Responsive → *Consult [responsive reference](reference/responsive-design.md) for mobile-first, fluid design, and container queries.* **DO**: Use container queries (@container) for component-level responsiveness -**DO**: Adapt the interface for different contexts—don't just shrink it -**DON'T**: Hide critical functionality on mobile—adapt the interface, don't amputate it +**DO**: Adapt the interface for different contexts, not just shrink it +**DON'T**: Hide critical functionality on mobile. Adapt the interface, don't amputate it ### UX Writing → *Consult [ux-writing reference](reference/ux-writing.md) for labels, errors, and empty states.* @@ -136,7 +136,7 @@ Make interactions feel fast. Use optimistic UI—update immediately, sync later. A distinctive interface should make someone ask "how was this made?" not "which AI made this?" -Review the DON'T guidelines above—they are the fingerprints of AI-generated work from 2024-2025. +Review the DON'T guidelines above. They are the fingerprints of AI-generated work from 2024-2025. --- @@ -146,7 +146,7 @@ Match implementation complexity to the aesthetic vision. Maximalist designs need Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices across generations. -Remember: Claude is capable of extraordinary creative work. Don't hold back—show what can truly be created when thinking outside the box and committing fully to a distinctive vision. +Remember: Claude is capable of extraordinary creative work. Don't hold back. Show what can truly be created when thinking outside the box and committing fully to a distinctive vision. --- diff --git a/.pi/skills/impeccable/SKILL.md b/.pi/skills/impeccable/SKILL.md index 700385390..768198bf7 100644 --- a/.pi/skills/impeccable/SKILL.md +++ b/.pi/skills/impeccable/SKILL.md @@ -10,12 +10,12 @@ This skill guides creation of distinctive, production-grade frontend interfaces Design skills produce generic output without project context. You MUST have confirmed design context before doing any design work. -**Required context** — every design skill needs at minimum: +**Required context** (every design skill needs at minimum): - **Target audience**: Who uses this product and in what context? - **Use cases**: What jobs are they trying to get done? - **Brand personality/tone**: How should the interface feel? -Individual skills may require additional context — check the skill's preparation section for specifics. +Individual skills may require additional context. Check the skill's preparation section for specifics. **CRITICAL**: You cannot infer this context by reading the codebase. Code tells you what was built, not who it's for or what it should feel like. Only the creator can provide this context. @@ -34,7 +34,7 @@ Commit to a BOLD aesthetic direction: - **Constraints**: Technical requirements (framework, performance, accessibility). - **Differentiation**: What makes this UNFORGETTABLE? What's the one thing someone will remember? -**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work—the key is intentionality, not intensity. +**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work. The key is intentionality, not intensity. Then implement working code that is: - Production-grade and functional @@ -51,9 +51,9 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis **DO**: Use a modular type scale with fluid sizing (clamp) **DO**: Vary font weights and sizes to create clear visual hierarchy -**DON'T**: Use overused fonts—Inter, Roboto, Arial, Open Sans, system defaults +**DON'T**: Use overused fonts like Inter, Roboto, Arial, Open Sans, or system defaults **DON'T**: Use monospace typography as lazy shorthand for "technical/developer" vibes -**DON'T**: Put large icons with rounded corners above every heading—they rarely add value and make sites look templated +**DON'T**: Put large icons with rounded corners above every heading. They rarely add value and make sites look templated ### Color & Theme → *Consult [color reference](reference/color-and-contrast.md) for OKLCH, palettes, and dark mode.* @@ -61,64 +61,64 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis Commit to a cohesive palette. Dominant colors with sharp accents outperform timid, evenly-distributed palettes. **DO**: Use modern CSS color functions (oklch, color-mix, light-dark) for perceptually uniform, maintainable palettes -**DO**: Tint your neutrals toward your brand hue—even a subtle hint creates subconscious cohesion -**DON'T**: Use gray text on colored backgrounds—it looks washed out; use a shade of the background color instead -**DON'T**: Use pure black (#000) or pure white (#fff)—always tint; pure black/white never appears in nature +**DO**: Tint your neutrals toward your brand hue. Even a subtle hint creates subconscious cohesion +**DON'T**: Use gray text on colored backgrounds; it looks washed out. Use a shade of the background color instead +**DON'T**: Use pure black (#000) or pure white (#fff). Always tint; pure black/white never appears in nature **DON'T**: Use the AI color palette: cyan-on-dark, purple-to-blue gradients, neon accents on dark backgrounds -**DON'T**: Use gradient text for "impact"—especially on metrics or headings; it's decorative rather than meaningful -**DON'T**: Default to dark mode with glowing accents—it looks "cool" without requiring actual design decisions +**DON'T**: Use gradient text for "impact," especially on metrics or headings. It's decorative rather than meaningful +**DON'T**: Default to dark mode with glowing accents. It looks "cool" without requiring actual design decisions ### Layout & Space → *Consult [spatial reference](reference/spatial-design.md) for grids, rhythm, and container queries.* -Create visual rhythm through varied spacing—not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. +Create visual rhythm through varied spacing, not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. -**DO**: Create visual rhythm through varied spacing—tight groupings, generous separations +**DO**: Create visual rhythm through varied spacing: tight groupings, generous separations **DO**: Use fluid spacing with clamp() that breathes on larger screens **DO**: Use asymmetry and unexpected compositions; break the grid intentionally for emphasis -**DON'T**: Wrap everything in cards—not everything needs a container -**DON'T**: Nest cards inside cards—visual noise, flatten the hierarchy -**DON'T**: Use identical card grids—same-sized cards with icon + heading + text, repeated endlessly -**DON'T**: Use the hero metric layout template—big number, small label, supporting stats, gradient accent -**DON'T**: Center everything—left-aligned text with asymmetric layouts feels more designed -**DON'T**: Use the same spacing everywhere—without rhythm, layouts feel monotonous +**DON'T**: Wrap everything in cards. Not everything needs a container +**DON'T**: Nest cards inside cards. Visual noise; flatten the hierarchy +**DON'T**: Use identical card grids (same-sized cards with icon + heading + text, repeated endlessly) +**DON'T**: Use the hero metric layout template (big number, small label, supporting stats, gradient accent) +**DON'T**: Center everything. Left-aligned text with asymmetric layouts feels more designed +**DON'T**: Use the same spacing everywhere. Without rhythm, layouts feel monotonous ### Visual Details **DO**: Use intentional, purposeful decorative elements that reinforce brand -**DON'T**: Use glassmorphism everywhere—blur effects, glass cards, glow borders used decoratively rather than purposefully -**DON'T**: Use rounded elements with thick colored border on one side—a lazy accent that almost never looks intentional -**DON'T**: Use sparklines as decoration—tiny charts that look sophisticated but convey nothing meaningful -**DON'T**: Use rounded rectangles with generic drop shadows—safe, forgettable, could be any AI output -**DON'T**: Use modals unless there's truly no better alternative—modals are lazy +**DON'T**: Use glassmorphism everywhere (blur effects, glass cards, glow borders used decoratively rather than purposefully) +**DON'T**: Use rounded elements with thick colored border on one side. A lazy accent that almost never looks intentional +**DON'T**: Use sparklines as decoration. Tiny charts that look sophisticated but convey nothing meaningful +**DON'T**: Use rounded rectangles with generic drop shadows. Safe, forgettable, could be any AI output +**DON'T**: Use modals unless there's truly no better alternative. Modals are lazy ### Motion → *Consult [motion reference](reference/motion-design.md) for timing, easing, and reduced motion.* Focus on high-impact moments: one well-orchestrated page load with staggered reveals creates more delight than scattered micro-interactions. -**DO**: Use motion to convey state changes—entrances, exits, feedback +**DO**: Use motion to convey state changes: entrances, exits, feedback **DO**: Use exponential easing (ease-out-quart/quint/expo) for natural deceleration **DO**: For height animations, use grid-template-rows transitions instead of animating height directly -**DON'T**: Animate layout properties (width, height, padding, margin)—use transform and opacity only -**DON'T**: Use bounce or elastic easing—they feel dated and tacky; real objects decelerate smoothly +**DON'T**: Animate layout properties (width, height, padding, margin). Use transform and opacity only +**DON'T**: Use bounce or elastic easing. They feel dated and tacky; real objects decelerate smoothly ### Interaction → *Consult [interaction reference](reference/interaction-design.md) for forms, focus, and loading patterns.* -Make interactions feel fast. Use optimistic UI—update immediately, sync later. +Make interactions feel fast. Use optimistic UI: update immediately, sync later. -**DO**: Use progressive disclosure—start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) +**DO**: Use progressive disclosure. Start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) **DO**: Design empty states that teach the interface, not just say "nothing here" **DO**: Make every interactive surface feel intentional and responsive -**DON'T**: Repeat the same information—redundant headers, intros that restate the heading -**DON'T**: Make every button primary—use ghost buttons, text links, secondary styles; hierarchy matters +**DON'T**: Repeat the same information (redundant headers, intros that restate the heading) +**DON'T**: Make every button primary. Use ghost buttons, text links, secondary styles; hierarchy matters ### Responsive → *Consult [responsive reference](reference/responsive-design.md) for mobile-first, fluid design, and container queries.* **DO**: Use container queries (@container) for component-level responsiveness -**DO**: Adapt the interface for different contexts—don't just shrink it -**DON'T**: Hide critical functionality on mobile—adapt the interface, don't amputate it +**DO**: Adapt the interface for different contexts, not just shrink it +**DON'T**: Hide critical functionality on mobile. Adapt the interface, don't amputate it ### UX Writing → *Consult [ux-writing reference](reference/ux-writing.md) for labels, errors, and empty states.* @@ -134,7 +134,7 @@ Make interactions feel fast. Use optimistic UI—update immediately, sync later. A distinctive interface should make someone ask "how was this made?" not "which AI made this?" -Review the DON'T guidelines above—they are the fingerprints of AI-generated work from 2024-2025. +Review the DON'T guidelines above. They are the fingerprints of AI-generated work from 2024-2025. --- @@ -144,7 +144,7 @@ Match implementation complexity to the aesthetic vision. Maximalist designs need Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices across generations. -Remember: the model is capable of extraordinary creative work. Don't hold back—show what can truly be created when thinking outside the box and committing fully to a distinctive vision. +Remember: the model is capable of extraordinary creative work. Don't hold back. Show what can truly be created when thinking outside the box and committing fully to a distinctive vision. --- diff --git a/.trae-cn/skills/impeccable/SKILL.md b/.trae-cn/skills/impeccable/SKILL.md index 2eae4e2f6..840fe0282 100644 --- a/.trae-cn/skills/impeccable/SKILL.md +++ b/.trae-cn/skills/impeccable/SKILL.md @@ -12,12 +12,12 @@ This skill guides creation of distinctive, production-grade frontend interfaces Design skills produce generic output without project context. You MUST have confirmed design context before doing any design work. -**Required context** — every design skill needs at minimum: +**Required context** (every design skill needs at minimum): - **Target audience**: Who uses this product and in what context? - **Use cases**: What jobs are they trying to get done? - **Brand personality/tone**: How should the interface feel? -Individual skills may require additional context — check the skill's preparation section for specifics. +Individual skills may require additional context. Check the skill's preparation section for specifics. **CRITICAL**: You cannot infer this context by reading the codebase. Code tells you what was built, not who it's for or what it should feel like. Only the creator can provide this context. @@ -36,7 +36,7 @@ Commit to a BOLD aesthetic direction: - **Constraints**: Technical requirements (framework, performance, accessibility). - **Differentiation**: What makes this UNFORGETTABLE? What's the one thing someone will remember? -**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work—the key is intentionality, not intensity. +**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work. The key is intentionality, not intensity. Then implement working code that is: - Production-grade and functional @@ -53,9 +53,9 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis **DO**: Use a modular type scale with fluid sizing (clamp) **DO**: Vary font weights and sizes to create clear visual hierarchy -**DON'T**: Use overused fonts—Inter, Roboto, Arial, Open Sans, system defaults +**DON'T**: Use overused fonts like Inter, Roboto, Arial, Open Sans, or system defaults **DON'T**: Use monospace typography as lazy shorthand for "technical/developer" vibes -**DON'T**: Put large icons with rounded corners above every heading—they rarely add value and make sites look templated +**DON'T**: Put large icons with rounded corners above every heading. They rarely add value and make sites look templated ### Color & Theme → *Consult [color reference](reference/color-and-contrast.md) for OKLCH, palettes, and dark mode.* @@ -63,64 +63,64 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis Commit to a cohesive palette. Dominant colors with sharp accents outperform timid, evenly-distributed palettes. **DO**: Use modern CSS color functions (oklch, color-mix, light-dark) for perceptually uniform, maintainable palettes -**DO**: Tint your neutrals toward your brand hue—even a subtle hint creates subconscious cohesion -**DON'T**: Use gray text on colored backgrounds—it looks washed out; use a shade of the background color instead -**DON'T**: Use pure black (#000) or pure white (#fff)—always tint; pure black/white never appears in nature +**DO**: Tint your neutrals toward your brand hue. Even a subtle hint creates subconscious cohesion +**DON'T**: Use gray text on colored backgrounds; it looks washed out. Use a shade of the background color instead +**DON'T**: Use pure black (#000) or pure white (#fff). Always tint; pure black/white never appears in nature **DON'T**: Use the AI color palette: cyan-on-dark, purple-to-blue gradients, neon accents on dark backgrounds -**DON'T**: Use gradient text for "impact"—especially on metrics or headings; it's decorative rather than meaningful -**DON'T**: Default to dark mode with glowing accents—it looks "cool" without requiring actual design decisions +**DON'T**: Use gradient text for "impact," especially on metrics or headings. It's decorative rather than meaningful +**DON'T**: Default to dark mode with glowing accents. It looks "cool" without requiring actual design decisions ### Layout & Space → *Consult [spatial reference](reference/spatial-design.md) for grids, rhythm, and container queries.* -Create visual rhythm through varied spacing—not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. +Create visual rhythm through varied spacing, not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. -**DO**: Create visual rhythm through varied spacing—tight groupings, generous separations +**DO**: Create visual rhythm through varied spacing: tight groupings, generous separations **DO**: Use fluid spacing with clamp() that breathes on larger screens **DO**: Use asymmetry and unexpected compositions; break the grid intentionally for emphasis -**DON'T**: Wrap everything in cards—not everything needs a container -**DON'T**: Nest cards inside cards—visual noise, flatten the hierarchy -**DON'T**: Use identical card grids—same-sized cards with icon + heading + text, repeated endlessly -**DON'T**: Use the hero metric layout template—big number, small label, supporting stats, gradient accent -**DON'T**: Center everything—left-aligned text with asymmetric layouts feels more designed -**DON'T**: Use the same spacing everywhere—without rhythm, layouts feel monotonous +**DON'T**: Wrap everything in cards. Not everything needs a container +**DON'T**: Nest cards inside cards. Visual noise; flatten the hierarchy +**DON'T**: Use identical card grids (same-sized cards with icon + heading + text, repeated endlessly) +**DON'T**: Use the hero metric layout template (big number, small label, supporting stats, gradient accent) +**DON'T**: Center everything. Left-aligned text with asymmetric layouts feels more designed +**DON'T**: Use the same spacing everywhere. Without rhythm, layouts feel monotonous ### Visual Details **DO**: Use intentional, purposeful decorative elements that reinforce brand -**DON'T**: Use glassmorphism everywhere—blur effects, glass cards, glow borders used decoratively rather than purposefully -**DON'T**: Use rounded elements with thick colored border on one side—a lazy accent that almost never looks intentional -**DON'T**: Use sparklines as decoration—tiny charts that look sophisticated but convey nothing meaningful -**DON'T**: Use rounded rectangles with generic drop shadows—safe, forgettable, could be any AI output -**DON'T**: Use modals unless there's truly no better alternative—modals are lazy +**DON'T**: Use glassmorphism everywhere (blur effects, glass cards, glow borders used decoratively rather than purposefully) +**DON'T**: Use rounded elements with thick colored border on one side. A lazy accent that almost never looks intentional +**DON'T**: Use sparklines as decoration. Tiny charts that look sophisticated but convey nothing meaningful +**DON'T**: Use rounded rectangles with generic drop shadows. Safe, forgettable, could be any AI output +**DON'T**: Use modals unless there's truly no better alternative. Modals are lazy ### Motion → *Consult [motion reference](reference/motion-design.md) for timing, easing, and reduced motion.* Focus on high-impact moments: one well-orchestrated page load with staggered reveals creates more delight than scattered micro-interactions. -**DO**: Use motion to convey state changes—entrances, exits, feedback +**DO**: Use motion to convey state changes: entrances, exits, feedback **DO**: Use exponential easing (ease-out-quart/quint/expo) for natural deceleration **DO**: For height animations, use grid-template-rows transitions instead of animating height directly -**DON'T**: Animate layout properties (width, height, padding, margin)—use transform and opacity only -**DON'T**: Use bounce or elastic easing—they feel dated and tacky; real objects decelerate smoothly +**DON'T**: Animate layout properties (width, height, padding, margin). Use transform and opacity only +**DON'T**: Use bounce or elastic easing. They feel dated and tacky; real objects decelerate smoothly ### Interaction → *Consult [interaction reference](reference/interaction-design.md) for forms, focus, and loading patterns.* -Make interactions feel fast. Use optimistic UI—update immediately, sync later. +Make interactions feel fast. Use optimistic UI: update immediately, sync later. -**DO**: Use progressive disclosure—start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) +**DO**: Use progressive disclosure. Start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) **DO**: Design empty states that teach the interface, not just say "nothing here" **DO**: Make every interactive surface feel intentional and responsive -**DON'T**: Repeat the same information—redundant headers, intros that restate the heading -**DON'T**: Make every button primary—use ghost buttons, text links, secondary styles; hierarchy matters +**DON'T**: Repeat the same information (redundant headers, intros that restate the heading) +**DON'T**: Make every button primary. Use ghost buttons, text links, secondary styles; hierarchy matters ### Responsive → *Consult [responsive reference](reference/responsive-design.md) for mobile-first, fluid design, and container queries.* **DO**: Use container queries (@container) for component-level responsiveness -**DO**: Adapt the interface for different contexts—don't just shrink it -**DON'T**: Hide critical functionality on mobile—adapt the interface, don't amputate it +**DO**: Adapt the interface for different contexts, not just shrink it +**DON'T**: Hide critical functionality on mobile. Adapt the interface, don't amputate it ### UX Writing → *Consult [ux-writing reference](reference/ux-writing.md) for labels, errors, and empty states.* @@ -136,7 +136,7 @@ Make interactions feel fast. Use optimistic UI—update immediately, sync later. A distinctive interface should make someone ask "how was this made?" not "which AI made this?" -Review the DON'T guidelines above—they are the fingerprints of AI-generated work from 2024-2025. +Review the DON'T guidelines above. They are the fingerprints of AI-generated work from 2024-2025. --- @@ -146,7 +146,7 @@ Match implementation complexity to the aesthetic vision. Maximalist designs need Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices across generations. -Remember: the model is capable of extraordinary creative work. Don't hold back—show what can truly be created when thinking outside the box and committing fully to a distinctive vision. +Remember: the model is capable of extraordinary creative work. Don't hold back. Show what can truly be created when thinking outside the box and committing fully to a distinctive vision. --- diff --git a/.trae/skills/impeccable/SKILL.md b/.trae/skills/impeccable/SKILL.md index 2eae4e2f6..840fe0282 100644 --- a/.trae/skills/impeccable/SKILL.md +++ b/.trae/skills/impeccable/SKILL.md @@ -12,12 +12,12 @@ This skill guides creation of distinctive, production-grade frontend interfaces Design skills produce generic output without project context. You MUST have confirmed design context before doing any design work. -**Required context** — every design skill needs at minimum: +**Required context** (every design skill needs at minimum): - **Target audience**: Who uses this product and in what context? - **Use cases**: What jobs are they trying to get done? - **Brand personality/tone**: How should the interface feel? -Individual skills may require additional context — check the skill's preparation section for specifics. +Individual skills may require additional context. Check the skill's preparation section for specifics. **CRITICAL**: You cannot infer this context by reading the codebase. Code tells you what was built, not who it's for or what it should feel like. Only the creator can provide this context. @@ -36,7 +36,7 @@ Commit to a BOLD aesthetic direction: - **Constraints**: Technical requirements (framework, performance, accessibility). - **Differentiation**: What makes this UNFORGETTABLE? What's the one thing someone will remember? -**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work—the key is intentionality, not intensity. +**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work. The key is intentionality, not intensity. Then implement working code that is: - Production-grade and functional @@ -53,9 +53,9 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis **DO**: Use a modular type scale with fluid sizing (clamp) **DO**: Vary font weights and sizes to create clear visual hierarchy -**DON'T**: Use overused fonts—Inter, Roboto, Arial, Open Sans, system defaults +**DON'T**: Use overused fonts like Inter, Roboto, Arial, Open Sans, or system defaults **DON'T**: Use monospace typography as lazy shorthand for "technical/developer" vibes -**DON'T**: Put large icons with rounded corners above every heading—they rarely add value and make sites look templated +**DON'T**: Put large icons with rounded corners above every heading. They rarely add value and make sites look templated ### Color & Theme → *Consult [color reference](reference/color-and-contrast.md) for OKLCH, palettes, and dark mode.* @@ -63,64 +63,64 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis Commit to a cohesive palette. Dominant colors with sharp accents outperform timid, evenly-distributed palettes. **DO**: Use modern CSS color functions (oklch, color-mix, light-dark) for perceptually uniform, maintainable palettes -**DO**: Tint your neutrals toward your brand hue—even a subtle hint creates subconscious cohesion -**DON'T**: Use gray text on colored backgrounds—it looks washed out; use a shade of the background color instead -**DON'T**: Use pure black (#000) or pure white (#fff)—always tint; pure black/white never appears in nature +**DO**: Tint your neutrals toward your brand hue. Even a subtle hint creates subconscious cohesion +**DON'T**: Use gray text on colored backgrounds; it looks washed out. Use a shade of the background color instead +**DON'T**: Use pure black (#000) or pure white (#fff). Always tint; pure black/white never appears in nature **DON'T**: Use the AI color palette: cyan-on-dark, purple-to-blue gradients, neon accents on dark backgrounds -**DON'T**: Use gradient text for "impact"—especially on metrics or headings; it's decorative rather than meaningful -**DON'T**: Default to dark mode with glowing accents—it looks "cool" without requiring actual design decisions +**DON'T**: Use gradient text for "impact," especially on metrics or headings. It's decorative rather than meaningful +**DON'T**: Default to dark mode with glowing accents. It looks "cool" without requiring actual design decisions ### Layout & Space → *Consult [spatial reference](reference/spatial-design.md) for grids, rhythm, and container queries.* -Create visual rhythm through varied spacing—not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. +Create visual rhythm through varied spacing, not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. -**DO**: Create visual rhythm through varied spacing—tight groupings, generous separations +**DO**: Create visual rhythm through varied spacing: tight groupings, generous separations **DO**: Use fluid spacing with clamp() that breathes on larger screens **DO**: Use asymmetry and unexpected compositions; break the grid intentionally for emphasis -**DON'T**: Wrap everything in cards—not everything needs a container -**DON'T**: Nest cards inside cards—visual noise, flatten the hierarchy -**DON'T**: Use identical card grids—same-sized cards with icon + heading + text, repeated endlessly -**DON'T**: Use the hero metric layout template—big number, small label, supporting stats, gradient accent -**DON'T**: Center everything—left-aligned text with asymmetric layouts feels more designed -**DON'T**: Use the same spacing everywhere—without rhythm, layouts feel monotonous +**DON'T**: Wrap everything in cards. Not everything needs a container +**DON'T**: Nest cards inside cards. Visual noise; flatten the hierarchy +**DON'T**: Use identical card grids (same-sized cards with icon + heading + text, repeated endlessly) +**DON'T**: Use the hero metric layout template (big number, small label, supporting stats, gradient accent) +**DON'T**: Center everything. Left-aligned text with asymmetric layouts feels more designed +**DON'T**: Use the same spacing everywhere. Without rhythm, layouts feel monotonous ### Visual Details **DO**: Use intentional, purposeful decorative elements that reinforce brand -**DON'T**: Use glassmorphism everywhere—blur effects, glass cards, glow borders used decoratively rather than purposefully -**DON'T**: Use rounded elements with thick colored border on one side—a lazy accent that almost never looks intentional -**DON'T**: Use sparklines as decoration—tiny charts that look sophisticated but convey nothing meaningful -**DON'T**: Use rounded rectangles with generic drop shadows—safe, forgettable, could be any AI output -**DON'T**: Use modals unless there's truly no better alternative—modals are lazy +**DON'T**: Use glassmorphism everywhere (blur effects, glass cards, glow borders used decoratively rather than purposefully) +**DON'T**: Use rounded elements with thick colored border on one side. A lazy accent that almost never looks intentional +**DON'T**: Use sparklines as decoration. Tiny charts that look sophisticated but convey nothing meaningful +**DON'T**: Use rounded rectangles with generic drop shadows. Safe, forgettable, could be any AI output +**DON'T**: Use modals unless there's truly no better alternative. Modals are lazy ### Motion → *Consult [motion reference](reference/motion-design.md) for timing, easing, and reduced motion.* Focus on high-impact moments: one well-orchestrated page load with staggered reveals creates more delight than scattered micro-interactions. -**DO**: Use motion to convey state changes—entrances, exits, feedback +**DO**: Use motion to convey state changes: entrances, exits, feedback **DO**: Use exponential easing (ease-out-quart/quint/expo) for natural deceleration **DO**: For height animations, use grid-template-rows transitions instead of animating height directly -**DON'T**: Animate layout properties (width, height, padding, margin)—use transform and opacity only -**DON'T**: Use bounce or elastic easing—they feel dated and tacky; real objects decelerate smoothly +**DON'T**: Animate layout properties (width, height, padding, margin). Use transform and opacity only +**DON'T**: Use bounce or elastic easing. They feel dated and tacky; real objects decelerate smoothly ### Interaction → *Consult [interaction reference](reference/interaction-design.md) for forms, focus, and loading patterns.* -Make interactions feel fast. Use optimistic UI—update immediately, sync later. +Make interactions feel fast. Use optimistic UI: update immediately, sync later. -**DO**: Use progressive disclosure—start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) +**DO**: Use progressive disclosure. Start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) **DO**: Design empty states that teach the interface, not just say "nothing here" **DO**: Make every interactive surface feel intentional and responsive -**DON'T**: Repeat the same information—redundant headers, intros that restate the heading -**DON'T**: Make every button primary—use ghost buttons, text links, secondary styles; hierarchy matters +**DON'T**: Repeat the same information (redundant headers, intros that restate the heading) +**DON'T**: Make every button primary. Use ghost buttons, text links, secondary styles; hierarchy matters ### Responsive → *Consult [responsive reference](reference/responsive-design.md) for mobile-first, fluid design, and container queries.* **DO**: Use container queries (@container) for component-level responsiveness -**DO**: Adapt the interface for different contexts—don't just shrink it -**DON'T**: Hide critical functionality on mobile—adapt the interface, don't amputate it +**DO**: Adapt the interface for different contexts, not just shrink it +**DON'T**: Hide critical functionality on mobile. Adapt the interface, don't amputate it ### UX Writing → *Consult [ux-writing reference](reference/ux-writing.md) for labels, errors, and empty states.* @@ -136,7 +136,7 @@ Make interactions feel fast. Use optimistic UI—update immediately, sync later. A distinctive interface should make someone ask "how was this made?" not "which AI made this?" -Review the DON'T guidelines above—they are the fingerprints of AI-generated work from 2024-2025. +Review the DON'T guidelines above. They are the fingerprints of AI-generated work from 2024-2025. --- @@ -146,7 +146,7 @@ Match implementation complexity to the aesthetic vision. Maximalist designs need Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices across generations. -Remember: the model is capable of extraordinary creative work. Don't hold back—show what can truly be created when thinking outside the box and committing fully to a distinctive vision. +Remember: the model is capable of extraordinary creative work. Don't hold back. Show what can truly be created when thinking outside the box and committing fully to a distinctive vision. --- diff --git a/public/app.js b/public/app.js index 2eec178ed..39a8d40ac 100644 --- a/public/app.js +++ b/public/app.js @@ -93,132 +93,79 @@ function renderPatternsWithTabs(patterns, antipatterns) { const container = document.getElementById("patterns-categories"); if (!container || !patterns || !antipatterns) return; - // Create a map of antipatterns by category name const antipatternMap = {}; - antipatterns.forEach(cat => { - antipatternMap[cat.name] = cat.items; - }); + antipatterns.forEach(cat => { antipatternMap[cat.name] = cat.items; }); - // Generate unique IDs for tabs - const tabId = (name) => `pattern-tab-${name.toLowerCase().replace(/\s+/g, '-')}`; - const panelId = (name) => `pattern-panel-${name.toLowerCase().replace(/\s+/g, '-')}`; + const icons = ['Aa', '◉', '▦', '⧉', '⚙', '⎙', '✎', '✎']; - // Build tabs with WAI-ARIA attributes - const tabsHTML = patterns - .map((category, i) => ``) - .join(""); - - // Build panels with WAI-ARIA attributes - const panelsHTML = patterns - .map((category, i) => { - const antiItems = antipatternMap[category.name] || []; - return ` -
-
-
- Don't -
    - ${antiItems.map((item) => `
  • ${escapeHtml(item)}
  • `).join("")} -
+ const itemsHTML = patterns.map((category, i) => { + const antiItems = antipatternMap[category.name] || []; + const totalCount = antiItems.length + category.items.length; + return ` +
  • + +
    +
    + +
    -
    - Do -
      - ${category.items.map((item) => `
    • ${escapeHtml(item)}
    • `).join("")} -
    +
    +
    +
    +
      ${antiItems.map(item => `
    • ${escapeHtml(item)}
    • `).join('')}
    +
    + +
    -
    - `; - }) - .join(""); +
  • `; + }).join(''); - container.innerHTML = ` -
    ${tabsHTML}
    -
    ${panelsHTML}
    - `; + container.innerHTML = `
      ${itemsHTML}
    `; - const tabs = container.querySelectorAll('.pattern-tab'); - const panels = container.querySelectorAll('.pattern-panel'); + const list = container.querySelector('.disclosure-list'); + const items = list.querySelectorAll('.disclosure-item'); - // Function to switch tabs - const switchTab = (newTab) => { - const tabName = newTab.dataset.tab; - - // Update ARIA attributes on all tabs - tabs.forEach(t => { - t.classList.remove('active'); - t.setAttribute('aria-selected', 'false'); - t.setAttribute('tabindex', '-1'); - }); - - // Activate the new tab - newTab.classList.add('active'); - newTab.setAttribute('aria-selected', 'true'); - newTab.setAttribute('tabindex', '0'); - newTab.focus(); - - // Update panels - panels.forEach(p => { - p.classList.remove('active'); - p.setAttribute('hidden', ''); - }); - const escapedName = CSS.escape(tabName); - const activePanel = container.querySelector(`[data-panel="${escapedName}"]`); - if (!activePanel) return; - activePanel.classList.add('active'); - activePanel.removeAttribute('hidden'); + const activate = (event) => { + const closest = event.target.closest('.disclosure-item'); + if (!closest) return; + const index = [...items].indexOf(closest); + const cols = [...items].map((item, i) => { + item.dataset.active = (index === i).toString(); + item.querySelector('.disclosure-tab').setAttribute('aria-expanded', index === i ? 'true' : 'false'); + return index === i ? '10fr' : '1fr'; + }).join(' '); + list.style.setProperty('grid-template-columns', cols); }; - // Tab click handling - tabs.forEach(tab => { - tab.addEventListener('click', () => switchTab(tab)); - }); + // Sync article width for content sizing + const syncWidth = () => { + const w = Math.max(...[...items].map(i => i.offsetWidth)); + list.style.setProperty('--dl-article-width', w); + }; + window.addEventListener('resize', syncWidth); + syncWidth(); - // Keyboard navigation (Arrow keys, Home, End) - tabs.forEach((tab, index) => { - tab.addEventListener('keydown', (e) => { - let targetIndex = index; + list.addEventListener('pointermove', activate); + list.addEventListener('click', activate); + list.addEventListener('focus', activate, true); - switch (e.key) { - case 'ArrowLeft': - case 'ArrowUp': - e.preventDefault(); - targetIndex = index === 0 ? tabs.length - 1 : index - 1; - break; - case 'ArrowRight': - case 'ArrowDown': - e.preventDefault(); - targetIndex = index === tabs.length - 1 ? 0 : index + 1; - break; - case 'Home': - e.preventDefault(); - targetIndex = 0; - break; - case 'End': - e.preventDefault(); - targetIndex = tabs.length - 1; - break; - default: - return; - } - - switchTab(tabs[targetIndex]); + // Don't/Do toggle within each card + list.addEventListener('click', (e) => { + const btn = e.target.closest('.disclosure-toggle-btn'); + if (!btn) return; + e.stopPropagation(); + const item = btn.closest('.disclosure-item'); + const show = btn.dataset.show; + item.querySelectorAll('.disclosure-toggle-btn').forEach(b => b.classList.remove('is-active')); + btn.classList.add('is-active'); + item.querySelectorAll('.disclosure-col').forEach(col => { + col.hidden = col.dataset.col !== show; }); }); } diff --git a/public/css/main.css b/public/css/main.css index 0f44229a6..e14746157 100644 --- a/public/css/main.css +++ b/public/css/main.css @@ -1947,203 +1947,445 @@ code { border-top: 1px solid var(--color-mist); } -/* Patterns - tabbed layout */ -.patterns-categories { +/* Animated horizontal disclosure (inspired by jh3y/XJWNMOO) */ +.antidote-grid { margin-bottom: var(--spacing-xl); } -/* Tab bar */ -.pattern-tabs { - display: flex; - flex-wrap: wrap; - gap: var(--spacing-xs); - margin-bottom: var(--spacing-lg); +.disclosure-list { + --dl-gap: 6px; + --dl-base: 52px; + --dl-speed: 0.5s; + --dl-easing: linear(0 0%, 0.15 4%, 0.29 8%, 0.42 13%, 0.53 17%, 0.63 22%, 0.71 27%, 0.78 32%, 0.84 37%, 0.89 42%, 0.93 48%, 0.95 54%, 0.98 60%, 0.99 67%, 1 75%, 1 100%); + + list-style: none; + padding: 0; + margin: 0; + display: grid; + grid-template-columns: 10fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr; + gap: var(--dl-gap); + height: clamp(320px, 38dvh, 420px); + transition: grid-template-columns var(--dl-speed) var(--dl-easing); } -.pattern-tab { +.disclosure-item { + position: relative; + overflow: hidden; + min-width: var(--dl-base); + border-radius: 8px; + border: 1px solid var(--color-mist); + background: white; + cursor: pointer; +} + +/* Tab: label + icon inside each item, absolutely positioned */ +.disclosure-tab { + position: absolute; + inset: 0; + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + padding: 0; background: none; border: none; - border-bottom: 2px solid transparent; - font-family: var(--font-body); - font-size: 0.875rem; - color: var(--color-ash); - padding: var(--spacing-xs) var(--spacing-sm); cursor: pointer; - transition: color var(--duration-fast) var(--ease-out), border-color var(--duration-fast) var(--ease-out); + width: 100%; + height: 100%; } -.pattern-tab:hover { - color: var(--color-charcoal); -} - -.pattern-tab.active { - color: var(--color-ink); +.disclosure-tab-label { + position: absolute; + top: var(--spacing-sm); + left: calc(var(--dl-base) * 0.5); + transform-origin: 0 50%; + rotate: 90deg; + font-family: var(--font-body); + font-size: 0.8125rem; font-weight: 500; - border-bottom-color: var(--color-accent); + text-transform: uppercase; + color: var(--color-ink); + letter-spacing: 0.03em; + white-space: nowrap; + opacity: 0.5; + transition: opacity calc(var(--dl-speed) * 1.2) var(--dl-easing); } -.pattern-tab:focus-visible { - outline: 2px solid var(--color-accent); - outline-offset: 2px; - border-radius: 4px; +.disclosure-tab-icon { + position: absolute; + bottom: var(--spacing-sm); + left: 50%; + transform: translateX(-50%); + font-size: 1rem; + color: var(--color-accent); + font-weight: 600; + opacity: 0.5; + transition: opacity calc(var(--dl-speed) * 1.2) var(--dl-easing); } -/* Panels */ -.pattern-panel { - display: none; +.disclosure-item[data-active='true'] .disclosure-tab-label { + opacity: 1; } -.pattern-panel.active { - display: block; +.disclosure-item[data-active='true'] .disclosure-tab-icon { + opacity: 0; } -.pattern-columns { - display: grid; - grid-template-columns: 1fr 1fr; - gap: var(--spacing-xl); +/* Expanded content: absolutely positioned, sized to article width */ +.disclosure-content { + position: absolute; + top: 0; + left: 0; + width: calc(var(--dl-article-width, 600) * 1px); + height: 100%; + display: flex; + flex-direction: column; + overflow: hidden; + opacity: 0; + transition: opacity calc(var(--dl-speed) * 1.2) var(--dl-easing); } -@media (max-width: 768px) { - .pattern-columns { - grid-template-columns: 1fr; - gap: var(--spacing-md); - } +.disclosure-item[data-active='true'] .disclosure-content { + opacity: 1; + transition-delay: calc(var(--dl-speed) * 0.2); } -.pattern-column-label { - display: block; - font-size: 0.6875rem; +.disclosure-content-inner { + padding: var(--spacing-sm) var(--spacing-md) var(--spacing-md) calc(var(--dl-base) + var(--spacing-sm)); + flex: 1; + overflow-y: auto; + overflow-x: hidden; +} + +.disclosure-columns { + display: flex; + flex-direction: column; + gap: var(--spacing-sm); +} + +/* Toggle between don't/do — fixed header inside disclosure content */ +.disclosure-toggle { + display: inline-flex; + gap: 0; + border: 1px solid var(--color-mist); + border-radius: 5px; + overflow: hidden; + flex-shrink: 0; + align-self: flex-end; + margin: var(--spacing-sm) var(--spacing-sm) 0 0; +} + +.disclosure-toggle-btn { + font-family: var(--font-body); + font-size: 0.625rem; font-weight: 600; text-transform: uppercase; - letter-spacing: 0.1em; - margin-bottom: var(--spacing-sm); + letter-spacing: 0.05em; + border: none; + padding: 3px 10px; + cursor: pointer; + background: none; color: var(--color-ash); + transition: background var(--duration-fast), color var(--duration-fast); } -.pattern-column--anti .pattern-column-label { +.disclosure-toggle-btn + .disclosure-toggle-btn { + border-left: 1px solid var(--color-mist); +} + +.disclosure-toggle-btn.is-active { + background: oklch(97% 0.005 350); + color: var(--color-ink); +} + +.disclosure-toggle-btn--anti.is-active { color: var(--color-accent); } -.pattern-column--do .pattern-column-label { +.disclosure-toggle-btn--do.is-active { color: var(--color-success, #22c55e); } -/* Pattern list styles */ -.pattern-list { +.disclosure-col[hidden] { + display: none; +} + +.disclosure-col ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; - gap: var(--spacing-xs); + gap: 6px; } -.pattern-item { - font-size: 0.8125rem; - padding-left: var(--spacing-md); +.disclosure-col li { + font-size: 0.9375rem; + line-height: 1.55; + padding-left: var(--spacing-sm); position: relative; - line-height: 1.5; + color: var(--color-charcoal); + overflow-wrap: break-word; + word-break: break-word; } -/* Anti-pattern items - muted */ -.pattern-item--anti { - color: var(--color-ash); +.disclosure-col-label { + display: block; + font-size: 0.625rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.1em; + margin-bottom: 8px; } -.pattern-item--anti::before { - content: '×'; +.disclosure-col-label--anti { color: var(--color-accent); } +.disclosure-col-label--do { color: var(--color-success, #22c55e); } + +.disclosure-col[data-col='anti'] li::before { + content: '\00d7'; position: absolute; left: 0; color: var(--color-accent); font-weight: 600; } -/* Pattern items - prominent */ -.pattern-item--do { - color: var(--color-charcoal); -} - -.pattern-item--do::before { - content: '✓'; +.disclosure-col[data-col='do'] li::before { + content: '\2713'; position: absolute; left: 0; color: var(--color-success, #22c55e); font-weight: 600; } -/* Contribution inline link */ -.contribute-inline { - font-size: 0.875rem; - color: var(--color-ash); - margin-top: var(--spacing-md); +/* Mobile: vertical stack */ +@media (max-width: 768px) { + .disclosure-list { + grid-template-columns: 1fr; + grid-template-rows: 10fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr; + height: auto; + min-height: 500px; + transition: grid-template-rows var(--dl-speed) var(--dl-easing); + } + + .disclosure-item { + min-width: 0; + min-height: var(--dl-base); + } + + .disclosure-tab-label { + rotate: none; + top: 50%; + left: var(--spacing-md); + transform: translateY(-50%); + } + + .disclosure-tab-icon { + bottom: 50%; + left: auto; + right: var(--spacing-md); + transform: translateY(50%); + } + + .disclosure-content-inner { + padding: calc(var(--dl-base) + var(--spacing-sm)) var(--spacing-md) var(--spacing-md); + } + + .disclosure-columns { + grid-template-columns: 1fr; + gap: var(--spacing-md); + } } -.contribute-inline a { +/* Antidote row: cards + gallery sidebar */ +.antidote-row { + display: flex; + gap: var(--spacing-lg); + align-items: stretch; + margin-bottom: var(--spacing-lg); +} + +.antidote-row .antidote-grid { + flex: 1; + min-width: 0; + margin-bottom: 0; +} + +/* Gallery sidebar */ +.gallery-sidebar { + flex: 0 0 32%; + min-width: 0; + max-width: 400px; + border: 1px solid var(--color-mist); + border-radius: 12px; + padding: var(--spacing-sm); + display: flex; + flex-direction: column; + gap: var(--spacing-xs); + overflow: hidden; + max-height: clamp(320px, 38dvh, 420px); +} + +.gallery-sidebar-title { + font-family: var(--font-display); + font-size: 1.125rem; + font-weight: 600; + color: var(--color-ink); + padding: var(--spacing-xs) var(--spacing-xs) 0; +} + +.gallery-sidebar-scroll { + flex: 1; + overflow-y: auto; + display: grid; + grid-template-columns: 1fr 1fr; + gap: 6px; + scrollbar-width: none; +} + +.gallery-sidebar-scroll::-webkit-scrollbar { display: none; } + +.gallery-sidebar-card { + display: flex; + flex-direction: column; + gap: 4px; + padding: 4px; + border-radius: 8px; + text-decoration: none; + overflow: hidden; + transition: background var(--duration-fast) var(--ease-out); +} + +.gallery-sidebar-card:hover { + background: oklch(97% 0.005 350); +} + +.gallery-sidebar-card img { + width: 100%; + height: 72px; + object-fit: cover; + object-position: top left; + border-radius: 6px; + border: 1px solid var(--color-mist); +} + +.gallery-sidebar-label { + font-size: 0.6875rem; + font-weight: 600; + color: var(--color-charcoal); + padding: 0 2px; +} + +.gallery-sidebar-link { + font-size: 0.75rem; + font-weight: 500; color: var(--color-accent); text-decoration: none; + text-align: center; + padding: var(--spacing-xs) 0 0; + border-top: 1px solid var(--color-mist); } -.contribute-inline a:hover { +.gallery-sidebar-link:hover { text-decoration: underline; } -/* Critique callout — inline note below tabs */ -.critique-callout { - border-top: 1px solid var(--color-mist); - padding-top: var(--spacing-md); - margin-bottom: var(--spacing-md); +/* Detection callout — horizontal below cards */ +.detection-callout { + margin-bottom: var(--spacing-xl); + border: 1px solid var(--color-mist); + border-radius: 8px; + padding: var(--spacing-sm) var(--spacing-md); +} + +.detection-callout-inner { display: flex; - align-items: baseline; - gap: var(--spacing-sm); + align-items: center; + gap: var(--spacing-md); flex-wrap: wrap; +} + +.detection-badge { + font-family: var(--font-mono); + font-size: 0.625rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--color-accent); + border: 1px solid var(--color-accent); + padding: 2px 10px; + border-radius: 99px; + flex-shrink: 0; +} + +.detection-desc { + flex: 1; font-size: 0.8125rem; - color: var(--color-ash); line-height: 1.55; -} - -.critique-callout-body { - display: contents; -} - -.critique-callout-title { - display: none; -} - -.critique-callout-text { color: var(--color-ash); + min-width: 200px; } -.critique-callout-text code { +.detection-desc code { font-family: var(--font-mono); font-size: 0.8125rem; color: var(--color-charcoal); } -.critique-callout-links { - display: flex; - gap: var(--spacing-sm); +.detection-cmd { flex-shrink: 0; -} - -.critique-callout-link { + font-family: var(--font-mono); font-size: 0.8125rem; - font-weight: 500; - color: var(--color-accent); - text-decoration: none; + color: var(--color-charcoal); + background: oklch(96% 0.005 350); + padding: 6px 14px; + border-radius: 6px; white-space: nowrap; } -.critique-callout-link:hover { - text-decoration: underline; +.detection-cmd::before { + content: '\279C '; + color: var(--color-accent); } -.critique-callout-link--secondary { +@media (max-width: 1060px) { + .antidote-row { + flex-direction: column; + } + + .gallery-sidebar { + flex: none; + width: 100%; + max-width: none; + max-height: none; + } + + .gallery-sidebar-scroll { + grid-template-columns: repeat(3, 1fr); + } +} + +@media (max-width: 600px) { + .gallery-sidebar-scroll { + grid-template-columns: 1fr 1fr; + } +} + +/* (gallery teaser styles moved to gallery-sidebar above) */ + +/* Antidote footer */ +.antidote-footer { + text-align: center; +} + +.antidote-suggest-link { + font-size: 0.8125rem; color: var(--color-ash); - font-weight: 400; + text-decoration: none; } -.critique-callout-link--secondary:hover { - color: var(--color-charcoal); +.antidote-suggest-link:hover { + color: var(--color-accent); + text-decoration: underline; } /* ============================================ diff --git a/public/css/styles.css b/public/css/styles.css index aaf63328c..ad6238784 100644 --- a/public/css/styles.css +++ b/public/css/styles.css @@ -1,2 +1,2 @@ /*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */ -.split-container:before{content:"";background-image:linear-gradient(var(--color-mist) 1px, transparent 1px), linear-gradient(90deg, var(--color-mist) 1px, transparent 1px);opacity:.3;pointer-events:none;background-size:20px 20px;position:absolute;inset:0}.split-container:after{content:"← Drag →";letter-spacing:.1em;text-transform:uppercase;color:var(--color-ash);background:var(--color-paper);opacity:.8;z-index:10;border-radius:4px;padding:4px 12px;font-size:.625rem;font-weight:600;transition:opacity .3s;position:absolute;bottom:12px;left:50%;transform:translate(-50%)}.split-container:hover:after{opacity:0}.split-after .impeccable-card{box-shadow:0 10px 40px #00000014}@keyframes splitEntry{0%{opacity:0;transform:translate(-50%)skew(-10deg)scaleY(.8)}to{opacity:1;transform:translate(-50%)skew(-10deg)scaleY(1)}}.split-divider{animation:splitEntry .6s var(--ease-out) .3s backwards}.split-label-item{transition:color var(--duration-fast) var(--ease-out);cursor:default}.split-label-item:hover{color:var(--color-text)}.split-label-item[data-point=after]:hover .split-label-dot--accent{transform:scale(1.3)}.split-label-dot{transition:transform var(--duration-fast) var(--ease-spring)}.split-badge{letter-spacing:.08em;text-transform:uppercase;z-index:5;pointer-events:none;border-radius:3px;padding:3px 8px;font-size:.625rem;font-weight:600;position:absolute;top:10px}.split-badge--before{color:var(--color-ash);background:var(--color-paper);border:1px solid var(--color-mist);left:10px}.split-badge--after{color:var(--color-paper);background:var(--color-accent);right:10px}@media (hover:none){.split-container:after{content:"← Swipe →"}}@media (max-width:600px){.split-label{padding:4px 10px;font-size:.5625rem}}.commands-section{padding:var(--spacing-xl) 0;background:var(--color-paper);position:relative}.commands-gallery{display:block}.commands-container{gap:var(--spacing-2xl);grid-template-columns:1fr 1.2fr;align-items:start;display:grid}@media (max-width:900px){.commands-container{grid-template-columns:1fr}}.command-manual{gap:var(--spacing-sm);flex-direction:column;padding-bottom:20vh;display:flex}.command-category-header{font-family:var(--font-display);color:var(--color-accent);text-transform:uppercase;letter-spacing:.1em;padding:var(--spacing-lg) var(--spacing-lg) var(--spacing-sm);margin-top:var(--spacing-md);border-bottom:1px solid var(--color-mist);font-size:.875rem;font-weight:600}.command-category-header:first-child{margin-top:0}.manual-entry{padding:var(--spacing-lg);padding-left:calc(var(--spacing-lg) + 16px);border-left:2px solid var(--color-mist);transition:border-color .4s var(--ease-out), opacity .4s var(--ease-out), background .4s var(--ease-out), transform .4s var(--ease-out);opacity:.4;cursor:pointer;position:relative;transform:translate(-16px)}.manual-entry:hover{opacity:.7}.manual-entry.active{border-left-color:var(--color-accent);opacity:1;background:linear-gradient(to right, var(--color-bg), transparent);transform:translate(0)}.manual-cmd-name{font-family:var(--font-mono);margin:0 0 var(--spacing-sm);color:var(--color-ink);font-size:1.5rem;font-weight:500}.beta-badge{font-family:var(--font-body);letter-spacing:.08em;text-transform:uppercase;color:var(--color-accent);border:1px solid var(--color-accent);vertical-align:middle;border-radius:3px;margin-left:6px;padding:1px 5px;font-size:.55rem;font-weight:600}.manual-cmd-desc{color:var(--color-charcoal);margin:0;font-size:.875rem;line-height:1.5}.manual-cmd-rel{color:var(--color-ash);margin-top:var(--spacing-sm);flex-wrap:wrap;align-items:center;gap:.5ch;font-size:.8125rem;display:flex}.manual-cmd-rel .rel-icon{color:var(--color-accent);font-weight:600}.manual-cmd-rel code{font-family:var(--font-mono);background:var(--color-mist);color:var(--color-ink);border-radius:3px;padding:2px 6px;font-size:.75rem}.glass-terminal-wrapper{height:calc(100vh - var(--spacing-xl) * 2);min-height:500px;max-height:800px;position:sticky;top:50vh;transform:translateY(-50%)}.terminal-stack{perspective:1200px;height:100%;position:relative}.terminal-stack-tabs{z-index:10;gap:4px;display:flex;position:absolute;top:-31px;right:8px}.terminal-stack-tab{font-family:var(--font-mono);background:var(--color-cream);border:1px solid var(--color-mist);color:var(--color-ash);cursor:pointer;border-bottom:none;border-radius:6px 6px 0 0;padding:5px 12px;font-size:.75rem;transition:all .2s}.terminal-stack-tab:hover{background:var(--color-paper);color:var(--color-charcoal)}.terminal-stack-tab.active{background:var(--color-paper);color:var(--color-ink);border-color:var(--color-mist)}.terminal-window{transform-origin:bottom;transition:transform .4s cubic-bezier(.4,0,.2,1),opacity .3s,filter .3s;position:absolute;inset:0}.terminal-window--demo{z-index:2}.terminal-window--demo.is-back{opacity:.6;filter:brightness(.92);pointer-events:none;z-index:1;transform:translateY(16px)translate(12px)scale(.96)}.terminal-window--source{z-index:1;opacity:.6;filter:brightness(.92);pointer-events:none;transform:translateY(16px)translate(12px)scale(.96)}.terminal-window--source.is-front{opacity:1;filter:brightness();pointer-events:auto;z-index:2;transform:translateY(0)translate(0)scale(1)}.source-window{background:var(--color-paper);-webkit-backdrop-filter:blur(12px);border:1px solid var(--color-mist);border-radius:8px;flex-direction:column;height:100%;display:flex;overflow:hidden;box-shadow:0 20px 60px -10px #00000026}.source-header{background:var(--color-cream);border-bottom:1px solid var(--color-mist);flex-shrink:0;align-items:center;gap:8px;padding:12px 16px;display:flex}.source-title{font-family:var(--font-mono);color:var(--color-ink);font-size:.875rem;font-weight:500}.source-body{padding:var(--spacing-md);font-family:var(--font-mono);color:var(--color-charcoal);overscroll-behavior:contain;white-space:pre-wrap;word-break:break-word;background:var(--color-cream);flex:1;font-size:.75rem;line-height:1.5;overflow-y:auto}.source-loading{color:var(--color-ash);font-style:italic}@media (max-width:900px){.glass-terminal-wrapper{display:none}}.glass-terminal{background:var(--color-paper);-webkit-backdrop-filter:blur(12px);border:1px solid var(--color-mist);border-radius:8px;flex-direction:column;height:100%;display:flex;overflow:hidden;box-shadow:0 20px 60px -10px #00000026}.terminal-header{background:var(--color-cream);border-bottom:1px solid var(--color-mist);align-items:center;gap:8px;padding:12px 16px;display:flex}.terminal-dot{border-radius:50%;width:10px;height:10px}.terminal-dot.red{background:#ff5f56}.terminal-dot.yellow{background:#ffbd2e}.terminal-dot.green{background:#27c93f}.terminal-title{font-family:var(--font-mono);color:var(--color-ash);margin-left:auto;font-size:.75rem}.terminal-body{padding:var(--spacing-md);font-family:var(--font-mono);color:var(--color-ink);flex-direction:column;flex:1;min-height:0;font-size:.9375rem;display:flex;overflow-y:auto}.terminal-line{margin-bottom:var(--spacing-sm);gap:var(--spacing-sm);line-height:1.5;display:flex}.terminal-prompt{color:var(--color-accent);-webkit-user-select:none;user-select:none;font-weight:700}.terminal-cursor{background:var(--color-accent);vertical-align:middle;width:8px;height:1.2em;animation:1s step-end infinite blink;display:inline-block}.terminal-output{color:var(--color-ash);margin-bottom:var(--spacing-md);white-space:pre-wrap}@media (max-height:800px){.terminal-output{display:none}}.terminal-cmd{color:var(--color-accent);font-weight:600}.terminal-step{color:var(--color-charcoal)}.terminal-done{color:var(--color-success,#22c55e);font-weight:500}.terminal-preview{background:var(--color-paper);margin:var(--spacing-sm) 0;border-radius:12px;flex:1;min-height:0;overflow:hidden}.terminal-cursor-line{flex-shrink:0;margin-top:var(--spacing-sm)!important}.terminal-preview .demo-split-comparison{flex-direction:column;height:100%;display:flex}.terminal-preview .demo-split-comparison .split-container{cursor:ew-resize;-webkit-user-select:none;user-select:none;background:var(--color-cream);flex:1;min-height:0;position:relative;overflow:hidden}.terminal-preview .demo-split-comparison .split-before,.terminal-preview .demo-split-comparison .split-after{padding:var(--spacing-md);justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.terminal-preview .demo-split-comparison .split-before{z-index:1;background:var(--color-cream)}.terminal-preview .demo-split-comparison .split-after{z-index:2;background:var(--color-paper);clip-path:polygon(58% 0%,100% 0%,100% 100%,42% 100%)}.terminal-preview .demo-split-comparison .split-content{flex-direction:column;justify-content:center;align-items:center;width:100%;max-width:280px;display:flex}.terminal-preview .demo-split-comparison .split-divider{background:var(--color-accent);pointer-events:none;z-index:3;width:2px;position:absolute;top:0;bottom:0;left:50%;transform:translate(-50%)skew(-10deg);box-shadow:0 0 12px #0000001a}.terminal-preview .demo-split-comparison .split-label{letter-spacing:.08em;text-transform:uppercase;color:var(--color-paper);background:var(--color-accent);white-space:nowrap;border-radius:3px;padding:4px 10px;font-size:.5625rem;font-weight:600;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)skew(10deg)}.terminal-preview .demo-split-comparison .demo-caption{color:var(--color-ash);text-align:center;padding:var(--spacing-sm) var(--spacing-md);flex-shrink:0;font-size:.75rem}@keyframes blink{50%{opacity:0}}.casestudies-section{padding:var(--spacing-2xl) 0;border-top:1px solid var(--color-mist);position:relative}.transformations-tabbed{margin-top:var(--spacing-xl)}.transformation-tabs{gap:var(--spacing-xs);border-bottom:1px solid var(--color-mist);margin-bottom:var(--spacing-lg);display:flex}.transformation-tab{font-family:var(--font-display);color:var(--color-ash);padding:var(--spacing-sm) var(--spacing-md);cursor:pointer;background:0 0;border:none;font-size:.9375rem;font-weight:500;transition:color .2s;position:relative}.transformation-tab:hover{color:var(--color-charcoal)}.transformation-tab.active{color:var(--color-ink)}.transformation-tab.active:after{content:"";background:var(--color-accent);height:2px;position:absolute;bottom:-1px;left:0;right:0}.transformation-panels{position:relative}.transformation-panel{gap:var(--spacing-lg);flex-direction:column;animation:.3s fadeInPanel;display:none}.transformation-panel.active{display:flex}@keyframes fadeInPanel{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.transformation-images{align-items:center;gap:var(--spacing-md);display:flex}.transformation-before,.transformation-after{flex:1;margin:0}.transformation-before img,.transformation-after img,.transformation-placeholder{aspect-ratio:16/10;object-fit:cover;border:1px solid var(--color-mist);cursor:pointer;border-radius:8px;width:100%;transition:transform .2s,box-shadow .2s}.transformation-before img:hover,.transformation-after img:hover,.transformation-placeholder:hover{transform:scale(1.02);box-shadow:0 8px 24px -4px #00000026}.transformation-placeholder{background:linear-gradient(135deg, var(--color-mist) 0%, var(--color-cream) 100%);color:var(--color-ash);justify-content:center;align-items:center;font-size:.8125rem;font-style:italic;display:flex}.transformation-before figcaption,.transformation-after figcaption{text-transform:uppercase;letter-spacing:.05em;color:var(--color-ash);margin-top:var(--spacing-xs);text-align:center;font-size:.75rem;font-weight:600}.transformation-arrow{color:var(--color-accent);flex-shrink:0;font-size:1.5rem;font-weight:300}.transformation-info{max-width:600px}.transformation-title{font-family:var(--font-display);color:var(--color-ink);margin:0 0 var(--spacing-xs);font-size:1.25rem;font-weight:600}.transformation-desc{color:var(--color-charcoal);margin:0 0 var(--spacing-sm);font-size:.9375rem;line-height:1.6}.transformation-commands{flex-wrap:wrap;gap:6px;display:flex}.transformation-command{font-family:var(--font-mono);background:var(--color-mist);color:var(--color-charcoal);border-radius:4px;padding:4px 10px;font-size:.75rem}.lightbox{z-index:1000;opacity:0;visibility:hidden;background:#000000e6;justify-content:center;align-items:center;transition:opacity .3s,visibility .3s;display:flex;position:fixed;inset:0}.lightbox.active{opacity:1;visibility:visible}.lightbox-close{color:#fff;cursor:pointer;opacity:.7;background:0 0;border:none;font-size:2.5rem;line-height:1;transition:opacity .2s;position:absolute;top:20px;right:24px}.lightbox-close:hover{opacity:1}.lightbox-image{object-fit:contain;border-radius:8px;max-width:90vw;max-height:85vh;box-shadow:0 20px 60px #00000080}@media (max-width:768px){.transformation-images{flex-direction:column}.transformation-arrow{transform:rotate(90deg)}.transformation-before,.transformation-after{width:100%}}.hero-version-link{color:var(--color-ash);margin-top:var(--spacing-sm);font-size:.8125rem}.hero-version-link a{color:var(--color-ash);border-bottom:1px solid #0000;text-decoration:none;transition:color .2s,border-color .2s}.hero-version-link a:hover{color:var(--color-accent);border-bottom-color:var(--color-accent)}.changelog-section{padding:var(--spacing-xl) 0;border-top:1px solid var(--color-mist);position:relative}.changelog-list{flex-direction:column;gap:0;display:flex}.changelog-entry{padding:var(--spacing-md) 0}.changelog-entry+.changelog-entry{border-top:1px solid var(--color-mist)}.changelog-version-header{align-items:baseline;gap:var(--spacing-sm);margin-bottom:var(--spacing-sm);display:flex}.changelog-version{font-family:var(--font-mono);color:var(--color-ink);font-size:1.125rem;font-weight:600}.changelog-date{color:var(--color-ash);font-size:.8125rem}.changelog-items{padding-left:var(--spacing-md);color:var(--color-charcoal);margin:0;line-height:1.7}.changelog-items li{margin-bottom:var(--spacing-xs)}.changelog-items code{font-family:var(--font-mono);background:var(--color-mist);color:var(--color-ink);border-radius:3px;padding:2px 6px;font-size:.875em}.changelog-older{margin-top:var(--spacing-sm)}.changelog-older-toggle{font-family:var(--font-body);color:var(--color-accent);padding:var(--spacing-md) 0;cursor:pointer;align-items:center;gap:6px;font-size:.875rem;font-weight:500;list-style:none;transition:color .2s;display:flex}.changelog-older-toggle::-webkit-details-marker{display:none}.changelog-older-toggle:before{content:"+";transition:transform .3s var(--ease-out);font-size:1.25rem;font-weight:300}.changelog-older[open] .changelog-older-toggle:before{transform:rotate(45deg)}.changelog-older-toggle:hover{color:var(--color-accent-hover)}.changelog-older-entries{animation:faqFadeIn .3s var(--ease-out)}.faq-section{padding:var(--spacing-xl) 0;border-top:1px solid var(--color-mist);position:relative}.faq-list{flex-direction:column;gap:0;display:flex}.faq-item{border-bottom:1px solid var(--color-mist)}.faq-question{font-family:var(--font-display);color:var(--color-ink);padding:var(--spacing-md) 0;cursor:pointer;justify-content:space-between;align-items:center;font-size:1.125rem;font-weight:500;list-style:none;transition:color .2s;display:flex}.faq-question::-webkit-details-marker{display:none}.faq-question:after{content:"+";font-family:var(--font-body);color:var(--color-accent);transition:transform .3s var(--ease-out);font-size:1.5rem;font-weight:300}.faq-item[open] .faq-question:after{transform:rotate(45deg)}.faq-question:hover{color:var(--color-accent)}.faq-answer{padding:0 0 var(--spacing-md);color:var(--color-charcoal);animation:faqFadeIn .3s var(--ease-out);line-height:1.7}.faq-answer p{margin:0 0 var(--spacing-sm)}.faq-answer p:last-child{margin-bottom:0}.faq-answer ul{margin:var(--spacing-sm) 0;padding-left:var(--spacing-md)}.faq-answer li{margin-bottom:var(--spacing-xs)}.faq-answer code{font-family:var(--font-mono);background:var(--color-mist);color:var(--color-ink);border-radius:3px;padding:2px 6px;font-size:.875em}.faq-answer a{color:var(--color-accent);border-bottom:1px solid #0000;text-decoration:none;transition:border-color .2s}.faq-answer a:hover{border-bottom-color:var(--color-accent)}@keyframes faqFadeIn{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.skills-section{padding:var(--spacing-xl) 0;background:var(--color-bg);position:relative;overflow:hidden}.skills-gallery{display:block;position:relative}.gallery-track{gap:var(--spacing-lg);scroll-snap-type:x mandatory;padding:var(--spacing-md) var(--spacing-lg) var(--spacing-xl);-webkit-overflow-scrolling:touch;scrollbar-width:none;cursor:grab;display:flex;overflow-x:auto}.gallery-track:active{cursor:grabbing}.gallery-track::-webkit-scrollbar{display:none}.gallery-frame{scroll-snap-align:center;background:var(--color-paper);border:1px solid var(--color-mist);opacity:.4;max-width:1100px;transition:opacity .6s var(--ease-out), transform .6s var(--ease-out), box-shadow .6s var(--ease-out);border-radius:2px;flex:0 0 80vw;position:relative;overflow:hidden;transform:scale(.95);box-shadow:0 4px 6px -1px #0000000d,0 20px 50px -10px #0000001a}.gallery-frame.active{opacity:1;border-color:var(--color-charcoal);border-width:1px;transform:scale(1);box-shadow:0 20px 25px -5px #0000001a,0 40px 100px -20px #0003}.gallery-content{grid-template-columns:1.2fr 1fr;height:600px;display:grid}@media (max-width:900px){.gallery-frame{flex:0 0 90vw}.gallery-content{grid-template-columns:1fr;height:auto;min-height:600px}}.gallery-visual{background:var(--color-cream);border-right:1px solid var(--color-mist);padding:var(--spacing-lg);justify-content:center;align-items:center;display:flex;position:relative;overflow:hidden}.gallery-info{padding:var(--spacing-xl);flex-direction:column;display:flex;overflow-y:auto}.gallery-header{margin-bottom:var(--spacing-lg)}.gallery-title{font-family:var(--font-display);margin:0 0 var(--spacing-xs);color:var(--color-ink);font-size:2.5rem;font-style:italic}.gallery-meta{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.1em;color:var(--color-ash);font-size:.75rem}.gallery-desc{color:var(--color-charcoal);margin-bottom:var(--spacing-xl);max-width:45ch;font-size:1.125rem;line-height:1.6}.gallery-tags{gap:var(--spacing-xs);flex-wrap:wrap;margin-top:auto;display:flex}.gallery-tag{border:1px solid var(--color-mist);color:var(--color-ash);border-radius:4px;padding:6px 12px;font-size:.8125rem}.gallery-map{margin-top:var(--spacing-lg);justify-content:center;gap:8px;display:flex}.gallery-dot{background:var(--color-mist);cursor:pointer;width:40px;height:2px;font:inherit;border:none;padding:0;transition:all .3s;position:relative}.gallery-dot:after{content:"";position:absolute;inset:-10px 0}.gallery-dot:focus-visible{outline:2px solid var(--color-accent);outline-offset:4px;border-radius:1px}.gallery-dot.active{background:var(--color-accent);height:4px}.demo-tabbed-container{flex-direction:column;display:flex}.demo-tabs{background:var(--color-paper);border-bottom:1px solid var(--color-mist);justify-content:center;gap:0;margin-bottom:0;display:flex}.demo-tab{padding:var(--spacing-sm) var(--spacing-lg);font-family:var(--font-mono);letter-spacing:.05em;text-transform:uppercase;color:var(--color-ash);cursor:pointer;transition:all var(--duration-fast) var(--ease-out);background:0 0;border:none;border-bottom:2px solid #0000;font-size:.75rem;font-weight:500}.demo-tab:hover{color:var(--color-text);background:var(--color-cream)}.demo-tab.active{color:var(--color-accent);border-bottom-color:var(--color-accent);background:var(--color-accent-dim)}.demo-panels{flex:1}.demo-panel{display:none}.demo-panel.active{animation:fadeSlideIn .3s var(--ease-out);display:block}@keyframes fadeSlideIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.demo-container{background:var(--color-paper);border:none;border-radius:0;overflow:hidden}.demo-header{padding:var(--spacing-sm) var(--spacing-md);background:var(--color-paper);border-bottom:1px solid var(--color-mist);justify-content:center;align-items:center;min-height:48px;display:flex}.demo-toggle{align-items:center;gap:var(--spacing-md);display:flex}.demo-toggle-label{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;color:var(--color-ash);transition:color var(--duration-fast) var(--ease-out);cursor:pointer;font-size:.6875rem;font-weight:600}.demo-toggle-label:hover{color:var(--color-text)}.demo-toggle-label.active{color:var(--color-accent)}.demo-toggle-switch{background:var(--color-mist);cursor:pointer;width:44px;height:24px;transition:background var(--duration-fast) var(--ease-out);font:inherit;border:1px solid #0000;border-radius:12px;padding:0;position:relative}.demo-toggle-switch:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.demo-toggle-switch:hover{border-color:var(--color-ash)}.demo-toggle-switch:after{content:"";background:var(--color-paper);width:16px;height:16px;transition:transform var(--duration-base) var(--ease-spring);border-radius:50%;position:absolute;top:3px;left:3px;box-shadow:0 1px 4px #00000026}.demo-toggle-switch.active{background:var(--color-accent)}.demo-toggle-switch.active:after{transform:translate(20px)}.demo-viewport{padding:var(--spacing-xl);background:var(--color-cream);min-height:280px;transition:background var(--duration-base) var(--ease-out);justify-content:center;align-items:center;display:flex}.demo-viewport[data-state=after]{background:var(--color-paper)}.demo-caption{padding:var(--spacing-sm) var(--spacing-md);font-family:var(--font-mono);letter-spacing:.03em;color:var(--color-ash);background:var(--color-paper);text-align:center;font-size:.6875rem}.uxw-demo{width:100%;max-width:320px;padding:var(--spacing-lg);background:var(--color-paper);border:1px solid var(--color-mist);text-align:center;border-radius:6px}.uxw-error-icon{margin-bottom:var(--spacing-sm);font-size:2rem}.uxw-error-title{color:#c00;margin-bottom:var(--spacing-xs);font-weight:600}.uxw-error-text{color:var(--color-ash);font-size:.875rem}.uxw-error-action{margin-top:var(--spacing-sm);color:var(--color-accent);cursor:pointer;font-size:.875rem;text-decoration:underline}.uxw-error-after .uxw-error-icon{color:var(--color-accent)}.uxw-error-after .uxw-error-title{color:var(--color-text)}.uxw-error-after .uxw-error-text{color:var(--color-charcoal)}.uxw-button-context{color:var(--color-charcoal);margin-bottom:var(--spacing-md);font-size:.875rem;font-weight:500}.uxw-button-row{gap:var(--spacing-sm);justify-content:center;display:flex}.uxw-btn{padding:var(--spacing-xs) var(--spacing-md);cursor:pointer;border:none;border-radius:4px;font-size:.875rem;font-weight:500}.uxw-btn-primary{background:var(--color-text);color:var(--color-paper)}.uxw-btn-secondary{color:var(--color-ash);border:1px solid var(--color-mist);background:0 0}.uxw-btn-danger{color:#fff;background:#c00}.uxw-empty-icon{margin-bottom:var(--spacing-sm);opacity:.4;font-size:2.5rem}.uxw-empty-title{color:var(--color-ash);font-weight:500}.uxw-empty-text{color:var(--color-charcoal);margin-top:var(--spacing-xs);font-size:.875rem}.uxw-empty-action{margin-top:var(--spacing-md)}.uxw-empty-after .uxw-empty-icon{opacity:1}.uxw-empty-after .uxw-empty-title{color:var(--color-text)}.spatial-demo{width:100%;max-width:340px;padding:var(--spacing-md);background:var(--color-paper);border:1px solid var(--color-mist);border-radius:6px}.spatial-grid-before{flex-wrap:wrap;gap:6px;display:flex}.spatial-grid-after{gap:var(--spacing-sm);grid-template-columns:1fr 1fr;display:grid}.spatial-card-item{padding:var(--spacing-sm);background:var(--color-bg);border:1px solid var(--color-mist);color:var(--color-charcoal);text-align:center;border-radius:4px;font-size:.8125rem}.spatial-grid-after .spatial-card-item{width:auto!important}.spatial-hierarchy-before .spatial-h-title,.spatial-hierarchy-before .spatial-h-subtitle,.spatial-hierarchy-before .spatial-h-cta,.spatial-hierarchy-before .spatial-h-link{margin-bottom:var(--spacing-xs);color:var(--color-charcoal);font-size:.9375rem}.spatial-hierarchy-after .spatial-h-title{font-family:var(--font-display);margin-bottom:var(--spacing-xs);color:var(--color-text);font-size:1.75rem;font-style:italic;font-weight:300}.spatial-hierarchy-after .spatial-h-subtitle{text-transform:uppercase;letter-spacing:.1em;color:var(--color-ash);margin-bottom:var(--spacing-md);font-size:.6875rem}.spatial-hierarchy-after .spatial-h-cta{padding:var(--spacing-sm) var(--spacing-lg);background:var(--color-text);color:var(--color-paper);margin-bottom:var(--spacing-sm);border-radius:4px;font-size:.875rem;font-weight:500;display:inline-block}.spatial-hierarchy-after .spatial-h-link{color:var(--color-ash);font-size:.75rem}.spatial-whitespace-before{padding:var(--spacing-xs)!important}.spatial-whitespace-before .spatial-ws-title{margin-bottom:2px;font-size:1rem;font-weight:600}.spatial-whitespace-before .spatial-ws-price{color:var(--color-ash);margin-bottom:4px;font-size:.875rem}.spatial-whitespace-before .spatial-ws-features{color:var(--color-ash);margin-bottom:6px;font-size:.75rem}.spatial-whitespace-before .spatial-ws-btn{background:var(--color-text);width:100%;color:var(--color-paper);cursor:pointer;border:none;border-radius:3px;padding:6px;font-size:.75rem}.spatial-whitespace-after{padding:var(--spacing-lg)!important}.spatial-whitespace-after .spatial-ws-title{font-family:var(--font-display);margin-bottom:var(--spacing-sm);font-size:1.5rem;font-weight:400}.spatial-whitespace-after .spatial-ws-price{color:var(--color-text);margin-bottom:var(--spacing-sm);font-size:1.25rem;font-weight:600}.spatial-whitespace-after .spatial-ws-features{color:var(--color-ash);margin-bottom:var(--spacing-lg);font-size:.8125rem;line-height:1.6}.spatial-whitespace-after .spatial-ws-btn{width:100%;padding:var(--spacing-sm);background:var(--color-text);color:var(--color-paper);cursor:pointer;border:none;border-radius:4px;font-size:.875rem;font-weight:500}.motion-demo{align-items:center;gap:var(--spacing-sm);flex-direction:column;width:100%;max-width:280px;display:flex}.motion-stagger-demo{align-items:stretch}.motion-list-item{align-items:center;gap:var(--spacing-sm);padding:var(--spacing-sm) var(--spacing-md);background:var(--color-bg);border:1px solid var(--color-mist);color:var(--color-charcoal);border-radius:4px;font-size:.875rem;display:flex}.motion-dot{background:var(--color-accent);border-radius:50%;width:8px;height:8px}.demo-viewport[data-state=after] .motion-list-item{opacity:0;animation:.35s cubic-bezier(.16,1,.3,1) forwards staggerIn;transform:translateY(12px)}.demo-viewport[data-state=after] .motion-list-item:first-child{animation-delay:0s}.demo-viewport[data-state=after] .motion-list-item:nth-child(2){animation-delay:50ms}.demo-viewport[data-state=after] .motion-list-item:nth-child(3){animation-delay:.1s}.demo-viewport[data-state=after] .motion-list-item:nth-child(4){animation-delay:.15s}@keyframes staggerIn{to{opacity:1;transform:translateY(0)}}.motion-btn{cursor:pointer;border:none;border-radius:4px;padding:12px 24px;font-size:.9375rem;font-weight:500}.motion-btn-before{background:var(--color-charcoal);color:var(--color-paper)}.motion-btn-after{background:var(--color-text);color:var(--color-paper);transition:transform .2s cubic-bezier(.34,1.56,.64,1),box-shadow .2s}.motion-btn-after:hover{transform:translateY(-2px);box-shadow:0 4px 12px #00000026}.motion-btn-after:active{transform:translateY(0)scale(.98)}.motion-card{padding:var(--spacing-md);background:var(--color-bg);border:1px solid var(--color-mist);text-align:center;border-radius:6px;min-width:140px}.motion-card-icon{margin-bottom:var(--spacing-xs);font-size:1.5rem}.motion-card-text{color:var(--color-charcoal);font-size:.8125rem}.motion-card-after{transition:all .3s cubic-bezier(.34,1.56,.64,1)}.demo-viewport[data-state=after] .motion-card-after{background:var(--color-accent)}@supports (color:color-mix(in lab, red, red)){.demo-viewport[data-state=after] .motion-card-after{background:color-mix(in oklch, var(--color-accent) 10%, var(--color-paper))}}.demo-viewport[data-state=after] .motion-card-after{border-color:var(--color-accent)}.demo-viewport[data-state=after] .motion-card-after .motion-card-icon{animation:.4s cubic-bezier(.34,1.56,.64,1) checkPop}@keyframes checkPop{50%{transform:scale(1.3)}}.typo-demo{text-align:left;width:100%;max-width:320px}.typo-pairing-before{font-family:Inter,system-ui,sans-serif}.typo-pairing-before .typo-heading{margin-bottom:var(--spacing-xs);font-size:1.5rem;font-weight:600}.typo-pairing-before .typo-body{color:var(--color-ash);font-size:.9375rem;line-height:1.5}.typo-pairing-after .typo-heading{font-family:var(--font-display);letter-spacing:-.02em;margin-bottom:var(--spacing-sm);color:var(--color-text);font-size:2rem;font-style:italic;font-weight:300}.typo-pairing-after .typo-body{font-family:var(--font-body);color:var(--color-charcoal);font-size:.9375rem;line-height:1.7}.typo-hierarchy-before .typo-h1{margin-bottom:4px;font-size:1.125rem;font-weight:600}.typo-hierarchy-before .typo-meta{color:var(--color-ash);margin-bottom:var(--spacing-xs);font-size:.9375rem}.typo-hierarchy-before .typo-p{color:var(--color-charcoal);font-size:.875rem;line-height:1.5}.typo-hierarchy-after .typo-h1{font-family:var(--font-display);letter-spacing:-.03em;margin-bottom:2px;font-size:2.25rem;font-weight:300;line-height:1.1}.typo-hierarchy-after .typo-meta{text-transform:uppercase;letter-spacing:.12em;color:var(--color-accent);margin-bottom:var(--spacing-md);font-size:.6875rem}.typo-hierarchy-after .typo-p{color:var(--color-ash);font-size:.9375rem;line-height:1.7}.int-demo{gap:var(--spacing-md);flex-direction:column;width:100%;max-width:280px;display:flex}.int-states-demo{gap:var(--spacing-lg)}.int-state-row{align-items:center;gap:var(--spacing-md);display:flex}.int-state-label{text-transform:uppercase;letter-spacing:.08em;color:var(--color-ash);width:40px;font-size:.6875rem}.int-btn{padding:var(--spacing-sm) var(--spacing-md);cursor:pointer;border-radius:4px;flex:1;font-size:.875rem;font-weight:500}.int-btn-poor{background:var(--color-charcoal);color:var(--color-paper);border:none}.int-btn-good{background:var(--color-text);color:var(--color-paper);border:2px solid #0000;transition:all .15s}.int-btn-good:hover{background:var(--color-charcoal)}.int-btn-good:focus{border-color:var(--color-accent);box-shadow:0 0 0 3px var(--color-accent);outline:none}@supports (color:color-mix(in lab, red, red)){.int-btn-good:focus{box-shadow:0 0 0 3px color-mix(in oklch, var(--color-accent) 25%, transparent)}}.int-btn-good:active{transform:scale(.98)}.int-aff-item{padding:var(--spacing-sm) var(--spacing-md);cursor:pointer;border-radius:4px;font-size:.875rem}.int-aff-poor{color:var(--color-charcoal)}.int-aff-good{color:var(--color-accent);text-underline-offset:2px;text-decoration:underline}.int-aff-good:after{content:" →"}.int-affordance-after .int-aff-item{background:var(--color-bg);border:1px solid var(--color-mist);color:var(--color-accent);text-underline-offset:2px;text-decoration:underline;transition:background .15s}.int-affordance-after .int-aff-item:hover{background:var(--color-accent)}@supports (color:color-mix(in lab, red, red)){.int-affordance-after .int-aff-item:hover{background:color-mix(in oklch, var(--color-accent) 5%, var(--color-paper))}}.int-affordance-after .int-aff-item:after{content:" →"}.int-feedback-before,.int-feedback-after{align-items:center;gap:var(--spacing-md);flex-direction:row;display:flex}.int-fb-btn{cursor:pointer;border:none;border-radius:50%;justify-content:center;align-items:center;width:48px;height:48px;display:flex}.int-fb-btn svg{width:22px;height:22px}.int-fb-silent{background:var(--color-mist);color:var(--color-ash)}.int-fb-active{background:var(--color-charcoal);color:var(--color-paper);transition:all .15s cubic-bezier(.34,1.56,.64,1)}.int-fb-active:hover{transform:scale(1.1)}.int-fb-active:active{transform:scale(.95)}.int-fb-active.liked{background:var(--color-accent);animation:.35s cubic-bezier(.34,1.56,.64,1) heartPop}@keyframes heartPop{50%{transform:scale(1.25)}}.int-fb-label{color:var(--color-charcoal);font-size:.875rem}.color-demo{width:100%;max-width:300px}.color-palette-before,.color-palette-after{gap:var(--spacing-xs);padding:var(--spacing-md);background:var(--color-paper);border:1px solid var(--color-mist);border-radius:6px;flex-wrap:wrap;display:flex}.color-swatch{border-radius:4px;width:40px;height:40px;transition:background .2s}.color-card{width:100%;margin-top:var(--spacing-sm);padding:var(--spacing-sm);background:var(--color-paper);border:1px solid var(--color-mist);border-radius:4px;flex-direction:column;gap:4px;display:flex}.color-card span{font-size:.8125rem;font-weight:500;transition:color .2s}.color-card button{cursor:pointer;border:none;border-radius:3px;padding:6px;font-size:.75rem;font-weight:500;transition:all .2s}.color-palette-before .swatch-1{background:#ff6b6b}.color-palette-before .swatch-2{background:#4ecdc4}.color-palette-before .swatch-3{background:#ffe66d}.color-palette-before .swatch-4{background:#95e1d3}.color-palette-before .swatch-5{background:#f38181}.color-palette-before .card-title{color:#ff6b6b}.color-palette-before .card-subtitle{color:#4ecdc4}.color-palette-before .card-btn{color:#333;background:#ffe66d}.color-palette-after .swatch-1{background:var(--color-text)}.color-palette-after .swatch-2{background:var(--color-charcoal)}.color-palette-after .swatch-3{background:var(--color-ash)}.color-palette-after .swatch-4{background:var(--color-mist)}.color-palette-after .swatch-5{background:var(--color-accent)}.color-palette-after .card-title{color:var(--color-text)}.color-palette-after .card-subtitle{color:var(--color-ash)}.color-palette-after .card-btn{background:var(--color-accent);color:var(--color-paper)}.color-accent-card{padding:var(--spacing-md);border-radius:6px}.color-accent-before .color-accent-card{background:#f5f5f5;border:1px solid #e0e0e0}.color-accent-before .color-accent-title{color:#333;margin-bottom:4px;font-weight:600}.color-accent-before .color-accent-text{color:#666;margin-bottom:var(--spacing-sm);font-size:.8125rem}.color-accent-before .color-accent-btn{width:100%;padding:var(--spacing-xs);color:#fff;cursor:pointer;background:#333;border:none;border-radius:4px;font-size:.8125rem}.color-accent-after .color-accent-card{background:var(--color-accent)}@supports (color:color-mix(in lab, red, red)){.color-accent-after .color-accent-card{background:color-mix(in oklch, var(--color-accent) 8%, var(--color-paper))}}.color-accent-after .color-accent-card{border:1px solid var(--color-accent)}@supports (color:color-mix(in lab, red, red)){.color-accent-after .color-accent-card{border:1px solid color-mix(in oklch, var(--color-accent) 20%, var(--color-paper))}}.color-accent-after .color-accent-title{color:var(--color-text);margin-bottom:4px;font-weight:600}.color-accent-after .color-accent-text{color:var(--color-ash);margin-bottom:var(--spacing-sm);font-size:.8125rem}.color-accent-after .color-accent-btn{width:100%;padding:var(--spacing-xs);background:var(--color-accent);color:var(--color-paper);cursor:pointer;border:none;border-radius:4px;font-size:.8125rem;font-weight:500}.color-contrast-static{gap:var(--spacing-sm);flex-direction:column;display:flex}.contrast-example{padding:var(--spacing-md);text-align:center;border-radius:6px}.contrast-fail{color:#a0a0a0;background:#f0f0f0}.contrast-pass{background:var(--color-charcoal);color:var(--color-paper)}.contrast-badge{text-transform:uppercase;letter-spacing:.1em;border-radius:2px;margin-bottom:4px;padding:2px 6px;font-size:.5625rem;font-weight:600;display:inline-block}.contrast-fail .contrast-badge{background:#ddd}.contrast-pass .contrast-badge{background:var(--color-accent);color:var(--color-paper)}.contrast-text{margin-bottom:2px;font-size:1rem;font-weight:500}.contrast-ratio{opacity:.7;font-size:.6875rem}.resp-demo{width:100%;max-width:340px}.resp-touch-demo{gap:var(--spacing-lg);flex-direction:column;display:flex}.resp-touch-row{align-items:center;gap:var(--spacing-md);display:flex}.resp-label{text-transform:uppercase;letter-spacing:.08em;color:var(--color-ash);width:70px;font-size:.6875rem}.resp-touch-targets{gap:4px;display:flex}.resp-touch-targets button{cursor:pointer;border:none;border-radius:4px;font-weight:500}.resp-touch-bad button{background:var(--color-mist);width:24px;height:24px;color:var(--color-ash);font-size:.75rem}.resp-touch-good button{background:var(--color-text);width:44px;height:44px;color:var(--color-paper);font-size:1rem}.resp-fluid-demo{padding:var(--spacing-md);background:var(--color-bg);border:1px solid var(--color-mist);border-radius:6px}.resp-fluid-container{gap:var(--spacing-md);flex-direction:column;display:flex}.resp-fluid-fixed,.resp-fluid-adaptive{color:var(--color-ash);font-size:.75rem}.resp-fluid-fixed span,.resp-fluid-adaptive span{margin-bottom:4px;display:block}.resp-fluid-bar{background:var(--color-mist);border-radius:4px;height:24px}.resp-fluid-adaptive .resp-fluid-bar{background:var(--color-accent)}.resp-adapt-demo{gap:var(--spacing-sm);align-items:flex-end;display:flex}.resp-device{text-align:center}.resp-device>span{color:var(--color-ash);text-transform:uppercase;letter-spacing:.08em;margin-top:4px;font-size:.625rem;display:block}.resp-device-screen{background:var(--color-paper);border:2px solid var(--color-mist);border-radius:4px;flex-direction:column;gap:3px;padding:4px;display:flex}.resp-device-mobile .resp-device-screen{width:50px;height:80px}.resp-device-tablet .resp-device-screen{width:80px;height:60px}.resp-device-desktop .resp-device-screen{width:120px;height:70px}.resp-block{background:var(--color-mist);border-radius:2px}.resp-block-row{flex:1;gap:3px;display:flex}.resp-header{background:var(--color-charcoal);height:16px}.resp-sidebar{background:var(--color-charcoal);width:30%}.resp-content{flex:1}@keyframes fadeIn{to{opacity:1}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}*,:before,:after{box-sizing:border-box}*{margin:0}img,picture,video,canvas,svg{max-width:100%;display:block}button,input,textarea,select{font:inherit}:root{--font-display:"Cormorant Garamond", Georgia, serif;--font-body:"Instrument Sans", system-ui, sans-serif;--font-mono:"Space Grotesk", monospace;--spacing-xs:8px;--spacing-sm:16px;--spacing-md:24px;--spacing-lg:32px;--spacing-xl:48px;--spacing-2xl:80px;--spacing-3xl:120px;--width-max:1400px;--width-content:900px;--ease-out:cubic-bezier(.16, 1, .3, 1);--ease-in-out:cubic-bezier(.65, 0, .35, 1);--ease-spring:cubic-bezier(.34, 1.56, .64, 1);--duration-fast:.15s;--duration-base:.3s;--duration-slow:.6s;--duration-slower:.8s;--duration-slowest:1.2s;--color-ink:oklch(10% 0 0);--color-text:oklch(10% 0 0);--color-paper:oklch(98% 0 0);--color-cream:oklch(96% .005 350);--color-charcoal:oklch(25% 0 0);--color-ash:oklch(55% 0 0);--color-mist:oklch(92% 0 0);--color-bg:oklch(96% .005 350);--color-accent:oklch(60% .25 350);--color-accent-hover:oklch(52% .25 350);--color-accent-dim:oklch(60% .25 350/.15);--color-accent-soft:oklch(60% .25 350/.25);--cat-diagnostic-bg:#fdf4ff;--cat-diagnostic-border:#d946ef;--cat-diagnostic-text:#a21caf;--cat-quality-bg:#f0fdf4;--cat-quality-border:#22c55e;--cat-quality-text:#15803d;--cat-intensity-bg:#fffbeb;--cat-intensity-border:#f59e0b;--cat-intensity-text:#b45309;--cat-adaptation-bg:#eff6ff;--cat-adaptation-border:#3b82f6;--cat-adaptation-text:#1d4ed8;--cat-enhancement-bg:#fdf2f8;--cat-enhancement-border:#ec4899;--cat-enhancement-text:#be185d;--cat-system-bg:#f5f5f4;--cat-system-border:#78716c;--cat-system-text:#44403c}.skip-link{z-index:10000;padding:var(--spacing-sm) var(--spacing-lg);background:var(--color-ink);color:var(--color-paper);border-radius:0 0 8px 8px;font-weight:600;text-decoration:none;transition:top .2s;position:absolute;top:-100%;left:50%;transform:translate(-50%)}.skip-link:focus{outline:2px solid var(--color-accent);outline-offset:2px;top:0}.section-nav{bottom:var(--spacing-md);z-index:100;-webkit-backdrop-filter:blur(12px);border:1px solid var(--color-mist);opacity:0;pointer-events:none;transition:opacity .4s var(--ease-out), transform .4s var(--ease-out);background:oklch(98% 0 0/.85);border-radius:100px;align-items:center;gap:2px;padding:4px;display:flex;position:fixed;left:50%;transform:translate(-50%)translateY(20px);box-shadow:0 4px 24px -4px #0000001f,0 1px 3px #0000000f}.section-nav.is-visible{opacity:1;pointer-events:auto;transform:translate(-50%)translateY(0)}.section-nav-item{border-radius:100px;align-items:center;gap:4px;padding:8px 12px;text-decoration:none;transition:background .2s,color .2s;display:flex}.section-nav-item:hover{background:var(--color-mist);text-decoration:none}.section-nav-item.is-active{background:var(--color-ink)}.section-nav-item.is-active .section-nav-num,.section-nav-item.is-active .section-nav-label{color:var(--color-paper)}.section-nav-num{font-family:var(--font-mono);color:var(--color-ash);letter-spacing:.02em;font-size:.5625rem;font-weight:500;transition:color .2s}.section-nav-label{font-family:var(--font-body);color:var(--color-charcoal);white-space:nowrap;font-size:.6875rem;font-weight:500;transition:color .2s}@media (max-width:700px){.section-nav-label{display:none}.section-nav-item{padding:8px 10px}}@media (max-width:400px){.section-nav{display:none}}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizelegibility;overflow-x:clip}body{font-family:var(--font-body);color:var(--color-text);background:var(--color-paper);min-height:100dvh;font-size:16px;line-height:1.625;overflow-x:clip}h1,h2,h3,h4,h5,h6{font-family:var(--font-display);letter-spacing:-.02em;color:var(--color-ink);font-weight:400;line-height:1.1}a{color:var(--color-accent);text-underline-offset:2px;transition:color var(--duration-fast) var(--ease-out), text-decoration-color var(--duration-fast) var(--ease-out);text-decoration:underline;text-decoration-thickness:1px}a:hover{color:var(--color-accent-hover);text-decoration-thickness:2px}.btn,.footer-logo,[class*=nav-item]{text-decoration:none}strong{color:var(--color-ink);font-weight:600}code{font-family:var(--font-mono);background:var(--color-accent-dim);color:var(--color-accent);border-radius:4px;padding:.15em .4em;font-size:.9em}::selection{background:var(--color-accent-soft);color:var(--color-ink)}.grain-overlay{pointer-events:none;z-index:9999;opacity:.03;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");background-repeat:repeat;position:fixed;inset:0}.site-content{max-width:var(--width-max);padding:0 var(--spacing-lg);margin:0 auto}@media (max-width:768px){.site-content{padding:0 var(--spacing-md)}}.section-header{margin-bottom:var(--spacing-lg);position:relative}.section-number{font-family:var(--font-mono);letter-spacing:.05em;color:var(--color-ash);margin-bottom:var(--spacing-xs);text-transform:uppercase;font-size:.625rem;font-weight:500;display:block}.section-title{margin:0;font-size:clamp(1.75rem,4vw,2.5rem);font-weight:400;line-height:1.2}.section-subtitle{color:var(--color-charcoal);margin-top:var(--spacing-sm);max-width:55ch;font-size:1rem;line-height:1.6}.cheatsheet-link{color:var(--color-accent);margin-left:.5em;font-size:.875rem;text-decoration:none}.cheatsheet-link:hover{text-decoration:underline}.section-lead{color:var(--color-charcoal);max-width:55ch;margin-bottom:var(--spacing-lg);font-size:1rem;line-height:1.6}.hero-combined{min-height:100dvh;padding:var(--spacing-lg) 0 var(--spacing-2xl);background:var(--color-paper);flex-direction:column;justify-content:center;display:flex;position:relative}.github-link{top:var(--spacing-md);right:var(--spacing-lg);z-index:10;color:var(--color-ash);align-items:center;gap:6px;text-decoration:none;transition:color .2s;display:flex;position:absolute}.github-link:hover{color:var(--color-ink);text-decoration:none}.github-stars{font-family:var(--font-mono);color:var(--color-ash);font-size:.75rem;font-weight:500;transition:color .2s}.github-link:hover .github-stars{color:var(--color-ink)}.hero-combined-container{max-width:var(--width-max);padding:0 var(--spacing-lg);gap:var(--spacing-xl);grid-template-columns:1fr 1fr;align-items:center;width:100%;margin:0 auto;display:grid}@media (max-width:1024px){.hero-combined-container{gap:var(--spacing-lg);text-align:center;grid-template-columns:1fr}}.hero-combined-left{gap:var(--spacing-md);flex-direction:column;display:flex}@media (max-width:1024px){.hero-combined-left{align-items:center}}.hero-title-combined{font-family:var(--font-display);letter-spacing:-.02em;color:var(--color-ink);margin:0;font-size:clamp(2.5rem,7vw,4.5rem);font-style:italic;font-weight:300;line-height:1}.hero-tagline-combined{font-family:var(--font-display);color:var(--color-charcoal);margin:0;font-size:clamp(1.125rem,2.5vw,1.75rem);font-style:italic;font-weight:400;line-height:1.3}.hero-hook-text{color:var(--color-charcoal);max-width:45ch;margin:0;font-size:1rem;line-height:1.6}.hero-included-box{border:1px solid var(--color-mist);background:0 0;flex-direction:column;gap:6px;max-width:45ch;padding:10px 14px;display:flex}.hero-included-title{font-family:var(--font-body);text-transform:uppercase;letter-spacing:.1em;color:var(--color-ash);font-size:.5625rem;font-weight:500}.hero-included-items{color:var(--color-charcoal);flex-wrap:wrap;align-items:center;gap:6px;font-size:.8125rem;line-height:1.5;display:flex}.hero-included-items em{font-style:normal;font-family:var(--font-mono);font-size:.75rem}.hero-included-sep{color:var(--color-mist)}@media (max-width:500px){.hero-included-items{flex-direction:column;align-items:flex-start;gap:4px}.hero-included-sep{display:none}}.hero-cta-group{align-items:center;gap:var(--spacing-lg);margin-top:var(--spacing-sm);display:flex}@media (max-width:600px){.hero-cta-group{gap:var(--spacing-md);flex-direction:column}}.hero-cta-combined{padding:var(--spacing-sm) var(--spacing-xl);font-family:var(--font-body);letter-spacing:.05em;text-transform:uppercase;color:var(--color-paper);background:var(--color-ink);border:none;font-size:.9rem;font-weight:500;text-decoration:none;transition:transform .2s,background .2s;display:inline-block}.hero-cta-combined:hover{background:var(--color-accent);color:var(--color-paper);transform:translateY(-2px)}.hero-logos-inline{flex-direction:column;align-items:flex-start;gap:6px;display:flex}.hero-logos-inline .hero-logos-label{color:var(--color-ash);letter-spacing:.03em;font-size:.6875rem}.hero-logos-inline .hero-logos-row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.hero-logos-inline .hero-logos-row img{opacity:.7;border-radius:4px;transition:opacity .2s}.hero-logos-inline .hero-logos-row img:hover{opacity:1}.hero-combined-right{justify-content:center;display:flex}.hero-combined-right .split-comparison{width:100%;max-width:520px}.hero-combined-right .split-container{max-width:100%}.hero-bias-tags{align-items:center;gap:var(--spacing-xs);margin-top:var(--spacing-lg);padding-top:var(--spacing-md);border-top:1px solid var(--color-mist);max-width:var(--width-max);width:100%;padding-bottom:var(--spacing-md);flex-direction:column;margin-left:auto;margin-right:auto;display:flex}.problem-section{padding:var(--spacing-2xl) 0;border-top:1px solid var(--color-mist)}.problem-content{gap:var(--spacing-xl);display:grid}.split-comparison{width:100%;max-width:600px;margin:-20px auto;padding:20px;position:relative}.split-container{background:var(--color-cream);border:1px solid var(--color-mist);cursor:ew-resize;-webkit-user-select:none;user-select:none;border-radius:12px;width:100%;max-width:500px;height:380px;margin:0 auto;position:relative;overflow:hidden}.split-before,.split-after{justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.split-before{z-index:1}.split-content{justify-content:center;align-items:center;width:100%;height:100%;display:flex}.split-after{clip-path:polygon(58% 0%,100% 0%,100% 100%,42% 100%);z-index:2;background:var(--color-paper)}.split-divider{background:var(--color-accent);pointer-events:none;z-index:3;width:3px;position:absolute;top:0;bottom:0;left:50%;transform:translate(-50%)skew(-10deg);box-shadow:0 0 20px #00000026}.split-label{letter-spacing:.08em;text-transform:uppercase;color:var(--color-paper);background:var(--color-accent);white-space:nowrap;border-radius:4px;padding:6px 14px;font-size:.6875rem;font-weight:600;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)skew(10deg);box-shadow:0 2px 8px #0003}.slop-card{background:linear-gradient(135deg,#f5f3ff 0%,#ede9fe 50%,#ddd6fe 100%);border-radius:16px;flex-direction:column;width:280px;height:280px;padding:24px;font-family:Inter,system-ui,sans-serif;display:flex;box-shadow:0 4px 6px -1px #0000001a}.slop-header{align-items:center;gap:12px;margin-bottom:16px;display:flex}.slop-avatar{background:linear-gradient(135deg,#8b5cf6,#7c3aed);border-radius:50%;flex-shrink:0;width:40px;height:40px}.slop-text{flex:1}.slop-title{color:#1f2937;margin-bottom:2px;font-size:14px;font-weight:600}.slop-subtitle{color:#6b7280;font-size:12px}.slop-body{color:#4b5563;flex:1;margin-bottom:auto;font-size:13px;line-height:1.5}.slop-button{color:#fff;cursor:pointer;background:linear-gradient(135deg,#8b5cf6,#7c3aed);border:none;border-radius:8px;width:100%;margin-top:auto;padding:10px 20px;font-family:Inter,system-ui,sans-serif;font-size:13px;font-weight:500}.slop-callouts{pointer-events:none;position:absolute;inset:0}.slop-callout{text-transform:uppercase;letter-spacing:.06em;color:var(--color-accent);background:var(--color-paper);border:1px solid var(--color-accent);white-space:nowrap;opacity:0;animation:calloutFadeIn .4s var(--ease-out) forwards;border-radius:3px;padding:4px 8px;font-size:.625rem;font-weight:600;position:absolute;box-shadow:0 2px 8px #0000001a}.slop-callout[data-point=font]{animation-delay:.1s;top:15%;right:5%}.slop-callout[data-point=gradient]{animation-delay:.25s;top:40%;left:5%}.slop-callout[data-point=copy]{animation-delay:.4s;bottom:35%;right:8%}.slop-callout[data-point=rounded]{animation-delay:.55s;bottom:12%;left:10%}@keyframes calloutFadeIn{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.impeccable-card{background:var(--color-paper);border:1px solid var(--color-mist);width:280px;height:300px;padding:var(--spacing-lg);text-align:left;flex-direction:column;display:flex}.impeccable-eyebrow{font-family:var(--font-mono);letter-spacing:.15em;text-transform:uppercase;color:var(--color-accent);margin-bottom:var(--spacing-xs);font-size:.625rem;font-weight:500}.impeccable-title{font-family:var(--font-display);color:var(--color-ink);margin-bottom:var(--spacing-sm);font-size:1.75rem;font-style:italic;font-weight:300;line-height:1.1}.impeccable-body{color:var(--color-ash);flex:1;margin-bottom:auto;font-size:.875rem;line-height:1.6}.impeccable-button{margin-top:var(--spacing-sm);background:var(--color-ink);color:var(--color-paper);font-family:var(--font-body);letter-spacing:.03em;cursor:pointer;transition:all var(--duration-base) var(--ease-out);border:none;align-self:flex-start;padding:.625rem 1.5rem;font-size:.8125rem;font-weight:500;display:inline-flex}.impeccable-button:hover{background:var(--color-accent)}.split-labels{justify-content:center;gap:var(--spacing-xl);margin-top:var(--spacing-md);display:flex}.split-label-item{align-items:center;gap:var(--spacing-xs);color:var(--color-ash);font-size:.8125rem;display:flex}.split-label-dot{background:var(--color-mist);border-radius:50%;width:8px;height:8px}.split-label-dot--accent{background:var(--color-accent)}.solution-section{padding:var(--spacing-2xl) 0}.solution-content{gap:var(--spacing-lg);display:grid}.solution-content .section-lead{margin-bottom:0}.solution-visual{gap:var(--spacing-lg);grid-template-columns:1fr auto 1fr;align-items:stretch;display:grid}@media (max-width:900px){.solution-visual{gap:var(--spacing-md);grid-template-columns:1fr}}.solution-visual-interactive{background:var(--color-paper);border:1px solid var(--color-mist);border-radius:8px;width:100%;min-height:380px;position:relative;overflow:hidden}.solution-pillar{background:var(--color-cream);border:1px solid var(--color-mist);padding:var(--spacing-lg);transition:all var(--duration-base) var(--ease-out)}.solution-pillar:hover{border-color:var(--color-accent);box-shadow:0 20px 60px var(--color-accent-dim);transform:translateY(-4px)}.pillar-header{text-align:center;margin-bottom:var(--spacing-lg);padding-bottom:var(--spacing-md);border-bottom:1px solid var(--color-mist)}.pillar-icon{background:var(--color-accent-dim);width:56px;height:56px;color:var(--color-accent);margin-bottom:var(--spacing-sm);border-radius:50%;justify-content:center;align-items:center;display:inline-flex}.pillar-title{font-family:var(--font-display);margin:0 0 var(--spacing-xs);font-size:1.75rem;font-weight:400}.pillar-subtitle{color:var(--color-ash);margin:0;font-size:.875rem}.pillar-content{gap:var(--spacing-sm);flex-direction:column;display:flex}.pillar-item{padding:var(--spacing-sm);background:var(--color-paper);transition:all var(--duration-fast) var(--ease-out);border-radius:4px;justify-content:space-between;align-items:center;display:flex}.pillar-item:hover{background:var(--color-accent-dim)}.pillar-item-name{color:var(--color-ink);font-size:.9375rem;font-weight:500}.pillar-item-code{font-family:var(--font-mono);color:var(--color-accent);background:0 0;padding:0;font-size:.875rem;font-weight:500}.pillar-item-desc{color:var(--color-ash);font-size:.75rem}.pillar-item--more{color:var(--color-accent);border:1px dashed var(--color-mist);background:0 0;justify-content:center;font-size:.8125rem;font-weight:500}.solution-connector{justify-content:center;align-items:center;display:flex}.connector-plus{font-family:var(--font-display);color:var(--color-accent);opacity:.5;font-size:3rem;font-weight:300}@media (max-width:900px){.solution-connector{padding:var(--spacing-sm) 0}.connector-plus{font-size:2rem}}.skills-section{padding:var(--spacing-2xl) 0;border-top:1px solid var(--color-mist)}.skills-gallery{gap:var(--spacing-xl);grid-template-columns:200px 1fr;align-items:start;display:grid}@media (max-width:968px){.skills-gallery{gap:var(--spacing-lg);grid-template-columns:1fr}}.skills-nav{top:var(--spacing-lg);flex-direction:column;gap:2px;display:flex;position:sticky}@media (max-width:968px){.skills-nav{gap:var(--spacing-xs);flex-flow:wrap;position:static}}.skill-nav-item{padding:var(--spacing-sm) var(--spacing-md);color:var(--color-ash);font-family:var(--font-body);cursor:pointer;text-align:left;background:0 0;border:none;border-left:2px solid #0000;font-size:.9375rem;font-weight:400;text-decoration:none;transition:all .2s;display:block}.skill-nav-item:hover{color:var(--color-text);background:var(--color-cream)}.skill-nav-item.active{color:var(--color-accent);border-left-color:var(--color-accent);background:var(--color-accent-dim);font-weight:500}@media (max-width:968px){.skill-nav-item{padding:var(--spacing-xs) var(--spacing-md);border-bottom:2px solid #0000;border-left:none}.skill-nav-item.active{border-bottom-color:var(--color-accent)}}.skills-showcase{gap:var(--spacing-lg);grid-template-columns:1.2fr 1fr;align-items:start;display:grid}@media (max-width:1100px){.skills-showcase{grid-template-columns:1fr}}.loading-state{padding:var(--spacing-xl);text-align:center;color:var(--color-ash);font-style:italic}.mobile-commands-layout{display:none}@media (max-width:900px){.mobile-commands-layout{gap:var(--spacing-md);flex-direction:column;display:flex}.commands-container{display:none}}.mobile-carousel-wrapper{-webkit-overflow-scrolling:touch;scrollbar-width:none;padding:var(--spacing-xs) 0;overflow-x:auto}.mobile-carousel-wrapper::-webkit-scrollbar{display:none}.mobile-carousel{gap:var(--spacing-xs);padding-right:var(--spacing-md);display:flex}.mobile-cmd-pill{padding:var(--spacing-sm) var(--spacing-md);min-height:44px;font-family:var(--font-mono);color:var(--color-ash);background:var(--color-cream);border:1px solid var(--color-mist);cursor:pointer;white-space:nowrap;border-radius:100px;flex-shrink:0;font-size:.8125rem;font-weight:500;transition:all .2s}.mobile-cmd-pill:hover{color:var(--color-charcoal);border-color:var(--color-charcoal)}.mobile-cmd-pill.active{color:var(--color-paper);background:var(--color-ink);border-color:var(--color-ink)}.mobile-demo-area{background:var(--color-cream);border:1px solid var(--color-mist);padding:var(--spacing-sm);border-radius:8px}.mobile-demo-area .demo-split-comparison{width:100%}.mobile-demo-area .split-container{width:100%;max-width:100%;height:320px}.mobile-demo-area .demo-caption{margin-top:var(--spacing-sm);font-size:.75rem}.mobile-info-area{padding-top:var(--spacing-sm)}.mobile-cmd-info{padding:var(--spacing-sm) 0;display:none}.mobile-cmd-info.active{display:block}.mobile-cmd-name{font-family:var(--font-mono);color:var(--color-ink);margin:0 0 var(--spacing-xs) 0;font-size:1.125rem;font-weight:600}.mobile-cmd-desc{color:var(--color-charcoal);margin:0;font-size:.875rem;line-height:1.5}.mobile-cmd-rel{margin-top:var(--spacing-xs);color:var(--color-ash);font-size:.75rem}.mobile-cmd-rel code{font-family:var(--font-mono);color:var(--color-ink)}.downloads-section{padding:var(--spacing-2xl) 0;border-top:1px solid var(--color-mist)}.downloads-grid{gap:var(--spacing-lg);grid-template-columns:repeat(auto-fit,minmax(280px,1fr));display:grid}.download-card{text-align:center;padding:var(--spacing-lg);background:var(--color-cream);border:1px solid var(--color-mist);transition:all var(--duration-base) var(--ease-out);flex-direction:column;align-items:center;display:flex}.download-card:hover{border-color:var(--color-accent);box-shadow:0 20px 60px var(--color-accent-dim);transform:translateY(-4px)}.download-card-icon{margin-bottom:var(--spacing-sm)}.download-card-icon img{object-fit:contain;border-radius:8px;width:40px;height:40px}.download-card-title{font-family:var(--font-display);margin:0 0 var(--spacing-sm) 0;font-size:1.25rem;font-weight:400}.download-card-note{color:var(--color-ash);margin-bottom:var(--spacing-xs);font-size:.75rem}.download-card .btn{margin-top:var(--spacing-xs)}.install-command{align-items:center;gap:var(--spacing-xs);background:var(--color-paper);border:1px solid var(--color-mist);padding:var(--spacing-sm);margin-top:var(--spacing-sm);border-radius:6px;width:100%;display:flex}.install-command code{font-family:var(--font-mono);color:var(--color-ink);white-space:nowrap;text-overflow:ellipsis;background:0 0;flex:1;padding:0;font-size:.75rem;overflow:hidden}.copy-btn{border:1px solid var(--color-mist);width:28px;height:28px;color:var(--color-ash);cursor:pointer;transition:all var(--duration-fast) var(--ease-out);background:0 0;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;display:flex}.copy-btn:hover{background:var(--color-accent-dim);border-color:var(--color-accent);color:var(--color-accent)}.copy-btn.copied{background:var(--color-accent);border-color:var(--color-accent);color:var(--color-paper)}.install-hint{color:var(--color-ash);margin:var(--spacing-xs) 0 0 0;font-size:.75rem}.install-hint code{font-family:var(--font-mono);background:var(--color-mist);border-radius:3px;padding:2px 5px;font-size:.6875rem}.download-card-details{width:100%;margin-top:var(--spacing-sm);text-align:left;font-size:.8125rem}.download-card-details summary{cursor:pointer;color:var(--color-ash);padding:var(--spacing-xs) 0;justify-content:center;align-items:center;gap:4px;font-size:.75rem;list-style:none;display:flex}.download-card-details summary:before{content:"▶";transition:transform var(--duration-fast) var(--ease-out);font-size:.5rem}.download-card-details[open] summary:before{transform:rotate(90deg)}.download-card-details summary::-webkit-details-marker{display:none}.download-card-details ol{margin:var(--spacing-sm) 0;padding-left:var(--spacing-md);color:var(--color-charcoal);line-height:1.6}.download-card-details li{margin-bottom:4px}.download-card-details code{font-family:var(--font-mono);background:var(--color-mist);border-radius:3px;padding:2px 5px;font-size:.6875rem}.download-card-details a{color:var(--color-accent);font-size:.75rem;text-decoration:none}.download-card-details a:hover{text-decoration:underline}.opensource-section{padding:var(--spacing-2xl) 0;border-top:1px solid var(--color-mist);text-align:center}.opensource-content{align-items:center;gap:var(--spacing-md);flex-direction:column;max-width:500px;margin:0 auto;display:flex}.opensource-title{font-size:clamp(1.5rem,4vw,2rem);font-weight:300}.opensource-desc{color:var(--color-ash);font-size:1.125rem;line-height:1.6}.site-footer{border-top:1px solid var(--color-mist);padding:var(--spacing-xl) var(--spacing-lg);background:var(--color-cream)}.footer-content{max-width:var(--width-max);justify-content:space-between;align-items:center;gap:var(--spacing-lg);flex-wrap:wrap;margin:0 auto;display:flex}@media (max-width:768px){.footer-content{text-align:center;flex-direction:column}}.footer-brand{gap:var(--spacing-xs);flex-direction:column;display:flex}.footer-logo{font-family:var(--font-display);color:var(--color-ink);font-size:1.25rem;font-weight:400}.footer-tagline{color:var(--color-ash);font-size:.875rem}.footer-links{gap:var(--spacing-lg);flex-wrap:wrap;display:flex}.footer-links a{color:var(--color-ash);transition:color var(--duration-fast) var(--ease-out);font-size:.875rem}.footer-links a:hover{color:var(--color-accent)}.footer-author{justify-content:center;align-items:center;gap:var(--spacing-md);width:100%;padding-top:var(--spacing-lg);margin-top:var(--spacing-md);border-top:1px solid var(--color-mist);flex-wrap:wrap;display:flex}.footer-author-label{color:var(--color-ash);font-size:.875rem}.footer-author-label a{color:var(--color-text);transition:color var(--duration-fast) var(--ease-out)}.footer-author-label a:hover{color:var(--color-accent)}.footer-author-links{align-items:center;gap:var(--spacing-sm);display:flex}.footer-social-link{width:36px;height:36px;color:var(--color-ash);transition:all var(--duration-fast) var(--ease-out);background:0 0;border-radius:50%;justify-content:center;align-items:center;text-decoration:none;display:flex}.footer-social-link:hover{color:var(--color-accent);background:var(--color-accent-dim)}.footer-author-divider{background:var(--color-mist);width:1px;height:20px;margin:0 var(--spacing-xs)}.footer-newsletter{color:var(--color-text);background:var(--color-paper);border:1px solid var(--color-mist);transition:all var(--duration-fast) var(--ease-out);border-radius:100px;align-items:center;gap:6px;padding:8px 14px;font-size:.875rem;font-weight:500;text-decoration:none;display:inline-flex}.footer-newsletter:hover{border-color:var(--color-accent);color:var(--color-accent)}.footer-newsletter svg{transition:transform var(--duration-fast) var(--ease-out)}.footer-newsletter:hover svg{transform:translate(3px)}@media (max-width:768px){.footer-author{gap:var(--spacing-sm);flex-direction:column}.footer-author-divider{display:none}}.btn{justify-content:center;align-items:center;gap:var(--spacing-xs);font-family:var(--font-body);letter-spacing:.03em;cursor:pointer;transition:all var(--duration-base) var(--ease-out);border:none;padding:1rem 2rem;font-size:.9375rem;font-weight:600;text-decoration:none;display:inline-flex;position:relative;overflow:hidden}.btn-primary{background:var(--color-ink);color:var(--color-paper)}.btn-primary:before{content:"";background:var(--color-accent);transition:transform var(--duration-base) var(--ease-out);z-index:0;position:absolute;inset:0;transform:translateY(100%)}.btn-primary:hover:before{transform:translateY(0)}.btn-primary:hover{color:var(--color-paper)}.btn-primary span,.btn-primary svg,.btn-primary:not(:has(span)){z-index:1;position:relative}.btn-secondary{color:var(--color-ink);border:1px solid var(--color-ink);background:0 0}.btn-secondary:hover{background:var(--color-ink);color:var(--color-paper)}.btn:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.btn-primary:focus-visible{outline-color:var(--color-paper);box-shadow:0 0 0 4px var(--color-accent)}.btn-secondary:focus-visible{outline-color:var(--color-accent)}@keyframes revealUp{to{opacity:1;transform:translateY(0)}}@keyframes float{0%,to{transform:translate(-50%)translateY(0)}50%{transform:translate(-50%)translateY(-8px)}}@keyframes bounce{0%,to{transform:translateY(0)}50%{transform:translateY(4px)}}[data-reveal]{opacity:0;transition:opacity .8s var(--ease-out), transform .8s var(--ease-out);transform:translateY(30px)}[data-reveal].revealed{opacity:1;transform:translateY(0)}[data-reveal]:first-child{transition-delay:0s}[data-reveal]:nth-child(2){transition-delay:.1s}[data-reveal]:nth-child(3){transition-delay:.2s}[data-reveal]:nth-child(4){transition-delay:.3s}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}html{scroll-behavior:auto}.hero-canvas{display:none}.hero-scroll-indicator{opacity:1;animation:none}[data-reveal],.gallery-frame{opacity:1;transform:none}}.load-error{text-align:center;padding:var(--spacing-2xl) var(--spacing-lg);justify-content:center;align-items:center;gap:var(--spacing-md);background:var(--color-cream);border:1px solid var(--color-mist);border-radius:8px;flex-direction:column;display:flex}.load-error-icon{color:var(--color-accent);font-size:2.5rem}.load-error-title{font-family:var(--font-display);color:var(--color-ink);margin:0;font-size:1.5rem;font-weight:400}.load-error-text{color:var(--color-ash);max-width:40ch;font-size:1rem;line-height:1.5}.load-error-retry{margin-top:var(--spacing-sm)}.bias-tags{align-items:center;gap:var(--spacing-sm);margin-top:var(--spacing-lg);flex-direction:column;display:flex}.bias-tags-label{font-family:var(--font-mono);letter-spacing:.1em;text-transform:uppercase;color:var(--color-ash);font-size:.6875rem;font-weight:500}.bias-tags-list{justify-content:center;gap:var(--spacing-xs);flex-wrap:wrap;display:flex}.bias-tag{background:var(--color-cream);border:1px solid var(--color-mist);color:var(--color-charcoal);transition:all var(--duration-fast) var(--ease-out);padding:6px 12px;font-size:.75rem;font-weight:500}.bias-tag:hover{border-color:var(--color-accent);color:var(--color-accent)}.antidote-section{padding:var(--spacing-2xl) 0;border-top:1px solid var(--color-mist)}.patterns-categories{margin-bottom:var(--spacing-xl)}.pattern-tabs{gap:var(--spacing-xs);margin-bottom:var(--spacing-lg);flex-wrap:wrap;display:flex}.pattern-tab{font-family:var(--font-body);color:var(--color-ash);padding:var(--spacing-xs) var(--spacing-sm);cursor:pointer;transition:color var(--duration-fast) var(--ease-out), border-color var(--duration-fast) var(--ease-out);background:0 0;border:none;border-bottom:2px solid #0000;font-size:.875rem}.pattern-tab:hover{color:var(--color-charcoal)}.pattern-tab.active{color:var(--color-ink);border-bottom-color:var(--color-accent);font-weight:500}.pattern-tab:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px;border-radius:4px}.pattern-panel{display:none}.pattern-panel.active{display:block}.pattern-columns{gap:var(--spacing-xl);grid-template-columns:1fr 1fr;display:grid}@media (max-width:768px){.pattern-columns{gap:var(--spacing-md);grid-template-columns:1fr}}.pattern-column-label{text-transform:uppercase;letter-spacing:.1em;margin-bottom:var(--spacing-sm);color:var(--color-ash);font-size:.6875rem;font-weight:600;display:block}.pattern-column--anti .pattern-column-label{color:var(--color-accent)}.pattern-column--do .pattern-column-label{color:var(--color-success,#22c55e)}.pattern-list{gap:var(--spacing-xs);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.pattern-item{padding-left:var(--spacing-md);font-size:.8125rem;line-height:1.5;position:relative}.pattern-item--anti{color:var(--color-ash)}.pattern-item--anti:before{content:"×";color:var(--color-accent);font-weight:600;position:absolute;left:0}.pattern-item--do{color:var(--color-charcoal)}.pattern-item--do:before{content:"✓";color:var(--color-success,#22c55e);font-weight:600;position:absolute;left:0}.contribute-inline{color:var(--color-ash);margin-top:var(--spacing-md);font-size:.875rem}.contribute-inline a{color:var(--color-accent);text-decoration:none}.contribute-inline a:hover{text-decoration:underline}.critique-callout{border-top:1px solid var(--color-mist);padding-top:var(--spacing-md);margin-bottom:var(--spacing-md);align-items:baseline;gap:var(--spacing-sm);color:var(--color-ash);flex-wrap:wrap;font-size:.8125rem;line-height:1.55;display:flex}.critique-callout-body{display:contents}.critique-callout-title{display:none}.critique-callout-text{color:var(--color-ash)}.critique-callout-text code{font-family:var(--font-mono);color:var(--color-charcoal);font-size:.8125rem}.critique-callout-links{gap:var(--spacing-sm);flex-shrink:0;display:flex}.critique-callout-link{color:var(--color-accent);white-space:nowrap;font-size:.8125rem;font-weight:500;text-decoration:none}.critique-callout-link:hover{text-decoration:underline}.critique-callout-link--secondary{color:var(--color-ash);font-weight:400}.critique-callout-link--secondary:hover{color:var(--color-charcoal)}.pillar-item--main{background:var(--color-accent-dim);border:1px solid var(--color-accent)}.pillar-item--main .pillar-item-name{color:var(--color-accent);font-size:1.125rem;font-weight:600}.pillar-item--ref{padding:var(--spacing-xs) var(--spacing-sm);background:0 0}.pillar-item-label{text-transform:uppercase;letter-spacing:.05em;color:var(--color-ash);font-size:.75rem;font-weight:500}.pillar-refs{gap:var(--spacing-xs);padding:0 var(--spacing-sm);flex-wrap:wrap;display:flex}.pillar-ref{text-transform:uppercase;letter-spacing:.03em;background:var(--color-paper);color:var(--color-ash);border:1px solid var(--color-mist);transition:all var(--duration-fast) var(--ease-out);border-radius:3px;padding:4px 10px;font-size:.6875rem;font-weight:500}.pillar-ref:hover{border-color:var(--color-accent);color:var(--color-accent)}.pillar-command-group{align-items:center;gap:var(--spacing-xs);padding:var(--spacing-sm);background:var(--color-paper);border-radius:4px;flex-wrap:wrap;display:flex}.pillar-group-label{text-transform:uppercase;letter-spacing:.05em;color:var(--color-ash);width:100%;margin-bottom:4px;font-size:.6875rem;font-weight:600}.pillar-command-group .pillar-item-code{background:var(--color-accent-dim);border-radius:3px;padding:4px 8px;font-size:.8125rem}.platforms-section{padding:var(--spacing-2xl) 0;border-top:1px solid var(--color-mist)}.platforms-section .section-subtitle{max-width:60ch}.install-steps{gap:var(--spacing-xl);max-width:640px;margin:0 auto var(--spacing-xl);flex-direction:column;display:flex}.install-step-header{align-items:flex-start;gap:var(--spacing-md);margin-bottom:var(--spacing-md);display:flex}.install-step-number{border:1.5px solid var(--color-accent);width:40px;height:40px;color:var(--color-accent);font-family:var(--font-display);border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;font-size:1.125rem;font-weight:600;line-height:1;display:flex}.install-step-meta{padding-top:6px}.install-step-title{margin:0;font-size:1.125rem;font-weight:600;line-height:1.4}.install-step-desc{color:var(--color-ash);margin:2px 0 0;font-size:.875rem}.install-subscribe{max-width:640px;margin:0 auto}.install-subscribe iframe{max-width:100%;display:block}.install-subscribe-btn{letter-spacing:.03em;color:var(--color-paper);background:var(--color-ink);border:1px solid var(--color-ink);transition:all var(--duration-base) var(--ease-out);flex-shrink:0;align-items:center;gap:10px;padding:1rem 2rem;font-size:.9375rem;font-weight:600;text-decoration:none;display:inline-flex;position:relative;overflow:hidden}.install-subscribe-btn:before{content:"";background:var(--color-accent);transition:transform var(--duration-base) var(--ease-out);z-index:0;position:absolute;inset:0;transform:translateY(100%)}.install-subscribe-btn:hover:before{transform:translateY(0)}.install-subscribe-btn svg,.install-subscribe-btn span{z-index:1;position:relative}.install-subscribe-btn:hover{color:var(--color-paper)}.install-subscribe-note{color:var(--color-ash);margin:0;font-size:.8125rem;line-height:1.5}@media (max-width:600px){.install-subscribe{flex-direction:column;align-items:flex-start}}.install-terminal{max-width:640px;margin:0 auto}.install-terminal .glass-terminal{height:auto}.install-terminal .terminal-body{flex-direction:column;padding:0;display:flex}.install-terminal-row{padding:var(--spacing-md) var(--spacing-lg);flex-direction:column;gap:6px;display:flex}.install-terminal-label{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.1em;color:var(--color-ash);font-size:.625rem;font-weight:600}.install-terminal-cmd{align-items:center;gap:var(--spacing-sm);display:flex}.install-terminal-cmd .terminal-prompt{flex-shrink:0}.install-terminal-cmd code{font-family:var(--font-mono);color:var(--color-ink);white-space:nowrap;text-overflow:ellipsis;background:0 0;flex:1;padding:0;font-size:.9375rem;overflow:hidden}.install-terminal-cmd .copy-btn{flex-shrink:0}.install-terminal-cmd .btn{padding:.5rem 1rem;font-size:.8125rem}.install-terminal-note{color:var(--color-ash);padding-left:calc(.75rem + var(--spacing-sm));font-size:.75rem}.install-terminal-note code{font-family:var(--font-mono);background:var(--color-mist);color:var(--color-ink);border-radius:3px;padding:2px 5px;font-size:.6875rem}.install-terminal-divider{background:var(--color-mist);height:1px;margin:0}@media (max-width:600px){.install-terminal-row{padding:var(--spacing-sm) var(--spacing-md)}.install-terminal-cmd code{font-size:.75rem}}.install-providers{align-items:center;gap:var(--spacing-sm);margin-top:var(--spacing-md);flex-direction:column;display:flex}.install-providers-label{text-transform:uppercase;letter-spacing:.1em;color:var(--color-ash);font-size:.75rem;font-weight:600}.install-providers-row{justify-content:center;gap:var(--spacing-sm);flex-wrap:wrap;display:flex}.install-provider-badge{color:var(--color-charcoal);align-items:center;gap:6px;font-size:.8125rem;display:flex}.install-provider-badge img{border-radius:4px}.install-alternatives{max-width:640px;margin:var(--spacing-sm) auto 0}.install-alternatives-toggle{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;color:var(--color-ash);cursor:pointer;padding:var(--spacing-sm) 0;transition:color var(--duration-fast) var(--ease-out);align-items:center;gap:6px;font-size:.75rem;font-weight:600;list-style:none;display:flex}.install-alternatives-toggle::-webkit-details-marker{display:none}.install-alternatives-toggle:before{content:"";width:0;height:0;transition:transform var(--duration-fast) var(--ease-out);border-top:4px solid #0000;border-bottom:4px solid #0000;border-left:5px solid;display:inline-block}.install-alternatives[open] .install-alternatives-toggle:before{transform:rotate(90deg)}.install-alternatives-toggle:hover{color:var(--color-charcoal)}.install-alternatives-content{border:1px solid var(--color-mist);background:var(--color-paper);animation:altFadeIn .2s var(--ease-out);border-radius:8px;overflow:hidden}@keyframes altFadeIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.install-alt-method{padding:var(--spacing-md) var(--spacing-lg)}.install-alt-label{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.1em;color:var(--color-ash);margin-bottom:6px;font-size:.625rem;font-weight:600;display:block}.install-alt-method .install-terminal-cmd{align-items:center;gap:var(--spacing-sm);display:flex}.install-alt-method .terminal-prompt{color:var(--color-accent);font-family:var(--font-mono);-webkit-user-select:none;user-select:none;font-weight:700}.install-alt-method code{font-family:var(--font-mono);color:var(--color-ink);font-size:.875rem}.install-alt-note{color:var(--color-ash);margin-top:4px;font-size:.75rem;display:block}.install-alt-note code{font-family:var(--font-mono);background:var(--color-mist);color:var(--color-ink);border-radius:3px;padding:2px 5px;font-size:.6875rem}.install-alt-download{align-items:center;gap:var(--spacing-sm);display:flex}.install-alt-divider{background:var(--color-mist);height:1px}.install-prefix-options{align-items:flex-start;gap:var(--spacing-sm);margin-top:var(--spacing-md);display:flex}.install-prefix-option{border:1.5px solid var(--color-mist);cursor:pointer;transition:all var(--duration-fast) var(--ease-out);border-radius:8px;flex:1;align-items:flex-start;gap:8px;padding:10px 12px;line-height:1;display:flex}.install-prefix-option:hover{border-color:var(--color-charcoal)}.install-prefix-option:has(input:checked){border-color:var(--color-accent)}.install-prefix-option input{appearance:none;border:1.5px solid var(--color-mist);width:16px;height:16px;transition:all var(--duration-fast) var(--ease-out);border-radius:50%;flex-shrink:0;margin:0;position:relative}.install-prefix-option input:checked{border-color:var(--color-accent);background:var(--color-accent)}.install-prefix-option input:checked:after{content:"";background:var(--color-paper);border-radius:50%;width:6px;height:6px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.install-prefix-option input:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.install-prefix-option-content{flex-direction:column;gap:3px;padding-top:1px;display:flex}.install-prefix-option-label{color:var(--color-ink);font-size:.8125rem;font-weight:600;line-height:1}.install-prefix-option-examples{flex-wrap:wrap;gap:4px;display:flex}.install-prefix-option-examples code{font-family:var(--font-mono);background:var(--color-accent-dim);color:var(--color-accent);border-radius:3px;padding:2px 6px;font-size:.6875rem}.install-prefix-option-wrap{flex-direction:column;flex:1;align-self:flex-start;gap:4px;display:flex}.install-prefix-reason{color:var(--color-ash);padding-left:2px;font-size:.6875rem;line-height:1.4}.install-prefix-option-label code{font-family:var(--font-mono);background:var(--color-accent-dim);color:var(--color-accent);border-radius:3px;padding:1px 5px;font-size:.6875rem}.install-alt-method .install-prefix-options,.install-alt-method .install-alt-download{margin-top:var(--spacing-sm)}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}@media (max-width:600px){.install-prefix-options{flex-direction:column}.install-alt-method{padding:var(--spacing-sm) var(--spacing-md)}.install-alt-method code{font-size:.75rem}}.has-tooltip{cursor:default;position:relative}.has-tooltip:after{content:attr(data-tooltip);background:var(--color-ink);color:var(--color-paper);white-space:nowrap;pointer-events:none;opacity:0;z-index:100;border-radius:6px;padding:6px 10px;font-size:.6875rem;line-height:1.4;transition:opacity .15s;position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%)}.has-tooltip:hover:after{opacity:1}.hero-logo-icon{align-items:center;display:inline-flex}.download-tip{color:var(--color-ash);margin-top:var(--spacing-sm);text-align:center;font-size:.8125rem}.download-tip a{color:var(--color-accent);text-decoration:none}.download-tip a:hover{text-decoration:underline}.consulting-section{padding:var(--spacing-xl) 0;border-top:1px solid var(--color-mist)}.consulting-content{justify-content:space-between;align-items:center;gap:var(--spacing-lg);flex-wrap:wrap;display:flex}.consulting-actions{gap:var(--spacing-sm);flex-shrink:0;display:flex}.consulting-text{flex:1;min-width:280px}.consulting-title{margin:0 0 var(--spacing-sm) 0;font-size:clamp(1.5rem,4vw,2rem);font-style:italic;font-weight:300}.consulting-desc{color:var(--color-charcoal);max-width:45ch;margin:0;font-size:1rem;line-height:1.6}@media (max-width:600px){.consulting-content{flex-direction:column;align-items:flex-start}.consulting-actions{flex-direction:column;width:100%}.consulting-actions .btn{justify-content:center;width:100%}} \ No newline at end of file +.split-container:before{content:"";background-image:linear-gradient(var(--color-mist) 1px, transparent 1px), linear-gradient(90deg, var(--color-mist) 1px, transparent 1px);opacity:.3;pointer-events:none;background-size:20px 20px;position:absolute;inset:0}.split-container:after{content:"← Drag →";letter-spacing:.1em;text-transform:uppercase;color:var(--color-ash);background:var(--color-paper);opacity:.8;z-index:10;border-radius:4px;padding:4px 12px;font-size:.625rem;font-weight:600;transition:opacity .3s;position:absolute;bottom:12px;left:50%;transform:translate(-50%)}.split-container:hover:after{opacity:0}.split-after .impeccable-card{box-shadow:0 10px 40px #00000014}@keyframes splitEntry{0%{opacity:0;transform:translate(-50%)skew(-10deg)scaleY(.8)}to{opacity:1;transform:translate(-50%)skew(-10deg)scaleY(1)}}.split-divider{animation:splitEntry .6s var(--ease-out) .3s backwards}.split-label-item{transition:color var(--duration-fast) var(--ease-out);cursor:default}.split-label-item:hover{color:var(--color-text)}.split-label-item[data-point=after]:hover .split-label-dot--accent{transform:scale(1.3)}.split-label-dot{transition:transform var(--duration-fast) var(--ease-spring)}.split-badge{letter-spacing:.08em;text-transform:uppercase;z-index:5;pointer-events:none;border-radius:3px;padding:3px 8px;font-size:.625rem;font-weight:600;position:absolute;top:10px}.split-badge--before{color:var(--color-ash);background:var(--color-paper);border:1px solid var(--color-mist);left:10px}.split-badge--after{color:var(--color-paper);background:var(--color-accent);right:10px}@media (hover:none){.split-container:after{content:"← Swipe →"}}@media (max-width:600px){.split-label{padding:4px 10px;font-size:.5625rem}}.commands-section{padding:var(--spacing-xl) 0;background:var(--color-paper);position:relative}.commands-gallery{display:block}.commands-container{gap:var(--spacing-2xl);grid-template-columns:1fr 1.2fr;align-items:start;display:grid}@media (max-width:900px){.commands-container{grid-template-columns:1fr}}.command-manual{gap:var(--spacing-sm);flex-direction:column;padding-bottom:20vh;display:flex}.command-category-header{font-family:var(--font-display);color:var(--color-accent);text-transform:uppercase;letter-spacing:.1em;padding:var(--spacing-lg) var(--spacing-lg) var(--spacing-sm);margin-top:var(--spacing-md);border-bottom:1px solid var(--color-mist);font-size:.875rem;font-weight:600}.command-category-header:first-child{margin-top:0}.manual-entry{padding:var(--spacing-lg);padding-left:calc(var(--spacing-lg) + 16px);border-left:2px solid var(--color-mist);transition:border-color .4s var(--ease-out), opacity .4s var(--ease-out), background .4s var(--ease-out), transform .4s var(--ease-out);opacity:.4;cursor:pointer;position:relative;transform:translate(-16px)}.manual-entry:hover{opacity:.7}.manual-entry.active{border-left-color:var(--color-accent);opacity:1;background:linear-gradient(to right, var(--color-bg), transparent);transform:translate(0)}.manual-cmd-name{font-family:var(--font-mono);margin:0 0 var(--spacing-sm);color:var(--color-ink);font-size:1.5rem;font-weight:500}.beta-badge{font-family:var(--font-body);letter-spacing:.08em;text-transform:uppercase;color:var(--color-accent);border:1px solid var(--color-accent);vertical-align:middle;border-radius:3px;margin-left:6px;padding:1px 5px;font-size:.55rem;font-weight:600}.manual-cmd-desc{color:var(--color-charcoal);margin:0;font-size:.875rem;line-height:1.5}.manual-cmd-rel{color:var(--color-ash);margin-top:var(--spacing-sm);flex-wrap:wrap;align-items:center;gap:.5ch;font-size:.8125rem;display:flex}.manual-cmd-rel .rel-icon{color:var(--color-accent);font-weight:600}.manual-cmd-rel code{font-family:var(--font-mono);background:var(--color-mist);color:var(--color-ink);border-radius:3px;padding:2px 6px;font-size:.75rem}.glass-terminal-wrapper{height:calc(100vh - var(--spacing-xl) * 2);min-height:500px;max-height:800px;position:sticky;top:50vh;transform:translateY(-50%)}.terminal-stack{perspective:1200px;height:100%;position:relative}.terminal-stack-tabs{z-index:10;gap:4px;display:flex;position:absolute;top:-31px;right:8px}.terminal-stack-tab{font-family:var(--font-mono);background:var(--color-cream);border:1px solid var(--color-mist);color:var(--color-ash);cursor:pointer;border-bottom:none;border-radius:6px 6px 0 0;padding:5px 12px;font-size:.75rem;transition:all .2s}.terminal-stack-tab:hover{background:var(--color-paper);color:var(--color-charcoal)}.terminal-stack-tab.active{background:var(--color-paper);color:var(--color-ink);border-color:var(--color-mist)}.terminal-window{transform-origin:bottom;transition:transform .4s cubic-bezier(.4,0,.2,1),opacity .3s,filter .3s;position:absolute;inset:0}.terminal-window--demo{z-index:2}.terminal-window--demo.is-back{opacity:.6;filter:brightness(.92);pointer-events:none;z-index:1;transform:translateY(16px)translate(12px)scale(.96)}.terminal-window--source{z-index:1;opacity:.6;filter:brightness(.92);pointer-events:none;transform:translateY(16px)translate(12px)scale(.96)}.terminal-window--source.is-front{opacity:1;filter:brightness();pointer-events:auto;z-index:2;transform:translateY(0)translate(0)scale(1)}.source-window{background:var(--color-paper);-webkit-backdrop-filter:blur(12px);border:1px solid var(--color-mist);border-radius:8px;flex-direction:column;height:100%;display:flex;overflow:hidden;box-shadow:0 20px 60px -10px #00000026}.source-header{background:var(--color-cream);border-bottom:1px solid var(--color-mist);flex-shrink:0;align-items:center;gap:8px;padding:12px 16px;display:flex}.source-title{font-family:var(--font-mono);color:var(--color-ink);font-size:.875rem;font-weight:500}.source-body{padding:var(--spacing-md);font-family:var(--font-mono);color:var(--color-charcoal);overscroll-behavior:contain;white-space:pre-wrap;word-break:break-word;background:var(--color-cream);flex:1;font-size:.75rem;line-height:1.5;overflow-y:auto}.source-loading{color:var(--color-ash);font-style:italic}@media (max-width:900px){.glass-terminal-wrapper{display:none}}.glass-terminal{background:var(--color-paper);-webkit-backdrop-filter:blur(12px);border:1px solid var(--color-mist);border-radius:8px;flex-direction:column;height:100%;display:flex;overflow:hidden;box-shadow:0 20px 60px -10px #00000026}.terminal-header{background:var(--color-cream);border-bottom:1px solid var(--color-mist);align-items:center;gap:8px;padding:12px 16px;display:flex}.terminal-dot{border-radius:50%;width:10px;height:10px}.terminal-dot.red{background:#ff5f56}.terminal-dot.yellow{background:#ffbd2e}.terminal-dot.green{background:#27c93f}.terminal-title{font-family:var(--font-mono);color:var(--color-ash);margin-left:auto;font-size:.75rem}.terminal-body{padding:var(--spacing-md);font-family:var(--font-mono);color:var(--color-ink);flex-direction:column;flex:1;min-height:0;font-size:.9375rem;display:flex;overflow-y:auto}.terminal-line{margin-bottom:var(--spacing-sm);gap:var(--spacing-sm);line-height:1.5;display:flex}.terminal-prompt{color:var(--color-accent);-webkit-user-select:none;user-select:none;font-weight:700}.terminal-cursor{background:var(--color-accent);vertical-align:middle;width:8px;height:1.2em;animation:1s step-end infinite blink;display:inline-block}.terminal-output{color:var(--color-ash);margin-bottom:var(--spacing-md);white-space:pre-wrap}@media (max-height:800px){.terminal-output{display:none}}.terminal-cmd{color:var(--color-accent);font-weight:600}.terminal-step{color:var(--color-charcoal)}.terminal-done{color:var(--color-success,#22c55e);font-weight:500}.terminal-preview{background:var(--color-paper);margin:var(--spacing-sm) 0;border-radius:12px;flex:1;min-height:0;overflow:hidden}.terminal-cursor-line{flex-shrink:0;margin-top:var(--spacing-sm)!important}.terminal-preview .demo-split-comparison{flex-direction:column;height:100%;display:flex}.terminal-preview .demo-split-comparison .split-container{cursor:ew-resize;-webkit-user-select:none;user-select:none;background:var(--color-cream);flex:1;min-height:0;position:relative;overflow:hidden}.terminal-preview .demo-split-comparison .split-before,.terminal-preview .demo-split-comparison .split-after{padding:var(--spacing-md);justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.terminal-preview .demo-split-comparison .split-before{z-index:1;background:var(--color-cream)}.terminal-preview .demo-split-comparison .split-after{z-index:2;background:var(--color-paper);clip-path:polygon(58% 0%,100% 0%,100% 100%,42% 100%)}.terminal-preview .demo-split-comparison .split-content{flex-direction:column;justify-content:center;align-items:center;width:100%;max-width:280px;display:flex}.terminal-preview .demo-split-comparison .split-divider{background:var(--color-accent);pointer-events:none;z-index:3;width:2px;position:absolute;top:0;bottom:0;left:50%;transform:translate(-50%)skew(-10deg);box-shadow:0 0 12px #0000001a}.terminal-preview .demo-split-comparison .split-label{letter-spacing:.08em;text-transform:uppercase;color:var(--color-paper);background:var(--color-accent);white-space:nowrap;border-radius:3px;padding:4px 10px;font-size:.5625rem;font-weight:600;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)skew(10deg)}.terminal-preview .demo-split-comparison .demo-caption{color:var(--color-ash);text-align:center;padding:var(--spacing-sm) var(--spacing-md);flex-shrink:0;font-size:.75rem}@keyframes blink{50%{opacity:0}}.casestudies-section{padding:var(--spacing-2xl) 0;border-top:1px solid var(--color-mist);position:relative}.transformations-tabbed{margin-top:var(--spacing-xl)}.transformation-tabs{gap:var(--spacing-xs);border-bottom:1px solid var(--color-mist);margin-bottom:var(--spacing-lg);display:flex}.transformation-tab{font-family:var(--font-display);color:var(--color-ash);padding:var(--spacing-sm) var(--spacing-md);cursor:pointer;background:0 0;border:none;font-size:.9375rem;font-weight:500;transition:color .2s;position:relative}.transformation-tab:hover{color:var(--color-charcoal)}.transformation-tab.active{color:var(--color-ink)}.transformation-tab.active:after{content:"";background:var(--color-accent);height:2px;position:absolute;bottom:-1px;left:0;right:0}.transformation-panels{position:relative}.transformation-panel{gap:var(--spacing-lg);flex-direction:column;animation:.3s fadeInPanel;display:none}.transformation-panel.active{display:flex}@keyframes fadeInPanel{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.transformation-images{align-items:center;gap:var(--spacing-md);display:flex}.transformation-before,.transformation-after{flex:1;margin:0}.transformation-before img,.transformation-after img,.transformation-placeholder{aspect-ratio:16/10;object-fit:cover;border:1px solid var(--color-mist);cursor:pointer;border-radius:8px;width:100%;transition:transform .2s,box-shadow .2s}.transformation-before img:hover,.transformation-after img:hover,.transformation-placeholder:hover{transform:scale(1.02);box-shadow:0 8px 24px -4px #00000026}.transformation-placeholder{background:linear-gradient(135deg, var(--color-mist) 0%, var(--color-cream) 100%);color:var(--color-ash);justify-content:center;align-items:center;font-size:.8125rem;font-style:italic;display:flex}.transformation-before figcaption,.transformation-after figcaption{text-transform:uppercase;letter-spacing:.05em;color:var(--color-ash);margin-top:var(--spacing-xs);text-align:center;font-size:.75rem;font-weight:600}.transformation-arrow{color:var(--color-accent);flex-shrink:0;font-size:1.5rem;font-weight:300}.transformation-info{max-width:600px}.transformation-title{font-family:var(--font-display);color:var(--color-ink);margin:0 0 var(--spacing-xs);font-size:1.25rem;font-weight:600}.transformation-desc{color:var(--color-charcoal);margin:0 0 var(--spacing-sm);font-size:.9375rem;line-height:1.6}.transformation-commands{flex-wrap:wrap;gap:6px;display:flex}.transformation-command{font-family:var(--font-mono);background:var(--color-mist);color:var(--color-charcoal);border-radius:4px;padding:4px 10px;font-size:.75rem}.lightbox{z-index:1000;opacity:0;visibility:hidden;background:#000000e6;justify-content:center;align-items:center;transition:opacity .3s,visibility .3s;display:flex;position:fixed;inset:0}.lightbox.active{opacity:1;visibility:visible}.lightbox-close{color:#fff;cursor:pointer;opacity:.7;background:0 0;border:none;font-size:2.5rem;line-height:1;transition:opacity .2s;position:absolute;top:20px;right:24px}.lightbox-close:hover{opacity:1}.lightbox-image{object-fit:contain;border-radius:8px;max-width:90vw;max-height:85vh;box-shadow:0 20px 60px #00000080}@media (max-width:768px){.transformation-images{flex-direction:column}.transformation-arrow{transform:rotate(90deg)}.transformation-before,.transformation-after{width:100%}}.hero-version-link{color:var(--color-ash);margin-top:var(--spacing-sm);font-size:.8125rem}.hero-version-link a{color:var(--color-ash);border-bottom:1px solid #0000;text-decoration:none;transition:color .2s,border-color .2s}.hero-version-link a:hover{color:var(--color-accent);border-bottom-color:var(--color-accent)}.changelog-section{padding:var(--spacing-xl) 0;border-top:1px solid var(--color-mist);position:relative}.changelog-list{flex-direction:column;gap:0;display:flex}.changelog-entry{padding:var(--spacing-md) 0}.changelog-entry+.changelog-entry{border-top:1px solid var(--color-mist)}.changelog-version-header{align-items:baseline;gap:var(--spacing-sm);margin-bottom:var(--spacing-sm);display:flex}.changelog-version{font-family:var(--font-mono);color:var(--color-ink);font-size:1.125rem;font-weight:600}.changelog-date{color:var(--color-ash);font-size:.8125rem}.changelog-items{padding-left:var(--spacing-md);color:var(--color-charcoal);margin:0;line-height:1.7}.changelog-items li{margin-bottom:var(--spacing-xs)}.changelog-items code{font-family:var(--font-mono);background:var(--color-mist);color:var(--color-ink);border-radius:3px;padding:2px 6px;font-size:.875em}.changelog-older{margin-top:var(--spacing-sm)}.changelog-older-toggle{font-family:var(--font-body);color:var(--color-accent);padding:var(--spacing-md) 0;cursor:pointer;align-items:center;gap:6px;font-size:.875rem;font-weight:500;list-style:none;transition:color .2s;display:flex}.changelog-older-toggle::-webkit-details-marker{display:none}.changelog-older-toggle:before{content:"+";transition:transform .3s var(--ease-out);font-size:1.25rem;font-weight:300}.changelog-older[open] .changelog-older-toggle:before{transform:rotate(45deg)}.changelog-older-toggle:hover{color:var(--color-accent-hover)}.changelog-older-entries{animation:faqFadeIn .3s var(--ease-out)}.faq-section{padding:var(--spacing-xl) 0;border-top:1px solid var(--color-mist);position:relative}.faq-list{flex-direction:column;gap:0;display:flex}.faq-item{border-bottom:1px solid var(--color-mist)}.faq-question{font-family:var(--font-display);color:var(--color-ink);padding:var(--spacing-md) 0;cursor:pointer;justify-content:space-between;align-items:center;font-size:1.125rem;font-weight:500;list-style:none;transition:color .2s;display:flex}.faq-question::-webkit-details-marker{display:none}.faq-question:after{content:"+";font-family:var(--font-body);color:var(--color-accent);transition:transform .3s var(--ease-out);font-size:1.5rem;font-weight:300}.faq-item[open] .faq-question:after{transform:rotate(45deg)}.faq-question:hover{color:var(--color-accent)}.faq-answer{padding:0 0 var(--spacing-md);color:var(--color-charcoal);animation:faqFadeIn .3s var(--ease-out);line-height:1.7}.faq-answer p{margin:0 0 var(--spacing-sm)}.faq-answer p:last-child{margin-bottom:0}.faq-answer ul{margin:var(--spacing-sm) 0;padding-left:var(--spacing-md)}.faq-answer li{margin-bottom:var(--spacing-xs)}.faq-answer code{font-family:var(--font-mono);background:var(--color-mist);color:var(--color-ink);border-radius:3px;padding:2px 6px;font-size:.875em}.faq-answer a{color:var(--color-accent);border-bottom:1px solid #0000;text-decoration:none;transition:border-color .2s}.faq-answer a:hover{border-bottom-color:var(--color-accent)}@keyframes faqFadeIn{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.skills-section{padding:var(--spacing-xl) 0;background:var(--color-bg);position:relative;overflow:hidden}.skills-gallery{display:block;position:relative}.gallery-track{gap:var(--spacing-lg);scroll-snap-type:x mandatory;padding:var(--spacing-md) var(--spacing-lg) var(--spacing-xl);-webkit-overflow-scrolling:touch;scrollbar-width:none;cursor:grab;display:flex;overflow-x:auto}.gallery-track:active{cursor:grabbing}.gallery-track::-webkit-scrollbar{display:none}.gallery-frame{scroll-snap-align:center;background:var(--color-paper);border:1px solid var(--color-mist);opacity:.4;max-width:1100px;transition:opacity .6s var(--ease-out), transform .6s var(--ease-out), box-shadow .6s var(--ease-out);border-radius:2px;flex:0 0 80vw;position:relative;overflow:hidden;transform:scale(.95);box-shadow:0 4px 6px -1px #0000000d,0 20px 50px -10px #0000001a}.gallery-frame.active{opacity:1;border-color:var(--color-charcoal);border-width:1px;transform:scale(1);box-shadow:0 20px 25px -5px #0000001a,0 40px 100px -20px #0003}.gallery-content{grid-template-columns:1.2fr 1fr;height:600px;display:grid}@media (max-width:900px){.gallery-frame{flex:0 0 90vw}.gallery-content{grid-template-columns:1fr;height:auto;min-height:600px}}.gallery-visual{background:var(--color-cream);border-right:1px solid var(--color-mist);padding:var(--spacing-lg);justify-content:center;align-items:center;display:flex;position:relative;overflow:hidden}.gallery-info{padding:var(--spacing-xl);flex-direction:column;display:flex;overflow-y:auto}.gallery-header{margin-bottom:var(--spacing-lg)}.gallery-title{font-family:var(--font-display);margin:0 0 var(--spacing-xs);color:var(--color-ink);font-size:2.5rem;font-style:italic}.gallery-meta{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.1em;color:var(--color-ash);font-size:.75rem}.gallery-desc{color:var(--color-charcoal);margin-bottom:var(--spacing-xl);max-width:45ch;font-size:1.125rem;line-height:1.6}.gallery-tags{gap:var(--spacing-xs);flex-wrap:wrap;margin-top:auto;display:flex}.gallery-tag{border:1px solid var(--color-mist);color:var(--color-ash);border-radius:4px;padding:6px 12px;font-size:.8125rem}.gallery-map{margin-top:var(--spacing-lg);justify-content:center;gap:8px;display:flex}.gallery-dot{background:var(--color-mist);cursor:pointer;width:40px;height:2px;font:inherit;border:none;padding:0;transition:all .3s;position:relative}.gallery-dot:after{content:"";position:absolute;inset:-10px 0}.gallery-dot:focus-visible{outline:2px solid var(--color-accent);outline-offset:4px;border-radius:1px}.gallery-dot.active{background:var(--color-accent);height:4px}.demo-tabbed-container{flex-direction:column;display:flex}.demo-tabs{background:var(--color-paper);border-bottom:1px solid var(--color-mist);justify-content:center;gap:0;margin-bottom:0;display:flex}.demo-tab{padding:var(--spacing-sm) var(--spacing-lg);font-family:var(--font-mono);letter-spacing:.05em;text-transform:uppercase;color:var(--color-ash);cursor:pointer;transition:all var(--duration-fast) var(--ease-out);background:0 0;border:none;border-bottom:2px solid #0000;font-size:.75rem;font-weight:500}.demo-tab:hover{color:var(--color-text);background:var(--color-cream)}.demo-tab.active{color:var(--color-accent);border-bottom-color:var(--color-accent);background:var(--color-accent-dim)}.demo-panels{flex:1}.demo-panel{display:none}.demo-panel.active{animation:fadeSlideIn .3s var(--ease-out);display:block}@keyframes fadeSlideIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.demo-container{background:var(--color-paper);border:none;border-radius:0;overflow:hidden}.demo-header{padding:var(--spacing-sm) var(--spacing-md);background:var(--color-paper);border-bottom:1px solid var(--color-mist);justify-content:center;align-items:center;min-height:48px;display:flex}.demo-toggle{align-items:center;gap:var(--spacing-md);display:flex}.demo-toggle-label{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;color:var(--color-ash);transition:color var(--duration-fast) var(--ease-out);cursor:pointer;font-size:.6875rem;font-weight:600}.demo-toggle-label:hover{color:var(--color-text)}.demo-toggle-label.active{color:var(--color-accent)}.demo-toggle-switch{background:var(--color-mist);cursor:pointer;width:44px;height:24px;transition:background var(--duration-fast) var(--ease-out);font:inherit;border:1px solid #0000;border-radius:12px;padding:0;position:relative}.demo-toggle-switch:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.demo-toggle-switch:hover{border-color:var(--color-ash)}.demo-toggle-switch:after{content:"";background:var(--color-paper);width:16px;height:16px;transition:transform var(--duration-base) var(--ease-spring);border-radius:50%;position:absolute;top:3px;left:3px;box-shadow:0 1px 4px #00000026}.demo-toggle-switch.active{background:var(--color-accent)}.demo-toggle-switch.active:after{transform:translate(20px)}.demo-viewport{padding:var(--spacing-xl);background:var(--color-cream);min-height:280px;transition:background var(--duration-base) var(--ease-out);justify-content:center;align-items:center;display:flex}.demo-viewport[data-state=after]{background:var(--color-paper)}.demo-caption{padding:var(--spacing-sm) var(--spacing-md);font-family:var(--font-mono);letter-spacing:.03em;color:var(--color-ash);background:var(--color-paper);text-align:center;font-size:.6875rem}.uxw-demo{width:100%;max-width:320px;padding:var(--spacing-lg);background:var(--color-paper);border:1px solid var(--color-mist);text-align:center;border-radius:6px}.uxw-error-icon{margin-bottom:var(--spacing-sm);font-size:2rem}.uxw-error-title{color:#c00;margin-bottom:var(--spacing-xs);font-weight:600}.uxw-error-text{color:var(--color-ash);font-size:.875rem}.uxw-error-action{margin-top:var(--spacing-sm);color:var(--color-accent);cursor:pointer;font-size:.875rem;text-decoration:underline}.uxw-error-after .uxw-error-icon{color:var(--color-accent)}.uxw-error-after .uxw-error-title{color:var(--color-text)}.uxw-error-after .uxw-error-text{color:var(--color-charcoal)}.uxw-button-context{color:var(--color-charcoal);margin-bottom:var(--spacing-md);font-size:.875rem;font-weight:500}.uxw-button-row{gap:var(--spacing-sm);justify-content:center;display:flex}.uxw-btn{padding:var(--spacing-xs) var(--spacing-md);cursor:pointer;border:none;border-radius:4px;font-size:.875rem;font-weight:500}.uxw-btn-primary{background:var(--color-text);color:var(--color-paper)}.uxw-btn-secondary{color:var(--color-ash);border:1px solid var(--color-mist);background:0 0}.uxw-btn-danger{color:#fff;background:#c00}.uxw-empty-icon{margin-bottom:var(--spacing-sm);opacity:.4;font-size:2.5rem}.uxw-empty-title{color:var(--color-ash);font-weight:500}.uxw-empty-text{color:var(--color-charcoal);margin-top:var(--spacing-xs);font-size:.875rem}.uxw-empty-action{margin-top:var(--spacing-md)}.uxw-empty-after .uxw-empty-icon{opacity:1}.uxw-empty-after .uxw-empty-title{color:var(--color-text)}.spatial-demo{width:100%;max-width:340px;padding:var(--spacing-md);background:var(--color-paper);border:1px solid var(--color-mist);border-radius:6px}.spatial-grid-before{flex-wrap:wrap;gap:6px;display:flex}.spatial-grid-after{gap:var(--spacing-sm);grid-template-columns:1fr 1fr;display:grid}.spatial-card-item{padding:var(--spacing-sm);background:var(--color-bg);border:1px solid var(--color-mist);color:var(--color-charcoal);text-align:center;border-radius:4px;font-size:.8125rem}.spatial-grid-after .spatial-card-item{width:auto!important}.spatial-hierarchy-before .spatial-h-title,.spatial-hierarchy-before .spatial-h-subtitle,.spatial-hierarchy-before .spatial-h-cta,.spatial-hierarchy-before .spatial-h-link{margin-bottom:var(--spacing-xs);color:var(--color-charcoal);font-size:.9375rem}.spatial-hierarchy-after .spatial-h-title{font-family:var(--font-display);margin-bottom:var(--spacing-xs);color:var(--color-text);font-size:1.75rem;font-style:italic;font-weight:300}.spatial-hierarchy-after .spatial-h-subtitle{text-transform:uppercase;letter-spacing:.1em;color:var(--color-ash);margin-bottom:var(--spacing-md);font-size:.6875rem}.spatial-hierarchy-after .spatial-h-cta{padding:var(--spacing-sm) var(--spacing-lg);background:var(--color-text);color:var(--color-paper);margin-bottom:var(--spacing-sm);border-radius:4px;font-size:.875rem;font-weight:500;display:inline-block}.spatial-hierarchy-after .spatial-h-link{color:var(--color-ash);font-size:.75rem}.spatial-whitespace-before{padding:var(--spacing-xs)!important}.spatial-whitespace-before .spatial-ws-title{margin-bottom:2px;font-size:1rem;font-weight:600}.spatial-whitespace-before .spatial-ws-price{color:var(--color-ash);margin-bottom:4px;font-size:.875rem}.spatial-whitespace-before .spatial-ws-features{color:var(--color-ash);margin-bottom:6px;font-size:.75rem}.spatial-whitespace-before .spatial-ws-btn{background:var(--color-text);width:100%;color:var(--color-paper);cursor:pointer;border:none;border-radius:3px;padding:6px;font-size:.75rem}.spatial-whitespace-after{padding:var(--spacing-lg)!important}.spatial-whitespace-after .spatial-ws-title{font-family:var(--font-display);margin-bottom:var(--spacing-sm);font-size:1.5rem;font-weight:400}.spatial-whitespace-after .spatial-ws-price{color:var(--color-text);margin-bottom:var(--spacing-sm);font-size:1.25rem;font-weight:600}.spatial-whitespace-after .spatial-ws-features{color:var(--color-ash);margin-bottom:var(--spacing-lg);font-size:.8125rem;line-height:1.6}.spatial-whitespace-after .spatial-ws-btn{width:100%;padding:var(--spacing-sm);background:var(--color-text);color:var(--color-paper);cursor:pointer;border:none;border-radius:4px;font-size:.875rem;font-weight:500}.motion-demo{align-items:center;gap:var(--spacing-sm);flex-direction:column;width:100%;max-width:280px;display:flex}.motion-stagger-demo{align-items:stretch}.motion-list-item{align-items:center;gap:var(--spacing-sm);padding:var(--spacing-sm) var(--spacing-md);background:var(--color-bg);border:1px solid var(--color-mist);color:var(--color-charcoal);border-radius:4px;font-size:.875rem;display:flex}.motion-dot{background:var(--color-accent);border-radius:50%;width:8px;height:8px}.demo-viewport[data-state=after] .motion-list-item{opacity:0;animation:.35s cubic-bezier(.16,1,.3,1) forwards staggerIn;transform:translateY(12px)}.demo-viewport[data-state=after] .motion-list-item:first-child{animation-delay:0s}.demo-viewport[data-state=after] .motion-list-item:nth-child(2){animation-delay:50ms}.demo-viewport[data-state=after] .motion-list-item:nth-child(3){animation-delay:.1s}.demo-viewport[data-state=after] .motion-list-item:nth-child(4){animation-delay:.15s}@keyframes staggerIn{to{opacity:1;transform:translateY(0)}}.motion-btn{cursor:pointer;border:none;border-radius:4px;padding:12px 24px;font-size:.9375rem;font-weight:500}.motion-btn-before{background:var(--color-charcoal);color:var(--color-paper)}.motion-btn-after{background:var(--color-text);color:var(--color-paper);transition:transform .2s cubic-bezier(.34,1.56,.64,1),box-shadow .2s}.motion-btn-after:hover{transform:translateY(-2px);box-shadow:0 4px 12px #00000026}.motion-btn-after:active{transform:translateY(0)scale(.98)}.motion-card{padding:var(--spacing-md);background:var(--color-bg);border:1px solid var(--color-mist);text-align:center;border-radius:6px;min-width:140px}.motion-card-icon{margin-bottom:var(--spacing-xs);font-size:1.5rem}.motion-card-text{color:var(--color-charcoal);font-size:.8125rem}.motion-card-after{transition:all .3s cubic-bezier(.34,1.56,.64,1)}.demo-viewport[data-state=after] .motion-card-after{background:var(--color-accent)}@supports (color:color-mix(in lab, red, red)){.demo-viewport[data-state=after] .motion-card-after{background:color-mix(in oklch, var(--color-accent) 10%, var(--color-paper))}}.demo-viewport[data-state=after] .motion-card-after{border-color:var(--color-accent)}.demo-viewport[data-state=after] .motion-card-after .motion-card-icon{animation:.4s cubic-bezier(.34,1.56,.64,1) checkPop}@keyframes checkPop{50%{transform:scale(1.3)}}.typo-demo{text-align:left;width:100%;max-width:320px}.typo-pairing-before{font-family:Inter,system-ui,sans-serif}.typo-pairing-before .typo-heading{margin-bottom:var(--spacing-xs);font-size:1.5rem;font-weight:600}.typo-pairing-before .typo-body{color:var(--color-ash);font-size:.9375rem;line-height:1.5}.typo-pairing-after .typo-heading{font-family:var(--font-display);letter-spacing:-.02em;margin-bottom:var(--spacing-sm);color:var(--color-text);font-size:2rem;font-style:italic;font-weight:300}.typo-pairing-after .typo-body{font-family:var(--font-body);color:var(--color-charcoal);font-size:.9375rem;line-height:1.7}.typo-hierarchy-before .typo-h1{margin-bottom:4px;font-size:1.125rem;font-weight:600}.typo-hierarchy-before .typo-meta{color:var(--color-ash);margin-bottom:var(--spacing-xs);font-size:.9375rem}.typo-hierarchy-before .typo-p{color:var(--color-charcoal);font-size:.875rem;line-height:1.5}.typo-hierarchy-after .typo-h1{font-family:var(--font-display);letter-spacing:-.03em;margin-bottom:2px;font-size:2.25rem;font-weight:300;line-height:1.1}.typo-hierarchy-after .typo-meta{text-transform:uppercase;letter-spacing:.12em;color:var(--color-accent);margin-bottom:var(--spacing-md);font-size:.6875rem}.typo-hierarchy-after .typo-p{color:var(--color-ash);font-size:.9375rem;line-height:1.7}.int-demo{gap:var(--spacing-md);flex-direction:column;width:100%;max-width:280px;display:flex}.int-states-demo{gap:var(--spacing-lg)}.int-state-row{align-items:center;gap:var(--spacing-md);display:flex}.int-state-label{text-transform:uppercase;letter-spacing:.08em;color:var(--color-ash);width:40px;font-size:.6875rem}.int-btn{padding:var(--spacing-sm) var(--spacing-md);cursor:pointer;border-radius:4px;flex:1;font-size:.875rem;font-weight:500}.int-btn-poor{background:var(--color-charcoal);color:var(--color-paper);border:none}.int-btn-good{background:var(--color-text);color:var(--color-paper);border:2px solid #0000;transition:all .15s}.int-btn-good:hover{background:var(--color-charcoal)}.int-btn-good:focus{border-color:var(--color-accent);box-shadow:0 0 0 3px var(--color-accent);outline:none}@supports (color:color-mix(in lab, red, red)){.int-btn-good:focus{box-shadow:0 0 0 3px color-mix(in oklch, var(--color-accent) 25%, transparent)}}.int-btn-good:active{transform:scale(.98)}.int-aff-item{padding:var(--spacing-sm) var(--spacing-md);cursor:pointer;border-radius:4px;font-size:.875rem}.int-aff-poor{color:var(--color-charcoal)}.int-aff-good{color:var(--color-accent);text-underline-offset:2px;text-decoration:underline}.int-aff-good:after{content:" →"}.int-affordance-after .int-aff-item{background:var(--color-bg);border:1px solid var(--color-mist);color:var(--color-accent);text-underline-offset:2px;text-decoration:underline;transition:background .15s}.int-affordance-after .int-aff-item:hover{background:var(--color-accent)}@supports (color:color-mix(in lab, red, red)){.int-affordance-after .int-aff-item:hover{background:color-mix(in oklch, var(--color-accent) 5%, var(--color-paper))}}.int-affordance-after .int-aff-item:after{content:" →"}.int-feedback-before,.int-feedback-after{align-items:center;gap:var(--spacing-md);flex-direction:row;display:flex}.int-fb-btn{cursor:pointer;border:none;border-radius:50%;justify-content:center;align-items:center;width:48px;height:48px;display:flex}.int-fb-btn svg{width:22px;height:22px}.int-fb-silent{background:var(--color-mist);color:var(--color-ash)}.int-fb-active{background:var(--color-charcoal);color:var(--color-paper);transition:all .15s cubic-bezier(.34,1.56,.64,1)}.int-fb-active:hover{transform:scale(1.1)}.int-fb-active:active{transform:scale(.95)}.int-fb-active.liked{background:var(--color-accent);animation:.35s cubic-bezier(.34,1.56,.64,1) heartPop}@keyframes heartPop{50%{transform:scale(1.25)}}.int-fb-label{color:var(--color-charcoal);font-size:.875rem}.color-demo{width:100%;max-width:300px}.color-palette-before,.color-palette-after{gap:var(--spacing-xs);padding:var(--spacing-md);background:var(--color-paper);border:1px solid var(--color-mist);border-radius:6px;flex-wrap:wrap;display:flex}.color-swatch{border-radius:4px;width:40px;height:40px;transition:background .2s}.color-card{width:100%;margin-top:var(--spacing-sm);padding:var(--spacing-sm);background:var(--color-paper);border:1px solid var(--color-mist);border-radius:4px;flex-direction:column;gap:4px;display:flex}.color-card span{font-size:.8125rem;font-weight:500;transition:color .2s}.color-card button{cursor:pointer;border:none;border-radius:3px;padding:6px;font-size:.75rem;font-weight:500;transition:all .2s}.color-palette-before .swatch-1{background:#ff6b6b}.color-palette-before .swatch-2{background:#4ecdc4}.color-palette-before .swatch-3{background:#ffe66d}.color-palette-before .swatch-4{background:#95e1d3}.color-palette-before .swatch-5{background:#f38181}.color-palette-before .card-title{color:#ff6b6b}.color-palette-before .card-subtitle{color:#4ecdc4}.color-palette-before .card-btn{color:#333;background:#ffe66d}.color-palette-after .swatch-1{background:var(--color-text)}.color-palette-after .swatch-2{background:var(--color-charcoal)}.color-palette-after .swatch-3{background:var(--color-ash)}.color-palette-after .swatch-4{background:var(--color-mist)}.color-palette-after .swatch-5{background:var(--color-accent)}.color-palette-after .card-title{color:var(--color-text)}.color-palette-after .card-subtitle{color:var(--color-ash)}.color-palette-after .card-btn{background:var(--color-accent);color:var(--color-paper)}.color-accent-card{padding:var(--spacing-md);border-radius:6px}.color-accent-before .color-accent-card{background:#f5f5f5;border:1px solid #e0e0e0}.color-accent-before .color-accent-title{color:#333;margin-bottom:4px;font-weight:600}.color-accent-before .color-accent-text{color:#666;margin-bottom:var(--spacing-sm);font-size:.8125rem}.color-accent-before .color-accent-btn{width:100%;padding:var(--spacing-xs);color:#fff;cursor:pointer;background:#333;border:none;border-radius:4px;font-size:.8125rem}.color-accent-after .color-accent-card{background:var(--color-accent)}@supports (color:color-mix(in lab, red, red)){.color-accent-after .color-accent-card{background:color-mix(in oklch, var(--color-accent) 8%, var(--color-paper))}}.color-accent-after .color-accent-card{border:1px solid var(--color-accent)}@supports (color:color-mix(in lab, red, red)){.color-accent-after .color-accent-card{border:1px solid color-mix(in oklch, var(--color-accent) 20%, var(--color-paper))}}.color-accent-after .color-accent-title{color:var(--color-text);margin-bottom:4px;font-weight:600}.color-accent-after .color-accent-text{color:var(--color-ash);margin-bottom:var(--spacing-sm);font-size:.8125rem}.color-accent-after .color-accent-btn{width:100%;padding:var(--spacing-xs);background:var(--color-accent);color:var(--color-paper);cursor:pointer;border:none;border-radius:4px;font-size:.8125rem;font-weight:500}.color-contrast-static{gap:var(--spacing-sm);flex-direction:column;display:flex}.contrast-example{padding:var(--spacing-md);text-align:center;border-radius:6px}.contrast-fail{color:#a0a0a0;background:#f0f0f0}.contrast-pass{background:var(--color-charcoal);color:var(--color-paper)}.contrast-badge{text-transform:uppercase;letter-spacing:.1em;border-radius:2px;margin-bottom:4px;padding:2px 6px;font-size:.5625rem;font-weight:600;display:inline-block}.contrast-fail .contrast-badge{background:#ddd}.contrast-pass .contrast-badge{background:var(--color-accent);color:var(--color-paper)}.contrast-text{margin-bottom:2px;font-size:1rem;font-weight:500}.contrast-ratio{opacity:.7;font-size:.6875rem}.resp-demo{width:100%;max-width:340px}.resp-touch-demo{gap:var(--spacing-lg);flex-direction:column;display:flex}.resp-touch-row{align-items:center;gap:var(--spacing-md);display:flex}.resp-label{text-transform:uppercase;letter-spacing:.08em;color:var(--color-ash);width:70px;font-size:.6875rem}.resp-touch-targets{gap:4px;display:flex}.resp-touch-targets button{cursor:pointer;border:none;border-radius:4px;font-weight:500}.resp-touch-bad button{background:var(--color-mist);width:24px;height:24px;color:var(--color-ash);font-size:.75rem}.resp-touch-good button{background:var(--color-text);width:44px;height:44px;color:var(--color-paper);font-size:1rem}.resp-fluid-demo{padding:var(--spacing-md);background:var(--color-bg);border:1px solid var(--color-mist);border-radius:6px}.resp-fluid-container{gap:var(--spacing-md);flex-direction:column;display:flex}.resp-fluid-fixed,.resp-fluid-adaptive{color:var(--color-ash);font-size:.75rem}.resp-fluid-fixed span,.resp-fluid-adaptive span{margin-bottom:4px;display:block}.resp-fluid-bar{background:var(--color-mist);border-radius:4px;height:24px}.resp-fluid-adaptive .resp-fluid-bar{background:var(--color-accent)}.resp-adapt-demo{gap:var(--spacing-sm);align-items:flex-end;display:flex}.resp-device{text-align:center}.resp-device>span{color:var(--color-ash);text-transform:uppercase;letter-spacing:.08em;margin-top:4px;font-size:.625rem;display:block}.resp-device-screen{background:var(--color-paper);border:2px solid var(--color-mist);border-radius:4px;flex-direction:column;gap:3px;padding:4px;display:flex}.resp-device-mobile .resp-device-screen{width:50px;height:80px}.resp-device-tablet .resp-device-screen{width:80px;height:60px}.resp-device-desktop .resp-device-screen{width:120px;height:70px}.resp-block{background:var(--color-mist);border-radius:2px}.resp-block-row{flex:1;gap:3px;display:flex}.resp-header{background:var(--color-charcoal);height:16px}.resp-sidebar{background:var(--color-charcoal);width:30%}.resp-content{flex:1}@keyframes fadeIn{to{opacity:1}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}*,:before,:after{box-sizing:border-box}*{margin:0}img,picture,video,canvas,svg{max-width:100%;display:block}button,input,textarea,select{font:inherit}:root{--font-display:"Cormorant Garamond", Georgia, serif;--font-body:"Instrument Sans", system-ui, sans-serif;--font-mono:"Space Grotesk", monospace;--spacing-xs:8px;--spacing-sm:16px;--spacing-md:24px;--spacing-lg:32px;--spacing-xl:48px;--spacing-2xl:80px;--spacing-3xl:120px;--width-max:1400px;--width-content:900px;--ease-out:cubic-bezier(.16, 1, .3, 1);--ease-in-out:cubic-bezier(.65, 0, .35, 1);--ease-spring:cubic-bezier(.34, 1.56, .64, 1);--duration-fast:.15s;--duration-base:.3s;--duration-slow:.6s;--duration-slower:.8s;--duration-slowest:1.2s;--color-ink:oklch(10% 0 0);--color-text:oklch(10% 0 0);--color-paper:oklch(98% 0 0);--color-cream:oklch(96% .005 350);--color-charcoal:oklch(25% 0 0);--color-ash:oklch(55% 0 0);--color-mist:oklch(92% 0 0);--color-bg:oklch(96% .005 350);--color-accent:oklch(60% .25 350);--color-accent-hover:oklch(52% .25 350);--color-accent-dim:oklch(60% .25 350/.15);--color-accent-soft:oklch(60% .25 350/.25);--cat-diagnostic-bg:#fdf4ff;--cat-diagnostic-border:#d946ef;--cat-diagnostic-text:#a21caf;--cat-quality-bg:#f0fdf4;--cat-quality-border:#22c55e;--cat-quality-text:#15803d;--cat-intensity-bg:#fffbeb;--cat-intensity-border:#f59e0b;--cat-intensity-text:#b45309;--cat-adaptation-bg:#eff6ff;--cat-adaptation-border:#3b82f6;--cat-adaptation-text:#1d4ed8;--cat-enhancement-bg:#fdf2f8;--cat-enhancement-border:#ec4899;--cat-enhancement-text:#be185d;--cat-system-bg:#f5f5f4;--cat-system-border:#78716c;--cat-system-text:#44403c}.skip-link{z-index:10000;padding:var(--spacing-sm) var(--spacing-lg);background:var(--color-ink);color:var(--color-paper);border-radius:0 0 8px 8px;font-weight:600;text-decoration:none;transition:top .2s;position:absolute;top:-100%;left:50%;transform:translate(-50%)}.skip-link:focus{outline:2px solid var(--color-accent);outline-offset:2px;top:0}.section-nav{bottom:var(--spacing-md);z-index:100;-webkit-backdrop-filter:blur(12px);border:1px solid var(--color-mist);opacity:0;pointer-events:none;transition:opacity .4s var(--ease-out), transform .4s var(--ease-out);background:oklch(98% 0 0/.85);border-radius:100px;align-items:center;gap:2px;padding:4px;display:flex;position:fixed;left:50%;transform:translate(-50%)translateY(20px);box-shadow:0 4px 24px -4px #0000001f,0 1px 3px #0000000f}.section-nav.is-visible{opacity:1;pointer-events:auto;transform:translate(-50%)translateY(0)}.section-nav-item{border-radius:100px;align-items:center;gap:4px;padding:8px 12px;text-decoration:none;transition:background .2s,color .2s;display:flex}.section-nav-item:hover{background:var(--color-mist);text-decoration:none}.section-nav-item.is-active{background:var(--color-ink)}.section-nav-item.is-active .section-nav-num,.section-nav-item.is-active .section-nav-label{color:var(--color-paper)}.section-nav-num{font-family:var(--font-mono);color:var(--color-ash);letter-spacing:.02em;font-size:.5625rem;font-weight:500;transition:color .2s}.section-nav-label{font-family:var(--font-body);color:var(--color-charcoal);white-space:nowrap;font-size:.6875rem;font-weight:500;transition:color .2s}@media (max-width:700px){.section-nav-label{display:none}.section-nav-item{padding:8px 10px}}@media (max-width:400px){.section-nav{display:none}}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizelegibility;overflow-x:clip}body{font-family:var(--font-body);color:var(--color-text);background:var(--color-paper);min-height:100dvh;font-size:16px;line-height:1.625;overflow-x:clip}h1,h2,h3,h4,h5,h6{font-family:var(--font-display);letter-spacing:-.02em;color:var(--color-ink);font-weight:400;line-height:1.1}a{color:var(--color-accent);text-underline-offset:2px;transition:color var(--duration-fast) var(--ease-out), text-decoration-color var(--duration-fast) var(--ease-out);text-decoration:underline;text-decoration-thickness:1px}a:hover{color:var(--color-accent-hover);text-decoration-thickness:2px}.btn,.footer-logo,[class*=nav-item]{text-decoration:none}strong{color:var(--color-ink);font-weight:600}code{font-family:var(--font-mono);background:var(--color-accent-dim);color:var(--color-accent);border-radius:4px;padding:.15em .4em;font-size:.9em}::selection{background:var(--color-accent-soft);color:var(--color-ink)}.grain-overlay{pointer-events:none;z-index:9999;opacity:.03;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");background-repeat:repeat;position:fixed;inset:0}.site-content{max-width:var(--width-max);padding:0 var(--spacing-lg);margin:0 auto}@media (max-width:768px){.site-content{padding:0 var(--spacing-md)}}.section-header{margin-bottom:var(--spacing-lg);position:relative}.section-number{font-family:var(--font-mono);letter-spacing:.05em;color:var(--color-ash);margin-bottom:var(--spacing-xs);text-transform:uppercase;font-size:.625rem;font-weight:500;display:block}.section-title{margin:0;font-size:clamp(1.75rem,4vw,2.5rem);font-weight:400;line-height:1.2}.section-subtitle{color:var(--color-charcoal);margin-top:var(--spacing-sm);max-width:55ch;font-size:1rem;line-height:1.6}.cheatsheet-link{color:var(--color-accent);margin-left:.5em;font-size:.875rem;text-decoration:none}.cheatsheet-link:hover{text-decoration:underline}.section-lead{color:var(--color-charcoal);max-width:55ch;margin-bottom:var(--spacing-lg);font-size:1rem;line-height:1.6}.hero-combined{min-height:100dvh;padding:var(--spacing-lg) 0 var(--spacing-2xl);background:var(--color-paper);flex-direction:column;justify-content:center;display:flex;position:relative}.github-link{top:var(--spacing-md);right:var(--spacing-lg);z-index:10;color:var(--color-ash);align-items:center;gap:6px;text-decoration:none;transition:color .2s;display:flex;position:absolute}.github-link:hover{color:var(--color-ink);text-decoration:none}.github-stars{font-family:var(--font-mono);color:var(--color-ash);font-size:.75rem;font-weight:500;transition:color .2s}.github-link:hover .github-stars{color:var(--color-ink)}.hero-combined-container{max-width:var(--width-max);padding:0 var(--spacing-lg);gap:var(--spacing-xl);grid-template-columns:1fr 1fr;align-items:center;width:100%;margin:0 auto;display:grid}@media (max-width:1024px){.hero-combined-container{gap:var(--spacing-lg);text-align:center;grid-template-columns:1fr}}.hero-combined-left{gap:var(--spacing-md);flex-direction:column;display:flex}@media (max-width:1024px){.hero-combined-left{align-items:center}}.hero-title-combined{font-family:var(--font-display);letter-spacing:-.02em;color:var(--color-ink);margin:0;font-size:clamp(2.5rem,7vw,4.5rem);font-style:italic;font-weight:300;line-height:1}.hero-tagline-combined{font-family:var(--font-display);color:var(--color-charcoal);margin:0;font-size:clamp(1.125rem,2.5vw,1.75rem);font-style:italic;font-weight:400;line-height:1.3}.hero-hook-text{color:var(--color-charcoal);max-width:45ch;margin:0;font-size:1rem;line-height:1.6}.hero-included-box{border:1px solid var(--color-mist);background:0 0;flex-direction:column;gap:6px;max-width:45ch;padding:10px 14px;display:flex}.hero-included-title{font-family:var(--font-body);text-transform:uppercase;letter-spacing:.1em;color:var(--color-ash);font-size:.5625rem;font-weight:500}.hero-included-items{color:var(--color-charcoal);flex-wrap:wrap;align-items:center;gap:6px;font-size:.8125rem;line-height:1.5;display:flex}.hero-included-items em{font-style:normal;font-family:var(--font-mono);font-size:.75rem}.hero-included-sep{color:var(--color-mist)}@media (max-width:500px){.hero-included-items{flex-direction:column;align-items:flex-start;gap:4px}.hero-included-sep{display:none}}.hero-cta-group{align-items:center;gap:var(--spacing-lg);margin-top:var(--spacing-sm);display:flex}@media (max-width:600px){.hero-cta-group{gap:var(--spacing-md);flex-direction:column}}.hero-cta-combined{padding:var(--spacing-sm) var(--spacing-xl);font-family:var(--font-body);letter-spacing:.05em;text-transform:uppercase;color:var(--color-paper);background:var(--color-ink);border:none;font-size:.9rem;font-weight:500;text-decoration:none;transition:transform .2s,background .2s;display:inline-block}.hero-cta-combined:hover{background:var(--color-accent);color:var(--color-paper);transform:translateY(-2px)}.hero-logos-inline{flex-direction:column;align-items:flex-start;gap:6px;display:flex}.hero-logos-inline .hero-logos-label{color:var(--color-ash);letter-spacing:.03em;font-size:.6875rem}.hero-logos-inline .hero-logos-row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.hero-logos-inline .hero-logos-row img{opacity:.7;border-radius:4px;transition:opacity .2s}.hero-logos-inline .hero-logos-row img:hover{opacity:1}.hero-combined-right{justify-content:center;display:flex}.hero-combined-right .split-comparison{width:100%;max-width:520px}.hero-combined-right .split-container{max-width:100%}.hero-bias-tags{align-items:center;gap:var(--spacing-xs);margin-top:var(--spacing-lg);padding-top:var(--spacing-md);border-top:1px solid var(--color-mist);max-width:var(--width-max);width:100%;padding-bottom:var(--spacing-md);flex-direction:column;margin-left:auto;margin-right:auto;display:flex}.problem-section{padding:var(--spacing-2xl) 0;border-top:1px solid var(--color-mist)}.problem-content{gap:var(--spacing-xl);display:grid}.split-comparison{width:100%;max-width:600px;margin:-20px auto;padding:20px;position:relative}.split-container{background:var(--color-cream);border:1px solid var(--color-mist);cursor:ew-resize;-webkit-user-select:none;user-select:none;border-radius:12px;width:100%;max-width:500px;height:380px;margin:0 auto;position:relative;overflow:hidden}.split-before,.split-after{justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.split-before{z-index:1}.split-content{justify-content:center;align-items:center;width:100%;height:100%;display:flex}.split-after{clip-path:polygon(58% 0%,100% 0%,100% 100%,42% 100%);z-index:2;background:var(--color-paper)}.split-divider{background:var(--color-accent);pointer-events:none;z-index:3;width:3px;position:absolute;top:0;bottom:0;left:50%;transform:translate(-50%)skew(-10deg);box-shadow:0 0 20px #00000026}.split-label{letter-spacing:.08em;text-transform:uppercase;color:var(--color-paper);background:var(--color-accent);white-space:nowrap;border-radius:4px;padding:6px 14px;font-size:.6875rem;font-weight:600;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)skew(10deg);box-shadow:0 2px 8px #0003}.slop-card{background:linear-gradient(135deg,#f5f3ff 0%,#ede9fe 50%,#ddd6fe 100%);border-radius:16px;flex-direction:column;width:280px;height:280px;padding:24px;font-family:Inter,system-ui,sans-serif;display:flex;box-shadow:0 4px 6px -1px #0000001a}.slop-header{align-items:center;gap:12px;margin-bottom:16px;display:flex}.slop-avatar{background:linear-gradient(135deg,#8b5cf6,#7c3aed);border-radius:50%;flex-shrink:0;width:40px;height:40px}.slop-text{flex:1}.slop-title{color:#1f2937;margin-bottom:2px;font-size:14px;font-weight:600}.slop-subtitle{color:#6b7280;font-size:12px}.slop-body{color:#4b5563;flex:1;margin-bottom:auto;font-size:13px;line-height:1.5}.slop-button{color:#fff;cursor:pointer;background:linear-gradient(135deg,#8b5cf6,#7c3aed);border:none;border-radius:8px;width:100%;margin-top:auto;padding:10px 20px;font-family:Inter,system-ui,sans-serif;font-size:13px;font-weight:500}.slop-callouts{pointer-events:none;position:absolute;inset:0}.slop-callout{text-transform:uppercase;letter-spacing:.06em;color:var(--color-accent);background:var(--color-paper);border:1px solid var(--color-accent);white-space:nowrap;opacity:0;animation:calloutFadeIn .4s var(--ease-out) forwards;border-radius:3px;padding:4px 8px;font-size:.625rem;font-weight:600;position:absolute;box-shadow:0 2px 8px #0000001a}.slop-callout[data-point=font]{animation-delay:.1s;top:15%;right:5%}.slop-callout[data-point=gradient]{animation-delay:.25s;top:40%;left:5%}.slop-callout[data-point=copy]{animation-delay:.4s;bottom:35%;right:8%}.slop-callout[data-point=rounded]{animation-delay:.55s;bottom:12%;left:10%}@keyframes calloutFadeIn{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.impeccable-card{background:var(--color-paper);border:1px solid var(--color-mist);width:280px;height:300px;padding:var(--spacing-lg);text-align:left;flex-direction:column;display:flex}.impeccable-eyebrow{font-family:var(--font-mono);letter-spacing:.15em;text-transform:uppercase;color:var(--color-accent);margin-bottom:var(--spacing-xs);font-size:.625rem;font-weight:500}.impeccable-title{font-family:var(--font-display);color:var(--color-ink);margin-bottom:var(--spacing-sm);font-size:1.75rem;font-style:italic;font-weight:300;line-height:1.1}.impeccable-body{color:var(--color-ash);flex:1;margin-bottom:auto;font-size:.875rem;line-height:1.6}.impeccable-button{margin-top:var(--spacing-sm);background:var(--color-ink);color:var(--color-paper);font-family:var(--font-body);letter-spacing:.03em;cursor:pointer;transition:all var(--duration-base) var(--ease-out);border:none;align-self:flex-start;padding:.625rem 1.5rem;font-size:.8125rem;font-weight:500;display:inline-flex}.impeccable-button:hover{background:var(--color-accent)}.split-labels{justify-content:center;gap:var(--spacing-xl);margin-top:var(--spacing-md);display:flex}.split-label-item{align-items:center;gap:var(--spacing-xs);color:var(--color-ash);font-size:.8125rem;display:flex}.split-label-dot{background:var(--color-mist);border-radius:50%;width:8px;height:8px}.split-label-dot--accent{background:var(--color-accent)}.solution-section{padding:var(--spacing-2xl) 0}.solution-content{gap:var(--spacing-lg);display:grid}.solution-content .section-lead{margin-bottom:0}.solution-visual{gap:var(--spacing-lg);grid-template-columns:1fr auto 1fr;align-items:stretch;display:grid}@media (max-width:900px){.solution-visual{gap:var(--spacing-md);grid-template-columns:1fr}}.solution-visual-interactive{background:var(--color-paper);border:1px solid var(--color-mist);border-radius:8px;width:100%;min-height:380px;position:relative;overflow:hidden}.solution-pillar{background:var(--color-cream);border:1px solid var(--color-mist);padding:var(--spacing-lg);transition:all var(--duration-base) var(--ease-out)}.solution-pillar:hover{border-color:var(--color-accent);box-shadow:0 20px 60px var(--color-accent-dim);transform:translateY(-4px)}.pillar-header{text-align:center;margin-bottom:var(--spacing-lg);padding-bottom:var(--spacing-md);border-bottom:1px solid var(--color-mist)}.pillar-icon{background:var(--color-accent-dim);width:56px;height:56px;color:var(--color-accent);margin-bottom:var(--spacing-sm);border-radius:50%;justify-content:center;align-items:center;display:inline-flex}.pillar-title{font-family:var(--font-display);margin:0 0 var(--spacing-xs);font-size:1.75rem;font-weight:400}.pillar-subtitle{color:var(--color-ash);margin:0;font-size:.875rem}.pillar-content{gap:var(--spacing-sm);flex-direction:column;display:flex}.pillar-item{padding:var(--spacing-sm);background:var(--color-paper);transition:all var(--duration-fast) var(--ease-out);border-radius:4px;justify-content:space-between;align-items:center;display:flex}.pillar-item:hover{background:var(--color-accent-dim)}.pillar-item-name{color:var(--color-ink);font-size:.9375rem;font-weight:500}.pillar-item-code{font-family:var(--font-mono);color:var(--color-accent);background:0 0;padding:0;font-size:.875rem;font-weight:500}.pillar-item-desc{color:var(--color-ash);font-size:.75rem}.pillar-item--more{color:var(--color-accent);border:1px dashed var(--color-mist);background:0 0;justify-content:center;font-size:.8125rem;font-weight:500}.solution-connector{justify-content:center;align-items:center;display:flex}.connector-plus{font-family:var(--font-display);color:var(--color-accent);opacity:.5;font-size:3rem;font-weight:300}@media (max-width:900px){.solution-connector{padding:var(--spacing-sm) 0}.connector-plus{font-size:2rem}}.skills-section{padding:var(--spacing-2xl) 0;border-top:1px solid var(--color-mist)}.skills-gallery{gap:var(--spacing-xl);grid-template-columns:200px 1fr;align-items:start;display:grid}@media (max-width:968px){.skills-gallery{gap:var(--spacing-lg);grid-template-columns:1fr}}.skills-nav{top:var(--spacing-lg);flex-direction:column;gap:2px;display:flex;position:sticky}@media (max-width:968px){.skills-nav{gap:var(--spacing-xs);flex-flow:wrap;position:static}}.skill-nav-item{padding:var(--spacing-sm) var(--spacing-md);color:var(--color-ash);font-family:var(--font-body);cursor:pointer;text-align:left;background:0 0;border:none;border-left:2px solid #0000;font-size:.9375rem;font-weight:400;text-decoration:none;transition:all .2s;display:block}.skill-nav-item:hover{color:var(--color-text);background:var(--color-cream)}.skill-nav-item.active{color:var(--color-accent);border-left-color:var(--color-accent);background:var(--color-accent-dim);font-weight:500}@media (max-width:968px){.skill-nav-item{padding:var(--spacing-xs) var(--spacing-md);border-bottom:2px solid #0000;border-left:none}.skill-nav-item.active{border-bottom-color:var(--color-accent)}}.skills-showcase{gap:var(--spacing-lg);grid-template-columns:1.2fr 1fr;align-items:start;display:grid}@media (max-width:1100px){.skills-showcase{grid-template-columns:1fr}}.loading-state{padding:var(--spacing-xl);text-align:center;color:var(--color-ash);font-style:italic}.mobile-commands-layout{display:none}@media (max-width:900px){.mobile-commands-layout{gap:var(--spacing-md);flex-direction:column;display:flex}.commands-container{display:none}}.mobile-carousel-wrapper{-webkit-overflow-scrolling:touch;scrollbar-width:none;padding:var(--spacing-xs) 0;overflow-x:auto}.mobile-carousel-wrapper::-webkit-scrollbar{display:none}.mobile-carousel{gap:var(--spacing-xs);padding-right:var(--spacing-md);display:flex}.mobile-cmd-pill{padding:var(--spacing-sm) var(--spacing-md);min-height:44px;font-family:var(--font-mono);color:var(--color-ash);background:var(--color-cream);border:1px solid var(--color-mist);cursor:pointer;white-space:nowrap;border-radius:100px;flex-shrink:0;font-size:.8125rem;font-weight:500;transition:all .2s}.mobile-cmd-pill:hover{color:var(--color-charcoal);border-color:var(--color-charcoal)}.mobile-cmd-pill.active{color:var(--color-paper);background:var(--color-ink);border-color:var(--color-ink)}.mobile-demo-area{background:var(--color-cream);border:1px solid var(--color-mist);padding:var(--spacing-sm);border-radius:8px}.mobile-demo-area .demo-split-comparison{width:100%}.mobile-demo-area .split-container{width:100%;max-width:100%;height:320px}.mobile-demo-area .demo-caption{margin-top:var(--spacing-sm);font-size:.75rem}.mobile-info-area{padding-top:var(--spacing-sm)}.mobile-cmd-info{padding:var(--spacing-sm) 0;display:none}.mobile-cmd-info.active{display:block}.mobile-cmd-name{font-family:var(--font-mono);color:var(--color-ink);margin:0 0 var(--spacing-xs) 0;font-size:1.125rem;font-weight:600}.mobile-cmd-desc{color:var(--color-charcoal);margin:0;font-size:.875rem;line-height:1.5}.mobile-cmd-rel{margin-top:var(--spacing-xs);color:var(--color-ash);font-size:.75rem}.mobile-cmd-rel code{font-family:var(--font-mono);color:var(--color-ink)}.downloads-section{padding:var(--spacing-2xl) 0;border-top:1px solid var(--color-mist)}.downloads-grid{gap:var(--spacing-lg);grid-template-columns:repeat(auto-fit,minmax(280px,1fr));display:grid}.download-card{text-align:center;padding:var(--spacing-lg);background:var(--color-cream);border:1px solid var(--color-mist);transition:all var(--duration-base) var(--ease-out);flex-direction:column;align-items:center;display:flex}.download-card:hover{border-color:var(--color-accent);box-shadow:0 20px 60px var(--color-accent-dim);transform:translateY(-4px)}.download-card-icon{margin-bottom:var(--spacing-sm)}.download-card-icon img{object-fit:contain;border-radius:8px;width:40px;height:40px}.download-card-title{font-family:var(--font-display);margin:0 0 var(--spacing-sm) 0;font-size:1.25rem;font-weight:400}.download-card-note{color:var(--color-ash);margin-bottom:var(--spacing-xs);font-size:.75rem}.download-card .btn{margin-top:var(--spacing-xs)}.install-command{align-items:center;gap:var(--spacing-xs);background:var(--color-paper);border:1px solid var(--color-mist);padding:var(--spacing-sm);margin-top:var(--spacing-sm);border-radius:6px;width:100%;display:flex}.install-command code{font-family:var(--font-mono);color:var(--color-ink);white-space:nowrap;text-overflow:ellipsis;background:0 0;flex:1;padding:0;font-size:.75rem;overflow:hidden}.copy-btn{border:1px solid var(--color-mist);width:28px;height:28px;color:var(--color-ash);cursor:pointer;transition:all var(--duration-fast) var(--ease-out);background:0 0;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;display:flex}.copy-btn:hover{background:var(--color-accent-dim);border-color:var(--color-accent);color:var(--color-accent)}.copy-btn.copied{background:var(--color-accent);border-color:var(--color-accent);color:var(--color-paper)}.install-hint{color:var(--color-ash);margin:var(--spacing-xs) 0 0 0;font-size:.75rem}.install-hint code{font-family:var(--font-mono);background:var(--color-mist);border-radius:3px;padding:2px 5px;font-size:.6875rem}.download-card-details{width:100%;margin-top:var(--spacing-sm);text-align:left;font-size:.8125rem}.download-card-details summary{cursor:pointer;color:var(--color-ash);padding:var(--spacing-xs) 0;justify-content:center;align-items:center;gap:4px;font-size:.75rem;list-style:none;display:flex}.download-card-details summary:before{content:"▶";transition:transform var(--duration-fast) var(--ease-out);font-size:.5rem}.download-card-details[open] summary:before{transform:rotate(90deg)}.download-card-details summary::-webkit-details-marker{display:none}.download-card-details ol{margin:var(--spacing-sm) 0;padding-left:var(--spacing-md);color:var(--color-charcoal);line-height:1.6}.download-card-details li{margin-bottom:4px}.download-card-details code{font-family:var(--font-mono);background:var(--color-mist);border-radius:3px;padding:2px 5px;font-size:.6875rem}.download-card-details a{color:var(--color-accent);font-size:.75rem;text-decoration:none}.download-card-details a:hover{text-decoration:underline}.opensource-section{padding:var(--spacing-2xl) 0;border-top:1px solid var(--color-mist);text-align:center}.opensource-content{align-items:center;gap:var(--spacing-md);flex-direction:column;max-width:500px;margin:0 auto;display:flex}.opensource-title{font-size:clamp(1.5rem,4vw,2rem);font-weight:300}.opensource-desc{color:var(--color-ash);font-size:1.125rem;line-height:1.6}.site-footer{border-top:1px solid var(--color-mist);padding:var(--spacing-xl) var(--spacing-lg);background:var(--color-cream)}.footer-content{max-width:var(--width-max);justify-content:space-between;align-items:center;gap:var(--spacing-lg);flex-wrap:wrap;margin:0 auto;display:flex}@media (max-width:768px){.footer-content{text-align:center;flex-direction:column}}.footer-brand{gap:var(--spacing-xs);flex-direction:column;display:flex}.footer-logo{font-family:var(--font-display);color:var(--color-ink);font-size:1.25rem;font-weight:400}.footer-tagline{color:var(--color-ash);font-size:.875rem}.footer-links{gap:var(--spacing-lg);flex-wrap:wrap;display:flex}.footer-links a{color:var(--color-ash);transition:color var(--duration-fast) var(--ease-out);font-size:.875rem}.footer-links a:hover{color:var(--color-accent)}.footer-author{justify-content:center;align-items:center;gap:var(--spacing-md);width:100%;padding-top:var(--spacing-lg);margin-top:var(--spacing-md);border-top:1px solid var(--color-mist);flex-wrap:wrap;display:flex}.footer-author-label{color:var(--color-ash);font-size:.875rem}.footer-author-label a{color:var(--color-text);transition:color var(--duration-fast) var(--ease-out)}.footer-author-label a:hover{color:var(--color-accent)}.footer-author-links{align-items:center;gap:var(--spacing-sm);display:flex}.footer-social-link{width:36px;height:36px;color:var(--color-ash);transition:all var(--duration-fast) var(--ease-out);background:0 0;border-radius:50%;justify-content:center;align-items:center;text-decoration:none;display:flex}.footer-social-link:hover{color:var(--color-accent);background:var(--color-accent-dim)}.footer-author-divider{background:var(--color-mist);width:1px;height:20px;margin:0 var(--spacing-xs)}.footer-newsletter{color:var(--color-text);background:var(--color-paper);border:1px solid var(--color-mist);transition:all var(--duration-fast) var(--ease-out);border-radius:100px;align-items:center;gap:6px;padding:8px 14px;font-size:.875rem;font-weight:500;text-decoration:none;display:inline-flex}.footer-newsletter:hover{border-color:var(--color-accent);color:var(--color-accent)}.footer-newsletter svg{transition:transform var(--duration-fast) var(--ease-out)}.footer-newsletter:hover svg{transform:translate(3px)}@media (max-width:768px){.footer-author{gap:var(--spacing-sm);flex-direction:column}.footer-author-divider{display:none}}.btn{justify-content:center;align-items:center;gap:var(--spacing-xs);font-family:var(--font-body);letter-spacing:.03em;cursor:pointer;transition:all var(--duration-base) var(--ease-out);border:none;padding:1rem 2rem;font-size:.9375rem;font-weight:600;text-decoration:none;display:inline-flex;position:relative;overflow:hidden}.btn-primary{background:var(--color-ink);color:var(--color-paper)}.btn-primary:before{content:"";background:var(--color-accent);transition:transform var(--duration-base) var(--ease-out);z-index:0;position:absolute;inset:0;transform:translateY(100%)}.btn-primary:hover:before{transform:translateY(0)}.btn-primary:hover{color:var(--color-paper)}.btn-primary span,.btn-primary svg,.btn-primary:not(:has(span)){z-index:1;position:relative}.btn-secondary{color:var(--color-ink);border:1px solid var(--color-ink);background:0 0}.btn-secondary:hover{background:var(--color-ink);color:var(--color-paper)}.btn:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.btn-primary:focus-visible{outline-color:var(--color-paper);box-shadow:0 0 0 4px var(--color-accent)}.btn-secondary:focus-visible{outline-color:var(--color-accent)}@keyframes revealUp{to{opacity:1;transform:translateY(0)}}@keyframes float{0%,to{transform:translate(-50%)translateY(0)}50%{transform:translate(-50%)translateY(-8px)}}@keyframes bounce{0%,to{transform:translateY(0)}50%{transform:translateY(4px)}}[data-reveal]{opacity:0;transition:opacity .8s var(--ease-out), transform .8s var(--ease-out);transform:translateY(30px)}[data-reveal].revealed{opacity:1;transform:translateY(0)}[data-reveal]:first-child{transition-delay:0s}[data-reveal]:nth-child(2){transition-delay:.1s}[data-reveal]:nth-child(3){transition-delay:.2s}[data-reveal]:nth-child(4){transition-delay:.3s}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}html{scroll-behavior:auto}.hero-canvas{display:none}.hero-scroll-indicator{opacity:1;animation:none}[data-reveal],.gallery-frame{opacity:1;transform:none}}.load-error{text-align:center;padding:var(--spacing-2xl) var(--spacing-lg);justify-content:center;align-items:center;gap:var(--spacing-md);background:var(--color-cream);border:1px solid var(--color-mist);border-radius:8px;flex-direction:column;display:flex}.load-error-icon{color:var(--color-accent);font-size:2.5rem}.load-error-title{font-family:var(--font-display);color:var(--color-ink);margin:0;font-size:1.5rem;font-weight:400}.load-error-text{color:var(--color-ash);max-width:40ch;font-size:1rem;line-height:1.5}.load-error-retry{margin-top:var(--spacing-sm)}.bias-tags{align-items:center;gap:var(--spacing-sm);margin-top:var(--spacing-lg);flex-direction:column;display:flex}.bias-tags-label{font-family:var(--font-mono);letter-spacing:.1em;text-transform:uppercase;color:var(--color-ash);font-size:.6875rem;font-weight:500}.bias-tags-list{justify-content:center;gap:var(--spacing-xs);flex-wrap:wrap;display:flex}.bias-tag{background:var(--color-cream);border:1px solid var(--color-mist);color:var(--color-charcoal);transition:all var(--duration-fast) var(--ease-out);padding:6px 12px;font-size:.75rem;font-weight:500}.bias-tag:hover{border-color:var(--color-accent);color:var(--color-accent)}.antidote-section{padding:var(--spacing-2xl) 0;border-top:1px solid var(--color-mist)}.antidote-grid{margin-bottom:var(--spacing-xl)}.disclosure-list{--dl-gap:6px;--dl-base:52px;--dl-speed:.5s;--dl-easing:linear(0 0%, .15 4%, .29 8%, .42 13%, .53 17%, .63 22%, .71 27%, .78 32%, .84 37%, .89 42%, .93 48%, .95 54%, .98 60%, .99 67%, 1 75%, 1 100%);gap:var(--dl-gap);height:clamp(320px,38dvh,420px);transition:grid-template-columns var(--dl-speed) var(--dl-easing);grid-template-columns:10fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;margin:0;padding:0;list-style:none;display:grid}.disclosure-item{min-width:var(--dl-base);border:1px solid var(--color-mist);cursor:pointer;background:#fff;border-radius:8px;position:relative;overflow:hidden}.disclosure-tab{cursor:pointer;background:0 0;border:none;flex-direction:column;justify-content:space-between;align-items:center;width:100%;height:100%;padding:0;display:flex;position:absolute;inset:0}.disclosure-tab-label{top:var(--spacing-sm);left:calc(var(--dl-base) * .5);transform-origin:0;font-family:var(--font-body);text-transform:uppercase;color:var(--color-ink);letter-spacing:.03em;white-space:nowrap;opacity:.5;transition:opacity calc(var(--dl-speed) * 1.2) var(--dl-easing);font-size:.8125rem;font-weight:500;position:absolute;rotate:90deg}.disclosure-tab-icon{bottom:var(--spacing-sm);color:var(--color-accent);opacity:.5;transition:opacity calc(var(--dl-speed) * 1.2) var(--dl-easing);font-size:1rem;font-weight:600;position:absolute;left:50%;transform:translate(-50%)}.disclosure-item[data-active=true] .disclosure-tab-label{opacity:1}.disclosure-item[data-active=true] .disclosure-tab-icon{opacity:0}.disclosure-content{width:calc(var(--dl-article-width,600) * 1px);opacity:0;height:100%;transition:opacity calc(var(--dl-speed) * 1.2) var(--dl-easing);flex-direction:column;display:flex;position:absolute;top:0;left:0;overflow:hidden}.disclosure-item[data-active=true] .disclosure-content{opacity:1;transition-delay:calc(var(--dl-speed) * .2)}.disclosure-content-inner{padding:var(--spacing-sm) var(--spacing-md) var(--spacing-md) calc(var(--dl-base) + var(--spacing-sm));flex:1;overflow:hidden auto}.disclosure-columns{gap:var(--spacing-sm);flex-direction:column;display:flex}.disclosure-toggle{border:1px solid var(--color-mist);margin:var(--spacing-sm) var(--spacing-sm) 0 0;border-radius:5px;flex-shrink:0;align-self:flex-end;gap:0;display:inline-flex;overflow:hidden}.disclosure-toggle-btn{font-family:var(--font-body);text-transform:uppercase;letter-spacing:.05em;cursor:pointer;color:var(--color-ash);transition:background var(--duration-fast), color var(--duration-fast);background:0 0;border:none;padding:3px 10px;font-size:.625rem;font-weight:600}.disclosure-toggle-btn+.disclosure-toggle-btn{border-left:1px solid var(--color-mist)}.disclosure-toggle-btn.is-active{color:var(--color-ink);background:oklch(97% .005 350)}.disclosure-toggle-btn--anti.is-active{color:var(--color-accent)}.disclosure-toggle-btn--do.is-active{color:var(--color-success,#22c55e)}.disclosure-col[hidden]{display:none}.disclosure-col ul{flex-direction:column;gap:6px;margin:0;padding:0;list-style:none;display:flex}.disclosure-col li{padding-left:var(--spacing-sm);color:var(--color-charcoal);overflow-wrap:break-word;word-break:break-word;font-size:.9375rem;line-height:1.55;position:relative}.disclosure-col-label{text-transform:uppercase;letter-spacing:.1em;margin-bottom:8px;font-size:.625rem;font-weight:600;display:block}.disclosure-col-label--anti{color:var(--color-accent)}.disclosure-col-label--do{color:var(--color-success,#22c55e)}.disclosure-col[data-col=anti] li:before{content:"×";color:var(--color-accent);font-weight:600;position:absolute;left:0}.disclosure-col[data-col=do] li:before{content:"✓";color:var(--color-success,#22c55e);font-weight:600;position:absolute;left:0}@media (max-width:768px){.disclosure-list{height:auto;min-height:500px;transition:grid-template-rows var(--dl-speed) var(--dl-easing);grid-template-rows:10fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;grid-template-columns:1fr}.disclosure-item{min-width:0;min-height:var(--dl-base)}.disclosure-tab-label{top:50%;left:var(--spacing-md);transform:translateY(-50%)}.disclosure-tab-icon{bottom:50%;left:auto;right:var(--spacing-md);transform:translateY(50%)}.disclosure-content-inner{padding:calc(var(--dl-base) + var(--spacing-sm)) var(--spacing-md) var(--spacing-md)}.disclosure-columns{gap:var(--spacing-md);grid-template-columns:1fr}}.antidote-row{gap:var(--spacing-lg);margin-bottom:var(--spacing-lg);align-items:stretch;display:flex}.antidote-row .antidote-grid{flex:1;min-width:0;margin-bottom:0}.gallery-sidebar{border:1px solid var(--color-mist);min-width:0;max-width:400px;padding:var(--spacing-sm);gap:var(--spacing-xs);border-radius:12px;flex-direction:column;flex:0 0 32%;max-height:clamp(320px,38dvh,420px);display:flex;overflow:hidden}.gallery-sidebar-title{font-family:var(--font-display);color:var(--color-ink);padding:var(--spacing-xs) var(--spacing-xs) 0;font-size:1.125rem;font-weight:600}.gallery-sidebar-scroll{scrollbar-width:none;flex:1;grid-template-columns:1fr 1fr;gap:6px;display:grid;overflow-y:auto}.gallery-sidebar-scroll::-webkit-scrollbar{display:none}.gallery-sidebar-card{transition:background var(--duration-fast) var(--ease-out);border-radius:8px;flex-direction:column;gap:4px;padding:4px;text-decoration:none;display:flex;overflow:hidden}.gallery-sidebar-card:hover{background:oklch(97% .005 350)}.gallery-sidebar-card img{object-fit:cover;object-position:top left;border:1px solid var(--color-mist);border-radius:6px;width:100%;height:72px}.gallery-sidebar-label{color:var(--color-charcoal);padding:0 2px;font-size:.6875rem;font-weight:600}.gallery-sidebar-link{color:var(--color-accent);text-align:center;padding:var(--spacing-xs) 0 0;border-top:1px solid var(--color-mist);font-size:.75rem;font-weight:500;text-decoration:none}.gallery-sidebar-link:hover{text-decoration:underline}.detection-callout{margin-bottom:var(--spacing-xl);border:1px solid var(--color-mist);padding:var(--spacing-sm) var(--spacing-md);border-radius:8px}.detection-callout-inner{align-items:center;gap:var(--spacing-md);flex-wrap:wrap;display:flex}.detection-badge{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.05em;color:var(--color-accent);border:1px solid var(--color-accent);border-radius:99px;flex-shrink:0;padding:2px 10px;font-size:.625rem;font-weight:600}.detection-desc{color:var(--color-ash);flex:1;min-width:200px;font-size:.8125rem;line-height:1.55}.detection-desc code{font-family:var(--font-mono);color:var(--color-charcoal);font-size:.8125rem}.detection-cmd{font-family:var(--font-mono);color:var(--color-charcoal);white-space:nowrap;background:oklch(96% .005 350);border-radius:6px;flex-shrink:0;padding:6px 14px;font-size:.8125rem}.detection-cmd:before{content:"➜ ";color:var(--color-accent)}@media (max-width:1060px){.antidote-row{flex-direction:column}.gallery-sidebar{flex:none;width:100%;max-width:none;max-height:none}.gallery-sidebar-scroll{grid-template-columns:repeat(3,1fr)}}@media (max-width:600px){.gallery-sidebar-scroll{grid-template-columns:1fr 1fr}}.antidote-footer{text-align:center}.antidote-suggest-link{color:var(--color-ash);font-size:.8125rem;text-decoration:none}.antidote-suggest-link:hover{color:var(--color-accent);text-decoration:underline}.pillar-item--main{background:var(--color-accent-dim);border:1px solid var(--color-accent)}.pillar-item--main .pillar-item-name{color:var(--color-accent);font-size:1.125rem;font-weight:600}.pillar-item--ref{padding:var(--spacing-xs) var(--spacing-sm);background:0 0}.pillar-item-label{text-transform:uppercase;letter-spacing:.05em;color:var(--color-ash);font-size:.75rem;font-weight:500}.pillar-refs{gap:var(--spacing-xs);padding:0 var(--spacing-sm);flex-wrap:wrap;display:flex}.pillar-ref{text-transform:uppercase;letter-spacing:.03em;background:var(--color-paper);color:var(--color-ash);border:1px solid var(--color-mist);transition:all var(--duration-fast) var(--ease-out);border-radius:3px;padding:4px 10px;font-size:.6875rem;font-weight:500}.pillar-ref:hover{border-color:var(--color-accent);color:var(--color-accent)}.pillar-command-group{align-items:center;gap:var(--spacing-xs);padding:var(--spacing-sm);background:var(--color-paper);border-radius:4px;flex-wrap:wrap;display:flex}.pillar-group-label{text-transform:uppercase;letter-spacing:.05em;color:var(--color-ash);width:100%;margin-bottom:4px;font-size:.6875rem;font-weight:600}.pillar-command-group .pillar-item-code{background:var(--color-accent-dim);border-radius:3px;padding:4px 8px;font-size:.8125rem}.platforms-section{padding:var(--spacing-2xl) 0;border-top:1px solid var(--color-mist)}.platforms-section .section-subtitle{max-width:60ch}.install-steps{gap:var(--spacing-xl);max-width:640px;margin:0 auto var(--spacing-xl);flex-direction:column;display:flex}.install-step-header{align-items:flex-start;gap:var(--spacing-md);margin-bottom:var(--spacing-md);display:flex}.install-step-number{border:1.5px solid var(--color-accent);width:40px;height:40px;color:var(--color-accent);font-family:var(--font-display);border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;font-size:1.125rem;font-weight:600;line-height:1;display:flex}.install-step-meta{padding-top:6px}.install-step-title{margin:0;font-size:1.125rem;font-weight:600;line-height:1.4}.install-step-desc{color:var(--color-ash);margin:2px 0 0;font-size:.875rem}.install-subscribe{max-width:640px;margin:0 auto}.install-subscribe iframe{max-width:100%;display:block}.install-subscribe-btn{letter-spacing:.03em;color:var(--color-paper);background:var(--color-ink);border:1px solid var(--color-ink);transition:all var(--duration-base) var(--ease-out);flex-shrink:0;align-items:center;gap:10px;padding:1rem 2rem;font-size:.9375rem;font-weight:600;text-decoration:none;display:inline-flex;position:relative;overflow:hidden}.install-subscribe-btn:before{content:"";background:var(--color-accent);transition:transform var(--duration-base) var(--ease-out);z-index:0;position:absolute;inset:0;transform:translateY(100%)}.install-subscribe-btn:hover:before{transform:translateY(0)}.install-subscribe-btn svg,.install-subscribe-btn span{z-index:1;position:relative}.install-subscribe-btn:hover{color:var(--color-paper)}.install-subscribe-note{color:var(--color-ash);margin:0;font-size:.8125rem;line-height:1.5}@media (max-width:600px){.install-subscribe{flex-direction:column;align-items:flex-start}}.install-terminal{max-width:640px;margin:0 auto}.install-terminal .glass-terminal{height:auto}.install-terminal .terminal-body{flex-direction:column;padding:0;display:flex}.install-terminal-row{padding:var(--spacing-md) var(--spacing-lg);flex-direction:column;gap:6px;display:flex}.install-terminal-label{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.1em;color:var(--color-ash);font-size:.625rem;font-weight:600}.install-terminal-cmd{align-items:center;gap:var(--spacing-sm);display:flex}.install-terminal-cmd .terminal-prompt{flex-shrink:0}.install-terminal-cmd code{font-family:var(--font-mono);color:var(--color-ink);white-space:nowrap;text-overflow:ellipsis;background:0 0;flex:1;padding:0;font-size:.9375rem;overflow:hidden}.install-terminal-cmd .copy-btn{flex-shrink:0}.install-terminal-cmd .btn{padding:.5rem 1rem;font-size:.8125rem}.install-terminal-note{color:var(--color-ash);padding-left:calc(.75rem + var(--spacing-sm));font-size:.75rem}.install-terminal-note code{font-family:var(--font-mono);background:var(--color-mist);color:var(--color-ink);border-radius:3px;padding:2px 5px;font-size:.6875rem}.install-terminal-divider{background:var(--color-mist);height:1px;margin:0}@media (max-width:600px){.install-terminal-row{padding:var(--spacing-sm) var(--spacing-md)}.install-terminal-cmd code{font-size:.75rem}}.install-providers{align-items:center;gap:var(--spacing-sm);margin-top:var(--spacing-md);flex-direction:column;display:flex}.install-providers-label{text-transform:uppercase;letter-spacing:.1em;color:var(--color-ash);font-size:.75rem;font-weight:600}.install-providers-row{justify-content:center;gap:var(--spacing-sm);flex-wrap:wrap;display:flex}.install-provider-badge{color:var(--color-charcoal);align-items:center;gap:6px;font-size:.8125rem;display:flex}.install-provider-badge img{border-radius:4px}.install-alternatives{max-width:640px;margin:var(--spacing-sm) auto 0}.install-alternatives-toggle{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;color:var(--color-ash);cursor:pointer;padding:var(--spacing-sm) 0;transition:color var(--duration-fast) var(--ease-out);align-items:center;gap:6px;font-size:.75rem;font-weight:600;list-style:none;display:flex}.install-alternatives-toggle::-webkit-details-marker{display:none}.install-alternatives-toggle:before{content:"";width:0;height:0;transition:transform var(--duration-fast) var(--ease-out);border-top:4px solid #0000;border-bottom:4px solid #0000;border-left:5px solid;display:inline-block}.install-alternatives[open] .install-alternatives-toggle:before{transform:rotate(90deg)}.install-alternatives-toggle:hover{color:var(--color-charcoal)}.install-alternatives-content{border:1px solid var(--color-mist);background:var(--color-paper);animation:altFadeIn .2s var(--ease-out);border-radius:8px;overflow:hidden}@keyframes altFadeIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.install-alt-method{padding:var(--spacing-md) var(--spacing-lg)}.install-alt-label{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.1em;color:var(--color-ash);margin-bottom:6px;font-size:.625rem;font-weight:600;display:block}.install-alt-method .install-terminal-cmd{align-items:center;gap:var(--spacing-sm);display:flex}.install-alt-method .terminal-prompt{color:var(--color-accent);font-family:var(--font-mono);-webkit-user-select:none;user-select:none;font-weight:700}.install-alt-method code{font-family:var(--font-mono);color:var(--color-ink);font-size:.875rem}.install-alt-note{color:var(--color-ash);margin-top:4px;font-size:.75rem;display:block}.install-alt-note code{font-family:var(--font-mono);background:var(--color-mist);color:var(--color-ink);border-radius:3px;padding:2px 5px;font-size:.6875rem}.install-alt-download{align-items:center;gap:var(--spacing-sm);display:flex}.install-alt-divider{background:var(--color-mist);height:1px}.install-prefix-options{align-items:flex-start;gap:var(--spacing-sm);margin-top:var(--spacing-md);display:flex}.install-prefix-option{border:1.5px solid var(--color-mist);cursor:pointer;transition:all var(--duration-fast) var(--ease-out);border-radius:8px;flex:1;align-items:flex-start;gap:8px;padding:10px 12px;line-height:1;display:flex}.install-prefix-option:hover{border-color:var(--color-charcoal)}.install-prefix-option:has(input:checked){border-color:var(--color-accent)}.install-prefix-option input{appearance:none;border:1.5px solid var(--color-mist);width:16px;height:16px;transition:all var(--duration-fast) var(--ease-out);border-radius:50%;flex-shrink:0;margin:0;position:relative}.install-prefix-option input:checked{border-color:var(--color-accent);background:var(--color-accent)}.install-prefix-option input:checked:after{content:"";background:var(--color-paper);border-radius:50%;width:6px;height:6px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.install-prefix-option input:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.install-prefix-option-content{flex-direction:column;gap:3px;padding-top:1px;display:flex}.install-prefix-option-label{color:var(--color-ink);font-size:.8125rem;font-weight:600;line-height:1}.install-prefix-option-examples{flex-wrap:wrap;gap:4px;display:flex}.install-prefix-option-examples code{font-family:var(--font-mono);background:var(--color-accent-dim);color:var(--color-accent);border-radius:3px;padding:2px 6px;font-size:.6875rem}.install-prefix-option-wrap{flex-direction:column;flex:1;align-self:flex-start;gap:4px;display:flex}.install-prefix-reason{color:var(--color-ash);padding-left:2px;font-size:.6875rem;line-height:1.4}.install-prefix-option-label code{font-family:var(--font-mono);background:var(--color-accent-dim);color:var(--color-accent);border-radius:3px;padding:1px 5px;font-size:.6875rem}.install-alt-method .install-prefix-options,.install-alt-method .install-alt-download{margin-top:var(--spacing-sm)}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}@media (max-width:600px){.install-prefix-options{flex-direction:column}.install-alt-method{padding:var(--spacing-sm) var(--spacing-md)}.install-alt-method code{font-size:.75rem}}.has-tooltip{cursor:default;position:relative}.has-tooltip:after{content:attr(data-tooltip);background:var(--color-ink);color:var(--color-paper);white-space:nowrap;pointer-events:none;opacity:0;z-index:100;border-radius:6px;padding:6px 10px;font-size:.6875rem;line-height:1.4;transition:opacity .15s;position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%)}.has-tooltip:hover:after{opacity:1}.hero-logo-icon{align-items:center;display:inline-flex}.download-tip{color:var(--color-ash);margin-top:var(--spacing-sm);text-align:center;font-size:.8125rem}.download-tip a{color:var(--color-accent);text-decoration:none}.download-tip a:hover{text-decoration:underline}.consulting-section{padding:var(--spacing-xl) 0;border-top:1px solid var(--color-mist)}.consulting-content{justify-content:space-between;align-items:center;gap:var(--spacing-lg);flex-wrap:wrap;display:flex}.consulting-actions{gap:var(--spacing-sm);flex-shrink:0;display:flex}.consulting-text{flex:1;min-width:280px}.consulting-title{margin:0 0 var(--spacing-sm) 0;font-size:clamp(1.5rem,4vw,2rem);font-style:italic;font-weight:300}.consulting-desc{color:var(--color-charcoal);max-width:45ch;margin:0;font-size:1rem;line-height:1.6}@media (max-width:600px){.consulting-content{flex-direction:column;align-items:flex-start}.consulting-actions{flex-direction:column;width:100%}.consulting-actions .btn{justify-content:center;width:100%}} \ No newline at end of file diff --git a/public/index.html b/public/index.html index 8cd300a03..90ab7155f 100644 --- a/public/index.html +++ b/public/index.html @@ -163,17 +163,56 @@

    The Antidote

    -

    AI-generated UIs share the same tells. Impeccable curates the patterns and anti-patterns across typography, color, layout, motion, and more, plus an automated detector that catches 16 of them in your code.

    +

    Every AI model learned from the same templates. Without intervention, they all produce the same predictable mistakes. Impeccable names them, detects them, and teaches the AI to avoid them.

    - -
    - + + -
    - /critique catches all of these. 16 are flagged deterministically with visual browser overlays. The rest through LLM analysis. - Gallery of Shame → - Suggest a pattern → + +
    +
    + Deterministic +

    25 patterns are caught automatically by the CLI and browser overlay -- no LLM needed. The rest are caught by /critique through design analysis.

    + npx impeccable detect src/ +
    +
    + +
    diff --git a/source/skills/impeccable/SKILL.md b/source/skills/impeccable/SKILL.md index b45aa3317..07a5c3f50 100644 --- a/source/skills/impeccable/SKILL.md +++ b/source/skills/impeccable/SKILL.md @@ -12,12 +12,12 @@ This skill guides creation of distinctive, production-grade frontend interfaces Design skills produce generic output without project context. You MUST have confirmed design context before doing any design work. -**Required context** — every design skill needs at minimum: +**Required context** (every design skill needs at minimum): - **Target audience**: Who uses this product and in what context? - **Use cases**: What jobs are they trying to get done? - **Brand personality/tone**: How should the interface feel? -Individual skills may require additional context — check the skill's preparation section for specifics. +Individual skills may require additional context. Check the skill's preparation section for specifics. **CRITICAL**: You cannot infer this context by reading the codebase. Code tells you what was built, not who it's for or what it should feel like. Only the creator can provide this context. @@ -36,7 +36,7 @@ Commit to a BOLD aesthetic direction: - **Constraints**: Technical requirements (framework, performance, accessibility). - **Differentiation**: What makes this UNFORGETTABLE? What's the one thing someone will remember? -**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work—the key is intentionality, not intensity. +**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work. The key is intentionality, not intensity. Then implement working code that is: - Production-grade and functional @@ -53,9 +53,9 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis **DO**: Use a modular type scale with fluid sizing (clamp) **DO**: Vary font weights and sizes to create clear visual hierarchy -**DON'T**: Use overused fonts—Inter, Roboto, Arial, Open Sans, system defaults +**DON'T**: Use overused fonts like Inter, Roboto, Arial, Open Sans, or system defaults **DON'T**: Use monospace typography as lazy shorthand for "technical/developer" vibes -**DON'T**: Put large icons with rounded corners above every heading—they rarely add value and make sites look templated +**DON'T**: Put large icons with rounded corners above every heading. They rarely add value and make sites look templated ### Color & Theme → *Consult [color reference](reference/color-and-contrast.md) for OKLCH, palettes, and dark mode.* @@ -63,64 +63,64 @@ Choose fonts that are beautiful, unique, and interesting. Pair a distinctive dis Commit to a cohesive palette. Dominant colors with sharp accents outperform timid, evenly-distributed palettes. **DO**: Use modern CSS color functions (oklch, color-mix, light-dark) for perceptually uniform, maintainable palettes -**DO**: Tint your neutrals toward your brand hue—even a subtle hint creates subconscious cohesion -**DON'T**: Use gray text on colored backgrounds—it looks washed out; use a shade of the background color instead -**DON'T**: Use pure black (#000) or pure white (#fff)—always tint; pure black/white never appears in nature +**DO**: Tint your neutrals toward your brand hue. Even a subtle hint creates subconscious cohesion +**DON'T**: Use gray text on colored backgrounds; it looks washed out. Use a shade of the background color instead +**DON'T**: Use pure black (#000) or pure white (#fff). Always tint; pure black/white never appears in nature **DON'T**: Use the AI color palette: cyan-on-dark, purple-to-blue gradients, neon accents on dark backgrounds -**DON'T**: Use gradient text for "impact"—especially on metrics or headings; it's decorative rather than meaningful -**DON'T**: Default to dark mode with glowing accents—it looks "cool" without requiring actual design decisions +**DON'T**: Use gradient text for "impact," especially on metrics or headings. It's decorative rather than meaningful +**DON'T**: Default to dark mode with glowing accents. It looks "cool" without requiring actual design decisions ### Layout & Space → *Consult [spatial reference](reference/spatial-design.md) for grids, rhythm, and container queries.* -Create visual rhythm through varied spacing—not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. +Create visual rhythm through varied spacing, not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. -**DO**: Create visual rhythm through varied spacing—tight groupings, generous separations +**DO**: Create visual rhythm through varied spacing: tight groupings, generous separations **DO**: Use fluid spacing with clamp() that breathes on larger screens **DO**: Use asymmetry and unexpected compositions; break the grid intentionally for emphasis -**DON'T**: Wrap everything in cards—not everything needs a container -**DON'T**: Nest cards inside cards—visual noise, flatten the hierarchy -**DON'T**: Use identical card grids—same-sized cards with icon + heading + text, repeated endlessly -**DON'T**: Use the hero metric layout template—big number, small label, supporting stats, gradient accent -**DON'T**: Center everything—left-aligned text with asymmetric layouts feels more designed -**DON'T**: Use the same spacing everywhere—without rhythm, layouts feel monotonous +**DON'T**: Wrap everything in cards. Not everything needs a container +**DON'T**: Nest cards inside cards. Visual noise; flatten the hierarchy +**DON'T**: Use identical card grids (same-sized cards with icon + heading + text, repeated endlessly) +**DON'T**: Use the hero metric layout template (big number, small label, supporting stats, gradient accent) +**DON'T**: Center everything. Left-aligned text with asymmetric layouts feels more designed +**DON'T**: Use the same spacing everywhere. Without rhythm, layouts feel monotonous ### Visual Details **DO**: Use intentional, purposeful decorative elements that reinforce brand -**DON'T**: Use glassmorphism everywhere—blur effects, glass cards, glow borders used decoratively rather than purposefully -**DON'T**: Use rounded elements with thick colored border on one side—a lazy accent that almost never looks intentional -**DON'T**: Use sparklines as decoration—tiny charts that look sophisticated but convey nothing meaningful -**DON'T**: Use rounded rectangles with generic drop shadows—safe, forgettable, could be any AI output -**DON'T**: Use modals unless there's truly no better alternative—modals are lazy +**DON'T**: Use glassmorphism everywhere (blur effects, glass cards, glow borders used decoratively rather than purposefully) +**DON'T**: Use rounded elements with thick colored border on one side. A lazy accent that almost never looks intentional +**DON'T**: Use sparklines as decoration. Tiny charts that look sophisticated but convey nothing meaningful +**DON'T**: Use rounded rectangles with generic drop shadows. Safe, forgettable, could be any AI output +**DON'T**: Use modals unless there's truly no better alternative. Modals are lazy ### Motion → *Consult [motion reference](reference/motion-design.md) for timing, easing, and reduced motion.* Focus on high-impact moments: one well-orchestrated page load with staggered reveals creates more delight than scattered micro-interactions. -**DO**: Use motion to convey state changes—entrances, exits, feedback +**DO**: Use motion to convey state changes: entrances, exits, feedback **DO**: Use exponential easing (ease-out-quart/quint/expo) for natural deceleration **DO**: For height animations, use grid-template-rows transitions instead of animating height directly -**DON'T**: Animate layout properties (width, height, padding, margin)—use transform and opacity only -**DON'T**: Use bounce or elastic easing—they feel dated and tacky; real objects decelerate smoothly +**DON'T**: Animate layout properties (width, height, padding, margin). Use transform and opacity only +**DON'T**: Use bounce or elastic easing. They feel dated and tacky; real objects decelerate smoothly ### Interaction → *Consult [interaction reference](reference/interaction-design.md) for forms, focus, and loading patterns.* -Make interactions feel fast. Use optimistic UI—update immediately, sync later. +Make interactions feel fast. Use optimistic UI: update immediately, sync later. -**DO**: Use progressive disclosure—start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) +**DO**: Use progressive disclosure. Start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) **DO**: Design empty states that teach the interface, not just say "nothing here" **DO**: Make every interactive surface feel intentional and responsive -**DON'T**: Repeat the same information—redundant headers, intros that restate the heading -**DON'T**: Make every button primary—use ghost buttons, text links, secondary styles; hierarchy matters +**DON'T**: Repeat the same information (redundant headers, intros that restate the heading) +**DON'T**: Make every button primary. Use ghost buttons, text links, secondary styles; hierarchy matters ### Responsive → *Consult [responsive reference](reference/responsive-design.md) for mobile-first, fluid design, and container queries.* **DO**: Use container queries (@container) for component-level responsiveness -**DO**: Adapt the interface for different contexts—don't just shrink it -**DON'T**: Hide critical functionality on mobile—adapt the interface, don't amputate it +**DO**: Adapt the interface for different contexts, not just shrink it +**DON'T**: Hide critical functionality on mobile. Adapt the interface, don't amputate it ### UX Writing → *Consult [ux-writing reference](reference/ux-writing.md) for labels, errors, and empty states.* @@ -136,7 +136,7 @@ Make interactions feel fast. Use optimistic UI—update immediately, sync later. A distinctive interface should make someone ask "how was this made?" not "which AI made this?" -Review the DON'T guidelines above—they are the fingerprints of AI-generated work from 2024-2025. +Review the DON'T guidelines above. They are the fingerprints of AI-generated work from 2024-2025. --- @@ -146,7 +146,7 @@ Match implementation complexity to the aesthetic vision. Maximalist designs need Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices across generations. -Remember: {{model}} is capable of extraordinary creative work. Don't hold back—show what can truly be created when thinking outside the box and committing fully to a distinctive vision. +Remember: {{model}} is capable of extraordinary creative work. Don't hold back. Show what can truly be created when thinking outside the box and committing fully to a distinctive vision. ---