/* LutLocker light/dark theme. `theme-dark` class on <html> switches modes. */

/* Smooth scrolling for anchor links site-wide; wheel easing lives in theme.js
   (which drives its own scrolls with behavior: "instant" to bypass this). */
html {
  scroll-behavior: smooth;
}

@media (prefers-reduced-motion: reduce) {
  html {
    scroll-behavior: auto;
  }
}

html.theme-dark {
  color-scheme: dark;
  --background-primary: 16 16 16;
  --text-primary: 255 255 255;
  /* header + footer pull from their own vars (see .header/.footer in theme.css) */
  --header-background: 18 18 18;
  --header-text: 255 255 255;
  --footer-background: 12 12 12;
  --footer-text: 255 255 255;
  --dialog-background: 24 24 24;
}

html.theme-dark body {
  background: rgb(16 16 16);
  color: #fff;
}

/* App blocks (benefit lists, spec tables…) hardcode dark ink; their
   color declarations were rewritten to use var(--ll-ink, <original>). */
html.theme-dark {
  --ll-ink: #fff;
}

/* SVG icons with baked-in dark fills */
html.theme-dark [id^="shopify-section-"] svg [fill="#1c1c1c"],
html.theme-dark [id^="shopify-section-"] svg[fill="#1c1c1c"],
html.theme-dark [id^="shopify-section-"] svg [fill="#1C1C1C"],
html.theme-dark [id^="shopify-section-"] svg [fill="black"],
html.theme-dark [id^="shopify-section-"] svg[fill="black"] {
  fill: #fff;
}

/* Flip sections and product cards. !important beats the per-element inline
   style="--background: ...; --text-color: ..." the theme uses. */
html.theme-dark [id^="shopify-section-"],
html.theme-dark .shopify-section,
html.theme-dark .bg-custom,
html.theme-dark [style*="--background: 242 242 242"],
html.theme-dark [style*="--background: 255 255 255"],
html.theme-dark [style*="--background: 232 232 232"] {
  --background: 18 18 18 !important;
  --text-color: 255 255 255 !important;
}

/* Any element that pins dark text inline gets light text in dark mode. */
html.theme-dark [style*="--text-color: 28 28 28"],
html.theme-dark [style*="--text-color: 0 0 0"] {
  --text-color: 255 255 255 !important;
}

/* Product pages include app blocks with hardcoded text and panel colors. */
html:not(.theme-dark) :is(
  .product,
  .product-info,
  .product-info__block-item,
  .product-info__liquid,
  .quick-buy-drawer,
  .shopify-app-block,
  table-flow,
  [class*="product-comparison"],
  [class*="video-text"],
  [class*="lazy-video-content"]
) {
  --text-color: 0 0 0 !important;
  --text-primary: 0 0 0 !important;
  --text-subdued: 0 0 0 !important;
  --ll-ink: #000 !important;
  color: #000 !important;
}

html.theme-dark :is(
  .product,
  .product-info,
  .product-info__block-item,
  .product-info__liquid,
  .quick-buy-drawer,
  .shopify-app-block,
  table-flow,
  [class*="product-comparison"],
  [class*="video-text"],
  [class*="lazy-video-content"]
) {
  --text-color: 255 255 255 !important;
  --text-primary: 255 255 255 !important;
  --text-subdued: 255 255 255 !important;
  --background: 18 18 18 !important;
  --background-primary: 18 18 18 !important;
  --dialog-background: 24 24 24 !important;
  --ll-ink: #fff !important;
  color: #fff !important;
}

html:not(.theme-dark) :is(
  .product,
  .product-info,
  .quick-buy-drawer,
  .shopify-app-block,
  table-flow,
  [class*="product-comparison"],
  [class*="video-text"],
  [class*="lazy-video-content"]
) :is(p, span, div, h1, h2, h3, h4, h5, h6, li, td, th, label) {
  color: #000 !important;
  -webkit-text-fill-color: #000 !important;
}

html.theme-dark :is(
  .product,
  .product-info,
  .quick-buy-drawer,
  .shopify-app-block,
  table-flow,
  [class*="product-comparison"],
  [class*="video-text"],
  [class*="lazy-video-content"]
) :is(p, span, div, h1, h2, h3, h4, h5, h6, li, td, th, label) {
  color: #fff !important;
  -webkit-text-fill-color: #fff !important;
}

html.theme-dark :is(
  [style*="color: #121212"],
  [style*="color:#121212"],
  [style*="color: #1c1c1c"],
  [style*="color:#1c1c1c"],
  [style*="color: #000000"],
  [style*="color:#000000"],
  [style*="color: black"],
  [style*="color:black"]
) {
  color: #fff !important;
  -webkit-text-fill-color: #fff !important;
}

html.theme-dark [style*="-webkit-text-fill-color: transparent"] {
  background: none !important;
  -webkit-background-clip: initial !important;
  background-clip: initial !important;
  -webkit-text-fill-color: #fff !important;
  color: #fff !important;
}

html.theme-dark :is(
  [style*="background-color:#f2f2f2"],
  [style*="background-color: #f2f2f2"],
  [style*="background-color:#ffffff"],
  [style*="background-color: #ffffff"],
  [style*="background: #f2f2f2"],
  [style*="background:#f2f2f2"],
  [style*="background: #ffffff"],
  [style*="background:#ffffff"]
) {
  background: #121212 !important;
  background-color: #121212 !important;
}

html.theme-dark .text-subdued,
html.theme-dark compare-at-price,
html.theme-dark .product-info__price .line-through {
  color: #fff !important;
  -webkit-text-fill-color: #fff !important;
}

/* The rule above has to force white so subdued text survives on a dark
   background, but a full-white struck-through price competes with the sale
   price next to it. Half strength reads as grey without fighting the
   !important. */
html.theme-dark :is(compare-at-price, .line-through) {
  opacity: 0.5;
}

html.theme-dark .section-product-comparison,
html.theme-dark .section-product-comparison [class*="ss_comparison_table"],
html.theme-dark .section-product-comparison .product-comparison {
  --gradient-start: #121212 !important;
  --gradient-end: #121212 !important;
  --primary-column-bg: #1c1c1c !important;
  --primary-column-gradient-start: #1c1c1c !important;
  --primary-column-gradient-end: #2a2a2a !important;
  --primary-column-text: #ffffff !important;
  --feature-text-color: #ffffff !important;
  --competitor-text-color: #ffffff !important;
  --divider-color: rgba(255, 255, 255, 0.22) !important;
  --check-color: #ffffff !important;
  --cross-color: #ffffff !important;
  background: #121212 !important;
  background-color: #121212 !important;
  color: #ffffff !important;
}

html.theme-dark .section-product-comparison .product-comparison__column--primary {
  background: #1c1c1c !important;
  background-color: #1c1c1c !important;
}

html.theme-dark .section-product-comparison .product-comparison__row .product-comparison__feature-label,
html.theme-dark .section-product-comparison .product-comparison__row .product-comparison__column--competitor {
  border-color: rgba(255, 255, 255, 0.22) !important;
}

html.theme-dark .section-product-comparison .product-comparison__icon--cross svg [fill="#1c1c1c"],
html.theme-dark .section-product-comparison .product-comparison__icon--cross svg [fill="#1C1C1C"] {
  fill: #ffffff !important;
}

/* Keep the red accent (announcement / promo) sections red. */
html.theme-dark [style*="--background: 242 71 71"] {
  --background: 242 71 71 !important;
  --text-color: 242 242 242 !important;
}

/* Logo: black artwork in light mode, inverted to white in dark mode. */
html.theme-dark img[src*="lutlocker/logo-black"] {
  filter: invert(1);
}

/* Hide the mobile search icon (left of the logo); on mobile the theme
   toggle sits alone on the right side of the header instead. */
header a[aria-controls="search-drawer"].sm\:hidden {
  display: none;
}

@media screen and (max-width: 999px) {
  .navigation-drawer .panel-footer__account-link {
    display: none !important;
  }
}

/* Slightly larger header logo on desktop (1150px is where the full desktop
   nav layout kicks in). `html` prefix outranks the section's inline <style>,
   which sets 130px on the same id. Core CSS derives height automatically. */
@media screen and (min-width: 1150px) {
  html #shopify-section-sections--29432090493192__header {
    --header-logo-width: 150px;
  }
}

/* The toggle button */
.ll-theme-toggle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: none;
  border: none;
  cursor: pointer;
  color: currentColor;
  padding: 0;
}
.ll-theme-toggle svg { display: block; }
.ll-theme-toggle .ll-icon-moon { display: block; }
.ll-theme-toggle .ll-icon-sun { display: none; }
html.theme-dark .ll-theme-toggle .ll-icon-moon { display: none; }
html.theme-dark .ll-theme-toggle .ll-icon-sun { display: block; }

/* Desktop nav links (Home, Shop, Limited Time Sale, Contact): bump from the
   theme's 14px base for more presence. */
.header__link-list .header-link-weight {
  font-size: 16px;
}

/* Thinner desktop header: the section's inline <style> sets 24px vertical
   padding (--spacing-6) from 700px up; !important beats its ID selector. */
@media screen and (min-width: 700px) {
  .shopify-section--header {
    --header-padding-block: var(--spacing-3) !important;
  }
}

.ll-sale-nav-link {
  color: #f24747 !important;
  transition: color 0.18s ease, text-shadow 0.18s ease, filter 0.18s ease;
}

.ll-sale-nav-link:hover,
.ll-sale-nav-link:focus-visible {
  color: #ff5a5a !important;
  text-shadow:
    0 0 7px rgba(242, 71, 71, 0.62),
    0 0 18px rgba(242, 71, 71, 0.38),
    0 0 30px rgba(242, 71, 71, 0.2);
  filter: brightness(1.14);
}

/* Owned product-page social proof: a compact five-star order count directly
   beneath the title, independent of third-party review widgets. */
.ll-product-proof {
  display: flex;
  align-items: center;
  gap: 0.55rem;
  margin-block: 0.4rem 0.55rem !important;
  line-height: 1;
}

html .product-info .ll-product-proof__stars {
  position: relative;
  display: inline-block;
  font-size: clamp(15px, 1.2vw, 18px);
  letter-spacing: 0.06em;
  line-height: 1;
}

/* Fractional ratings (e.g. 4.5/5) are rendered as two overlapping five-star
   strings: a dim background and a bright foreground clipped to the rating's
   percentage width, so the fill can land mid-glyph. */
/* `span.` (not just `.`) matches the specificity of the product-page rule
   that forces black/white text on every span in .product-info, so these
   colors win despite appearing after it in cascade order either way. */
html .product-info span.ll-product-proof__stars-bg {
  color: rgba(247, 178, 59, 0.3) !important;
  -webkit-text-fill-color: rgba(247, 178, 59, 0.3) !important;
  white-space: nowrap;
  display: block;
}

html .product-info span.ll-product-proof__stars-fg {
  position: absolute;
  top: 0;
  left: 0;
  overflow: hidden;
  white-space: nowrap;
  color: #f7b23b !important;
  -webkit-text-fill-color: #f7b23b !important;
  text-shadow: 0 1px 8px rgba(247, 178, 59, 0.2);
}

.ll-product-proof__orders {
  font-size: clamp(13px, 1vw, 15px);
  font-weight: 500;
  letter-spacing: 0;
  white-space: nowrap;
}

html:not(.theme-dark) .product-info .ll-product-proof__orders {
  color: rgba(0, 0, 0, 0.78) !important;
  -webkit-text-fill-color: rgba(0, 0, 0, 0.78) !important;
}

html.theme-dark .product-info .ll-product-proof__orders {
  color: rgba(255, 255, 255, 0.78) !important;
  -webkit-text-fill-color: rgba(255, 255, 255, 0.78) !important;
}

@media screen and (max-width: 699px) {
  .shopify-section--main-product .product-info__title {
    font-size: clamp(2rem, 8.5vw, 2.375rem) !important;
    line-height: 1.08;
  }
}

/* Product-card titles (shop grid + homepage featured slider share this same
   component) read too small at the theme's default size, on both mobile
   and desktop. */
.product-card__title {
  font-size: 18px;
  line-height: 1.25;
}

/* Default gap between the card image and title reads too loose; tighten
   it. Two components make up the visible gap - the figure's own bottom
   margin and the info block's top padding - so both need trimming. */
.product-card__figure {
  margin-block-end: var(--spacing-2) !important;
}

.product-card__info {
  padding-block-start: var(--spacing-1) !important;
}

section-store--benefits-list-block,
.shopify-app-block:has(section-store--benefits-list-block),
.product-info__block-item:has(section-store--benefits-list-block) {
  background: transparent !important;
  background-color: transparent !important;
}

html:not(.theme-dark) [class*="product-image-banner-template"] [class*="product-image-banner"][class*="-settings"],
html:not(.theme-dark) [class*="product-image-banner-template"] > [class*="-settings"] {
  background: #000 !important;
  background-color: #000 !important;
}

html:not(.theme-dark) [class*="product-image-banner-template"] :is(p, span, div, strong) {
  color: #fff !important;
  -webkit-text-fill-color: #fff !important;
}

html:not(.theme-dark) [class*="product-image-banner-template"] img {
  filter: brightness(0) invert(1);
}

html.theme-dark [class*="product-image-banner-template"] [class*="product-image-banner"][class*="-settings"],
html.theme-dark [class*="product-image-banner-template"] > [class*="-settings"] {
  background: #fff !important;
  background-color: #fff !important;
}

html.theme-dark [class*="product-image-banner-template"] :is(p, span, div, strong) {
  color: #000 !important;
  -webkit-text-fill-color: #000 !important;
}

html.theme-dark [class*="product-image-banner-template"] img {
  filter: none;
}

#shopify-section-template--29432861557000__multi_column_Eq46Hz video {
  border-radius: 8px !important;
  overflow: hidden;
}

.product-info__buy-buttons buy-buttons button[type="submit"],
.product-quick-add buy-buttons button[type="submit"],
.quick-buy-drawer buy-buttons button[type="submit"] {
  --button-background-primary: 255 84 84;
  --button-background-secondary: 255 84 84;
  --button-text-primary: 255 255 255;
  --button-text-secondary: 255 255 255;
  position: relative !important;
  overflow: hidden !important;
  background: linear-gradient(145deg, #470000, #ff5454) !important;
  border-color: transparent !important;
  color: #fff !important;
  justify-content: center !important;
  text-align: center !important;
  box-shadow: 0 8px 16px #0000004d, 0 4px 8px #00000033, inset 0 1px 0 #ffffff1a, inset 0 -1px 0 #0000004d !important;
  backdrop-filter: saturate(1.05);
  transition: all 0.25s ease 0s !important;
}

.product-info__buy-buttons buy-buttons button[type="submit"]::before,
.product-quick-add buy-buttons button[type="submit"]::before,
.quick-buy-drawer buy-buttons button[type="submit"]::before {
  content: "";
  position: absolute;
  top: 0;
  left: -100%;
  width: 100%;
  height: 100%;
  background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent);
  transition: left 0.6s ease;
}

.product-info__buy-buttons buy-buttons button[type="submit"] > *,
.product-quick-add buy-buttons button[type="submit"] > *,
.quick-buy-drawer buy-buttons button[type="submit"] > * {
  display: flex !important;
  position: relative;
  z-index: 1;
  width: 100%;
  margin-inline: auto !important;
  gap: 0 !important;
  align-items: center !important;
  justify-content: center !important;
  text-align: center !important;
  color: #fff !important;
  -webkit-text-fill-color: #fff !important;
}

.product-info__buy-buttons buy-buttons button[type="submit"] > .text-with-icon,
.product-quick-add buy-buttons button[type="submit"] > .text-with-icon,
.quick-buy-drawer buy-buttons button[type="submit"] > .text-with-icon {
  gap: 0 !important;
  width: 100% !important;
  min-width: 100% !important;
  max-width: 100% !important;
}

.product-info__buy-buttons buy-buttons button[type="submit"] :is(div, span, p),
.product-quick-add buy-buttons button[type="submit"] :is(div, span, p),
.quick-buy-drawer buy-buttons button[type="submit"] :is(div, span, p) {
  color: #fff !important;
  -webkit-text-fill-color: #fff !important;
}

.product-info__buy-buttons buy-buttons button[type="submit"] svg,
.product-quick-add buy-buttons button[type="submit"] svg,
.quick-buy-drawer buy-buttons button[type="submit"] svg {
  display: none !important;
}

.product-info__buy-buttons buy-buttons button[type="submit"]:hover::before,
.product-quick-add buy-buttons button[type="submit"]:hover::before,
.quick-buy-drawer buy-buttons button[type="submit"]:hover::before {
  left: 100%;
}

.product-info__buy-buttons buy-buttons button[type="submit"]:hover,
.product-quick-add buy-buttons button[type="submit"]:hover,
.quick-buy-drawer buy-buttons button[type="submit"]:hover {
  background: linear-gradient(145deg, #470000, #ff5454) !important;
  color: #fff !important;
  transform: translateY(-2px);
  box-shadow: 0 12px 24px #00000066, 0 6px 12px #0000004d, inset 0 1px 0 #ffffff26, inset 0 -1px 0 #00000066 !important;
}

.product-info__buy-buttons buy-buttons button[type="submit"]:active,
.product-quick-add buy-buttons button[type="submit"]:active,
.quick-buy-drawer buy-buttons button[type="submit"]:active {
  transform: translateY(1px);
  filter: brightness(1.00208);
  box-shadow: 0 4px 8px #0000004d, 0 2px 4px #00000033, inset 0 1px 0 #ffffff0d, inset 0 -1px 0 #00000033 !important;
}

[id^="reviews-body-template--"][id*="__ss_product_reviews_"],
[class^="section-template--"][class*="__ss_product_reviews_"] {
  display: none !important;
}

.product-info__block-item[data-block-type="used-by-section"] {
  display: none !important;
}

[id^="shopify-section-"][id*="__ss_video_with_text_9_gGianw"],
[id^="shopify-section-"][id*="__1782739337b872ee74"],
lazy-video-content-adnd4sfdtrgwxduk5yaigenblock2fc7365rafjki,
[class*="lazy-video-content-adnd4sfdtrgwxduk5yaigenblock2fc7365rafjki"] {
  display: none !important;
}

html:has(.shopify-section--main-product) .eapps-instagram-feed,
html:has(.shopify-section--main-product) [class*="eapps-instagram-feed"],
html:has(.shopify-section--main-product) .elfsight-app-3ba28453-a76e-414e-92e5-e505aba79b69,
html:has(.shopify-section--main-product) .elfsight-app-8f46ef6f-9f16-489a-bd60-a47f32c4fa99,
html:has(.shopify-section--main-product) elfsight-app[data-id="3ba28453-a76e-414e-92e5-e505aba79b69"],
html:has(.shopify-section--main-product) elfsight-app[data-id="8f46ef6f-9f16-489a-bd60-a47f32c4fa99"] {
  display: none !important;
}

html:has(.shopify-section--main-product) .tableflow-section[data-type="specification"],
html:has(.shopify-section--main-product) table-flow.tableFlowBlockApp,
html:has(.shopify-section--main-product) [id*="__tableflow_spec_table_app_block_yUedax"],
html:has(.shopify-section--main-product) [data-block-id*="__tableflow_spec_table_app_block_yUedax"] {
  display: none !important;
}

/* LutLocker product trust bar: replaces the baked-in payment-symbols PNG with
   real markup so it can drop the "Unlock Telescope" item and follow the theme:
   ink is black in light mode, white in dark mode (icons via currentColor). */
.ll-trust-bar {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: 14px 44px;
  color: #000;
  margin-top: -2px;
  padding-bottom: 14px;
}

html.theme-dark .ll-trust-bar {
  color: #fff;
}

.ll-trust-item {
  display: flex;
  align-items: center;
  gap: 10px;
  color: inherit;
}

.ll-trust-icon {
  flex-shrink: 0;
  width: 26px;
  height: 26px;
  color: inherit;
}

.ll-trust-text {
  display: flex;
  flex-direction: column;
  line-height: 1.25;
  text-align: left;
}

.ll-trust-title {
  font-size: 13px;
  font-weight: 600;
  color: inherit;
}

.ll-trust-sub {
  font-size: 12px;
  color: inherit;
  opacity: 0.72;
}

@media screen and (max-width: 749px) {
  .ll-trust-bar {
    gap: 12px 22px;
  }

  .ll-trust-icon {
    width: 22px;
    height: 22px;
  }

  .ll-trust-title {
    font-size: 12px;
  }

  .ll-trust-sub {
    font-size: 11px;
  }
}

/* LutLocker scrolling brand-logo bar (product pages). The section ships with a
   hardcoded light (#f2f2f2) strip, so in dark mode we take the strip dark to
   match the rest of the page. */
html.theme-dark [class*="ss_scrolling_logo_cloud"][class*="-settings"],
html.theme-dark [class*="scrolling-logo-cloud_"],
html.theme-dark #ss-scrolling-logo-cloud {
  background: #101010 !important;
}

.ll-logos {
  overflow: hidden;
  padding: 27px 0;
  /* Fade the marks out at both edges instead of letting them hit a hard cut.
     The mask is on the rail, not the strip, so the background stays solid. */
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 7%, #000 93%, transparent);
          mask-image: linear-gradient(90deg, transparent, #000 7%, #000 93%, transparent);
}

/* Four identical sets run end to end and the track travels exactly one of them,
   so the loop closes on the start of a copy and the seam never shows. Doing it
   this way, rather than translating a fixed number of fixed-width slides, is
   what lets each logo keep its natural width.

   Four rather than two: the track only ever scrolls one set, so the remaining
   copies have to cover the strip for the whole cycle. One set is ~1354px, so
   two sets would run off the end of the track on anything wider than that and
   leave the strip empty at one edge. */
.ll-logos__track {
  display: flex;
  width: max-content;
  animation: ll-logos-scroll 45s linear infinite;
}

.ll-logos__set {
  display: flex;
  align-items: center;
  gap: 76px;
  padding: 0 38px;
  margin: 0;
  list-style: none;
}

.ll-logos__item {
  display: flex;
  flex: 0 0 auto;
  align-items: center;
}

/* One asset per logo: a black silhouette carrying the mark's alpha. brightness(0)
   flattens any source colour to black, and inverting that gives white, so the
   set reads as flat black on the light strip and flat white on the dark one. */
/* Each asset holds its mark at a fixed share of the canvas height, with the rest
   as transparent padding, so this one height renders every logo at the same
   optical size, not merely the same bounding-box size. The box is taller than
   the lettering looks; that headroom is the padding doing its job. */
.ll-logos__item img {
  display: block;
  width: auto;
  height: 35px;
  filter: brightness(0);
  opacity: 0.75;
}

html.theme-dark .ll-logos__item img {
  filter: brightness(0) invert(1);
  opacity: 0.7;
}

/* Travels left to right: the track starts pulled one set to the left and unwinds
   back to zero, so the logos drift rightwards. -25% of a four-set track is
   exactly one set, which is what keeps the loop seamless in either direction. */
@keyframes ll-logos-scroll {
  from { transform: translateX(-25%); }
  to   { transform: translateX(0); }
}

@media (prefers-reduced-motion: reduce) {
  .ll-logos__track { animation: none; }
}

@media (max-width: 767px) {
  .ll-logos { padding: 20px 0; }

  .ll-logos__set {
    gap: 48px;
    padding: 0 24px;
  }

  .ll-logos__item img { height: 26px; }
}

/* Comparison table "Freedom" badge: the primary card is dark in both modes,
   so the badge text/icon must stay white regardless of light or dark mode. */
html:not(.theme-dark) .section-product-comparison .product-comparison__badge--positive,
html:not(.theme-dark) .section-product-comparison .product-comparison__badge--positive span,
html.theme-dark .section-product-comparison .product-comparison__badge--positive,
html.theme-dark .section-product-comparison .product-comparison__badge--positive span {
  color: #fff !important;
  -webkit-text-fill-color: #fff !important;
}

html .section-product-comparison .product-comparison__badge--positive svg path {
  fill: #fff !important;
}

/* "Download soundlist" button is a dark button; keep its label white in both
   light and dark mode (otherwise the dark ink makes it unreadable). */
html a.button[href*="Asset_List"],
html a.button[href*="Asset_List"] * {
  color: #fff !important;
  -webkit-text-fill-color: #fff !important;
}

/* ===== LutLocker testimonial wall ("What Others Say About Us") ===== */
.ll-testimonials {
  padding-block: clamp(20px, 3vw, 40px) clamp(48px, 7vw, 96px);
}

.ll-testimonials > .section {
  padding-block-start: 0;
}

.ll-testimonials .ll-tm-heading {
  text-align: center;
  margin: 0 auto clamp(28px, 4vw, 48px);
  padding-inline: 20px;
}

.ll-tm-wall {
  column-count: 4;
  column-gap: 20px;
  max-width: 1240px;
  margin-inline: auto;
  padding-inline: 24px;
}

@media (max-width: 1100px) { .ll-tm-wall { column-count: 3; } }
@media (max-width: 900px)  {
  .ll-testimonials {
    padding-block: clamp(24px, 8vw, 36px) clamp(56px, 14vw, 84px);
  }

  .ll-testimonials > .section {
    padding-inline: 0;
  }

  .ll-testimonials .ll-tm-heading {
    margin-bottom: 28px;
    padding-inline: 16px;
  }

  .ll-tm-wall {
    column-count: 2;
    column-gap: 14px;
    max-width: 720px;
    padding-inline: 14px;
  }

  .ll-tm-card {
    margin-bottom: 14px;
    padding: clamp(12px, 3.3vw, 16px);
    border-radius: 18px;
    gap: 12px;
  }

  .ll-tm-head {
    gap: 10px;
  }

  .ll-tm-avatar {
    width: 20px;
    height: 20px;
    font-size: 7px;
  }

  .ll-tm-name {
    font-size: clamp(9px, 2.4vw, 11px);
  }

  /* Handle (@username) stays on a single line: shrink it and never wrap. */
  .ll-tm-handle {
    font-size: clamp(7px, 1.7vw, 8px);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    overflow-wrap: normal;
    word-break: normal;
    max-width: 100%;
  }

  /* Role (e.g. "Filmmaker & Photographer") may still wrap across lines. */
  .ll-tm-role {
    font-size: clamp(8px, 2vw, 9px);
  }

  .ll-tm-text {
    font-size: clamp(14px, 3.7vw, 16px);
    line-height: 1.45;
  }

  .ll-tm-date,
  .ll-tm-badge {
    font-size: 11px;
  }

  .ll-tm-cover {
    border-radius: 14px;
  }

  .ll-tm-play {
    left: 10px;
    right: auto;
    bottom: 10px;
    width: 32px;
    height: 32px;
  }

  .ll-tm-play svg {
    width: 13px;
    height: 13px;
  }

  .ll-tm-card:has(video.ll-tm-cover) {
    gap: 8px;
  }

  .ll-tm-card:has(video.ll-tm-cover) .ll-tm-video,
  .ll-tm-card:has(video.ll-tm-cover) > video.ll-tm-cover {
    order: 1;
    aspect-ratio: 9 / 13;
    width: 100%;
  }

  .ll-tm-card:has(video.ll-tm-cover) .ll-tm-video video,
  .ll-tm-card:has(video.ll-tm-cover) > video.ll-tm-cover {
    height: 100% !important;
    object-fit: cover !important;
  }

  .ll-tm-card:has(video.ll-tm-cover) .ll-tm-head,
  .ll-tm-card:has(video.ll-tm-cover) .ll-tm-foot {
    order: 0;
    margin-top: 2px;
  }

  .ll-tm-card:has(video.ll-tm-cover) > .ll-tm-text,
  .ll-tm-card:has(video.ll-tm-cover) > .ll-tm-date {
    display: none;
  }
}

.ll-tm-card {
  break-inside: avoid;
  margin-bottom: 20px;
  background: #f4f4f5;
  border: 1px solid rgba(0, 0, 0, 0.07);
  border-radius: 16px;
  padding: 13px;
  display: flex;
  flex-direction: column;
  gap: 11px;
  color: #1c1c1c;
}

html.theme-dark .ll-tm-card {
  background: #161616;
  border-color: rgba(255, 255, 255, 0.08);
  color: #ffffff;
}

/* Tighter again on phones, where a card is only ~175px across and the frame
   eats a real share of it.

   This has to sit *after* the base rule, not in the @media block further up:
   that block targets .ll-tm-card at the same specificity but comes earlier in
   the file, so the base rule wins and everything it declares is inert. */
@media (max-width: 900px) {
  .ll-tm-card {
    padding: 9px;
    gap: 9px;
  }
}

.ll-tm-head {
  display: flex;
  align-items: center;
  gap: 12px;
}

.ll-tm-avatar {
  flex-shrink: 0;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 13px;
  font-weight: 600;
  color: #ffffff;
  letter-spacing: 0.02em;
  background: linear-gradient(135deg, #3c4144, #171d21);
  overflow: hidden;
}

.ll-tm-avatar img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  display: block;
}

.ll-tm-meta {
  display: flex;
  flex-direction: column;
  line-height: 1.3;
  min-width: 0;
}

.ll-tm-name {
  font-weight: 600;
  font-size: 14px;
  color: inherit;
  overflow-wrap: anywhere;
  word-break: break-word;
}

.ll-tm-handle,
.ll-tm-role {
  font-size: 12.5px;
  opacity: 0.6;
  color: inherit;
  overflow-wrap: anywhere;
  word-break: break-word;
}

.ll-tm-text {
  font-size: 14px;
  line-height: 1.55;
  color: inherit;
  margin: 0;
}

.ll-tm-foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  flex-wrap: wrap;
}

.ll-tm-card--image .ll-tm-foot {
  order: -1;
}

.ll-tm-date {
  font-size: 11px;
  opacity: 0.5;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

.ll-tm-badge {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 11px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: #22c55e;
}

.ll-tm-badge svg {
  width: 14px;
  height: 14px;
  flex-shrink: 0;
}

.ll-tm-cover {
  width: 100%;
  height: auto;
  border-radius: 10px;
  display: block;
}

.ll-tm-video {
  position: relative;
  overflow: hidden;
  border-radius: 12px;
  background: #0b0b0b;
}

.ll-tm-video .ll-tm-cover {
  border-radius: 0;
}

.ll-tm-video .ll-tm-cover::-webkit-media-controls-start-playback-button {
  display: none !important;
  -webkit-appearance: none;
}

.ll-tm-play {
  position: absolute;
  left: 12px;
  bottom: 12px;
  width: 44px;
  height: 44px;
  border: 1px solid rgba(255, 255, 255, 0.36);
  border-radius: 999px;
  display: grid;
  place-items: center;
  color: #fff;
  background: rgba(0, 0, 0, 0.58);
  box-shadow: 0 10px 24px rgba(0, 0, 0, 0.28);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
  z-index: 2;
}

.ll-tm-play svg {
  width: 17px;
  height: 17px;
  fill: currentColor;
}

.ll-tm-play:focus-visible {
  outline: 2px solid #fff;
  outline-offset: 3px;
}

/* ===== Collection / shop grid: two columns on mobile =====
   The theme defaults collection grids to a single column below 700px.
   Force a comfortable two-up layout on phones. The variable is set
   directly on .product-list so it overrides the value inherited from
   the section wrapper, and the existing 20px column gutter / 32px row
   gap keep the cards from feeling cramped. */
@media screen and (max-width: 699px) {
  /* Scoped to the collection/shop grid only (role="region"); the same
     .product-list class is reused by horizontal card carousels (e.g. the
     "Top Picks from Other Creators" scroller), which must NOT be forced
     into a two-column grid or their cards overlap. */
  .product-list[role="region"] {
    --product-list-items-per-row: 2;
    grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
  }
}

/* ===== Summer Sale countdown ===== */
.ll-countdown {
  display: flex;
  justify-content: center;
  gap: clamp(14px, 4vw, 32px);
  margin-top: 4px;
}

/* Scoped selector beats the theme's ".prose *+div" margin so every unit
   lines up on the same top edge instead of the trailing ones dropping down. */
.ll-countdown .ll-cd-unit {
  display: flex;
  flex-direction: column;
  align-items: center;
  min-width: clamp(48px, 12vw, 72px);
  margin: 0;
}

.ll-cd-num {
  font-weight: 700;
  font-size: clamp(30px, 7vw, 52px);
  line-height: 1;
  font-variant-numeric: tabular-nums;
  color: #ff4747;
  text-shadow:
    0 0 8px rgba(242, 71, 71, 0.75),
    0 0 20px rgba(242, 71, 71, 0.55),
    0 0 38px rgba(242, 71, 71, 0.35);
}

.ll-cd-label {
  margin-top: 8px;
  font-size: clamp(11px, 2.6vw, 13px);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  opacity: 0.65;
}

.ll-sale-note {
  margin-top: clamp(16px, 3vw, 24px);
  text-align: center;
  font-size: clamp(13px, 2.6vw, 16px);
  line-height: 1.5;
  opacity: 0.85;
}

.ll-sale-note strong {
  font-weight: 700;
  opacity: 1;
  color: #ff4747;
  text-shadow:
    0 0 8px rgba(242, 71, 71, 0.75),
    0 0 18px rgba(242, 71, 71, 0.5);
}

/* Make the top announcement ticker (text + inline countdown) a touch larger. */
.announcement-bar__item p,
.announcement-bar__item .ll-mq-cd,
.announcement-bar__item a {
  font-size: clamp(13px, 1.5vw, 16px);
}

/* Center the strike-through on "was" (compare-at) prices. The font's native
   line-through sits high; draw our own line through the vertical middle. */
compare-at-price.line-through {
  text-decoration: none;
  background-image: linear-gradient(currentColor, currentColor);
  background-repeat: no-repeat;
  background-size: 100% 0.08em;
  background-position: 0 52%;
}

/* Product card hover: just a subtle image zoom, nothing else. */
.product-card__figure {
  overflow: hidden;
}

.product-card__figure :is(img, video) {
  transition: transform 0.5s ease;
}

.product-card:hover .product-card__figure :is(img, video) {
  transform: scale(1.03);
}

@media (prefers-reduced-motion: reduce) {
  .product-card__figure :is(img, video) {
    transition: none;
  }
  .product-card:hover .product-card__figure :is(img, video) {
    transform: none;
  }
}

/* Subtle animation on the homepage "View Bundle" and hero "Explore
   Collections" buttons: a gentle scale-up and soft glow on hover/focus. */
.master-bundle-feature .button,
.slideshow .button {
  transition: transform 0.25s ease, box-shadow 0.25s ease;
}

.master-bundle-feature .button:hover,
.master-bundle-feature .button:focus-visible,
.slideshow .button:hover,
.slideshow .button:focus-visible {
  transform: scale(1.03);
  box-shadow: 0 10px 30px rgba(255, 255, 255, 0.14);
}

.master-bundle-feature .button:active,
.slideshow .button:active {
  transform: scale(0.99);
}

@media (prefers-reduced-motion: reduce) {
  .master-bundle-feature .button,
  .slideshow .button {
    transition: none;
  }
  .master-bundle-feature .button:hover,
  .master-bundle-feature .button:focus-visible,
  .master-bundle-feature .button:active,
  .slideshow .button:hover,
  .slideshow .button:focus-visible,
  .slideshow .button:active {
    transform: none;
  }
}

/* "Summer Sale" badge inside the Master Bundle card (home + shop pages):
   subtle constant red glow matching the badge's --on-sale-badge-background. */
.master-bundle-feature__badges .badge--on-sale {
  box-shadow: 0 0 12px 2px rgb(242 71 71 / 0.55);
}

/* "Save £X" badge on product pages sits on a red pill in both modes, so its
   text stays white. Overrides the forced light-mode #000 text-fill above. */
html:not(.theme-dark) .product-info .badge--on-sale,
html.theme-dark .product-info .badge--on-sale {
  color: #fff !important;
  -webkit-text-fill-color: #fff !important;
}

/* Product page price emphasis: mute the struck-through "was" price and give
   the current price a subtle glow. Opacity greys the compare-at regardless of
   the theme's forced white/black colour. */
.product-info__price compare-at-price {
  opacity: 0.5;
}

html.theme-dark .product-info__price sale-price {
  text-shadow: 0 0 16px rgba(255, 255, 255, 0.3);
}

html:not(.theme-dark) .product-info__price sale-price {
  text-shadow: 0 0 14px rgba(0, 0, 0, 0.18);
}

/* Order/rating proof row on shop-grid product cards (collections/all-products
   only - this markup isn't present on other pages' product-card instances).
   Sits below the price, muted grey via --text-color opacity so it reads as
   secondary trust info rather than competing with the title/price. Star
   fill uses the same dim-background/bright-foreground overlay technique as
   the product-page proof row, scaled down for card density. */
.ll-card-proof {
  display: flex;
  align-items: center;
  gap: 0.35rem;
  margin-block: 0.3rem 0;
  line-height: 1;
}

.ll-card-proof__stars {
  position: relative;
  display: inline-block;
  font-size: 11px;
  letter-spacing: 0.05em;
}

.ll-card-proof__stars-bg {
  display: block;
  white-space: nowrap;
  color: rgba(247, 178, 59, 0.3);
}

.ll-card-proof__stars-fg {
  position: absolute;
  top: 0;
  left: 0;
  overflow: hidden;
  white-space: nowrap;
  color: #f7b23b;
}

.ll-card-proof__orders {
  font-size: 11px;
  font-weight: 500;
}

/* .text-subdued is forced to solid white in dark mode (see the global rule
   above, needed for other subdued text to survive on a dark background),
   which reads as bright white here instead of grey. Dial it back down like
   compare-at-price does. */
html.theme-dark .ll-card-proof__orders {
  opacity: 0.6;
}

.ll-card-proof__new {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.02em;
  color: #f7b23b;
}

/* ===== Social-proof purchase toast (bottom-left) ===== */
.ll-sale-toast {
  position: fixed;
  left: 20px;
  bottom: 80px;
  z-index: 9000;
  display: flex;
  align-items: center;
  gap: 14px;
  max-width: min(370px, calc(100vw - 40px));
  padding: 12px 18px 12px 12px;
  border-radius: 16px;
  background: #ffffff;
  color: #1c1c1c;
  border: 1px solid rgba(0, 0, 0, 0.08);
  box-shadow: none;
  text-decoration: none;
  opacity: 0;
  transform: translateY(14px);
  transition: opacity 0.55s ease, transform 0.55s ease;
  pointer-events: none;
}

.ll-sale-toast.is-in {
  opacity: 1;
  transform: none;
  pointer-events: auto;
}

html.theme-dark .ll-sale-toast {
  background: #1c1c1c;
  color: #ffffff;
  border-color: rgba(255, 255, 255, 0.12);
  box-shadow: none;
}

.ll-sale-toast__img {
  width: 52px;
  height: 52px;
  border-radius: 10px;
  object-fit: cover;
  flex-shrink: 0;
}

.ll-sale-toast__text {
  font-size: 13.5px;
  line-height: 1.4;
}

.ll-sale-toast__text strong {
  font-weight: 600;
}

/* Flag sits inline after the buyer's name, in place of the country name. The
   sprite is 20px square; nudge it down so it centres on the text, not the
   baseline. */
.ll-sale-toast__text .country-flags {
  display: inline-block;
  margin: 0 2px 0 6px;
  vertical-align: -5px;
}

/* Keep mobile toasts low unless a product sticky buy bar is present. */
@media (max-width: 699px) {
  .ll-sale-toast {
    left: 16px;
    bottom: calc(16px + env(safe-area-inset-bottom, 0px));
    max-width: min(360px, calc(100vw - 32px));
  }

  .ll-sale-toast--above-buy {
    bottom: calc(104px + env(safe-area-inset-bottom, 0px));
  }
}

@media (prefers-reduced-motion: reduce) {
  .ll-sale-toast {
    transform: none;
    transition: opacity 0.4s ease;
  }
}

/* ===== Collection filter control (mobile) =====
   The theme hides .collection__top-bar below 1000px and offers filters through
   a fixed pill that floats over the products as you scroll. This replaces that
   pill with a static control sitting directly above the grid; it opens the same
   drawer via aria-controls. */
.ll-mobile-filter {
  display: flex;
  justify-content: flex-start;
  margin-bottom: var(--spacing-4, 16px);
}

.ll-mobile-filter button {
  gap: 8px;
  font-size: 14px;
}

@media screen and (max-width: 699px) {
  .ll-mobile-filter {
    margin-bottom: 6px;
  }

  .ll-mobile-filter + .collection__results > .v-stack {
    gap: 10px;
  }
}

/* ===== Product search results (header drawer + /search page) ===== */
.ll-search-results {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.ll-search-result {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 10px;
  border-radius: 12px;
  text-decoration: none;
  color: inherit;
  transition: background-color 0.18s ease;
}

.ll-search-result:hover,
.ll-search-result:focus-visible {
  background: rgb(128 128 128 / 0.12);
}

.ll-search-result__img {
  width: 56px;
  height: 56px;
  border-radius: 8px;
  object-fit: cover;
  flex-shrink: 0;
}

.ll-search-result__body {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
}

.ll-search-result__title {
  font-weight: 600;
}

.ll-search-result__price {
  font-size: 14px;
}

.ll-search-result__price s {
  opacity: 0.5;
  margin-inline-start: 4px;
}

.ll-search-count,
.ll-search-empty {
  margin: 0 0 12px;
  opacity: 0.7;
}

/* On the results page the list is the main content, so give it room. */
.ll-search-results--page {
  margin-top: 32px;
  text-align: start;
}

/* ===== LutLocker preloader ===== */
html.ll-loading {
  overflow: hidden;
}

/* Anti-flash backdrop that matches the theme before the overlay paints. */
html.ll-loading::before {
  content: "";
  position: fixed;
  inset: 0;
  background: #f2f2f2;
  z-index: 2147483646;
}

html.theme-dark.ll-loading::before {
  background: #101010;
}

.ll-preloader {
  position: fixed;
  inset: 0;
  z-index: 2147483647;
  display: flex;
  align-items: center;
  justify-content: center;
  background: #f2f2f2;
  color: #1c1c1c;
  opacity: 1;
  visibility: visible;
  transition: opacity 0.75s ease, visibility 0s linear 0.75s;
}

html.theme-dark .ll-preloader {
  background: #101010;
  color: #ffffff;
}

.ll-preloader.is-done {
  opacity: 0;
  visibility: hidden;
}

.ll-preloader__inner {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 20px;
  animation: ll-pre-rise 0.6s ease both;
}

.ll-preloader__logo {
  display: block;
  width: min(160px, 46vw);
}

.ll-preloader__logo-image {
  display: block;
  width: 100%;
  height: auto;
}

.ll-preloader__bar {
  position: relative;
  width: 150px;
  height: 2px;
  border-radius: 2px;
  background: rgba(0, 0, 0, 0.12);
  overflow: hidden;
}

html.theme-dark .ll-preloader__bar {
  background: rgba(255, 255, 255, 0.16);
}

.ll-preloader__bar i {
  position: absolute;
  top: 0;
  left: 0;
  width: 40%;
  height: 100%;
  border-radius: 2px;
  background: currentColor;
  animation: ll-pre-slide 1.35s cubic-bezier(0.4, 0, 0.2, 1) infinite;
}

@keyframes ll-pre-slide {
  0% { transform: translateX(-120%); }
  100% { transform: translateX(370%); }
}

@keyframes ll-pre-rise {
  from { opacity: 0; transform: translateY(8px); }
  to { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
  .ll-preloader__inner { animation: none; }
  .ll-preloader__bar i { animation-duration: 2s; }
}

html body .product-info__buy-buttons buy-buttons button[type="submit"].button,
html body .product-quick-add buy-buttons button[type="submit"].button,
html body .quick-buy-drawer buy-buttons button[type="submit"].button {
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
  text-align: center !important;
}

html body .product-info__buy-buttons buy-buttons button[type="submit"].button > .text-with-icon.justify-center,
html body .product-quick-add buy-buttons button[type="submit"].button > .text-with-icon.justify-center,
html body .quick-buy-drawer buy-buttons button[type="submit"].button > .text-with-icon.justify-center {
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
  width: 100% !important;
  min-width: 100% !important;
  max-width: 100% !important;
  margin: 0 !important;
  padding: 0 !important;
  gap: 0 !important;
  text-align: center !important;
}

html body .product-info__buy-buttons buy-buttons button[type="submit"].button > div,
html body .product-quick-add buy-buttons button[type="submit"].button > div,
html body .quick-buy-drawer buy-buttons button[type="submit"].button > div {
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
  width: 100% !important;
  min-width: 100% !important;
  max-width: 100% !important;
  margin: 0 !important;
  padding: 0 !important;
  text-align: center !important;
}

html body .product-info__buy-buttons buy-buttons button[type="submit"].button > div > .text-with-icon.justify-center,
html body .product-quick-add buy-buttons button[type="submit"].button > div > .text-with-icon.justify-center,
html body .quick-buy-drawer buy-buttons button[type="submit"].button > div > .text-with-icon.justify-center {
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
  width: 100% !important;
  min-width: 100% !important;
  max-width: 100% !important;
  margin: 0 !important;
  padding: 0 !important;
  gap: 0 !important;
  text-align: center !important;
}

html body .product-info__buy-buttons buy-buttons button[type="submit"].button > .button__loader,
html body .product-quick-add buy-buttons button[type="submit"].button > .button__loader,
html body .quick-buy-drawer buy-buttons button[type="submit"].button > .button__loader {
  position: absolute !important;
  top: 50% !important;
  left: 50% !important;
  margin: 0 !important;
  transform: translate(-50%, -50%) !important;
}

/* "Trusted by Industry Experts" logo list (footer group, every page). Six logos
   now, not seven, so the grid loses a column, otherwise the row sits off-centre
   with an empty slot. */
[id*="__logo_list"] {
  /* !important: the section's own <style> sets this on a #shopify-section-… ID
     selector, which outranks an attribute selector. */
  --logo-list-items-per-row: 2 !important;
}

@media screen and (min-width: 700px) {
  [id*="__logo_list"] {
    --logo-list-items-per-row: 3 !important;
  }
}

@media screen and (min-width: 1000px) {
  [id*="__logo_list"] {
    --logo-list-items-per-row: 6 !important;
  }
}

/* The columns are content-sized, so the row no longer spans the container now
   that a card has gone; without this it hangs to the left with the old seventh
   slot left open. Not below 700px, where the list is a horizontal scroll area. */
@media screen and (min-width: 700px) {
  [id*="__logo_list"] .logo-list {
    justify-content: center;
  }
}

/* The theme fits these by width (max-width: 120px), which works for the compact
   badges it shipped with but not for wordmarks: fitting a 7.8:1 mark and a 3.4:1
   mark to the same width leaves their lettering more than twice apart. These
   assets carry the mark at a fixed share of the canvas *height*, so pin the
   height and let width follow, exactly as the scrolling ticker does. That is
   what holds every logo at the same optical size.

   The cards behind them are dark in light mode as well as dark, so these stay
   white in both; brightness(0) first so any source colour lands on white. */
[id*="__logo_list"] .logo-list__image {
  width: auto !important;
  max-width: 100% !important;
  height: 36px;
  filter: brightness(0) invert(1);
}

@media screen and (max-width: 999px) {
  [id*="__logo_list"] .logo-list__image {
    height: 30px;
  }
}

/* "Join Our Community" banner on the home page, between the contact section
   and the footer. Photo background with a dark scrim, so the text stays white
   in both light and dark themes. */
/* section.ll-community outranks the theme's .shopify-section background,
   which loads later in the head and would tie on class specificity alone. */
section.ll-community {
  position: relative;
  background: url("/cdn/shop/files/lutlocker/community-banner.jpg") center 55% / cover no-repeat #101418 !important;
}

.ll-community__inner {
  display: flex;
  justify-content: center;
  text-align: center;
  /* 56px up to 1440px-wide viewports, then grows with the viewport so the
     banner doesn't look like a sliver on extra-large monitors (caps 140px). */
  padding: clamp(56px, calc(56px + (100vw - 1440px) * 0.12), 140px) 24px;
  background: linear-gradient(rgb(8 10 14 / 0.55), rgb(8 10 14 / 0.68));
}

.ll-community__content {
  max-width: 620px;
  color: #fff;
}

.ll-community__content .subheading {
  color: rgb(255 255 255 / 0.75);
  margin-bottom: 10px;
}

.ll-community__content .h2 {
  color: #fff;
  margin-bottom: 14px;
}

.ll-community__content p:not(.subheading) {
  color: rgb(255 255 255 / 0.88);
  font-size: 15px;
  line-height: 1.7;
  margin-bottom: 24px;
}

.ll-community .ll-community__cta {
  --button-background: 255 255 255 / var(--button-background-opacity, 1);
  --button-outline-color: 255 255 255;
  --button-text-color: 0 0 0;
  background: #fff !important;
  color: #000 !important;
  display: inline-flex !important;
  align-items: center;
  gap: 9px;
}

/* Desktop only: match the Master Bundle card's "View Bundle" button
   animation — gentle scale-up + soft white glow on hover, scale-down on
   press. Mirrors the .master-bundle-feature .button rules above. */
@media screen and (min-width: 700px) {
  .ll-community .ll-community__cta {
    transition: transform 0.25s ease, box-shadow 0.25s ease;
  }

  .ll-community .ll-community__cta:hover,
  .ll-community .ll-community__cta:focus-visible {
    transform: scale(1.03);
    box-shadow: 0 10px 30px rgba(255, 255, 255, 0.14);
  }

  .ll-community .ll-community__cta:active {
    transform: scale(0.99);
  }
}

@media screen and (min-width: 700px) and (prefers-reduced-motion: reduce) {
  .ll-community .ll-community__cta {
    transition: none;
  }
  .ll-community .ll-community__cta:hover,
  .ll-community .ll-community__cta:focus-visible,
  .ll-community .ll-community__cta:active {
    transform: none;
  }
}

@media screen and (max-width: 699px) {
  .ll-community__inner {
    padding: 44px 20px;
  }

  /* Narrow screens crop the sides; bias left so the arm stays in frame. */
  section.ll-community {
    background-position: 18% 55% !important;
  }
}

/* Video corner radius on the product pages.
   The theme's .rounded resolves to var(--rounded), which the shop sets to 0,
   so the multi-column card videos render square. The Master Bundle overrides
   this to 8px in its own section's inline style, scoped to that section id;
   match it here for the ten product pages, which share one template id. */
#shopify-section-template--29508992631048__multi_column_Eq46Hz video {
  border-radius: 8px;
  overflow: hidden;
}
