/*
 * Titan Virtual Showroom — [titan_virtual_showroom].
 *
 * Everything is scoped under .tvs so the Thrive theme's rules cannot reach in
 * and these cannot leak out. The fonts are the ones the theme already loads on
 * every page (Josefin Sans, Cardo, Poppins), so nothing new is fetched.
 */

.tvs{
  --tvs-teal: #598383;
  --tvs-teal-light: #83b1b1;
  --tvs-teal-tint: #eef4f4;
  --tvs-deep: #204147;
  --tvs-slate: #1b2d33;
  --tvs-ink: #2b3a3f;
  --tvs-ink-2: #55666b;
  --tvs-rule: #dfe7e7;
  --tvs-page: #ffffff;
  --tvs-wash: #f6f8f8;
  /* Smoke: the header laid over the hero, and the estimate buttons to match. */
  --tvs-smoke: rgba(46, 53, 57, 0.46);
  --tvs-smoke-solid: #3e464a;
  --tvs-smoke-deep: #2c3336;

  --tvs-display: 'Josefin Sans', 'Outfit', system-ui, sans-serif;
  --tvs-serif: 'Cardo', 'Cormorant Garamond', Georgia, serif;
  --tvs-body: 'Poppins', system-ui, -apple-system, 'Segoe UI', sans-serif;

  color-scheme: light;
  background: var(--tvs-page);
  color: var(--tvs-ink);
  font-family: var(--tvs-body);
  font-size: 16px;
  line-height: 1.65;
  -webkit-font-smoothing: antialiased;
}
.tvs *,
.tvs *::before,
.tvs *::after{
  box-sizing: border-box;
}
.tvs img{
  max-width: 100%;
  display: block;
}
.tvs button{
  font: inherit;
  color: inherit;
}
.tvs .tvs-wrap{
  max-width: 1240px;
  margin: 0 auto;
  padding: 0 32px;
}

/* ---------- Edge to edge ----------
 * Thrive wraps page content in 20px of padding (10px on a phone) and the
 * shortcode in a 20px margin, which framed the hero in white and left a gap under the header.
 * Only the containers that hold the showroom are touched.
 */
.section-content:has(> .tcb-post-content .tvs),
.main-container:has(.tvs) {
  /* The second is the phone layout's 10px frame. */
  padding: 0 !important;
}
.thrv_custom_html_shortcode:has(> .tvs) {
  margin: 0 !important;
  padding: 0 !important;
}

/* ---------- The page around the showroom ----------
 * Only on pages carrying the showroom (body:has(.tvs)), never elsewhere.
 *
 * The site header turns to smoke and sits over the hero photo instead of
 * above it. The page ends with "Found the one?": Thrive's bottom band and the
 * site footer are not shown here.
 */
body:has(.tvs) #thrive-header {
  position: absolute !important;
  top: 0;
  left: 0;
  right: 0;
  z-index: 60;
}
body.admin-bar:has(.tvs) #thrive-header {
  top: 32px;
}
body:has(.tvs) #thrive-header .symbol-section-out {
  background-color: rgba(46, 53, 57, 0.46) !important;
  background-image: none !important;
  -webkit-backdrop-filter: blur(10px) saturate(1.1);
  backdrop-filter: blur(10px) saturate(1.1);
  border-bottom: 1px solid rgba(255, 255, 255, 0.12);
}
/* The logo keeps visitors on the showroom: it goes back to the top, not to the site. */
body:has(.tvs) #thrive-header .tcb-logo {
  cursor: pointer !important;
}
/* The Lowe's showroom has no menu into the Titan site: just the logo, centred.
   (On phones and tablets the menu is hidden on both showrooms already.) */
body:has(.tvs--lowes) #thrive-header .tve_w_menu > li.menu-item {
  display: none !important;
}
body:has(.tvs--lowes) #thrive-header .tve_w_menu {
  justify-content: center !important;
}
body:has(.tvs) footer.thrv_footer,
body:has(.tvs) .theme-section.bottom-section {
  display: none !important;
}

/* ---------- Hero ---------- */

.tvs .tvs-hero{
  position: relative;
  min-height: min(78vh, 720px);
  display: grid;
  align-items: end;
  color: #fff;
  overflow: hidden;
  background: var(--tvs-slate);
}
.tvs .tvs-hero__img{
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.tvs .tvs-hero::after{
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(27, 45, 51, 0.25) 0%, rgba(27, 45, 51, 0.55) 40%, rgba(27, 45, 51, 0.92) 100%);
}
.tvs .tvs-hero__body{
  position: relative;
  z-index: 1;
  text-align: center;
  /* 145px of header now sits on top of the hero. */
  padding-top: 230px;
  padding-bottom: 56px;
}
.tvs .tvs-hero__title{
  margin: 0;
  /* The homepage hero's heading, matched: Josefin Sans bold, capitals, set tight. */
  font-family: var(--tvs-display);
  font-style: normal;
  font-weight: 700;
  font-size: clamp(40px, 5.6vw, 81px);
  line-height: 1.02;
  letter-spacing: -0.05em;
  text-transform: uppercase;
  color: #fff;
  max-width: 13em;
  margin-left: auto;
  margin-right: auto;
}
.tvs .tvs-hero__intro{
  /* The homepage hero's subline, matched: Cardo in spaced capitals, pale aqua.
     Spaced a little less than its one-liner, since this runs to three lines. */
  margin: 26px auto 0;
  /* In px, not ch: the letter spacing makes every character wider than a ch. */
  max-width: 900px;
  font-family: var(--tvs-serif);
  font-size: 17px;
  font-weight: 400;
  line-height: 1.9;
  letter-spacing: 0.3em;
  text-transform: uppercase;
  color: rgb(230, 255, 255);
  text-shadow: 0 1px 10px rgba(0, 0, 0, 0.45);
}

/* The three doors in — the reason to be on the page. */
.tvs .tvs-jump{
  margin: 36px auto 0;
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 14px;
  max-width: 860px;
}
.tvs .tvs-jump a{
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 18px 22px;
  background: rgba(255, 255, 255, 0.1);
  border: 1px solid rgba(255, 255, 255, 0.28);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  color: #fff;
  text-decoration: none;
  transition: background 0.2s, border-color 0.2s;
}
.tvs .tvs-jump a:hover,
.tvs .tvs-jump a:focus-visible{
  background: #fff;
  border-color: #fff;
  color: var(--tvs-deep);
  outline: none;
}
.tvs .tvs-jump__label{
  font-family: var(--tvs-display);
  font-size: 17px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  line-height: 1.2;
  padding-top: 3px;
}
.tvs .tvs-jump__count{
  display: block;
  font-family: var(--tvs-body);
  font-size: 13px;
  letter-spacing: 0.02em;
  text-transform: none;
  opacity: 0.75;
  margin-top: 2px;
}
.tvs .tvs-jump svg{
  flex: none;
  transition: transform 0.2s;
}
.tvs .tvs-jump a:hover svg{
  transform: translateY(3px);
}

/* ---------- Promotion banner ----------
 * Just under the header, over the hero photo, in the teal the site's nav bar
 * wore before it became smoke (#598383), solid. Matt's pick after trying a
 * see-through teal (washed out), a saturated one (too bold) and gold.
 * With no sale running it carries the tagline instead.
 */
.tvs .tvs-promo{
  position: absolute;
  left: 0;
  right: 0;
  z-index: 5;
  background: rgb(89, 131, 131);
  border-top: 1px solid rgba(255, 255, 255, 0.18);
  border-bottom: 1px solid rgba(0, 0, 0, 0.18);
  color: #fff;
  opacity: 0;
  transform: translateY(-8px);
  transition: opacity 0.3s ease, transform 0.3s ease;
}
.tvs .tvs-promo.is-in{
  opacity: 1;
  transform: none;
}
/* Pinned once it would scroll away: just under the section bar, above the page. */
.tvs .tvs-promo.is-stuck{
  position: fixed;
  z-index: 39;
  box-shadow: 0 4px 14px rgba(0, 0, 0, 0.14);
}
.tvs .tvs-promo__inner{
  max-width: 1100px;
  margin: 0 auto;
  padding: 11px 56px;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: 8px 14px;
  text-align: center;
  font-size: 15px;
  line-height: 1.4;
}
.tvs .tvs-promo__pill{
  flex: none;
  padding: 3px 11px 2px;
  border: 1.5px solid rgba(255, 255, 255, 0.9);
  color: #fff;
  font-family: var(--tvs-display);
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0.16em;
  text-transform: uppercase;
}
.tvs .tvs-promo__msg{
  font-weight: 500;
}
/* No sale: the tagline, in the spaced capitals of the homepage hero's line. */
.tvs .tvs-promo--tagline .tvs-promo__inner{
  padding-top: 12px;
  padding-bottom: 12px;
}
.tvs .tvs-promo--tagline .tvs-promo__msg{
  font-family: var(--tvs-display);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.26em;
  text-transform: uppercase;
}
/* Before the script places it: the header is 145px tall at every width it runs. */
.tvs .tvs-promo--tagline{
  top: 145px;
}
.tvs .tvs-promo__x{
  position: absolute;
  right: 10px;
  top: 50%;
  width: 36px;
  height: 36px;
  margin-top: -18px;
  display: grid;
  place-items: center;
  border: none;
  border-radius: 50%;
  background: transparent;
  color: #fff;
  cursor: pointer;
  opacity: 0.85;
}
.tvs .tvs-promo__x:hover,
.tvs .tvs-promo__x:focus-visible{
  opacity: 1;
  background: rgba(255, 255, 255, 0.16);
  outline: none;
}
@media (max-width: 640px){
  .tvs .tvs-promo__inner{
    padding: 9px 46px 9px 16px;
    font-size: 13.5px;
    gap: 6px 10px;
  }
  /* The tagline on one line, down to a 360px phone: it has no close button,
     so it gets the full width, and tighter type (needs 335px of 336). */
  .tvs .tvs-promo--tagline .tvs-promo__inner{
    padding: 11px 12px;
  }
  .tvs .tvs-promo--tagline .tvs-promo__msg{
    font-size: 11px;
    letter-spacing: 0.12em;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 100%;
  }
}

/* ---------- Sticky section bar ---------- */

.tvs .tvs-bar{
  position: sticky;
  top: 0;
  z-index: 40;
  /* The header's smoke. Denser than over the hero: this bar crosses white
     page, and white links on a thin grey wash would not read. */
  background: rgba(46, 53, 57, 0.82);
  -webkit-backdrop-filter: blur(10px) saturate(1.1);
  backdrop-filter: blur(10px) saturate(1.1);
  border-bottom: 1px solid rgba(255, 255, 255, 0.12);
}
/*
 * Out of the way until it is useful.
 *
 * The hero already has the three buttons, so a second row of the same links
 * under it is noise. Once the hero has scrolled off, the bar slides down and
 * stays pinned. Only with the script running — without it the bar is simply
 * sticky, which still works.
 */
.tvs.tvs--js .tvs-bar{
  position: fixed;
  left: 0;
  right: 0;
  transform: translateY(-100%);
  visibility: hidden;
  transition: transform 0.3s ease, visibility 0s linear 0.3s;
  box-shadow: 0 4px 18px rgba(0, 0, 0, 0.18);
}
.tvs.tvs--js .tvs-bar.is-shown{
  transform: none;
  visibility: visible;
  transition: transform 0.3s ease;
}
/* Clear the WordPress toolbar for logged-in editors. */
.admin-bar .tvs.tvs--js .tvs-bar{
  top: 32px;
}
@media (max-width: 782px){
  .admin-bar .tvs.tvs--js .tvs-bar{
    top: 46px;
  }
}
.tvs .tvs-bar__inner{
  display: flex;
  justify-content: center;
  gap: 8px;
}
.tvs .tvs-bar a{
  position: relative;
  padding: 17px 22px 15px;
  font-family: var(--tvs-display);
  font-size: 14px;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.62);
  text-decoration: none;
  transition: color 0.2s;
}
.tvs .tvs-bar a:hover,
.tvs .tvs-bar a:focus-visible{
  color: #fff;
  outline: none;
}
.tvs .tvs-bar a[aria-current='true']{
  color: #fff;
}
.tvs .tvs-bar a[aria-current='true']::after{
  content: '';
  position: absolute;
  left: 22px;
  right: 22px;
  bottom: 0;
  height: 2px;
  background: var(--tvs-teal-light);
}

/* ---------- Sections ---------- */

.tvs .tvs-section{
  padding: 96px 0 40px;
  scroll-margin-top: 50px;
}
.tvs .tvs-section + .tvs-section{
  border-top: 1px solid var(--tvs-rule);
}
.tvs .tvs-section__head{
  display: grid;
  grid-template-columns: minmax(0, 5fr) minmax(0, 6fr);
  gap: 48px;
  align-items: end;
  margin-bottom: 64px;
}
.tvs .tvs-section__title{
  margin: 0;
  font-family: var(--tvs-display);
  font-weight: 400;
  font-size: clamp(34px, 4.4vw, 58px);
  line-height: 1.05;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--tvs-deep);
}
.tvs .tvs-section__intro{
  margin: 0;
  font-size: 18px;
  color: var(--tvs-ink-2);
  max-width: 58ch;
}

/* ---------- One series ---------- */

.tvs .tvs-series{
  display: grid;
  grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
  gap: 56px;
  align-items: start;
  padding: 0 0 88px;
  scroll-margin-top: 70px;
}
.tvs .tvs-series + .tvs-series{
  padding-top: 88px;
  border-top: 1px solid var(--tvs-rule);
}
/* Alternate sides on a wide screen so a long page has a rhythm to it. */
.tvs .tvs-series:nth-of-type(even) .tvs-media{
  order: 2;
}

/* Media */

.tvs .tvs-stage{
  position: relative;
  /* Square: HMI's renders are portrait, its installed shots landscape, and a
     square frame holds either without cropping the door. */
  aspect-ratio: 1 / 1;
  max-height: 82vh;
  width: 100%;
  box-sizing: border-box !important;
  background: #fff;
  border: 1px solid var(--tvs-rule);
  overflow: hidden;
  cursor: zoom-in;
  touch-action: pan-y;
}
.tvs .tvs-slide{
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: contain;
  background: #fff;
  /* Waiting off to the right; the script slides each one in and pushes the
     last one out. A strong ease so the move reads as a deliberate push. */
  transform: translateX(100%);
  transition: transform 0.9s cubic-bezier(0.7, 0, 0.2, 1);
  will-change: transform;
}
.tvs .tvs-slide.is-on{
  transform: none;
  z-index: 1;
}
.tvs .tvs-stage__btn{
  position: absolute;
  top: 50%;
  z-index: 2;
  width: 46px;
  height: 46px;
  margin-top: -23px;
  display: grid;
  place-items: center;
  border: none;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.92);
  color: var(--tvs-deep);
  box-shadow: 0 2px 10px rgba(27, 45, 51, 0.16);
  cursor: pointer;
  opacity: 0;
  transition: opacity 0.2s, transform 0.2s;
}
.tvs .tvs-stage__btn--prev{
  left: 16px;
}
.tvs .tvs-stage__btn--next{
  right: 16px;
}
.tvs .tvs-stage:hover .tvs-stage__btn,
.tvs .tvs-stage__btn:focus-visible{
  opacity: 1;
}
.tvs .tvs-stage__btn:focus-visible{
  outline: 2px solid var(--tvs-teal);
  outline-offset: 2px;
}
.tvs .tvs-stage__zoom{
  position: absolute;
  right: 14px;
  bottom: 14px;
  z-index: 2;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 7px 12px;
  border: none;
  background: rgba(27, 45, 51, 0.72);
  color: #fff;
  font-size: 13px;
  letter-spacing: 0.04em;
  cursor: pointer;
}
.tvs .tvs-stage__zoom:focus-visible{
  outline: 2px solid #fff;
  outline-offset: 2px;
}
.tvs .tvs-slides{
  position: absolute;
  inset: 0;
}
/* Which layout this is — the one thing a render cannot say for itself, so it is
   said plainly: the name in bold, the position beside it, quieter. */
.tvs .tvs-caption{
  margin: 12px 0 0;
  min-height: 1.6em;
  display: flex;
  align-items: baseline;
  gap: 10px;
  /* One line, always: a caption that wrapped as the gallery turned moved
     everything below it, and threw off the jump links mid-scroll. */
  white-space: nowrap;
  overflow: hidden;
}
.tvs .tvs-caption__name{
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  font-family: var(--tvs-display);
  font-size: 17px;
  font-weight: 700;
  letter-spacing: 0.04em;
  color: var(--tvs-deep);
}
.tvs .tvs-caption__count{
  flex: none;
  font-size: 13px;
  font-weight: 500;
  letter-spacing: 0.06em;
  color: var(--tvs-ink-2);
  font-variant-numeric: tabular-nums;
}

.tvs .tvs-thumbs{
  display: flex;
  gap: 10px;
  margin-top: 12px;
  overflow-x: auto;
  scrollbar-width: thin;
  padding-bottom: 4px;
  scroll-snap-type: x proximity;
}
.tvs .tvs-thumb{
  flex: 0 0 76px;
  height: 88px;
  padding: 0;
  border: 2px solid transparent;
  background: var(--tvs-wash);
  cursor: pointer;
  opacity: 0.62;
  transition: opacity 0.2s, border-color 0.2s;
  scroll-snap-align: start;
}
.tvs .tvs-thumb img{
  width: 100%;
  height: 100%;
  object-fit: contain;
  background: #fff;
}
.tvs .tvs-thumb:hover{
  opacity: 1;
}
.tvs .tvs-thumb[aria-current='true']{
  opacity: 1;
  border-color: var(--tvs-teal);
}
.tvs .tvs-thumb:focus-visible{
  outline: 2px solid var(--tvs-teal);
  outline-offset: 2px;
}

/* Info */

.tvs .tvs-info{
  padding-top: 6px;
}
.tvs .tvs-kicker{
  margin: 0 0 10px;
  font-family: var(--tvs-display);
  font-size: 13px;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: var(--tvs-teal);
}
.tvs .tvs-name{
  margin: 0 0 18px;
  font-family: var(--tvs-serif);
  font-weight: 400;
  font-size: clamp(38px, 4vw, 56px);
  line-height: 1;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--tvs-deep);
}
.tvs .tvs-desc{
  margin: 0 0 22px;
  font-size: 16.5px;
  color: var(--tvs-ink-2);
}
.tvs .tvs-facts{
  list-style: none;
  /* The theme indents every list and spaces its items out; this one is ours. */
  margin: 0 0 28px !important;
  padding: 0 !important;
  display: grid;
  gap: 8px;
}
.tvs .tvs-facts li{
  position: relative;
  margin: 0 !important;
  padding: 0 0 0 22px !important;
  line-height: 1.55;
  font-size: 15px;
  color: var(--tvs-ink);
}
.tvs .tvs-facts li::before{
  content: '';
  position: absolute;
  left: 2px;
  top: 0.72em;
  width: 9px;
  height: 1.5px;
  background: var(--tvs-teal);
}

.tvs .tvs-opt{
  margin: 0 0 22px;
  padding-top: 20px;
  border-top: 1px solid var(--tvs-rule);
}
.tvs .tvs-opt__label{
  margin: 0 0 12px;
  font-size: 13px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--tvs-ink-2);
}
.tvs .tvs-opt__label strong{
  margin-left: 6px;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: none;
  font-size: 15px;
  color: var(--tvs-deep);
}

/* A nudge above the swatches, where a door has a lot to show in each finish. */
.tvs .tvs-opt__hint{
  margin: -4px 0 12px;
  font-size: 14.5px;
  color: var(--tvs-teal);
  font-weight: 500;
}
.tvs .tvs-swatches{
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
}
.tvs .tvs-swatch{
  position: relative;
  width: 44px;
  height: 44px;
  padding: 0;
  border-radius: 50%;
  border: 1px solid rgba(0, 0, 0, 0.16);
  cursor: pointer;
  box-shadow: inset 0 2px 5px rgba(255, 255, 255, 0.45), inset 0 -3px 6px rgba(0, 0, 0, 0.14);
  transition: transform 0.15s;
}
.tvs .tvs-swatch:hover{
  transform: scale(1.06);
}
.tvs .tvs-swatch::after{
  content: '';
  position: absolute;
  inset: -6px;
  border-radius: 50%;
  border: 2px solid transparent;
  transition: border-color 0.15s;
}
.tvs .tvs-swatch[aria-pressed='true']::after{
  border-color: var(--tvs-deep);
}
.tvs .tvs-swatch:focus-visible{
  outline: none;
}
/* Not made in this combination: still clickable — it switches the other choice to one that is. */
.tvs .tvs-swatch.is-unavailable,
.tvs .tvs-chip.is-unavailable{
  opacity: 0.38;
}
.tvs .tvs-swatch:focus-visible::after{
  border-color: var(--tvs-teal);
}

.tvs .tvs-chips{
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.tvs .tvs-chip{
  padding: 9px 16px;
  border: 1px solid var(--tvs-rule);
  background: #fff;
  font-size: 14.5px;
  color: var(--tvs-ink);
  cursor: pointer;
  transition: border-color 0.15s, background 0.15s;
}
.tvs .tvs-chip:hover{
  border-color: var(--tvs-teal-light);
}
.tvs .tvs-chip[aria-pressed='true']{
  border-color: var(--tvs-deep);
  background: var(--tvs-deep);
  color: #fff;
}
.tvs .tvs-chip:focus-visible{
  outline: 2px solid var(--tvs-teal);
  outline-offset: 2px;
}

.tvs .tvs-cta{
  display: inline-flex;
  align-items: center;
  gap: 10px;
  margin-top: 8px;
  padding: 15px 26px 13px;
  background: var(--tvs-smoke-solid);
  color: #fff;
  font-family: var(--tvs-display);
  font-size: 14px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  text-decoration: none;
  transition: background 0.2s;
}
.tvs .tvs-cta:hover,
.tvs .tvs-cta:focus-visible{
  background: var(--tvs-smoke-deep);
  color: #fff;
  outline: none;
}

/* ---------- Closing band ---------- */

.tvs .tvs-end{
  margin-top: 40px;
  padding: 80px 0;
  background: var(--tvs-teal-tint);
  text-align: center;
}
.tvs .tvs-end__title{
  margin: 0 0 12px;
  font-family: var(--tvs-serif);
  font-style: italic;
  font-weight: 400;
  font-size: clamp(30px, 3.6vw, 46px);
  color: var(--tvs-deep);
}
.tvs .tvs-end p{
  margin: 0 auto 26px;
  max-width: 52ch;
  color: var(--tvs-ink-2);
  font-size: 17px;
}

/* ---------- Lightbox ---------- */

.tvs .tvs-lb{
  position: fixed;
  inset: 0;
  z-index: 100000;
  display: none;
  grid-template-rows: auto 1fr auto;
  background: rgb(14, 24, 28);
  color: #fff;
  font-family: var(--tvs-body);
}
.tvs .tvs-lb.is-open{
  display: grid;
}
.tvs .tvs-lb__top{
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 16px 20px;
  font-size: 14px;
  letter-spacing: 0.06em;
  color: rgba(255, 255, 255, 0.8);
}
.tvs .tvs-lb__fig{
  position: relative;
  margin: 0;
  display: grid;
  place-items: center;
  min-height: 0;
  padding: 0 72px;
  touch-action: pan-y;
}
.tvs .tvs-lb__fig img{
  max-width: 100%;
  /* Top bar and thumbnail strip take ~150px; the photo gets the rest. */
  max-height: calc(100vh - 160px);
  max-height: calc(100dvh - 160px);
  object-fit: contain;
  user-select: none;
}
.tvs .tvs-lb button{
  border: none;
  background: rgba(255, 255, 255, 0.1);
  color: #fff;
  cursor: pointer;
  display: grid;
  place-items: center;
  transition: background 0.2s;
}
.tvs .tvs-lb button:hover,
.tvs .tvs-lb button:focus-visible{
  background: rgba(255, 255, 255, 0.24);
  outline: none;
}
.tvs .tvs-lb__close{
  width: 44px;
  height: 44px;
  border-radius: 50%;
}
.tvs .tvs-lb__nav{
  position: absolute;
  top: 50%;
  width: 52px;
  height: 52px;
  margin-top: -26px;
  border-radius: 50%;
}
.tvs .tvs-lb__nav--prev{
  left: 12px;
}
.tvs .tvs-lb__nav--next{
  right: 12px;
}
.tvs .tvs-lb__strip{
  display: flex;
  justify-content: center;
  gap: 8px;
  padding: 14px 20px 20px;
  overflow-x: auto;
}
.tvs .tvs-lb__strip button{
  flex: 0 0 64px;
  height: 48px;
  padding: 0;
  opacity: 0.5;
  border: 2px solid transparent;
  background: transparent;
}
.tvs .tvs-lb__strip button[aria-current='true']{
  opacity: 1;
  border-color: var(--tvs-teal-light);
}
.tvs .tvs-lb__strip img{
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* ---------- Narrow screens ---------- */

@media (max-width: 980px) {
  /*
   * On one column the swatches would sit below the description, a scroll away
   * from the photo they change. Lay the pieces out by area instead: name,
   * photo, finishes, then the words.
   */
  .tvs .tvs-series{
    grid-template-areas: 'head' 'stage' 'caption' 'opts' 'thumbs' 'body' 'act';
    row-gap: 0;
  }
  .tvs .tvs-info,
  .tvs .tvs-media{
    display: contents;
  }
  .tvs .tvs-head{
    grid-area: head;
    margin-bottom: 12px;
  }
  .tvs .tvs-stage{
    grid-area: stage;
    /* Leave room under it for the caption and swatches on a tablet too. */
    max-height: 56vh;
    max-height: 56svh;
  }
  .tvs .tvs-caption{
    grid-area: caption;
    margin-top: 8px;
  }
  /* The swatches go straight under the photo, ahead even of the thumbnails. */
  .tvs .tvs-opts{
    grid-area: opts;
    padding-top: 12px;
  }
  .tvs .tvs-thumbs{
    grid-area: thumbs;
    margin-top: 2px;
  }
  /* Finish first: it is the choice people make, and the one the photo shows. */
  .tvs .tvs-opts{
    display: flex;
    flex-direction: column;
  }
  .tvs .tvs-opts .tvs-opt{
    margin-bottom: 12px;
    padding-top: 12px;
  }
  .tvs .tvs-opts .tvs-opt--finish{
    order: -1;
    border-top: 0;
    padding-top: 4px;
  }
  .tvs .tvs-opt__label{
    margin-bottom: 8px;
  }
  .tvs .tvs-body{
    grid-area: body;
    padding-top: 22px;
  }
  .tvs .tvs-act{
    grid-area: act;
  }
  .tvs .tvs-name{
    margin-bottom: 0;
  }
  .tvs .tvs-series{
    grid-template-columns: minmax(0, 1fr);
    column-gap: 26px;
    padding-bottom: 64px;
  }
  .tvs .tvs-series + .tvs-series{
    padding-top: 64px;
  }
  .tvs .tvs-series:nth-of-type(even) .tvs-media{
    order: 0;
  }
  .tvs .tvs-section__head{
    grid-template-columns: minmax(0, 1fr);
    gap: 18px;
    margin-bottom: 44px;
  }
  .tvs .tvs-section{
    padding-top: 64px;
  }
}

@media (max-width: 1023px) {
  /*
   * Phones and tablets: the smoke bar with just the logo, centred. No menu —
   * on this page the three section buttons do the navigating.
   */
  body:has(.tvs) #thrive-header .tve-m-trigger,
  body:has(.tvs) #thrive-header .tve_w_menu {
    display: none !important;
  }
  /* The menu's own wrappers only — the header's outer wrapper shares the
     thrive-shortcode-html class and carries padding of its own. */
  body:has(.tvs) #thrive-header .thrv_widget_menu > .thrive-shortcode-html,
  body:has(.tvs) #thrive-header .tcb-hamburger-logo {
    display: flex !important;
    justify-content: center !important;
    width: 100% !important;
    box-sizing: border-box !important;
  }
  body:has(.tvs) #thrive-header .tcb-hamburger-logo {
    position: static !important;
    margin: 0 auto !important;
    float: none !important;
  }
}

@media (max-width: 640px) {
  .tvs .tvs-wrap{
    padding: 0 16px;
  }
  .tvs .tvs-hero{
    min-height: 0;
  }
  /* A phone puts the busiest part of the photo right behind the words. */
  .tvs .tvs-hero::after{
    background: linear-gradient(180deg, rgba(20, 34, 39, 0.55) 0%, rgba(20, 34, 39, 0.7) 45%, rgba(20, 34, 39, 0.94) 100%);
  }
  .tvs .tvs-hero__title{
    text-shadow: 0 1px 3px rgba(0, 0, 0, 0.45), 0 2px 18px rgba(0, 0, 0, 0.5);
  }
  .tvs .tvs-hero__intro{
    text-shadow: 0 1px 10px rgba(0, 0, 0, 0.45);
  }
  .tvs .tvs-hero__body{
    /* Clears the header bar laid over the photo, plus a little air. */
    padding-top: 170px;
    padding-bottom: 28px;
  }
  .tvs .tvs-hero__intro{
    font-size: 14px;
    letter-spacing: 0.18em;
    line-height: 1.8;
  }
  .tvs .tvs-jump{
    grid-template-columns: minmax(0, 1fr);
    gap: 10px;
    margin-top: 26px;
  }
  .tvs .tvs-jump a{
    padding: 15px 18px;
  }
  .tvs .tvs-bar__inner{
    gap: 0;
    justify-content: space-between;
  }
  .tvs .tvs-bar a{
    flex: 1;
    text-align: center;
    padding: 15px 4px 13px;
    font-size: 12.5px;
    letter-spacing: 0.16em;
  }
  .tvs .tvs-bar a[aria-current='true']::after{
    left: 18%;
    right: 18%;
  }
  /* On a phone the photo runs edge to edge — it is the whole point. */
  .tvs .tvs-stage{
    border-left: 0;
    border-right: 0;
  }
  .tvs .tvs-stage{
    margin: 0 -16px;
    width: calc(100% + 32px);
  }
  .tvs .tvs-thumbs{
    margin-left: -16px;
    margin-right: -16px;
  }
  .tvs .tvs-thumbs{
    padding: 0 16px 4px;
  }
  .tvs .tvs-thumb{
    flex-basis: 48px;
    height: 56px;
  }
  /*
   * Photo, thumbnails and swatches on one screen, so a finish can be picked
   * while watching the door change. A square photo alone is most of a phone.
   */
  .tvs .tvs-stage{
    max-height: 46vh;
    max-height: 46svh;
  }
  /* No hover on touch: show the arrows, smaller. */
  .tvs .tvs-stage__btn{
    opacity: 1;
    width: 38px;
    height: 38px;
    margin-top: -19px;
  }
  .tvs .tvs-stage__btn--prev{
    left: 10px;
  }
  .tvs .tvs-stage__btn--next{
    right: 10px;
  }
  .tvs .tvs-stage__zoom span{
    display: none;
  }
  .tvs .tvs-lb__fig{
    padding: 0;
  }
  .tvs .tvs-lb__nav{
    width: 42px;
    height: 42px;
    margin-top: -21px;
    background: rgba(0, 0, 0, 0.4) !important;
  }
  .tvs .tvs-end{
    padding: 56px 0;
  }
}

@media (prefers-reduced-motion: reduce) {
  .tvs .tvs-slide{
    transition: none !important;
  }
}
