@charset "UTF-8";
/* ==========================================================================
   AbedLesCar — ab-a11y.css   ("ab-a11y")
   Self-hosted accessibility widget. Replaces the negishim.com overlay
   (74 KB of third-party JS) that used to be loaded at the end of <body>.

   Serve at: asset('front/assets/css/ab-a11y.css')
   LOAD ORDER: after style.css, responsive.css AND mobile-boost.css.
   This file never edits any other stylesheet — it only adds and overrides.

   --------------------------------------------------------------------------
   NAMING — READ THIS FIRST
   The markup, the JS and this file each grew their own vocabulary, and during
   this review the other two converged on the BEM-ish one:
     accessibility.blade.php renders  #a11y / .a11y / .a11y__toggle /
                                      .a11y__panel / .a11y__opt / .a11y__close /
                                      .a11y__reset / .a11y__stmt
     ab-a11y.js queries               '.a11y__toggle, .ab-a11y-fab,
                                      [data-a11y-toggle], #abA11yFab' (etc.)
                                      and stamps BOTH html.a11y-<flag> and
                                      html.ab-a11y-<flag>, plus a11y-js /
                                      ab-a11y-js / a11y-ready.
   So this file styles BOTH vocabularies everywhere — the shipped .a11y__*
   set and the .ab-a11y-* set the JS still accepts. That is deliberate
   duplication, not sloppiness: a CSS selector list costs nothing, and it
   means a future rename on either side cannot silently unstyle the widget.
   Every id-specificity take-back (§4, §6, §7) leads with
   :is(#a11y,#abA11y,.ab-a11y,.a11y) — :is() carries the weight of its most
   specific argument, so those rules keep their (1,x,y) ranking even when they
   match through the plain .a11y class.

   --------------------------------------------------------------------------
   RULES OBSERVED
   1. RTL-first. Logical properties everywhere (inset-inline-*, inset-block-*,
      margin-inline, padding-inline, border-*-start). env(safe-area-inset-*)
      is PHYSICAL, so it may never be fed to a logical property blind. The
      widget's OWN direction decides where inline-start is; it is pinned rtl
      (here and by dir="rtl" in the markup), therefore inline-start is the
      physical RIGHT edge and the inset we consume is safe-area-inset-RIGHT.
      There is exactly one escape and it flips direction AND the inset
      together (§1) — flipping one without the other is the trap.
   2. Admin never sees this.
        • §5–§12 are gated on a class that only ever lands on <html> from
          front-end code which itself bails on /admin/ — so they cannot reach
          the admin panel at all.
        • §4 and §14 have no such class to hang on, and `body:not(.admin)`
          is worthless on its own because admin layouts render a BARE <body>.
          They are therefore gated on `body.has-ab` — hardcoded in
          layouts/app/front-app.blade.php, present with JS off, and absent
          from both admin layouts — with an html.*a11y-js branch as backup.
   3. Zero third-party anything. No @import, no url() to a remote host, no
      webfont, no icon font. The only url() are inline SVG data-URIs (§12).
   4. Progressive enhancement: the panel ships `hidden`, so with JS off there
      is no dead UI (see §2 for the visibility gate) — and the footer must
      keep its own plain <a href="/accessibility-statement"> so the legally
      required statement is reachable with JS disabled.
   5. Nothing at the bottom of a phone screen may collide with nav#abBar.
      Every bottom-anchored value here is offset by var(--a11y-bar-space) —
      including the short-landscape panel, which previously was not.
   6. No existing class or id is renamed, removed or restyled except through
      the explicitly-scoped effect classes in §5–§12.

   --------------------------------------------------------------------------
   TOGGLE PLACEMENT — the justification (corrected against mobile-boost.css)
     • style.css:716 pins .wp-bottom (WhatsApp) at physical left:30px /
       bottom:30px — the INLINE-END corner on this RTL page.
     • mobile-boost.css §18 then does
         @media (max-width:991.98px){ .wp-bottom{ display:none !important } }
       because .ab-bar already carries a labelled וואטסאפ action. So on phones
       that bubble does NOT exist. An earlier draft of this file stacked the
       toggle at bar-space + 70px to clear a bubble that is not there, leaving
       the FAB floating in 70px of dead air.
     • the old negishim button (style.css:738, left:30px / bottom:100px) dies
       with the script; §14 sweeps up any cached remnant.
   So: anchor to the INLINE-START edge (physical RIGHT in RTL) at both
   breakpoints — one edge, one muscle memory, the natural reading-side corner
   for a Hebrew reader — and on phones take over the exact slot mobile-boost
   vacated: inset-inline-start calc(--ab-s4 + safe-i),
   inset-block-end calc(--ab-bar-space + --ab-s3).

   --------------------------------------------------------------------------
   WHAT THE JS MUST DO (this file only styles it)
     • add class `a11y-js` on <html> (ab-a11y-js / ab-js / a11y-ready are also
       accepted) — that is the visibility gate in §2.
     • toggle .a11y-contrast/.a11y-invert/.a11y-links/.a11y-readable/
       .a11y-nomotion/.a11y-bigcursor and .a11y-t1|t2|t3 on <html>
       (or the ab- prefixed equivalents; both are styled).
     • keep aria-expanded / aria-pressed / [hidden] in sync — every visual
       state in this file is driven off those attributes, never off a
       JS-only "is-open" class.
     • aria-pressed belongs on the six TOGGLES only. text-up / text-down are
       steppers, not toggles: they must carry data-a11y-level (0-4), which §3
       renders as a level badge, and must NOT be given aria-pressed.
     • FOCUS TRAP: CSS cannot trap focus. While the panel is open the JS
       keeps Tab/Shift+Tab inside the panel, moves focus into it on open, and
       on Escape closes and returns focus to the toggle. CSS does the other
       half: a closed panel is [hidden] → display:none → nothing inside it is
       focusable or reachable (§3), and §4 gives every focus stop a real,
       visible ring.
     • aria-modal="false" is honoured: no scrim, the page stays interactive.
     • .a11y-nomotion cannot pause an autoplaying owl carousel or a <video>
       from CSS — the JS must call the carousel's stop API and video.pause().
   ========================================================================== */


/* ==========================================================================
   §1  LOCAL TOKEN BRIDGE
   Everything is read from the mobile-boost.css design tokens by NAME. The
   second argument of each var() is a fallback that only fires if this file is
   ever served without mobile-boost.css — it is insurance, not a hardcode.
   ========================================================================== */

:root{
  /* brand + ink */
  --a11y-brand:        var(--ab-brand,#dc344c);
  --a11y-brand-strong: var(--ab-brand-strong,#c22740);
  --a11y-brand-press:  var(--ab-brand-press,#a81f34);
  --a11y-brand-tint:   var(--ab-brand-tint,rgba(220,52,76,.08));
  --a11y-ink:          var(--ab-ink,#111111);
  --a11y-ink-muted:    var(--ab-ink-muted,#5b6577);
  --a11y-surface:      var(--ab-surface,#ffffff);
  --a11y-surface-2:    var(--ab-surface-2,#f9f9f9);
  --a11y-surface-3:    var(--ab-surface-3,#f1f2f5);
  --a11y-line:         var(--ab-line,rgba(17,17,17,.08));
  --a11y-line-2:       var(--ab-line-2,rgba(17,17,17,.14));

  /* shape + elevation */
  --a11y-r-card:  var(--ab-r-card,14px);
  --a11y-r-field: var(--ab-r-field,12px);
  --a11y-r-pill:  var(--ab-r-pill,999px);
  --a11y-sh-2:    var(--ab-sh-2,0 6px 24px rgba(17,17,17,.14));
  --a11y-sh-brand:var(--ab-sh-brand,0 6px 20px rgba(220,52,76,.35));

  /* rhythm */
  --a11y-s1: var(--ab-s1,4px);
  --a11y-s2: var(--ab-s2,8px);
  --a11y-s3: var(--ab-s3,12px);
  --a11y-s4: var(--ab-s4,16px);
  --a11y-s5: var(--ab-s5,24px);

  /* motion */
  --a11y-d1: var(--ab-d1,120ms);
  --a11y-d2: var(--ab-d2,180ms);
  --a11y-ease:     var(--ab-ease,cubic-bezier(.2,.6,.2,1));
  --a11y-ease-out: var(--ab-ease-out,cubic-bezier(.16,1,.3,1));

  /* chrome geometry */
  --a11y-tap:       var(--ab-tap,48px);
  --a11y-safe-b:    var(--ab-safe-b,env(safe-area-inset-bottom,0px));
  --a11y-bar-space: var(--ab-bar-space,calc(var(--ab-bar-h,62px) + var(--a11y-safe-b)));

  /* Stacking. mobile-boost pins its floats at --ab-z-fab (1031) SPECIFICALLY
     to stay under Bootstrap's offcanvas backdrop (1040) / offcanvas (1045) /
     modal (1055). 1040 would put this widget level with the backdrop and,
     being last in the DOM, it would punch through the dimming whenever the
     mobile menu is open. One step above the other FABs is 1032, not 1040. */
  --a11y-z: 1032;

  /* viewport unit that survives the mobile URL bar */
  --a11y-vh: 100vh;

  /* --- placement, DESKTOP FIRST -------------------------------------------
     Desktop is the default and phones override below, so the breakpoint here
     is byte-identical to mobile-boost's own (max-width:991.98px). A
     min-width:992px query would have left a 0.02px band in which the action
     bar is already hidden but this file still reserved room for it.
     ≥992px: the bottom inline-start corner is empty (.wp-bottom is on the
     opposite corner) and no header is sticky, so the panel may run full
     height. */
  --a11y-edge:      var(--a11y-s5);
  --a11y-toggle-b:  calc(var(--a11y-s5) + var(--a11y-safe-b));
  --a11y-panel-b:   calc(var(--a11y-toggle-b) + 64px);
  --a11y-header-h:  0px;

  /* Default for the safe-area bridge, so a panel that is ever re-parented out
     of the widget root can never end up with an UNDEFINED var here — which
     would make the whole calc() invalid at computed-value time and drop
     inset-inline-start to `auto`, flinging the panel to the opposite edge.
     The real declaration (and the only dir escape) lives on the widget in §2;
     this mirrors it, because the document default is RTL. */
  --a11y-safe-i: var(--ab-safe-i,env(safe-area-inset-right,0px));

  /* text-scale multiplier consumed by §5. 1 = off. */
  --a11y-ts: 1;

  /* legible stack for .a11y-readable — system faces only, no new request.
     Arial / Arial Hebrew / Tahoma all carry a full, open Hebrew set. */
  --a11y-font-readable: Arial,"Arial Hebrew",Tahoma,"Segoe UI",
                        "Noto Sans Hebrew",system-ui,-apple-system,sans-serif;
}

@supports (height:100dvh){ :root{ --a11y-vh:100dvh; } }

/* --- phones: the action bar exists, the WhatsApp bubble does not ----------

   RULE 5 AND THE NOMINAL-TOKEN TRAP.  --ab-bar-h is 62px, but that is a
   NOMINAL token, not .ab-bar's box.  Measured against the real partial:
       1px  border-top
     + 8px  padding-block-start          (--ab-s2)
     + 60px .ab-item  (min-block-size 48px, overrun by icon + gap + label)
     + 8px  padding-block-end            (--ab-s2, before --ab-safe-b)
     = 77px
   The token under-reports by 15px.  So `bar-space + --ab-s3` — the slot
   mobile-boost.css §7 built for .wp-bottom, and the obvious thing to reuse
   now that §18 has hidden that bubble on phones — actually lands 3px INSIDE
   the bar.  (Same reason mobile-boost's own body.has-ab reservation is 7px
   short; that one is not this file's to fix.)
   --a11y-bar-gap therefore carries the 15px token deficit PLUS the visual
   gap, and it is a delta rather than a max(): if --ab-bar-h is ever corrected
   upward, the FAB simply gains clearance instead of losing it. */
@media (max-width:991.98px){
  :root{
    --a11y-edge:     var(--a11y-s4);
    --a11y-bar-gap:  28px;   /* 15px token deficit + 13px of real gap */
    --a11y-toggle-b: calc(var(--a11y-bar-space) + var(--a11y-bar-gap));
    --a11y-panel-b:  calc(var(--a11y-toggle-b) + 64px);
    /* header is sticky only under this breakpoint (mobile-boost §5) */
    --a11y-header-h: var(--ab-header-h,64px);
  }
}

/* Short landscape phones: let the panel own nearly the whole height and float
   over the sticky header — but it still may NOT cover nav#abBar (rule 5), so
   the corrected bar floor stays in the offset. mobile-boost drops --ab-bar-h
   to 52px here and tightens .ab-item to 44px, so the real box is ~63px and
   the deficit is ~11px; 20px covers it and gives back the vertical room a
   390px-tall screen needs. */
@media (max-width:991.98px) and (orientation:landscape) and (max-height:520px){
  :root{
    --a11y-bar-gap:  20px;
    --a11y-panel-b:  calc(var(--a11y-bar-space) + var(--a11y-bar-gap));
    --a11y-header-h: 0px;
  }
}


/* ==========================================================================
   §2  WIDGET SHELL + FLOATING TOGGLE
   .ab-a11y / .a11y and their children are new class names, so no
   `body:not(.admin)` prefix is needed here — nothing generic is touched.
   ========================================================================== */

.ab-a11y,
.ab-a11y *,
.a11y,
.a11y *{ box-sizing:border-box; }

/* Visible by default: an Israeli site must never lose its accessibility entry
   point because a class failed to land. Modern browsers with scripting
   disabled hide it (no dead button), and the blade partial ships its own
   `html:not(.ab-a11y-js) #abA11y{display:none}` belt for older engines. */
.ab-a11y,
.a11y{
  position:fixed;
  z-index:var(--a11y-z);
  inset-block-end:var(--a11y-toggle-b);
  inset-inline-start:calc(var(--a11y-edge) + var(--a11y-safe-i));
  display:block;
  font:500 14px/1.35 var(--a11y-font-readable);
  color:var(--a11y-ink);
  text-align:start;

  /* THE SAFE-AREA BRIDGE. env() is PHYSICAL; a logical inset resolves against
     the ELEMENT'S OWN direction. Both are pinned here, together, so they can
     never drift apart: direction rtl → inline-start is the physical RIGHT
     edge → consume safe-area-inset-RIGHT (which mobile-boost already exposes
     as --ab-safe-i). */
  direction:rtl;
  --a11y-safe-i:var(--ab-safe-i,env(safe-area-inset-right,0px));

  /* the widget opts itself out of §5 text scaling: fixed chrome stays fixed */
  --a11y-ts:1;
}
/* The ONE physical escape, and it flips BOTH halves at once. Keyed on the
   widget's own dir because that is what actually decides where inline-start
   is — an earlier draft keyed it on the document's [dir="ltr"] while pinning
   the widget to direction:rtl, which produced a widget on the physical RIGHT
   padded by the LEFT safe area. That is the trap; this is the fix. */
.ab-a11y[dir="ltr"],
.a11y[dir="ltr"]{
  direction:ltr;
  --a11y-safe-i:env(safe-area-inset-left,0px);
}

@media (scripting:none){ .ab-a11y,.a11y{ display:none; } }
/* any "JS is alive" flag re-asserts it: `ab-a11y-js` is what the blade
   bootstrap sets, `a11y-js` what ab-a11y.js sets, `ab-js` comes from the
   layout's inline head script. */
html:is(.ab-a11y-js,.a11y-js,.ab-js,.a11y-ready) :is(.ab-a11y,.a11y){ display:block; }

.ab-a11y-fab,
.a11y__toggle{
  position:relative;
  display:flex;
  align-items:center;
  justify-content:center;
  inline-size:52px;
  block-size:52px;
  min-inline-size:var(--a11y-tap);
  min-block-size:var(--a11y-tap);
  padding:0;
  margin:0;
  border:0;
  border-radius:var(--a11y-r-pill);
  background:var(--a11y-brand);
  color:#fff;
  cursor:pointer;
  -webkit-tap-highlight-color:transparent;
  box-shadow:var(--a11y-sh-brand);
  transition:background-color var(--a11y-d1) var(--a11y-ease),
             transform var(--a11y-d1) var(--a11y-ease),
             box-shadow var(--a11y-d2) var(--a11y-ease);
}
/* Size and pointer-events ONLY. Never `fill` — the markup ships stroke icons
   (`<svg fill="none" stroke="currentColor">` with a couple of sub-paths that
   opt back in via fill="currentColor"). A CSS `fill` on the <svg> beats that
   presentation attribute and every child inherits it, which turned the
   accessibility ring, the contrast disc, the invert square and the cursor
   arrow into solid red blobs. Colour reaches them through currentColor. */
.ab-a11y-fab svg,
.a11y__toggle svg{
  inline-size:26px;
  block-size:26px;
  pointer-events:none;
}
.ab-a11y-fab:hover,
.a11y__toggle:hover{ background:var(--a11y-brand-strong); }
.ab-a11y-fab:active,
.a11y__toggle:active{ background:var(--a11y-brand-press); transform:scale(.94); }
.ab-a11y-fab[aria-expanded="true"],
.a11y__toggle[aria-expanded="true"]{
  background:var(--a11y-brand-press);
  box-shadow:var(--a11y-sh-2);
}

/* a soft halo so the button survives a busy photo behind it */
.ab-a11y-fab::before,
.a11y__toggle::before{
  content:"";
  position:absolute;
  inset:-3px;
  border-radius:inherit;
  border:2px solid rgba(255,255,255,.92);
  pointer-events:none;
}


/* ==========================================================================
   §3  PANEL
   Positioned `fixed` in its own right (NOT absolute inside the root) so that
   §7's re-inversion filter can be applied to the toggle and the panel
   individually — a filter on a common ancestor would turn that ancestor into
   the containing block for its fixed descendants and drop the panel into the
   document flow.
   ========================================================================== */

.ab-a11y-panel,
.a11y__panel{
  position:fixed;
  z-index:var(--a11y-z);
  inset-block-end:var(--a11y-panel-b);
  inset-inline-start:calc(var(--a11y-edge) + var(--a11y-safe-i));
  inline-size:min(340px, calc(100vw - (var(--a11y-edge) * 2) - var(--a11y-safe-i)));
  max-block-size:calc(var(--a11y-vh) - var(--a11y-panel-b)
                      - var(--a11y-header-h) - var(--a11y-s3));
  overflow-y:auto;
  overscroll-behavior:contain;
  -webkit-overflow-scrolling:touch;
  padding:0 var(--a11y-s3) var(--a11y-s3);
  border:1px solid var(--a11y-line-2);
  border-radius:var(--a11y-r-card);
  background:var(--a11y-surface);
  box-shadow:var(--a11y-sh-2);
  animation:a11y-in var(--a11y-d2) var(--a11y-ease-out) both;
}
/* [hidden] must beat the display above — this is the whole no-JS story and
   half of the focus trap: a closed panel has no focusable content at all. */
.ab-a11y-panel[hidden],
.a11y__panel[hidden]{ display:none !important; }

@keyframes a11y-in{
  from{ opacity:0; transform:translateY(8px) scale(.985); }
  to  { opacity:1; transform:none; }
}

/* --- head ---------------------------------------------------------------- */
.ab-a11y-head,
.a11y__head{
  position:sticky;
  inset-block-start:0;
  z-index:1;
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:var(--a11y-s2);
  min-block-size:56px;
  margin-inline:calc(var(--a11y-s3) * -1);
  padding-inline:var(--a11y-s3);
  padding-block:var(--a11y-s2);
  background:var(--a11y-surface);
  border-block-end:1px solid var(--a11y-line);
}
.ab-a11y-title,
.a11y__title{
  margin:0;
  padding:0;                 /* style.css gives .h2 a 20px padding-bottom */
  font-size:18px;
  font-weight:800;
  line-height:1.2;
  color:var(--a11y-ink);
}
.ab-a11y-close,
.a11y__close{
  display:flex;
  align-items:center;
  justify-content:center;
  flex:none;
  inline-size:var(--a11y-tap);
  block-size:var(--a11y-tap);
  margin-inline-end:calc(var(--a11y-s1) * -1);
  padding:0;
  border:1px solid var(--a11y-line);
  border-radius:var(--a11y-r-pill);
  background:var(--a11y-surface-2);
  color:var(--a11y-ink);
  font-size:24px;
  line-height:1;
  cursor:pointer;
  transition:background-color var(--a11y-d1) var(--a11y-ease);
}
/* the markup puts an 18px stroke SVG in here, not a text "×" */
.ab-a11y-close svg,
.a11y__close svg{ inline-size:18px; block-size:18px; pointer-events:none; }
.ab-a11y-close:hover,
.a11y__close:hover{ background:var(--a11y-surface-3); }
.ab-a11y-close:active,
.a11y__close:active{ background:var(--a11y-line); }

/* --- option grid --------------------------------------------------------- */
.ab-a11y-grid,
.a11y__grid{
  display:grid;
  grid-template-columns:repeat(2,minmax(0,1fr));
  gap:var(--a11y-s2);
  margin-block-start:var(--a11y-s3);
}
.ab-a11y-opt,
.a11y__opt{
  position:relative;
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
  gap:var(--a11y-s1);
  min-block-size:82px;         /* comfortably over the 48px target floor */
  padding:var(--a11y-s2) var(--a11y-s1);
  border:1px solid var(--a11y-line-2);
  border-radius:var(--a11y-r-field);
  background:var(--a11y-surface-2);
  color:var(--a11y-ink);
  font-size:13px;
  font-weight:600;
  line-height:1.25;
  text-align:center;
  cursor:pointer;
  -webkit-tap-highlight-color:transparent;
  transition:background-color var(--a11y-d1) var(--a11y-ease),
             border-color var(--a11y-d1) var(--a11y-ease),
             transform var(--a11y-d1) var(--a11y-ease);
}
/* size only — see the note on .ab-a11y-fab svg above */
.ab-a11y-opt svg,
.a11y__opt svg{
  inline-size:22px;
  block-size:22px;
  flex:none;
  pointer-events:none;
}
.ab-a11y-txt,
.ab-a11y-opt span,
.a11y__opt span{
  display:block;
  inline-size:100%;
  overflow-wrap:anywhere;
}
.ab-a11y-opt:hover,
.a11y__opt:hover{ background:var(--a11y-surface-3); border-color:var(--a11y-line-2); }
.ab-a11y-opt:active,
.a11y__opt:active{ transform:scale(.97); }

/* ON state — driven purely by the ARIA attribute the JS maintains.
   text-up / text-down are STEPPERS: aria-pressed is meaningless on them and
   ab-a11y.js currently sets it anyway, which would light both of them up as
   "on" the moment the size leaves 0. They are excluded here and get a level
   badge instead, off data-a11y-level. */
.ab-a11y-opt[aria-pressed="true"]:not([data-a11y^="text-"]),
.a11y__opt[aria-pressed="true"]:not([data-a11y^="text-"]){
  background:var(--a11y-brand-tint);
  border-color:var(--a11y-brand);
  color:var(--a11y-brand-strong);
  box-shadow:inset 0 0 0 1px var(--a11y-brand);
}
.ab-a11y-opt[aria-pressed="true"]:not([data-a11y^="text-"])::after,
.a11y__opt[aria-pressed="true"]:not([data-a11y^="text-"])::after{
  content:"";
  position:absolute;
  inset-block-start:var(--a11y-s2);
  inset-inline-end:var(--a11y-s2);
  inline-size:8px;
  block-size:8px;
  border-radius:var(--a11y-r-pill);
  background:var(--a11y-brand);
}
/* stepper level badge — silent at level 0 */
.ab-a11y-opt[data-a11y^="text-"][data-a11y-level]:not([data-a11y-level="0"]),
.a11y__opt[data-a11y^="text-"][data-a11y-level]:not([data-a11y-level="0"]){
  border-color:var(--a11y-brand);
  color:var(--a11y-brand-strong);
}
.ab-a11y-opt[data-a11y^="text-"][data-a11y-level]:not([data-a11y-level="0"])::after,
.a11y__opt[data-a11y^="text-"][data-a11y-level]:not([data-a11y-level="0"])::after{
  content:attr(data-a11y-level);
  position:absolute;
  inset-block-start:var(--a11y-s1);
  inset-inline-end:var(--a11y-s1);
  min-inline-size:18px;
  block-size:18px;
  border-radius:var(--a11y-r-pill);
  background:var(--a11y-brand);
  color:#fff;
  font-size:11px;
  font-weight:700;
  line-height:18px;
}

/* --- foot: reset + statement --------------------------------------------- */
/* The shipped markup has NO foot wrapper: .a11y__reset and .a11y__stmt are
   direct children of the panel. So the top margin lives on the button, and
   the wrapper - if a future markup revision adds one - only takes it over. */
.ab-a11y-foot{ margin-block-start:var(--a11y-s3); }
.ab-a11y-foot > :is(.ab-a11y-reset,.a11y__reset){ margin-block-start:0; }

.ab-a11y-reset,
.a11y__reset{
  display:flex;                /* text-only today; survives an icon being added */
  margin-block-start:var(--a11y-s3);
  align-items:center;
  justify-content:center;
  gap:var(--a11y-s2);
  inline-size:100%;
  min-block-size:var(--a11y-tap);
  padding:var(--a11y-s3) var(--a11y-s4);
  border:1px solid var(--a11y-brand);
  border-radius:var(--a11y-r-field);
  background:var(--a11y-surface);
  color:var(--a11y-brand-strong);
  font-size:14px;
  font-weight:700;
  line-height:1.2;
  cursor:pointer;
  transition:background-color var(--a11y-d1) var(--a11y-ease),
             color var(--a11y-d1) var(--a11y-ease);
}
.ab-a11y-reset svg,
.a11y__reset svg,
.ab-a11y-stmt svg,
.a11y__stmt svg{ inline-size:16px; block-size:16px; flex:none; pointer-events:none; }
.ab-a11y-reset:hover,
.a11y__reset:hover{ background:var(--a11y-brand); color:#fff; }
.ab-a11y-reset:active,
.a11y__reset:active{ background:var(--a11y-brand-press); color:#fff; }

.ab-a11y-stmt,
.a11y__stmt{
  display:flex;
  align-items:center;
  justify-content:center;
  gap:var(--a11y-s2);
  min-block-size:var(--a11y-tap);
  margin-block-start:var(--a11y-s2);
  padding:var(--a11y-s2);
  border-radius:var(--a11y-r-field);
  color:var(--a11y-ink-muted);
  font-size:13px;
  font-weight:600;
  text-align:center;
  text-decoration:underline;
  text-underline-offset:3px;
}
.ab-a11y-stmt:hover,
.a11y__stmt:hover{ color:var(--a11y-brand-strong); }


/* ==========================================================================
   §4  FOCUS — REAL :focus-visible RINGS
   style.css:31 kills outlines globally (`a,a:active,a:focus,a:hover{outline:none}`).
   Keyboard users currently get nothing. This repairs it site-wide (not just
   inside the widget), which is the single highest-value a11y fix on the site.

   ADMIN GUARD. This is the one site-wide block with no html.*a11y-* class to
   hang on, and `body:not(.admin)` alone is worthless because admin layouts
   render a BARE <body>. `body.has-ab` is hardcoded on the front layout's
   <body>, needs no JS, and appears on neither admin-app nor login_index —
   so it is the admin guard. The second branch is a backup for a front page
   that somehow lost has-ab; those html classes are only ever set by code
   that already bails on /admin/.

   Specificity (0,4,1) / (0,4,2) beats style.css's a:focus (0,1,1) without
   !important, so any deliberate later override still wins.
   ========================================================================== */

body.has-ab:not(.admin) :is(a,button,input,select,textarea,summary,[tabindex],[role="button"]):focus-visible,
html:is(.a11y-js,.ab-a11y-js) body:not(.admin) :is(a,button,input,select,textarea,summary,[tabindex],[role="button"]):focus-visible{
  outline:3px solid var(--a11y-brand-strong);
  outline-offset:2px;
}
/* NOTE 1: deliberately no `position:relative` on the focused element — it
   would re-parent absolutely positioned children (the .car-box ribbon, for
   one) the moment the card takes focus. outline paints outside the box anyway.
   NOTE 2: deliberately no `border-radius` either. An earlier draft set
   border-radius:4px here, which snapped every pill (.theme-btn, the chip
   rail, the FABs) to a 4px box for as long as it held focus. Modern engines
   already follow the element's own radius when painting an outline. */

/* The widget's own rings. These MUST out-specify the site-wide rule above —
   the FAB is a <button> inside body.has-ab, so it matches it at (0,4,1), and
   a brand-red ring on the brand-red FAB is invisible. Leading with the id
   makes these (1,2,0) / (1,3,0), so the ink ring + white core wins. */
:is(#a11y,#abA11y,.ab-a11y,.a11y) :is(.ab-a11y-fab,.a11y__toggle):focus-visible{
  outline:3px solid var(--a11y-ink);
  outline-offset:3px;
  box-shadow:0 0 0 3px #fff, var(--a11y-sh-brand);
}
:is(#a11y,#abA11y,.ab-a11y,.a11y) :is(.ab-a11y-close,.ab-a11y-opt,.ab-a11y-reset,.ab-a11y-stmt,
  .a11y__close,.a11y__opt,.a11y__reset,.a11y__stmt):focus-visible{
  outline:3px solid var(--a11y-brand-strong);
  outline-offset:2px;
}
/* mouse users keep a clean look; :focus alone must not paint a ring */
:is(.ab-a11y,.a11y) :is(button,a):focus:not(:focus-visible){ outline:none; }


/* ==========================================================================
   §5  EFFECT — TEXT SIZE

   Two levers, one multiplier:
     (a) root font scaling — html{font-size:N%} — scales every rem/em value
         (Bootstrap type, bare h1–h6, .slick arrows at 2.5em, …);
     (b) --a11y-ts re-declares the theme's hard PX type at the same ratio,
         because style.css sizes almost everything in px and (a) alone would
         not move it.

   The guard is html[class*="a11y-t"]. That is on purpose: it matches
   a11y-t1…t3 (set by ab-a11y.js) AND ab-a11y-t1…t4 / ab-a11y-tm1…tm2 (set by
   the blade's pre-paint bootstrap) in one short selector, at the same (0,1,0)
   specificity a single class would carry, and it survives a new step being
   added on either side. It cannot false-positive on any other class this
   project puts on <html> (ab-a11y-js, a11y-js, ab-js, a11y-contrast,
   a11y-invert, a11y-links, a11y-readable, a11y-nomotion, a11y-bigcursor —
   none contain "a11y-t"), and if one ever did, --a11y-ts stays 1 and every
   calc() below resolves to the theme's own px value.

   Why this does not break the fixed chrome:
     • --ab-bar-h (62px), --ab-header-h (64px), --ab-safe-b and the bar's own
       label sizes are PX tokens — a root font-size change cannot touch them,
       so #abBar keeps its exact height and the sticky header keeps its offset.
     • #abBar / .main-header / the widget additionally reset --a11y-ts to 1,
       so none of the calc() rules below can leak into them either.
     • media queries in the theme are px-based, so no breakpoint shifts.
   ========================================================================== */

html:is(.a11y-t1,.ab-a11y-t1){ font-size:112%; --a11y-ts:1.12; }
html:is(.a11y-t2,.ab-a11y-t2){ font-size:125%; --a11y-ts:1.25; }
html:is(.a11y-t3,.ab-a11y-t3){ font-size:140%; --a11y-ts:1.40; }
html.ab-a11y-t4{ font-size:155%; --a11y-ts:1.55; }
/* the blade bootstrap also restores negative steps, so the "הקטנת טקסט"
   button has somewhere to go below baseline */
html.ab-a11y-tm1{ font-size:92%; --a11y-ts:.92; }
html.ab-a11y-tm2{ font-size:85%; --a11y-ts:.85; }

/* keep the fixed chrome literal: no calc() rule below can reach into it */
html[class*="a11y-t"] body:not(.admin) :is(#abBar,.ab-bar,.main-header,#abA11y,.ab-a11y,.a11y){
  --a11y-ts:1;
}
html[class*="a11y-t"] body:not(.admin) :is(#abBar,.ab-bar,.main-header){
  font-size:16px;   /* px anchor so nothing em-based inside them drifts */
}

/* mobile-boost's fluid heading tokens, rescaled at the source */
html[class*="a11y-t"]{
  --ab-fs-hero: calc(clamp(28px,8vw,60px)  * var(--a11y-ts));
  --ab-fs-h2:   calc(clamp(22px,5.6vw,45px) * var(--a11y-ts));
  --ab-fs-h3:   calc(clamp(18px,4.6vw,28px) * var(--a11y-ts));
  --ab-fs-card: calc(clamp(15px,4.2vw,20px) * var(--a11y-ts));
  --ab-fs-spec: calc(13px * var(--a11y-ts));
}

/* the theme's hard px type, restated at scale (values taken from style.css) */
html[class*="a11y-t"] body:not(.admin) p{ font-size:calc(16px * var(--a11y-ts)); }
html[class*="a11y-t"] body:not(.admin) :is(.h1,.h2,.h3,.h4,.h5,.h6){ font-size:calc(25px * var(--a11y-ts)); }
html[class*="a11y-t"] body:not(.admin) :is(.form-control,input,select,textarea){
  font-size:calc(16px * var(--a11y-ts));   /* stays ≥16px → no iOS focus zoom */
}
html[class*="a11y-t"] body:not(.admin) :is(.theme-btn,.theme-btn2){ font-size:calc(16px * var(--a11y-ts)); }
html[class*="a11y-t"] body:not(.admin) .car-content h3{ font-size:calc(20px * var(--a11y-ts)); }
html[class*="a11y-t"] body:not(.admin) .car-price{ font-size:calc(18px * var(--a11y-ts)); }
html[class*="a11y-t"] body:not(.admin) :is(.car-key-content span,.car-key-content .car-key){ font-size:calc(15px * var(--a11y-ts)); }
html[class*="a11y-t"] body:not(.admin) .sub-title{ font-size:calc(28px * var(--a11y-ts)); }
html[class*="a11y-t"] body:not(.admin) .find-car-title{ font-size:calc(25px * var(--a11y-ts)); }
html[class*="a11y-t"] body:not(.admin) .site-title-tagline{ font-size:calc(17px * var(--a11y-ts)); }
html[class*="a11y-t"] body:not(.admin) .brand-item h3{ font-size:calc(18px * var(--a11y-ts)); }
html[class*="a11y-t"] body:not(.admin) .contact-info h2{ font-size:calc(20px * var(--a11y-ts)); }
html[class*="a11y-t"] body:not(.admin) .contact-info p{ font-size:calc(16px * var(--a11y-ts)); }
html[class*="a11y-t"] body:not(.admin) .footer-list li a{ font-size:calc(16px * var(--a11y-ts)); }
html[class*="a11y-t"] body:not(.admin) .copyright .copyright-text{ font-size:calc(14px * var(--a11y-ts)); }
html[class*="a11y-t"] body:not(.admin) .error{ font-size:calc(14px * var(--a11y-ts)); }
html[class*="a11y-t"] body:not(.admin) :is(.term-condition p,.term-condition span,.term-condition ul li,.term-condition ol li){
  font-size:calc(14px * var(--a11y-ts));
}
/* bigger type needs more room to breathe, and must not clip in fixed boxes */
html[class*="a11y-t"] body:not(.admin) :is(p,li,td,dd,.car-content,.car-detail-widget){
  line-height:1.65;
}
html:is(.a11y-t2,.a11y-t3,.ab-a11y-t2,.ab-a11y-t3,.ab-a11y-t4) body:not(.admin) :is(.theme-btn,.theme-btn2,.car-content h3,.car-price){
  block-size:auto;
  white-space:normal;
  overflow-wrap:anywhere;
}


/* ==========================================================================
   §6  EFFECT — high contrast   (dark ground, light text, brand preserved)
   Structural elements are repainted; <img>/<video> are deliberately left
   alone so the stock photography still reads.
   ========================================================================== */

html:is(.a11y-contrast,.ab-a11y-contrast) body:not(.admin),
html:is(.a11y-contrast,.ab-a11y-contrast) body:not(.admin) :is(header,footer,nav,main,section,article,aside,
  div,span,p,ul,ol,li,dl,dt,dd,table,thead,tbody,tr,td,th,form,fieldset,legend,label,
  figure,figcaption,blockquote,h1,h2,h3,h4,h5,h6,summary,details,input,select,textarea,button){
  background-color:#000 !important;
  background-image:none !important;
  color:#fff !important;
  border-color:#fff !important;
  text-shadow:none !important;
  box-shadow:none !important;
}
html:is(.a11y-contrast,.ab-a11y-contrast) body:not(.admin) :is(input,select,textarea){
  border:1px solid #fff !important;
}
html:is(.a11y-contrast,.ab-a11y-contrast) body:not(.admin) ::placeholder{ color:#d6d6d6 !important; opacity:1; }

/* links: the classic high-contrast yellow / violet pair */
html:is(.a11y-contrast,.ab-a11y-contrast) body:not(.admin) a{
  color:#ffe600 !important;
  text-decoration:underline !important;
}
html:is(.a11y-contrast,.ab-a11y-contrast) body:not(.admin) a:visited{ color:#d9b3ff !important; }
html:is(.a11y-contrast,.ab-a11y-contrast) body:not(.admin) a:hover{ color:#fff !important; }

/* brand stays brand — filled actions keep the red with a white keyline */
html:is(.a11y-contrast,.ab-a11y-contrast) body:not(.admin) :is(.theme-btn,.theme-btn2,button[type="submit"],
  input[type="submit"],#abCall){
  background-color:var(--a11y-brand) !important;
  color:#fff !important;
  border:2px solid #fff !important;
}
/* brand as TEXT on black needs the lifted tint to clear 7:1 */
html:is(.a11y-contrast,.ab-a11y-contrast) body:not(.admin) :is(.car-price,.car-single-price){
  color:#ff8a9c !important;
}
html:is(.a11y-contrast,.ab-a11y-contrast) body:not(.admin) :is(hr,.car-box,.car-detail-widget,.form-control){
  border-color:#fff !important;
}
/* media keeps its own colours, with a keyline so it does not bleed into black */
html:is(.a11y-contrast,.ab-a11y-contrast) body:not(.admin) :is(img,video,iframe){
  background:#000 !important;
  outline:1px solid rgba(255,255,255,.35);
}

/* The widget owns its own contrast palette. The sweep above matches the
   widget's inner div/span/h2/button/a, so we take it all back with ID
   specificity (1,1,1) and then re-paint each surface — every rule below
   outranks the (0,2,3) sweep. */
html:is(.a11y-contrast,.ab-a11y-contrast) :is(#a11y,#abA11y,.ab-a11y,.a11y) *{
  background-color:transparent !important;
  background-image:none !important;
  color:#fff !important;
  border-color:#fff !important;
  text-decoration-color:currentColor !important;
}
html:is(.a11y-contrast,.ab-a11y-contrast) :is(#a11y,#abA11y,.ab-a11y,.a11y) :is(.ab-a11y-panel,.ab-a11y-head,.a11y__panel,.a11y__head){
  background-color:#000 !important;
  border-color:#fff !important;
}
html:is(.a11y-contrast,.ab-a11y-contrast) :is(#a11y,#abA11y,.ab-a11y,.a11y) :is(.ab-a11y-opt,.ab-a11y-close,.ab-a11y-reset,.a11y__opt,.a11y__close,.a11y__reset){
  background-color:#0d0d0d !important;
  border-color:#fff !important;
}
html:is(.a11y-contrast,.ab-a11y-contrast) :is(#a11y,#abA11y,.ab-a11y,.a11y) :is(.ab-a11y-opt,.a11y__opt)[aria-pressed="true"]:not([data-a11y^="text-"]){
  background-color:var(--a11y-brand) !important;
  color:#fff !important;
  box-shadow:inset 0 0 0 2px #fff !important;
}
html:is(.a11y-contrast,.ab-a11y-contrast) :is(#a11y,#abA11y,.ab-a11y,.a11y) :is(.ab-a11y-opt,.a11y__opt)::after{
  background-color:#fff !important;
  color:#000 !important;
}
html:is(.a11y-contrast,.ab-a11y-contrast) :is(#a11y,#abA11y,.ab-a11y,.a11y) :is(.ab-a11y-fab,.a11y__toggle){
  background-color:var(--a11y-brand) !important;
  color:#fff !important;
}
html:is(.a11y-contrast,.ab-a11y-contrast) :is(#a11y,#abA11y,.ab-a11y,.a11y) :is(.ab-a11y-stmt,.a11y__stmt){ color:#ffe600 !important; }


/* ==========================================================================
   §7  EFFECT — colour inversion

   IMPLEMENTATION NOTE (this is the important one):
   the obvious `html{filter:invert(1)}` makes <html> the containing block for
   every position:fixed descendant — nav#abBar, the sticky header and this
   very panel would all drop out of the viewport. So the primary path paints a
   full-viewport, pointer-events:none, fixed pseudo-element and inverts what is
   BEHIND it with backdrop-filter. Zero layout impact, nothing is reparented.
   Photos/video/iframes are pre-inverted with their own filter so the backdrop
   pass returns them to normal, and the widget itself is pre-inverted the same
   way (on the toggle / the panel individually, never on a shared ancestor,
   for the containing-block reason above).
   ========================================================================== */

html:is(.a11y-invert,.ab-a11y-invert)::after{
  content:"";
  position:fixed;
  inset:0;
  z-index:2147483000;
  pointer-events:none;
  -webkit-backdrop-filter:invert(1) hue-rotate(180deg);
  backdrop-filter:invert(1) hue-rotate(180deg);
}
/* LEAF media only. Never a wrapper such as .car-img / <picture>: a filter on
   the wrapper AND on the <img> inside it composes to no-op, and the photo
   would come out of the backdrop pass inverted. Known limitation: hero
   artwork painted as a CSS background-image inverts with the rest of the UI. */
html:is(.a11y-invert,.ab-a11y-invert) body:not(.admin) :is(img,video,iframe,canvas,svg image){
  -webkit-filter:invert(1) hue-rotate(180deg);
  filter:invert(1) hue-rotate(180deg);
}
html:is(.a11y-invert,.ab-a11y-invert) :is(#a11y,#abA11y,.ab-a11y,.a11y) :is(.ab-a11y-fab,.ab-a11y-panel,.a11y__toggle,.a11y__panel){
  -webkit-filter:invert(1) hue-rotate(180deg);
  filter:invert(1) hue-rotate(180deg);
}

/* Fallback for engines without backdrop-filter. Documented trade-off: while
   inverted, fixed elements are laid out against <html>, so #abBar and the
   panel scroll with the page. Acceptable degradation on <3% of traffic and
   strictly better than no invert at all. */
@supports not ((backdrop-filter:invert(1)) or (-webkit-backdrop-filter:invert(1))){
  html:is(.a11y-invert,.ab-a11y-invert){
    background:#fff;
    -webkit-filter:invert(1) hue-rotate(180deg);
    filter:invert(1) hue-rotate(180deg);
  }
  html:is(.a11y-invert,.ab-a11y-invert)::after{ content:none; }
}


/* ==========================================================================
   §8  EFFECT — links unmistakable
   ========================================================================== */

html:is(.a11y-links,.ab-a11y-links) body:not(.admin) a{
  text-decoration:underline !important;
  text-decoration-thickness:2px;
  text-underline-offset:.18em;
  outline:1px dashed currentColor;
  outline-offset:2px;
}
html:is(.a11y-links,.ab-a11y-links) body:not(.admin) a:hover,
html:is(.a11y-links,.ab-a11y-links) body:not(.admin) a:focus-visible{
  outline-style:solid;
  background-color:var(--a11y-brand-tint);
}
/* Icon-only chrome is not confusable with body copy — leave it clean so the
   62px action bar does not gain a second visual layer.
   :not(:focus-visible) is load-bearing: this rule needs !important to beat
   the un-suffixed rule above, and without the guard that !important also
   erased §4's keyboard focus ring (which carries no !important) from every
   link in #abBar for as long as "highlight links" was on. */
html:is(.a11y-links,.ab-a11y-links) body:not(.admin) :is(#abBar a,.ab-bar a,.wp-bottom,.wp-bottom a,
  .navbar-brand):not(:focus-visible){
  outline:0 !important;
  text-decoration:none !important;
}
html:is(.a11y-links,.ab-a11y-links) :is(#a11y,#abA11y,.ab-a11y,.a11y) :is(.ab-a11y-fab,.a11y__toggle):not(:focus-visible){
  outline:0 !important;
  text-decoration:none !important;
}
html:is(.a11y-links,.ab-a11y-links) :is(#a11y,#abA11y,.ab-a11y,.a11y) :is(.ab-a11y-stmt,.a11y__stmt){ outline:1px dashed currentColor; }


/* ==========================================================================
   §9  EFFECT — readable font
   font-family is set ONCE on <body> and inherited. Deliberately NOT sprayed
   over span/i: Font Awesome 6.3 declares the family directly on the icon
   element (.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font
   Awesome 6 Free"} and .fa-brands,.fab{font-family:"Font Awesome 6 Brands"}),
   and a direct declaration always beats inheritance — even inheritance of an
   !important value. So no restore rule is needed here, and an earlier draft's
   blanket `font-family:"Font Awesome 6 Free",…!important` on the icon classes
   was pure damage: it demoted .fab/.fa-brands off the Brands face and left
   brand glyphs to per-codepoint font fallback.
   letter-spacing / word-spacing DO inherit, so those still have to be undone
   on the icons and on the fixed-width chrome.
   Spacing follows WCAG 2.1 SC 1.4.12 (line-height ≥1.5, letter ≥0.12em,
   word ≥0.16em, paragraph gap ≥2em).
   ========================================================================== */

html:is(.a11y-readable,.ab-a11y-readable) body:not(.admin){
  font-family:var(--a11y-font-readable) !important;
  letter-spacing:.12em;
  word-spacing:.16em;
  line-height:1.8;
}
/* form controls do not inherit font by default — but never grab an element
   that is itself an icon */
html:is(.a11y-readable,.ab-a11y-readable) body:not(.admin) :is(input,select,textarea,button,.form-control):not(.fa):not([class*="fa-"]){
  font-family:inherit !important;
}
/* line-height inherits, but any theme rule that sets it ON the element wins
   over inheritance — so 1.4.12's 1.5 floor has to be restated element-level
   or it silently does not apply. */
html:is(.a11y-readable,.ab-a11y-readable) body:not(.admin) :is(p,li,td,th,dd,dt,blockquote,figcaption,label,.car-content,.car-detail-widget){
  line-height:1.8;
}
html:is(.a11y-readable,.ab-a11y-readable) body:not(.admin) p{ margin-block-end:2em; }
html:is(.a11y-readable,.ab-a11y-readable) body:not(.admin) :is(h1,h2,h3,h4,h5,h6,.sub-title,.site-title,
  .car-detail-title,.breadcrumb-title){
  line-height:1.4;
  letter-spacing:.06em;
}
/* fixed-width chrome and icon fonts keep their metrics. .svg-inline--fa is
   included because js.blade.php also loads Font Awesome's SVG-with-JS build,
   which rewrites <i class="fas …"> into <svg class="svg-inline--fa …">. */
html:is(.a11y-readable,.ab-a11y-readable) body:not(.admin) :is(#abBar,.ab-bar,#abBar *,.ab-bar *,
  #abA11y,#abA11y *,.ab-a11y,.ab-a11y *,.a11y,.a11y *,
  .fa,.fas,.far,.fab,.fa-solid,.fa-regular,.fa-brands,.fa-classic,.svg-inline--fa,
  [class*=" fa-"],[class^="fa-"]){
  letter-spacing:normal;
  word-spacing:normal;
}


/* ==========================================================================
   §10  EFFECT — stop animations
   1ms rather than 0s on purpose: transitionend/animationend still fire, so
   owl-carousel and any reveal logic that waits on those events do not hang.
   ========================================================================== */

html:is(.a11y-nomotion,.ab-a11y-nomotion){ scroll-behavior:auto !important; }
html:is(.a11y-nomotion,.ab-a11y-nomotion) body:not(.admin) *,
html:is(.a11y-nomotion,.ab-a11y-nomotion) body:not(.admin) *::before,
html:is(.a11y-nomotion,.ab-a11y-nomotion) body:not(.admin) *::after{
  animation-duration:1ms !important;
  animation-delay:0s !important;
  animation-iteration-count:1 !important;
  transition-duration:1ms !important;
  transition-delay:0s !important;
  scroll-behavior:auto !important;
}
/* mobile-boost's scroll reveals must land in their final state, not stay at
   opacity:0 if the observer never fires */
html:is(.a11y-nomotion,.ab-a11y-nomotion) body:not(.admin) .reveal{
  opacity:1 !important;
  transform:none !important;
}
/* carousels: freeze the easing, but never zero the stage transform — that is
   what positions the current slide. Stopping autoplay is the JS's job. */
html:is(.a11y-nomotion,.ab-a11y-nomotion) body:not(.admin) :is(.owl-stage,.slick-track){
  transition-duration:1ms !important;
}
html:is(.a11y-nomotion,.ab-a11y-nomotion) body:not(.admin) :is(.page-loader,.owl-dots .owl-dot){
  animation:none !important;
}


/* ==========================================================================
   §11  EFFECT — big cursor
   48px inline-SVG data-URIs (no extra request). Black body + white keyline so
   the pointer survives both light cards and dark hero photos. The brand-red
   variant marks anything clickable, which doubles as an affordance cue.
   Note: some Windows/Firefox builds cap custom cursors at 32px and will fall
   back to the keyword after the comma — the feature degrades, never breaks.
   ========================================================================== */

html:is(.a11y-bigcursor,.ab-a11y-bigcursor),
html:is(.a11y-bigcursor,.ab-a11y-bigcursor) body:not(.admin),
html:is(.a11y-bigcursor,.ab-a11y-bigcursor) body:not(.admin) *{
  cursor:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 48 48'%3E%3Cpath d='M2,2L2,34L10.5,26.5L15.5,38.5L21.5,36L16.5,24.5L28,24.5Z' fill='%23000000' stroke='%23ffffff' stroke-width='3' stroke-linejoin='round'/%3E%3C/svg%3E") 2 2, auto !important;
}
html:is(.a11y-bigcursor,.ab-a11y-bigcursor) body:not(.admin) :is(a,button,summary,label,select,[role="button"],
  [onclick],.theme-btn,.theme-btn2,.car-box,
  .ab-a11y-opt,.ab-a11y-fab,.ab-a11y-close,.ab-a11y-reset,
  .a11y__opt,.a11y__toggle,.a11y__close,.a11y__reset){
  cursor:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 48 48'%3E%3Cpath d='M2,2L2,34L10.5,26.5L15.5,38.5L21.5,36L16.5,24.5L28,24.5Z' fill='%23dc344c' stroke='%23ffffff' stroke-width='3' stroke-linejoin='round'/%3E%3C/svg%3E") 2 2, pointer !important;
}
html:is(.a11y-bigcursor,.ab-a11y-bigcursor) body:not(.admin) :is(textarea,input:not([type="checkbox"]):not([type="radio"]):not([type="submit"]):not([type="button"])){
  cursor:text !important;
}


/* ==========================================================================
   §12  REDUCED MOTION
   ========================================================================== */

@media (prefers-reduced-motion:reduce){
  .ab-a11y-panel,
  .a11y__panel{ animation:none; }
  .ab-a11y-fab, .ab-a11y-close, .ab-a11y-opt, .ab-a11y-reset,
  .a11y__toggle, .a11y__close, .a11y__opt, .a11y__reset{ transition:none; }
  .ab-a11y-fab:active, .ab-a11y-opt:active,
  .a11y__toggle:active, .a11y__opt:active{ transform:none; }
}


/* ==========================================================================
   §13  PRINT + FORCED COLORS
   ========================================================================== */

@media print{
  .ab-a11y,
  .a11y{ display:none !important; }
  html:is(.a11y-invert,.ab-a11y-invert)::after{ content:none !important; }
  html:is(.a11y-invert,.ab-a11y-invert) body:not(.admin) :is(img,video,iframe,picture,canvas,svg image,.car-img){
    filter:none !important;
  }
  html:is(.a11y-invert,.ab-a11y-invert){ filter:none !important; }
  html:is(.a11y-contrast,.ab-a11y-contrast) body:not(.admin),
  html:is(.a11y-contrast,.ab-a11y-contrast) body:not(.admin) *{
    background:#fff !important;
    color:#000 !important;
  }
  html:is(.a11y-bigcursor,.ab-a11y-bigcursor) body:not(.admin) *{ cursor:auto !important; }
}

/* Windows High Contrast / forced-colors: hand the colours back to the OS */
@media (forced-colors:active){
  .ab-a11y-fab, .ab-a11y-panel, .ab-a11y-opt, .ab-a11y-reset, .ab-a11y-close,
  .a11y__toggle, .a11y__panel, .a11y__opt, .a11y__reset, .a11y__close{
    border:1px solid ButtonBorder;
    background:ButtonFace;
    color:ButtonText;
    box-shadow:none;
    forced-color-adjust:none;
  }
  .ab-a11y-fab,
  .a11y__toggle{ background:Highlight; color:HighlightText; }
  .ab-a11y-opt[aria-pressed="true"]:not([data-a11y^="text-"]),
  .a11y__opt[aria-pressed="true"]:not([data-a11y^="text-"]){ background:Highlight; color:HighlightText; }
  .ab-a11y-fab::before,
  .a11y__toggle::before{ display:none; }
  /* the invert/contrast effects would fight the OS — stand down */
  html:is(.a11y-invert,.ab-a11y-invert)::after{ content:none; }
}


/* ==========================================================================
   §14  ADMIN GUARD + LEGACY SWEEP
   ========================================================================== */

/* The blade only prints the widget in the front layout, but if it ever leaks
   into a layout that DOES carry .admin, kill it here. (The JS must still bail
   on a /admin/ path — admin renders a BARE <body>, so this class check alone
   can never be the guard.) */
body.admin :is(.ab-a11y,.a11y){ display:none !important; }

/* Cut-over sweep: if a cached page or a stale service worker still injects the
   negishim markup after the <script> is removed, keep it off the screen so we
   never ship two accessibility buttons. Same admin gating as §4 — and the
   selectors are the exact ids/classes mobile-boost.css §7 already had to
   wrestle with, not an `[id*="accessibility_"]` wildcard that could match
   something legitimate. */
body.has-ab:not(.admin) :is(#accessibility_container,.btn_accessibility,
  .btn_accessibility_action,.accessibility_component),
html:is(.a11y-js,.ab-a11y-js) body:not(.admin) :is(#accessibility_container,.btn_accessibility,
  .btn_accessibility_action,.accessibility_component){
  display:none !important;
}
