/* ============================================================================
   Arbitrix — Design System « Industry » (blueprint / plan technique)
   ----------------------------------------------------------------------------
   SOURCE : maquette Claude Design du client
     design-maquette/_ds/industry-de587860-d665-44aa-a0a0-04b741f4ccdd/styles.css
     (+ readme.md du même dossier). Ce fichier en est le portage self-hosted,
     sans dépendance externe (polices Barlow vendorées dans /public/fonts).

   DA : bleu acier (#5980a6) sur fond technique clair (#f2f2f3). Titres en
   Barlow Condensed 600 sur corps Barlow. Chiffres tabulaires. Composants
   « blueprint » : coins carrés (radius 0), filet 1px divider, croix de calage
   aux 4 angles. Verdicts sémantiques : vert #047857 (rentable), rouge #dc2626.

   ─── COMMENT L'UTILISER ────────────────────────────────────────────────────
   • Tokens : toutes les valeurs sont des variables `--ds-*`. Prends-les via
     var(--ds-…) — ne code jamais un hex / une police / un px que le token
     porte déjà.
   • Base de page : ajoute `class="ds-scope"` sur <body> (ou un conteneur) pour
     hériter du fond, de la typo, des titres et des chiffres tabulaires Industry.
     SANS ce scope, ce fichier n'impose RIEN au <body> : il peut donc être
     chargé sur toutes les pages (y compris celles pas encore migrées) sans
     changer leur rendu. Seuls les éléments portant une classe `.ds-*`
     réagissent. C'est ce qui permet à nav.js de l'injecter partout en sécurité.
   • Composants (tous préfixés `ds-` pour ne jamais entrer en collision avec
     theme.css / Tailwind) :
       .ds-card + .corner (croix de calage)   .ds-blueprint (cadre wireframe)
       .ds-btn (.ds-btn-primary/-secondary/-ghost/-icon/-block)
       .ds-input, .ds-field                    .ds-tag (.ds-tag-accent/-neutral/-outline)
       .ds-table                               .ds-kicker, .ds-num
   • Nav commune : classes `.ds-nav*` — appliquées par public/nav.js sur la
     barre de navigation partagée (voir ce fichier pour le markup du logo).

   ─── LOGO « code-barres » (concept 2d retenu) ──────────────────────────────
   Marque = carré accent + 4 barres (l'EAN scanné). Version header (24px) :
       <svg width="24" height="24" viewBox="0 0 40 40" aria-hidden="true">
         <rect width="40" height="40" fill="var(--ds-color-accent)"></rect>
         <path d="M9.5 10v20 M17.5 10v14 M25.5 10v20 M33 10v14"
               stroke="var(--ds-color-bg)" stroke-width="4.5"></path>
       </svg>
       <span class="ds-nav__wordmark">Arbitrix</span>
   Version détaillée (favicon / og) : voir public/logo.svg (couleurs en dur car
   un SVG chargé comme image n'hérite pas des variables CSS du document).
   ========================================================================== */

/* ─── Polices Barlow — SELF-HOSTED (woff2 dans /public/fonts) ─────────────────
   Poids utilisés : Barlow 400/500/700, Barlow Condensed 600. Sous-ensembles
   latin + latin-ext (couvre le français : accents, œ, €, ç…). font-display:swap
   pour éviter le texte invisible pendant le chargement. */
@font-face {
  font-family: 'Barlow'; font-style: normal; font-weight: 400; font-display: swap;
  src: url('/fonts/Barlow-Regular-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: 'Barlow'; font-style: normal; font-weight: 400; font-display: swap;
  src: url('/fonts/Barlow-Regular-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: 'Barlow'; font-style: normal; font-weight: 500; font-display: swap;
  src: url('/fonts/Barlow-Medium-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: 'Barlow'; font-style: normal; font-weight: 500; font-display: swap;
  src: url('/fonts/Barlow-Medium-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: 'Barlow'; font-style: normal; font-weight: 700; font-display: swap;
  src: url('/fonts/Barlow-Bold-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: 'Barlow'; font-style: normal; font-weight: 700; font-display: swap;
  src: url('/fonts/Barlow-Bold-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: 'Barlow Condensed'; font-style: normal; font-weight: 600; font-display: swap;
  src: url('/fonts/BarlowCondensed-SemiBold-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: 'Barlow Condensed'; font-style: normal; font-weight: 600; font-display: swap;
  src: url('/fonts/BarlowCondensed-SemiBold-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;
}

/* ─── Tokens ─────────────────────────────────────────────────────────────────
   Préfixe `--ds-*` : garantit zéro collision avec les tokens de theme.css
   (--brand, --ink, --shadow-sm…). Reprend fidèlement la rampe de la maquette. */
:root {
  /* Rôles de base */
  --ds-color-bg:      #f2f2f3;
  --ds-color-surface: #e9e9ea;
  --ds-color-text:    #1d1f20;
  --ds-color-accent:  #5980a6;
  --ds-color-divider: rgba(29, 31, 32, .16);
  --ds-color-muted:   rgba(29, 31, 32, .55);

  /* Accent bleu acier — rampe 100→900 (mono : c'est le seul accent) */
  --ds-accent-100: #eef6ff;
  --ds-accent-200: #d6ebff;
  --ds-accent-300: #b5d9fd;
  --ds-accent-400: #94bce3;
  --ds-accent-500: #749dc4;
  --ds-accent-600: #597ea3;
  --ds-accent-700: #416180;  /* liens / texte sur fond clair (contraste ok) */
  --ds-accent-800: #2c455d;
  --ds-accent-900: #1d2d3d;  /* bandes pleines, texte inversé sur papier */

  /* Neutres — rampe partagée (OKLCH) */
  --ds-neutral-100: #f5f5f8;
  --ds-neutral-200: #e7e7ea;
  --ds-neutral-300: #d4d4d7;
  --ds-neutral-400: #b7b7ba;
  --ds-neutral-500: #98989b;
  --ds-neutral-600: #7a7a7d;
  --ds-neutral-700: #5d5d60;
  --ds-neutral-800: #424244;
  --ds-neutral-900: #2b2b2d;

  /* Verdicts sémantiques (codés en dur, hors DA mono — signal métier) */
  --ds-good:    #047857;   /* rentable  */
  --ds-good-bg: #ecfdf5;
  --ds-bad:     #dc2626;   /* à éviter  */
  --ds-bad-bg:  #fef2f2;

  /* Typographie */
  --ds-font-heading: 'Barlow Condensed', 'Arial Narrow', system-ui, sans-serif;
  --ds-font-heading-weight: 600;
  --ds-font-body: 'Barlow', system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;

  /* Espacements — échelle 0,85× (identique à la maquette) */
  --ds-space-1: 3.4px;
  --ds-space-2: 6.8px;
  --ds-space-3: 10.2px;
  --ds-space-4: 13.6px;
  --ds-space-6: 20.4px;
  --ds-space-8: 27.2px;

  /* Rayons — blueprint = 0. Les paliers restent dispo pour le rare non-carré. */
  --ds-radius:    0;   /* défaut blueprint (coins carrés) */
  --ds-radius-sm: 2px;
  --ds-radius-md: 4px;
  --ds-radius-lg: 7px;

  /* Élévation — ombres encrées calées sur le fond clair */
  --ds-shadow-sm: 0 1px 2px rgba(43, 43, 45, .14);
  --ds-shadow-md: 0 3px 10px rgba(43, 43, 45, .16);
  --ds-shadow-lg: 0 12px 32px rgba(43, 43, 45, .22);
}

/* ─── Base de page (opt-in via .ds-scope) ────────────────────────────────────
   N'affecte QUE les descendants de .ds-scope → aucune page non migrée n'est
   touchée par le simple chargement du fichier. */
.ds-scope {
  background: var(--ds-color-bg);
  color: var(--ds-color-text);
  font-family: var(--ds-font-body);
  font-size: 15px;
  line-height: 1.55;
  font-weight: 400;
  font-feature-settings: 'tnum';   /* chiffres tabulaires partout */
}
.ds-scope h1, .ds-scope h2, .ds-scope h3,
.ds-scope h4, .ds-scope h5, .ds-scope h6 {
  font-family: var(--ds-font-heading);
  font-weight: var(--ds-font-heading-weight);
  line-height: 1.12;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  margin: 0 0 var(--ds-space-2);
}
.ds-scope h1 { font-size: 42px; }
.ds-scope h2 { font-size: 32px; }
.ds-scope h3 { font-size: 25px; }
.ds-scope h4 { font-size: 20px; }
.ds-scope h5 { font-size: 16px; }
.ds-scope h6 { font-size: 13px; letter-spacing: 0.08em; }
.ds-scope p { margin: 0 0 var(--ds-space-3); }
.ds-scope a { color: var(--ds-accent-700); text-underline-offset: 3px; }
.ds-scope a:hover { color: var(--ds-accent-800); }
.ds-scope ::selection { background: color-mix(in srgb, var(--ds-color-accent) 30%, transparent); }

/* Focus clavier — 2px accent, jamais l'anneau bleu par défaut */
.ds-scope :focus-visible,
.ds-btn:focus-visible,
.ds-input:focus-visible,
.ds-nav__link:focus-visible {
  outline: 2px solid var(--ds-color-accent);
  outline-offset: 2px;
}

/* Utilitaires */
.ds-muted   { color: var(--ds-color-muted); }
.ds-num     { font-variant-numeric: tabular-nums; font-feature-settings: 'tnum'; }
.ds-kicker  { font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ds-accent-700); }
.ds-hr      { height: 1px; border: 0; margin: var(--ds-space-4) 0; background: var(--ds-color-divider); }

/* ─── Cadre blueprint + croix de calage ──────────────────────────────────────
   .ds-blueprint sur un conteneur + 4 enfants <i class="corner tl/tr/bl/br">.
   Les marques sont dessinées HORS de la boîte → le conteneur ne doit pas
   masquer son débordement. */
.ds-blueprint { position: relative; border: 1px solid var(--ds-color-divider); border-radius: 0; }
.ds-blueprint > .corner {
  position: absolute; width: 11px; height: 11px;
  color: color-mix(in srgb, var(--ds-color-text) 55%, transparent);
}
.ds-blueprint > .corner::before,
.ds-blueprint > .corner::after { content: ""; position: absolute; background: currentColor; }
.ds-blueprint > .corner::before { left: 5px; top: 0; width: 1px; height: 100%; }
.ds-blueprint > .corner::after  { top: 5px; left: 0; width: 100%; height: 1px; }
.ds-blueprint > .corner.tl { top: -6px; left: -6px; }
.ds-blueprint > .corner.tr { top: -6px; right: -6px; }
.ds-blueprint > .corner.bl { bottom: -6px; left: -6px; }
.ds-blueprint > .corner.br { bottom: -6px; right: -6px; }

/* ─── Boutons ────────────────────────────────────────────────────────────────
   Coins carrés, filet 1px. .ds-btn-primary = le seul objet plein (accent). */
.ds-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  cursor: pointer; text-decoration: none;
  font-family: var(--ds-font-heading); font-weight: var(--ds-font-heading-weight);
  font-size: 13px; line-height: 1.2; letter-spacing: 0.02em; text-transform: uppercase;
  color: var(--ds-color-text);
  background: transparent; border: 1px solid var(--ds-color-divider); border-radius: 0;
  padding: calc(var(--ds-space-2) * 0.85) var(--ds-space-3);
}
.ds-btn:disabled { opacity: 0.45; cursor: not-allowed; }
.ds-btn-primary   { background: var(--ds-color-accent); border-color: var(--ds-color-accent); color: var(--ds-color-bg); }
.ds-btn-primary:hover  { background: var(--ds-accent-600); border-color: var(--ds-accent-600); }
.ds-btn-primary:active { background: var(--ds-accent-700); border-color: var(--ds-accent-700); }
.ds-btn-secondary:hover  { background: color-mix(in srgb, var(--ds-color-text) 7%, transparent); }
.ds-btn-secondary:active { background: color-mix(in srgb, var(--ds-color-text) 14%, transparent); }
.ds-btn-ghost   { border-color: transparent; color: var(--ds-accent-700); }
.ds-btn-ghost:hover  { background: color-mix(in srgb, var(--ds-color-accent) 10%, transparent); }
.ds-btn-ghost:active { background: color-mix(in srgb, var(--ds-color-accent) 18%, transparent); }
.ds-btn-icon  { width: 34px; height: 34px; padding: 0; }
.ds-btn-block { width: 100%; }

/* ─── Formulaires ────────────────────────────────────────────────────────────*/
.ds-field > label {
  display: block; font-size: 12px; margin-bottom: 5px;
  color: color-mix(in srgb, var(--ds-color-text) 70%, transparent);
}
.ds-input {
  width: 100%; min-height: 36px; padding: 6px 10px; font: inherit;
  font-family: var(--ds-font-body); font-size: 14px;
  color: var(--ds-color-text); caret-color: var(--ds-color-accent);
  background: var(--ds-color-surface);
  border: 1px solid var(--ds-color-divider); border-radius: 0;
}
.ds-input:hover { border-color: color-mix(in srgb, var(--ds-color-text) 45%, transparent); }
.ds-input:focus-visible { border-color: var(--ds-color-accent); outline-offset: 0; }
textarea.ds-input { min-height: 90px; resize: vertical; }

/* ─── Cartes (objets wireframe : transparentes, filet 1px, coins carrés) ─────*/
.ds-card {
  display: flex; flex-direction: column; gap: var(--ds-space-2);
  padding: var(--ds-space-3); border-radius: 0;
  background: transparent; border: 1px solid var(--ds-color-divider);
}
.ds-card-title { font-family: var(--ds-font-heading); font-weight: var(--ds-font-heading-weight); font-size: 17px; line-height: 1.2; }
.ds-card-body  { margin: 0; font-size: 13px; opacity: 0.8; flex: 1; }
.ds-card-meta  { display: flex; align-items: center; gap: 6px; font-size: 11px; color: color-mix(in srgb, var(--ds-color-text) 50%, transparent); }
.ds-elev-sm { box-shadow: var(--ds-shadow-sm); }
.ds-elev-md { box-shadow: var(--ds-shadow-md); }
.ds-elev-lg { box-shadow: var(--ds-shadow-lg); }

/* ─── Étiquettes ─────────────────────────────────────────────────────────────*/
.ds-tag {
  display: inline-flex; align-items: center; font-size: 11px;
  letter-spacing: 0.02em; padding: 3px 10px; border-radius: 0;
}
.ds-tag-accent  { background: var(--ds-accent-100); color: var(--ds-accent-800); }
.ds-tag-neutral { background: var(--ds-neutral-100); color: var(--ds-neutral-800); }
.ds-tag-outline { border: 1px solid var(--ds-color-accent); color: var(--ds-accent-700); }
.ds-tag-good    { background: var(--ds-good-bg); color: var(--ds-good); }
.ds-tag-bad     { background: var(--ds-bad-bg);  color: var(--ds-bad); }

/* ─── Tables de données ─────────────────────────────────────────────────────*/
.ds-table { width: 100%; border-collapse: collapse; font-size: 14px; }
.ds-table th {
  text-align: left; font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase;
  color: color-mix(in srgb, var(--ds-color-text) 60%, transparent);
  padding: var(--ds-space-2); border-bottom: 1px solid var(--ds-color-divider);
}
.ds-table td { padding: var(--ds-space-2); border-bottom: 1px solid color-mix(in srgb, var(--ds-color-text) 8%, transparent); }
.ds-table tbody tr:hover { background: color-mix(in srgb, var(--ds-color-text) 4%, transparent); }

/* ─── Navigation commune (re-skin appliqué par public/nav.js) ────────────────
   Les classes .ds-nav* sont ajoutées par nav.js SUR le markup existant, en
   plus des classes historiques (.app-nav, .nav-link…). design-system.css étant
   chargé après theme.css, ces règles prennent le dessus sur la barre commune,
   sans toucher aux pages non migrées (elles n'ont pas de .ds-nav). */
.ds-nav {
  background: var(--ds-color-bg);
  border-bottom: 1px solid var(--ds-color-divider);
  backdrop-filter: none; -webkit-backdrop-filter: none;
  position: sticky; top: 0; z-index: 40;
}
.ds-nav__bar { gap: var(--ds-space-3); }
.ds-nav__brand {
  display: inline-flex; align-items: center; gap: 10px;
  margin-right: auto; white-space: nowrap;
}
.ds-nav__logo { display: block; flex: none; }
.ds-nav__wordmark {
  font-family: var(--ds-font-heading); font-weight: var(--ds-font-heading-weight);
  font-size: 19px; letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--ds-color-text); line-height: 1;
}
/* Liens : plats, texte qui vire à l'accent — pas de pilule pleine */
.ds-nav__link {
  display: inline-flex; align-items: center; gap: .35rem;
  padding: .375rem .5rem;
  font-family: var(--ds-font-body); font-size: 14px; font-weight: 500;
  color: color-mix(in srgb, var(--ds-color-text) 78%, transparent);
  background: transparent; border-radius: 0;
  border-bottom: 2px solid transparent; white-space: nowrap;
  transition: color .12s, border-color .12s;
}
.ds-nav__link:hover { background: transparent; color: var(--ds-accent-700); }
.ds-nav__link.is-active,
.ds-nav__link[aria-current="page"] {
  background: transparent; color: var(--ds-accent-700);
  border-bottom-color: var(--ds-color-accent);
}
.ds-nav__link.is-active:hover,
.ds-nav__link[aria-current="page"]:hover { background: transparent; color: var(--ds-accent-800); }

/* ============================================================================
   RE-SKIN « Industry » — page HISTORIQUE (« Articles récupérés ») + modale
   DÉTAILS (analyse marché type SellerAmp).
   ----------------------------------------------------------------------------
   AJOUTS ADDITIFS, TOUS scopés sous `.ds-scope` (la page /historique porte ce
   scope ; la modale #productModal y est un descendant). AUCUN renommage : on
   RE-STYLISE les classes existantes lues par app.js comme sélecteurs
   (.hist-row, .opp-card[data-verdict], .badge--*, .mkt-*, .chip-link…) SANS
   les changer — la logique JS reste intacte. Les autres pages qui partagent
   ces classes (#productModal sur index/mes-produits/aspiration, .badge sur
   admin…) ne portent PAS `.ds-scope` → elles ne sont pas touchées.

   Verdicts sémantiques CONSERVÉS : vert #047857 (rentable), rouge #dc2626
   (à éviter), ambre (match IA « à vérifier » — jamais un vert plein). Le
   bandeau quota ≥80 % (.quota-banner) reste ambre, juste passé en coins carrés.
   ========================================================================== */

/* ─── Coquille de page ───────────────────────────────────────────────────── */
.ds-scope .page-head p { color: var(--ds-color-muted); }
.ds-scope .page-head .ds-kicker { display: block; margin-bottom: 4px; }

/* Carte-section → cadre blueprint (transparent, filet 1px, coins carrés). Le
   <section> porte aussi .ds-blueprint (croix de calage aux 4 angles). */
.ds-scope .card {
  background: transparent;
  border: 1px solid var(--ds-color-divider);
  border-radius: 0;
  box-shadow: none;
}
/* Titre de section (« Historique des scans ») : cap blueprint, pas 32px. */
.ds-scope .card h2 { font-size: 20px; }
/* L'indicateur live garde sa casse (« live » / « hors ligne » non capitalisés). */
.ds-scope #historyLive { text-transform: none; letter-spacing: 0; }

/* ─── Boutons (barre d'actions + filtres) ────────────────────────────────── */
.ds-scope .btn {
  border-radius: 0;
  font-family: var(--ds-font-heading);
  font-weight: var(--ds-font-heading-weight);
  text-transform: uppercase;
  letter-spacing: 0.02em;
}
.ds-scope .btn-primary {
  background: var(--ds-color-accent); border-color: var(--ds-color-accent);
  color: var(--ds-color-bg);
}
.ds-scope .btn-primary:hover:not(:disabled) {
  background: var(--ds-accent-700); border-color: var(--ds-accent-700);
}
.ds-scope .btn-ghost {
  background: transparent; border-color: var(--ds-color-divider);
  color: var(--ds-accent-700);
}
.ds-scope .btn-ghost:hover:not(:disabled) {
  background: color-mix(in srgb, var(--ds-color-accent) 10%, transparent);
}
.ds-scope .btn-ghost.is-active,
.ds-scope .btn.is-active {
  background: var(--ds-color-accent); border-color: var(--ds-color-accent);
  color: var(--ds-color-bg);
}
.ds-scope .btn-danger {
  background: transparent; color: var(--ds-bad);
  border-color: color-mix(in srgb, var(--ds-bad) 35%, transparent);
}
.ds-scope .btn-danger:hover:not(:disabled) {
  background: var(--ds-bad-bg); border-color: var(--ds-bad);
}

/* ─── Panneau de filtres ─────────────────────────────────────────────────── */
.ds-scope #historyFilters {
  background: var(--ds-color-surface);
  border: 1px solid var(--ds-color-divider);
  border-radius: 0;
}
.ds-scope .field-label {
  font-family: var(--ds-font-heading); font-weight: var(--ds-font-heading-weight);
  text-transform: uppercase; letter-spacing: 0.06em;
  font-size: 10px; color: var(--ds-accent-700);
}
.ds-scope .input,
.ds-scope .select {
  border-radius: 0;
  background: var(--ds-color-bg);
  border: 1px solid var(--ds-color-divider);
  font-family: var(--ds-font-body);
}
.ds-scope .input:focus,
.ds-scope .select:focus {
  border-color: var(--ds-color-accent);
  box-shadow: none;
}

/* ─── Liste d'historique → conteneur « tableau » blueprint ───────────────── */
.ds-scope #historyList {
  border: 1px solid var(--ds-color-divider);
  background: var(--ds-color-bg);
}
/* Lignes à plat, séparées par un filet 1px (neutralise l'espacement space-y-2
   de Tailwind → filets continus, coins carrés). */
.ds-scope #historyList > .hist-row {
  margin: 0;
  background: transparent;
  border: 0;
  border-bottom: 1px solid color-mix(in srgb, var(--ds-color-text) 8%, transparent);
  border-radius: 0;
  box-shadow: none;
  padding: var(--ds-space-3) var(--ds-space-4) var(--ds-space-3) calc(var(--ds-space-4) + 3px);
}
.ds-scope #historyList > .hist-row:last-child { border-bottom: 0; }
.ds-scope #historyList > .hist-row:hover {
  background: color-mix(in srgb, var(--ds-color-accent) 5%, transparent);
  box-shadow: none;
  border-color: color-mix(in srgb, var(--ds-color-text) 8%, transparent);
}
/* Ruban de verdict gauche : 3px, coins carrés, couleurs sémantiques Industry. */
.ds-scope .opp-card::before { width: 3px; border-radius: 0; }
.ds-scope .opp-card[data-verdict="profitable"]::before     { background: var(--ds-good); }
.ds-scope .opp-card[data-verdict="suspect"]::before        { background: #b45309; }
.ds-scope .opp-card[data-verdict="not_profitable"]::before { background: var(--ds-bad); }
.ds-scope .opp-card[data-verdict="not_found"]::before      { background: var(--ds-neutral-400); }

.ds-scope .hist-row__thumb { border-radius: 0; border: 1px solid var(--ds-color-divider); }
.ds-scope .hist-row__name  { font-weight: 500; color: var(--ds-color-text); font-size: 14px; }
.ds-scope .hist-row__name:hover { color: var(--ds-accent-700); }
.ds-scope .hist-row__prices { color: var(--ds-color-muted); font-size: 13px; }
.ds-scope .hist-price       { font-weight: 600; color: var(--ds-color-text); }
.ds-scope .hist-price--sell { color: var(--ds-accent-700); }
.ds-scope .hist-arrow       { color: var(--ds-color-muted); }
.ds-scope .hist-net         { color: var(--ds-good); font-weight: 700; }
.ds-scope .hist-roi         { color: color-mix(in srgb, var(--ds-color-text) 75%, transparent); }
.ds-scope .hist-mult        { color: var(--ds-color-muted); }
.ds-scope .hist-row__meta   { color: var(--ds-color-muted); }
.ds-scope .hist-row__meta .chip-asin {
  background: var(--ds-color-surface);
  color: color-mix(in srgb, var(--ds-color-text) 70%, transparent);
  border-radius: 0; font-size: 10px;
}

/* Pastilles de verdict (badges) → étiquettes carrées, teintes sémantiques. */
.ds-scope .badge { border-radius: 0; font-family: var(--ds-font-body); letter-spacing: 0.01em; }
.ds-scope .badge--good    { background: var(--ds-good-bg); color: var(--ds-good); }
.ds-scope .badge--bad     { background: var(--ds-bad-bg);  color: var(--ds-bad); }
.ds-scope .badge--warn    { background: #fef3c7; color: #b45309; }   /* IA « à vérifier » : ambre conservé */
.ds-scope .badge--neutral { background: var(--ds-neutral-100); color: var(--ds-neutral-800); }

/* Liens-pastilles (Amazon / Source / EAN) → carrés, teinte accent. */
.ds-scope .chip-link { border-radius: 0; font-weight: 500; }
.ds-scope .chip-link--amazon { background: var(--ds-accent-100); color: var(--ds-accent-800); border-color: var(--ds-accent-300); }
.ds-scope .chip-link--source { background: #fef3c7; color: #b45309; border-color: #fde68a; }
.ds-scope .chip-link--sky    { background: var(--ds-accent-100); color: var(--ds-accent-700); border-color: var(--ds-accent-300); }

/* Bouton « Détails » (plein) → accent Industry ; « ✕ » supprimer. */
.ds-scope .hist-detail-btn {
  border-radius: 0; background: var(--ds-color-accent); color: var(--ds-color-bg);
  font-family: var(--ds-font-heading); font-weight: var(--ds-font-heading-weight);
  text-transform: uppercase; letter-spacing: 0.03em;
}
.ds-scope .hist-detail-btn:hover { background: var(--ds-accent-700); }
.ds-scope .hist-del-btn { border-radius: 0; }
.ds-scope .hist-del-btn:hover { color: var(--ds-bad); background: var(--ds-bad-bg); }

/* ─── États vides ────────────────────────────────────────────────────────── */
.ds-scope .state {
  border: 1px dashed var(--ds-color-divider);
  border-radius: 0; background: transparent;
}
.ds-scope .state__title {
  color: color-mix(in srgb, var(--ds-color-text) 78%, transparent);
  font-family: var(--ds-font-heading); font-weight: var(--ds-font-heading-weight);
  text-transform: uppercase; letter-spacing: 0.04em;
}
.ds-scope .state__hint { color: var(--ds-color-muted); }

/* ─── Bandeau quota (≥80 %) — ambre conservé, coins carrés ──────────────── */
.ds-scope .quota-banner {
  border-radius: 0; background: #fef3c7; border-color: #fde68a; color: #92400e;
}

/* ============================================================================
   MODALE DÉTAILS (#productModal) — blueprint. Toutes les règles sont scopées
   `.ds-scope #productModal …` (spécificité portée par l'ID) : elles priment
   sur les utilitaires Tailwind du markup SANS les renommer, et ne s'appliquent
   QUE quand la modale est ouverte dans une page `.ds-scope` (donc /historique).
   ========================================================================== */
/* Cadre : panneau papier, cartes en surface, coins carrés, filets divider. */
.ds-scope #productModal > .relative {
  border-radius: 0;
  background: var(--ds-color-bg);
  border: 1px solid var(--ds-color-divider);
}
.ds-scope #productModal .rounded,
.ds-scope #productModal .rounded-lg,
.ds-scope #productModal .rounded-xl,
.ds-scope #productModal .rounded-2xl,
.ds-scope #productModal .rounded-full { border-radius: 0; }
.ds-scope #productModal .bg-white,
.ds-scope #productModal .bg-gray-50 { background: var(--ds-color-surface); }
.ds-scope #productModal .bg-gray-100 { background: var(--ds-neutral-200); }
.ds-scope #productModal .border-gray-100,
.ds-scope #productModal .border-gray-200,
.ds-scope #productModal .border-gray-300 { border-color: var(--ds-color-divider); }
/* Titres : produit (h2) en casse naturelle ; sous-sections (h3) en cap blueprint. */
.ds-scope #productModal h2 { font-size: 18px; text-transform: none; letter-spacing: 0.01em; }
.ds-scope #productModal h3 { font-size: 12px; letter-spacing: 0.06em; }
/* KPIs (Net / ROI / ×) et valeurs métriques en Barlow Condensed tabulaire. */
.ds-scope #productModal .text-2xl,
.ds-scope #productModal .text-xl,
.ds-scope #productModal .text-lg {
  font-family: var(--ds-font-heading); font-weight: var(--ds-font-heading-weight);
}

/* Quick-info marché → cellules blueprint. */
.ds-scope .mkt-stat { border: 1px solid var(--ds-color-divider); border-radius: 0; background: var(--ds-color-bg); }
.ds-scope .mkt-stat__value { font-family: var(--ds-font-heading); }
.ds-scope .mkt-panel { border: 1px solid var(--ds-color-divider); border-radius: 0; background: var(--ds-color-bg); }
.ds-scope .mkt-sub-title {
  font-family: var(--ds-font-heading); font-weight: var(--ds-font-heading-weight);
  text-transform: uppercase; letter-spacing: 0.06em;
  color: color-mix(in srgb, var(--ds-color-text) 60%, transparent);
}

/* Table des offres → filets divider, en-têtes cap. */
.ds-scope .mkt-offers th {
  text-transform: uppercase; letter-spacing: 0.08em;
  color: color-mix(in srgb, var(--ds-color-text) 60%, transparent);
  border-bottom-color: var(--ds-color-divider);
}
.ds-scope .mkt-offers td { border-bottom-color: color-mix(in srgb, var(--ds-color-text) 8%, transparent); }
.ds-scope .mkt-offer--best td { background: var(--ds-good-bg); }
.ds-scope .mkt-badge { border-radius: 0; }
.ds-scope .mkt-badge--fba { background: var(--ds-good-bg); color: var(--ds-good); border-color: color-mix(in srgb, var(--ds-good) 30%, transparent); }
.ds-scope .mkt-badge--fbm { background: var(--ds-neutral-100); color: var(--ds-neutral-800); border-color: var(--ds-neutral-300); }
.ds-scope .mkt-badge--amz { background: var(--ds-accent-100); color: var(--ds-accent-800); border-color: var(--ds-accent-300); }

/* Alertes → carrées, teintes sémantiques Industry. */
.ds-scope .mkt-alert { border-radius: 0; }
.ds-scope .mkt-alert--good { background: var(--ds-good-bg); color: var(--ds-good); border-color: color-mix(in srgb, var(--ds-good) 30%, transparent); }
.ds-scope .mkt-alert--bad  { background: var(--ds-bad-bg);  color: var(--ds-bad);  border-color: color-mix(in srgb, var(--ds-bad) 30%, transparent); }

/* Sparklines 90 j (SVG inline restylé) : Buy Box accent, Amazon terracotta. */
.ds-scope .mkt-chart { border: 1px solid var(--ds-color-divider); border-radius: 0; background: var(--ds-color-bg); }
.ds-scope .mkt-chart--rank { background: var(--ds-color-surface); }
.ds-scope .mkt-chart-title { font-family: var(--ds-font-heading); text-transform: uppercase; letter-spacing: 0.04em; }
.ds-scope .mkt-line--bb, .ds-scope .mkt-leg--bb::before { stroke: var(--ds-color-accent); background: var(--ds-color-accent); }
.ds-scope .mkt-line--am, .ds-scope .mkt-leg--am::before { stroke: #c2410c; background: #c2410c; }
