/* ======================================== THEME SEMANTIC - Layer 3 Semantic aliases for easy usage ======================================== */ .preview-frame, .shop-root { /* Accent color - HSL components set dynamically by CSS generator */ --t-accent-h: 24; --t-accent-s: 95%; --t-accent-l: 53%; --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; /* Font size scale - all sizes use em so they scale with --t-font-size-scale */ --t-font-size-scale: 1; --t-heading-weight: 600; /* * 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 */ /* 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 */ /* 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); /* 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)); /* 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: 0 2px 4px hsl(var(--p-shadow-color) / calc(var(--p-shadow-strength) * 0.5)), 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); } /* 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%); } /* ======================================== 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)); } /* ======================================== 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; }