/* first-paint stability (2026-08-24, Fable): metric-matched fallback for the hero accent.
   Until Instrument Serif loads the browser used Georgia, which is 21.6% wider (1016 vs 835px
   for the same string @100px) - the accent wrapped to a 2nd line and the two words painted on
   top of each other for ~100ms after every reload. 'ISerif-fb' is Georgia scaled to the real
   face's exact width (835/1016 = 82.25%), so the line count can never change. */
@font-face{font-family:'ISerif-fb';src:local('Georgia Italic'),local('Georgia');font-style:italic;size-adjust:82.25%}

/* mobile-fix.css — phone-only corrections for the aioos.ai landing page.
   Load LAST, after every other stylesheet. Additive only; every layout rule is inside a
   max-width query, so desktop is untouched.

   Grounded in the AIOOS Design Canon (hetzner-vox:/home/vox/specs/DESIGN-CANON-AIOOS.md):
     C3   one visually dominant element per screen, one filled primary action
     C12  nothing grabs attention uninvited - target zero
     §3 Chatbot-Embed: "Launcher = six-wave mark alone: no pulsing halo, no fake '1' badge
         ... never out-shouts the host's own primary CTA"

   What was wrong, measured on a real device and reproduced on an iPhone WebKit preview:
   two position:fixed controls own the bottom corners permanently - #bfab .fab bottom-left
   and .aw.aw-fixed bottom-right (z-index 140). Whatever scrolls under them is covered.
   At one scroll position that is the trust-chip row; a little further down it is the
   "Demo ansehen" CTA itself. So this is not a chips bug, it is the launcher obstructing
   the host's primary CTA, which the canon forbids outright. */

/* ---------------------------------------------------------------- 1. forced dark mode */
/* The page declares no colour-scheme, so Samsung Internet and Chrome auto-dark are free to
   invert it: the brand gradient goes muddy and "kluger kommunizieren" ends up dark blue on
   near-black. Declaring the scheme we actually ship stops the inversion. This is not a
   mobile-only rule on purpose - the same browsers do it on desktop. */
:root { color-scheme: light; }

/* --------------------------------------------------------- 2. the launcher's status pip */
/* span.aw-pip inside .aw-launch, rgb(18,161,74), 8px. A permanent green badge on the
   launcher is exactly the "fake badge" the embed checklist rules out, and it is an
   uninvited attention grabber under C12. It also carries no state: it is green whether or
   not anything is live. Iman's standing rule: no status dots on AIOOS surfaces. */
.aw-pip { display: none !important; }

@media (max-width: 760px) {

  /* ------------------------------------------- 3. the floating controls yield to content */
  /* They stay exactly where they are and look exactly as they did - they simply get out of
     the way while the page is moving, and come back when it stops. Nothing is permanently
     covered any more, and the launcher stops competing with the CTA in the same viewport
     (C3). Driven by mobile-fix.js, which only toggles .is-scrolling on <html>. */
  #bfab .fab,
  .aw.aw-fixed,
  .to-top {
    transition: opacity .2s ease, transform .2s ease, visibility .2s;
  }
  html.is-scrolling #bfab .fab {
    opacity: 0;
    transform: translateX(-120%);
    pointer-events: none;
    /* visibility, not just pointer-events: branchen.css re-enables hit-testing on the
       child with #bfab .tab{pointer-events:auto}, so the faded-out tab still stole the
       tap on DSGVO-KONFORM at 375 and 402px. visibility takes the whole subtree out. */
    visibility: hidden;
  }
  html.is-scrolling .aw.aw-fixed,
  html.is-scrolling .to-top {
    opacity: 0;
    transform: translateX(120%);
    pointer-events: none;
    /* visibility, not just pointer-events: branchen.css re-enables hit-testing on the
       child with #bfab .tab{pointer-events:auto}, so the faded-out tab still stole the
       tap on DSGVO-KONFORM at 375 and 402px. visibility takes the whole subtree out. */
    visibility: hidden;
  }

  /* -------------------------------------------------- 4. the tab stops sharing its pixels */
  /* At 80% opacity the body text behind the Branchen tab read through its middle, so pill
     and paragraph smeared into one illegible block. Opaque, and smaller, so it takes less
     of a 402px screen. Also: max one backdrop-blur surface per viewport (D2) - this one
     drops its blur, the nav keeps it. */
  #bfab .tab {
    background: #fff;
    backdrop-filter: none;
    padding: 10px 14px;
    gap: 8px;
    box-shadow: 0 10px 30px -12px rgb(10 18 34 / .35);
  }
  #bfab .tab .word {
    font-size: 10px;
    letter-spacing: .14em;
  }

  /* the collapsed menu keeps a 320x356 fixed box over the page with only opacity:0.
     pointer-events is already none; this takes it out of the layout and the a11y tree. */
  #bfab .fab:not(.open) .menu { visibility: hidden; }
  #bfab .fab.open .menu      { visibility: visible; }

  /* --------------------------------------------------------------- 5. the trust-chip row */
  /* Four short labels were eating four full-width rows of a 664px screen. Two-up. */
  .hero-chips,
  .assure {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 8px;
    justify-items: stretch;
  }
  .hero-chips > *,
  .assure > * {
    width: 100%;
    margin: 0;
    justify-content: center;
    align-items: center;
    gap: 6px;
    font-size: 11px;
    padding-left: 10px;
    padding-right: 10px;
    white-space: nowrap;
  }
  .hero-chips > * > *,
  .assure > * > * { white-space: nowrap; }

  /* NOTE: margin-bottom on the chip row does NOT lift it clear of the controls - the
     controls are anchored to the viewport, not to the flow, so the row stays exactly where
     it was and only the content BELOW moves. Measured and discarded. The row is kept clear
     by hiding the controls while it is on screen (see .row-visible in mobile-fix.js). */
  html.row-visible #bfab .fab,
  html.row-visible .aw.aw-fixed,
  html.row-visible .to-top {
    opacity: 0;
    transform: none;
    pointer-events: none;
    /* visibility, not just pointer-events: branchen.css re-enables hit-testing on the
       child with #bfab .tab{pointer-events:auto}, so the faded-out tab still stole the
       tap on DSGVO-KONFORM at 375 and 402px. visibility takes the whole subtree out. */
    visibility: hidden;
  }
}

/* prefers-reduced-motion: the controls still yield, they just do not slide (C canon: every
   state stays readable without the show). */
@media (prefers-reduced-motion: reduce) {
  #bfab .fab, .aw.aw-fixed, .to-top { transition: opacity .01s linear; }
  html.is-scrolling #bfab .fab,
  html.is-scrolling .aw.aw-fixed,
  html.is-scrolling .to-top { transform: none; }
}

/* ══════════════════════════════════════════════════════════════════════════
   MOBILE PASS 2026-08-15 — measured on a 390x844 iPhone against the live site.
   Everything below is inside a max-width query except one no-op blur removal.
   ══════════════════════════════════════════════════════════════════════════ */

/* 1 · The bar was pressed flat against both screen edges — the pill read as
   cut off. nav is width:fit-content with a 38px gap and 26px of left padding,
   so it asked for 369px inside a 350px slot and spilled over its own shell.
   The rule that fixes this was written months ago in api.css and never
   reached the home page. */
@media (max-width:900px){
  .nav-shell nav{gap:16px; padding:10px 10px 10px 18px}
}
@media (max-width:520px){
  .nav-shell{padding:0 14px}
  .nav-shell nav{gap:10px; padding:8px 8px 8px 14px}
}

/* 2 · The glass belongs to the bar. A bare nav{} selector in index.html also
   catches <nav class="foot-legal">, so the footer's legal links were carrying
   a 50px backdrop blur and an inset white highlight. The background was
   already reset to transparent by a later rule, so the blur samples a flat
   surface and paints nothing — it only costs GPU. */
footer nav.foot-legal{backdrop-filter:none; -webkit-backdrop-filter:none; box-shadow:none}

/* 3 · Type that a person actually has to read. Measured on the live page:
   21 elements between 9px and 13px. Text inside the device mockups is
   deliberately small — it is a picture of an interface, not something to
   read — so .zux-mock, .mwp, .bwin and the phone frames are left alone. */
@media (max-width:640px){
  .chan-grid i.soon{font-size:11px}
  .vs-wrap small{font-size:12px}
  .vs-row .voth{font-size:12px}
  .vs-row em.vtx{font-size:12px}
  .vs-row .vlab{font-size:12px}
  .price .pchan-t{font-size:12px}
  .price .pchan span{font-size:12.5px}
  .zux-col .zux-tag{font-size:12.5px}
  .quotes-feat .vs-tag.new{font-size:12.5px}
  .quotes-feat .ro2{font-size:13px}
  #vergleich .vs-note{font-size:13px}
  .bill-toggle .bill-save{font-size:13px}
  .price .old{font-size:13px}
  .footer .foot-col h5{font-size:13px}
  .footer .foot-bot span{font-size:13px}
  .footer .foot-legal a{font-size:13px}
}

/* 4 · Touch targets. WCAG 2.5.5 asks for 44px; these were 16px to 43px.
   min-height rather than padding wherever the element already lays out as a
   flex or grid box, so nothing reflows sideways. */
@media (max-width:900px){
  .nav-shell .brand,
  .nav-shell .nav-login,
  .nav-shell .signup{min-height:44px; display:inline-flex; align-items:center}
  .cta-row .ghost{min-height:44px}
  .demo-tabs .dt{min-height:44px}
  .bill-toggle button{min-height:44px}
  #demoReplay{min-height:44px; padding-top:10px; padding-bottom:10px}
  .br-chip.more{min-height:44px}
  .foot-soc a{min-width:44px; min-height:44px; display:inline-flex;
    align-items:center; justify-content:center}
  a.more{min-height:44px; display:inline-flex; align-items:center}
}

/* 6 · Footer links were 17px tall — under even the AA target of 24px, let
   alone the 44px a thumb wants. */
@media (max-width:900px){
  .footer .foot-col a{display:inline-flex; align-items:center; min-height:44px}
  .footer .foot-legal a{display:inline-flex; align-items:center; min-height:44px}
}

/* 7 · The comparison table keeps three columns on a 390px screen by dropping
   its secondary lines to 9px. The label column is the widest of the three, so
   its sub-lines can come back up without making anything wrap worse. */
@media (max-width:640px){
  #vergleich .vs-row .vlab small{font-size:11px; line-height:1.35}
  #vergleich .vs-row .voth{font-size:11px}
}

/* 8 · The last two that are real controls rather than links sitting inside a
   sentence. Legal links embedded in running text (#bill-cadence, the footer's
   inline Impressum/Datenschutz/AGB) are left alone on purpose: WCAG 2.5.8
   exempts targets that are part of a block of text, and padding them would
   break the sentence they live in. */
@media (max-width:900px){
  #vergleich .vs-cta .vgo{min-height:44px}
  .world .back{min-height:44px}
}

/* 10 · The comparison table. Its three columns were 151/94/94 on a 390px
   screen, and the only way that fitted was by dropping the value text to
   10.5px. The label column gives some width back, which buys the values
   enough room to be read at 12px. Selectors carry the section id because the
   rules they override are three classes deep. */
@media (max-width:640px){
  #vergleich .vs-row{grid-template-columns:1.25fr 1fr 1fr}
  #vergleich .vs-row .vaio .vtx,
  #vergleich .vs-row .voth .vtx{font-size:12px; line-height:1.3}
  #vergleich .vs-row .vlab{font-size:12.5px}
}

/* 11 · The contact strip sits 2px under the target on a 360px phone. */
@media (max-width:900px){
  #kontakt .ct-strip a,
  #kontakt .ct-strip button{min-height:44px}
}

/* ══════════════════════════════════════════════════════════════════════════
   MOBILE SYSTEM PASS — 2026-08-16, Iman: "dar mobile size kheili eftezahe …
   az hame lahaz top tier konimesh". Everything below was measured on the live
   page at 390x845 and 360x640 with every reveal-on-scroll element forced
   visible, so nothing was measured collapsed.
   ══════════════════════════════════════════════════════════════════════════ */

/* 15 · ONE GUTTER. This is the whole complaint in one number: body text on a
   390px screen started at eight different left edges — 24, 43, 47, 49, 51,
   52, 53 and 55 — because a 24px container was carrying cards that each
   brought their own padding (18, 22, 24, 26 and 28). Nothing lined up with
   anything above or below it while scrolling, and that is what reads as
   amateur even when every single card looks fine on its own.

   The scale is now 20/24/28 on a 4px step: page gutter 20, card padding 20
   across, 24 down on quiet cards and 28 on the loud ones. Two text edges
   remain — 20 at section level, 40 inside a card — and both are constant
   from the hero to the footer. */
@media (max-width:700px){
  .container{padding-left:20px; padding-right:20px}

  .chan, .step, .price, .q-big, .stats, .zux-col{padding:28px 20px}
  .feat, .q-sm{padding:24px 20px}
  .qa{padding-left:20px; padding-right:20px}
  .kd-card figcaption{padding:20px 20px 22px}
  .cta-band{padding-left:20px; padding-right:20px}
  .price.best{padding-top:36px}          /* the "Beliebt" badge needs the room */
}

/* 16 · The hole in the channel cards was not spacing — it was a link nobody
   on a phone can ever see. `.chan .more` ("Mehr erfahren") ships at
   opacity:0 and is revealed by `.chan:hover .more`. A touch screen has no
   hover, so on every phone the link stayed invisible while still occupying
   its 64px of card: four dead CTAs, four holes, and four focusable targets
   that render nothing. Shown wherever hover does not exist — which is the
   condition the rule should have been written against in the first place,
   so this also covers touch laptops and tablets. */
@media (hover:none){
  .chan .more{opacity:1; transform:none}
}

/* 17 · The middot lists. `.ct-note` is a centred flex run of spans with a 5px
   dot between them. At 390px it wrapped into six ragged centred lines, and
   because the dots are their own elements they were left dangling at the end
   of most of them — the pricing list ended four lines with a floating dot.
   On a phone the run becomes a plain centred stack and the separators go,
   which is what a list of inclusions should have been at this width.

   On the selector — this applies to `div.ct-note`, `i.soon` and the `#preise`
   rules further down: index.html keeps its own styles in <style> blocks that
   sit LATER in the document than this file's <link>, so a bare class here
   loses every tie on document order. Anything this file overrides that
   index.html also sets needs one more specificity point to land. */
@media (max-width:700px){
  div.ct-note{display:grid; justify-items:center; gap:9px; row-gap:9px}
  .ct-note .dot{display:none}
}

/* 18 · The demo tabs are four, laid out 2x2, but each tab was only as wide as
   its own label, so the two rows started and ended at different x and the
   active pill looked misplaced rather than selected. Cells now fill. */
@media (max-width:700px){
  .demo-tabs{grid-template-columns:1fr 1fr; gap:8px}
  .demo-tabs .dt{width:100%; justify-content:center; text-align:center}
}

/* 19 · The contact strip was a centred flex wrap: two pills of unequal width
   on row one, one centred pill on row two, so three tap targets sat on three
   different left edges. One column, full width, one edge. */
@media (max-width:700px){
  #kontakt .ct-strip{display:grid; grid-template-columns:1fr; gap:10px; max-width:none}
  #kontakt .ct-strip > *{width:100%; justify-content:center}
}

/* 20 · The billing toggle is an inline-flex pill holding three buttons, and
   the third one ("2 Monate geschenkt") is wider than the other two, so the
   group ran to 346px inside a 342px row: 23px of air on the left, 4px on the
   right. Type and padding come down until the three fit the row.
   They stay on ONE row on purpose: letting it wrap puts "2 Monate
   geschenkt" on a line of its own inside the pill, where a mint bar the
   full width of the group reads as a third option you can pick rather than
   as the label it is. */
@media (max-width:700px){
  .bill-toggle{max-width:100%; flex-wrap:nowrap}
  #preise .bill-toggle button{padding:9px 12px; font-size:13px; white-space:nowrap}
  #preise .bill-toggle .bill-save{font-size:12px; padding:9px 10px}
}

/* 21 · The footer's legal nav is <nav class="foot-legal">, and index.html
   styles the top bar with a bare `nav{}` — so on a dark footer it was
   painting the bar's translucent white gradient, its border and its 16px
   radius as a light box, with the legal links greyed out inside it. An
   earlier pass took the blur and the shadow; the background, the border and
   the padding were still there. */
footer nav.foot-legal{background:none; border:0; padding:0; border-radius:0;
  width:auto; box-shadow:none}

/* 22 · Footer link rhythm. The 44px touch targets from the earlier pass were
   stacking on top of the list's own 13px gap, so consecutive links sat 57px
   apart and a five-item column ran 285px down a 390px screen. The target
   stays 44px; the gap it was doubling with goes. */
@media (max-width:900px){
  .footer .foot-col ul{gap:0; margin-top:12px}
  .footer .foot-col a{min-height:44px}
}

/* 23 · Type floor. Sentence-case text never goes under 12px; an uppercase,
   letter-spaced micro badge may sit at 11 because the caps carry it. The
   comparison table's sub-lines were pushed to 11px by an earlier pass to buy
   column width — block 10 gave that width back, so they can come up. */
@media (max-width:700px){
  #vergleich .vs-row .vlab small{font-size:12px; line-height:1.35}
  #vergleich .vs-row .voth,
  #vergleich .vs-row.head .vaio,
  #vergleich .vs-row .vaio em.vtx{font-size:12px}
  .vs-wrap small{font-size:12px}
  .eyebrow2, .badge{font-size:12px}
  i.soon, em.soon{font-size:11px; letter-spacing:.05em}
}

/* 23b · The compliance strip was the last full-bleed element on the page: a
   two-column grid pinned to x=0 and x=390 with `white-space:nowrap` on its
   chips, so the tracks blew out to 172 and 194 and the row ignored the
   gutter entirely — the only band on the page whose text touched the
   screen edge. It now sits inside the gutter, two by two, on equal tracks.
   minmax(0,1fr) rather than a bare 1fr: a bare fr track refuses to go under
   its content's min-content width, which with nowrap chips is exactly how
   the row blew out in the first place. */
@media (max-width:700px){
  .assure{display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr);
    gap:8px; padding-left:20px; padding-right:20px; justify-items:stretch}
  /* 11.5px and a tighter pill: at 12px "Support auf Deutsch" needed 170px of
     a 171px track and broke onto two lines, so that chip sat a line taller
     than the three beside it. */
  .assure > *, .assure > .as-item{width:100%; margin:0;
    justify-content:center; align-items:center;
    gap:6px; font-size:clamp(10.4px,2.95vw,11.5px); padding:10px 8px;
    white-space:nowrap; text-align:center}
  .assure > * > *{white-space:nowrap}
}

/* 23c · Every remaining chip row on the page is a centred `flex-wrap`, which
   at 390px means each row starts and ends at a different x — the Branchen
   row ran four rows on four different indents, the closing band's channel
   row two. Centred wrapping is a desktop behaviour: it looks deliberate
   when a row is full and accidental when it is not, and on a phone it is
   never full. Same two equal tracks as the compliance strip. The trailing
   full-width CTA in the Branchen row keeps the whole width. */
@media (max-width:700px){
  .br-chips, .cn-chips{display:grid;
    grid-template-columns:minmax(0,1fr) minmax(0,1fr); gap:8px}
  .br-chips > *, .cn-chips > *{width:100%; margin:0;
    justify-content:center; text-align:center; padding-left:12px; padding-right:12px}
  .br-chips > .more{grid-column:1 / -1}
}

/* 24 · German is a compound language in narrow columns. The comparison table
   runs three columns on a 390px screen, so "Kundenkommunikation" and
   "Anrufvermittlung" were forcing four-line cells with rivers down the
   middle. <html lang="de"> is set, so the browser can hyphenate properly. */
@media (max-width:640px){
  #vergleich .vs-row .vlab,
  #vergleich .vs-row .vaio,
  #vergleich .vs-row .voth{hyphens:auto; -webkit-hyphens:auto}
}

/* 25 · Line breaking. Every section heading carries a serif italic accent
   phrase, and at 390px the break fell inside it — "Sehen Sie AIOOS bei der /
   Arbeit" — which reads as a mistake rather than as an accent. Balanced
   headings put the break where the meaning is; the leads get `pretty`, which
   only forbids the short last line. */
@media (max-width:900px){
  .sec-head h2, h2.h2{text-wrap:balance}
  .sec-head .lead, .lead, .feat p, .chan p{text-wrap:pretty}
}

/* ══════════════════════════════════════════════════════════════════════════
   35 · The other pages. funktionen.html and api.html never loaded this file
   at all, so none of the mobile work above was on them — and their bar is
   worse than the home page's ever was, because it carries a DE/EN switcher
   the home page does not have. Measured at 393px: nav 450px in a 353px
   shell. "AIOOS" was cut off the left edge and "Demo buchen" off the right,
   with nothing to scroll to, because #page clips overflow-x.

   Every part gives a little rather than one part being dropped: brand 105
   -> 81, switcher 88 -> 64, login 60 -> 52, signup 118 -> 99, gaps 10 -> 6.
   Nothing is hidden — a language control you cannot see is worse than a
   small one, and Login has to stay a word.

   `:has(.langsw)` scopes this to those two pages: the home page's bar has no
   switcher, fits already, and must not shrink.
   ══════════════════════════════════════════════════════════════════════════ */
@media (max-width:700px){
  .nav-shell nav:has(.langsw){gap:6px; padding:6px 6px 6px 10px}
  .nav-shell nav:has(.langsw) .brand{font-size:17px; gap:6px}
  .nav-shell nav:has(.langsw) .brand .mk{width:26px}
  .nav-shell nav:has(.langsw) .langsw{padding:2px; gap:1px}
  .nav-shell nav:has(.langsw) .langsw button{font-size:10.5px; padding:5px 7px; letter-spacing:.02em}
  .nav-shell nav:has(.langsw) .nav-login{font-size:13px; gap:5px}
  .nav-shell nav:has(.langsw) .nav-login svg{width:13px; height:13px}
  .nav-shell nav:has(.langsw) .signup{font-size:12.5px; padding:8px 8px 8px 12px; gap:7px}
  .nav-shell nav:has(.langsw) .signup .arw{width:17px; height:17px}
}

/* ══════════════════════════════════════════════════════════════════════════
   HERO: the mobile hero blocks that used to live here (5, 9, the #vstage
   grid fix, 12, 12b, 13, 14 and 26-34) are GONE from this file on purpose.

   They tuned a sticky eight-station film scrub. The block that follows —
   the other pipeline's, @media (max-width:860px), mostly !important — takes
   the opposite architecture: the virtual scroll steps are removed on mobile,
   the stage stops being sticky, station 0 is simply always visible. That is
   a one-screen hero instead of 3.3. Iman confirmed this one FINAL on
   2026-08-18, comparing both on his own phone via /preview-flat.html
   ("in doroste"), after one round-trip each way.

   Two complete heroes in one file would only fight each other, so ours is
   not left here dead. It is not lost either: every line is in this repo at
   commit 7e820eb (full file also at 9035f5b), the reasoning is in the
   commit messages from 6fb7d4d through 7e820eb, and the sticky version
   stays VIEWABLE at /preview-sticky.html (noindex) for comparison.
   `git show 9035f5b:landing/mobile-fix.css` brings it back.

   Everything ELSE from that pass stays, because none of it is about the
   hero: the one-gutter system, the card paddings, the hover-only "Mehr
   erfahren" link, the middot lists, the chip rows, the billing toggle, the
   footer's glass and rhythm, the type floor, and the secondary-page nav.
   ══════════════════════════════════════════════════════════════════════════ */

/* Desktop & Global: ensure gradient accent on vhero h1 .g is always vivid and rasterized */
.vhero .vslide h1 .g,
.vhero h1 .g,
h1 .g {
  font-family: 'Instrument Serif', 'ISerif-fb', Georgia, serif !important;
  font-style: italic !important;
  font-weight: 400 !important;
  font-size: 1.08em !important;
  letter-spacing: -0.01em !important;
  padding-right: 0.08em !important;
  display: inline-block !important;
  position: relative !important;
  z-index: 2 !important;
  background: linear-gradient(96deg, #0A4FE0, #2D6CF6 28%, #37A6FF 52%, #22D3EE 74%, #2D6CF6 100%) !important;
  background-size: 280% 100% !important;
  -webkit-background-clip: text !important;
  background-clip: text !important;
  -webkit-text-fill-color: transparent !important;
}
@media (prefers-reduced-motion:no-preference){
  .vhero .vslide h1 .g, .vhero h1 .g { animation: gradFlow 8s ease-in-out infinite !important; }
}

/* ══════════════════════════════════════════════════════════════════════════
   36 · MOBILE HERO RESPONSIVE OVERHAUL & FLUID SCROLL (2026-08-16)
   - Unlocks 100% native smooth scrolling (eliminates the scroll-snap trap)
   - Presents the video as a sleek, framed mobile device mockup under CTAs
   - Balances typography, gradients, trust chips, and floating glass navbar
   ══════════════════════════════════════════════════════════════════════════ */

@media (max-width: 860px) {
  /* 1. Unlock native fluid scrolling across touch screens */
  html, body {
    scroll-snap-type: none !important;
    overflow-x: hidden !important;
  }
  
  /* 2. Virtual scroll steps removed on mobile: no empty spacer scroll traps */
  #vsteps, .vsteps {
    display: none !important;
    height: 0 !important;
    min-height: 0 !important;
    margin: 0 !important;
  }
  .vstep, .vtail {
    display: none !important;
    height: 0 !important;
    min-height: 0 !important;
    scroll-snap-align: none !important;
    scroll-snap-stop: normal !important;
  }

  /* 3. Hero stage becomes a natural, non-sticky mobile container */
  #vhero, .hero.vhero {
    position: relative !important;
    max-width: 100% !important;
    margin: 0 !important;
    padding: 0 !important;
    display: block !important;
    z-index: 10 !important;
  }

  #vhero #vstage, #vhero .vstage {
    position: relative !important;
    top: auto !important;
    height: auto !important;
    min-height: unset !important;
    max-height: none !important;
    overflow: visible !important;
    display: flex !important;
    flex-direction: column !important;
    align-items: center !important;
    align-content: stretch !important;
    justify-content: flex-start !important;
    padding: 84px 18px 48px !important;
    background: radial-gradient(80% 50% at 50% 25%, #EAF4FE 0%, rgba(234,244,254,0) 80%) !important;
    row-gap: 0 !important;
    gap: 0 !important;
  }

  /* 4. Hero Content Slide (Station 0) is always fully visible */
  #vhero .vsay {
    display: flex !important;
    flex-direction: column !important;
    align-items: center !important;
    width: 100% !important;
    max-width: 580px !important;
    margin: 0 auto !important;
    padding: 0 !important;
    text-align: center !important;
    order: 1 !important;
  }

  #vhero .vslide {
    display: none !important;
  }

  #vhero .vslide:first-child,
  #vhero .vslide[data-i="0"] {
    display: flex !important;
    flex-direction: column !important;
    align-items: center !important;
    text-align: center !important;
    width: 100% !important;
    opacity: 1 !important;
    transform: none !important;
  }

  /* 5. Rating & Social Proof Pill */
  #vhero .rate {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    gap: 8px !important;
    padding: 5px 12px 5px 8px !important;
    border-radius: 999px !important;
    background: rgba(255, 255, 255, 0.78) !important;
    backdrop-filter: blur(20px) !important;
    -webkit-backdrop-filter: blur(20px) !important;
    border: 1px solid rgba(0, 0, 0, 0.08) !important;
    box-shadow: 0 4px 18px -6px rgba(20, 50, 110, 0.25) !important;
    max-width: 100% !important;
    margin: 0 auto !important;
  }

  #vhero .rate .avs {
    display: inline-flex !important;
    align-items: center !important;
    flex-shrink: 0 !important;
  }

  #vhero .rate .txt {
    font-size: 12px !important;
    line-height: 1.35 !important;
    color: var(--ink-2) !important;
    text-align: left !important;
  }

  /* 6. Hero Heading & Subtitle */
  #vhero .vslide.on h1,
  #vhero .vslide.on h1 *,
  #vhero .vslide.on .rate,
  #vhero .vslide.on .sub,
  #vhero .vslide.on .cta-row,
  #vhero .vslide.on .hero-chips {
    animation: none !important;
    opacity: 1 !important;
    transform: none !important;
  }
  #vhero .vslide h1 {
    font-family: var(--font-head) !important;
    font-size: clamp(32px, 8.8vw, 44px) !important;
    line-height: 1.08 !important;
    letter-spacing: -0.035em !important;
    margin: 18px 0 0 !important;
    text-align: center !important;
    color: var(--ink) !important;
  }

  #vhero .vslide h1 .g,
  .hero.vhero h1 .g,
  h1 .g {
    font-family: 'Instrument Serif', 'ISerif-fb', Georgia, serif !important;
    font-style: italic !important;
    font-weight: 400 !important;
    font-size: 1.08em !important;
    letter-spacing: -0.01em !important;
    padding-right: 0.08em !important;
    display: inline-block !important;
    transform: translateZ(0) !important;
    background: linear-gradient(96deg, #0084FF 0%, #22D3EE 55%, #14B8A6 100%) !important;
    -webkit-background-clip: text !important;
    background-clip: text !important;
    -webkit-text-fill-color: transparent !important;
    color: #0084FF !important;
  }

  #vhero .vslide .sub {
    font-size: clamp(15px, 4vw, 17px) !important;
    line-height: 1.55 !important;
    letter-spacing: -0.01em !important;
    color: var(--ink-2) !important;
    margin: 16px auto 0 !important;
    max-width: 480px !important;
    text-align: center !important;
  }

  /* 7. CTA Buttons */
  #vhero .cta-row {
    display: flex !important;
    flex-direction: column !important;
    align-items: center !important;
    justify-content: center !important;
    gap: 12px !important;
    margin-top: 26px !important;
    width: 100% !important;
  }

  #vhero .cta-row .cta {
    width: 100% !important;
    max-width: 320px !important;
    min-height: 52px !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    gap: 10px !important;
    font-size: 16px !important;
    font-weight: 600 !important;
    border-radius: 999px !important;
    background: linear-gradient(135deg, #0084FF 0%, #1760E8 100%) !important;
    color: #fff !important;
    text-decoration: none !important;
    box-shadow: 0 14px 30px -10px rgba(0, 132, 255, 0.55), inset 0 1px 0 rgba(255, 255, 255, 0.3) !important;
    transition: transform 0.2s, box-shadow 0.2s !important;
  }

  #vhero .cta-row .cta:active {
    transform: scale(0.98) !important;
  }

  #vhero .cta-row .ghost {
    width: 100% !important;
    max-width: 320px !important;
    min-height: 46px !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    gap: 8px !important;
    font-size: 15px !important;
    font-weight: 600 !important;
    border-radius: 999px !important;
    background: rgba(255, 255, 255, 0.78) !important;
    backdrop-filter: blur(16px) !important;
    -webkit-backdrop-filter: blur(16px) !important;
    border: 1px solid rgba(0, 0, 0, 0.08) !important;
    color: var(--ink) !important;
    text-decoration: none !important;
    box-shadow: 0 8px 20px -12px rgba(10, 18, 34, 0.2) !important;
  }

  /* 8. Framed Mobile Video Showcase Mockup */
  #vhero .vwrap {
    display: block !important;
    order: 2 !important;
    width: 100% !important;
    max-width: 400px !important;
    margin: 28px auto 0 !important;
    opacity: 1 !important;
    max-height: none !important;
    position: relative !important;
  }

  #vhero .vwrap::before {
    display: none !important;
  }

  #vhero .vwin {
    position: relative !important;
    padding: 6px !important;
    border-radius: 20px !important;
    background: #0A1222 !important;
    box-shadow: 0 20px 48px -16px rgba(0, 132, 255, 0.35), 0 8px 20px -8px rgba(10, 18, 34, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.16) !important;
    transform: none !important;
  }

  #vhero .vwin video {
    display: block !important;
    width: 100% !important;
    height: auto !important;
    max-height: 240px !important;
    border-radius: 14px !important;
    background: #0A1222 !important;
  }

  /* 9. Trust Chips below the video */
  #vhero .hero-chips,
  #vstage .hero-chips,
  .vslide .hero-chips {
    display: flex !important;
    flex-direction: row !important;
    flex-wrap: wrap !important;
    justify-content: center !important;
    align-items: center !important;
    gap: 8px !important;
    margin-top: 24px !important;
    width: 100% !important;
    padding: 0 !important;
    order: 3 !important;
  }

  #vhero .hero-chips > span,
  #vhero .hero-chips > *,
  #vstage .hero-chips > *,
  .vslide .hero-chips > * {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    gap: 6px !important;
    font-size: 11px !important;
    font-weight: 600 !important;
    text-transform: uppercase !important;
    letter-spacing: 0.05em !important;
    color: var(--ink-2) !important;
    padding: 6px 12px !important;
    border-radius: 999px !important;
    background: rgba(255, 255, 255, 0.75) !important;
    backdrop-filter: blur(12px) !important;
    -webkit-backdrop-filter: blur(12px) !important;
    border: 1px solid rgba(24, 54, 120, 0.09) !important;
    box-shadow: 0 4px 14px -8px rgba(20, 50, 110, 0.22) !important;
    width: auto !important;
    min-height: unset !important;
    margin: 0 !important;
    white-space: nowrap !important;
  }

  #vhero .vrail,
  #vhero .vhint {
    display: none !important;
  }

  /* 10. Floating Navbar optimization on mobile */
  .nav-shell {
    position: sticky !important;
    top: 10px !important;
    padding: 0 12px !important;
    z-index: 60 !important;
    width: 100% !important;
    max-width: 100% !important;
  }

  .nav-shell nav {
    width: 100% !important;
    max-width: 440px !important;
    display: flex !important;
    align-items: center !important;
    justify-content: space-between !important;
    gap: 6px !important;
    padding: 7px 8px 7px 12px !important;
    border-radius: 999px !important;
    background: rgba(255, 255, 255, 0.84) !important;
    backdrop-filter: blur(28px) !important;
    -webkit-backdrop-filter: blur(28px) !important;
    border: 1px solid rgba(0, 0, 0, 0.08) !important;
    box-shadow: 0 12px 32px -12px rgba(10, 18, 34, 0.18), inset 0 1px 0 rgba(255, 255, 255, 0.8) !important;
  }

  .nav-shell nav .brand {
    font-size: 18px !important;
    gap: 6px !important;
    flex-shrink: 0 !important;
  }

  .nav-shell nav .brand .mk {
    width: 26px !important;
    height: 21px !important;
  }

  .nav-shell nav .nav-links {
    display: none !important;
  }

  .nav-shell nav .nav-login {
    font-size: 13.5px !important;
    font-weight: 600 !important;
    padding: 6px 8px !important;
    gap: 5px !important;
    color: var(--ink) !important;
    flex-shrink: 0 !important;
    display: inline-flex !important;
    align-items: center !important;
  }

  .nav-shell nav .signup {
    font-size: 13px !important;
    font-weight: 600 !important;
    padding: 8px 13px !important;
    border-radius: 999px !important;
    gap: 6px !important;
    flex-shrink: 0 !important;
    white-space: nowrap !important;
  }

  /* 11. Ambient Glow containment */
  .glow {
    max-width: 100vw !important;
    overflow: hidden !important;
    pointer-events: none !important;
  }
  .glow.a {
    left: -120px !important;
    top: -160px !important;
    opacity: 0.2 !important;
  }
}


/* 36 · The flat block's navbar section, on the two pages it never met.
   It pins `.nav-shell nav` to max-width:440px, inflates login/signup and
   sets flex-shrink:0 !important on every item — sized against the HOME
   bar. funktionen/api carry a DE/EN switcher the home bar does not have,
   so their signup was pushed to x=399 on a 360px screen, 39px off the
   right edge with nothing to scroll to. Same gate (:has(.langsw)) as
   block 35; !important because the flat block's rules are !important and
   only a louder, more specific rule wins that fight. Budget at 360:
   brand 77 + langsw 58 + login 44 + signup 92 + gaps 12 = 283 of 336. */
@media (max-width: 860px) {
  .nav-shell nav:has(.langsw) { gap: 4px !important; padding: 6px 8px 6px 12px !important; }
  .nav-shell nav:has(.langsw) .brand { font-size: 16px !important; }
  .nav-shell nav:has(.langsw) .brand .mk { width: 24px !important; }
  .nav-shell nav:has(.langsw) .langsw { padding: 2px !important; gap: 1px !important; flex-shrink: 0 !important; }
  .nav-shell nav:has(.langsw) .langsw button { font-size: 10px !important; padding: 4px 6px !important; letter-spacing: .02em !important; }
  .nav-shell nav:has(.langsw) .nav-login { font-size: 12.5px !important; padding: 6px 4px !important; }
  .nav-shell nav:has(.langsw) .nav-login svg { width: 12px !important; height: 12px !important; }
  .nav-shell nav:has(.langsw) .signup { font-size: 11.5px !important; padding: 7px 10px !important; gap: 5px !important; }
  .nav-shell nav:has(.langsw) .signup .arw { width: 16px !important; height: 16px !important; }
}
