@import "tailwindcss"; /* Storefront Kit examples core tokens. Transcribed from examples/core/tokens.css — the single source of truth for styling. The full token set, semantic component classes, and utilities are inlined here so the React Router example's components can rely on the same cross-example class anchors (button-primary, badge-sale, type-display, overlay-dark, drawer-right, dialog-center, consent-banner, etc.). */ @theme { /* Surfaces */ --color-surface: #ffffff; --color-surface-secondary: #e3e3e3; --color-on-surface: #000000; --color-on-surface-secondary: #6b7280; --color-border: #e5e7eb; /* ─── Brand: the single source of truth ──────────────────────────────── */ --color-primary: #1b4332; /* Interactive — derived from --color-primary. */ --color-interactive: var(--color-primary); --color-interactive-hover: color-mix(in oklab, var(--color-primary) 85%, black); --color-interactive-active: color-mix(in oklab, var(--color-primary) 72%, black); --color-interactive-text: #ffffff; /* Accent — a lighter, desaturated tint of the brand. */ --color-accent: oklch(from var(--color-primary) calc(l + 0.17) calc(c * 0.39) calc(h - 9)); /* Button variants */ --color-button-primary: var(--color-interactive); --color-button-primary-hover: var(--color-interactive-hover); --color-button-primary-active: var(--color-interactive-active); --color-button-primary-text: var(--color-interactive-text); --color-button-secondary: var(--color-surface-secondary); --color-button-secondary-text: var(--color-on-surface); --color-button-outline-border: var(--color-interactive); --color-button-outline-text: var(--color-interactive); /* Shop Pay brand button */ --color-button-shop-pay: #5a31f4; --color-button-shop-pay-text: #ffffff; /* Commerce */ --color-sale: #dc2626; --color-compare: var(--color-on-surface-secondary); /* Semantic states */ --color-success: #047857; --color-warning: #b45309; --color-critical: var(--color-sale); --color-info: #2563eb; /* Overlay */ --color-overlay: rgb(0 0 0 / 0.95); --color-overlay-strong: rgb(0 0 0 / 0.7); --color-overlay-subtle: rgb(0 0 0 / 0.5); --color-overlay-scrim: rgb(0 0 0 / 0.25); /* Hover */ --color-hover: rgb(0 0 0 / 0.03); /* Radius */ --radius-sm: 0.25rem; --radius: 0.5rem; --radius-lg: 0.75rem; --radius-button: 0.5rem; --radius-card: 0; --radius-input: 0.5rem; --radius-badge: 9999px; /* Typography */ --font-body: system-ui, -apple-system, sans-serif; --font-heading: system-ui, -apple-system, sans-serif; /* Easing */ --ease-ui: cubic-bezier(0.16, 1, 0.3, 1); --ease-drawer: cubic-bezier(0.32, 0.72, 0, 1); /* Layout spacing */ --spacing-page: 80rem; --spacing-margin: 1rem; --spacing-control-height: 2.125rem; --spacing-touch-target: 2.75rem; --spacing-filter-indicator: 1.25rem; --spacing-filter-swatch: 1.75rem; --spacing-dialog-max-height: 85dvh; --spacing-search-modal-width: min(45rem, 90vw); --spacing-search-modal-offset-block-start: 15dvh; --spacing-hero: 60dvh; --spacing-drawer-width: 480px; --spacing-header-nav-inline: 6px; --spacing-nav-dropdown-offset-inline: 13px; --spacing-nav-dropdown-offset-block: 10px; --spacing-nav-dropdown-enter-offset: 4px; --spacing-nav-dropdown-surface-padding: 16px; --spacing-nav-dropdown-column-width: 120px; --spacing-nav-dropdown-gap-inline: 24px; --spacing-nav-dropdown-item-padding-block: 3px; --spacing-cart-count-badge: 22px; --spacing-cart-line-thumbnail-width: 6rem; /* Shadows */ --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); --shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); --shadow-xl: 0 25px 50px -12px rgb(0 0 0 / 0.25); /* Aspect ratios */ --aspect-portrait: 4/5; --aspect-landscape: 16/9; } :root { --type-paragraph-lg-font: var(--font-body); --type-paragraph-lg-size: 18px; --type-paragraph-font: var(--font-body); --type-paragraph-size: 16px; --type-paragraph-sm-font: var(--font-body); --type-paragraph-sm-size: 14px; --type-heading-2xl-font: var(--font-heading); --type-heading-2xl-size: 36px; --type-heading-xl-font: var(--font-heading); --type-heading-xl-size: 30px; --type-heading-lg-font: var(--font-heading); --type-heading-lg-size: 24px; --type-heading-md-font: var(--font-heading); --type-heading-md-size: 20px; --type-heading-sm-font: var(--font-heading); --type-heading-sm-size: 18px; --type-subheading-font: var(--font-body); --type-subheading-size: 12px; --icon-stroke-width: 1.5; } @layer base { h1 { line-height: 1.2; } input[type="text"], input[type="email"], input[type="password"], input[type="search"], input[type="tel"], input[type="url"], input[type="number"], input[type="date"], textarea, select { width: 100%; color: var(--color-on-surface); background: var(--color-surface); border-radius: var(--radius-input); padding: var(--input-padding-y, 0.375rem) var(--input-padding-x, 0.75rem); border: 1px solid var(--color-input-border, var(--color-border)); font-family: var(--font-body); font-size: var(--input-font-size, 0.875rem); line-height: 1.5; appearance: none; } input::placeholder, textarea::placeholder { color: var(--color-on-surface-secondary); } input:focus-visible, textarea:focus-visible, select:focus-visible { outline: 2px solid var(--color-interactive); outline-offset: 2px; } input:disabled, textarea:disabled, select:disabled { opacity: 0.5; cursor: not-allowed; background: var(--color-surface-secondary); } :where( .button-primary, .button-secondary, .button-outline, .button-ghost, .button-surface, .button-shop-pay ) { padding: var(--button-padding-y, 0.375rem) var(--button-padding-x, 0.75rem); font-size: var(--button-font-size, 0.875rem); } :where( .badge-default, .badge-sale, .badge-accent, .badge-info, .badge-success, .badge-warning, .badge-soldout ) { padding: var(--badge-padding-y, 0.125rem) var(--badge-padding-x, 0.5rem); font-size: var(--badge-font-size, 0.75rem); } @media (min-width: 48rem) { :root { --spacing-margin: 2.5rem; } } } @layer components { .logo-size-custom { width: auto; } .overlay-dark { background: linear-gradient( to top, rgb(0 0 0 / 0.8) 0%, rgb(0 0 0 / 0.4) 60%, transparent 100% ); } .overlay-medium { background: linear-gradient( to top, rgb(0 0 0 / 0.55) 0%, rgb(0 0 0 / 0.2) 60%, transparent 100% ); } .overlay-light { background: linear-gradient(to top, rgb(0 0 0 / 0.3) 0%, transparent 70%); } .overlay-white { background: linear-gradient( to top, rgb(255 255 255 / 0.9) 0%, rgb(255 255 255 / 0.4) 60%, transparent 100% ); } .swatch-sm { width: 1.5rem; height: 1.5rem; } .swatch-md { width: 2rem; height: 2rem; } .swatch-lg { width: 2.5rem; height: 2.5rem; } .swatch-scrim { background: var(--color-overlay-scrim); } .filter-checkbox, .filter-swatch { display: inline-flex; align-items: center; justify-content: center; border: 1px solid var(--color-border); background: var(--color-surface); color: var(--color-on-surface); cursor: pointer; } .filter-checkbox { block-size: var(--spacing-filter-indicator); inline-size: var(--spacing-filter-indicator); border-radius: var(--radius-sm); } .filter-swatch { block-size: var(--spacing-filter-swatch); inline-size: var(--spacing-filter-swatch); border-radius: var(--radius-badge); background: var(--filter-swatch-color, var(--swatch-color, var(--color-surface))); } .filter-checkbox[aria-checked="true"], .filter-checkbox[aria-pressed="true"], .filter-checkbox.is-selected, input:checked + .filter-checkbox, label:has(input:checked) .filter-checkbox { background: var(--color-interactive); color: var(--color-interactive-text); border-color: var(--color-interactive); } .filter-swatch[aria-checked="true"], .filter-swatch[aria-pressed="true"], .filter-swatch.is-selected, input:checked + .filter-swatch, label:has(input:checked) .filter-swatch { background: linear-gradient(var(--color-overlay-scrim), var(--color-overlay-scrim)), var(--filter-swatch-color, var(--swatch-color, var(--color-surface))); color: var(--color-interactive-text); border-color: var(--color-interactive); } .filter-checkbox:focus-visible, .filter-swatch:focus-visible, input:focus-visible + .filter-checkbox, input:focus-visible + .filter-swatch, label:has(input:focus-visible) .filter-checkbox, label:has(input:focus-visible) .filter-swatch { outline: 2px solid var(--color-accent); outline-offset: 2px; } .filter-checkbox[aria-disabled="true"], .filter-checkbox:disabled, .filter-swatch[aria-disabled="true"], .filter-swatch:disabled, label:has(input:disabled) .filter-checkbox, label:has(input:disabled) .filter-swatch { opacity: 0.5; cursor: not-allowed; } .filter-check-icon { block-size: 0.875rem; inline-size: 0.875rem; color: var(--color-interactive-text); stroke: currentColor; fill: none; opacity: 0; pointer-events: none; } .filter-checkbox[aria-checked="true"] .filter-check-icon, .filter-checkbox[aria-pressed="true"] .filter-check-icon, .filter-checkbox.is-selected .filter-check-icon, .filter-swatch[aria-checked="true"] .filter-check-icon, .filter-swatch[aria-pressed="true"] .filter-check-icon, .filter-swatch.is-selected .filter-check-icon, input:checked + :is(.filter-checkbox, .filter-swatch) .filter-check-icon, label:has(input:checked) .filter-check-icon { opacity: 1; } .option-pill { display: inline-flex; align-items: center; justify-content: center; min-block-size: var(--spacing-touch-target); min-inline-size: var(--spacing-touch-target); padding-inline: 0.75rem; padding-block: 0.375rem; font-size: 0.875rem; line-height: 1.25rem; border: 1px solid var(--color-border); border-radius: var(--radius); background: var(--color-surface); color: var(--color-on-surface); cursor: pointer; } .option-pill[aria-pressed="true"], .option-pill[aria-current="true"], .option-pill.is-selected { background: var(--color-interactive); color: var(--color-interactive-text); border-color: var(--color-interactive); } .option-pill:disabled, .option-pill[aria-disabled="true"], .option-pill.is-disabled { opacity: 0.5; cursor: not-allowed; } .option-pill:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; } @media (hover: hover) { .option-pill:not([aria-pressed="true"]):not([aria-current="true"]):not(.is-selected):not( :disabled ):hover { background: var(--color-surface-secondary); } } .chip-filled { background: var(--chip-bg, var(--color-surface-secondary)); color: var(--color-on-surface); } .chip-outlined { background: var(--chip-bg, transparent); color: var(--color-on-surface); border: 1px solid var(--color-border); } @media (hover: hover) { .chip-filled:hover, .chip-outlined:hover { background: color-mix( in oklab, var(--chip-bg, var(--color-surface-secondary)) 90%, var(--color-on-surface) ); } } .badge-default { background: var(--color-badge-default, var(--color-surface-secondary)); color: var(--color-badge-default-text, var(--color-on-surface)); } .badge-sale { background: var(--color-badge-sale, var(--color-sale)); color: var(--color-badge-sale-text, var(--color-interactive-text)); } .badge-accent { background: var(--color-badge-accent, var(--color-accent)); color: var(--color-badge-accent-text, var(--color-interactive-text)); } .badge-info { background: var(--color-badge-info, var(--color-info)); color: var(--color-badge-info-text, var(--color-interactive-text)); } .badge-success { background: var(--color-badge-success, var(--color-success)); color: var(--color-badge-success-text, var(--color-interactive-text)); } .badge-warning { background: var(--color-badge-warning, var(--color-warning)); color: var(--color-badge-warning-text, var(--color-interactive-text)); } .badge-soldout { background: var(--color-badge-soldout, var(--color-on-surface)); color: var(--color-badge-soldout-text, var(--color-surface)); } .button-primary { background: var(--color-button-primary); color: var(--color-button-primary-text); } .button-secondary { background: var(--color-button-secondary); color: var(--color-button-secondary-text); border: 1px solid var(--color-border); } .button-outline { background: transparent; color: var(--color-button-outline-text); border: 2px solid var(--color-button-outline-border); } .button-shop-pay { background: var(--color-button-shop-pay); color: var(--color-button-shop-pay-text); } .button-ghost, .button-icon { background: transparent; color: var(--color-on-surface); } .button-icon { min-block-size: var(--spacing-touch-target); min-inline-size: var(--spacing-touch-target); display: inline-flex; align-items: center; justify-content: center; } .button-surface { background: var(--color-surface); color: var(--color-on-surface); } :where(.button-primary, .button-secondary, .button-outline, .button-icon):is( :disabled, [aria-disabled="true"] ) { opacity: 0.5; } @media (hover: hover) { .button-primary:not(:disabled):not([aria-disabled="true"]):hover { background: var(--color-button-primary-hover); } .button-secondary:not(:disabled):not([aria-disabled="true"]):hover { background: color-mix(in oklab, var(--color-button-secondary) 90%, black); } .button-shop-pay:hover { background: color-mix(in oklab, var(--color-button-shop-pay) 88%, black); } .button-outline:not(:disabled):not([aria-disabled="true"]):hover, .button-ghost:hover { background: var(--color-surface-secondary); } .button-surface:hover { background: color-mix(in oklab, var(--color-surface) 90%, transparent); } .button-icon:not(:disabled):not([aria-disabled="true"]):hover { opacity: 0.7; } } .button-primary:not(:disabled):not([aria-disabled="true"]):active { background: var(--color-button-primary-active); } .button-secondary:not(:disabled):not([aria-disabled="true"]):active { background: color-mix(in oklab, var(--color-button-secondary) 82%, black); } .button-shop-pay:active { background: color-mix(in oklab, var(--color-button-shop-pay) 78%, black); } .button-outline:not(:disabled):not([aria-disabled="true"]):active, .button-ghost:active { background: color-mix(in oklab, var(--color-surface-secondary) 88%, black); } .quantity-selector-outlined { border: none; background: transparent; } .quantity-selector-outlined:focus-within { outline: 2px solid var(--color-accent); outline-offset: 2px; } .quantity-selector-outlined button:focus-visible { outline: none; } .quantity-selector-filled { background: var(--color-surface-secondary); border: 1px solid transparent; } .type-display { font-size: var(--type-heading-2xl-size); font-family: var(--type-heading-2xl-font); font-weight: 300; line-height: 1.25; } .type-heading-xl { font-size: var(--type-heading-xl-size); font-family: var(--type-heading-xl-font); font-weight: 300; } .type-heading-lg { font-size: var(--type-heading-lg-size); font-family: var(--type-heading-lg-font); font-weight: 300; } .type-heading-md { font-size: var(--type-heading-md-size); font-family: var(--type-heading-md-font); font-weight: 400; } .type-heading-sm { font-size: var(--type-heading-sm-size); font-family: var(--type-heading-sm-font); font-weight: 400; } .type-body-lg { font-size: var(--type-paragraph-lg-size); font-family: var(--type-paragraph-lg-font); } .type-body { font-size: var(--type-paragraph-size); font-family: var(--type-paragraph-font); line-height: 1.625; } .type-body-sm { font-size: var(--type-paragraph-sm-size); font-family: var(--type-paragraph-sm-font); } .type-overline { font-size: var(--type-subheading-size); font-family: var(--type-subheading-font); font-weight: 500; text-transform: uppercase; letter-spacing: 0.05em; } .card { position: relative; } .card-link { text-decoration: none; } .card-link::after { content: ""; position: absolute; inset: 0; } .card-link:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; } .cart-count-badge { display: inline-flex; align-items: center; justify-content: center; block-size: var(--spacing-cart-count-badge); inline-size: var(--spacing-cart-count-badge); border-radius: var(--radius-badge); background: var(--color-surface-secondary); color: var(--color-on-surface); font-size: 0.75rem; font-weight: 500; line-height: 1; } [data-header-nav-group] { padding-inline: var(--spacing-header-nav-inline); } @media (min-width: 48rem) { [data-header-nav-group] { padding-inline: var(--spacing-margin); } } .nav-has-dropdown { position: relative; } .nav-dropdown { position: absolute; top: 100%; inset-inline-start: calc(-1 * var(--spacing-nav-dropdown-offset-inline)); padding-block-start: var(--spacing-nav-dropdown-offset-block); opacity: 0; visibility: hidden; transform: translateY(calc(-1 * var(--spacing-nav-dropdown-enter-offset))); transition: opacity 0.15s var(--ease-ui), transform 0.15s var(--ease-ui), visibility 0.15s; z-index: 50; pointer-events: none; } @media (hover: hover) { .nav-has-dropdown:hover .nav-dropdown { opacity: 1; visibility: visible; transform: translateY(0); pointer-events: auto; } } .nav-has-dropdown:focus-within .nav-dropdown { opacity: 1; visibility: visible; transform: translateY(0); pointer-events: auto; } .nav-dropdown-inner { background: var(--color-surface); border-radius: var(--radius-lg); box-shadow: var(--shadow); padding: var(--spacing-nav-dropdown-surface-padding); display: grid; grid-template-columns: var(--spacing-nav-dropdown-column-width); grid-auto-flow: column; gap: 0 var(--spacing-nav-dropdown-gap-inline); min-width: var(--spacing-nav-dropdown-column-width); } .nav-dropdown-item { display: flex; align-items: center; justify-content: space-between; font-size: 0.875rem; font-weight: 500; line-height: 1.75; color: var(--color-on-surface); text-decoration: none; padding: var(--spacing-nav-dropdown-item-padding-block) 0; white-space: nowrap; transition: opacity 0.15s var(--ease-ui); } .nav-dropdown-inner:hover > .nav-dropdown-item { opacity: 0.6; } .nav-dropdown-inner > .nav-dropdown-item:hover { opacity: 1; } .nav-dropdown-item:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; border-radius: var(--radius-sm); } /* Privacy / cookie consent banner. */ .consent-banner { position: fixed; inset-inline: 0; inset-block-end: 0; z-index: 60; display: flex; flex-direction: column; gap: 1rem; width: min(calc(100% - 2 * var(--spacing-margin)), var(--spacing-page)); margin-inline: auto; margin-block-end: var(--spacing-margin); padding: 1.25rem; background: var(--color-surface); color: var(--color-on-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); box-shadow: var(--shadow-lg); } .consent-banner-actions { display: flex; flex-direction: column; gap: 0.75rem; } @media (min-width: 48rem) { .consent-banner { flex-direction: row; align-items: center; justify-content: space-between; gap: 1.5rem; } .consent-banner-actions { flex-direction: row; flex-shrink: 0; align-items: center; } } .remove-icon-top, .remove-icon-bottom { transition: transform 125ms ease-in-out; } } @layer utilities { .number-reset { appearance: textfield; } .number-reset::-webkit-outer-spin-button, .number-reset::-webkit-inner-spin-button { appearance: none; } input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { appearance: none; -webkit-appearance: none; display: none; } .marker-hidden { list-style: none; } .marker-hidden::-webkit-details-marker { display: none; } .scrollbar-none { scrollbar-width: none; } .scrollbar-none::-webkit-scrollbar { display: none; } @media (min-width: 48rem) { .product-grid { grid-template-columns: 2fr 1fr; } } .content-visibility-auto { content-visibility: auto; contain-intrinsic-block-size: auto var(--section-height, 500px); } .contain-paint { contain: paint; } .button-primary:is(:disabled, [aria-disabled="true"]), .button-secondary:is(:disabled, [aria-disabled="true"]), .button-outline:is(:disabled, [aria-disabled="true"]), .button-icon:is(:disabled, [aria-disabled="true"]) { cursor: not-allowed; } .richtext { color: var(--color-on-surface); line-height: 1.625; } .richtext h1, .richtext h2, .richtext h3, .richtext h4, .richtext h5, .richtext h6 { font-family: var(--font-heading); font-weight: 700; color: var(--color-on-surface); line-height: 1.25; margin-block-start: 1.5rem; margin-block-end: 0.75rem; } .richtext p { margin-block-end: 1rem; } .richtext ul { list-style: disc; padding-inline-start: 1.5rem; margin-block-end: 1rem; } .richtext ol { list-style: decimal; padding-inline-start: 1.5rem; margin-block-end: 1rem; } .richtext a { color: var(--color-accent); text-decoration: underline; text-underline-offset: 2px; } .richtext > *:first-child { margin-top: 0; } .richtext > *:last-child { margin-bottom: 0; } .dialog-center { border: none; padding: 0; margin: 0; max-width: none; max-height: none; overflow: hidden; background: var(--color-surface); color: var(--color-on-surface); box-shadow: var(--shadow-xl); position: fixed; inset: 0; width: 100vw; height: 100dvh; } .dialog-center::backdrop { background: var(--color-overlay-scrim); } @media (min-width: 48rem) { .dialog-center { inset-block-start: var(--spacing-search-modal-offset-block-start); inset-block-end: auto; inset-inline-start: 50%; inset-inline-end: auto; transform: translateX(-50%); width: var(--spacing-search-modal-width); height: auto; max-height: var(--spacing-dialog-max-height); border: 1px solid var(--color-border); border-radius: var(--radius-lg); } } @media (prefers-reduced-motion: no-preference) and (min-width: 48rem) { .dialog-center[open] { animation: dialog-center-enter 150ms var(--ease-ui); } } @keyframes dialog-center-enter { from { opacity: 0; transform: translateX(-50%) scale(0.98); } to { opacity: 1; transform: translateX(-50%) scale(1); } } .drawer-right, .drawer-left { border: none; padding: 0; margin: 0; max-width: none; max-height: none; overflow: hidden; background: var(--color-surface); box-shadow: var(--shadow-xl); position: fixed; inset-block: 0; width: 100vw; height: 100%; } .drawer-right { inset-inline-start: auto; inset-inline-end: 0; } .drawer-left { inset-inline-start: 0; inset-inline-end: auto; } .drawer-right::backdrop, .drawer-left::backdrop { background: rgb(0 0 0 / 0.5); } @media (min-width: 480px) { .drawer-right, .drawer-left { width: var(--spacing-drawer-width); } } } @utility bleed-full { margin-inline: calc(-1 * var(--spacing-margin) - max(0px, (100vw - var(--spacing-page)) / 2)); width: calc(100% + 2 * var(--spacing-margin) + max(0px, 100vw - var(--spacing-page))); } @utility gallery-bleed-start { margin-inline-start: calc( -1 * var(--spacing-margin) - max(0px, (100vw - var(--spacing-page)) / 2) ); width: calc(100% + var(--spacing-margin) + max(0px, 100vw - var(--spacing-page)) / 2); } /* Cart drawer dialog shell (hydrogen-cart-drawer skill reference CSS). */ dialog#cart-drawer { transform: translateX(100%); transition: transform 250ms cubic-bezier(0.22, 1, 0.36, 1), overlay 250ms allow-discrete, display 250ms allow-discrete; } dialog#cart-drawer[open] { transform: translateX(0); } @starting-style { dialog#cart-drawer[open] { transform: translateX(100%); } } dialog#cart-drawer::backdrop { background: rgb(0 0 0 / 0); transition: background-color 250ms ease-out, overlay 250ms allow-discrete, display 250ms allow-discrete; } dialog#cart-drawer[open]::backdrop { background: rgb(0 0 0 / 0.3); } @starting-style { dialog#cart-drawer[open]::backdrop { background: rgb(0 0 0 / 0); } } /* Body scroll lock while the cart drawer is open (pure CSS, no JS toggling). */ body:has(dialog#cart-drawer[open]) { overflow: hidden; }