@charset "UTF-8";
/* =====================================================================
   MCO Boutique — one stylesheet, no build step.
   Order: tokens → fonts → reset → primitives → storefront → admin → print

   RTL is handled entirely with CSS logical properties (margin-inline,
   padding-inline-start, inset-inline-start, text-align:start). There is no
   second stylesheet and no [dir="rtl"] override block: setting dir="rtl" on
   <html> flips the whole layout. Any new rule must use logical properties
   for the same reason.
   ===================================================================== */

/* ---------- tokens --------------------------------------------------
   The site ships BOTH themes. Dark is the default and is Change Order 1
   §1's palette unchanged; light is a second set of the same token names.

   How a theme is chosen, in order:
     1. `data-theme="light"|"dark"` on <html>, written by hydrate() from
        the `mco_theme` cookie — so the correct theme is in the very first
        byte of HTML and there is never a flash of the wrong one. The CSP
        is script-src 'self' with no nonces (security.php explains why),
        so the usual inline "set the theme before paint" script is not
        available to us; the cookie placeholder does the same job without
        one, and works with JavaScript switched off.
     2. No attribute -> prefers-color-scheme, i.e. the operating system.
   The toggle in the header writes the cookie and flips the attribute at
   the same time, so switching is instant and survives the next request.

   TWO THINGS TO KNOW BEFORE EDITING:

   a. The light block below is written TWICE — once under
      prefers-color-scheme: light for visitors who have expressed no
      choice, once under [data-theme="light"] for visitors who have.
      A media query cannot be OR-ed with an attribute selector, so the
      duplication is unavoidable. **Keep the two lists identical.**

   b. --band (header, footer, USP strip, admin top bar) stays DARK in
      both themes, and --on-band therefore stays light in both. It is the
      club's brand strip, not page furniture, and holding it still keeps
      every rgba(255,255,255,…) hover and hairline that sits on it correct
      in both themes. If the client wants a light header, that is the one
      token to change — and then those rules need revisiting.

   CO1 §1 split two token roles apart rather than renaming in place,
   because the change order describes a dark site while the build it
   modified was a light one:

     --ink / --paper   the page ground
     --text            what --ink used to mean where it meant "text"
     --band            what --ink used to mean where it meant "the dark
                       strip behind the header, footer and USP row"
     --on-band         text on that strip
     --on-gold         text on a gold chip, which must stay dark

   That split is what made a second theme cheap: only the ground, the
   text and the hairlines move between themes. Recorded in README.md.
   ------------------------------------------------------------------- */
:root {
  /* --- theme-independent ------------------------------------------- */

  /* brand — CO1 §1 */
  --gold-1: #C9A24B;
  --on-gold: #231C18;          /* text on a gold chip: dark in both themes */

  /* The brand strip. Dark in both themes — see (b) above. */
  --band: #1B1512;
  --on-band: #F4EEE6;
  /* Text on the brand red and on the error red. --on-band is a warm
     off-white, and on #CC3232 that lands at 4.48:1 — a hair under AA for
     body text. Pure white on the same red is 5.2:1, so the fix is the
     text, not CO1 §1's brand colour. --on-err has to flip: the dark
     theme's --err is a pale pink that needs dark text on it, the light
     theme's is a deep red that needs white. */
  --on-red: #FFFFFF;

  /* Gold ON the strip. --gold-2 darkens to bronze in light mode so it can
     be read on a light page; that same bronze on the near-black strip is
     3.4:1 and fails. Anything sitting on --band uses this instead. */
  --gold-on-band: #D4AF6A;

  /* type */
  --font-display: "MCO Display", "Oswald", "Arial Narrow", Impact, sans-serif;
  --font-body: "MCO Sans", "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  --font-ar: "MCO Arabic", "Cairo", "Noto Naskh Arabic", "Segoe UI", Tahoma, sans-serif;

  /* rhythm */
  --wrap: 1180px;
  --gap: 1.25rem;
  --radius: 10px;
  --radius-lg: 16px;

  /* --- dark theme, the default (CO1 §1) ---------------------------- */

  --red-1: #CC3232;
  --red-2: #AD2323;
  --gold-2: #D4AF6A;           /* prices, links, accents ON THE GROUND */

  /* ground */
  --ink: #231C18;
  --paper: #231C18;
  --surface: #2C2420;
  --surface-2: #362D28;

  /* Image wells: the ground behind a product photo, a gallery frame or a
     not-yet-loaded placeholder. Its own token because a photo shot on
     white wants a different backdrop from a page panel, and because these
     were the hard-coded creams that punched light holes in the dark
     build. */
  --well: #2C2420;
  --well-2: #362D28;

  /* The ground inside a text field. It was --band, which is right on a
     dark site (a shade below --surface) and wrong on a light one, where
     --band stays near-black and turned every input into a black box. */
  --field: #1B1512;

  /* gold-tinted dividers, per the change order */
  --line: rgba(212, 175, 106, .22);
  --line-strong: rgba(212, 175, 106, .38);

  /* type colours */
  --text: #F4EEE6;
  --text-muted: #C9BFB4;
  --muted: #C9BFB4;
  --muted-2: #9C9088;

  /* status. The tints are translucent rather than pastel: a pale mint
     block on a #231C18 page reads as a hole punched in the design. */
  --ok: #6DD39B;
  --ok-bg: rgba(109, 211, 155, .12);
  --warn: #E3B457;
  --warn-bg: rgba(227, 180, 87, .12);
  --err: #F2827F;
  --err-bg: rgba(242, 130, 127, .12);
  --on-err: #231C18;

  /* Two more status hues the nine pills of CO1 §3 need: "in delivery /
     shipped" and "returned". They were hard-coded pastels, which is fine
     on a dark ground and unreadable on a light one. */
  --info: #8FBDF0;
  --info-bg: rgba(124, 174, 232, .16);
  --ret: #E8A09E;
  --ret-bg: rgba(242, 130, 127, .12);

  /* Shadows on a dark ground do almost nothing, so elevation is carried
     by the surface steps and the gold hairlines instead; these stay for
     the few places (toast, modal, popovers) that float above content. */
  --shadow-1: 0 1px 2px rgba(0, 0, 0, .35), 0 2px 8px rgba(0, 0, 0, .28);
  --shadow-2: 0 10px 34px rgba(0, 0, 0, .5);
  --focus: 0 0 0 3px rgba(204, 50, 50, .35);

  /* Tells the browser to paint its OWN widgets to match — scrollbars, the
     <select> dropdown list, the native date picker. Without it the date
     fields on the order and accounting screens open as white panels. */
  color-scheme: dark;
}

/* --- light theme -----------------------------------------------------
   Copy 1 of 2: no explicit choice, operating system says light.
   Keep identical to copy 2 below.

   Three values are NOT simply the dark ones lightened, and each is a
   contrast fix rather than a taste call:
     --gold-2  #D4AF6A on white is 1.9:1 and unreadable at body size.
               Prices and links use it, so light mode takes the same hue
               at bronze depth (5.4:1 on --surface).
     --red-1   #CC3232 under white button text is 4.1:1 — under the 4.5
               small text needs. Light mode deepens it to 5.6:1.
     --line    a gold hairline vanishes on white, so the divider keeps
               the warm hue but takes its darkness from the brown family.
   ------------------------------------------------------------------- */
@media (prefers-color-scheme: light) {
  :root:not([data-theme="dark"]) {
    --red-1: #B02525;
    --red-2: #8E1C1C;
    --gold-2: #8A6B22;

    --ink: #FBF8F4;
    --paper: #FBF8F4;
    --surface: #FFFFFF;
    --surface-2: #F3EDE5;

    --well: #F2EDE7;
    --well-2: #E7DFD5;

    --field: #F7F2EA;

    --line: rgba(120, 92, 46, .22);
    --line-strong: rgba(120, 92, 46, .42);

    --text: #231C18;
    --text-muted: #5E534A;
    --muted: #5E534A;
    --muted-2: #6F6459;   /* 5.4:1 on --paper; #857A70 was 3.96 */

    --ok: #1E7A4B;
    --ok-bg: rgba(30, 122, 75, .10);
    --warn: #8A6412;
    --warn-bg: rgba(138, 100, 18, .10);
    --err: #B02A2A;
    --err-bg: rgba(176, 42, 42, .10);
    --on-err: #FFFFFF;

    --info: #2A5F9E;
    --info-bg: rgba(42, 95, 158, .12);
    --ret: #A34A47;
    --ret-bg: rgba(163, 74, 71, .12);

    --shadow-1: 0 1px 2px rgba(35, 28, 24, .10), 0 2px 8px rgba(35, 28, 24, .07);
    --shadow-2: 0 10px 34px rgba(35, 28, 24, .18);

    color-scheme: light;
  }
}

/* Copy 2 of 2: the visitor chose light. Keep identical to copy 1 above. */
:root[data-theme="light"] {
  --red-1: #B02525;
  --red-2: #8E1C1C;
  --gold-2: #8A6B22;

  --ink: #FBF8F4;
  --paper: #FBF8F4;
  --surface: #FFFFFF;
  --surface-2: #F3EDE5;

  --well: #F2EDE7;
  --well-2: #E7DFD5;

  --field: #F7F2EA;

  --line: rgba(120, 92, 46, .22);
  --line-strong: rgba(120, 92, 46, .42);

  --text: #231C18;
  --text-muted: #5E534A;
  --muted: #5E534A;
  --muted-2: #6F6459;   /* 5.4:1 on --paper; #857A70 was 3.96 */

  --ok: #1E7A4B;
  --ok-bg: rgba(30, 122, 75, .10);
  --warn: #8A6412;
  --warn-bg: rgba(138, 100, 18, .10);
  --err: #B02A2A;
  --err-bg: rgba(176, 42, 42, .10);
  --on-err: #FFFFFF;

  --info: #2A5F9E;
  --info-bg: rgba(42, 95, 158, .12);
  --ret: #A34A47;
  --ret-bg: rgba(163, 74, 71, .12);

  --shadow-1: 0 1px 2px rgba(35, 28, 24, .10), 0 2px 8px rgba(35, 28, 24, .07);
  --shadow-2: 0 10px 34px rgba(35, 28, 24, .18);

  color-scheme: light;
}

/* Arabic swaps both faces; unrelated to theme, so it sits outside the
   light/dark blocks and applies under either. */
html[lang="ar"] {
  --font-display: "MCO Arabic", "Cairo", "Noto Naskh Arabic", sans-serif;
  --font-body: "MCO Arabic", "Cairo", "Noto Naskh Arabic", "Segoe UI", Tahoma, sans-serif;
}

/* ---------- fonts ---------------------------------------------------
   Self-hosted WOFF2. font-display:swap means the fallback stack above is
   painted immediately and swapped when the file lands — text is never
   invisible, which is what the "no FOIT" part of the Lighthouse score
   measures. Drop the four files into /assets/fonts/ (see the README there);
   until then the fallbacks render the site correctly.
   ------------------------------------------------------------------- */
@font-face {
  font-family: "MCO Display";
  src: url("/assets/fonts/mco-display-700.woff2") format("woff2");
  font-weight: 700; font-style: normal; font-display: swap;
}
@font-face {
  font-family: "MCO Sans";
  src: url("/assets/fonts/mco-sans-400.woff2") format("woff2");
  font-weight: 400; font-style: normal; font-display: swap;
}
@font-face {
  font-family: "MCO Sans";
  src: url("/assets/fonts/mco-sans-600.woff2") format("woff2");
  font-weight: 600; font-style: normal; font-display: swap;
}
@font-face {
  font-family: "MCO Arabic";
  src: url("/assets/fonts/mco-arabic-400.woff2") format("woff2");
  font-weight: 400 700; font-style: normal; font-display: swap;
}

/* ---------- reset ---------------------------------------------------- */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
body {
  margin: 0;
  font-family: var(--font-body);
  font-size: 1rem;
  line-height: 1.6;
  color: var(--text);
  background: var(--paper);
  -webkit-font-smoothing: antialiased;
}
h1, h2, h3, h4 { margin: 0 0 .5em; line-height: 1.15; font-weight: 700; }
p { margin: 0 0 1em; }
img, svg, picture { max-width: 100%; height: auto; display: block; }
a { color: inherit; }
button, input, select, textarea { font: inherit; color: inherit; }
ul, ol { margin: 0; padding: 0; list-style: none; }
table { border-collapse: collapse; width: 100%; }
fieldset { border: 0; margin: 0; padding: 0; }
legend { padding: 0; }

:focus-visible { outline: 2px solid var(--red-1); outline-offset: 2px; }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; }
}

.wrap { width: min(100% - 2rem, var(--wrap)); margin-inline: auto; }

.skip {
  position: absolute; inset-inline-start: -9999px; top: 0; z-index: 100;
  background: var(--band); color: var(--on-band); padding: .75rem 1rem;
}
.skip:focus { inset-inline-start: 0; }

.hp { position: absolute; inset-inline-start: -9999px; width: 1px; height: 1px; overflow: hidden; }

.muted { color: var(--muted); font-weight: 400; }
.nowrap { white-space: nowrap; }
.center { text-align: center; }

/* ---------- buttons -------------------------------------------------- */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: .5rem;
  padding: .7rem 1.25rem;
  border: 1px solid transparent; border-radius: var(--radius);
  font-weight: 600; font-size: .95rem; text-decoration: none;
  cursor: pointer; transition: background-color .15s, border-color .15s, transform .06s;
}
.btn:active { transform: translateY(1px); }
.btn[disabled] { opacity: .5; cursor: not-allowed; }
.btn--primary { background: var(--red-1); color: var(--on-red); }
.btn--primary:hover:not([disabled]) { background: var(--red-2); }
.btn--ghost { background: transparent; border-color: var(--line-strong); color: var(--text); }
.btn--ghost:hover { border-color: var(--text); }
.btn--danger { background: transparent; border-color: var(--err); color: var(--err); }
.btn--danger:hover { background: var(--err); color: var(--on-err); }
.btn--lg { padding: .9rem 1.6rem; font-size: 1.02rem; }
.btn--block { width: 100%; }

.linkbtn {
  background: none; border: 0; padding: 0; cursor: pointer;
  color: var(--gold-2); font-weight: 600; font-size: .9rem;
  text-decoration: underline; text-underline-offset: 3px;
}
.linkbtn--danger { color: var(--err); }
.btnrow { display: flex; flex-wrap: wrap; gap: .75rem; }

/* ---------- banners / toast ------------------------------------------ */
.banner {
  border: 1px solid var(--line); border-inline-start: 4px solid var(--muted-2);
  background: var(--surface); border-radius: var(--radius);
  padding: .85rem 1rem; margin-block: 1rem;
}
.banner p { margin: 0; }
.banner--ok { border-inline-start-color: var(--ok); background: var(--ok-bg); }
.banner--warn { border-inline-start-color: var(--warn); background: var(--warn-bg); }
.banner--error { border-inline-start-color: var(--err); background: var(--err-bg); }

.toast {
  position: fixed; inset-block-end: 1.25rem; inset-inline-start: 50%;
  transform: translateX(-50%);
  background: var(--band); color: var(--on-band);
  padding: .75rem 1.25rem; border-radius: 999px;
  box-shadow: var(--shadow-2); z-index: 90; font-size: .92rem;
}
.toast[hidden] { display: none; }

/* ---------- header --------------------------------------------------- */
.hdr {
  position: sticky; top: 0; z-index: 50;
  background: var(--band); color: var(--on-band);
  border-block-end: 3px solid var(--gold-1);
}
.hdr__bar {
  display: flex; align-items: center; gap: 1rem;
  min-height: 68px; padding-block: .5rem;
}
.hdr__burger {
  display: none; background: none; border: 0; padding: .4rem; cursor: pointer;
}
.burger, .burger::before, .burger::after {
  display: block; width: 22px; height: 2px; background: var(--on-band); border-radius: 2px;
  transition: transform .2s;
}
.burger::before, .burger::after { content: ""; position: relative; }
.burger::before { top: -7px; }
.burger::after { top: 5px; }

.brand { display: flex; align-items: center; gap: .7rem; text-decoration: none; }
.brand__crest { width: 34px; height: 38px; flex: none; }
.brand__text { display: flex; flex-direction: column; line-height: 1.1; }
.brand__name {
  font-family: var(--font-display); font-size: 1.18rem; letter-spacing: .02em;
  text-transform: uppercase; color: var(--on-band);
}
.brand__sub { font-size: .68rem; color: var(--gold-on-band); }

.nav { margin-inline-start: auto; }
.nav__list { display: flex; align-items: center; gap: .25rem; }
.nav__link {
  display: block; padding: .5rem .7rem; border-radius: 8px;
  font-size: .9rem; font-weight: 600; color: var(--on-band); text-decoration: none;
}
.nav__link:hover { background: rgba(255, 255, 255, .09); }
.nav__link.is-active { color: var(--gold-on-band); }


/* ---------- nav category dropdown ------------------------------------
   The header's ten category links are one "Produits" disclosure now. Same
   <details> mechanics as the shop page's .catdrop — works with JS off,
   keeps every category a crawlable <a href> — but it lives on the dark
   brand strip and has to survive the mobile burger, which is a different
   set of constraints, so it gets its own rules rather than sharing them.

   The menu floats on desktop. On mobile the nav is a max-height slider
   with overflow:hidden while closed, and an absolutely-positioned child
   would be clipped by it — so below the breakpoint the menu becomes an
   ordinary block that pushes the list open instead.
   ------------------------------------------------------------------- */
.navdrop__host { position: relative; }
.navdrop__btn {
  display: flex; align-items: center; gap: .35rem; cursor: pointer;
  list-style: none;   /* Firefox draws the marker via list-style, WebKit below */
}
.navdrop__btn::-webkit-details-marker { display: none; }
.navdrop__btn:hover { background: rgba(255, 255, 255, .09); }
.navdrop__btn:focus-visible { outline: none; box-shadow: var(--focus); }
.navdrop__caret { inline-size: .62rem; block-size: .62rem; flex: none; transition: transform .15s ease; }
.navdrop[open] .navdrop__caret { transform: rotate(180deg); }

.navdrop__menu {
  position: absolute; z-index: 40; inset-inline-start: 0; inset-block-start: calc(100% + .4rem);
  min-inline-size: 13rem; padding: .3rem;
  background: var(--band); border: 1px solid rgba(255, 255, 255, .16);
  border-radius: var(--radius); box-shadow: var(--shadow-2);
  max-block-size: min(70vh, 26rem); overflow-y: auto;
}
.navdrop__item {
  display: block; padding: .5rem .7rem; border-radius: calc(var(--radius) - 4px);
  font-size: .88rem; font-weight: 600; color: var(--on-band); text-decoration: none;
  white-space: nowrap;
}
.navdrop__item:hover { background: rgba(255, 255, 255, .12); }
.navdrop__item.is-active { color: var(--gold-on-band); }

.hdr__end { display: flex; align-items: center; gap: .75rem; margin-inline-start: .5rem; }

.langsw { display: flex; border: 1px solid rgba(255, 255, 255, .28); border-radius: 999px; overflow: hidden; }
.langsw__item {
  padding: .2rem .55rem; font-size: .72rem; font-weight: 700;
  color: var(--on-band); text-decoration: none; letter-spacing: .04em;
}
.langsw__item.is-active { background: var(--gold-1); color: var(--on-gold); }


/* ---------- theme toggle ---------------------------------------------
   Sits on the brand strip, so it is coloured with --on-band like the
   language switcher next to it and needs no theme-aware colours of its own.

   Hidden until site.js adds `has-js` to <html>: the button's whole job is
   to write a cookie and flip an attribute, both of which need JavaScript.
   A visitor without it still gets a correct theme — prefers-color-scheme
   decides — they just cannot override it, so showing them a dead control
   would be worse than showing none.

   Which icon is on show is decided the same three ways the tokens are, in
   the same order, and the button always offers the theme you are NOT in.
   ------------------------------------------------------------------- */
.themesw {
  display: none; align-items: center; justify-content: center;
  inline-size: 2rem; block-size: 2rem; padding: 0;
  border: 1px solid rgba(255, 255, 255, .28); border-radius: 999px;
  background: none; color: var(--on-band); cursor: pointer;
}
html.has-js .themesw { display: inline-flex; }
.themesw:hover { background: rgba(255, 255, 255, .12); }
.themesw:focus-visible { outline: none; box-shadow: var(--focus); }
.themesw__icon { inline-size: 1.05rem; block-size: 1.05rem; }

/* Dark is the default, so the default offer is "go light" — the sun. */
.themesw__moon { display: none; }
@media (prefers-color-scheme: light) {
  :root:not([data-theme="dark"]) .themesw__sun { display: none; }
  :root:not([data-theme="dark"]) .themesw__moon { display: block; }
}
:root[data-theme="light"] .themesw__sun { display: none; }
:root[data-theme="light"] .themesw__moon { display: block; }

.cartbtn { position: relative; display: block; padding: .4rem; color: var(--on-band); }
.cartbtn__icon { width: 26px; height: 26px; }
.cartbtn__badge {
  position: absolute; inset-block-start: -2px; inset-inline-end: -4px;
  min-width: 19px; height: 19px; padding-inline: 4px;
  display: grid; place-items: center;
  background: var(--gold-1); color: var(--on-gold);
  border-radius: 999px; font-size: .7rem; font-weight: 700; line-height: 1;
}
.cartbtn__badge[hidden] { display: none; }

@media (max-width: 940px) {
  .hdr__burger { display: block; }
  .nav {
    position: absolute; inset-inline: 0; top: 100%;
    background: var(--band); border-block-end: 3px solid var(--gold-1);
    max-height: 0; overflow: hidden; transition: max-height .22s ease;
  }
  .nav.is-open { max-height: 70vh; overflow: auto; }
  .nav__list { flex-direction: column; align-items: stretch; padding: .5rem 1rem 1rem; }
  .nav__link { padding: .7rem .5rem; border-block-end: 1px solid rgba(255, 255, 255, .08); }
  /* The burger panel clips anything absolute, so the menu goes inline and
     the list simply gets taller. Indented and hairlined so the categories
     still read as belonging to the button above them. */
  .navdrop__menu {
    position: static; min-inline-size: 0; max-block-size: none;
    padding: 0 0 .35rem; margin-inline-start: .75rem;
    background: none; border: 0; border-inline-start: 1px solid rgba(255, 255, 255, .18);
    border-radius: 0; box-shadow: none; overflow: visible;
  }
  .navdrop__item { white-space: normal; padding: .55rem .75rem; }
  .hdr__end { margin-inline-start: auto; }
}

/* ---------- hero ----------------------------------------------------- */
.hero {
  position: relative; overflow: hidden;
  background: linear-gradient(160deg, var(--red-2) 0%, var(--red-1) 55%, #8E1717 100%);
  color: var(--on-red);
}
.hero__inner { position: relative; z-index: 1; padding-block: clamp(2.5rem, 7vw, 5rem); max-width: 640px; }
.hero__kicker {
  font-size: .78rem; letter-spacing: .18em; text-transform: uppercase;
  color: var(--gold-on-band); margin-bottom: .6rem;
}
.hero__title {
  font-family: var(--font-display); text-transform: uppercase;
  font-size: clamp(2rem, 6vw, 3.4rem); letter-spacing: .01em; margin-bottom: .5rem;
}
.hero__text { font-size: 1.05rem; color: var(--on-band); max-width: 48ch; }
.hero__stripes {
  position: absolute; inset-block: 0; inset-inline-end: -12%;
  width: 46%;
  background: repeating-linear-gradient(115deg,
    rgba(212, 175, 106, .22) 0 14px, transparent 14px 42px);
  transform: skewX(-12deg);
}

/* ---------- USP ------------------------------------------------------ */
.usp { background: var(--band); color: var(--on-band); }
.usp__grid {
  display: grid; gap: var(--gap); padding-block: 1.5rem;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
}
.usp__t { font-size: .95rem; color: var(--gold-on-band); margin-bottom: .2rem; }
.usp__d { font-size: .88rem; color: #C9C0B8; margin: 0; }

/* ---------- sections / grid ------------------------------------------ */
.section { padding-block: clamp(2rem, 5vw, 3.25rem); }
.section__head { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; margin-bottom: 1.25rem; }
.section__title {
  font-family: var(--font-display); text-transform: uppercase;
  font-size: clamp(1.3rem, 3vw, 1.8rem); margin: 0;
}
.section__more { font-size: .9rem; font-weight: 600; color: var(--gold-2); }

.page__title {
  font-family: var(--font-display); text-transform: uppercase;
  font-size: clamp(1.5rem, 4vw, 2.2rem); margin-block: 1.25rem .75rem;
}

.grid {
  display: grid; gap: var(--gap);
  grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
}
@media (max-width: 560px) { .grid { grid-template-columns: repeat(2, 1fr); gap: .8rem; } }

.empty { color: var(--muted); padding-block: 2rem; }
.empty--big { text-align: center; padding-block: 4rem; }
.empty--big .btn { margin-top: 1rem; }

/* ---------- product card --------------------------------------------- */
.card {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--radius-lg); overflow: hidden;
  transition: box-shadow .18s, transform .18s, border-color .18s;
}
.card:hover { box-shadow: var(--shadow-2); transform: translateY(-2px); border-color: var(--line-strong); }
.card__link { display: block; text-decoration: none; color: inherit; }
.card__media { position: relative; aspect-ratio: 1; background: var(--well); }
.card__img, .card__media img { width: 100%; height: 100%; object-fit: cover; }
.card--out .card__media { filter: grayscale(.75); opacity: .75; }
.card__flag {
  position: absolute; inset-block-start: .6rem; inset-inline-start: .6rem;
  background: var(--band); color: var(--on-band); font-size: .68rem; font-weight: 700;
  padding: .22rem .55rem; border-radius: 999px; letter-spacing: .03em;
}
.card__flag--low { background: var(--gold-1); color: var(--on-gold); }
.card__body { padding: .8rem .9rem 1rem; }
.card__cat { font-size: .68rem; letter-spacing: .1em; text-transform: uppercase; color: var(--muted-2); margin: 0 0 .2rem; }
.card__name { font-size: .98rem; font-weight: 600; margin: 0 0 .35rem; line-height: 1.3; }
.card__price { font-family: var(--font-display); font-size: 1.1rem; color: var(--gold-2); margin: 0; }

.ph { background: repeating-linear-gradient(45deg, var(--well) 0 12px, var(--well-2) 12px 24px); }

/* ---------- breadcrumbs ---------------------------------------------- */
.crumbs { display: flex; flex-wrap: wrap; gap: .4rem; font-size: .82rem; color: var(--muted); padding-block: 1rem .25rem; }
.crumbs a { color: var(--muted); text-decoration: none; }
.crumbs a:hover { color: var(--text); text-decoration: underline; }

/* ---------- category dropdown (shop page) ----------------------------
   Replaces the old .chips row: one disclosure named after t('cat_dropdown').
   Everything here uses logical properties, so it flips whole under dir=rtl
   without a second rule — including the menu, which is pinned to both
   inline edges of the control rather than to "left".
   ------------------------------------------------------------------- */
.catdrop { position: relative; margin-block: .5rem 1.5rem; inline-size: min(100%, 22rem); }
.catdrop__btn {
  display: flex; align-items: center; gap: .55rem; cursor: pointer;
  padding: .6rem .9rem; border: 1px solid var(--line-strong); border-radius: var(--radius);
  background: var(--surface); font-size: .9rem; font-weight: 600;
  list-style: none;   /* Firefox draws the marker via list-style, WebKit below */
}
.catdrop__btn::-webkit-details-marker { display: none; }
.catdrop__btn:hover { border-color: var(--text); }
.catdrop__btn:focus-visible { outline: none; box-shadow: var(--focus); }
.catdrop__value {
  margin-inline-start: auto; font-weight: 500; color: var(--gold-2);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.catdrop__caret { inline-size: .72rem; block-size: .72rem; flex: none; transition: transform .15s ease; }
.catdrop[open] .catdrop__caret { transform: rotate(180deg); }

.catdrop__menu {
  position: absolute; z-index: 30; inset-inline: 0; inset-block-start: calc(100% + .35rem);
  margin: 0; padding: .3rem; list-style: none;
  background: var(--surface); border: 1px solid var(--line-strong);
  border-radius: var(--radius); box-shadow: var(--shadow-2);
  max-block-size: min(60vh, 24rem); overflow-y: auto;
}
.catdrop__item {
  display: flex; align-items: center; gap: .6rem;
  padding: .5rem .65rem; border-radius: calc(var(--radius) - 4px);
  font-size: .88rem; text-decoration: none; color: var(--text);
}
.catdrop__item:hover { background: var(--surface-2); }
.catdrop__item.is-active {
  /* --band is only a shade off --surface, so the active row was invisible
     inside the menu. The gold tint is the same accent the closed control
     uses for the current category. */
  background: rgba(212, 175, 106, .14); color: var(--gold-2); font-weight: 700;
}
.catdrop__n { margin-inline-start: auto; font-size: .74rem; color: var(--muted-2); }
.catdrop__item.is-active .catdrop__n { color: var(--gold-2); }

/* No JS on the page? The menu still opens; it just cannot close on
   click-away. Nothing below it is obscured permanently — a second click on
   the summary closes it, which is the native behaviour. */

.cats { display: grid; gap: var(--gap); grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); }
.cats__item {
  display: flex; flex-direction: column; gap: .2rem;
  padding: 1.1rem 1.2rem; border: 1px solid var(--line); border-radius: var(--radius-lg);
  background: var(--surface); text-decoration: none;
}
.cats__item:hover { border-color: var(--gold-1); }
.cats__name { font-family: var(--font-display); text-transform: uppercase; font-size: 1.05rem; }
.cats__n { font-size: .8rem; color: var(--muted); }

/* ---------- product page --------------------------------------------- */
.product {
  display: grid; gap: clamp(1.5rem, 4vw, 3rem);
  grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr);
  padding-block: 1rem 3rem;
}
@media (max-width: 900px) { .product { grid-template-columns: 1fr; } }

.gal__main {
  border: 1px solid var(--line); border-radius: var(--radius-lg);
  overflow: hidden; background: var(--well); aspect-ratio: 1;
}
.gal__main img { width: 100%; height: 100%; object-fit: cover; }
.gal__thumbs { display: flex; gap: .55rem; margin-top: .7rem; flex-wrap: wrap; }
.gal__thumb {
  width: 66px; height: 66px; padding: 0; cursor: pointer; background: none;
  border: 2px solid var(--line); border-radius: 8px; overflow: hidden;
}
.gal__thumb.is-active { border-color: var(--red-1); }
.gal__thumb img { width: 100%; height: 100%; object-fit: cover; }

.buy__cat { font-size: .72rem; letter-spacing: .12em; text-transform: uppercase; color: var(--muted-2); margin-bottom: .3rem; }
.buy__title { font-family: var(--font-display); text-transform: uppercase; font-size: clamp(1.5rem, 4vw, 2.3rem); }
.buy__price { font-family: var(--font-display); font-size: 1.9rem; color: var(--gold-2); margin-bottom: .35rem; }
.buy__stock { font-size: .88rem; color: var(--ok); font-weight: 600; margin-bottom: 1.25rem; }
.buy__stock.is-out { color: var(--err); }
.buy__note { font-size: .82rem; color: var(--muted); margin-top: .9rem; }
.buy__desc { margin-top: 2rem; padding-top: 1.5rem; border-top: 1px solid var(--line); }
.buy__desc h2 { font-size: 1rem; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); }

.opt { margin-bottom: 1.1rem; }
.opt__legend { font-size: .8rem; font-weight: 700; text-transform: uppercase; letter-spacing: .08em; color: var(--muted); margin-bottom: .45rem; }
.opt__row { display: flex; flex-wrap: wrap; gap: .5rem; }

.swatch { position: relative; display: inline-flex; cursor: pointer; }
.swatch__input { position: absolute; opacity: 0; width: 100%; height: 100%; margin: 0; cursor: pointer; }
.swatch__face {
  min-width: 46px; padding: .5rem .8rem;
  display: grid; place-items: center;
  border: 1.5px solid var(--line-strong); border-radius: 8px;
  background: var(--surface); font-weight: 600; font-size: .9rem;
  transition: border-color .12s, background-color .12s;
}
.swatch__input:checked + .swatch__face { border-color: var(--red-1); background: rgba(204, 50, 50, .18); color: var(--text); }
.swatch__input:focus-visible + .swatch__face { box-shadow: var(--focus); }
.swatch__input:disabled + .swatch__face {
  opacity: .45; cursor: not-allowed;
  background: repeating-linear-gradient(135deg, var(--well) 0 6px, var(--well-2) 6px 12px);
}

.qty { display: inline-flex; align-items: stretch; border: 1.5px solid var(--line-strong); border-radius: 8px; overflow: hidden; margin-bottom: 1rem; }
.qty__btn { width: 42px; background: var(--surface); border: 0; cursor: pointer; font-size: 1.2rem; line-height: 1; }
.qty__btn:hover { background: var(--surface-2); }
.qty__input { width: 58px; text-align: center; border: 0; border-inline: 1.5px solid var(--line-strong); padding: .55rem 0; -moz-appearance: textfield; }
.qty__input::-webkit-outer-spin-button, .qty__input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.qty--sm .qty__btn { width: 32px; font-size: 1rem; }
.qty--sm .qty__input { width: 44px; padding: .35rem 0; }
.qty__go { border: 0; background: var(--band); color: var(--on-band); padding-inline: .7rem; cursor: pointer; font-size: .8rem; }

/* ---------- cart page ------------------------------------------------ */
.cartpage { padding-bottom: 3rem; }
.cartpage__grid { display: grid; gap: var(--gap); grid-template-columns: minmax(0, 1fr) 320px; align-items: start; }
@media (max-width: 860px) { .cartpage__grid { grid-template-columns: 1fr; } }

.lines { display: flex; flex-direction: column; gap: .75rem; }
.line {
  display: grid; grid-template-columns: 96px minmax(0, 1fr) auto; gap: 1rem;
  padding: 1rem; background: var(--surface);
  border: 1px solid var(--line); border-radius: var(--radius-lg);
}
.line--conflict { border-color: var(--err); background: var(--err-bg); }
.line__media { display: block; }
.line__img, .line__media img { width: 96px; height: 96px; object-fit: cover; border-radius: 8px; }
.line__name { font-weight: 600; text-decoration: none; }
.line__meta { display: flex; flex-wrap: wrap; gap: .75rem; font-size: .83rem; color: var(--muted); margin: .25rem 0; }
.line__unit { font-size: .83rem; color: var(--muted); margin: 0; }
.line__warn { color: var(--err); font-weight: 600; font-size: .85rem; margin: .4rem 0 0; }
.line__actions { display: flex; flex-direction: column; align-items: flex-end; gap: .4rem; }
.line__total { font-family: var(--font-display); font-size: 1.1rem; margin: 0; }
@media (max-width: 620px) {
  .line { grid-template-columns: 76px minmax(0, 1fr); }
  .line__img, .line__media img { width: 76px; height: 76px; }
  .line__actions { grid-column: 1 / -1; flex-direction: row; align-items: center; justify-content: space-between; }
}

.summary {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--radius-lg); padding: 1.25rem;
}
.summary--sticky { position: sticky; top: 92px; }
.summary__h { font-size: 1rem; text-transform: uppercase; letter-spacing: .07em; color: var(--muted); }
.summary__rows { margin: 0 0 1rem; }
.summary__row { display: flex; justify-content: space-between; gap: 1rem; padding-block: .35rem; }
.summary__row dt, .summary__row dd { margin: 0; }
.summary__row--total {
  border-top: 1px solid var(--line); margin-top: .35rem; padding-top: .7rem;
  font-family: var(--font-display); font-size: 1.25rem;
}
.summary .btn { margin-bottom: .5rem; }
.summary__note { font-size: .8rem; color: var(--muted); margin: .5rem 0 0; }

.minilines { display: flex; flex-direction: column; gap: .5rem; margin-bottom: 1rem; }
.minilines__item { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: .6rem; font-size: .88rem; }
.minilines__qty { color: var(--muted); }
.minilines__name em { display: block; font-style: normal; font-size: .78rem; color: var(--muted-2); }
.minilines__price { white-space: nowrap; font-weight: 600; }

/* ---------- checkout ------------------------------------------------- */
.checkout { padding-bottom: 3rem; }
.checkout__grid { display: grid; gap: var(--gap); grid-template-columns: minmax(0, 1fr) 340px; align-items: start; }
@media (max-width: 860px) { .checkout__grid { grid-template-columns: 1fr; } .summary--sticky { position: static; } }

.form { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); padding: clamp(1rem, 3vw, 1.75rem); }
.form--narrow { max-width: 460px; }
.form--wide { background: none; border: 0; padding: 0; }
.form__h { font-size: 1.05rem; margin-bottom: 1rem; }
.form__note { font-size: .82rem; color: var(--muted); margin-top: .9rem; }
.form__back { font-size: .88rem; margin: .5rem 0 0; }

.field { margin-bottom: 1.1rem; }
.field__label { display: block; font-size: .85rem; font-weight: 600; margin-bottom: .35rem; }
.field__req { color: var(--err); font-weight: 400; font-size: .78rem; }
.field__opt { color: var(--muted-2); font-weight: 400; font-size: .78rem; }
.field__input {
  width: 100%; padding: .65rem .8rem;
  border: 1.5px solid var(--line-strong); border-radius: 8px;
  /* A shade below whatever panel it sits in, so a field reads as an input
     and not as a slightly differently-shaped card. */
  background: var(--field); color: var(--text);
  transition: border-color .12s, box-shadow .12s;
}
.field__input:disabled { opacity: .55; cursor: not-allowed; }
.field__input:focus { border-color: var(--red-1); box-shadow: var(--focus); outline: none; }
.field__input--area { resize: vertical; min-height: 5rem; }
.field__input--code { font-size: 1.4rem; letter-spacing: .35em; text-align: center; }
.field__help { font-size: .78rem; color: var(--muted); margin: .3rem 0 0; }
.field__err { font-size: .82rem; color: var(--err); font-weight: 600; margin: .3rem 0 0; }
.field--bad .field__input { border-color: var(--err); }
.field--check { display: flex; align-items: center; }
.check { display: inline-flex; align-items: center; gap: .55rem; cursor: pointer; font-size: .92rem; }
.check input { width: 18px; height: 18px; accent-color: var(--red-1); }
.cols { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); }
.formbar { display: flex; gap: .75rem; flex-wrap: wrap; margin-block: 1.25rem 2rem; }

/* ---------- confirmation / tracking ---------------------------------- */
.confirm { max-width: 640px; text-align: center; padding-block: 2.5rem 4rem; }
.confirm__badge svg { width: 64px; height: 64px; margin-inline: auto; }
.confirm__title { font-family: var(--font-display); text-transform: uppercase; font-size: clamp(1.4rem, 4vw, 2rem); margin-top: 1rem; }
.confirm__label { font-size: .8rem; letter-spacing: .12em; text-transform: uppercase; color: var(--muted); margin-bottom: .2rem; }
.confirm__ticket {
  font-family: var(--font-display); font-size: clamp(1.6rem, 5vw, 2.4rem);
  letter-spacing: .06em; color: var(--gold-2);
  background: var(--surface); border: 2px dashed var(--gold-1); border-radius: var(--radius-lg);
  padding: .75rem 1rem; margin: 0 0 .6rem;
}
.confirm__save { font-size: .88rem; color: var(--muted); }
.confirm__next { margin-block: 1.5rem; }
.confirm__items { text-align: start; background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); padding: 1.25rem; margin-block: 1.5rem; }
.confirm__items h2 { font-size: .95rem; text-transform: uppercase; letter-spacing: .07em; color: var(--muted); }
.confirm__actions { display: flex; gap: .75rem; justify-content: center; flex-wrap: wrap; }

.track { max-width: 720px; padding-bottom: 4rem; }
.track__intro { color: var(--muted); }
.track__card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); padding: clamp(1rem, 3vw, 1.75rem); }
.track__ticket { font-family: var(--font-display); font-size: 1.6rem; color: var(--gold-2); margin: 0; }
.track__date { font-size: .85rem; color: var(--muted); }
.track__status { font-size: 1.1rem; font-weight: 700; margin-block: 1rem .2rem; }
.track__statusd { color: var(--muted); }
.track__items { margin-top: 1.5rem; padding-top: 1.25rem; border-top: 1px solid var(--line); }
.track__items h2 { font-size: .95rem; text-transform: uppercase; letter-spacing: .07em; color: var(--muted); }
.track__back { margin-top: 1rem; font-size: .88rem; }

.timeline { display: flex; flex-wrap: wrap; gap: .25rem; margin-block: 1.25rem; }
.timeline__step { flex: 1 1 90px; text-align: center; position: relative; padding-top: 1.4rem; font-size: .78rem; color: var(--muted-2); }
.timeline__step::before {
  content: ""; position: absolute; inset-block-start: 8px; inset-inline: 0;
  height: 3px; background: var(--line);
}
.timeline__step.is-done { color: var(--text); font-weight: 600; }
.timeline__step.is-done::before { background: var(--gold-1); }
.timeline__dot {
  position: absolute; inset-block-start: 3px; inset-inline-start: calc(50% - 6px);
  width: 13px; height: 13px; border-radius: 50%;
  background: var(--line-strong); border: 2px solid var(--paper);
}
.timeline__step.is-done .timeline__dot { background: var(--gold-1); }
.timeline__step.is-current .timeline__dot { background: var(--red-1); box-shadow: 0 0 0 4px rgba(191, 42, 42, .18); }

/* ---------- mini cart ------------------------------------------------ */
.mini { position: fixed; inset: 0; z-index: 80; }
.mini[hidden] { display: none; }
.mini__scrim { position: absolute; inset: 0; background: rgba(25, 19, 16, .5); }
.mini__panel {
  position: absolute; inset-block: 0; inset-inline-end: 0;
  width: min(400px, 92vw); background: var(--surface);
  display: flex; flex-direction: column; box-shadow: var(--shadow-2);
  animation: slidein .22s ease;
}
@keyframes slidein { from { transform: translateX(100%); } to { transform: none; } }
html[dir="rtl"] .mini__panel { animation-name: slideinrtl; }
@keyframes slideinrtl { from { transform: translateX(-100%); } to { transform: none; } }

.mini__head { display: flex; align-items: center; justify-content: space-between; padding: 1rem 1.15rem; border-block-end: 1px solid var(--line); }
.mini__title { font-size: 1rem; margin: 0; }
.mini__close { background: none; border: 0; cursor: pointer; padding: .25rem; }
.mini__close svg { width: 22px; height: 22px; }
.mini__list { flex: 1; overflow: auto; padding: .75rem 1.15rem; display: flex; flex-direction: column; gap: .75rem; }
.mini__item { display: grid; grid-template-columns: 56px minmax(0, 1fr); gap: .7rem; align-items: center; }
.mini__item img { width: 56px; height: 56px; object-fit: cover; border-radius: 6px; }
.mini__name { font-size: .9rem; font-weight: 600; text-decoration: none; }
.mini__meta { font-size: .78rem; color: var(--muted); }
.mini__foot { border-block-start: 1px solid var(--line); padding: 1rem 1.15rem; }
.mini__total { display: flex; justify-content: space-between; font-family: var(--font-display); font-size: 1.15rem; margin-bottom: .75rem; }
.mini__foot .btn { margin-bottom: .5rem; }

/* ---------- footer --------------------------------------------------- */
.ftr { background: var(--band); color: var(--on-band); margin-top: 3rem; }
.ftr__grid { display: grid; gap: 2rem; padding-block: 2.5rem; grid-template-columns: 1.4fr repeat(3, 1fr); }
@media (max-width: 780px) { .ftr__grid { grid-template-columns: 1fr 1fr; } }
.ftr__crest { width: 40px; height: 44px; margin-bottom: .75rem; }
.ftr__tag { font-size: .88rem; }
.ftr__h { font-size: .78rem; letter-spacing: .12em; text-transform: uppercase; color: var(--gold-on-band); margin-bottom: .6rem; }
.ftr__list { display: flex; flex-direction: column; gap: .35rem; font-size: .88rem; }
.ftr__list a { text-decoration: none; }
.ftr__list a:hover { color: var(--on-band); text-decoration: underline; }
.ftr__legal { border-block-start: 1px solid rgba(255, 255, 255, .1); padding-block: 1rem; font-size: .8rem; }
.ftr__legal p { margin: 0; }

.errpage { max-width: 560px; text-align: center; padding-block: 4rem; }
.errpage__code { font-family: var(--font-display); font-size: 4rem; color: var(--line-strong); margin: 0; }
.errpage__text { color: var(--muted); margin-bottom: 1.5rem; }

/* =====================================================================
   ADMIN
   Same stylesheet on purpose: one CSS file, one JS file, per the spec.
   The extra weight for a storefront visitor is a few hundred gzipped bytes.
   ===================================================================== */
/* THE page ground for every admin screen. This was still #F4F1ED — the
   pre-CO1 light value — which put near-white --text on a near-white body
   and made every heading outside a card invisible. It is a token now, so
   it follows whichever theme is active. */
.adm { background: var(--paper); color: var(--text); }
.adm__top {
  display: flex; align-items: center; gap: 1rem; flex-wrap: wrap;
  background: var(--band); color: var(--on-band); padding: .6rem 1.25rem;
  border-block-end: 3px solid var(--gold-1);
}
.adm__brand { font-family: var(--font-display); text-transform: uppercase; letter-spacing: .04em; text-decoration: none; }
.adm__nav { display: flex; gap: .25rem; flex-wrap: wrap; margin-inline-start: 1rem; }
.adm__navlink { padding: .4rem .7rem; border-radius: 7px; font-size: .88rem; font-weight: 600; color: var(--on-band); text-decoration: none; }
.adm__navlink:hover { background: rgba(255, 255, 255, .09); }
.adm__navlink.is-active { background: var(--red-1); color: var(--on-red); }
.adm__user { margin-inline-start: auto; display: flex; align-items: center; gap: .8rem; font-size: .85rem; }
.adm__user .linkbtn { color: var(--gold-on-band); }
.adm__who { color: var(--on-band); opacity: .78; }
.adm__main { width: min(100% - 2rem, 1280px); margin-inline: auto; padding-block: 1.5rem 4rem; }
.adm__title { font-family: var(--font-display); text-transform: uppercase; font-size: 1.5rem; margin-bottom: 1rem; }

/* DISABLE_2FA banner. Rendered on every admin screen while the flag is on,
   so it has to sit still and be unmissable without becoming the loudest
   thing on a page someone works in all day: an error-red rule down the
   inline start, normal body weight, no animation. */
.nofa { border-inline-start: 4px solid var(--err); margin-bottom: 1.25rem; }
.nofa code { background: var(--err-bg); color: var(--err); }

.adm--auth { display: grid; place-items: center; min-height: 100vh; background: var(--band); }
.authbox { width: min(100% - 2rem, 400px); background: var(--surface); border-radius: var(--radius-lg); padding: 2rem; box-shadow: var(--shadow-2); text-align: center; }
.authbox--wide { width: min(100% - 2rem, 520px); }
.authbox__crest { width: 46px; height: 50px; margin-inline: auto; }
.authbox__title { font-family: var(--font-display); text-transform: uppercase; margin-top: .75rem; }
.authbox__sub { font-size: .88rem; color: var(--muted); }
.authbox .form { text-align: start; border: 0; background: none; padding: 0; }
.authbox__foot { font-size: .78rem; color: var(--muted-2); margin-top: 1.25rem; }
/* "Recevoir un code par e-mail" on the verification screen. A quiet
   secondary route, styled below the primary button rather than beside it,
   so the authenticator app stays the obvious path. */
.authbox__alt { margin-top: 1rem; padding-top: 1rem; border-block-start: 1px solid var(--line); }
.authbox__altnote { font-size: .78rem; color: var(--muted-2); margin: .3rem 0 0; }
.authbox__cancel { margin-top: .75rem; }

.qrbox { display: grid; place-items: center; margin-block: 1rem; }
/* The 8px border is the QR quiet zone, and it is hard-coded light in
   BOTH themes on purpose: ISO/IEC 18004 requires a light margin around
   the symbol, and a camera will not read one framed in dark brown. */
.qrbox .qr { width: min(240px, 70vw); height: auto; border: 8px solid #F4EEE6; border-radius: 8px; box-shadow: var(--shadow-1); }
.qrbox__label { font-size: .82rem; color: var(--muted); margin-bottom: .2rem; }
.qrbox__secret { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: .95rem; letter-spacing: .05em; word-break: break-all; }

/* ---------- DEV_2FA_LOG banner ---------------------------------------
   Only ever rendered when the testing aid is on, which dev_2fa_enabled()
   forbids in production. Styled to be impossible to mistake for a normal
   part of the screen — if this is visible on a live site, 2FA is off. */
.devcode { text-align: center; margin-block: 1rem; }
.devcode__label {
  font-size: .68rem; letter-spacing: .12em; text-transform: uppercase;
  color: var(--warn); margin: 0 0 .3rem;
}
.devcode__code {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 1.8rem; font-weight: 700; letter-spacing: .22em;
  margin: 0; user-select: all;
}
.devcode__note { font-size: .72rem; color: var(--muted-2); margin: .35rem 0 0; }

.stats { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); margin-bottom: 1.5rem; }
.stat { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: 1rem 1.15rem; }
.stat__n { font-family: var(--font-display); font-size: 1.7rem; margin: 0; }
.stat__l { font-size: .8rem; color: var(--muted); margin: 0; }

.panel { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); padding: 1.25rem; margin-bottom: 1.25rem; }
.panel__head { display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin-bottom: .9rem; }
.panel__head h2 { font-size: 1.05rem; margin: 0; }
.panel--danger { border-color: var(--err); }
.panel--highlight { border-color: var(--gold-1); background: var(--surface-2); }
.hint { font-size: .84rem; color: var(--muted); }

.tablewrap { overflow-x: auto; }
.table { font-size: .88rem; min-width: 520px; }
.table th, .table td { text-align: start; padding: .55rem .6rem; border-block-end: 1px solid var(--line); vertical-align: middle; }
.table thead th { font-size: .75rem; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); }
.table tbody tr:hover { background: rgba(244, 238, 230, .045); }
.table tr.is-zero td { background: var(--err-bg); }
.table tr.is-warn td { background: var(--warn-bg); }
.table--form .field__input { padding: .35rem .5rem; }
.thumbcell img { width: 44px; height: 44px; object-fit: cover; border-radius: 6px; }
.thumbcell__ph { display: block; width: 44px; height: 44px; border-radius: 6px; background: var(--surface-2); }

/* Status pills — the nine states of CO1 §3.
   Colour carries meaning here, so it is never the only signal: the pill
   always contains the status name in words. */
.pill { display: inline-block; padding: .16rem .55rem; border-radius: 999px; font-size: .74rem; font-weight: 700; background: var(--line); color: var(--text); }
.pill--in_process  { background: rgba(227, 180, 87, .16); color: var(--warn); }
.pill--confirmed   { background: rgba(109, 211, 155, .14); color: var(--ok); }
.pill--canceled    { background: var(--err-bg); color: var(--err); }
.pill--in_delivery { background: var(--info-bg); color: var(--info); }
.pill--shipped     { background: var(--info-bg); color: var(--info); }
.pill--received    { background: rgba(201, 162, 75, .18); color: var(--gold-2); }
.pill--returned    { background: var(--ret-bg); color: var(--ret); }
.pill--retrieved   { background: rgba(156, 144, 136, .18); color: var(--muted); }
.pill--finalized   { background: rgba(109, 211, 155, .2); color: var(--ok); }

.filters { display: flex; gap: .6rem; flex-wrap: wrap; align-items: center; margin-bottom: 1rem; }
.filters .field__input { width: auto; min-width: 200px; }
.filters__search { display: flex; gap: .5rem; }
.pager { display: flex; gap: .75rem; justify-content: center; margin-top: 1.25rem; }

.ordergrid { display: grid; gap: 1.25rem; grid-template-columns: repeat(auto-fit, minmax(340px, 1fr)); align-items: start; }
.deflist > div { display: grid; grid-template-columns: 150px minmax(0, 1fr); gap: .5rem; padding-block: .4rem; border-block-end: 1px solid var(--line); }
.deflist dt { font-size: .82rem; color: var(--muted); }
.deflist dd { margin: 0; }
.deflist .big { font-size: 1.15rem; font-weight: 700; }
.statusform { display: flex; gap: .6rem; flex-wrap: wrap; }
.statusform .field__input { width: auto; min-width: 180px; }

.uploadform { display: flex; gap: .6rem; flex-wrap: wrap; align-items: center; margin-block: .75rem 1rem; }
.uploadform .field__input { width: auto; }
.imggrid { display: grid; gap: .75rem; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); margin-bottom: 1rem; }
.imgcard { border: 2px solid var(--line); border-radius: var(--radius); overflow: hidden; background: var(--well); }
.imgcard.is-cover { border-color: var(--gold-1); }
.imgcard img { width: 100%; aspect-ratio: 1; object-fit: cover; }
.imgcard__acts { display: flex; justify-content: space-between; gap: .5rem; padding: .45rem .55rem; background: var(--surface); }
.reorderform { display: flex; gap: .6rem; align-items: flex-end; flex-wrap: wrap; }
.reorderform .field__input { width: auto; min-width: 240px; }

.codes { display: grid; gap: .4rem; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 1rem; }
.codes li { background: var(--surface); border: 1px solid var(--line); border-radius: 6px; padding: .4rem .6rem; text-align: center; letter-spacing: .05em; }


/* =====================================================================
   Change Order 1 components
   ===================================================================== */

/* Shared: the `hidden` attribute must win over any display rule a
   component sets, or JS toggling el.hidden silently does nothing. */
[hidden] { display: none !important; }

/* Progressive-enhancement pair (CO1 §2). .js-only ships hidden and
   site.js unhides it; .nojs-only is visible until site.js removes it. */
.js-only { display: none; }

/* ---------- order stepper (CO1 §3) -----------------------------------
   The happy path for this order's type. Off-path states (canceled,
   returned, retrieved) are deliberately not drawn on the line — putting
   them there would suggest they lead to `finalized`, and they do not.
   ------------------------------------------------------------------- */
.stepper {
  display: flex; flex-wrap: wrap; gap: .35rem;
  margin-block: 0 1.25rem; padding: 0;
  counter-reset: step;
}
.stepper__step {
  flex: 1 1 140px; display: flex; align-items: center; gap: .5rem;
  padding: .6rem .75rem;
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--radius); font-size: .84rem; color: var(--muted);
}
.stepper__dot {
  flex: none; width: 10px; height: 10px; border-radius: 999px;
  background: var(--line-strong);
}
.stepper__step.is-done { color: var(--text); }
.stepper__step.is-done .stepper__dot { background: var(--ok); }
.stepper__step.is-current {
  color: var(--text); font-weight: 700;
  border-color: var(--gold-1); background: var(--surface-2);
}
.stepper__step.is-current .stepper__dot { background: var(--gold-1); }

/* ---------- badges ---------------------------------------------------- */
.badge {
  display: inline-block; padding: .1rem .5rem; border-radius: 6px;
  font-size: .72rem; font-weight: 700; letter-spacing: .02em;
  border: 1px solid var(--line-strong); color: var(--text);
}
.badge--local    { background: rgba(201, 162, 75, .16); border-color: var(--gold-1); }
.badge--national { background: rgba(204, 50, 50, .16); border-color: var(--red-1); }
.badge--stock    { background: rgba(109, 211, 155, .14); border-color: rgba(109, 211, 155, .4); }
.badge--low      { background: rgba(227, 180, 87, .16); border-color: var(--warn); }
.badge--zero     { background: var(--err-bg); border-color: var(--err); color: var(--err); }

/* ---------- tabs (CO1 §10, §11) --------------------------------------- */
.tabs {
  display: flex; flex-wrap: wrap; gap: .3rem;
  border-block-end: 1px solid var(--line); margin-bottom: 1.25rem;
}
.tabs__t {
  padding: .55rem .85rem; font-size: .87rem; font-weight: 600;
  text-decoration: none; color: var(--muted);
  border: 1px solid transparent; border-block-end: 0;
  border-radius: var(--radius) var(--radius) 0 0;
  margin-block-end: -1px;
}
.tabs__t:hover { color: var(--text); }
.tabs__t.is-active {
  color: var(--text); background: var(--surface);
  border-color: var(--line); border-block-end-color: var(--surface);
}

/* ---------- products grid (CO1 §9) ------------------------------------ */
.catgroup { margin-bottom: 2rem; }
.catgroup__head {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 1rem; flex-wrap: wrap;
  border-block-end: 1px solid var(--line); padding-block-end: .5rem; margin-bottom: 1rem;
}
.catgroup__head h2 { font-size: 1.05rem; margin: 0; display: flex; align-items: center; gap: .5rem; }
.catgroup__actions { display: flex; gap: .75rem; align-items: center; }
.catgroup__actions form { display: inline; }

.pgrid {
  display: grid; gap: 1rem;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  align-items: stretch;
}

.pcard {
  display: flex; flex-direction: column;
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--radius); overflow: hidden;
}
.pcard--off { opacity: .55; }
.pcard__media { display: block; aspect-ratio: 1; overflow: hidden; background: var(--surface-2); }
.pcard__img { width: 100%; height: 100%; object-fit: cover; }
.pcard__body { padding: .7rem .75rem; display: flex; flex-direction: column; gap: .35rem; }
.pcard__name { font-size: .92rem; margin: 0; }
.pcard__name a { text-decoration: none; }
.pcard__name a:hover { text-decoration: underline; }
.pcard__price { font-weight: 700; margin: 0; }
.pcard__actions { display: flex; flex-wrap: wrap; gap: .6rem; align-items: center; margin-block-start: .25rem; }
.pcard__actions form { display: inline; }

/* Stock badge; <details> so the per-variant numbers open on a phone too. */
.pcard__stock summary {
  cursor: pointer; list-style: none;
  display: flex; align-items: center; gap: .4rem; flex-wrap: wrap;
  font-size: .78rem;
}
.pcard__stock summary::-webkit-details-marker { display: none; }
.minitable { font-size: .76rem; margin-block-start: .5rem; }
.minitable th, .minitable td { padding: .2rem .3rem; border-block-end: 1px solid var(--line); text-align: start; }
.addstock { display: flex; gap: .25rem; align-items: center; }
.addstock__n { width: 3.2rem; padding: .1rem .25rem; background: var(--surface-2); color: var(--text); border: 1px solid var(--line); border-radius: 4px; }

/* The dotted "+" card after the last product, and the "+" row under the
   last category. Both are <button>s: they open a popup, they do not
   navigate, and a link that does not navigate is a lie to the keyboard. */
.pcard--add, .catadd {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: .4rem; min-height: 180px; padding: 1rem;
  background: transparent; color: var(--muted);
  border: 2px dashed var(--line-strong); border-radius: var(--radius);
  cursor: pointer; font: inherit; text-align: center;
  transition: border-color .15s, color .15s, background-color .15s;
}
.pcard--add:hover, .catadd:hover {
  border-color: var(--gold-1); color: var(--text); background: var(--surface);
}
.catadd { flex-direction: row; min-height: 0; width: 100%; margin-block: .5rem 2rem; }
/* --gold-1 is the border/accent gold and is theme-independent; as TEXT on
   a light page it is 2.3:1. --gold-2 is the gold that is guaranteed
   readable on the ground in whichever theme is active. */
.pcard__plus { font-size: 1.8rem; line-height: 1; color: var(--gold-2); }
.pcard__addl { font-size: .84rem; }

/* ---------- modal (CO1 §4, §9) ---------------------------------------- */
.modal {
  position: fixed; inset: 0; z-index: 80;
  display: grid; place-items: center; padding: 1rem;
  background: rgba(0, 0, 0, .6);
  overflow-y: auto;
}
.modal__box {
  width: min(100%, 640px); max-height: 90vh; overflow-y: auto;
  background: var(--surface); border: 1px solid var(--line-strong);
  border-radius: var(--radius-lg); box-shadow: var(--shadow-2);
}
.modal__head {
  display: flex; align-items: center; justify-content: space-between; gap: 1rem;
  padding: 1rem 1.25rem; border-block-end: 1px solid var(--line);
  position: sticky; top: 0; background: var(--surface);
}
.modal__head h2 { margin: 0; font-size: 1.05rem; }
.modal__close {
  background: none; border: 0; cursor: pointer; color: var(--muted);
  font-size: 1.6rem; line-height: 1; padding: 0 .25rem;
}
.modal__close:hover { color: var(--text); }
.modal__body { padding: 1.25rem; background: transparent; border: 0; }
.modal__foot {
  display: flex; gap: .75rem; justify-content: flex-end; flex-wrap: wrap;
  border-block-start: 1px solid var(--line); padding-block-start: 1rem; margin-block-start: 1rem;
}

.field3 { display: grid; gap: .75rem; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); }
.grid3 { display: grid; gap: .75rem; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); }
.checkrow { display: flex; flex-wrap: wrap; gap: .5rem .9rem; align-items: center; }
.check { display: inline-flex; align-items: center; gap: .35rem; font-size: .88rem; }
.field__input--inline { width: auto; min-width: 180px; }
.field__input--n { width: 5rem; }
.field__input--big { font-size: 1.3rem; font-weight: 700; }

/* Size x colour grid, built by site.js from the checkboxes above it. */
.stockgrid { margin-block: 1rem; overflow-x: auto; }
.table--grid { min-width: 0; font-size: .82rem; }
.table--grid th { text-align: center; font-weight: 700; color: var(--text); }
.table--grid td { padding: .25rem; }
.table--grid .field__input--n { width: 4.2rem; }

/* ---------- money (CO1 §5, §10, §12) ---------------------------------- */
.moneyrow { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); }
.moneycard { background: var(--surface-2); border: 1px solid var(--line); border-radius: var(--radius); padding: 1rem; }
.moneycard__l { font-size: .8rem; color: var(--muted); margin: 0 0 .2rem; }
.moneycard__n { font-family: var(--font-display); font-size: 1.6rem; margin: 0 0 .5rem; }
.moneycard__d > div { display: flex; justify-content: space-between; gap: .5rem; font-size: .82rem; padding-block: .12rem; }
.moneycard__d dt { color: var(--muted); }
.moneycard__d dd { margin: 0; }

.stats--money .stat__sub { font-size: .74rem; color: var(--muted); margin: .2rem 0 0; }
.stat--flag { border-color: var(--gold-1); }

/* The two buckets that are NOT income. Kept visually apart from the
   figures above them so the standby total is never read as takings. */
.buckets { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); margin-block: 1rem; }
.bucket {
  border: 1px dashed var(--line-strong); border-radius: var(--radius);
  padding: .9rem 1rem; background: transparent;
}
.bucket--standby { border-color: var(--gold-1); }
.bucket__l { font-size: .8rem; color: var(--muted); margin: 0 0 .2rem; }
.bucket__n { font-family: var(--font-display); font-size: 1.35rem; margin: 0; }
.bucket__sub { font-size: .78rem; color: var(--muted); margin: .2rem 0 0; }
.panel--aside { border-style: dashed; }

/* ---------- daily log (CO1 §10) --------------------------------------- */
.daynav { display: flex; gap: .75rem; align-items: center; flex-wrap: wrap; margin-bottom: 1rem; }
.daynav__pick { display: flex; gap: .5rem; }
.daynav__pick .field__input { width: auto; }
.daygrid { display: grid; gap: 1.25rem; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); align-items: start; }
.deflist--money dd { text-align: end; font-variant-numeric: tabular-nums; }
.deflist .strong dt, .deflist .strong dd { font-weight: 700; color: var(--text); }

.diff {
  display: flex; align-items: baseline; gap: .75rem; flex-wrap: wrap;
  border: 1px solid var(--line); border-radius: var(--radius);
  padding: .75rem 1rem; margin-block: 1rem; background: var(--surface-2);
}
.diff__l { font-size: .8rem; color: var(--muted); }
.diff__n { font-family: var(--font-display); font-size: 1.5rem; }
.diff__h { font-size: .8rem; color: var(--muted); }
.diff--ok    { border-color: rgba(109, 211, 155, .4); }
.diff--short { border-color: var(--err); }
.diff--over  { border-color: var(--warn); }

.is-negative { color: var(--err); }
.is-positive { color: var(--warn); }
.hint--warn { color: var(--warn); }

/* ---------- accounts (CO1 §7) ----------------------------------------- */
.tempcred {
  display: flex; gap: 1rem; align-items: baseline; flex-wrap: wrap;
  font-size: 1.1rem; margin-block: .5rem;
}
.tempcred__u { font-weight: 700; }
.tempcred__p {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 1.25rem; letter-spacing: .06em;
  background: var(--surface-2); border: 1px solid var(--gold-1);
  border-radius: 6px; padding: .3rem .7rem;
}
.inlineform { display: inline-flex; gap: .4rem; align-items: center; margin-inline-end: .75rem; }
tr.is-off td { opacity: .6; }

/* ---------- logs (CO1 §11) -------------------------------------------- */
.timeline--log { display: grid; gap: .3rem; }
.timeline--log li {
  display: grid; gap: .5rem; align-items: baseline;
  grid-template-columns: minmax(140px, auto) 1fr auto;
  font-size: .84rem; padding-block: .3rem;
  border-block-end: 1px solid var(--line);
}
.timeline__when { color: var(--muted); }
.timeline__who { color: var(--muted); font-size: .78rem; }
.row--internal td, .row--internal th { color: var(--muted); font-style: italic; }

/* ---------- reminders (CO1 §4) ---------------------------------------- */
.remindlist { display: grid; gap: .5rem; }
.remindlist li {
  display: flex; justify-content: space-between; gap: 1rem; flex-wrap: wrap;
  border: 1px solid var(--line); border-radius: var(--radius);
  padding: .5rem .75rem; background: var(--surface-2);
}
.remindlist__t { font-weight: 700; text-decoration: none; }
.remindlist__t:hover { text-decoration: underline; }
.remindlist__m { font-size: .8rem; color: var(--muted); }

/* ---------- order actions (CO1 §3) ------------------------------------ */
.actions { display: grid; gap: .75rem; }
.actionform {
  display: flex; gap: .6rem; align-items: flex-end; flex-wrap: wrap;
  border: 1px solid var(--line); border-radius: var(--radius); padding: .75rem;
}
.actionform .field { margin: 0; }
.actionform .field__input { width: auto; }
.actionform .hint { flex-basis: 100%; margin: 0; }

/* ---------- single-purpose admin pages -------------------------------- */
.adm--single { display: grid; place-items: center; min-height: 100vh; background: var(--band); }
.adm__role { font-size: .72rem; color: var(--gold-on-band); }
.authbox__out { margin-block-start: 1.5rem; }
.filters--print { justify-content: flex-start; }

/* ---------- printable receipt (CO1 §6) -------------------------------
   Two layouts, one template: <body class="print print--a4"> or
   "print--roll", chosen by ?format= on the receipt route.

   The receipt is the one document that stays LIGHT. The site is dark
   (§1), and printing a dark page either produces a black rectangle or,
   with backgrounds off, light grey text on white. Both are unusable on
   the counter, so this block re-declares the tokens for its own subtree
   rather than inheriting the page's.
   ------------------------------------------------------------------- */
.print {
  color-scheme: light;
  --paper: #FFFFFF;
  --surface: #FFFFFF;
  --surface-2: #F6F2EC;
  --text: #191310;
  --muted: #5C534C;
  --muted-2: #857B72;
  --line: #D8D0C6;
  --line-strong: #B9AFA3;

  background: #FFFFFF;
  color: var(--text);
}

.slip { width: min(100% - 2rem, 800px); margin-inline: auto; padding-block: 1.5rem; }
.slip__head { display: flex; justify-content: space-between; gap: 1rem; border-block-end: 3px solid var(--red-1); padding-block-end: .75rem; }
.slip__brandbox { display: flex; align-items: center; gap: .75rem; }
.slip__crest { width: 48px; height: 48px; flex: none; }
.slip__brand { font-family: var(--font-display); text-transform: uppercase; font-size: 1.4rem; margin: 0; }
.slip__sub { font-size: .82rem; color: var(--muted); margin: 0; }
.slip__ticket { text-align: end; }
.slip__ticketn { font-family: var(--font-display); font-size: 1.5rem; margin: 0; }
.slip__date { font-size: .82rem; color: var(--muted); margin: 0; }
.slip__type {
  display: inline-block; margin: .25rem 0 0; padding: .05rem .5rem;
  border: 1px solid var(--line-strong); border-radius: 5px;
  font-size: .74rem; font-weight: 700; text-transform: uppercase;
}
.slip__client { margin-block: 1.25rem; }
.slip__client h2 { font-size: .8rem; text-transform: uppercase; letter-spacing: .08em; color: var(--muted); }
.slip__client p { margin: 0 0 .15rem; }
.slip__phone { font-size: 1.5rem; font-weight: 700; margin: 0; }
.slip__note { border-inline-start: 3px solid var(--gold-1); padding-inline-start: .7rem; margin-block-start: .5rem; }
.slip__table { font-size: .9rem; margin-block: 1rem; }
.slip__table th, .slip__table td { text-align: start; padding: .45rem .5rem; border-block-end: 1px solid var(--line); }
.slip__table tfoot th { border-block-end: 0; border-block-start: 2px solid var(--text); }
.slip__table--internal { font-size: .84rem; max-width: 320px; margin-inline-start: auto; }
.slip__table--internal td, .slip__table--internal th { text-align: end; }
.slip__table--internal td:first-child, .slip__table--internal th:first-child { text-align: start; color: var(--muted); }

/* Two signature boxes, Vendeur and Livreur (CO1 §6 and the §15 snippet). */
.slip__signs { display: flex; gap: 1.5rem; margin-block-start: 2rem; }
.slip__sign { flex: 1; }
.slip__signl { font-size: .78rem; text-transform: uppercase; letter-spacing: .08em; color: var(--muted); margin: 0 0 .25rem; }
.slip__signbox { height: 64px; border: 1px solid var(--line-strong); border-radius: 4px; margin: 0; }
.slip__signd { font-size: .74rem; color: var(--muted); margin: .3rem 0 0; }
.slip__foot { font-size: .82rem; color: var(--muted); border-block-start: 1px solid var(--line); padding-block-start: .75rem; margin-block-start: 1.5rem; }
.slip__small { font-size: .72rem; color: var(--muted-2); margin: .2rem 0 0; }

/* 80 mm roll. Narrow, single column, signature boxes stacked — two boxes
   side by side on 72 mm of printable width leaves nothing to sign on. */
.print--roll .slip { width: 72mm; padding: 2mm 0; font-size: 11px; }
.print--roll .slip__head { flex-direction: column; gap: .3rem; text-align: center; }
.print--roll .slip__brandbox { justify-content: center; }
.print--roll .slip__crest { width: 32px; height: 32px; }
.print--roll .slip__brand { font-size: 1.05rem; }
.print--roll .slip__ticket { text-align: center; }
.print--roll .slip__ticketn { font-size: 1.15rem; }
.print--roll .slip__phone { font-size: 1.1rem; }
.print--roll .slip__table { font-size: 11px; }
.print--roll .slip__table th, .print--roll .slip__table td { padding: .2rem .15rem; }
.print--roll .slip__signs { flex-direction: column; gap: .75rem; }
.print--roll .slip__signbox { height: 40px; }

@media print {
  .hdr, .ftr, .mini, .toast, .adm__top, .skip, .tabs, .filters, .modal { display: none !important; }
  body { background: #FFFFFF; color: #191310; }
  .slip { width: 100%; padding: 0; }
  a[href]::after { content: ""; }

  /* The admin screens §10 and §11 call "printable" are ordinary pages;
     they just need to lose their furniture and their dark ground. */
  .adm__main { padding: 0; }
  .panel, .stat, .moneycard, .modal__box {
    background: #FFFFFF !important; color: #191310 !important;
    border-color: #CCC !important; box-shadow: none !important;
  }
  .table th, .table td { border-color: #CCC !important; }
  .muted, .hint, .stat__l { color: #555 !important; }

  /* A4 is the default page. The 80 mm roll needs a different @page size,
     and @page cannot be conditioned on a class — nor can the receipt carry
     an inline <style>, since the CSP is style-src 'self'. So the roll
     format links one extra stylesheet, print-80mm.css, which holds
     nothing but that rule. */
  @page { size: A4; margin: 12mm; }
}
