/* ════════════════════════════════════════════════════════════════════════════════════════════════
   Handyman.ai on Rayo
   ════════════════════════════════════════════════════════════════════════════════════════════════
   The few rules our content needs. The theme's own files (main.css, plugins.css, app.js) are not
   edited, so a theme update stays a file copy. Everything here uses the theme's tokens.
*/

/* The theme's faces, from handyman.ai itself (Law 25, 2026-10-12). main.css imported them from Google Fonts on every
   page, before a visitor in Quebec had answered; the build drops those imports from its copy (tools/build.py), and these
   are the same files, weights and subsets Google served: Funnel Display 300 to 800, Funnel Sans 300 to 800 upright and
   italic, Latin and Latin Extended. SIL Open Font License, in /fonts/Funnel/OFL.txt. */
@font-face {
  font-family: 'Funnel Display';
  font-style: normal;
  font-weight: 300 800;
  font-display: swap;
  src: url(../fonts/Funnel/funnel-display-v3-latin-ext.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Funnel Display';
  font-style: normal;
  font-weight: 300 800;
  font-display: swap;
  src: url(../fonts/Funnel/funnel-display-v3-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Funnel Sans';
  font-style: italic;
  font-weight: 300 800;
  font-display: swap;
  src: url(../fonts/Funnel/funnel-sans-italic-v3-latin-ext.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Funnel Sans';
  font-style: italic;
  font-weight: 300 800;
  font-display: swap;
  src: url(../fonts/Funnel/funnel-sans-italic-v3-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Funnel Sans';
  font-style: normal;
  font-weight: 300 800;
  font-display: swap;
  src: url(../fonts/Funnel/funnel-sans-v3-latin-ext.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Funnel Sans';
  font-style: normal;
  font-weight: 300 800;
  font-display: swap;
  src: url(../fonts/Funnel/funnel-sans-v3-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* The mascot sits where the theme's round cat mark was. */
.hm-logo-mark { object-fit: contain; border-radius: 0; }

/* The footer's full-width word, set in the theme's display face. */
.hm-footer-word text {
  font-family: var(--_font-accent);
  font-weight: 700;
  font-size: 7.2rem;
  letter-spacing: -0.02em;
  fill: currentColor;
}

.hm-mascot-link img { width: 9.7rem; height: auto; display: block; }

/* A note for a control whose content arrives later (the film). */
.hm-note {
  position: fixed;
  left: 50%;
  bottom: 2.4rem;
  z-index: 10000;
  transform: translate(-50%, 1rem);
  max-width: min(46rem, calc(100vw - 3.2rem));
  padding: 1.4rem 2rem;
  border-radius: var(--_radius-m);
  background: var(--base-opp);
  color: var(--base);
  font: 400 1.5rem/1.4 var(--_font-default);
  opacity: 0;
  pointer-events: none;
  transition: opacity var(--_animspeed-medium) ease, transform var(--_animspeed-medium) ease;
}
.hm-note.is-visible { opacity: 1; transform: translate(-50%, 0); }

/* ── Room for the cookie popup (the cookie popup plan, approved 2026-10-17; tools/consent.js, tools/consent.css) ────
   The card sits at the foot of a phone and in the bottom-left corner of a computer, and the page makes room for it so
   it never sits on a button. html.hm-consent-open says the room is held and --hm-consent-h how much: the card's height,
   its gap below and 8 px above. The script in the <head> holds a measured guess before anything draws, so nothing
   jumps; consent.js corrects it once the card is drawn, and lets it go when the line after an answer has gone.
   Today's dark "Allow analytics and Google ad measurement?" bar (.hm-ask) and its lifts are gone with it. ───────── */
html.hm-consent-open body { padding-bottom: var(--hm-consent-h, 0px); }
@media (max-width: 767px) {
  html.hm-consent-open .hm-wpill { bottom: calc(3rem + var(--hm-consent-h, 0px)); }
  html.hm-consent-open .btn-to-top { bottom: calc(3rem + var(--hm-consent-h, 0px)); }
  html.hm-consent-open .hm-asker { bottom: calc(2rem + var(--hm-consent-h, 0px)); }
}
@media (min-width: 768px) {
  html.hm-consent-open .hm-asker { bottom: calc(3rem + var(--hm-consent-h, 0px)); }
}
/* On a computer the red-cap mascot standing in the hero's bottom-left corner lifts above the card while it shows (call 6:
   at 1440×900 the card covered its bottom 10 px). On a shorter window it stands lower, mostly below the fold, where a
   lift can't clear it, so it stays put. */
.hm-crew-hero--1 { transition: transform .35s cubic-bezier(.2, .8, .2, 1); }
@media only screen and (min-width: 768px) and (min-height: 820px) {
  html.hm-consent-open .hm-crew-hero--1 { transform: translateY(-28px); }
}
/* On a short phone the home headline is 10% smaller while the card shows, so Get started clears it (call 6); it settles
   back after an answer. At 844 px tall it already clears by 138 px. */
@media only screen and (max-width: 767px) and (max-height: 800px) {
  html.hm-consent-open .hero-01-title { font-size: calc(min(6rem, calc((100vw - 6rem) / 6.4)) * .9); }
}

/* ── The launch film over the page (the hero's play button, handyman.js openFilm). A dark room in either theme, the
   film as large as fits with room above it for the close button, and nothing fading in or out. ───────────────── */
.hm-film { position: fixed; inset: 0; z-index: 10001; display: grid; place-items: center; padding: 1.6rem;
  background: rgba(14, 13, 18, .88); }
.hm-film__frame { position: relative; aspect-ratio: 16 / 9; width: min(112rem, 100%, calc((100vh - 14rem) * 16 / 9)); }
@supports (height: 100svh) { .hm-film__frame { width: min(112rem, 100%, calc((100svh - 14rem) * 16 / 9)); } }
.hm-film__video { display: block; width: 100%; height: 100%; object-fit: cover; border-radius: var(--_radius-m); background: #000; }
.hm-film__close { position: absolute; right: 0; bottom: calc(100% + 1.2rem); display: grid; place-items: center;
  width: 4.8rem; height: 4.8rem; border: 0; border-radius: 50%; background: #fff; color: #161616; font-size: 2rem; cursor: pointer; }
.hm-film__close:focus-visible { outline: .3rem solid var(--accent); outline-offset: .3rem; }
html.hm-film-open, html.hm-film-open body { overflow: hidden; }
@media (max-width: 767px) {
  .hm-film { bottom: auto; height: 100vh; height: 100dvh; box-shadow: 0 0 0 100vmax rgba(14, 13, 18, .88); }
}
/* The films' controls (handyman.js filmControls): play and pause at the bottom left, full screen at the bottom right,
   a seek bar between, on a soft shade that fades while the film plays. */
.hm-vc { position: absolute; left: 0; right: 0; bottom: 0; z-index: 3; display: flex; align-items: center; gap: 1.2rem;
  padding: 4rem 1.6rem 1.4rem; pointer-events: auto; transition: opacity .35s ease;
  background: linear-gradient(to top, rgba(14, 13, 18, .58), rgba(14, 13, 18, 0)); }
.hm-film__frame .hm-vc { border-radius: 0 0 var(--_radius-m) var(--_radius-m); }
.hm-vc-host.is-idle .hm-vc { opacity: 0; }
.hm-vc-host.is-idle .hm-vc * { pointer-events: none; }
.hm-vc-host.is-idle { cursor: none; }
.hm-vc__btn { flex: none; display: grid; place-items: center; width: 4.4rem; height: 4.4rem; padding: 0; border: 0; border-radius: 50%;
  background: rgba(255, 255, 255, .2); color: #fff; cursor: pointer; transition: background .2s, transform .2s;
  -webkit-backdrop-filter: blur(.8rem); backdrop-filter: blur(.8rem); }
.hm-vc__btn:hover { background: rgba(255, 255, 255, .32); }
.hm-vc__btn:active { transform: scale(.94); }
.hm-vc__btn svg { width: 2rem; height: 2rem; }
.hm-vc__btn:focus-visible, .hm-vc__seek:focus-visible { outline: .3rem solid var(--accent); outline-offset: .2rem; }
.hm-vc__seek { flex: 1; display: flex; align-items: center; height: 4.4rem; cursor: pointer; touch-action: none; border-radius: 1rem; }
.hm-vc__track { position: relative; flex: 1; height: .4rem; border-radius: 1rem; background: rgba(255, 255, 255, .28); transition: height .15s; }
.hm-vc__seek:hover .hm-vc__track, .is-scrubbing .hm-vc__track { height: .6rem; }
.hm-vc__buf, .hm-vc__fill { position: absolute; left: 0; top: 0; bottom: 0; width: 0; border-radius: inherit; }
.hm-vc__buf { background: rgba(255, 255, 255, .26); }
.hm-vc__fill { background: #fff; }
.hm-vc__knob { position: absolute; top: 50%; left: 0; width: 1.4rem; height: 1.4rem; margin: -.7rem 0 0 -.7rem; border-radius: 50%;
  background: #fff; box-shadow: 0 .2rem .6rem rgba(0, 0, 0, .3); transform: scale(0); transition: transform .15s; }
.hm-vc__seek:hover .hm-vc__knob, .is-scrubbing .hm-vc__knob, .hm-vc__seek:focus-visible .hm-vc__knob { transform: scale(1); }
@media (pointer: coarse) { .hm-vc__knob { transform: scale(1); } }
.hm-vc-host.is-full { background: #000; }
.hm-vc-host.is-full video { object-fit: contain; border-radius: 0; background: #000; }
.hm-vc-host.is-full .hm-vc { border-radius: 0; }
@media (prefers-reduced-motion: reduce) { .hm-vc, .hm-vc__track, .hm-vc__knob, .hm-vc__btn { transition: none; } }
/* The sound, on and off, in the film's top-right corner (handyman.js filmControls; the founder, 2026-10-13: "add a mute
   button top right of video", "for all videos mute button"): a dark glass circle, so it reads on the film's pale
   frames, fading with the bar. In the big video's frame it sits beside that frame's own ✕. */
.hm-vc__mute { position: absolute; top: 1.2rem; right: 1.2rem; z-index: 4; display: grid; place-items: center; width: 4.4rem; height: 4.4rem;
  padding: 0; border: 0; border-radius: 50%; background: rgba(22, 22, 22, .5); color: #fff; cursor: pointer;
  -webkit-backdrop-filter: blur(.8rem); backdrop-filter: blur(.8rem); transition: opacity .35s ease, background-color .2s, transform .2s; }
.hm-vc__mute:hover { background: rgba(22, 22, 22, .7); }
.hm-vc__mute:active { transform: scale(.94); }
.hm-vc__mute svg { width: 2.2rem; height: 2.2rem; }
.hm-vc__mute:focus-visible { outline: .3rem solid var(--accent); outline-offset: .2rem; }
.hm-vc-host.is-idle .hm-vc__mute { opacity: 0; pointer-events: none; }
.hm-stage .hm-vc__mute { top: 1.8rem; right: 7.4rem; }
/* "Watch in full screen", floating under a film's popup on a phone held upright (the founder: "on mobile add a button
   under the video frame that says watch in full screen flowting below the video"): an iPhone hands the film to its
   own player, and turned sideways it fills the screen. */
.hm-fs { display: none; align-items: center; justify-content: center; gap: .8rem; min-height: 4.4rem; padding: 0 2rem; border: 0;
  border-radius: 10rem; background: #fff; color: #161616; font: 600 1.5rem/1 var(--_font-default); white-space: nowrap; cursor: pointer;
  box-shadow: 0 1rem 2.4rem -1rem rgba(0, 0, 0, .5); }
.hm-fs svg { flex: none; width: 1.8rem; height: 1.8rem; }
.hm-fs:focus-visible { outline: .3rem solid var(--accent); outline-offset: .3rem; }
@media (max-width: 767px) and (orientation: portrait) {
  .hm-fs { display: inline-flex; }
  .hm-film__fs { position: absolute; top: calc(100% + 1.6rem); left: 50%; transform: translateX(-50%); }
}
@media (prefers-reduced-motion: reduce) { .hm-vc__mute { transition: none; } }
/* The film's door in the big video's frame (build.py: the divider's stage). The house plays behind a mini preview of
   the film with "See how it works" on its button; pressed, the film opens in the popup with its sound (handyman.js),
   on every screen, since 2026-10-15. */
.hm-stage { position: absolute; inset: 0; z-index: 2; display: grid; place-items: center; pointer-events: none; }
.hm-stage__tease { pointer-events: auto; display: grid; justify-items: center; width: min(46rem, 60%); color: #fff;
  text-decoration: none; transition: transform .5s cubic-bezier(.2, .8, .2, 1); }
.hm-stage__tease:hover { transform: translateY(-.4rem) scale(1.02); }
.hm-stage__tease:focus-visible { outline: none; }
.hm-stage__tease:focus-visible .hm-stage__label { outline: .3rem solid var(--accent); outline-offset: .3rem; }
.hm-stage__clip { position: relative; z-index: 1; display: block; width: 100%; aspect-ratio: 16 / 9; overflow: hidden; border: .5rem solid #fff;
  border-radius: var(--_radius-m); background: #F0F5F0;
  box-shadow: 0 3.2rem 6.4rem -2.4rem rgba(16, 24, 16, .45), 0 0 0 .1rem rgba(16, 24, 16, .06); }
.hm-stage__preview { width: 100%; height: 100%; }
/* The pill sits over the preview's bottom edge, above it: iOS Safari draws a playing video on its own layer, over a
   later sibling that has no z-index (the founder's phone showed the pill's top half under the clip). */
.hm-stage__label { position: relative; z-index: 2; display: inline-flex; align-items: center; gap: 1.2rem; margin-top: -3rem; padding: .8rem 2.4rem .8rem .8rem;
  border-radius: 10rem; background: #161616; color: #fff; font-size: 2rem; font-weight: 600; line-height: 1; white-space: nowrap;
  box-shadow: 0 1.6rem 3.2rem -1.2rem rgba(16, 16, 16, .5); }
.hm-stage__play { display: grid; place-items: center; width: 4.4rem; height: 4.4rem; border-radius: 50%; background: var(--accent);
  color: #161616; font-size: 1.8rem; animation: hm-stage-pulse 1.8s ease-out infinite; }
.hm-stage__meta { margin-left: -.2rem; font-weight: 500; opacity: .7; }
.hm-stage__meta::before { content: "·"; margin-right: .8rem; }
@keyframes hm-stage-pulse { from { box-shadow: 0 0 0 0 rgba(255, 255, 255, .55); } to { box-shadow: 0 0 0 1.2rem rgba(255, 255, 255, 0); } }
/* On a phone the frame is tall and narrow: the preview takes most of its width, the pill fits inside the preview's
   width, and a soft wash of the page's ground quiets the house's cards right behind them (the founder: "Fix the way
   this looks on mobile"). */
@media (max-width: 767px) {
  .hm-stage::before { content: ""; position: absolute; inset: 0; pointer-events: none;
    background: radial-gradient(ellipse 75% 50% at 50% 50%, rgba(250, 247, 246, .94), rgba(250, 247, 246, .6) 62%, rgba(250, 247, 246, 0)); }
  .hm-stage__tease { position: relative; width: 86%; }
  .hm-stage__label { margin-top: -2.2rem; gap: .8rem; padding: .6rem 1.8rem .6rem .6rem; font-size: 1.6rem; }
  .hm-stage__play { width: 3.4rem; height: 3.4rem; font-size: 1.4rem; }
  .hm-stage__meta::before { margin-right: .6rem; }
  /* The hero's lower block (the scroll badge, the line and the ways to reach it): the theme pads it 14rem above and
     13.2rem below at every width, which a phone shows as two blank screens' worth around it (the founder: "Fix the
     top bottom padding on this section on mobile its too much imo too much blank area"). */
  .mxd-hero-01 .mxd-hero-01__data-wrap { padding-top: 4.8rem; padding-bottom: 5.6rem; }
}
@media (prefers-reduced-motion: reduce) { .hm-stage__play { animation: none; } .hm-stage__tease { transition: none; } }

/* ── /watch: the launch film in a popup over the home page (build.py watch_page; handyman.js plays it). handyman.ai's
   own film popup (.hm-film above) and the app's waitlist film: the page dimmed behind it and standing still, the 16:9
   film as large as fits with the ✕ above its corner (the app's red on the site's white circle) and the sound button in
   it. It opens on the film's muted preview behind "Play now"; it opens with a small rise and closes by shrinking away
   (with reduced motion it only fades), and then a pill in the page's corner opens it again. ─────────────────────── */
html:has(> body.hm-watching), body.hm-watching { overflow: hidden; }
/* A phone (upright or on its side): the popup in the middle of the screen the person can see (the dynamic viewport,
   inside the safe areas) with 2rem all round, the ✕'s row above the film and, upright, "Watch in full screen" under
   it; the dim covers the header too, and reaches under a browser's see-through bars (the shadow). A computer or a
   tablet (768 px wide and 521 px tall or more): the header's row stays clear above it (its buttons end 9.6rem down). */
.hm-watch { position: fixed; top: 0; left: 0; right: 0; z-index: 10002; display: flex; align-items: center; justify-content: center;
  height: 100vh; height: 100dvh;
  padding: calc(2rem + env(safe-area-inset-top, 0px)) calc(2rem + env(safe-area-inset-right, 0px))
    calc(2rem + env(safe-area-inset-bottom, 0px)) calc(2rem + env(safe-area-inset-left, 0px));
  background: rgba(14, 13, 18, .7); box-shadow: 0 0 0 100vmax rgba(14, 13, 18, .7); -webkit-tap-highlight-color: transparent;
  transition: opacity .3s ease; animation: hm-watch-dim .3s ease; }
.hm-watch[hidden] { display: none; }
.hm-watch__col { position: relative; display: flex; flex-direction: column; align-items: flex-end; gap: 1rem;
  width: min(112rem, 100%, calc((100vh - 9.4rem) * 16 / 9)); transition: transform .3s cubic-bezier(.4, 0, 1, 1);
  animation: hm-watch-in .45s cubic-bezier(.2, .8, .2, 1); }
@supports (height: 100dvh) {
  .hm-watch__col { width: min(112rem, 100%, calc((100dvh - 9.4rem - env(safe-area-inset-top, 0px) - env(safe-area-inset-bottom, 0px)) * 16 / 9)); }
}
.hm-watch__close { flex: none; display: grid; place-items: center; width: 4.4rem; height: 4.4rem; padding: 0; border: 0; border-radius: 50%;
  background: #fff; color: #BC2949; cursor: pointer; box-shadow: 0 .8rem 2.4rem -1rem rgba(0, 0, 0, .45);
  transition: background-color .2s ease, transform .2s ease; }
.hm-watch__close svg { width: 2.4rem; height: 2.4rem; }
.hm-watch__close:hover { background: #FAE8EC; }   /* the app's red, 12% on white */
.hm-watch__close:active { transform: scale(.94); }
.hm-watch__close:focus-visible { outline: .3rem solid var(--accent); outline-offset: .3rem; }
@media (min-width: 768px) and (min-height: 521px) {
  .hm-watch { padding: 10.4rem 2.4rem 2.4rem; }
  .hm-watch__col { width: min(112rem, 100%, calc((100vh - 18.6rem) * 16 / 9)); }
  @supports (height: 100dvh) { .hm-watch__col { width: min(112rem, 100%, calc((100dvh - 18.6rem) * 16 / 9)); } }
  .hm-watch__close { width: 4.8rem; height: 4.8rem; }
}
/* On a phone the popup covers the header's row, so the header steps aside under the dim while it is open (its menu
   button peeked out beside the ✕), and comes back as the popup fades. */
@media not all and (min-width: 768px) and (min-height: 521px) {
  body.hm-watching .mxd-header, body.hm-watching .mxd-nav__contain { visibility: hidden; }
}
/* "Watch in full screen" keeps its row while the preview plays, so nothing moves when the film starts. */
@media (max-width: 767px) and (orientation: portrait) {
  .hm-watch__fs { align-self: center; }
  .hm-watch:not(.is-film) .hm-watch__fs { visibility: hidden; }
}
.hm-watch__frame { position: relative; width: 100%; aspect-ratio: 16 / 9; overflow: hidden; border-radius: var(--_radius-m);
  background: #F3F7F1; outline: none; box-shadow: 0 3.2rem 8rem -2.4rem rgba(0, 0, 0, .6); }
.hm-watch__frame.is-full { border-radius: 0; }
.hm-watch__film { display: block; width: 100%; height: 100%; object-fit: cover; background: #F3F7F1; border-radius: inherit; }
/* The preview, all of it the play button: "Watch the explainer video" (with ?to=, the name) over "Play now". */
.hm-watch__start { position: absolute; inset: 0; z-index: 4; display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 1.2rem; width: 100%; padding: 1.6rem; border: 0; border-radius: inherit; color: #161616; font: inherit; cursor: pointer;
  background: radial-gradient(ellipse 70% 60% at 50% 55%, rgba(14, 13, 18, .22), rgba(14, 13, 18, 0)); }
.hm-watch.is-film .hm-watch__start { display: none; }
.hm-watch__start:focus-visible { outline: none; }
.hm-watch__start:focus-visible .hm-watch__go { outline: .3rem solid var(--accent); outline-offset: .3rem; }
.hm-watch__note { display: inline-flex; align-items: center; gap: 1rem; max-width: 100%; margin: 0; padding: .5rem 1.6rem .5rem .5rem;
  border-radius: 2.4rem; background: rgba(255, 255, 255, .92); color: #161616; font: 600 1.5rem/1.3 var(--_font-default); text-align: left;
  box-shadow: 0 1.2rem 3.2rem -1.6rem rgba(16, 24, 16, .45); -webkit-backdrop-filter: blur(1rem); backdrop-filter: blur(1rem); }
.hm-watch__note .hm-watch__to { color: inherit; }   /* the theme's "p span" is white in dark */
.hm-watch__note img { flex: none; width: 3.2rem; height: 3.2rem; }
.hm-watch__go { display: inline-flex; align-items: center; gap: 1.2rem; min-height: 5.6rem; padding: .6rem 2.6rem .6rem .6rem; border-radius: 10rem;
  background: #161616; color: #fff; font: 600 2.1rem/1 var(--_font-default); white-space: nowrap;
  box-shadow: 0 1.6rem 3.2rem -1.2rem rgba(16, 16, 16, .55); transition: transform .2s ease; }
.hm-watch__start:hover .hm-watch__go { transform: scale(1.04); }
.hm-watch__start:active .hm-watch__go { transform: scale(.97); }
.hm-watch__go-icon { display: grid; place-items: center; width: 4.4rem; height: 4.4rem; border-radius: 50%; background: var(--accent);
  color: #161616; font-size: 1.9rem; }
/* "Play now" glows while the preview loops (the founder, 2026-10-13: "make the play now button glow on /watch"): a soft
   halo in the site's accent that breathes in and out over two seconds, so the eye goes straight to it. It goes with
   the button at the tap; with reduced motion it holds still at its brightest. */
.hm-watch:not(.is-film) .hm-watch__go { animation: hm-watch-glow 2s ease-in-out infinite; }
@keyframes hm-watch-glow {
  0%, 100% { box-shadow: 0 1.6rem 3.2rem -1.2rem rgba(16, 16, 16, .55), 0 0 0 .1rem color-mix(in srgb, var(--accent) 30%, transparent),
    0 0 1.6rem .2rem color-mix(in srgb, var(--accent) 35%, transparent); }
  50% { box-shadow: 0 1.6rem 3.2rem -1.2rem rgba(16, 16, 16, .55), 0 0 0 .5rem color-mix(in srgb, var(--accent) 32%, transparent),
    0 0 4rem 1.2rem color-mix(in srgb, var(--accent) 62%, transparent); }
}
@media (min-width: 768px) {
  .hm-watch__start { gap: 1.6rem; }
  .hm-watch__note { padding: .6rem 1.8rem .6rem .6rem; font-size: 1.8rem; }
  .hm-watch__note img { width: 3.6rem; height: 3.6rem; }
  .hm-watch__go { min-height: 7.2rem; gap: 1.4rem; padding: .8rem 3.4rem .8rem .8rem; font-size: 2.8rem; }
  .hm-watch__go-icon { width: 5.6rem; height: 5.6rem; font-size: 2.4rem; }
}
.hm-watch__spin { position: absolute; left: 50%; top: 50%; z-index: 2; width: 4rem; height: 4rem; margin: -2rem 0 0 -2rem; border-radius: 50%;
  border: .3rem solid rgba(22, 22, 22, .1); border-top-color: rgba(22, 22, 22, .5); opacity: 0; pointer-events: none;
  transition: opacity .2s; animation: hm-watch-spin .9s linear infinite; }
.hm-watch.is-loading .hm-watch__spin { opacity: 1; transition-delay: .5s; }
.hm-watch.is-closing { opacity: 0; pointer-events: none; }
.hm-watch.is-closing .hm-watch__col { transform: scale(.9); }
@keyframes hm-watch-spin { to { transform: rotate(360deg); } }
@keyframes hm-watch-dim { from { background-color: rgba(14, 13, 18, 0); box-shadow: 0 0 0 100vmax rgba(14, 13, 18, 0); } }
@keyframes hm-watch-in { from { opacity: 0; transform: translateY(2.4rem) scale(.96); } }
/* The home page's film pill (handyman.js; the founder: "Just keep the watch video pill persistent always on homepage"):
   "▶ Watch the video", then "▶ Rewatch video" once they've watched, in the bottom-right corner where the theme's
   back-to-top button sits, sliding beside it once that shows. Small on a phone (a 44 px tap target). It fades out of
   the way while the hero's words or buttons are behind it, while a film plays, and sits above the cookie popup on a
   phone. The theme's inverse colours, so it reads in light and dark. */
.hm-wpill { position: fixed; right: 3rem; bottom: 3rem; z-index: 50; display: inline-flex; align-items: center; gap: .8rem; min-height: 4.4rem;
  padding: .5rem 1.6rem .5rem .5rem; border: 0; border-radius: 10rem; background: var(--base-opp); color: var(--base);
  font: 600 1.4rem/1 var(--_font-default); white-space: nowrap; cursor: pointer; box-shadow: 0 1.2rem 2.8rem -1.2rem rgba(16, 16, 16, .5);
  opacity: 0; transform: translateY(1.2rem); transition: opacity .3s ease, transform .45s cubic-bezier(.2, .8, .2, 1); }
.hm-wpill.is-in { opacity: 1; transform: none; }
.hm-wpill.is-in.is-beside { transform: translateX(-5.6rem); }   /* back-to-top: 4.6rem, and a gap */
.hm-wpill.is-hidden, html.hm-film-open .hm-wpill { opacity: 0; pointer-events: none; }
.hm-wpill:focus-visible { outline: .3rem solid var(--accent); outline-offset: .3rem; }
.hm-wpill__icon { flex: none; display: grid; place-items: center; width: 3.4rem; height: 3.4rem; border-radius: 50%; background: var(--accent); color: #161616; }
.hm-wpill__icon svg { width: 1.5rem; height: 1.5rem; margin-left: .2rem; }
.hm-wpill__t { overflow: hidden; max-width: 24rem; transition: max-width .3s ease, opacity .2s ease; }
.hm-wpill.is-compact { gap: 0; padding-right: .5rem; }
.hm-wpill.is-compact .hm-wpill__t { max-width: 0; opacity: 0; }
@media (min-width: 768px) {
  .hm-wpill { right: 6rem; bottom: 4rem; gap: 1rem; min-height: 5.6rem; padding: .6rem 2.4rem .6rem .6rem; font-size: 1.7rem; }
  .hm-wpill.is-compact { padding-right: .6rem; }
  .hm-wpill.is-in.is-beside { transform: translateX(-6.8rem); }   /* back-to-top: 5.6rem, and a gap */
  .hm-wpill__icon { width: 4.4rem; height: 4.4rem; }
  .hm-wpill__icon svg { width: 1.8rem; height: 1.8rem; }
}
@media (min-width: 1600px) { .hm-wpill { right: 9rem; } }
@media (prefers-reduced-motion: reduce) {
  .hm-watch, .hm-watch__col, .hm-watch__go-icon, .hm-watch__spin { animation: none; }
  .hm-watch:not(.is-film) .hm-watch__go { animation: none; box-shadow: 0 1.6rem 3.2rem -1.2rem rgba(16, 16, 16, .55),
    0 0 0 .5rem color-mix(in srgb, var(--accent) 32%, transparent), 0 0 4rem 1.2rem color-mix(in srgb, var(--accent) 62%, transparent); }
  .hm-watch.is-closing .hm-watch__col { transform: none; }
  .hm-watch__go, .hm-watch__close { transition: none; }
  .hm-wpill, .hm-wpill.is-in.is-beside, .hm-wpill__t { transition: opacity .3s ease; }
  .hm-wpill.is-in { transform: none; }
}

/* ── "Ask Handyman" on the articles (handyman.js): a round message button in the bottom-left corner ("Ask Handyman"
   beside its icon on a computer) opens a sheet that rises from the bottom with a little spring on a phone and is a card
   in the middle on a computer, in the page's own colours, light or dark. Nothing covers the article until a tap. ── */
.hm-asker { position: fixed; left: 2rem; bottom: calc(2rem + env(safe-area-inset-bottom, 0px)); z-index: 60; display: inline-flex; align-items: center;
  gap: 1rem; padding: 0; border: 0; border-radius: 10rem; background: var(--base-opp); color: var(--base); cursor: pointer;
  box-shadow: 0 1.4rem 3rem -1.2rem rgba(16, 16, 16, .5); transition: transform .2s ease, opacity .25s ease; }
.hm-asker__icon { display: grid; place-items: center; width: 5.6rem; height: 5.6rem; border-radius: 50%; font-size: 2.6rem; }
.hm-asker__t { display: none; }
.hm-asker:hover { transform: translateY(-.2rem); }
.hm-asker:active { transform: scale(.95); }
.hm-asker:focus-visible { outline: .3rem solid var(--accent); outline-offset: .3rem; }
html.hm-sheet-open .hm-asker { opacity: 0; pointer-events: none; }
@media (min-width: 768px) {
  .hm-asker { left: 3rem; bottom: 3rem; padding: .6rem 2.2rem .6rem .6rem; font: 600 1.6rem/1 var(--_font-default); }
  .hm-asker__icon { width: 4.4rem; height: 4.4rem; background: var(--accent); color: #161616; font-size: 2.2rem; }
  .hm-asker__t { display: inline; }
}
html.hm-sheet-open, html.hm-sheet-open body { overflow: hidden; }
.hm-asksheet { position: fixed; inset: 0; z-index: 10004; display: flex; align-items: flex-end; justify-content: center;
  padding: 0 0 var(--kb, 0px); background: rgba(14, 13, 18, 0); -webkit-tap-highlight-color: transparent; transition: background-color .3s ease; }
.hm-asksheet[hidden] { display: none; }
.hm-asksheet.is-in { background: rgba(14, 13, 18, .5); }
.hm-asksheet__card { position: relative; width: 100%; max-height: calc(var(--vvh, 100dvh) - 1.2rem); overflow-x: hidden; overflow-y: auto;
  overscroll-behavior: contain; padding: .6rem 2rem calc(2rem + env(safe-area-inset-bottom, 0px)); border-radius: 2.8rem 2.8rem 0 0;
  background: var(--base); color: var(--t-bright); box-shadow: 0 -1.6rem 5rem -1.6rem rgba(0, 0, 0, .45);
  transform: translateY(105%); transition: transform .55s cubic-bezier(.2, 1.15, .35, 1); }
.hm-asksheet.is-in .hm-asksheet__card { transform: none; }
.hm-asksheet.is-out .hm-asksheet__card { transform: translateY(105%); transition: transform .3s cubic-bezier(.4, 0, 1, 1); }
.hm-asksheet__grab { display: flex; justify-content: center; padding: .6rem 0 1.4rem; cursor: grab; touch-action: none; }
.hm-asksheet__grab i { display: block; width: 4.2rem; height: .5rem; border-radius: 1rem; background: color-mix(in srgb, var(--t-bright) 22%, transparent); }
.hm-asksheet__x { position: absolute; top: 1.2rem; right: 1.2rem; display: grid; place-items: center; width: 4.4rem; height: 4.4rem; padding: 0;
  border: 0; border-radius: 50%; background: color-mix(in srgb, var(--t-bright) 7%, transparent); color: var(--t-bright); font-size: 1.8rem; cursor: pointer; }
.hm-asksheet__x:hover { background: color-mix(in srgb, var(--t-bright) 12%, transparent); }
.hm-asksheet__x:focus-visible, .hm-asksheet__send:focus-visible, .hm-asksheet__row button:focus-visible { outline: .3rem solid var(--accent); outline-offset: .2rem; }
.hm-asksheet__head { display: flex; align-items: center; gap: 1.2rem; margin: 0 0 1.6rem; padding-right: 4.4rem; touch-action: none; }
.hm-asksheet__avatar { flex: none; width: 5.2rem; height: 5.2rem; padding: .2rem; border-radius: 50%; object-fit: contain;
  background: color-mix(in srgb, var(--accent) 22%, transparent); }
.hm-asksheet p.hm-asksheet__t { margin: 0; font: 600 1.9rem/1.25 var(--_font-accent); color: var(--t-bright); text-wrap: balance; }
.hm-asksheet p.hm-asksheet__sub { margin: .4rem 0 0; font-size: 1.4rem; line-height: 1.45; color: var(--t-medium); text-wrap: pretty; }
.hm-asksheet__label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
.hm-asksheet__form[hidden], .hm-asksheet__sent[hidden] { display: none; }
textarea.hm-asksheet__q { display: block; width: 100%; min-height: 7.2rem; margin: 0; padding: 1.3rem 1.6rem; border: 1px solid color-mix(in srgb, var(--t-bright) 14%, transparent);
  border-radius: 1.8rem; background: color-mix(in srgb, var(--t-bright) 3%, transparent); color: var(--t-bright);
  font: 400 1.7rem/1.45 var(--_font-default); resize: none; outline: none; box-shadow: none; transition: border-color .2s ease, box-shadow .2s ease; }
textarea.hm-asksheet__q::placeholder { color: var(--t-muted); opacity: 1; }
textarea.hm-asksheet__q:focus { border-color: var(--accent); box-shadow: 0 0 0 .3rem color-mix(in srgb, var(--accent) 28%, transparent); }
.hm-asksheet.is-empty textarea.hm-asksheet__q { animation: hm-ask-nudge .4s ease; border-color: #e5484d; }
@keyframes hm-ask-nudge { 20%, 60% { transform: translateX(-.6rem); } 40%, 80% { transform: translateX(.6rem); } }
.hm-asksheet__send { display: flex; align-items: center; justify-content: center; gap: .8rem; width: 100%; min-height: 5.2rem; margin: 1.2rem 0 0;
  padding: 0 2rem; border: 0; border-radius: 10rem; background: var(--accent); color: #161616; font: 600 1.7rem/1 var(--_font-default); cursor: pointer;
  box-shadow: 0 1.2rem 2.4rem -1.2rem color-mix(in srgb, var(--accent) 80%, transparent); transition: transform .2s ease; }
.hm-asksheet__send:active { transform: scale(.98); }
.hm-asksheet p.hm-asksheet__fine { margin: 1.1rem 0 0; font-size: 1.25rem; line-height: 1.4; color: var(--t-muted); text-align: center; }
.hm-asksheet__fine a, .hm-asksheet__sub a { color: inherit; text-decoration: underline; text-underline-offset: .2em; white-space: nowrap; }
.hm-asksheet.is-sent .hm-asksheet__head { display: none; }
.hm-asksheet__sent { padding: .4rem 0 .4rem; text-align: center; }
.hm-asksheet__check { display: inline-grid; place-items: center; width: 6rem; height: 6rem; margin: 0 0 1.2rem; border-radius: 50%;
  background: color-mix(in srgb, var(--accent) 24%, transparent); color: var(--t-bright); font-size: 2.6rem; }
.hm-asksheet__row { display: flex; gap: .8rem; margin-top: 1.8rem; }
.hm-asksheet__row button { flex: 1; min-height: 4.8rem; padding: 0 1.6rem; border-radius: 10rem; font: 600 1.5rem/1 var(--_font-default); cursor: pointer; }
.hm-asksheet__again { border: 1px solid color-mix(in srgb, var(--t-bright) 18%, transparent); background: transparent; color: var(--t-bright); }
.hm-asksheet__done { border: 0; background: var(--base-opp); color: var(--base); }
@media (min-width: 768px) {
  .hm-asksheet { align-items: center; padding: 2.4rem; }
  .hm-asksheet__card { width: min(52rem, 100%); max-height: calc(100dvh - 4.8rem); padding: 2.8rem 2.8rem 2.4rem; border-radius: 2.8rem;
    box-shadow: 0 3rem 8rem -2.4rem rgba(0, 0, 0, .5); opacity: 0; transform: translateY(1.6rem) scale(.97);
    transition: transform .45s cubic-bezier(.2, .9, .3, 1.1), opacity .3s ease; }
  .hm-asksheet.is-in .hm-asksheet__card { opacity: 1; transform: none; }
  .hm-asksheet.is-out .hm-asksheet__card { opacity: 0; transform: translateY(.8rem) scale(.98); transition: transform .25s ease, opacity .25s ease; }
  .hm-asksheet__grab { display: none; }
  .hm-asksheet__head { margin-bottom: 2rem; touch-action: auto; }
  .hm-asksheet__avatar { width: 6rem; height: 6rem; }
  .hm-asksheet p.hm-asksheet__t { font-size: 2.2rem; }
}
@media (prefers-reduced-motion: reduce) {
  .hm-asksheet__card, .hm-asksheet.is-out .hm-asksheet__card { transform: none !important; transition: opacity .2s ease !important; }
  .hm-asksheet:not(.is-in) .hm-asksheet__card { opacity: 0; }
  .hm-asker, textarea.hm-asksheet__q { transition: none; }
  .hm-asksheet.is-empty textarea.hm-asksheet__q { animation: none; }
}

/* ── Get started: one question at a time (the founder: "make the /get-started page more of a typeform esque setup").
   Every step is stacked in one stage; the current one sits in it, the ones before have slid up out of it and the
   ones after wait below, so moving on is the questions sliding up through a window (no fades). A thin bar counts
   the answers. Big type for the question, a borderless input with one line under it, OK and "press Enter". ───── */
.hm-tf-section { padding: 5.6rem 0 4rem; }
.hm-consent { display: flex; gap: 1rem; align-items: flex-start; font-size: 1.4rem; line-height: 1.45; color: var(--t-medium); margin: 0; }
.hm-consent input { width: 1.8rem; height: 1.8rem; margin-top: .2rem; flex: none; accent-color: var(--accent); }
.hm-consent a { color: inherit; text-decoration: underline; text-underline-offset: .15em; }
.hm-tf { position: relative; max-width: 100rem; margin: 0 auto; }
.hm-tf__bar { position: relative; height: .4rem; border-radius: .4rem; overflow: hidden; background: var(--st-muted); }
.hm-tf__bar i { position: absolute; inset: 0; border-radius: inherit; background: var(--accent); transform: scaleX(0); transform-origin: left center;
  transition: transform .6s cubic-bezier(.2,.8,.2,1); }
.hm-tf__stage { position: relative; overflow: hidden; min-height: max(56rem, calc(100svh - 22rem)); }
.hm-tf__step { position: absolute; inset: 0; display: flex; flex-direction: column; justify-content: center; align-items: flex-start; gap: 2rem;
  padding: 4rem 0 8rem; transform: translateY(100%); visibility: hidden;
  transition: transform .7s cubic-bezier(.2,.8,.2,1), visibility 0s linear .7s; }
.hm-tf__step.is-past { transform: translateY(-100%); }
.hm-tf__step.is-active { transform: none; visibility: visible; transition: transform .7s cubic-bezier(.2,.8,.2,1), visibility 0s; }
.hm-tf__q { display: flex; align-items: baseline; gap: 1.4rem; margin: 0; }
.hm-tf__num { display: inline-flex; align-items: center; gap: .4rem; flex: none; font: 600 2rem/1 var(--_font-accent); color: var(--hm-accent-ink); }
.hm-tf__num i { font-size: 1.6rem; }
.hm-tf__title { margin: 0; font: normal 600 4.8rem/1.1 var(--_font-accent); letter-spacing: -.04rem; color: var(--t-bright); text-wrap: balance; }
.hm-tf__title b { font-weight: 600; color: var(--accent); }
/* where the code went: a long email address breaks rather than running out of the column */
.hm-tf__title [data-sent-to], .hm-tf__title [data-mailed-to] { overflow-wrap: anywhere; }
.hm-tf__title--xl { font-size: 7.2rem; line-height: 1.02; }
.hm-tf__eyebrow { margin: 0; font-size: 1.3rem; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: var(--hm-accent-ink); }
.hm-tf__hint { max-width: 62rem; margin: 0; font-size: 1.9rem; line-height: 1.5; color: var(--t-medium); }
.hm-tf__hint a, .hm-tf__small a, .hm-tf__alt a { color: inherit; text-decoration: underline; text-underline-offset: .2em; }
.hm-tf__input { width: 100%; margin-top: 1.2rem; padding: 1rem 0 1.4rem !important; border: 0 !important; border-bottom: 2px solid var(--st-muted) !important;
  border-radius: 0 !important; background: transparent !important; font: 400 3.4rem/1.25 var(--_font-accent) !important; color: var(--t-bright);
  outline: none; transition: border-color .25s ease; }
.hm-tf__input::placeholder { color: var(--t-muted-extra); opacity: 1; }
.hm-tf__input:focus { border-bottom-color: var(--accent) !important; }
.hm-tf__actions { display: flex; align-items: center; gap: 1.6rem; margin-top: .8rem; }
.hm-tf__ok { display: inline-flex; align-items: center; gap: .8rem; height: 5.4rem; padding: 0 2.6rem; border: 0; border-radius: 99rem;
  background: var(--base-opp); color: var(--t-opp-bright); font: 600 1.9rem/1 var(--_font-accent); cursor: pointer; transition: transform .2s ease; }
.hm-tf__ok:hover { transform: translateY(-2px); }
.hm-tf__ok:disabled { cursor: progress; transform: none; }
.hm-tf__ok:focus-visible, .hm-tf__nav button:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
/* Back, beside each question's OK (the founder, 2026-10-12: "add a back button too in the steps"): quieter than OK, and
   as tall as the row, so it matches OK at every size the page sets for it. */
.hm-tf__back { display: inline-flex; align-items: center; gap: .6rem; align-self: stretch; padding: 0 2rem; border: 1px solid var(--st-muted);
  border-radius: 99rem; background: transparent; color: var(--t-bright); font: 600 1.7rem/1 var(--_font-accent); cursor: pointer;
  transition: border-color .2s ease, transform .2s ease; }
.hm-tf__back:hover { border-color: var(--t-bright); transform: translateY(-2px); }
.hm-tf__back:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
.hm-tf__enter { font-size: 1.3rem; color: var(--t-muted); }
/* The first Start, the page's one big action: the founder, 2026-10-12, "make the start button much more prominent on this
   page its kinda hard to notice". Handyman green (the Save up to 50% pill's), larger, with a slow ring that stops for
   reduced motion; shorter where the window is short, so the intro still fits without scrolling. */
.hm-tf__ok[data-start] { position: relative; height: 7.2rem; padding: 0 4.4rem; gap: 1.2rem; background: #2f9e44; color: #fff;
  font: 700 2.4rem/1 var(--_font-accent); box-shadow: 0 1.4rem 3.2rem -1.2rem rgba(47, 158, 68, .6); transition: transform .2s ease, background .2s ease; }
.hm-tf__ok[data-start] i { font-size: 2.4rem; transition: transform .2s ease; }
.hm-tf__ok[data-start]:hover { background: #2b8a3e; }
.hm-tf__ok[data-start]:hover i { transform: translateX(.4rem); }
.hm-tf__ok[data-start]::after { content: ""; position: absolute; inset: -.6rem; border: 2px solid rgba(47, 158, 68, .5); border-radius: inherit;
  pointer-events: none; animation: hm-start-ring 2.4s ease-out infinite; }
@keyframes hm-start-ring { 0% { transform: scale(.94); opacity: .9; } 70%, 100% { transform: scale(1.1); opacity: 0; } }
@media (prefers-reduced-motion: reduce) { .hm-tf__ok[data-start]::after { animation: none; opacity: 0; } }
[color-scheme="dark"] .hm-tf__ok[data-start] { background: #51cf66; color: #0b2410; box-shadow: 0 1.4rem 3.2rem -1.2rem rgba(81, 207, 102, .5); }
[color-scheme="dark"] .hm-tf__ok[data-start]:hover { background: #69db7c; }
[color-scheme="dark"] .hm-tf__ok[data-start]::after { border-color: rgba(81, 207, 102, .5); }
@media only screen and (max-height: 860px) { .hm-tf__ok[data-start] { height: 6rem; padding: 0 3.6rem; font-size: 2.1rem; } }
@media only screen and (max-width: 767px) { .hm-tf__actions:has(> [data-start]) { align-self: stretch; width: 100%; }
  .hm-tf__ok[data-start] { flex: 1 1 auto; width: 100%; justify-content: center; } }
@media only screen and (max-width: 767px) and (max-height: 760px) { .hm-tf__ok[data-start] { height: 5.2rem; font-size: 1.9rem; } }
.hm-tf__enter b { font-weight: 700; color: var(--t-medium); }
@media (hover: none) { .hm-tf__enter { display: none; } }
.hm-tf__error { margin: 0; color: #c2410c; font-size: 1.6rem; line-height: 1.45; }
[color-scheme="dark"] .hm-tf__error { color: #fb923c; }
/* An email or a number that already has an account (2026-10-12): the way in, as a button under the line that says so,
   with what they typed filled in on the other side. */
.hm-tf__error .hm-tf__signin { display: flex; align-items: center; width: fit-content; min-height: 4.4rem; margin-top: .8rem; padding: 0 2rem;
  border-radius: 99rem; background: var(--base-opp); color: var(--t-opp-bright); font: 600 1.6rem/1 var(--_font-accent); text-decoration: none; }
.hm-tf__error .hm-tf__signin:hover { transform: translateY(-1px); }
/* In another language (?lang=, 2026-10-12): the way back to English, small, over the first screen's words; and the
   disclosure's English, a tap away under it. Words wrapped for translation read like the sentence around them (the
   theme makes every span in a paragraph bright and semibold); the countdown line keeps its look. */
.hm-tf__lang { margin: 0; font-size: 1.4rem; line-height: 1.4; }
.hm-tf__lang a { color: var(--t-medium); background: none; text-decoration: underline; text-underline-offset: .2em; }
.hm-tf__en { margin: 0; }
.hm-tf__en button { padding: 0; border: 0; background: none; font: inherit; color: inherit; text-decoration: underline;
  text-underline-offset: .15em; cursor: pointer; }
.hm-tf p span[data-i18n]:not([data-resend-wait]):not(.hm-tf__title), .hm-tf p span[translate="no"] { font-weight: inherit; color: inherit; }
.hm-tf__small { margin: 0; font-size: 1.5rem; line-height: 1.5; color: var(--t-muted); }
/* the ads' promises on the intro (launch film and ads lane): three short perks and their small print */
/* The three promises as pills (the founder, 2026-10-12: "Make the features like save up to 50% 90-day warranty etc into
   sexy pills"; 2026-10-13: "make the pills look nicer"): one set, each the same quiet pill (a hairline and a breath of
   the text colour, so it follows the theme) with its icon in a small soft dot of its own colour; a long translation
   wraps inside its pill. */
.hm-tf__perks { display: flex; flex-wrap: wrap; gap: .8rem; margin: 0; padding: 0; list-style: none; }
.hm-tf__perks li { --pill: var(--hm-accent-ink);
  display: inline-flex; align-items: center; gap: .7rem; max-width: 100%; min-height: 3.6rem; padding: .4rem 1.4rem .4rem .4rem;
  border-radius: 99rem; background: color-mix(in srgb, var(--t-bright) 4%, transparent);
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--t-bright) 11%, transparent);
  font-size: 1.45rem; font-weight: 600; line-height: 1.25; color: var(--t-bright); }
.hm-tf__perks li:nth-child(1) { --pill: #2f9e44; }
.hm-tf__perks li:nth-child(3) { --pill: #2b7bd6; }
.hm-tf__perks i { display: grid; place-items: center; flex: none; width: 2.6rem; height: 2.6rem; border-radius: 50%;
  background: color-mix(in srgb, var(--pill) 14%, transparent); color: var(--pill); font-size: 1.45rem; }
[color-scheme="dark"] .hm-tf__perks li:nth-child(1) { --pill: #69db7c; }
[color-scheme="dark"] .hm-tf__perks li:nth-child(3) { --pill: #74c0fc; }
[color-scheme="dark"] .hm-tf__perks i { background: color-mix(in srgb, var(--pill) 20%, transparent); }
/* six boxes of up to 7.2rem: in a narrower column (1024 x 768's 411 px) they share it rather than run out of it */
.hm-tf .hm-code { display: grid; grid-template-columns: repeat(6, minmax(0, 7.2rem)); gap: 1rem; margin: .8rem 0 0; }
.hm-tf .hm-code input { width: 100% !important; min-width: 0; height: 8.4rem; padding: 0 !important; border: 2px solid var(--st-muted) !important; border-radius: 1.6rem !important;
  background: var(--base-tint) !important; font: 600 3.6rem/1 var(--_font-accent) !important; color: var(--t-bright); text-align: center; }
.hm-tf .hm-code input:focus { border-color: var(--accent) !important; outline: none; }
/* Where the code goes: two pills under the phone number. The radio buttons stay, for the keyboard and screen readers;
   the pill shows which one is picked. Under them the fine print, as one block, right above Continue. */
.hm-via { display: flex; flex-wrap: wrap; align-items: center; gap: .8rem; margin-top: -.4rem; }
.hm-via__label { margin-right: .4rem; font-size: 1.5rem; color: var(--t-medium); }
.hm-via__opt { position: relative; display: inline-flex; cursor: pointer; }
.hm-via__opt input { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
.hm-via__opt span { display: inline-flex; align-items: center; gap: .6rem; min-height: 4.4rem; padding: 0 1.8rem; border: 1px solid var(--st-muted);
  border-radius: 99rem; font: 600 1.5rem/1 var(--_font-accent); color: var(--t-medium); transition: border-color .2s ease, background-color .2s ease, color .2s ease; }
.hm-via__opt:hover span { border-color: var(--t-bright); }
.hm-via__opt input:checked + span { border-color: var(--base-opp); background: var(--base-opp); color: var(--t-opp-bright); }
.hm-via__opt input:focus-visible + span { outline: 2px solid var(--accent); outline-offset: 3px; }
.hm-via__opt b { font: inherit; color: inherit; }
/* An invite code on the last question, the number's (geographic access, phase 4): a quiet link until it is wanted, then one short pill
   field on the same line, so the question is no taller with it open. */
.hm-invite { display: flex; flex-wrap: wrap; align-items: center; gap: .8rem 1.2rem; margin-top: -1rem; }
.hm-tf__error:not([hidden]) + .hm-invite { margin-top: 0; }
.hm-invite__open { display: inline-flex; align-items: center; min-height: 4.4rem; padding: 0; border: 0; background: none;
  font: 600 1.5rem/1.3 var(--_font-accent); color: var(--t-medium); text-decoration: underline; text-underline-offset: .2em; cursor: pointer; }
.hm-invite__open:hover { color: var(--t-bright); }
.hm-invite__open:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
.hm-invite__open[hidden], .hm-invite__box[hidden] { display: none; }
.hm-invite__box { display: flex; flex-wrap: wrap; align-items: center; gap: .8rem 1.2rem; }
.hm-invite__label { font-size: 1.5rem; color: var(--t-medium); }
.hm-invite__input { width: 18ch; max-width: 100%; min-height: 4.4rem; padding: .6rem 1.6rem !important; border: 1px solid var(--st-muted) !important;
  border-radius: 99rem !important; background: transparent !important; color: var(--t-bright) !important;
  font: 700 1.7rem/1.2 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace !important; letter-spacing: .12em; text-transform: uppercase;
  outline: none; box-shadow: none !important; transition: border-color .2s ease; }
.hm-invite__input::placeholder { color: var(--t-muted-extra); opacity: 1; }
.hm-invite__input:focus { border-color: var(--accent) !important; }
/* The kind of home (Day 3 lane O2): tiles, two to a row, each its name and one plain line of what makes a home that
   kind. The radio stays for the keyboard and screen readers; the tile shows which is picked. "Something else" and
   "Not sure" are dashed: Handyman's guess, said as one. */
.hm-kind { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .8rem; width: 100%; max-width: 72rem; }
.hm-kind__opt { position: relative; display: flex; min-width: 0; cursor: pointer; container-type: inline-size; }
.hm-kind__opt input { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
.hm-kind__opt span { display: grid; grid-template-columns: minmax(0, 1fr) auto; grid-template-rows: auto 1fr;
  grid-template-areas: "name name" "line art"; gap: .3rem .8rem; width: 100%; min-height: 4.4rem; padding: 1.2rem 1.4rem;
  border: 1px solid var(--st-muted); border-radius: 1.6rem; background: var(--base-tint);
  transition: border-color .2s ease, background-color .2s ease; }
.hm-kind__opt b { grid-area: name; font: 600 1.7rem/1.2 var(--_font-accent); color: var(--t-bright); }
.hm-kind__opt small { grid-area: line; align-self: start; font-size: 1.35rem; line-height: 1.35; color: var(--t-medium); }
.hm-kind__opt--quiet span { border-style: dashed; background: transparent; }
.hm-kind__opt:hover span { border-color: var(--t-bright); }
.hm-kind__opt input:checked + span { border: 2px solid var(--accent); border-style: solid; padding: 1.1rem 1.3rem;
  background: color-mix(in srgb, var(--accent) 12%, var(--base-tint)); }
.hm-kind__opt input:focus-visible + span { outline: 2px solid var(--accent); outline-offset: 3px; }
/* No hint under this question at any size: the mascot's line beside or above it says the same ("Houses, townhouses and
   condos need different upkeep"). A computer or a tablet always went without it; since the tiles' drawings, a phone does
   too, and its room goes to them (Spanish and French tiles run a line longer). A computer or a tablet: tighter tiles,
   so the eight fit the questions' window without it scrolling. */
.hm-gs [data-step="type"] .hm-tf__hint { display: none; }
@media only screen and (min-width: 768px) {
  .hm-kind__opt span { gap: .15rem .8rem; min-height: 0; padding: .9rem 1.2rem; border-radius: 1.4rem; }
  .hm-kind__opt input:checked + span { padding: .8rem 1.1rem; }
  .hm-kind__opt b { font-size: 1.6rem; }
  .hm-kind__opt small { font-size: 1.3rem; line-height: 1.3; }
}
/* A laptop's short window (1280x800, 1024x768): a smaller question and tighter gaps on this step. Measured: the step
   scrolled 49px at 1280x800 and 37px at 375x667; with the drawings, 18px at 1024x768 until its top padding halved. */
@media only screen and (min-width: 768px) and (max-height: 860px) {
  .hm-gs .hm-tf__step[data-step="type"] { gap: 1.2rem; padding-top: 2.4rem; padding-bottom: .8rem; }
  .hm-gs [data-step="type"] .hm-tf__title { font-size: 4rem; }
  .hm-gs .hm-kind { gap: .6rem; }
  .hm-gs .hm-kind__opt span { padding: .7rem 1.1rem; }
  .hm-gs .hm-kind__opt input:checked + span { padding: .6rem 1rem; }
}
@media only screen and (max-width: 767px) {
  .hm-kind { gap: .6rem; }
  .hm-kind__opt span { padding: .9rem 1rem; border-radius: 1.2rem; }
  .hm-kind__opt input:checked + span { padding: .8rem .9rem; }
  .hm-kind__opt b { font-size: 1.5rem; }
  .hm-kind__opt small { font-size: 1.2rem; line-height: 1.3; }
}
/* Each tile's drawing (the home-type visuals lane, 2026-10-12): its own small loop (motion/src/scenes/hometypes) in a
   rounded box of the drawing's own light ground, the same in both themes, as the site's other drawings are. Its poster
   is the tile's icon, and handyman.js plays it while the tile is pointed at, focused or picked (on a phone, while the
   question is on screen); the picked tile's box takes the accent. It takes no room the words need: on a narrow tile it
   sits in the corner beside the line under the name, on a wide one (the container query) beside the name and the line
   together, a little bigger. Its box is sized before anything loads, so nothing moves when the video starts, and a kind
   without a render shows its line icon in the same box. */
.hm-kind__art { grid-area: art; align-self: end; position: relative; display: block; width: 3.4rem; height: 3.4rem; overflow: hidden;
  border-radius: .9rem; background: #FAFAFA; box-shadow: 0 0 0 1px rgba(22, 22, 22, .07); transition: box-shadow .2s ease; }
.hm-kind__art video { display: block; width: 100%; height: 100%; object-fit: cover; }
.hm-kind__art .ph { display: grid; place-items: center; width: 100%; height: 100%; font-size: 2rem; color: #4A4D53; }
.hm-kind__opt input:checked + span .hm-kind__art { box-shadow: 0 0 0 2px var(--accent); }
@media only screen and (max-width: 767px) {
  .hm-kind__art { width: 3rem; height: 3rem; border-radius: .8rem; }
  .hm-kind__art .ph { font-size: 1.8rem; }
}
/* a short phone (375x667) keeps the eight on screen with the drawings in: tighter tiles (it scrolled 17px without; the
   title's room under the arrows took 2px more, given back here a half pixel at a time) */
@media only screen and (max-width: 767px) and (max-height: 760px) {
  .hm-gs .hm-kind { gap: .5rem; }
  .hm-gs .hm-kind__opt span { padding: .65rem .9rem; }
  .hm-gs .hm-kind__opt input:checked + span { padding: .55rem .8rem; }
  .hm-gs [data-step="type"] .hm-tf__actions { margin-top: .6rem; }
}
@container (min-width: 240px) {
  .hm-kind__opt span { grid-template-areas: "name art" "line art"; column-gap: 1.2rem; }
  .hm-kind__art { align-self: center; width: 5rem; height: 5rem; border-radius: 1.2rem; }
  .hm-kind__art .ph { font-size: 2.8rem; }
}
/* Another language's lines run longer (Get started fits in every language, 2026-10-12): on a narrow tile the name keeps
   the whole width, the drawing sits under it on the right and the line flows round it and on under it, instead of
   keeping beside the drawing all the way down (Spanish, French and German ran a line or two longer there, and the
   question scrolled). A wide tile keeps the drawing beside both, as in English. */
html:not([lang="en"]) .hm-kind__opt span { display: block; }
html:not([lang="en"]) .hm-kind__opt b, html:not([lang="en"]) .hm-kind__opt small { display: block; }
html:not([lang="en"]) .hm-kind__art { float: right; margin: .3rem 0 .2rem .8rem; }
@container (min-width: 240px) {
  html:not([lang="en"]) .hm-kind__opt span { display: grid; }
  html:not([lang="en"]) .hm-kind__art { float: none; margin: 0; }
}
.hm-tf__fine { display: flex; flex-direction: column; gap: .6rem; max-width: 64rem; font-size: 1.35rem; line-height: 1.5; color: var(--t-muted); }
.hm-tf__fine p { margin: 0; font-size: inherit; line-height: inherit; color: inherit; }
/* the theme sets every span in a paragraph semibold and bright (p span): the words that swap with a choice stay as
   the sentence around them */
[data-via-show], [data-sent-how], [data-sent-spam], [data-sent-wrong] { font-weight: inherit; color: inherit; }
.hm-tf__fine a { color: inherit; text-decoration: underline; text-underline-offset: .15em; }
/* The calls line (lane 26): its own box, in the fine print's words and colour (tools/calls-consent.js draws it). */
.hm-tf__calls { --hm-calls-accent: var(--accent); font-weight: inherit; color: inherit; }
.hm-tf__calls.hm-calls { padding: 0; }
.hm-tf__calls .hm-calls__words { font-weight: inherit; color: inherit; }
[color-scheme="dark"] .hm-tf__calls .hm-calls__box { color-scheme: dark; }
.hm-tf__nav { position: absolute; right: 0; bottom: 6rem; z-index: 2; display: flex; gap: .6rem; }
.hm-tf__nav button { display: grid; place-items: center; width: 4.6rem; height: 4.6rem; border: 1px solid var(--st-muted); border-radius: 50%;
  background: var(--base-tint); color: var(--t-bright); font-size: 1.8rem; cursor: pointer; transition: border-color .2s ease; }
.hm-tf__nav button:hover { border-color: var(--t-bright); }
.hm-tf[data-current="intro"] .hm-tf__nav, .hm-tf[data-current="handoff"] .hm-tf__nav { display: none; }
.hm-tf__alt { margin: 0; font-size: 1.4rem; line-height: 1.5; color: var(--t-muted); }
/* On a phone the vanity number starts its own line, and it never splits ("(1-" / "866-6-FIXNOW)" did; the
   founder, 2026-10-12: "Br there on mobile"). */
.hm-tf__alt-br { display: none; }
/* The theme makes every span in a paragraph bright and semibold (p span); this one reads like its line. */
.hm-tf__alt .hm-tf__alt-nowrap { white-space: nowrap; color: inherit; font-weight: inherit; }
/* …and the number itself never splits either, in any language's longer line. */
.hm-tf__alt a[dir="ltr"] { white-space: nowrap; }
@media only screen and (max-width: 767px) { .hm-tf__alt-br { display: inline; } }
@media only screen and (max-width: 767px) {
  .hm-tf-section { padding-top: 2.4rem; }
  .hm-tf__stage { min-height: max(54rem, calc(100svh - 18rem)); }
  .hm-tf__step { justify-content: flex-start; gap: 1.6rem; padding: 4rem 0 9rem; }
  .hm-tf__title { font-size: 3.2rem; }
  .hm-tf__title--xl { font-size: 4.8rem; }
  .hm-tf__q { flex-direction: column; gap: .8rem; }
  .hm-tf__hint { font-size: 1.6rem; }
  .hm-tf__input { font-size: 2.6rem !important; }
  .hm-tf .hm-code { grid-template-columns: repeat(6, minmax(0, 1fr)); gap: .6rem; width: 100%; }
  .hm-tf .hm-code input { height: 6.4rem; font-size: 2.8rem !important; border-radius: 1.2rem !important; }
  .hm-tf__nav { bottom: 2.4rem; }
}
@media only screen and (min-width: 1200px) {
  .hm-tf__title { font-size: 5.6rem; }
  .hm-tf__title--xl { font-size: 9.6rem; }
}
@media (prefers-reduced-motion: reduce) { .hm-tf__step, .hm-tf__bar, .hm-tf__bar i { transition: none !important; } }
/* Rayo slides the footer's giant word down from 340 px above it as the footer arrives; on a page one screen tall that
   puts it behind the questions, so this page's footer keeps its cards and drops the word. */
body:has(#hm-start) .mxd-footer__fullwidth-text { display: none; }


/* Links inside an article's lists read like the theme's paragraph links. */
.mxd-article__block li a { color: inherit; text-decoration: underline; text-underline-offset: 0.2em; }

/* Long words in an article title ("maintenance") are wider than a phone at the theme's title size. */
@media (max-width: 767px) {
  .mxd-article__title h2 { hyphens: auto; overflow-wrap: break-word; }
}

#hm-start [hidden] { display: none !important; }

/* The text number where it stands on its own (footer, contact, the text page): its vanity spelling,
   smaller, under it. In the footer's star row the star lines up with the number, not the pair. */
.hm-number{display:inline-flex;flex-direction:column;align-items:flex-start;line-height:1.15}
.hm-vanity{font-size:max(.55em,1.2rem);letter-spacing:.08em;margin-top:.35em;opacity:.7}
.mxd-point-subtitle:has(.hm-number){align-items:flex-start}
.mxd-point-subtitle:has(.hm-number) svg{margin-top:.3rem;flex:none}

/* The hero's pill slot keeps the theme's pill size (the theme sized it by the word "tech"; ours says
   "handled" for readers, invisibly), and handyman.js puts the pill on it. The top values are where the
   slot sits before the script runs: the second row on a computer, the third line on a phone. */
.mxd-hero-01__marquee{top:15.2rem}
@media only screen and (min-width:768px){
  .hero-01-title__item.title-item-transparent{width:290px;padding:0;justify-content:center;overflow:hidden}
  .mxd-hero-01__marquee{top:10.2rem;width:290px}
  .mxd-hero-01__marquee .marquee__item.item-regular p{font-size:6.4rem}
}
@media only screen and (min-width:1200px){
  /* wide enough for the whole word at every size (the founder: "make handled a bit wider so handled word fits in it fully");
     1200-1439 sets the word a little smaller so row 2 still fits the page */
  .hero-01-title__item.title-item-transparent{width:400px}
  .mxd-hero-01__marquee{width:400px}
  .mxd-hero-01__marquee .marquee__item.item-regular p{font-size:9.2rem}
  .mxd-hero-01__marquee{top:15.2rem}
}
@media only screen and (min-width:1600px){
  .hero-01-title__item.title-item-transparent{width:600px}
  .mxd-hero-01__marquee{width:600px}
  .mxd-hero-01__marquee .marquee__item.item-regular p{font-size:14rem}
  .mxd-hero-01__marquee{top:17.4rem}
}
/* On a phone the headline scales with the screen so "Everything in", its widest line, holds one line: it
   measures 6.28 font-sizes wide in Chromium (narrower in Safari) and the column is the screen less 6rem,
   so the size is that column over 6.4, capped at the theme's 6rem. The pill's word scales with it. */
@media only screen and (max-width:767px){
  .hero-01-title,.mxd-hero-01__marquee .marquee__item.item-regular p{font-size:min(6rem,calc((100vw - 6rem) / 6.4))}
}

/* The footer's star rows on a phone: the star keeps its size (it shrank to nothing beside the longer
   handyman@wereno.com), and the words scale so the address holds one line. It measures 11.7 font-sizes
   wide; the room is the screen less the page's and the card's padding and the star (14.9rem). */
.mxd-point-subtitle svg{flex:none}
@media only screen and (max-width:767px){
  .footer-blocks__card .mxd-point-subtitle{font-size:min(2.2rem,calc((100vw - 14.9rem) / 11.7))}
}

/* ── Animated slots (tools/anim.py): a placeholder with a Remotion render is a looping video. The theme's
   <img> rules are copied to it (css/hm-anim.css); these are the few a video needs on top. A background slot
   gets a video child that fills it, under the element's own content. ───────────────────────────────────── */
video:where(.hm-anim) { display: block; object-fit: cover; border-radius: inherit; background: transparent; }
[data-hm-bg] { isolation: isolate; }
video.hm-anim-bg { position: absolute; inset: 0; width: 100%; height: 100%; z-index: -1; pointer-events: none; }
/* The inner pages' headline pill: the video takes the ::before's place in the line (its box is mirrored). */
[data-hm-pill]::before { display: none !important; }
video:where(.hm-anim-pill) { display: inline-block; vertical-align: baseline; }

/* Stats cards: the theme floats transparent 3D renders out of these cards with offsets (top 4rem,
   bottom -4rem, left/right -4rem/-6rem). Every slot here is opaque (an animation or its placeholder), so
   each offset showed the card's own colour as a band ("fix the dark gap above the image video ... make
   sure it doesnt happen anywhere"), and fixed-share panels left video space unused ("lots of space to
   expand the videos"). So from 768 up each card is a two-column grid: the words take exactly the width
   they need, the media fills the rest, flush to the card's edges, rounded on the side facing the words
   ("lets add radius"; a fade was tried and dropped: "fade looks tacky"). A phone stacks the words over a
   flush bottom panel. The count-up (countUp.js, scroll-spy on the number itself) is unaffected by the
   counter becoming display: contents. */
.mxd-stats-cards__inner .mxd-stats-cards__image > img,
.mxd-stats-cards__inner .mxd-stats-cards__image > video { width: 100%; height: 100%; max-width: none; object-fit: cover; display: block; }
.mxd-stats-cards__image { top: 32rem; bottom: 0; left: 0; right: 0; width: auto; max-width: none; height: auto; padding: 0;
  overflow: hidden; border-radius: 2.4rem 2.4rem 0 0; }
@media only screen and (min-width: 768px) {
  .mxd-stats-cards__inner:has(> .mxd-stats-cards__image) { display: grid; column-gap: 2.4rem; row-gap: 0; grid-template-rows: auto auto 1fr auto; }
  .mxd-stats-cards__inner:has(> .mxd-stats-cards__image) > .mxd-counter { display: contents; }
  .mxd-stats-cards__inner > .mxd-counter > .mxd-counter__number { grid-area: num; }
  .mxd-stats-cards__inner > .mxd-counter > .mxd-counter__descr { grid-area: desc; }
  .mxd-stats-cards__inner > .mxd-stats-cards__btngroup { grid-area: btn; }
  /* align-self: the right-aligned cards (.align-end) set align-items: flex-end, which would shrink the media to its
     own height at the bottom of its area and leave a band above it */
  .mxd-stats-cards__inner > .mxd-stats-cards__image { grid-area: media; align-self: stretch; position: relative; inset: auto; width: auto; max-width: none; height: auto; padding: 0; }
  /* media on the left, words on the right */
  .mxd-stats-cards__inner:has(> .mxd-stats-cards-image-1) { grid-template-columns: minmax(0, 1fr) max-content; grid-template-areas: "media num" "media desc" "media ." "media btn"; }
  .mxd-stats-cards__inner:has(> .mxd-stats-cards-image-2) { grid-template-columns: minmax(0, 1fr) max-content; grid-template-rows: auto 1fr auto auto; grid-template-areas: "media btn" "media ." "media num" "media desc"; }
  .mxd-stats-cards__inner:is(:has(> .mxd-stats-cards-image-1), :has(> .mxd-stats-cards-image-2)) > .mxd-stats-cards__btngroup,
  .mxd-stats-cards__inner:is(:has(> .mxd-stats-cards-image-1), :has(> .mxd-stats-cards-image-2)) > .mxd-counter > * { justify-self: end; text-align: right; }
  .mxd-stats-cards__image:is(.mxd-stats-cards-image-1, .mxd-stats-cards-image-2) { margin: -3.6rem 0 -3.6rem -4rem; border-radius: 0 2.4rem 2.4rem 0; }
  /* words on the left, media on the right */
  .mxd-stats-cards__inner:has(> .mxd-stats-cards-image-3) { grid-template-columns: max-content minmax(0, 1fr); grid-template-areas: "num media" "desc media" ". media" "btn media"; }
  .mxd-stats-cards__image.mxd-stats-cards-image-3 { margin: -3.6rem -4rem -3.6rem 0; border-radius: 2.4rem 0 0 2.4rem; }
  /* "2 min": its number is wider than its words, so the number spans the top and the media fills in beside the words */
  .mxd-stats-cards__inner:has(> .mxd-stats-cards-image-4) { grid-template-columns: max-content minmax(0, 1fr); grid-template-areas: "num num" "desc media" ". media" "btn media"; }
  .mxd-stats-cards__image.mxd-stats-cards-image-4 { margin: 2.8rem -4rem -3.6rem 0; border-radius: 2.4rem 0 0 0; }
  /* a card too narrow for the words and a useful panel (three to a row, about 1200-1300px): no panel */
  .mxd-stats-cards__inner { container-type: inline-size; }
  @container (max-width: 440px) { .mxd-stats-cards__image:is(.mxd-stats-cards-image-3, .mxd-stats-cards-image-4) { display: none; } }
}

/* Floating media (no card around it: the hero tiles, the text page's promos, the pros photo, the 404 page):
   the app's 24px radius, a hairline ring so the edge reads on a dark page, and a soft shadow, instead of
   hard squares ("these look too square and brash lets add radius"). A feathered fade was tried first and
   dropped ("fade looks tacky"): edges stay crisp. */
:is(.hero-01-image, .hero-00-image, .career__image, .mxd-features-promo__image, .mxd-resp-promo__image, .mxd-floating-img__item) > :is(img, video) {
  /* on the media itself: the theme moves it inside a taller wrapper for its parallax, so the wrapper can't clip */
  border-radius: 2.4rem;
  box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.18), 0 28px 60px -28px rgba(0, 0, 0, 0.45);
}

/* Service cards: on a tablet the picture is inset to the text's margins and runs off the card's foot; on a
   computer it fills the right side and bleeds off the edge. Square corners there read as a mistake; the
   app's radius makes both read as intended. */
.services-stack__image .service-img { border-radius: 2.4rem 2.4rem 0 0; }
@media only screen and (min-width: 1200px) { .services-stack__image .service-img { border-radius: 2.4rem 0 0 2.4rem; } }

/* Hero: the circles either side of Get started sit behind the heading (the founder, of the first one: "move the keys
   behind the heading title"). The theme lifts tiles 2 and 3 above the title with z-index 1; at 0 the title, later in
   the page, paints over them. The second circle (image-04) is ours: the theme's size and place for the third, mirrored
   (handyman.js sets both beside the button). */
.hero-01-image:is(.image-03, .image-04) { z-index: 0; }
.hero-01-image.image-04 { width: 100px; top: 90%; left: auto; right: 35%; }
@media only screen and (min-width: 1200px) { .hero-01-image.image-04 { width: 140px; top: 80%; right: 42%; } }
@media only screen and (min-width: 1600px) { .hero-01-image.image-04 { width: 180px; top: 76%; right: 38%; } }
/* On a tablet the theme's 100 px left the house card and the circles' words too small to read: a little bigger. */
@media only screen and (min-width: 768px) and (max-width: 1199px) {
  .hero-01-image.image-02 { width: 140px; }
  .hero-01-image:is(.image-03, .image-04) { width: 120px; }
}

/* The two-line image marquee's word cards each carry an animation above their words, so no card is a bare
   purple block (and no two say the same thing: build.py). */
.marquee__item.has-caption:has(.hm-cap-media) { display: flex; flex-direction: column; justify-content: space-between; gap: 1.6rem; }
.marquee__item.has-caption .hm-cap-media { flex: 1 1 auto; min-height: 0; border-radius: 1.8rem; overflow: hidden;
  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.18), 0 18px 40px -22px rgba(0, 0, 0, 0.35); }
.marquee__item.has-caption .hm-cap-media > :is(img, video) { width: 100%; height: 100%; object-fit: cover; display: block; border-radius: 0; }

/* "What it does", scrolling under the home page's big video: the dashboard's pills (a tinted icon tile and a
   few words), full width, hard edges (no fade: the founder finds fades tacky), following the theme's light
   and dark colours. */
.hm-cando { margin-top: 3.2rem; overflow: hidden; }
.hm-cando__track { display: flex; flex-wrap: nowrap; gap: 1.2rem; width: max-content; padding: 0.4rem 0.6rem; }
.hm-cando__item { display: inline-flex; align-items: center; gap: 1.2rem; flex: none; padding: 1rem 2.2rem 1rem 1rem;
  border-radius: 99rem; background: var(--base-tint); color: var(--t-bright); box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.18);
  white-space: nowrap; font: var(--fw-medium) 1.7rem/1 var(--_font-default); }
.hm-cando__icon { width: 4.2rem; height: 4.2rem; border-radius: 1.4rem; display: grid; place-items: center; font-size: 2.1rem; flex: none; }
.hm-cando__icon.tone-go { background: rgba(76, 175, 80, 0.14); color: #3f9a44; }
.hm-cando__icon.tone-ai { background: rgba(159, 139, 231, 0.2); color: #7a62d6; }
.hm-cando__icon.tone-you { background: rgba(230, 160, 50, 0.18); color: #b97716; }
@media only screen and (min-width: 1200px) { .hm-cando { margin-top: 4rem; } .hm-cando__item { font-size: 1.9rem; } }

/* "Things you can text it": each example plays as a chat in its own channel's bubbles (iMessage blue, SMS green,
   WhatsApp's light green with ticks): their message lands, Handyman types, the reply appears, it holds, and the
   loop starts again. No phone frame. Reduced motion shows the finished chat. */
.hm-chat { display: flex; flex-direction: column; gap: 0.5rem; margin: 0 0 1.6rem; font: 400 1.5rem/1.3 -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI", Roboto, sans-serif; }
.hm-chat__row { display: flex; }
/* The typing dots sit where the reply will start, in the same grid cell, so the cell is always the reply's height:
   nothing in a card grows or shrinks while the chat plays, so the slider and the page under it never move (the
   founder, 2026-10-11: "Prevent this section cards from going bigger smaller just keep them the right size as whole
   page jumps up and down"). The rows used to animate height 0 to auto, which also left the iMessage reply's words
   spilling out of a collapsed bubble on an iPhone ("fix the iMessage one its messed up"). */
.hm-chat__slot { display: grid; }
.hm-chat__slot > .hm-chat__row { grid-area: 1 / 1; min-width: 0; }
.hm-chat__slot > .hm-chat__row--typing { align-self: start; }
.hm-chat__row--out { justify-content: flex-end; }
.hm-chat__row--in { justify-content: flex-start; }
.hm-chat__b { position: relative; max-width: 84%; margin: 0; padding: 0.8rem 1.25rem; border-radius: 1.9rem; word-wrap: break-word; }
.hm-chat__photo { width: 9.5rem; max-width: 50%; aspect-ratio: 1; object-fit: cover; border-radius: 1.6rem; display: block; }
.hm-chat__meta { align-self: flex-end; margin-top: -0.2rem; font-size: 1.1rem; color: var(--t-medium); }
.hm-chat__typing { display: inline-flex; gap: 0.4rem; align-items: center; padding: 1.1rem 1.3rem; }
.hm-chat__typing i { width: 0.75rem; height: 0.75rem; border-radius: 50%; background: currentColor; opacity: 0.45; animation: hm-dot 1.1s infinite ease-in-out; }
.hm-chat__typing i:nth-child(2) { animation-delay: 0.15s; }
.hm-chat__typing i:nth-child(3) { animation-delay: 0.3s; }
@keyframes hm-dot { 0%, 60%, 100% { transform: translateY(0); opacity: 0.35; } 30% { transform: translateY(-0.35rem); opacity: 0.8; } }
/* iMessage and SMS (iOS): blue or green going out, grey coming in, a tail on each */
.hm-chat--imessage .hm-chat__b--out { background: #0a84ff; color: #fff; border-bottom-right-radius: 0.6rem; }
.hm-chat--sms .hm-chat__b--out { background: #34c759; color: #fff; border-bottom-right-radius: 0.6rem; }
.hm-chat:is(.hm-chat--imessage, .hm-chat--sms) .hm-chat__b--in { background: #e9e9eb; color: #111; border-bottom-left-radius: 0.6rem; }
/* WhatsApp: light green going out with grey ticks, white coming in */
.hm-chat--whatsapp .hm-chat__b { border-radius: 1.2rem; box-shadow: 0 1px 0.5px rgba(11, 20, 26, 0.13); }
.hm-chat--whatsapp .hm-chat__b--out { background: #d9fdd3; color: #111b21; border-top-right-radius: 0.3rem; padding-right: 3.6rem; }
.hm-chat--whatsapp .hm-chat__b--in { background: #fff; color: #111b21; border-top-left-radius: 0.3rem; }
.hm-chat__ticks { position: absolute; right: 0.9rem; bottom: 0.5rem; font-size: 1.05rem; letter-spacing: -0.3rem; color: #53bdeb; }
@media (prefers-color-scheme: dark) { :root:not([color-scheme="light"]) .hm-chat:is(.hm-chat--imessage, .hm-chat--sms) .hm-chat__b--in { background: #3a3a3c; color: #fff; } }
[color-scheme="dark"] .hm-chat:is(.hm-chat--imessage, .hm-chat--sms) .hm-chat__b--in { background: #3a3a3c; color: #fff; }
[color-scheme="dark"] .hm-chat--whatsapp .hm-chat__b--out { background: #005c4b; color: #e9edef; }
[color-scheme="dark"] .hm-chat--whatsapp .hm-chat__b--in { background: #202c33; color: #e9edef; }
/* the 9-second loop: message in, typing, reply, hold, clear */
@media (prefers-reduced-motion: no-preference) {
  .hm-chat__row--out { animation: hm-chat-out 9s infinite both; transform-origin: right bottom; }
  .hm-chat__meta { animation: hm-chat-out 9s infinite both; }
  .hm-chat__row--typing { animation: hm-chat-typing 9s infinite both; transform-origin: left top; }
  .hm-chat__row--reply { animation: hm-chat-reply 9s infinite both; transform-origin: left top; }
  .hm-chat__row--out:has(.hm-chat__photo) { animation-name: hm-chat-photo; }
}
@media (prefers-reduced-motion: reduce) { .hm-chat__row--typing { display: none; } }
@keyframes hm-chat-photo { 0% { opacity: 0; transform: scale(0.85) translateY(0.6rem); } 4%, 90% { opacity: 1; transform: none; } 96%, 100% { opacity: 0; transform: none; } }
@keyframes hm-chat-out { 0%, 5% { opacity: 0; transform: scale(0.85) translateY(0.6rem); } 9%, 90% { opacity: 1; transform: none; } 96%, 100% { opacity: 0; transform: none; } }
@keyframes hm-chat-typing { 0%, 13% { opacity: 0; transform: scale(0.8); } 15%, 30% { opacity: 1; transform: none; } 32%, 100% { opacity: 0; transform: scale(0.8); } }
@keyframes hm-chat-reply { 0%, 31% { opacity: 0; transform: scale(0.85) translateY(0.6rem); } 35%, 90% { opacity: 1; transform: none; } 96%, 100% { opacity: 0; transform: none; } }

/* The two circles by Get started are round and still (the founder: "make it not spin anymore"): you text it on the
   left, it's handled on the right, and only what is inside them moves. */
.hero-01-image:is(.image-03, .image-04) > :is(img, video) { border-radius: 50%; }

/* The example cards now hold a chat, taller than the theme's one-line quote: from 768 up a card grows to fit
   (never shorter than the theme's 600/640/700px), every slide stretches to the tallest so the row stays even,
   and the photo and the gap above the chat are smaller ("try it buttons overflow now"). */
.swiper-slide:has(> .mxd-testimonials-card) { height: auto; }
/* every card is the slide's full height on a phone too (the slides already stretch to the tallest), its name and
   "Example, sent by" pinned to the bottom, so the cards read as one even row */
.swiper-slide > .mxd-testimonials-card { height: 100%; justify-content: space-between; }
/* the theme gives every <p> in a card's text 3.3rem under it, which was pushing the chat's bubbles apart */
.hm-chat .hm-chat__b { margin: 0; }
@media only screen and (max-width: 767px) {
  .mxd-testimonials-card, .mxd-testimonials-card__content { gap: 2.4rem; }
  .mxd-testimonials-card__photo { width: 6.4rem; height: 6.4rem; }
}
@media only screen and (min-width: 768px) {
  .mxd-testimonials-card { height: 100%; min-height: 600px; }
  .mxd-testimonials-card__content { gap: 2.6rem; }
  .mxd-testimonials-card__photo { width: 8.4rem; height: 8.4rem; }
}
@media only screen and (min-width: 1400px) { .mxd-testimonials-card { min-height: 640px; } }
@media only screen and (min-width: 1600px) { .mxd-testimonials-card { min-height: 700px; } }
@media only screen and (min-width:1440px){
  .hero-01-title__item.title-item-transparent{width:520px}
  .mxd-hero-01__marquee{width:520px}
  .mxd-hero-01__marquee .marquee__item.item-regular p{font-size:12rem}
}
@media only screen and (min-width:1600px){
  .hero-01-title__item.title-item-transparent{width:600px}
  .mxd-hero-01__marquee{width:600px}
  .mxd-hero-01__marquee .marquee__item.item-regular p{font-size:14rem}
}
/* The pill's step: rest on a centred word, slide one item on, and loop (the next word is the same, so the loop is
   seamless). Reduced motion: the word rests centred. */
.hm-step-marquee .marquee__toright { display: flex; flex-wrap: nowrap; width: max-content; }
.hm-step-marquee .marquee__toright.hm-stepping { transform: translateX(var(--hm-x0)); }
@media (prefers-reduced-motion: no-preference) {
  .hm-step-marquee .marquee__toright.hm-stepping { animation: hm-pill-step 3.4s cubic-bezier(0.76, 0, 0.24, 1) infinite; }
}
@keyframes hm-pill-step {
  0%, 64% { transform: translateX(var(--hm-x0)); }
  100% { transform: translateX(calc(var(--hm-x0) - var(--hm-step))); }
}

/* The closing call to action: from 1200 the theme puts its picture in the right half and lets the heading run
   60-70% wide, over it. Ours is a light animation, so the heading keeps to the black half (50% of the content
   box, less a gap) and breaks after "care" (the founder: "lets break the lets take care of your home properly
   so it all sits on black area"). */
/* Below 1200 the heading is the card's full width, and on a phone "Let's take care" with the mascot (about 7.9
   font-sizes) was wider than the card, so "care" fell to a line of its own above the break (the founder, 2026-10-11:
   "I hate how this brs with care being on one line alone. Fix this for all similar cards on all pages"). The size
   now comes from the card's width the same way it does from 1200, so the first line always fits, capped at the
   theme's 4.4rem / 8rem; a heading with no break of its own (the pros page's) balances its lines. */
.mxd-promo__inner { container-type: inline-size; }
.mxd-promo__caption { text-wrap: balance; }
@media only screen and (max-width: 767px) { .mxd-promo__caption { font-size: min(4.4rem, calc(100cqi / 8.4)); } }
@media only screen and (min-width: 768px) and (max-width: 1199px) { .mxd-promo__caption { font-size: min(8rem, calc(100cqi / 8.4)); } }
@media only screen and (min-width: 1200px) {
  /* "Let's take care" with the mascot measures about 7.9 font-sizes; the black half is 50% of the card's content
     box, so the heading scales from that (container units) and the first line always fits, capped at 10rem */
  .mxd-promo__inner { container-type: inline-size; }
  .mxd-promo__title { width: calc(50% - 3rem); }
  .mxd-promo__caption { font-size: min(10rem, calc((50cqi - 3rem) / 8.2)); }
}

/* ── The handled pill on a phone (<768). The pill is the column's full width there, wider than its word, so with
   the theme's 1rem gaps a resting pill also showed the star and part of the next word, and each loop's restart
   popped the left-hand ones away (measured in the pill at rest: 390 → star + 7px of the next word, 600 → 96px,
   767 → 179px). Each gap opens to half the pill, so at rest only the centred word shows at any phone width and the
   restart has nothing to pop; handyman.js measures the longer step from the layout. ──────────────────────────── */
@media only screen and (max-width:767px){
  .hm-step-marquee .marquee-flex,
  .hm-step-marquee .marquee__item.item-regular{gap:calc((100vw - 6rem) / 2)}
}

/* Header: the Handyman wordmark, one file for both modes (its letters carry their own white outline). The mascot
   takes a third of its width, so it sits taller than a text-only mark would. */
.hm-wordmark { display: block; height: 6rem; width: auto; }
@media only screen and (min-width: 768px) { .hm-wordmark { height: 7.6rem; } }
@media only screen and (min-width: 1200px) { .hm-wordmark { height: 8.8rem; } }
.hm-visually-hidden { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }

/* The crew of four animated agents: in a row over the loader's count, around the home headline, and one in a
   corner of a few sections per page. Always behind the content and never in the way of a tap. */
.hm-loader-crew { position: absolute; inset: 0; pointer-events: none; }
.hm-loader-crew img { position: absolute; height: auto; transform: rotate(var(--r)); animation: hm-crew-in .7s cubic-bezier(.34,1.56,.64,1) both; }
.hm-loader-crew .hm-loader-mark { --r: 0deg; top: 5.6rem; left: 50%; width: 17rem; margin-left: -8.5rem; }
.hm-loader-crew__1 { --r: -9deg; width: 12rem; top: 18%; left: 6%; }
.hm-loader-crew__2 { --r: 7deg; width: 9rem; top: 25%; right: 8%; animation-delay: .12s !important; }
.hm-loader-crew__3 { --r: 6deg; width: 10rem; bottom: 15%; left: 12%; animation-delay: .24s !important; }
.hm-loader-crew__4 { --r: -6deg; width: 12.5rem; bottom: 8%; right: 7%; animation-delay: .36s !important; }
@media only screen and (min-width: 768px) {
  .hm-loader-crew .hm-loader-mark { top: 6rem; width: 26rem; margin-left: -13rem; }
  .hm-loader-crew__1 { width: 17rem; top: 12%; left: 12%; }
  .hm-loader-crew__2 { width: 13rem; top: 14%; right: 15%; }
  .hm-loader-crew__3 { width: 14rem; bottom: 14%; left: 20%; }
  .hm-loader-crew__4 { width: 18rem; bottom: 10%; right: 12%; }
}
@keyframes hm-crew-in { from { transform: scale(.3) rotate(var(--r)); } to { transform: scale(1) rotate(var(--r)); } }
@media (prefers-reduced-motion: reduce) { .hm-loader-crew img { animation: none; } }

.hm-crew-layer { position: absolute; inset: 0; z-index: 0; pointer-events: none; overflow: hidden; }
.mxd-hero-01 > .mxd-hero-01__wrap { position: relative; z-index: 1; }
.hm-crew-hero { position: absolute; width: 7rem; height: auto; }
.hm-crew-hero--1 { left: 3%; top: 58%; }
.hm-crew-hero--2 { right: 4%; top: 16%; }
.hm-crew-hero--3 { left: 24%; top: 6%; }
.hm-crew-hero--4 { right: 9%; top: 64%; }
@media only screen and (min-width: 768px) { .hm-crew-hero { width: 10rem; } }
@media only screen and (min-width: 1600px) { .hm-crew-hero { width: 13rem; } }

.mxd-section:has(> .hm-crew-pop) { position: relative; }
.mxd-section:has(> .hm-crew-pop) > :not(.hm-crew-pop) { position: relative; z-index: 1; }
.hm-crew-pop { position: absolute; z-index: 0; pointer-events: none; width: 6rem; height: auto; }
.hm-crew-pop--tr { top: 1.6rem; right: 2%; }
.hm-crew-pop--tl { top: 1.6rem; left: 2%; }
.hm-crew-pop--br { bottom: 1.6rem; right: 2%; }
.hm-crew-pop--bl { bottom: 1.6rem; left: 2%; }
@media only screen and (min-width: 768px) { .hm-crew-pop { width: 9rem; } }
@media only screen and (min-width: 1600px) { .hm-crew-pop { width: 11rem; } }

/* The example cards' channel names at one height and their own width: the theme capped the box at 18rem, which
   cut "WhatsApp" off ("make whatsapp not overflow and get cut off"). */
.mxd-testimonials-card__company { max-width: none; flex: none; }
.mxd-testimonials-card__company img { height: 3rem; width: auto; max-width: none; display: block; }
@media only screen and (min-width: 768px) { .mxd-testimonials-card__company img { height: 3.6rem; } }

/* The built-by pill over the hero's headline, centred: /join's pill (the founder: "use a pill similar to the one on
   /join"), a dark capsule with a red-to-amber rim, WeReno's wordmark, two lines and the way out. Phones drop the
   wordmark and the arrow and shorten the chip, so it stays one pill on a 390 px screen. */
/* Above the hero's floating images (the founder, 2026-10-15: "handyman is built by wereno pill is unclickable on smaller
   screens i think the text div covers it"). .mxd-hero-01__images is absolutely positioned across the whole title area,
   so it painted over this static pill at every width and took its clicks. Its videos are decoration only. */
.hm-built { position: relative; z-index: 2; display: flex; justify-content: center; margin-bottom: 2.4rem; }
@media only screen and (min-width: 1200px) { .hm-built { margin-bottom: 3.2rem; } }
.hm-backed { display: inline-flex; align-items: center; gap: 1.4rem; max-width: 100%; padding: .9rem .9rem .9rem 1.8rem;
  border: 1.5px solid transparent; border-radius: 999px; color: #fff; text-decoration: none; text-align: left;
  background: linear-gradient(135deg, #221a1d, #121012) padding-box, linear-gradient(115deg, #ff2e63, #ffb86b 55%, rgba(255,255,255,.25)) border-box;
  box-shadow: 0 14px 30px rgba(22,18,20,.22); transition: transform .2s ease, box-shadow .2s ease; }
.hm-backed:hover { transform: translateY(-2px); box-shadow: 0 20px 40px rgba(22,18,20,.3); }
.hm-backed__we { display: block; flex: none; height: 2.1rem; width: auto; }
.hm-backed__t { display: grid; gap: .3rem; padding-left: 1.4rem; border-left: 1px solid rgba(255,255,255,.14); }
.hm-backed__l1 { display: flex; align-items: center; gap: .8rem; }
.hm-backed__l1 b { font-size: 1.45rem; font-weight: 600; line-height: 1.25; letter-spacing: -.005em; color: #fff; white-space: nowrap; }
.hm-backed__yc { display: inline-flex; align-items: center; gap: .5rem; padding: .2rem .8rem .2rem .3rem; border-radius: 999px;
  background: rgba(251,101,30,.18); color: #ffb089; font-style: normal; font-weight: 600; font-size: 1.2rem; line-height: 1.3; white-space: nowrap; }
.hm-backed__yc img { display: block; width: 1.4rem; height: 1.4rem; border-radius: .3rem; }
.hm-backed__yc-short { display: none; }
.hm-backed__l2 { font-size: 1.25rem; line-height: 1.3; color: rgba(255,255,255,.72); white-space: nowrap; text-align: center; }
.hm-backed__go { display: grid; place-items: center; flex: none; width: 3.6rem; height: 3.6rem; border-radius: 50%;
  background: rgba(255,255,255,.1); transition: transform .2s ease, background .2s ease; }
.hm-backed__go svg { width: 1.6rem; height: 1.6rem; fill: none; stroke: #fff; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; }
.hm-backed:hover .hm-backed__go { transform: translate(2px, -2px); background: linear-gradient(135deg, #ff2e63, #ff003f); }
@media only screen and (max-width: 1199px) {
  .hm-backed { padding: .8rem 1.6rem; border-radius: 2.2rem; text-align: center; }
  .hm-backed__we, .hm-backed__go { display: none; }
  .hm-backed__t { padding-left: 0; border-left: 0; justify-items: center; }
  .hm-backed__l1 { flex-wrap: wrap; justify-content: center; row-gap: .4rem; gap: .6rem; }
}
@media only screen and (max-width: 767px) {
  .hm-backed__l1 b { font-size: 1.35rem; }
  .hm-backed__yc-long { display: none; }
  .hm-backed__yc-short { display: inline; }
  .hm-backed__l2 { font-size: 1.2rem; }
  /* A phone gets three pills instead of one card (the founder, 2026-10-11: "show 3 pills instead of 1 larger card
     pill ... handyman is built by wereno yc part as one long pill then the two facts in individual pills under it"):
     the link itself goes bare, the first line becomes the dark rimmed capsule, and each fact gets its own. */
  .hm-backed { display: flex; flex-direction: column; align-items: center; gap: .8rem; padding: 0; border: 0; border-radius: 0;
    background: none; box-shadow: none; }
  .hm-backed:hover { transform: none; box-shadow: none; }
  .hm-backed__t { display: flex; flex-direction: column; align-items: center; gap: .8rem; }
  .hm-backed__l1 { flex-wrap: nowrap; max-width: 100%; padding: .8rem .8rem .8rem 1.6rem; border: 1.5px solid transparent; border-radius: 999px;
    background: linear-gradient(135deg, #221a1d, #121012) padding-box, linear-gradient(115deg, #ff2e63, #ffb86b 55%, rgba(255,255,255,.25)) border-box;
    box-shadow: 0 14px 30px rgba(22,18,20,.22); }
  .hm-backed__l2 { display: flex; flex-wrap: wrap; justify-content: center; gap: .8rem; font-size: 1.25rem; color: #fff; }
  .hm-backed__sep { display: none; }
  .hm-backed__stat { display: inline-flex; align-items: center; padding: .65rem 1.3rem; border: 1px solid rgba(255,255,255,.14); border-radius: 999px;
    background: linear-gradient(135deg, #221a1d, #121012); box-shadow: 0 10px 22px rgba(22,18,20,.18); font-weight: 600; color: rgba(255,255,255,.88); }
  .hm-backed:active .hm-backed__l1 { transform: translateY(1px); }
}
/* Rayo's hero is exactly one window tall from 1200, its headline centred in what is left: on a short laptop
   (1280 x 800) the pill and the headline outgrow it and ride up under the header. The hero now grows with its
   content instead (at least one window tall, so tall screens look as before), and its headline block starts
   clear of the header. */
@media only screen and (min-width: 1200px) {
  .mxd-hero-fullheight { display: flex; flex-direction: column; height: auto; min-height: 100vh; }
  .mxd-hero-fullheight > .mxd-hero-01 { display: flex; flex-direction: column; flex: 1 0 auto; height: auto; }
  .mxd-hero-01 > .mxd-hero-01__wrap { display: flex; flex-direction: column; flex: 1 0 auto; height: auto; }
  .mxd-hero-01__top { flex: 1 0 auto; height: auto; padding-top: 4.4rem; }
  .mxd-hero-01__bottom { flex: none; }
}
/* Below 1200 the label sits where the third mascot stood, so it perches centred just above the label instead. (The
   hero's two top cards are placed by handyman.js: placeHeroCards.) */
@media only screen and (max-width: 1199px) { .hm-crew-hero--3 { left: 50%; margin-left: -3.5rem; top: 2.6rem; } }
@media only screen and (min-width: 768px) and (max-width: 1199px) { .hm-crew-hero--3 { margin-left: -5rem; top: 1rem; } }

/* Get started, centred under the headline, with the spinning keys just left of it (placeHeroCards in handyman.js; the
   founder first moved them off "remembered", then beside the button). The gap above and the room below hold the
   part of the circle that is taller than the button. */
.hm-hero-cta { position: relative; z-index: 2; display: flex; justify-content: center; margin-top: 3.2rem; }
@media only screen and (min-width: 768px) {
  .hm-hero-cta { margin-top: 4rem; }
  .mxd-hero-01__title-wrap { padding-bottom: 3.2rem; }
}
@media only screen and (min-width: 1200px) { .hm-hero-cta { margin-top: 5.6rem; } .mxd-hero-01__title-wrap { padding-bottom: 4.4rem; } }
@media only screen and (min-width: 1600px) { .hm-hero-cta { margin-top: 7.2rem; } .mxd-hero-01__title-wrap { padding-bottom: 6.4rem; } }

/* Very soft colour orbs behind every page, both modes (the founder: "add very subtle gradient orbs to the bg on light
   and dark mode theyre too plain"): violet, lime and a warm peach, fixed to the window so they never scroll away. */
body::before { content: ""; position: fixed; inset: 0; z-index: -1; pointer-events: none;
  background:
    radial-gradient(42vmax 42vmax at 6% 10%, rgba(159,139,231,.16), transparent 62%),
    radial-gradient(38vmax 38vmax at 96% 34%, rgba(196,226,80,.13), transparent 62%),
    radial-gradient(46vmax 46vmax at 64% 102%, rgba(255,184,107,.12), transparent 62%); }
[color-scheme="dark"] body::before {
  background:
    radial-gradient(42vmax 42vmax at 6% 10%, rgba(159,139,231,.11), transparent 62%),
    radial-gradient(38vmax 38vmax at 96% 34%, rgba(221,241,96,.06), transparent 62%),
    radial-gradient(46vmax 46vmax at 64% 102%, rgba(255,140,90,.06), transparent 62%); }

/* The Follow WeReno card's built-by card: the hero pill's dark capsule colours with a warm glow, WeReno and its YC
   batch, a line on what WeReno is, the two numbers in gradient type, and the way out; pushed to the foot of the card,
   just above the copyright line. */
.footer-blocks__card.fullheight-card:has(.hm-footer-built) { display: flex; flex-direction: column; }
/* Rayo's footer columns are exactly 650 px tall from 1200; the card made the Follow column taller than that, so the
   columns grow with their content now (at least 650 px, and the row keeps them equal). */
@media only screen and (min-width: 1200px) { .footer-blocks__column { height: auto; min-height: 650px; } }
.hm-footer-built { position: relative; isolation: isolate; overflow: hidden; flex-shrink: 0; display: flex; flex-direction: column; gap: 1.6rem;
  margin: auto 0 2.4rem; padding: 2.6rem 2.6rem 2.4rem; border: 1.5px solid transparent; border-radius: 2.8rem; color: #fff; text-decoration: none;
  background: linear-gradient(150deg, #241b1f 0%, #141113 55%, #0e0c0d 100%) padding-box,
    linear-gradient(115deg, #ff2e63, #ffb86b 50%, rgba(255,255,255,.18) 80%) border-box;
  box-shadow: 0 24px 48px -20px rgba(22,18,20,.45); transition: transform .25s ease, box-shadow .25s ease; }
.hm-footer-built::before, .hm-footer-built::after { content: ""; position: absolute; z-index: -1; border-radius: 50%; pointer-events: none;
  transition: opacity .3s ease, transform .6s ease; }
.hm-footer-built::before { width: 26rem; height: 26rem; top: -12rem; right: -8rem; background: radial-gradient(closest-side, rgba(255,46,99,.34), rgba(255,46,99,0)); }
.hm-footer-built::after { width: 22rem; height: 22rem; bottom: -12rem; left: -6rem; background: radial-gradient(closest-side, rgba(255,184,107,.2), rgba(255,184,107,0)); }
.hm-footer-built:hover { transform: translateY(-3px); box-shadow: 0 30px 56px -18px rgba(255,46,99,.35); }
.hm-footer-built:hover::before { transform: scale(1.15); }
.hm-footer-built__top { display: flex; align-items: center; justify-content: space-between; gap: 1.2rem; flex-wrap: wrap; }
.hm-footer-built__we { display: block; height: 3rem; width: auto; }
.hm-footer-built .hm-backed__yc { font-size: 1.3rem; padding: .35rem 1rem .35rem .4rem; }
.hm-footer-built .hm-backed__yc img { width: 1.6rem; height: 1.6rem; }
.hm-footer-built__eyebrow { margin-top: .4rem; font-size: 1.2rem; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: #ffb089; }
.hm-footer-built__text { margin-top: -.6rem; font-size: 1.5rem; line-height: 1.5; color: rgba(255,255,255,.8); }
.hm-footer-built__stats { display: grid; grid-template-columns: 1fr 1fr; border-radius: 2rem; border: 1px solid rgba(255,255,255,.09);
  background: rgba(255,255,255,.04); }
.hm-footer-built__stat { display: flex; flex-direction: column; gap: .3rem; padding: 1.4rem 1.6rem 1.5rem; }
.hm-footer-built__stat + .hm-footer-built__stat { border-left: 1px solid rgba(255,255,255,.09); }
.hm-footer-built__stat b { font: normal 700 3.6rem/1 var(--_font-accent); letter-spacing: -.02em;
  background: linear-gradient(115deg, #ff5a7e, #ffb86b); -webkit-background-clip: text; background-clip: text; color: transparent; }
.hm-footer-built__stat small { font-size: 1.3rem; line-height: 1.3; color: rgba(255,255,255,.66); }
.hm-footer-built__go { display: flex; align-items: center; justify-content: space-between; gap: 1rem; font-size: 1.4rem; font-weight: 600; color: #fff; }
.hm-footer-built__go i { display: grid; place-items: center; width: 3.6rem; height: 3.6rem; border-radius: 50%; background: rgba(255,255,255,.1);
  transition: transform .2s ease, background .2s ease; }
.hm-footer-built__go svg { width: 1.6rem; height: 1.6rem; fill: none; stroke: #fff; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; }
.hm-footer-built:hover .hm-footer-built__go i { transform: translate(2px, -2px); background: linear-gradient(135deg, #ff2e63, #ff003f); }
@media only screen and (max-width: 767px) {
  .hm-footer-built { padding: 2.2rem 2rem 2rem; gap: 1.4rem; }
  .hm-footer-built__stat { padding: 1.2rem 1.3rem 1.3rem; }
  .hm-footer-built__stat b { font-size: 3rem; }
}
/* ── The footer's three columns fit the window (lane 128, 2026-10-17). From 1200 px Rayo sets the columns in a row,
   each flex: 1 but never narrower than its content, and ours is wider than a third of a 1200-1385 px window (the four
   policy links in one unbreakable row, the address, the built-by card's numbers). So the Follow column ran past the
   right edge and every page with the footer scrolled sideways: 94 px in the founder's 1232 px window, 126 px at 1200.
   The reveal never caused it: the page was as wide before, during and after the cards rise. The columns now share the
   row whatever is in them, the policy links sit two by two, and from 1200 to 1439 the cards' padding and the type step
   down with the window so nothing is cut or crowded; 1440 and up keep the theme's sizes. ── */
@media only screen and (min-width: 1200px) {
  .mxd-footer__footer-blocks > .footer-blocks__column { min-width: 0; }
  .footer-blocks__nav ~ .footer-blocks__links { display: grid; grid-template-columns: repeat(2, minmax(0, max-content));
    justify-content: space-between; gap: .6rem 1.6rem; }
  .footer-nav__link .btn-caption { white-space: nowrap; }   /* a word too long now spills, never hides under the clip */
}
@media only screen and (min-width: 1200px) and (max-width: 1439.98px) {
  .footer-blocks__card { padding: clamp(3rem, calc(8.3333vw - 7rem), 5rem); }   /* 3rem at 1200, the theme's 5rem at 1440 */
  .footer-nav__link { font-size: clamp(3.4rem, calc(4.1667vw - 1.6rem), 4.4rem); }   /* 3.4rem at 1200, 4.4rem at 1440 */
  .footer-nav__link .btn-caption { height: 1.2em; }
  .footer-blocks__card .mxd-point-subtitle { font-size: clamp(2rem, calc(.8333vw + 1rem), 2.2rem); }
  .hm-footer-built { padding: 2.2rem 2rem 2rem; gap: 1.4rem; }
  .hm-footer-built__stat { padding: 1.2rem 1.3rem 1.3rem; }
  .hm-footer-built__stat b { font-size: 3rem; }
}

/* The featured post on Insights: Rayo writes its words in white for a dark photo, and our animations are light, so
   they could not be read (the founder: "font on the card on insights is hard to read fix that"). Ink in both modes,
   since the animation stays light in both, over a soft wash from the side the words sit on. */
.post-featured { --pt-t-light-bright: #161616; --pt-st-light-bright: rgba(22,22,22,.32); position: relative; }
.post-featured__thumb::after { content: ""; position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(90deg, rgba(250,247,246,.94) 0%, rgba(250,247,246,.82) 38%, rgba(250,247,246,0) 72%); }
.post-featured__meta svg { fill: #161616; color: #161616; }
@media only screen and (max-width: 767px) {
  .post-featured__thumb::after { background: linear-gradient(0deg, rgba(250,247,246,.95) 0%, rgba(250,247,246,.8) 55%, rgba(250,247,246,.35) 100%); }
}

/* Everyday moments: on a desktop the pinned column follows the card in view (handyman.js picks the slide). Slides
   share one grid cell; each line sits in a mask and rolls up out of it as the next rolls in, the other way when
   scrolling back. Below 1200 only the section's own title shows, as Rayo had it. */
.hm-moments__head, .hm-moments__rail, .hm-moments__slide:not(:first-child) { display: none; }
.hm-moments__slide { display: flex; flex-direction: column; gap: 2.4rem; }
@media only screen and (min-width: 1200px) {
  .hm-moments__head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.4rem;
    font-size: 1.2rem; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: var(--t-muted); }
  .hm-moments__count { font-variant-numeric: tabular-nums; }
  .hm-moments__count b { color: var(--t-bright); font-weight: 700; }
  .hm-moments[data-active="0"] .hm-moments__head { visibility: hidden; }
  .hm-moments__rail { display: grid; grid-template-columns: repeat(5, 1fr); gap: .6rem; margin-bottom: 3.6rem; }
  .hm-moments__rail i { height: .3rem; border-radius: .3rem; background: var(--st-muted); transition: background-color .45s ease; }
  .hm-moments__rail i.is-on { background: var(--accent); }
  .hm-moments__stage { display: grid; }
  .hm-moments__slide, .hm-moments__slide:not(:first-child) { display: flex; grid-area: 1 / 1; }
  .hm-mask { overflow: hidden; padding-bottom: .14em; margin-bottom: -.14em; }
  .hm-moments .hm-mask > .mxd-section-title__title, .hm-moments .hm-mask > .mxd-section-title__descr { margin: 0; padding: 0; }
  .hm-mask > * { transform: translateY(112%); transition: transform .7s cubic-bezier(.2,.8,.2,1); }
  .hm-moments__slide.is-past .hm-mask > * { transform: translateY(-112%); }
  .hm-moments__slide.is-active .hm-mask > * { transform: none; transition-delay: .1s; }
  .hm-moments__slide.is-active .hm-mask + .hm-mask > * { transition-delay: .18s; }
  .hm-moments__title { margin: 0; font: normal 600 7rem/1.1 var(--_font-accent); letter-spacing: -.06rem; color: var(--t-bright); }
  .mxd-pinned-projects__static .mxd-section-title__controls { margin-top: 4rem; }
}
@media (prefers-reduced-motion: reduce) { .hm-mask > * { transition: none !important; } }

/* Trades it coordinates: each card is its trade's animation, flush to the card, with the name in a paper chip over
   the top-left corner the scenes keep clear. The theme's hover lift moves to the animation. */
.hm-trade-card { position: absolute; inset: 0; overflow: hidden; border-radius: var(--_radius-m); background: var(--base-tint); }
.hm-trade-card :is(video, img) { display: block; width: 100%; height: 100%; object-fit: cover;
  transition: transform var(--_animspeed-slow) var(--_animbezier); }
.no-touch .mxd-partners-cards__inner:hover .hm-trade-card :is(video, img) { transform: scale(1.04); }
.hm-trade-card__name { position: absolute; top: 1.4rem; left: 1.4rem; display: inline-flex; align-items: center; gap: .7rem;
  padding: .8rem 1.4rem .8rem 1.1rem; border-radius: 99rem; background: rgba(255,255,255,.94); color: #161616;
  box-shadow: 0 0 0 1px rgba(22,22,22,.06), 0 8px 20px -10px rgba(22,22,22,.35); font: 600 1.6rem/1 var(--_font-accent); }
.hm-trade-card__name i { font-size: 1.8rem; color: #4f8a2b; }

/* Pricing's trade cards (the partners marquee): each plays its trade's loop (motion/src/scenes/wordmarks) at the card's
   own size and radius, so nothing moves when a video starts; the theme's 170 px logo width, which hm-anim.css mirrors
   onto videos, is not for these. Until its poster arrives a card shows its own ground, as it did behind the wordmark. */
.marquee__item.item-partners video.hm-trade-loop { display: block; width: 100%; height: 100%; object-fit: cover; border-radius: inherit; }

/* Article and legal page titles are the page's h1 (Rayo's article template used an h2, so those pages had none):
   the theme's h2 look, 6rem and 9rem from 768. */
.mxd-article__title h1 { margin: 0; font: normal var(--fw-medium) 6rem/1.1 var(--_font-accent); letter-spacing: -.06rem; color: var(--t-bright); }
@media only screen and (min-width: 768px) { .mxd-article__title h1 { font-size: 9rem; } }

/* An agent the crew placer (handyman.js) has set in a clear spot sits in front: nothing is under it by then. */
.hm-crew-pop.is-placed { z-index: 2; }

/* The built-by pill below 1200 names WeReno with its logo (the founder: "make the built by wereno banner on mobile
   show the wereno logo in place of the word wereno"); from 1200 the logo leads the pill and the word stays. */
.hm-backed__inline-we { display: none; }
@media only screen and (max-width: 1199px) {
  .hm-backed__name { display: none; }
  .hm-backed__inline-we { display: inline-block; height: 1.55rem; width: auto; margin-left: .15rem; vertical-align: -.22rem; }
}

/* The CTA card below 1200: Rayo lays its animation over the right of the card, under the white headline, which
   could not be read where the two met (the founder, on a phone: "fix the font on this card on mobile its hard to
   see"). Below 1200 the animation is a band across the foot of the card, under the button, and the words stay on
   the dark ground. */
@media only screen and (max-width: 1199px) {
  .mxd-promo__bg { position: relative; top: auto; right: auto; order: 2; flex: none; width: calc(100% + 6rem); height: 24rem;
    margin: 0 -3rem; background-position: center; }
  .mxd-promo__content { margin-bottom: 5.6rem; }
}
@media only screen and (min-width: 768px) and (max-width: 1199px) {
  .mxd-promo__bg { width: calc(100% + 10rem); margin: 0 -5rem; height: 34rem; }
}

/* Get started: the address suggestions (Google Places), a list under the field in the question's own type. */
.hm-tf__suggest { width: 100%; margin: -.8rem 0 0; padding: .6rem; list-style: none; border: 1px solid var(--st-muted); border-radius: 1.8rem;
  background: var(--base-tint); box-shadow: 0 18px 40px -24px rgba(0,0,0,.35); }
.hm-tf__suggest li { display: flex; flex-direction: column; gap: .2rem; padding: 1.1rem 1.4rem; border-radius: 1.2rem; cursor: pointer; }
.hm-tf__suggest li b { font: 600 1.8rem/1.25 var(--_font-accent); color: var(--t-bright); }
.hm-tf__suggest li span { font-size: 1.4rem; line-height: 1.35; color: var(--t-muted); }
.hm-tf__suggest li:hover, .hm-tf__suggest li.is-active { background: rgba(var(--accent-rgb), .14); }
@media only screen and (max-width: 767px) {
  .hm-tf__suggest li { padding: 1rem 1.2rem; }
  .hm-tf__suggest li b { font-size: 1.6rem; }
}

/* Article and legal titles are h1s now: the phone rule that let a long word ("maintenance") wrap moves with them. */
@media (max-width: 767px) {
  .mxd-article__title h1 { font-size: 4.4rem; hyphens: auto; overflow-wrap: break-word; }
}

/* A phone's hero: the four agents a little smaller, in one staggered row under Get started (placed by handyman.js),
   with room made for the row; the pill moves up into the space the top pair used to take, and since 2026-10-11 a little
   higher still, closer to the header (the founder: "move the handyman is built by wereno up a bit and remove the 1b in
   renovations and 50k trades network labels"): the two fact pills are gone from a phone. */
@media only screen and (max-width: 767px) {
  .hm-crew-hero { width: 5.8rem; }
  .hm-hero-cta { margin-bottom: 10.4rem; }
  .mxd-hero-01__top { padding-top: 3.2rem; }
  .hm-backed__l2 { display: none; }
}

/* The headline's "and" between a home and a toolbox on a phone (build.py HERO_AND: Fluent Emoji images, the same on
   every phone), its own line, centred, the emoji a little under the cap height and sitting on the words' middle; a
   computer hides them and keeps "and remembered" on one line, spaces and all. */
.hm-emoji { display: none; }
@media only screen and (max-width: 767px) {
  .hero-01-title__item.hm-and-row { display: block; }
  .hm-and { display: flex; align-items: center; justify-content: center; gap: .2em; }
  .hm-emoji { display: block; flex: none; width: .84em; height: .84em; margin-top: -.04em; }
}
@media only screen and (min-width: 768px) { .hero-01-title__item.hm-and-row { display: inline-block; } }

/* A phone's floater: the trades network on its own paper pill under the agents' row (build.py HERO_FLOAT), tilted and
   bobbing a little like the computer's floating cards, clear of the headline, the button and the agents. */
.hm-trades-float { display: none; }
@media only screen and (max-width: 767px) {
  .hm-trades-float { position: absolute; top: calc(100% + 11.6rem); right: .8rem; display: inline-flex; align-items: center;
    gap: .8rem; padding: .6rem 1.5rem .6rem .6rem; border-radius: 99rem; background: #fff; color: #161616; white-space: nowrap;
    box-shadow: 0 0 0 1px rgba(22,22,22,.07), 0 16px 30px -14px rgba(22,22,22,.38); font: 600 1.45rem/1 var(--_font-accent);
    transform: rotate(-4deg); pointer-events: none; }
  .hm-trades-float i { display: grid; place-items: center; flex: none; width: 3rem; height: 3rem; border-radius: 50%;
    background: rgba(76,175,80,.14); color: #3f9a44; font-size: 1.6rem; }
  .hm-trades-float b { font-weight: 800; }
  [color-scheme="dark"] .hm-trades-float { background: #232323; color: #f2f2f2;
    box-shadow: 0 0 0 1px rgba(255,255,255,.1), 0 16px 30px -14px rgba(0,0,0,.7); }
  [color-scheme="dark"] .hm-trades-float i { background: rgba(221,241,96,.14); color: #ddf160; }
}
@media only screen and (max-width: 767px) and (prefers-reduced-motion: no-preference) {
  .hm-trades-float { animation: hm-float-bob 5.6s ease-in-out infinite; }
}
@keyframes hm-float-bob { 0%, 100% { transform: translateY(0) rotate(-4deg); } 50% { transform: translateY(-.5rem) rotate(-3deg); } }

/* The up button: Rayo draws it with mix-blend-mode: difference over a blurred backdrop, which iOS Safari composites
   to a black disc with a black arrow (the founder: "up button arrows on bottom right up button are broken and
   invisible"). It takes the menu button's colours instead: ink with a light arrow, the reverse in dark mode. */
.btn-to-top { mix-blend-mode: normal; -webkit-backdrop-filter: none; backdrop-filter: none; background-color: var(--base-opp);
  border-color: var(--base-opp); color: var(--t-opp-bright); box-shadow: 0 10px 24px -12px rgba(0,0,0,.45); }
.btn-to-top i { color: var(--t-opp-bright); }

/* The SMS terms page's opt-in box: a card at the top of the terms, the number, the consent and Continue. */
/* The privacy policy's cookie table and its "Change your cookie settings" button (section 5, the cookie popup plan,
   2026-10-17; tools/legal.py renders the table, tools/consent.js opens the settings). A phone shows each row as a small
   card with its labels, so nothing scrolls sideways. */
.hm-legal-table { margin: 2.4rem 0; }
.hm-legal-table table { width: 100%; border-collapse: collapse; font: 400 1.5rem/1.45 var(--_font-default); color: var(--t-medium); }
.hm-legal-table th, .hm-legal-table td { padding: 1.1rem 1.2rem 1.1rem 0; border-bottom: 1px solid var(--st-muted); text-align: left; vertical-align: top; }
.hm-legal-table th { font-weight: 600; color: var(--t-bright); }
.hm-legal-table td:first-child { color: var(--t-bright); }
.hm-legal-table code { font: 500 1.35rem/1.4 ui-monospace, SFMono-Regular, Menlo, monospace; color: var(--t-bright); overflow-wrap: anywhere; }
@media (max-width: 767px) {
  .hm-legal-table thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
  .hm-legal-table table, .hm-legal-table tbody, .hm-legal-table tr, .hm-legal-table td { display: block; width: 100%; }
  .hm-legal-table tr { padding: 1.2rem 0; border-bottom: 1px solid var(--st-muted); }
  .hm-legal-table td { padding: .2rem 0; border: 0; }
  .hm-legal-table td + td::before { content: attr(data-l) " "; font-weight: 600; color: var(--t-bright); }
}
.hm-legal-cookies { display: inline-flex; align-items: center; justify-content: center; min-height: 4.8rem; margin: .8rem 0 0; padding: 0 2.4rem;
  border: 0; border-radius: 99rem; background: var(--base-opp); color: var(--base); font: 600 1.6rem/1 var(--_font-default); cursor: pointer;
  transition: transform .15s ease; }
.hm-legal-cookies:active { transform: scale(.97); }
.hm-legal-cookies:focus-visible { outline: .3rem solid var(--accent); outline-offset: .3rem; }

.hm-optin { display: flex; flex-direction: column; gap: 1.2rem; margin: 0 0 6rem; padding: 3.2rem; border: 1px solid var(--st-muted);
  border-radius: 2.4rem; background: var(--base-tint); }
.hm-optin__eyebrow { margin: 0; font-size: 1.2rem; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: var(--hm-accent-ink); }
.hm-optin__title { margin: 0; font: normal 600 3.6rem/1.15 var(--_font-accent); color: var(--t-bright); }
.hm-optin__form { display: flex; flex-direction: column; align-items: flex-start; gap: 1.6rem; margin-top: .8rem; }
.hm-optin__label { font-size: 1.4rem; font-weight: 600; color: var(--t-medium); }
.hm-optin__input { width: 100%; max-width: 42rem; padding: 1rem 0 1.2rem !important; border: 0 !important; border-bottom: 2px solid var(--st-muted) !important;
  border-radius: 0 !important; background: transparent !important; font: 400 2.6rem/1.25 var(--_font-accent) !important; color: var(--t-bright); outline: none; }
.hm-optin__input:focus { border-bottom-color: var(--accent) !important; }
.hm-optin .hm-consent { max-width: 64rem; }
.hm-optin__note { margin: 0; font-size: 1.4rem; color: var(--t-muted); }
@media only screen and (max-width: 767px) {
  .hm-optin { padding: 2.4rem 2rem; }
  .hm-optin__title { font-size: 2.8rem; }
}

/* Small words in the accent colour: Rayo's light-mode violet (#9F8BE7) is 2.9:1 on the page, too faint for a 13 px
   label, so they take a deeper violet in light mode (5.3:1); dark mode's lime already reads. */
:root { --hm-accent-ink: #6b55cf; }
[color-scheme="dark"] { --hm-accent-ink: var(--accent); }

/* ── Get started, the whole page (the founder's plan, section 1: no footer, one screen on a computer, "tasteful
   Remotion-powered animations, floating elements, and our Handyman mascot"). On a computer the questions sit on the
   left and a showcase on the right: a square stage playing the animation for the question at hand (each wipes up
   as its question slides in), three of the app's cards floating at its edges, and the mascot under it saying what
   happens next. An upright tablet puts the showcase under the questions; a phone keeps the questions alone, with
   the mascot and its line above them. The stage draws only where its column has room (the container query). ── */
.hm-gs { position: relative; }
.hm-gs-show__stage, .hm-gs-show__chip, .hm-gs-show__note { display: none; }
/* The founder, 2026-10-11: the mascot on the right of the message ("thatll be cleaner"); the tail points at him. */
.hm-gs-show__guide { display: flex; flex-direction: row-reverse; align-items: center; gap: 1.2rem; margin: 0 0 1.6rem; }
.hm-gs-show__mascot { flex: none; width: 5.6rem; height: 5.6rem; object-fit: contain; animation: hm-gs-bob 5.5s ease-in-out infinite; }
.hm-gs-show__say { position: relative; margin: 0; padding: 1rem 1.4rem; border-radius: 1.8rem 1.8rem .6rem 1.8rem;
  background: rgba(159, 139, 231, .16); color: var(--t-bright); font: 500 1.45rem/1.4 var(--_font-accent); text-wrap: pretty; }
[color-scheme="dark"] .hm-gs-show__say { background: rgba(159, 139, 231, .22); }
.hm-gs-show__say.is-new { animation: hm-gs-say .45s cubic-bezier(.2, .8, .2, 1) both; }
@keyframes hm-gs-say { from { transform: scale(.94) translateY(.6rem); } to { transform: none; } }
@keyframes hm-gs-bob { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-.6rem); } }
@keyframes hm-gs-wipe { from { clip-path: inset(100% 0 0 0 round var(--_radius-l)); } to { clip-path: inset(0 round var(--_radius-l)); } }
.hm-gs .hm-tf__note { margin: 0; padding: 1.2rem 1.6rem; max-width: 62rem; border-radius: 1.6rem; background: rgba(230, 160, 50, .14);
  color: var(--t-bright); font-size: 1.5rem; line-height: 1.45; }
.hm-gs .hm-tf__note[hidden] { display: none; }
/* what came along from app.handyman.ai or a text (?email=, ?phone=): said plainly, not as a warning */
.hm-gs .hm-tf__carried { background: color-mix(in srgb, var(--hm-accent-ink) 10%, transparent); overflow-wrap: anywhere; }
/* The back and forward arrows sit up top, clear of the line under the questions, and clear of every question's title
   in any language (2026-10-12: a French title ran under them at 1024 x 768, and on a phone a long title's first line
   did in English too): on a phone they share the question number's row; from 768 they sit at the end of the progress
   bar, which stops short for them (below). */
.hm-gs .hm-tf__nav { top: 2.4rem; bottom: auto; }
.hm-gs .hm-tf__step { padding-bottom: 4rem; }
.hm-gs-show { order: -1; }
/* One screen, always (the founder, 2026-10-11: "Get-started shouldnt scroll at all"): the section is the window less
   the header (7.6rem on a phone, 9.6rem from 768) and its own padding, the questions' window takes whatever the mascot
   row and the line under it leave, and a question taller than that (the phone one on a short phone) scrolls inside
   itself. The page never does. */
.hm-tf-section:has(.hm-gs) { padding: 2rem 0 1.2rem; }
.hm-gs { display: flex; flex-direction: column; height: calc(100svh - 10.8rem - env(safe-area-inset-bottom, 0px));
  height: calc(100dvh - 10.8rem - env(safe-area-inset-bottom, 0px)); }
/* While the cookie popup shows on a phone, the frame keeps its height and the first screen keeps the card's room at its
   foot, so the spaces above and between its words give way first and Start rides above the card; it settles back
   after an answer. Shrinking the frame instead, as the plan first measured it, hid Start: the first screen is taller
   than the window that would be left (362 px in 233 on an iPhone SE in Safari), and it scrolls inside itself. The
   page still never scrolls (no room is added under it). */
@media only screen and (max-width: 767px) {
  /* The questions' stage reaches 12 px past the right edge on a 360-375 px phone (the Start glow's room, 2026-10-12), which
     widened the whole page to 387-388 px: the menu button's edge and the cookie card's foot then sat outside the screen
     on a browser that doesn't shrink the page to fit (Chrome at 360). Clipped at the section, the page is the screen. */
  .hm-tf-section:has(.hm-gs) { overflow-x: clip; }
  html.hm-consent-open .hm-gs .hm-tf__step[data-step="intro"] { padding-bottom: max(.4rem, calc(var(--hm-consent-h, 0px) - 1.2rem)); }
}
html.hm-consent-open body:has(.hm-gs) { padding-bottom: 0; }   /* Get started never scrolls, card or no card */
@media only screen and (max-width: 767px) and (max-height: 600px) {
  html.hm-consent-open .hm-gs .hm-tf__step[data-step="intro"] { gap: .8rem; }   /* an iPhone SE in Safari: Start keeps a margin over the card */
}
.hm-gs .hm-tf { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; width: 100%; max-width: none; margin: 0; }
.hm-gs .hm-tf__stage { flex: 1 1 auto; min-height: 0; }
.hm-gs .hm-tf__step { overflow-y: auto; overscroll-behavior: contain; scrollbar-width: none; justify-content: safe center; }
.hm-gs .hm-tf__step::-webkit-scrollbar { display: none; }
/* The first screen on a phone, not top-heavy (the founder, 2026-10-13: "start button sit closer to bottom of page it
   all looks too top heavy rn"): the mascot's line and the heading at the top, the promises, Start and "Sign in here"
   low, Start where a thumb is, the line about texting under it. What room there is goes a third above the heading
   and two thirds between its words and the promises, never all under the button. */
.hm-tf__room { display: none; }
@media only screen and (max-width: 767px) {
  .hm-gs .hm-tf__step[data-step="intro"]::before { content: ""; flex: 1 1 0; min-height: 0; margin-bottom: -1rem; }
  .hm-gs .hm-tf__room { display: block; flex: 2 1 0; min-height: 0; margin-top: -1rem; }
  .hm-gs .hm-tf__step[data-step="intro"] { padding-bottom: .4rem; }
}
@media only screen and (max-width: 767px) {
  .hm-gs .hm-tf__step { justify-content: flex-start; gap: 1.2rem; padding: 1.6rem 0 1.2rem; }
  .hm-gs .hm-tf__title { font-size: 2.8rem; }
  .hm-gs .hm-tf__title--xl { font-size: 4.4rem; }
  .hm-gs .hm-tf__hint { font-size: 1.5rem; line-height: 1.45; }
  .hm-gs .hm-tf__input { margin-top: .4rem; font-size: 2.4rem !important; }
  .hm-gs .hm-tf__fine { gap: .4rem; font-size: 1.2rem; line-height: 1.4; }
  .hm-gs .hm-via { margin-top: 0; }
  .hm-gs .hm-via__label { font-size: 1.35rem; }
  .hm-gs .hm-via__opt span { padding: 0 1.4rem; font-size: 1.4rem; }
  .hm-gs .hm-tf__small { font-size: 1.3rem; }
  .hm-gs .hm-tf__alt { font-size: 1.25rem; line-height: 1.4; padding-top: .8rem; }
  /* level with the bar, which stops short of them, beside the question's number; the title starts under them */
  .hm-gs .hm-tf__bar { margin-right: 10.2rem; transition: margin-right .5s cubic-bezier(.2, .8, .2, 1); }
  .hm-gs .hm-tf[data-current="intro"] .hm-tf__bar, .hm-gs .hm-tf[data-current="handoff"] .hm-tf__bar { margin-right: 0; }
  .hm-gs .hm-tf__nav { top: 0; }
  .hm-gs .hm-tf__nav button { width: 4.4rem; height: 4.4rem; }
  .hm-gs-show__guide { gap: 1rem; margin-bottom: 1.2rem; }
  .hm-gs-show__mascot { width: 4.4rem; height: 4.4rem; }
  .hm-gs-show__say { padding: .8rem 1.2rem; font-size: 1.35rem; }
}
/* A short window (a phone whose browser bars take a third of it, a laptop or a tablet on its side up to 860 px tall)
   keeps every question on screen: tighter type, and the "Rather text?" line only on the first screen, where it is an
   alternative to starting. (Measured 2026-10-12: at 1024 x 768 the email question scrolled 90 px in English and 206 in
   Spanish, French and German, and the first screen 29 in English, under the old 760 px line.) */
@media only screen and (max-height: 760px), only screen and (min-width: 768px) and (max-height: 860px) {
  .hm-gs .hm-tf:not([data-current="intro"]) .hm-tf__alt { display: none; }
  /* the phone question carries the calls line too (lane 26): its one-line hint gives way, and the Terms sentence runs
     on from the texts disclosure, so Send my code stays on screen (measured: 36 to 81 px under a 375 x 667 or
     1024 x 768 window with the line and without these) */
  .hm-gs .hm-tf__step[data-step="phone"] .hm-tf__hint { display: none; }
  .hm-gs .hm-tf__fine { display: block; }
  .hm-gs .hm-tf__fine > [data-consent]:not([hidden]), .hm-gs .hm-tf__fine > [data-via-show]:not([hidden]),
  .hm-gs .hm-tf__fine > .hm-tf__terms { display: inline; }
  .hm-gs .hm-tf__fine > .hm-tf__en:not([hidden]) { display: inline; }
  .hm-gs .hm-tf__fine > .hm-tf__terms { margin-top: 0; }
  .hm-gs .hm-tf__fine > .hm-tf__calls { margin-top: .6rem; }
}
@media only screen and (max-width: 767px) and (max-height: 760px) {
  .hm-gs .hm-tf__step { gap: 1rem; padding-top: 1.2rem; }
  .hm-gs .hm-tf__q { gap: 1rem; }
  .hm-gs .hm-tf__title { font-size: 2.6rem; }
  .hm-gs .hm-tf__hint { font-size: 1.4rem; }
  .hm-gs-show__guide { margin-bottom: .8rem; }
  .hm-gs-show__say { padding: .6rem 1rem; font-size: 1.3rem; }
}
/* a very short phone gives the questions the mascot's row as well */
@media only screen and (max-width: 767px) and (max-height: 600px) { .hm-gs-show__guide { display: none; } }
/* and a short one gives it to the phone question, which carries two disclosures since the calls line (lane 26) */
@media only screen and (max-width: 767px) and (max-height: 700px) { .hm-gs[data-step="phone"] .hm-gs-show__guide { display: none; } }
/* in another language, where both disclosures run longer: the phone question's hint gives way up to 920 px tall, and on
   a short tablet or laptop its rows sit closer (measured with the calls line: French 29 px under 1024 x 768, 8 under
   1440 x 900) */
@media only screen and (min-width: 768px) and (max-height: 920px) {
  html:not([lang="en"]) .hm-gs .hm-tf__step[data-step="phone"] .hm-tf__hint { display: none; }
}
@media only screen and (min-width: 768px) and (max-height: 860px) {
  html:not([lang="en"]) .hm-gs .hm-tf__step[data-step="phone"] { gap: 1rem; }
}
@media only screen and (min-width: 768px) {
  .hm-gs { height: calc(100svh - 12.8rem); height: calc(100dvh - 12.8rem); }
  /* the arrows centred on the bar's line (.4rem), which ends short of them; the first screen and the last have none */
  .hm-gs .hm-tf__bar { margin-right: 11rem; transition: margin-right .5s cubic-bezier(.2, .8, .2, 1); }
  .hm-gs .hm-tf[data-current="intro"] .hm-tf__bar, .hm-gs .hm-tf[data-current="handoff"] .hm-tf__bar { margin-right: 0; }
  .hm-gs .hm-tf__nav { top: -2.1rem; }
  /* where the mascot sits above the questions (under 992 on its side), it keeps clear of them */
  .hm-gs-show__guide { margin-bottom: 2.8rem; }
  /* a question's content is centred in its window, so less padding moves nothing that fits and gives a long one room */
  .hm-gs .hm-tf__step { padding-top: 2.4rem; padding-bottom: 2.4rem; }
  .hm-gs-show__mascot { width: 6.4rem; height: 6.4rem; }
  .hm-gs-show__say { font-size: 1.6rem; }
}
@media only screen and (min-width: 768px) and (max-height: 860px) {
  /* the arrows end 2.1rem under the bar: a question that fills its window starts below them */
  .hm-gs .hm-tf__step { gap: 1.4rem; padding: 2.4rem 0 .8rem; }
  .hm-gs .hm-tf__title { font-size: 4rem; }
  .hm-gs .hm-tf__title--xl { font-size: 6.4rem; }
  .hm-gs .hm-tf__hint { font-size: 1.7rem; }
  .hm-gs .hm-tf__input { font-size: 2.8rem !important; }
}
/* ── Another language (?lang=, 2026-10-12): Spanish, French and the stored languages run longer than English, so the
   same window holds them with a little less. English keeps its look; these apply only when the page reads in another
   language. Measured before: the first screen scrolled 55 px at 1440 x 900 and 181 at 1024 x 768, the email question
   206 at 1024 x 768, the kind question up to 111 on a phone. ── */
/* The opening line keeps to two lines (French, German and Tamil took three at English's size) */
@media only screen and (min-width: 1200px) { html:not([lang="en"]) .hm-gs .hm-tf__title--xl { font-size: 8.4rem; } }
@media only screen and (min-width: 768px) and (max-height: 860px) {
  html:not([lang="en"]) .hm-gs .hm-tf__title--xl { font-size: 6rem; }
  /* the disclosure's translation is half as long again as the English */
  html:not([lang="en"]) .hm-gs .hm-tf__fine { font-size: 1.2rem; line-height: 1.45; }
}
/* The kind question where the window is short: tighter tiles, a smaller drawing on a narrow tile, and a 44 px OK */
@media only screen and (min-width: 768px) and (max-height: 860px) {
  html:not([lang="en"]) .hm-gs .hm-kind { gap: .5rem; }
  html:not([lang="en"]) .hm-gs [data-step="type"] .hm-tf__ok { height: 4.4rem; }
  @container (max-width: 239.98px) {
    html:not([lang="en"]) .hm-gs .hm-kind__opt span { padding: .6rem 1rem; }
    html:not([lang="en"]) .hm-gs .hm-kind__opt input:checked + span { padding: .5rem .9rem; }
    html:not([lang="en"]) .hm-gs .hm-kind__opt b { font-size: 1.5rem; }
    html:not([lang="en"]) .hm-gs .hm-kind__art { width: 2.8rem; height: 2.8rem; }
  }
}
/* …on a phone (up to 860 px tall: a 360 x 800 one scrolled 13 px in German without) the same for its tiles… */
@media only screen and (max-width: 767px) and (max-height: 860px) {
  html:not([lang="en"]) .hm-gs .hm-tf__step[data-step="type"] { gap: .8rem; }
  html:not([lang="en"]) .hm-gs [data-step="type"] .hm-tf__ok { height: 4.4rem; }
  html:not([lang="en"]) .hm-gs .hm-kind { gap: .4rem; }
  html:not([lang="en"]) .hm-gs .hm-kind__opt span { padding: .5rem .8rem; }
  html:not([lang="en"]) .hm-gs .hm-kind__opt input:checked + span { padding: .4rem .7rem; }
  html:not([lang="en"]) .hm-gs .hm-kind__opt b { font-size: 1.4rem; }
  html:not([lang="en"]) .hm-gs .hm-kind__art { width: 2.4rem; height: 2.4rem; border-radius: .7rem; }
}
/* …and on a short phone every question a little tighter: its gaps, the line under its answer, a 44 px OK */
@media only screen and (max-width: 767px) and (max-height: 760px) {
  html:not([lang="en"]) .hm-gs .hm-tf__step { gap: .8rem; }
  html:not([lang="en"]) .hm-gs .hm-tf__actions { margin-top: .4rem; }
  html:not([lang="en"]) .hm-gs .hm-tf__ok { height: 4.4rem; }
  html:not([lang="en"]) .hm-gs .hm-tf__input { padding: .6rem 0 1rem !important; }
}
/* "Read this in English" ends the disclosure's paragraph instead of taking a line of its own */
html:not([lang="en"]) .hm-tf__fine { display: block; }
html:not([lang="en"]) .hm-tf__fine > [data-consent]:not([hidden]), html:not([lang="en"]) .hm-tf__fine > .hm-tf__en:not([hidden]) { display: inline; }
html:not([lang="en"]) .hm-tf__fine > .hm-tf__en::before { content: " \00b7  "; }
html:not([lang="en"]) .hm-tf__fine > .hm-tf__terms { margin-top: .6rem; }
html:not([lang="en"]) .hm-tf__fine > .hm-tf__calls { margin-top: .6rem; }
@media only screen and (max-width: 767px) {
  html:not([lang="en"]) .hm-tf__fine > .hm-tf__terms { margin-top: .4rem; }
}
/* on a phone the line under the questions runs a line longer: only on the first screen, as on a short one */
@media only screen and (max-width: 767px) and (max-height: 860px) {
  html:not([lang="en"]) .hm-gs .hm-tf:not([data-current="intro"]) .hm-tf__alt { display: none; }
}
/* A computer or a tablet on its side: two columns, one screen tall. The header takes 9.6rem; this section's padding
   is 4.8rem above (clear of the logo) and 3.2rem below, so the columns get the rest of the window. */
@media only screen and (min-width: 992px) and (min-aspect-ratio: 4/5) and (min-height: 600px) {
  .hm-tf-section:has(.hm-gs) { padding: 4.8rem 0 3.2rem; }
  /* The showcase gets the wider column (it was .88fr): its stage is 16:10 now and wants the room. */
  .hm-gs { display: grid; grid-template-columns: minmax(0, .92fr) minmax(0, 1.08fr); gap: clamp(3.2rem, 4vw, 7.2rem);
    height: calc(100svh - 17.6rem); height: calc(100dvh - 17.6rem); }
  .hm-gs .hm-tf { display: flex; flex-direction: column; max-width: none; min-height: 0; margin: 0; }
  .hm-gs .hm-tf__stage { flex: 1 1 auto; min-height: 0; }
  .hm-gs-show { order: 0; }
}
/* While the cookie popup shows in its bottom-left corner, the first screen keeps the card's room at its foot (inside the
   questions' window, which keeps its size: a smaller window clipped Start, as on a phone), so its words rise clear of it;
   the showcase keeps its height. */
@media only screen and (min-width: 992px) and (min-aspect-ratio: 4/5) and (min-height: 600px) {
  html.hm-consent-open .hm-gs .hm-tf__step[data-step="intro"] { padding-bottom: max(4rem, calc(var(--hm-consent-h, 0px) - 3.2rem)); }
}
@media only screen and (min-width: 992px) and (min-aspect-ratio: 4/5) and (min-height: 600px) and (max-height: 820px) {
  /* a short window (the founder's 1232×744): the first screen's lines sit closer, so "Sign in here" rises clear too */
  html.hm-consent-open .hm-gs .hm-tf__step[data-step="intro"] { gap: 1.1rem; }
  html.hm-consent-open .hm-gs .hm-tf__step[data-step="intro"] .hm-tf__actions { margin-top: 0; }
}
/* An upright tablet: the questions on top, the showcase in the room under them. */
@media only screen and (min-width: 768px) and (max-aspect-ratio: 4/5) and (min-height: 900px) {
  .hm-tf-section:has(.hm-gs) { padding: 4.8rem 0 3.2rem; }
  .hm-gs { gap: 2.4rem; height: calc(100svh - 17.6rem); height: calc(100dvh - 17.6rem); }
  .hm-gs .hm-tf { flex: none; max-width: none; width: 100%; }
  .hm-gs .hm-tf__stage { flex: none; height: 56rem; }
  .hm-gs-show { order: 0; flex: 1 1 auto; }
}
@media only screen and (min-width: 992px) and (min-aspect-ratio: 4/5) and (min-height: 600px),
       only screen and (min-width: 768px) and (max-aspect-ratio: 4/5) and (min-height: 900px) {
  .hm-gs-show { container: hm-show / size; display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: 2rem; min-height: 0; }
  .hm-gs-show__guide { margin: 0; }
}
@container hm-show (min-height: 36rem) {
  /* The stage takes the shape of the video in it: square for the square ones, 16:10 for the two wide street
     scenes (1920×1200), which a square stage cut to their middle (the founder, 2026-10-12: "make the ...
     golden-hour-porch ... sit a bit wider so it doesnt get cut off"). The guide's bubble below follows. */
  .hm-gs-show__stage { --hm-gs-h: min(100cqw - 4rem, 100cqh - 13.6rem); --hm-gs-w: var(--hm-gs-h); position: relative;
    display: block; flex: none; width: var(--hm-gs-w); height: var(--hm-gs-h); border-radius: var(--_radius-l); background: #fafafa;
    box-shadow: 0 0 0 1px var(--st-muted), 0 3rem 6rem -3rem rgba(22, 22, 22, .25);
    transition: width .5s cubic-bezier(.2, .8, .2, 1), height .5s cubic-bezier(.2, .8, .2, 1); }
  .hm-gs-show__stage:has(> .hm-gs-show__vid.is-on[width="1920"]) { --hm-gs-h: min((100cqw - 4rem) / 1.6, 100cqh - 13.6rem);
    --hm-gs-w: calc(var(--hm-gs-h) * 1.6); }
  .hm-gs-show__vid { position: absolute; inset: 0; display: none; width: 100%; height: 100%; object-fit: cover;
    border-radius: var(--_radius-l); }
  .hm-gs-show__vid[data-step="name"] { object-fit: contain; }
  .hm-gs-show__vid.is-on { display: block; animation: hm-gs-wipe .8s cubic-bezier(.2, .8, .2, 1) both; }
  /* The street scene's note in the page's language (pages2.py _showcase): another language only, over the video's own
     English one and the path it drops in by (x 37-61 %, y 67-96 % of the frame at any stage size), there from the
     first frame, as the video's is, once its words read in that language (handyman.js). The pills on the stage's
     bottom edge step aside for it on that question. */
  html:not([lang="en"]) .hm-gs-show__stage:has(> .hm-gs-show__vid.is-on[data-step="type"]) > .hm-gs-show__note:not([hidden]) {
    position: absolute; z-index: 1; left: 50.5%; top: 67%; display: flex; align-items: center; gap: 1rem;
    width: max(35%, 18rem); min-height: 29%; margin: 0; padding: .9rem 1.2rem; transform: translateX(-50%);
    border-radius: 1.6rem; background: #fff; box-shadow: 0 0 0 1px rgba(22, 22, 22, .06), 0 1.2rem 2.4rem -1.2rem rgba(22, 22, 22, .25); }
  .hm-gs-show__note > i { display: grid; place-items: center; flex: none; width: 3rem; height: 3rem; border-radius: 50%;
    background: rgba(76, 175, 80, .14); color: #3f9a44; font-size: 1.6rem; }
  .hm-gs-show__note > span { display: flex; flex-direction: column; gap: .2rem; min-width: 0; }
  .hm-gs-show__note b { font: 600 clamp(1.25rem, 2.4cqw, 1.5rem)/1.25 var(--_font-accent); color: #161616; }
  .hm-gs-show__note small { font: 400 clamp(1.15rem, 2.1cqw, 1.35rem)/1.3 var(--_font-default); color: #5b5f66; }
  html:not([lang="en"]) .hm-gs-show__stage:has(> .hm-gs-show__vid.is-on[data-step="type"]):has(> .hm-gs-show__note:not([hidden]))
    > :is(.hm-gs-show__chip--2, .hm-gs-show__chip--5) { opacity: 0; }
  .hm-gs-show__chip { position: absolute; z-index: 2; display: inline-flex; align-items: center; gap: .8rem; padding: 1rem 1.6rem 1rem 1rem;
    border-radius: 99rem; background: #fff; color: #161616; font: 600 1.5rem/1 var(--_font-accent); white-space: nowrap;
    box-shadow: 0 0 0 1px rgba(22, 22, 22, .06), 0 1.6rem 3.2rem -1.2rem rgba(22, 22, 22, .28); animation: hm-gs-bob 6s ease-in-out infinite;
    transition: opacity .3s ease; }
  .hm-gs-show__chip i { display: grid; place-items: center; width: 3rem; height: 3rem; border-radius: 50%; font-size: 1.6rem; }
  .hm-gs-show__chip i.tone-go { background: rgba(76, 175, 80, .14); color: #3f9a44; }
  .hm-gs-show__chip i.tone-you { background: rgba(230, 160, 50, .18); color: #b97716; }
  .hm-gs-show__chip i.tone-ai { background: rgba(159, 139, 231, .2); color: #7a62d6; }
  /* They hang over the stage's edges, clear of the cards inside the animations: two on the top edge, two on
     the bottom, two up each side. Each bobs on its own beat. */
  .hm-gs-show__chip--1 { top: -1.8rem; left: 8%; }
  .hm-gs-show__chip--2 { bottom: -1.8rem; right: 8%; animation-delay: -2s; }
  .hm-gs-show__chip--3 { top: 22%; right: -4.8rem; animation-delay: -4s; }
  .hm-gs-show__chip--4 { top: 64%; left: -5.2rem; animation-delay: -1s; }
  .hm-gs-show__chip--5 { bottom: -1.8rem; left: 12%; animation-delay: -3s; }
  .hm-gs-show__chip--6 { top: -1.8rem; right: 10%; animation-delay: -5s; }
  .hm-gs-show__chip--7 { bottom: 26%; right: -4.4rem; animation-delay: -2.5s; }
  .hm-gs-show__chip--8 { top: 16%; left: -4rem; animation-delay: -4.5s; }
  .hm-gs-show__guide { flex: none; width: min(100cqw - 4rem, 100cqh - 13.6rem); gap: 1.4rem;
    transition: width .5s cubic-bezier(.2, .8, .2, 1); }
  .hm-gs-show__stage:has(> .hm-gs-show__vid.is-on[width="1920"]) + .hm-gs-show__guide {
    width: calc(min((100cqw - 4rem) / 1.6, 100cqh - 13.6rem) * 1.6); }
  .hm-gs-show__mascot { width: 8.8rem; height: 8.8rem; }
  .hm-gs-show__say { padding: 1.4rem 1.8rem; font-size: 1.7rem; border-radius: 2.2rem 2.2rem 2.2rem .8rem; }
}
/* A narrow showcase (a tablet on its side) keeps six pills: eight crowd a stage under 50rem. */
@container hm-show (max-width: 56rem) { .hm-gs-show__chip--7, .hm-gs-show__chip--8 { display: none; } }
/* In another language the pills run longer and met on the stage's top and bottom edges (French "Filtre de fournaise à
   changer" under "Reçu classé" at 1024 x 768, 1180 x 820 and 1280 x 800): under 66rem one pill to an edge, so six (four
   under 56rem). The lower pill on each side rides higher, clear of the street's note. */
@container hm-show (max-width: 66rem) {
  html:not([lang="en"]) .hm-gs-show__chip--5, html:not([lang="en"]) .hm-gs-show__chip--6 { display: none; }
}
@container hm-show (min-height: 36rem) {
  html:not([lang="en"]) .hm-gs-show__chip--4 { top: 40%; }
  html:not([lang="en"]) .hm-gs-show__chip--7 { bottom: 42%; }
}
@media (prefers-reduced-motion: reduce) {
  .hm-gs-show__mascot, .hm-gs-show__chip, .hm-gs-show__say.is-new, .hm-gs-show__vid.is-on { animation: none !important; }
}

/* ── The legal words over the set-up (never in place of it): a dialog with the page's article in it. ── */
.hm-legal { width: min(76rem, calc(100vw - 3.2rem)); max-width: none; max-height: min(86svh, 84rem); margin: auto; padding: 0; border: 0;
  border-radius: var(--_radius-l); background: var(--base); color: var(--t-bright); box-shadow: 0 4rem 10rem -2rem rgba(0, 0, 0, .4); overflow: hidden; }
.hm-legal[open] { display: flex; flex-direction: column; }
.hm-legal::backdrop { background: rgba(22, 22, 22, .55); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); }
.hm-legal__head { display: flex; align-items: center; justify-content: space-between; gap: 1.6rem; padding: 2.2rem 2.4rem 1.8rem 3.2rem;
  border-bottom: 1px solid var(--st-muted); }
.hm-legal__title { margin: 0; font: 600 2.4rem/1.2 var(--_font-accent); color: var(--t-bright); }
.hm-legal__close, .hm-textme__close { display: grid; place-items: center; flex: none; width: 4.4rem; height: 4.4rem; border: 1px solid var(--st-muted);
  border-radius: 50%; background: var(--base-tint); color: var(--t-bright); font-size: 1.8rem; cursor: pointer; }
.hm-legal__close:hover, .hm-textme__close:hover { border-color: var(--t-bright); }
.hm-legal__body { flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain; padding: 2.8rem 3.2rem; font-size: 1.6rem;
  line-height: 1.6; color: var(--t-medium); }
.hm-legal__body .mxd-article__content { gap: 2.8rem; max-width: none; margin: 0; }
.hm-legal__body .mxd-article__block { gap: 1.2rem; }
.hm-legal__body h2, .hm-legal__body h3, .hm-legal__body h4 { margin: 0; font: 600 2rem/1.25 var(--_font-accent); color: var(--t-bright); }
.hm-legal__body h3, .hm-legal__body h4 { font-size: 1.7rem; }
.hm-legal__body p, .hm-legal__body li { font-size: 1.6rem; line-height: 1.6; }
/* the theme sets the article's list items bigger than its paragraphs (.mxd-article__content ul li): here they match */
.hm-legal__body .mxd-article__content li { font-size: 1.6rem; line-height: 1.6; }
.hm-legal__body a { color: inherit; text-decoration: underline; text-underline-offset: .15em; }
.hm-legal__wait { margin: 0; color: var(--t-muted); }
.hm-legal__foot { display: flex; justify-content: flex-end; padding: 1.6rem 2.4rem 2rem; border-top: 1px solid var(--st-muted); }
.hm-legal__foot .hm-tf__ok { height: 4.8rem; font-size: 1.7rem; }
@media only screen and (max-width: 767px) {
  .hm-legal { width: 100vw; max-height: 92svh; margin: auto 0 0; border-radius: 2.4rem 2.4rem 0 0; }
  .hm-legal__head { padding: 1.6rem 1.6rem 1.4rem 2rem; }
  .hm-legal__title { font-size: 2rem; }
  .hm-legal__body { padding: 2rem; }
  .hm-legal__foot { padding: 1.2rem 1.6rem calc(1.6rem + env(safe-area-inset-bottom)); }
  .hm-legal__foot .hm-tf__ok { width: 100%; justify-content: center; }
}

/* ── "Message Handyman" (lane 14: the 866 is for calls). One card (build_lib.talk_card) in two places: the /text page,
   and a window a computer opens from any Message Handyman link (handyman.js). A phone sees Open Messages; a computer
   (a mouse or a trackpad) sees the code to scan and the hello to copy. Decided by the pointer, never by the width. ── */
.hm-talk { display: flex; flex-direction: column; gap: 1.6rem; min-width: 0; color: var(--t-bright); }
.hm-talk__head { display: flex; align-items: center; gap: 1.4rem; min-width: 0; }
.hm-talk__face { flex: none; width: 6.4rem; height: 6.4rem; border-radius: 1.8rem; background: color-mix(in srgb, var(--hm-accent-ink) 12%, transparent);
  object-fit: contain; padding: .4rem; }
.hm-talk__heading { display: flex; flex-direction: column; gap: .4rem; min-width: 0; }
.hm-talk__eyebrow { margin: 0; font-size: 1.2rem; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: var(--hm-accent-ink); }
.hm-talk__title { margin: 0; font: 600 3.4rem/1.05 var(--_font-accent); letter-spacing: -.02em; color: var(--t-bright); }
.hm-talk__sub { margin: 0; font-size: 1.6rem; line-height: 1.5; color: var(--t-medium); }
.hm-talk__tap { display: flex; flex-direction: column; gap: .8rem; }
.hm-talk__open { display: flex; align-items: center; justify-content: center; gap: .8rem; min-height: 5.6rem; padding: 0 2rem; border-radius: 1.6rem;
  background: #0a84ff; color: #fff !important; font: 600 1.8rem/1 var(--_font-accent); text-decoration: none; box-shadow: 0 1.2rem 2.8rem -1.4rem rgba(10, 132, 255, .7); }
.hm-talk__open i { font-size: 2.2rem; }
.hm-talk__open:active { transform: translateY(1px); }
.hm-talk__fine { margin: 0; font-size: 1.4rem; line-height: 1.45; color: var(--t-muted); text-align: center; }
.hm-talk__scan { display: none; grid-template-columns: 17.2rem minmax(0, 1fr); gap: 2rem; align-items: center; }
.hm-talk__qr { display: grid; place-items: center; width: 17.2rem; height: 17.2rem; padding: 1.2rem; border-radius: 2rem; background: #fff;
  box-shadow: 0 0 0 1px rgba(22, 22, 22, .1); }
.hm-talk__qr svg { display: block; width: 100%; height: 100%; }
.hm-talk__qr:empty::before { content: ""; width: 2.4rem; height: 2.4rem; border: 2px solid rgba(22, 22, 22, .15); border-top-color: rgba(22, 22, 22, .55);
  border-radius: 50%; animation: hm-talk-spin .9s linear infinite; }
@keyframes hm-talk-spin { to { transform: rotate(360deg); } }
.hm-talk__scan-copy { display: flex; flex-direction: column; gap: .6rem; min-width: 0; }
.hm-talk__scan-copy .hm-talk__fine { text-align: left; }
.hm-talk__scan-t { margin: 0; font: 600 2rem/1.2 var(--_font-accent); color: var(--t-bright); }
.hm-talk__mac { display: inline-flex; align-items: center; justify-content: center; gap: .6rem; align-self: flex-start; margin-top: .6rem; min-height: 4.4rem;
  padding: 0 1.8rem; border-radius: 99rem; background: #0a84ff; color: #fff !important; font: 600 1.5rem/1 var(--_font-accent); text-decoration: none; }
.hm-talk__mac[hidden] { display: none; }
.hm-talk__row { display: flex; align-items: center; justify-content: space-between; gap: 1.2rem; padding: 1.2rem 1.2rem 1.2rem 1.6rem;
  border-radius: 1.6rem; background: var(--base-tint); box-shadow: inset 0 0 0 1px var(--st-muted); }
.hm-talk__row > span { display: flex; flex-direction: column; gap: .2rem; min-width: 0; font-size: 1.5rem; line-height: 1.35; color: var(--t-medium); }
.hm-talk__row small { font-size: 1.2rem; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: var(--t-muted); }
.hm-talk__row b { font: 600 2rem/1.2 var(--_font-accent); color: var(--t-bright); white-space: nowrap; }
.hm-talk__row q { quotes: "\201C" "\201D"; overflow-wrap: anywhere; }
.hm-talk__row button { display: inline-flex; align-items: center; justify-content: center; gap: .6rem; flex: none; min-height: 4.4rem; padding: 0 1.6rem;
  border: 1px solid var(--st-muted); border-radius: 99rem; background: var(--base); color: var(--t-bright); font: 600 1.4rem/1 var(--_font-accent); cursor: pointer; }
.hm-talk__row button:hover { border-color: var(--t-bright); }
.hm-talk__row button.is-done { border-color: #3f9a44; color: #3f9a44; }
.hm-talk__row--hello { display: none; }
.hm-talk__alt { margin: 0; font-size: 1.4rem; line-height: 1.5; color: var(--t-muted); }
.hm-talk__alt a { color: var(--t-bright); font-weight: 600; white-space: nowrap; text-decoration: underline; text-underline-offset: .18em; }
/* A computer: the code and the hello; no Open Messages (a Mac gets its own button beside the code). */
@media (hover: hover) and (pointer: fine) {
  .hm-talk__tap { display: none; }
  .hm-talk__scan { display: grid; }
  .hm-talk__row--hello { display: flex; }
}

/* The window over any page (a computer's Message Handyman click). */
.hm-textme { position: fixed; width: min(58rem, calc(100vw - 3.2rem)); max-width: none; max-height: calc(100svh - 3.2rem); margin: auto; padding: 3.2rem;
  border: 0; border-radius: var(--_radius-l); background: var(--base); color: var(--t-bright); box-shadow: 0 4rem 10rem -2rem rgba(0, 0, 0, .4);
  overflow-y: auto; overscroll-behavior: contain; }
.hm-textme::backdrop { background: rgba(22, 22, 22, .55); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); }
.hm-textme__close { position: absolute; top: 1.6rem; right: 1.6rem; z-index: 1; }
.hm-textme .hm-talk__head { padding-right: 5.2rem; }

/* The /text page: the card in the middle of the window. A phone stacks under the header and scrolls; from a tablet up the
   page is the window, and only the card scrolls if the window is short. */
.hm-talk-main { min-height: 100svh; }
.hm-talk-page { display: flex; min-height: 100svh; padding: 10.4rem 0 3.2rem; }
.hm-talk-page__wrap { display: flex; flex-direction: column; justify-content: center; }
.hm-talk-page__stage { display: flex; flex-direction: column; align-items: center; gap: 1.6rem; width: 100%; }
.hm-talk--page { width: min(56rem, 100%); padding: 2.4rem; border-radius: var(--_radius-l); background: var(--base);
  box-shadow: 0 0 0 1px var(--st-muted), 0 3rem 8rem -3.6rem rgba(22, 22, 22, .35); }
.hm-talk--page .hm-talk__title { font-size: 4.4rem; }
.hm-talk-page__chips { display: flex; flex-wrap: wrap; justify-content: center; gap: .8rem; margin: 0; padding: 0; list-style: none; }
.hm-talk-page__chips li { display: inline-flex; align-items: center; gap: .6rem; min-height: 3.6rem; padding: 0 1.4rem; border-radius: 99rem;
  background: var(--base-tint); box-shadow: inset 0 0 0 1px var(--st-muted); font-size: 1.4rem; font-weight: 600; color: var(--t-medium); }
.hm-talk-page__chips i { color: var(--hm-accent-ink); font-size: 1.6rem; }
@media only screen and (min-width: 768px) {
  .hm-talk-main { height: 100svh; min-height: 0; overflow: hidden; }
  .hm-talk-page { height: 100svh; min-height: 0; padding: 12.8rem 0 3.2rem; }
  .hm-talk-page__wrap { min-height: 0; height: 100%; }
  .hm-talk-page__stage { min-height: 0; max-height: 100%; }
  .hm-talk--page { min-height: 0; overflow-y: auto; overscroll-behavior: contain; padding: 3.2rem; }
}
@media only screen and (max-width: 767px) {
  .hm-talk--page { padding: 2rem; border-radius: 2.8rem; }
  .hm-talk--page .hm-talk__title { font-size: 3.6rem; }
  .hm-talk__row b { font-size: 1.8rem; }
}

/* The footer and Contact: "Message Handyman", and under it, smaller, "Call 1-866-6-FIXNOW" (build_lib.NUMBER_LINK). Each
   link dims on its own hover (the theme dimmed every link in the line at once). */
.hm-number a { color: var(--t-bright); }
.no-touch .mxd-point-subtitle:hover .hm-number a { color: var(--t-bright); }
.no-touch .hm-number a:hover { color: var(--t-medium); }
a.hm-vanity { display: inline-block; white-space: nowrap; padding: 1rem 0; margin: -.65rem 0 -1rem; }   /* a bigger tap, the same look */
.hm-nowrap { white-space: nowrap; }
.hm-talk__alt a { padding: 1rem 0; }
/* The menu's "Message me … Or call 1-866-6-FIXNOW": the menu is drawn in the opposite scheme, so its links take the
   opposite colours (the theme's own link colour was the menu's background in both). */
.menu-promo__caption a { color: var(--t-opp-bright); text-decoration: underline; text-underline-offset: .18em; white-space: nowrap; }
.no-touch .menu-promo__caption a:hover { color: var(--t-opp-medium); }

/* ── No word left alone on a line (the founder, 2026-10-11, at the closing card's "care": "I hate how this brs with
   care being on one line alone. Fix this for all similar cards on all pages"). Headings and card titles balance
   their lines; running text avoids ending on one word. Both inherit, so a title's spans and the theme's split
   words follow. Browsers without them wrap as before. ── */
body { text-wrap: pretty; }
/* A page's headline on a phone was 6rem, so "Free / for every / home. / Really." gave three of its four lines one
   word each. At 4rem the lines hold two words or more; these keep the browser's own wrapping (balancing a line that
   starts with the picture pill pushed the pill's line down to one word). */
@media only screen and (max-width: 767px) { .inner-headline__title { font-size: 4rem; line-height: 1.08; } }
.inner-headline__title[data-hm-pill] { text-wrap: wrap; }
/* one with no pill (Contact's "Let's talk about your home!") balances at 3.6rem: two lines, no "home!" alone */
@media only screen and (max-width: 767px) { .inner-headline__title:not([data-hm-pill]) { font-size: 3.6rem; } }
:is(h1, h2, h3, h4, h5, .mxd-promo__caption, .mxd-testimonials-card__name, .mxd-awards-list__item p, .hm-optin__title,
    .mxd-section-title__title, .mxd-pinned__title, .mxd-manifest, .post-simple__title,
    .post-featured__title, .mxd-blog-preview__data a, .pricing-header__title, .quote__text, .hm-tf__title) { text-wrap: balance; }

/* An article's opening picture is a 3:2 animation, and the theme's frame below 1200 is a fixed 460 / 600 px tall, so
   on a phone (330 px wide) "cover" cut away both sides of it (the founder: "Fix the videos on the articles on mobile
   theyre too zoomed in cant see shit"). Below 1200 the frame takes the picture's own shape, so all of it shows. */
@media only screen and (max-width: 1199px) {
  .mxd-article__thumb { height: auto; aspect-ratio: 3 / 2; }
}

/* The legal pages' other language (Law 25 follow-ups, 2026-10-12): "Version française" / "English version", beside the
   date, in the meta row's own type. */
.mxd-article__data .hm-lang-switch { text-decoration: underline; text-underline-offset: 0.2em; color: inherit; }
.mxd-article__data .hm-lang-switch:hover { text-decoration-thickness: 2px; }

/* The Start's ring and glow reach past its edge, and the stage and each step clip (a step scrolls inside on a short window,
   which clips sideways too): the founder, 2026-10-12, "glow around start button gets cut off on the left". The stage
   starts further left and the steps pad it back, so nothing moves and the glow has room; a phone's full-width Start
   keeps a tighter ring inside its gutters. */
.hm-gs .hm-tf__stage { margin-left: -2rem; }
.hm-gs .hm-tf__stage > .hm-tf__step { padding-left: 2rem; }
@keyframes hm-start-ring-tight { 0% { transform: scale(.98); opacity: .9; } 70%, 100% { transform: scale(1.02); opacity: 0; } }
@media only screen and (max-width: 767px) {
  .hm-gs .hm-tf__stage { margin-left: -1.2rem; margin-right: -1.2rem; }
  .hm-gs .hm-tf__stage > .hm-tf__step { padding-left: 1.2rem; padding-right: 1.2rem; }
  .hm-tf__ok[data-start]::after { inset: -.4rem; animation-name: hm-start-ring-tight; }
}

/* For pros: Join and Pro sign in under the hero's lede (the founder, 2026-10-12: "add a proper cta for pros to join
   theres nothing anywhere lol"). Join is Get started's Start: Handyman green, big, with a glow. */
.hm-pro-cta { display: flex; flex-wrap: wrap; align-items: center; gap: 1.6rem; margin-top: 3.6rem; }
.hm-pro-cta a { display: inline-flex; align-items: center; justify-content: center; gap: 1rem; height: 6.4rem; padding: 0 3.6rem;
  border-radius: 99rem; font: 700 2.1rem/1 var(--_font-accent); text-decoration: none; transition: transform .2s ease, background .2s ease, border-color .2s ease; }
.hm-pro-cta a:hover { transform: translateY(-2px); }
.hm-pro-cta a:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
.hm-pro-cta__join { background: #2f9e44; color: #fff !important; box-shadow: 0 1.4rem 3.2rem -1.2rem rgba(47, 158, 68, .6); }
.hm-pro-cta__join:hover { background: #2b8a3e; }
.hm-pro-cta__join i { transition: transform .2s ease; }
.hm-pro-cta__join:hover i { transform: translateX(.4rem); }
.hm-pro-cta__in { border: 1px solid var(--st-muted); color: var(--t-bright) !important; font-weight: 600 !important; }
.hm-pro-cta__in:hover { border-color: var(--t-bright); }
[color-scheme="dark"] .hm-pro-cta__join { background: #51cf66; color: #0b2410 !important; box-shadow: 0 1.4rem 3.2rem -1.2rem rgba(81, 207, 102, .5); }
[color-scheme="dark"] .hm-pro-cta__join:hover { background: #69db7c; }
@media only screen and (max-width: 767px) {
  .hm-pro-cta { flex-direction: column; align-items: stretch; gap: 1.2rem; margin-top: 2.8rem; }
  .hm-pro-cta a { height: 5.6rem; font-size: 1.9rem; }
}

/* The menu fits the window a phone shows, not the tallest it could be (the founder: "Make sure on chrome mobile the
   bottom of sidebar doesnt get cut off on scrolling down"). Rayo sized it 100vh, which Chrome and Safari on a phone
   read with their toolbars hidden, so the panel's foot sat under the bottom bar and could not be scrolled to. */
.mxd-menu__wrapper { height: 100vh; height: 100dvh; padding-bottom: calc(1.5rem + env(safe-area-inset-bottom, 0px)); }
@media only screen and (min-width: 768px) { .mxd-menu__wrapper { padding-bottom: calc(2rem + env(safe-area-inset-bottom, 0px)); } }
@media only screen and (max-width: 1199px) { .mxd-menu__inner { padding-bottom: 2.4rem; } }
/* The menu's top row: its line on the left, Sign in on the right, under the close button. */
.hm-menu-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 1.6rem; margin-bottom: 4.4rem; }
.hm-menu-top .mxd-menu__caption { margin-bottom: 0; }
.hm-menu-signin { flex: none; display: inline-flex; align-items: center; gap: .6rem; height: 4.4rem; padding: 0 1.8rem;
  border: 1.5px solid currentColor; border-radius: 10rem; color: var(--t-opp-bright); font-size: 1.6rem; font-weight: 600;
  line-height: 1; text-decoration: none; transition: background .2s, color .2s; }
.hm-menu-signin:hover { background: var(--t-opp-bright); color: var(--base); }
.hm-menu-signin i { font-size: 1.4rem; }
.hm-menu-signin:focus-visible { outline: .3rem solid var(--accent); outline-offset: .3rem; }
/* Get started's first screen: a way back in for anyone who already has an account. */
.hm-tf__signin { margin: 1.8rem 0 0; font-size: 1.5rem; color: var(--t-medium); }
.hm-tf__signin a { color: var(--t-bright); font-weight: 600; text-decoration: underline; text-underline-offset: .3rem; }
@media only screen and (max-width: 767px) {
  .hm-menu-signin { height: 3.8rem; padding: 0 1.3rem; gap: .4rem; font-size: 1.45rem; }
  .hm-menu-top { gap: 1rem; }
}
.hm-menu-top .mxd-menu__caption { flex: 1 1 auto; min-width: 0; }

/* THE THEME SWITCH (approved 2026-10-13). For the two frames a switch takes (app.js loadTheme adds .hm-theme-swap):
   no colour fades, so no layer is left half-faded, and a paint-only change on every element, so Safari on some iPhones
   repaints each layer in the new theme instead of keeping its old picture (the headline vanished until a scroll).
   Outline at 0 width draws nothing and moves nothing. */
.hm-theme-swap *, .hm-theme-swap *::before, .hm-theme-swap *::after { transition: none !important; outline: 0 solid transparent !important; }
