/** Shopify CDN: Minification failed

Line 1984:0 Unexpected "}"

**/
/* Website fonts  */
/* L6 v2 cache-bust 2026-05-11T17:18 — drawer footer twin-button parity */

/* Body Font "Space Grotesk" */

@font-face {
    font-family: 'Space Grotesk';
    src: url('/cdn/shop/files/SpaceGrotesk-Medium.woff2?v=1772518413') format('woff2');
    font-weight: 500;
    font-style: normal;
    font-display: swap;
}

@font-face {
    font-family: 'Space Grotesk';
    src: url('/cdn/shop/files/SpaceGrotesk-SemiBold.woff2?v=1772518413') format('woff2');
    font-weight: 600;
    font-style: normal;
    font-display: swap;
}

@font-face {
    font-family: 'Space Grotesk';
    src: url('/cdn/shop/files/SpaceGrotesk-Regular.woff2?v=1772518413') format('woff2');
    font-weight: normal;
    font-style: normal;
    font-display: swap;
}

@font-face {
    font-family: 'Space Grotesk';
    src: url('/cdn/shop/files/SpaceGrotesk-Bold.woff2?v=1772518413') format('woff2');
    font-weight: bold;
    font-style: normal;
    font-display: swap;
}

@font-face {
    font-family: 'Space Grotesk';
    src: url('/cdn/shop/files/SpaceGrotesk-Light.woff2?v=1772518412') format('woff2');
    font-weight: 300;
    font-style: normal;
    font-display: swap;
}


/* Heading Font 'Inter Tight'  */

@font-face {
    font-family: 'Inter Tight';
    src: url('/cdn/shop/files/InterTight-Light.woff2?v=1772521040') format('woff2');
    font-weight: 300;
    font-style: normal;
    font-display: swap;
}

@font-face {
    font-family: 'Inter Tight';
    src: url('/cdn/shop/files/InterTight-Bold.woff2?v=1772521040') format('woff2');
    font-weight: bold;
    font-style: normal;
    font-display: swap;
}

@font-face {
    font-family: 'Inter Tight';
    src: url('/cdn/shop/files/InterTight-Regular.woff2?v=1772521040') format('woff2');
    font-weight: 400;
    font-style: normal;
    font-display: swap;
}

@font-face {
    font-family: 'Inter Tight';
    src: url('/cdn/shop/files/InterTight-Medium.woff2?v=1772521040') format('woff2');
    font-weight: 500;
    font-style: normal;
    font-display: swap;
}

@font-face {
    font-family: 'Inter Tight';
    src: url('/cdn/shop/files/InterTight-SemiBold.woff2?v=1772521175') format('woff2');
    font-weight: 600;
    font-style: normal;
    font-display: swap;
}

p{
     font-family: 'Inter Tight';
     font-weight: 400;
     letter-spacing:0px !important;
}

.announcement {
    border-radius: 0 0 10px 10px;
}

.announcement p {
    font-size: 14px;
    line-height:20px;
    font-family: 'Space Grotesk';
    letter-spacing: 0px;
    font-weight: 400;
}

.navtext {
    font-size: 14px;
    line-height: 18px;
    font-weight: bold; 
}

.navlink {
    padding: 0;
}

.header__menu__inner {
    gap: 20px;
}

.header__inner .wrapper--full {
    padding-top: 20px;
    padding-bottom: 20px;
}

/* Hide Weglot entirely — translation is disabled on this theme. We'll run our own
   translation pipeline later. The <html> and <body> carry `wg-notranslate` + `translate="no"`
   so Weglot's JS skips the whole page, but we also hide any switcher UI it tries to inject. */
.weglot-container,
#weglot-switcher-1,
.weglot_switcher,
[class^="weglot-"],
[id^="weglot-"],
[class*=" weglot-"],
.language-option.active-language {
    display: none !important;
}

/* Native language switcher alignment */

.header__desktop__bar__r {
    gap: 10px;
    align-items: center;
}

.header__desktop__bar__r .toolbar__elements {
    display: flex;
    align-items: center;
    align-self: center;
    margin: 0;
    padding: 0;
}

.header__desktop__bar__r .toolbar__elements .popout__toggle {
    display: flex;
    align-items: center;
    padding-top: 0;
    padding-bottom: 0;
    line-height: 1;
}

.header__desktop__bar__r .toolbar__elements .popout__toggle img,
.header__desktop__bar__r .toolbar__elements .popout__toggle svg {
    vertical-align: middle;
}

.header__desktop__bar__r .header__desktop__buttons {
    display: flex;
    align-items: center;
}

.header__desktop__bar__r .toolbar__elements,
.header__desktop__bar__r .header__desktop__buttons {
    margin-top: auto;
    margin-bottom: auto;
}

.theme__header {
    border: none ;
}

.tri-hero-banner .wrapper .section__inner {
    border-radius: 20px;
    overflow: hidden ;
}

/* Fix duplicate logo: pointer:coarse in theme.css shows both mobile+desktop headers.
   Let the JS class js__show__mobile control the toggle instead. */
@media (pointer: coarse) and (min-width: 480px) {
  .header__mobile {
    display: none;
  }
  .header__desktop {
    display: flex;
  }
  /* When JS determines mobile is needed, restore it */
  .js__show__mobile .header__mobile {
    display: grid;
  }
  .js__show__mobile .header__desktop {
    display: none;
  }
}

.btn.btn--large, .btn.btn--long {
    font-size: 18px;
    line-height: 22px;
    padding: 14px 25px;
    font-family: Inter Tight;
    letter-spacing: 0px !important;
    font-weight: 600;
    margin: 24px 12px 0 0;
}

.btn.btn--long{
    padding: 11px 25px !important;
    min-width:fit-content;
}

.hover__bar {
    bottom: 27px;
    background-color: rgb(34 34 34);
}

.hero__title p {
    font-size: 50px;
    line-height: 56px;
    letter-spacing: -1px !important;
    color: #fff;
}

.header__desktop__buttons {
    display: flex;
    gap: 10px;
}

/* A mirror, reimagined. */

.tri-a-mirror .brick__section {
    background: #222222;
    padding: 75px;
    border-radius: 20px;
}

.tri-a-mirror ul {
    margin: 30px 0px !important;
    padding: 10px;
    list-style: none !important;
    border-left: 2px solid #fff;
    font-size: 16px;
    letter-spacing: 0;
    font-style: normal;
    line-height: 20px;
}

.tri-a-mirror .btn.btn--long{
    margin:0px;
}

.tri-a-mirror .standard__heading {
    background: linear-gradient(90deg, #fff, #999);
    background-clip: text;
    -webkit-background-clip: text;
    color: transparent;
    font-size: 40px;
    line-height: 51px;
    letter-spacing: -.75px;
    margin-bottom: 20px;
    font-family: 'Space Grotesk';
}

.tri-a-mirror  p {
    font-size: 20px;
    line-height: 28px;
}

.tri-a-mirror .image__hero__frame {
    border-radius: 10px;
}


/* Collection Grid Css  */

.tri-collection-grid {
  display: grid !important;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: 220px 210px 220px; 
  gap: 20px;
  max-width: 100% !important;
  margin: 0 auto;
}

.tri-collection-grid .grid__item {
  background: #eee;
  border-radius: 8px;
  overflow: hidden;
}

.tri-collection-grid .grid__item:nth-child(1) {
  grid-column: 1 / 3;
  grid-row: 1 / 3; 
}


.tri-collection-grid .grid__item:nth-child(1) .image__hero__frame, .tri-collection-grid .grid__item:nth-child(2) .image__hero__frame, .tri-collection-grid .grid__item:nth-child(3) .image__hero__frame, .tri-collection-grid .grid__item:nth-child(4) .image__hero__frame {
    aspect-ratio: 690 / 450;
    padding: 0px;
    height: 100% !important;
    width:100% ;
}

.tri-collection-grid .grid__item:nth-child(2) {
  grid-column: 3 / 4;
  grid-row: 1 / 2;
}

.tri-collection-grid .grid__item:nth-child(3) {
  grid-column: 4 / 5;
  grid-row: 1 / 2;
}

.tri-collection-grid .grid__item:nth-child(4) {
  grid-column: 3 / 5; 
  grid-row: 2 / 4;
}

.tri-collection-grid .grid__item:nth-child(5) {
  grid-column: 1 / 3;
  grid-row: 3 / 4;
}

.tri-collection-grid .grid__item:nth-child(5) .collection-grid-item__title {
    max-width: 400px;
    padding-top :24px;
}

.tri-collection-grid .grid__item:nth-child(5) .collection-grid-item__subtitle {
    background: #fff;
    position: relative;
    top: 0;
    right: 0;
}

.tri-collection-grid .collection-grid-item__subtitle {
    right: inherit;
}

.tri-collection-grid .grid__item:nth-child(5) .hero__content__wrapper {
    justify-content: center !important;
}

.tri-collection-grid .grid__item:nth-child(5) .collection-grid-item__btn {
    background: #222;
    color: #fff;
}

.tri-collection-grid .grid__item:nth-child(5) .text-btn-arrow-right:after {
    background-image: url(/cdn/shop/files/arrow-wht.svg?v=1772537386);
}


.tri-collection-grid .grid__item {
    width: 100% !important;
    margin: 0 !important;
    padding: 0px !important;
}

.tri-collection-grid .collection-grid-item {
    height: 100%;
}

.tri-collection-grid .collection-grid-item__title {
    font-weight: 600 !important;
    font-size: 24px;
    line-height: 30px;
    letter-spacing: -.75px !important;
    font-family: Space Grotesk;
    text-transform: uppercase;
    text-align: left;
    padding-bottom:15px;
}

.tri-collection-grid .hero__content__wrapper {
    justify-content: flex-end !important;
}


.tri-collection-grid .collection-grid-item__btn {
    width: fit-content;
    padding: 9px 48px 9px 20px;
    background: #fff;
    color: #222222;
    border-radius: 50px;
    font-size: 16px;
    font-family: 'Inter Tight';
    line-height: 19px;
    text-transform: capitalize;
}



.tri-collection-grid .text-btn-arrow-right:after  {
    width: 18px;
    height: 18px;
    background-image: url(/cdn/shop/files/btn-arrow.svg?v=1772536285);
    right: 20px;
}


.tri-designed-for .column__image > div {
    aspect-ratio: 40 / 25;
    border-radius: 10px;
    
}

.tri-designed-for .index__column {
    padding-bottom: 0px !important;
    position: relative;
}

.tri-designed-for .column__content {
    position: absolute;
    bottom: 20px;
    left: 25px;
    width: calc(100% - 35px);
    text-align: left;
    color: #fff;
}

.tri-designed-for .column__content .accent-title-large {
    font-size: 24px;
    line-height: 30px;
    letter-spacing: -.75px;
    font-family: 'Space Grotesk';
    text-transform: uppercase;
    margin-bottom: 8px;
}

.tri-designed-for .column__content p {
    font-size: 14px;
    line-height: 20px;
    letter-spacing: 0;
    font-family: 'Inter Tight';
}

.tri-designed-for .column__image{
    margin:0px !important;
}

.tri-designed-for .column-wrapper {
    padding: 100px 83px;
    background: #F4F4F4;
    border-radius: 20px;
}

/* ============================================================
   Image gradient overlays (per-block setting on Text columns
   with images). Used when text is overlaid on a photo and the
   bright sky / high-key image kills contrast — see the
   .tri-designed-for "Awareness / Confidence / Freedom" cards.
   ============================================================ */
.column__image .has-gradient-soft,
.column__image .has-gradient-dark {
  position: relative;
}
.column__image .has-gradient-soft::after,
.column__image .has-gradient-dark::after {
  content: '';
  position: absolute;
  inset: 0;
  border-radius: inherit;
  pointer-events: none;
}
.column__image .has-gradient-soft::after {
  background: linear-gradient(to top, rgba(0, 0, 0, 0.50) 0%, rgba(0, 0, 0, 0) 55%);
}
.column__image .has-gradient-dark::after {
  background: linear-gradient(to top, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0) 65%);
}
/* Keep the overlaid title above the gradient layer */
.tri-designed-for .index__column .column__content { z-index: 2; }

/* Section-logos title — bigger, heavier than the default tiny kicker
   so the heading carries equal visual weight to the logos below it
   (otherwise an awards strip with a small italic title looks bottom-heavy). */
.section-logos h2.kicker-flourished {
  font-size: 28px;
  line-height: 1.15;
  letter-spacing: -0.5px;
  font-weight: 700;
  text-transform: uppercase;
  font-family: 'Space Grotesk', sans-serif;
  font-style: normal;
  color: #222;
  text-align: center;
  margin-bottom: 28px;
}
.section-logos h2.kicker-flourished::after {
  display: none;
}

/* Hero image: prevent the "loads small first, then expands" effect.
   The Pipeline image element has `transition: all` (default — touches
   width/height/opacity etc.). When the responsive `srcset` resolves
   from a smaller candidate to a larger one as the browser figures out
   the layout width, the transition animates the size change — looking
   like the image grows on load. Killing the transition on hero images
   makes the load feel instant.

   Also locks the image to fill its scale container at 100% from the
   first paint so any pre-layout width settling doesn't cascade into
   a visible scale change. Scoped to `.tri-hero-banner` so it doesn't
   affect other heroes that might rely on the transition (e.g. for
   intentional fade-in effects). */
.tri-hero-banner .image__hero__frame,
.tri-hero-banner .image__hero__pane,
.tri-hero-banner .image__hero__scale {
  min-height: 100%;
  transition: none !important;
}
/* The Pipeline `singles()` function in theme.js (line ~210) runs after
   content loads and sets `min-height: calc({tallest+padding}px + var(--menu-height))`
   inline on the section and image frame. On desktop this resolves to
   ~661px (vs the height-class's 66vh = ~600px), so the frame appears
   to "expand" by ~60px when JS runs.

   Strategy: pre-seed the expected post-JS height in CSS so the INITIAL
   paint already matches. JS-set min-height then either matches or comes
   in slightly smaller (no-op) — no visible expansion either way.

   IMPORTANT: scope this to desktop. On mobile, the content stack is
   shorter (text wraps differently, awards image is capped at 220px) so
   the JS-computed min-height is much smaller (~470px). If we apply the
   desktop pre-seed on mobile, the hero loads taller than it should and
   then SHRINKS when JS runs — the same CLS, mirrored. */
@media (min-width: 768px) {
  .tri-hero-banner.js-overflow-container,
  .tri-hero-banner [data-overflow-background] {
    min-height: calc(540px + var(--menu-height, 78px));
  }
}
/* Mobile pre-seed: the hero's `.use_pixels_650` rule from this file sets
   the frame to 450px on mobile, but the heading wraps to many lines on
   narrow viewports so the content stack ends up taller than 450px. The
   Pipeline `singles()` JS then bumps min-height after first paint — the
   user sees the hero load short then jump tall. Pre-seeding the visible
   viewport height (svh excludes browser UI chrome) keeps initial paint
   matched to the post-JS state. !important overrides JS's inline value. */
@media (max-width: 767px) {
  .tri-hero-banner.js-overflow-container,
  .tri-hero-banner [data-overflow-background] {
    min-height: calc(100svh - var(--menu-height, 78px)) !important;
  }
  .tri-hero-banner .image__hero__frame[class*="use_pixels_"] {
    height: calc(100svh - var(--menu-height, 78px));
  }
}
/* When the hero uses a fixed-height utility (use_screen_*, use_pixels_*),
   force `aspect-ratio: auto` so the height class wins immediately on first
   paint. Otherwise Tailwind's `aspect-[--wh-ratio]` competes with the height
   class — whichever loses gets *animated* into the winner because the
   theme's default `transition: all` is on these elements. That animation
   IS the "loads smaller first then expands" desktop CLS. */
.tri-hero-banner .image__hero__frame[class*="use_screen_"],
.tri-hero-banner .image__hero__frame[class*="use_pixels_"] {
  aspect-ratio: auto !important;
}
/* The `image` snippet adds an extra inner wrapper around the IMG with
   classes `relative block w-full h-full overflow-hidden aspect-[--wh-ratio]`.
   Pipeline's default `transition: all` on this wrapper means a late-loading
   sibling (e.g. the awards img inside the hero) reflowing the hero text
   stack triggers a frame-size animation on the hero image wrapper. Kill
   transitions on EVERY descendant of the scale element to prevent this. */
.tri-hero-banner .image__hero__scale,
.tri-hero-banner .image__hero__scale * {
  transition: none !important;
}
/* Also kill transition on the inner aspect-ratio wrapper around the IMG
   so the hero image's effective box doesn't animate when the awards img
   below loads (which can trigger a layout pass on the hero text stack). */
.tri-hero-banner .image__hero__scale > [class*="aspect-["] {
  aspect-ratio: auto !important;
}
.tri-hero-banner .image__hero__scale img {
  width: 100% !important;
  height: 100% !important;
  object-fit: cover;
  transition: none !important;
}
/* Awards image inside hero blocks: same load-time animation issue.
   The image snippet sets HTML width/height attrs to a default 600×200
   while the actual asset is 320×106 — the browser allocates the larger
   box first, then the CSS width:320px wrapper + object-fit kicks in,
   and `transition: all` animates the box collapse. Lock it. */
.tri-text-banner .standard__image,
.tri-text-banner .standard__image *,
.tri-text-banner .standard__image img {
  transition: none !important;
}

/* Hide Judge.me's medals/badges row site-wide.
   The medals strip (Verified Reviews, Monthly Record, Bronze
   Authenticity, etc.) was visually noisy: 6 laurel-wreath badges
   with mixed micro-typography, two of them with oversized count
   numbers (870, 57) that dropped out of the wreath at 3-4× the
   badge text. Trust signal job is already covered by the hero
   rating chip (★4.79 · 1,002 reviews) + customer photo grid +
   per-review widget below. The medals were a third repetition
   without adding meaning. */
.jdgm-medals-wrapper,
.jdgm-medals {
  display: none !important;
}

/* Hero-embedded awards strip — mobile sizing tweak.
   The Liquid image block uses `image_max_limit: 320` which is the
   right size for a desktop hero (`.standard__image` style="width:
   320px"). On a phone viewport the content area is ~334px wide, so
   320px = essentially full-bleed and the awards read as a banner
   image rather than a small credential badge. Capping to 220px on
   narrow viewports gives the badge breathing room above the CTAs.
   Targeting `.tri-text-banner .standard__image` so this only
   applies to the cycling/homepage-style hero, not other heroes. */
@media (max-width: 680px) {
  .tri-text-banner .standard__image {
    max-width: 220px !important;
    margin-top: 10px !important;
  }
}

/* Logo-bar block image inversion — used when a white-on-transparent
   logo (e.g. the existing Awards strip designed for the dark footer)
   needs to be rendered on a light section background.

   The `!important` on opacity overrides the theme's lazy-load
   `.transition-opacity` initial state, which never resolves to opacity
   1 for images that render with a CSS filter (the filter changes the
   compositor path and the load handler that flips opacity doesn't
   fire). Without this override the logos render as a flat gray block.

   GPU layer promotion (`transform: translateZ(0)` + `will-change: filter`)
   isolates the filter into its own composite layer so it's rasterized
   once instead of on every scroll paint — without it, the filter re-runs
   on every frame during scroll and causes scroll jank on long pages. */
/* Hero rating chip — clickable link to the reviews section. We
   don't want the harsh default underline (heavy on a hero), so we
   use a subtle dotted underline that sharpens on hover. */
.section-hero a[href="#reviews"],
[data-section-type*="hero"] a[href="#reviews"] {
  color: inherit;
  text-decoration: none;
  border-bottom: 1px dotted rgba(255, 255, 255, 0.5);
  padding-bottom: 1px;
  transition: border-color 0.15s ease;
  cursor: pointer;
}
.section-hero a[href="#reviews"]:hover,
[data-section-type*="hero"] a[href="#reviews"]:hover {
  border-bottom-color: rgba(255, 255, 255, 1);
}

.logo-bar__item--invert img {
  filter: invert(1) brightness(0.85) contrast(1.1);
  opacity: 1 !important;
  transform: translateZ(0);
  will-change: filter;
  backface-visibility: hidden;
  /* Hint to the browser to use a sharper interpolation when scaling
     the image down on mobile (the awards strip is laid out at native
     600px and resamples down to viewport width on phones). */
  image-rendering: -webkit-optimize-contrast;
}

/* Section-logos subtitle — small caption line under the logo strip. */
.section-logos__subtitle {
  text-align: center;
  font-size: 12px;
  letter-spacing: 0.4px;
  color: #666;
  margin: 18px auto 0;
  max-width: 720px;
  line-height: 1.5;
  padding: 0 16px;
}

/* Mobile sizing for the awards strip: the block.width setting clamps the
   max width on desktop, but mobile viewports are narrower than that
   value — let the image scale down to viewport width with margin. */
@media (max-width: 640px) {
  .logo-bar__item--invert {
    --width: 100% !important;
    width: 100% !important;
    max-width: 100%;
    padding: 0 16px;
    box-sizing: border-box;
  }
  .logo-bar__item--invert img {
    width: 100% !important;
    height: auto !important;
    max-width: 100% !important;
    max-height: none !important;
  }
  /* Center the single logo block on mobile (default flex layout in the
     theme can left-align unless we tell it otherwise) */
  .section-logos .logo-bar {
    justify-content: center;
  }
  .section-logos h2.kicker-flourished {
    font-size: 22px;
    margin-bottom: 18px;
    padding: 0 16px;
  }
  .section-logos__subtitle {
    font-size: 11px;
    margin-top: 14px;
  }
}

.tri-three-collection .collection-grid-item .image__hero__frame {
    padding-top: 110%;
    aspect-ratio: 454 / 500;
    border-radius: 10px;
}

.collection-grid-item {
    border-radius: 10px;
}

.tri-three-collection p.collection-grid-item__title {
    max-width: 420px;
    font-weight: 600;
    font-size: 40px;
    line-height: 51px;
    letter-spacing: -.75px !important;
    font-family: Space Grotesk;
    text-transform: uppercase;
    text-align: left;
    padding-top: 52px;
}

.collection-grid-item__btn {
    font-weight: 600;
    font-size: 18px;
    line-height: 24px;
    letter-spacing: -.75px !important;
    font-family: Space Grotesk;
    text-transform: uppercase;
    text-align: left;
    width: 100%;
    padding-right: 20px;
    transform: translateY(0);
    opacity: 1;
}

.collection-grid-item__subtitle {
    text-transform: uppercase;
    font-family: 'Inter Tight' !important;
    font-weight: 500 !important;
    font-size: 14px;
    line-height: 17px;
    padding: 4px 10px;
    border-radius: 50px;
    background: rgb(34 34 34 / 80%);
    width: fit-content;
    position: absolute;
    top: 20px;
    right: 20px;
    transform: translateY(0);
    opacity: 1;
}

.align-space-between-vertical {
    align-items: flex-start;
}

.text-btn-arrow-right:after {
    content: "";
    width: 19px;
    height: 19px;
    border-width: 0px !important;
    background-image: url(/cdn/shop/files/Vector.svg?v=1772533228);
}


.section-heading .kicker-flourished, .try-tech-section .standard__heading p, .image-with-txt-collection h2 {
    font-size: 40px;
    line-height: 51px;
    letter-spacing: -1px !important;
    color: #222;
    text-transform: uppercase;
    font-weight: 700;
    font-family: 'Space Grotesk';
    margin: 0px;
    padding-bottom: 10px;
}

.section-heading .kicker-flourished:after {
    display:none;
}

.subheading, .try-tech-section .rte p{
    text-align: center;
    font-size: 18px;
    line-height: 25px;
    font-weight: 400;
}

.section-heading {
    margin-bottom: 40px;
}

.tri-wherever-you-go .align-space-between-vertical {
    justify-content: flex-end;
}

.tri-wherever-you-go .image__hero__frame {
    aspect-ratio: 335 / 400;
}



/* -------- */
.section-icons .icon__column__icon{
    width:50px;
    height:50px;
}

.section-icons .icon__column__heading {
    font-weight: 700 !important;
    font-size: 18px;
    line-height: 24px;
    letter-spacing: -.75px !important;
    font-family: Space Grotesk;
    text-transform: uppercase;
}

.section-icons .icon__column__text .rte p {
    font-size: 14px;
    line-height: 18px;
    font-weight: 400;
    color: #222 !important;
}

.section-icons .grid__item.medium-up--one-third {
    max-width: 345px;
    width: 100% !important;
}

.section-icons .float-grid {
    max-width: 1252px;
    width: 100%;
    margin: 0 auto;
    display: flex;
    justify-content: space-between;
}

.section-icons .float-grid:after{
    display:none;
}

/* ---  */
footer.footer {
    border-radius: 20px 20px 0 0;
}

/* 2026-05-11 (L40b): square the footer top corners when the page ends
   on the dark-mode community-reviews block. The 20px rounded white
   corners look like they're cut OUT of the dark backdrop above —
   visually jarring at the seam between sections. `:has()` is supported
   across all evergreen browsers (Chrome 105+ / Safari 15.4+ / FF 121+);
   no fallback needed for the Pipeline-base evergreen audience.

   Scope: only when the FULL variant of community-reviews is present
   (homepage, the 4 sport landing pages, all_reviews). Product pages
   use the LITE variant which is light-mode and doesn't have this
   visual seam problem. */
body:has(.community-reviews.community-reviews--full) footer.footer {
    border-radius: 0;
}

    .footer__container {
        max-width: 1252px;
        margin: 0 auto;
    }

.shopify-section-group-group-footer .section-padding.wrapper {
    max-width: 1252px;
    margin: 0 auto;
    border-top: 1px solid rgb(255 255 255 / 20%);
}

.footer__newsletter__body {
    padding: 0px !important;
}

.footer__newsletter h3, .footer__title {
    font-size: 18px;
    line-height: 24px;
    font-family: 'Space Grotesk';
    letter-spacing: 0px;
    color: #fff;
    text-transform: uppercase;
}

.footer__column .rte p {
    font-size: 14px;
    line-height: 18px;
}

.footer__column .rte {
    margin: 30px 0;
}

.footer__newsletter h3 {
    margin: 0px;
}

.footer__newsletter .rte {
    margin: 20px 0;
}

.footer__aside {
    display: flex;
    flex: 0 0 360px !important;
    max-width: 360px !important;
    margin-left: 80px !important;
    padding: 80px 0 !important;
    align-items: flex-start;
}

.newsletter-block .input-group--inner-button {
    background: #ffffff1a;
    border-radius: 50px;
    border: none !important;
    padding: 7px 7px 7px 20px;
}

.input-group-button button {
    background: #fff;
    color: #222 !important;
    padding: 11px 25px !important;
    border-radius: 50px;
    font-size: 16px;
    line-height: 20px;
    font-weight: 500;
    letter-spacing: 0px;
}



.footer__content__inner .float-grid {
    display: grid !important;
    grid-template-columns: 310px 220px 220px;
    align-items: start;
    row-gap: 0;
    column-gap: 80px;
    width: 100%;
}

.footer__content__inner .float-grid .grid__item:nth-child(1) {
  grid-column: 1 / 2;
  grid-row: 1 / 2;
}

.footer__content__inner .float-grid .grid__item:nth-child(2) {
  grid-column: 2 / 3;
  grid-row: 1 / 2;
}


.footer__content__inner .float-grid .grid__item:nth-child(3) {
  grid-column: 3 / 4;
  grid-row: 1 / 2;
}


.footer__content__inner .float-grid .grid__item:last-child {
    grid-column: 3 / 4;
    grid-row: 2 / 3;
    margin-top: -40px;
}

.footer__content__inner .medium-up--one-half {
    width: 100%;
    padding: 0px !important;
}

.footer__quicklinks a {
    font-size: 14px;
    line-height: 17px;
    font-family: 'Inter Tight';
    font-weight: 300;
}

span.subfooter__copyright {
    font-size: 14px;
    line-height: 17px;
    font-family: Inter Tight;
    font-weight: 300;
}

.footer__icon--social {
    margin: 0px !important;
}


/* Specification Css  */
.specifations-wrapper .lens-grid {
    display: flex;
    gap: 50px;
    align-items: flex-start;
}

.try-specifications-section .column-wrapper {
    padding: 100px 74px;
    background: #2222220d;
    border-radius: 20px;
}

.specifations-wrapper .lens-grid > div {
    flex: 1;
}












@media (max-width: 768px) {
  .float-grid {
    grid-template-columns: 1fr;
    text-align: center;
  }
}




/* Product Page Css  */

    .product-single .product__inner {
        max-width: 100% !important;
    }

.product__icon-item {
    display: flex;
    align-items: center;
    gap: 7px;
    padding: 10px;
    border-radius: 5px;
    background: rgb(0 0 0 / 5%);
    flex:1;
}

.product__icon-item p {
    font-size: 12px;
    line-height: 16px;
    letter-spacing: 0px;
}

.product__icon-item .icon-holder {
    max-width: 16px;
}

/* Reserve 16x16 for icon-list icons to prevent CLS lower down on the
   product page when lazy-loaded images resolve during scroll. The
   image.liquid snippet only reserves aspect-ratio when wh_ratio is
   passed, and the icon_list block at sections/product.liquid:449
   doesn't pass it. Without reserved space, each icon wrapper is 0x0
   until the <img> loads, then jumps to 16px — shifting everything
   below. Diagnosed via Playwright WebKit run showing height change
   59->75 on .product__icon-list during scroll phases. */
.product__icon-item .icon-holder,
.product__icon-item .icon-holder > *,
.product__icon-item .icon-holder img,
.product__icon-item .icon-holder svg {
    width: 16px;
    height: 16px;
    flex-shrink: 0;
}

.product__icon-list {
    display: flex;
    align-items: center;
    gap: 10px;
    margin-bottom: 20px;
}

.product__block__description button.accordion__title {
    font-size: 14px !important;
    line-height: 18px !important;
    letter-spacing: 0px;
    font-family: Space Grotesk;
    text-transform: uppercase;
}

.product__inner .shopify-product-form {
    max-width: 100% !important;
}

a#more-payment-options-link {
    display: none;
}

.btn--add-to-cart {
    border-radius: 10px;
    font-size: 18px;
    line-height: 20px;
    font-family: 'Inter Tight';
    margin-bottom:12px;
    /* 2026-05-19 (v24) — solid black with white text. CRO best practice
       for primary CTAs: high-contrast solid color beats outline (~10-20%
       conversion lift per Baymard's PDP tests). Black fits TriEye's
       monochrome brand identity. */
    background: #111 !important;
    color: #fff !important;
    border: 1.5px solid #111 !important;
    font-weight: 700 !important;
}
.btn--add-to-cart:hover,
.btn--add-to-cart:focus-visible {
    background: #000 !important;
    border-color: #000 !important;
    color: #fff !important;
}

input.quantity__input {
    border-radius: 10px;
    font-weight: 700 !important;
}

.product__block__quantity {
    display: flex;
    align-items: center;
    justify-content: flex-start;
    margin-top: 20px;
    /* 2026-05-19 (cart-CRO): tighter — quantity sits inline next to ATC now,
       so we don't need flex space-between (the Judge.me PNG that lived in
       that empty space has been removed). */
}

/* 2026-05-19 (cart-CRO) — quantity stepper + Add-to-Cart on the same row.
   product-buttons.liquid wraps the button in [data-atc-row] and a small
   JS reparents the .product__block__quantity into that row. Once moved,
   we just need flex-row CSS on the row and a fixed-width treatment on
   the quantity stepper. The (now empty) original .product__block__quantity
   block outside the row gets hidden via :has() — if it still contains the
   stepper we leave it visible (fallback for browsers without :has() ). */

/* 2026-05-19 (v24) — Grid layout for qty + ATC with explicit 60px row.
   Strengthened by also forcing height on internal children (quantity
   stepper input + buttons, plus the .quantity__wrapper) so they can't
   collapse smaller than 60px. The :empty fallback rule hides the
   originally-rendered qty block left behind after JS reparenting. */
.product__submit__row {
  display: grid;
  grid-template-columns: 120px 1fr;
  grid-auto-rows: 60px;
  gap: 10px;
  width: 100%;
  align-items: stretch;
}
.product__submit__row > * {
  height: 60px !important;
  min-height: 60px !important;
  max-height: 60px !important;
  box-sizing: border-box !important;
}
.product__submit__row .product__block__quantity {
  margin: 0;
  display: flex;
  align-items: stretch;
  justify-content: stretch;
}
.product__submit__row .quantity__wrapper {
  width: 100%;
  height: 60px;
  min-height: 60px;
  max-height: 60px;
  box-sizing: border-box;
  display: flex;
  align-items: center;
}
.product__submit__row .quantity__wrapper input.quantity__input,
.product__submit__row .quantity__wrapper button.quantity__button {
  height: 100%;
  box-sizing: border-box;
}
.product__submit__row .btn--add-to-cart {
  margin-bottom: 0 !important;
  padding-top: 0;
  padding-bottom: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  /* 2026-05-19 (v37) — force the button text to stay on ONE line, even
     when "Add to Cart · NOK 1,056.00" gets long. The default flex wrap
     was breaking "Add to Cart" onto two lines on narrow viewports. */
  white-space: nowrap;
  overflow: hidden;
}
.product__submit__row .btn--add-to-cart .btn-state-ready,
.product__submit__row .btn--add-to-cart [data-add-to-cart-text],
.product__submit__row .btn--add-to-cart [data-button-price] {
  white-space: nowrap;
}
.product__submit__row .btn--add-to-cart .btn-state-ready {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  white-space: nowrap;
}
/* On narrow viewports, drop the font a touch so the long currency strings
   ("NOK 1,056.00") still fit on one line alongside "Add to Cart". */
@media (max-width: 480px) {
  .product__submit__row .btn--add-to-cart {
    font-size: 15px;
  }
}
@media (max-width: 380px) {
  .product__submit__row .btn--add-to-cart {
    font-size: 14px;
  }
}

/* Hide the original empty .product__block__quantity wrapper that's left
   behind after JS reparenting. */
.product__inner > .product__block__quantity:empty,
.product__block__quantity:not(:has(.quantity__wrapper)) {
  display: none !important;
}

/* Mobile: tighter quantity column */
@media (max-width: 480px) {
  .product__submit__row { gap: 8px; }
  .product__submit__row .product__block__quantity { width: 108px; }
}

/* Trust signals block below the ATC button — spacing + alignment. */
.product__submit__trust {
  margin-top: 18px;
  width: 100%;
  display: block;
  /* 2026-05-19 (v20) — defensive overflow protection so the strip can't
     escape its container width when the parent has unexpected constraints. */
  max-width: 100%;
  box-sizing: border-box;
  overflow-wrap: break-word;
}
.product__submit__trust .cart-trust-strip {
  margin: 0 0 4px;
  max-width: 100%;
  box-sizing: border-box;
}

/* 2026-05-19 (v20) — Defensive containment so the trust strip can't
   overflow its parent on narrow viewports.
   2026-05-20 cleanup — Dropped .pdp-social-proof selectors. The snippet
   pdp-social-proof.liquid was superseded by pdp-cart-area (v63) and
   has been deleted; the selectors no longer match any element. */
.cart-trust-strip,
.cart-drawer-trust-strip-wrap {
  max-width: 100%;
  box-sizing: border-box;
  overflow: hidden;
}
.cart-trust-strip__item {
  min-width: 0;       /* allow children to shrink past content width */
  overflow-wrap: anywhere;
}
/* Trust strip: at iPhone-and-narrower widths the three items ("4.9 (756)",
   "50+ countries", "30-day hassle-free returns") don't all fit on one line.
   Wrap to two rows instead of truncating the third item.
   2026-05-19 (v22) — bumped breakpoint from 380px → 520px after seeing
   "30-day hassle-free retur..." cut off on a 414px iPhone. */
@media (max-width: 520px) {
  .cart-trust-strip {
    flex-wrap: wrap;
    justify-content: center;
    row-gap: 6px;
    column-gap: 12px;
  }
  .cart-trust-strip__item { white-space: normal; }
  /* Override the v20 overflow:hidden so wrap can actually work — hidden
     was preventing the second row from being visible. */
  .cart-trust-strip { overflow: visible !important; }
}

.product__submit__quick .shopify-payment-button, .product__submit__quick .shopify-payment-button shopify-accelerated-checkout {
    border-radius: 10px;
    overflow: hidden;
    margin: 0px !important;
}


.media__thumb:after {
    display:none;
}



.media__thumb img {
    border-radius: 5px;
}

.media__thumb.is-activated img {
    border: 1px solid #222;
}

.product__grid.product__grid--slides {
    border-radius:10px;
    overflow:hidden;
}

h1.product__title {
    font-size: 30px;
    line-height: 38px;
    letter-spacing: -1px !important;
    color: #222;
    text-transform: uppercase;
    font-family: Space Grotesk;
}

.title-price-wrapper {
    display: flex;
    align-items: center;
    justify-content: space-between;
}

.tri-text-banner .hero__title p {
    font-size: 40px;
    line-height: 51px;
    letter-spacing: -1px !important;
}

.tri-text-banner .hero__description p {
    font-size: 20px;
    line-height: 28px;
    font-weight: 300;
    max-width: 512px;
}

.tri-text-banner .section__inner:after {
    content: '';
    position: absolute;
    top: 0;
    left: 0px;
    width: 100%;
    height: 100%;
    background: linear-gradient(90deg, rgba(32, 32, 32, 1) 0%, rgba(32, 32, 32, 0.1) 40%);
}

.tri-text-banner .hero__content {
    padding: 50px 83px;
    margin: 0px !important;
}

.tri-text-banner .hero__description {
    margin-top: 20px !important;
}

.tri-text-banner .standard__image {
    margin: 0px;
}

.tech-features {
    display: flex;
    gap: 20px;
    justify-content: center;
    flex-wrap: wrap;
    margin-top: 40px;
}

.tech-feature {
    max-width: calc(100% / 4 - 15px);
    width: 100%;
    border-radius: 5px;
    background: #fff;
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 15px;
    border: 1px solid rgb(34 34 34 / 10%);
}

img.tech-feature-icon {
    width: 30px;
    height: 30px;
}

.tech-feature-text {
    font-size: 18px;
    line-height: 24px;
    letter-spacing: -1px !important;
    color: #222;
    text-transform: uppercase;
    font-family: Space Grotesk;
    font-weight: 700;
}


.innovation-card {
    aspect-ratio: 40 / 45;
    width: 100%;
    height: 100%;
    border-radius: 10px;
    overflow: hidden;
    position: relative;
}

.innovation-content {
    position: absolute;
    bottom: 0;
    left: 0px;
    padding: 20px;
    color: #fff;
}

.innovation-content h3 {
    font-size: 24px;
    line-height: 31px;
    letter-spacing: -1px !important;
    text-transform: uppercase;
    font-weight: 700;
    font-family: Space Grotesk;
    margin-bottom: 15px;
}

.innovation-content p {
    font-size: 18px;
    line-height: 26px;
}

.innovation-overlay {
    background: linear-gradient(0deg, #222222, #22222200 100%);
    position: absolute;
    bottom: 0;
    left: 0;
    width: 100%;
    height: 100%;
}

.try-innovation-section .column-wrapper {
    padding: 100px 74px;
    background: rgb(34 34 34 / 5%);
    border-radius: 20px 20px 0 0;
}

.try-tech-section .container-layout{
        padding: 0 74px 100px 74px;
    background: rgb(34 34 34 / 5%);
    border-radius: 0 0 20px 20px;
}

/* } */

/* Weglot switcher list styles removed */



/* Lense Slider CSS Start */
#sync1 .item {
    padding: 40px 0 0 0;
    margin: 0;
    color: #fff;
    border-radius: 0;
    text-align: center;
}

#sync2 .item {
    padding: 0px;
    margin: 0;
    color: #fff;
    text-align: center;
    cursor: pointer;
    width: 45px;
    height: 45px;
    border-radius: 50px;
    position: relative;
}

#sync2 .item h1 {
  font-size: 18px;
}

#sync2 .current .item {
  background: #0c83e7;
}

/* Owl Nav Reset */
.owl-theme .owl-nav [class*='owl-'] {
  transition: all .3s ease;
}

.owl-theme .owl-nav [class*='owl-'].disabled:hover {
  background-color: #D6D6D6;
}

/* Arrows for first carousel */
#sync1.owl-theme {
  position: relative;
}

#sync1.owl-theme .owl-next, .innovation-cards .owl-next,
#sync1.owl-theme .owl-prev, .innovation-cards .owl-prev {
  width: 22px;
  height: 40px;
  margin-top: -20px;
  position: absolute;
  top: 50%;
}

#sync1.owl-theme .owl-prev {
  left: -75px;
}

#sync1.owl-theme .owl-next {
    right: -75px;
}


.innovation-cards .owl-prev {
  left: -60px;
}

.innovation-cards .owl-next {
    right: -60px;
}


.tri-leans-slider .lens-grid {
    display: flex;
    gap: 15px;
    align-items: flex-start;
}

.tri-leans-slider .lens-content {
    max-width: 33%;
    width: 100%;
}

.lens-image img {
    width: 100%;
    height: 100% !important;
    object-fit: cover !important;
}

.image-tags span>span, .lens-badge {
    font-size: 12px;
    background: #222c;
    padding: 5px 15px;
    border-radius: 30px;
    display: inline-block;
    line-height: 16px;
    color: #fff;
    font-family: Inter Tight;
    text-transform: uppercase;
    letter-spacing: 0.25px;
}

.card-content {
    text-align: left;
    padding: 20px;
}

.image-tags {
    display: flex;
    position: absolute;
    bottom: 32px;
    width: 100%;
    display: flex;
    align-items: center;
    justify-content: space-evenly;
    z-index: 2;
}

.lens-image {
    border-radius : 10px;
    overflow: hidden;
    flex: 1;
    position: relative;
}

.image-tags > span {
    flex: 1;
}

.tri-leans-slider .lens-image:after {
    content: '';
    width: 50%;
    background: rgb(34 34 34 / 20%);
    height: 100%;
    position: absolute;
    top: 0;
    right: 0;
    z-index: 1;
}

.lens-content img {
    aspect-ratio: 400 / 230;
    border-radius: 10px;
    overflow: hidden;
    object-fit: cover;
}

.lens-content h3 {
    font-size: 24px;
    line-height: 31px;
    letter-spacing: -1px !important;
    color: #222;
    text-transform: uppercase;
    font-weight: 700;
    font-family: Space Grotesk;
    margin: 0;
    text-align: left;
    padding:15px 0 ;
}

.lens-content p {
    font-size: 18px;
    line-height: 25px;
    font-weight: 400;
    color: #222;
    text-align: left;
}

.lens-thumb, .lens-dot {
    height: 100%;
    width: 100%;
    display: block;
    border-radius: 50px;
}

.tri-leans-thumbnail .owl-item {
    width: 45px !important;
    cursor:pointer;
}

.tri-leans-thumbnail .owl-item:after {
    content: '';
    position: absolute;
    width: 55px;
    height: 55px;
    border: 2px solid transparent;
    top: -5px;
    left: -5px;
    border-radius: 50px;
    opacity: 1;
    /* No transition — Owl Carousel's transform on .owl-item fights with
       pseudo-element transitions and keeps border-color stuck at the start
       state. Snap-change is fine here. (2026-05-01) */
}

.tri-leans-thumbnail .owl-item.current:after{
    border-color: #ff5000;
}

.tri-leans-thumbnail .owl-stage {
    margin: 0 auto;
    display: flex;
    align-items: center;
    gap: 20px;
    justify-content: center;
    padding: 10px 0;
}

/* Gap between Full Sun lenses and the Variable (photochromic) group.
   The first Variable item that FOLLOWS a non-Variable item gets the
   margin — this correctly creates a single visual break regardless of
   how many Variable lenses exist. Falls back to nothing in browsers
   without :has() support (Chromium <105, Safari <15.4, Firefox <121). */
.tri-leans-thumbnail .owl-stage .owl-item:not(:has(.lens-item--variable)) + .owl-item:has(.lens-item--variable) {
    margin-left: 30px;
}
/* Fallback for older browsers: at least the final item gets the gap */
.tri-leans-thumbnail .owl-stage .owl-item:last-child {
    margin-left: 30px;
}
/* When :has() IS supported and triggers the gap above, reset the
   last-child margin so we don't double it on the final Variable item. */
.tri-leans-thumbnail .owl-stage:has(.lens-item--variable) .owl-item:last-child {
    margin-left: 0;
}
.tri-leans-thumbnail .owl-stage:has(.lens-item--variable) .owl-item:not(:has(.lens-item--variable)) + .owl-item:has(.lens-item--variable) {
    margin-left: 30px;
}

.thumbnail-spactrum span {
    font-size: 14px;
    line-height: 18px;
    letter-spacing: -1px !important;
    color: #222;
    text-transform: uppercase;
    font-weight: 700;
    font-family: Space Grotesk;
}

.thumbnail-spactrum {
    display: flex;
    align-items: center;
    justify-content: space-between;
    max-width: 400px;
    margin: 0 auto;
    gap:40px;
}

.left-sp {
    display: flex;
    align-items: center;
    gap: 10px;
    flex:1;
}

span.sp-line {
    height: 1px;
    background: #222222;
    display: inline-block;
    flex: 1;
}

.try-leans-section .column-wrapper {
    max-width: 1236px;
    margin: 0 auto;
}

.try-innovation-section div[data-grid] {
    position: relative;
    width: 100% !important;
    margin: 0px;
}

.try-leans-section .tri-leans-wrapper .owl-nav button, .innovation-cards .owl-nav button {
    width: 45px !important;
    height: 45px !important;
    background: #fff !important;
    border: 1px solid rgb(34 34 34 / 20%) !important;
    display: flex !important;
    align-items: center;
    justify-content: center;
    border-radius: 100px !important;
    box-shadow: 0 4px 6px #20202014;
    margin: 0px !important;
}

.try-leans-section .section-heading {
    margin-bottom: 15px;
}

.try-leans-section .owl-carousel .owl-stage:after{
    display:none;
}
/* Leans Slder CSS End */

.lens-card img {
    width: 18px;
    height: 18px;
}

.lens-card h5 {
    font-size: 14px;
    line-height: 17px;
    font-family: Inter Tight;
    font-weight: 700;
    color: #222;
    margin: 0;
    text-transform: capitalize;
}

.lens-card p, .lens-card span {
    font-size: 12px;
    line-height: 14px;
    letter-spacing: 0;
}

.lens-specs .leans-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding-bottom: 12px;
    margin-bottom: 12px;
    border-bottom: 1px solid rgb(34 34 34 / 15%);
}

.lens-specs .icon-title-row {
    display: flex;
    align-items: center;
    justify-content: flex-start;
    gap: 8px;
}

.lens-specs .lens-card {
    padding: 15px;
    background: #fff;
    border-radius: 5px;
    overflow: hidden;
}

.lens-specs {
    display: flex;
    gap: 10px;
    flex-wrap: wrap;
}

.lens-specs > div {
    max-width:calc(100% / 2 - 5px);
    width:100%;
}

.spectrum span {
    width: 6px;
    height: 6px;
    background: rgb(34 34 34 / 15%);
    display: inline-block;
    border-radius: 10px;
}

.spectrum span.active{
    background: rgb(34 34 34 / 100%);
}

.lens-col li.icon-item {
    display: flex;
    align-items: center;
    gap: 12px;
    max-width: 210px;
    width: 100%;
}

.lens-col .icon-list {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 15px 35px;
    margin-top: 24px;
}

.specifations-wrapper h4 {
    margin: 20px 0 ;
    padding: 0;
    font-size: 24px;
    line-height: 31px;
}

.specifations-wrapper .lens-text p {
    margin: 16px 0;
    font-size: 18px;
    line-height: 25px;
}

.lens-text ul {
    display: flex;
    gap: 6px;
}

.lens-text ul li:not(:first-child) {
    font-size: 14px;
    line-height: 18px;
    padding: 4px 12px;
    border-radius: 20px;
    text-transform: uppercase;
    font-family: 'Space Grotesk';
    color: #fff;
    background: #222;
    margin:0px;
}

.lens-text ul li:first-child {
    font-size: 18px;
    line-height: 20px;
    font-weight: 600;
    font-family: 'Space Grotesk';
    margin: 0 6px 0 0 ;
}

.lens-col li.icon-item span {
    font-size: 14px;
    font-family: 'Inter Tight';
    font-weight: 600;
    margin: 0;
}

.size-specs {
    display: flex;
    align-items: flex-start;
    gap: 20px;
}

.size-card {
    padding: 25px;
    border-radius: 16px;
    background: #fff;
    flex: 1;
}

.size-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding-bottom: 10px;
    border-bottom: 1px solid rgb(34 34 34 / 70%);
    gap:10px;
}


.size-header h3 {
    font-size: 16px;
    line-height: 20px;
    font-weight: 500 !important;
    font-family: 'Space Grotesk';
    margin: 0px;
    flex:1;
}

.size-header > div{
    flex:1;
}

button.unit {
    font-size: 12px;
    line-height: 15px;
    padding: 2px 12px;
    border-radius: 20px;
    text-transform: uppercase;
    font-family: Space Grotesk;
    color: #222;
    background: transparent;
    margin: 0;
}

button.unit.active {
    color: #fff;
    background: #222;
}

.size-toggle {
    width: fit-content;
    border: 1px solid rgb(34 34 34 / 20%);
    padding: 2px;
    border-radius: 30px;
    display: flex;
    align-items: center;
    gap: 0;
}

.spec-list li {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 10px 0;
    border-bottom: 1px solid rgb(34 34 34 / 15%);
}

.spec-list li > span {
    flex: 1;
    font-size: 14px;
    line-height: 20px;
    font-family: 'Inter Tight';
    color: rgb(34 34 34 / 70%);
}

.spec-list li > span:nth-child(2) {
    font-weight: 500;
    color: #222;
}

.btn--add-to-cart {
    border-radius: 10px;
    font-size: 18px;
    line-height: 20px;
    font-family: 'Inter Tight';
}
}

p.size-desc {
    font-size: 12px;
    line-height: 17px;
    color: #222222;
    font-weight: 500;
}

.product__block__title, .product__block__price {
    padding: 0px !important;
}

.size-image img {
    width: 100%;
    flex: 1;
    max-width: 200px;
    margin: 0 auto;
}

.size-image {
    margin-bottom: 20px;
}

.size-image {
    margin-bottom: 20px;
    display: flex;
    gap: 10px;
}

.size-image span {
    flex: 1;
}


.why-cards {
    display: flex;
    gap: 15px;
    width: 100%;
}

.why-cards img.innovation-image {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.try-innovation-section.why-section .column-wrapper {
    padding: 0px 74px;
    background: #fff;
    border-radius: 0;
}

/* .section-icons.how-it-works-icon .float-grid {
    max-width: 100%;
    width: 100%;
    display: flex;
    justify-content: space-between;
    background: rgb(34 34 34 / 5%);
    padding: 100px 74px;
    border-radius: 20px;
} */

.section-icons.how-it-works-icon .float-grid {
    max-width: 100%;
    width: 100%;
    gap: 20px;
}

.section-icons.how-it-works-icon .icon-wrapper{
    max-width: 100%;
    width: 100%;
    background: rgb(34 34 34 / 5%);
    padding: 100px 74px;
    border-radius: 20px;
}

.section-icons.how-it-works-icon .icon__column__icon {
    width: 45px;
    height: 45px;
    margin: 0px;
}

.section-icons.how-it-works-icon .icon__column__heading {
    font-size: 24px;
    line-height: 31px;
    color: #222222;
    padding: 8px 0 10px 0;
}

.how-it-works-icon .grid__item {
    padding: 20px;
    border-radius: 5px;
    background: #fff;
    border: 1px solid rgb(34 34 34 / 10%);
}

.section-icons.how-it-works-icon .icon__column__text .rte p {
    font-size: 18px;
    line-height: 24px;
}

.image-with-txt-collection .brick__section {
    padding: 0 74px;
}

.image-with-txt-collection .brick__block__image {
    border-radius: 10px;
    overflow: hidden;
}

.image-with-txt-collection .brick__block__text {
    padding-right: 56px;
}

.image-with-txt-collection a.standard__cta {
    padding: 12px 55px 12px 25px !important;
    color: #fff;
    font-size: 16px;
    line-height: 19px;
}

.image-with-txt-collection .text-btn-arrow-right:after {
    right: 25px;
}

.image-with-txt-collection h2 {
    max-width: 420px;
}

.image-with-txt-collection .rte {
    max-width: 550px;
}

.image-with-txt-collection.img-left .brick__block__text {
    padding-right: 0;
    padding-left: 56px;
}

.classic-pdp .thumbnail-spactrum {
    max-width: 330px;
}

.faq-section .text__standard {
    max-width: 897px;
    margin: 0 auto;
}

.faq-section .accordion__wrapper {
    border: none !important;
    border-radius: 20px;
    background: rgb(34 34 34 / 5%);
    padding: 0 30px 0  30px;
    margin-bottom: 20px;
}

.faq-section .accordion__title {
    font-size: 24px;
    padding:30px 0 25px 0 ;
    line-height: 100%;
    letter-spacing: -1px !important;
    color: #222;
    text-transform: uppercase;
    font-weight: 700;
    font-family: Space Grotesk;
}

.faq-section .accordion__body {
    padding: 0 0 30px 0;
}

.faq-section .accordion__body p {
    font-size: 18px;
    line-height: 26px;
    color: #222222;
}

.short-container {
    background: #222;
    padding: 100px 74px;
    border-radius: 20px;
}

.image-with-faq-wrapper {
    display: flex;
    align-items: stretch;
    justify-content: space-between;
}

.image-with-faq-wrapper > div{
    flex: 1;
}

.image-wth-faq .section-heading h2, .image-wth-faq .section-heading p {
    color: #fff;
}

.faq-image img {
    border-radius: 10px;
    width:100%;
    height:100%;
    object-fit:cover;
}

.faq-image {
    padding-right: 58px;
}

.faq-section.image-wth-faq .accordion__wrapper {
    background: rgb(255 255 255 / 10%);
}


.faq-section.image-wth-faq .accordion__title {
    color: #fff;
}

.faq-section.image-wth-faq .accordion__body p {
    color: #ffffff;
}

.image-wth-faq .accordion__title:after {
    border-color: #ffffff;
}

.collection-tabs .product-grid-item__images {
    aspect-ratio: 400 / 250;
}

.collection-tabs .product-grid-item__images img.product-grid-item__image {
    width: 100%;
    margin: 0 auto;
    object-fit: contain;
}

.collection-tabs .product-grid-item__images .aspect-\[--wh-ratio\] {
    aspect-ratio: 400 / 250;
    background: rgb(0 0 0 / 5%);
    border-radius: 10px;
    overflow: hidden;
}

.product__badge {
    font-size: 10px;
    line-height: 12px;
    text-transform: uppercase;
    padding: 5px 10px;
    border-radius: 50px;
    border: 1px solid rgb(34 34 34 / 10%);
}

.collection-tabs .product__grid__title {
    font-size: 18px;
    line-height: 24px;
    letter-spacing: -1px !important;
    color: #222;
    text-align: left;
    width: 100%;
    text-transform: uppercase;
    font-weight: 700;
    font-family: Space Grotesk;
    margin: 0;
    padding: 10px 0;
}


.collection-tabs .product__grid__title__wrapper {
    display: flex;
    align-items: center;
    flex-direction: row !important;
    justify-content: space-between !important;
}

.collection-tabs .product__grid__price {
    justify-content: center;
    font-size: 18px;
    line-height: 24px;
    letter-spacing: -1px !important;
    color: #222;
    width: 100%;
    text-transform: uppercase;
    font-weight: 700;
    font-family: Space Grotesk;
    margin: 0;
    justify-content: flex-end;
    max-width: 120px;
}

.collection-tabs .tab-content {
    padding: 0 74px !important;
}

.collection-tabs button.flickity-button {
    margin: 0px !important;
}

.collection-tabs .flickity-prev-next-button.next {
    right: -60px !important;
}

.collection-tabs .flickity-prev-next-button.previous {
    left: -60px !important;
}

.flickity-force-arrows-top [data-carousel] .flickity-button, .wrapper--full [data-carousel] .flickity-button {
    top: 50% !important;
    transform:translateY(-50%);
}

.collection-tabs .flickity-prev-next-button {
    width: 45px !important;
    height: 45px !important;
    background: #fff !important;
    border: 1px solid rgb(34 34 34 / 20%) !important;
    display: flex !important;
    align-items: center;
    justify-content: center;
    border-radius: 100px !important;
    box-shadow: 0 4px 6px #20202014;
    margin: 0 !important;
}

nav.breadcrumb a, nav.breadcrumb span {
    text-transform: uppercase;
    font-family: Space Grotesk;
    font-size: 12px;
    font-weight: 300;
}

nav.breadcrumb {
    margin-bottom: 20px;
    display: flex !important;
    align-items: center;
    gap: 5px;
}

.tab-content .product__rating {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    flex-direction: row-reverse;
}

.text-center .grid__swatch__container {
    justify-content: left;
}

.tabs.tabs--center.tabs--pill {
    width: fit-content;
    margin: 0 auto;
    background: #F4F4F4;
    border-radius: 50px;
    padding: 8px;
}

button.tab-link span {
    text-transform: uppercase;
}

.tabs--pill>.tab-link.current {
    background: #fff !important;
    box-shadow: 0 4px 4px hsl(0deg 0% 13% / 10%);
}

button.tab-link {
    padding: 12px 24px 8px !important;
}

button.tab-link span {
    text-transform: uppercase;
    font-size: 16px;
    line-height: 100%;
}

.collection-banner {
    margin-top: 7px;
}

    .jdgm-widget:not(.jdgm-review-widget--small,.jdgm-review-widget--medium) .jdgm-row-media {
        flex-direction: row;
        width: 100% !important;
        flex-wrap: wrap;
    }



@media (min-width: 768px) {
  .grid__item.product__media__wrapper {
    position: sticky;
    top: 100px;
  }
}

.tri-a-mirror .btn.btn--long {
    margin: 0;
    color: #000 !important;
}






@media (max-width:1400px){

    

.tri-three-collection p.collection-grid-item__title {
    font-size: 30px;
    line-height: 34px;
    padding-top: 44px;
}

.hero__title p {
    font-size: 42px;
    line-height: 48px;
}

.section-heading .kicker-flourished, .try-tech-section .standard__heading p, .image-with-txt-collection h2 {
    font-size: 36px;
    line-height: 46px;
}

.tri-a-mirror .brick__section {
    padding: 50px;
    border-radius: 20px;
}

.tri-a-mirror .standard__heading {
    font-size: 36px;
    line-height: 46px;
}

.tri-collection-grid .collection-grid-item__title {
    font-size: 20px;
    line-height: 24px;
}

.tri-designed-for .column-wrapper {
    padding: 80px 50px;
}

.tri-designed-for .column__content .accent-title-large {
    margin-bottom: 0px;
}

    .footer__container.footer__container--reversed {
    flex-direction: column;
    gap: 0;
}

.footer__content__inner .float-grid {
        display: flex !important;
        row-gap: 0;
        column-gap: 40px;
        width: 100%;
        justify-content: space-between;
        margin: 0px;
    }

.footer__content__inner .float-grid .grid__item:last-child {
    margin-top: 0;
}

.footer .float-grid:after{
    display:none;
}

.footer__aside {
    display: flex;
    flex: auto !important;
    max-width: 360px !important;
    margin-left: 0px !important;
    padding: 0 !important;
    align-items: flex-start;
    margin-bottom: 80px;
}

.tri-text-banner .hero__content {
    padding: 50px 40px;
    margin: 0 !important;
}

.tri-text-banner .hero__title p {
    font-size: 36px;
    line-height: 40px;
}

.try-innovation-section .column-wrapper {
    padding: 80px 40px;
    background: #2222220d;
    border-radius: 20px 20px 0 0;
}

.innovation-content p {
    font-size: 14px;
    line-height: 20px;
}

.innovation-content h3 {
    font-size: 20px;
    line-height: 22px;
    letter-spacing: -0.5px !important;
    margin-bottom: 7px;
}

.try-tech-section .container-layout {
    padding: 0 40px 80px;
    background: #2222220d;
    border-radius: 0 0 20px 20px;
    margin-top:-1px;
}

.tech-feature-text {
    font-size: 16px;
    line-height: 20px;
    text-align: left;
}

.tech-features {
    display: flex;
    gap: 12px;
    margin-top: 30px;
}

.try-tech-section .standard__heading p{
    padding:0px;
}

.try-innovation-section .column-wrapper {
    padding: 80px 40px 50px;
}

.innovation-cards .owl-next {
    right: -25px;
}

.innovation-cards .owl-next {
    right: -25px;
}

.tri-leans-slider .lens-content {
    max-width: 30%;
    width: 100%;
}

.try-leans-section .section-padding {
    padding-top: 80px;
    padding-bottom: 60px;
}

.try-specifications-section .column-wrapper {
    padding: 80px 40px;
}

.specifations-wrapper .lens-grid {
    gap: 20px;
}
}


@media (max-width:1100px){
    .tri-designed-for .column-wrapper {
        padding: 80px 20px;
    }

    .tri-three-collection .grid__item {
    max-width: calc(100% / 3) !important;
}

    .tri-three-collection p.collection-grid-item__title {
        font-size: 24px;
        line-height: 28px;
        padding-top: 42px;
    }

    .tri-three-collection .section-heading {
    display: none;
    margin: 0px !important;
}

.lens-content h3 {
    font-size: 20px;
    line-height: 24px;
    padding: 10px 0;
}

.lens-content p {
    font-size: 16px;
    line-height: 22px;
}

.tri-leans-slider {
    padding: 0 30px;
}

#sync1.owl-theme .owl-next {
    right: -25px;
}

#sync1.owl-theme .owl-prev {
    left: -25px;
}

.try-innovation-section.why-section .column-wrapper {
    padding: 0;
}

.section-icons.how-it-works-icon .icon-wrapper {
    padding: 80px 20px;
}

.how-it-works-icon .grid__item {
    padding: 15px;
}

.section-icons.how-it-works-icon .float-grid {
    gap: 15px;
}

.section-icons.how-it-works-icon .icon__column__heading {
    font-size: 20px;
    line-height: 24px;
}

.section-icons.how-it-works-icon .icon__column__text .rte p {
    font-size: 16px;
    line-height: 22px;
}
.collection-tabs .tab-content {
    padding: 0 40px !important;
}

.collection-tabs .flickity-prev-next-button.next {
    right: -25px !important;
}

.collection-tabs .flickity-prev-next-button.previous {
    left: -25px !important;
}

.collection-tabs .product__grid__title {
    font-size: 16px;
    line-height: 20px;
}
.collection-tabs .product__grid__price {
    font-size: 16px;
    line-height: 20px;
    max-width: 90px;
}

.short-container {
    padding: 80px 20px;
}

.faq-image {
    padding-right: 24px;
}

.faq-section .accordion__title {
    font-size: 20px;
}

.image-with-txt-collection .brick__section {
    padding: 0px;
}
}

@media (max-width:1023px){
        .header__mobile__button {
        min-width: 32px;
    }
.hero__content {
    max-width: 100%;
}

    .tri-three-collection p.collection-grid-item__title {
        font-size: 20px;
        line-height: 24px;
        padding-top: 36px;
    }

    .collection-grid-item__subtitle {
        font-size: 10px;
        line-height: 16px;
        padding: 2px 10px;
        top: 12px;
    }

.tri-a-mirror .brick__section {
        padding: 20px;
        border-radius: 20px;
    }

        .tri-a-mirror .standard__heading {
        font-size: 30px;
        line-height: 34px;
    }

    .tri-a-mirror p {
    font-size: 18px;
    line-height: 24px;
}

.tri-a-mirror ul {
    margin: 20px 0 !important;
    padding: 6px;
    font-size: 16px;
}

.tri-collection-grid {
    grid-template-columns: repeat(4, 1fr);
    grid-template-rows: 150px 180px 150px;
    gap: 10px;
}

.tri-collection-grid .hero__content__wrapper {
    justify-content: flex-end !important;
    padding: 12px;
}

    .tri-collection-grid .collection-grid-item__title {
        font-size: 18px;
        line-height: 20px;
    }
.specifations-wrapper .lens-grid {
        gap: 40px;
        flex-direction: column;
    }

        .try-specifications-section .column-wrapper {
        padding: 80px 20px;
    }
    .tri-leans-slider .lens-grid {
    flex-direction: column;
}
    .tri-leans-slider .lens-content {
        max-width: 100%;
        width: 100%;
        display: flex;
    }

.tri-leans-slider .card-content {
    text-align: left;
    padding: 0 0 0 24px;
}

.lens-content img, .lens-content > div {
    flex: 1;
}
.tri-text-banner .hero__content {
        padding: 20px 20px;
        margin: 0 !important;
    }

    .tech-feature {
    max-width: calc(100% / 2 - 6px);
}

.how-it-works-icon .grid__item {
    max-width: calc(100% / 2 - 8px) !important;
    width: 100% !important;
}

.section-icons.how-it-works-icon .float-grid {
    flex-wrap: wrap;
}

    .tab-content [data-grid][data-grid-medium] [data-item] {
        width: calc(100% / 2);
    }

    button.tab-link span {
    font-size: 14px;
}

.faq-section .accordion__title {
        font-size: 16px;
        letter-spacing: 0 !important;
        padding: 20px 0 20px;
    }

.faq-section .accordion__wrapper {
    border-radius: 12px;
    padding: 0 20px;
}

.faq-section .accordion__body p {
    font-size: 16px;
    line-height: 22px;
}

.faq-section .accordion__body {
    padding: 0 0 20px;
}

.image-with-txt-collection h2 {
        line-height: 38px;
    }
}

@media (max-width:768px){
.footer__content__inner .float-grid {
        text-align: left;
    }

    .footer__content__inner .float-grid > div:first-child {
    max-width: 300px;
    width: 100%;
    flex: 0 0 300px;
    padding-right: 30px !important;
}
}

@media (max-width:834px){
.header__mobile {
    display: flex !important;
    justify-content: space-between;
}
}




@media (min-width:768px){
.desktop-hide {
    display: none !important;
}
[data-thumbnails-left] .media__thumb__wrapper {
        display: flex;
        flex-direction: column;
        gap: 0px;
    }
}
@media (max-width:767px){

      .grid__item.product__media__wrapper {
    position: static;
    top: 0;
}
   .tri-three-collection .grid__item {
        max-width: calc(100% / 1) !important;
        margin: 0px !important;
        width: 100% !important;
    }

    .footer__content__inner .float-grid {
        text-align: left;
        flex-direction: column;
        gap: 40px;
    }

    .footer__content__inner {
    padding-bottom: 40px;
}

    .footer__container {
    display: flex;
    flex-direction: column-reverse !important;
}

.section-icons .float-grid {
    flex-direction: column;
}

.jdgm-widget:not(.jdgm-medals-wrapper) .jdgm-medals .jdgm-medal, .jdgm-widget:not(.jdgm-medals-wrapper) .jdgm-medals .jdgm-medal__mono svg {
    width: 40px !important;
    height: 40px !important;
}

.hero__content {
        padding: 0px !important;
    }

        .hero__title p {
        font-size: 26px;
        line-height: 120%;
    }

    .btn.btn--large, .btn.btn--long {
    font-size: 14px;
    line-height: 20px;
    padding: 12px 15px;
    letter-spacing: 0.25px !important;
    margin: 16px 10px 0 0;
}

.hero__cta__wrapper {
    display: flex;
    flex-direction: row;
    align-items: flex-start;
}

    .section-no-slider-mobile [data-grid] {
        width: 100%;
        gap:20px;
    }

    .tri-three-collection p.collection-grid-item__title {
        font-size: 25px;
        line-height: 28px;
        padding-top: 36px;
        max-width: 260px;
    }

        .tri-a-mirror .brick__section {
        padding: 48px 20px;
        border-radius: 20px;
        flex-direction: column;
    }

    .tri-a-mirror .image__hero__frame {
    border-radius: 8px;
    aspect-ratio: 1;
}

.tri-a-mirror .standard__heading {
        font-size: 25px;
        line-height: 28px;
    }

.tri-a-mirror .text__standard.text-left {
    padding-top: 0;
}

.section-heading .kicker-flourished, .try-tech-section .standard__heading p, .image-with-txt-collection h2 {
        font-size: 25px;
        line-height: 30px;
    }

    .subheading, .try-tech-section .rte p {
    font-size: 14px;
    line-height: 20px;
}

.section-no-slider-mobile .grid__item {
    margin: 0px !important;
    width: 100% !important;
}

.tri-designed-for .grid__item {
    width: 100% !important;
}

.tri-designed-for div[data-grid] {
        flex-direction: column !important;
        gap: 20px;
        padding: 0 20px;
    }

.tri-designed-for div[data-grid] .grid__item{
    margin:0px;
}

    .tri-designed-for .column-wrapper {
        padding: 50px 20px 30px;
    }

.section-heading {
    margin-bottom: 30px;
}

.section-icons .icon__column__icon {
    width: 45px;
    height: 45px;
}

.grid__item:not(:first-child) .icon__column {
        padding-top: 50px;
    }

.section-icons {
    padding: 50px 0;
}

.subfooter__items {
    gap: 20px;
}

.subfooter .wrapper {
    padding: 20px;
}

    .footer__content__inner .float-grid>div:first-child {
        max-width: 100%;
        width: 100%;
        flex: 0 0 100%;
        padding-right: 0px !important;
    }

.footer__title {
        padding: 0;
        border: none !important;
    }

.footer__title svg{
    display:none !important;
}

.footer__accordion__body {
    padding: 20px 0 0 0;
}

    .footer__aside {
        margin-bottom: 60px;
        width: 100%;
    }
.tri-wherever-you-go .image__hero__frame {
    aspect-ratio: 1;
}
.tri-designed-for .column__content {
    bottom: 20px;
    left: 20px;
    width: calc(100% - 40px);
}
    
.tri-designed-for .column__content .accent-title-large {
    font-size: 20px;
    line-height: 24px;
}

.mobile-hide{
    display:none;
}
    .tri-discover-inovation div[data-grid] {
        flex-direction: column !important;
        display: flex;
        gap: 20px;
        padding: 0px;
        margin: 0 auto;
        max-width: 335px !important;
        width: 100% !important;
    }


    .tri-discover-inovation div[data-grid] .grid__item {
        margin: 0;
        width: 100%;
        padding: 30px 24px;
        border-radius: 8px;
    }

.tri-discover-inovation .accent-title-large {
    font-weight: 900;
    font-size: 20px;
    line-height: 100%;
    letter-spacing: -.75px !important;
    font-family: Space Grotesk;
    text-transform: uppercase;
}

.tri-discover-inovation .rte p {
    font-size: 14px;
    line-height: 20px;
}

.tri-discover-inovation .column__image {
    position: relative;
    margin-bottom: 40px;
}

    .tri-discover-inovation div[data-grid] .grid__item:first-child {
        background: linear-gradient(180deg, rgb(254 152 72 / 15%), hsl(4deg 70% 46% / 15%));
    }

    .tri-discover-inovation div[data-grid] .grid__item:nth-child(2) {
        background: linear-gradient(180deg, rgb(194 197 207 / 20%), rgb(176 194 219 / 20%));
    }

    .tri-discover-inovation div[data-grid] .grid__item:nth-child(3) {
        background: linear-gradient(180deg, rgb(243 237 161 / 50%), rgb(229 212 124 / 50%));
    }

    .tri-discover-inovation div[data-grid] .grid__item:nth-child(4) {
        background: linear-gradient(180deg, rgb(164 117 112 / 15%), rgb(140 105 103 / 15%));
    }

.tri-discover-inovation .column__image img {
    mix-blend-mode: darken;
    box-shadow: none !important;
    overflow: hidden !important;
    width: calc(100% + 4px) !important;
    margin-left: -2px;
    height: calc(100% + 4px) !important;
    margin-top: -2px;
}

.tri-discover-inovation .wrapper {
    padding-top: 50px;
    padding-bottom: 50px;
}

.use_pixels_650 {
    height: 450px;
}


.header__mobile__button {
    min-width: 32px;
}
.tri-discover-inovation .section-padding {
    padding-bottom: 30px;
}

.announcement p {
    font-size: 12px;
    line-height: 16px;
}


/* Drawer Css  */
.announcement {
    display: none;
}
.drawer__content {
    top: 78px;
}

.drawer__menu .sliderow {
    border: none !important;
}

.drawer__menu .sliderow__title {
    font-size: 16px;
    line-height: 100%;
    font-weight: 900;
    font-family: 'Space Grotesk';
}

/* ═══════════════════════════════════════════
   CART DRAWER REDESIGN — 4-Zone Layout
   ═══════════════════════════════════════════ */

/* Zone 1: Header */
.cart-drawer-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 16px 20px;
  border-bottom: 1px solid #e8e8e8;
  min-height: 56px;
}
.cart__drawer__title {
  font-family: 'Inter Tight', 'Space Grotesk', sans-serif;
  font-size: 16px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.5px;
  margin: 0;
}
.cart-drawer-header__count {
  font-weight: 400;
  font-size: 14px;
  color: #666;
  margin-left: 4px;
}

/* Zone 2: Free Shipping Progress */
.cart-drawer-progress {
  padding: 12px 20px 0;
}
.shipping-progress {
  padding-bottom: 12px;
  border-bottom: 1px solid #e8e8e8;
}
.shipping-progress__bar-track {
  width: 100%;
  height: 4px;
  background: #e8e8e8;
  border-radius: 2px;
  overflow: hidden;
}
.shipping-progress__bar-fill {
  height: 100%;
  background: #222;
  border-radius: 2px;
  transition: width 0.5s cubic-bezier(0.4, 0, 0.2, 1);
  min-width: 0;
}
.shipping-progress__bar-fill--qualified {
  background: #22c55e;
}
.shipping-progress__message {
  font-size: 12px;
  line-height: 1.4;
  color: #444;
  margin-top: 8px;
  text-align: center;
}
.shipping-progress__icon {
  color: #22c55e;
  font-weight: 700;
  margin-right: 4px;
}

/* Zone 3: Scrollable Body */
.cart-drawer-body {
  flex: 1;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  padding: 0 20px;
}

/* Zone 4: Sticky Footer — 2026-05-20: uniform 10px padding per user. */
.cart-drawer-footer {
  border-top: 1px solid #e8e8e8;
  padding: 10px;
  background: inherit;
  box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.04);
}
/* 2026-05-20 — CHECKOUT button vertical padding + margin-top override
   scoped to the cart drawer (matches the rule in sections/cart-drawer.liquid
   inline style; duplicated here so custom.css ordering doesn't matter). */
.cart__drawer .btn.btn--large,
.cart__drawer .btn.btn--long {
  padding-top: 10px !important;
  padding-bottom: 10px !important;
  margin-top: 0 !important;
}
/* 2026-05-20 — Payment icons row: 14px margin all sides. */
.cart-drawer-payment-icons .pdp-payment-icons {
  margin: 14px !important;
}
.cart-drawer-footer__subtotal [data-cart-subtotal] {
  margin-bottom: 4px;
}
.cart-drawer-footer__total {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 8px 0;
  margin-bottom: 4px;
}
.cart-drawer-footer__total-label {
  font-family: 'Inter Tight', 'Space Grotesk', sans-serif;
  font-size: 14px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.3px;
}
.cart-drawer-footer__total-price {
  font-family: 'Space Grotesk', sans-serif;
  font-size: 16px;
  font-weight: 700;
}
.cart-drawer-footer__tax-note {
  font-size: 11px;
  color: #888;
  margin: 0 0 12px;
}
.cart-drawer-footer__form {
  margin: 0;
}
.cart-drawer-footer__checkout {
  width: 100%;
  height: 48px;
  border-radius: 8px;
  font-family: 'Inter Tight', 'Space Grotesk', sans-serif;
  font-size: 14px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.5px;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  background: #222;
  color: #fff;
  border: none;
  cursor: pointer;
  transition: background 0.15s;
}
.cart-drawer-footer__checkout:hover {
  background: #000;
}
.cart-drawer-footer__checkout-dot {
  font-size: 18px;
  line-height: 1;
  opacity: 0.5;
}

/* Express checkout (Shop Pay, Apple Pay) */
.cart-drawer-footer__express {
  margin-top: 10px;
}
.cart-drawer-footer__express .additional-checkout-buttons {
  display: flex;
  flex-direction: column;
  gap: 8px;
}

/* Trust signals */
.cart-trust {
  margin-top: 16px;
  text-align: center;
  padding-top: 12px;
  border-top: 1px solid #f0f0f0;
}
.cart-trust__text {
  font-size: 11px;
  color: #888;
  margin: 0 0 8px;
  letter-spacing: 0.3px;
}
.cart-trust__icons {
  display: flex;
  justify-content: center;
  gap: 6px;
  flex-wrap: wrap;
}
.cart-trust__icon {
  width: 38px;
  height: 24px;
  opacity: 0.55;
  transition: opacity 0.15s;
}
.cart-trust__icon:hover {
  opacity: 0.8;
}

/* Cart notes in footer */
.cart-drawer-footer .drawer__bottom__notes {
  margin-bottom: 12px;
  border-bottom: 1px solid #f0f0f0;
  padding-bottom: 12px;
}
.cart-drawer-footer .accordion__title {
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: 0.3px;
  font-weight: 600;
  color: #666;
}
.cart-drawer-footer .drawer__notes__input {
  font-size: 13px;
  padding: 8px;
  border: 1px solid #e8e8e8;
  border-radius: 6px;
  min-height: 60px;
  resize: vertical;
}

/* Ensure drawer uses flexbox for sticky footer */
.cart__drawer .drawer__content {
  display: flex;
  flex-direction: column;
  height: 100%;
}
.cart__drawer .drawer__top {
  flex-shrink: 0;
}
.cart__drawer .drawer__body,
.cart__drawer .cart-drawer-body {
  flex: 1;
  min-height: 0;
}
.cart__drawer .drawer__bottom,
.cart__drawer .cart-drawer-footer {
  flex-shrink: 0;
}

/* Line item addons render with the same template as regular items.
   The .cart-item--addon class is kept on the row for data/JS purposes
   (e.g. analytics, future bundle handling) but no longer styles the row
   any differently — bold product title + lighter variant text from the
   default .cart__items__title / .cart__items__meta rules apply. */

/* Stock-aware quantity stepper: dim the wrapper at max stock,
   visually disable the + button, surface a small "no more in stock" line. */
.quantity__button[disabled],
.quantity__button[aria-disabled="true"] {
  opacity: 0.35;
  cursor: not-allowed;
  pointer-events: none;
}
.quantity__wrapper[data-at-max-stock="true"] {
  position: relative;
}
.cart__stock-msg {
  display: block;
  font-size: 11px;
  line-height: 1.2;
  color: #999;
  margin-top: 4px;
  white-space: nowrap;
  text-align: center;
}

/* Mobile touch targets */
@media only screen and (max-width: 768px) {
  .cart-drawer-header {
    padding: 12px 16px;
  }
  .cart-drawer-progress {
    padding: 10px 16px 0;
  }
  .cart-drawer-body {
    padding: 0 16px;
  }
  .cart-drawer-footer {
    padding: 14px 16px 16px;
  }
  .cart-drawer-footer__checkout {
    min-height: 48px;
  }

  /* Full-viewport cart drawer on mobile.
     Pipeline wraps a position:fixed .drawer__content inside a static .drawer
     outer element. Sizing the OUTER causes it to take its full height in
     document flow (even when closed) — which pushed all page content down.
     Target the INNER .drawer__content (the actual sliding panel) instead. */
  #drawer-cart .drawer__content {
    width: 100% !important;
    max-width: 100% !important;
    height: 100vh !important;
    height: 100dvh !important;       /* iOS: excludes home-indicator bar */
    max-height: 100vh !important;
    max-height: 100dvh !important;
  }
  /* 2026-05-19 (v57) — Logo moved INTO the header flex row, no longer
     a ::before pseudo-element. See cart-drawer.liquid for the inline
     .cart-drawer-header__logo element + 3-column grid layout.
     The swipe-zone narrows to a small slip centered on the logo so
     it doesn't intercept taps on CART (n) or X. */
}
/* 2026-05-19 (v68) — Swipe-zone rules MOVED OUT of the mobile media
   query. On desktop the swipe-zone (a DOM child of the header) was
   acting as a normal grid item, taking the first column and pushing
   the CART/logo/X layout into row 1 only with X wrapping to row 2.
   `position: absolute` (regardless of viewport) keeps it out of the
   grid flow. Touch-active only on small screens via the swipe JS
   in cart-drawer.liquid (which already checks innerWidth ≤ 768). */
#drawer-cart .drawer__top.cart-drawer-header {
  position: relative;
}
#drawer-cart .cart-drawer-swipe-zone {
  position: absolute !important;
  top: 0;
  left: 50%; transform: translateX(-50%);
  width: 90px; height: 100%;
  z-index: 0;
  pointer-events: none; /* keep grid cells tappable */
  touch-action: pan-y;
}

/* ═══ End Cart Drawer Redesign ═══ */

/* Drawer Css  End*/

.specifations-wrapper .lens-grid>div {
    flex: 1;
    width: 100%;
}

.size-specs {
    flex-direction: column;
}

.try-specifications-section .column-wrapper {
        padding: 60px 20px;
    }

    .tri-leans-slider .lens-content {
        flex-direction: column;
        gap: 15px;
    }

    .card-content {
    padding: 0;
}

.tri-leans-slider {
        padding: 0;
    }

    .try-leans-section .tri-leans-wrapper .owl-nav button, .innovation-cards .owl-nav button {
    width: 32px !important;
    height: 32px !important;
}

    #sync1.owl-theme .owl-prev {
        left: -8px;
    }

    #sync1.owl-theme .owl-next {
        right: -8px;
    }

    #sync2 .item {
    width: 30px;
    height: 30px;
}

.tri-leans-thumbnail .owl-item:after {
    width: 36px;
    height: 36px;
    top: -3px;
    left: -3px;
}

.tri-leans-thumbnail .owl-stage {
    gap: 12px;
}

.thumbnail-spactrum {
    max-width: 270px;
}

.specifations-wrapper h4 {
    margin: 20px 0 10px;
    font-size: 20px;
    line-height: 24px;
    letter-spacing: -0.5px;
}

.specifations-wrapper .lens-text p {
    margin: 16px 0;
    font-size: 16px;
    line-height: 22px;
}

.try-innovation-section .column-wrapper {
        padding: 60px 20px 30px;
    }

        .try-tech-section .container-layout {
        padding: 0 20px 60px;
    }

    .try-innovation-section div[data-grid] {
    padding-left: 0px;
}

.tri-text-banner .hero__content__wrapper {
    padding: 20px;
}

.tri-text-banner .hero__description p {
    font-size: 16px;
    line-height: 22px;
}

/* [data-thumbnails-left] .media__thumb__wrapper {
    display: flex; 
    flex-direction: row;
    gap: 0px;
} */

.media__thumb {
    width: 60px;
    height: 60px;
    margin-right: 10px !important;
    margin-block-end: 0px;
}

.why-cards {
    flex-direction: column;
}


.try-innovation-section .section-padding {
    padding-bottom: 0px;
}

    .section-icons.how-it-works-icon .icon-wrapper {
        padding: 60px 20px;
    }

    .how-it-works-icon .grid__item {
        max-width: 100% !important;
        width: 100% !important;
    }

button.tab-link {
    padding: 8px 12px 4px !important;
}

    .collection-tabs .tab-content {
        padding: 0 0px !important;
    }

        .tab-content [data-grid][data-grid-medium] [data-item] {
        width: 100%;
    }

.collection-tabs .flickity-grid.flickity-disabled-mobile {
    padding: 0px;
    width: 100%;
    margin: 0px;
}

    .short-container {
        padding: 60px 20px;
    }
    .image-with-faq-wrapper {
    flex-direction: column;
    gap: 10px;
}

    .faq-image {
        padding-right: 0px;
    }

    .image-with-txt-collection .text__standard {
    padding-top: 20px;
    padding-bottom: 0px;
}

.tri-collection-grid {
        display: flex !important;
    }
}

@media (max-width:512px){
.lens-specs>div {
    max-width: calc(100% - 0px);
    width: 100%;
}

.tech-feature {
        max-width: calc(100% - 1px);
    }

.px-btn {
        max-width: 52px !important;
        padding: 4px !important;
        min-height:52px;
    }

.btn--add-to-cart {
    font-size: 16px;
    line-height: 20px;
}
}

/* Mobile product page: kill ALL sticky + smooth-scroll to prevent bounce/jitter */
@media (max-width: 767px) {
  html {
    scroll-behavior: auto !important;
  }
  .product-single .is-sticky,
  .grid__item.product__media__wrapper {
    position: relative !important;
    top: auto !important;
  }

  /* Neutralize the sticky header entirely on mobile.
     The theme's Sticky JS (theme.js:2492) toggles .js__header__stuck and
     .js__header__stuck--animated on scroll, which caused two separate
     mobile bugs:
       1. position: fixed (from .js__header__stuck) removes the header
          from document flow — when the class is added past the scroll
          threshold, content below jumps up by the header's height.
          That's the "tiny jump as I scroll" behavior.
       2. The hide-on-scroll transform (theme.css:14677) toggles 4 times
          during iOS rubber-band settle at the top of the page.
     We force the sticky state to be a visual no-op on mobile: position
     stays static (in flow), and the transform/transition are disabled.
     The JS still toggles its classes, but they have no layout impact.
     Header scrolls with content — the conventional mobile UX. */
  .js__header__stuck {
    position: static !important;
    width: auto !important;
  }
  .js__header__stuck--animated .theme__header,
  .js__header__stuck--animated.js__header__stuck--trigger-animation .theme__header {
    transform: none !important;
    transition: none !important;
  }

  /* Kill backdrop-filter churn on sticky header.
     Site is in "sticky" mode (sections/group-header.json). At iOS
     scroll-top, rubber-band oscillation crosses stickUp/stickDown ~4
     times (theme.js:2509), toggling .js__header__stuck on each
     crossing. The theme.css:14644-14649 rule applies
     backdrop-filter: blur(0) + 500ms transition on every toggle,
     causing iOS Safari's GPU compositor to re-allocate the backdrop
     layer 4 times — visible as a 4-beat vertical jiggle matching
     the "4 times" symptom.

     The :after pseudo-element at theme.css:14651-14660 also has its
     own opacity transition that fires per toggle.

     This block kills the backdrop-filter and its transitions only on
     mobile. Desktop keeps the glassy blur effect. Does NOT touch
     overscroll-behavior (that caused the sluggish feel last time). */
  .js__header__stuck .theme__header,
  .js__header__stuck.js__header__stuck__backdrop .theme__header {
    -webkit-backdrop-filter: none !important;
    backdrop-filter: none !important;
    transition: none !important;
  }
  .js__header__stuck .theme__header:after,
  .js__header__stuck.js__header__stuck__backdrop .theme__header:after {
    transition: none !important;
  }

  /* Collapse Klaviyo's scroll-triggered fade-in animations to ~0ms on
     mobile (instead of suppressing them outright).
     History — two-step lesson:
     v1: { animation: none; transition: none } on every kl-private-reset-css
         descendant. Killed the jiggle, but blocked the CLOSE animation —
         popup became undismissable on mobile (tap X did nothing because
         animationend never fired).
     v2: animation: none, but only on elements with klaviyo-fadein /
         klaviyo-fadeinup applied inline. Close worked, but body scroll
         stayed locked after close — Klaviyo's open-state machine listens
         for animationend on the OPEN animation to mark the popup "fully
         open"; without that, the close handler skipped the body-overflow
         cleanup step.
     v3 (current): keep the animation, just set its duration to ~0. The
         visual fade-in collapses to imperceptible (no jiggle), but
         animationend still fires, so Klaviyo's state machine and the
         scroll-lock cleanup both run normally. */
  [class*="kl-private-reset-css"][style*="klaviyo-fadein"],
  [class*="kl-private-reset-css"] [style*="klaviyo-fadein"] {
    animation-duration: 0.001ms !important;
    animation-delay: 0s !important;
  }

  /* SITE-WIDE ROOT CAUSE: GPU compositor layer jiggle on scroll direction
     change. Diagnosed via Playwright WebKit: identity transforms and
     will-change declarations create persistent GPU compositor layers
     that iOS Safari re-composites on scroll direction change, causing
     a visible 2-5px lag.

     Primary offender: .ticker--animated (theme.css:15242) runs a
     continuous infinite CSS animation with will-change: transform on
     the announcement bar. Every page has it. The persistent animation
     keeps a GPU layer permanently alive → iOS scroll compositor has to
     re-balance on every direction change → visible jiggle.

     Secondary: [data-aos] elements. AOS runs in "once" mode (theme.js
     :10973) but leaves residual transform: translate3d(0,0,0) identity
     transforms that still promote GPU layers.

     Fix: de-promote these elements from GPU layers on mobile. Animations
     on desktop are unaffected. The announcement ticker still scrolls on
     mobile — we only remove will-change, which lets the browser decide
     layer promotion based on actual animation needs rather than
     preemptive declaration. */
  .ticker--animated,
  .toolbar__text.ticker--animated {
    /* will-change: auto alone doesn't help — the *running* animation
       itself keeps the element on a GPU layer. We have to actually
       pause the animation on mobile. The announcement text stops
       scrolling on mobile, which is acceptable UX (most mobile
       announcement bars are static anyway). */
    animation-play-state: paused !important;
    will-change: auto !important;
  }
  [data-aos] {
    will-change: auto !important;
  }
  [data-aos].aos-animate {
    transform: none !important;
  }
}

/* Mobile product page: title + lens above gallery, tight spacing */
@media (max-width: 767px) {
  .product__media__wrapper > .px-lens {
    padding: 0 15px 10px;
  }

  /* Desktop-only 3-section layout — hide on mobile (mobile uses scroll-snap carousel).
     Defensive: if viewport is resized desktop→mobile without triggering a gallery
     rebuild, these rules hide the stale desktop DOM. */
  .trieye-gallery__main,
  .trieye-gallery__lifestyle {
    display: none !important;
  }
  /* .trieye-gallery__thumbs is already hidden on mobile via the existing
     @media (max-width: 767px) rule further down this file (line ~3539). */

  /* Title moved above gallery */
  .trieye-mobile-title {
    padding: 0 15px 0;
  }
  .trieye-mobile-title .product__block__title {
    padding-bottom: 0 !important;
    --PB: 0px !important;
  }
  .trieye-mobile-title .product__title {
    margin-bottom: 0;
    font-size: 28px;
  }
  .trieye-mobile-title .product__block__price {
    margin-bottom: 4px;
  }
  .trieye-mobile-title .product__headline {
    margin-bottom: 0;
  }

  /* "From" prefix handled globally now */

  /* Remove dead space in/below gallery */
  .trieye-gallery {
    margin-bottom: 0;
    height: auto !important;
  }
  .trieye-gallery__dots {
    padding: 6px 0 2px;
  }
  /* Kill any ratio padding from theme wrapper + its viewport child. Pipeline's
     theme.css sets `padding-bottom: var(--default-ratio)` on .flickity-viewport
     where --default-ratio is inline `100.0%` — that reserves 100vw of blank
     space BEFORE trieye-gallery JS hides the slideshow. If the JS runs late
     (or fails to resolve state.color and returns early), the user sees a huge
     empty area above product content. These !important overrides zero it out. */
  .product__media__wrapper .flickity-lock-height,
  .product__media__wrapper .product__grid--slides,
  .product__media__wrapper .product__grid--slides .flickity-viewport {
    padding-bottom: 0 !important;
    min-height: 0 !important;
  }
  /* Belt-and-suspenders: once trieye-gallery is in the DOM, the theme slideshow
     is redundant — hide it. Guards against partial JS runs where JS built the
     gallery but didn't apply inline display:none to the slideshow. */
  .product__media__wrapper:has(.trieye-gallery) .product__grid--slides {
    display: none !important;
  }

  /* Tighter spacing between gallery and model section */
  .product__main__content .product__inner {
    padding-top: 0;
  }
  .px-wrap {
    margin-top: 0;
  }
  .px-wrap > .px-block:first-of-type,
  #px-color-title {
    margin-top: 4px !important;
  }

  /* 2026-05-11: show the model name (product title) above the configurator
     on mobile. The previous rule hid `.product__main__content .title-price-wrapper`
     and a comment said "moved above on mobile" — but the replacement
     `.trieye-mobile-title` element was never actually rendered in any
     snippet, so the title disappeared entirely on mobile. Result: customers
     scrolled past the gallery and saw "CHOOSE YOUR TYPE" with no model
     name. Restoring the title where it sits in the DOM (top of the
     configurator panel, above the lens picker / size / mirror sections). */
  .product__main__content .title-price-wrapper {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    padding: 0 15px 12px;
    margin-bottom: 4px;
    text-align: left;
  }
  .product__main__content .title-price-wrapper .product__title {
    font-size: 26px;
    line-height: 1.1;
    margin-bottom: 4px;
  }
  .product__main__content .title-price-wrapper .product__block__price {
    margin-bottom: 0;
  }

  /* === Compact type picker (mobile) ===
     trieye-product.css mobile rule sets buttons to max-width 50% (2x2). Override
     that here so the 4-column grid fills properly. */
  .px-lens--swatches .px-groups {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 4px;
  }
  .px-lens--swatches .px-groups button.px-group {
    max-width: 100%;
    width: auto;
    flex: initial;
    padding: 10px 2px;
    min-height: 48px;
    border-radius: 10px;
    display: flex;
    align-items: center;
    justify-content: center;
  }
  .px-lens .px-group .lens-card {
    padding: 0;
    width: 100%;
    text-align: center;
  }
  /* 2026-05-12 (Quieter): show the inline SVG icon on mobile too.
     Previously hidden because the old tiny tiles had no room. The
     new Quieter tiles (3-col / 4-col grid via :has()) have plenty
     of room and the lens icon now genuinely differentiates the
     types at a glance — replacing a text-only label that read as
     "Standard / Standard / Standard" of varying lengths. */
  .px-lens .px-group .lens-card__icon {
    display: flex;
    justify-content: center;
    align-items: center;
    margin-bottom: 4px;
  }
  .px-lens .px-group .lens-card__icon svg {
    width: 20px;
    height: 20px;
  }
  /* 2026-05-21 v4 — A1 layout: 2 × 2 grid with cards wide enough that
     long names like "Photochromic" fit on one line at 14px. So
     `white-space: nowrap` is back (no breaks). Fonts at A1 baseline:
     name 14 / sub 12 / price 14. Padding 14×10 (handled in
     trieye-product.css). */
  .px-lens .px-group .lens-card__name {
    font-size: 14px;
    font-weight: 700;
    white-space: nowrap;
    line-height: 1.2;
    letter-spacing: 0;
    display: block;
  }
  .px-lens .px-group .lens-card__price {
    font-size: 14px;
    font-weight: 700;
    opacity: 1;
    display: block;
    /* 2026-05-21 — Per user: margin-top 4 → 2 for tighter stack */
    margin-top: 2px;
  }
  .px-lens .px-group .lens-card__sub,
  .px-lens .px-group .lens-card__desc {
    font-size: 12px;
    color: #666;
    /* 2026-05-21 — Per user: margin-top 4 → 0 (sub line sits right
       under the name) */
    margin-top: 0;
  }

  /* === Clip-on size buttons (mobile @media; desktop rules below) ===
     2026-05-11 revised: size buttons match the visual weight of the
     Mirror Position cards above (padding 16px, white bg, subtle shadow).
     2026-05-11 (v2): min-height: 64px + box-sizing: border-box so both
     buttons are guaranteed identical-sized rectangles regardless of the
     sub-text length difference. Earlier `min-height: auto` let Medium
     and Small render at different heights — the screenshot showed the
     Small button much shorter than Medium because the longer 'for
     slightly smaller faces' line had been moved out (see snippet diff). */
  .px-row.px-size-row--clip {
    gap: 10px;
  }
  .px-row.px-size-row--clip button.px-btn {
    box-sizing: border-box;
    padding: 16px;
    min-height: 64px;
    gap: 4px;
    background: #fff;
    border: 1.5px solid #e0e0e0;
    border-radius: 14px;
    box-shadow: 0 1px 4px rgba(0,0,0,0.06);
    justify-content: center;
  }
  .px-row.px-size-row--clip button.px-btn.active {
    background: #111;
    border-color: #111;
    color: #fff;
    box-shadow: 0 2px 8px rgba(0,0,0,0.12);
  }
  .px-row.px-size-row--clip button.px-btn strong {
    font-size: 15px;
    font-weight: 700;
  }
  .px-row.px-size-row--clip button.px-btn .px-btn__sub {
    font-size: 12px;
  }
  /* Caption line below the Medium/Small toggle — replaces the long
     "for slightly smaller faces" sub-text that used to live inside the
     Small button (and visually broke the row alignment). */
  .px-size-caption {
    margin: 6px 0 0;
    font-size: 12px;
    color: #666;
    text-align: center;
    line-height: 1.4;
  }

  /* 2026-05-12 (Quieter): the previous "compact lens info panel (mobile)"
     block flattened the lens-detail card to a single row, hiding the
     description, the transmission bar, and the category badge. With the
     new Quieter design — gradient bar + two-marker Standard + clearer
     hierarchy — that compaction throws away the most useful info.
     Removed the aggressive hiding. Mobile now shows the full card,
     same as desktop. The card itself is already compact (cream fill,
     small text) so vertical cost is modest. */

  /* === Stack title / model / price vertically (mobile), left-aligned ===
     Override global .title-price-wrapper flex-row (line 882) AND the deeper
     .product__title__wrapper which is flex-row by default in Pipeline. */
  .trieye-mobile-title.title-price-wrapper,
  .trieye-mobile-title {
    display: flex !important;
    flex-direction: column !important;
    align-items: flex-start !important;
    justify-content: flex-start !important;
    text-align: left;
  }
  .trieye-mobile-title > *,
  .trieye-mobile-title .product__title__wrapper {
    width: 100%;
    text-align: left;
  }
  .trieye-mobile-title .product__title__wrapper {
    display: block !important;
  }
  .trieye-mobile-title .product__title,
  .trieye-mobile-title .product__price__wrap,
  .trieye-mobile-title .product__price__main {
    display: block;
    width: auto;
    text-align: left;
  }
  .px-model-line {
    display: block;
    width: 100%;
    text-align: left;
  }

  /* Color-section header: hide the color title (redundant with Model line),
     push Size Guide button to the right so it doesn't orphan-left. */
  #px-color-title {
    display: none !important;
  }
  /* Size Guide is moved into .px-size-info by JS on mobile.
     The now-empty .px-model-header and .block-parent collapse.
     Classic's .sizeguidebtn has class "hidden" by intent — honor it. */
  .px-wrap .px-model-header,
  .px-wrap .block-parent:empty,
  .sizeguidebtn.hidden {
    display: none !important;
  }
  .px-wrap .px-size-info {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
  }
  /* 2026-05-12 (Quieter): pill styling for Size Guide button. Now
     applies to BOTH legacy nesting (.px-size-info > .sizeguidebtn —
     Clip's px-model-header layout, Spare Lens) AND the new flex row
     (.px-size-info-row > .sizeguidebtn — View). When inside
     .px-size-info-row, the flex parent's `justify-content: space-
     between` already right-aligns it; margin-left: auto is a safe
     no-op in that context. */
  .px-wrap .px-size-info .sizeguidebtn,
  .px-wrap .px-size-info-row .sizeguidebtn {
    margin-left: auto;
    white-space: nowrap;
    padding: 4px 10px;
    border: 1px solid #222;
    border-radius: 999px;
    text-decoration: none;
    font-size: 10.5px;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    line-height: 1.2;
    background: transparent;
    color: #222;
  }
  .px-wrap .px-size-info .sizeguidebtn:hover,
  .px-wrap .px-size-info .sizeguidebtn:focus,
  .px-wrap .px-size-info-row .sizeguidebtn:hover,
  .px-wrap .px-size-info-row .sizeguidebtn:focus {
    background: #222;
    color: #fff;
  }

  /* Match lens-picker side inset to the rest of the configurator (swatches, mirror).
     trieye-product.css sets .px-wrap horizontal padding; we zero the extra
     15px padding on .px-lens so the buttons align with swatch/mirror edges. */
  .product__media__wrapper > .px-lens,
  .px-wrap > .px-lens {
    padding-left: 0 !important;
    padding-right: 0 !important;
  }

  /* === Model line under the product title (mobile only) === */
  .px-model-line {
    display: block;
    font-size: 10.5px;
    font-weight: 500;
    letter-spacing: 0.5px;
    text-transform: uppercase;
    color: #666;
    line-height: 1.4;
    margin: 2px 0 4px;
  }
  .px-model-line:empty {
    display: none;
  }

  /* === Tighter section rhythm (mobile) === */
  .px-wrap > .px-block {
    margin-top: 16px;
  }
  .px-wrap > .px-lens {
    padding: 0 15px 12px;
  }
  .trieye-mobile-title {
    margin-bottom: 8px;
  }
}

/* "From" price prefix — works on both mobile and desktop */
[data-product-price]::before {
  content: 'From ';
  font-weight: 400;
  font-size: 0.85em;
}

/* Desktop: ensure mobile elements don't show in gallery area */
@media (min-width: 768px) {
  .product__media__wrapper > .title-price-wrapper,
  .product__media__wrapper > .px-lens {
    display: none !important;
  }
  .product__main__content .title-price-wrapper {
    display: flex !important;
  }
  /* Hide theme's native Flickity + sidebar thumbs on desktop ONLY when
     the custom .trieye-gallery is present (configurator products: View,
     Classic, Clip, Spare Lens). Other products (accessories, sale,
     replacement parts) have no custom gallery and rely on Flickity to
     display images. The unscoped version of this rule was hiding gallery
     images on those products entirely. */
  .product__media__wrapper:has(.trieye-gallery) [data-product-slideshow],
  .product__media__wrapper:has(.trieye-gallery) [data-thumbs-holder] {
    display: none !important;
  }
  /* Override sticky on media wrapper — stacked grid scrolls naturally */
  .product__media__wrapper {
    position: relative !important;
    top: auto !important;
  }
  /* Make right column sticky so product info stays visible while scrolling images */
  .product__main__content {
    position: sticky !important;
    top: 100px;
    align-self: flex-start;
  }
}

/* TriEye Custom Gallery — replaces Flickity for filtered variant images */
.trieye-gallery {
  position: relative;
  width: 100%;
  margin-bottom: 10px;
}

/* Desktop: 3-section layout — vertical thumb column on left + main hero on right,
   with lifestyle grid spanning the full width below.
   Uses CSS grid-template-areas so visual order (thumbs left of main) doesn't
   need to match DOM order (JS builds main before thumbs). */
@media (min-width: 768px) {
  .trieye-gallery {
    display: grid;
    grid-template-columns: 88px 1fr;
    grid-template-areas:
      "thumbs main"
      "lifestyle lifestyle";
    gap: 12px;
    align-items: start;
  }
  .trieye-gallery__main      { grid-area: main; }
  .trieye-gallery__thumbs    { grid-area: thumbs; }
  .trieye-gallery__lifestyle { grid-area: lifestyle; }
  .trieye-gallery__dots {
    display: none;
  }

  /* Legacy grid track (kept in case old layout ever renders) */
  .trieye-gallery__track {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 6px;
    overflow: visible;
    scroll-snap-type: none;
  }
  /* Legacy first-slide hero — scoped to __track so it doesn't affect the
     new .trieye-gallery__lifestyle grid's first child */
  .trieye-gallery__track > .trieye-gallery__slide:first-child {
    grid-column: 1 / -1;
    aspect-ratio: 4 / 3;
  }

  /* Generic slide (used by lifestyle grid + legacy track) */
  .trieye-gallery__slide {
    display: block;
    cursor: pointer;
    border-radius: 10px;
    overflow: hidden;
    aspect-ratio: 1 / 1;
    background: #f8f8f8;
  }
  .trieye-gallery__slide img {
    width: 100%;
    height: 100%;
    display: block;
    object-fit: cover;
    border-radius: 10px;
  }

  /* Video slide */
  .trieye-gallery__slide--video {
    position: relative;
    cursor: pointer;
  }
  .trieye-gallery__slide--video iframe,
  .trieye-gallery__slide--video video {
    width: 100%;
    aspect-ratio: 1/1;
    border-radius: 10px;
    display: block;
  }
  .trieye-gallery__slide--video .trieye-play-overlay {
    position: absolute;
    top: 50%; left: 50%;
    transform: translate(-50%, -50%);
    width: 56px; height: 56px;
    background: rgba(0,0,0,0.5);
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    pointer-events: none;
  }
  .trieye-play-overlay svg {
    width: 24px; height: 24px;
    fill: white;
    margin-left: 3px;
  }

  /* ── Main hero image (section 1) ──
     Source images are 1×1 (square) but the product only occupies the middle
     band of the vertical space. We crop ~12% off the top and bottom via CSS
     (aspect-ratio 4:3 + object-fit:cover) so the product fills more of the
     visible area without altering the underlying image file.
     This crop applies ONLY to the main hero — thumbnails and lifestyle grid
     render the full uncropped image. */
  .trieye-gallery__main {
    position: relative;
    aspect-ratio: 4 / 3;
    background: #f7f7f7;
    border-radius: 10px;
    overflow: hidden;
    cursor: zoom-in;
    /* margin-bottom removed — grid `gap` now handles spacing to lifestyle row */
  }
  .trieye-gallery__main img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center center;
    display: block;
    transition: transform 0.2s ease;
  }
  .trieye-gallery__main:hover img {
    transform: scale(1.015);
  }

  /* ── Technical thumbnail column (section 2) ──
     Vertical stack on the left of the main hero. Each thumb is 80×80,
     same width as the parent grid column (~88px) minus the 2px border.
     `align-self: center` centers the stack vertically against the taller
     main-hero column without stretching the thumbs container itself. */
  .trieye-gallery__thumbs {
    display: flex;
    flex-direction: column;
    gap: 8px;
    margin: 0;
    align-self: center;
  }
  .trieye-gallery__thumb {
    /* Kept as 1:1 squares — crop only applies to the main hero, thumbs show
       the full image so the user can see the actual shot they're selecting. */
    width: 80px;
    height: 80px;
    border-radius: 6px;
    overflow: hidden;
    cursor: pointer;
    background: #f7f7f7;
    border: 2px solid transparent;
    padding: 0;
    flex-shrink: 0;
    transition: border-color 0.15s ease, transform 0.15s ease;
    appearance: none;
    -webkit-appearance: none;
  }
  .trieye-gallery__thumb:hover { transform: translateY(-1px); }
  .trieye-gallery__thumb.is-active { border-color: #111; }
  .trieye-gallery__thumb img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center center;
    display: block;
    border-radius: 0;
  }
  .trieye-gallery__thumb:focus-visible {
    outline: none;
    border-color: #EF4136;
  }

  /* ── Lifestyle grid (section 3) ── */
  .trieye-gallery__lifestyle {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 6px;
  }
  /* Lifestyle slides inherit .trieye-gallery__slide styling above;
     no first-child full-width override (we keep a clean 2-col grid). */

  /* Placeholder slots — visible "coming soon" style */
  .trieye-gallery__slide--placeholder {
    background: #f5f5f5;
    border: 2px dashed #d0d0d0;
    border-radius: 10px;
    display: flex;
    align-items: center;
    justify-content: center;
    aspect-ratio: 1;
  }
}

/* ── TriEye Lightbox (fullscreen gallery overlay) ── */
.trieye-lightbox {
  position: fixed;
  inset: 0;
  z-index: 99999;
  display: none;
  align-items: center;
  justify-content: center;
}
.trieye-lightbox.is-open {
  display: flex;
}
.trieye-lightbox__backdrop {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, 0.92);
}
.trieye-lightbox__content {
  position: relative;
  z-index: 1;
  width: 90vw;
  height: 90vh;
  display: flex;
  align-items: center;
  justify-content: center;
}
.trieye-lightbox__media {
  max-width: 100%;
  max-height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}
.trieye-lightbox__img {
  max-width: 90vw;
  max-height: 90vh;
  object-fit: contain;
  border-radius: 4px;
  user-select: none;
  -webkit-user-drag: none;
  /* Pinch + drag-to-pan handled by JS; touch-action: none stops iOS
     Safari from intercepting the pinch as a page-zoom. */
  touch-action: none;
  will-change: transform;
  transition: transform 0.2s ease;
  cursor: zoom-in;
}
.trieye-lightbox__img:active { cursor: grabbing; }
.trieye-lightbox__video {
  width: 80vw;
  height: 70vh;
  max-width: 960px;
  max-height: 540px;
  border: none;
  border-radius: 4px;
}

/* Nav buttons */
.trieye-lightbox__close,
.trieye-lightbox__prev,
.trieye-lightbox__next {
  position: absolute;
  z-index: 2;
  background: none;
  border: none;
  color: #fff;
  cursor: pointer;
  padding: 12px;
  opacity: 0.8;
  transition: opacity 0.2s;
}
.trieye-lightbox__close:hover,
.trieye-lightbox__prev:hover,
.trieye-lightbox__next:hover {
  opacity: 1;
}
.trieye-lightbox__close {
  top: 16px;
  right: 16px;
  font-size: 32px;
  line-height: 1;
  font-weight: 300;
}
.trieye-lightbox__prev {
  left: 12px;
  top: 50%;
  transform: translateY(-50%);
}
.trieye-lightbox__next {
  right: 12px;
  top: 50%;
  transform: translateY(-50%);
}
.trieye-lightbox__counter {
  position: absolute;
  z-index: 2;
  bottom: 20px;
  left: 50%;
  transform: translateX(-50%);
  color: rgba(255, 255, 255, 0.7);
  font-size: 14px;
  font-weight: 500;
  letter-spacing: 0.5px;
}

/* Gallery slides cursor hint */
@media (min-width: 768px) {
  .trieye-gallery__slide {
    cursor: zoom-in;
  }
}

/* Mobile: horizontal scroll-snap carousel */
@media (max-width: 767px) {
  .trieye-gallery__track {
    display: flex;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    -webkit-overflow-scrolling: touch;
    overscroll-behavior-x: contain;
    scrollbar-width: none;
    border-radius: 14px;
    /* Prevent tallest slide from stretching all others (e.g. a 1:1 image
       stretching landscape slides and leaving empty space below them). */
    align-items: flex-start;
  }
  .trieye-gallery__track::-webkit-scrollbar {
    display: none;
  }

  .trieye-gallery__slide {
    flex: 0 0 100%;
    scroll-snap-align: start;
    scroll-snap-stop: always;
    /* Force a consistent 4:3 frame on mobile so mixed aspect ratios
       (some 4:3, some 1:1) don't create visual jumps between slides. */
    aspect-ratio: 4 / 3;
    display: flex;
    align-items: center;
    justify-content: center;
    overflow: hidden;
  }

  .trieye-gallery__slide img {
    width: 100%;
    height: auto;
    display: block;
    object-fit: contain;
    user-select: none;
    -webkit-user-drag: none;
    border-radius: 14px;
  }

  .trieye-gallery__thumbs {
    display: none;
  }

  .trieye-gallery__dots {
    display: flex;
    justify-content: center;
    gap: 6px;
    padding: 10px 0;
  }

  .trieye-gallery__dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: rgba(0,0,0,0.2);
    cursor: pointer;
    transition: background 0.2s;
  }

  .trieye-gallery__dot.is-active {
    background: #000;
  }
}

/* ─── Classic — Included spare lens card + explainer modal ─────────────── */
/* Self-contained styles: the base .addon-category-btn CSS lives inside a
   <style> tag in the classic snippet that only renders when addon collections
   have products. Our "Included" card must render correctly regardless, so we
   repeat the base addon-button shape here, scoped to the --included modifier. */

.addon-categories--included {
  display: flex;
  flex-direction: column;
  margin: 12px 0 4px;
}
/* Chained selector to win specificity against the snippet's inline `.addon-category-btn`
   rule (same specificity, but snippet <style> comes later in cascade). */
.addon-category-btn.addon-category-btn--included {
  display: flex;
  flex-direction: column;
  width: 100%;
  padding: 10px 12px;
  /* Render as an info notice, not a button — no border, no hover, soft tinted background. */
  background: #fafafa;
  border: 0;
  border-radius: 6px;
  font-size: 14px;
  text-align: left;
  font-family: inherit;
  color: inherit;
  cursor: default;
}
.addon-category-btn.addon-category-btn--included:hover { background: #fafafa; }
.addon-category-btn--included .addon-category__default {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
}
.addon-category-btn--included .addon-category-icon {
  width: 20px;
  height: 20px;
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.addon-category-btn--included .addon-category-icon--gift { color: #EB6E0B; }
.addon-category-btn--included .addon-category-icon--gift svg { width: 20px; height: 20px; }
.addon-category-btn--included .addon-category__text {
  flex: 1;
  display: flex;
  flex-direction: column;
  min-width: 0;
}
.addon-category-btn--included .addon-category-label {
  font-weight: 600;
  flex: none;
  line-height: 1.3;
}
.addon-category-btn--included .addon-category-hint {
  font-size: 11px;
  color: #888;
  line-height: 1.3;
}
.addon-category-btn--included .addon-category-label-row {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-wrap: wrap;
}
.pill-included {
  display: inline-block;
  background: #1a8754;
  color: #fff;
  padding: 2px 8px;
  border-radius: 999px;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  line-height: 1.4;
}

/* ============================================================
   Specification section
   ============================================================ */

.spec-section {
  --spec-bg: #000;
  --spec-fg: #e6e6e6;
  --spec-muted: #888;
  --spec-border: #1a1a1a;
  --spec-accent: #fff;
  background: var(--spec-bg);
  color: var(--spec-fg);
  font-family: inherit;
}

.spec-section__inner {
  max-width: 1200px;
  margin: 0 auto;
  padding: 48px 24px;
  display: grid;
  grid-template-columns: 1.4fr 1fr;
  gap: 40px;
  align-items: center;
}

.spec-section__wireframe {
  position: relative;
  background: #060606;
  border-radius: 6px;
  aspect-ratio: 7 / 4;
  overflow: hidden;
}

.spec-section__wireframe img {
  width: 100%;
  height: 100%;
  display: block;
  object-fit: contain;
}

.spec-callout {
  position: absolute;
  color: #bfc8cf;
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 11px;
  letter-spacing: 0.05em;
  pointer-events: none;
  white-space: nowrap;
}

.spec-panel {
  padding: 8px 0;
}

.spec-panel__title {
  color: var(--spec-accent);
  font-size: 16px;
  font-weight: 600;
  margin: 0 0 16px;
  letter-spacing: 0.01em;
}

.spec-acc {
  border-top: 1px solid var(--spec-border);
}

.spec-acc__header {
  width: 100%;
  background: transparent;
  border: 0;
  padding: 14px 0;
  color: var(--spec-accent);
  font-size: 14px;
  font-weight: 600;
  letter-spacing: 0.02em;
  text-align: left;
  display: flex;
  justify-content: space-between;
  align-items: center;
  cursor: pointer;
  font-family: inherit;
  list-style: none;
}

.spec-acc__header::-webkit-details-marker {
  display: none;
}

.spec-acc__header::after {
  content: '+';
  color: var(--spec-muted);
  font-size: 16px;
}

.spec-acc[open] > .spec-acc__header::after {
  content: '−';
}

.spec-acc__body {
  padding: 0 0 18px;
  font-size: 13px;
  line-height: 1.5;
}

.spec-acc__body .spec-row {
  display: flex;
  justify-content: space-between;
  padding: 7px 0;
  border-bottom: 1px solid var(--spec-border);
}

.spec-acc__body .spec-row > span:first-child {
  color: var(--spec-muted);
}

.spec-acc__section-label {
  color: var(--spec-muted);
  font-size: 10px;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  margin: 10px 0 6px;
}

/* ---------- Lenses matrix ---------- */

.spec-lens-matrix {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
  margin-top: 4px;
}

.spec-lens-matrix th,
.spec-lens-matrix td {
  text-align: left;
  padding: 7px 8px;
  border-bottom: 1px solid var(--spec-border);
}

.spec-lens-matrix th {
  color: var(--spec-muted);
  font-weight: 500;
  font-size: 10px;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

/* ---------- Frame colors ---------- */

.spec-swatches {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  padding-top: 4px;
}

.spec-swatch {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 11px;
  color: #c6c6c6;
}

.spec-swatch__dot {
  width: 18px;
  height: 18px;
  border-radius: 50%;
  border: 1px solid #2a2a2a;
  display: inline-block;
}

/* ---------- Measurements ---------- */

.spec-measurements__header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 8px;
}

.spec-measurements__label {
  color: var(--spec-muted);
  font-size: 10px;
  text-transform: uppercase;
  letter-spacing: 0.06em;
}

.spec-unit-toggle {
  display: flex;
  gap: 2px;
  background: #0f0f0f;
  padding: 2px;
  border-radius: 4px;
}

.spec-unit-toggle__btn {
  background: transparent;
  color: var(--spec-muted);
  border: 0;
  padding: 3px 10px;
  font-size: 11px;
  cursor: pointer;
  border-radius: 3px;
  font-family: inherit;
  letter-spacing: 0.04em;
}

.spec-unit-toggle__btn.is-active {
  background: var(--spec-accent);
  color: #000;
  font-weight: 600;
}

.spec-measurements__table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
}

.spec-measurements__table th,
.spec-measurements__table td {
  text-align: left;
  padding: 7px 8px;
  border-bottom: 1px solid var(--spec-border);
}

.spec-measurements__table th {
  color: var(--spec-muted);
  font-weight: 500;
  font-size: 10px;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

/* 2026-05-14: short fit hint shown under the dimensions table on
   multi-size products. Small font, muted color — guidance for the
   customer to pick S vs M without dominating the chart. */
.spec-measurements__fithint {
  margin: 10px 0 0;
  padding: 8px 10px;
  background: rgba(255, 255, 255, 0.04);
  border-left: 2px solid var(--spec-muted, #999);
  font-size: 12px;
  line-height: 1.45;
  color: var(--spec-fg, #ccc);
}
.spec-measurements__fithint strong {
  font-weight: 600;
  color: var(--spec-fg, #fff);
}
/* 2026-05-20 — Link to The View shown on Classic's fithint (for larger-face customers). */
.spec-measurements__fithint-link {
  color: var(--spec-fg, #fff);
  font-weight: 600;
  text-decoration: underline;
  text-underline-offset: 3px;
}
.spec-measurements__fithint-link:hover {
  text-decoration-thickness: 2px;
}

/* ---------- Size Guide modal ---------- */

.spec-size-modal {
  background: var(--spec-bg, #000);
  color: var(--spec-fg, #e6e6e6);
  padding: 24px;
  border-radius: 6px;
  min-width: 320px;
}

/* ---------- Responsive ---------- */

@media (max-width: 767px) {
  .spec-section__inner {
    grid-template-columns: 1fr;
    gap: 24px;
    padding: 32px 16px;
  }
  .spec-section__wireframe {
    aspect-ratio: 16 / 9;
  }
}

/* ---------- Spare Lens: no wireframe, full-width panel ---------- */

.spec-section--lens-only .spec-section__inner {
  grid-template-columns: 1fr;
}

.spec-section--lens-only .spec-section__wireframe {
  display: none;
}

/* ============================================================
   Lens Picker (SunGod-style spare lens modal inside addon drawer)
   ============================================================ */

.lens-picker { display: none; }

.addon-drawer[data-active-category="lenses"] .lens-picker { display: block; }
.addon-drawer[data-active-category="lenses"] .addon-card[data-addon-category="lenses"] { display: none !important; }
.addon-drawer[data-active-category="lenses"] .addon-drawer__body-title { display: none; }

/* Cancel button styling — shared between lens + accessories modes */
.addon-drawer__cancel {
  background: transparent;
  color: #555;
  border: 0;
  padding: 8px;
  margin-top: 6px;
  font-size: 13px;
  cursor: pointer;
  text-decoration: underline;
  font-family: inherit;
}

.addon-drawer__cancel:hover { color: #111; }

/* iOS safe-area padding for the drawer footer */
.addon-drawer__footer {
  padding-bottom: calc(20px + env(safe-area-inset-bottom, 0px));
}

.lens-picker__header {
  font-size: 22px;
  font-weight: 700;
  margin: 0 0 12px;
  letter-spacing: -0.01em;
}

.lens-picker__promo-slot {
  margin-bottom: 12px;
}

.lens-picker__promo-slot .addon-lens-promo {
  margin: 0;
}

.lens-picker__price {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 4px 0 12px;
  font-size: 14px;
}

.lens-picker__price-sale {
  font-weight: 700;
  font-size: 18px;
  color: #111;
}

.lens-picker__price-original {
  color: #999;
  text-decoration: line-through;
  font-size: 14px;
}

.lens-picker__price-badge {
  display: inline-block;
  background: #137333;
  color: #fff;
  padding: 2px 8px;
  border-radius: 4px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

.lens-picker__price-badge:empty,
.lens-picker__price-original:empty,
.lens-picker__price-saved:empty {
  display: none;
}

.lens-picker__price-saved {
  color: #137333;
  font-size: 13px;
  font-weight: 600;
}

.addon-category-discount-badge {
  display: inline-block;
  background: #137333;
  color: #fff;
  padding: 2px 8px;
  border-radius: 4px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  margin-left: 8px;
  vertical-align: middle;
}

.lens-picker__side-slot {
  margin: 10px 0 14px;
}

.lens-picker__side-slot .addon-lens-side-toggle {
  display: flex !important;   /* override inline style:display:none when parked in picker */
  margin: 0;
}

.lens-picker__hero {
  position: relative;
  padding: 4px;
  display: flex; align-items: center; justify-content: center;
  min-height: 200px;
}

.lens-picker__hero img[data-lens-hero] {
  max-width: 100%; max-height: 260px;
  object-fit: contain;
  transition: transform 0.25s ease, opacity 0.15s;
}

.lens-picker__hero img[data-lens-hero].is-flipped {
  transform: scaleX(-1);
}

/* Dual: stack a second flipped image as a subtle duplicate so the user sees
   a symmetric "both sides" visual. Layout uses a pseudo-element. */
.lens-picker__hero img[data-lens-hero].is-dual {
  transform: scale(0.85);
}

.lens-picker__hero.has-dual::after {
  content: '';
  position: absolute;
  inset: 0;
  background-image: var(--dual-hero-url);
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
  transform: scaleX(-1) scale(0.85);
  opacity: 0.6;
  pointer-events: none;
}

.lens-picker__hero-extra {
  position: absolute;
  bottom: 6px; right: 6px;
  width: 72px; height: 72px;
  object-fit: contain;
  background: #fff;
  border: 1px solid #e4e4e4;
  border-radius: 8px;
  padding: 4px;
  box-shadow: 0 2px 6px rgba(0,0,0,0.08);
}

.lens-picker__info {
  padding: 14px 2px 10px;
  display: flex; justify-content: space-between; align-items: flex-start;
  gap: 12px;
}

.lens-picker__title {
  font-size: 16px; line-height: 1.3;
}

.lens-picker__title strong {
  font-weight: 700; margin-right: 6px;
}

.lens-picker__title span {
  color: #666; font-weight: 400;
}

.lens-picker__weather {
  display: flex; gap: 6px; font-size: 16px; color: #666;
}

.lens-picker__weather span { opacity: 0.35; transition: opacity 0.2s; }
.lens-picker__weather span.is-active { opacity: 1; }

.lens-picker__swatches {
  display: flex; flex-wrap: wrap; gap: 8px;
  padding: 8px 0;
}

.lens-swatch {
  width: 40px; height: 40px;
  border-radius: 50%;
  border: 2px solid transparent;
  background: transparent;
  cursor: pointer; padding: 2px;
  transition: border-color 0.15s, transform 0.15s;
  flex-shrink: 0;
}

.lens-swatch__color {
  display: block;
  width: 100%; height: 100%;
  border-radius: 50%;
  background: #ccc;
}

.lens-swatch:hover { transform: scale(1.08); }
.lens-swatch.is-selected {
  border-color: #111;
}

.lens-swatch.is-unavailable {
  display: none;
}

/* Per-lens color tokens */
.lens-swatch__color[data-swatch-color="yellow"]              { background: #f4d94c; }
.lens-swatch__color[data-swatch-color="smoke"]               { background: #3a3a3a; }
.lens-swatch__color[data-swatch-color="clear"]               { background: #e8e8e8; }
.lens-swatch__color[data-swatch-color="high-contrast-smoke"] { background: #5a4535; }
.lens-swatch__color[data-swatch-color="reflective-red"]      { background: #d03a2e; }
.lens-swatch__color[data-swatch-color="reflective-blue"]     { background: #2c80c8; }
.lens-swatch__color[data-swatch-color="reflective-orange"]   { background: #e8842a; }
.lens-swatch__color[data-swatch-color="reflective-rose"]     { background: #e4a7a2; }
.lens-swatch__color[data-swatch-color="polarized-smoke"]     { background: #1e1e1e; }
.lens-swatch__color[data-swatch-color="photochromatic-smoke"],
.lens-swatch__color[data-swatch-color="photochromic-smoke-0-3"],
.lens-swatch__color[data-swatch-color="photochromic-smoke-0-2"] {
  background: linear-gradient(135deg, #e8e8e8 0%, #2a2a2a 100%);
}
.lens-swatch__color[data-swatch-color="photochromic-full-spectrum-smoke"] {
  background: linear-gradient(135deg, #e8e8e8 0%, #0f0f0f 100%);
}

.lens-picker__desc {
  margin: 12px 0 16px;
  color: #555;
  font-size: 14px;
  line-height: 1.5;
  min-height: 40px;
}

/* ---------- Nosepad section ---------- */

.nosepad-section {
  margin-top: 18px;
  padding-top: 18px;
  border-top: 1px solid #eee;
}

.nosepad-section__title {
  font-size: 14px; font-weight: 700;
  margin: 0 0 10px;
}

.nosepad-option {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 12px;
  border: 1px solid #e0e0e0; border-radius: 8px;
  margin-bottom: 8px;
  cursor: pointer;
  transition: border-color 0.15s, background 0.15s;
  font-size: 14px;
}

.nosepad-option:hover { border-color: #bbb; }

.nosepad-option input[type="radio"] {
  margin: 0;
  accent-color: #111;
  flex-shrink: 0;
}

.nosepad-option input[type="radio"]:checked + .nosepad-option__label { font-weight: 600; }
.nosepad-option:has(input:checked) { border-color: #111; background: #fafafa; }

.nosepad-option__label {
  flex: 1;
}

.nosepad-option__price {
  color: #888; font-weight: 500; font-size: 13px;
}

/* ---------- Picker footer buttons ---------- */

.lens-picker__add {
  width: 100%;
  margin-top: 18px;
  padding: 14px 20px;
  background: #111; color: #fff;
  border: 0; border-radius: 8px;
  font-size: 15px; font-weight: 600;
  cursor: pointer;
  display: flex; justify-content: space-between; align-items: center;
  gap: 12px;
}

.lens-picker__add:disabled {
  opacity: 0.5; cursor: not-allowed;
}

.lens-picker__add:not(:disabled):hover { background: #333; }

.lens-picker__cancel {
  width: 100%;
  margin-top: 8px;
  padding: 12px 20px;
  background: transparent; color: #111;
  border: 1px solid #ddd; border-radius: 8px;
  font-size: 14px; font-weight: 500;
  cursor: pointer;
}

.lens-picker__cancel:hover { background: #f5f5f5; }

/* ---------- Mobile + tablet: addon drawer covers full viewport ----------
   2026-05-21 — Was `max-width: 768px`. User feedback: at tablet widths
   (768–1024) the 420px sidebar drawer left a dimmed half of the page
   behind it, which read as "half-whitened screen" rather than as a
   focused takeover. Extending the full-screen treatment up to 1024px
   so phones, tablets, and small laptops all get the same clean
   takeover. Above 1024px (desktop) keeps the 420px sidebar + overlay
   pattern.
   ----------------------------------------------------------------- */
@media (max-width: 1024px) {
  .addon-drawer {
    top: 0 !important;
    bottom: 0 !important;
    left: 0 !important;
    right: 0 !important;
    width: 100% !important;
    max-width: 100% !important;
    /* 2026-05-19 — `dvh` (dynamic viewport) replaces `vh` so the drawer
       reflows when iOS Safari's URL bar appears/disappears, instead of
       overflowing behind the bottom browser chrome. */
    height: 100dvh !important;
    max-height: 100dvh !important;
    border-radius: 0 !important;
    z-index: 99999 !important;
  }
  /* Override the desktop slide-in transition so the drawer doesn't
     animate from `right: -440px` (off-screen-by-440) when it's now
     full-width. Slide from below instead — cleaner on tablet. */
  .addon-drawer:not(.is-open) {
    transform: translateY(100%);
    right: 0 !important;
  }
  .addon-drawer.is-open {
    transform: translateY(0);
  }
  .addon-drawer-overlay {
    z-index: 99998 !important;
  }
  .addon-drawer__body {
    max-height: calc(100dvh - 120px) !important;
    overflow-y: auto;
  }
  .lens-picker__hero { min-height: 160px; }
  .lens-picker__hero img[data-lens-hero] { max-height: 220px; }
}

/* ============================================================
   Addon system — canonical visual styles for category buttons,
   slide-out drawer, addon cards, side toggle, badges. Applies
   uniformly across The View, Classic, Clip, Spare Lens
   configurators. (Logic per snippet still lives in each snippet —
   only the look is shared here.)
   ============================================================ */
.addon-categories { display: flex; flex-direction: column; gap: 8px; margin: 16px 0; }

/* 2026-05-19 (v42) — Quieter "optional" treatment per user.
   The previous filled grey card (background #f5f5f5 + solid border)
   competed visually with the primary ATC button and the Choose Type /
   Mirror Position selectors above. These are upsells — should read
   as optional, not as required steps. Changes:
     background: #f5f5f5 (filled card)   → #fff  (ghost)
     border:     1px solid #e0e0e0        → 1px dashed #dcdcdc
     radius:     10px                     → 8px
     padding:    14px 16px                → 12px 14px
     icon size:  20px                     → 17px
     label:      600 weight #222          → 500 weight #444
     hint color: #555                     → #6a6a6a
     arrow:      20px #999                → 18px #c0c0c0
   The dashed border is the classic "add / optional" signal —
   immediately reads as "you can add this if you want" rather than
   "you need to pick one of these". The green "Save up to X%" pop
   stays — that's our actual conversion hook and needs to remain bright. */
.addon-category-btn {
  display: flex; flex-direction: column;
  width: 100%; padding: 12px 14px;
  background: #fff; border: 1px dashed #dcdcdc; border-radius: 8px;
  cursor: pointer; font-size: 15px; text-align: left;
  transition: background 0.15s, border-color 0.15s;
}
.addon-category-btn:hover { background: #fafafa; border-color: #c8c8c8; }
/* Selected state — once the user adds something, promote the card
   to a solid border so it reads as "done", not "still empty". */
.addon-category-btn.has-selection {
  background: #fff;
  border-style: solid;
  border-color: #c8c8c8;
}
.addon-category__default {
  display: flex; align-items: center; gap: 12px; width: 100%;
}
.addon-category-icon { font-size: 17px; opacity: 0.75; }
.addon-category__text { flex: 1; display: flex; flex-direction: column; }
/* 2026-05-19 (v23) — Configurator typography bumps for 40+ readability:
     label 13.5px → 15px (was a bit small for primary card titles)
     hint  11px   → 13px (was below WCAG-AA threshold for older readers)
     hint  color  #888 → #555 (better contrast on white card bg)
   2026-05-19 (v42) — Lightened label weight + colors so the cards
   feel optional, not mandatory. Hint contrast stays WCAG-AA on white. */
.addon-category-label { font-weight: 500; font-size: 15px; color: #444; line-height: 1.3; }
.addon-category-hint { font-size: 13px; color: #6a6a6a; margin-top: 3px; line-height: 1.45; }
/* 2026-05-12 (Quieter): "Save up to X%" sub-emphasis inside the hint
   — same money-back-to-you green as the YOUR BUILD savings line.
   Kept bold + bright at v42 — this is the actual upsell conversion hook. */
.addon-category-hint__save { color: #16a34a; font-weight: 700; }
.addon-category-arrow { font-size: 18px; color: #c0c0c0; }
.addon-category__selected {
  display: flex; align-items: center; gap: 12px; width: 100%;
}
.addon-category__thumbs {
  display: flex; gap: 4px; flex-shrink: 0;
}
.addon-category__thumbs img {
  width: 36px; height: 36px; object-fit: cover;
  border-radius: 6px; background: #f0f0f0;
}
.addon-category__info { flex: 1; }
.addon-category__count {
  display: block; font-weight: 600; font-size: 14px;
}
.addon-category__prices {
  display: flex; gap: 6px; font-size: 13px;
}
.addon-category__prices .original {
  text-decoration: line-through; color: #999;
}
.addon-category__prices .discounted {
  color: #22c55e; font-weight: 600;
}
.addon-category__edit {
  font-size: 16px; color: #666; flex-shrink: 0;
}

.addon-drawer-overlay {
  position: fixed; inset: 0; background: rgba(0,0,0,0.4);
  z-index: 25000; opacity: 0; transition: opacity 0.3s;
}
.addon-drawer-overlay.is-open { opacity: 1; }

/* Desktop: slide from right */
.addon-drawer {
  position: fixed; right: -440px; top: 0; bottom: 0; width: 420px; max-width: 90vw;
  background: #fff; z-index: 25001;
  display: flex; flex-direction: column;
  box-shadow: -4px 0 20px rgba(0,0,0,0.15);
  transition: right 0.3s ease;
}
.addon-drawer.is-open { right: 0; }

.addon-drawer__header {
  display: flex; align-items: center; justify-content: center;
  padding: 24px 24px 16px; gap: 12px;
  position: relative;
}
.addon-drawer__header h3 {
  margin: 0; font-size: 22px; font-weight: 700;
  text-align: center; flex: 0 1 auto;
}
.addon-drawer__header .addon-drawer__close {
  position: absolute; right: 16px; top: 50%; transform: translateY(-50%);
}
.addon-drawer__handle { display: none; /* hidden on desktop */ }
.addon-drawer__close {
  background: none; border: none; font-size: 28px;
  cursor: pointer; color: #666; padding: 0; line-height: 1;
}
.addon-drawer__body {
  flex: 1; overflow-y: auto; padding: 0 24px 16px;
  max-height: calc(100vh - 160px);
}
.addon-drawer__body-title {
  font-size: 22px; font-weight: 700; margin: 0 0 12px; padding: 40px 0 0;
}
.addon-lens-promo {
  background: #f7faf4; border: 1px solid #d6e8c9; color: #2d5016;
  border-radius: 10px; padding: 10px 14px;
  font-size: 13px; line-height: 1.4; margin: 0 0 12px;
}
.addon-lens-promo strong { color: #137333; font-weight: 700; }
.addon-lens-side-toggle {
  display: flex; gap: 4px; padding: 4px;
  background: #f0f0f0; border-radius: 10px; margin: 0 0 16px;
}
.addon-lens-side-toggle__btn {
  flex: 1 1 0; padding: 10px 12px;
  background: transparent; border: 0; border-radius: 7px;
  font-size: 13px; font-weight: 600; color: #555; cursor: pointer;
  transition: background 0.15s, color 0.15s;
}
.addon-lens-side-toggle__btn.is-active {
  background: #fff; color: #111; box-shadow: 0 1px 3px rgba(0,0,0,.12);
}
.addon-drawer__footer {
  padding: 16px 24px; border-top: 1px solid #eee;
}
.addon-drawer__footer-inner { display: none; }
/* 2026-05-11 (L6): hide the black "Add" button entirely until the user has
   actually selected an addon. The permanent Close button below the Add slot
   handles the "exit without adding" path now, so the empty/default state
   doesn't need a second neutral button. When items are selected, the Add
   button appears ABOVE Close (DOM order is Add → Close so flex stacking
   matches).
   2026-05-11 (L6 v2): matched Add button box-model to Close so they read
   as twin buttons (same padding, same border width, same min-height,
   box-sizing border-box). Without this Close looked narrower because its
   1.5px border consumed 3px of content width while Add had border:0. */
.addon-drawer__done {
  box-sizing: border-box;
  width: 100%; display: flex; justify-content: center; align-items: center;
  gap: 8px;
  padding: 14px 20px; font-size: 15px; font-weight: 600;
  min-height: 52px;
  /* L32: rounded corners — user reversed the L23 square decision. The
     "Add Accessories" / "Add Spare Lens" buttons read better with the
     same 10px radius as the sticky drawer's Add to Cart and the addon
     category buttons that open this drawer in the first place. */
  border-radius: 10px; cursor: pointer;
  transition: background 0.2s, color 0.2s, border-color 0.2s;
  border: 1.5px solid transparent;
}
.addon-drawer__done.has-items {
  display: flex;
  justify-content: space-between;
  background: #000; color: #fff; border-color: #000;
}
.addon-drawer__done:not(.has-items) {
  display: none !important;
}

/* 2026-05-11 / 2026-05-12 (Quieter): the Clip icon-hide rule has been
   removed. It existed because the Clip-on PDP used metaobject icons
   that pointed at the wrong files (contrast.svg, Reflective.svg) for
   its actual coatings (Polarized + Clear). The Quieter redesign
   replaces those with the shared `lens-icon` snippet which renders
   correctly-mapped inline SVGs — Polarized gets the parallel-lines
   icon, Clear gets an empty circle — so they're no longer clutter and
   should show like the other products. */

/* 2026-05-11 (L6): close button is the PERMANENT bottom action — always
   visible, full-width, white with black outline. When the user actually
   selects an addon, the Add button (black) appears above it. This replaces
   the earlier (D-B) low-emphasis text-link styling. The × icon is hidden;
   plain "Close" reads cleaner next to a possible Add CTA.
   2026-05-11 (L6 v2): box-sizing + min-height matched to .addon-drawer__done
   so they look like identical-sized twin buttons stacked. */
.addon-drawer__close-bottom {
  box-sizing: border-box;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  width: 100%;
  margin-top: 8px;
  padding: 14px 20px;
  min-height: 52px;
  background: #fff;
  border: 1.5px solid #111;
  /* L32: rounded corners — matches the Add button above and the
     sticky drawer's Add to Cart. */
  border-radius: 10px;
  cursor: pointer;
  font-family: inherit;
  font-size: 15px;
  font-weight: 600;
  color: #111;
  letter-spacing: 0.02em;
  transition: background 0.15s, color 0.15s;
}
.addon-drawer__close-bottom:hover,
.addon-drawer__close-bottom:focus-visible {
  background: #f5f5f5;
  color: #000;
}
/* L6: drop the × — user wants a plain text Close button (matches the
   "as we have on the start" reference). */
.addon-drawer__close-bottom__icon { display: none; }
.addon-drawer__close-bottom__label {
  text-decoration: none;
  font-weight: 600;
}

/* 2026-05-19 — Lock body scroll when addon drawer is open. Previously the
   page behind the drawer remained scrollable on iOS Safari and Chrome,
   which let customers accidentally scroll the PDP while in the addon flow.
   Uses :has() (modern browsers; iOS 15.4+, Chrome 105+) so we don't have
   to edit the 4 per-product snippet JS files. */
html:has(.addon-drawer.is-open),
body:has(.addon-drawer.is-open) {
  overflow: hidden !important;
  height: 100%;
  /* touch-action: none blocks iOS Safari's rubber-band overscroll behind
     the drawer; pan-y still allowed for legit scroll inside the drawer body. */
  overscroll-behavior: contain;
}

/* Mobile: bottom sheet */
@media (max-width: 767px) {
  .addon-drawer {
    right: auto; top: auto;
    left: 0; bottom: 0; width: 100%; max-width: 100%;
    /* 2026-05-19 — switched from 90vh to 90dvh (dynamic viewport height).
       iOS Safari's `vh` unit is fixed to the zoom-out viewport, which
       INCLUDES the URL-bar area — so when the URL bar appears on scroll,
       the bottom of the drawer (Close button) gets covered. `dvh` adapts
       to the dynamic viewport and keeps the Close button fully visible. */
    height: auto; max-height: 90dvh;
    border-radius: 16px 16px 0 0;
    transform: translateY(100%);
    transition: transform 0.3s ease;
    box-shadow: 0 -4px 20px rgba(0,0,0,0.15);
    z-index: 25001;
    /* Account for iOS home-indicator + URL-bar safe area so the Close
       button never hides behind a browser chrome element. */
    padding-bottom: env(safe-area-inset-bottom);
  }
  .addon-drawer.is-open { transform: translateY(0); }
  /* 2026-05-19 (v41) — Replaced the grey drag-handle pill with a
     smaller TriEye logo per user. Same Logo.svg the header serves
     so it stays in sync with brand updates. Rendered at ~80px wide
     (vs. the header's 100px) and 0.55 opacity so it reads as a
     subtle brand mark, not a secondary header. */
  .addon-drawer__handle {
    display: block;
    text-align: center;
    padding: 14px 0 6px;
  }
  .addon-drawer__handle span {
    display: inline-block;
    width: 80px;
    height: 24px;
    background: url('//trieye-as.myshopify.com/cdn/shop/files/Logo.svg?v=1772516712') center/contain no-repeat;
    opacity: 0.55;
    border-radius: 0;
  }
  .addon-drawer__close { display: none; }
  .addon-drawer__header {
    display: flex; align-items: center; justify-content: center;
    padding: 20px 20px 16px;
  }
  .addon-drawer__header h3 { font-size: 18px; text-align: center; }
  .addon-drawer__body { padding-top: 8px; }
  /* 2026-05-11 (L6 v2): switched from fixed max-height to flex-based sizing.
     The previous `max-height: calc(80vh - 120px)` was tuned for a single-button
     footer (~70px). The new dual-button footer (Add + Close, ~136px) plus
     header (~76px) on a small-phone viewport (≤600px tall, drawer = 540px)
     overflowed by ~20px, clipping the bottom of the Close button behind the
     viewport's bottom edge. Letting the body flex-grow with `min-height: 0`
     so it can shrink lets the footer keep its natural size and stay fully
     on-screen on every viewport height. */
  .addon-drawer__body {
    padding: 0 20px 12px;
    display: block;
    overflow-y: auto;
    flex: 1 1 auto;
    min-height: 0;
    max-height: none;
  }
  .addon-drawer__body-title { font-size: 24px; margin: 0 0 10px; }
  .addon-drawer .addon-card[data-addon-category] {
    padding: 14px; margin-bottom: 10px;
    border-radius: 10px; border-width: 2px;
  }
  .addon-drawer .addon-card[data-addon-category].active {
    border-color: #5b5bf7; background: #fff;
  }
  .addon-card__image { width: 90px; height: 90px; }
  .addon-card__title { font-size: 16px; font-weight: 700; }
  .addon-card__desc { font-size: 13px; color: #666; }
  .addon-card__check { width: 24px; height: 24px; }
  .addon-checkbox {
    width: 24px; height: 24px; border-radius: 5px;
    border-width: 2px; border-color: #d0d0d0;
  }
  .addon-card[data-addon-category].active .addon-checkbox {
    background: #5b5bf7; border-color: #5b5bf7;
  }
  .addon-drawer__footer {
    padding: 12px 20px 20px;
    background: #fff;
    border-top: 1px solid #eee;
  }
  /* L6 v2 mobile: match desktop's button box-model exactly so the two
     buttons stack as visually identical twins. min-height keeps them at
     the same size even when Add's content is short/long.
     L32: rounded corners on mobile too (matches desktop override above). */
  .addon-drawer__done {
    box-sizing: border-box;
    width: 100%; padding: 14px 20px; font-size: 15px;
    min-height: 52px;
    border-radius: 10px; cursor: pointer;
  }
  /* L6 mobile: same hide-when-empty rule as desktop. */
  .addon-drawer__done.has-items {
    background: #000; color: #fff; border: 1.5px solid #000;
    display: flex;
  }
  .addon-drawer__done:not(.has-items) {
    display: none !important;
  }
  .addon-drawer__close-bottom {
    padding: 14px 20px;
    font-size: 15px;
    min-height: 52px;
  }
}

.addon-drawer .addon-card[data-addon-category] {
  display: flex; align-items: center; gap: 14px;
  padding: 14px; margin-bottom: 10px;
  border: 1.5px solid #e0e0e0; border-radius: 10px;
  cursor: pointer; transition: border-color 0.15s, background 0.15s;
}
.addon-drawer .addon-card[data-addon-category]:hover { border-color: #bbb; }
/* 2026-05-12 (Quieter): active addon card uses warm cream + dark
   border (matches the lens-type + mirror active states), replacing
   the previous purple-blue accent. */
.addon-drawer .addon-card[data-addon-category].active { border-color: #111; background: #faf7f2; }
.addon-drawer .addon-card[data-addon-category].disabled { opacity: 0.4; pointer-events: none; }
.addon-drawer .addon-card__image { width: 70px; height: 70px; flex-shrink: 0; border-radius: 8px; overflow: hidden; background: transparent; display: flex; align-items: center; justify-content: center; }
.addon-drawer .addon-card__image img { width: 100%; height: 100%; object-fit: contain; }
.addon-drawer .addon-card__info { flex: 1; display: flex !important; flex-direction: column; justify-content: center; min-width: 0; }
.addon-drawer .addon-card__prices { display: flex !important; gap: 6px; align-items: center; flex-wrap: wrap; }
/* 2026-05-20 Task 6: addon-drawer fonts bumped for readability */
.addon-drawer .addon-card__title { display: block !important; font-size: 15px; font-weight: 600; margin: 2px 0; line-height: 1.3; }
.addon-drawer .addon-card__desc { display: block !important; font-size: 13px; color: #888; margin: 4px 0 0; line-height: 1.4; }
.addon-drawer .addon-card__variant-info { display: block; font-size: 12px; color: #999; font-weight: 400; font-style: italic; margin: 1px 0 0; min-height: 14px; }
.addon-drawer .addon-card__variant-info:empty { display: none; }
/* Side tags — color-coded */
.addon-card__side-tag { display: inline-block; font-size: 10px; font-weight: 700; letter-spacing: 0.3px; padding: 2px 8px; border-radius: 4px; margin-top: 4px; text-transform: uppercase; }
.addon-card__side-tag[data-side="left"] { background: #dbeafe; color: #1e40af; }
.addon-card__side-tag[data-side="right"] { background: #fef3c7; color: #92400e; }
.addon-card__side-tag[data-side="dual"] { background: #d1fae5; color: #065f46; }
/* Opposite-side lens cards */
.addon-card--opposite-side { opacity: 0.7; border-style: dashed; }
.addon-card--opposite-side:hover { opacity: 0.9; }
/* Side toggle link */
.addon-lens-toggle { display: block; text-align: center; padding: 10px 0; margin: 4px 0 8px; font-size: 13px; color: #5b5bf7; cursor: pointer; font-weight: 500; border: none; background: none; width: 100%; transition: color 0.15s; }
.addon-lens-toggle:hover { color: #4343d4; text-decoration: underline; }
/* 2026-05-15: top-align (was center) for the same reason as
   `.addon-card__qty` above — long titles made centered checkboxes
   sit too low compared to the title/price block. */
.addon-drawer .addon-card__check { width: 22px; height: 22px; flex-shrink: 0; align-self: flex-start; margin-top: 8px; }
.addon-checkbox {
  display: block; width: 22px; height: 22px;
  border: 1.5px solid #ccc; border-radius: 4px;
  transition: all 0.15s;
}
.addon-card.active .addon-checkbox {
  background: #5b5bf7; border-color: #5b5bf7;
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M13.3 4.3L6 11.6 2.7 8.3l1.4-1.4L6 8.8l5.9-5.9 1.4 1.4z'/%3E%3C/svg%3E");
  background-size: 14px; background-position: center; background-repeat: no-repeat;
}
.addon-drawer .addon-card { position: relative; }
/* SAVE-% pill on addon cards. Previously positioned at `top: -8px` which
   floated half-above the card edge — fine when paired with an external
   "Bestseller" label that absorbed the visual space, but on cards
   without a bestseller pill it visually competed with the discount
   prices below it ("eats on the discount text"). Moving the pill to
   sit cleanly INSIDE the card at the top-left corner of the image
   region so it never crosses into the price column or the card edge. */
.addon-card__badge {
  position: absolute;
  top: 8px;
  left: 8px;
  background: var(--brand-red, #FF5F5F);
  color: #fff;
  font-size: 10px;
  font-weight: 700;
  padding: 3px 8px;
  border-radius: 6px;
  letter-spacing: 0.3px;
  line-height: 1.2;
  z-index: 1;
  white-space: nowrap;
}
.addon-card__badge--soldout { background: #ef4444; }
.addon-card__prices { display: flex; gap: 6px; align-items: center; }
.addon-card__price--original {
  text-decoration: line-through; color: #999; font-size: 13px;
}
.addon-card__price { font-weight: 600; font-size: 14px; }
.addon-card__price--sale { color: var(--brand-red, #FF5F5F); }
.addon-card__soldout {
  display: block; font-size: 10px; font-weight: 700;
  letter-spacing: 1px; color: #999; margin-bottom: 2px;
}
.addon-drawer .addon-card.disabled {
  opacity: 0.5; pointer-events: none;
}
.addon-drawer .addon-card.disabled .addon-checkbox {
  border-color: #e0e0e0;
}

/* 2026-05-12 (Quieter): accessory quantity stepper. Replaces the
   binary checkbox on accessory addon cards so customers can buy
   multiple of the same item (e.g. 2 nosepads).

   Two states:
     - card NOT .active (qty 0): show a single round "+" Add button
     - card .active (qty > 0):   show "−  N  +" stepper with count

   Markup renders both up front; the .active class flips visibility.
   `.addon-card__qty` wraps both states; CSS controls which shows.
   2026-05-15: `align-self: flex-start` (was `center`). With longer
   addon titles wrapping to 2-3 lines on mobile, vertical centering
   made the stepper sit visually "low" relative to the price+title
   at the top of the card. Top-aligning the stepper anchors it next
   to the price (mobile cards have padding-top 14px, so a small
   margin-top brings it to the price baseline). Same effect on the
   `.addon-card__check` checkbox below. */
.addon-drawer .addon-card__qty {
  flex-shrink: 0;
  align-self: flex-start;
  margin-top: 6px;
  display: inline-flex;
  align-items: center;
}
.addon-card__qty-btn {
  font-family: inherit;
  font-weight: 600;
  background: #faf7f2;
  border: 1px solid #e0d8cd;
  color: #111;
  cursor: pointer;
  user-select: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: background 0.12s, border-color 0.12s;
  padding: 0;
  line-height: 1;
}
.addon-card__qty-btn:hover {
  background: #f0eadd;
  border-color: #c9bca6;
}
.addon-card__qty-btn:active {
  background: #e8e0d0;
}
/* Add-only button (qty=0 state): round, prominent */
.addon-card__qty-btn--add {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  font-size: 20px;
  background: #faf7f2;
  border: 2px solid #111;
}
.addon-card__qty-btn--add:hover {
  background: #111;
  color: #fff;
}
/* Stepper buttons (qty > 0 state) */
.addon-card__qty-btn--incr,
.addon-card__qty-btn--decr {
  width: 28px;
  height: 28px;
  font-size: 16px;
}
.addon-card__qty-btn--decr {
  border-radius: 6px 0 0 6px;
  border-right-width: 0;
}
.addon-card__qty-btn--incr {
  border-radius: 0 6px 6px 0;
  border-left-width: 0;
}
.addon-card__qty-value {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 28px;
  height: 28px;
  background: #faf7f2;
  border-top: 1px solid #e0d8cd;
  border-bottom: 1px solid #e0d8cd;
  font-weight: 600;
  font-size: 13px;
  color: #111;
  text-align: center;
  line-height: 1;
  padding: 0 4px;
}

/* State toggling: hide stepper when card is inactive (qty 0),
   hide the round "+" Add when card is active (qty > 0). */
.addon-drawer .addon-card:not(.active) .addon-card__qty-btn--decr,
.addon-drawer .addon-card:not(.active) .addon-card__qty-btn--incr,
.addon-drawer .addon-card:not(.active) .addon-card__qty-value {
  display: none;
}
.addon-drawer .addon-card.active .addon-card__qty-btn--add {
  display: none;
}

/* Disabled card (sold-out): grey out the stepper too */
.addon-drawer .addon-card.disabled .addon-card__qty-btn {
  background: #f5f5f5;
  border-color: #e0e0e0;
  color: #aaa;
}

/* ============================================================
   Brand accent colors (from brand manual)
   ============================================================ */
:root {
  --brand-blue:  #84BBF5;
  --brand-green: #CAFF5F;
  --brand-red:   #FF5F5F;
  --brand-blue-tint:  rgba(132, 187, 245, 0.3);
  --brand-green-tint: rgba(202, 255, 95, 0.3);
  --brand-red-tint:   rgba(255, 95, 95, 0.3);
}

/* ============================================================
   Addon drawer — section grouping (Bestseller / Offers / All Accessories)
   ============================================================ */
.addon-section { margin-bottom: 8px; }
.addon-section + .addon-section {
  margin-top: 24px;
  padding-top: 18px;
  border-top: 1px solid #eee;
}
.addon-section__title {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: #6b6b6b;
  margin: 0 0 14px;
}
.addon-section__pill {
  display: inline-block;
  padding: 5px 14px;
  border-radius: 999px;
  background: var(--brand-green-tint);
  color: #1f3506;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 1.8px;
}
/* Offers pill: warm clay/orange so it reads as a deal rather than a curated
   "best seller" marker. Same shape + letter-spacing as the bestseller pill. */
.addon-section__pill--offers {
  background: #fff1d6;
  color: #7a3a00;
}
.addon-section--bestseller .addon-card,
.addon-section--offers .addon-card { position: relative; }

/* --- Sport grid --- */
.mirror-sport-grid { padding: 60px 0; }
.mirror-sport-grid.bg--dark { background: #111; color: #fff; }
.mirror-sport-grid__inner { max-width: 1100px; margin: 0 auto; padding: 0 20px; }
.mirror-sport-grid__title {
  font-size: clamp(24px, 3vw, 36px); font-weight: 700; margin: 0 0 28px;
  letter-spacing: -0.01em;
}
.mirror-sport-grid__cards {
  display: grid; grid-template-columns: 1fr; gap: 16px;
}
@media (min-width: 768px) {
  .mirror-sport-grid__cards { grid-template-columns: 1fr 1fr; }
}
.mirror-sport-card {
  background: rgba(255,255,255,0.05); border-radius: 12px; overflow: hidden;
  display: flex; flex-direction: column;
}
.mirror-sport-grid:not(.bg--dark) .mirror-sport-card { background: #f5f5f5; color: #111; }
.mirror-sport-card__img { aspect-ratio: 4/3; width: 100%; object-fit: cover; display: block; background: rgba(255,255,255,0.05); }
.mirror-sport-card__img--placeholder { display: flex; align-items: center; justify-content: center; color: rgba(255,255,255,0.3); }
.mirror-sport-card__body { padding: 16px; }
.mirror-sport-card__title { font-size: 18px; margin: 0 0 6px; font-weight: 700; }
.mirror-sport-card__pitch { font-size: 13px; opacity: 0.8; margin: 0 0 10px; line-height: 1.4; }
.mirror-sport-card__link { font-size: 12px; color: inherit; text-decoration: underline; }

/* === Mirror position buttons: show all, dim ones unavailable for current lens === */
.px-mirror-row [data-mirror][data-mirror-disabled] {
  opacity: 0.55;
  cursor: pointer;
  position: relative;
}
.px-mirror-row [data-mirror][data-mirror-disabled]:hover {
  opacity: 0.85;
}
.px-mirror-row [data-mirror][data-mirror-disabled]::after {
  content: 'Click to switch to a compatible lens';
  position: absolute; bottom: 4px; left: 50%; transform: translateX(-50%);
  font-size: 9px; text-transform: uppercase; letter-spacing: 0.4px;
  color: #777; white-space: nowrap;
  pointer-events: none;
}

/* === Spare-lens swatches: dimmed when incompatible with selected mirror === */
.px-lens--swatches .px-group[data-lens-disabled] { opacity: 0.35; }
.px-lens--swatches .px-group[data-lens-disabled]:hover { opacity: 0.7; }
.px-lens--swatches .px-group[data-lens-disabled].active { opacity: 1; }

/* === Spare-lens variant picker — SunGod-style circle swatches === */
.px-lens--swatches .px-groups {
  display: flex; flex-wrap: wrap; gap: 12px;
  justify-content: flex-start;
  padding: 4px 0 8px;
}
.px-lens--swatches .px-groups button.px-group {
  /* Override default rectangular card: become a 52px circle */
  width: 52px; height: 52px;
  max-width: 52px; min-width: 52px;
  flex: 0 0 52px;
  padding: 0;
  background: transparent !important;
  border: 2px solid transparent;
  border-radius: 50%;
  cursor: pointer;
  position: relative;
  transition: border-color 0.18s, transform 0.18s;
}
.px-lens--swatches .px-groups button.px-group:hover { transform: scale(1.05); }
.px-lens--swatches .px-groups button.px-group.active {
  border-color: #111;
  background: transparent !important;
  color: inherit !important;
}
.px-lens--swatches .px-group .lens-card {
  position: absolute !important; inset: 0 !important;
  display: block !important; padding: 0 !important; gap: 0 !important;
  margin: 0 !important;
}
.px-lens--swatches .px-group .lens-card__swatch {
  position: absolute !important;
  top: 0; left: 0; right: 0; bottom: 0;
  width: 100% !important; height: 100% !important;
  margin: 0 !important;
  box-sizing: border-box;
  border-radius: 50%;
  border: 1px solid rgba(0,0,0,0.18);
  box-shadow: inset 0 -6px 12px rgba(0,0,0,0.18), inset 0 4px 8px rgba(255,255,255,0.25);
  display: block;
}
/* Visually hide icon/name/price but keep them accessible */
.px-lens--swatches .px-group .lens-card__icon,
.px-lens--swatches .px-group .lens-card__name,
.px-lens--swatches .px-group .lens-card__price {
  position: absolute;
  width: 1px; height: 1px;
  margin: -1px; padding: 0;
  overflow: hidden;
  clip: rect(0,0,0,0);
  white-space: nowrap;
  border: 0;
}
/* Currently-selected lens label (rendered by snippet below the grid) */
.px-lens--swatches .px-lens-current {
  display: flex; align-items: center; justify-content: space-between;
  font-size: 13px; font-weight: 600;
  margin: 4px 0 12px;
}
.px-lens--swatches .px-lens-current__name { color: #111; }
.px-lens--swatches .px-lens-current__name b { font-weight: 700; }
.px-lens--swatches .px-lens-current__guide {
  font-size: 11px; letter-spacing: 0.5px; text-transform: uppercase;
  color: #5b5bf7; text-decoration: underline;
}

/* === "You save" line under cart button === */

/* === "You save" line under cart button === */
.trieye-savings {
  display: flex;
  align-items: baseline;
  justify-content: center;
  gap: 6px;
  margin-top: 10px;
  padding: 8px 12px;
  background: #fef3c7;
  color: #92400e;
  border-radius: 999px;
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.2px;
}
.trieye-savings[hidden] {
  display: none;
}
.trieye-savings__label {
  text-transform: uppercase;
  font-size: 11px;
  letter-spacing: 0.5px;
}
.trieye-savings__amount {
  font-weight: 700;
}
.trieye-savings__pct {
  opacity: 0.75;
  font-size: 12px;
}

/* === Font system unification ===
   theme.css hardcodes --font-family: 'Inter Tight' on .type-body and 'Space Grotesk' on .type-heading
   (lines ~3382 / 3397), bypassing the Shopify font picker. We can't edit theme.css, so we re-route
   .type-body / .type-heading / .type-accent to the picker-derived font stacks defined in
   snippets/css-variables.liquid (--FONT-STACK-BODY / --FONT-STACK-HEADING / --FONT-STACK-ACCENT).
   This makes the live theme settings (currently barlow / archivo_narrow / archivo) take effect
   everywhere — buttons, headings, body, and the cart drawer (cart-drawer.liquid was switched to
   font-family: inherit). */
.type-body {
  --font-family: var(--FONT-STACK-BODY);
}
.type-heading {
  --font-family: var(--FONT-STACK-HEADING);
}
.type-accent {
  --font-family: var(--FONT-STACK-ACCENT);
}

/* ─── Landing-page reviews compression ──────────────────────────────
   Judge.me's v2025 all-reviews block renders every review into the
   DOM at initial paint (no server-side pagination on the page-style
   block). For ~25+ reviews that produced a 5,000+px section that
   dominated each landing page.

   Strategy: cap visible reviews to first 8 by default, expose
   Judge.me's existing "Load More Reviews" button as an inline expand
   toggle. The button click is intercepted by
   `sections/cycling-reviews-expand.liquid` which adds the class
   `.cycling-reviews-expanded` to the section, removing the cap and
   letting Judge.me's native pagination append more reviews.

   We also hide the noisy widget chrome (sort dropdown, write-review
   link, submission form) — those experiences belong on the PDP, not
   on a category landing page.

   Applied to all four category landing pages: cycling, running,
   rowing, everyday. The expand-script section is referenced by each
   page template so the per-section toggle works on all of them. */
[id*="reviews_cycling"] .jdgm-rev-widg__sort-wrapper,
[id*="reviews_cycling"] .jdgm-write-rev-link,
[id*="reviews_cycling"] .jdgm-form-wrapper,
[id*="reviews_cycling"] .jdgm-sort-dropdown-wrapper,
[id*="reviews_running"] .jdgm-rev-widg__sort-wrapper,
[id*="reviews_running"] .jdgm-write-rev-link,
[id*="reviews_running"] .jdgm-form-wrapper,
[id*="reviews_running"] .jdgm-sort-dropdown-wrapper,
[id*="reviews_rowing"] .jdgm-rev-widg__sort-wrapper,
[id*="reviews_rowing"] .jdgm-write-rev-link,
[id*="reviews_rowing"] .jdgm-form-wrapper,
[id*="reviews_rowing"] .jdgm-sort-dropdown-wrapper,
[id*="reviews_everyday"] .jdgm-rev-widg__sort-wrapper,
[id*="reviews_everyday"] .jdgm-write-rev-link,
[id*="reviews_everyday"] .jdgm-form-wrapper,
[id*="reviews_everyday"] .jdgm-sort-dropdown-wrapper {
  display: none !important;
}
/* Cap to first 8 reviews until the user clicks Load More. The class
   `cycling-reviews-expanded` is added to the section element by the
   expand script — kept the original class name to avoid breaking the
   existing cycling deployment, but it now applies to any of the four
   category landing pages. */
[id*="reviews_cycling"]:not(.cycling-reviews-expanded) .jdgm-all-reviews__body > .jdgm-rev:nth-child(n+9),
[id*="reviews_cycling"]:not(.cycling-reviews-expanded) .jdgm-rev-widg__reviews .jdgm-rev:nth-child(n+9),
[id*="reviews_running"]:not(.cycling-reviews-expanded) .jdgm-all-reviews__body > .jdgm-rev:nth-child(n+9),
[id*="reviews_running"]:not(.cycling-reviews-expanded) .jdgm-rev-widg__reviews .jdgm-rev:nth-child(n+9),
[id*="reviews_rowing"]:not(.cycling-reviews-expanded) .jdgm-all-reviews__body > .jdgm-rev:nth-child(n+9),
[id*="reviews_rowing"]:not(.cycling-reviews-expanded) .jdgm-rev-widg__reviews .jdgm-rev:nth-child(n+9),
[id*="reviews_everyday"]:not(.cycling-reviews-expanded) .jdgm-all-reviews__body > .jdgm-rev:nth-child(n+9),
[id*="reviews_everyday"]:not(.cycling-reviews-expanded) .jdgm-rev-widg__reviews .jdgm-rev:nth-child(n+9) {
  display: none !important;
}

/* ─── Product page header — mobile single-line layout ──────────────
   On mobile, the product title, review stars, and price should be on
   ONE line:    Title  ★★★★★  ............  $99.00

   Implementation:
   1. `.title-price-wrapper` becomes a flex row with title (+ inline
      stars) on the left and the price block floated to the right.
   2. The existing `.product__rating` element renders as "5.0 ★ (1009)" —
      we hide the numeric value + review count and repurpose the single
      `.product__rating__star` element into a 5-star sequence via a
      `::before` pseudo-element. This avoids touching the Liquid markup
      (which the configurator JS reads from for variant pricing).
   3. The cutline subtitle ("Lifestyle Glasses with…") drops below the
      title on a second line at mobile sizes.

   Desktop layout stays as-is: title block above, price below, separate
   rows. The flex-row and star-injection rules are inside a
   `@media (max-width: 768px)` query.
   ───────────────────────────────────────────────────────────────── */
@media (max-width: 768px) {
  /* IMPORTANT — there are TWO `.title-price-wrapper` elements rendered:
     a desktop one inside `.product__main__content` (hidden on mobile)
     and a mobile-only duplicate carrying the class `.trieye-mobile-title`.
     The mobile one already had pre-existing rules forcing
     `flex-direction: column` + `.product__title__wrapper { display: block }`
     to support the OLD stacked layout. We override those by matching
     the same compound selector specificity (.trieye-mobile-title
     plus another class) so cascade order is in our favor. */
  .trieye-mobile-title.title-price-wrapper,
  .title-price-wrapper.trieye-mobile-title,
  .title-price-wrapper {
    display: flex !important;
    flex-direction: row !important;
    align-items: flex-start !important;
    justify-content: space-between !important;
    gap: 12px;
    flex-wrap: nowrap;
    width: 100% !important;
  }
  .trieye-mobile-title > .product__block__title,
  .title-price-wrapper > .product__block__title {
    flex: 1 1 auto !important;
    min-width: 0 !important;
    width: auto !important;          /* override existing width:100% on .trieye-mobile-title > * */
  }
  .trieye-mobile-title > .product__block__price,
  .title-price-wrapper > .product__block__price {
    flex: 0 0 auto !important;
    margin-left: auto !important;
    /* align with the title row, not vertically centered against the
       multi-row title block (which previously made price drop below
       the stars row when the model line wrapped underneath). */
    align-self: flex-start !important;
    margin-top: 4px !important;       /* nudge to align with h1's optical baseline */
    text-align: right !important;
    white-space: nowrap !important;
    width: auto !important;          /* override existing width:100% on .trieye-mobile-title > * */
  }

  /* Title row: H1 + 5-star rating sit on one baseline. The pre-existing
     `.trieye-mobile-title .product__title__wrapper { display: block }`
     rule had to be matched at the same specificity to flip back to flex. */
  .trieye-mobile-title .product__title__wrapper,
  .product__title__wrapper {
    display: flex !important;
    flex-direction: row !important;
    align-items: center !important;
    gap: 8px !important;
    flex-wrap: wrap !important;
    width: auto !important;
  }
  .trieye-mobile-title .product__title__wrapper .product__title,
  .product__title__wrapper .product__title {
    margin-bottom: 0;
  }

  /* Hide the legacy .product__rating chip ("5.0 ★ (1009)") on mobile —
     the inline cloned Judge.me preview badge replaces it with a real
     5-star + review-count display sourced from live data.
     (See also the global rule outside this media query — we hide it
     on desktop too once the cloned slot is in place.) */
  .product__title__wrapper .rating__wrapper__title {
    display: none !important;
  }

  /* The configurator dynamically injects a `<span class="px-model-line">`
     between the h1 and our rating slot inside .product__title__wrapper.
     Without intervention the flex layout wraps as:
        [h1 "The View"]
        [Model: …]
        [★★★★★ 1 review]
     We use CSS `order` to keep DOM order intact (configurator JS finds
     .px-model-line where it expects) while VISUALLY reordering to:
        [h1 "The View"] [★★★★★ 1 review]
        [Model: …]
     The model line gets `flex-basis: 100%` to force it to its own row. */
  /* Layout (mobile):
        Row 1:  THE VIEW                       From $89.00
        Row 2:  ★★★★★  1 review
        Row 3:  MODEL: MATTE BLACK …

     The price sits on Row 1 because it lives in the OUTER
     `.title-price-wrapper` flex row with `align-self: flex-start`.
     Inside the title block, h1 occupies Row 1 alone. Rating + model
     line are forced to their own rows via `flex-basis: 100%`. */
  .product__title__wrapper .product__title {
    order: 0;
    flex: 1 1 100% !important;        /* h1 takes full row of inner flex */
    width: 100% !important;
    max-width: 100%;
    margin: 0 !important;
    font-size: 26px !important;       /* roomier now that title doesn't share row */
    line-height: 1.2 !important;
  }
  .product__title__wrapper .trieye-inline-rating {
    order: 1;
    flex: 0 0 100% !important;        /* force rating to its own row below h1 */
    width: 100% !important;
    margin-top: 6px;
    /* Override the default flex display so the chip sits left-aligned
       on its row (a flex container rather than block). */
    display: flex !important;
    justify-content: flex-start;
  }
  /* 2026-05-15 (anti-jump): keep the slot in layout from page load
     (visibility: hidden) so the title-wrapper's height is stable
     when Judge.me clones in the populated badge. Previously
     `display: none` until rated → wrapper had no rating row →
     when [data-rated] flipped, a 14px-tall row appeared and the
     wrapper grew, pushing everything below DOWN. */
  .product__title__wrapper .trieye-inline-rating:not([data-rated]) {
    display: flex !important;
    visibility: hidden !important;
    min-height: 14px;
  }
  .product__title__wrapper .px-model-line {
    order: 2;
    flex: 0 0 100% !important;
    width: 100% !important;
    margin-top: 8px;
  }

  /* Inline Judge.me badge slot. Empty until the script in product-title.liquid
     copies the populated badge HTML in. Once populated (data-rated="1"),
     it shows ★★★★★ + "N reviews". Clicking scrolls to #reviews via the
     existing global handler in section-hero.liquid. */
  .trieye-inline-rating {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    text-decoration: none;
    color: inherit;
    line-height: 1;
    font-size: 12px;
    cursor: pointer;
    margin-left: 4px;
    /* Hidden until the script flags it as populated */
  }
  /* 2026-05-15 (anti-jump): reserve width even when not yet rated.
     Was `display: none` until Judge.me populated, which caused the
     title-wrapper to widen 138px → 302px when stars appeared (a
     visible jump). Now the slot lives in the layout from page load
     with visibility: hidden + min-width matching the typical badge
     dimensions. When [data-rated] is set, visibility flips to
     visible — no layout change. */
  .trieye-inline-rating:not([data-rated]) {
    display: inline-flex;
    visibility: hidden;
    min-width: 150px;
    /* fixed height matching the populated state so vertical layout
       is also stable (~12px star icons at line-height 1) */
    height: 14px;
  }
  .trieye-inline-rating[data-rated] {
    display: inline-flex;
    visibility: visible;
    min-width: 0;
    height: auto;
  }
  /* Style the cloned Judge.me content to match the design.
     Star sizing matters: Judge.me's `.jdgm-star` elements are
     individual stars rendered as inline-block icons. Constraining
     their dimensions explicitly ensures consistent compact size. */
  .trieye-inline-rating .jdgm-prev-badge__stars {
    display: inline-flex;
    align-items: center;
    gap: 1px;
    font-size: 0;            /* collapse any whitespace between star spans */
    line-height: 1;
  }
  .trieye-inline-rating .jdgm-star {
    width: 12px !important;
    height: 12px !important;
    font-size: 12px !important;
    line-height: 1 !important;
    background-size: 12px 12px !important;
  }
  .trieye-inline-rating .jdgm-prev-badge__text {
    font-size: 12px;
    color: #666;
    text-decoration: underline dotted rgba(0, 0, 0, 0.3);
    text-underline-offset: 3px;
    white-space: nowrap;
    line-height: 1;
  }

  /* Hide the original Judge.me preview badge container on mobile —
     once we've cloned its content into the title slot, the original
     becomes redundant and was visually cluttering below the image.
     Targets the wrapper widget (.jdgm-widget.jdgm-preview-badge) so
     the surrounding container collapses too. */
  body.template-product .jdgm-widget.jdgm-preview-badge {
    display: none !important;
  }

  /* Price block — keep on one line */
  .title-price-wrapper .product__price,
  .title-price-wrapper [data-product-price] {
    white-space: nowrap;
  }

  /* 2026-05-12 (Quieter mobile): shrink the title price.
     Pipeline's theme.css sets `.sale-price-block__now { font-size: 30px }`
     which is fine for short USD/EUR values ($89.00) but wraps to two
     lines on long-form currencies like Norwegian Krone ("1.887,00 kr").
     20px keeps the price on a single line at every supported locale. */
  .title-price-wrapper .sale-price-block__now,
  .title-price-wrapper .sale-price-block__compare {
    font-size: 20px !important;
    line-height: 1.1 !important;
  }
  /* "From" prefix matches the smaller scale */
  .title-price-wrapper .sale-price-block__from {
    font-size: 12px !important;
  }

  /* 2026-05-12 (Quieter mobile): MODEL line uses full row width.
     The price had been a flex sibling of the title block, eating ~96px
     of horizontal real estate on Norwegian locale and forcing the
     model line ("MODEL Matte Black / Photochromic Smoke 0–3 / Right /
     M145") to wrap onto 3 lines inside its narrow column.

     Fix: make the title block take 100% of the row, then absolutely
     position the price block in the top-right corner. The H1 gets
     padding-right so the price has visual breathing room and doesn't
     overlap the title text. Model line and rating no longer have a
     narrow column constraining them — they use the full viewport
     width and only wrap when text genuinely exceeds it.

     Note: the price element rendered into `.title-price-wrapper` is
     `.sale-price-block` (not `.product__block__price` as Pipeline's
     docs would suggest), so we target that class directly. */
  .title-price-wrapper {
    position: relative !important;
  }
  .title-price-wrapper > .product__block__title {
    flex: 1 1 100% !important;
    width: 100% !important;
    max-width: 100% !important;
  }
  .title-price-wrapper .product__title {
    padding-right: 110px !important;
  }
  .title-price-wrapper > .sale-price-block {
    position: absolute !important;
    top: 0 !important;
    right: 0 !important;
    margin: 0 !important;
    width: auto !important;
    max-width: 105px;
    flex: 0 0 auto !important;
  }
}

/* ─── Global hides (desktop + mobile) ─────────────────────────────
   Once the inline rating slot is populated by the script in
   product-title.liquid, two pre-existing rating displays become
   redundant and should be removed at ALL viewports:

   1. `.jdgm-widget.jdgm-preview-badge` — Judge.me's auto-injected
      preview badge that previously rendered above the product title
      (and below the image on mobile). Source-of-truth for the data,
      but visually redundant once cloned into our inline slot.

   2. `.rating__wrapper__title` — Pipeline's legacy `.product__rating`
      chip ("5.0 ★") rendered next to the title. Different format
      ("number then star") than what the design calls for; the cloned
      Judge.me badge replaces it with the proper 5-star + review-count
      pattern.

   Scoped to `body.template-product` so other pages that may use these
   elements (collection grid badges, etc.) are unaffected. */
body.template-product .jdgm-widget.jdgm-preview-badge {
  display: none !important;
}
body.template-product .product__title__wrapper .rating__wrapper__title {
  display: none !important;
}

/* ─── NEW banner on the Classic card on the homepage ──────────────
   Mirrors the same NEW badge that appears on lens-browser Classic
   cards (section-dual-lens-browser.liquid). Liquid in
   section-list-collections.liquid auto-injects the markup when the
   card's collection_url contains "the-classic" or its top/bottom text
   mentions "Classic". This rule positions and styles the badge so it
   sits in the top-LEFT corner of the collection-grid-item card — same
   accent red, uppercase weight, and shadow as the lens-card version,
   for visual consistency between surfaces.

   The parent `.collection-grid-item` already has `position: relative`
   from Pipeline's hero-styled cards, so we can absolutely position
   the badge inside it without extra wrapping.
   Z-index puts it above the `.link-over-image` absolute overlay. */
.collection-grid-item--new {
  position: relative;
}
.collection-grid-item__new {
  position: absolute;
  top: 16px;
  left: 16px;
  z-index: 5;
  background: #FF5F5F;
  color: #fff;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.12em;
  padding: 6px 10px;
  border-radius: 4px;
  line-height: 1;
  text-transform: uppercase;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
  pointer-events: none;       /* let clicks pass through to the link-over-image */
}
@media (max-width: 680px) {
  .collection-grid-item__new {
    top: 12px;
    left: 12px;
    font-size: 10px;
    padding: 5px 8px;
  }
}

/* ─── NEW badge on the Classic PDP active image ───────────────────
   Same red accent + uppercase weight as the lens-card and homepage
   versions. The parent `.product__media__wrapper.trieye-pdp--new`
   carries `position: relative` (set below) so this absolute child
   lands at the top-left of the visible gallery area, overlaid on
   whatever image is currently active in the gallery. The Pipeline
   gallery container has its own `overflow: hidden` for image cropping
   — we make the badge `position: absolute` on the OUTER wrapper
   instead of the gallery container so we don't get clipped by the
   gallery's image overflow rules.

   Z-index puts it above the variant image stack but below the
   lightbox/modal layer (which is z-index 9999+ in Pipeline). */
.product__media__wrapper.trieye-pdp--new {
  position: relative;
}
.trieye-pdp__new-badge {
  /* Sit tight on the gallery image corner. The Pipeline gallery content
     starts a few px inside the wrapper (column padding), so the offset
     here lines the badge up with the visible image's top-left corner —
     not the wrapper padding zone. */
  position: absolute;
  top: 12px;
  left: 12px;
  z-index: 5;
  background: #FF5F5F;
  color: #fff;
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0.14em;
  padding: 8px 14px;
  border-radius: 6px;
  line-height: 1;
  text-transform: uppercase;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.22);
  pointer-events: none;
}
@media (max-width: 768px) {
  .trieye-pdp__new-badge {
    top: 8px;
    left: 8px;
    font-size: 11px;
    padding: 6px 10px;
    letter-spacing: 0.12em;
  }
}

/* Classic PDP lens-bonus callout — surfaces "comes with a second
   mirror-free lens" near the bottom of the gallery's hero image. The
   inline script in sections/product.liquid measures the first slide's
   height and writes its bottom-edge (in px from wrapper top) into the
   --trieye-pdp-hero-bottom CSS var. The callout's `top` reads that var
   so it always sits on the visible hero image, not at the bottom of the
   whole stacked gallery. The fallback (50%) is approximate — only used
   for the first paint before JS runs. */
.trieye-pdp__lens-callout {
  position: absolute;
  top: var(--trieye-pdp-hero-bottom, 50%);
  left: 50%;
  transform: translate(-50%, calc(-100% - 18px));
  z-index: 5;
  background: rgba(255, 255, 255, 0.92);
  -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px);
  color: #111;
  font-size: 14px;
  font-weight: 500;
  letter-spacing: 0.02em;
  padding: 10px 18px;
  border-radius: 999px;
  line-height: 1.2;
  pointer-events: none;
  white-space: nowrap;
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);
  font-family: 'Inter Tight', system-ui, sans-serif;
}
@media (max-width: 768px) {
  .trieye-pdp__lens-callout {
    font-size: 12px;
    padding: 8px 14px;
    white-space: normal;
    max-width: calc(100% - 24px);
    text-align: center;
    transform: translate(-50%, calc(-100% - 12px));
  }
}

/* ============================================================================
   DISCOVER section (sections/section-discover.liquid)
   Mixed-source content grid: blog articles + manual YouTube + external posts.
   Includes filter pills, type badges, and a YouTube lightbox.
============================================================================ */
.tri-discover {
  padding-top: var(--PT, 38px);
  padding-bottom: var(--PB, 38px);
}
.section-padding-discover {
  padding-left: 16px;
  padding-right: 16px;
}
@media (min-width: 768px) {
  .section-padding-discover {
    padding-left: 40px;
    padding-right: 40px;
  }
}

.tri-discover__head {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: center;
  gap: 16px;
  margin-bottom: 24px;
}
.tri-discover__title {
  margin: 0;
  font-family: 'Space Grotesk', system-ui, sans-serif;
  font-size: 28px;
  letter-spacing: 0.01em;
  text-transform: uppercase;
}
@media (min-width: 768px) {
  .tri-discover__title {
    font-size: 36px;
  }
}

/* Filter pills */
.tri-discover__filters {
  display: flex;
  gap: 8px;
  flex-wrap: nowrap;
  overflow-x: auto;
  scrollbar-width: none;
}
.tri-discover__filters::-webkit-scrollbar { display: none; }
.tri-discover__pill {
  flex: 0 0 auto;
  appearance: none;
  border: 1px solid rgba(0, 0, 0, 0.15);
  background: transparent;
  color: #111;
  font-family: 'Inter Tight', system-ui, sans-serif;
  font-size: 13px;
  font-weight: 500;
  letter-spacing: 0.02em;
  padding: 8px 16px;
  border-radius: 999px;
  cursor: pointer;
  transition: background-color 120ms ease, color 120ms ease, border-color 120ms ease;
}
.tri-discover__pill:hover {
  border-color: rgba(0, 0, 0, 0.4);
}
.tri-discover__pill.is-active {
  background: #111;
  color: #fff;
  border-color: #111;
}

/* Viewport wraps the scrollable grid + the nav arrows */
.tri-discover__viewport {
  position: relative;
}

/* Grid — horizontal carousel on all viewports.
   Number of cards visible at once driven by --cols-large (desktop) /
   --cols-medium (tablet) / --cols-mobile (phone). */
.tri-discover__grid {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: calc((100% - (var(--cols-large, 4) - 1) * 24px) / var(--cols-large, 4));
  gap: 24px;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scrollbar-width: none;
  scroll-behavior: smooth;
}
.tri-discover__grid::-webkit-scrollbar { display: none; }
.tri-discover__card { scroll-snap-align: start; }

@media (max-width: 1100px) {
  .tri-discover__grid {
    grid-auto-columns: calc((100% - (var(--cols-medium, 2) - 1) * 24px) / var(--cols-medium, 2));
  }
}

/* Nav arrows */
.tri-discover__nav {
  position: absolute;
  top: calc(50% - 30px); /* offset up to align roughly with image center, not card body */
  z-index: 3;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  background: #fff;
  border: 1px solid #e5e5e5;
  color: #111;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  box-shadow: 0 4px 14px rgba(0, 0, 0, 0.12);
  transition: opacity 200ms ease, transform 200ms ease, background-color 120ms ease;
  padding: 0;
}
.tri-discover__nav[hidden] {
  display: none;
}
.tri-discover__nav:hover {
  background: #111;
  color: #fff;
  transform: scale(1.05);
}
.tri-discover__nav--prev { left: -10px; }
.tri-discover__nav--next { right: -10px; }
@media (max-width: 767px) {
  /* Hide arrows on mobile — touch swipe is the primary navigation */
  .tri-discover__nav { display: none !important; }
}
@media (max-width: 767px) {
  /* Mobile sizing — partial card peek visible */
  .tri-discover__grid {
    grid-auto-columns: calc(100% / var(--cols-mobile, 1.2) - 12px);
    margin-left: -16px;
    margin-right: -16px;
    padding-left: 16px;
    padding-right: 16px;
    gap: 14px;
  }
}

/* Filter visibility — hide cards not matching the active filter */
.tri-discover__grid[data-active-filter="blog"] .tri-discover__card:not([data-card-type="blog"]),
.tri-discover__grid[data-active-filter="video"] .tri-discover__card:not([data-card-type="video"]),
.tri-discover__grid[data-active-filter="external"] .tri-discover__card:not([data-card-type="external"]) {
  display: none;
}

/* 4-card limit replaced by horizontal carousel — see .tri-discover__viewport rules below. */

/* Card */
.tri-discover__card {
  background: transparent;
}
.tri-discover__link {
  display: block;
  color: inherit;
  text-decoration: none;
  position: relative;
  transition: transform 200ms ease;
}
.tri-discover__link:hover { transform: translateY(-2px); }
.tri-discover__link:hover .tri-discover__heading { text-decoration: underline; text-underline-offset: 3px; }

.tri-discover__media {
  position: relative;
  aspect-ratio: 3 / 2;
  border-radius: 14px;
  overflow: hidden;
  background: #eee;
}
.tri-discover__img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.tri-discover__img--placeholder {
  background: linear-gradient(135deg, #f0f0f0, #d8d8d8);
}

/* Badge */
.tri-discover__badge {
  position: absolute;
  top: 10px;
  left: 10px;
  font-family: 'Inter Tight', system-ui, sans-serif;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  padding: 5px 10px;
  border-radius: 6px;
  line-height: 1;
  pointer-events: none;
  background: rgba(255, 255, 255, 0.95);
  color: #111;
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
}
.tri-discover__badge--video {
  background: #FF5F5F;
  color: #fff;
}
.tri-discover__badge--external {
  background: rgba(17, 17, 17, 0.85);
  color: #fff;
}
.tri-discover__badge--blog {
  background: rgba(255, 255, 255, 0.95);
  color: #111;
}

/* Play icon overlay on YouTube cards */
.tri-discover__play-icon {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  pointer-events: none;
  filter: drop-shadow(0 4px 12px rgba(0, 0, 0, 0.4));
  transition: transform 200ms ease;
}
.tri-discover__link:hover .tri-discover__play-icon {
  transform: translate(-50%, -50%) scale(1.08);
}

/* Card body */
.tri-discover__body {
  padding-top: 14px;
  position: relative;
}
.tri-discover__date {
  font-family: 'Inter Tight', system-ui, sans-serif;
  font-size: 12px;
  color: #666;
  margin: 0 0 6px;
  text-transform: uppercase;
  letter-spacing: 0.08em;
}
.tri-discover__heading {
  font-family: 'Space Grotesk', system-ui, sans-serif;
  font-size: 18px;
  font-weight: 500;
  line-height: 1.3;
  margin: 0;
  color: #111;
}
.tri-discover__external-arrow {
  position: absolute;
  top: 14px;
  right: 0;
  font-size: 18px;
  color: #666;
}


/* Lightbox */
.tri-discover__lightbox {
  position: fixed;
  inset: 0;
  z-index: 9998;
  display: none;
  align-items: center;
  justify-content: center;
  padding: 20px;
}
.tri-discover__lightbox.is-open {
  display: flex;
}
.tri-discover__lightbox-backdrop {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, 0.85);
  cursor: pointer;
}
.tri-discover__lightbox-frame {
  position: relative;
  width: 100%;
  max-width: 1100px;
  z-index: 1;
}
.tri-discover__lightbox-aspect {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 9;
  border-radius: 12px;
  overflow: hidden;
  background: #000;
  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
}
.tri-discover__lightbox-aspect iframe {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: none;
}
.tri-discover__lightbox-close {
  position: absolute;
  top: -40px;
  right: 0;
  background: none;
  border: none;
  color: #fff;
  cursor: pointer;
  padding: 4px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  transition: background-color 120ms ease;
}
.tri-discover__lightbox-close:hover {
  background: rgba(255, 255, 255, 0.15);
}
@media (max-width: 600px) {
  .tri-discover__lightbox-close {
    top: 8px;
    right: 8px;
    background: rgba(0, 0, 0, 0.6);
  }
}

/* ─────────────────────────────────────────────────────────────────────
   L17 + L19 — Model title positions in the configurator
   (View / Classic / Clip)

   Two render positions exist in the markup; CSS picks ONE per viewport:
     .px-model-row--top      — above CHOOSE YOUR TYPE. Desktop-only.
     .px-color-title--mid    — h4 above the size picker. Mobile-only.

   The same JS writes to every `[data-px-color-title]` element, so both
   stay in sync without any data plumbing — even though only one is
   visible at a time per viewport.
   ───────────────────────────────────────────────────────────────────── */
.px-model-row--top {
  margin: 0 0 12px;
}
.px-model-row--top .px-color-title {
  margin: 0;
  font-family: 'Inter Tight', sans-serif;
  font-weight: 700;
  font-size: 15px;
  letter-spacing: 0.02em;
  color: #111;
  line-height: 1.3;
  text-transform: none;
}
/* Desktop: hide the mid (above-size) duplicate h4. The top row is the
   only model label desktop users need. We hide only the h4 itself so
   the Size Guide button + the Clip's model-image swatch row (siblings
   of the h4 in the same px-model-header) stay visible on desktop. */
@media (min-width: 768px) {
  h4.px-color-title--mid { display: none !important; }
}
/* Mobile (L19): hide the top row entirely. The product title above the
   gallery + the mid model label (above size) already cover this on
   mobile; a third position above CHOOSE YOUR TYPE was redundant. The
   mid h4 below stays visible by default cascade. */
@media (max-width: 767px) {
  .px-model-row--top { display: none !important; }
  /* Match the mid h4 font to the desktop top row so the label reads
     consistently in both layouts. Without this it picked up Pipeline's
     default h4 font + size which clashed against the size buttons. */
  h4.px-color-title--mid {
    font-family: 'Inter Tight', sans-serif;
    font-weight: 700;
    font-size: 15px;
    letter-spacing: 0.02em;
    color: #111;
    line-height: 1.3;
    text-transform: none;
    margin: 0 0 8px;
  }
}

/* ─────────────────────────────────────────────────────────────────────
   L31 — Model line above the size picker (.px-model-line--size).
   Mirrors what Classic was already rendering; View + Clip now match.

   updateModelLine() in trieye-product.js writes the current model
   label (color · lens · size · mirror) into every [data-model-line]
   element on the page. The size-area instance is desktop AND mobile
   visible — it's the only model label above the size buttons on
   desktop where the px-color-title--mid h4 is hidden.
   ───────────────────────────────────────────────────────────────────── */
.px-model-line--size {
  display: block;
  margin: 6px 0 8px;
  font-family: 'Inter Tight', sans-serif;
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.02em;
  color: #444;
  line-height: 1.3;
}
.px-model-line--size:empty {
  display: none;
}
/* Slightly smaller on mobile so it doesn't fight the dual title
   pattern (product title above gallery + mid px-color-title h4
   above the size picker), but still readable. */
@media (max-width: 767px) {
  .px-model-line--size {
    font-size: 12px;
    margin: 4px 0 6px;
  }
}

/* ─────────────────────────────────────────────────────────────────────
   L29 (B-DISC) — Cart subtotal breakdown rows (Items total / Your
   discounts / cart-level discount titles).

   Targets the data attribute on the wrapper (works for both the cart
   drawer `[data-cart-subtotal]` and the cart page) instead of the
   class name, since the drawer wraps in `.cart-drawer-footer__subtotal`
   while the cart page wraps in `.page__footer__subtotal` — the data
   attribute is the only thing consistent across both.

   Pattern matches the existing config-row treatment (PDP YOUR BUILD):
   key left, value right, with a savings-green tint on discount rows so
   the customer sees money saved as money-back, not money-removed.
   ───────────────────────────────────────────────────────────────────── */
[data-cart-subtotal] .cart__footer__itemtotal,
[data-cart-subtotal] .cart__footer__discount {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 12px;
  margin: 0;
  padding: 6px 0;
  font-size: 13px;
  line-height: 1.4;
}
[data-cart-subtotal] .cart__footer__itemtotal {
  color: #444;
}
[data-cart-subtotal] .cart__footer__itemtotal .cart__footer__label {
  font-weight: 500;
}
[data-cart-subtotal] .cart__footer__itemtotal .cart__footer__value {
  font-weight: 500;
  color: #111;
}
/* Discount rows — green, matching the PDP YOUR BUILD "You save" line
   and the sticky drawer's savings line. */
[data-cart-subtotal] .cart__footer__discount {
  color: #16a34a;
}
[data-cart-subtotal] .cart__footer__discount .cart__footer__label {
  font-weight: 500;
  color: inherit;
}
[data-cart-subtotal] .cart__footer__discount .cart__footer__value {
  font-weight: 700;
  color: inherit;
}
/* Line-level "Your discounts" row gets a subtle separator above so it
   visually groups with the items total it relates to, and breaks before
   any cart-level discount rows below. */
[data-cart-subtotal] .cart__footer__discount--line {
  border-top: 1px dashed #e5e5e5;
  margin-top: 2px;
  padding-top: 8px;
}

/* ─── The View — title row 2-column grid (2026-05-14) ─────────────
   Layout target (every viewport):
     ┌──────────────┬────────────┐
     │              │  945,00 kr │   <- price (top-right)
     │  The View    │            │
     │              │  ★ 755 rev │   <- rating (bottom-right)
     └──────────────┴────────────┘

   Implementation: turn `.title-price-wrapper` into a 2-col CSS grid
   and `display: contents` the nested wrappers from product-title.liquid
   + product-price.liquid so the h1, inline-rating slot, and price
   span all promote up to become direct grid items.

   Scoped to `[data-product-handle="the-view"]` so the other
   configurator PDPs (Classic, Clip, Spare Lens) and any generic
   Pipeline product keep their default flex `.title-price-wrapper`
   layout.

   Applied at all viewports. The selector deliberately repeats
   `.title-price-wrapper.trieye-mobile-title` so it tops the existing
   `@media (max-width: 768px)` rules at lines 5740-5970, which target
   `.trieye-mobile-title` with `!important`. We do NOT use `!important`
   ourselves — higher specificity (data-attribute + two classes vs.
   single class + !important) wins because data-attr adds (0,1,0) and
   each chained class adds (0,1,0).

   The injected `.px-model-line` element (mobile-only JS at line ~1521
   of trieye-product.js) sits between the h1 and the rating slot inside
   `.product__title__wrapper`. Because `display: contents` promotes it
   to a grid child, we explicitly assign it row 3 below the title.
   ───────────────────────────────────────────────────────────────── */
/* 2026-05-14 (round 2): the title-row grid + display:contents flatten
   chain below is MOBILE ONLY. On desktop the section/product.liquid
   layout places .title-price-wrapper inside a narrow text column
   (alongside the gallery), and forcing a 2-col grid there caused the
   h1 to letter-stack vertically. Desktop keeps the default
   `.title-price-wrapper { display: flex; justify-content: space-between }`
   from custom.css line ~1166. */
@media (max-width: 767px) {
[data-product-handle="the-view"] .title-price-wrapper,
[data-product-handle="the-classic"] .title-price-wrapper,
[data-product-handle="the-view"] .title-price-wrapper.trieye-mobile-title,
[data-product-handle="the-classic"] .title-price-wrapper.trieye-mobile-title {
  display: grid !important;
  flex-direction: initial !important;
  grid-template-columns: 1fr auto !important;
  grid-template-rows: auto auto !important;
  column-gap: 14px;
  row-gap: 0 !important;
  align-items: center !important;
  position: static !important;
  /* Breathing room below the title row before REAR-VIEW MIRROR. */
  margin-bottom: 18px !important;
}

/* Flatten the nested wrappers so their inner elements become direct
   grid items. Repeat the `.trieye-mobile-title` selector to beat the
   mobile `!important` overrides on these same nodes. */
[data-product-handle="the-view"] .title-price-wrapper > .product__block__title,
[data-product-handle="the-classic"] .title-price-wrapper > .product__block__title,
[data-product-handle="the-view"] .title-price-wrapper > .product__block__title > .product__headline,
[data-product-handle="the-classic"] .title-price-wrapper > .product__block__title > .product__headline,
[data-product-handle="the-view"] .title-price-wrapper > .product__block__title > .product__headline > .product__title__wrapper,
[data-product-handle="the-classic"] .title-price-wrapper > .product__block__title > .product__headline > .product__title__wrapper,
[data-product-handle="the-view"] .title-price-wrapper > .product__block__price,
[data-product-handle="the-classic"] .title-price-wrapper > .product__block__price,
[data-product-handle="the-view"] .title-price-wrapper > .product__block__price > .product__price__wrap,
[data-product-handle="the-classic"] .title-price-wrapper > .product__block__price > .product__price__wrap,
[data-product-handle="the-view"] .title-price-wrapper.trieye-mobile-title > .product__block__title,
[data-product-handle="the-classic"] .title-price-wrapper.trieye-mobile-title > .product__block__title,
[data-product-handle="the-view"] .title-price-wrapper.trieye-mobile-title > .product__block__title > .product__headline,
[data-product-handle="the-classic"] .title-price-wrapper.trieye-mobile-title > .product__block__title > .product__headline,
[data-product-handle="the-view"] .title-price-wrapper.trieye-mobile-title > .product__block__title > .product__headline > .product__title__wrapper,
[data-product-handle="the-classic"] .title-price-wrapper.trieye-mobile-title > .product__block__title > .product__headline > .product__title__wrapper {
  display: contents !important;
}

/* H1: left column, spans both rows. Larger font-size so its natural
   height accommodates the stacked price + rating in the right column. */
[data-product-handle="the-view"] .title-price-wrapper .product__title,
[data-product-handle="the-classic"] .title-price-wrapper .product__title,
[data-product-handle="the-view"] .title-price-wrapper.trieye-mobile-title .product__title,
[data-product-handle="the-classic"] .title-price-wrapper.trieye-mobile-title .product__title {
  grid-column: 1;
  grid-row: 1 / span 2;
  align-self: center;
  margin: 0;
  padding-right: 0 !important;
  width: auto !important;
  max-width: 100%;
  flex: none !important;
  font-size: 40px !important;
  line-height: 1 !important;
}

/* Price block: top-right cell, hugs the top of the title's height.
   Font is shrunk so price + rating together fit within the h1 height. */
[data-product-handle="the-view"] .title-price-wrapper .product__price__main,
[data-product-handle="the-classic"] .title-price-wrapper .product__price__main,
[data-product-handle="the-view"] .title-price-wrapper.trieye-mobile-title .product__price__main,
[data-product-handle="the-classic"] .title-price-wrapper.trieye-mobile-title .product__price__main {
  grid-column: 2;
  grid-row: 1;
  justify-self: end;
  align-self: end;
  text-align: right;
  white-space: nowrap;
  font-size: 16px !important;
  line-height: 1.1 !important;
  padding: 0 !important;
  margin: 0 !important;
}

/* Shrink the actual price text and "From" prefix inside whichever
   Pipeline renderer is active (sale-price-block on sale flows,
   .product__price on regular flows). The right column has to fit
   inside the h1's height — current Pipeline defaults are 26-30px
   which alone exceed the mobile h1 height of 31px. */
[data-product-handle="the-view"] .title-price-wrapper .product__price,
[data-product-handle="the-classic"] .title-price-wrapper .product__price,
[data-product-handle="the-view"] .title-price-wrapper [data-product-price],
[data-product-handle="the-classic"] .title-price-wrapper [data-product-price],
[data-product-handle="the-view"] .title-price-wrapper .sale-price-block__now,
[data-product-handle="the-classic"] .title-price-wrapper .sale-price-block__now,
[data-product-handle="the-view"] .title-price-wrapper .sale-price-block__compare,
[data-product-handle="the-classic"] .title-price-wrapper .sale-price-block__compare {
  font-size: 16px !important;
  line-height: 1.1 !important;
}
[data-product-handle="the-view"] .title-price-wrapper .sale-price-block__from,
[data-product-handle="the-classic"] .title-price-wrapper .sale-price-block__from {
  font-size: 11px !important;
  line-height: 1.1 !important;
  margin-right: 2px;
}

/* The outer .product__block__price has its own mobile rules
   (absolute positioning at lines ~5961). Force it back into the
   normal grid flow as a static child whose contents we've already
   promoted. */
[data-product-handle="the-view"] .title-price-wrapper > .product__block__price,
[data-product-handle="the-classic"] .title-price-wrapper > .product__block__price,
[data-product-handle="the-view"] .title-price-wrapper.trieye-mobile-title > .product__block__price,
[data-product-handle="the-classic"] .title-price-wrapper.trieye-mobile-title > .product__block__price {
  position: static !important;
  width: auto !important;
  max-width: none !important;
  margin: 0 !important;
  flex: none !important;
}

/* Inline rating chip (cloned Judge.me badge): bottom-right cell.
   `align-self: end` drops the rating to the bottom of its grid cell
   so its baseline lines up with the title's baseline (both bottom-edge
   to bottom-edge of the wrapper). */
[data-product-handle="the-view"] .title-price-wrapper .trieye-inline-rating,
[data-product-handle="the-classic"] .title-price-wrapper .trieye-inline-rating,
[data-product-handle="the-view"] .title-price-wrapper.trieye-mobile-title .trieye-inline-rating,
[data-product-handle="the-classic"] .title-price-wrapper.trieye-mobile-title .trieye-inline-rating {
  grid-column: 2;
  grid-row: 2;
  justify-self: end;
  align-self: end;
  /* Lift the rating up so its dotted-underline baseline matches the
     visual letter-bottom of "THE VIEW". Title font-size 40px,
     line-height 1 → the bounding box is 40px tall but the letter
     baseline sits ~10px above the box's bottom edge. The rating's
     own underline adds another 1-2px below its text, so we lift
     by ~10px total to land flush with "THE VIEW"'s baseline. */
  margin: 0 0 10px 0 !important;
  width: auto !important;
  flex: none !important;
  display: inline-flex;
  align-items: baseline;
  gap: 4px;
  text-decoration: none;
  color: inherit;
  line-height: 1;
  font-size: 11px;
  cursor: pointer;
}
[data-product-handle="the-view"] .title-price-wrapper .trieye-inline-rating:not([data-rated]),
[data-product-handle="the-classic"] .title-price-wrapper .trieye-inline-rating:not([data-rated]) {
  visibility: hidden;
  min-height: 14px;
  display: inline-flex;
  /* 2026-05-15 (anti-jump): also reserve horizontal space. Without
     this, the slot is 0px wide while Judge.me's clone is pending —
     when [data-rated] flips, the slot grows to ~164px and the title
     wrapper widens by the same. Reserving 164px keeps the title row
     stable from first paint. Measured width post-populate: 164px on
     The View (755 reviews); Classic with 0 reviews stays in the
     non-rated state and the reserved space appears as a small empty
     area in the bottom-right grid cell — acceptable trade-off. */
  min-width: 164px;
}
[data-product-handle="the-view"] .title-price-wrapper .trieye-inline-rating .jdgm-prev-badge__stars,
[data-product-handle="the-classic"] .title-price-wrapper .trieye-inline-rating .jdgm-prev-badge__stars {
  display: inline-flex;
  align-items: center;
  gap: 1px;
  font-size: 0;
  line-height: 1;
}
[data-product-handle="the-view"] .title-price-wrapper .trieye-inline-rating .jdgm-star,
[data-product-handle="the-classic"] .title-price-wrapper .trieye-inline-rating .jdgm-star {
  width: 11px !important;
  height: 11px !important;
  font-size: 11px !important;
  line-height: 1 !important;
  background-size: 11px 11px !important;
}
[data-product-handle="the-view"] .title-price-wrapper .trieye-inline-rating .jdgm-prev-badge__text,
[data-product-handle="the-classic"] .title-price-wrapper .trieye-inline-rating .jdgm-prev-badge__text {
  font-size: 11px;
  color: #666;
  text-decoration: underline dotted rgba(0, 0, 0, 0.3);
  text-underline-offset: 3px;
  white-space: nowrap;
  line-height: 1;
}

/* The secondary `.rating__wrapper__title` would render a duplicate
   rating display below the title — hide it; the inline slot is the
   only rating display we want. */
[data-product-handle="the-view"] .title-price-wrapper .rating__wrapper__title,
[data-product-handle="the-classic"] .title-price-wrapper .rating__wrapper__title {
  display: none;
}

/* The mobile JS injects `.px-model-line` between h1 and the rating
   slot inside .product__title__wrapper. After `display: contents`
   promotes it to a grid child, place it on row 3 spanning both
   columns so it sits below the title row. */
[data-product-handle="the-view"] .title-price-wrapper .px-model-line,
[data-product-handle="the-classic"] .title-price-wrapper .px-model-line {
  grid-column: 1 / -1;
  grid-row: 3;
  margin-top: 4px;
}

/* Cutline (if present): row 3, full width below the title. */
[data-product-handle="the-view"] .title-price-wrapper .product__page__cutline,
[data-product-handle="the-classic"] .title-price-wrapper .product__page__cutline {
  grid-column: 1 / -1;
  grid-row: 4;
  margin: 4px 0 0;
}
} /* end @media (max-width: 767px) — title-row mobile-only block */

/* ─── YOUR BUILD — per-lens marketing summary (2026-05-14) ─────────
   Short benefit-led line that swaps when the customer changes lens
   type. Sits above the existing "Everything you've selected..."
   explainer so the marketing copy is the first thing they read on
   opening the build accordion. */
/* 2026-05-19 (v23) — bumped 13px → 14.5px for the YOUR BUILD lens summary.
   This is the customer's primary confidence message ("Crystal clear lens for
   night rides..."), so it should read comfortably, not squeezed in. */
.px-build-lens-summary {
  font-size: 14.5px;
  line-height: 1.45;
  color: #1a1a1a;
  margin: 0 0 10px 0;
  padding: 10px 12px;
  background: #faf7f2;
  border-left: 3px solid #1a1a1a;
  border-radius: 2px;
}
.px-build-lens-summary[hidden] {
  display: none;
}

/* ─── Homepage "A mirror, reimagined" — mobile portrait image swap ─
   2026-05-17: the desktop landscape image puts the rear-view mirror
   on the LEFT third of the frame. Mobile's portrait crop with
   object-fit: cover + center origin clips it off. Force a shorter
   portrait aspect ratio AND swap to the -hero-mobile companion
   (composed for portrait viewing) so the mirror stays visible.
   2026-05-17 (round 2): aspect 4:5 instead of 9:16 — the previous
   9:16 made the section ~178vw tall on mobile which dominated the
   viewport. 4:5 renders ~125vw tall — much tighter. Also dropped
   CDN width from 900 to 600 (~660KB vs ~1.5MB; mobile logical
   widths are 360-430px so 600 is already retina-resolution).
   Scoped to .tri-a-mirror (section_double_jpanEG.custom_class). */
@media (max-width: 749px) {
  .tri-a-mirror .image__hero__frame {
    aspect-ratio: 4 / 5 !important;
  }
  .tri-a-mirror .image__hero__scale {
    height: 100% !important;
    background-image: url('/cdn/shop/files/trieye-how-mirror-works-hero-mobile.png?v=1778936184&width=600');
    background-size: cover;
    /* Position lower-center: the mirror sits in the lower-left of the
       lens (which is in the lower half of the portrait image). Bias
       toward 65% from top so the mirror stays in frame after the
       4:5 crop trims part of the top sky/horizon. */
    background-position: center 65%;
  }
  .tri-a-mirror .image__hero__scale img {
    opacity: 0 !important;
  }
}


/* ════════════════════════════════════════════════════════════════════
   2026-05-19 (v58) — Intercom chat launcher GLOBAL position.
   User explicit: 60px from bottom, !important, on every page —
   not 110px (the previous PDP lift in sticky-add-to-cart.liquid)
   and not 130px (the lift when sticky-CTA was active). Overlap with
   in-page ATC at the bottom of PDP is accepted.

   Selectors cover all known chat widgets in case any are swapped in
   later: Intercom (4 variants — class + frame + iframe-name), Drift,
   Crisp, Tawk, Tidio. The `bottom: 60px !important` wins regardless
   of which provider is loaded.
   ════════════════════════════════════════════════════════════════════ */
.intercom-lightweight-app-launcher,
.intercom-launcher,
.intercom-launcher-frame,
iframe[name="intercom-launcher-frame"],
#drift-frame-controller,
iframe.drift-frame-chat,
.crisp-client .cc-1brb6,
#tawkchat-minified-wrapper,
.tidio-chat-iframe {
  bottom: 60px !important;
}

/* ════════════════════════════════════════════════════════════════════
   2026-05-19 (v69) — Cart-drawer swipe-zone GLOBAL position fix.
   The v68 attempt to move this rule outside @media queries failed —
   it was still inside an outer `@media (max-width:767px)` block that
   opens at line 2812 of this file and doesn't close until line 3576.
   This rule is at the absolute END of the file, after all media
   queries close, so it applies on every viewport width.

   Why this matters: `.cart-drawer-swipe-zone` is a DOM child of
   `.cart-drawer-header`. Without `position: absolute` it takes a
   normal grid cell, pushing the 4-child header (swipe-zone, title,
   logo, close) into a 2-row layout with X dropping below the title.
   Absolute positioning keeps it out of the grid flow.
   ════════════════════════════════════════════════════════════════════ */
#drawer-cart .cart-drawer-swipe-zone {
  position: absolute !important;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
  width: 90px;
  height: 100%;
  z-index: 0;
  pointer-events: none;
  touch-action: pan-y;
}
