/** Shopify CDN: Minification failed

Line 3082:5 Expected "]" to go with "["

**/
/* =========================================================================
   TBB 2026 RESKIN — Reskin-only styles, loaded after core.css.
   Keeping new styles in this file (not core.css) so the reskin is easy to
   roll back or diff against the original Diffusion theme.

   Diffusion class-name convention: components use a literal `#` prefix
   (e.g. `#product-card`, `#section-body`, `#media`) and modifiers use `@`
   with optional `:value` (e.g. `@align:center`). In CSS selectors these
   characters must be escaped: `.\#product-card`, `.\@tbb-polaroid`,
   `.\@align\:center`.

   Net-new reskin classes we own (no escaping needed):
   - `.tbb-carousel-shell`  — wrapper div added by d_featured-collection.liquid
   - `.tbb-polaroid-title`  — handwritten title overlaid on the polaroid frame
   - `.\@tbb-polaroid`      — modifier added to `.\#product-card` by product-card.liquid

   -----------------------------------------------------------------------
   SESSION 20 (2026-04-13) — CSS-only shell via :has()
   -----------------------------------------------------------------------
   Every `.tbb-carousel-shell` rule below has been expanded into an
   `:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(...))` alias
   that *also* auto-matches any Shopify section wrapper containing a
   grid/PDP signal (Diffusion card, Boost rec list, Auction+ form, PDP
   gallery/buy form) and *not* containing filter UI or a nested manual
   shell. This reproduces tbb-auto-shell.js's logic in pure CSS and
   eliminates the FOUC/flash from JS-applied classes.

   The compound `.tbb-carousel-shell.tbb-pdp-shell` rule likewise expands
   into a PDP-specific alias (PDP signals AND NOT auction signals).

   Manual `.tbb-carousel-shell` wrappers in Liquid sections still work
   exactly as before — they match the first half of the `:is()` group.

   `tbb-auto-shell.js` is no longer loaded from layout/theme.liquid but
   the file is retained for one session in case of rollback. Delete in
   session 21 if no regressions. Known latent bug preserved: JS used
   `.product-card` (plain) which never matched Diffusion's literal
   `#product-card` class — preserved here for behavior parity. Sections
   still auto-detect via other signals (Boost/Auction/PDP).
   ========================================================================= */




/* -------------------------------------------------------------------------
   GLOBAL FONT SWAP — Chivo → system monospace stack.

   The Figma mockup uses Tailwind's default `font-mono` stack (ui-monospace
   → system fonts), not a specific web font. We mirror that here so the
   body font renders as SF Mono on macOS, Consolas on Windows, etc. — zero
   web-font load, instant paint, matches the mockup exactly.

   Implementation: override Diffusion's `--font-body-family` CSS custom
   property, which `_css-vars.liquid` populates from `settings.type_body_font`
   (currently `chivo_n4`). Every component that uses `var(--font-body-family)`
   picks up the override automatically. Hardcoded `font-family: Chivo`
   references in core.css (lines 957, 1930, 1984 — all auction legacy) are
   overridden via selector-level rules below.

   Headings stay Permanent Marker (`--font-heading-family` untouched).
   ------------------------------------------------------------------------- */
:root {
  --font-body-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
    'Liberation Mono', 'Courier New', monospace;
}

/* Kill the hardcoded Chivo references in core.css (Webkul auction legacy). */
.simp-ask-question-header,
.auction .text-gray-600 {
  font-family: var(--font-body-family) !important;
}

/* ── Diffusion button font: mono stack per TBB design system ──
   Permanent Marker is reserved for brand placements only (logo-adjacent,
   hero accents, rare pull-quotes). All buttons use the mono body font. */
.\#button,
.btn,
a.\#button {
  font-family: var(--font-body-family) !important;
}

/* ── Global compare-at price: strikethrough everywhere ──
   All "was" / compare-at prices site-wide get line-through so the
   original price is clearly distinguished from the sale price. */
.\#price-item.\@compare .\#price-value,
.\#price-item.\@compare .\#price-item-value {
  text-decoration: line-through !important;
  text-decoration-line: line-through !important;
}

/* Belt-and-suspenders: force every element to inherit the monospace stack
   unless it explicitly uses the heading family (Permanent Marker) or is a
   known icon font. This catches any rule in core.css that sets
   `font-family: sans-serif` or similar without going through the CSS var.

   IMPORTANT: headings (h1–h6) and their descendants keep Permanent Marker
   via the separate `--font-heading-family` variable, so the `:not(h*)`
   safeguards below prevent the mono override from bleeding into the
   carousel header vendor link and other heading content. */
body,
input,
button,
select,
textarea,
p, li, td, th, dd, dt, label, small, strong, em, code, pre {
  font-family: var(--font-body-family);
}
/* Spans/anchors get mono ONLY when they're not inside a heading. This
   keeps the pink-underlined vendor name in the carousel header rendered
   in Permanent Marker alongside the rest of the heading text (LeMarc
   Fix Pass 8: mixed fonts inside a single heading looked wrong). */
span:not(h1 span):not(h2 span):not(h3 span):not(h4 span):not(h5 span):not(h6 span),
a:not(h1 a):not(h2 a):not(h3 a):not(h4 a):not(h5 a):not(h6 a) {
  font-family: var(--font-body-family);
}
/* Explicit override: carousel header anchors ALWAYS use the heading font,
   regardless of selector specificity from the belt-and-suspenders rule. */
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header h1,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header h2,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header h3,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header h1 a,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header h2 a,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header h3 a,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header h1 span,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header h2 span,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header h3 span {
  font-family: 'Permanent Marker', 'Marker Felt', cursive !important;
}


/* -------------------------------------------------------------------------
   PRODUCT CAROUSEL SHELL (d_featured-collection)
   Wrapping div `.tbb-carousel-shell` is added by the section file; it carries
   inline `--tbb-border-color` + `--tbb-border-glow` custom props set by the
   section's `border_color` setting.

   The shell itself (not `.#section-body` inside it) owns the frame — border,
   background, glow, max-width, and padding all land here so the carousel
   matches the hero's visual container width (1240px) and horizontal padding.
   Inner `.#section-body` is neutralized so its own padding doesn't double up.
   ------------------------------------------------------------------------- */
/* The Shopify section wrapper ships with `display: inline` on this theme,
   which prevents `margin: auto` from resolving on block children. Force
   the wrappers that contain a carousel shell back to block layout so the
   shell can center itself. Using `:has()` keeps this scoped and doesn't
   affect other sections. */
[id^="shopify-section"]:has(> :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell)))) {
  display: block;
}

:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) {
  --tbb-border-color: #9c01ff;
  --tbb-border-glow: rgba(156, 1, 255, 0.30);

  display: block;
  position: relative;
  max-width: 1240px;
  /* Figma: p-3 mobile / p-4 desktop (12px / 16px). */
  margin: 2rem auto !important;
  padding: 1rem;
  border: 4px solid var(--tbb-border-color);
  /* 8px to match the Memory Wall widget (`.mw-card`) for visual consistency
     across homepage widgets. */
  border-radius: 8px;
  /* Figma: shadow 0 0 20px {color}4D (30% alpha) */
  box-shadow: 0 0 20px var(--tbb-border-glow);
  /* Figma: bg-[#0f0f1e]/80 baseline, bumped to 0.95 so shells read
     solidly against busy merchant/seller skin backgrounds.
     backdrop-blur-sm (4px) layered on top.
     !important to override Diffusion's `.shopify-section { background:
     transparent }` which wins cascade order against our :is()/:has()
     selector on auto-shelled sections. */
  background: rgba(15, 15, 30, 0.95) !important;
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
  box-sizing: border-box;
}

@media (max-width: 991px) {
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) {
    margin: 1.5rem 1rem !important;
    padding: 0.75rem;
    max-width: none;
  }
}

/* ──────────────────────────────────────────────────────────────────
   Mobile grid normalization (session 18)

   Diffusion's `.#grid.@type:columns` uses `flex-wrap`, which leaves
   orphan slots when children have variable heights. Auction cards vary
   wildly in height because bidder handle / bid count / "Ended" state /
   decade tags add different row counts below the polaroid image.

   On mobile we swap the inner grid to `display: grid` with a clean
   2-column layout so cells size independently and nothing wraps into
   an empty slot. Desktop is untouched.
   ────────────────────────────────────────────────────────────────── */
@media (max-width: 767px) {
  /* Tighten shell horizontal margin on mobile so the inside has more
     room — prevents cards from overflowing past the border. */
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) {
    margin: 1.5rem 0.5rem !important;
    padding: 0.75rem 0.5rem !important;
  }
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#grid {
    display: grid !important;
    grid-template-columns: 1fr 1fr !important;
    gap: 0.5rem !important;
    align-items: start !important;
    flex-wrap: initial !important;
  }
  /* Force each grid child to shrink into its column. `min-width: 0` is
     critical — without it, flex/grid children respect their intrinsic
     content width and overflow the cell. `box-sizing: border-box` so
     padding is subtracted from the 100% not added on top. */
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#grid > * {
    width: 100% !important;
    max-width: 100% !important;
    min-width: 0 !important;
    margin: 0 !important;
    flex: 0 0 100% !important;
    box-sizing: border-box !important;
  }
  /* Make the product-card itself honor the grid cell width (was `flex: 0 1 calc(20% - …)` from Diffusion). */
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#grid > * .\#product-card,
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#grid .\#product-card {
    width: 100% !important;
    max-width: 100% !important;
    min-width: 0 !important;
    box-sizing: border-box !important;
  }
}

/* Neutralize section-body's own padding/margins — the shell owns the frame */
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body {
  background: transparent !important;
  padding: 0 !important;
  margin: 0 !important;
  border: none !important;
  box-shadow: none !important;
}

/* Inner Diffusion containers: zero out their horizontal padding so content
   uses the shell's padding instead (avoids double-inset content). */
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body .\#container {
  padding-left: 0 !important;
  padding-right: 0 !important;
  max-width: none !important;
}

/* Section header: Permanent Marker typography + LEFT alignment (Figma).
   Diffusion's default center alignment is overridden here only within
   the shell, leaving other sections untouched. Padding-right reserves
   horizontal room for the top-right arrow cluster + view-all link. */
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header {
  text-align: left !important;
  margin-bottom: 1.25rem;
  padding-right: 110px;
}

:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header-inner,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header .\#hero {
  text-align: left !important;
  align-items: flex-start !important;
  justify-content: flex-start !important;
}

/* Figma: heading 24px desktop / 20px mobile, Permanent Marker, weight 700. */
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header .\#hero-heading,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header h1,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header h2,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header h3 {
  font-family: 'Permanent Marker', 'Marker Felt', cursive !important;
  color: #ffffff !important;
  font-weight: 700 !important;
  letter-spacing: 0.02em;
  /* Permanent Marker has generous built-in top ascender padding, which
     reads as unwanted whitespace above the h2. We use `line-height: 1`
     (tight but multi-line safe) plus a negative top margin to pull the
     glyphs up into the shell padding — eliminating the "extra row of
     space" above the heading while still giving wrapped long names
     ("Curated by: Starbunnyvintage") enough leading between lines. */
  line-height: 1 !important;
  text-align: left !important;
  font-size: 24px !important;
  margin: -0.35em 0 0.25rem !important;
}

/* "Handpicked by: {vendor}" — vendor name is auto-linked by the section's
   liquid when heading contains collection title. Style the link here. */
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header .\#hero-heading a,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header h1 a,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header h2 a,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header h3 a {
  color: #ffffff !important;
  text-decoration: underline;
  text-decoration-color: #fe8aed;
  text-decoration-thickness: 3px;
  text-underline-offset: 4px;
}

/* Figma: subheading 14px desktop / 12px mobile, italic. */
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header .\#hero-subheading {
  font-style: italic;
  color: #e0e0f0 !important;
  opacity: 0.85;
  text-align: left !important;
  font-size: 14px !important;
  line-height: 1.3 !important;
  margin: 0 !important;
}

/* "View all" link — Diffusion renders section_button_label via `#section-body-button`
   inside the header when button_position=before. We hoist it out of flow and
   position it directly beneath the arrow cluster, restyled as a plain
   underlined cyan text link (Figma spec). Scoped to the shell only so it
   doesn't affect other sections that still use the standard button rendering. */
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-button {
  position: absolute !important;
  top: calc(1rem + 32px + 0.5rem) !important;
  right: 1rem !important;
  margin: 0 !important;
  padding: 0 !important;
  text-align: right !important;
  z-index: 10;
}

:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-button .\#button,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-button a {
  display: inline-block !important;
  background: transparent !important;
  border: none !important;
  /* Vertical padding is mandatory — Diffusion's `.#button` ships with
     `overflow: hidden` and a height clamped to the font size, which clips
     the top of tall ascenders (the "L" in "View all" loses its top pixel).
     A 2px top/bottom pad + explicit line-height gives the glyphs room. */
  padding: 2px 0 !important;
  overflow: visible !important;
  min-height: 0 !important;
  height: auto !important;
  line-height: 1.4 !important;
  color: #8de0f4 !important;
  font-family: inherit !important;
  /* Figma spec: `text-xs` = 12px underlined. */
  font-size: 12px !important;
  font-style: italic;
  font-weight: 500 !important;
  letter-spacing: 0 !important;
  text-transform: none !important;
  text-decoration: underline !important;
  text-underline-offset: 3px;
  box-shadow: none !important;
}

:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-button .\#button:hover,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-button a:hover {
  color: #ffffff !important;
  background: transparent !important;
}

/* -------------------------------------------------------------------------
   CAROUSEL ARROWS — Figma: 32×32 solid fill of the row's accent color,
   white chevron icons, no border, rounded corners 2px. Disabled = grey.
   See prior comment for why we set `.swiper { position: static }` — it
   lets absolute-positioned arrows anchor to the shell instead of the
   swiper box, which gives us the "floating in the header top-right"
   placement without touching markup or JS.
   ------------------------------------------------------------------------- */
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .swiper {
  position: static !important;
  /* Diffusion's slideshow-inline.js injects INLINE `padding-left` / `padding-right`
     on the `.swiper` element (~279px each at desktop) to reserve space for its
     overlay-style prev/next buttons. Swiper.js uses content-box sizing for its
     slide math (`size = clientWidth - paddingLeft - paddingRight`), which made
     slides render at ~111px instead of ~222px and broke the layout.

     Since Fix Pass 1 relocated the arrow buttons to the shell header via the
     `position: static` trick, the swiper no longer needs reserved space for
     internal overlay buttons — zero it out. !important is required to override
     the JS-injected inline style. The custom prop `--button-position` (also
     inline) is harmless now because nothing inside the swiper consumes it. */
  padding-left: 0 !important;
  padding-right: 0 !important;
}

/* -------------------------------------------------------------------------
   Pagination-toggle resilience — Diffusion's slideshow-inline ships two
   margin rules that depend on the `@with-pagination` class:

     .#slideshow-inline .swiper                       { margin: -90px 0; }
     .#slideshow-inline.@with-pagination .swiper      { margin: 0; padding-bottom: 75px; }  (via core.css)

   The -90px vertical margins are a Diffusion hack to pull the swiper up
   into the section header (so overlay arrows float over the header). Our
   reskin relocated the arrows to the shell header via `position: static`
   on the swiper, so we don't need that margin trick anymore — and when
   merchants toggle "Show carousel pagination" OFF, the -90px margin
   reappears and collapses the shell layout on top of the next section.

   Zero out margin + Diffusion's padding-bottom unconditionally here so the
   shell renders identically regardless of the pagination toggle state.
   Pagination bullet spacing is re-added only when `@with-pagination` is
   actually present (see rule below).
   ------------------------------------------------------------------------- */
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#slideshow-inline .swiper,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .swiper {
  margin: 0 !important;
  padding-bottom: 0 !important;
}

/* Pagination ON → reserve room under slides for the bullet row. */
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#slideshow-inline.\@with-pagination .swiper {
  padding-bottom: 32px !important;
}

:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .swiper-button-prev,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .swiper-button-next {
  position: absolute !important;
  top: 1rem !important;
  width: 32px !important;
  height: 32px !important;
  min-width: 0 !important;
  margin: 0 !important;
  padding: 0 !important;
  border-radius: 2px !important;
  background-color: var(--tbb-border-color) !important;
  background-repeat: no-repeat !important;
  background-position: center center !important;
  /* Chevron icon is 20×20 centered inside the 32px button per Figma
     (lucide-react ChevronLeft / ChevronRight at `w-5 h-5`). */
  background-size: 20px 20px !important;
  border: none !important;
  color: #ffffff !important;
  z-index: 10;
  transition: transform 0.2s ease, opacity 0.2s ease;
}

/* Lucide ChevronLeft — thin stroke-width-2 chevron, white stroke, injected
   as a background-image data URI so we don't add an HTTP request or depend
   on an icon snippet. Path matches lucide-react exactly (`m15 18-6-6 6-6`). */
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .swiper-button-prev {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='m15 18-6-6 6-6'/></svg>") !important;
  right: calc(1rem + 32px + 0.5rem) !important;
  left: auto !important;
}

/* Lucide ChevronRight — path `m9 18 6-6-6-6`. */
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .swiper-button-next {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='m9 18 6-6-6-6'/></svg>") !important;
  right: 1rem !important;
  left: auto !important;
}

/* Hide Diffusion's default icon child — Diffusion's `arrow-left` / `arrow-right`
   icon snippet is rendered inside the button as a chunky SVG that conflicts
   with our background-image chevron. `visibility: hidden` (not `display: none`)
   preserves Swiper's click target and accessibility tree. */
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .swiper-button-prev > *,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .swiper-button-next > * {
  visibility: hidden !important;
}

/* Neutralize Swiper's default ::after arrow pseudo (it would overlay our
   background chevron with a font-icon arrow). */
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .swiper-button-prev::after,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .swiper-button-next::after {
  display: none !important;
}

:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .swiper-button-prev:hover,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .swiper-button-next:hover {
  transform: scale(1.05);
}

/* Disabled state — Figma spec: `disabled:bg-gray-600 disabled:opacity-50`
   (tailwind gray-600 = #4B5563). */
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .swiper-button-disabled {
  background-color: #4B5563 !important;
  opacity: 0.5 !important;
  pointer-events: none;
}

/* =====================================================
   Carousel nav buttons — Win95 bevel treatment
   Adds a raised-bevel inset shadow (light top/left, dark
   bottom/right) and a press-invert active state to the
   32×32 nav buttons. Applies to all four carousel renderers:
     • native Swiper carousels      (.swiper-button-prev/next)
     • Boost Slick carousels        (.boost-sd__slider-button)
     • Spotlight capsule (custom)   (.tbb-capsule-arrow)
     • Top Curators (custom)        (.tbb-curator-nav-btn)
   All render identically sized/shaped with a solid accent
   fill, so a single shadow-only rule layers cleanly on top
   without fighting any renderer.
   ===================================================== */
.swiper-button-prev,
.swiper-button-next,
.boost-sd__slider-button,
.tbb-capsule-arrow,
.tbb-curator-nav-btn {
  box-shadow:
    inset 1px 1px 0 rgba(255, 255, 255, 0.5),
    inset -1px -1px 0 rgba(0, 0, 0, 0.25) !important;
}

.swiper-button-prev:active,
.swiper-button-next:active,
.boost-sd__slider-button:active,
.tbb-capsule-arrow:active,
.tbb-curator-nav-btn:active {
  box-shadow:
    inset -1px -1px 0 rgba(255, 255, 255, 0.4),
    inset 1px 1px 0 rgba(0, 0, 0, 0.3) !important;
}

/* Disabled nav buttons shouldn't show bevel (flat grayed-out). */
.swiper-button-disabled,
.boost-sd__slider-button[disabled],
.boost-sd__slider-button--disabled,
.tbb-capsule-arrow[disabled],
.tbb-curator-nav-btn[disabled],
.tbb-curator-nav-btn:disabled {
  box-shadow: none !important;
}

/* Pagination: reflow to normal block layout under the slides */
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .swiper-pagination {
  position: relative !important;
  bottom: auto !important;
  left: auto !important;
  right: auto !important;
  margin-top: 1rem;
  text-align: center;
}

:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .swiper-pagination-bullet-active {
  background: var(--tbb-border-color) !important;
}

/* -------------------------------------------------------------------------
   MOBILE OVERRIDES (below 992px)
   - Force arrows visible (Diffusion hides them on mobile by default)
   - Shrink heading to 20px, subheading to 12px per Figma
   - Override swiper-slide width to show 2 products per row. `slideshow-inline.js`
     hardcodes `slidesPerView: 1.5` on mobile — we don't touch the JS, we just
     visually override the slide width. Swiper still calculates translate math
     against the container, so peek/snap behavior may need live verification.
   ------------------------------------------------------------------------- */
@media (max-width: 991px) {
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#slideshow-inline .swiper-button-prev,
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#slideshow-inline .swiper-button-next,
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .swiper-button-prev,
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .swiper-button-next {
    display: flex !important;
  }

  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header {
    padding-right: 90px;
    margin-bottom: 0.875rem;
  }

  /* Mobile header — Fix Pass 7: natural wrapping. Let the heading flow
     inline so short titles ("Splash Pieces", "Curated by: SHIZNIT") stay
     on one line and only break to a second line when "Curated by:" + a
     long vendor name can't fit. `word-break: keep-all` prevents mid-word
     splits so "Starbunnyvintage" stays as one token and wraps as a whole
     unit rather than shattering into "STARBUNNYVI / NTAGE". */
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header .\#hero-heading,
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header h1,
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header h2,
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header h3 {
    font-size: 18px !important;
    /* Same strategy as desktop: `line-height: 1` for tight multi-line
       wraps + negative top margin to eliminate Permanent Marker's built-in
       ascender whitespace. This gives the compact "no extra padding at
       the top" look LeMarc wants without crashing lines together when
       "Curated by: Starbunnyvintage" wraps to two rows. */
    line-height: 1 !important;
    margin-top: -0.3em !important;
    white-space: normal !important;
    word-break: keep-all !important;
    overflow-wrap: normal !important;
    hyphens: none !important;
    overflow: visible !important;
    text-overflow: clip !important;
    max-width: 100% !important;
    /* Extra bottom padding so the pink underline on the vendor anchor
       (4px offset + 3px thickness) doesn't get clipped by the shell
       border or reflow next sibling. */
    padding-bottom: 4px !important;
  }
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header .\#hero-heading a,
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header h1 a,
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header h2 a,
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header h3 a {
    /* Inline flow so short titles stay on one row — browser will break
       naturally before the anchor if label+name don't fit. */
    display: inline !important;
    word-break: keep-all !important;
    overflow-wrap: normal !important;
    /* Explicitly re-assert the pink underline in case mobile UA stylesheet
     or a Diffusion rule strips text-decoration on mobile. */
    color: #ffffff !important;
    text-decoration: underline !important;
    text-decoration-color: #fe8aed !important;
    text-decoration-thickness: 3px !important;
    text-underline-offset: 4px !important;
  }

  /* Subheading clamps to 2 lines on mobile (Figma shows 1–2 depending on
     length). Uses -webkit-line-clamp so long blurbs don't push the carousel
     down. */
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-header .\#hero-subheading {
    font-size: 12px !important;
    line-height: 1.3 !important;
    display: -webkit-box !important;
    -webkit-box-orient: vertical !important;
    -webkit-line-clamp: 2 !important;
    overflow: hidden !important;
    text-overflow: ellipsis !important;
    max-width: 100% !important;
  }

  /* Mobile pagination row is tighter than desktop — shrink the 32px buffer
     set in the base rule above to 28px just for mobile. Only applies when
     pagination is ON; when OFF, the base rule keeps padding-bottom at 0
     and the swiper hugs the shell border correctly. */
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#slideshow-inline.\@with-pagination .swiper {
    padding-bottom: 28px !important;
  }

  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .swiper-button-prev,
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .swiper-button-next {
    top: 0.75rem !important;
    width: 28px !important;
    height: 28px !important;
    /* Scale chevron proportionally to the smaller button (28/32 × 20 ≈ 18). */
    background-size: 18px 18px !important;
  }
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .swiper-button-prev { right: calc(0.75rem + 28px + 0.375rem) !important; }
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .swiper-button-next { right: 0.75rem !important; }

  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-button {
    top: calc(0.75rem + 28px + 0.375rem) !important;
    right: 0.75rem !important;
  }
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-button .\#button,
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#section-body-button a {
    font-size: 12px !important;
  }

  /* Mobile slides-per-view is handled by `tbb-carousel-enhance.js` via a
     fractional `slidesPerView` (2.15) applied to Swiper at runtime, so
     Swiper's own translate math stays authoritative. */

  /* CRITICAL: Diffusion's `slideshow-inline.css` sets the inner .swiper to
     `width: 100vw` on mobile, which makes the carousel wider than the
     `.tbb-carousel-shell` and causes peek slides to break through the
     shell's purple border. Constrain swiper to the shell's content box. */
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#slideshow-inline .swiper {
    width: 100% !important;
    max-width: 100% !important;
    margin-left: 0 !important;
    margin-right: 0 !important;
  }

  /* Mobile polaroid vendor — Fix Pass 8: long single-token vendor names
     (e.g. "Pinnaclecollectibles", "Nostalgicepisodes") were overflowing
     past the card's right edge because `white-space: normal` alone
     can't wrap a word with no spaces. Add `overflow-wrap: anywhere`
     so the browser is allowed to break mid-word when the name is
     longer than the card width. Cap to 2 lines with line-clamp so very
     extreme names (30+ chars) don't push the price row down.

     Scale kept at vendor 0.9rem (~14.4px), label 0.78rem (~12.5px).
     Also enforce `max-width: 100%` so the element can't grow past its
     parent card column. */
  .\#product-card.\@tbb-polaroid .\#product-card-caption .\#product-card-vendor {
    font-size: 0.9rem !important;
    white-space: normal !important;
    overflow-wrap: anywhere !important;
    word-break: break-word !important;
    text-overflow: clip !important;
    overflow: hidden !important;
    line-height: 1.15 !important;
    max-width: 100% !important;
    /* Clamp to 2 lines so extreme vendor names don't shove the rest of
       the card down — ellipsize the overflow. */
    display: -webkit-box !important;
    -webkit-box-orient: vertical !important;
    -webkit-line-clamp: 2 !important;
  }
  .\#product-card.\@tbb-polaroid .\#product-card-caption .\#product-card-vendor::before {
    font-size: 0.78rem;
  }

  /* Mobile polaroid TITLE — bump floor so handwritten title on the frame
     is actually legible on phones. Was 13px floor; lift to 14px. */
  .\#product-card.\@tbb-polaroid .tbb-polaroid-title-inner {
    font-size: 14px !important;
  }
}


/* -------------------------------------------------------------------------
   POLAROID PRODUCT CARD
   Activated by adding the `@tbb-polaroid` modifier class to `#product-card`
   from product-card.liquid — which in turn is controlled by the
   `product.metafields.custom.has_builtin_frame` boolean. Products whose
   images already have a frame baked in should be flagged `true` in admin;
   they render as today (plain image + normal caption title), avoiding the
   polaroid-inside-a-polaroid visual collision.
   ------------------------------------------------------------------------- */

/* Card shell: strip legacy background AND Diffusion's default 18px
   border-radius + overflow:hidden, which otherwise clips the polaroid
   PNG's rounded corners (visible as rounded top / flat bottom crop). */
.\#product-card.\@tbb-polaroid {
  background: transparent !important;
  box-shadow: none !important;
  padding: 0 !important;
  border: none !important;
  border-radius: 6px !important;
  overflow: visible !important;
}

/* Media container becomes the polaroid frame — fixed 4:5 aspect */
.\#product-card.\@tbb-polaroid .\#product-card-media {
  position: relative;
  aspect-ratio: 4 / 5;
  overflow: visible !important;
  background: transparent !important;
  border: none !important;
  border-radius: 6px !important;
  padding: 0 !important;
  transition: transform 0.3s ease;
}

.\#product-card.\@tbb-polaroid:hover .\#product-card-media {
  transform: rotate(-1deg) scale(1.02);
}

/* Product image slotted into the frame's transparent window.
   Percentages are measured directly from the alpha channel of
   `ThrowbackBuys Polaroid Frame 600x750.png` using Python/PIL:
     top-left pixel of transparent region: (13, 20) on a 600×750 canvas
     transparent bounding box: 571 × 566 px
   → top 2.67%, left 2.17%, width 95.17%, height 75.47%.
   If the frame image is ever replaced, re-run the measurement and
   update these four numbers; they MUST track the PNG's alpha mask. */
.\#product-card.\@tbb-polaroid .\#product-card-media > .\#media {
  position: absolute !important;
  top: 2.67% !important;
  left: 2.17% !important;
  width: 95.17% !important;
  height: 75.47% !important;
  /* Square corners — the polaroid PNG frame's transparent window is
     rectangular, so any border-radius on this element reveals slivers
     of dark card background in the corners. Keep at 0 to flush fill. */
  border-radius: 0 !important;
  background: #ffffff;
  overflow: hidden;
  z-index: 1;
}

/* Diffusion's hover/sold-out overlay (`.#product-card-media-overlay`) also
   has `border-radius: var(--border-radius-base)` baked in — rounded corners
   that would reveal dark card slivers behind the polaroid frame during
   hover states or on sold-out cards. Square it off + clamp to the image
   window so it matches the rectangular polaroid opening exactly. */
.\#product-card.\@tbb-polaroid .\#product-card-media-overlay {
  border-radius: 0 !important;
  top: 2.67% !important;
  left: 2.17% !important;
  width: 95.17% !important;
  height: 75.47% !important;
}

/* ── Polaroid frame edge-cases ──────────────────────────────────────
   Additional overrides for Diffusion states/elements that would break
   visual consistency of the polaroid frame across contexts. */

/* Hover-swap secondary image (`#product-card-media-alt`) is positioned
   absolute at 100%×100% of `.#product-card-media` — which means it
   covers the entire polaroid PNG frame on hover. Clamp it to the same
   image window coordinates + square corners so the frame stays visible
   and the swap happens cleanly inside the polaroid's photo area. */
.\#product-card.\@tbb-polaroid .\#product-card-media-alt {
  top: 2.67% !important;
  left: 2.17% !important;
  width: 95.17% !important;
  height: 75.47% !important;
  border-radius: 0 !important;
  z-index: 2 !important;
}

/* Dim modifier (`.@dim`) drops image opacity to 0.46 for sold-out
   products. The white `.#media` background also loses opacity, so
   dark card bg bleeds through the "photo paper". Keep the background
   fully opaque and only dim the inner image, preserving the polaroid
   paper look regardless of sold-out state. */
.\#product-card.\@tbb-polaroid.\@dim .\#product-card-media .\#media {
  opacity: 1 !important;
}
.\#product-card.\@tbb-polaroid.\@dim .\#product-card-media .\#media img {
  opacity: 0.46;
}

/* Badges (`.#product-card-badges`) are positioned at a flat `0.75rem`
   from the card edge by Diffusion, but the polaroid image window starts
   at `2.67%` from top — so badges float in the narrow top strip of
   white polaroid paper instead of sitting inside the photo. Re-anchor
   them to the top of the image window so "Sold Out" / "Sale" pills sit
   correctly inside the photo area across all contexts. */
.\#product-card.\@tbb-polaroid .\#product-card-badges {
  top: calc(2.67% + 0.25rem) !important;
}
.\#product-card.\@tbb-polaroid .\#product-card-badges.\@position\:left {
  left: calc(2.17% + 0.25rem) !important;
}
.\#product-card.\@tbb-polaroid .\#product-card-badges.\@position\:right {
  right: calc(2.17% + 0.25rem) !important;
}

/* Force the inner product image to fully fill the polaroid window.
   Diffusion's media structure is:
     .#media > .#media-image-wrapper > img.#media-image
   The img only receives the `@cover` modifier when `image_fit == 'cover'`
   is passed to `snippets/media.liquid`. In some contexts (hover-swap alt,
   mobile variants, certain app-block renders) that param is missing or
   the `--image-fit` CSS var gets overridden to `contain`, which leaves
   dark slivers of card bg on the left/bottom of the polaroid window when
   the source image's aspect ratio doesn't match 4:5.

   Target both the class-hook (`.#media-image`, `.#media-image-mobile`)
   and any raw `img` descendant of `.#media`, force min dimensions so
   shorter/narrower natural images still flush-fill, and lock object-fit
   to `cover` regardless of the `--image-fit` var. */
.\#product-card.\@tbb-polaroid .\#product-card-media .\#media .\#media-image,
.\#product-card.\@tbb-polaroid .\#product-card-media .\#media .\#media-image-mobile,
.\#product-card.\@tbb-polaroid .\#product-card-media .\#media img {
  width: 100% !important;
  height: 100% !important;
  min-width: 100% !important;
  min-height: 100% !important;
  max-width: none !important;
  max-height: none !important;
  object-fit: cover !important;
  object-position: center !important;
  --image-fit: cover !important;
}

/* The wrapper that holds the img — Diffusion sets it absolute 100%×100%
   but be explicit so nothing collapses it. */
.\#product-card.\@tbb-polaroid .\#product-card-media .\#media .\#media-image-wrapper {
  position: absolute !important;
  inset: 0 !important;
  width: 100% !important;
  height: 100% !important;
}

/* Lock the `--image-fit` var on the polaroid `.#media` itself so any
   upstream section-level override (e.g. image-with-text passing
   `image_fit: contain`) can't leak in and leave bg showing. */
.\#product-card.\@tbb-polaroid .\#product-card-media .\#media {
  --image-fit: cover !important;
}

/* ── Kill all rounded corner cropping inside the polaroid window ──
   The polaroid PNG frame's transparent cutout is perfectly rectangular,
   so ANY border-radius on ANY descendant of `.#product-card-media` in
   polaroid mode reveals dark card-bg slivers behind the rounded corner.
   Sources of inherited rounding we've hit:
     - `.#product-card { border-radius: var(--border-radius-base) }` (parent clip)
     - `.#media.@border-radius:base|inner|sm` modifier classes (media.css)
     - `.#product-card-media-overlay { border-radius: var(--border-radius-base) }`
     - `.#media-image` can inherit from theme utility classes
   Nuke border-radius on every element inside the polaroid media container
   so the inner image crop is perfectly rectangular, full-bleed, and
   flush-fills the PNG frame's transparent window. */
.\#product-card.\@tbb-polaroid .\#product-card-media,
.\#product-card.\@tbb-polaroid .\#product-card-media *,
.\#product-card.\@tbb-polaroid .\#product-card-media .\#media,
.\#product-card.\@tbb-polaroid .\#product-card-media .\#media *,
.\#product-card.\@tbb-polaroid .\#product-card-media .\#media-image-wrapper,
.\#product-card.\@tbb-polaroid .\#product-card-media .\#media-image,
.\#product-card.\@tbb-polaroid .\#product-card-media .\#media-image-mobile,
.\#product-card.\@tbb-polaroid .\#product-card-media img,
.\#product-card.\@tbb-polaroid .\#product-card-media picture,
.\#product-card.\@tbb-polaroid .\#product-card-media-alt,
.\#product-card.\@tbb-polaroid .\#product-card-media-overlay {
  border-radius: 0 !important;
}

/* Polaroid PNG frame overlaid on top of the image. Uses the branded
   ThrowbackBuys frame (600×750, 4:5 aspect, RGBA transparent center).
   Shopify serves asset URLs via `{{ 'filename' | asset_url }}` which
   URL-encodes spaces, so the literal filename with spaces works here.
   If renaming the asset, update this URL to match. */
.\#product-card.\@tbb-polaroid .\#product-card-media::after {
  content: '';
  position: absolute;
  inset: 0;
  background-image: url('ThrowbackBuys%20Polaroid%20Frame%20600x750.png');
  background-size: 100% 100%;
  background-repeat: no-repeat;
  pointer-events: none;
  z-index: 5;
}

/* ── Native baked-in polaroid card (`@tbb-no-frame`) ─────────────────
   Session 27 — native parity with the session-26 Boost fix.
   When `custom.has_builtin_frame = true`, product-card.liquid emits
   `@tbb-no-frame` alongside `@tbb-polaroid`. The PNG overlay
   (`.#product-card-media::after`) INTENTIONALLY stays rendered — the
   outer PNG's opaque borders mask the baked-in frame's chrome, leaving
   just the product visible through the polaroid window.

   Image sizing flips from window-coords (2.67%/2.17%/95.17%/75.47%)
   to full-bleed (`inset:0`, `cover`) so the baked frame scales up far
   enough that its own chrome lands behind the PNG borders. Mirrors:
     body .boost-sd__product-item.tbb-boost-no-frame …
   in the Boost section below. The handwritten title overlay is
   suppressed in liquid; this CSS hides it defensively in case any
   ancestor template renders the div directly. */
.\#product-card.\@tbb-polaroid.\@tbb-no-frame .\#product-card-media > .\#media,
.\#product-card.\@tbb-polaroid.\@tbb-no-frame .\#product-card-media-overlay,
.\#product-card.\@tbb-polaroid.\@tbb-no-frame .\#product-card-media-alt {
  top: 0 !important;
  left: 0 !important;
  width: 100% !important;
  height: 100% !important;
  inset: 0 !important;
  border-radius: 0 !important;
}

/* Handwritten product title in the frame's bottom strip
   (Figma spec: bottom ~0.5%, h 17%, Permanent Marker, dark text).
   Nudged down from bottom:2%/h:19% to give the frame's baked-in
   "ThrowbackBuys.com" logo a few pixels of breathing room above.

   WRAPPER PATTERN (do not merge these back together):
   - Outer `.tbb-polaroid-title` is the abs-positioned slot with overflow
     hidden and text-align center. It MUST remain block-level — NOT flex,
     NOT grid — because flex/grid children get blockified, which silently
     disables `-webkit-line-clamp` on the inner element.
   - Inner `.tbb-polaroid-title-inner` carries `display: -webkit-box` and
     the line-clamp. It is NOT absolutely positioned (abs-pos also
     blockifies), and it sits as a normal block-level child of the outer.

   Vertical layout: we do not center. The inner element grows upward from
   a bottom baseline by using `margin-top: auto` inside an outer that uses
   a trivial inline-table setup... actually the simplest win is to let the
   content sit at the top of the outer slot. The polaroid frame's dark
   title strip is narrow enough that 2 lines fill it almost exactly, so
   centering is mostly cosmetic. */
.\#product-card.\@tbb-polaroid .tbb-polaroid-title {
  position: absolute;
  left: 3%;
  right: 3%;
  bottom: 1.5%;
  height: 15%;
  /* Flex centers the inner vertically/horizontally. Despite flex parents
     normally "blockifying" children and breaking `-webkit-box` line-clamp,
     Chrome 146+ actually keeps the clamp effect working (verified in
     production: computed `display: flow-root` but clientHeight still
     clamps to 2 * line-height). The `max-height` on the inner is a belt-
     and-suspenders fallback in case a future Chrome regresses. */
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  text-align: center;
  padding: 0 0.5rem;
  z-index: 6;
  pointer-events: none;
}

.\#product-card.\@tbb-polaroid .tbb-polaroid-title-inner {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  overflow: hidden;
  text-overflow: ellipsis;
  text-align: center;
  font-family: 'Permanent Marker', 'Marker Felt', cursive;
  color: #1a1a2e;
  /* Font scale: 13px floor on mobile (was 11px — LeMarc Fix Pass 5: title
     was too small to read on product cards). Grows with viewport up to
     15px ceiling at desktop widths. */
  font-size: clamp(13px, 1.1vw, 15px);
  line-height: 1.15;
  max-width: 100%;
  /* Hard cap at 2 lines worth of height as a fallback if line-clamp ever
     silently fails — prevents overflow from escaping the strip. */
  max-height: calc(1.15em * 2);
  word-break: break-word;
}

/* Hide the normal caption title — it lives on the frame now */
.\#product-card.\@tbb-polaroid .\#product-card-caption .\#product-card-title {
  display: none !important;
}

/* Caption below the frame: vendor + price + rating only, centered.
   Collapses Diffusion's default vertical padding/margins which otherwise
   produce ~120px of dead space under the frame. Children get their own
   tight vertical rhythm; no extra gutter below the price. */
.\#product-card.\@tbb-polaroid .\#product-card-caption {
  text-align: center !important;
  padding: 0.4rem 0.5rem 0 !important;
  margin: 0 !important;
  background: transparent !important;
  min-height: 0 !important;
  row-gap: 0.2rem !important;
  gap: 0.2rem !important;
  /* Mono stack renders heavier than sans at the same weight — lighten
     the entire caption area so the polaroid card reads soft and tactile
     instead of chunky. Applies to vendor, label, price, condition, etc.
     Rest of the site keeps default body weight. */
  font-weight: 400 !important;
}
.\#product-card.\@tbb-polaroid .\#product-card-caption * {
  font-weight: 400 !important;
}

/* Diffusion wraps caption rows in flex/grid containers with their own
   margins — zero them out so only vendor + price + condition badge
   contribute height. */
.\#product-card.\@tbb-polaroid .\#product-card-caption > * {
  margin-top: 0 !important;
  margin-bottom: 0 !important;
}

/* Hide empty rating/quick-add rows Diffusion renders by default when
   a product has no reviews / quick-add is disabled. These otherwise
   reserve vertical space even when empty. */
.\#product-card.\@tbb-polaroid .\#product-card-caption .\#product-card-rating:empty,
.\#product-card.\@tbb-polaroid .\#product-card-caption .\#product-card-reviews:empty,
.\#product-card.\@tbb-polaroid .\#product-card-quick-add-wrapper:empty {
  display: none !important;
}

/* -------------------------------------------------------------------------
   Caption row order (TBB 2026):
     1. "Handpicked by:"   (label — CSS ::before on vendor, always rendered)
     2. [Seller Name]      (vendor row)
     3. Price              (sale / current price, pink)
     4. Compare-at         (strikethrough, muted, ALWAYS reserves space)
     5. Condition badge    (cyan pill, ALWAYS reserves space)

   Uniformity: every product card reserves identical row heights regardless
   of whether compare-at or condition metafields are present, so rows align
   across the carousel grid. Empty rows keep their min-height and render
   transparent placeholders.
   ------------------------------------------------------------------------- */

/* "Handpicked by:" label rendered via ::before on the vendor element so we
   don't have to touch the product-card.liquid markup. Displays as its own
   block row above the vendor name. Styled like the section header's
   "Curated by:" label — small, italic, dim. */
.\#product-card.\@tbb-polaroid .\#product-card-caption .\#product-card-vendor::before {
  content: 'Curated by:';
  display: block;
  font-family: inherit;
  font-style: italic;
  font-weight: 400;
  font-size: 0.72rem;
  color: #c8c8d8;
  opacity: 0.75;
  letter-spacing: 0.02em;
  /* Breathing room between label and vendor name — LeMarc feedback Fix Pass 5. */
  margin-bottom: 0.3rem;
  line-height: 1.1;
}

.\#product-card.\@tbb-polaroid .\#product-card-caption .\#product-card-vendor {
  color: #ffffff !important;
  font-size: 0.85rem;
  font-weight: 600;
  opacity: 1;
  margin-bottom: 0.25rem;
  line-height: 1.15;
  /* Reserve a single-line slot so cards stay aligned even if vendor is
     blank (e.g. products without a vendor set). */
  min-height: 1.15em;
}

/* Price block — force consistent vertical footprint so cards with and
   without a compare-at price occupy identical space. The container is
   flex-column centered so single-price cards visually center in the
   reserved 2-row slot instead of top-aligning. */
.\#product-card.\@tbb-polaroid .\#product-card-caption .\#product-card-price {
  display: flex !important;
  flex-direction: column !important;
  align-items: center !important;
  justify-content: center !important;
  gap: 0.05rem !important;
  min-height: 0 !important;
  margin: 0 !important;
  color: #fe8aed !important;
  font-weight: 700 !important;
  font-size: 1.4rem !important;
  line-height: 1.2 !important;
}

/* Current / sale price — always pink, always visible. Diffusion's
   `.#price-item.@regular` is the line the customer pays. */
.\#product-card.\@tbb-polaroid .\#product-card-caption .\#product-card-price .\#price-item.\@regular .\#price-value,
.\#product-card.\@tbb-polaroid .\#product-card-caption .\#product-card-price .\#price-item.\@regular {
  color: #fe8aed !important;
  font-weight: 700 !important;
  font-size: 1.4rem !important;
  line-height: 1.2 !important;
  text-decoration: none !important;
  background: transparent !important;
}

/* Compare-at (the "was" price, only present when on sale) — muted white
   with strikethrough to clearly indicate the original price. */
.\#product-card.\@tbb-polaroid .\#product-card-caption .\#product-card-price .\#price-item.\@compare,
.\#product-card.\@tbb-polaroid .\#product-card-caption .\#product-card-price .\#price-item.\@compare .\#price-value,
.\#product-card.\@tbb-polaroid .\#product-card-caption .\#product-card-price .\#price-item.\@compare .\#price-item-value,
.\#product-card.\@tbb-polaroid .\#product-card-caption .\#product-card-price .\#price-item.\@compare * {
  color: #c8c8d8 !important;
  font-weight: 500 !important;
  font-size: 0.85rem !important;
  line-height: 1.1 !important;
  text-decoration: line-through !important;
  text-decoration-line: line-through !important;
  border-bottom: 0 !important;
  opacity: 0.85;
  background: transparent !important;
}

/* Quick-view + badges should still float above the polaroid frame */
.\#product-card.\@tbb-polaroid .\#product-card-badges {
  z-index: 7;
}
/* TBB: Shrink native Diffusion sale/sold-out badges to a compact pill size
   so they match the Boost grid badges (both grids should be indistinguishable). */
.\#product-card-badge {
  font-size: 0.7rem !important;
  padding: 0.2rem 0.55rem !important;
  border-radius: 0.4em !important;
  line-height: 1.1 !important;
}

/* ── Decade badge — SHARED component ──
   Cyan pill showing the product era (e.g. "1990s"). Single source of truth
   used by homepage product cards, Top 8, Boost grid, and any future surface.
   Rendered when product metafield `custom.decade` is set. */
.tbb-decade-badge {
  display: inline-block !important;
  width: auto !important;
  max-width: max-content !important;
  align-self: center !important;
  margin-left: auto !important;
  margin-right: auto !important;
  padding: 0.2rem 0.75rem;
  border-radius: 9999px;
  background: rgba(141, 224, 244, 0.12);
  border: 1px solid rgba(141, 224, 244, 0.55);
  color: #8de0f4;
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  line-height: 1.2;
  text-transform: none;
}

/* ── Decade row — SHARED component ──
   Wrapper that reserves vertical space so cards with/without a decade
   badge stay aligned across the grid. Always renders; badge inside is
   conditional. Used by all surfaces (homepage, Top 8, Boost grid). */
.tbb-decade-row {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 1.6rem;
  margin-top: 0.2rem;
}

/* ── Product price — SHARED component ──
   Pink column-stacked price block used by Top 8, Boost grid, and any
   future product card surface. Sale price on top, compare-at below.
   min-height keeps cards aligned when some have sale prices and some don't.
   Boost selectors add !important to override Boost's external CSS cascade. */
.tbb-product-price {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 0.1rem;
  min-height: 2.7em;
  color: #fe8aed;
  font-size: 1.4rem;
  font-weight: 700;
  line-height: 1.2;
}
.tbb-product-price-current {
  color: #fe8aed;
  font-weight: 700;
  font-size: 1.4rem;
}
.tbb-product-price-compare {
  color: #c8c8d8;
  font-weight: 500;
  font-size: 0.85rem;
  line-height: 1.1;
  text-decoration: none;
  opacity: 0.85;
}


/* -------------------------------------------------------------------------
   HOVER CART BUTTON (TBB 2026 — Figma quick-action overlay)

   Restyles Diffusion's existing `#product-card-express-button` into a
   40×40 white square icon button centered over the polaroid image,
   matching the Figma reference. We reuse Diffusion's express-button
   logic entirely (single-variant → AJAX `product-to-cart`; multi-variant
   → quick-view modal) — no new Liquid, no new JS. Only the visual skin
   changes, scoped to `.@tbb-polaroid` so non-polaroid product cards
   elsewhere on the site keep the default express-button styling.

   Enable: `product_card_show_express_button: true` in settings_data.json.

   Desktop: fades in on card hover.
   Mobile: always visible (no :hover on touch).
   ------------------------------------------------------------------------- */

/* Reposition the express-button wrapper from its default "bottom-anchored
   translate" to centered-over-media. Polaroid media is the full card
   minus the ~17% title strip, so vertical center of the IMAGE area is
   ~41% from the top of the media element. */
.\#product-card.\@tbb-polaroid .\#product-card-express-button {
  position: absolute !important;
  top: 41% !important;
  left: 50% !important;
  bottom: auto !important;
  transform: translate(-50%, -50%) !important;
  width: auto !important;
  gap: 0.5rem !important;
  z-index: 21;
  /* Fade in on card hover (desktop). Overridden to always-visible inside
     the mobile media query below. */
  opacity: 0;
  transition: opacity 0.2s ease;
  pointer-events: none;
}
.\#product-card.\@tbb-polaroid:hover .\#product-card-express-button {
  opacity: 1;
  pointer-events: auto;
}

/* Dim overlay behind the buttons — 10% black over the image on hover,
   matching Figma's `group-hover:bg-black/10` pattern. Implemented as a
   sibling pseudo on `.#product-card-media` via ::before so we don't need
   any new markup. */
.\#product-card.\@tbb-polaroid .\#product-card-media::before {
  content: '';
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, 0);
  transition: background 0.2s ease;
  pointer-events: none;
  z-index: 20;
}
.\#product-card.\@tbb-polaroid:hover .\#product-card-media::before {
  background: rgba(0, 0, 0, 0.10);
}

/* The express-button wrapper contains either a `<product-to-cart>` custom
   element (single-variant) or a `<modal-trigger>` (multi-variant) — both
   wrapping a Diffusion `.#button`. Override all of that visual styling
   to produce the Figma 40×40 white icon button. */
.\#product-card.\@tbb-polaroid .\#product-card-express-button product-to-cart,
.\#product-card.\@tbb-polaroid .\#product-card-express-button modal-trigger {
  display: inline-block !important;
}

.\#product-card.\@tbb-polaroid .\#product-card-express-button .\#button {
  /* Figma spec: w-10 h-10 with min-w-[44px] min-h-[44px] touch target,
     rounded-sm (2px), white bg, shadow-lg. */
  min-width: 44px !important;
  min-height: 44px !important;
  width: 40px !important;
  height: 40px !important;
  padding: 0 !important;
  border-radius: 2px !important;
  border: none !important;
  background-color: #ffffff !important;
  background-image: none !important;
  color: #1a1a2e !important;
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.25),
              0 4px 6px -4px rgba(0, 0, 0, 0.20) !important;
  transition: background-color 0.15s ease, color 0.15s ease,
              transform 0.15s ease !important;
  font-size: 0 !important; /* kill any inherited label whitespace */
  line-height: 1 !important;
}

.\#product-card.\@tbb-polaroid .\#product-card-express-button .\#button:hover {
  background-color: #8de0f4 !important; /* Figma --color-brand-cyan */
  transform: scale(1.05);
}

/* Hide the default express-button text label ("Add to cart" / "Options"). */
.\#product-card.\@tbb-polaroid .\#product-card-express-button-text > span:not(.\#icon):not([class*="icon"]) {
  display: none !important;
}
.\#product-card.\@tbb-polaroid .\#product-card-express-button-text {
  gap: 0 !important;
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
}

/* Hide Diffusion's default `plus` icon rendered inside the express-button
   — we're replacing it with a lucide ShoppingCart SVG background-image
   on the button itself. `visibility: hidden` keeps its box so the flex
   centering still works. */
.\#product-card.\@tbb-polaroid .\#product-card-express-button .\#button .\#icon,
.\#product-card.\@tbb-polaroid .\#product-card-express-button .\#button svg {
  display: none !important;
}

/* Inline lucide ShoppingCart SVG as background-image. Path exactly
   matches `lucide-react` ShoppingCart: circle(cx=8,cy=21,r=1) +
   circle(cx=19,cy=21,r=1) + M2.05 2.05h2l2.66 12.42a2 2 0 0 0 2 1.58h9.78
   a2 2 0 0 0 1.95-1.57l1.65-7.43H5.12. 24×24 viewBox, stroke-width 2. */
.\#product-card.\@tbb-polaroid .\#product-card-express-button .\#button::before {
  content: '';
  display: block;
  width: 20px;
  height: 20px;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%231a1a2e' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='8' cy='21' r='1'/><circle cx='19' cy='21' r='1'/><path d='M2.05 2.05h2l2.66 12.42a2 2 0 0 0 2 1.58h9.78a2 2 0 0 0 1.95-1.57l1.65-7.43H5.12'/></svg>");
  background-repeat: no-repeat;
  background-position: center center;
  background-size: 20px 20px;
  transition: filter 0.15s ease;
}
/* On hover the button bg flips to cyan; darken the stroke slightly so it
   still reads on the new bg. Using `filter: brightness(0)` keeps the
   stroke fully black without a second SVG variant. */
.\#product-card.\@tbb-polaroid .\#product-card-express-button .\#button:hover::before {
  filter: brightness(0);
}

/* Mobile — always-visible buttons, no hover fade (touch has no hover). */
@media (max-width: 991px) {
  .\#product-card.\@tbb-polaroid .\#product-card-express-button {
    opacity: 1 !important;
    pointer-events: auto !important;
  }
  /* Mobile also doesn't want the dim image overlay — it'd be present
     permanently, washing out every product image. */
  .\#product-card.\@tbb-polaroid .\#product-card-media::before {
    background: rgba(0, 0, 0, 0) !important;
  }
}


/* =========================================================================
   HEADER REDESIGN — TBB 2026 (Figma "TBB Shop 2.0 Mockup v1")

   GOAL: Match the Figma mobile header without touching desktop layout.
   STRATEGY: Skin in place over Diffusion's `g_header` markup.

   DESKTOP (>= 992px):
     - Layout is byte-for-byte identical to pre-reskin Diffusion.
     - The new `.tbb-header-bar2` wrapper around the toolbar + mobile menu
       trigger uses `display: contents` so it disappears from the layout
       tree, and its children become direct flex items of `.#header-main-inner`.
     - Only the global mono font cascade reaches nav text (no nav-specific
       overrides — `--font-body-family` from `:root` does the work).

   MOBILE (<= 991px):
     - Two-row layout: row 1 = logo + searchbar (cyan, theme-controlled);
       row 2 = `.tbb-header-bar2` (dark navy, painted via CSS variable
       `--tbb-header-bar2-bg`, full-bleed past container padding).
     - Toolbar items switch from icon-only stacked to icon + label inline,
       white-on-navy.
     - Hamburger trigger gets a "MENU" label sibling.
     - Search input loses its circular button chrome — magnifier sits inline
       on the right edge of the input, transparent background.

   DRAWER (`.tbb-drawer`, see main-navigation-mobile.liquid):
     - Dark navy panel matching bar 2.
     - Top section: Login/Sign Up + My Wishlist (icon + label, white).
     - Middle: existing Diffusion lvl0 menu links (caret accordions, pink
       underline accents on labels).
     - CTA: "Become a Seller" pill — cyan fill, purple glow.
     - Footer: "Page Settings" panel with Light Mode + Tiled Background
       toggle pills. Visual stubs only — see [data-tbb-stub] markers in
       main-navigation-mobile.liquid for wiring TODOs.

   THEME EDITABILITY (preserved):
     - Cyan top-bar background still sourced from theme settings via
       `--p-bg-color`. We never hardcode it.
     - Become a Seller label + URL come from new section settings on
       `g_header` (`become_a_seller_label` / `become_a_seller_url`).
     - Bar 2 background uses a CSS variable `--tbb-header-bar2-bg` so
       a future theme setting can expose it without a CSS edit.

   Note on Diffusion class escaping (per memory): Diffusion uses literal `#`
   and `@` in class names, so CSS selectors must escape them as `.\#` / `.\@`.
   Plain `.product-card` matches nothing — same applies here for `.#header*`.
   ========================================================================= */

:root {
  /* Default bar 2 (mobile bottom band + drawer) — near-black navy from
     Figma. Override at the root if a future theme setting exposes this. */
  --tbb-header-bar2-bg: #1a1a2e;
  --tbb-header-bar2-text: #ffffff;
  --tbb-drawer-divider: rgba(255, 255, 255, 0.12);
  --tbb-cta-cyan: #8de0f4;
  --tbb-cta-purple: #9c01ff;
  --tbb-accent-pink: #fe8aed;
}

/* -------------------------------------------------------------------------
   1. DESKTOP — preserve Diffusion's flex layout exactly + mono nav font
   ------------------------------------------------------------------------- */
@media (min-width: 992px) {
  /* `display: contents` makes the wrapper transparent to the parent
     flex layout. Toolbar and (hidden) mobile menu trigger become direct
     children of `.#header-main-inner` again, identical to pre-wrap. */
  .tbb-header-bar2 {
    display: contents;
  }
  /* MENU label only exists on mobile — never show on desktop where the
     entire mobile nav trigger is in `.desktop-hidden`. */
  .tbb-menu-trigger-label {
    display: none;
  }
}

/* Desktop nav links have a hardcoded `font-family: Chivo, sans-serif` rule
   on `.#main-navigation-link` (Diffusion's main-navigation snippet) that
   wins over the global `--font-body-family` cascade we set in `:root`.
   Explicit override here so the desktop nav joins the mono cascade.
   Applies at all viewports — mobile drawer items also live under
   `.#main-navigation-mobile-nav-link` which has its own override below. */
.\#main-navigation-link,
.\#main-navigation-link a,
.\#header-primary-nav .\#main-navigation-link,
.\#header-primary-nav a,
.\#header-secondary-nav .\#main-navigation-link,
.\#header-secondary-nav a {
  font-family: var(--font-body-family) !important;
}

/* Tablet nav: shrink links so they fit alongside logo + search + toolbar.
   16px monospace overflows ~1024px viewports. Scale down to 13px at the
   narrow end of "desktop", then restore full size at 1200px+. */
@media (min-width: 992px) and (max-width: 1199px) {
  .\#main-navigation-link,
  .\#main-navigation-link a,
  .\#header-primary-nav .\#main-navigation-link,
  .\#header-primary-nav a {
    font-size: 13px !important;
  }
}

/* -------------------------------------------------------------------------
   2. MOBILE — two-row layout
   ------------------------------------------------------------------------- */
@media (max-width: 991px) {
  /* Override Diffusion's flex-wrap layout. We want a CSS Grid with
     two explicit rows so we can place items deterministically and the
     bar 2 wrapper can paint a full-bleed dark band. */
  .\#header .\#header-main-inner {
    display: grid !important;
    grid-template-columns: auto 1fr;
    grid-template-rows: auto auto;
    grid-template-areas:
      "logo  search"
      "bar2  bar2";
    align-items: center;
    gap: 0.6rem 0.75rem;
    padding-top: 0.85rem !important;
    /* Diffusion sets `padding-bottom: 24px` on `.#header-main-inner` at
       mobile sizes, which leaves a cyan strip below bar 2 before the
       announcement bar. Force to zero so bar 2 sits flush against the
       bottom edge of `.#header-main`. */
    padding-bottom: 0 !important;
    /* Reset wrap from Diffusion's mobile rule (`flex-wrap: wrap` no longer
       applies because we're grid, but explicit reset for safety). */
    flex-wrap: nowrap;
  }
  /* Place each child in its grid cell. */
  .\#header .\#header-main-inner > .\#header-logo {
    grid-area: logo;
    margin: 0 !important;
    /* Kill Diffusion's mobile-only `left: 25%; transform: translateX(-50%)`
       custom CSS from header-group.json — that hack centered the logo
       above the search row, but in our two-bar layout the logo sits
       inline with search and needs to start at the left edge. */
    left: 0 !important;
    transform: none !important;
  }
  .\#header .\#header-main-inner > .\#header-searchbar {
    grid-area: search;
    /* Diffusion's mobile rule sets `order: 99` and `width: 100vw` to push
       the searchbar onto its own row. Reset both — grid placement does
       the row work and 100vw breaks out of the bar 1 background. */
    order: initial !important;
    width: auto !important;
    margin-left: 0 !important;
    margin-right: 0 !important;
  }
  .\#header .\#header-main-inner > .tbb-header-bar2 {
    grid-area: bar2;
    /* Full-bleed regardless of container padding. Diffusion's `.#container`
       uses ~31px (2rem) horizontal padding at mobile sizes, not the 16px
       I originally assumed. `calc(50% - 50vw)` always reaches the viewport
       edge from the current element's center, so this works regardless of
       what padding any ancestor container has. The internal padding then
       offsets content back to a comfortable inset from the viewport. */
    margin-left: calc(50% - 50vw);
    margin-right: calc(50% - 50vw);
    padding-top: 0.85rem;
    padding-bottom: 0.85rem;
    /* Right padding floor bumped from 1rem to 1.25rem so the cart total
       ($0.00) always has breathing room from the viewport edge. The
       calc form bleeds out to the viewport edge while keeping the inner
       content at least 20px in from that edge. */
    padding-left: max(1rem, calc(50vw - 50% + 0.25rem));
    padding-right: max(1.25rem, calc(50vw - 50% + 0.5rem));
    /* Bar 2 matches the header's theme-set cyan (--p-bg-color comes from
       settings.color_header_primary_bg in g_header.liquid). Text flips to
       dark. We locally override --tbb-header-bar2-text so every child that
       references it gets dark automatically — the drawer is outside this
       scope so it keeps its white-on-navy palette untouched. */
    --tbb-header-bar2-text: #1a1a2e;
    background: var(--p-bg-color, #8de0f4);
    color: var(--tbb-header-bar2-text);
    display: flex;
    align-items: center;
    /* Tightened from 1.5rem so 4 items + the menu trigger fit comfortably
       at 360px viewports without the cart total getting squeezed. */
    gap: 1rem;
    /* Bar 2 is the last row in the grid; ensure it's flush with the
       bottom of `.#header-main` (no margin sneaking in). */
    margin-bottom: 0;
  }

  /* --- Bar 1: searchbar pill skin --- */
  .\#header .\#header-searchbar-input {
    border-radius: 999px;
    padding: 0.85rem 3rem 0.85rem 1.5rem;
    background-color: rgba(255, 255, 255, 0.96);
    color: #1a1a2e;
    font-weight: 400;
    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);
  }
  /* Strip the circular button chrome — magnifier should look like an
     inline icon, not a button. */
  .\#header .\#header-searchbar-button {
    background-color: transparent !important;
    color: #6b6b80 !important;
    width: 2rem;
    height: 2rem;
    right: 0.5rem;
  }
  .\#header .\#header-searchbar-button .\#icon {
    --size: 1rem;
  }

  /* --- Bar 2: hamburger + MENU label --- */
  /* The mobile menu trigger sits at the bottom of TWO nested wrappers:
       .desktop-hidden  →  .#main-navigation-mobile  →  <modal-trigger>
     Both wrappers default to `display: block` and inherit some line-height
     that pushes their box height to ~33px while the visible menu trigger
     content is only ~22px. Bar 2 centers `.desktop-hidden`, that wrapper
     centers `.#main-navigation-mobile`, and that wrapper centers the
     modal-trigger element — three nested flex contexts so the icon lands
     on the same vertical centerline as the toolbar items beside it. */
  .tbb-header-bar2 > .desktop-hidden {
    display: inline-flex !important;
    align-items: center !important;
    align-self: center;
  }
  .tbb-header-bar2 .\#main-navigation-mobile {
    display: inline-flex !important;
    align-items: center !important;
    line-height: 1;
  }
  .tbb-menu-trigger {
    display: inline-flex !important;
    align-items: center;
    gap: 0.5rem;
    cursor: pointer;
    color: var(--tbb-header-bar2-text);
  }
  .tbb-menu-trigger-icon {
    display: inline-flex;
    width: 1.4rem;
    height: 1.4rem;
    align-items: center;
    justify-content: center;
  }
  .tbb-menu-trigger-icon .\#icon {
    --size: 1.2rem;
    color: inherit;
  }
  .tbb-menu-trigger-label {
    display: inline;
    font-size: 0.85rem;
    font-weight: 700;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: inherit;
    /* Use the global mono cascade — explicit so it can't get overridden
     * by a hostile parent rule. */
    font-family: var(--font-body-family);
  }

  /* --- Bar 2: toolbar items (Login / Wishlist / Cart) inline icon+label --- */
  .tbb-header-bar2 .\#header-toolbar {
    display: flex;
    flex-direction: row;
    gap: 1.5rem;
    margin-left: auto;
    align-items: center;
  }
  .tbb-header-bar2 .\#header-toolbar-item {
    color: var(--tbb-header-bar2-text);
  }
  .tbb-header-bar2 .\#header-toolbar-item-inner {
    flex-direction: row !important;
    align-items: center;
    gap: 0.4rem;
  }
  .tbb-header-bar2 .\#header-toolbar-item-icon .\#icon {
    --size: 1.05rem;
    color: inherit;
  }
  /* Re-show the title labels — Diffusion's mobile rule hides them. */
  .tbb-header-bar2 .\#header-toolbar-item-title {
    display: inline-flex !important;
    font-size: 0.78rem;
    font-weight: 600;
    color: inherit;
    opacity: 1;
    text-transform: none;
    letter-spacing: 0.01em;
    font-family: var(--font-body-family);
  }
  /* Cart total / counter inherit bar2 text color. */
  .tbb-header-bar2 .\#header-toolbar-item-title .cart-total,
  .tbb-header-bar2 .\#cart-counter {
    color: inherit;
  }
  /* Hide the cart price label on mobile — on narrow viewports the dollar
     amount can overflow (e.g. $1,234.56). Keep the bag icon + counter
     badge visible; the total is still accessible in the cart drawer. */
  .tbb-header-bar2 .\#header-toolbar-item-title .cart-total {
    display: none;
  }

  /* Hide the redundant secondary nav row on mobile — the Figma drawer
     is the only navigation surface, and the secondary nav was floating
     above the cyan bar. */
  .\#header-secondary-nav {
    display: none;
  }
}

/* -------------------------------------------------------------------------
   3. DRAWER — TBB skin over Diffusion's `main-navigation-mobile`
   ------------------------------------------------------------------------- */
.tbb-drawer.\#main-navigation-mobile-drawer,
.tbb-drawer {
  background: var(--tbb-header-bar2-bg) !important;
  color: var(--tbb-header-bar2-text);
  /* Diffusion sets `overflow-y: auto` on the drawer but nothing on x.
     The stage-inner is `position: absolute; width: 400%` — its off-screen
     lvl panels bleed past the drawer-inner's `overflow: hidden` because
     absolute children can escape a non-overflow-clipping ancestor. Adding
     overflow-x: hidden on the drawer itself creates the clipping context
     at the right boundary, so lvl1+ content no longer peeks through. */
  overflow-x: hidden;
}
.tbb-drawer .\#main-navigation-mobile-drawer-inner {
  background: transparent;
  color: inherit;
  padding: 1.25rem 1.25rem 2rem;
}
/* Fix submenu peek: Diffusion's stage uses translateX to slide between
   levels, but adjacent levels remain visible since the overflow clip
   chain breaks across the custom element boundary. Instead of fighting
   overflow, hide non-active stage levels with visibility: hidden.
   Layout and height are unaffected — only paint is suppressed. */
.tbb-drawer .\#main-navigation-mobile-stage-lvl {
  visibility: hidden;
}
.tbb-drawer .\#main-navigation-mobile-stage[data-current="0"] .\#main-navigation-mobile-stage-lvl:nth-child(1),
.tbb-drawer .\#main-navigation-mobile-stage[data-current="1"] .\#main-navigation-mobile-stage-lvl:nth-child(2),
.tbb-drawer .\#main-navigation-mobile-stage[data-current="2"] .\#main-navigation-mobile-stage-lvl:nth-child(3),
.tbb-drawer .\#main-navigation-mobile-stage[data-current="3"] .\#main-navigation-mobile-stage-lvl:nth-child(4) {
  visibility: visible;
}

/* Top user section: Login + Wishlist row */
.tbb-drawer-section {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}
.tbb-drawer-section--user {
  padding-block: 0.5rem 1rem;
}
.tbb-drawer-user-link {
  display: inline-flex;
  align-items: center;
  gap: 0.85rem;
  color: var(--tbb-header-bar2-text);
  text-decoration: none;
  font-weight: 600;
  font-size: 1.05rem;
  font-family: var(--font-body-family);
}
.tbb-drawer-user-link .\#icon {
  --size: 1.2rem;
  width: 1.2rem;
  height: 1.2rem;
  flex-shrink: 0;
  color: inherit;
}
.tbb-drawer-user-link:hover {
  color: var(--tbb-cta-cyan);
}

.tbb-drawer-divider {
  border: none;
  border-top: 1px solid var(--tbb-drawer-divider);
  margin: 1.25rem 0;
}

/* Back button — strip Diffusion's grey #ededed background */
.tbb-drawer .\#main-navigation-mobile-nav-back {
  background-color: transparent;
  color: var(--tbb-header-bar2-text);
  opacity: 1;
}

/* Re-skin Diffusion's lvl0 menu items (already inside the drawer) so the
   labels are white and the carets are pink. We can't easily re-template
   the markup, so override the existing classes in place. */
.tbb-drawer .\#main-navigation-mobile-nav {
  background: transparent;
}
.tbb-drawer .\#main-navigation-mobile-nav-item {
  border-bottom: none;
}
.tbb-drawer .\#main-navigation-mobile-nav-link {
  color: var(--tbb-header-bar2-text) !important;
  font-family: var(--font-body-family);
  font-size: 1.05rem;
  font-weight: 700;
  padding: 0.85rem 0;
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.tbb-drawer .\#main-navigation-mobile-nav-link .\#icon {
  color: var(--tbb-header-bar2-text);
  opacity: 0.85;
}

/* ── Pre-launch: hide incomplete features (session 21) ──
   Hide on mobile the "Become a Seller" CTA + page settings drawer
   section — both are placeholder/incomplete for launch, to revisit.
   Hide the Wishlist toolbar item globally — points to the
   auction-plus watchlists dashboard which isn't reskinned yet. */
.tbb-drawer-section--cta,
.tbb-drawer-section--settings {
  display: none !important;
}
.\#header-toolbar-item:has(> a[href="/apps/auction-plus/watchlists"]) {
  display: none !important;
}

/* CTA section — Become a Seller pill */
.tbb-drawer-section--cta {
  align-items: center;
}
.tbb-drawer-cta {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  max-width: 22rem;
  padding: 1rem 1.75rem;
  border-radius: 999px;
  background: var(--tbb-cta-cyan);
  color: #1a1a2e;
  font-weight: 700;
  font-size: 1rem;
  text-decoration: none;
  font-family: var(--font-body-family);
  border: 2px solid var(--tbb-cta-purple);
  /* Outer purple glow per Figma. */
  box-shadow: 0 0 0 1px rgba(156, 1, 255, 0.4), 0 0 24px rgba(156, 1, 255, 0.55);
  transition: transform 0.15s ease, box-shadow 0.2s ease;
}
.tbb-drawer-cta:hover {
  transform: translateY(-1px);
  box-shadow: 0 0 0 1px rgba(156, 1, 255, 0.6), 0 0 32px rgba(156, 1, 255, 0.75);
}

/* Page Settings stubs — visual only, see [data-tbb-stub] markers */
.tbb-drawer-section--settings .tbb-drawer-section-label {
  font-size: 0.85rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--tbb-header-bar2-text);
  opacity: 0.75;
  margin-bottom: 0.25rem;
  font-family: var(--font-body-family);
}
.tbb-drawer-toggle {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding: 0.85rem 1.25rem;
  border-radius: 999px;
  border: none;
  cursor: pointer;
  font-family: var(--font-body-family);
  font-weight: 700;
  font-size: 1rem;
  color: #1a1a2e;
  width: 100%;
  text-align: left;
}
.tbb-drawer-toggle--light {
  /* Pink Light Mode pill from Figma. */
  background: #f48ad8;
}
.tbb-drawer-toggle--tiled {
  /* Cyan Tiled Background pill from Figma. */
  background: var(--tbb-cta-cyan);
}
.tbb-drawer-toggle:hover {
  filter: brightness(1.05);
}
.tbb-drawer-toggle-icon {
  font-size: 1.1rem;
  line-height: 1;
}

/* ═══════════════════════════════════════════════════════════════════════════
   TBB Creator Time Capsule / Spotlight Section
   Myspace-profile-style spotlight layout within d_image-with-text.
   Activated via capsule_mode toggle in section settings.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── Section-level: nuke ALL intermediate Diffusion wrappers so
   .tbb-creator-capsule is the sole owner of horizontal spacing,
   exactly like .tbb-carousel-shell controls its own margins.

   NOTE: section-body.liquid does NOT render custom `class` params, so
   `.tbb-capsule-section` never appears in the DOM. We use :has() to
   target ancestors of .tbb-creator-capsule instead. ── */
.\#section-body:has(.tbb-creator-capsule) {
  padding: 0 !important;
  margin: 2rem 0 !important;
  background: transparent !important;
  max-width: none !important;
}
.\#section-body:has(.tbb-creator-capsule) .\#container,
.\#section-body:has(.tbb-creator-capsule) .\#section-body-wrapper,
.\#section-body:has(.tbb-creator-capsule) .\#section-body-content {
  padding: 0 !important;
  margin: 0 !important;
  background: transparent !important;
  max-width: none !important;
  width: 100% !important;
}
[id^="shopify-section"]:has(.tbb-creator-capsule) {
  display: block;
}

/* ── Outer shell ── */
/* Session 17 — max-width is now CSS-var driven (`--tbb-capsule-max-width`).
   Default 960px (compact) preserves the original MySpace-profile intimacy.
   The section's schema "Full width to match carousels" checkbox sets the
   var to 1240px inline on the capsule root, opting that instance in. */
.tbb-creator-capsule {
  position: relative;
  max-width: var(--tbb-capsule-max-width, 960px);
  margin: 0 auto;
  border: 4px solid var(--tbb-capsule-border, #9c01ff);
  border-radius: 8px;
  overflow: hidden;
  box-shadow: 0 0 30px var(--tbb-capsule-glow, rgba(156,1,255,0.50));
  background: rgba(15, 15, 30, 0.95);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
  box-sizing: border-box;
  /* Grid stack — all .tbb-capsule-slide children share grid cell (1,1)
     so the container locks to the tallest slide's height. Eliminates
     the layout shift where rotating to a longer-bio slide pushed
     downstream sections (Featured Sellers, etc.) up/down. Nav row
     auto-flows to row 2 below the stacked slides. */
  display: grid;
  grid-template-columns: 1fr;
}

/* ── Slide container (grid-stack crossfade) ──
   All slides occupy row 1 / col 1 simultaneously; the tallest sets
   container height. Inactive slides remain in the grid but are
   transparent + non-interactive. Active slide fades in via opacity. */
.tbb-capsule-slide {
  grid-column: 1;
  grid-row: 1;
  width: 100%;
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.6s ease;
}
.tbb-capsule-slide.is-active {
  opacity: 1;
  pointer-events: auto;
}

/* Pin nav to row 2 explicitly — defensive guard against future block
   additions inside .tbb-creator-capsule that could otherwise auto-place
   into row 2 ahead of the nav. */
.tbb-creator-capsule .tbb-capsule-nav {
  grid-row: 2;
}

/* ── MySpace Profile Header Bar ── */
.tbb-capsule-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
  padding: 0.5rem 0.75rem;
  background: linear-gradient(to right, #6366f1, #8b5cf6);
  border-bottom: 2px solid var(--tbb-capsule-border, #9c01ff);
}
.tbb-capsule-header-left {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex: 1;
  min-width: 0;
}
.tbb-capsule-avatar {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  border: 2px solid #fff;
  box-shadow: 0 2px 8px rgba(0,0,0,0.3);
  object-fit: cover;
  flex-shrink: 0;
}
.tbb-capsule-avatar--placeholder {
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(255,255,255,0.15);
  color: #fff;
}
.tbb-capsule-header-info {
  min-width: 0;
  font-size: 0.875rem !important;
  line-height: 1.3 !important;
}
.tbb-capsule-handle {
  display: block;
  color: #fff !important;
  font-weight: 700 !important;
  font-size: 0.875rem !important;
  line-height: 1.3 !important;
  text-decoration: none !important;
  transition: color 0.2s;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.tbb-capsule-handle:hover {
  color: #8de0f4 !important;
}
.tbb-capsule-location {
  color: rgba(255,255,255,0.8) !important;
  font-size: 0.7rem !important;
  line-height: 1.3 !important;
  margin: 0 !important;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Badge chip — oval pill shape to match decade pills across the site.
   Background + text color set via inline style per-block for per-slide flexibility. */
.tbb-capsule-badge {
  display: flex;
  align-items: center;
  gap: 0.35rem;
  background: #fe8aed;
  padding: 0.25rem 0.65rem;
  border-radius: 999px;
  flex-shrink: 0;
}
.tbb-capsule-badge span {
  color: inherit;
  font-weight: 700;
  font-size: 0.7rem;
  letter-spacing: 0.02em;
  white-space: nowrap;
}
.tbb-capsule-badge-star {
  color: inherit;
  flex-shrink: 0;
}

/* ── Two-column grid ── */
.tbb-capsule-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0;
}

/* ── Left panel: featured image + decorative shapes ── */
.tbb-capsule-left {
  position: relative;
  background: linear-gradient(to bottom right, #a78bfa, #8b5cf6);
  padding: 1.5rem;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  min-height: 280px;
}

/* ── Left panel: custom background image override ── */
.tbb-capsule-left--has-bg {
  background: none;
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
}
.tbb-capsule-left--has-bg .tbb-capsule-deco {
  display: none;
}

/* Decorative 90s elements */
.tbb-capsule-deco { position: absolute; pointer-events: none; }
.tbb-capsule-deco--circle {
  top: 0.5rem; left: 0.5rem;
  width: 40px; height: 40px;
  border: 3px solid #8de0f4;
  border-radius: 50%;
  opacity: 0.6;
}
.tbb-capsule-deco--diamond {
  bottom: 1rem; right: 1rem;
  width: 48px; height: 48px;
  background: #fef08a;
  transform: rotate(45deg);
  opacity: 0.4;
}
.tbb-capsule-deco--wave {
  top: 33%; right: 1.5rem;
  opacity: 0.7;
}
.tbb-capsule-deco--triangle {
  bottom: 25%; left: 1rem;
  width: 0; height: 0;
  border-left: 20px solid transparent;
  border-right: 20px solid transparent;
  border-bottom: 35px solid #ff6b9d;
  opacity: 0.5;
  transform: rotate(12deg);
}
.tbb-capsule-deco--sparkle-1 {
  top: 0.5rem; right: 0.5rem;
  font-size: 1.25rem;
  animation: tbb-capsule-pulse 2s ease-in-out infinite;
}
.tbb-capsule-deco--sparkle-2 {
  bottom: 1rem; left: 1rem;
  font-size: 1.1rem;
  animation: tbb-capsule-pulse 2s ease-in-out infinite 0.5s;
}
@keyframes tbb-capsule-pulse {
  0%, 100% { opacity: 1; transform: scale(1); }
  50% { opacity: 0.6; transform: scale(0.85); }
}

/* Featured image */
.tbb-capsule-featured-img {
  position: relative;
  max-width: 320px;
  width: 100%;
  transform: rotate(-2deg);
  transition: transform 0.4s ease;
  z-index: 1;
}
.tbb-capsule-featured-img:hover {
  transform: rotate(0deg);
}
.tbb-capsule-featured-img img {
  width: 100%;
  height: auto;
  display: block;
  box-shadow: 0 10px 40px rgba(0,0,0,0.4);
  border-radius: 2px;
}
.tbb-capsule-img-label {
  position: absolute;
  bottom: 3%;
  left: 0; right: 0;
  text-align: center;
  font-family: 'Permanent Marker', cursive;
  color: #374151;
  font-size: 1.1rem;
  margin: 0;
  pointer-events: none;
}

/* ── Right panel: dark bio card ── */
.tbb-capsule-right {
  background: linear-gradient(to bottom right, rgba(26,26,46,0.80), rgba(45,27,78,0.60));
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
  padding: 1.5rem;
  display: flex;
  flex-direction: column;
  justify-content: center;
}
.tbb-capsule-about-title {
  color: #fe8aed;
  font-family: 'Permanent Marker', cursive;
  font-size: 1rem;
  margin: 0 0 0.75rem 0;
  line-height: 1.2;
}
.tbb-capsule-bio {
  color: rgba(255,255,255,0.90);
  font-size: 0.8rem;
  line-height: 1.6;
  margin-bottom: 0.75rem;
}
.tbb-capsule-bio p {
  margin: 0 0 0.5rem 0;
}
.tbb-capsule-bio em {
  font-weight: 600;
  color: #8de0f4;
}
.tbb-capsule-tags {
  color: rgba(255,255,255,0.70);
  font-size: 0.75rem;
  font-style: italic;
  margin: 0 0 1rem 0;
}
/* Session 19 — visual styling now comes from shared `.tbb-btn` bevel.
   Keep only capsule-specific layout: align to start of the flex column
   so the CTA sits flush-left under the body copy. */
.tbb-capsule-cta {
  align-self: flex-start;
}

/* ── Auction timer box (renders when end_time is set on spotlight block) ── */
/* ──────────────────────────────────────────────────────────────────
   Countdown accent — `--tbb-timer-accent` is set inline per-block from
   the `countdown_color` schema setting. Tints the border, the inner
   glow, the label, and the unit titles (days/hours). Digits stay white
   for legibility. Defaults to cyan if the var isn't set.
   ────────────────────────────────────────────────────────────────── */
.tbb-capsule-timer-box {
  background: rgba(15, 15, 30, 0.95);
  border: 2px solid var(--tbb-timer-accent, #8de0f4);
  border-radius: 4px;
  padding: 0.75rem 1rem;
  margin-bottom: 1rem;
  box-shadow: inset 0 0 15px color-mix(in srgb, var(--tbb-timer-accent, #8de0f4) 15%, transparent);
}
.tbb-capsule-timer-label {
  color: var(--tbb-timer-accent, #fe8aed);
  font-weight: 700;
  font-size: 0.7rem;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  text-align: center;
  margin: 0 0 0.4rem 0;
}
/* Stacked mode: sits above the header, so needs top-margin breathing
   room and stretches to the capsule's interior edges. */
.tbb-capsule-timer-box--stacked {
  margin: 0 0 1rem 0;
}
/* Timer numbers: mono font from the live theme (inherits --font-body-family) */
.tbb-capsule-timer-box .\#countdown-timer {
  font-family: var(--font-body-family) !important;
}
.tbb-capsule-timer-box .\#countdown-timer-items {
  display: flex !important;
  justify-content: center !important;
  gap: 1rem !important;
}
.tbb-capsule-timer-box .\#countdown-timer-item {
  display: flex !important;
  flex-direction: column !important;
  align-items: center !important;
}
.tbb-capsule-timer-box .\#countdown-timer-item-time {
  color: #fff !important;
  font-weight: 700 !important;
  font-size: 1.5rem !important;
  font-family: var(--font-body-family) !important;
  line-height: 1.2 !important;
}
.tbb-capsule-timer-box .\#countdown-timer-item-title {
  color: var(--tbb-timer-accent, #8de0f4) !important;
  font-size: 0.6rem !important;
  text-transform: uppercase !important;
  letter-spacing: 0.05em !important;
  font-weight: 600 !important;
}
@media (max-width: 991px) {
  .tbb-capsule-timer-box {
    padding: 0.5rem 0.75rem;
  }
  .tbb-capsule-timer-box .\#countdown-timer-item-time {
    font-size: 1.2rem !important;
  }
  .tbb-capsule-timer-box .\#countdown-timer-items {
    gap: 0.75rem !important;
  }
}

/* ── Navigation bar: arrows + dots ── */
.tbb-capsule-nav {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.75rem;
  padding: 0.6rem 0;
  background: rgba(15,15,30,0.60);
}
.tbb-capsule-dots {
  display: flex;
  align-items: center;
  gap: 0.5rem;
}
.tbb-capsule-dot {
  width: 10px; height: 10px;
  border-radius: 50%;
  border: 2px solid rgba(255,255,255,0.4);
  background: transparent;
  padding: 0;
  cursor: pointer;
  transition: background 0.2s, border-color 0.2s;
}
.tbb-capsule-dot:hover {
  border-color: #8de0f4;
}
.tbb-capsule-dot.is-active {
  background: #fe8aed;
  border-color: #fe8aed;
}

/* Arrow buttons */
.tbb-capsule-arrow {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 28px; height: 28px;
  border-radius: 2px;
  border: none;
  background: var(--tbb-capsule-border, #9c01ff);
  color: #fff;
  cursor: pointer;
  padding: 0;
  transition: transform 0.15s, opacity 0.15s;
  flex-shrink: 0;
}
.tbb-capsule-arrow:hover {
  transform: scale(1.08);
}
.tbb-capsule-arrow:active {
  opacity: 0.8;
}

/* ── Mobile: stack to single column ── */
@media (max-width: 991px) {
  .tbb-capsule-grid {
    grid-template-columns: 1fr;
  }
  .tbb-capsule-left {
    min-height: 220px;
    padding: 1rem;
  }
  .tbb-capsule-featured-img {
    max-width: 240px;
  }
  .tbb-capsule-right {
    padding: 1rem;
  }
  .tbb-capsule-about-title {
    font-size: 0.8rem;
  }
  .tbb-capsule-bio {
    font-size: 0.65rem;
    line-height: 1.5;
  }
  .tbb-capsule-tags {
    font-size: 0.6rem !important;
  }
  /* Session 19 — shared bevel `.tbb-btn` handles padding/font-size now.
     Mobile: go full-width for easier tapping. */
  .tbb-capsule-cta {
    width: 100% !important;
  }
  /* Hide header badge on mobile — shown via duplicate in right pane instead */
  .tbb-capsule-header .tbb-capsule-badge {
    display: none;
  }
  /* Show the in-pane mobile badge */
  .tbb-capsule-badge--mobile {
    display: inline-flex !important;
    align-self: flex-start;
    margin-bottom: 0.75rem;
    padding: 0.2rem 0.55rem;
  }
  .tbb-capsule-badge--mobile span {
    font-size: 0.6rem !important;
  }
  .tbb-capsule-handle {
    font-size: 0.8rem !important;
  }
  .tbb-capsule-location {
    font-size: 0.65rem !important;
  }
  .tbb-capsule-header {
    padding: 0.4rem 0.6rem;
  }
  .tbb-capsule-avatar {
    width: 32px; height: 32px;
  }
  /* Shell margin — match carousel shell's `margin: 1.5rem 1rem` on mobile.
     Must use shorthand to fully override the base `margin: 0 auto`. */
  .tbb-creator-capsule {
    margin: 0 1rem !important;
  }
}

/* Hide the in-pane mobile badge on desktop — header badge is visible there */
.tbb-capsule-badge--mobile {
  display: none;
}

/* ── Desktop handle font bump ── */
@media (min-width: 992px) {
  .tbb-capsule-handle {
    font-size: 1rem;
  }
  .tbb-capsule-about-title {
    font-size: 1.125rem;
    margin-bottom: 1rem;
  }
  .tbb-capsule-bio {
    font-size: 0.85rem;
    margin-bottom: 1rem;
  }
  /* Tablet — bevel button default sizing. No override needed. */
  .tbb-capsule-featured-img {
    max-width: 320px;
  }
  .tbb-capsule-img-label {
    font-size: 1.25rem;
  }
}


/* =========================================================================
   COLLECTION TILES — Gradient tile mode for d_collection-list
   ========================================================================= */

/* Force section wrapper to block layout so margin:auto works (same fix as carousel) */
[id^="shopify-section"]:has(.tbb-tile-shell) {
  display: block;
}

/* Shell: border + glow container matching carousel shell dimensions */
.tbb-tile-shell {
  display: block;
  max-width: 1240px;
  margin: 2rem auto !important;
  padding: 1rem;
  background: rgba(15, 15, 30, 0.95);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
  border: 4px solid; /* color set via inline style */
  border-radius: 8px;
  box-sizing: border-box;
}
@media (max-width: 991px) {
  .tbb-tile-shell {
    margin: 1.5rem 1rem !important;
    padding: 0.75rem;
    max-width: none;
  }
}
@media (min-width: 992px) {
  .tbb-tile-shell {
    padding: 1.5rem;
  }
}

/* Heading inside the shell — matches carousel header treatment.
   Mobile-first: 18px base → 24px at 992px (same as carousel headings). */
.tbb-tile-heading {
  font-family: 'Permanent Marker', 'Marker Felt', cursive !important;
  color: #ffffff;
  font-weight: 700;
  font-size: 18px;
  line-height: 1;
  margin: 0 0 0.5rem 0;
}
@media (min-width: 992px) {
  .tbb-tile-heading {
    font-size: 24px;
    margin-bottom: 0.75rem;
  }
}
.tbb-tile-subheading {
  font-style: italic;
  color: #e0e0f0;
  opacity: 0.85;
  font-size: 0.8rem;
  margin: 0 0 1rem 0;
  line-height: 1.4;
}
@media (min-width: 992px) {
  .tbb-tile-subheading {
    font-size: 0.875rem;
  }
}

/* Neutralize section-body padding when tile shell owns the frame */
[id^="shopify-section"]:has(.tbb-tile-shell) .\#section-body {
  background: transparent !important;
  padding: 0 !important;
  margin: 0 !important;
  border: none !important;
  box-shadow: none !important;
}
[id^="shopify-section"]:has(.tbb-tile-shell) .\#section-body .\#container,
[id^="shopify-section"]:has(.tbb-curator-shell) .\#section-body .\#container {
  padding-left: 0 !important;
  padding-right: 0 !important;
  max-width: none !important;
}

/* Vertical spacing between consecutive tile sections */
[id^="shopify-section"]:has(.tbb-tile-shell) + [id^="shopify-section"]:has(.tbb-tile-shell) {
  margin-top: 0.5rem;
}

/* Grid — uses --columns (desktop) and --columns-mobile (mobile) custom props */
.tbb-tile-grid {
  display: grid;
  grid-template-columns: repeat(var(--columns-mobile, 2), 1fr);
  gap: 0.75rem;
}
@media (min-width: 992px) {
  .tbb-tile-grid {
    grid-template-columns: repeat(var(--columns, 4), 1fr);
    gap: 1rem;
  }
}

/* Individual tile */
.tbb-tile {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1.5rem 1rem;
  border-radius: 8px;
  color: #fff;
  font-weight: 700;
  font-size: 0.875rem;
  text-decoration: none;
  text-align: center;
  transition: box-shadow 0.3s ease, transform 0.2s ease;
  cursor: pointer;
  border: none;
}
@media (min-width: 992px) {
  .tbb-tile {
    padding: 2rem 1rem;
    font-size: 1rem;
  }
}
.tbb-tile:hover {
  box-shadow: 0 0 20px var(--tbb-tile-glow, rgba(254, 138, 237, 0.6));
  transform: translateY(-2px);
}
.tbb-tile:active {
  transform: translateY(0);
}

/* ═══════════════════════════════════════════════════
   CURATOR MODE — Top Nostalgia Curators cards
   ═══════════════════════════════════════════════════ */

.tbb-curator-shell {
  background: rgba(15, 15, 30, 0.95);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  border: 4px solid #fe8aed;
  border-radius: 6px;
  padding: 0.75rem;
  overflow: visible;
  max-width: 1240px;
  /* Session 22 — 2rem vertical rhythm matches .tbb-carousel-shell /
     .tbb-tile-shell so every homepage carousel has an identical gap
     between it and the next section. */
  margin: 2rem auto;
}
@media (max-width: 991px) {
  .tbb-curator-shell {
    margin: 1.5rem 1rem !important;
    padding: 0.75rem;
    max-width: none;
  }
}
@media (min-width: 768px) {
  .tbb-curator-shell { padding: 1.5rem; }
}
.\#section-body:has(.tbb-curator-shell) {
  background: transparent !important;
  padding: 0 !important;
}

/* ── Header row ── */
.tbb-curator-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 1rem;
}
@media (min-width: 768px) {
  .tbb-curator-header { margin-bottom: 1.5rem; }
}
.tbb-curator-heading {
  font-family: 'Permanent Marker', 'Marker Felt', cursive !important;
  color: #fff;
  font-size: 18px;
  font-weight: 700;
  line-height: 1;
  margin: 0;
}
@media (min-width: 992px) {
  .tbb-curator-heading { font-size: 24px; }
}

/* ── Nav arrows (matches carousel shell pattern) ── */
.tbb-curator-nav { display: flex; gap: 0.5rem; flex-shrink: 0; }
.tbb-curator-nav-btn {
  width: 32px; height: 32px;
  min-width: 0;
  border-radius: 2px; border: none;
  padding: 0; margin: 0;
  cursor: pointer;
  background-color: var(--tbb-border-color, #fe8aed);
  background-repeat: no-repeat;
  background-position: center center;
  background-size: 20px 20px;
  color: #fff;
  transition: transform 0.2s ease, opacity 0.2s ease;
}
.tbb-curator-prev {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='m15 18-6-6 6-6'/></svg>");
}
.tbb-curator-next {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='m9 18 6-6-6-6'/></svg>");
}
.tbb-curator-nav-btn:hover:not(:disabled) { transform: scale(1.05); }
.tbb-curator-nav-btn:disabled { background-color: #4B5563 !important; opacity: 0.5; cursor: default; }

/* ── Scrollable track ── */
.tbb-curator-track {
  display: flex;
  gap: 0.75rem;
  overflow-x: auto;
  scroll-behavior: smooth;
  padding-top: 1.25rem;
  padding-bottom: 0.5rem;
  scrollbar-width: none;
}
.tbb-curator-track::-webkit-scrollbar { display: none; }
@media (min-width: 768px) {
  .tbb-curator-track { gap: 1rem; }
}

/* ── Card ── */
.tbb-curator-card {
  flex-shrink: 0;
  width: calc(50% - 6px);
  position: relative;
  background: linear-gradient(to bottom right, rgba(26, 26, 46, 0.95), rgba(45, 27, 78, 0.90));
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
  border: 2px solid rgba(141, 224, 244, 0.25);
  border-radius: 6px;
  padding: 0.75rem;
  text-decoration: none;
  text-align: center;
  transition: border-color 0.25s, box-shadow 0.25s;
  display: block;
}
@media (min-width: 768px) {
  .tbb-curator-card { width: calc(16.666% - 14px); padding: 1rem; }
}
.tbb-curator-card:hover {
  border-color: var(--curator-accent, #8de0f4);
  box-shadow: 0 0 20px color-mix(in srgb, var(--curator-accent, #8de0f4) 40%, transparent);
}

/* ── Gold rank badge ── */
.tbb-curator-badge {
  position: absolute;
  top: 0; left: 0;
  width: 32px; height: 32px;
  background: linear-gradient(to bottom right, #fef08a, #fbbf24);
  border-radius: 50%;
  border: 2px solid #fff;
  display: flex; align-items: center; justify-content: center;
  font-size: 0.875rem; font-weight: 700; color: #1a1a2e;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
  z-index: 2; line-height: 1;
}

/* ── Avatar ── */
.tbb-curator-avatar {
  width: 80px; height: 80px;
  border-radius: 50%;
  border: 3px solid #8de0f4;
  overflow: hidden;
  margin: 0.5rem auto 0.75rem;
  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.3);
  transition: transform 0.25s;
}
@media (min-width: 768px) {
  .tbb-curator-avatar { width: 96px; height: 96px; }
}
.tbb-curator-card:hover .tbb-curator-avatar { transform: scale(1.05); }
.tbb-curator-avatar-img {
  width: 100%; height: 100%;
  object-fit: cover; border-radius: 50%; display: block;
}
.tbb-curator-avatar-placeholder {
  width: 100%; height: 100%;
  display: flex; align-items: center; justify-content: center;
  background: rgba(156, 1, 255, 0.3);
  color: #fff; font-size: 2rem; font-weight: 700; text-transform: uppercase;
}

/* ── Handle ── */
.tbb-curator-handle {
  font-weight: 700;
  font-size: 0.75rem;
  color: #fff;
  margin: 0 0 0.25rem;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  padding: 0 0.25rem;
  transition: color 0.25s;
}
@media (min-width: 768px) {
  .tbb-curator-handle { font-size: 0.875rem; }
}
.tbb-curator-card:hover .tbb-curator-handle {
  color: var(--curator-accent, #8de0f4);
}

/* ── Stats ── */
.tbb-curator-stats { display: flex; flex-direction: column; gap: 2px; }
.tbb-curator-stat { font-size: 0.7rem; color: rgba(255, 255, 255, 0.70); line-height: 1.4; }
@media (min-width: 768px) {
  .tbb-curator-stat { font-size: 0.75rem; }
}
.tbb-curator-stat--highlight { color: #8de0f4; }

/* ── Skeleton loading state ── */
.tbb-curator-card--skeleton {
  pointer-events: none;
}
.tbb-curator-card--skeleton .tbb-curator-avatar-placeholder,
.tbb-curator-card--skeleton .tbb-curator-handle,
.tbb-curator-card--skeleton .tbb-curator-stats {
  background: linear-gradient(90deg, rgba(255,255,255,0.04) 0%, rgba(255,255,255,0.10) 50%, rgba(255,255,255,0.04) 100%);
  background-size: 200% 100%;
  animation: tbb-shimmer 1.5s infinite linear;
  border-radius: 4px;
}
.tbb-curator-card--skeleton .tbb-curator-handle { color: transparent; }
.tbb-curator-card--skeleton .tbb-curator-stats { color: transparent; }
@keyframes tbb-shimmer {
  0% { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}

/* ── Section spacing ── */
.shopify-section + .shopify-section .\#section-body:has(.tbb-curator-shell) {
  margin-top: 0.5rem;
}


/* =========================================================================
   SELLER PROFILE HEADER — TBB design system reskin of PV vendor banner
   ========================================================================= */

/* ── Neutralize Diffusion section wrapper around the PV app block ── */
[id*="1725992138569b844d"] .\#section-body {
  background: transparent !important;
  padding: 0 !important;
  margin: 0 !important;
}
[id*="1725992138569b844d"] .\#section-body .\#container {
  max-width: none !important;
  padding: 0 !important;
}

/* ── PV Container → TBB Shell treatment ── */
#puppetvendors-brand.pv-container {
  max-width: 1240px;
  margin: 2rem auto !important;
  padding: 0;
  background: rgba(15, 15, 30, 0.95) !important;
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
  border: 4px solid var(--tbb-border-color, #8de0f4) !important;
  overflow: hidden;
  border-radius: 8px;
  box-shadow: 0 0 20px var(--tbb-border-glow, rgba(141, 224, 244, 0.25));
  box-sizing: border-box;
}

/* ── "Powered by" link: de-emphasize ── */
#puppetvendors-brand .pv-banner {
  text-align: right;
  margin-bottom: 0.15rem;
}
#puppetvendors-brand .pv-banner .powered-by-link {
  font-size: 0.6rem;
  color: rgba(255,255,255,0.25);
  text-decoration: none;
}

/* ── Avatar ── */
#puppetvendors-brand .shop-pv-icon {
  background: transparent !important;
  border: none !important;
}
#puppetvendors-brand .shop-pv-icon img {
  border-radius: 8px;
  border: 2px solid var(--tbb-border-color, #fe8aed);
}

/* ── Shop name ── mono per design system, original case (preserves the
   merchant's intended capitalization, e.g. "Nostalgic Episodes" not
   "NOSTALGICEPISODES"). Permanent Marker is reserved for brand
   placements only — vendor names are identity, not accent. */
#puppetvendors-brand .pv-brand-name {
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace !important;
  color: #ffffff !important;
  font-size: 22px;
  font-weight: 700;
  letter-spacing: 0.02em;
  line-height: 1.2;
  margin: 0 0 0.35rem 0;
  text-transform: none;
}
#puppetvendors-brand .brand-description {
  color: rgba(255, 255, 255, 0.75) !important;
  font-size: 0.85rem;
  line-height: 1.4;
}

/* ── Location text inside pv-location ── */
#puppetvendors-brand .pv-location {
  color: rgba(255, 255, 255, 0.6) !important;
  font-size: 0.8rem;
}

/* ── Contact icons (website, phone, email) ── */
#puppetvendors-brand .pv-icons .pv-icon {
  color: rgba(255, 255, 255, 0.7) !important;
  transition: color 0.15s ease;
}
#puppetvendors-brand .pv-icons .pv-icon:hover {
  color: #ffffff !important;
}
#puppetvendors-brand .pv-icons .pv-icon svg {
  fill: currentColor;
}
#puppetvendors-brand .pv-icon-text {
  color: rgba(255, 255, 255, 0.7) !important;
  font-size: 0.75rem;
}

/* ── Right sidebar: status + policies + social ── */
#puppetvendors-brand .pv-contact.pv-social {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 0.6rem;
  flex-shrink: 0;
}

/* ── Status indicator ── */
#puppetvendors-brand .pv-status {
  font-size: 0.75rem;
  color: rgba(255, 255, 255, 0.6);
}
#puppetvendors-brand .pv-status-text {
  color: rgba(255, 255, 255, 0.6) !important;
}
#puppetvendors-brand .pv-status-dot {
  border-radius: 50%;
}

/* ── Policy links ── */
#puppetvendors-brand .pv-policies .pv-icon {
  font-size: 0.75rem;
}

/* ── Social icons ── */
#puppetvendors-brand .pv-contact.pv-social > .pv-icons {
  display: flex;
  gap: 0.5rem;
}
#puppetvendors-brand .pv-contact.pv-social > .pv-icons .pv-icon svg {
  width: 18px;
  height: 18px;
}

/* ── Mobile ── */
@media (max-width: 767px) {
  #puppetvendors-brand.pv-container {
    margin: 1rem !important;
    padding: 0.5rem;
    max-width: calc(100% - 2rem) !important;
  }
  #puppetvendors-brand .pv-banner {
    padding: 10px 12px !important;
  }
  #puppetvendors-brand .pv-content {
    padding: 10px 12px 0 !important;
  }
  #puppetvendors-brand .pv-shop-info {
    margin-bottom: 8px !important;
  }
  #puppetvendors-brand .pv-brand-name {
    font-size: 18px;
  }
  /* Tighten the gap between location rows */
  #puppetvendors-brand .pv-location > div + div {
    margin-top: 6px !important;
  }
}
/* ── Tablet ── */
@media (min-width: 768px) and (max-width: 991px) {
  #puppetvendors-brand.pv-container {
    margin: 1.5rem 1rem !important;
    padding: 0.75rem;
    max-width: none;
  }
  #puppetvendors-brand .pv-brand-name {
    font-size: 20px;
  }
}

/* [DEPRECATED] Custom seller section styles — kept for reference, superseded by PV reskin above
.tbb-seller-header-shell {
  display: grid;
  grid-template-columns: auto 1fr auto;
  gap: 1.25rem;
  align-items: center;
  max-width: 1240px;
  margin: 1.5rem auto;
  padding: 1.25rem 1.5rem;
  background: rgba(15, 15, 30, 0.95);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  border: 1px solid var(--tbb-border-color, #fe8aed);
  border-radius: 8px;
  box-shadow: 0 0 20px var(--tbb-glow-color, rgba(254,138,237,0.25));
  box-sizing: border-box;
}

/* ── Avatar ── */
.tbb-seller-avatar-wrap {
  flex-shrink: 0;
}
.tbb-seller-avatar {
  width: 96px;
  height: 96px;
  border-radius: 8px;
  overflow: hidden;
  border: 2px solid var(--tbb-border-color, #fe8aed);
  background: rgba(30, 30, 60, 0.6);
}
.tbb-seller-avatar img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.tbb-seller-avatar-skeleton {
  width: 100%;
  height: 100%;
  background: linear-gradient(110deg, rgba(60,60,100,0.5) 30%, rgba(80,80,120,0.5) 50%, rgba(60,60,100,0.5) 70%);
  background-size: 200% 100%;
  animation: tbb-skeleton-pulse 1.5s ease-in-out infinite;
}
@keyframes tbb-skeleton-pulse {
  0% { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}

/* ── Info column ── */
.tbb-seller-info {
  min-width: 0; /* prevent text overflow */
}
.tbb-seller-name {
  font-family: 'Permanent Marker', 'Marker Felt', cursive !important;
  color: #ffffff;
  font-size: 22px;
  font-weight: 700;
  line-height: 1.2;
  margin: 0 0 0.35rem 0;
  text-transform: uppercase;
}
.tbb-seller-description {
  color: rgba(255, 255, 255, 0.75);
  font-size: 0.85rem;
  line-height: 1.4;
  margin: 0 0 0.5rem 0;
}
.tbb-seller-meta {
  display: flex;
  align-items: center;
  gap: 1rem;
  font-size: 0.8rem;
  color: rgba(255, 255, 255, 0.6);
}
.tbb-seller-location {
  display: none; /* hidden until JS populates it */
}
.tbb-seller-pin {
  margin-right: 0.2rem;
}

/* ── Stats sidebar ── */
.tbb-seller-sidebar {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 0.75rem;
  flex-shrink: 0;
}
.tbb-seller-stats {
  display: flex;
  gap: 1.25rem;
  padding: 0.5rem 0.75rem;
  border: 1px solid rgba(255, 255, 255, 0.15);
  border-radius: 6px;
  background: rgba(0, 0, 0, 0.2);
}
.tbb-seller-stat {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.15rem;
}
.tbb-seller-stat-value {
  font-family: 'Permanent Marker', 'Marker Felt', cursive !important;
  color: #ffffff;
  font-size: 1.1rem;
  font-weight: 700;
  line-height: 1;
}
.tbb-seller-stat-label {
  color: rgba(255, 255, 255, 0.55);
  font-size: 0.65rem;
  text-transform: uppercase;
  letter-spacing: 0.03em;
}

/* ── Action buttons ── */
.tbb-seller-actions {
  display: flex;
  gap: 0.5rem;
}
.tbb-seller-btn {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  padding: 0.4rem 0.9rem;
  border-radius: 6px;
  font-size: 0.8rem;
  font-weight: 600;
  text-decoration: none;
  cursor: pointer;
  transition: transform 0.15s ease, box-shadow 0.15s ease;
  border: 1px solid rgba(255, 255, 255, 0.2);
  background: rgba(255, 255, 255, 0.08);
  color: #ffffff;
}
.tbb-seller-btn:hover {
  transform: scale(1.03);
  box-shadow: 0 0 12px var(--tbb-glow-color, rgba(254,138,237,0.25));
}

/* ── Hydrated state — show location when JS fills it ── */
.tbb-seller-header-shell.is-hydrated .tbb-seller-location {
  display: inline-flex;
  align-items: center;
}

/* ── Mobile: stack vertically ── */
@media (max-width: 767px) {
  .tbb-seller-header-shell {
    grid-template-columns: 1fr;
    text-align: center;
    padding: 1rem;
    margin: 1rem 1rem;
    gap: 0.75rem;
  }
  .tbb-seller-avatar-wrap {
    display: flex;
    justify-content: center;
  }
  .tbb-seller-avatar {
    width: 72px;
    height: 72px;
  }
  .tbb-seller-name {
    font-size: 18px;
  }
  .tbb-seller-sidebar {
    align-items: center;
  }
  .tbb-seller-meta {
    justify-content: center;
  }
}
/* ── Tablet tweaks ── */
@media (min-width: 768px) and (max-width: 991px) {
  .tbb-seller-header-shell {
    margin: 1.5rem 1rem;
    max-width: none;
  }
  .tbb-seller-name {
    font-size: 20px;
  }
}
[END DEPRECATED] */


/* =========================================================================
   ★ MY TOP 8 — Seller-curated product picks (2×4 grid)
   ========================================================================= */

/* ── Neutralize Diffusion section wrapper ── */
.tbb-top8-section .\#section-body {
  background: transparent !important;
  padding: 0 !important;
  margin: 0 !important;
}
.tbb-top8-section .\#section-body .\#container {
  max-width: none !important;
  padding: 0 !important;
}

/* ── Shell — matches carousel/tile/curator/PV banner ── */
/* Shell — Win95 raised panel matching the Memory Wall PDP widget:
   - Dark navy→purple gradient body + faint pink CRT scan-lines
   - Split-color border: light gray top/left, black bottom/right
     gives the classic raised-from-the-screen Win95 dimension
   - Subtle drop shadow (no colored outer glow — chrome bar carries
     the per-section accent color now)
   - Top padding reserved for the chrome title bar (.tbb-top8-header) */
.tbb-top8-shell {
  display: block;
  position: relative;
  max-width: 1240px;
  margin: 1.5rem auto;
  padding: 48px 3rem 1.5rem;  /* top reserved for chrome title bar (32px bar + 16px gap) */
  background:
    repeating-linear-gradient(0deg, transparent, transparent 2px, rgba(255, 45, 155, 0.04) 2px, rgba(255, 45, 155, 0.04) 4px),
    linear-gradient(180deg, #1a0a2e 0%, #0a0a1a 100%);
  border-top: 3px solid #9ca3af;
  border-left: 3px solid #9ca3af;
  border-right: 3px solid #000000;
  border-bottom: 3px solid #000000;
  border-radius: 8px;
  box-shadow:
    inset 1px 1px 0 rgba(255, 255, 255, 0.08),
    inset -1px -1px 0 rgba(0, 0, 0, 0.4),
    0 2px 6px rgba(0, 0, 0, 0.5);
  box-sizing: border-box;
  overflow: hidden;  /* clip the chrome bar to the shell's rounded corners */
}

/* Header — chrome title bar across the top of the shell, matching the
   Memory Wall PDP widget (commentify-comments::before in product.css).
   Background uses the section's border color (editable per-section), so
   pink/cyan/etc. vendors get matching chrome. Bar is slightly taller
   than MW's 28px to give the larger 14px heading room to breathe. */
.tbb-top8-header {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 32px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--tbb-border-color, #fe8aed);
  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
  margin: 0;
  pointer-events: none;
  z-index: 2;
}

.tbb-top8-heading {
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace !important;
  color: #1a1a2e;
  font-size: 14px;
  font-weight: 700;
  letter-spacing: 0.08em;
  /* Original case (no uppercase transform) — lets MySpace flourishes
     and merchant-typed text render as written. */
  line-height: 1;
  margin: 0;
}

/* ── Shell corner sparkles ── small decorative stars in the top-right
   and bottom-left of the Top 8 shell. Subtle nostalgic flourish; placed
   inside the shell border so they don't interfere with hover. */
.tbb-top8-shell::before,
.tbb-top8-shell::after {
  content: '✦';
  position: absolute;
  font-family: ui-monospace, monospace;
  font-size: 14px;
  color: var(--tbb-border-color, #fe8aed);
  text-shadow: 0 0 8px var(--tbb-border-glow, rgba(254,138,237,0.5));
  opacity: 0.6;
  pointer-events: none;
}
.tbb-top8-shell::before { top: 10px; right: 14px; }
.tbb-top8-shell::after  { bottom: 10px; left: 14px; }

/* ── 4-column grid (4×2 = 8 items) — compact sizing.
   Cards are constrained to ~170px max-width on desktop so the polaroid
   doesn't blow up and the overall Top 8 widget reads as a tight 2-row
   showcase rather than 8 hero cards. The grid itself centers the items
   so the empty edge space looks intentional. ── */
.tbb-top8-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 0.75rem 1rem;
  justify-items: center;
}

/* ── Individual item — rank badge overlay, max-width caps the polaroid scale ── */
.tbb-top8-item {
  position: relative;
  width: 100%;
  max-width: 170px;       /* halves visual height vs unconstrained 270px */
  min-width: 0;           /* prevent grid blowout */
  /* Note: no overflow:hidden here — would clip the rank badge that sits
     at top:0/left:0 with border-radius:50%. */
}

/* Tighten the product-card body inside Top 8 — smaller fonts, tighter
   spacing, less padding so the card body adds minimal vertical bulk. */
.tbb-top8-item .\#product-card-info,
.tbb-top8-item .\#product-card-info-inner {
  padding: 4px 2px !important;
  gap: 1px !important;
}
.tbb-top8-item .\#product-card-vendor,
.tbb-top8-item .\#product-card-vendor a {
  font-size: 10px !important;
  line-height: 1.2 !important;
}
.tbb-top8-item .\#product-card-title {
  font-size: 11px !important;
  line-height: 1.2 !important;
}
.tbb-top8-item .\#price-item,
.tbb-top8-item .\#product-card-price {
  font-size: 13px !important;
  line-height: 1.1 !important;
}
.tbb-top8-item .\#price-item.\@compare {
  font-size: 11px !important;
}
.tbb-top8-item .tbb-decade-badge {
  font-size: 9px !important;
  padding: 2px 6px !important;
}
/* Rank badge — matches the gold curator rankings badge (.tbb-curator-badge)
   for visual consistency across ranking surfaces. Gold gradient circle,
   dark text, white border. Sits on the top-left polaroid corner.

   z-index 20 so it renders ABOVE the polaroid PNG overlay (z:5), the
   polaroid title (z:6), and the product-card-badges layer (z:7) inside
   the product-card snippet. */
.tbb-top8-rank {
  position: absolute;
  top: 0;
  left: 0;
  z-index: 20;
  width: 32px;
  height: 32px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 0.875rem;
  font-weight: 700;
  color: #1a1a2e;
  background: linear-gradient(to bottom right, #fef08a, #fbbf24);
  border: 2px solid #ffffff;
  border-radius: 50%;
  line-height: 1;
  pointer-events: none;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
}

/* Sold-out badge — product-card snippet renders <div class="#product-card-badge
   @type:sold-out">Sold out</div>. By default it takes flow space at the top of
   the card, which throws off polaroid alignment inside the Top 8 grid. Position
   it absolutely as a top-right corner overlay (mirrors the top-left rank badge)
   and style it to match the mono aesthetic. */
.tbb-top8-item .\#product-card-badge.\@type\:sold-out {
  position: absolute !important;
  top: 8px !important;
  right: 8px !important;
  z-index: 3 !important;
  background: rgba(0, 0, 0, 0.78) !important;
  color: #ffffff !important;
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace !important;
  font-size: 10px !important;
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: 0.06em !important;
  padding: 4px 8px !important;
  border: 1px solid rgba(255, 255, 255, 0.2) !important;
  border-radius: 4px !important;
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.4) !important;
  margin: 0 !important;
  pointer-events: none;
}

/* When sold-out, product-card adds the @dim modifier which fades the card.
   Preserve our intent: the polaroid should still render full-size, just with
   a slight desaturation. Don't let any baseline @dim transform/scale rules
   shrink the card inside the Top 8 grid. */
.tbb-top8-item .\#product-card.\@dim .\#product-card-image,
.tbb-top8-item .\#product-card.\@dim .tbb-polaroid-frame {
  opacity: 0.85;
  filter: saturate(0.7);
}

/* ── Loading spinner (matches memory wall pattern) ── */
.tbb-top8-loading {
  text-align: center;
  padding: 60px 20px;
}
.tbb-top8-spinner {
  width: 48px;
  height: 48px;
  border: 3px solid rgba(254,138,237,0.2);
  border-top-color: var(--tbb-border-color, #fe8aed);
  border-radius: 50%;
  animation: tbb-top8-spin 0.8s linear infinite;
  margin: 0 auto 16px;
}
@keyframes tbb-top8-spin { to { transform: rotate(360deg); } }
.tbb-top8-loading-text {
  color: #8888aa;
  font-size: 0.85rem;
}
.tbb-top8-loading-sub {
  color: #8888aa;
  font-size: 0.72rem;
  margin-top: 6px;
  opacity: 0.6;
}

/* ── Empty state ── */
.tbb-top8-empty {
  text-align: center;
  padding: 40px 20px;
  color: #8888aa;
  font-size: 0.85rem;
}

/* ── JS-rendered product card — Polaroid frame (design system) ── */
.tbb-top8-card {
  display: block;
  text-decoration: none;
  color: inherit;
  background: transparent;
  overflow: visible;
}

/* Media container = Polaroid frame shell (4:5 aspect, same as homepage).
   Hover rotates ONLY the media, not the full card — matches homepage. */
.tbb-top8-card-media {
  position: relative;
  width: 100%;
  aspect-ratio: 4 / 5;
  overflow: visible;
  background: transparent;
  transition: transform 0.3s ease;
}
.tbb-top8-card:hover .tbb-top8-card-media {
  transform: rotate(-1deg) scale(1.02);
}

/* Product image — positioned inside the frame's transparent window.
   Coordinates match the branded PNG's alpha channel (same as homepage):
   top 2.67%, left 2.17%, width 95.17%, height 75.47%. */
.tbb-top8-card-img {
  position: absolute;
  top: 2.67%;
  left: 2.17%;
  width: 95.17%;
  height: 75.47%;
  object-fit: cover;
  background: #ffffff;
  z-index: 1;
}

/* Polaroid PNG frame overlay */
.tbb-top8-card-media::after {
  content: '';
  position: absolute;
  inset: 0;
  background-image: url('ThrowbackBuys%20Polaroid%20Frame%20600x750.png');
  background-size: 100% 100%;
  background-repeat: no-repeat;
  pointer-events: none;
  z-index: 5;
}
/* Built-in frame gating — hide overlay + title on products with existing frame */
.tbb-top8-no-frame .tbb-top8-card-media::after {
  display: none;
}
.tbb-top8-no-frame .tbb-top8-card-title {
  display: none;
}

/* Handwritten title on the frame's bottom strip —
   Two-layer approach matches homepage .\#product-card.\@tbb-polaroid:
   Outer .tbb-top8-card-title = abs-positioned flex box (vertical center).
   Inner .tbb-top8-card-title-inner = -webkit-box for line-clamp truncation. */
.tbb-top8-card-title {
  position: absolute;
  left: 3%;
  right: 3%;
  bottom: 1%;
  height: 15%;
  z-index: 6;
  pointer-events: none;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  text-align: center;
  padding: 0 0.5rem;
}
.tbb-top8-card-title-inner {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  overflow: hidden;
  text-overflow: ellipsis;
  text-align: center;
  font-family: 'Permanent Marker', 'Marker Felt', cursive;
  color: #1a1a2e;
  font-size: clamp(13px, 1.1vw, 15px);
  line-height: 1.15;
  word-break: break-word;
  max-width: 100%;
  max-height: calc(1.15em * 2);
}

/* Caption below the frame — matches homepage caption layout */
.tbb-top8-card-body {
  text-align: center;
  padding: 0.4rem 0.5rem 0;
  font-weight: 400;
}

/* "Handpicked by:" label + vendor name */
.tbb-top8-card-vendor-label {
  display: block;
  font-style: italic;
  font-weight: 400;
  font-size: 0.72rem;
  color: #c8c8d8;
  opacity: 0.75;
  letter-spacing: 0.02em;
  margin-bottom: 0.3rem;
  line-height: 1.1;
}
.tbb-top8-card-vendor {
  color: #ffffff;
  font-size: 0.85rem;
  font-weight: 600;
  margin-bottom: 0.25rem;
  line-height: 1.15;
}

/* Top 8 price: uses shared .tbb-product-price / .tbb-product-price-compare /
   .tbb-product-price-current. See shared component block near top of file.
   Top 8 context uses a slightly shorter min-height for its smaller cards. */
.tbb-top8-shell .tbb-product-price {
  min-height: 2.2em;
}

/* Top 8 decade badge + row: uses shared .tbb-decade-badge / .tbb-decade-row.
   No duplicate styles needed — see shared component block above. */

/* ── Mobile: 2 columns × 4 rows, compact ── */
@media (max-width: 767px) {
  .tbb-top8-shell {
    margin: 1rem;
    /* Top padding must reserve space for the 32px chrome title bar.
       Last edit had padding:0.75rem 0.5rem which clobbered the desktop
       48px top padding and let cards float up underneath the bar. */
    padding: 44px 0.5rem 0.75rem;
  }
  .tbb-top8-heading {
    font-size: 18px;
  }
  .tbb-top8-grid {
    grid-template-columns: repeat(2, 1fr);
    gap: 0.5rem 0.5rem;
  }
  /* Let cards fill their 2-col cells naturally (no 170px cap on mobile) */
  .tbb-top8-item {
    max-width: 100%;
  }
  /* Polaroid title (handwritten) baked into the frame strip — keep readable */
  .tbb-top8-card-title-inner {
    font-size: 14px !important;
  }
  /* Card body — tighten further on mobile so 4 rows fit clean above the fold */
  .tbb-top8-item .\#product-card-info,
  .tbb-top8-item .\#product-card-info-inner {
    padding: 4px 2px !important;
    gap: 1px !important;
  }
  .tbb-top8-item .\#product-card-vendor,
  .tbb-top8-item .\#product-card-vendor a {
    font-size: 10px !important;
  }
  .tbb-top8-item .\#product-card-title {
    font-size: 11px !important;
  }
  .tbb-top8-item .\#price-item,
  .tbb-top8-item .\#product-card-price {
    font-size: 12px !important;
  }
  .tbb-top8-item .\#price-item.\@compare {
    font-size: 10px !important;
  }
  .tbb-top8-item .tbb-decade-badge {
    font-size: 9px !important;
    padding: 2px 5px !important;
  }
  /* Rank badge — slightly smaller on mobile (still circle, still gold) */
  .tbb-top8-rank {
    width: 26px;
    height: 26px;
    font-size: 0.75rem;
  }
  .tbb-top8-shell .tbb-product-price {
    min-height: 2em;
  }
}
/* ── Tablet: 3 columns ── */
@media (min-width: 768px) and (max-width: 991px) {
  .tbb-top8-shell {
    margin: 1.5rem 1rem;
    max-width: none;
  }
  .tbb-top8-grid {
    grid-template-columns: repeat(3, 1fr);
  }
  .tbb-top8-heading {
    font-size: 20px;
  }
}


/* =========================================================================
   BOOST AI SEARCH & FILTER — TBB design system reskin
   Targets the Boost app block on collection/seller/search pages.
   Boost renders its own cards (not the Diffusion product-card snippet),
   so Polaroid frames + decade badges are approximated via CSS.
   ========================================================================= */

/* ── Shop page default border = cyan ──
   Shopify adds `.collection-template` on collection pages. Set the border
   custom prop at body level so ALL shells (Boost container, PV banner,
   Top 8, Recently Peeped) on shop pages inherit cyan without per-shell
   overrides. Homepage keeps pink (set in section-level inline styles). */
body.collection-template {
  --tbb-border-color: #8de0f4;
  --tbb-border-glow: rgba(141, 224, 244, 0.25);
}

/* ── Neutralize Diffusion section wrapper around Boost ── */
[id*="1764186675aafc65e8"] .\#section-body {
  background: transparent !important;
  padding: 0 !important;
  margin: 0 !important;
}
[id*="1764186675aafc65e8"] .\#section-body .\#container {
  max-width: none !important;
  padding: 0 !important;
}
/* Spacing above Boost grid (gap from PV banner / Top 8 above) */
[id*="1764186675aafc65e8"] {
  margin-top: 1.5rem;
}

/* ── Boost container — frame provided by outer auto-shell ──
   Removed duplicate frame styling (border/bg/blur/shadow/radius/max-width/
   padding) at session 21 — the outer `[id^="shopify-section-"]` auto-shell
   now provides the full frame, and this legacy rule was painting a second
   nested border inside the shell (confirmed on live DOM: outer section at
   1240x2286 + inner .boost-sd-container at 1200x2246, both 4px purple).
   Keep `margin: 0 auto` only to keep the container centered and neutralize
   Boost's default `margin-top: -2rem`.
   See docs/boost-custom-css-reference.md for full conflict map. ── */
body .boost-sd-container {
  margin: 0 auto !important;
  box-sizing: border-box;
}

/* ── Boost filter+grid shell — unify sidebar + grid background ──
   Boost paints `rgba(0, 0, 0, 0.25)` on the left sidebar
   (`.boost-sd-left.boost-filter-tree-column`) but leaves the right grid
   column (`.boost-sd-right.boost-product-listing-column`) transparent,
   so the sidebar reads visibly darker than the grid inside the shell.
   Mirror the sidebar tint onto the grid column so both sides share one
   continuous darker panel. Match the sidebar's 6px border-radius on the
   grid side too, and stretch the grid column to full height so the
   bottom strip aligns with the sidebar (previously 20px short).
   Scoped to the filter+grid shell only via `.boost-sd__filter-option-title`,
   leaving recommendation carousels untouched. Session 21 fix. ── */
[id^="shopify-section-"]:has(.boost-sd__filter-option-title) .boost-sd-right.boost-product-listing-column {
  background-color: rgba(0, 0, 0, 0.25);
  border-radius: 6px;
  align-self: stretch;
  /* Kill Boost's `margin-bottom: 20px` on the grid column so its bg height
     matches the filter sidebar exactly. */
  margin-bottom: 0 !important;
}

/* Pagination — mono per session 15 mono-first rule.
   Boost renders `.boost-sd__pagination-number` buttons that inherit
   Permanent Marker from an earlier rule; override to mono on the filter+
   grid pagination. */
[id^="shopify-section-"]:has(.boost-sd__filter-option-title) .boost-sd__pagination,
[id^="shopify-section-"]:has(.boost-sd__filter-option-title) .boost-sd__pagination-number,
[id^="shopify-section-"]:has(.boost-sd__filter-option-title) .boost-sd__pagination-number * {
  font-family: var(--font-body-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace) !important;
}

/* ── Slick carousel — remove default browser focus ring on slide wrappers ──
   Slick injects `.slick-slide` divs around each carousel item and makes
   them focusable; on click/keyboard the browser paints a blue focus ring
   around the wrapper. Inner content (`<a>`, buttons) keeps its own focus
   styles, so removing this wrapper-level ring is accessibility-neutral.
   Applied globally because slick is used in multiple places (Boost
   recommendations, Diffusion product gallery, homepage hero). Session 21. */
.slick-slide:focus,
.slick-slide:focus-visible {
  outline: none !important;
}

/* Session 21: mobile Boost sort/filter overrides removed — match production
   default behavior. Previous block caused horizontal scroll + off-screen
   rendering. If desktop reskin cascades break mobile, scope those blocks
   to `@media (min-width: 768px)` instead of adding mobile overrides.

   Single mobile tweak kept: raise popover z-index above polaroid product
   card badges (which sit at z-index:10+ in TBB theme). No layout change. */
@media (max-width: 767px) {
  body .boost-sd__sorting-list,
  body .boost-sd__sorting-dropdown {
    z-index: 1000 !important;
  }
  /* Sort + Filter button icons AND text — default dark is invisible on
     our dark toolbar bg. Force white. */
  body .boost-sd__sorting-button,
  body .boost-sd__sorting-button *,
  body .boost-sd__filter-tree-toggle-button,
  body .boost-sd__filter-tree-toggle-button * {
    color: #ffffff !important;
  }
  body .boost-sd__sorting-button svg,
  body .boost-sd__sorting-button path,
  body .boost-sd__filter-tree-toggle-button svg,
  body .boost-sd__filter-tree-toggle-button path {
    fill: #ffffff !important;
    stroke: #ffffff !important;
  }
}

/* Kill Boost's negative right margin that bleeds the grid out of the container.
   Boost CSS: `.boost-sd__product-list { margin-right: -130px }` */
body .boost-sd__product-list {
  margin-left: 0 !important;
  margin-right: 0 !important;
  overflow: hidden !important;
  display: flex !important;
  flex-wrap: wrap !important;
}

/* Force 5-column max on desktop.
   Boost's JS sets inline `width: 16.66%` (6 cols) on each item.
   Override to 5 columns. Each item has 16px margin-right from Boost,
   so flex-basis must subtract that to prevent the 5th item wrapping.
   When the filter sidebar is visible (~296px), the product column is
   only ~904px — 5 × (20% + 16px margin) overflows by ~80px. */
body .boost-sd__product-list .boost-sd__product-item {
  width: calc(20% - 16px) !important;
  max-width: calc(20% - 16px) !important;
  flex: 0 0 calc(20% - 16px) !important;
  box-sizing: border-box !important;
}

/* ── FILTER SIDEBAR ── */
body .boost-sd-left {
  background: rgba(0, 0, 0, 0.25);
  border-radius: 6px;
  padding: 0.75rem;
}

/* ── Refine-by area: "Filter" heading, "Clear All", active filter tags ── */
body .boost-sd__refine-by-vertical-refine-by-heading {
  color: #ffffff !important;
  font-family: 'Permanent Marker', 'Marker Felt', cursive !important;
  font-size: 14px !important;
  text-transform: uppercase !important;
}
body .boost-sd__refine-by-vertical-refine-by .boost-sd__button--clear,
body .boost-sd__refine-by-vertical-refine-by .boost-sd__button--clear * {
  color: #fe8aed !important;
  font-size: 0.8rem !important;
}
/* Active filter tag chips (e.g. "Decade: 1980s X") */
body .boost-sd__refine-by-vertical-refine-by-item {
  color: #ffffff !important;
  background: rgba(156, 1, 255, 0.2) !important;
  border: 1px solid rgba(156, 1, 255, 0.4) !important;
  border-radius: 4px !important;
  padding: 0.3rem 0.6rem !important;
}
body .boost-sd__refine-by-vertical-refine-by-item *,
body .boost-sd__refine-by-vertical-refine-by-option,
body .boost-sd__refine-by-vertical-refine-by-value {
  color: #ffffff !important;
}
body .boost-sd__refine-by-vertical-refine-by-item svg,
body .boost-sd__refine-by-vertical-refine-by-item path {
  stroke: #ffffff !important;
  fill: #ffffff !important;
}

/* ── Decade filter box items — dark theme ── */
body .boost-sd__filter-option-box-item {
  background: rgba(255, 255, 255, 0.08) !important;
  border: 1px solid rgba(255, 255, 255, 0.2) !important;
  color: #ffffff !important;
}
body .boost-sd__filter-option-box-item * {
  color: #ffffff !important;
}
body .boost-sd__filter-option-box-item:hover {
  background: rgba(255, 255, 255, 0.15) !important;
  border-color: rgba(255, 255, 255, 0.4) !important;
}
/* Selected decade box — purple highlight */
body .boost-sd__filter-option-box-item.boost-sd__filter-option-item--selected {
  background: rgba(156, 1, 255, 0.3) !important;
  border-color: #9c01ff !important;
  color: #ffffff !important;
}
body .boost-sd__filter-option-box-item.boost-sd__filter-option-item--selected * {
  color: #ffffff !important;
}

/* Filter group headings — purple with Permanent Marker */
body .boost-sd__filter-option-label {
  font-family: 'Permanent Marker', 'Marker Felt', cursive !important;
  color: #9c01ff !important;
  font-size: 14px;
  text-transform: uppercase;
  letter-spacing: 0.02em;
  border-bottom: 1px solid rgba(156, 1, 255, 0.25);
  padding-bottom: 0.4rem;
  margin-bottom: 0.4rem;
}

/* Filter option items (checkboxes, swatches, text) */
body .boost-sd__filter-option-item,
body .boost-sd__filter-option-item label,
body .boost-sd__filter-option-item span {
  color: rgba(255, 255, 255, 0.75) !important;
  font-size: 0.8rem;
}
/* Filter sidebar — text and background overrides for dark theme.
   Keep Boost's own layout/structure untouched; only override colors. */
body .boost-sd__filter-option-item,
body .boost-sd__filter-option-item * {
  color: rgba(255, 255, 255, 0.75) !important;
}
/* Filter group heading text — purple to match TBB brand */
body .boost-sd__filter-option-title {
  color: #9c01ff !important;
  font-weight: bold !important;
}
body .boost-sd__filter-option-item:hover,
body .boost-sd__filter-option-item:hover * {
  color: #ffffff !important;
}
body .boost-sd__filter-option-item--selected,
body .boost-sd__filter-option-item--selected * {
  color: #8de0f4 !important;
}
/* Active filter breadcrumb chips — readable on dark background */
body .boost-sd__filter-selected-items {
  background: rgba(156, 1, 255, 0.15) !important;
  border: 1px solid rgba(156, 1, 255, 0.35) !important;
  border-radius: 4px !important;
  padding: 0.4rem 0.6rem !important;
}
body .boost-sd__filter-selected-items,
body .boost-sd__filter-selected-items * {
  color: #ffffff !important;
  font-family: 'Chivo', -apple-system, BlinkMacSystemFont, sans-serif !important;
  font-size: 0.8rem !important;
}
body .boost-sd__filter-clear,
body .boost-sd__filter-clear * {
  color: #fe8aed !important;
}
body .boost-sd__filter-option-item:hover,
body .boost-sd__filter-option-item:hover label,
body .boost-sd__filter-option-item:hover span {
  color: #ffffff !important;
}

/* Filter option boxes/containers */
body .boost-sd__filter-option {
  border-bottom: 1px solid rgba(255, 255, 255, 0.06);
  padding-bottom: 0.5rem;
  margin-bottom: 0.5rem;
}

/* Active/selected filter pills */
body .boost-sd__filter-option-item--selected,
body .boost-sd__filter-option-item--selected label,
body .boost-sd__filter-option-item--selected span {
  color: #fe8aed !important;
}

/* Checkbox styling */
body .boost-sd__filter-option-item input[type="checkbox"] {
  accent-color: #fe8aed;
}

/* "Show more" / "Show less" links */
body .boost-sd__filter-option-show-more,
body .boost-sd__filter-option-show-less {
  color: #fe8aed !important;
  font-size: 0.75rem;
}

/* Price range slider */
body .boost-sd__filter-option-range-slider .noUi-connect,
body .boost-sd__filter-option-range-amount input {
  background: #fe8aed !important;
  color: #ffffff !important;
  border-color: rgba(255, 255, 255, 0.2) !important;
}

/* ── TOOLBAR (sort, view toggle, results count) ── */
body .boost-sd__toolbar-content {
  color: rgba(255, 255, 255, 0.7);
}
body .boost-sd__toolbar-content select,
body .boost-sd__toolbar-content .boost-sd__sort-by select {
  background: rgba(0, 0, 0, 0.3) !important;
  color: #ffffff !important;
  border: 1px solid rgba(255, 255, 255, 0.2) !important;
  border-radius: 4px;
  font-size: 0.8rem;
  padding: 0.3rem 0.5rem;
}
body .boost-sd__toolbar-content label,
body .boost-sd__toolbar-content span {
  color: rgba(255, 255, 255, 0.6) !important;
}

/* Boost TURBO custom sort dropdown — DESKTOP ONLY.
   Mobile intentionally falls back to Boost's native styling to match
   production behavior (session 21 revert). */
@media (min-width: 768px) {
  body .boost-sd__sorting,
  body .boost-sd__sorting *,
  body .boost-sd__sort-widget,
  body .boost-sd__sort-widget *,
  body .boost-sd__sort-by,
  body .boost-sd__sort-by * {
    color: #ffffff !important;
  }
  body .boost-sd__sorting-button,
  body .boost-sd__sort-widget button,
  body .boost-sd__sort-widget select,
  body .boost-sd__sort-by select {
    background: rgba(0, 0, 0, 0.3) !important;
    color: #ffffff !important;
    border: 1px solid rgba(255, 255, 255, 0.2) !important;
    border-radius: 4px !important;
    padding: 0.3rem 0.5rem !important;
    font-size: 0.8rem !important;
  }
  body .boost-sd__sort-widget select option,
  body .boost-sd__sort-by select option {
    background: rgba(15, 15, 30, 0.95) !important;
    color: #ffffff !important;
  }
  body .boost-sd__sorting svg,
  body .boost-sd__sorting path,
  body .boost-sd__sort-widget svg,
  body .boost-sd__sort-widget path {
    fill: #ffffff !important;
    stroke: #ffffff !important;
  }
  body .boost-sd__sorting-dropdown,
  body .boost-sd__sorting-list {
    z-index: 100 !important;
    background: rgba(15, 15, 30, 0.95) !important;
    border: 1px solid rgba(255, 255, 255, 0.2) !important;
    border-radius: 4px !important;
  }
  body .boost-sd__sorting-dropdown li,
  body .boost-sd__sorting-dropdown a,
  body .boost-sd__sorting-list li,
  body .boost-sd__sorting-list a {
    color: #ffffff !important;
  }
  body .boost-sd__sorting-dropdown li:hover,
  body .boost-sd__sorting-list li:hover {
    background: rgba(156, 1, 255, 0.3) !important;
  }
}

/* Search result toolbar — visible text (scoped to direct toolbar elements) */
body .boost-sd__search-result-toolbar {
  border: none !important;
  color: rgba(255, 255, 255, 0.7) !important;
}
body .boost-sd__toolbar-content {
  color: rgba(255, 255, 255, 0.7) !important;
}

/* Filter button (mobile drawer trigger) — scoped tightly */
body .boost-sd__filter-button {
  color: #ffffff !important;
}
body .boost-sd__filter-button > span {
  color: #ffffff !important;
}

/* View mode icons */
body .boost-sd__toolbar-view-mode svg,
body .boost-sd__toolbar-view-mode path {
  fill: rgba(255, 255, 255, 0.5) !important;
}
body .boost-sd__toolbar-view-mode--active svg,
body .boost-sd__toolbar-view-mode--active path {
  fill: #fe8aed !important;
}

/* ── PRODUCT CARDS — Polaroid frame + design system ──
   `body` prefix on every rule to beat Boost's own !important specificity.
   Boost loads its CSS after the theme, so bare class selectors lose. */

body .boost-sd__product-item {
  background: transparent !important;
  border: none !important;
  border-radius: 6px !important;
  box-shadow: none !important;
  overflow: visible !important;
  padding: 0 !important;
}

/* Image wrapper = Polaroid frame shell.
   Force 4:5 aspect to match the branded PNG.
   Hover rotates ONLY the image area, not the full card — matches homepage. */
body .boost-sd__product-image-wrapper {
  position: relative !important;
  aspect-ratio: 4 / 5 !important;
  overflow: visible !important;
  background: transparent !important;
  border: none !important;
  border-radius: 6px !important;
  padding: 0 !important;
  transition: transform 0.3s ease;
}
body .boost-sd__product-item:hover .boost-sd__product-image-wrapper {
  transform: rotate(-1deg) scale(1.02);
}

/* Product image — positioned inside the frame's transparent window.
   Coordinates from the branded PNG alpha channel (same as homepage):
   top 2.67%, left 2.17%, width 95.17%, height 75.47%.
   Scoped to NON-baked-in cards only. Baked-in cards
   (`.tbb-boost-no-frame`, opt-in via `custom.has_builtin_frame` metafield)
   have the frame baked into the image file itself, so the image must fill
   the wrapper naturally — see override below. */
body .boost-sd__product-item:not(.tbb-boost-no-frame) .boost-sd__product-image-wrapper img {
  position: absolute !important;
  top: 2.67% !important;
  left: 2.17% !important;
  width: 95.17% !important;
  height: 75.47% !important;
  object-fit: cover !important;
  background: #ffffff;
  border-radius: 6px !important;
  z-index: 1;
}

/* Baked-in polaroid card — image fills the 4:5 wrapper naturally, no PNG
   window crop. Opt-in via `custom.has_builtin_frame = true` metafield.
   Currently tested on: parasite-eve-ii-playstation-1-japanese-version-sealed-brand-new */
body .boost-sd__product-item.tbb-boost-no-frame .boost-sd__product-image-wrapper img {
  position: absolute !important;
  inset: 0 !important;
  width: 100% !important;
  height: 100% !important;
  /* `cover` fills the wrapper — any baked-in frame edges that get clipped
     are hidden behind the outer PNG frame's opaque borders anyway, so
     clipping is intentional for visual uniformity across all cards. */
  object-fit: cover !important;
  background: transparent;
  z-index: 1;
}

/* Polaroid PNG frame overlay on Boost cards */
body .boost-sd__product-image-wrapper::after {
  content: '';
  position: absolute;
  inset: 0;
  background-image: url('ThrowbackBuys%20Polaroid%20Frame%20600x750.png');
  background-size: 100% 100%;
  background-repeat: no-repeat;
  pointer-events: none;
  z-index: 5;
}

/* ── Built-in frame gating ──
   Products with `custom.has_builtin_frame = true` get `tbb-boost-no-frame`
   class via Boost template (product-item-main.liquid). The PNG overlay
   INTENTIONALLY stays rendered — the outer PNG's opaque borders mask the
   baked-in frame's edges, leaving just the product showing through the
   polaroid window. This prioritizes visual uniformity across all cards
   over strict "one frame per image" logic.
   The `tbb-boost-no-frame` class now only affects image sizing (see above:
   the image fills the wrapper naturally instead of sitting in the PNG's
   2.67%/2.17%/95.17%/75.47% window coords) so the baked polaroid scales up
   far enough that its own chrome is hidden behind the PNG borders. */

/* Kill the old fake-Polaroid bottom strip */
body .boost-sd__product-link-image::after {
  display: none !important;
}

/* Badge rows (Sale tag, ATC button) must sit ABOVE the Polaroid frame
   overlay (::after z-index:5). Without this, the frame blocks clicks. */
body .boost-sd__product-image-row {
  position: relative !important;
  z-index: 10 !important;
}
body .boost-sd__product-image-row--bottom {
  /* Position the ATC button at the bottom of the visible image area,
     not below the full 4:5 frame. */
  position: absolute !important;
  bottom: 25% !important;   /* above the frame's title strip */
  left: 3% !important;
  right: 3% !important;
  z-index: 10 !important;
}

/* Product info area — caption below the frame.
   Matches homepage .\#product-card-caption layout (row-gap: 0.2rem).
   Tight padding so vendor/price/decade sit snug against the frame bottom. */
body .boost-sd__product-item .boost-sd__product-info-wrapper {
  text-align: center !important;
  padding: 0.2rem 0.4rem 0.15rem !important;
  margin: 0 !important;
  background: transparent !important;
  font-weight: 400 !important;
  display: flex !important;
  flex-direction: column !important;
  gap: 0.1rem !important;
}
/* Zero out child margins — the flex gap handles spacing uniformly */
body .boost-sd__product-info-wrapper > * {
  margin-top: 0 !important;
  margin-bottom: 0 !important;
}

/* Product title — repositioned into the Polaroid frame's title strip.
   The title lives in .boost-sd__product-info-wrapper (below the image
   wrapper in DOM order). We pull it up into the frame strip zone using
   absolute positioning against .boost-sd__product-item.

   Coordinate math:
   - Image wrapper = 4:5 aspect = occupies ~100% of width, height = width*1.25
   - Frame title strip: bottom 17% of the image wrapper, starting at ~82.5%
   - In terms of the full card, the image wrapper dominates the height.
   - Using CSS: place the title at the bottom of the image area. */
body .boost-sd__product-item {
  position: relative !important;
  display: flex !important;
  flex-direction: column !important;
  gap: 0 !important;  /* Kill Boost's 16px row-gap between image and info */
}

/* Base title styling — applies in both info-wrapper (if somehow visible)
   and image-wrapper (where the template now places it natively).
   The .tbb-boost-frame-title class positions it on the Polaroid strip. */
body .boost-sd__product-title {
  font-family: 'Permanent Marker', 'Marker Felt', cursive !important;
  color: #1a1a2e !important;
  font-size: clamp(10px, 1.1vw, 14px) !important;
  line-height: 1.15 !important;
  text-align: center !important;
  word-break: break-word !important;
  margin: 0 !important;
  padding: 0 0.3rem !important;
}

/* Title positioned on the Polaroid frame strip inside
   .boost-sd__product-image-wrapper. Now rendered at template level
   (product-image.liquid) — no JS relocation needed. Matches homepage
   .\#product-card.\@tbb-polaroid .tbb-polaroid-title exactly.

   Title uses the same line-clamp/truncation pattern as the homepage's
   .tbb-polaroid-title-inner: 2-line cap, break-word, clamp font. */
body .boost-sd__product-image-wrapper {
  position: relative !important;
}
body .boost-sd__product-image-wrapper > .boost-sd__product-title,
body .boost-sd__product-image-wrapper > .tbb-boost-frame-title {
  position: absolute !important;
  left: 3% !important;
  right: 3% !important;
  bottom: 1.5% !important;
  height: 15% !important;
  min-height: 0 !important;  /* Kill Boost's 63px min-height on .boost-sd__product-title */
  z-index: 6 !important;
  pointer-events: none !important;
  /* Two-layer approach matching homepage: outer = flex (vertical center),
     inner <a> = -webkit-box (line-clamp). For bare text nodes (no <a>),
     flex still centers the text vertically; overflow: hidden caps it. */
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
  overflow: hidden !important;
  text-align: center !important;
  padding: 0 0.5rem !important;
  font-family: 'Permanent Marker', 'Marker Felt', cursive !important;
  color: #1a1a2e !important;
  font-size: clamp(13px, 1.1vw, 15px) !important;
  line-height: 1.15 !important;
  word-break: break-word !important;
}
/* Inner element carries the line-clamp. The template renders
   .tbb-boost-frame-title-inner with an <a> child inside. */
body .boost-sd__product-image-wrapper > .tbb-boost-frame-title .tbb-boost-frame-title-inner,
body .boost-sd__product-image-wrapper > .tbb-boost-frame-title a {
  display: -webkit-box !important;
  -webkit-box-orient: vertical !important;
  -webkit-line-clamp: 2 !important;
  line-clamp: 2 !important;
  overflow: hidden !important;
  text-overflow: ellipsis !important;
  text-align: center !important;
  font-family: 'Permanent Marker', 'Marker Felt', cursive !important;
  color: #1a1a2e !important;
  font-size: clamp(13px, 1.1vw, 15px) !important;
  line-height: 1.15 !important;
  max-width: 100% !important;
  max-height: calc(1.15em * 2) !important;
  word-break: break-word !important;
  text-decoration: none !important;
  pointer-events: auto;
}

body .boost-sd__product-title a,
body .boost-sd__product-link {
  font-family: 'Permanent Marker', 'Marker Felt', cursive !important;
  color: #1a1a2e !important;
  text-decoration: none !important;
  pointer-events: auto;
}

/* Vendor styling — white, centered.
   Margins zeroed; parent flex gap handles spacing. */
body .boost-sd__product-vendor {
  color: #ffffff !important;
  font-size: 0.85rem !important;
  font-weight: 600 !important;
  opacity: 1 !important;
  margin: 0 !important;
  line-height: 1.15 !important;
  text-align: center !important;
}
/* "Handpicked by:" label — added on non-seller pages via ::before.
   On seller storefronts (partner-template) the vendor is the page owner,
   so showing it is redundant. The template body class `.collection-template`
   is present on both; we hide vendor entirely on partner pages via a
   body-level class set by the template, or by targeting the section IDs
   unique to partner-template. */
body .boost-sd__product-vendor::before {
  content: 'Curated by:' !important;
  display: block !important;
  font-family: inherit !important;
  font-style: italic !important;
  font-weight: 400 !important;
  font-size: 0.72rem !important;
  color: #c8c8d8 !important;
  opacity: 0.75 !important;
  letter-spacing: 0.02em !important;
  margin-bottom: 0.1rem !important;
  line-height: 1.1 !important;
}

/* On seller storefronts: hide vendor + "Handpicked by:" label entirely.
   Targets pages that have the PV vendor_banner section (unique to partner-template). */
body:has([id*="puppetvendors"]) .boost-sd__product-vendor {
  display: none !important;
}
body:has([id*="puppetvendors"]) .tbb-top8-card-vendor,
body:has([id*="puppetvendors"]) .tbb-top8-card-vendor-label {
  display: none !important;
}

/* ── Global font inheritance for Boost grid ──
   Boost's external CSS doesn't inherit from :root custom properties.
   Force the TBB body font on all Boost text elements so the grid
   is indistinguishable from the native Shopify/Diffusion grid. */
body .boost-sd__product-price,
body .boost-sd__product-vendor,
body .boost-sd__product-info-wrapper,
body .boost-sd__product-label,
body .boost-sd__product-badge,
body .boost-sd__product-item,
body .boost-sd__filter-option,
body .boost-sd__filter-label,
body .boost-sd__sort-widget,
body .boost-sd__product-list,
body [class*="boost-sd__"],
body [class*="boost-pfs-filter-"] {
  font-family: var(--font-body-family) !important;
}
/* Boost headings (section titles, toolbar labels) keep the heading font */
body .boost-sd__recommendation-title,
body .boost-sd__collection-title {
  font-family: 'Permanent Marker', 'Marker Felt', cursive !important;
}

/* Price — Boost-specific !important overrides to apply the shared
   .tbb-product-price design system values over Boost's external CSS.
   The visual spec lives in the shared component block above. */
body .boost-sd__product-price {
  display: flex !important;
  flex-direction: column !important;
  align-items: center !important;
  justify-content: center !important;
  gap: 0.05rem !important;
  color: #fe8aed !important;
  font-weight: 700 !important;
  font-size: 1.4rem !important;
  line-height: 1.2 !important;
  margin: 0 !important;
  min-height: 0 !important;
}
body .boost-sd__product-price .boost-sd__product-price--compare,
body .boost-sd__product-price del {
  color: #c8c8d8 !important;
  font-weight: 500 !important;
  font-size: 0.85rem !important;
  line-height: 1.1 !important;
  text-decoration: line-through !important;
  opacity: 0.85;
}
body .boost-sd__product-price .boost-sd__product-price--sale,
body .boost-sd__product-price .boost-sd__product-price--default {
  color: #fe8aed !important;
  font-weight: 700 !important;
  font-size: 1.4rem !important;
}

/* Boost decade badge + row: uses shared .tbb-decade-badge / .tbb-decade-row.
   No duplicate styles needed — see shared component block above. */

/* ── Sale / Sold-out labels — floating pill on Polaroid top-right.
   Boost renders .boost-sd__product-label inside .product-image-column
   within the image wrapper. Position absolute relative to the wrapper
   (already position: relative). Positioned top-right to match native
   Diffusion default (settings.product_card_badges_position = 'right'). ── */
body .boost-sd__product-image-wrapper .boost-sd__product-label {
  position: absolute !important;
  /* Same offset math as native .#product-card.@tbb-polaroid badges
     (tbb-reskin.css line ~816). The 2.67%/2.17% values clear the
     polaroid PNG's white top/right strip so the pill lands inside the
     photo area instead of floating in the frame.

     Vertical buffer is 0.5rem here (vs 0.25rem on native polaroid)
     because the % resolves against the smaller image-wrapper (~206px)
     vs native's full card height (~329px). Same % math gives fewer
     absolute pixels here, so we need the bigger buffer to match the
     "settled into the photo" look on Top 8 / native Diffusion polaroid
     cards. Right buffer stays at 0.25rem — horizontal anchor widths
     match between surfaces. */
  top: calc(2.67% + 0.5rem) !important;
  right: calc(2.17% + 0.25rem) !important;
  left: auto !important;
  bottom: auto !important;
  z-index: 10 !important;
  display: inline-block !important;
  font-size: 0.7rem !important;
  padding: 0.2rem 0.55rem !important;
  border-radius: 0.4em !important;
  font-weight: 700 !important;
  line-height: 1.1 !important;
  text-transform: capitalize !important;
  letter-spacing: normal !important;
  width: auto !important;
  max-width: max-content !important;
}
/* Sale label — red fill, white text. Matches homepage Diffusion
   .#product-card-badge.@type:sale (driven by --color-g-product-badge-sale).
   Text is "X% off" (rendered in boost-pfs-filter-product-item.liquid). */
body .boost-sd__product-label--sale,
body .boost-sd__product-label[class*="sale"] {
  background: var(--color-g-product-badge-sale, #e22d00) !important;
  color: #ffffff !important;
}
/* Sold-out label — muted dark */
body .boost-sd__product-label--soldout,
body .boost-sd__product-label[class*="soldout"] {
  background: rgba(60, 60, 80, 0.8) !important;
  color: rgba(255, 255, 255, 0.6) !important;
}
/* Hide the image-row/column containers that Boost uses for badge layout —
   they add unwanted margin/padding. Make them transparent pass-through. */
body .boost-sd__product-image-row {
  position: static !important;
  margin: 0 !important;
  padding: 0 !important;
}
body .boost-sd__product-image-column {
  position: static !important;
  margin: 0 !important;
  padding: 0 !important;
}

/* Boost PFS filter labels (SSR-rendered cards) — smaller pill, top-right */
body .boost-pfs-filter-label {
  font-family: var(--font-body-family) !important;
  font-size: 0.7rem !important;
  padding: 0.2rem 0.55rem !important;
  border-radius: 0.4em !important;
  font-weight: 700 !important;
  line-height: 1.1 !important;
  text-transform: capitalize !important;
  letter-spacing: normal !important;
}
/* Position Boost PFS badge container to top-right */
body .boost-pfs-filter-product-item-label {
  position: absolute !important;
  top: 0.75rem !important;
  right: 0.75rem !important;
  left: auto !important;
  z-index: 10 !important;
}
body .boost-pfs-filter-label.sale {
  background: var(--color-g-product-badge-sale, #e22d00) !important;
  color: #ffffff !important;
}
body .boost-pfs-filter-label.soldout {
  background: rgba(60, 60, 80, 0.8) !important;
  color: rgba(255, 255, 255, 0.6) !important;
}

/* Badges (sale, sold out, etc.) — old class names for backwards compat. */
body .boost-sd__product-badge--sale {
  background: var(--color-g-product-badge-sale, #e22d00) !important;
  color: #ffffff !important;
  font-size: 0.7rem;
  padding: 0.2rem 0.55rem;
  border-radius: 0.4em;
  font-weight: 700;
  line-height: 1.1;
  text-transform: capitalize;
}
body .boost-sd__product-badge--soldout {
  background: rgba(60, 60, 80, 0.8) !important;
  color: rgba(255, 255, 255, 0.6) !important;
  font-size: 0.7rem;
  padding: 0.2rem 0.55rem;
  border-radius: 0.4em;
  font-weight: 700;
  line-height: 1.1;
  text-transform: capitalize;
}

/* Quick view / add-to-cart buttons */
body .boost-sd__product-quick-view-btn,
body .boost-sd__product-atc-btn {
  background: rgba(254, 138, 237, 0.15) !important;
  color: #fe8aed !important;
  border: 1px solid rgba(254, 138, 237, 0.3) !important;
  border-radius: 4px;
  font-size: 0.75rem;
  transition: background 0.15s ease;
}
body .boost-sd__product-quick-view-btn:hover,
body .boost-sd__product-atc-btn:hover {
  background: rgba(254, 138, 237, 0.3) !important;
}

/* ── PAGINATION ──
   Boost renders <button> elements, NOT <a>/<span>.
   Key classes: .boost-sd__pagination-number (page btns),
   .boost-sd__pagination-number--active, .boost-sd__pagination-button (prev/next).
   Boost default: white bg, black text, circular. We override to match TBB dark theme. */
body .boost-sd__pagination {
  margin-top: 1.5rem;
  padding-top: 1rem;
  border-top: 1px solid rgba(255, 255, 255, 0.08);
  display: flex;
  justify-content: center;
  align-items: center;
  gap: 0.35rem;
}
/* Base: all pagination buttons — matches nav button pattern from design system
   (32×32, 2px radius, solid accent bg for active, #4B5563 disabled) */
body .boost-sd__pagination button {
  background: transparent !important;
  color: rgba(255, 255, 255, 0.6) !important;
  border: 1px solid rgba(255, 255, 255, 0.12) !important;
  border-radius: 2px !important;
  font-size: 0.85rem !important;
  font-family: 'Permanent Marker', 'Marker Felt', cursive !important;
  min-width: 32px !important;
  height: 32px !important;
  padding: 0 0.4rem !important;
  cursor: pointer;
  transition: transform 0.15s ease, background 0.15s ease;
}
/* Active page — solid pink bg, white text (mirrors nav button solid-fill pattern) */
body .boost-sd__pagination .boost-sd__pagination-number--active {
  background: #fe8aed !important;
  color: #ffffff !important;
  border-color: #fe8aed !important;
  font-weight: 700;
}
/* Hover — scale like nav buttons */
body .boost-sd__pagination button:hover:not(.boost-sd__pagination-number--active) {
  transform: scale(1.05);
  color: #ffffff !important;
  border-color: rgba(255, 255, 255, 0.25) !important;
}
/* Disabled prev/next — matches nav button disabled state exactly */
body .boost-sd__pagination button[disabled] {
  background-color: #4B5563 !important;
  opacity: 0.5 !important;
  cursor: default;
}
/* Prev/next arrow icons — white, sized to match nav button icon scale */
body .boost-sd__pagination .boost-sd__pagination-button-icon svg {
  stroke: currentColor !important;
  width: 16px;
  height: 16px;
}

/* ── "No results" state ── */
body .boost-sd__no-products {
  color: rgba(255, 255, 255, 0.6) !important;
  text-align: center;
  padding: 2rem;
}

/* ── MOBILE — 2 columns ── */
@media (max-width: 767px) {
  /* Container — wider than before to match global shell padding.
     Previously: margin 1rem all sides + padding 0.75rem = 1.75rem inset.
     Now: 0.75rem side padding only, no side margin — matches Recently Peeped
     effective content width on mobile. */
  body .boost-sd-container {
    margin: 0.75rem 0 !important;
    padding: 0 0.75rem !important;
    max-width: 100% !important;
    box-sizing: border-box !important;
  }
  /* Prevent stale-height clipping — parent .boost-sd-container still
     handles horizontal containment via its own overflow:hidden. */
  body .boost-sd__product-list {
    overflow: visible !important;
    gap: 8px !important;
    justify-content: space-between !important;
  }
  body .boost-sd__product-list .boost-sd__product-item {
    width: calc(50% - 4px) !important;
    max-width: calc(50% - 4px) !important;
    flex: 0 0 calc(50% - 4px) !important;
    margin: 0 0 8px 0 !important;
  }

  /* Session 21: mobile Boost sort rules removed to match production
     native styling. Notably `position: relative !important` was
     overriding Boost's `position: absolute` popover and causing the
     dropdown to render inline pushing the grid. */
  /* Search result toolbar — full width, no border */
  body .boost-sd__search-result-toolbar {
    width: 100% !important;
    max-width: 100% !important;
    padding: 0 !important;
    margin-bottom: 0.5rem !important;
    border: none !important;
  }
  body .boost-sd__search-result-toolbar-container {
    width: 100% !important;
    max-width: 100% !important;
    margin-bottom: 0.5rem !important;
    border-bottom: none !important;
  }
  /* Filter button on mobile — visible text */
  body .boost-sd__filter-button,
  body .boost-sd__filter-button span {
    color: #ffffff !important;
  }

  /* ── Product info — match homepage carousel mobile sizes exactly ── */
  body .boost-sd__product-info-wrapper {
    padding: 0.2rem 0.3rem 0.15rem !important;
  }
  body .boost-sd__product-vendor {
    font-size: 0.9rem !important;
    line-height: 1.15 !important;
  }
  body .boost-sd__product-vendor::before {
    font-size: 0.78rem !important;
    margin-bottom: 0.1rem !important;
  }
  body .boost-sd__product-price {
    font-size: 1.4rem !important;
    min-height: 0 !important;
  }
  body .boost-sd__product-price .boost-sd__product-price--sale,
  body .boost-sd__product-price .boost-sd__product-price--default {
    font-size: 1.4rem !important;
  }
  body .tbb-decade-row {
    min-height: 1.6rem !important;
  }
  body .tbb-decade-badge {
    font-size: 0.7rem !important;
    padding: 0.2rem 0.75rem !important;
  }

  /* Mobile frame title — floor at 14px (matches homepage mobile fix) */
  body .boost-sd__product-image-wrapper > .tbb-boost-frame-title .tbb-boost-frame-title-inner,
  body .boost-sd__product-image-wrapper > .tbb-boost-frame-title a {
    font-size: 14px !important;
  }
}
/* ── TABLET — 3 columns ── */
@media (min-width: 768px) and (max-width: 991px) {
  body .boost-sd-container {
    margin: 1.5rem 1rem;
    max-width: none;
  }
  body .boost-sd__product-list .boost-sd__product-item {
    width: calc(33.333% - 16px) !important;
    max-width: calc(33.333% - 16px) !important;
    flex: 0 0 calc(33.333% - 16px) !important;
  }
}

/* ══════════════════════════════════════════════════════════════════
   BOOST RECOMMENDATION WIDGET ("Recently Peeped")
   Uses Diffusion's #section-body wrapper + Boost's .boost-sd__recommendation.
   Product cards are the same .boost-sd__product-item as the main grid —
   Polaroid frame, title relocation, and price styling all inherit.
   This block adds: TBB shell, heading, and slider layout fixes.
   ══════════════════════════════════════════════════════════════════ */

/* Inner layout for the Boost recommendation's section-body.
   Visual shell (background, border, glow, max-width, margin) is handled
   by the auto-shell alias on the OUTER shopify-section — `.boost-sd__recommendation`
   is already in its :has() list. Styling those visuals here too causes a
   nested "black box" effect (double shell, double border, ~96% combined
   opacity). This rule keeps ONLY the layout properties the inner container
   needs in addition to whatever the outer shell provides. */
[id^="shopify-section-"] .\#section-body:has(.boost-sd__recommendation),
[id^="shopify-section-"]:has(> .shopify-app-block .boost-sd__recommendation):not(:has(.\#section-body)) {
  position: relative !important;  /* anchor for absolute-positioned arrows */
  padding: 1rem !important;
  box-sizing: border-box;
  overflow: hidden !important;  /* clip for Slick peek effect */
}
/* Kill Diffusion's @spaced padding — we control padding on the shell */
[id^="shopify-section-"] .\#section-body.\@spaced:has(.boost-sd__recommendation) {
  padding: 1rem !important;
}

/* Section heading — mirrors .tbb-carousel-shell .\#section-body-header exactly.
   Must override Diffusion's #hero @align:center which forces text-align:center. */
[id^="shopify-section-"] .\#section-body:has(.boost-sd__recommendation) .\#section-body-header {
  text-align: left !important;
  margin-bottom: 1.25rem !important;
  padding: 0 !important;
  padding-right: 110px !important;  /* reserve room for top-right arrow cluster */
}
/* Override the Diffusion #hero @align:center wrapper */
[id^="shopify-section-"] .\#section-body:has(.boost-sd__recommendation) .\#section-body-header-inner,
[id^="shopify-section-"] .\#section-body:has(.boost-sd__recommendation) .\#hero,
[id^="shopify-section-"] .\#section-body:has(.boost-sd__recommendation) .\#hero.\@align\:center {
  text-align: left !important;
  justify-content: flex-start !important;
  align-items: flex-start !important;
}
/* Heading: 24px, negative top margin to kill Permanent Marker ascender gap
   (exact match of .tbb-carousel-shell heading) */
[id^="shopify-section-"] .\#section-body:has(.boost-sd__recommendation) .\#section-body-header .\#hero-heading,
[id^="shopify-section-"] .\#section-body:has(.boost-sd__recommendation) .\#section-body-header h2 {
  font-family: 'Permanent Marker', 'Marker Felt', cursive !important;
  color: #ffffff !important;
  font-size: 24px !important;
  font-weight: 700 !important;
  text-transform: uppercase !important;
  line-height: 1 !important;
  letter-spacing: 0.02em;
  margin: -0.35em 0 0.25rem !important;
  text-align: left !important;
}

/* Hide Boost's own duplicate recommendation title */
body .boost-sd__recommendation-title {
  display: none !important;
}

/* Hide Slick pagination dots — no theme editor toggle for app widgets */
body .boost-sd__recommendation .slick-dots {
  display: none !important;
}

/* ── Boost customize.css counter-overrides ──
   Boost's customize.css ships several !important rules that conflict
   with the TBB Polaroid design system.  We use higher-specificity
   selectors here to win the cascade.
   Source: customization-1764359573876.css */

/* 1. Kill Boost's 15px border-radius on product cards (we use the
      Polaroid frame PNG, not rounded corners). */
body .boost-sd__recommendation .boost-sd__product-item {
  border-radius: 6px !important;
  margin-right: 0 !important;
}

/* 2. Kill Boost's forced title height/min-height (calc(1.4em*3)).
      Our Polaroid title is positioned absolutely inside the frame
      at height:15%; these overrides blow it out. */
body .boost-sd__recommendation .boost-sd__product-image-wrapper > .boost-sd__product-title,
body .boost-sd__recommendation .boost-sd__product-image-wrapper > .tbb-boost-frame-title {
  height: 15% !important;
  min-height: 0 !important;
  -webkit-line-clamp: 2 !important;
  line-clamp: 2 !important;
  line-height: 1.15 !important;
}

/* 3. Neutralize Boost's slider — position:static so arrow wrappers
      anchor to the shell (#section-body) instead of the slider.
      Same trick as homepage carousels (.tbb-carousel-shell .swiper). */
body .boost-sd__recommendation .boost-sd__slider {
  position: static !important;
  padding-left: 0 !important;
  padding-right: 0 !important;
}

/* Slick manages slides via transform:translate3d + left offsets with
   cloned slides for infinite scroll — CSS scroll-snap can't coexist
   with that model (exposes clones as scrollable area). Touch/swipe
   on mobile is handled natively by Slick. Desktop uses arrow buttons. */
body .boost-sd__recommendation .boost-sd__slide {
  padding: 0 0.5rem;
  box-sizing: border-box;
}

/* Neutralize Diffusion's container width inside the shell */
[id^="shopify-section-"] .\#section-body:has(.boost-sd__recommendation) .\#container {
  max-width: none !important;
  padding: 0 !important;
}

/* ── Recommendation image wrapper: clip frame content ── */
body .boost-sd__recommendation .boost-sd__product-image-wrapper {
  overflow: hidden !important;
}

/* ── Nav arrows → TBB design system (32×32, square, accent bg) ──
   Boost wraps each arrow <button> in a .boost-sd__prev-button / .boost-sd__next-button
   div that is position:absolute. We reposition those WRAPPERS to the shell's
   top-right corner (matching homepage carousels), then style the buttons inside. */

/* Reposition the arrow WRAPPERS to top-right of the shell.
   Boost ships these wrappers with `min-width: 40px` baked in (and
   matching min-height) — that's what was forcing wrappers to 40×40
   even with our explicit 32px overrides. Override min-* explicitly
   so the wrapper collapses to the same 32px footprint as the inner
   button, matching native swiper-button-prev/next exactly.
   Higher specificity (.boost-sd__prev-button + --inside modifier)
   beats Boost's own --inside positioning rule. */
/* Force the section-body to be the positioning context for the arrows.
   Reset position: static on Boost's inner slider/recommendation/rc-pl
   wrappers so absolute-positioned arrows skip past them and anchor to
   the section-body where the heading is. This is what was causing the
   mobile mis-alignment — arrows were anchored to Boost's slider
   container which starts BELOW the header row. */
body .boost-sd__recommendation,
body .boost-sd__recommendation .boost-sd__rc-pl,
body .boost-sd__recommendation .boost-sd__slider,
body .boost-sd__recommendation .boost-sd__product-list-carousel {
  position: static !important;
}

body .boost-sd__recommendation .boost-sd__prev-button,
body .boost-sd__recommendation .boost-sd__next-button,
body .boost-sd__recommendation .boost-sd__prev-button.boost-sd__prev-button--inside,
body .boost-sd__recommendation .boost-sd__next-button.boost-sd__next-button--inside {
  position: absolute !important;
  /* top: 0.5625rem (9px) aligns arrow vertical center with the heading
     row center for the standard 50px header. Anchored to .#section-body
     thanks to the position:static reset on Boost's inner wrappers above. */
  top: 0.5625rem !important;
  width: 32px !important;
  height: 32px !important;
  min-width: 32px !important;
  min-height: 32px !important;
  max-width: 32px !important;
  max-height: 32px !important;
  transform: none !important;
  z-index: 5;
}

/* Touch-primary devices need a 44px minimum tap target so the arrows
   are a reliable fallback when a finger drag misbehaves on Slick.
   Desktop with mouse keeps the tighter 32px design.

   Boost's own mobile CSS hides .boost-sd__prev-button/next-button
   below their mobile breakpoint (assumes finger-swipe is enough).
   Force them visible since our Slick touch behavior isn't perfect
   and arrows are a reliable fallback. */
@media (hover: none) {
  body .boost-sd__recommendation .boost-sd__prev-button,
  body .boost-sd__recommendation .boost-sd__next-button,
  body .boost-sd__recommendation .boost-sd__prev-button.boost-sd__prev-button--inside,
  body .boost-sd__recommendation .boost-sd__next-button.boost-sd__next-button--inside {
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    visibility: visible !important;
    opacity: 1 !important;
    width: 44px !important;
    height: 44px !important;
    min-width: 44px !important;
    min-height: 44px !important;
    max-width: 44px !important;
    max-height: 44px !important;
    top: -0.5rem !important;  /* lifted into shell top padding strip */
  }
  /* Bump the inner button to match wrapper */
  body .boost-sd__recommendation .boost-sd__slider-button {
    width: 44px !important;
    height: 44px !important;
    min-width: 44px !important;
    min-height: 44px !important;
  }
  /* Right-tight — next nearly flush with shell edge, prev sized for 44px */
  body .boost-sd__recommendation .boost-sd__next-button,
  body .boost-sd__recommendation .boost-sd__next-button.boost-sd__next-button--inside {
    right: 0.125rem !important;
  }
  body .boost-sd__recommendation .boost-sd__prev-button,
  body .boost-sd__recommendation .boost-sd__prev-button.boost-sd__prev-button--inside {
    right: calc(0.125rem + 44px + 0.375rem) !important;
  }
}
body .boost-sd__recommendation .boost-sd__prev-button {
  right: calc(32px + 0.5rem + 1rem) !important;  /* next btn + gap + shell padding */
  left: auto !important;
}
body .boost-sd__recommendation .boost-sd__next-button {
  right: 1rem !important;
  left: auto !important;
}

/* Style the arrow buttons themselves */
body .boost-sd__recommendation .boost-sd__slider-button {
  position: static !important;  /* let wrapper handle positioning */
  width: 32px !important;
  height: 32px !important;
  min-width: 32px !important;
  min-height: 32px !important;
  border-radius: 2px !important;
  background-color: var(--tbb-border-color, #8de0f4) !important;
  background-size: 20px 20px !important;
  background-position: center !important;
  background-repeat: no-repeat !important;
  border: none !important;
  opacity: 1 !important;
  z-index: 5;
  transition: transform 0.15s ease;
  padding: 0 !important;
  cursor: pointer;
}
/* Kill Boost's ::after padding-bottom trick that forces circular aspect ratio */
body .boost-sd__recommendation .boost-sd__slider-button::after {
  content: none !important;
  padding-bottom: 0 !important;
}
body .boost-sd__recommendation .boost-sd__slider-button:hover {
  transform: scale(1.05);
}
body .boost-sd__recommendation .boost-sd__slider-button[disabled] {
  background-color: #4B5563 !important;
  opacity: 0.5 !important;
}
/* Hide Boost's inline SVG arrows — we use Lucide data-URI chevrons */
body .boost-sd__recommendation .boost-sd__slider-button svg {
  display: none !important;
}
/* Prev arrow (left chevron) */
body .boost-sd__recommendation .boost-sd__prev-button .boost-sd__slider-button {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m15 18-6-6 6-6'/%3E%3C/svg%3E") !important;
}
/* Next arrow (right chevron) */
body .boost-sd__recommendation .boost-sd__next-button .boost-sd__slider-button {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E") !important;
}

/* ── Mobile — match .tbb-carousel-shell mobile (1.5rem 1rem margin, 0.75rem padding) ── */
@media (max-width: 991px) {
  [id^="shopify-section-"] .\#section-body:has(.boost-sd__recommendation) {
    margin: 1.5rem 1rem !important;
    padding: 0.75rem !important;
    max-width: none !important;
  }
  [id^="shopify-section-"] .\#section-body:has(.boost-sd__recommendation) .\#section-body-header {
    padding-right: 80px !important;  /* tighter for mobile arrow cluster */
  }

  /* Force-show + tuck arrows tight into top-right of the shell.
     Negative top lifts them into the shell's top padding strip
     (above section-body content area) so they sit beside the
     heading rather than below its line. */
  body .boost-sd__recommendation .boost-sd__prev-button,
  body .boost-sd__recommendation .boost-sd__next-button,
  body .boost-sd__recommendation .boost-sd__prev-button.boost-sd__prev-button--inside,
  body .boost-sd__recommendation .boost-sd__next-button.boost-sd__next-button--inside {
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    visibility: visible !important;
    opacity: 1 !important;
    top: -0.5rem !important;
  }
  /* Right edge tighter — pin next arrow nearly flush with shell edge */
  body .boost-sd__recommendation .boost-sd__next-button,
  body .boost-sd__recommendation .boost-sd__next-button.boost-sd__next-button--inside {
    right: 0.125rem !important;
  }
  body .boost-sd__recommendation .boost-sd__prev-button,
  body .boost-sd__recommendation .boost-sd__prev-button.boost-sd__prev-button--inside {
    right: calc(0.125rem + 32px + 0.375rem) !important;
  }
  [id^="shopify-section-"] .\#section-body:has(.boost-sd__recommendation) .\#section-body-header .\#hero-heading,
  [id^="shopify-section-"] .\#section-body:has(.boost-sd__recommendation) .\#section-body-header h2 {
    font-size: 20px !important;  /* matches homepage mobile heading */
  }
  /* Arrows: shrink to 28px on mobile (matches homepage) */
  body .boost-sd__recommendation .boost-sd__prev-button,
  body .boost-sd__recommendation .boost-sd__next-button {
    width: 28px !important;
    height: 28px !important;
  }
  body .boost-sd__recommendation .boost-sd__slider-button {
    width: 28px !important;
    height: 28px !important;
    min-width: 28px !important;
    min-height: 28px !important;
  }
  body .boost-sd__recommendation .boost-sd__prev-button {
    right: calc(28px + 0.375rem + 0.75rem) !important;
  }
  body .boost-sd__recommendation .boost-sd__next-button {
    right: 0.75rem !important;
  }
}
/* Peek padding removed — native scroll-snap handles the "more content"
   hint now, and the right-padding was creating empty scrollable space. */

/* ============================================================
   AUCTION+ APP RESKIN (session 15, 2026-04-13)
   ------------------------------------------------------------
   Scope: the Auction+ app block on product.auction-product and
   the <auction-info> web component used on product-card.liquid.
   Real class names (confirmed via DOM 2026-04-13):
     .auction.auction-container       → outer wrapper (multiple)
     .rounded-xl + Tailwind utilities → inner card
     <auction-form>                   → custom element
     .auction-countdown               → countdown grid
     .days/.hours/.minutes/.seconds   → digit spans
     .auction-details                 → starting-bid block
     .auction-bid-form                → bid-form wrapper
     .auction-button.register-link    → primary CTA (uses
                                        Diffusion's .button + gradient)
   Typography: mono-first (2026-04-13 direction). Permanent
   Marker reserved for brand-placement moments elsewhere.
   ============================================================ */

@keyframes tbb-auction-pulse {
  0%, 100% { filter: drop-shadow(0 0 2px #39ff14); opacity: 0.9; }
  50%      { filter: drop-shadow(0 0 10px #39ff14); opacity: 1; }
}

/* ── 1. Outer shell — Win95 raised panel (Figma tokens) ──── */
.auction.auction-container > .rounded-xl {
  position: relative !important;
  background: #1a1a2e !important;
  border-width: 3px !important;
  border-style: solid !important;
  border-top-color: #9ca3af !important;
  border-left-color: #9ca3af !important;
  border-bottom-color: #000 !important;
  border-right-color: #000 !important;
  border-radius: 8px !important;
  box-shadow:
    inset 1px 1px 0 #fff,
    inset -1px -1px 0 #000,
    0 0 20px rgba(254, 138, 237, 0.25) !important;
  padding: 3.5rem 1rem 1rem !important;
  color: #fff !important;
  overflow: visible !important;
}

/* Pink AUCTION STATUS PANEL header bar (spans full width, top) */
.auction.auction-container > .rounded-xl::before {
  content: "\26A0 AUCTION STATUS PANEL \26A0" !important;
  position: absolute;
  top: 0; left: 0; right: 0;
  background: #fe8aed;
  color: #1a1a2e;
  font-family: var(--font-body-family) !important;
  font-weight: 700;
  font-size: 0.85rem;
  letter-spacing: 0.15em;
  text-align: center;
  padding: 0.55rem 0.75rem;
  text-transform: uppercase;
  border-bottom: 2px solid #000;
  border-top-left-radius: 5px;
  border-top-right-radius: 5px;
  box-shadow: inset 1px 1px 0 rgba(255, 255, 255, 0.5);
}
/* Kill old top-right pill — now lives on auction-form instead */
.auction.auction-container > .rounded-xl::after {
  content: none !important;
}

/* ── 2. CONNECTION SECURE pill — REMOVED (session 23).
   Kept auction-form { display: block } so the countdown block still
   stacks correctly. The ::before rule stays here but is neutralized
   with `content: none` + `display: none` so the pseudo doesn't render.
   Revisit later if we want a status indicator back. ── */
auction-form {
  display: block !important;
}
auction-form::before {
  content: none !important;
  display: none !important;
  display: block;
  width: fit-content;
  margin: 0 auto 0.7rem;
  color: #39ff14;
  border: 1.5px solid #39ff14;
  border-radius: 3px;
  font-family: var(--font-body-family);
  font-weight: 700;
  font-size: 0.6rem;
  letter-spacing: 0.1em;
  padding: 0.25rem 0.7rem 0.25rem 1.4rem;
  text-transform: uppercase;
  background-color: #000;
  background-image: radial-gradient(circle at 0.55rem 50%, #39ff14 0%, #39ff14 40%, transparent 55%);
  background-repeat: no-repeat;
  background-size: 0.7rem 0.7rem;
  animation: tbb-auction-dot-pulse 1.6s ease-in-out infinite;
  box-shadow:
    inset 1px 1px 0 rgba(255, 255, 255, 0.2),
    inset -1px -1px 0 rgba(0, 0, 0, 0.6);
}
@keyframes tbb-auction-dot-pulse {
  0%, 100% { background-size: 0.7rem 0.7rem; }
  50%      { background-size: 0.35rem 0.35rem; }
}

/* =====================================================
   PDP product description H1 — dark-theme skin

   Diffusion renders `.#product-description h1` with a hardcoded
   white background + dark text. On single-default-variant products
   the H1 is just the product title; on bulk-uploaded products with
   real variant titles (e.g. vinyl condition "VG", "NM", "EX"),
   Shopify concatenates the variant title onto the product title
   — creating a visible white box ("PRODUCT NAMEIN VG SHAPE!") that
   clashes with the dark TBB shell. This skins it to match.

   The parent `.#product-description` also ships with `opacity: 0.8`
   which was muting our white text to a washed-out gray. Reset to 1
   so content reads at full intensity.
   ===================================================== */
.\#product-description {
  opacity: 1 !important;
}

/* Hide the variant-title concat H1 entirely.
   Diffusion renders <h1> inside .#product-description ONLY when a product
   has a single non-default variant title (e.g. vinyl condition "IN VG
   SHAPE" from bulk uploads). The H1 content is "[product-title] [variant-
   title]" — redundant because .#product-title already renders the real
   title at the top of the PDP. On multi-variant products (Mary-Kate DVDs
   etc.) Diffusion doesn't render this H1 at all, so hiding it is a no-op
   on those products. */
.\#product-description h1 {
  display: none !important;
}

/* Nuke Meta-injected decorator stripes inside the product description.
   Pasted content from Meta Shops / Instagram admin UI ships with
   Facebook's obfuscated class names (x1xmf6yo, x193iq5w, etc.) and
   hardcoded white/light backgrounds that appear as bright stripes on
   our dark shell. Some wrapper divs aren't empty (contain empty child
   divs), so we can't rely on :empty — instead zero the background on
   any x1-class div and force white text. */
.\#product-description div[class^="x1"],
.\#product-description div[class*=" x1"],
.\#product-description span[class^="x1"],
.\#product-description span[class*=" x1"] {
  background: transparent !important;
  color: #ffffff !important;
}

/* =====================================================
   AUCTION-INFO COMPACTION (card-scale)
   Auction Plus ships <auction-info> rendering top-level rows
   with Tailwind `.my-2` (8px vertical margin on top and bottom
   = 16px combined between rows). On product/auction cards that
   adds ~20px of dead vertical space per card vs a non-auction
   sibling.

   Applies uniformly to both native carousels and Boost
   carousels/grids because <auction-info> is the same web
   component in both contexts. Zeroes the my-2 margins and
   uses a small container gap for breathing room instead.

   Internal `.gap-1` (4px between "Winning Bid" label and the
   price) is left alone — it's already tight and reads well.

   Does NOT affect the .auction-proxy dashboard (watchlists /
   won / offers) — that's a different DOM tree.
   ===================================================== */
auction-info > div:first-child,
auction-info .auction-container {
  display: flex !important;
  flex-direction: column !important;
  gap: 4px !important;
}
auction-info .my-2 {
  margin-top: 0 !important;
  margin-bottom: 0 !important;
}

/* ── 3. Timer — terminal data box (Figma: bg #0f0f1e, 2px gray-700) ── */
.auction-countdown {
  display: flex !important;
  flex-direction: row !important;
  flex-wrap: wrap !important;
  justify-content: center !important;
  align-items: baseline !important;
  gap: 0.4rem !important;
  background: #0f0f1e !important;
  border: 2px solid #374151 !important;
  border-radius: 6px !important;
  padding: 0.75rem 1rem !important;
  max-width: none !important;
  margin: 0.5rem auto !important;
  color: #fff !important;
}
body .auction-countdown::before {
  content: "TIME REMAINING:" !important;
  display: inline !important;
  font-family: var(--font-body-family) !important;
  color: #9ca3af !important;
  font-size: 0.8rem !important;
  font-weight: 700 !important;
  letter-spacing: 0.1em !important;
  text-transform: uppercase !important;
  margin-right: 0.4rem !important;
}
.auction-countdown > div {
  display: inline-flex !important;
  flex-direction: row !important;
  align-items: baseline !important;
  margin: 0 !important;
}
.auction-countdown .font-serif,
.auction-countdown .text-gray-500 {
  display: none !important;
}
.auction-countdown .days,
.auction-countdown .hours,
.auction-countdown .minutes,
.auction-countdown .seconds {
  font-family: var(--font-body-family) !important;
  font-size: 1rem !important;
  font-weight: 700 !important;
  color: #fff !important;
}
.auction-countdown .days::after,
.auction-countdown .hours::after,
.auction-countdown .minutes::after,
.auction-countdown .seconds::after {
  color: #8de0f4;
  margin-right: 0.25rem;
  font-weight: 700;
}
.auction-countdown .days::after    { content: "d"; }
.auction-countdown .hours::after   { content: "h"; }
.auction-countdown .minutes::after { content: "m"; }

/* End-date display — sits under the countdown. Rendered by
   tbb-auction-end-date.js (reads remaining time from countdown digits
   and formats an absolute timestamp). Accent font for nostalgic feel. */
.tbb-auction-end-date {
  display: block;
  margin: 0.35rem auto 0.75rem;
  text-align: center;
  font-family: 'Permanent Marker', 'Marker Felt', cursive;
  font-size: 0.95rem;
  letter-spacing: 0.02em;
  color: rgba(255, 255, 255, 0.7);
}
.auction-countdown .seconds::after { content: "s"; margin-right: 0; }

/* ── 4. Bid display — terminal data box + neon-green bid ── */
.auction-details {
  background: #0f0f1e !important;
  border: 2px solid #374151 !important;
  border-radius: 6px !important;
  padding: 0.9rem !important;
  margin: 0.75rem 0 !important;
  box-shadow:
    inset 1px 1px 0 rgba(0, 0, 0, 0.6),
    inset -1px -1px 0 rgba(255, 255, 255, 0.08) !important;
}
.auction-details h5 {
  font-family: var(--font-body-family) !important;
  font-weight: 700 !important;
  font-size: 2.5rem !important;
  color: #39ff14 !important;
  filter: drop-shadow(0 0 5px rgba(57, 255, 20, 0.5)) !important;
  letter-spacing: 0.02em !important;
  margin: 0 !important;
}
.auction-details span,
.auction-details .text-gray-600 {
  font-family: var(--font-body-family) !important;
  color: #9ca3af !important;
  text-transform: uppercase !important;
  letter-spacing: 0.08em !important;
  font-size: 0.7rem !important;
  font-weight: 700 !important;
}
/* [VIEW BID HISTORY (N)] — bracketed link (renders once bids exist) */
.auction-details a {
  font-family: var(--font-body-family) !important;
  color: #fe8aed !important;
  font-size: 0.75rem !important;
  text-transform: uppercase !important;
  letter-spacing: 0.08em !important;
  text-decoration: underline !important;
}
.auction-details a::before { content: "["; }
.auction-details a::after  { content: "]"; }

/* ── 5. Place Bid / Submit CTA — Win95 cyan with gavel ──── */
.auction-bid-form .auction-button,
.auction-bid-form a.auction-button,
.auction-bid-form button.auction-button,
.auction-bid-form button[type="submit"] {
  background: #8de0f4 !important;
  background-image: none !important;
  color: #1a1a2e !important;
  border-width: 3px !important;
  border-style: solid !important;
  border-top-color: #cbf2fb !important;
  border-left-color: #cbf2fb !important;
  border-bottom-color: #479fb5 !important;
  border-right-color: #479fb5 !important;
  border-radius: 6px !important;
  font-family: var(--font-body-family) !important;
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: 0.08em !important;
  box-shadow: 0 0 10px rgba(141, 224, 244, 0.6) !important;
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  gap: 0.5em !important;
  padding: 0.6rem 1rem !important;
  text-shadow: none !important;
  transition: none !important;
}
.auction-bid-form .auction-button:active,
.auction-bid-form a.auction-button:active,
.auction-bid-form button.auction-button:active,
.auction-bid-form button[type="submit"]:active {
  background: #6ecce4 !important;
  border-top-color: #479fb5 !important;
  border-left-color: #479fb5 !important;
  border-bottom-color: #cbf2fb !important;
  border-right-color: #cbf2fb !important;
}
/* Gavel icon — force static position to escape Diffusion's .#button::before
   which is position: absolute for its gradient layer */
.auction-bid-form .auction-button::before,
.auction-bid-form a.auction-button::before,
.auction-bid-form button.auction-button::before,
.auction-bid-form button[type="submit"]::before {
  content: "" !important;
  position: static !important;
  display: inline-block !important;
  width: 1.1em !important;
  height: 1.1em !important;
  top: auto !important;
  left: auto !important;
  right: auto !important;
  bottom: auto !important;
  transform: none !important;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231a1a2e' stroke-width='2.25' stroke-linecap='round' stroke-linejoin='round'><path d='m14.5 12.5-8 8a2.12 2.12 0 1 1-3-3l8-8'/><path d='m16 16 6-6'/><path d='m8 8 6-6'/><path d='m9 7 8 8'/><path d='m21 11-8-8'/></svg>") !important;
  background-size: contain !important;
  background-repeat: no-repeat !important;
  background-position: center !important;
  background-color: transparent !important;
  opacity: 1 !important;
  box-shadow: none !important;
  border: none !important;
  flex-shrink: 0 !important;
}
/* Suppress Diffusion's ::after shine overlay on the button */
.auction-bid-form .auction-button::after,
.auction-bid-form a.auction-button::after,
.auction-bid-form button.auction-button::after {
  display: none !important;
}
/* Copy under CTA */
.auction-bid-form .mx-auto.mt-3 {
  font-family: var(--font-body-family) !important;
  color: #9ca3af !important;
  font-size: 0.75rem !important;
}

/* ── 6. Bid input (logged-in state) — terminal style ────── */
.auction-bid-form input[type="number"],
.auction-bid-form input[type="text"] {
  background: #0f0f1e !important;
  border: 2px solid #374151 !important;
  border-radius: 6px !important;
  color: #39ff14 !important;
  font-family: var(--font-body-family) !important;
  font-weight: 700 !important;
  font-size: 1rem !important;
  padding: 0.6rem 0.8rem !important;
  box-shadow:
    inset 1px 1px 0 rgba(0, 0, 0, 0.6),
    inset -1px -1px 0 rgba(255, 255, 255, 0.08) !important;
  text-shadow: 0 0 4px rgba(57, 255, 20, 0.5) !important;
}
.auction-bid-form input[type="number"]:focus,
.auction-bid-form input[type="text"]:focus {
  border-color: #8de0f4 !important;
  outline: none !important;
  box-shadow:
    inset 1px 1px 0 rgba(0, 0, 0, 0.6),
    0 0 0 2px rgba(141, 224, 244, 0.3) !important;
}

/* ── 7. Quick-bid increment chips — SKIPPED
   Auction+ doesn't ship these natively and we're not styling
   speculatively. Revisit post-launch if/when app exposes them. ── */

/* ── 8. Watchlist heart (first .auction-container) ───────── */
.auction.auction-container.tr-app-container {
  background: transparent !important;
  border: none !important;
  padding: 0 !important;
  box-shadow: none !important;
}
.auction.auction-container.tr-app-container .auction-button {
  color: #fe8aed !important;
}
.auction.auction-container.tr-app-container .auction-button:hover {
  color: #fff !important;
}

/* ── 9. Force mono font on every auction-widget control
       (kills Permanent Marker on any "Add to Wishlist"/similar button) ── */
.auction, .auction *,
auction-form, auction-form * {
  font-family: var(--font-body-family) !important;
}

/* ── 10. Bid modal (scoped to body.auction-modal-open) ────
   Auction+ renders the modal at <body> root:
     .fixed.inset-0.z-10 > .flex > .bg-white.rounded-lg   (panel)
       .bg-white.px-4.pb-4.pt-5                            (inner body)
   Uses Tailwind utility classes. We override bg-white / text-gray-*
   to the Win95 dark aesthetic. ── */

/* Backdrop — darker to match palette */
body.auction-modal-open .fixed.inset-0.bg-gray-500\/75 {
  background-color: rgba(10, 10, 31, 0.80) !important;
  backdrop-filter: blur(4px) !important;
  -webkit-backdrop-filter: blur(4px) !important;
}

/* Modal panel — Win95 raised. Extra specificity (attribute selector)
   so it wins over the descendant bg-white rule below. */
body.auction-modal-open .fixed.inset-0.z-10 > div > div[class~="bg-white"] {
  background-color: #1a1a2e !important;
  border-width: 3px !important;
  border-style: solid !important;
  border-top-color: #9ca3af !important;
  border-left-color: #9ca3af !important;
  border-bottom-color: #000 !important;
  border-right-color: #000 !important;
  border-radius: 8px !important;
  box-shadow:
    inset 1px 1px 0 rgba(255, 255, 255, 0.5),
    inset -1px -1px 0 #000,
    0 0 40px rgba(254, 138, 237, 0.4) !important;
  color: #fff !important;
  overflow: visible !important;
}
/* Inner body (descendant of panel) — strip its bg-white */
body.auction-modal-open .fixed.inset-0.z-10 > div > div[class~="bg-white"] [class~="bg-white"] {
  background-color: transparent !important;
  color: #fff !important;
}

/* Title h3 */
body.auction-modal-open .fixed.inset-0.z-10 h3 {
  font-family: var(--font-body-family) !important;
  font-weight: 700 !important;
  color: #fff !important;
  text-transform: uppercase !important;
  letter-spacing: 0.04em !important;
  font-size: 0.95rem !important;
}

/* Close button — pink accent */
body.auction-modal-open .fixed.inset-0.z-10 button[type="button"][class*="rounded-md"] {
  color: #fe8aed !important;
  opacity: 1 !important;
}
body.auction-modal-open .fixed.inset-0.z-10 button[type="button"][class*="rounded-md"]:hover {
  color: #fff !important;
}

/* STARTING BID / Time Remaining data row */
body.auction-modal-open .fixed.inset-0.z-10 [class~="border-b"] {
  background: #0f0f1e !important;
  border: 2px solid #374151 !important;
  border-bottom-width: 2px !important;
  border-bottom-color: #374151 !important;
  padding: 0.75rem !important;
  margin-bottom: 0.5rem !important;
  box-shadow:
    inset 1px 1px 0 rgba(0, 0, 0, 0.6),
    inset -1px -1px 0 rgba(255, 255, 255, 0.08) !important;
}
/* Gray labels → muted gray (Figma token) */
body.auction-modal-open .fixed.inset-0.z-10 [class~="text-gray-500"],
body.auction-modal-open .fixed.inset-0.z-10 [class~="text-gray-400"] {
  color: #9ca3af !important;
  font-family: var(--font-body-family) !important;
  text-transform: uppercase !important;
  letter-spacing: 0.08em !important;
  font-size: 0.7rem !important;
  font-weight: 700 !important;
}
/* Dark-text headings → neon green bid */
body.auction-modal-open .fixed.inset-0.z-10 h5[class~="text-gray-900"] {
  color: #39ff14 !important;
  font-family: var(--font-body-family) !important;
  font-weight: 700 !important;
  filter: drop-shadow(0 0 5px rgba(57, 255, 20, 0.5)) !important;
}
/* Dark body copy → white */
body.auction-modal-open .fixed.inset-0.z-10 [class~="text-gray-900"]:not(h5),
body.auction-modal-open .fixed.inset-0.z-10 p,
body.auction-modal-open .fixed.inset-0.z-10 strong,
body.auction-modal-open .fixed.inset-0.z-10 label {
  color: #fff !important;
  font-family: var(--font-body-family) !important;
}

/* Suppress duplicate "TIME REMAINING:" — the modal provides its own
   "Time Remaining" label above the countdown */
body.auction-modal-open .fixed.inset-0.z-10 .auction-countdown::before {
  display: none !important;
}
body.auction-modal-open .fixed.inset-0.z-10 .auction-countdown {
  background: transparent !important;
  border: none !important;
  padding: 0 !important;
  margin: 0 !important;
  box-shadow: none !important;
}

/* Bid input — terminal style */
body.auction-modal-open .fixed.inset-0.z-10 input[type="text"],
body.auction-modal-open .fixed.inset-0.z-10 input[type="number"] {
  background: #0f0f1e !important;
  border: 2px solid #374151 !important;
  border-radius: 6px !important;
  color: #39ff14 !important;
  font-family: var(--font-body-family) !important;
  font-weight: 700 !important;
  text-shadow: 0 0 4px rgba(57, 255, 20, 0.5) !important;
  box-shadow:
    inset 1px 1px 0 rgba(0, 0, 0, 0.6),
    inset -1px -1px 0 rgba(255, 255, 255, 0.08) !important;
}
body.auction-modal-open .fixed.inset-0.z-10 input[type="text"]:focus,
body.auction-modal-open .fixed.inset-0.z-10 input[type="number"]:focus {
  border-color: #8de0f4 !important;
  outline: none !important;
  box-shadow:
    inset 1px 1px 0 rgba(0, 0, 0, 0.6),
    0 0 0 2px rgba(141, 224, 244, 0.3) !important;
}

/* Bid history table — Auction Plus uses Tailwind `even:bg-gray-50` on
   alternating rows, which paints near-white (#f9fafb) behind white text
   making even rows unreadable on the dark modal. Override to a subtle
   dark alternating colour and ensure all cell text stays white. */
body.auction-modal-open .fixed.inset-0.z-10 table tr.even\:bg-gray-50:nth-child(even) {
  background-color: rgba(255, 255, 255, 0.06) !important;
}
body.auction-modal-open .fixed.inset-0.z-10 table tr {
  background-color: transparent !important;
}
body.auction-modal-open .fixed.inset-0.z-10 table tr:nth-child(even) {
  background-color: rgba(255, 255, 255, 0.06) !important;
}
body.auction-modal-open .fixed.inset-0.z-10 table th,
body.auction-modal-open .fixed.inset-0.z-10 table td {
  color: #fff !important;
  border-color: rgba(255, 255, 255, 0.1) !important;
  font-family: var(--font-body-family) !important;
}
body.auction-modal-open .fixed.inset-0.z-10 table th {
  color: #9ca3af !important;
  text-transform: uppercase !important;
  letter-spacing: 0.08em !important;
  font-size: 0.7rem !important;
  font-weight: 700 !important;
}

/* Place Bid submit in modal — Win95 cyan + gavel.
   Session 19 refactor: bevel tones derive from `--tbb-btn-accent` via
   `color-mix`, mirroring `.tbb-btn`. Swap the accent in one place to
   reskin all bevel surfaces. */
body.auction-modal-open .fixed.inset-0.z-10 button.auction-button,
body.auction-modal-open .fixed.inset-0.z-10 button[type="submit"].auction-button,
body.auction-modal-open .fixed.inset-0.z-10 .confirm-place-bid {
  --tbb-btn-accent: #8de0f4;
  --tbb-btn-accent-light: color-mix(in srgb, var(--tbb-btn-accent) 55%, #ffffff);
  --tbb-btn-accent-dark:  color-mix(in srgb, var(--tbb-btn-accent) 55%, #000000);
  background: var(--tbb-btn-accent) !important;
  background-image: none !important;
  color: #1a1a2e !important;
  border-width: 3px !important;
  border-style: solid !important;
  border-top-color:    var(--tbb-btn-accent-light) !important;
  border-left-color:   var(--tbb-btn-accent-light) !important;
  border-bottom-color: var(--tbb-btn-accent-dark)  !important;
  border-right-color:  var(--tbb-btn-accent-dark)  !important;
  border-radius: 6px !important;
  font-family: var(--font-body-family) !important;
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: 0.08em !important;
  box-shadow: 0 0 10px color-mix(in srgb, var(--tbb-btn-accent) 60%, transparent) !important;
  padding: 0.7rem 1rem !important;
  text-shadow: none !important;
  transition: none !important;
}
body.auction-modal-open .fixed.inset-0.z-10 button.auction-button:active,
body.auction-modal-open .fixed.inset-0.z-10 .confirm-place-bid:active {
  background: color-mix(in srgb, var(--tbb-btn-accent) 80%, #000000) !important;
  border-top-color:    var(--tbb-btn-accent-dark)  !important;
  border-left-color:   var(--tbb-btn-accent-dark)  !important;
  border-bottom-color: var(--tbb-btn-accent-light) !important;
  border-right-color:  var(--tbb-btn-accent-light) !important;
}
body.auction-modal-open .fixed.inset-0.z-10 button.auction-button::before,
body.auction-modal-open .fixed.inset-0.z-10 .confirm-place-bid::before {
  content: "" !important;
  position: static !important;
  display: inline-block !important;
  width: 1.1em !important;
  height: 1.1em !important;
  margin-right: 0.3em !important;
  top: auto !important; left: auto !important; right: auto !important; bottom: auto !important;
  transform: none !important;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231a1a2e' stroke-width='2.25' stroke-linecap='round' stroke-linejoin='round'><path d='m14.5 12.5-8 8a2.12 2.12 0 1 1-3-3l8-8'/><path d='m16 16 6-6'/><path d='m8 8 6-6'/><path d='m9 7 8 8'/><path d='m21 11-8-8'/></svg>") !important;
  background-size: contain !important;
  background-repeat: no-repeat !important;
  background-position: center !important;
  background-color: transparent !important;
  opacity: 1 !important;
  box-shadow: none !important;
  border: none !important;
  vertical-align: middle !important;
}
body.auction-modal-open .fixed.inset-0.z-10 button.auction-button::after,
body.auction-modal-open .fixed.inset-0.z-10 .confirm-place-bid::after {
  display: none !important;
}

/* Footer links — Terms & Conditions, Auction */
body.auction-modal-open .fixed.inset-0.z-10 a {
  color: #fe8aed !important;
  font-family: var(--font-body-family) !important;
  text-transform: uppercase !important;
  letter-spacing: 0.04em !important;
  font-size: 0.75rem !important;
  text-decoration: underline !important;
}

/* Mobile modal tightening */
@media (max-width: 640px) {
  body.auction-modal-open .fixed.inset-0.z-10 > div > div {
    border-width: 2px !important;
  }
  body.auction-modal-open .fixed.inset-0.z-10 h3 {
    font-size: 0.85rem !important;
  }
}

/* ── 11. <auction-info> on product-card grids (shrunk) ──── */
auction-info {
  font-family: var(--font-body-family) !important;
  display: block !important;
  margin-top: 0.25rem !important;
}
auction-info .auction-countdown {
  padding: 0.3rem 0.5rem !important;
  gap: 0.25rem !important;
}
auction-info .auction-countdown::before {
  font-size: 0.6rem !important;
}
auction-info .auction-countdown .days,
auction-info .auction-countdown .hours,
auction-info .auction-countdown .minutes,
auction-info .auction-countdown .seconds {
  font-size: 0.75rem !important;
}
auction-info .auction-details h5 {
  font-size: 1.1rem !important;
}
auction-info .auction.auction-container > .rounded-xl {
  padding: 0.5rem !important;
  border-width: 1px !important;
}
auction-info .auction.auction-container > .rounded-xl::before,
auction-info auction-form::before {
  display: none !important;
}

/* ── Mobile tightening ───────────────────────────────────── */
@media (max-width: 749px) {
  .auction.auction-container > .rounded-xl {
    padding: 3rem 0.75rem 0.75rem !important;
  }
  .auction.auction-container > .rounded-xl::before {
    font-size: 0.7rem !important;
    letter-spacing: 0.1em !important;
    padding: 0.4rem 0.5rem !important;
  }
  auction-form::before {
    font-size: 0.7rem !important;
    padding: 0.35rem 0.7rem !important;
  }
  .auction-countdown {
    padding: 0.6rem 0.75rem !important;
  }
  body .auction-countdown::before {
    font-size: 0.7rem !important;
    width: 100% !important;
    text-align: center !important;
    margin-right: 0 !important;
    margin-bottom: 0.25rem !important;
  }
  .auction-countdown .days,
  .auction-countdown .hours,
  .auction-countdown .minutes,
  .auction-countdown .seconds {
    font-size: 0.95rem !important;
  }
  .auction-details h5 {
    font-size: 2rem !important;
  }
}

/* ============================================================
   SESSION 16 — PDP PRIMARY + SECONDARY BUTTONS
   Canonical TBB design-system button pattern (matches auction
   Place Bid and Memory Wall Submit):
     • Primary    = cyan #8de0f4 filled, Win95 bevel
     • Secondary  = cyan outline on dark, same bevel feel

   Scoped to the product template only for now:
     • Add to Cart  — form.shopify-product-form > button[type=submit]
     • Add to Wishlist — product-follow-button .auction-button
                          (Auction+ app "follow" custom element)
   ============================================================ */

/* ── PRIMARY CTA — Add to Cart (overrides Diffusion's gradient .\#button) ──
   Session 19 refactor: sources bevel tones from `--tbb-btn-accent` +
   `color-mix`, same formula as `.tbb-btn`. Size/layout overrides
   (padding, width, min-height) remain scoped below. */
form.shopify-product-form button[type="submit"],
form.shopify-product-form button[type="submit"].\#button,
form.shopify-product-form button[type="submit"].\@display-style\:gradient {
  /* IMPORTANT on the custom property: the auto-shell alias (near top of
     this file) has a rule targeting `.\#button` inside section shells
     that sets `--tbb-btn-accent: var(--tbb-border-color)`. Since the PDP
     section in sections/s_product.liquid defaults --tbb-border-color to
     #446fe9 (blue) when no merchant color is picked, that rule would
     otherwise win the cascade and paint this button blue. !important on
     a custom property is legal and forces our accent to stick. */
  --tbb-btn-accent: #fe8aed !important;
  --tbb-btn-accent-light: color-mix(in srgb, var(--tbb-btn-accent) 55%, #ffffff);
  --tbb-btn-accent-dark:  color-mix(in srgb, var(--tbb-btn-accent) 55%, #000000);
  /* Kill Diffusion's gradient/shadow chrome */
  background: var(--tbb-btn-accent) !important;
  background-image: none !important;
  /* Override Diffusion's `--text-color: white` from core.css — inner spans
     inherit this var and their own `color: var(--text-color)` rule would
     otherwise beat the button's color below. */
  --text-color: #0a1220 !important;
  /* Session 20 regression fix: the auto-expanded shell alias now matches
     the PDP section (because it contains form.shopify-product-form), so
     the shell's `.#button { color: var(--tbb-btn-text) !important }` rule
     inherits in and paints the ATC white. Override the var locally. */
  --tbb-btn-text: #0a1220 !important;
  color: #0a1220 !important;
  /* Win95 bevel borders */
  border-top:    2px solid var(--tbb-btn-accent-light) !important;
  border-left:   2px solid var(--tbb-btn-accent-light) !important;
  border-right:  2px solid var(--tbb-btn-accent-dark)  !important;
  border-bottom: 2px solid var(--tbb-btn-accent-dark)  !important;
  border-radius: 6px !important;
  /* Typography — drop Permanent Marker, go mono uppercase */
  font-family: var(--font-body-family), ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace !important;
  font-weight: 700 !important;
  font-size: 14px !important;
  text-transform: uppercase !important;
  letter-spacing: 0.1em !important;
  line-height: 1 !important;
  /* Sizing — preserve block + good touch target */
  padding: 14px 24px !important;
  width: 100% !important;
  min-height: 48px !important;
  /* Shadow — drop Diffusion's colored glow, add inset Win95 highlight */
  box-shadow:
    inset 1px 1px 0 rgba(255,255,255,0.5),
    inset -1px -1px 0 rgba(0,0,0,0.15) !important;
  transition: filter 0.08s, box-shadow 0.08s !important;
  cursor: pointer !important;
  text-shadow: none !important;
}
/* Kill the gradient overlay ::before/::after that Diffusion paints on .\#button */
form.shopify-product-form button[type="submit"]::before,
form.shopify-product-form button[type="submit"]::after {
  display: none !important;
  background: none !important;
  background-image: none !important;
  content: none !important;
}
form.shopify-product-form button[type="submit"]:hover {
  background: color-mix(in srgb, var(--tbb-btn-accent) 85%, #ffffff) !important;
  filter: brightness(1.04) !important;
  box-shadow:
    inset 1px 1px 0 rgba(255,255,255,0.6),
    inset -1px -1px 0 rgba(0,0,0,0.15),
    0 0 12px color-mix(in srgb, var(--tbb-btn-accent) 35%, transparent) !important;
}
form.shopify-product-form button[type="submit"]:active {
  /* Invert bevel for "pressed" look */
  border-top:    2px solid var(--tbb-btn-accent-dark)  !important;
  border-left:   2px solid var(--tbb-btn-accent-dark)  !important;
  border-right:  2px solid var(--tbb-btn-accent-light) !important;
  border-bottom: 2px solid var(--tbb-btn-accent-light) !important;
  box-shadow:
    inset 1px 1px 0 rgba(0,0,0,0.2),
    inset -1px -1px 0 rgba(255,255,255,0.4) !important;
}
/* Disabled / sold-out state */
form.shopify-product-form button[type="submit"]:disabled,
form.shopify-product-form button[type="submit"][aria-disabled="true"] {
  background: #374151 !important;
  color: #9ca3af !important;
  border-color: #4b5563 !important;
  box-shadow: inset 1px 1px 0 rgba(255,255,255,0.05) !important;
  cursor: not-allowed !important;
  filter: none !important;
}

/* ── SECONDARY CTA — Add to Wishlist (Auction+ follow button) ── */
/* Scope: product-follow-button custom element (unique to the follow app block).
   Specificity-bumped with .auction.auction-container to beat
   the existing color rule `.auction.auction-container.tr-app-container .auction-button` (0,3,1). */
.auction.auction-container product-follow-button .auction-button,
.auction.auction-container product-follow-button button.auction-button,
.auction.auction-container .tr-follow-button button.auction-button,
product-follow-button button.auction-button.auction-button,
.tr-follow-button button.auction-button.auction-button {
  /* Session 19 refactor: mirror `.tbb-btn--secondary` tones via
     `--tbb-btn-accent` + color-mix. */
  --tbb-btn-accent: #8de0f4;
  --tbb-btn-accent-light: color-mix(in srgb, var(--tbb-btn-accent) 70%, #ffffff);
  --tbb-btn-accent-dark:  color-mix(in srgb, var(--tbb-btn-accent) 55%, #000000);
  /* Outline treatment on dark */
  background: transparent !important;
  color: var(--tbb-btn-accent) !important;
  /* Subtle bevel — single-width cyan ring, slightly lighter top/left */
  border-top:    2px solid var(--tbb-btn-accent-light) !important;
  border-left:   2px solid var(--tbb-btn-accent-light) !important;
  border-right:  2px solid var(--tbb-btn-accent-dark)  !important;
  border-bottom: 2px solid var(--tbb-btn-accent-dark)  !important;
  border-radius: 6px !important;
  /* Typography */
  font-family: var(--font-body-family), ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace !important;
  font-weight: 700 !important;
  font-size: 12px !important;
  text-transform: uppercase !important;
  letter-spacing: 0.08em !important;
  line-height: 1 !important;
  /* Sizing — secondary slightly tighter than primary */
  padding: 10px 18px !important;
  min-height: 40px !important;
  width: 100% !important;
  /* Drop underline carried from .link utility */
  text-decoration: none !important;
  /* Subtle inner highlight */
  box-shadow:
    inset 1px 1px 0 rgba(141,224,244,0.15),
    inset -1px -1px 0 rgba(0,0,0,0.2) !important;
  transition: background-color 0.12s, color 0.12s, box-shadow 0.12s !important;
  cursor: pointer !important;
  text-shadow: none !important;
  /* Icon (heart) alignment — flex already set via utility classes */
  gap: 8px !important;
}
/* Kill any inherited gradient overlays */
.auction.auction-container product-follow-button .auction-button::before,
.auction.auction-container product-follow-button .auction-button::after,
product-follow-button .auction-button::before,
product-follow-button .auction-button::after {
  display: none !important;
  background: none !important;
  content: none !important;
}
.auction.auction-container product-follow-button .auction-button:hover,
.auction.auction-container .tr-follow-button button.auction-button:hover,
product-follow-button button.auction-button.auction-button:hover,
.tr-follow-button button.auction-button.auction-button:hover {
  background: color-mix(in srgb, var(--tbb-btn-accent) 12%, transparent) !important;
  color: color-mix(in srgb, var(--tbb-btn-accent) 75%, #ffffff) !important;
  box-shadow:
    inset 1px 1px 0 color-mix(in srgb, var(--tbb-btn-accent) 25%, transparent),
    inset -1px -1px 0 rgba(0,0,0,0.2),
    0 0 10px color-mix(in srgb, var(--tbb-btn-accent) 25%, transparent) !important;
}
.auction.auction-container product-follow-button .auction-button:active,
.auction.auction-container .tr-follow-button button.auction-button:active,
product-follow-button button.auction-button.auction-button:active,
.tr-follow-button button.auction-button.auction-button:active {
  border-top:    2px solid var(--tbb-btn-accent-dark)  !important;
  border-left:   2px solid var(--tbb-btn-accent-dark)  !important;
  border-right:  2px solid var(--tbb-btn-accent-light) !important;
  border-bottom: 2px solid var(--tbb-btn-accent-light) !important;
  box-shadow:
    inset 1px 1px 0 rgba(0,0,0,0.2),
    inset -1px -1px 0 color-mix(in srgb, var(--tbb-btn-accent) 20%, transparent) !important;
}
/* Followed/active state — green accent mirroring the Dap "activated" cue */
.auction.auction-container product-follow-button .auction-button.followed,
.auction.auction-container product-follow-button .auction-button[aria-pressed="true"],
.auction.auction-container product-follow-button .auction-button.active,
product-follow-button .auction-button.followed,
product-follow-button .auction-button[aria-pressed="true"],
product-follow-button .auction-button.active {
  background: rgba(57,255,20,0.1) !important;
  color: #39ff14 !important;
  border-top-color: #8bff6b !important;
  border-left-color: #8bff6b !important;
  border-right-color: #1fa000 !important;
  border-bottom-color: #1fa000 !important;
}
/* Heart / icon color inherits from button color */
.auction.auction-container product-follow-button .auction-button svg,
.auction.auction-container product-follow-button .auction-button i,
product-follow-button .auction-button svg,
product-follow-button .auction-button i {
  color: inherit !important;
  fill: currentColor !important;
}

/* Mobile tightening for both PDP CTAs */
@media (max-width: 480px) {
  form.shopify-product-form button[type="submit"] {
    font-size: 13px !important;
    padding: 12px 18px !important;
    letter-spacing: 0.08em !important;
    min-height: 44px !important;
  }
  .auction.auction-container product-follow-button .auction-button,
  .auction.auction-container .tr-follow-button button.auction-button,
  product-follow-button button.auction-button.auction-button,
  .tr-follow-button button.auction-button.auction-button {
    font-size: 11px !important;
    padding: 9px 14px !important;
    letter-spacing: 0.06em !important;
    min-height: 36px !important;
  }
}

/* ------------------------------------------------------------------
   Session 17 — 2026-04-13
   Variant option pill readability
   ------------------------------------------------------------------
   The radio-option pill keeps Diffusion's white bg (var(--color-g-fg))
   but PDP text inherits the light theme color → white-on-white.
   One-rule fix: force dark text inside the pill. `color` inherits
   down to -title and -price, so no further selectors needed.
------------------------------------------------------------------ */
.\#product-options-radio-item-body {
  color: #1a1a2e;
}

/* ==================================================================
   Session 19 — 2026-04-13
   Collection header reskin (`.tbb-collection-header`)
   ------------------------------------------------------------------
   Reskinned collection header matching the TBB design system.
   Extends `.tbb-carousel-shell` (inherits 1240px max-width, margined
   auto, dark glass panel, glowing border, 5-color palette via
   `--tbb-border-color` / `--tbb-border-glow`).

   Header-specific additions:
   - Optional background image rendered INSIDE the shell (cover or
     tiled) via a `::before` layer + `--tbb-header-bg` / overlay vars
   - Mono heading typography per the updated design system
   - Center-aligned content (vs. the left-aligned shell section headers)
   - Override the template's outer `.#container` so the shell margins
     sit flush with other shells on the page
================================================================== */

/* Neutralize Diffusion's outer `.#container` + `.#section-body` wrappers
   that the collection template renders AROUND the section, so the
   shell can span the full page width and apply its own 1240px cap.
   `:has()` scopes this override to ONLY the section containing our
   collection header — other sections on the page are untouched. */
[id^="shopify-section"]:has(.tbb-collection-header) .\#section-body,
[id^="shopify-section"]:has(.tbb-collection-header) .\#section-body .\#container {
  max-width: none !important;
  padding-left: 0 !important;
  padding-right: 0 !important;
  background: transparent !important;
}

/* Header shell — inherits all `.tbb-carousel-shell` base styles.
   Overrides below are purely header-scoped (padding, centering, bg
   image layering). */
.tbb-collection-header {
  /* A bit more vertical breathing room than carousels — this is the
     top-of-page hero moment. */
  padding: 2rem 1.5rem !important;
  overflow: hidden; /* clip tiled bg to the rounded shell corners */
  text-align: center;
}

@media (max-width: 767px) {
  .tbb-collection-header {
    padding: 1.5rem 1rem !important;
  }
}

/* Background image layer — absolute-positioned behind the content so
   the overlay var can darken it independently for title legibility.
   Uses `::before` so the image is a true background layer (not an
   <img>) and inherits the shell's rounded-corner clip via `overflow`. */
.tbb-collection-header--has-bg::before {
  content: '';
  position: absolute;
  inset: 0;
  background-image: var(--tbb-header-bg);
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  z-index: 0;
  pointer-events: none;
}

/* Tile modifier — swap cover for repeat. Merchants use this with small
   seamless patterns (e.g., polaroid stars, VHS static). */
.tbb-collection-header--tiled.tbb-collection-header--has-bg::before {
  background-size: auto;
  background-repeat: repeat;
  background-position: top left;
}

/* Dark overlay for legibility — rendered between bg and content.
   Opacity comes from `--tbb-header-overlay` (0–0.8) set inline. */
.tbb-collection-header--has-bg::after {
  content: '';
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, var(--tbb-header-overlay, 0));
  z-index: 0;
  pointer-events: none;
}

/* Inner content sits above the bg + overlay layers. */
.tbb-collection-header__inner {
  position: relative;
  z-index: 1;
  max-width: 900px;
  margin: 0 auto;
}

/* Title — mono-first per the updated design system (session 15).
   Uppercase, bold, tight letter-spacing, white. Scales down on mobile. */
.tbb-collection-header__title {
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               'Liberation Mono', 'Courier New', monospace;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.02em;
  color: #ffffff;
  font-size: clamp(1.75rem, 4vw, 2.75rem);
  line-height: 1.1;
  margin: 0;
}

/* Description — RTE content. Muted white, comfortable reading width. */
.tbb-collection-header__description {
  color: rgba(255, 255, 255, 0.75);
  font-size: 1rem;
  line-height: 1.5;
  margin: 1rem auto 0;
  max-width: 680px;
}

.tbb-collection-header__description p:last-child {
  margin-bottom: 0;
}

/* Subheader tagline — smaller, muted, mono. */
.tbb-collection-header__subheader {
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               'Liberation Mono', 'Courier New', monospace;
  color: rgba(255, 255, 255, 0.7);
  font-size: 0.9rem;
  letter-spacing: 0.02em;
  margin: 0.75rem 0 0;
}

/* ==================================================================
   Session 19 — 2026-04-13
   Shared TBB bevel button (`.tbb-btn`)
   ------------------------------------------------------------------
   Canonical button pattern for the TBB design system. Replaces the
   scoped PDP/Auction-only bevel introduced in session 16, and should
   be used on every merchant-editable CTA across the CMS.

   Key idea: bevel light/dark tones are derived from a single accent
   color via `color-mix()`, so any brand color plugs in without
   hand-picking tints. Accent comes from `--tbb-btn-accent` — set
   it inline via `style="--tbb-btn-accent: {{ color }}"` when rendering.

   Variants:
     .tbb-btn             → primary (filled, dark text on accent)
     .tbb-btn--secondary  → outline (accent-colored text on transparent)
     .tbb-btn--block      → width: 100% (for full-width PDP CTAs)
     .tbb-btn--sm         → tighter padding for secondary/tertiary use

   States:
     :hover  → subtle brightness + accent glow
     :active → inverted bevel (pressed)
     [disabled], [aria-disabled="true"] → gray, not-allowed

   NOTE: To avoid breaking live PDP/Auction buttons during rollout,
   the existing session-16 selectors stay in place. We'll refactor
   them to consume `.tbb-btn` in a follow-up pass.
================================================================== */

.tbb-btn,
a.tbb-btn,
button.tbb-btn {
  /* Single-source accent — override inline per instance */
  --tbb-btn-accent: #8de0f4;

  /* Derived bevel tones (auto from accent) */
  --tbb-btn-accent-light: color-mix(in srgb, var(--tbb-btn-accent) 55%, #ffffff);
  --tbb-btn-accent-dark:  color-mix(in srgb, var(--tbb-btn-accent) 55%, #000000);
  --tbb-btn-text: #0a1220;

  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;

  /* Filled surface */
  background: var(--tbb-btn-accent) !important;
  background-image: none !important;
  color: var(--tbb-btn-text) !important;

  /* Win95 bevel — light top/left, dark bottom/right */
  border-top:    2px solid var(--tbb-btn-accent-light) !important;
  border-left:   2px solid var(--tbb-btn-accent-light) !important;
  border-right:  2px solid var(--tbb-btn-accent-dark)  !important;
  border-bottom: 2px solid var(--tbb-btn-accent-dark)  !important;
  border-radius: 6px !important;

  /* Mono uppercase typography */
  font-family: var(--font-body-family), ui-monospace, SFMono-Regular, Menlo,
               Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace !important;
  font-weight: 700 !important;
  font-size: 14px !important;
  text-transform: uppercase !important;
  letter-spacing: 0.1em !important;
  line-height: 1 !important;
  text-decoration: none !important;
  text-shadow: none !important;

  /* Sizing — comfortable touch target */
  padding: 12px 22px !important;
  min-height: 44px !important;

  /* Inner highlight + shadow for depth */
  box-shadow:
    inset 1px 1px 0 rgba(255, 255, 255, 0.5),
    inset -1px -1px 0 rgba(0, 0, 0, 0.15) !important;

  transition: filter 0.08s, box-shadow 0.12s, transform 0.08s !important;
  cursor: pointer;
  box-sizing: border-box;
}

/* Kill any gradient ::before/::after a parent theme/button class might paint */
.tbb-btn::before,
.tbb-btn::after,
a.tbb-btn::before,
a.tbb-btn::after,
button.tbb-btn::before,
button.tbb-btn::after {
  display: none !important;
  content: none !important;
  background: none !important;
  background-image: none !important;
}

.tbb-btn:hover,
a.tbb-btn:hover,
button.tbb-btn:hover {
  filter: brightness(1.05) !important;
  box-shadow:
    inset 1px 1px 0 rgba(255, 255, 255, 0.6),
    inset -1px -1px 0 rgba(0, 0, 0, 0.15),
    0 0 12px color-mix(in srgb, var(--tbb-btn-accent) 35%, transparent) !important;
}

.tbb-btn:active,
a.tbb-btn:active,
button.tbb-btn:active {
  /* Invert bevel for pressed look */
  border-top:    2px solid var(--tbb-btn-accent-dark)  !important;
  border-left:   2px solid var(--tbb-btn-accent-dark)  !important;
  border-right:  2px solid var(--tbb-btn-accent-light) !important;
  border-bottom: 2px solid var(--tbb-btn-accent-light) !important;
  box-shadow:
    inset 1px 1px 0 rgba(0, 0, 0, 0.2),
    inset -1px -1px 0 rgba(255, 255, 255, 0.4) !important;
  transform: translateY(1px);
}

.tbb-btn:disabled,
.tbb-btn[aria-disabled="true"],
a.tbb-btn[aria-disabled="true"],
button.tbb-btn:disabled {
  background: #374151 !important;
  color: #9ca3af !important;
  border-color: #4b5563 !important;
  box-shadow: inset 1px 1px 0 rgba(255, 255, 255, 0.05) !important;
  cursor: not-allowed !important;
  filter: none !important;
}

/* ── Secondary variant: transparent fill, accent outline + text ── */
.tbb-btn--secondary,
a.tbb-btn--secondary,
button.tbb-btn--secondary {
  background: transparent !important;
  color: var(--tbb-btn-accent) !important;
  box-shadow:
    inset 1px 1px 0 color-mix(in srgb, var(--tbb-btn-accent) 20%, transparent),
    inset -1px -1px 0 rgba(0, 0, 0, 0.2) !important;
}

.tbb-btn--secondary:hover {
  background: color-mix(in srgb, var(--tbb-btn-accent) 10%, transparent) !important;
  color: var(--tbb-btn-accent) !important;
}

/* ── Size / width modifiers ── */
.tbb-btn--block { width: 100% !important; }

.tbb-btn--sm {
  font-size: 12px !important;
  letter-spacing: 0.08em !important;
  padding: 10px 18px !important;
  min-height: 40px !important;
}

/* ==================================================================
   Session 19 — Global Diffusion `.#button` override inside TBB shells
   ------------------------------------------------------------------
   Any merchant-added button that renders the Diffusion `render 'button'`
   snippet (class `.\#button`) will auto-inherit the bevel treatment
   when it sits inside a `.tbb-carousel-shell` or `.tbb-collection-header`.
   This catches future sections + RTE-embedded buttons without having to
   touch each Liquid file.

   Outside shells, Diffusion's button styling is preserved (this rule
   does not apply).
================================================================== */
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#button,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) a.\#button,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) button.\#button,
.tbb-collection-header .\#button,
.tbb-collection-header a.\#button,
.tbb-collection-header button.\#button {
  --tbb-btn-accent: var(--tbb-border-color, #9c01ff);
  --tbb-btn-accent-light: color-mix(in srgb, var(--tbb-btn-accent) 55%, #ffffff);
  --tbb-btn-accent-dark:  color-mix(in srgb, var(--tbb-btn-accent) 55%, #000000);
  --tbb-btn-text: #ffffff;

  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  gap: 0.4em !important;

  background: var(--tbb-btn-accent) !important;
  background-image: none !important;
  color: var(--tbb-btn-text) !important;

  border-top:    2px solid var(--tbb-btn-accent-light) !important;
  border-left:   2px solid var(--tbb-btn-accent-light) !important;
  border-right:  2px solid var(--tbb-btn-accent-dark)  !important;
  border-bottom: 2px solid var(--tbb-btn-accent-dark)  !important;
  border-radius: 6px !important;

  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               'Liberation Mono', 'Courier New', monospace !important;
  font-weight: 700 !important;
  font-size: 13px !important;
  letter-spacing: 0.08em !important;
  text-transform: uppercase !important;
  text-decoration: none !important;
  text-shadow: none !important;
  line-height: 1 !important;

  padding: 10px 20px !important;
  min-height: 44px !important;

  box-shadow:
    inset 1px 1px 0 rgba(255,255,255,0.35),
    inset -1px -1px 0 rgba(0,0,0,0.25) !important;
  transition: filter 0.08s, box-shadow 0.08s !important;
  cursor: pointer !important;
}

/* Kill Diffusion's gradient overlay pseudos (top+bottom highlight/shadow). */
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#button::before,
:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#button::after,
.tbb-collection-header .\#button::before,
.tbb-collection-header .\#button::after {
  content: none !important;
  background: none !important;
  background-image: none !important;
  display: none !important;
}

:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#button:hover,
.tbb-collection-header .\#button:hover {
  background: color-mix(in srgb, var(--tbb-btn-accent) 85%, #ffffff) !important;
  filter: brightness(1.04) !important;
  box-shadow:
    inset 1px 1px 0 rgba(255,255,255,0.5),
    inset -1px -1px 0 rgba(0,0,0,0.2),
    0 0 12px color-mix(in srgb, var(--tbb-btn-accent) 35%, transparent) !important;
}

:is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#button:active,
.tbb-collection-header .\#button:active {
  /* Pressed — invert bevel */
  border-top:    2px solid var(--tbb-btn-accent-dark)  !important;
  border-left:   2px solid var(--tbb-btn-accent-dark)  !important;
  border-right:  2px solid var(--tbb-btn-accent-light) !important;
  border-bottom: 2px solid var(--tbb-btn-accent-light) !important;
  box-shadow:
    inset 1px 1px 0 rgba(0,0,0,0.2),
    inset -1px -1px 0 rgba(255,255,255,0.4) !important;
}

/* ==================================================================
   Session 19 — PDP shell modifier (`.tbb-pdp-shell`)
   ------------------------------------------------------------------
   Default (non-auction) PDPs pick up `.tbb-carousel-shell` via
   tbb-auto-shell.js. We override the shell's border color to blue
   here so auction PDPs (purple) and default PDPs (blue) are visually
   distinct at a glance, while sharing the exact same frame geometry,
   padding, bg, and glow treatment.

   Auction PDPs keep the base purple (`--tbb-border-color: #9c01ff`).
================================================================== */
:is(.tbb-carousel-shell.tbb-pdp-shell, [id^="shopify-section-"]:has(:is(form.shopify-product-form, product-gallery)):not(:has(:is(auction-form, auction-card, auction-info, .auction-countdown, .confirm-place-bid))):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) {
  --tbb-border-color: #446fe9;
  --tbb-border-glow: rgba(68, 111, 233, 0.30);
}


/* ==================================================================
   Session 19 — PDP price block
   ------------------------------------------------------------------
   Mirror the grid-card price design system on the PDP so price /
   compare-at / save stay consistent across surfaces. Diffusion's
   default theme renders current price white and strikes compare-at
   — we swap to pink current + muted compare-at (no strikethrough),
   with the save pill as a small accent. Selector root is
   `.#product-price` (emitted by s_product.liquid and its auction
   twin). Literal `#` escaped per Diffusion theme conventions.
================================================================== */
.\#product-price .\#price {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.5rem 0.75rem;
  margin: 0;
  padding: 0;
}
.\#product-price .\#price-item {
  margin: 0;
}

/* Current / sale price — pink, bold, large. Matches grid card. */
.\#product-price .\#price-item.\@regular .\#price-value,
.\#product-price .\#price-item.\@regular {
  color: #fe8aed !important;
  font-weight: 700;
  font-size: 1.75rem;
  line-height: 1.1;
  text-decoration: none;
}

/* Compare-at ("was" price) — muted with strikethrough. */
.\#product-price .\#price-item.\@compare,
.\#product-price .\#price-item.\@compare .\#price-value,
.\#product-price .\#price-item.\@compare .\#price-item-value,
.\#product-price .\#price-item.\@compare * {
  color: #c8c8d8 !important;
  font-weight: 500;
  font-size: 1rem;
  opacity: 0.85;
  text-decoration: line-through !important;
  -webkit-text-decoration-line: line-through !important;
  text-decoration-line: line-through !important;
}

/* Save pill — small accent, kept on its own line on mobile to avoid
   crowding the price row. Green reads as "discount" but we tone it
   to match the brand mono/muted palette rather than Diffusion's
   default bright green. */
.\#product-price .\#price-item.\@save {
  flex-basis: 100%;
  margin-top: 0.1rem;
  color: #8de0f4;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 0.8rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  text-transform: uppercase;
}
.\#product-price .\#price-item.\@save .\#price-value,
.\#product-price .\#price-item.\@save .\#price-pct {
  color: inherit;
  font-weight: inherit;
}


/* ==================================================================
   Session 19 — PDP mobile layout fix
   ------------------------------------------------------------------
   On mobile, Diffusion's `.#product-grid` is supposed to flip to
   `display: block` so gallery + meta stack. The shell wrapper +
   our inline `--template` was leaving gallery/meta side-by-side at
   narrow widths, crushing the gallery to a thumbnail while the
   title wrapped awkwardly next to it.

   Force the stack explicitly and reset the gallery to full width on
   any viewport ≤991px. Belt-and-braces against future shell or
   template overrides.
================================================================== */
@media (max-width: 991px) {
  /* Specificity must beat `.tbb-carousel-shell .#grid` (0,2,0) which
     forces a 2-column mobile grid on product-card carousels. We scope
     to `.tbb-carousel-shell .#product-grid` (same 0,2,0) and declare
     later in the file so source order wins. Standalone
     `.#product-grid` rule kept for PDPs not wrapped in a shell. */
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#product-grid,
  .\#product-grid,
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#product-gallery-grid,
  .\#product-gallery-grid {
    display: block !important;
    grid-template: none !important;
    grid-template-columns: none !important;
  }
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#product-grid > *,
  .\#product-grid > *,
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#product-gallery-grid > *,
  .\#product-gallery-grid > * {
    width: 100% !important;
    max-width: 100% !important;
    min-width: 0 !important;
    flex: unset !important;
  }
  :is(.tbb-carousel-shell, [id^="shopify-section-"]:has(:is(.product-card, auction-form, auction-card, auction-info, .boost-sd__product-list, .boost-sd__recommendation, .boost-sd__rc-pl, form.shopify-product-form, product-gallery)):not(:has(:is(.\#collection-filter, .\#collection-mobile-filters-button, .\#collection-active-filters, .\#collection-sidebar, .boost-sd__filter))):not(:has(.tbb-carousel-shell))) .\#product-grid > *:first-child,
  .\#product-grid > *:first-child {
    margin-bottom: 1.5rem;
  }
  /* Gallery custom element — make sure it spans the full column. */
  .\#product-grid product-gallery,
  .\#product-grid .\#product-gallery,
  .\#product-grid .\#product-media {
    display: block;
    width: 100%;
    max-width: 100%;
  }
}

/* ──────────────────────────────────────────────────────────────
   /pages/sellers (template: page.become-a-seller) — design system pass
   Session 22. Scoped via body.template-page-become-a-seller so
   rich-text, image-columns, and promo-banner on this page inherit
   the shell + mono typography pattern without affecting those
   section types on other pages.
   ────────────────────────────────────────────────────────────── */
body.template-page-become-a-seller [id^="shopify-section-"]:is(
  :has(.\#rich-text),
  :has(.\#image-columns),
  :has(.\#promo-banner)
) {
  max-width: 1240px;
  margin: 2rem auto !important;
  padding: 1rem !important;
  background: rgba(15, 15, 30, 0.95) !important;
  backdrop-filter: blur(4px);
  border: 4px solid var(--tbb-border-color, #9c01ff);
  border-radius: 8px;
  box-shadow: 0 0 20px rgba(156, 1, 255, 0.30);
}
@media (max-width: 767px) {
  body.template-page-become-a-seller [id^="shopify-section-"]:is(
    :has(.\#rich-text),
    :has(.\#image-columns),
    :has(.\#promo-banner)
  ) {
    margin: 1.5rem 0.5rem !important;
    padding: 0.75rem 0.5rem !important;
  }
}

/* Typography — mono for body copy, uppercase mono for section headings,
   Permanent Marker reserved for the hero accent only. */
body.template-page-become-a-seller .\#rich-text,
body.template-page-become-a-seller .\#image-columns {
  color: #ffffff;
  font-family: var(--font-body-family);
}
body.template-page-become-a-seller .\#rich-text h1,
body.template-page-become-a-seller .\#rich-text h2,
body.template-page-become-a-seller .\#rich-text h3,
body.template-page-become-a-seller .\#image-columns h1,
body.template-page-become-a-seller .\#image-columns h2,
body.template-page-become-a-seller .\#image-columns h3 {
  font-family: var(--font-body-family) !important;
  font-weight: 700 !important;
  text-transform: uppercase;
  letter-spacing: 0.02em;
  text-align: left;
  color: #ffffff !important;
}
/* Rich text body copy — left-aligned, readable mono */
body.template-page-become-a-seller .\#rich-text {
  text-align: left !important;
}
body.template-page-become-a-seller .\#rich-text p,
body.template-page-become-a-seller .\#rich-text li {
  font-family: var(--font-body-family) !important;
  color: #ffffff !important;
  line-height: 1.55;
}
body.template-page-become-a-seller .\#rich-text strong {
  color: #fe8aed !important;
  font-weight: 700;
}
body.template-page-become-a-seller .\#rich-text a {
  color: #8de0f4 !important;
  text-decoration: underline;
}

/* Image columns: center captions, mono, clean spacing */
body.template-page-become-a-seller .\#image-columns .\#image-columns-column-text,
body.template-page-become-a-seller .\#image-columns p {
  font-family: var(--font-body-family) !important;
  color: #ffffff !important;
  line-height: 1.5;
  font-size: 0.95rem;
}
body.template-page-become-a-seller .\#image-columns strong,
body.template-page-become-a-seller .\#image-columns b {
  color: #fe8aed !important;
}

/* Hero — keep Permanent Marker accent on heading (brand placement),
   tighten the pink pill treatment that lives in the section's
   custom_css. Nothing to override here unless needed. */

/* Promo banner CTA button on sellers page: use design-system CTA
   (pink bg, 15px radius, Permanent Marker label — brand placement). */
body.template-page-become-a-seller .\#promo-banner .\#button {
  background: #fe8aed !important;
  color: #1a1a2e !important;
  border-radius: 15px !important;
  font-family: 'Permanent Marker', 'Marker Felt', cursive !important;
  padding: 0.55rem 1.25rem !important;
}

/* Session 23 auction readability rules removed — broad selectors clobbered
   the auction design (neon green bid, pink pill, cyan bid form). Will
   rebuild surgically per-element once we can inspect live DOM. */

/* ──────────────────────────────────────────────────────────────
   TBB Splash-msg — global empty-state skin
   Covers empty collection, empty search, empty auction collection,
   and any other Diffusion splash-msg surface. Cart empty uses the
   same skin (was previously scoped to `.#cart [data-cart-empty]`;
   consolidated here 2026-04-14). Design tokens mirror the shell
   pattern in reference_tbb_design_system.md: cyan border + glow,
   dark glass bg, mono uppercase heading, bevel CTA.
   ────────────────────────────────────────────────────────────── */
.\#splash-msg {
  width: min(100%, 640px) !important;
  max-width: 640px;
  margin: 2rem auto !important;
  padding: 3rem 2rem !important;
  background: rgba(15, 15, 30, 0.95) !important;
  backdrop-filter: blur(8px);
  border: 4px solid #8de0f4 !important;
  border-radius: 8px !important;
  box-shadow: 0 0 20px rgba(141, 224, 244, 0.30) !important;
  color: #fff;
}
.\#splash-msg .\#splash-msg-icon {
  background-color: #8de0f4 !important;
  color: #0a1220 !important;
}
.\#splash-msg .\#splash-msg-icon .\#icon,
.\#splash-msg .\#splash-msg-icon svg {
  color: #0a1220 !important;
  fill: #0a1220 !important;
}
.\#splash-msg :is(h1, h2, h3),
.\#splash-msg .\#hero-heading,
.\#splash-msg .\#hero :is(h1, h2, h3, .\#hero-heading) {
  font-family: var(--tbb-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace) !important;
  text-transform: uppercase;
  letter-spacing: 0.02em;
  color: #ffffff !important;
}
.\#splash-msg p,
.\#splash-msg .\#hero-text,
.\#splash-msg .\#hero-text * {
  color: #ffffff !important;
  font-family: var(--tbb-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace);
}

/* Bevel CTA — cyan primary */
.\#splash-msg a.\#button,
.\#splash-msg .\#hero-button a,
.\#splash-msg .\#button {
  --tbb-btn-accent: #8de0f4;
  --tbb-btn-accent-light: color-mix(in srgb, var(--tbb-btn-accent) 55%, #ffffff);
  --tbb-btn-accent-dark:  color-mix(in srgb, var(--tbb-btn-accent) 55%, #000000);
  background: var(--tbb-btn-accent) !important;
  background-image: none !important;
  color: #0a1220 !important;
  border-top:    2px solid var(--tbb-btn-accent-light) !important;
  border-left:   2px solid var(--tbb-btn-accent-light) !important;
  border-right:  2px solid var(--tbb-btn-accent-dark)  !important;
  border-bottom: 2px solid var(--tbb-btn-accent-dark)  !important;
  border-radius: 6px !important;
  font-family: var(--tbb-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace) !important;
  font-weight: 700 !important;
  font-size: 14px !important;
  text-transform: uppercase !important;
  letter-spacing: 0.1em !important;
  padding: 14px 24px !important;
  min-height: 48px !important;
  box-shadow:
    inset 1px 1px 0 rgba(255,255,255,0.5),
    inset -1px -1px 0 rgba(0,0,0,0.15) !important;
  transition: filter 0.08s, box-shadow 0.08s !important;
  text-shadow: none !important;
}
.\#splash-msg a.\#button:hover,
.\#splash-msg .\#hero-button a:hover,
.\#splash-msg .\#button:hover {
  background: color-mix(in srgb, #8de0f4 85%, #ffffff) !important;
  box-shadow:
    inset 1px 1px 0 rgba(255,255,255,0.5),
    inset -1px -1px 0 rgba(0,0,0,0.15),
    0 0 12px rgba(141, 224, 244, 0.35) !important;
}
.\#splash-msg a.\#button:active,
.\#splash-msg .\#hero-button a:active,
.\#splash-msg .\#button:active {
  border-top:    2px solid var(--tbb-btn-accent-dark)  !important;
  border-left:   2px solid var(--tbb-btn-accent-dark)  !important;
  border-right:  2px solid var(--tbb-btn-accent-light) !important;
  border-bottom: 2px solid var(--tbb-btn-accent-light) !important;
}

/* Mobile — tighten shell per 3-tier strategy */
@media (max-width: 767px) {
  .\#splash-msg {
    margin: 1.5rem 0.5rem !important;
    padding: 1.5rem 1rem !important;
    border-width: 3px !important;
    border-radius: 6px !important;
  }
  .\#splash-msg :is(h1, h2, h3) {
    font-size: 1.25rem !important;
  }
}

/* ──────────────────────────────────────────────────────────────
   TBB Auction-info — surface the "Starting Bid" / "Current Bid" label
   AuctionPlus renders this label with Tailwind `text-gray-500` which is
   invisible on our dark card background. Bumping only the label's color
   to white (nothing else in the auction block is touched).
   ────────────────────────────────────────────────────────────── */
auction-info .auction-container span.uppercase.text-gray-500 {
  color: rgb(200, 200, 216) !important; /* match "Curated by:" label color */
  font-size: 11px !important;
  letter-spacing: 0.05em;
  opacity: 1;
}

/* PDP auction links — "View All Bids (X)" and "Auction FAQs" render as
   black text from the auction app's default link styles. Force white on
   dark theme backgrounds. */
.auction-button.link,
button.auction-button,
.\#product-popup-link .styled-link,
.\#product-popup-link modal-trigger {
  color: #ffffff !important;
}
.auction-button.link:hover,
button.auction-button:hover,
.\#product-popup-link .styled-link:hover {
  color: #8de0f4 !important;
}

/* Cart splash-msg is already styled via `.#cart [data-cart-empty]` wrapper
   in cart.css (higher specificity wins); neutralize inner-splash-msg shell
   inside cart so we don't double-shell. Same for cart drawer. */
.\#cart [data-cart-empty] .\#splash-msg,
.\#cart-drawer-empty .\#splash-msg {
  background: transparent !important;
  border: 0 !important;
  box-shadow: none !important;
  padding: 1rem !important;
  margin: 0 auto !important;
  backdrop-filter: none !important;
  max-width: none !important;
  width: 100% !important;
}


/* ─────────────────────────────────────────────────────────────────
   TBB — Boost auction preview slot (session 28)
   Replaces .boost-sd__product-price on cards whose product handle
   matches an active Auction Plus auction.

   Native <auction-info> on /collections/nostalgia-auction picks up
   pink mono styling from Diffusion selectors like
   `.#product-card .#product-card-price` — selectors that don't
   exist on Boost cards. So we re-apply the same visual treatment
   here scoped to .tbb-boost-auction-slot.

   Color reference (matches native widget):
     - pink #FE8AED (rgb(254,138,237)) = TBB auction accent
     - mono ui-monospace stack
     - status dot: gray-300 (scheduled), green (live), red (ending)
       — the auction app updates this attribute itself; we just
       leave the bg-gray-300 default for now.
   ───────────────────────────────────────────────────────────────── */
.tbb-boost-auction-slot {
  width: 100%;
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               "Liberation Mono", "Courier New", monospace;
  letter-spacing: -0.5px;
  color: #FE8AED;
  text-align: center;
}
.tbb-boost-auction-slot .auction.auction-container {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0;
}
/* Kill Tailwind my-2 / gap-1 spacing inside the slot */
.tbb-boost-auction-slot .my-2 { margin-top: 0 !important; margin-bottom: 0 !important; }
.tbb-boost-auction-slot .gap-1 { gap: 0 !important; }
/* Label ("Starting Bid"/"Current Bid") matches native: GRAY, not pink. */
.tbb-boost-auction-slot .text-sm.uppercase {
  font-size: 11px !important;
  line-height: 16px !important;
  color: rgb(107, 114, 128) !important;
  text-transform: none !important;
  font-weight: 400 !important;
}
/* Countdown ("Starts in 23 hours") — pink, smaller than native to fit. */
.tbb-boost-auction-slot time,
.tbb-boost-auction-slot .text-sm:not(.uppercase) {
  font-size: 11px !important;
  line-height: 16px !important;
  color: #FE8AED !important;
  text-transform: none !important;
  font-weight: 400 !important;
}
/* Price — pink, scaled down from native 25px to fit smaller Boost card. */
.tbb-boost-auction-slot .text-lg {
  font-size: 19px !important;
  line-height: 22px !important;
  color: #FE8AED !important;
  font-weight: 400 !important;
}
.tbb-boost-auction-slot strong,
.tbb-boost-auction-slot strong > span { font-weight: 400 !important; }
/* Status dot scales with text. */
.tbb-boost-auction-slot .rounded-full {
  width: 6px;
  height: 6px;
}
/* Status dot — keep the inline bg-gray-300 default; auction app
   would normally swap this color when auction transitions state. */
.tbb-boost-auction-slot .rounded-full {
  display: inline-block;
  width: 8px;
  height: 8px;
  border-radius: 9999px;
  background: rgb(209, 213, 219);
  margin-right: 0.25rem;
  vertical-align: middle;
}
.tbb-boost-auction-slot time {
  display: inline-flex;
  align-items: center;
  gap: 0.15rem;
}


/* =========================================================================
   ★ ANTI-FOUC — prevent visual flashes during JS-driven layout changes
   =========================================================================
   Problem: several JS scripts patch visual properties after the first paint
   (carousel slidesPerView, auction price → widget swap). The user sees
   a brief "jump" before JS finishes.

   Strategy: hide with CSS, reveal once JS marks the element ready, with
   a keyframe fallback so nothing stays invisible if JS fails.
   ========================================================================= */

/* ── 1. Carousel slidesPerView flash ──────────────────────────────────────
   Diffusion inits Swiper at 1.5 on mobile; tbb-carousel-enhance.js
   patches to 2.15 within ~100ms (one poll cycle). The flash is
   sub-perceptible at normal CPU speed. CSS width overrides were tried
   but caused blank carousels during Swiper init — the cure was worse
   than the disease. Left as-is; enhance polling is fast enough. */

/* ── 2. Auction price → widget replacement flash ──────────────────────────
   On homepage/search, auction JS fetches data then replaces .boost-sd__product-price
   with the auction widget. During the fetch (~1-3s), the regular price is
   visible and then vanishes. We can't pre-hide all prices (non-auction
   products need them), but we CAN make the swap seamless by ensuring the
   auction slot fades in rather than popping. */
.tbb-boost-auction-slot {
  animation: tbb-auction-fadein 0.15s ease-out;
}
@keyframes tbb-auction-fadein {
  from { opacity: 0; }
  to   { opacity: 1; }
}

/* =====================================================
   Boost filter column — kill the built-in dark overlay

   Boost ships `.boost-sd-left.boost-filter-tree-column` with a
   baked-in `rgba(0, 0, 0, 0.25)` fill. Against our older 0.80 shell
   that blended OK, but with the shell now at 0.95 the 25% black
   reads as a distinct darker column — especially on search with
   few/no filters, where the empty column extends visibly down past
   any filter content.

   Making it transparent lets the shell's 0.95 navy show through
   cleanly on both search and collection pages.
   ===================================================== */

.boost-sd-left.boost-filter-tree-column,
.boost-filter-tree-column {
  background: transparent !important;
}

/* =====================================================
   TBB Site Skins
   Storewide background image toggler.

   Architecture (Figma Path B — dedicated fixed overlay, layered):
     • layout/theme.liquid emits <div class="tbb-skin-bg"> inside
       <body> only when a skin is active. position: fixed, z-index:
       -1, so it sits behind all content and stays locked during
       scroll. Sidesteps iOS's background-attachment: fixed bugs.
     • Two pseudo-elements do the actual work:
         ::before → background image + filter: blur() [one-time GPU
                    cost, cached; way cheaper than backdrop-filter]
         ::after  → overlay scrim (rgba black with variable alpha)
     • <body data-skin="skin_1|2|3|none"> still carries the attribute
       so the default backdrop in core.css can scope itself out via
       :not([data-skin^="skin_"]) when a skin is active.
     • The div receives three CSS vars via inline style:
         --tbb-skin-url
         --tbb-skin-blur     (px)
         --tbb-skin-overlay  (alpha 0..1)
     • --tbb-tile-width is the single source of truth for tiled
       mode. Height auto-calculates from image aspect ratio so 16:9
       or 4:3 uploads don't get squished into a square.
     • Precedence: collection metafield custom.skin_override on
       partner-template collections > theme default (see theme.liquid).
   ===================================================== */

:root {
  --tbb-tile-width: 250px;
}

.tbb-skin-bg {
  position: fixed;
  inset: 0;
  z-index: -1;
  pointer-events: none;
}

.tbb-skin-bg::before,
.tbb-skin-bg::after {
  content: "";
  position: absolute;
  inset: 0;
}

.tbb-skin-bg::before {
  background-image: var(--tbb-skin-url);
  filter: blur(var(--tbb-skin-blur, 0px));
}

.tbb-skin-bg::after {
  background: rgba(0, 0, 0, var(--tbb-skin-overlay, 0));
}

.tbb-skin-bg[data-skin-mode="tiled"]::before {
  background-repeat: repeat;
  background-size: var(--tbb-tile-width) auto;
  background-position: top left;
}

.tbb-skin-bg[data-skin-mode="stretched"]::before {
  background-repeat: no-repeat;
  background-size: cover;
  background-position: center center;
}

/* ============================================================
   PDP product-meta block spacing — tighten from Diffusion's
   default 32px gap to a denser 14px so blocks (title, price,
   curated-by, specs, ATC, wishlist) read as a single unit
   rather than spaced-apart sections. Mobile gets a slightly
   tighter 12px since vertical real estate is precious.
   ============================================================ */

.\#product-meta {
  gap: 26px !important;
}

@media (max-width: 767px) {
  .\#product-meta {
    gap: 22px !important;
  }
}

/* ============================================================
   CURATED BY badge (PDP product info sub-block)
   Compact inline seller badge — registered as block type
   `curated_by` in s_product.liquid. Lives in the product info
   column flow alongside title/price/text. Not a shell, not
   side-by-side with Memory Wall (deferred to v2).
   ============================================================ */

.tbb-curated-by {
  display: flex;
  align-items: center;
  gap: 0.625rem;
  padding: 0.5rem 0.625rem;
  margin: 0.375rem 0;
  border: 1px solid rgba(141, 224, 244, 0.55);
  border-radius: 4px;
  background: rgba(141, 224, 244, 0.04);
}

/* Avatar — small polaroid-feel frame, pink border (matches Figma) */
.tbb-curated-by__avatar-link {
  flex: 0 0 auto;
  display: block;
  text-decoration: none;
  line-height: 0;
}

.tbb-curated-by__avatar-frame {
  display: inline-block;
  padding: 2px;
  background: #fff;
  border: 2px solid #fe8aed;
  border-radius: 3px;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
  transition: transform 0.15s ease;
}

.tbb-curated-by__avatar-link:hover .tbb-curated-by__avatar-frame {
  transform: scale(1.04);
}

.tbb-curated-by__avatar {
  display: block;
  width: 40px;
  height: 40px;
  object-fit: contain;
  background: #fff;
  border-radius: 2px;
}

.tbb-curated-by__avatar--placeholder {
  background: linear-gradient(135deg, #8de0f4 0%, #9c01ff 100%);
}

/* Text column */
.tbb-curated-by__text {
  display: flex;
  flex-direction: column;
  gap: 0.125rem;
  min-width: 0;
}

.tbb-curated-by__label {
  font-family: 'Courier New', Courier, monospace;
  font-size: 11px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.65);
  line-height: 1;
}

.tbb-curated-by__verified {
  display: inline-flex;
  align-items: center;
  vertical-align: middle;
  margin-left: 5px;
  cursor: help;
  filter: drop-shadow(0 0 4px rgba(141, 224, 244, 0.4));
}

.tbb-curated-by__verified svg {
  width: 18px;
  height: 18px;
  display: block;
}

.tbb-curated-by__name {
  font-family: 'Courier New', Courier, monospace;
  font-size: 15px;
  font-weight: 700;
  line-height: 1.1;
  color: #fff;
  letter-spacing: 0.01em;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.tbb-curated-by__name a {
  color: inherit;
  text-decoration: none;
  border-bottom: 2px solid #fe8aed;
  padding-bottom: 1px;
  transition: color 0.15s ease;
}

.tbb-curated-by__name a:hover {
  color: #fe8aed;
}

/* Meta row — product count + visit shop link */
.tbb-curated-by__meta {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  flex-wrap: wrap;
  font-family: 'Courier New', Courier, monospace;
  font-size: 12px;
  color: rgba(255, 255, 255, 0.7);
  margin-top: 0.125rem;
}

.tbb-curated-by__count {
  letter-spacing: 0.04em;
}

.tbb-curated-by__divider {
  color: rgba(255, 255, 255, 0.35);
}

.tbb-curated-by__visit {
  color: #fe8aed;
  text-decoration: none;
  font-weight: 600;
  letter-spacing: 0.04em;
  transition: color 0.15s ease;
}

.tbb-curated-by__visit:hover {
  color: #fff;
  text-decoration: underline;
}

/* Unresolved fallback (vendor with no matching collection) */
.tbb-curated-by--unresolved .tbb-curated-by__avatar-frame {
  border-color: rgba(255, 255, 255, 0.2);
}

/* Mobile: keep horizontal layout but tighten everything */
@media (max-width: 767px) {
  .tbb-curated-by {
    gap: 0.5rem;
    padding: 0.4375rem 0.5rem;
  }

  .tbb-curated-by__avatar {
    width: 36px;
    height: 36px;
  }

  .tbb-curated-by__name {
    font-size: 14px;
  }

  .tbb-curated-by__label {
    font-size: 10px;
  }

  .tbb-curated-by__meta {
    font-size: 11px;
  }
}

/* ============================================================
   CAROUSEL FLUIDITY (sitewide)

   LeMarc directive: "all carousels — frictionless and smooth
   both directions, period." The default Swiper CSS engine ships
   `scroll-snap-type: x mandatory` on every horizontal swiper
   wrapper, which forces every thumb-drag (no matter how short)
   to jump to the next slide. That reads as jerky and unresponsive
   on mobile. Removing snap entirely gives free, fluid touch
   scroll in both directions, just as you'd expect from a native
   horizontal scroll container.

   Targets:
     - `.swiper-wrapper` — every Swiper instance, all axes
     - `.swiper-slide`   — clear the per-slide snap-align so the
                           cascade can't re-introduce snap behavior
   Boost's own carousels reuse the swiper class names, so this
   covers Boost recommendations + product grids too.
   ============================================================ */
.swiper-wrapper,
.swiper-horizontal .swiper-wrapper,
.swiper-vertical .swiper-wrapper,
.swiper-css-mode > .swiper-wrapper {
  scroll-snap-type: none !important;
  scroll-behavior: smooth !important;
  -webkit-overflow-scrolling: touch !important;
}

.swiper-slide,
.swiper-wrapper > .swiper-slide {
  scroll-snap-align: none !important;
  scroll-snap-stop: normal !important;
}

/* ============================================================
   BOOST RECOMMENDATION WIDGET — loading-state polish

   The bad loading sequence LeMarc reported was:
     1. Section blank (next section visible in its place)
     2. Tall empty box appears
     3. Carousel pops in with products

   Two-part fix:

   (a) Reserve a reasonable approximate final height so the section
       holds its place from initial render. Boost's default 600px was
       too tall; the actual final height is ~420-500px. Splitting the
       difference at 460 keeps layout stable without dwarfing the page.

   (b) Hide the widget's INNER content while products haven't
       hydrated yet — the section reserves space but the user
       never sees an empty box. When `.boost-sd__product-list`
       (or the swiper) appears, the :has() selector stops matching
       and the content fades in.
   ============================================================ */
.boost-sd__rc-pl {
  min-height: 460px !important;
  transition: opacity 0.2s ease-out;
}

/* While Boost hasn't injected products, hide the widget's interior so
   the user only sees reserved space (no empty-box flash). The section
   header above stays visible the whole time. */
.boost-sd__rc-pl:not(:has(.boost-sd__product-list, .swiper-slide)) > * {
  visibility: hidden;
}

/* Hide Slick's cloned slides on Boost recommendation carousels.
   Slick clones the first/last few slides for its infinite-loop visual,
   even when our enhance.js removes the wrap-around logic. With these
   clones hidden, drag-past-end shows empty space (which the existing
   clamp observer in tbb-carousel-enhance.js snaps back from), instead
   of the wrap-around illusion. visibility:hidden keeps Slick's width
   measurements intact — display:none would break the slider layout. */
.boost-sd__slider-container .slick-cloned {
  visibility: hidden !important;
  pointer-events: none !important;
}

/* ============================================================
   PRODUCT CARD HOVER — disabled on touch devices

   On phones/tablets, a tap registers as :hover and the state
   sticks until the next tap clears it. The polaroid card's
   lift+rotate+scale + dim overlay then leaves the card visually
   "stuck up" at random points during scroll, which reads as broken.

   `(hover: none)` matches devices where the primary input has no
   true hover capability (touchscreens). Desktop with a mouse
   keeps the lift; laptops with a trackpad still register `hover:
   hover` so they're unaffected.

   We zero out the transform + dim-overlay-pseudo for both :hover
   and :active so a stuck tap never produces visual lift.
   ============================================================ */
@media (hover: none) {
  /* Diffusion / native cards */
  .\#product-card.\@tbb-polaroid:hover .\#product-card-media,
  .\#product-card.\@tbb-polaroid:active .\#product-card-media,
  .\#product-card.\@tbb-polaroid:focus-within .\#product-card-media {
    transform: none !important;
  }
  .\#product-card.\@tbb-polaroid:hover .\#product-card-media::before,
  .\#product-card.\@tbb-polaroid:active .\#product-card-media::before,
  .\#product-card.\@tbb-polaroid:focus-within .\#product-card-media::before {
    background: transparent !important;
  }
  /* Quick-view and media-alt fade-ins are also hover-driven by Diffusion
     base CSS — keep them hidden on touch since they require hover intent. */
  .\#product-card:hover .\#product-card-quick-view,
  .\#product-card:hover .\#product-card-media-alt {
    opacity: 0 !important;
    pointer-events: none !important;
  }

  /* Boost cards — same lift+rotate+scale at .boost-sd__product-item:hover.
     Different class names from Diffusion, same UX problem on touch. */
  body .boost-sd__product-item:hover .boost-sd__product-image-wrapper,
  body .boost-sd__product-item:active .boost-sd__product-image-wrapper,
  body .boost-sd__product-item:focus-within .boost-sd__product-image-wrapper {
    transform: none !important;
  }
}

/* ============================================================
   QIKIFY SMART MENU — product grid skin

   The "Throwback Collections" mega menu (Qikify tmenu) optionally
   shows product cards at the bottom of each column. By default
   they render at the source image's native dimensions (~600×700px)
   with no styling — too big, no polaroid feel, doesn't match the
   rest of the site.

   Scope: ALL styling here is prefixed with `.tmenu_app` so it can
   never leak outside the Qikify menu. Inherits font + colors from
   the panel-level settings (mono body, white text, dark bg, pink
   price already set in the app's color tokens).

   What this rule does:
   - Caps card image at a tile-friendly square aspect
   - Adds the white polaroid frame + soft drop-shadow used sitewide
   - Sets the title in mono, white, line-clamped to 2 lines
   - Pink price in mono, matches PDP/auction price treatment
   - Compact column gutters
   ============================================================ */
.tmenu_app .tmenu_product {
  max-width: 200px;
  margin: 0 auto;
  background: #ffffff;
  padding: 0.5rem 0.5rem 0.75rem;
  border-radius: 2px;
  box-shadow: 0 4px 14px rgba(0, 0, 0, 0.35);
  transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.tmenu_app .tmenu_product-top {
  width: 100%;
  aspect-ratio: 1 / 1;
  overflow: hidden;
  background: #ffffff;
  margin-bottom: 0.5rem;
}
.tmenu_app .tmenu_product-top img,
.tmenu_app .tmenu_product img {
  width: 100% !important;
  height: 100% !important;
  object-fit: cover !important;
  display: block;
}
.tmenu_app .tmenu_product_body {
  text-align: center;
  padding: 0 0.25rem;
}
.tmenu_app .tmenu_product_title {
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               "Liberation Mono", "Courier New", monospace;
  font-size: 12px;
  line-height: 1.3;
  color: #1a1a2e;       /* dark navy on white polaroid card */
  font-weight: 600;
  letter-spacing: -0.01em;
  text-transform: none;
  margin: 0 0 0.25rem;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.tmenu_app .tmenu_product_price {
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               "Liberation Mono", "Courier New", monospace;
  font-size: 14px;
  font-weight: 700;
  color: #fe8aed;       /* TBB brand pink — matches PDP/auction price */
  letter-spacing: -0.5px;
  margin: 0;
}
/* Compare-at strikethrough — sitewide rule per design system */
.tmenu_app .tmenu_product_price s,
.tmenu_app .tmenu_product_price del,
.tmenu_app .tmenu_product_price [class*="compare"] {
  text-decoration: line-through !important;
  opacity: 0.6;
}

/* Hover lift — desktop mouse only (touch handled by sitewide hover:none rule) */
@media (hover: hover) {
  .tmenu_app .tmenu_product:hover {
    transform: translateY(-2px) rotate(-1deg);
    box-shadow: 0 8px 22px rgba(0, 0, 0, 0.45);
  }
}

/* Tighter column gap when product cards are present */
.tmenu_app .tmenu_item_submenu_type_automatic .tmenu_submenu {
  gap: 0.75rem !important;
}

/* Column headers (level 1 — "Throwback Playground", "Throwback Gaming",
   etc.) in brand cyan to differentiate from the white items below.
   Wins against the app's panel-set text color via !important. */
.tmenu_app .tmenu_item_level_1 > .tmenu_item_link > .tmenu_item_text,
.tmenu_app .tmenu_item_level_1 > .tmenu_item_link {
  color: #8de0f4 !important;
}

/* Top-level nav links (the trigger row in the cyan header bar — e.g.
   "Throwback Collections", "Nostalgia Auctions" rendered by Qikify).
   Qikify's default is 14px / #333 which is too small and unreadable
   on cyan. Restore TBB header link treatment: 16px, dark navy text
   (matches existing nav contrast on cyan), mono font, slight bold. */
.tmenu_app .tmenu_item_level_0 > .tmenu_item_link,
.tmenu_app .tmenu_item_level_0 > .tmenu_item_link > .tmenu_item_text {
  font-size: 16px !important;
  color: #1a1a2e !important;
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               "Liberation Mono", "Courier New", monospace !important;
  font-weight: 600 !important;
  letter-spacing: -0.01em !important;
}

/* Hover state on top-level nav links — purple accent matches sitewide
   hover convention. */
.tmenu_app .tmenu_item_level_0 > .tmenu_item_link:hover,
.tmenu_app .tmenu_item_level_0 > .tmenu_item_link:hover > .tmenu_item_text {
  color: #9c01ff !important;
}

/* ============================================================
   QIKIFY INSIDE MOBILE HAMBURGER — match native drawer typography

   On desktop, Qikify items get bespoke styling (cyan column headers,
   uppercase, etc.). On mobile they should look identical to the
   native drawer items (e.g. "Nostalgia Auctions") so the menu reads
   as one cohesive list, not two visually-different blocks.

   These overrides scope to the hamburger drawer only — desktop mega
   menu styling above this block is untouched.
   ============================================================ */
/* Typography match for Qikify items inside the mobile drawer.
   Targets only the link text — no `*` wildcard, no submenu/item-level
   resets that could fight Qikify's own visibility logic. */
.\#main-navigation-mobile-drawer .tmenu_item_link,
.\#main-navigation-mobile-drawer .tmenu_item_text {
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               "Liberation Mono", "Courier New", monospace !important;
  color: #ffffff !important;
  font-size: 16px !important;
  font-weight: 400 !important;
  letter-spacing: 0 !important;
  text-transform: none !important;
}

/* ============================================================
   QIKIFY MENU INSIDE TBB MOBILE HAMBURGER

   The bridge script (tbb-mobile-menu-bridge.js) clones Qikify's
   mega submenu into the hamburger drawer's mount point. The cloned
   instance gets `.tbb-qikify-cloned` so we can scope styles ONLY
   to the in-drawer copy without affecting Qikify's desktop dropdown.

   Goals:
   - Mega columns → vertical stack (single-column accordion)
   - Inherit drawer typography (mono, white) and tokens
   - Hide product cards on mobile (no room, drawer is narrow)
   - Brand cyan column headers (already cascading from the global
     .tmenu_item_level_1 rule above)
   ============================================================ */
.tbb-drawer-qikify-mount {
  width: 100%;
}

/* Collapsible "Throwback Collections" parent — looks like a native
   drawer item (label + chevron), expands to reveal the menu. Matches
   the visual pattern of the drawer's other lvl0 nav links. */
.tbb-qikify-collapsible {
  display: block;
  border: 0;
  margin: 0;
  padding: 0;
}
.tbb-qikify-collapsible-summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0.875rem 1rem;
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               "Liberation Mono", "Courier New", monospace;
  font-size: 16.8px;
  font-weight: 700;
  line-height: 1.4;
  letter-spacing: normal;
  color: #ffffff;
  cursor: pointer;
  list-style: none;
}
.tbb-qikify-collapsible-summary::-webkit-details-marker { display: none; }
.tbb-qikify-collapsible-summary::after {
  content: '';
  display: inline-block;
  width: 8px; height: 8px;
  border-right: 2px solid #ffffff;
  border-bottom: 2px solid #ffffff;
  transform: rotate(-45deg);
  transition: transform 0.2s ease;
  margin-right: 0.25rem;
}
.tbb-qikify-collapsible[open] > .tbb-qikify-collapsible-summary::after {
  transform: rotate(45deg);
}

/* Cloned Qikify root — flatten to vertical block. Use !important and
   broad selectors to defeat any Qikify CSS that sets grid/flex. */
.tbb-qikify-cloned,
.tbb-qikify-cloned.tmenu_submenu_type_mega {
  display: block !important;
  position: static !important;
  width: 100% !important;
  max-width: none !important;
  height: auto !important;
  min-height: 0 !important;
  transform: none !important;
  background: transparent !important;
  background-image: none !important;
  box-shadow: none !important;
  padding: 0 !important;
  margin: 0 !important;
  border: 0 !important;
  border-radius: 0 !important;
  visibility: visible !important;
  opacity: 1 !important;
  pointer-events: auto !important;
  flex-direction: column !important;
  flex-wrap: nowrap !important;
  grid-template-columns: 1fr !important;
  list-style: none !important;
}

/* Each column → full-width stacked block with subtle divider */
.tbb-qikify-cloned > .tmenu_item,
.tbb-qikify-cloned .tmenu_item.tmenu_col {
  display: block !important;
  width: 100% !important;
  max-width: none !important;
  flex: none !important;
  padding: 0.625rem 1rem !important;
  margin: 0 !important;
  border: 0 !important;
  border-bottom: 1px solid rgba(141, 224, 244, 0.12) !important;
  background: transparent !important;
}
.tbb-qikify-cloned > .tmenu_item:last-child,
.tbb-qikify-cloned .tmenu_item.tmenu_col:last-child {
  border-bottom: 0 !important;
}

/* Column header (level 1 — "Throwback Playground" etc.) → CYAN, mono,
   uppercase. Selector broad enough to win against Qikify's panel-
   set color and Diffusion theme inheritance. */
.tbb-qikify-cloned .tmenu_item_level_1 > .tmenu_item_link,
.tbb-qikify-cloned .tmenu_item_level_1 > .tmenu_item_link > .tmenu_item_text,
.tbb-qikify-cloned .tmenu_item_level_1 > a,
.tbb-qikify-cloned .tmenu_item_level_1 > a > * {
  color: #8de0f4 !important;
  display: block !important;
  padding: 0.375rem 0 !important;
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               "Liberation Mono", "Courier New", monospace !important;
  font-size: 13px !important;
  font-weight: 700 !important;
  letter-spacing: 0.06em !important;
  text-transform: uppercase !important;
  background: transparent !important;
}

/* Items (level 2) — white, mono, indented from the column header */
.tbb-qikify-cloned .tmenu_item_level_2 > .tmenu_item_link,
.tbb-qikify-cloned .tmenu_item_level_2 > .tmenu_item_link > .tmenu_item_text,
.tbb-qikify-cloned .tmenu_item_level_2 > a {
  color: #ffffff !important;
  display: block !important;
  padding: 0.375rem 0 0.375rem 0.75rem !important;
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               "Liberation Mono", "Courier New", monospace !important;
  font-size: 13px !important;
  font-weight: 400 !important;
  text-transform: none !important;
  background: transparent !important;
}

/* Inner submenus (sub-lists inside columns) → flow vertically, no popup */
.tbb-qikify-cloned .tmenu_submenu,
.tbb-qikify-cloned ul.tmenu_submenu {
  position: static !important;
  display: block !important;
  width: 100% !important;
  height: auto !important;
  visibility: visible !important;
  opacity: 1 !important;
  background: transparent !important;
  background-image: none !important;
  box-shadow: none !important;
  transform: none !important;
  padding: 0 !important;
  margin: 0 !important;
  list-style: none !important;
  grid-template-columns: 1fr !important;
}

/* Hide product cards inside the drawer — no room in a narrow side panel */
.tbb-qikify-cloned .tmenu_product,
.tbb-qikify-cloned .tmenu_product-top,
.tbb-qikify-cloned .tmenu_product_body,
.tbb-qikify-cloned .tmenu_item_submenu_type_automatic .tmenu_item {
  display: none !important;
}

/* Hide per-column background images — designed for desktop only */
.tbb-qikify-cloned .tmenu_item_background_image,
.tbb-qikify-cloned [class*="background_image"],
.tbb-qikify-cloned [class*="background-image"] {
  display: none !important;
  background: transparent !important;
  background-image: none !important;
}

/* =========================================================================
   TBB 2026 — Design System parity pass (session 30, 2026-04-30)
   Brings stragglers (404, page/blog/search headers, footer, password,
   customer account) into the new shell + mono-first treatment.
   Skipped: seller-header-shell + top8-shell already styled (~L2893, L3103).
   ========================================================================= */

/* ---- GAP 1: 404 page (templates/404.json — d_rich-text is active) ---- */
body.template--404 [id^="shopify-section-"] > .\#section-body {
  max-width: 1240px;
  margin: 2rem auto !important;
  padding: 1.5rem 1rem !important;
  border: 4px solid var(--tbb-border-color, #9c01ff);
  border-radius: 8px;
  box-shadow: 0 0 20px var(--tbb-border-glow, rgba(156, 1, 255, 0.30));
  background: rgba(15, 15, 30, 0.95) !important;
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
  box-sizing: border-box;
}
@media (max-width: 767px) {
  body.template--404 [id^="shopify-section-"] > .\#section-body {
    margin: 1.5rem 0.5rem !important;
    padding: 1rem 0.5rem !important;
  }
}

/* ---- GAPS 2–4: Header sections on blog / page / search templates.
   These template body classes get the auto-shell on any section that
   contains a heading. Skip g_header / g_footer / cart / newsletter
   (they render fixed in their own areas, not in the body flow). ---- */
body.template--blog [id^="shopify-section-template"] > .\#section-body,
body.template--page [id^="shopify-section-template"] > .\#section-body,
body.template--search [id^="shopify-section-template"] > .\#section-body,
body.template--article [id^="shopify-section-template"] > .\#section-body,
body.template--list-collections [id^="shopify-section-template"] > .\#section-body {
  max-width: 1240px;
  margin: 2rem auto !important;
  padding: 1.5rem 1rem !important;
  border: 4px solid var(--tbb-border-color, #9c01ff);
  border-radius: 8px;
  box-shadow: 0 0 20px var(--tbb-border-glow, rgba(156, 1, 255, 0.30));
  background: rgba(15, 15, 30, 0.95) !important;
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
  box-sizing: border-box;
}
@media (max-width: 767px) {
  body.template--blog [id^="shopify-section-template"] > .\#section-body,
  body.template--page [id^="shopify-section-template"] > .\#section-body,
  body.template--search [id^="shopify-section-template"] > .\#section-body,
  body.template--article [id^="shopify-section-template"] > .\#section-body,
  body.template--list-collections [id^="shopify-section-template"] > .\#section-body {
    margin: 1.5rem 0.5rem !important;
    padding: 1rem 0.5rem !important;
  }
}

/* Mono-first heading treatment for headings inside any auto-shelled
   section (404, blog, page, search, article, list-collections). */
body.template--404 [id^="shopify-section-"] h1,
body.template--404 [id^="shopify-section-"] h2,
body.template--blog [id^="shopify-section-template"] h1,
body.template--blog [id^="shopify-section-template"] h2,
body.template--page [id^="shopify-section-template"] h1,
body.template--page [id^="shopify-section-template"] h2,
body.template--search [id^="shopify-section-template"] h1,
body.template--search [id^="shopify-section-template"] h2,
body.template--article [id^="shopify-section-template"] h1,
body.template--article [id^="shopify-section-template"] h2,
body.template--list-collections [id^="shopify-section-template"] h1,
body.template--list-collections [id^="shopify-section-template"] h2 {
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               'Liberation Mono', 'Courier New', monospace !important;
  color: #ffffff !important;
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: 0.02em !important;
}

/* ---- GAP 10 (newly surfaced): Shopify-rendered policy pages
   (e.g. /policies/terms-of-service). Uses .shopify-policy__container,
   sits outside the Shopify section system. ---- */
.shopify-policy__container {
  max-width: 1240px !important;
  margin: 2rem auto !important;
  padding: 1.5rem 1rem !important;
  border: 4px solid var(--tbb-border-color, #9c01ff);
  border-radius: 8px;
  box-shadow: 0 0 20px var(--tbb-border-glow, rgba(156, 1, 255, 0.30));
  background: rgba(15, 15, 30, 0.95) !important;
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
  box-sizing: border-box;
  color: #ffffff;
}
.shopify-policy__title h1,
.shopify-policy__container h1,
.shopify-policy__container h2,
.shopify-policy__container h3 {
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               'Liberation Mono', 'Courier New', monospace !important;
  color: #ffffff !important;
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: 0.02em !important;
}
.shopify-policy__body,
.shopify-policy__body .rte,
.shopify-policy__body .rte p,
.shopify-policy__body .rte li {
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               'Liberation Mono', 'Courier New', monospace !important;
  color: rgba(255, 255, 255, 0.85);
}
.shopify-policy__body .rte a {
  color: #fe8aed;
}
@media (max-width: 767px) {
  .shopify-policy__container {
    margin: 1.5rem 0.5rem !important;
    padding: 1rem 0.5rem !important;
  }
}

/* ---- Body-text default inside any branded shell ----
   Anything sitting inside the dark shell on these auto-shelled templates
   should default to white. Catches paragraphs, list items, spans, and
   stray rich-text blocks where the section's old custom_css forced black. */
body.template--404 [id^="shopify-section-template"] p,
body.template--404 [id^="shopify-section-template"] li,
body.template--404 [id^="shopify-section-template"] span:not([class*="button"]):not([class*="badge"]),
body.template--404 [id^="shopify-section-template"] .\#hero-text,
body.template--blog [id^="shopify-section-template"] p,
body.template--blog [id^="shopify-section-template"] li,
body.template--blog [id^="shopify-section-template"] .\#hero-text,
body.template--page [id^="shopify-section-template"] p,
body.template--page [id^="shopify-section-template"] li,
body.template--page [id^="shopify-section-template"] .\#hero-text,
body.template--search [id^="shopify-section-template"] p,
body.template--search [id^="shopify-section-template"] li,
body.template--article [id^="shopify-section-template"] p,
body.template--article [id^="shopify-section-template"] li,
body.template--list-collections [id^="shopify-section-template"] p,
body.template--list-collections [id^="shopify-section-template"] li {
  color: rgba(255, 255, 255, 0.85) !important;
}

/* ---- SVG icons inside buttons keep their fill (sprite uses currentColor) ----
   Fixes empty qty buttons in cart drawer where my earlier `fill: none` killed
   the +/- glyphs. */
.\#cart-drawer-product-qty-button svg,
.\#cart-drawer-product-qty-button .\#icon,
button .\#icon {
  fill: currentColor !important;
  stroke: currentColor !important;
}

/* ---- Buttons: GLOBAL mono font + bevel treatment (sitewide rule, 2026-04-30) ----
   Applies to EVERY button-like element on the site. Not just `.#button`.
   Memory rule: "Buttons = mono + bevel, NEVER Permanent Marker, EVERYWHERE".
   Selector list intentionally broad — picks up cart qty buttons, PDP qty,
   form submits, custom widget buttons, etc. */
a.\#button,
button.\#button,
.\#button,
.\#button.heading-font,
a.\#button.heading-font,
button.\#button.heading-font,
.\#cart-drawer-product-qty-button,
.\#product-qty-selector-button,
.\#product-form button[type="submit"],
form.shopify-product-form button[type="submit"],
input[type="submit"]:not([class*="boost"]):not([class*="search"]),
input[type="button"]:not([class*="boost"]):not([class*="search"]) {
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               'Liberation Mono', 'Courier New', monospace !important;
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: 0.02em !important;
  /* Bevel = INSET shadows only. Top highlight + bottom recess.
     No outset drop shadow, no float, no Y-translate. Surface stays
     flat-positioned; depth lives entirely on the inner edge. */
  box-shadow:
    inset 0 2px 0 rgba(255, 255, 255, 0.40),
    inset 0 -3px 0 rgba(0, 0, 0, 0.45) !important;
  transition: box-shadow 80ms ease !important;
  border: none !important;
}
a.\#button:hover,
button.\#button:hover,
.\#button:hover,
.\#cart-drawer-product-qty-button:hover,
.\#product-qty-selector-button:hover,
.\#product-form button[type="submit"]:hover,
form.shopify-product-form button[type="submit"]:hover {
  /* Brighten the top highlight on hover — no transform, no drop shadow */
  box-shadow:
    inset 0 2px 0 rgba(255, 255, 255, 0.55),
    inset 0 -3px 0 rgba(0, 0, 0, 0.45) !important;
}
a.\#button:active,
button.\#button:active,
.\#button:active,
.\#cart-drawer-product-qty-button:active,
.\#product-qty-selector-button:active,
.\#product-form button[type="submit"]:active,
form.shopify-product-form button[type="submit"]:active {
  /* Pressed state — flatten/invert the bevel inward, still no transform */
  box-shadow:
    inset 0 3px 5px rgba(0, 0, 0, 0.45),
    inset 0 -1px 0 rgba(255, 255, 255, 0.10) !important;
}

/* ---- Strip inline rich-text formatting from product descriptions ----
   Sellers often paste formatted text (Google Docs, Word, etc.) into
   Shopify's rich text editor. Those inline `style` attrs preserve fonts
   and colors that don't match brand (e.g. Google Sans, color #0a0a0a)
   and render unreadable on TBB's dark surface. This rule force-resets
   font + color on rich-text descendants. Bold/italic markup
   (<strong>, <em>, font-weight, font-style) is intentionally NOT
   touched so emphasis still works. */
.\#product-description,
.\#product-description *,
.\#product-description-content,
.\#product-description-content *,
.rte,
.rte * {
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               'Liberation Mono', 'Courier New', monospace !important;
  color: rgba(255, 255, 255, 0.88) !important;
  background-color: transparent !important;
}
/* Allow links inside rich text to keep brand pink */
.\#product-description a,
.\#product-description-content a,
.rte a {
  color: #fe8aed !important;
}
/* Headings inside rich text get the heading treatment */
.\#product-description h1, .\#product-description h2, .\#product-description h3,
.\#product-description h4, .\#product-description h5, .\#product-description h6,
.rte h1, .rte h2, .rte h3, .rte h4, .rte h5, .rte h6 {
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: 0.02em !important;
  color: #ffffff !important;
}

/* ============================================================
   Cart drawer reskin (sliding cart) — design-system parity pass
   ============================================================
   Surfaces: .#cart-drawer (the entire slide-in panel)
   Goals: dark navy backdrop, mono headings, branded pricing,
   beveled controls. Replaces the legacy cyan + white treatment.
   CSS-only — no liquid changes. */

/* Outer drawer — dark navy bg, mono everything */
.\#cart-drawer {
  background: rgba(15, 15, 30, 0.98) !important;
  color: #ffffff !important;
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               'Liberation Mono', 'Courier New', monospace !important;
}

/* Header — transparent so it inherits the dark bg, divider below */
.\#cart-drawer-header {
  background: transparent !important;
  border-bottom: 1px solid rgba(255, 255, 255, 0.15) !important;
}
.\#cart-drawer-header-inner {
  background: transparent !important;
  color: #ffffff !important;
}
.\#cart-drawer-heading {
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               'Liberation Mono', 'Courier New', monospace !important;
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: 0.02em !important;
  color: #ffffff !important;
}
.\#cart-drawer-close,
.\#cart-drawer-modal-close,
.\#cart-drawer-cart-link {
  color: #ffffff !important;
}
.\#cart-drawer-close svg,
.\#cart-drawer-modal-close svg,
.\#cart-drawer-cart-link svg {
  stroke: #ffffff !important;
  fill: none !important;
}

/* Body — transparent (inherits drawer bg) */
.\#cart-drawer-body {
  background: transparent !important;
  color: #ffffff !important;
}

/* The actual cart line item is `.#product-card-min` (shared mini-card snippet,
   NOT `.#cart-drawer-product` which is just an outer wrapper). Targeting the
   real white card here, scoped to inside the cart drawer so we don't affect
   other places `.#product-card-min` may be used. */
.\#cart-drawer .\#product-card-min,
.\#cart-drawer-products .\#product-card-min,
.\#cart-drawer .\#cart-drawer-product,
.\#cart-drawer-products .\#cart-drawer-product {
  background: rgba(20, 20, 40, 0.95) !important;
  border: 1px solid rgba(255, 255, 255, 0.18) !important;
  border-radius: 8px !important;
  padding: 0.75rem !important;
  margin-bottom: 0.75rem !important;
  color: #ffffff !important;
  box-shadow: none !important;
  /* Fixed minimum height so cards don't vary by image aspect */
  min-height: 130px !important;
  display: flex !important;
  align-items: center !important;
  gap: 0.75rem !important;
}
/* Header of the cart drawer also renders white via `.shadow-1` — kill that */
.\#cart-drawer .\#cart-drawer-header,
.\#cart-drawer .\#cart-drawer-header.shadow-1,
.\#cart-drawer-header.shadow-1 {
  background: transparent !important;
  background-color: transparent !important;
  box-shadow: none !important;
}
/* Free-shipping progress bar — white track replaced with subtle white */
.\#cart-drawer .\#free-shipping-progress-bar-progress,
.\#free-shipping-progress-bar-progress {
  background: rgba(255, 255, 255, 0.15) !important;
}
/* Constrain the thumbnail inside the line item to a fixed box */
.\#cart-drawer .\#product-card-min img,
.\#cart-drawer .\#product-card-min picture,
.\#cart-drawer-product img,
.\#cart-drawer-product picture,
.\#cart-drawer-product .\#cart-drawer-product-image {
  width: 90px !important;
  height: 110px !important;
  object-fit: contain !important;
  flex-shrink: 0 !important;
}
/* Info column flexes to fill remaining width and uses white mono text */
.\#cart-drawer .\#product-card-min-info,
.\#cart-drawer .\#product-card-min-info *,
.\#cart-drawer-product-info {
  flex: 1 1 auto !important;
  min-width: 0 !important;
  color: #ffffff !important;
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               'Liberation Mono', 'Courier New', monospace !important;
}
.\#cart-drawer .\#product-card-min-info [class*="price"],
.\#cart-drawer .\#product-card-min [class*="price"] {
  color: #fe8aed !important;
  font-weight: 700 !important;
}

/* Polaroid-style frame on the product thumbnail inside the drawer */
.\#cart-drawer-product img {
  background: #ffffff !important;
  padding: 6px 6px 18px 6px !important;
  border-radius: 2px !important;
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.35) !important;
}

/* Product info — white mono text, pink price */
.\#cart-drawer-product-info,
.\#cart-drawer-product-info * {
  color: #ffffff !important;
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               'Liberation Mono', 'Courier New', monospace !important;
}
.\#cart-drawer-product-info [class*="price"],
.\#cart-drawer-product-info .price {
  color: #fe8aed !important;
  font-weight: 700 !important;
}

/* Quantity adjuster — beveled pill buttons, brand purple */
.\#cart-drawer-product-qty {
  background: transparent !important;
  color: #ffffff !important;
}
.\#cart-drawer-product-qty-button {
  background: var(--tbb-border-color, #9c01ff) !important;
  color: #ffffff !important;
  border: none !important;
  border-radius: 4px !important;
  width: 28px !important;
  height: 28px !important;
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, 0.18),
    inset 0 -1px 0 rgba(0, 0, 0, 0.25),
    0 1px 0 rgba(0, 0, 0, 0.25) !important;
  transition: transform 80ms ease !important;
}
.\#cart-drawer-product-qty-button:hover {
  transform: translateY(-1px);
}
.\#cart-drawer-product-qty-button:active {
  transform: translateY(1px);
}
.\#cart-drawer-product-qty-button svg {
  stroke: #ffffff !important;
  fill: none !important;
}
.\#cart-drawer-product-qty-adjust input,
.\#cart-drawer-product-qty input {
  color: #ffffff !important;
  background: transparent !important;
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               'Liberation Mono', 'Courier New', monospace !important;
  font-weight: 700 !important;
}
.\#cart-drawer-product-qty-max-note {
  color: rgba(255, 255, 255, 0.6) !important;
}

/* Remove (X) button */
.\#cart-drawer-product-remove {
  color: rgba(255, 255, 255, 0.6) !important;
}
.\#cart-drawer-product-remove:hover {
  color: #fe8aed !important;
}
.\#cart-drawer-product-remove svg {
  stroke: currentColor !important;
}

/* Subtotal block — divider + mono labels + pink price */
.\#cart-drawer-subtotal {
  background: transparent !important;
  border-top: 1px solid rgba(255, 255, 255, 0.15) !important;
  color: #ffffff !important;
  padding-top: 1rem !important;
}
.\#cart-drawer-subtotal-item {
  background: transparent !important;
  color: #ffffff !important;
}
.\#cart-drawer-subtotal-item-title {
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               'Liberation Mono', 'Courier New', monospace !important;
  color: #ffffff !important;
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: 0.02em !important;
}
.\#cart-drawer-subtotal-item-price {
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               'Liberation Mono', 'Courier New', monospace !important;
  color: #fe8aed !important;
  font-weight: 700 !important;
}
.\#cart-drawer-subtotal-item-spacer {
  border-bottom: 1px dashed rgba(255, 255, 255, 0.25) !important;
}
.\#cart-drawer-subtotal-tax-note {
  color: rgba(255, 255, 255, 0.6) !important;
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               'Liberation Mono', 'Courier New', monospace !important;
}

/* Free shipping progress bar */
.\#cart-drawer-block .\#free-shipping-progress-bar,
.\#cart-drawer .\#free-shipping-progress-bar {
  background: rgba(255, 255, 255, 0.15) !important;
}
.\#cart-drawer-block .\#free-shipping-progress-bar-fill,
.\#cart-drawer .\#free-shipping-progress-bar-fill {
  background: var(--tbb-border-color, #9c01ff) !important;
}

/* Empty state */
.\#cart-drawer-empty {
  color: rgba(255, 255, 255, 0.85) !important;
}
.\#cart-drawer-empty .\#splash-msg,
.\#cart-drawer-empty p {
  color: rgba(255, 255, 255, 0.85) !important;
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               'Liberation Mono', 'Courier New', monospace !important;
}

/* Cart link button (if rendered as text link) */
.\#cart-drawer-cart-link {
  color: #fe8aed !important;
  text-decoration: none !important;
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               'Liberation Mono', 'Courier New', monospace !important;
  font-weight: 700 !important;
}


/* ---- GAP 7: Footer — mono typography + design system shell (global) ---- */
.\#footer .\#footer-heading,
.\#footer .heading-font,
.\#footer .\#footer-menu,
.\#footer .\#footer-menu a,
.\#footer .\#footer-menu a.reset-link,
.\#footer p,
.\#footer label,
.\#footer span,
.\#footer .form-label {
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               'Liberation Mono', 'Courier New', monospace !important;
}
.\#footer .\#footer-heading,
.\#footer h3.heading-font {
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: 0.02em !important;
}

/* Footer text + headings flipped white globally (was black on template
   pages, default-dark elsewhere — both wrong against the new dark shell). */
.\#footer,
.\#footer p,
.\#footer span,
.\#footer label,
.\#footer .form-label,
.\#footer .\#footer-menu,
.\#footer .\#footer-menu a,
.\#footer .\#footer-menu a.reset-link {
  color: rgba(255, 255, 255, 0.85) !important;
}
.\#footer .\#footer-heading,
.\#footer h2,
.\#footer h3,
.\#footer h3.heading-font,
.\#footer h4 {
  color: #ffffff !important;
}

/* Shelled footer — applied globally, not scoped to template pages. */
[id^="shopify-section-"][id*="g_footer"] > .\#section-body {
  max-width: 1240px;
  margin: 2rem auto !important;
  padding: 1.5rem 1rem !important;
  border: 4px solid var(--tbb-border-color, #9c01ff);
  border-radius: 8px;
  box-shadow: 0 0 20px var(--tbb-border-glow, rgba(156, 1, 255, 0.30));
  background: rgba(15, 15, 30, 0.95) !important;
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
  box-sizing: border-box;
}
@media (max-width: 767px) {
  [id^="shopify-section-"][id*="g_footer"] > .\#section-body {
    margin: 1.5rem 0.5rem !important;
    padding: 1rem 0.5rem !important;
  }
}

/* ---- 404 page — kill the gap below content ----
   Diffusion's <main> has min-height: 100vh to keep the footer pinned at
   the viewport bottom. On 404 the content is short and that pads out a
   large empty area between shell and footer. Drop the min-height. */
body.template--404 main,
body.template--404 .content-for-layout {
  min-height: auto !important;
}

/* ---- GAP 8: Password page (s_password.liquid → .#password) ---- */
[id^="shopify-section-"]:has(> .\#password) .\#section-body,
[id^="shopify-section-"]:has(> .\#password) > .\#password {
  max-width: 1240px;
  margin: 2rem auto !important;
  padding: 1rem;
  border: 4px solid var(--tbb-border-color, #9c01ff);
  border-radius: 8px;
  box-shadow: 0 0 20px var(--tbb-border-glow, rgba(156, 1, 255, 0.30));
  background: rgba(15, 15, 30, 0.95) !important;
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
  box-sizing: border-box;
}
[id^="shopify-section-"]:has(> .\#password) h1,
[id^="shopify-section-"]:has(> .\#password) h2,
[id^="shopify-section-"]:has(> .\#password) .\#hero-heading {
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               'Liberation Mono', 'Courier New', monospace !important;
  color: #ffffff !important;
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: 0.02em !important;
}
@media (max-width: 767px) {
  [id^="shopify-section-"]:has(> .\#password) .\#section-body,
  [id^="shopify-section-"]:has(> .\#password) > .\#password {
    margin: 1.5rem 0.5rem !important;
    padding: 0.75rem 0.5rem !important;
  }
}

/* ---- GAP 9: Customer account (s_customer-account.liquid → .#customer-account) ---- */
[id^="shopify-section-"]:has(> .\#customer-account) .\#section-body,
[id^="shopify-section-"]:has(> .\#customer-account) > .\#customer-account {
  max-width: 1240px;
  margin: 2rem auto !important;
  padding: 1rem;
  border: 4px solid var(--tbb-border-color, #9c01ff);
  border-radius: 8px;
  box-shadow: 0 0 20px var(--tbb-border-glow, rgba(156, 1, 255, 0.30));
  background: rgba(15, 15, 30, 0.95) !important;
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
  box-sizing: border-box;
}
[id^="shopify-section-"]:has(> .\#customer-account) h1,
[id^="shopify-section-"]:has(> .\#customer-account) h2,
[id^="shopify-section-"]:has(> .\#customer-account) th,
[id^="shopify-section-"]:has(> .\#customer-account) caption {
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
               'Liberation Mono', 'Courier New', monospace !important;
  color: #ffffff !important;
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: 0.02em !important;
}
@media (max-width: 767px) {
  [id^="shopify-section-"]:has(> .\#customer-account) .\#section-body,
  [id^="shopify-section-"]:has(> .\#customer-account) > .\#customer-account {
    margin: 1.5rem 0.5rem !important;
    padding: 0.75rem 0.5rem !important;
  }
}

/* ---- Footer: kill Diffusion's redundant divider + 64px padding ----
   Diffusion's stock footer (assets/footer.css line 1-5) renders with:
     padding-top: 4rem;
     border-top: 3px solid var(--border-color);
   The 64px padding was breathing room BELOW that border-line divider.
   In TBB our purple-bordered shell already provides the visual
   separation, so the Diffusion border-top + padding are now redundant
   and create the empty band complaint. Strip both. */
.\#footer {
  padding-top: 8px !important;
  border-top: none !important;
}

