/* metod.fyi — dark mode + dual-version gallery (custom, loaded after Next CSS) */

/* ============================================================
   1. Dual-version interface tiles (light/dark per project)
   Each interface tile stacks two images; CSS picks which shows
   based on the active theme, and swaps on hover (hover devices
   only — touch always shows the theme default).
   ============================================================ */
.Gallery_tile__qbYNN .m-ver { transition: opacity .4s var(--ease-out, ease); }
.Gallery_tile__qbYNN .m-ver-light { opacity: 1; }
.Gallery_tile__qbYNN .m-ver-dark  { opacity: 0; }
html[data-theme="dark"] .Gallery_tile__qbYNN .m-ver-light { opacity: 0; }
html[data-theme="dark"] .Gallery_tile__qbYNN .m-ver-dark  { opacity: 1; }

@media (hover: hover) and (pointer: fine) {
  .Gallery_tile__qbYNN:hover .m-ver-light { opacity: 0; }
  .Gallery_tile__qbYNN:hover .m-ver-dark  { opacity: 1; }
  html[data-theme="dark"] .Gallery_tile__qbYNN:hover .m-ver-light { opacity: 1; }
  html[data-theme="dark"] .Gallery_tile__qbYNN:hover .m-ver-dark  { opacity: 0; }
}

/* lightbox version indicator (two dots + label) */
.m-vtag { display: inline-flex; align-items: center; gap: 6px; }
.m-vdot { width: 7px; height: 7px; border-radius: 50%; background: rgba(255,255,255,.3); transition: background .2s ease; }
.m-vdot.m-on { background: #fff; }
.m-vlabel { font-size: 13px; letter-spacing: .02em; color: rgba(255,255,255,.7); }

/* ============================================================
   2. Theme switch — sliding sun/moon, in the header navbar
   ============================================================ */
#m-theme-toggle {
  flex: 0 0 auto; padding: 0; border: none; background: none; cursor: pointer;
  line-height: 0; -webkit-tap-highlight-color: transparent;
}
#m-theme-toggle:focus-visible { outline: 2px solid var(--ink-strong); outline-offset: 3px; border-radius: 999px; }
.m-tt-track {
  position: relative; display: block; width: 52px; height: 28px; border-radius: 999px;
  background: rgba(0,0,0,.10); transition: background-color .25s ease;
}
#m-theme-toggle:hover .m-tt-track { background: rgba(0,0,0,.16); }
html[data-theme="dark"] .m-tt-track { background: rgba(255,255,255,.16); }
html[data-theme="dark"] #m-theme-toggle:hover .m-tt-track { background: rgba(255,255,255,.24); }
.m-tt-knob {
  position: absolute; top: 3px; left: 3px; width: 22px; height: 22px; border-radius: 50%;
  background: #fff; box-shadow: 0 1px 4px rgba(0,0,0,.35), 0 1px 1px rgba(0,0,0,.2);
  display: flex; align-items: center; justify-content: center;
  transition: transform .32s cubic-bezier(.34,1.45,.5,1);
}
html[data-theme="dark"] .m-tt-knob { transform: translateX(24px); }
.m-tt-knob svg { width: 13px; height: 13px; display: block; color: #232323; }
.m-tt-knob .m-sun { display: block; }
.m-tt-knob .m-moon { display: none; }
html[data-theme="dark"] .m-tt-knob .m-sun { display: none; }
html[data-theme="dark"] .m-tt-knob .m-moon { display: block; }

/* fit the switch into the header grid (appended after Say Hello) without wrapping */
.Header_bar__O6T0V:has(#m-theme-toggle) { grid-template-columns: 50% auto 1fr auto; }
.Header_bar__O6T0V.Header_pill__ojDM5:has(#m-theme-toggle) { grid-template-columns: auto auto auto; }
.Header_bar__O6T0V #m-theme-toggle { justify-self: end; align-self: center; order: 5; }
/* below 720px the header is flex (not grid); order:5 keeps the switch last */

/* ============================================================
   2b. Inline brand logos (Dishrupt / Matborn) + "ears" tooltip in the bio
   ============================================================ */
.m-brandlogo { white-space: nowrap; }
.m-blogo { display: inline-flex; align-items: center; vertical-align: middle; transition: transform .2s var(--ease-out, ease); }
.m-blogo img { width: auto; display: block; }
.m-blogo-dishrupt img { height: 1.45em; }
.m-blogo-matborn img { height: 2em; }
.m-blogo .m-blogo-d { display: none; }
html[data-theme="dark"] .m-blogo .m-blogo-l { display: none; }
html[data-theme="dark"] .m-blogo .m-blogo-d { display: block; }
.m-brandlogo:hover .m-blogo { transform: translateY(-1px); }

/* Balkan in Motion — inline animated logo lockup, mirrors balkaninmotion.com.
   The B mark's two arrow counters spring apart and bounce back on hover
   (same SVG paths + keyframes + spring easing as the source site). */
.m-bim { display: inline-flex; align-items: center; gap: .34em; vertical-align: -0.22em; text-decoration: none; color: inherit; line-height: 1; }
.m-bim-logo { height: 1.28em; width: auto; display: block; overflow: visible; }
.m-bim .l-body { fill: var(--ink); }
.m-bim .l-arrow { fill: var(--paper); }
.m-bim-div { width: 1px; height: 1em; background: currentColor; opacity: .28; flex: 0 0 auto; }
.m-bim-word { font-weight: 600; font-size: .62em; letter-spacing: .14em; text-transform: uppercase; color: var(--ink); white-space: nowrap; }
@keyframes m-sqDown { 0%{transform:translateY(0)} 40%{transform:translateY(-520px)} 65%{transform:translateY(120px)} 82%{transform:translateY(-60px)} 100%{transform:translateY(0)} }
@keyframes m-sqUp { 0%{transform:translateY(0)} 40%{transform:translateY(520px)} 65%{transform:translateY(-120px)} 82%{transform:translateY(60px)} 100%{transform:translateY(0)} }
.m-bim:hover .l-down { animation: m-sqDown .85s cubic-bezier(0.34,1.56,0.64,1); }
.m-bim:hover .l-up { animation: m-sqUp .85s cubic-bezier(0.34,1.56,0.64,1); }
@media (prefers-reduced-motion: reduce) { .m-bim:hover .l-down, .m-bim:hover .l-up { animation: none; } }

.m-ears-wrap { position: relative; display: inline-block; }
.m-ears {
  font: inherit; color: inherit; background: none; border: none; padding: 0; cursor: help;
  text-decoration: underline dotted; text-underline-offset: 3px; text-decoration-thickness: 1.5px;
  -webkit-tap-highlight-color: transparent;
}
.m-ears:hover { text-decoration-style: solid; }
.m-ears-tip {
  position: absolute; left: 0; bottom: calc(100% + 10px); z-index: 70;
  width: min(330px, 80vw); padding: 12px 14px; border-radius: 12px;
  font-size: 13.5px; line-height: 1.5; letter-spacing: -.005em; white-space: normal;
  background: var(--ink-strong); color: var(--paper); text-align: left;
  box-shadow: 0 18px 40px -14px rgba(0,0,0,.5), 0 0 0 1px rgba(0,0,0,.05);
  opacity: 0; visibility: hidden; transform: translateY(4px);
  transition: opacity .18s ease, transform .18s var(--ease-out, ease), visibility .18s;
  pointer-events: none;
}
.m-ears-tip:after {
  content: ""; position: absolute; top: 100%; left: var(--arrow-x, 20px); margin-left: -6px;
  border: 6px solid transparent; border-top-color: var(--ink-strong);
}
.m-ears-wrap.m-tip-on .m-ears-tip,
.m-ears-wrap:focus-within .m-ears-tip {
  opacity: 1; visibility: visible; transform: translateY(0); pointer-events: auto;
}

/* empty category state (e.g. Creative before work is added) */
.m-empty {
  grid-column: 1 / -1; text-align: center;
  color: var(--ink-muted); font-size: 15px;
  padding: 72px 0 96px;
}

/* ============================================================
   3. Dark theme — token overrides (most of the site recolors
   automatically because it reads these CSS variables).
   ============================================================ */
html[data-theme="dark"] {
  --paper: #080808;
  --paper-sunken: #161616;
  --ink-block: #f2f2f2;
  --ink: #e7e7e7;
  --ink-strong: #ffffff;
  --ink-muted: #7d7d7d;
  --ink-faint: #9b9b9b;
  color-scheme: dark;
}
html[data-theme="dark"] body { background: var(--paper); color: var(--ink); }

/* ============================================================
   4. Dark theme — targeted fixes for hardcoded colors
   ============================================================ */
/* logo is a monochrome (Lottie) mark — invert it for dark mode */
html[data-theme="dark"] .Header_lottie__2JCUH { filter: invert(1); }
html[data-theme="dark"] .Header_navArrow__4ODT8 path,
html[data-theme="dark"] .Hero_arrowOut__FWbKE path { stroke: #cfcfcf; }

/* header (scrolled pill + Say Hello button) */
html[data-theme="dark"] .Header_pill__ojDM5 {
  background: rgba(20,20,22,.62);
  border-color: rgba(255,255,255,.12);
  box-shadow: 0 12px 34px -10px rgba(0,0,0,.5), 0 2px 8px rgba(0,0,0,.4);
}
html[data-theme="dark"] .Header_sayHello__mf2re { background: rgba(255,255,255,.08); }
html[data-theme="dark"] .Header_sayHello__mf2re:hover { background: rgba(255,255,255,.16); }

/* gallery controls */
html[data-theme="dark"] .Gallery_toggle__N2f62 { background: rgba(255,255,255,.06); }
html[data-theme="dark"] .Gallery_tab__4Px3R.Gallery_active__QPxZH {
  background: #232323;
  box-shadow: 0 1px 3px rgba(0,0,0,.5), 0 0 0 1px rgba(255,255,255,.08);
}
html[data-theme="dark"] .Gallery_tile__qbYNN:after { box-shadow: inset 0 0 0 1px rgba(255,255,255,.07); }
html[data-theme="dark"] .Gallery_dotCursor__uCBai { background: rgba(255,255,255,.22); }

/* generic soft surfaces that were black-on-light */
html[data-theme="dark"] .Experience_cta__gUO_R { background: #2c2c2c; }
html[data-theme="dark"] .Experience_cta__gUO_R:hover { background: #3a3a3a; }

/* ============================================================
   5. Dark theme — book-call (IntakeBooking/BookCall) + experience
   + global contrast fixes (hardcoded rgba(0,0,0,*) don't follow vars)
   Found via adversarial review.
   ============================================================ */
/* book-call: text */
html[data-theme="dark"] .IntakeBooking_optionHint__JRX2m { color: rgba(255,255,255,.55); }
html[data-theme="dark"] .IntakeBooking_count__YCFf4,
html[data-theme="dark"] .IntakeBooking_keyword__Cp6d_ { color: rgba(255,255,255,.5); }
/* book-call: option cards + markers + inputs */
html[data-theme="dark"] .IntakeBooking_option__PSu_S { border-color: rgba(255,255,255,.14); }
html[data-theme="dark"] .IntakeBooking_option__PSu_S:hover { border-color: rgba(255,255,255,.32); background: rgba(255,255,255,.04); }
html[data-theme="dark"] .IntakeBooking_marker__QEp04 { border-color: rgba(255,255,255,.28); }
html[data-theme="dark"] .IntakeBooking_track__YuBZA { background: rgba(255,255,255,.12); }
html[data-theme="dark"] .IntakeBooking_input___VH2n { border-color: rgba(255,255,255,.16); }
html[data-theme="dark"] .IntakeBooking_loaderSpinner__VjxbE { border-color: rgba(255,255,255,.18); border-top-color: #F85B26; }
/* book-call: floating action dock (was light glass) */
html[data-theme="dark"] .IntakeBooking_actionBarInner__RsfnR {
  background: rgba(20,20,22,.62); border-color: rgba(255,255,255,.12);
  box-shadow: 0 12px 34px -10px rgba(0,0,0,.5), 0 2px 8px rgba(0,0,0,.4);
}
/* book-call: soft button surfaces */
html[data-theme="dark"] .IntakeBooking_back__0nMHA,
html[data-theme="dark"] .IntakeBooking_chip__NAQtt,
html[data-theme="dark"] .BookCall_toggle__oQ0Yy { background: rgba(255,255,255,.08); }
html[data-theme="dark"] .IntakeBooking_back__0nMHA:hover { background: rgba(255,255,255,.16); }
/* experience: timeline dividers + hover + photo frame */
html[data-theme="dark"] .Experience_row__SEQFt { border-top-color: rgba(255,255,255,.1); }
html[data-theme="dark"] .Experience_row__SEQFt:not(.Experience_closeRow__xoR0W):hover:before { background: rgba(255,255,255,.05); }
html[data-theme="dark"] .Experience_photo__4oitn { border-color: #161616; }
/* global: text selection */
html[data-theme="dark"] ::selection { background: rgba(255,255,255,.18); color: var(--ink-strong); }

/* ============================================================
   6. Theme switch relocated into the gallery bar (homepage)
   tabs (left) · switch (center, tab-height) · New project? Let's talk! (right);
   "Available for projects" removed. On other pages the switch stays
   in the header navbar (small) via the rules in section 2.
   ============================================================ */
.Gallery_bar__ui_tD { grid-template-columns: 1fr auto 1fr; align-items: center; }
.Gallery_bar__ui_tD .Gallery_toggle__N2f62 { order: 0; justify-self: start; }
.Gallery_bar__ui_tD #m-theme-toggle { order: 1; justify-self: center; }
.Gallery_bar__ui_tD .Gallery_barRight__c4yhz { order: 2; justify-self: end; }
.Gallery_bar__ui_tD .Gallery_status__dA9Qr { display: none; }

/* taller switch in the bar to match the tab pill / CTA height */
.Gallery_bar__ui_tD #m-theme-toggle .m-tt-track { width: 84px; height: 46px; }
.Gallery_bar__ui_tD #m-theme-toggle .m-tt-knob { width: 38px; height: 38px; top: 4px; left: 4px; }
html[data-theme="dark"] .Gallery_bar__ui_tD #m-theme-toggle .m-tt-knob { transform: translateX(38px); }
.Gallery_bar__ui_tD #m-theme-toggle .m-tt-knob svg { width: 19px; height: 19px; }

/* mobile: tabs full-width on top; then switch (compact, left) + New project? Let's talk!
   (fills the rest) — aligned to the tab row's edges, so the switch doesn't
   float in an empty half. */
@media (max-width: 600px) {
  .Gallery_bar__ui_tD { grid-template-columns: auto 1fr; column-gap: 12px; row-gap: 12px; }
  .Gallery_bar__ui_tD .Gallery_toggle__N2f62 { grid-column: 1 / -1; }
  .Gallery_bar__ui_tD #m-theme-toggle { grid-column: 1; justify-self: start; }
  .Gallery_bar__ui_tD .Gallery_barRight__c4yhz { grid-column: 2; justify-self: stretch; }
}

/* ============================================================
   7. Bio "read more" — collapsed preview with a frosted fade that
   ramps blur + fades to the page colour over the lower lines, plus a
   pill reveal button. Balances the tall bio against the short headline.
   theme.js toggles `.m-bio-open` and animates max-height.
   ============================================================ */
.m-bio-clip {
  position: relative; overflow: hidden;
  display: flex; flex-direction: column; gap: inherit;  /* keep the bio's paragraph rhythm */
  max-height: 24.5em; transition: max-height .6s cubic-bezier(.4, 0, .2, 1);
}
.m-bio-clip::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 9em;
  pointer-events: none; opacity: 1; transition: opacity .4s ease;
  background: linear-gradient(to bottom, rgba(255,255,255,0) 0%, var(--paper) 88%);
  -webkit-backdrop-filter: blur(2.6px); backdrop-filter: blur(2.6px);
  -webkit-mask-image: linear-gradient(to bottom, transparent 0%, #000 62%);
  mask-image: linear-gradient(to bottom, transparent 0%, #000 62%);
}
html[data-theme="dark"] .m-bio-clip::after {
  background: linear-gradient(to bottom, rgba(8,8,8,0) 0%, var(--paper) 88%);
}
.m-bio-clip.m-bio-open { max-height: 200em; }
.m-bio-clip.m-bio-open::after { opacity: 0; }

.m-bio-more {
  align-self: flex-start;  /* hug content, don't stretch the bio column */
  margin-top: .35em; display: inline-flex; align-items: center; gap: .5em;
  padding: .62em 1.2em; border-radius: 999px; cursor: pointer;
  font: inherit; font-size: .92em; font-weight: 500; line-height: 1;
  color: var(--ink-strong); background: transparent;
  border: 1px solid rgba(0,0,0,.20);
  transition: background-color .2s ease, border-color .2s ease, transform .12s ease;
  -webkit-tap-highlight-color: transparent;
}
.m-bio-more:hover { background: rgba(0,0,0,.05); border-color: rgba(0,0,0,.42); }
.m-bio-more:active { transform: translateY(1px); }
.m-bio-more:focus-visible { outline: 2px solid var(--ink-strong); outline-offset: 3px; }
html[data-theme="dark"] .m-bio-more { border-color: rgba(255,255,255,.24); }
html[data-theme="dark"] .m-bio-more:hover { background: rgba(255,255,255,.08); border-color: rgba(255,255,255,.5); }
.m-bio-chev { flex: 0 0 auto; transition: transform .3s ease; }
.m-bio-more[aria-expanded="true"] .m-bio-chev { transform: rotate(180deg); }

/* ============================================================
   8. "Say Hello" icon — martial-arts shaka hand (wrapped fists) in
   place of the wave SVG. Sits in .Header_wave, so it still "shakes"
   on hover via the header's existing wave keyframes.
   ============================================================ */
.Header_wave__9DzMa .m-hello-hand { display: block; width: auto; height: 26px; }

/* keep "right, and digital experiences" together only where there's room —
   on mobile it must wrap or it overflows the viewport */
@media (min-width: 901px) { .m-nowrap { white-space: nowrap; } }
/* give the headline column a touch more room on desktop so "right, and digital
   experiences" fits on one line without shrinking the type */
@media (min-width: 901px) {
  .Hero_hero__bqvNd { grid-template-columns: 53% 47%; }
  .Hero_hero__bqvNd > * { min-width: 0; }
}
/* Mobile: pin the single column to the viewport (minmax 0) and let grid items
   shrink, so the wide marquee track (clipped by overflow:hidden) can't stretch
   the column past the screen. */
@media (max-width: 900px) {
  .Hero_hero__bqvNd { grid-template-columns: minmax(0, 1fr); }
  .Hero_hero__bqvNd > * { min-width: 0; max-width: 100%; }
}

/* Clients marquee — under the signature (desktop) / after the bio (mobile),
   shown only once the bio is expanded so the two columns stay balanced.
   Two instances: .m-clients-lead (desktop, in the left column) and
   .m-clients-bio (mobile, at the end of the bio). */
.m-clients { display: none; margin-top: 72px; max-width: 100%; }
.m-clients-label {
  font-size: 13px; line-height: 1.4; color: var(--ink-faint);
  letter-spacing: -.005em; margin-bottom: 20px; max-width: 340px;
}
.m-marquee {
  overflow: hidden; max-width: 100%;
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 7%, #000 93%, transparent);
  mask-image: linear-gradient(90deg, transparent, #000 7%, #000 93%, transparent);
}
.m-marquee-track {
  display: flex; align-items: center; gap: 48px; width: max-content;
  animation: m-marquee 34s linear infinite;
}
@keyframes m-marquee { to { transform: translateX(-50%); } }
.m-marquee:hover .m-marquee-track { animation-play-state: paused; }
.m-cl { height: 28px; width: auto; flex: 0 0 auto; opacity: .55; }
html[data-theme="dark"] .m-cl { filter: invert(1); opacity: .62; }
@media (prefers-reduced-motion: reduce) { .m-marquee-track { animation: none; } }
/* desktop: show the left instance only when the story is expanded */
@media (min-width: 901px) {
  .Hero_hero__bqvNd:has(.m-bio-clip.m-bio-open) .m-clients-lead { display: block; }
}
/* mobile: the bio instance (inside the collapsible clip → only visible when
   expanded) sits after "…the ears" */
@media (max-width: 900px) { .m-clients-bio { display: block; margin-top: 56px; } }
/* give the "Show less" button room to breathe below the marquee on mobile
   (only in the expanded state, so the collapsed "Read the full story" is untouched) */
@media (max-width: 900px) { .m-bio-clip.m-bio-open + .m-bio-more { margin-top: 40px; } }

/* Book-call intake — on mobile the floating translucent "Continue" pill looked
   odd while scrolling (content peeking behind the blur, overlapping the last
   card). Turn it into a clean full-width solid footer, and pad the content so
   nothing hides underneath. */
@media (max-width: 640px) {
  .IntakeBooking_actionBar__XLXqn {
    position: fixed; left: 0; right: 0; bottom: 0; top: auto;
    padding: 12px var(--edge) calc(14px + env(safe-area-inset-bottom, 0px));
    background: var(--paper); border-top: 1px solid rgba(0,0,0,.08);
    justify-content: stretch; z-index: 45;
  }
  .IntakeBooking_actionBarInner__RsfnR {
    width: 100%; gap: 12px;
    background: transparent; border: 0; box-shadow: none; padding: 0;
    -webkit-backdrop-filter: none; backdrop-filter: none;
  }
  .IntakeBooking_wrap__K9_Du { padding-bottom: 104px; }   /* clear the fixed footer */
  .IntakeBooking_next__shwAs { flex: 1; justify-content: center; }   /* full-width primary CTA */
}
html[data-theme="dark"] .IntakeBooking_actionBar__XLXqn {
  background: var(--paper); border-top-color: rgba(255,255,255,.1);
}

/* Understated inline link (e.g. dishrupt.agency in the About text) — ink-coloured,
   not blue, subtle underline that firms up on hover. */
.m-inline-link {
  color: inherit; text-decoration: underline; text-decoration-thickness: 1px;
  text-underline-offset: 3px; text-decoration-color: rgba(0,0,0,.28);
  transition: text-decoration-color .15s ease;
}
.m-inline-link:hover { text-decoration-color: currentColor; }
html[data-theme="dark"] .m-inline-link { text-decoration-color: rgba(255,255,255,.35); }

/* Inline media terms (Omar Naber → photo, Zgrešeni Primeri → video) — popover
   in the style of the "ears" tooltip: hover/tap to open, viewport-clamped. */
.m-media-wrap { position: relative; display: inline-block; }
.m-media {
  font: inherit; color: inherit; background: none; border: 0; padding: 0; cursor: pointer;
  text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 3px;
  text-decoration-color: rgba(0,0,0,.28); -webkit-tap-highlight-color: transparent;
}
.m-media:hover { text-decoration-color: currentColor; }
html[data-theme="dark"] .m-media { text-decoration-color: rgba(255,255,255,.4); }
.m-media-pop {
  position: absolute; left: 0; bottom: calc(100% + 12px); z-index: 80;
  padding: 6px; border-radius: 14px; line-height: 0;
  background: var(--ink-strong);
  box-shadow: 0 20px 46px -16px rgba(0,0,0,.6), 0 0 0 1px rgba(0,0,0,.06);
  opacity: 0; visibility: hidden; transform: translateY(6px) scale(.98);
  transition: opacity .18s ease, transform .22s var(--ease-out, ease), visibility .18s;
  pointer-events: none;
}
.m-media-wrap.m-media-on .m-media-pop { opacity: 1; visibility: visible; transform: none; pointer-events: auto; }
.m-media-pop::after {
  content: ""; position: absolute; top: 100%; left: var(--arrow-x, 24px); margin-left: -6px;
  border: 6px solid transparent; border-top-color: var(--ink-strong);
}
.m-media-pop img { display: block; width: min(220px, 58vw); height: auto; border-radius: 9px; }
.m-media-pop video { display: block; width: min(300px, 76vw); height: auto; border-radius: 9px; background: #000; }
.m-media-sound {
  position: absolute; right: 14px; bottom: 14px; z-index: 2;
  width: 34px; height: 34px; border-radius: 50%; border: 0; cursor: pointer; padding: 0;
  display: flex; align-items: center; justify-content: center;
  background: rgba(0,0,0,.55); color: #fff;
  -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px);
}
.m-media-sound svg { width: 16px; height: 16px; }

/* ============================================================
   9. "Say Hello" contact FAB — expanding menu (copy email / send it)
   with a blurred backdrop. Scrim z=40 sits UNDER the sticky header
   (z=50) so the header + button stay crisp while the page blurs;
   the popover sits above everything at z=60.
   ============================================================ */
/* One overlay above everything (incl. the sticky header). Backdrop + menu are
   its children, so the menu always paints above the blur — no z-index race,
   and it works around the iOS backdrop-filter compositing bug. */
.m-hello-overlay { position: fixed; inset: 0; z-index: 9998; }
.m-hello-scrim {
  position: absolute; inset: 0;
  background: rgba(0,0,0,.05);
  -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
  opacity: 0; transition: opacity .22s ease;
}
.m-hello-scrim.on { opacity: 1; }
html[data-theme="dark"] .m-hello-scrim { background: rgba(0,0,0,.5); }

.m-hello-menu {
  position: absolute; z-index: 1; min-width: 246px; padding: 6px;
  background: var(--paper); border: 1px solid rgba(0,0,0,.09); border-radius: 18px;
  box-shadow: 0 18px 50px rgba(0,0,0,.18), 0 3px 10px rgba(0,0,0,.08);
  transform-origin: top right; opacity: 0; transform: translateY(-8px) scale(.96);
  transition: opacity .18s ease, transform .24s cubic-bezier(.34,1.4,.5,1);
}
.m-hello-menu.on { opacity: 1; transform: none; }
html[data-theme="dark"] .m-hello-menu {
  border-color: rgba(255,255,255,.12);
  box-shadow: 0 18px 50px rgba(0,0,0,.6), 0 3px 10px rgba(0,0,0,.4);
}

.m-hello-item {
  display: flex; align-items: center; gap: 12px; width: 100%;
  padding: 10px 12px; border-radius: 12px; border: 0; background: transparent;
  cursor: pointer; text-align: left; text-decoration: none; color: var(--ink-strong);
  font: inherit; -webkit-tap-highlight-color: transparent;
  transition: background-color .15s ease;
}
.m-hello-item + .m-hello-item { margin-top: 2px; }
.m-hello-item:hover, .m-hello-item:focus-visible { background: rgba(0,0,0,.05); outline: none; }
html[data-theme="dark"] .m-hello-item:hover,
html[data-theme="dark"] .m-hello-item:focus-visible { background: rgba(255,255,255,.08); }
.m-hello-ic {
  flex: 0 0 auto; display: flex; align-items: center; justify-content: center;
  width: 36px; height: 36px; border-radius: 10px;
  background: rgba(0,0,0,.06); color: var(--ink-strong);
  transition: background-color .2s ease, color .2s ease;
}
html[data-theme="dark"] .m-hello-ic { background: rgba(255,255,255,.1); }
.m-hello-ic svg { width: 18px; height: 18px; }
.m-hello-tx { display: flex; flex-direction: column; line-height: 1.3; min-width: 0; }
.m-hello-t1 { font-size: 14px; font-weight: 600; }
.m-hello-t2 { font-size: 12px; opacity: .55; white-space: nowrap; }
.m-hello-item.copied .m-hello-ic { background: rgba(26,127,55,.14); color: #1a7f37; }
html[data-theme="dark"] .m-hello-item.copied .m-hello-ic { background: rgba(64,196,99,.2); color: #4ac26b; }

/* ============================================================
   10. Signature — "Metod" cursive under the headline. SVG traced from
   the handwritten mark, coloured via currentColor (theme-swaps), and
   "written on" via a soft left-to-right mask sweep. Draws on load and
   replays on hover / click (restart handled in theme.js).
   ============================================================ */
.m-sig-wrap {
  position: relative;
  display: block; margin-top: 30px; width: min(330px, 74%);
  color: var(--ink-strong); cursor: pointer;
}
.m-sig { display: block; width: 100%; height: auto; overflow: visible; }
/* True "writes each letter": the signature is a filled vector revealed through
   a centre-line stroke MASK that draws itself with stroke-dashoffset, following
   the real pen path (traced with autotrace, reordered into writing order). It
   starts undrawn (offset 1 → fill fully masked/hidden) and only ever draws IN
   (forwards, no delay), so it can never show-then-hide or get stuck. The fill
   keeps the original thick/thin. */
.m-sig-pen {
  stroke-dasharray: 1; stroke-dashoffset: 1;
  animation: m-sig-write 3.4s cubic-bezier(.62, .04, .26, 1) forwards;
}
@keyframes m-sig-write { to { stroke-dashoffset: 0; } }
.m-sig-wrap.m-sig-off .m-sig-pen { animation: none !important; }   /* restart on replay */
@media (prefers-reduced-motion: reduce) { .m-sig-pen { animation: none; stroke-dashoffset: 0; } }
@media (max-width: 900px) { .m-sig-wrap { margin-top: 22px; width: 240px; } }

/* =========================================================================
   AUDIT FIXES (2026-07-02) — a11y, contrast, focus, book-call, helpers
   ========================================================================= */
/* Contrast: light-mode --ink-muted (#a3a3a3) failed WCAG AA at 2.52:1 on white.
   Darken to ~4.5:1. Dark mode (#7d7d7d on #080808 = 4.87:1) is left untouched. */
html:not([data-theme="dark"]) { --ink-muted: #737373; }

/* Visible keyboard focus on interactive controls that lacked it */
.Gallery_tab__4Px3R:focus-visible,
.Header_sayHello__mf2re:focus-visible,
.m-bio-more:focus-visible,
.Footer_social__cGivK:focus-visible,
.m-ears:focus-visible,
.m-media:focus-visible,
.m-hello-menu button:focus-visible,
.m-hello-menu a:focus-visible,
.IntakeBooking_option__PSu_S:focus-visible,
.m-bim:focus-visible,
.m-inline-link:focus-visible {
  outline: 2px solid var(--ink-strong); outline-offset: 2px; border-radius: 6px;
}
body:has(.IntakeBooking_actionBar__XLXqn) input:focus-visible,
body:has(.IntakeBooking_actionBar__XLXqn) textarea:focus-visible {
  outline: 2px solid var(--ink-strong); outline-offset: 1px;
}

/* Visually-hidden helper (screen-reader-only text, e.g. the book-call <h1>) */
.m-vh {
  position: absolute !important; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

/* book-call: on mobile the action bar is position:fixed; add space so it never
   overlaps the footer when scrolled to the bottom (scoped to the booking page) */
@media (max-width: 640px) {
  body:has(.IntakeBooking_actionBar__XLXqn) { padding-bottom: 92px; }
}

/* 404 page — branded, self-contained (no Next chunks) */
.m-404 {
  min-height: 60vh; display: flex; flex-direction: column; align-items: center;
  justify-content: center; text-align: center; gap: 10px; padding: 120px 24px 96px;
}
.m-404-eyebrow { font-size: 13px; letter-spacing: .08em; text-transform: uppercase; color: var(--ink-muted); margin: 0; }
.m-404 h1 { font-size: clamp(40px, 8vw, 76px); line-height: 1.02; letter-spacing: -.03em; color: var(--ink-strong); margin: 4px 0 0; }
.m-404-sub { font-size: 17px; color: var(--ink-muted); margin: 0; max-width: 420px; }
.m-404-home {
  margin-top: 18px; display: inline-flex; align-items: center; gap: .5em;
  padding: .72em 1.4em; border-radius: 999px; background: var(--ink-strong); color: var(--paper);
  text-decoration: none; font-weight: 500; font-size: 15px;
  transition: transform .12s ease, opacity .2s ease;
}
.m-404-home:hover { transform: translateY(-1px); opacity: .92; }
.m-404-home:focus-visible { outline: 2px solid var(--ink-strong); outline-offset: 3px; }

/* =========================================================================
   FLUIDITY + VISUALS upgrade (2026-07-02)
   ========================================================================= */

/* --- Cross-document page transitions (progressive enhancement) ---
   Supported browsers crossfade between pages; the header & footer are given
   stable view-transition-names so they stay put while the content swaps.
   Unsupported browsers just navigate instantly (no regression). */
@view-transition { navigation: auto; }
header.Header_header__KwdYD { view-transition-name: m-header; }
footer.Footer_footer__pQtti { view-transition-name: m-footer; }
@media (prefers-reduced-motion: no-preference) {
  ::view-transition-old(root) { animation: m-vt-out .26s var(--ease-out) both; }
  ::view-transition-new(root) { animation: m-vt-in .34s var(--ease-out) both; }
}
@keyframes m-vt-out { to   { opacity: 0; transform: translateY(-6px); } }
@keyframes m-vt-in  { from { opacity: 0; transform: translateY(10px); } }

/* --- Orange accent system (#F85B26) ---
   Used as the consistent interactive through-line: text selection, link &
   nav hovers, the active gallery category, and small details. Kept to
   hover/selection/reinforced states so it never becomes low-contrast body text. */
:root { --accent: #F85B26; }
::selection { background: rgba(248,91,38,.22); color: var(--ink-strong); }
html[data-theme="dark"] ::selection { background: rgba(248,91,38,.34); color: #fff; }

.Header_navLink__Rvw2c:hover { color: var(--accent); }
.Header_navLink__Rvw2c:hover .Header_navArrow__4ODT8 path { stroke: var(--accent); }
.Footer_social__cGivK:hover { color: var(--accent); }
.m-inline-link:hover { color: var(--accent); text-decoration-color: var(--accent); }

/* gallery category tabs: neutral, no orange — the active tab is indicated by the
   paper pill + shadow (light) / dark pill (dark), not colour */
.Gallery_tab__4Px3R:not(.Gallery_active__QPxZH):hover { color: var(--ink); }
.Gallery_tab__4Px3R.Gallery_active__QPxZH { color: var(--ink); }

/* email-copy confirmation + small links pick up the accent on hover */
.Lightbox_capLink__AHHUQ:hover { color: var(--accent); opacity: 1; }

/* creative motion tiles — the autoplaying <video> must not swallow taps meant to open the lightbox */
.Gallery_tile__qbYNN .m-vid { pointer-events: none; border-radius: inherit; }

/* lightbox image counter + mobile swipe hint (multi-image projects) */
.m-lbcount{position:fixed;top:calc(18px + env(safe-area-inset-top,0px));left:50%;transform:translateX(-50%);z-index:6;display:flex;flex-direction:column;align-items:center;gap:7px;pointer-events:none}
.m-lbnum{background:rgba(18,18,20,.6);color:#fff;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);font-size:13px;font-weight:600;padding:5px 13px;border-radius:999px;font-variant-numeric:tabular-nums;box-shadow:0 2px 12px rgba(0,0,0,.28)}
.m-lbhint{color:rgba(255,255,255,.72);font-size:11px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;display:none}
@media (pointer:coarse){.m-lbhint{display:block;animation:m-lbhintfade 3.4s ease forwards}}
@keyframes m-lbhintfade{0%,52%{opacity:.75}100%{opacity:0}}
