/* Component styles — extracted from inline styles in product.ex, layout.ex, etc. Each component gets its own section. */ @layer components { /* ── Shared heading treatment ── font-family + weight + tracking + colour used across hero titles, section headings, collection headers, PDP, etc. */ .t-heading { font-family: var(--t-font-heading); font-weight: var(--t-heading-weight); letter-spacing: var(--t-heading-tracking); color: var(--t-text-primary); } /* ── Product card ── */ .product-card { background-color: var(--t-surface-raised); border-radius: var(--t-radius-card); &[data-variant="default"], &[data-variant="compact"] { border: 1px solid var(--t-border-default); } &[data-variant="minimal"] { border: 1px solid var(--t-border-subtle); } &[data-variant="default"], &[data-variant="featured"] { cursor: pointer; } &[data-clickable] { position: relative; } & .stretched-link { color: inherit; text-decoration: none; } } .product-card-image-wrap { z-index: 1; } .product-card-placeholder { color: var(--t-text-tertiary); } .product-card-category { color: var(--t-text-tertiary); text-decoration: none; position: relative; z-index: 1; } .product-card-title { color: var(--t-text-primary); } .product-card[data-variant="default"] .product-card-title, .product-card[data-variant="compact"] .product-card-title { font-family: var(--t-font-heading); } .product-card-delivery { color: var(--t-text-tertiary); } /* ── Product prices (shared between cards and PDP) ── */ .product-price--sale { color: hsl(var(--t-accent-h) var(--t-accent-s) var(--t-accent-l)); } .product-price--compare { color: var(--t-text-tertiary); } .product-price--regular { color: var(--t-text-primary); } .product-price--secondary { color: var(--t-text-secondary); } .sale-badge { background-color: var(--t-sale-color); } /* ── Hero section ── */ .hero-section { padding: var(--space-2xl) var(--space-lg); &[data-background="base"] { background-color: var(--t-surface-base); } &[data-background="sunken"] { background-color: var(--t-surface-sunken); } } .hero-section--page { padding-top: var(--space-2xl); } .hero-pre-title { font-family: var(--t-font-heading); font-weight: var(--t-heading-weight); color: hsl(var(--t-accent-h) var(--t-accent-s) var(--t-accent-l)); } .hero-description { color: var(--t-text-secondary); line-height: 1.6; } /* ── Category nav ── */ .category-nav-section { padding: var(--space-xl) var(--space-lg); background-color: var(--t-surface-base); } .category-card { text-decoration: none; cursor: pointer; } .category-name { font-family: var(--t-font-body); color: var(--t-text-primary); } /* ── Featured products section ── */ .featured-section { padding: var(--space-xl) var(--space-lg); background-color: var(--t-surface-sunken); } .outline-button { background-color: transparent; color: var(--t-text-primary); border: 1px solid var(--t-text-primary); border-radius: var(--t-radius-button); cursor: pointer; text-decoration: none; } /* ── Image + text section ── */ .image-text-section { padding: var(--space-2xl) var(--space-lg); background-color: var(--t-surface-base); } .image-text-image { border-radius: var(--t-radius-image); } .image-text-body { color: var(--t-text-secondary); line-height: 1.7; } .accent-link { color: var(--t-accent-text, hsl(var(--t-accent-h) var(--t-accent-s) 38%)); text-decoration: none; cursor: pointer; } /* ── Collection header ── */ .collection-header-wrap { background-color: var(--t-surface-raised); border-color: var(--t-border-default); } .collection-header-meta { color: var(--t-text-secondary); } /* ── Breadcrumb ── */ .breadcrumb { color: var(--t-text-secondary); & [aria-current="page"] { color: var(--t-text-primary); } } /* ── Related products ── */ .related-section { border-top: 1px solid var(--t-border-default); } /* ── PDP gallery ── */ .pdp-gallery-frame { border-radius: var(--t-radius-image); overflow: hidden; } .pdp-thumbnail { border-radius: var(--t-radius-image); } /* ── Variant selector ── */ .variant-label { color: var(--t-text-primary); } .variant-label-value { color: var(--t-text-secondary); font-weight: normal; } .color-swatch { border-color: var(--t-border-default); &[aria-pressed="true"] { border-color: hsl(var(--t-accent-h) var(--t-accent-s) var(--t-accent-l)); --tw-ring-color: hsl(var(--t-accent-h) var(--t-accent-s) var(--t-accent-l)); } } .size-btn { border: 2px solid var(--t-border-default); border-radius: var(--t-radius-button); color: var(--t-text-primary); background: transparent; &[aria-pressed="true"] { border-color: hsl(var(--t-accent-h) var(--t-accent-s) var(--t-accent-l)); background: hsl(var(--t-accent-h) var(--t-accent-s) var(--t-accent-l) / 0.1); } } /* ── Quantity selector ── */ .qty-label { color: var(--t-text-primary); } .qty-group { border: 2px solid var(--t-border-default); border-radius: var(--t-radius-input); } .qty-btn { color: var(--t-text-primary); } .qty-display { border-color: var(--t-border-default); color: var(--t-text-primary); } .stock-in { color: var(--t-text-tertiary); } .stock-out { color: var(--t-sale-color); } /* ── Add to cart ── */ .atc-wrap { background-color: var(--t-surface-base); border-color: var(--t-border-subtle); } .atc-btn { background-color: hsl(var(--t-accent-h) var(--t-accent-s) var(--t-accent-l)); color: var(--t-text-inverse); border-radius: var(--t-radius-button); border: none; cursor: pointer; &:disabled { background-color: var(--t-border-default); cursor: not-allowed; } } /* ── Accordion ── */ .accordion-summary { color: var(--t-text-primary); } .accordion-body { color: var(--t-text-secondary); } /* ── Product details ── */ .details-wrap { border-top: 1px solid var(--t-border-subtle); border-bottom: 1px solid var(--t-border-subtle); border-color: var(--t-border-subtle); } .details-table-row { border-bottom: 1px solid var(--t-border-subtle); } .details-th { color: var(--t-text-primary); } .details-subheading { color: var(--t-text-primary); } /* ── Announcement bar ── */ .announcement-bar { background-color: var(--t-accent-button, hsl(var(--t-accent-h) var(--t-accent-s) 42%)); color: var(--t-text-inverse); text-align: center; padding: 0.5rem 1rem; font-size: var(--t-text-small); } /* ── Shop container (body-level defaults) ── */ .shop-container { background-color: var(--t-surface-base); font-family: var(--t-font-body); color: var(--t-text-primary); } /* ── Shop header ── */ .shop-header { background-color: var(--t-surface-raised); border-bottom: 1px solid var(--t-border-default); display: flex; align-items: center; } .shop-logo { display: flex; align-items: center; position: relative; z-index: 1; } .shop-logo-link { display: flex; align-items: center; text-decoration: none; } .shop-logo-img { width: auto; } .shop-logo-text { font-family: var(--t-font-heading); font-size: var(--t-text-xl); font-weight: var(--t-heading-weight); color: var(--t-text-primary); } .shop-nav { position: relative; z-index: 1; } .shop-actions { position: relative; z-index: 1; } .header-icon-btn { color: var(--t-text-secondary); border-radius: var(--t-radius-button); &:where(button) { background: none; border: none; cursor: pointer; } } .cart-badge { position: absolute; top: -4px; right: -4px; background: hsl(var(--t-accent-h) var(--t-accent-s) var(--t-accent-l)); color: var(--t-text-inverse); font-size: var(--t-text-caption); font-weight: 600; min-width: 18px; height: 18px; border-radius: 9999px; display: flex; align-items: center; justify-content: center; padding: 0 4px; } /* ── Desktop nav links ── */ .nav-link { color: var(--t-text-secondary); text-decoration: none; cursor: pointer; &[aria-current="page"] { color: var(--t-text-primary); border-bottom-color: hsl(var(--t-accent-h) var(--t-accent-s) var(--t-accent-l)); } } /* ── Mobile bottom nav ── */ .mobile-bottom-nav { position: fixed; bottom: 0; left: 0; right: 0; z-index: 100; background-color: var(--t-surface-raised); border-top: 1px solid var(--t-border-default); box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1); padding-bottom: env(safe-area-inset-bottom, 0px); & ul { margin: 0; padding: 0; list-style: none; } } .mobile-nav-link { color: var(--t-text-secondary); text-decoration: none; font-weight: 500; background-color: transparent; &[aria-current="page"] { color: hsl(var(--t-accent-h) var(--t-accent-s) calc(var(--t-accent-l) - 15%)); font-weight: 600; background-color: hsl(var(--t-accent-h) var(--t-accent-s) var(--t-accent-l) / 0.1); } } /* ── Search modal ── */ .search-modal { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.5); z-index: 1001; align-items: flex-start; justify-content: center; padding-top: 10vh; } .search-panel { background: var(--t-surface-raised); border-radius: var(--t-radius-card); overflow: hidden; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); } .search-bar { border-bottom: 1px solid var(--t-border-default); } .search-icon { color: var(--t-text-tertiary); } .search-input { font-family: var(--t-font-body); color: var(--t-text-primary); } .search-kbd { color: var(--t-text-tertiary); border: 1px solid var(--t-border-default); } .search-close { color: var(--t-text-tertiary); background: none; border: none; cursor: pointer; border-radius: var(--t-radius-button); } .search-results { max-height: 60vh; overflow-y: auto; } .search-result { text-decoration: none; color: inherit; &:hover { background: var(--t-surface-sunken); } } .search-result-thumb { background: var(--t-surface-sunken); } .search-result-title { color: var(--t-text-primary); } .search-result-meta { color: var(--t-text-tertiary); } .search-hint { color: var(--t-text-tertiary); } /* ── Shop footer ── */ .shop-footer { background-color: var(--t-surface-raised); border-top: 1px solid var(--t-border-default); } .footer-heading { font-family: var(--t-font-heading); color: var(--t-text-primary); } .footer-link { color: var(--t-text-secondary); cursor: pointer; } .footer-bottom { border-top: 1px solid var(--t-border-subtle); } .footer-copyright { color: var(--t-text-tertiary); } /* ── Cart drawer ── */ .cart-drawer-overlay { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.4); z-index: 999; opacity: 0; visibility: hidden; transition: opacity 0.3s ease, visibility 0.3s ease; } .cart-drawer { position: fixed; top: 0; right: -400px; width: 400px; max-width: 90vw; height: 100vh; height: 100dvh; background: var(--t-surface-raised); z-index: 1001; display: flex; flex-direction: column; transition: right 0.3s ease; box-shadow: -4px 0 20px rgba(0, 0, 0, 0.15); } .cart-drawer-header { display: flex; justify-content: space-between; align-items: center; padding: 1rem 1.5rem; border-bottom: 1px solid var(--t-border-default); } .cart-drawer-title { font-family: var(--t-font-heading); font-weight: var(--t-heading-weight); font-size: var(--t-text-large); color: var(--t-text-primary); margin: 0; } .cart-drawer-close { background: none; border: none; padding: 0.5rem; cursor: pointer; color: var(--t-text-secondary); } .cart-drawer-items { flex: 1; overflow-y: auto; padding: 1rem; & ul { list-style: none; margin: 0; padding: 0; } & li { border-bottom: 1px solid var(--t-border-default); } } .cart-drawer-footer { padding: 1rem 1.5rem; border-top: 1px solid var(--t-border-default); background: var(--t-surface-sunken); } .cart-drawer-total { display: flex; justify-content: space-between; font-family: var(--t-font-body); font-size: var(--t-text-base); font-weight: 600; color: var(--t-text-primary); margin-bottom: 1rem; } .cart-drawer-checkout { width: 100%; padding: 0.75rem 1.5rem; font-weight: 600; transition: all 0.2s ease; background: var(--t-accent-button, hsl(var(--t-accent-h) var(--t-accent-s) 42%)); color: var(--t-text-inverse); border-radius: var(--t-radius-button); border: none; cursor: pointer; font-family: var(--t-font-body); } /* ── Cart item row ── */ .cart-item-row { display: flex; gap: 1rem; padding: 0.75rem 0; &[data-size="compact"] { gap: 0.75rem; } } .cart-item-image { display: block; border-radius: var(--t-radius-card); background-size: cover; background-position: center; flex-shrink: 0; width: 80px; height: 80px; &[data-size="compact"] { width: 60px; height: 60px; } } .cart-item-image--empty { background-color: var(--t-surface-sunken); } .cart-item-details { flex: 1; min-width: 0; } .cart-item-name { font-family: var(--t-font-body); font-size: var(--t-text-base); font-weight: 500; margin: 0 0 2px; &[data-size="compact"] { font-size: var(--t-text-small); } & span { color: var(--t-text-primary); } } .cart-item-name-link { color: var(--t-text-primary); text-decoration: none; &:hover { text-decoration: underline; } } .cart-item-variant-text { font-family: var(--t-font-body); font-size: var(--t-text-caption); color: var(--t-text-tertiary); margin: 0; } .cart-item-actions { display: flex; justify-content: space-between; align-items: center; margin-top: 4px; flex-wrap: wrap; gap: 0.5rem; } .cart-qty-group { border: 1px solid var(--t-border-default); border-radius: var(--t-radius-input); } .cart-qty-btn { background: none; border: none; cursor: pointer; color: var(--t-text-primary); } .cart-qty-display { border-color: var(--t-border-default); color: var(--t-text-primary); min-width: 2rem; text-align: center; } .cart-qty-text { font-size: var(--t-text-caption); color: var(--t-text-tertiary); } .cart-item-price-col { flex-shrink: 0; } .cart-item-price { font-weight: 500; font-size: var(--t-text-base); color: var(--t-text-primary); margin: 0; &[data-size="compact"] { font-size: var(--t-text-small); } } .cart-remove-btn { background: none; border: none; padding: 0; cursor: pointer; font-family: var(--t-font-body); font-size: var(--t-text-caption); color: var(--t-text-tertiary); text-decoration: underline; } /* ── Cart empty state ── */ .cart-empty { color: var(--t-text-secondary); } .cart-empty-icon { color: var(--t-text-tertiary); } .cart-continue-link { color: var(--t-text-accent); text-decoration: underline; &:where(button) { background: none; border: none; cursor: pointer; } } /* ── Cart page item (full size) ── */ .cart-page-image { border-radius: var(--t-radius-image); } .cart-page-item-name { font-family: var(--t-font-heading); color: var(--t-text-primary); } .cart-page-item-variant { color: var(--t-text-secondary); } .cart-page-item-remove { color: var(--t-text-tertiary); } .cart-page-item-price { color: var(--t-text-primary); } /* ── Delivery line ── */ .delivery-line { font-family: var(--t-font-body); font-size: var(--t-text-small); color: var(--t-text-secondary); & form { display: inline; } } .delivery-select { appearance: auto; background: transparent; border: none; color: inherit; font: inherit; padding: 0; cursor: pointer; text-decoration: underline; text-underline-offset: 2px; } /* ── Order summary ── */ .order-summary-heading { font-family: var(--t-font-heading); color: var(--t-text-primary); } .order-summary-label { color: var(--t-text-secondary); } .order-summary-value { color: var(--t-text-primary); } .order-summary-divider { border-color: var(--t-border-default); } /* ── Content body ── */ .content-body { padding: var(--space-xl) var(--space-lg); max-width: 800px; margin: 0 auto; } .content-image { margin-bottom: var(--space-lg); border-radius: var(--t-radius-image); overflow: hidden; } .content-text { line-height: 1.7; } .content-page { background-color: var(--t-surface-base); } /* ── Contact form ── */ .contact-form-meta { color: var(--t-text-secondary); } .contact-form-label { color: var(--t-text-primary); } /* ── Accent email link ── */ .accent-email { color: hsl(var(--t-accent-h) var(--t-accent-s) var(--t-accent-l)); } /* ── Card shared styles (info, tracking, newsletter, social cards) ── */ .card-heading { color: var(--t-text-primary); } .card-text { color: var(--t-text-secondary); } /* ── Info card ── */ .info-card-list { color: var(--t-text-secondary); } .info-card-bullet { color: var(--t-text-tertiary); } .info-card-label { color: var(--t-text-primary); } /* ── Contact info card ── */ .contact-info-email { color: hsl(var(--t-accent-h) var(--t-accent-s) var(--t-accent-l)); text-decoration: none; } /* ── Email input min-width ── */ .email-input { min-width: 150px; } /* ── Social links card ── */ .social-link-card-item { text-decoration: none; } .social-link-card-icon { color: var(--t-text-secondary); } /* ── Social links (footer) ── */ .social-link { color: var(--t-text-secondary); border-radius: var(--t-radius-button); } /* ── Trust badges ── */ .trust-badges { background-color: var(--t-surface-sunken); border-radius: var(--t-radius-card); } .trust-badge-icon { color: hsl(var(--t-accent-h) var(--t-accent-s) var(--t-accent-l)); } .trust-badge-title { color: var(--t-text-primary); } .trust-badge-text { color: var(--t-text-secondary); } /* ── Reviews section ── */ .pdp-reviews { border-top: 1px solid var(--t-border-default); } .reviews-summary { color: var(--t-text-primary); } .reviews-count { color: var(--t-text-secondary); } /* ── Review card ── */ .review-card { border-bottom: 1px solid var(--t-border-subtle); } .review-date { color: var(--t-text-tertiary); } .review-title { color: var(--t-text-primary); } .review-body { color: var(--t-text-secondary); line-height: 1.6; } .review-author { color: var(--t-text-primary); } .review-verified { background-color: var(--t-surface-sunken); color: var(--t-text-tertiary); } /* ── Rich text ── */ .rich-text { line-height: 1.7; } .rich-text-lead { color: var(--t-text-primary); } .rich-text-paragraph { color: var(--t-text-secondary); } .rich-text-heading { font-family: var(--t-font-heading); font-weight: var(--t-heading-weight); font-size: var(--t-text-xl); color: var(--t-text-primary); } .rich-text-list { color: var(--t-text-secondary); } /* ── Flash messages ── */ .shop-flash { background-color: var(--t-surface-raised, #fff); color: var(--t-text-primary); } .shop-flash--info { border: 1px solid var(--t-border-default); } .shop-flash--error { border: 1px solid hsl(0 70% 50% / 0.3); } .shop-flash-icon--info { color: var(--t-accent); } .shop-flash-icon--error { color: hsl(0 70% 50%); } /* ── Link buttons (make links styled as buttons) ── */ .themed-button:where(a), .themed-button-outline:where(a) { text-decoration: none; display: inline-block; } /* ── Checkout success ── */ .checkout-icon { background-color: var(--t-accent); color: var(--t-accent-contrast); } .checkout-heading { font-family: var(--t-font-heading); color: var(--t-text-primary); } .checkout-meta { color: var(--t-text-secondary); & strong { color: var(--t-text-primary); } } .checkout-items { list-style: none; margin: 0; padding: 0; } .checkout-item { border-color: var(--t-border-default); } .checkout-item-name { color: var(--t-text-primary); } .checkout-item-detail { color: var(--t-text-secondary); } .checkout-item-price { color: var(--t-text-primary); } .checkout-total-border { border-color: var(--t-border-default); } .checkout-total { color: var(--t-text-primary); } .checkout-shipping-address { color: var(--t-text-secondary); } .checkout-pending-icon { background-color: var(--t-surface-sunken); } .checkout-pending-spinner { color: var(--t-text-secondary); } .checkout-pending-text { color: var(--t-text-secondary); } .checkout-pending-hint { color: var(--t-text-tertiary); } .checkout-contact-link { color: var(--t-accent); } /* ── Error page ── */ .error-main { min-height: calc(100vh - 4rem); } /* ── PDP variant fallback ── */ .pdp-variant-fallback { color: var(--t-text-secondary); } /* ── Cart page list ── */ .cart-page-list { list-style: none; margin: 0; padding: 0; } }