/* ==========================================================
   OLB BEHAVIOR CSS v1.0.1 — Onlinebutikken.com · Phase 1
   Repair RC1 · B-02. Genereret direkte fra
   OLB_COMPONENT_BEHAVIOR_MASTER_v1.0.1.md (§1, §9, §12, §16, §22).

   Ejer KUN behavior-relateret visuel governance:
     1. motion-tokens (§12)
     2. reduced motion (§12) — spinneren er den ene undtagelse
     3. busy-reveal: spinner først efter 300 ms (§9)
     4. .olb-live visuelt skjult (§16)

   Ejer IKKE: fokus (Farve), hover-farver, selected-geometri,
   loading-geometri (Buttons/Forms), breakpoints, farver, radius.

   §22 nævner også retry, disclosure og empty. Masteren kræver ingen
   visuel regel for dem: disclosure = ingen højdeanimation (§13, opfyldt
   ved fravær af transition), empty = tekst + højst én handling (§15,
   markup), retry = struktur (§11). Derfor ingen CSS for dem.

   Load-order: efter Hero, før OLB_BEHAVIOR_v1.0.1.js.
   ========================================================== */

/* 1. Motion-tokens — Behavior §12. Kun disse to varigheder findes. */
:root {
  --olb-motion-base: 150ms;   /* enhver tilstandsovergang: farve, kant, skygge */
  --olb-motion-slow: 200ms;   /* ud-foldning, panel, drawer, overlay */
}

/* 2. Reduced motion — Behavior §12: "Reduced motion nulstiller begge til 0 ms
      … en låst knap er også nulstillet". !important er masterens eksplicitte
      valg, fordi låste komponenter kan erklære literal-varigheder.
      Undtagelser:
      – spinneren (animation, ikke transition) røres ikke her; Buttons og
        Forms sænker den selv til 2,4 s (§12: "den stopper ikke").
      – autofill-workarounden (Forms §2: background-color 6 000 000 s) er et
        browser-workaround, ikke bevægelse (§12, "Én implementationsdetalje"),
        og undtages via :is(), som er forgiving over for ukendte pseudo-klasser. */
@media (prefers-reduced-motion: reduce) {
  :root {
    --olb-motion-base: 0ms;
    --olb-motion-slow: 0ms;
  }

  *:not(:is(:-webkit-autofill, :autofill)),
  *::before,
  *::after {
    transition-duration: 0.01ms !important;
    transition-delay: 0s !important;
  }
}

/* 3. Busy-reveal — Behavior §9: "Ingen spinner under 300 ms."
      To interne lag, ingen ny public hook:
      – guard-state: aria-busy="true" sættes STRAKS af OLB.run() (og af
        integrationen). Den blokerer dobbeltaktivering fra første tick og er
        semantisk korrekt: elementet ER optaget.
      – visuel state: labelen holdes synlig og spinneren usynlig de første
        300 ms via en animation, der kun overskriver opacity. Afsluttes kaldet
        før 300 ms, ser kunden aldrig spinneren.
      Geometrien er uændret i begge lag (opacity only). */
@keyframes olb-busy-hold-visible { from, to { opacity: 1; } }
@keyframes olb-busy-hold-hidden  { from, to { opacity: 0; } }

.olb-button[aria-busy="true"] .olb-button__label,
.olb-button[aria-busy="true"] .olb-button__icon {
  animation: olb-busy-hold-visible 300ms step-end;
}

.olb-button[aria-busy="true"] .olb-button__spinner {
  animation-name: olb-button-spin, olb-busy-hold-hidden;
  animation-duration: .8s, 300ms;
  animation-timing-function: linear, step-end;
  animation-iteration-count: infinite, 1;
}

@media (prefers-reduced-motion: reduce) {
  .olb-button[aria-busy="true"] .olb-button__spinner {
    animation-duration: 2.4s, 300ms;   /* Buttons' 2,4 s bevares; reveal-forsinkelsen er ikke bevægelse */
  }
}

/* 4. Live-region — Behavior §16. Skal være i DOM'en og læses af skærmlæser,
      men må ikke ses, ikke tage plads og ikke bruge display:none/visibility:hidden. */
.olb-live {
  position: absolute !important;
  inline-size: 1px !important;
  block-size: 1px !important;
  margin: -1px !important;
  padding: 0 !important;
  border: 0 !important;
  overflow: hidden !important;
  clip: rect(0 0 0 0) !important;
  clip-path: inset(50%) !important;
  white-space: nowrap !important;
}
