/* ============================================================================
   PINLANE DESIGN SYSTEM v2 : « Precision Tooling »
   Fichier cœur : fonts, tokens light/dark, reset, base, composants canoniques.
   Source de vérité : DESIGN.md. Aucune couleur en dur hors de ce fichier.
   Architecture : pinlane.css → pinlane-staff.css / pinlane-client.css /
   pinlane-landing.css. Aucune autre feuille autorisée.
   ========================================================================== */

/* ----------------------------------------------------------------------------
   1. FONTS : Geist + Geist Mono, variables, self-hosted
   -------------------------------------------------------------------------- */
@font-face {
  font-family: 'Geist';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('./fonts/geist-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Geist';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('./fonts/geist-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Geist Mono';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('./fonts/geist-mono-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Geist Mono';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('./fonts/geist-mono-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* ----------------------------------------------------------------------------
   2. TOKENS : light (référence) puis dark. `data-theme` posé sur <html>
   avant paint par le snippet inline de chaque page.
   -------------------------------------------------------------------------- */
:root {
  /* Neutres */
  --page: #fafafa;
  --surface: #ffffff;
  --raised: #ffffff;
  --subtle: #f2f2f2;
  --line: #ebebeb;
  --line-strong: #d9d9d9;
  --text: #0a0a0a;
  --muted: #666666;
  --faint: #6f6f6f; /* AA : 5.0:1 sur --surface, 4.5:1 sur --subtle */

  /* Accent (unique) */
  --accent: #0070f3;
  --accent-strong: #0761d1; /* texte accent sur fond clair/-soft : AA (5.0:1+) */
  --accent-soft: #e8f1fd;
  --accent-contrast: #ffffff;

  /* Statuts : fond -soft + texte plein, contraste AA garanti */
  --success: #0f7b3c;
  --success-soft: #e6f4ea;
  --warning: #a35200;
  --warning-soft: #fff3e0;
  --danger: #cb2a2f;
  --danger-soft: #fdecec;
  --info: #0070f3;
  --info-soft: #e8f1fd;
  --info-strong: var(--accent-strong);

  /* Tenant (Fun Galaxy : logo seulement, accent = système) */
  --tenant-accent: var(--accent);
  --tenant-accent-soft: var(--accent-soft);

  /* Data-viz catégoriel : ordre fixe, palette validée CVD+contraste (light) */
  --chart-1: #0070f3;
  --chart-2: #0d9488;
  --chart-3: #c2410c;

  /* Typo */
  --font-ui: 'Geist', system-ui, -apple-system, 'Segoe UI', sans-serif;
  --font-data: 'Geist Mono', ui-monospace, 'Cascadia Mono', Consolas, monospace;

  /* Forme */
  --radius-sm: 6px;
  --radius-md: 8px;
  --radius-lg: 12px;
  --radius-xl: 16px; /* containers (cards majeures), échelle Astryx */
  --radius-full: 9999px;

  /* Contrôles : échelle de hauteur unique (Astryx : sm/md/lg partagés par
     boutons, inputs, tabs). Adoption progressive. */
  --h-sm: 28px;
  --h-md: 32px;
  --h-lg: 36px;

  /* États en VOILE (Astryx) : un overlay semi-transparent par-dessus le fond,
     identique pour toutes les variantes : pas de recoloration par thème. */
  --overlay-hover: rgba(0, 0, 0, 0.05);
  --overlay-pressed: rgba(0, 0, 0, 0.1);

  /* Espacement (grille 4px) */
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-5: 20px;
  --space-6: 24px;
  --space-8: 32px;
  --space-10: 40px;

  /* Profondeur : bordure d'abord, ombre = surfaces flottantes uniquement */
  --shadow-border: 0 0 0 1px var(--line);
  --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
  --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08);
  --shadow-overlay: 0 8px 30px rgba(0, 0, 0, 0.12);
  --backdrop: rgba(0, 0, 0, 0.4);

  /* Motion */
  --ease: cubic-bezier(0.25, 0.1, 0.25, 1);
  --dur-fast: 120ms;
  --dur: 160ms;
  --dur-slow: 200ms;
  /* Extension du meme systeme (pas un systeme parallele) : les courbes CSS
     natives sont trop molles pour de l'interface, elles font trainer la fin du
     mouvement. Deux courbes fortes suffisent a tout couvrir.
     --ease-out-strong  : entrees et retours d'action. Jamais d'ease-in sur de
       l'interface : ca demarre lentement au moment precis ou l'oeil regarde.
     --ease-in-out-strong : deplacement d'un point A a un point B (indicateur
       qui glisse d'un segment a l'autre).
     Durees : --dur-press pour ce qui se presse (vu des dizaines de fois par
     jour), --dur-enter pour une surface vue occasionnellement, --dur-exit
     TOUJOURS plus court que --dur-enter : a l'entree on decouvre, a la sortie
     on a deja decide. */
  --ease-out-strong: cubic-bezier(0.23, 1, 0.32, 1);
  --ease-in-out-strong: cubic-bezier(0.77, 0, 0.175, 1);
  --dur-press: 160ms;
  --dur-move: 180ms;
  --dur-enter: 240ms;
  --dur-exit: 150ms;

  /* Layout */
  --sidebar-w: 248px;
  --sidebar-w-collapsed: 64px;
  --topbar-h: 56px;

  color-scheme: light;
}

[data-theme='dark'] {
  --page: #000000;
  --surface: #0a0a0a;
  --raised: #111111;
  --subtle: #1a1a1a;
  --line: #262626;
  --line-strong: #3d3d3d;
  --text: #ededed;
  --muted: #a1a1a1;
  --faint: #828282; /* AA : 4.6:1 sur --subtle #1a1a1a */

  --accent: #3291ff;
  --accent-strong: #52a8ff;
  --accent-soft: #0d2137;
  /* #3291ff est trop clair pour du texte blanc (3.17:1), texte sombre = 6.2:1 */
  --accent-contrast: #0a0a0a;

  --success: #3dd68c;
  --success-soft: #0e2517;
  --warning: #f5a623;
  --warning-soft: #2a1e05;
  --danger: #f75555;
  --danger-soft: #2c1213;
  --info: #3291ff;
  --info-soft: #0d2137;
  --info-strong: var(--accent-strong);

  /* Data-viz : steps recalés pour surface sombre (validés L 0.48-0.67) */
  --chart-1: #3291ff;
  --chart-2: #0d9488;
  --chart-3: #ea580c;

  --shadow-border: 0 0 0 1px var(--line);
  --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4);
  /* Rim-light Astryx : en dark, les surfaces flottantes se détachent par un
     liseré blanc translucide interne, pas seulement par l'ombre. */
  --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.5), inset 0 0 0 1px rgba(255, 255, 255, 0.08);
  --shadow-overlay: 0 8px 30px rgba(0, 0, 0, 0.6), inset 0 0 0 1px rgba(255, 255, 255, 0.1);
  --backdrop: rgba(0, 0, 0, 0.6);

  /* Voiles d'état en dark = blancs (Astryx) */
  --overlay-hover: rgba(255, 255, 255, 0.06);
  --overlay-pressed: rgba(255, 255, 255, 0.12);

  color-scheme: dark;
}

/* ----------------------------------------------------------------------------
   3. RESET + BASE
   -------------------------------------------------------------------------- */
*,
*::before,
*::after {
  box-sizing: border-box;
}

html {
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
}

body {
  margin: 0;
  background: var(--page);
  color: var(--text);
  font-family: var(--font-ui);
  font-size: 14px;
  font-weight: 400;
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

h1, h2, h3, h4, h5, h6 {
  margin: 0;
  font-weight: 600;
  line-height: 1.2;
  letter-spacing: -0.02em;
  color: var(--text);
}

h1 { font-size: 24px; }
h2 { font-size: 20px; }
h3 { font-size: 16px; }
h4, h5, h6 { font-size: 14px; }

p {
  margin: 0;
}

a {
  color: var(--accent);
  text-decoration: none;
}

a:hover {
  text-decoration: underline;
}

img, svg, canvas {
  max-width: 100%;
  display: block;
}

hr {
  border: 0;
  border-top: 1px solid var(--line);
  margin: var(--space-4) 0;
}

code, kbd, samp, pre {
  font-family: var(--font-data);
  font-size: 0.92em;
}

::selection {
  background: var(--accent-soft);
  color: var(--text);
}

/* Scrollbars discrètes */
* {
  scrollbar-width: thin;
  scrollbar-color: var(--line-strong) transparent;
}
*::-webkit-scrollbar {
  width: 8px;
  height: 8px;
}
*::-webkit-scrollbar-thumb {
  background: var(--line-strong);
  border-radius: var(--radius-full);
}
*::-webkit-scrollbar-track {
  background: transparent;
}

/* Focus visible : tout élément interactif, les deux thèmes */
:focus {
  outline: none;
}
:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
  border-radius: var(--radius-sm);
}

/* Data = mono + chiffres tabulaires */
.mono,
.num {
  font-family: var(--font-data);
  font-variant-numeric: tabular-nums;
}

/* Utilitaire d'état partagé : le JS legacy (app-main.js) toggle `.hidden`
   sur les vues, steps et blocs. Les couches page ne doivent jamais poser de
   `display` avec une spécificité supérieure sur un élément togglé. */
.hidden {
  display: none;
}

.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* ----------------------------------------------------------------------------
   4. BOUTONS : recettes canoniques (§6 DESIGN.md)
   Primaire = inversion (noir sur blanc / blanc sur noir), signature du système.
   -------------------------------------------------------------------------- */
/* NB : pas de `button.btn`, la spécificité (0,1,1) écraserait
   `.btn-primary`/`.btn-secondary` (0,1,0) sur les <button>. */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  height: 40px;
  padding: 0 14px;
  border: 1px solid transparent;
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--text);
  font-family: var(--font-ui);
  font-size: 14px;
  font-weight: 500;
  line-height: 1;
  cursor: pointer;
  user-select: none;
  white-space: nowrap;
  transition: background-color var(--dur) var(--ease), border-color var(--dur) var(--ease), color var(--dur) var(--ease), opacity var(--dur) var(--ease);
}

.btn:disabled,
.btn[aria-disabled='true'] {
  opacity: 0.5;
  cursor: not-allowed;
  pointer-events: none;
}

.btn-primary {
  background: var(--text);
  border-color: var(--text);
  color: var(--surface);
}
.btn-primary:hover {
  opacity: 0.88;
}

.btn-secondary {
  background: var(--surface);
  border-color: var(--line-strong);
  color: var(--text);
}
.btn-secondary:hover {
  background: var(--subtle);
}

.btn-accent {
  background: var(--accent);
  border-color: var(--accent);
  color: var(--accent-contrast);
}
.btn-accent:hover {
  background: var(--accent-strong);
  border-color: var(--accent-strong);
}

.btn-danger {
  background: var(--danger);
  border-color: var(--danger);
  color: #ffffff;
}
.btn-danger:hover {
  opacity: 0.88;
}

.btn-ghost {
  color: var(--muted);
}
.btn-ghost:hover {
  background: var(--subtle);
  color: var(--text);
}

.btn-sm {
  height: 32px;
  padding: 0 10px;
  font-size: 13px;
}

.btn-lg {
  height: 48px;
  padding: 0 20px;
  font-size: 15px;
}

/* ----------------------------------------------------------------------------
   5. FORMULAIRES
   -------------------------------------------------------------------------- */
.field {
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.field-label,
label {
  font-size: 13px;
  font-weight: 500;
  color: var(--text);
}

.field-hint {
  font-size: 12px;
  color: var(--muted);
}

.input,
input[type='text'],
input[type='email'],
input[type='tel'],
input[type='number'],
input[type='date'],
input[type='time'],
input[type='month'],
input[type='password'],
input[type='search'],
select,
textarea {
  width: 100%;
  height: 40px;
  padding: 0 12px;
  border: 1px solid var(--line-strong);
  border-radius: var(--radius-sm);
  background: var(--surface);
  color: var(--text);
  font-family: var(--font-ui);
  font-size: 14px;
  transition: border-color var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}

textarea {
  height: auto;
  min-height: 88px;
  padding: 10px 12px;
  line-height: 1.5;
  resize: vertical;
}

input::placeholder,
textarea::placeholder {
  color: var(--faint);
}

input:hover,
select:hover,
textarea:hover {
  border-color: var(--faint);
}

input:focus,
input:focus-visible,
select:focus,
select:focus-visible,
textarea:focus,
textarea:focus-visible {
  outline: none;
  border-color: var(--accent);
  box-shadow: 0 0 0 3px var(--accent-soft);
}

.field-error input,
input[aria-invalid='true'],
select[aria-invalid='true'],
textarea[aria-invalid='true'] {
  border-color: var(--danger);
}

.field-error-message {
  font-size: 12px;
  color: var(--danger);
}

input[type='checkbox'],
input[type='radio'] {
  width: 16px;
  height: 16px;
  accent-color: var(--accent);
}

/* ----------------------------------------------------------------------------
   6. CARTES + SURFACES
   -------------------------------------------------------------------------- */
.card {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  padding: var(--space-5);
}

.card-title {
  font-size: 16px;
  font-weight: 600;
  letter-spacing: -0.01em;
}

.card-meta {
  font-size: 12px;
  color: var(--muted);
}

/* Surface flottante (menus, popovers, palette), seule à porter une ombre */
.popover,
.menu-surface {
  background: var(--raised);
  border: 1px solid var(--line);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-overlay);
}

/* ----------------------------------------------------------------------------
   7. TABLES + LISTES DENSES
   -------------------------------------------------------------------------- */
.table,
table.pl-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 13px;
}

.table th,
table.pl-table th {
  padding: 8px 12px;
  text-align: left;
  font-size: 12px;
  font-weight: 500;
  color: var(--muted);
  border-bottom: 1px solid var(--line);
}

.table td,
table.pl-table td {
  padding: 10px 12px;
  border-bottom: 1px solid var(--line);
  color: var(--text);
}

.table tbody tr:hover,
table.pl-table tbody tr:hover {
  background: var(--subtle);
}

.table .is-num,
.table td.num,
.table th.num {
  font-family: var(--font-data);
  font-variant-numeric: tabular-nums;
  text-align: right;
}

/* ----------------------------------------------------------------------------
   8. BADGES DE STATUT : pill, fond -soft + texte plein + libellé toujours
   -------------------------------------------------------------------------- */
.badge {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 2px 10px;
  border-radius: var(--radius-full);
  font-size: 12px;
  font-weight: 500;
  line-height: 1.6;
  white-space: nowrap;
}

.badge::before {
  content: '';
  width: 6px;
  height: 6px;
  border-radius: var(--radius-full);
  background: currentColor;
  flex: none;
}

.badge-neutral {
  background: var(--subtle);
  color: var(--muted);
}

.badge-success {
  background: var(--success-soft);
  color: var(--success);
}

.badge-warning {
  background: var(--warning-soft);
  color: var(--warning);
}

.badge-danger {
  background: var(--danger-soft);
  color: var(--danger);
}

.badge-info,
.badge-accent {
  background: var(--info-soft);
  color: var(--info);
}

.badge-plain::before {
  display: none;
}

/* ----------------------------------------------------------------------------
   9. NAVIGATION : recettes (implémentées sur les sélecteurs legacy en couche
   staff/client)
   -------------------------------------------------------------------------- */
.nav-item {
  display: flex;
  align-items: center;
  gap: 10px;
  min-height: 36px;
  padding: 0 12px;
  border-radius: var(--radius-md);
  color: var(--muted);
  font-size: 14px;
  font-weight: 500;
  cursor: pointer;
  position: relative;
  transition: background-color var(--dur) var(--ease), color var(--dur) var(--ease);
}

.nav-item:hover {
  background: var(--subtle);
  color: var(--text);
}

.nav-item.active,
.nav-item[aria-current='page'] {
  background: var(--subtle);
  color: var(--text);
}

.nav-item.active::before,
.nav-item[aria-current='page']::before {
  content: '';
  position: absolute;
  left: -8px;
  top: 8px;
  bottom: 8px;
  width: 2px;
  border-radius: var(--radius-full);
  background: var(--accent);
}

/* Segmented control (pills de filtres, onglets ressource) */
.seg {
  display: inline-flex;
  padding: 3px;
  gap: 2px;
  background: var(--subtle);
  border-radius: var(--radius-md);
}

.seg-item {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 30px;
  padding: 0 12px;
  border: 0;
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--muted);
  font-family: var(--font-ui);
  font-size: 13px;
  font-weight: 500;
  cursor: pointer;
  transition: background-color var(--dur) var(--ease), color var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}

.seg-item:hover {
  color: var(--text);
}

.seg-item.active,
.seg-item[aria-selected='true'] {
  background: var(--surface);
  color: var(--text);
  box-shadow: var(--shadow-sm), 0 0 0 1px var(--line);
}

/* ----------------------------------------------------------------------------
   10. OVERLAYS : modales, toasts, kbd
   -------------------------------------------------------------------------- */
.overlay-backdrop {
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.4);
  z-index: 100;
}

[data-theme='dark'] .overlay-backdrop {
  background: rgba(0, 0, 0, 0.6);
}

.modal-surface {
  background: var(--raised);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-overlay);
}

.toast-surface {
  background: var(--text);
  color: var(--surface);
  border-radius: var(--radius-md);
  padding: 10px 14px;
  font-size: 13px;
  font-weight: 500;
  box-shadow: var(--shadow-overlay);
}

kbd, .kbd {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 20px;
  height: 20px;
  padding: 0 5px;
  border: 1px solid var(--line-strong);
  border-bottom-width: 2px;
  border-radius: 5px;
  background: var(--surface);
  color: var(--muted);
  font-family: var(--font-data);
  font-size: 11px;
}

/* ----------------------------------------------------------------------------
   11. EMPTY STATES + SKELETONS
   -------------------------------------------------------------------------- */
.empty-state {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  padding: var(--space-10) var(--space-6);
  text-align: center;
}

.empty-state-title {
  font-size: 14px;
  font-weight: 500;
  color: var(--text);
}

.empty-state-text {
  font-size: 13px;
  color: var(--muted);
  max-width: 360px;
}

.skeleton {
  background: var(--subtle);
  border-radius: var(--radius-sm);
  animation: pl-skeleton 1.4s var(--ease) infinite;
}

@keyframes pl-skeleton {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.55; }
}

/* Entrée de page : une fois par navigation, jamais sur le poll */
@keyframes pl-enter {
  from {
    opacity: 0;
    transform: translateY(8px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.pl-enter {
  animation: pl-enter var(--dur-slow) var(--ease) both;
}

/* ----------------------------------------------------------------------------
   11b. COMPOSANTS PARTAGÉS CLIENT ↔ STAFF : une seule définition (DESIGN.md §8)
   Consommés par le parcours client (index/public-form) et les surfaces staff
   (quick-book, fiches demandes sur mesure). Ne pas re-définir dans les couches.
   -------------------------------------------------------------------------- */

/* Alternatives de créneaux proposées (la variante d'alerte reste côté client) */
.booking-alt-head {
  display: flex;
  align-items: flex-start;
  gap: var(--space-2);
  color: var(--danger);
  font-weight: 500;
}

.booking-alt-list {
  display: grid;
  gap: var(--space-2);
  margin-top: var(--space-3);
}

.booking-alt-option {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 2px;
  min-height: 44px;
  padding: 10px 12px;
  border: 1px solid var(--line-strong);
  border-radius: var(--radius-sm);
  background: var(--surface);
  color: var(--text);
  font-family: var(--font-ui);
  font-size: 13px;
  font-weight: 500;
  text-align: left;
  cursor: pointer;
  transition: background-color var(--dur) var(--ease), border-color var(--dur) var(--ease);
}

.booking-alt-option:hover { background: var(--subtle); }

.booking-alt-option small {
  font-size: 12px;
  font-weight: 400;
  color: var(--muted);
}

/* Indication d'horaires (étape date client + modale quick-book staff) */
.schedule-hint {
  margin-top: 6px;
  font-size: 12px;
}

.schedule-hint .open { color: var(--success); font-weight: 500; }
.schedule-hint .closed { color: var(--danger); font-weight: 500; }

/* Contexte vacances/férié à côté de « Ouvert 10h - 22h » */
.schedule-hint .sched-holiday {
  margin-left: var(--space-2);
  padding: 1px 8px;
  border: 1px solid var(--line-strong);
  border-radius: var(--radius-full);
  background: var(--subtle);
  color: var(--muted);
  font-size: 11px;
  font-weight: 500;
}

/* Encart informatif d'étape */
.info-box {
  display: flex;
  align-items: flex-start;
  gap: var(--space-2);
  padding: 12px 14px;
  border-radius: var(--radius-md);
  background: var(--info-soft);
  color: var(--text);
  font-size: 13px;
  line-height: 1.5;
}

.info-box svg {
  color: var(--info);
  margin-top: 1px;
}

/* Rangée d'actions « demande sur mesure » (modale client + fiche staff) */
.cr-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  align-items: center;
  margin-top: 18px;
}

.cr-actions .btn-secondary { flex: 0 0 auto; }
.cr-actions .btn-primary { flex: 1 1 auto; }

.cr-actions button {
  min-height: 36px;
  padding: 0 12px;
  border: 1px solid var(--border);
  border-radius: 9px;
  background: var(--card);
  color: var(--text);
  font-size: 12.5px;
  font-weight: 600;
  cursor: pointer;
  transition: border-color 0.15s ease, background-color 0.15s ease;
}

.cr-actions button:hover { border-color: var(--border-hover); }
.cr-actions button.success { border-color: var(--success); color: var(--success); }
.cr-actions button.ghost { color: var(--text-2); }

/* Animations d'entrée / erreur partagées, référencées par le markup */
@keyframes pl-scale-in { from { opacity: 0; transform: scale(0.97); } to { opacity: 1; transform: scale(1); } }
.scale-in { animation: pl-scale-in var(--dur-slow) var(--ease) both; }
@keyframes pl-shake { 0%, 100% { transform: translateX(0); } 25% { transform: translateX(-4px); } 75% { transform: translateX(4px); } }
.shake { animation: pl-shake 160ms var(--ease) 2; }

/* Progression live d'un job ops (0028, assets/ops-progress.js) : timeline
   d'étapes RÉELLES écrites par le serveur, jamais une barre décorative.
   Composant partagé : les onglets Marketing le branchent (RUN C). */
.job-progress {
  display: grid;
  gap: var(--space-2);
  font-size: 13px;
  color: var(--text);
}

.job-progress-steps {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: var(--space-2);
}

.job-progress-step {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  animation: pl-enter var(--dur-slow) var(--ease) both;
}

.job-progress-dot {
  flex: 0 0 auto;
  width: 8px;
  height: 8px;
  border-radius: var(--radius-full);
  background: var(--success);
}

.job-progress-step.is-live .job-progress-dot {
  background: var(--accent);
  animation: pl-skeleton 1.4s var(--ease) infinite;
}

.job-progress-step.is-live .job-progress-label { color: var(--text); font-weight: 500; }
.job-progress-step.is-done .job-progress-label { color: var(--muted); }

.job-progress-time {
  margin-left: auto;
  font-family: var(--font-data);
  font-variant-numeric: tabular-nums;
  font-size: 11px;
  color: var(--faint);
}

.job-progress-note { margin: 0; color: var(--muted); font-size: 12.5px; }
.job-progress-done { margin: 0; color: var(--success); font-weight: 500; }
.job-progress-error { margin: 0; color: var(--danger); }

.job-progress-retry {
  min-height: var(--h-md);
  padding: 0 var(--space-3);
  margin-left: var(--space-2);
  border: 1px solid var(--line-strong);
  border-radius: var(--radius-sm);
  background: var(--surface);
  color: var(--text);
  font-family: var(--font-ui);
  font-size: 12.5px;
  font-weight: 500;
  cursor: pointer;
  transition: background-color var(--dur) var(--ease), border-color var(--dur) var(--ease);
}

.job-progress-retry:hover { background: var(--subtle); }
.job-progress-retry:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

@media (pointer: coarse) {
  .job-progress-retry { min-height: 44px; }
}

/* ----------------------------------------------------------------------------
   12. REDUCED MOTION : !important autorisé ici (DESIGN.md §8)
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}
