/* =========================================================
   digiasiat.fi — shared stylesheet
   Finnish-flag blue theme, lightweight, no external deps
   ========================================================= */

:root{
  --blue-900:#00205B;
  --blue-800:#002F6C;
  --blue-700:#003580;
  --blue-600:#0046A6;
  --blue-500:#0B5FCC;
  --blue-100:#EAF2FB;
  --blue-50:#F5F9FE;
  --white:#FFFFFF;
  --ink:#151B26;
  --ink-soft:#4A5568;
  --border:#DDE6F2;
  --hover-grey:#E4E9F1; /* hover fill for any white/near-white clickable, so it's clearly visible */
  --success:#1E8E5A;
  --danger:#C0392B;
  --warn:#B7791F;
  --radius:14px;
  --radius-sm:8px;
  --shadow:0 4px 18px rgba(0,47,108,.10);
  --shadow-lg:0 12px 34px rgba(0,32,91,.16);
  --font: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  /* 18px, not the more common 16px default — our customers are mostly
     seniors, and everything still scales from here via the A−/A+ text-size
     control in the Accessibility menu (0.8x–1.6x on top of this base). */
  --base-size:18px;
  --maxw:1180px;
  /* Surface tokens: the page background and "card" backgrounds used to be
     plain #fff everywhere. They're now variables so dark mode (below) can
     swap them for a dark surface without having to touch every rule. */
  --page-bg:#FFFFFF;
  --surface:#FFFFFF;
  --surface-2:#F5F9FE;
}

*,*::before,*::after{box-sizing:border-box}
/* overflow-x:hidden on both html and body is a safety net for Google's
   translate widget (see main.js): several labels/buttons across the site
   are deliberately white-space:nowrap so short Finnish/English/selko text
   stays on one line, but a translated language (Russian, Persian, etc.)
   can be noticeably longer and push one of those elements wider than its
   box. Without this, that single overflowing element widened the whole
   page and put a horizontal scrollbar under everything — this clips any
   such overflow at the viewport edge instead, without touching normal
   (untranslated) layout at all. Elements that intentionally scroll
   sideways (.table-wrap, code blocks) keep their own overflow-x:auto,
   which still works independently of this. */
html{font-size:var(--base-size); scroll-behavior:smooth; overflow-x:hidden}
body{
  margin:0;
  font-family:var(--font);
  color:var(--ink);
  background:var(--page-bg);
  line-height:1.55;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
}
img{max-width:100%;display:block}
/* Deliberately NOT display:block on svg — every raw <svg> icon in this
   site (phone/email/WhatsApp glyphs, etc.) is written inline next to text
   using a vertical-align style, meant to sit ON the same line as that
   text. The old shared img,svg rule forced them to display:block, which
   silently pushed every one of those icons onto its own line above the
   text instead — caught when Susanna flagged it on the Direct contact
   box, but it affected every page that uses one of these inline icons. */
svg{max-width:100%}
a{color:var(--blue-600);text-decoration:none}
a:hover{text-decoration:underline}
h1,h2,h3,h4{line-height:1.2;margin:0 0 .5em;color:var(--blue-900)}
h1{font-size:2.3rem}
h2{font-size:1.7rem}
h3{font-size:1.25rem}
p{margin:0 0 1em}
ul{margin:0 0 1em;padding-inline-start:1.2em}
.container{max-width:var(--maxw);margin:0 auto;padding:0 20px}
.section{padding:56px 0}
.section-alt{background:var(--blue-50)}
.center{text-align:center}
.muted{color:var(--ink-soft)}
.small{font-size:.85rem}

/* "Lyhyesti / In short" plain-language summary boxes (käyttöehdot, tietosuoja):
   deliberately larger, roomier text than the rest of the page — our
   customers are mostly seniors, and this box is meant to be the thing
   people actually read without straining, before deciding whether to also
   read the full legal text below it. Uses a solid, clearly-defined
   background/border (not the page's near-white default card) plus a bold
   left accent bar, so it visually reads as "this is a separate, special
   box" rather than blending into the page. */
.card.lyhyesti-box{
  background:var(--blue-100);
  border:2px solid var(--blue-600);
  border-inline-start:7px solid var(--blue-700);
  box-shadow:0 2px 10px rgba(0,32,91,.10);
}
.lyhyesti-box p{font-size:1.1rem;line-height:1.8}
.lyhyesti-box ol{font-size:1.1rem;line-height:1.9}
.lyhyesti-box li{margin-bottom:8px}
.lyhyesti-box li:last-child{margin-bottom:0}
.readaloud-btn{margin-top:4px;margin-bottom:8px}
.read-speed{display:flex;gap:6px;align-items:center;margin-bottom:14px}
.read-speed button{
  background:var(--surface-2);border:1px solid var(--border);color:var(--ink);
  border-radius:999px;padding:3px 10px;font-size:.75rem;font-weight:700;cursor:pointer;
}
.read-speed button.active{background:var(--blue-700);color:#fff;border-color:var(--blue-700)}
.read-speed button:hover:not(.active){background:var(--hover-grey)}

/* Marks the clear boundary where the short summary ends and the complete,
   legally-binding text begins — so nobody mistakes one for the other. */
.fulltext-divider{
  display:flex;align-items:center;gap:14px;
  margin:6px 0 22px;
  color:var(--ink-soft);
  font-size:1rem;
  font-weight:700;
}
.fulltext-divider::before, .fulltext-divider::after{
  content:"";flex:1 1 auto;height:2px;background:var(--border);
}

/* Buttons */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:.5em;
  padding:.75em 1.4em;border-radius:999px;border:2px solid var(--blue-700);
  font-weight:600;font-size:.95rem;cursor:pointer;background:var(--blue-700);color:var(--white);
  transition:.15s ease;text-decoration:none;
}
.btn:hover{background:var(--blue-800);border-color:var(--blue-800);text-decoration:none}
.btn-outline{background:transparent;color:var(--blue-700)}
.btn-outline:hover{background:var(--hover-grey)}
.btn-white{background:var(--white);color:var(--blue-700);border-color:var(--white)}
.btn-white:hover{background:var(--hover-grey);border-color:var(--hover-grey)}
.link-btn-plain{background:none;border:none;padding:0;color:var(--blue-600);text-decoration:underline;cursor:pointer;font:inherit}
.btn-sm{padding:.5em 1em;font-size:.85rem}

/* Click-to-reveal for the Y-tunnus shown in the company-info blocks
   (footer + yhteystiedot.html "Yritystiedot" card). The real value always
   stays in the DOM (so admin edit-mode text editing keeps working normally
   — see body.edit-mode override below) and is only visually blurred, so
   there's no separate "masked copy" that could ever go stale. */
.reveal-target{cursor:pointer;filter:blur(6px);transition:filter .15s ease;display:inline-block;border-radius:4px;padding:0 1px}
.reveal-target::after{content:" 👁";filter:none;font-size:.85em;opacity:.7}
.copy-btn{background:none;border:none;cursor:pointer;padding:2px 4px;font-size:.9em;opacity:.6;vertical-align:middle;border-radius:4px;color:var(--ink)}
.copy-btn:hover{opacity:1;background:var(--hover-grey)}
.reveal-target.revealed{filter:none}
.reveal-target.revealed::after{content:""}
body.edit-mode .reveal-target{filter:none!important}
body.edit-mode .reveal-target::after{content:""!important}

/* Order/booking status badges — "Tilaukseni" tab in Oma tili and the
   admin all-orders panel. Explicit light/dark colour pairs (rather than
   reusing --blue-800 etc. as text, which is what caused the earlier
   invisible-text bugs) so these never need a separate dark-mode fix. */
.status-badge{display:inline-block;padding:2px 10px;border-radius:999px;font-size:.75rem;font-weight:700;white-space:nowrap}
.status-badge.varattu{background:var(--blue-100);color:var(--blue-800)}
.status-badge.tehty{background:#DFF3E8;color:#146C43}
.status-badge.peruttu{background:#FBE4E1;color:#8C2E23}
body.dark-mode .status-badge.varattu{background:rgba(159,199,255,.18);color:#9FC7FF}
body.dark-mode .status-badge.tehty{background:rgba(46,204,113,.18);color:#6FE3A6}
body.dark-mode .status-badge.peruttu{background:rgba(231,76,60,.18);color:#FF9C91}
.booking-row{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;padding:12px 0;border-bottom:1px solid var(--border)}
.booking-row:last-child{border-bottom:none}

/* Landing on a service card from the "Mitä haluat tehdä?" front-page
   buttons (or any other #anchor link into palvelut.html) — a clear,
   temporary highlight so it's obvious which card is the match, not just
   "somewhere on screen". */
@keyframes goalPulse{
  0%{box-shadow:0 0 0 4px rgba(11,95,204,.45)}
  70%{box-shadow:0 0 0 4px rgba(11,95,204,0)}
  100%{box-shadow:0 0 0 0 rgba(11,95,204,0)}
}
.goal-highlight{outline:3px solid var(--blue-600);outline-offset:2px;animation:goalPulse 1.6s ease-out 2}
body.dark-mode .goal-highlight{outline-color:#9FC7FF}
.btn-block{width:100%}
.btn[disabled]{opacity:.5;cursor:not-allowed}

/* Skip link */
.skip-link{position:absolute;inset-inline-start:-999px;top:0;background:var(--blue-900);color:#fff;padding:10px 16px;z-index:999}
.skip-link:focus{inset-inline-start:10px;top:10px}

/* ============ HEADER ============ */
/* The topbar used to be its own full-width navy strip, always sitting
   above the header on every page — Susanna asked for that upper band
   taken away and for its two controls (text size, language) folded into
   the same row as the ☰ Valikko button instead. They now live inside
   .header-inner itself, in the .header-utility group below — see
   digiasiatRenderHeader() in components.js. */
/* Compact text-size trio + language dropdown, now part of the header row
   itself rather than a separate coloured band — styled with the same
   surface/border/ink tokens as the rest of the header (e.g. .nav-toggle,
   .a11y-group) so they read as part of one cohesive header and adapt to
   dark mode automatically, with no separate dark-mode overrides needed. */
/* margin-inline-start (not "left"): this is what pins the text-size/
   language controls to the header's trailing edge — the physical right in
   Finnish/English, but the physical LEFT once the page reads right-to-left
   (Persian, Arabic, ...). A plain margin-left:auto stayed glued to the
   physical right in both directions, which is why this group (and
   .header-actions below) didn't visually mirror even though dir="rtl"
   was set correctly. */
.header-utility{display:flex;align-items:center;gap:6px;margin-inline-start:auto;order:10;flex-wrap:wrap}
@media (max-width:899px){
  /* Below 900px there simply isn't room to fit the ☰ button, logo, text
     size, language and the cart icon on one line without shrinking any of
     them past a comfortable tap target — so the header grows a second,
     unpadded row (order:10 above keeps it last) instead of a separate
     coloured band. It's still the same header — same background, no
     border, no band of its own — just wrapped onto two lines here. */
  .header-inner{flex-wrap:wrap}
  .header-utility{flex-basis:100%;justify-content:flex-end;margin-inline-start:0;padding-top:10px;margin-top:6px;border-top:1px solid var(--border)}
}
.theme-toggle-btn{display:flex;align-items:center;justify-content:center;width:34px;height:34px;background:var(--surface-2);border:1.5px solid var(--border);border-radius:999px;font-size:1rem;line-height:1;cursor:pointer}
.theme-toggle-btn:hover{background:var(--hover-grey)}
.font-switch-wrap{display:flex;align-items:center;gap:2px;background:var(--surface-2);border:1.5px solid var(--border);border-radius:999px;padding:3px}
.font-switch-btn{background:transparent;border:none;color:var(--ink);font-weight:700;font-size:.8rem;line-height:1;padding:5px 7px;border-radius:999px;cursor:pointer}
.font-switch-btn:hover{background:var(--hover-grey)}
.font-switch-reset{font-size:.7rem;opacity:.85}
.lang-switch-wrap{position:relative}
.lang-switch-toggle{
  display:flex;align-items:center;gap:6px;background:var(--surface-2);
  border:1.5px solid var(--border);color:var(--ink);border-radius:999px;
  padding:6px 10px;font-size:.85rem;cursor:pointer;font-weight:700;
  white-space:nowrap;flex:none;
}
.lang-switch-toggle:hover{background:var(--hover-grey)}
.lang-switch-panel{
  /* inset-inline-end (not "right") so this pops out on the correct side of
     its toggle button once the page itself is RTL (Persian, Arabic, ...) —
     otherwise it kept anchoring to the physical right, which under RTL is
     the far side from the now-mirrored toggle button, plain wrong. */
  display:none;position:absolute;top:calc(100% + 8px);inset-inline-end:0;z-index:250;
  background:var(--surface);color:var(--ink);border:1px solid var(--border);border-radius:var(--radius);
  box-shadow:var(--shadow-lg);padding:8px;width:220px;max-width:min(260px,90vw);
  flex-direction:column;gap:2px;
}
.lang-switch-panel.open{display:flex}
.lang-switch-panel button{
  display:flex;align-items:center;gap:6px;width:100%;text-align:start;
  background:transparent;border:none;color:var(--ink);border-radius:6px;
  padding:9px 10px;font-size:.9rem;cursor:pointer;font-weight:600;
}
.lang-switch-panel button:hover{background:var(--hover-grey)}
.lang-switch-panel button.active{background:var(--blue-700);color:#fff}
.lang-switch-divider{border:none;border-top:1px solid var(--border);margin:6px 2px}
.lang-switch-more-label{display:block;padding:6px 10px 2px;font-size:.75rem;font-weight:700;color:var(--ink-soft);text-transform:uppercase;letter-spacing:.03em}
.lang-switch-more{
  width:100%;margin:2px 0 4px;padding:9px 10px;font-size:.9rem;font-weight:600;
  background:var(--surface-2);color:var(--ink);border:1.5px solid var(--border);border-radius:6px;cursor:pointer;
}
/* Google's Website Translator widget (see main.js) is driven entirely from
   our own language menu above — its own toolbar/banner and visible
   dropdown would duplicate that and push the whole page down, so it stays
   present (the translation engine needs it in the DOM) but invisible. */
#google_translate_element,.goog-te-banner-frame,.goog-te-gadget{display:none !important}
body{top:0 !important}
.skiptranslate{display:none !important}
@media (max-width:600px){
  /* Same reasoning as .a11y-panel below: on a narrow, wrapped topbar the
     button can end up anywhere, so pin the panel to the viewport instead
     of anchoring it to a button that might be near an edge. */
  .lang-switch-panel{position:fixed;top:auto;bottom:12px;left:12px;right:12px;width:auto;max-width:none}
}
.site-header{position:sticky;top:0;z-index:80;background:var(--surface);box-shadow:0 2px 10px rgba(0,32,91,.08)}
.header-inner{display:flex;align-items:center;gap:12px;padding:12px 20px}
.logo{display:flex;align-items:center;gap:10px;font-weight:800;font-size:1.35rem;color:var(--blue-900);white-space:nowrap}
.logo .dot{color:var(--blue-500)}
.logo-mark{width:36px;height:36px;display:flex;align-items:center;justify-content:center;flex:none}
.logo-mark svg{width:100%;height:100%}
/* A permanent booking button in the header itself (referencing
   nexigen.com's "Customer Support" header button) — sits next to the
   cart icon on every page, pushed to the far right by header-actions'
   margin-left:auto. Hidden in Simple view, same as the cart, so that
   mode stays down to just the essentials. */
.header-cta{margin-inline-end:4px;white-space:nowrap}
@media (max-width:560px){.header-cta{display:none}}
/* On the homepage only, the hero already has its own bigger "Varaa aika"
   pill right underneath (.hero-topbar-cta) — showing this same button
   again, a few pixels above it, in the header, read as a stray duplicate
   (Susanna flagged this after seeing both stacked in the Russian view).
   Every other page still shows it here as normal, since there's no
   second CTA competing with it there. */
body[data-page="home"] .header-cta{display:none}

/* ============ UNIFIED MENU (☰ Valikko) ============
   One drawer, opened by one button, at every screen width — not just a
   mobile hamburger. Page links, search and display settings used to be
   three separate always-visible header controls; now they're three
   labelled sections inside this single drawer (see digiasiatRenderHeader()
   in components.js for exactly what's inside). Language and the persistent
   Help button deliberately stay OUTSIDE it — see the comment in
   components.js for why. */
.nav-toggle{
  display:flex;align-items:center;gap:6px;background:none;border:1px solid var(--border);
  border-radius:8px;padding:8px 14px;font-size:1rem;color:var(--blue-800);cursor:pointer;font-weight:700;
}
.nav-toggle:hover{background:var(--hover-grey)}

/* Horizontal top-level nav — hidden by default (mobile keeps just the ☰
   drawer above), shown from 900px up in the desktop media query further
   down, which also compacts the drawer button into an icon and reorders
   the header row (logo → links → CTA/cart → icon) to match the
   nexigen.com reference: text links, pill CTA pinned to the far right. */
/* flex-wrap:wrap here too, same reasoning as .header-inner above — lets
   the individual page links themselves drop to a second line if a
   translated language makes them too wide to fit in one, instead of
   overflowing sideways past the header. */
.primary-nav{display:none;list-style:none;margin:0;padding:0;align-items:center;gap:0;flex-wrap:wrap}
.primary-nav a{
  color:var(--ink-soft);font-weight:600;font-size:.93rem;padding:8px 9px;border-radius:8px;
  text-decoration:none;white-space:nowrap;
}
.primary-nav a:hover{background:var(--hover-grey);color:var(--blue-800);text-decoration:none}
.primary-nav a.active{color:var(--blue-800);font-weight:800}
/* Contact: a distinct pill button + dropdown, not a plain text link like its
   siblings — this is the "more noticeable" entry point, and where the
   phone number and email now live (moved out of the topbar above). Same
   open/close/panel mechanics as the language switch, just a second
   independent instance (see initContactNav() in main.js). */
.nav-contact-wrap{position:relative}
.nav-contact-toggle{
  display:inline-flex;align-items:center;gap:6px;font-family:inherit;cursor:pointer;
  background:var(--blue-50);border:1.5px solid var(--blue-700);color:var(--blue-800);
  border-radius:999px;padding:8px 12px;font-size:.93rem;font-weight:700;white-space:nowrap;
}
.nav-contact-toggle:hover{background:var(--blue-100)}
.nav-contact-toggle.active{background:var(--blue-700);color:#fff}
.nav-contact-panel{
  display:none;position:absolute;top:calc(100% + 8px);inset-inline-end:0;z-index:250;
  background:var(--surface);color:var(--ink);border:1px solid var(--border);border-radius:var(--radius);
  box-shadow:var(--shadow-lg);padding:8px;width:240px;max-width:min(280px,90vw);
  flex-direction:column;gap:2px;
}
.nav-contact-panel.open{display:flex}
.nav-contact-panel a{
  display:flex;align-items:center;gap:8px;width:100%;text-decoration:none;
  color:var(--ink);border-radius:6px;padding:9px 10px;font-size:.9rem;font-weight:600;
}
.nav-contact-panel a:hover{background:var(--hover-grey);color:var(--blue-800);text-decoration:none}
.nav-contact-divider{border:none;border-top:1px solid var(--border);margin:6px 2px}
@media (min-width:900px){
  /* Row order becomes: logo, then the links, then text size/language, then
     the CTA/cart/drawer-icon cluster pinned to the trailing edge (the
     first margin-inline-start:auto item — .header-utility — is what does
     the pinning; .header-actions no longer needs its own since it now
     simply follows .header-utility in the same trailing-aligned group).
     The ☰ drawer becomes a plain round icon here (label hidden, aria-label
     on the button still names it for screen readers) since its page links
     are now duplicated above — search/settings/feedback still live only
     inside it. Below 900px none of this applies: header stays exactly as
     it was (toggle first, full label, no horizontal links, utility group
     wraps to its own row — see the max-width:899px block above).
     flex-wrap is "wrap", not "nowrap": in plain Finnish/English/selko this
     row always fits on one line, so wrap never visibly triggers — but a
     translated language (Russian, Persian, etc.) can make the nav links
     plus the contact pill, text-size buttons, language switch, cart and ☰
     icon wider than the header. With nowrap, that overflow used to either
     widen the whole page (Susanna's "page gets bigger" report) or, once
     the page-level overflow safety net below was added to fix that, get
     silently clipped off past the edge of the screen — taking the
     language switch/cart/☰ menu out of reach ("the sandwich is not
     visible"). Wrapping lets those same items drop to a second header
     line instead, so every control stays visible and clickable no matter
     how long the translated labels get. */
  .header-inner{flex-wrap:wrap}
  /* The header row needs more room than the site's normal 1180px content
     column (--maxw) to fit the logo, all seven nav links, the Contact
     pill, text-size trio, language switch, "Varaa aika" and the cart/☰
     icon on one line without shrinking any of them below a comfortable
     size — this .header-inner also carries the .container class, so this
     override (same specificity, later in the file) widens just the
     header, leaving the page's own content column at 1180px everywhere
     else. On viewports under ~1400px the header simply uses the full
     viewport width instead (this is a max-width, not a fixed width), so
     it still wraps to two lines below roughly 1360px — a real but
     narrower remaining gap than before this round's spacing/width fix. */
  .header-inner{max-width:1420px}
  .primary-nav{display:flex}
  .primary-nav{order:2}
  .header-utility{order:3;flex-basis:auto;margin-top:0;padding-top:0;border-top:none}
  .header-actions{order:4;margin-inline-start:0}
  .nav-toggle{order:5;padding:8px;border-radius:50%;width:38px;height:38px;justify-content:center}
  .nav-toggle-label{display:none}
}
.main-nav{
  /* inset-inline-start (not "left"): in an RTL language (Persian, Arabic,
     ...) this drawer now slides in from the right — the "start" edge when
     reading right-to-left, matching how a menu drawer is conventionally
     placed on an RTL site, instead of always sliding in from the physical
     left regardless of reading direction. */
  position:fixed;top:0;inset-inline-start:-100%;height:100%;width:340px;max-width:88vw;
  background:var(--surface);display:flex;flex-direction:column;gap:22px;
  padding:24px 20px 32px;box-shadow:var(--shadow-lg);transition:inset-inline-start .2s ease;
  z-index:220;overflow:auto;
}
.main-nav.open{inset-inline-start:0}
.main-nav-section{display:flex;flex-direction:column;gap:2px}
.main-nav-heading{
  font-size:.78rem;text-transform:uppercase;letter-spacing:.05em;font-weight:800;
  color:var(--ink-soft);margin:0 0 6px 10px;
}
.main-nav-section + .main-nav-section{border-top:1px solid var(--border);padding-top:20px}
.main-nav a, .menu-action-btn{
  color:var(--ink);font-weight:600;padding:10px 14px;border-radius:8px;font-size:.95rem;
  display:flex;align-items:center;gap:8px;
}
.main-nav a:hover, .menu-action-btn:hover{background:var(--hover-grey);color:var(--blue-800);text-decoration:none}
.main-nav a.active{background:var(--blue-100);color:var(--blue-800);text-decoration:none}
.menu-action-btn{width:100%;text-align:start;background:transparent;border:none;cursor:pointer;font-family:inherit}
/* The display-settings section (#a11yPanel) used to be its own floating
   dropdown with its own show/hide + positioning — now it's just inline
   content inside the drawer above, so only the "light surface, not the
   dark topbar" colour overrides below still apply. */
.a11y-panel h3{font-size:1rem;margin:0 0 12px 10px}
.a11y-row{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:14px;flex-wrap:wrap;padding:0 10px}
.a11y-row:last-child{margin-bottom:10px}
.a11y-row-label{font-weight:600;font-size:.9rem}
.a11y-group{display:flex;gap:6px;flex-wrap:wrap}
.a11y-group button{
  background:var(--surface-2);border:1px solid var(--border);color:var(--ink);
  border-radius:6px;cursor:pointer;font-weight:700;padding:5px 10px;font-size:.85rem;
}
.a11y-group button.active{background:var(--blue-700);color:#fff;border-color:var(--blue-700)}
.a11y-group button:hover:not(.active){background:var(--hover-grey)}
.font-controls{display:flex;gap:4px;align-items:center}
.font-controls button{
  background:var(--surface-2);border:1px solid var(--border);color:var(--ink);
  border-radius:6px;width:26px;height:26px;cursor:pointer;font-weight:700;line-height:1;
}
.font-controls button:hover{background:var(--hover-grey)}
.simplify-toggle{
  background:var(--surface-2);border:1px solid var(--border);color:var(--ink);
  border-radius:6px;padding:5px 10px;font-size:.85rem;font-weight:700;cursor:pointer;
}
.simplify-toggle:hover{background:var(--hover-grey)}
.a11y-reset-btn{
  background:transparent;border:1px solid var(--border);color:var(--ink);border-radius:8px;
  padding:8px 10px;font-size:.85rem;cursor:pointer;margin:4px 10px 0;font-weight:600;
}
.a11y-reset-btn:hover{background:var(--hover-grey)}
/* ============ SERVICE CATEGORY ACCORDION (Palvelut) ============
   12 broad topic boxes, each a native <details>/<summary> — replaces the
   old priced per-item card grid. Pricing/booking still work exactly as
   before: DIGIASIAT_SERVICES / mergedServices() (data.js/main.js) is
   untouched, and hinnasto.html / ajanvaraus.html read from it directly —
   this page is now a browsable "what do you need help with" directory,
   not the shop itself. Old inbound links like palvelut.html#etatuki still
   land on and open the right box (see the small anchor spans inside each
   summary, and the hash-scroll script at the bottom of palvelut.html). */
.category-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:6px}
@media (max-width:900px){.category-grid{grid-template-columns:repeat(2,1fr)}}
@media (max-width:560px){.category-grid{grid-template-columns:1fr}}
.category-box{
  border:2px solid var(--border);border-radius:var(--radius);background:var(--surface);
  overflow:hidden;transition:border-color .15s ease;
}
.category-box:hover{border-color:var(--blue-500)}
.category-box[open]{border-color:var(--blue-500)}
.category-box summary{
  display:flex;align-items:center;gap:12px;padding:18px 20px;cursor:pointer;
  font-weight:800;font-size:1.02rem;color:var(--ink);list-style:none;
}
.category-box summary::-webkit-details-marker{display:none}
.category-box summary::marker{content:""}
.category-box summary:hover{background:var(--hover-grey)}
.category-icon{font-size:1.4rem;flex:none;line-height:1}
/* Reserves the height of three lines for every title, whether it actually
   wraps to one, two or three, and vertically centres whichever it gets —
   so all 12 closed boxes come out the same height in the grid ("for good
   watching") instead of the short one-line titles leaving their boxes
   visibly shorter than the longer ones. Three lines (not two) covers the
   two-column tablet width, where the longest titles ("Banking, Payments &
   Digital Identity") wrap furthest; the three-column desktop and
   one-column phone layouts have more breathing room per box, so this is
   the safe worst case for all of them. Written in em so it still tracks
   correctly if the visitor uses the A+/A− text-size control. */
.category-title{flex:1;display:flex;align-items:center;line-height:1.3;min-height:3.9em}
.category-chevron{flex:none;color:var(--ink-soft);transition:transform .18s ease}
.category-box[open] .category-chevron{transform:rotate(180deg)}
.category-body{padding:0 20px 20px 52px}
.category-body ul{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:8px}
.category-body li{position:relative;padding-inline-start:16px;color:var(--ink-soft);font-size:.93rem;line-height:1.4}
.category-body li::before{content:"";position:absolute;inset-inline-start:0;top:.55em;width:6px;height:6px;border-radius:50%;background:var(--blue-500)}
.category-note{margin:14px 0 0;padding:10px 12px;background:var(--blue-50);border-inline-start:3px solid var(--blue-500);border-radius:6px;font-size:.83rem;color:var(--ink-soft);line-height:1.4}
/* margin-inline-start (not "left") — see the comment on .header-utility
   above; this is the other half of the same right-aligned icon cluster
   and had the identical bug. */
.header-actions{display:flex;align-items:center;gap:6px;margin-inline-start:auto;flex-wrap:wrap}

/* Search's own persistent second line under the main header row, on every
   page — see the long comment above this markup in components.js for why
   it moved out of the ☰ Valikko drawer. Kept deliberately slim (small
   padding, a single thin top border) so it reads as part of the header,
   not a second, heavier band the way the old navy text-size/language strip
   used to. Styled to look like a real search field even though it's a
   button — clicking anywhere in it opens the existing full-screen search
   box, which has the real input. */
.header-search-row{border-top:1px solid var(--border);padding:8px 20px}
.header-search-btn{
  display:flex;align-items:center;gap:10px;width:100%;max-width:560px;margin:0 auto;
  background:var(--surface-2);border:1.5px solid var(--border);border-radius:999px;
  padding:9px 16px;font-size:.92rem;color:var(--ink-soft);cursor:pointer;font-family:inherit;
  text-align:start;
}
.header-search-btn:hover{background:var(--hover-grey);color:var(--ink)}
.icon-btn{
  background:none;border:none;cursor:pointer;color:var(--blue-800);
  width:38px;height:38px;border-radius:50%;display:flex;align-items:center;justify-content:center;
  position:relative;
}
.icon-btn:hover{background:var(--hover-grey)}
.cart-count{
  position:absolute;top:-2px;inset-inline-end:-2px;background:var(--blue-700);color:#fff;font-size:.65rem;
  border-radius:999px;min-width:16px;height:16px;display:flex;align-items:center;justify-content:center;padding:0 3px;
}

/* Search overlay */
.search-overlay{
  position:fixed;inset:0;background:rgba(0,32,91,.55);z-index:200;
  display:none;align-items:flex-start;justify-content:center;padding-top:10vh;
}
.search-overlay.open{display:flex}
.search-box{background:var(--surface);border-radius:var(--radius);padding:20px;width:min(600px,92vw);box-shadow:var(--shadow-lg)}
.search-box-row{display:flex;gap:10px;align-items:center}
.search-box input{flex:1;padding:12px 14px;border:2px solid var(--border);border-radius:10px;font-size:1rem}
.search-close{background:var(--blue-100);border:none;color:var(--blue-800);width:42px;height:42px;border-radius:10px;cursor:pointer;font-size:1.1rem}
.search-close:hover{background:var(--hover-grey)}
.search-results{margin-top:14px;max-height:50vh;overflow:auto}
.search-results a{display:block;padding:10px;border-radius:8px}
.search-results a:hover{background:var(--blue-50);text-decoration:none}
.search-empty{color:var(--ink-soft);padding:10px}

/* ============ HERO ============
   Restyled 2026-09-21 into a bigger, bolder "banner" hero (referencing
   nexigen.com's full-width hero band + single prominent CTA) at Susanna's
   request. This is a visual pass only on index.html's hero markup — every
   element keeps its original class/id/data-i18n hook, so the language
   switcher, simple-mode, dark-mode and contrast rules below still apply
   unchanged. Rolling the same visual language to the rest of the site is
   a separate, later step once this direction is approved. */
.hero{
  background:linear-gradient(135deg,var(--blue-900),var(--blue-700) 60%,var(--blue-500));
  color:#fff;padding:64px 0;position:relative;overflow:hidden;
}
/* The photo Susanna sent sits as the bottom layer here, with the same navy
   gradient drawn over it at less than full opacity — so it reads as the
   hero's usual navy band with the picture just visible through it, not a
   photo with text stamped on top. The gradient stays strong enough (mostly
   navy, photo only lightly showing) that the white heading/body text keeps
   the same contrast it always had. .hero-band only appears on the
   homepage's own hero, not the shorter one palvelut.html reuses .hero for
   — "only in the first page," as asked.
   The photo itself is now its own layer (::after, z-index:-1 — painted
   behind .hero-band's own gradient background) instead of being combined
   into one `background` shorthand with the gradient. Reason: the three
   people in the photo are leaning/pointing toward the left of the frame
   (into where the text sits) — that only reads correctly while the page is
   left-to-right. When a visitor translates the site into an RTL language
   (Arabic, Persian, etc. via the Google Translate widget, which sets
   dir="rtl" on <html>), the photo needs to mirror so they're still facing
   into the text rather than away from it — see the dir="rtl" rule below.
   Splitting it into its own layer is what makes that mirror possible
   without also flipping the real headline/button text, which sits in a
   sibling element (.hero .container), not inside this pseudo-element. */
.hero-band{
  background:linear-gradient(135deg,rgba(11,42,84,.93),rgba(20,77,140,.90) 60%,rgba(43,120,196,.86));
}
.hero-band::after{
  content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;
  background:url("../img/hero-photo.jpg") center 30%/cover no-repeat;
}
/* Mirrors just the photo layer — not the gradient, not the text — so the
   people in it face into the text instead of away from it once the page
   reads right-to-left. */
html[dir="rtl"] .hero-band::after{
  transform:scaleX(-1);
}
.hero::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(640px circle at 88% 12%,rgba(255,255,255,.10),transparent 60%);
}
/* Top padding cut from 88px to 44px — with the header now reliably one
   line (see the .header-inner width/spacing fix above), the old 88px
   left a visibly large empty gap between the header and the "HELSINKI ·
   ESPOO · VANTAA" pill, which Susanna circled and asked to have removed.
   Bottom padding (96px) is untouched — that space belongs to the content
   below the hero, not the gap she flagged. */
.hero-band{padding:44px 0 96px}
/* Single-column now — the white logo/facts card that used to fill a
   second grid column is gone (Susanna's request), so the photo itself
   (the three of them now on the right, since the file was flipped) is
   what fills that space. .hero-content is capped to roughly half the
   width so the text never runs under where the people are. */
.hero .container{position:relative;z-index:1;display:block}
/* Widened from 600px: the heading row below now has to fit "Varaa aika"
   beside the headline, not just the headline alone. */
.hero-content{max-width:820px}
/* Headline + "Varaa aika" share one row (Susanna: the button used to sit
   alone above an empty gap once the old location badge was removed; the
   page's own opening text now fills that same line instead).
   align-items:flex-start keeps the button pinned to the first line of the
   heading rather than drifting to its vertical centre once the heading
   wraps to two lines; flex-wrap drops the button below the heading on
   narrow screens where there's no room for both side by side. */
.hero-heading-row{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;flex-wrap:wrap}
.hero-topbar-cta{padding:.75em 1.7em;font-size:.95rem;flex:none;margin-top:.3em}
/* Round 41: Susanna circled this button and drew an arrow further right,
   into the photo's side of the hero — "move to the more right." Below
   960px .hero-content already goes full-width (no photo column to move
   into — see the max-width:none override further down), so the button
   stays in its normal spot beside/under the heading there. Above 960px,
   taking it out of the flex row with position:absolute anchors it to
   .hero .container (the nearest positioned ancestor, full section width)
   instead of just the 820px text column, landing it at the section's own
   right edge — same logical edge every other right-aligned control on
   the page already uses, so it still mirrors correctly under RTL. */
@media (min-width:961px){
  .hero-topbar-cta{position:absolute;top:4px;inset-inline-end:0;margin-top:0}
}
/* Round 39: the homepage's second, bottom "Valmis aloittamaan?" CTA band
   used to be three centered lines stacked on top of each other (heading,
   subtext, button) — Susanna's screenshot circled the button sitting
   alone below the text and asked for it to move beside the text instead,
   "to the right... in Persian to the left". Same side-by-side pattern as
   .hero-heading-row above: plain flexbox with no fixed left/right, so it
   already mirrors correctly under RTL (confirmed working there since
   Round 28) with zero extra code needed for Persian/Arabic. Drops back
   to stacked and centered on narrow screens, same look as before. */
.cta-band-row{display:flex;align-items:center;justify-content:space-between;gap:24px;flex-wrap:wrap}
.cta-band-text{flex:1;min-width:240px}
.cta-band-btn{flex:none}
@media (max-width:560px){
  .cta-band-row{justify-content:center;text-align:center}
}
/* min-height on the headline/paragraph reserves the vertical space the
   Finnish/English text already fills (2 lines / 3 lines, in em units so
   it self-scales with each element's own font-size). It changes nothing
   for the text as written today — it only stops the hero from visibly
   shrinking when a Google-translated language happens to render shorter
   than Finnish. A translation that renders LONGER than today's text will
   still grow the hero; that part can't be reserved for in advance since
   we don't control how many lines any given target language needs. */
.hero h1{color:#fff;font-size:clamp(2.4rem,4.2vw,3.4rem);line-height:1.12;letter-spacing:-.01em;min-height:2.24em;flex:1;min-width:280px;margin:0}
.hero p{color:rgba(255,255,255,.9);font-size:1.15rem;max-width:46ch;min-height:4.65em;margin-top:16px}
/* Only the three descriptive badges live here now (the location pill that
   used to sit above the heading is gone — see .hero-heading-row above) —
   still grouped together so "Senioreille sopivaa" stays on the same line
   as the other two ellipse badges. */
.hero-badges{display:flex;gap:10px;flex-wrap:wrap;margin:18px 0}
.badge{background:rgba(255,255,255,.15);border:1px solid rgba(255,255,255,.35);padding:6px 12px;border-radius:999px;font-size:.8rem}
/* Only "Katso palvelut" lives here now (Varaa aika moved up into
   .hero-heading-row), centered within the text column per Susanna's
   "services in the middle". */
.hero-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:22px;align-items:center;justify-content:center;text-align:center}
.btn-hero{padding:1.05em 2.1em;font-size:1.08rem;font-weight:700;box-shadow:var(--shadow-lg)}
.btn-hero-secondary{
  background:transparent;border:none;color:#fff;font-weight:600;font-size:1rem;
  padding:1.05em 1em;cursor:pointer;text-decoration:underline;text-underline-offset:5px;
}
.btn-hero-secondary::after{content:" →"}
.btn-hero-secondary:hover{color:rgba(255,255,255,.8)}

/* ============ QUICK-ACCESS CARDS ============
   Referencing nexigen.com's bordered icon-card row right under its hero
   (icon circle + bold title + a link, inside a light box with a coloured
   border) — mapped to digiasiat's real contact channels. Sits right after
   the hero, hidden in Simple view like the rest of the homepage's "extra"
   sections. */
.quick-access{padding-top:40px;padding-bottom:8px}
/* Round 41: Etätuki now sits on its own row, above the "contact us" trio
   below — see the HTML comment at this section's markup for why. Centered,
   capped to one card's natural width so it doesn't stretch across the
   whole row looking like an empty 4-column grid with 3 gaps unused. */
.quick-access-solo{display:flex;justify-content:center;margin-bottom:22px}
.quick-access-solo .quick-access-card{max-width:260px;width:100%}
.quick-access-subhead{margin:0 0 16px}
.quick-access-subhead h3{font-size:1.05rem;font-weight:700;color:var(--ink);margin:0}
/* 3 columns now, not 4 — Etätuki moved out to its own row above, so this
   grid only ever holds the phone/WhatsApp/booking trio. */
.quick-access-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}
.quick-access-card{
  display:flex;flex-direction:column;align-items:center;text-align:center;gap:10px;
  background:var(--surface);border:2px solid var(--blue-100);border-radius:var(--radius);
  padding:26px 16px;text-decoration:none;transition:.15s ease;
}
.quick-access-card:hover{border-color:var(--blue-500);box-shadow:var(--shadow);text-decoration:none}
.quick-access-icon{
  display:flex;align-items:center;justify-content:center;width:52px;height:52px;
  border-radius:50%;background:var(--blue-700);font-size:1.5rem;line-height:1;
}
.quick-access-title{font-weight:700;color:var(--ink);font-size:1.02rem}
.quick-access-link{color:var(--blue-700);font-weight:600;font-size:.9rem;text-decoration:underline;text-underline-offset:3px}
@media (max-width:900px){.quick-access-grid{grid-template-columns:repeat(2,1fr)}}
@media (max-width:480px){.quick-access-grid{grid-template-columns:1fr}}

/* ============ CARDS / GRID ============ */
.grid{display:grid;gap:20px}
.grid-3{grid-template-columns:repeat(3,1fr)}
.grid-4{grid-template-columns:repeat(4,1fr)}
.grid-2{grid-template-columns:repeat(2,1fr)}
.card{
  background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:22px;
  box-shadow:var(--shadow);height:100%;display:flex;flex-direction:column;
}
.card .icon{
  width:48px;height:48px;border-radius:12px;background:var(--blue-100);color:var(--blue-700);
  display:flex;align-items:center;justify-content:center;margin-bottom:12px;font-size:1.4rem;
}
.card .price{margin-top:auto;padding-top:12px;font-weight:700;color:var(--blue-800);font-size:1.1rem}
.card-cta{margin-top:12px}
.service-card{cursor:default}
.tag{display:inline-block;background:var(--blue-100);color:var(--blue-800);border-radius:999px;padding:2px 10px;font-size:.72rem;font-weight:700;margin-bottom:8px}

/* Steps */
.steps{display:flex;gap:18px;flex-wrap:wrap;justify-content:space-between}
.step{flex:1;min-width:180px;text-align:center}
.step-num{
  width:40px;height:40px;border-radius:50%;background:var(--blue-700);color:#fff;
  display:flex;align-items:center;justify-content:center;margin:0 auto 10px;font-weight:800;
}
/* Round 41: the four "how it works" steps are now links (click the icon or
   the text to go straight to that step's real page — services, booking,
   contact, or the account's order history) instead of plain static text.
   Kept the same centered look; just dropped the underline/link color and
   added a soft hover so it still reads as clickable. */
.step-link{display:block;text-decoration:none;color:inherit;border-radius:14px;padding:10px;transition:background .15s,box-shadow .15s}
.step-link:hover,.step-link:focus-visible{background:var(--hover-grey);text-decoration:none;box-shadow:var(--shadow)}

/* Product / shop */
.filters{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:20px}
.filters select,.filters input{padding:8px 12px;border:1px solid var(--border);border-radius:8px}
.product-card img,.product-card .ph{height:130px;border-radius:10px;background:var(--blue-50);display:flex;align-items:center;justify-content:center;color:var(--blue-500);font-size:2.2rem;margin-bottom:12px}
.product-card img{width:100%;object-fit:cover;font-size:0}
.product-card .prod-desc{margin:2px 0 8px}
.product-card{position:relative}
.service-card{position:relative}
.product-delete-btn,.service-delete-btn{
  position:absolute;top:10px;inset-inline-end:10px;width:28px;height:28px;border-radius:50%;border:none;
  background:rgba(255,255,255,.9);color:var(--danger);cursor:pointer;font-weight:800;box-shadow:var(--shadow);display:none;
}
body.edit-mode .product-delete-btn,body.edit-mode .service-delete-btn{display:block}
.product-delete-btn:hover,.service-delete-btn:hover{background:var(--hover-grey)}
.product-edit-btn,.service-edit-btn{
  position:absolute;top:10px;inset-inline-start:10px;width:28px;height:28px;border-radius:50%;border:none;
  background:rgba(255,255,255,.9);color:var(--blue-700);cursor:pointer;font-weight:800;box-shadow:var(--shadow);display:none;
  font-size:.85rem;line-height:1;
}
body.edit-mode .product-edit-btn,body.edit-mode .service-edit-btn{display:flex;align-items:center;justify-content:center}
.product-edit-btn:hover,.service-edit-btn:hover{background:var(--hover-grey)}
.price-edit-btn{
  border:none;background:none;color:var(--blue-700);cursor:pointer;font-size:.85rem;line-height:1;
  margin-inline-start:8px;vertical-align:middle;display:none;
}
body.edit-mode .price-edit-btn{display:inline-block}
.price-edit-btn:hover{color:var(--blue-900)}
.stock{font-size:.78rem;font-weight:700}
.stock.in{color:var(--success)}
.stock.low{color:var(--warn)}
.stock.out{color:var(--danger)}
.cond-badge{display:inline-block;font-size:.7rem;font-weight:700;padding:2px 9px;border-radius:999px;margin:2px 0 6px}
.cond-new{background:#E6F4EC;color:var(--success)}
.cond-almost-new{background:var(--blue-100);color:var(--blue-700)}
.cond-good{background:#FBF0DC;color:var(--warn)}
.price-free{color:var(--success)}
.qty-row{display:flex;align-items:center;gap:8px;margin:10px 0}
.qty-row button{width:30px;height:30px;border-radius:8px;border:1px solid var(--border);background:var(--surface);cursor:pointer;font-weight:700}
.qty-row button:hover{background:var(--hover-grey)}
.qty-row input{width:44px;text-align:center;border:1px solid var(--border);border-radius:8px;padding:4px}

/* Cart drawer. inset-inline-end (not "right"): slides in from the
   trailing edge, which is the physical left once the page reads
   right-to-left — same reasoning as .main-nav's inset-inline-start. */
.cart-drawer{
  position:fixed;top:0;inset-inline-end:-420px;width:400px;max-width:92vw;height:100%;background:var(--surface);
  box-shadow:-8px 0 30px rgba(0,32,91,.25);z-index:210;transition:inset-inline-end .25s ease;display:flex;flex-direction:column;
}
.cart-drawer.open{inset-inline-end:0}
.cart-header{padding:18px;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:center}
.cart-items{flex:1;overflow:auto;padding:14px 18px}
.cart-item{display:flex;justify-content:space-between;gap:8px;padding:10px 0;border-bottom:1px solid var(--border)}
.cart-footer{padding:18px;border-top:1px solid var(--border)}
.cart-total-row{display:flex;justify-content:space-between;font-weight:800;margin-bottom:12px;font-size:1.1rem}
.cart-remove{background:none;border:none;color:var(--danger);cursor:pointer;font-size:.8rem;border-radius:6px;padding:2px 6px;margin:-2px -6px}
.cart-remove:hover{background:var(--hover-grey)}
.backdrop{position:fixed;inset:0;background:rgba(0,32,91,.4);z-index:205;display:none}
.backdrop.open{display:block}

/* Tables */
table{width:100%;border-collapse:collapse;background:var(--surface);border-radius:var(--radius);overflow:hidden;box-shadow:var(--shadow)}
/* text-align:start (not the physical "left") so the price table's header
   row and cells re-align themselves to the right in Persian/Arabic — any
   language Google's widget renders with dir="rtl" on <html>. Before this,
   the table stayed left-aligned even once the rest of the page had
   flipped to RTL, which is what Susanna circled in her Hinnasto
   screenshot: the "خدمات/قیمت" header and the price+unit cells sitting
   oddly against the wrong edge of the table instead of following the
   page's own reading direction. */
th,td{padding:12px 16px;text-align:start;border-bottom:1px solid var(--border)}
th{background:var(--blue-800);color:#fff;font-size:.85rem;text-transform:uppercase;letter-spacing:.03em}
tr:last-child td{border-bottom:none}
.table-wrap{overflow-x:auto}

/* Forms */
label{display:block;font-weight:600;margin-bottom:6px;font-size:.9rem}
.req{color:var(--danger);margin-inline-start:2px}
input,textarea,select{
  width:100%;padding:10px 12px;border:1px solid var(--border);border-radius:8px;font-family:inherit;font-size:1rem;background:var(--surface);color:var(--ink);
}
input:focus,textarea:focus,select:focus{outline:2px solid var(--blue-500);outline-offset:1px}
.form-row{margin-bottom:16px}
.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}
fieldset{border:1px solid var(--border);border-radius:var(--radius);padding:16px;margin-bottom:16px}
legend{font-weight:700;color:var(--blue-800);padding:0 8px}

/* Payment methods */
.pay-methods{display:flex;gap:10px;flex-wrap:wrap}
.pay-chip{
  border:1px solid var(--border);border-radius:10px;padding:10px 14px;display:flex;align-items:center;gap:8px;
  cursor:pointer;background:var(--surface);font-weight:600;
}
.pay-chip:hover{background:var(--hover-grey)}
.pay-chip.selected,.pay-chip.selected:hover{border-color:var(--blue-700);background:var(--blue-100)}
.pay-icons{display:flex;gap:10px;align-items:center;flex-wrap:wrap;opacity:.9}
.pay-icons span{border:1px solid var(--border);border-radius:6px;padding:4px 8px;font-size:.7rem;font-weight:800;color:var(--blue-800);background:var(--surface)}

/* Calendar / booking */
.cal-wrap{display:grid;grid-template-columns:1.1fr .9fr;gap:24px}
/* Applied once a booking is confirmed (see showBookingConfirmation() in
   ajanvaraus.html), when the calendar/service card and the contact-form
   card's own content are hidden, leaving only the confirmation box behind
   in the second grid column. Without this, the grid still reserves the
   first column's width for nothing, so the confirmation would sit in a
   narrow strip on the right with a large empty gap beside it instead of
   reading as the one thing left on the page. */
.cal-wrap.cal-wrap-confirmed{grid-template-columns:1fr}
.cal-wrap.cal-wrap-confirmed #bookingConfirmation{max-width:520px;margin-left:auto;margin-right:auto}
.cal-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}
.cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:6px;text-align:center}
.cal-grid .dow{font-size:.75rem;color:var(--ink-soft);font-weight:700;padding:4px 0}
.cal-day{
  aspect-ratio:1;border-radius:8px;border:1px solid var(--border);background:var(--surface);cursor:pointer;
  display:flex;align-items:center;justify-content:center;font-size:.9rem;
}
.cal-day:not(.disabled):not(.selected):hover{background:var(--hover-grey);border-color:var(--hover-grey)}
.cal-day.disabled{background:var(--hover-grey);border-color:var(--hover-grey);color:var(--ink-soft);opacity:1;cursor:not-allowed}
.cal-day.selected,.cal-day.selected:hover{background:var(--blue-700);color:#fff;border-color:var(--blue-700)}
.cal-day.today{border-color:var(--blue-500);font-weight:800}
.slot-list{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-top:10px}
.slot{padding:8px;border:1px solid var(--border);border-radius:8px;text-align:center;cursor:pointer;font-size:.85rem;background:var(--surface)}
.slot:hover{background:var(--hover-grey)}
.slot.selected,.slot.selected:hover{background:var(--blue-700);color:#fff;border-color:var(--blue-700)}
.slot.taken{opacity:.35;cursor:not-allowed;text-decoration:line-through}
.slot.taken:hover{background:var(--surface)}

/* Account */
.account-tabs{display:flex;gap:8px;border-bottom:1px solid var(--border);margin-bottom:20px;flex-wrap:wrap}
.account-tabs button{background:none;border:none;padding:10px 16px;font-weight:700;cursor:pointer;color:var(--ink-soft);border-bottom:3px solid transparent;border-radius:8px 8px 0 0}
.account-tabs button:hover{background:var(--hover-grey)}
.account-tabs button.active{color:var(--blue-800);border-color:var(--blue-700)}
.purchase-row{display:flex;justify-content:space-between;padding:12px;border:1px solid var(--border);border-radius:10px;margin-bottom:10px;flex-wrap:wrap;gap:6px}

/* Guides / PDFs */
.guide-card{display:flex;gap:14px;align-items:flex-start;position:relative;padding-inline-end:40px}
.guide-card .pdf-icon{width:46px;height:46px;border-radius:10px;background:#FEE9E7;color:#C0392B;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:.7rem;flex:none}

/* Footer */
.site-footer{background:var(--blue-900);color:rgba(255,255,255,.85);padding:50px 0 20px;margin-top:40px}
.footer-grid{display:grid;grid-template-columns:1.3fr 1fr 1fr 1.1fr;gap:32px}
.site-footer h4{color:#fff;font-size:1rem;margin-bottom:14px}
.site-footer a{color:rgba(255,255,255,.8)}
.site-footer a:hover{color:#fff}
.site-footer ul{list-style:none;padding:0;margin:0}
.site-footer li{margin-bottom:8px}
.footer-social{display:flex;gap:10px;margin-top:10px;flex-wrap:wrap}
.footer-social a{
  width:36px;height:36px;border-radius:50%;background:rgba(255,255,255,.12);display:flex;align-items:center;justify-content:center;
}
.footer-social a:hover{background:rgba(255,255,255,.25)}
.footer-bottom{
  border-top:1px solid rgba(255,255,255,.15);margin-top:34px;padding-top:18px;
  display:flex;justify-content:space-between;flex-wrap:wrap;gap:10px;font-size:.8rem;
}
.footer-pay{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}
.footer-pay span{border:1px solid rgba(255,255,255,.3);border-radius:6px;padding:3px 8px;font-size:.68rem;font-weight:800}

/* Cookie banner */
.cookie-banner{
  /* Anchored at the leading edge with a fixed width on desktop so it never
     reaches under the back-to-top / chat buttons parked at the trailing
     (bottom-right in LTR, bottom-left in RTL) corner. inset-inline-start/
     end so it swaps sides along with those buttons once the page reads
     right-to-left, instead of staying stuck at the physical left. */
  position:fixed;inset-inline-start:16px;inset-inline-end:auto;bottom:16px;width:420px;max-width:calc(100vw - 32px);background:var(--surface);
  border-radius:var(--radius);box-shadow:var(--shadow-lg);padding:18px 20px;z-index:300;border:1px solid var(--border);
  display:none;
}
@media (max-width:720px){
  .cookie-banner{inset-inline-start:16px;inset-inline-end:16px;width:auto;bottom:84px}
}
.cookie-banner.open{display:block}
.cookie-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:12px}
.cookie-modal{
  position:fixed;inset:0;background:rgba(0,32,91,.5);z-index:310;display:none;align-items:center;justify-content:center;padding:20px;
}
.cookie-modal.open{display:flex}
.cookie-modal-box{background:var(--surface);border-radius:var(--radius);padding:24px;max-width:480px;width:100%;max-height:85vh;overflow:auto}

/* Generic modal (reused for the "add product" form etc.) */
.modal{position:fixed;inset:0;background:rgba(0,32,91,.5);z-index:310;display:none;align-items:center;justify-content:center;padding:20px}
.modal.open{display:flex}
.modal-box{background:var(--surface);border-radius:var(--radius);padding:24px;max-width:520px;width:100%;max-height:88vh;overflow:auto}
.modal-close{position:absolute;top:14px;inset-inline-end:14px;background:none;border:none;font-size:1.1rem;cursor:pointer;color:var(--ink-soft);width:32px;height:32px;border-radius:50%}
.modal-close:hover{background:var(--hover-grey)}
.modal-box{position:relative}

/* Feedback modal */
.feedback-row-label{font-weight:700;margin:16px 0 8px}
.feedback-channels{display:flex;flex-wrap:wrap;gap:8px}
.feedback-channels button{
  background:var(--surface-2);border:1px solid var(--border);color:var(--ink);
  border-radius:999px;padding:7px 14px;font-size:.85rem;font-weight:600;cursor:pointer;
}
.feedback-channels button:hover{background:var(--hover-grey)}
.feedback-channels button.active{background:var(--blue-700);color:#fff;border-color:var(--blue-700)}
.feedback-stars{display:flex;gap:4px}
.feedback-stars button{
  background:none;border:none;font-size:1.5rem;cursor:pointer;opacity:.35;
  padding:2px;line-height:1;filter:grayscale(1);
}
.feedback-stars button:hover,.feedback-stars button.active{opacity:1;filter:none}
.feedback-comment{width:100%;margin-top:4px;resize:vertical}
/* Contextual "how did that go?" prompt shown right after a booking is
   confirmed or a contact message is sent — a lighter-weight callout than
   the modal itself, which it opens on click. */
.feedback-prompt{
  display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;
  background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius);
  padding:12px 16px;margin-top:16px;
}
.img-upload-preview{
  width:100%;height:140px;border-radius:10px;background:var(--blue-50);border:1.5px dashed var(--border);
  display:flex;align-items:center;justify-content:center;color:var(--blue-500);font-size:.85rem;overflow:hidden;margin-bottom:8px;
}
.img-upload-preview img{width:100%;height:100%;object-fit:cover}
.cookie-option{display:flex;justify-content:space-between;align-items:center;padding:12px 0;border-bottom:1px solid var(--border)}
.switch{position:relative;width:42px;height:24px;flex:none}
.switch input{opacity:0;width:0;height:0}
.slider-toggle{position:absolute;inset:0;background:var(--border);border-radius:999px;cursor:pointer;transition:.2s}
.slider-toggle::before{content:"";position:absolute;width:18px;height:18px;inset-inline-start:3px;top:3px;background:#fff;border-radius:50%;transition:.2s}
.switch input:checked + .slider-toggle{background:var(--blue-700)}
.switch input:checked + .slider-toggle::before{transform:translateX(18px)}
/* The knob's own position is a logical inset-inline-start above, so it
   already starts on the correct side in RTL — but the "slide over" motion
   is a transform, which is always physical, so the RTL page needs the
   mirrored (negative) distance or the knob would try to slide off the
   right edge of the track instead of over to the left. */
html[dir="rtl"] .switch input:checked + .slider-toggle::before{transform:translateX(-18px)}
.switch input:disabled + .slider-toggle{background:var(--blue-300,#9db8dd);cursor:not-allowed}

/* Back to top. inset-inline-end (not "right") — this and the chat widget
   below form the trailing-corner FAB cluster; .edit-fab/.help-fab-wrap
   are the matching leading-corner cluster (see their own comments). All
   four now swap corners together once the page reads right-to-left,
   instead of the cluster staying pinned to the physical right. */
.back-to-top{
  position:fixed;inset-inline-end:20px;bottom:20px;width:46px;height:46px;border-radius:50%;background:var(--blue-700);color:#fff;
  border:none;cursor:pointer;box-shadow:var(--shadow-lg);display:none;align-items:center;justify-content:center;font-size:1.2rem;z-index:150;
}
.back-to-top.show{display:flex}

/* Chat widget */
.chat-fab{
  position:fixed;inset-inline-end:78px;bottom:20px;width:52px;height:52px;border-radius:50%;background:var(--blue-500);color:#fff;
  border:none;cursor:pointer;box-shadow:var(--shadow-lg);display:flex;align-items:center;justify-content:center;font-size:1.3rem;z-index:150;
}
.chat-panel{
  position:fixed;inset-inline-end:20px;bottom:84px;width:340px;max-width:90vw;height:440px;max-height:70vh;background:var(--surface);border-radius:var(--radius);
  box-shadow:var(--shadow-lg);z-index:160;display:none;flex-direction:column;overflow:hidden;border:1px solid var(--border);
}
.chat-panel.open{display:flex}
.chat-head{background:var(--blue-700);color:#fff;padding:14px;display:flex;justify-content:space-between;align-items:center}
.chat-body{flex:1;overflow:auto;padding:12px;background:var(--blue-50);display:flex;flex-direction:column;gap:8px}
.chat-msg{padding:8px 12px;border-radius:12px;max-width:85%;font-size:.88rem}
.chat-msg.bot{background:var(--surface);border:1px solid var(--border);align-self:flex-start}
.chat-msg.user{background:var(--blue-700);color:#fff;align-self:flex-end}
.chat-input-row{display:flex;border-top:1px solid var(--border)}
.chat-input-row input{border:none;border-radius:0}
.chat-input-row button{border:none;background:var(--blue-700);color:#fff;padding:0 16px;cursor:pointer}
.chat-note{font-size:.68rem;color:var(--ink-soft);padding:6px 12px;border-top:1px solid var(--border)}
.chat-note a{color:var(--blue-700);font-weight:700}
.chat-head > div{display:flex;gap:2px}
.chat-suggestions{display:flex;gap:6px;flex-wrap:wrap;padding:0 10px 8px;background:var(--blue-50)}
.chat-suggestion{
  background:var(--surface);border:1px solid var(--border);color:var(--blue-800);border-radius:999px;
  padding:5px 11px;font-size:.75rem;cursor:pointer;font-weight:600;
}
.chat-suggestion:hover{background:var(--hover-grey)}

/* Edit mode */
.edit-toolbar{
  position:fixed;left:0;right:0;bottom:0;background:var(--blue-900);color:#fff;padding:10px 20px;z-index:400;
  display:none;align-items:center;gap:12px;flex-wrap:wrap;justify-content:center;
}
.edit-toolbar.open{display:flex}
body.edit-mode [data-editable]{outline:2px dashed var(--blue-500);outline-offset:3px;cursor:text;background:rgba(11,95,204,.05)}
body.edit-mode [data-editable]:hover{outline-color:var(--blue-800);background:rgba(11,95,204,.12)}
body.dark-mode.edit-mode [data-editable]{outline-color:#9FC7FF;background:rgba(159,199,255,.08)}
body.dark-mode.edit-mode [data-editable]:hover{outline-color:#fff;background:rgba(159,199,255,.16)}
.add-product-btn{display:none}
body.edit-mode .add-product-btn{display:inline-flex}
.manage-promos-btn{display:none}
body.edit-mode .manage-promos-btn{display:inline-flex}
.edit-mode-hint{display:none}
body.edit-mode .edit-mode-hint{display:block}
.edit-fab{
  position:fixed;inset-inline-start:20px;bottom:20px;background:var(--blue-900);color:#fff;border:none;border-radius:999px;
  padding:10px 16px;font-size:.8rem;cursor:pointer;box-shadow:var(--shadow-lg);z-index:150;display:flex;gap:6px;align-items:center;
}

/* Simplify view */
body.simple-mode .hide-simple{display:none !important}
body.simple-mode .hero{padding:36px 0}
body.simple-mode .section{padding:30px 0}

/* Language toggle: bilingual content pairs.
   Mark Finnish text  <span class="lang-fi">...</span>
   Mark English text  <span class="lang-en">...</span>
   Body gets class "lang-mode-fi" (default) or "lang-mode-en" via JS. */
/* Default (Finnish) state: .lang-fi visible inline, .lang-en hidden.
   Only ever put these classes on inline-level elements (span, a) —
   for table cells / list markers, put the spans INSIDE the cell/li instead.
   NOTE: the body's own language marker uses "lang-mode-fi"/"lang-mode-en"
   (a DIFFERENT name) precisely so it never collides with this class-based
   show/hide selector — body must never carry plain "lang-en"/"lang-fi". */
.lang-en{display:none}
body.lang-mode-en .lang-fi{display:none}
body.lang-mode-en .lang-en{display:inline}

/* Round 45: Russian, Persian and Swedish became real native languages with
   their own hand-written .lang-ru/.lang-fa/.lang-sv content, on the exact
   same show/hide pattern as .lang-en above (hidden by default; each one's
   lang-mode-* class hides .lang-fi and shows its own). Persian's
   right-to-left layout is handled separately, via the html[dir="rtl"] rules
   further down plus applyPageDirection() in main.js — nothing extra needed
   here for that. */
.lang-ru{display:none}
.lang-fa{display:none}
.lang-sv{display:none}
body.lang-mode-ru .lang-fi{display:none}
body.lang-mode-ru .lang-ru{display:inline}
body.lang-mode-fa .lang-fi{display:none}
body.lang-mode-fa .lang-fa{display:inline}
body.lang-mode-sv .lang-fi{display:none}
body.lang-mode-sv .lang-sv{display:inline}

/* selko-Suomi (plain-language Finnish): a genuine third mode, additive to
   the two rules above so fi/en are completely untouched. Mark simplified
   text  <span class="lang-selko">...</span>  as a third sibling alongside
   .lang-fi/.lang-en for any block that's been rewritten in plain language.
   Where no .lang-selko sibling exists yet, main.js's applySelkoFallback()
   adds a "selko-fallback" class to that block's .lang-fi span so selko
   mode still shows readable (if not yet simplified) Finnish instead of
   nothing — see the comment above that function. */
.lang-selko{display:none}
body.lang-mode-selko .lang-en{display:none}
body.lang-mode-selko .lang-fi{display:none}
body.lang-mode-selko .lang-fi.selko-fallback{display:inline}
body.lang-mode-selko .lang-selko{display:inline}

/* Russian correction layer (see applyRussianFixLayer() in main.js): a
   hand-written, correct-Russian sibling for a handful of specific spots,
   next to the existing .lang-fi/.lang-en pair. Hidden by default (fi/en
   still shown, as normal); main.js reveals it — and hides its fi/en
   siblings — only while Russian is the active Google Translate language.
   translate="no" keeps Google's widget from re-translating it back to
   the wrong wording once it's shown. */
.lang-ru-fix{display:none}

/* Accessibility helpers */
.visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
:focus-visible{outline:3px solid var(--blue-500);outline-offset:2px}

/* Toast */
.toast{
  position:fixed;left:50%;transform:translateX(-50%);bottom:90px;background:var(--blue-900);color:#fff;
  padding:12px 20px;border-radius:999px;z-index:500;box-shadow:var(--shadow-lg);opacity:0;pointer-events:none;transition:.25s;
}
.toast.show{opacity:1}

/* Responsive */
@media (max-width:960px){
  .hero-content{max-width:none}
  .grid-3,.grid-4{grid-template-columns:repeat(2,1fr)}
  .footer-grid{grid-template-columns:1fr 1fr}
  .cal-wrap{grid-template-columns:1fr}
  .form-grid{grid-template-columns:1fr}
}
@media (max-width:720px){
  /* .main-nav / .nav-toggle are the unified Menu drawer now — it already
     behaves the same way (fixed off-canvas panel, single toggle button)
     at every width, so nothing extra is needed for it here. */
  .grid-3,.grid-4,.grid-2{grid-template-columns:1fr}
  .footer-grid{grid-template-columns:1fr}
  .hero h1{font-size:1.9rem}
  .chat-panel{inset-inline-end:10px}
  .chat-fab{inset-inline-end:66px}
}

/* ============ MAP (Yhteystiedot / Location) ============ */
#siteMap{position:relative}
.digiasiat-map-label{
  background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:4px 10px;
  font-weight:700;font-size:.82rem;color:var(--blue-900);box-shadow:var(--shadow);
  white-space:nowrap;
}
.digiasiat-map-label::before{border-top-color:var(--surface)}
.directions-row{display:flex;gap:12px;flex-wrap:wrap;margin-top:12px}
.direction-chip{
  display:flex;align-items:center;gap:8px;padding:10px 16px;border-radius:999px;
  background:var(--blue-50);border:1px solid var(--blue-100);color:var(--blue-800);
  font-weight:700;font-size:.88rem;text-decoration:none;
}
.direction-chip:hover{background:var(--blue-100);border-color:var(--blue-500)}
.direction-icon{font-size:1.1rem}

/* ============ DARK MODE ============
   Toggled by JS (body.dark-mode), chosen from the Accessibility menu.
   "System" (the default) resolves to light or dark once in JS by checking
   prefers-color-scheme, then applies/removes this same class — so this
   file only ever needs to style ONE explicit state, not three.
   Most of the site already reads its colours from the variables below, so
   re-pointing a handful of them here re-colours the whole page. The
   remaining fixes are for spots that used a blue-700/800/900 shade
   directly as TEXT on what is now a dark surface (that navy text would
   otherwise vanish into the dark background) — those get one shared
   light-blue accent colour instead. */
/* Matched against html.dark-mode too, not just body.dark-mode: a tiny
   blocking script at the very top of <head> (before body even exists)
   sets that class on <html> immediately from the saved preference, so
   these variables — which repaint almost the entire page — are already
   correct before first paint. Without it, the page always painted light
   first and then flipped dark a moment after main.js ran, which is the
   "blinking and changing" Susanna reported on every page load/navigation
   when dark mode was active. main.js keeps both the html and body classes
   in sync from then on (the finer body.dark-mode-only selectors below
   still need the body class specifically). */
:where(html.dark-mode, body.dark-mode){
  --page-bg:#10161C;
  --surface:#1B2330;
  --surface-2:#212B3E;
  --ink:#E7ECF4;
  --ink-soft:#A9B4C7;
  --border:#33405A;
  --hover-grey:#26314A;
  --blue-50:#16202E;
  --blue-100:#1C2A3D;
}
body.dark-mode h1,body.dark-mode h2,body.dark-mode h3,body.dark-mode h4,
body.dark-mode .logo,
body.dark-mode .main-nav a:hover,body.dark-mode .main-nav a.active,
body.dark-mode .primary-nav a:hover,body.dark-mode .primary-nav a.active,
body.dark-mode .nav-contact-toggle,body.dark-mode .nav-contact-panel a:hover,
body.dark-mode .icon-btn,body.dark-mode .nav-toggle,
body.dark-mode .search-close,
body.dark-mode .card .icon,body.dark-mode .card .price,
body.dark-mode .tag,body.dark-mode .cond-almost-new,
body.dark-mode legend,
body.dark-mode .pay-icons span,
body.dark-mode .account-tabs button.active,
body.dark-mode .price-edit-btn:hover,
body.dark-mode .digiasiat-map-label,
body.dark-mode .chat-suggestion,
body.dark-mode .direction-chip{
  color:#9FC7FF;
}
/* Photos/diagrams/PDF thumbnails can look harsh at full brightness on a
   dark page — a small, standard dark-mode dimming, skipped for anything
   explicitly marked as already theme-aware (none currently) or for the
   admin's own edit-mode thumbnails where exact colour matters. */
body.dark-mode img:not(.no-dim){filter:brightness(.92) contrast(1.02)}
/* Plain text links (the default a{color:var(--blue-600)} from near the top
   of this file) and the outline-button variant both used a navy shade that
   was only ever tested against the light page background — low contrast
   once the surface behind them goes dark. :where() keeps this at zero
   specificity so it never fights a real button's own color:var(--white)
   (many buttons are <a class="btn">) — only plain links pick it up. */
:where(body.dark-mode) a{color:#9FC7FF}
body.dark-mode .btn-outline{color:#9FC7FF;border-color:#9FC7FF}
body.dark-mode .chat-note a,
body.dark-mode .price-edit-btn,
body.dark-mode .logo .dot,
body.dark-mode .product-card .ph{color:#9FC7FF}
/* .btn-white keeps a literal white pill (its background/border are the
   unthemed --white, on purpose, so it still reads as a "white button" over
   a colour hero image in dark mode too) — but its :hover used the themed
   --hover-grey, which in dark mode is a dark navy, so the unthemed
   var(--blue-700) text became dark-on-dark and vanished (reported as the
   invisible "Varaa aika"/"Tallenna" hover text). Give it its own light
   hover shade instead of the page's themed hover colour. */
body.dark-mode .btn-white:hover{background:#D7E3F7;border-color:#D7E3F7;color:var(--blue-800)}
/* Day-number buttons in the booking calendar and the qty +/- buttons both
   sit on the themed --surface/--hover-grey backgrounds but never had their
   own text colour set, so they inherited plain black — invisible on the
   dark-mode navy surface. */
body.dark-mode .cal-day:not(.disabled),
body.dark-mode .qty-row button{color:#9FC7FF}
body.dark-mode .cal-day.selected,body.dark-mode .cal-day.selected:hover{color:#fff}
/* In light mode, an available day (--surface, white) is already lighter
   than a past/disabled day (--hover-grey, light grey) — that relationship
   flips in dark mode because the same two variables happen to invert
   (--surface is the darker of the two there), so past days looked
   lighter than available ones. Restore the same "available = lighter,
   past = darker/receded" relationship in dark mode too. */
body.dark-mode .cal-day:not(.disabled):not(.selected){background:var(--surface-2);border-color:var(--surface-2)}
body.dark-mode .cal-day.disabled{background:var(--page-bg);border-color:var(--page-bg)}
/* .link-btn-plain (tili.html "Unohditko salasanan?" and yhteystiedot.html's
   admin phone-change link) used to hardcode navy as an inline style, which
   likewise disappeared on the dark-mode surface behind it. */
body.dark-mode .link-btn-plain{color:#9FC7FF}

/* ============ HIGH CONTRAST MODE ============
   A stronger, plainer look for reduced vision: heavier borders everywhere
   (including on things that normally rely on shadow alone), no soft/muted
   greys, solid instead of translucent fills. Works together with dark
   mode (high-contrast dark) or on its own (high-contrast light). */
body.high-contrast{
  --ink-soft:var(--ink); /* no pale grey text — everything reads at full strength */
  --shadow:0 0 0 1px var(--ink);
  --shadow-lg:0 0 0 2px var(--ink);
}
body.high-contrast .card,
body.high-contrast .site-header,
body.high-contrast input,body.high-contrast textarea,body.high-contrast select,
body.high-contrast .btn-outline,
body.high-contrast table,
body.high-contrast .cal-day,body.high-contrast .slot,
body.high-contrast .chat-panel,body.high-contrast .modal-box,body.high-contrast .cookie-modal-box{
  border-width:2px;
}
body.high-contrast .btn{border-width:2px}
body.high-contrast a{text-decoration:underline}
body.high-contrast :focus-visible{outline-width:4px}

/* Respect the visitor's OS-level "reduce motion" setting sitewide — this
   site already keeps animation minimal, but the few that exist (the
   goal-card highlight pulse, hover transforms, etc.) should stop moving
   entirely for anyone who has asked their system for that, rather than
   only being "not too much". */
@media (prefers-reduced-motion: reduce){
  *, *::before, *::after{
    animation-duration:0.001ms !important;
    animation-iteration-count:1 !important;
    transition-duration:0.001ms !important;
    scroll-behavior:auto !important;
  }
}

/* ============ ABOUT-ME PHOTO UPLOAD (edit mode) ============ */
.about-photo-wrap{position:relative;flex:none}
.about-photo-wrap img{border-radius:12px;border:1px solid var(--border)}
.photo-upload-btn{
  position:absolute;bottom:-10px;left:50%;transform:translateX(-50%);
  background:var(--blue-700);color:#fff;border:2px solid var(--surface);border-radius:999px;
  padding:5px 12px;font-size:.72rem;font-weight:700;cursor:pointer;white-space:nowrap;
  box-shadow:var(--shadow);display:none;
}
body.edit-mode .photo-upload-btn{display:inline-flex;align-items:center;gap:4px}
.photo-upload-btn:hover{background:var(--blue-800)}

/* ============ "STILL NEED HELP?" + PAGE-FEEDBACK BLOCK ============
   Auto-inserted at the end of any page whose <body> has data-help-block —
   so a person who has just read a whole help/guide/situation-check page
   always finds "talk to someone" and "was this useful" right there,
   instead of having to go hunting for the Contact page separately. */
.help-feedback-block{
  margin:36px auto 0;max-width:720px;padding:22px;border:1px solid var(--border);
  border-radius:12px;background:var(--surface-2);text-align:center;
}
.help-feedback-block h3{margin:0 0 6px;font-size:1.15rem}
.help-feedback-block p{margin:0 0 14px;color:var(--ink-soft)}
.help-feedback-actions{display:flex;gap:10px;justify-content:center;flex-wrap:wrap;margin-bottom:18px}
.help-feedback-divider{border:none;border-top:1px solid var(--border);margin:18px 0}
.page-feedback-row{display:flex;align-items:center;justify-content:center;gap:12px;flex-wrap:wrap}
.page-feedback-row span{color:var(--ink-soft);font-size:.95rem}
.page-feedback-btn{
  background:var(--surface);border:1px solid var(--border);border-radius:8px;
  padding:7px 16px;font-size:1rem;cursor:pointer;font-family:inherit;color:var(--ink);
}
.page-feedback-btn:hover{background:var(--hover-grey)}
.page-feedback-btn.chosen{background:var(--blue-100);border-color:var(--blue-600)}
body.dark-mode .page-feedback-btn.chosen{background:rgba(159,199,255,.18);border-color:#9FC7FF}

/* Small live "open now / closed now" status chip next to opening hours */
.hours-status{
  display:inline-flex;align-items:center;gap:6px;font-weight:700;font-size:.85rem;
  padding:2px 10px;border-radius:999px;margin-inline-start:8px;white-space:nowrap;
}
.hours-status.open{background:#DFF3E8;color:#146C43}
.hours-status.closed{background:var(--hover-grey);color:var(--ink-soft)}
body.dark-mode .hours-status.open{background:rgba(46,204,113,.18);color:#6FE3A6}
body.dark-mode .hours-status.closed{background:rgba(255,255,255,.08);color:var(--ink-soft)}
.hours-status .dot{width:7px;height:7px;border-radius:50%;background:currentColor;display:inline-block}

/* ============ BREADCRUMB + BACK ============
   "Never make people wonder how to return" + "always show where they are" —
   on every page except the homepage. Injected by JS right after the
   header, so no page's HTML needs a placeholder for it. */
.breadcrumb-bar{background:var(--surface-2);border-bottom:1px solid var(--border)}
.breadcrumb-inner{display:flex;align-items:center;gap:16px;flex-wrap:wrap;padding:9px 20px}
.breadcrumb-back{
  background:var(--surface);border:1px solid var(--border);border-radius:8px;
  padding:5px 12px;cursor:pointer;font-weight:700;color:var(--ink);font-size:.85rem;
  display:inline-flex;align-items:center;gap:4px;
}
.breadcrumb-back:hover{background:var(--hover-grey)}
.breadcrumb-path{font-size:.85rem;color:var(--ink-soft);display:flex;gap:6px;align-items:center;flex-wrap:wrap}
.breadcrumb-path a{color:var(--blue-700);font-weight:600}
body.dark-mode .breadcrumb-path a{color:#9FC7FF}

/* ============ PERSISTENT HELP BUTTON (not just the AI chat) ============ */
/* bottom:20px — level with .back-to-top and .chat-fab on the right (both
   also bottom:20px), per Susanna's request to have all three floating
   buttons share the same bottom-most row instead of Help sitting alone on
   a higher line. (.edit-fab shares this same inset-inline-start:20px/
   bottom:20px spot, but only ever shows in edit mode, which store staff
   use — not visitors — so the two never actually appear at the same
   time.) inset-inline-start (not "left") so this leading-corner button
   swaps to the physical left/right along with the rest of the FAB
   cluster once the page reads right-to-left. */
.help-fab-wrap{position:fixed;inset-inline-start:20px;bottom:20px;z-index:150}
.help-fab{
  background:var(--danger);color:#fff;border:none;border-radius:999px;
  padding:10px 16px;font-size:.85rem;font-weight:700;cursor:pointer;box-shadow:var(--shadow-lg);
  display:flex;align-items:center;gap:6px;
}
.help-fab:hover{filter:brightness(1.08)}
.help-menu{
  display:none;position:absolute;bottom:calc(100% + 8px);inset-inline-start:0;min-width:230px;
  background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);
  box-shadow:var(--shadow-lg);padding:8px;
}
.help-menu.open{display:block}
.help-menu a,.help-menu button{
  display:flex;align-items:center;gap:8px;width:100%;text-align:start;
  background:none;border:none;padding:9px 10px;border-radius:8px;cursor:pointer;
  font-size:.88rem;font-weight:600;color:var(--ink);text-decoration:none;
}
.help-menu a:hover,.help-menu button:hover{background:var(--hover-grey);text-decoration:none}

/* ============ GLOSSARY TOOLTIPS ("I don't know what this means") ============ */
.glossary-term{
  border-bottom:1.5px dotted var(--blue-500);cursor:help;font-weight:600;position:relative;
}
.glossary-term:hover,.glossary-term:focus{background:var(--blue-50)}
.glossary-term .glossary-tip{
  display:none;position:absolute;inset-inline-start:0;bottom:calc(100% + 8px);z-index:60;
  background:var(--surface);color:var(--ink);border:1px solid var(--border);border-radius:10px;
  box-shadow:var(--shadow-lg);padding:10px 14px;font-weight:400;font-size:.85rem;
  width:min(280px,80vw);white-space:normal;line-height:1.4;cursor:auto;
}
.glossary-term.open .glossary-tip,
.glossary-term:hover .glossary-tip,
.glossary-term:focus .glossary-tip,
.glossary-term:focus-within .glossary-tip{display:block}

/* ============ "WHAT DO YOU WANT TO DO?" GOAL BUTTONS ============ */
.goal-section{padding:36px 0}
.goal-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:18px}
.goal-btn{
  display:flex;flex-direction:column;align-items:center;gap:8px;text-align:center;
  background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);
  padding:22px 12px;text-decoration:none;color:var(--ink);font-weight:700;font-size:1rem;
  box-shadow:var(--shadow);transition:.15s ease;
  /* Some goal buttons are a <button> (e.g. "Make a video call", which opens
     a choice popover instead of linking straight to a page) rather than an
     <a> — these rules make sure the two render identically. */
  width:100%;cursor:pointer;font-family:inherit;
}
.goal-btn:hover{border-color:var(--blue-500);transform:translateY(-2px);text-decoration:none;box-shadow:var(--shadow-lg)}
.goal-btn .goal-icon{font-size:2rem}
@media (max-width:720px){ .goal-grid{grid-template-columns:repeat(2,1fr)} }
@media (max-width:420px){ .goal-grid{grid-template-columns:1fr} }
/* In Simple view, the goal buttons ARE the homepage — everything else
   (hero, steps, payment icons, guides…) is already tagged hide-simple. */
body.simple-mode .goal-btn{padding:28px 14px;font-size:1.1rem}

/* ============ CALLBACK REQUEST (contact form) ============ */
.callback-box{
  background:var(--surface-2);border:1px solid var(--border);border-radius:10px;
  padding:12px 14px;margin:4px 0 16px;
}
.callback-box label{display:flex;align-items:center;gap:8px;font-weight:700;margin-bottom:0;cursor:pointer}
.callback-box input[type="checkbox"]{width:auto}
.callback-time{margin-top:10px;display:none}
.callback-time.show{display:block}
.form-hint{color:var(--ink-soft);font-size:.85rem;margin:-10px 0 14px}

/* ============ DIAGNOSTIC / STEP PAGES (tilanteeni.html) ============ */
.step-choice-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin:18px 0}
.step-choice{
  background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:18px 10px;
  text-align:center;cursor:pointer;font-weight:700;font-size:1rem;color:var(--ink);
}
.step-choice:hover{border-color:var(--blue-500);background:var(--hover-grey)}
.step-choice .step-choice-icon{font-size:1.8rem;display:block;margin-bottom:8px}
.step-panel{display:none}
.step-panel.open{display:block}
.step-back{margin-bottom:16px}
