feat: add CSS generation system with custom properties and ETS cache
- Create theme-primitives.css with spacing, fonts, radius scales
- Create theme-semantic.css with semantic CSS variable aliases
- Update app.css to import theme CSS files
- Add CSSGenerator module for dynamic CSS token generation
- Generates mood variables (neutral, warm, cool, dark)
- Generates typography variables (7 font combinations)
- Generates shape variables (sharp, soft, round, pill)
- Generates density variables (spacious, balanced, compact)
- Converts hex colors to HSL for flexible manipulation
- Add CSSCache GenServer with ETS table for performance
- Caches generated CSS to avoid regeneration
- Warms cache on application startup
- Provides invalidation for theme updates
- Add CSSCache to application supervision tree
- Add comprehensive tests for CSS generation (29 tests)
- Add comprehensive tests for preset validation (14 tests)
- All tests passing (58 total tests, 0 failures)
- Verified CSS generation and caching work correctly in IEx
2025-12-30 21:41:25 +00:00
|
|
|
/* ========================================
|
|
|
|
|
THEME SEMANTIC - Layer 3
|
|
|
|
|
Semantic aliases for easy usage
|
|
|
|
|
======================================== */
|
|
|
|
|
|
2026-01-01 16:16:05 +00:00
|
|
|
.preview-frame, .shop-root {
|
2025-12-31 00:55:25 +00:00
|
|
|
/* Accent color - HSL components set dynamically by CSS generator */
|
2026-01-01 16:16:05 +00:00
|
|
|
--t-accent-h: 24;
|
|
|
|
|
--t-accent-s: 95%;
|
|
|
|
|
--t-accent-l: 53%;
|
|
|
|
|
|
feat: add CSS generation system with custom properties and ETS cache
- Create theme-primitives.css with spacing, fonts, radius scales
- Create theme-semantic.css with semantic CSS variable aliases
- Update app.css to import theme CSS files
- Add CSSGenerator module for dynamic CSS token generation
- Generates mood variables (neutral, warm, cool, dark)
- Generates typography variables (7 font combinations)
- Generates shape variables (sharp, soft, round, pill)
- Generates density variables (spacious, balanced, compact)
- Converts hex colors to HSL for flexible manipulation
- Add CSSCache GenServer with ETS table for performance
- Caches generated CSS to avoid regeneration
- Warms cache on application startup
- Provides invalidation for theme updates
- Add CSSCache to application supervision tree
- Add comprehensive tests for CSS generation (29 tests)
- Add comprehensive tests for preset validation (14 tests)
- All tests passing (58 total tests, 0 failures)
- Verified CSS generation and caching work correctly in IEx
2025-12-30 21:41:25 +00:00
|
|
|
--t-accent: hsl(var(--t-accent-h) var(--t-accent-s) var(--t-accent-l));
|
|
|
|
|
--t-accent-hover: hsl(var(--t-accent-h) var(--t-accent-s) calc(var(--t-accent-l) - 8%));
|
|
|
|
|
--t-accent-subtle: hsl(var(--t-accent-h) 40% 95%);
|
|
|
|
|
--t-accent-ring: hsl(var(--t-accent-h) var(--t-accent-s) var(--t-accent-l) / 0.4);
|
|
|
|
|
|
|
|
|
|
/* Secondary colors */
|
|
|
|
|
--t-secondary-accent: #ea580c;
|
|
|
|
|
--t-sale-color: #dc2626;
|
|
|
|
|
|
2026-01-02 13:48:03 +00:00
|
|
|
/* Font size scale - all sizes use em so they scale with --t-font-size-scale */
|
2026-01-01 16:16:05 +00:00
|
|
|
--t-font-size-scale: 1;
|
|
|
|
|
--t-heading-weight: 600;
|
feat: add CSS generation system with custom properties and ETS cache
- Create theme-primitives.css with spacing, fonts, radius scales
- Create theme-semantic.css with semantic CSS variable aliases
- Update app.css to import theme CSS files
- Add CSSGenerator module for dynamic CSS token generation
- Generates mood variables (neutral, warm, cool, dark)
- Generates typography variables (7 font combinations)
- Generates shape variables (sharp, soft, round, pill)
- Generates density variables (spacious, balanced, compact)
- Converts hex colors to HSL for flexible manipulation
- Add CSSCache GenServer with ETS table for performance
- Caches generated CSS to avoid regeneration
- Warms cache on application startup
- Provides invalidation for theme updates
- Add CSSCache to application supervision tree
- Add comprehensive tests for CSS generation (29 tests)
- Add comprehensive tests for preset validation (14 tests)
- All tests passing (58 total tests, 0 failures)
- Verified CSS generation and caching work correctly in IEx
2025-12-30 21:41:25 +00:00
|
|
|
|
2026-01-02 13:48:03 +00:00
|
|
|
/*
|
|
|
|
|
* Type Scale - Limited to 6 body sizes for design consistency
|
|
|
|
|
* These use em units so they scale with the base font size setting
|
|
|
|
|
* Body: caption, small, base, large
|
|
|
|
|
* Display: xl, 2xl (for headings and hero text)
|
|
|
|
|
*/
|
|
|
|
|
--t-text-caption: 0.75em; /* ~12px at 16px base, ~14px at 18px base */
|
|
|
|
|
--t-text-small: 0.875em; /* ~14px at 16px base, ~16px at 18px base */
|
|
|
|
|
--t-text-base: 1em; /* matches base font size setting */
|
|
|
|
|
--t-text-large: 1.125em; /* ~18px at 16px base, ~20px at 18px base */
|
|
|
|
|
--t-text-xl: 1.25em; /* ~20px at 16px base, ~22px at 18px base */
|
|
|
|
|
--t-text-2xl: 1.5em; /* ~24px at 16px base, ~27px at 18px base */
|
|
|
|
|
|
feat: implement professional typography system with curated font pairings
Typography Presets (research-backed pairings):
- clean: Manrope + Inter (minimal, modern)
- editorial: Playfair Display + Raleway (fashion, lifestyle)
- modern: Space Grotesk + Inter (tech, futuristic)
- classic: Cormorant Garamond + Source Serif 4 (luxury, elegant)
- friendly: Fraunces + Work Sans (playful, quirky)
- minimal: DM Sans + Source Serif 4 (design-forward)
- impulse: Raleway + Inter (wellness, beauty)
Type Scale & Line Heights:
- Major Third (1.25) ratio for mathematical harmony
- H1: line-height 1.1, letter-spacing -0.025em
- H2: line-height 1.15, letter-spacing -0.02em
- H3: line-height 1.2, letter-spacing -0.015em
- Body: line-height 1.5 (WCAG compliant)
- Small text: letter-spacing +0.01em for readability
Fluid Typography:
- Headings use clamp() for smooth mobile→desktop scaling
- Display: 36px→48px, XL: 30px→40px, LG: 24px→32px
Performance:
- Variable font loading where available (Inter, Manrope, etc.)
- Removed unused fonts (Libre Baskerville, Nunito, Source Sans)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 01:16:21 +00:00
|
|
|
/* Fluid heading sizes - scale smoothly between mobile and desktop */
|
|
|
|
|
--t-heading-sm: clamp(1.125rem, 1rem + 0.5vw, 1.25rem); /* 18-20px */
|
|
|
|
|
--t-heading-md: clamp(1.25rem, 1rem + 1vw, 1.5rem); /* 20-24px */
|
|
|
|
|
--t-heading-lg: clamp(1.5rem, 1rem + 2vw, 2rem); /* 24-32px */
|
|
|
|
|
--t-heading-xl: clamp(1.875rem, 1.25rem + 2.5vw, 2.5rem); /* 30-40px */
|
|
|
|
|
--t-heading-display: clamp(2.25rem, 1.5rem + 3vw, 3rem); /* 36-48px */
|
2026-01-02 13:48:03 +00:00
|
|
|
|
feat: add CSS generation system with custom properties and ETS cache
- Create theme-primitives.css with spacing, fonts, radius scales
- Create theme-semantic.css with semantic CSS variable aliases
- Update app.css to import theme CSS files
- Add CSSGenerator module for dynamic CSS token generation
- Generates mood variables (neutral, warm, cool, dark)
- Generates typography variables (7 font combinations)
- Generates shape variables (sharp, soft, round, pill)
- Generates density variables (spacious, balanced, compact)
- Converts hex colors to HSL for flexible manipulation
- Add CSSCache GenServer with ETS table for performance
- Caches generated CSS to avoid regeneration
- Warms cache on application startup
- Provides invalidation for theme updates
- Add CSSCache to application supervision tree
- Add comprehensive tests for CSS generation (29 tests)
- Add comprehensive tests for preset validation (14 tests)
- All tests passing (58 total tests, 0 failures)
- Verified CSS generation and caching work correctly in IEx
2025-12-30 21:41:25 +00:00
|
|
|
/* Layout */
|
|
|
|
|
--t-layout-max-width: 1400px;
|
|
|
|
|
--t-button-style: filled;
|
|
|
|
|
--t-card-shadow: none;
|
|
|
|
|
--t-product-text-align: left;
|
|
|
|
|
|
|
|
|
|
/* Page colors */
|
|
|
|
|
--color-page: var(--t-surface-base);
|
|
|
|
|
--color-card: var(--t-surface-raised);
|
|
|
|
|
--color-input: var(--t-surface-raised);
|
|
|
|
|
|
|
|
|
|
/* Text colors */
|
|
|
|
|
--color-heading: var(--t-text-primary);
|
|
|
|
|
--color-body: var(--t-text-secondary);
|
|
|
|
|
--color-caption: var(--t-text-tertiary);
|
|
|
|
|
|
|
|
|
|
/* Button colors */
|
|
|
|
|
--color-button-primary: var(--t-accent);
|
|
|
|
|
--color-button-primary-hover: var(--t-secondary-accent);
|
|
|
|
|
--color-button-primary-text: var(--t-text-inverse);
|
|
|
|
|
|
|
|
|
|
/* Border colors */
|
|
|
|
|
--color-border: var(--t-border-default);
|
|
|
|
|
|
|
|
|
|
/* Typography */
|
|
|
|
|
--font-heading: var(--t-font-heading);
|
|
|
|
|
--font-body: var(--t-font-body);
|
|
|
|
|
--weight-heading: var(--t-heading-weight);
|
|
|
|
|
--tracking-heading: var(--t-heading-tracking);
|
|
|
|
|
|
2026-01-01 16:16:05 +00:00
|
|
|
/* Density-aware spacing */
|
|
|
|
|
--space-xs: calc(var(--p-space-2) * var(--t-density));
|
|
|
|
|
--space-sm: calc(var(--p-space-3) * var(--t-density));
|
|
|
|
|
--space-md: calc(var(--p-space-4) * var(--t-density));
|
|
|
|
|
--space-lg: calc(var(--p-space-6) * var(--t-density));
|
|
|
|
|
--space-xl: calc(var(--p-space-8) * var(--t-density));
|
|
|
|
|
--space-2xl: calc(var(--p-space-12) * var(--t-density));
|
|
|
|
|
|
feat: add CSS generation system with custom properties and ETS cache
- Create theme-primitives.css with spacing, fonts, radius scales
- Create theme-semantic.css with semantic CSS variable aliases
- Update app.css to import theme CSS files
- Add CSSGenerator module for dynamic CSS token generation
- Generates mood variables (neutral, warm, cool, dark)
- Generates typography variables (7 font combinations)
- Generates shape variables (sharp, soft, round, pill)
- Generates density variables (spacious, balanced, compact)
- Converts hex colors to HSL for flexible manipulation
- Add CSSCache GenServer with ETS table for performance
- Caches generated CSS to avoid regeneration
- Warms cache on application startup
- Provides invalidation for theme updates
- Add CSSCache to application supervision tree
- Add comprehensive tests for CSS generation (29 tests)
- Add comprehensive tests for preset validation (14 tests)
- All tests passing (58 total tests, 0 failures)
- Verified CSS generation and caching work correctly in IEx
2025-12-30 21:41:25 +00:00
|
|
|
/* Border radius */
|
|
|
|
|
--radius-button: var(--t-radius-button);
|
|
|
|
|
--radius-card: var(--t-radius-card);
|
|
|
|
|
--radius-input: var(--t-radius-input);
|
|
|
|
|
--radius-image: var(--t-radius-image);
|
|
|
|
|
|
|
|
|
|
/* Shadows */
|
|
|
|
|
--shadow-sm:
|
|
|
|
|
0 1px 2px hsl(var(--p-shadow-color) / calc(var(--p-shadow-strength) * 0.5)),
|
|
|
|
|
0 1px 3px hsl(var(--p-shadow-color) / var(--p-shadow-strength));
|
|
|
|
|
--shadow-md:
|
2026-01-01 16:16:05 +00:00
|
|
|
0 2px 4px hsl(var(--p-shadow-color) / calc(var(--p-shadow-strength) * 0.5)),
|
feat: add CSS generation system with custom properties and ETS cache
- Create theme-primitives.css with spacing, fonts, radius scales
- Create theme-semantic.css with semantic CSS variable aliases
- Update app.css to import theme CSS files
- Add CSSGenerator module for dynamic CSS token generation
- Generates mood variables (neutral, warm, cool, dark)
- Generates typography variables (7 font combinations)
- Generates shape variables (sharp, soft, round, pill)
- Generates density variables (spacious, balanced, compact)
- Converts hex colors to HSL for flexible manipulation
- Add CSSCache GenServer with ETS table for performance
- Caches generated CSS to avoid regeneration
- Warms cache on application startup
- Provides invalidation for theme updates
- Add CSSCache to application supervision tree
- Add comprehensive tests for CSS generation (29 tests)
- Add comprehensive tests for preset validation (14 tests)
- All tests passing (58 total tests, 0 failures)
- Verified CSS generation and caching work correctly in IEx
2025-12-30 21:41:25 +00:00
|
|
|
0 4px 8px hsl(var(--p-shadow-color) / var(--p-shadow-strength)),
|
|
|
|
|
0 8px 16px hsl(var(--p-shadow-color) / calc(var(--p-shadow-strength) * 0.5));
|
|
|
|
|
|
|
|
|
|
/* Transitions */
|
|
|
|
|
--transition-fast: var(--p-duration-fast) var(--p-ease-out);
|
|
|
|
|
--transition-normal: var(--p-duration-normal) var(--p-ease-out);
|
|
|
|
|
--transition-bounce: var(--p-duration-normal) var(--p-ease-out-back);
|
|
|
|
|
}
|
2026-01-01 16:16:05 +00:00
|
|
|
|
|
|
|
|
/* Dark mode accent-subtle override */
|
|
|
|
|
.preview-frame[data-mood="dark"], .shop-root[data-mood="dark"] {
|
|
|
|
|
--t-accent-subtle: hsl(var(--t-accent-h) 30% 15%);
|
|
|
|
|
}
|
2026-01-15 00:24:25 +00:00
|
|
|
|
|
|
|
|
/* ========================================
|
|
|
|
|
ACCESSIBILITY - Focus Rings
|
|
|
|
|
Visible focus indicators for all interactive elements
|
|
|
|
|
======================================== */
|
|
|
|
|
|
|
|
|
|
/* Base focus ring style */
|
|
|
|
|
.shop-container a:focus-visible,
|
|
|
|
|
.shop-container button:focus-visible,
|
|
|
|
|
.shop-container input:focus-visible,
|
|
|
|
|
.shop-container select:focus-visible,
|
|
|
|
|
.shop-container textarea:focus-visible,
|
|
|
|
|
.shop-container [tabindex]:focus-visible,
|
|
|
|
|
.shop-container details summary:focus-visible {
|
|
|
|
|
outline: 2px solid hsl(var(--t-accent-h) var(--t-accent-s) var(--t-accent-l));
|
|
|
|
|
outline-offset: 2px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Remove default browser outlines when using focus-visible */
|
|
|
|
|
.shop-container a:focus:not(:focus-visible),
|
|
|
|
|
.shop-container button:focus:not(:focus-visible),
|
|
|
|
|
.shop-container input:focus:not(:focus-visible),
|
|
|
|
|
.shop-container select:focus:not(:focus-visible),
|
|
|
|
|
.shop-container textarea:focus:not(:focus-visible) {
|
|
|
|
|
outline: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Skip link for keyboard navigation */
|
|
|
|
|
.skip-link {
|
|
|
|
|
position: absolute;
|
|
|
|
|
top: -100px;
|
|
|
|
|
left: 50%;
|
|
|
|
|
transform: translateX(-50%);
|
|
|
|
|
background: hsl(var(--t-accent-h) var(--t-accent-s) var(--t-accent-l));
|
|
|
|
|
color: var(--t-text-inverse);
|
|
|
|
|
padding: 0.75rem 1.5rem;
|
|
|
|
|
z-index: 9999;
|
|
|
|
|
border-radius: var(--t-radius-button);
|
|
|
|
|
font-weight: 600;
|
|
|
|
|
text-decoration: none;
|
|
|
|
|
transition: top 0.2s ease;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.skip-link:focus {
|
|
|
|
|
top: 1rem;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Ensure minimum touch target size (44x44px) */
|
|
|
|
|
.shop-container .header-icon-btn {
|
|
|
|
|
min-width: 44px;
|
|
|
|
|
min-height: 44px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.shop-container .filter-pill {
|
|
|
|
|
min-height: 44px;
|
|
|
|
|
padding-left: 1rem;
|
|
|
|
|
padding-right: 1rem;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Nav link styling with active state indicator */
|
|
|
|
|
.shop-nav a {
|
|
|
|
|
padding: 0.5rem 0;
|
|
|
|
|
border-bottom: 2px solid transparent;
|
|
|
|
|
transition: border-color 0.2s ease, color 0.2s ease;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.shop-nav a:hover {
|
|
|
|
|
color: var(--t-text-primary);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.shop-nav a[aria-current="page"] {
|
|
|
|
|
color: var(--t-text-primary);
|
|
|
|
|
border-bottom-color: hsl(var(--t-accent-h) var(--t-accent-s) var(--t-accent-l));
|
|
|
|
|
}
|
feat: implement professional typography system with curated font pairings
Typography Presets (research-backed pairings):
- clean: Manrope + Inter (minimal, modern)
- editorial: Playfair Display + Raleway (fashion, lifestyle)
- modern: Space Grotesk + Inter (tech, futuristic)
- classic: Cormorant Garamond + Source Serif 4 (luxury, elegant)
- friendly: Fraunces + Work Sans (playful, quirky)
- minimal: DM Sans + Source Serif 4 (design-forward)
- impulse: Raleway + Inter (wellness, beauty)
Type Scale & Line Heights:
- Major Third (1.25) ratio for mathematical harmony
- H1: line-height 1.1, letter-spacing -0.025em
- H2: line-height 1.15, letter-spacing -0.02em
- H3: line-height 1.2, letter-spacing -0.015em
- Body: line-height 1.5 (WCAG compliant)
- Small text: letter-spacing +0.01em for readability
Fluid Typography:
- Headings use clamp() for smooth mobile→desktop scaling
- Display: 36px→48px, XL: 30px→40px, LG: 24px→32px
Performance:
- Variable font loading where available (Inter, Manrope, etc.)
- Removed unused fonts (Libre Baskerville, Nunito, Source Sans)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 01:16:21 +00:00
|
|
|
|
|
|
|
|
/* ========================================
|
|
|
|
|
TYPOGRAPHY - Line Heights & Letter Spacing
|
|
|
|
|
Research-backed values for optimal readability
|
|
|
|
|
======================================== */
|
|
|
|
|
|
|
|
|
|
/* Body text line-height - WCAG 1.5 minimum */
|
|
|
|
|
.shop-container {
|
|
|
|
|
line-height: 1.5;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Heading line-heights - tighter for large text (inverse relationship) */
|
|
|
|
|
.shop-container h1 {
|
|
|
|
|
line-height: 1.1;
|
|
|
|
|
letter-spacing: -0.025em;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.shop-container h2 {
|
|
|
|
|
line-height: 1.15;
|
|
|
|
|
letter-spacing: -0.02em;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.shop-container h3 {
|
|
|
|
|
line-height: 1.2;
|
|
|
|
|
letter-spacing: -0.015em;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.shop-container h4,
|
|
|
|
|
.shop-container h5,
|
|
|
|
|
.shop-container h6 {
|
|
|
|
|
line-height: 1.25;
|
|
|
|
|
letter-spacing: -0.01em;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Small text - slightly wider tracking for readability */
|
|
|
|
|
.shop-container .text-xs,
|
|
|
|
|
.shop-container .text-sm,
|
|
|
|
|
.shop-container .t-caption,
|
|
|
|
|
.shop-container .t-small {
|
|
|
|
|
letter-spacing: 0.01em;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ========================================
|
|
|
|
|
TYPOGRAPHY - Measure (Line Length)
|
|
|
|
|
Optimal readability: 45-75 characters
|
|
|
|
|
======================================== */
|
|
|
|
|
|
|
|
|
|
/* Prose content - ideal 65ch for comfortable reading */
|
|
|
|
|
.shop-container .prose,
|
|
|
|
|
.shop-container .product-description,
|
|
|
|
|
.shop-container .about-content {
|
|
|
|
|
max-width: 65ch;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Slightly wider for collection/category descriptions */
|
|
|
|
|
.shop-container .collection-description {
|
|
|
|
|
max-width: 75ch;
|
|
|
|
|
}
|