/* home-premium.css is loaded via a direct <link> before this file in every page's <head>
   (same effective cascade position as the old @import url("/assets/styles.css") chain it used
   to pull in) - do not re-add an @import here, it re-introduces a serial render-blocking hop. */

:root {
  --calc-page-width: min(1280px, calc(100% - 40px));
  --calc-card: var(--color-surface);
  --calc-card-strong: var(--color-background-primary);
  --calc-border: var(--color-surface-border);
  --calc-text: var(--color-text-primary);
  --calc-muted: var(--color-text-secondary);
  --calc-soft: var(--color-text-muted);
}

body.layout-premium-page[class*="calc-page-"] {
  margin: 0;
  min-height: 100vh;
  --calc-accent: var(--color-brand-electric);
  --calc-accent-deep: var(--color-brand-electric-deep);
  color: var(--calc-text);
  background: var(--color-background-primary);
  font-family: "Public Sans", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  color-scheme: light;
  text-rendering: optimizeLegibility;
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
  display: flex;
  flex-direction: column;
}

body.layout-premium-page[class*="calc-page-"] .prototype-page {
  position: relative;
  z-index: 1;
  flex: 1 0 auto;
  display: flex;
  flex-direction: column;
}

body.layout-premium-page[class*="calc-page-"] .page-shell {
  position: relative;
  width: var(--calc-page-width);
  margin: 0 auto;
  padding: 16px 0 0;
  flex: 1 0 auto;
  display: flex;
  flex-direction: column;
}

/* Accent de categorie par theme (DESIGN.md, "Couleurs de categorie") : un seul accent par page,
   jamais un degrade a deux tons - le second accent (--calc-accent-2) est retire du systeme.
   Le selecteur reprend [class*="calc-page-"] (verifie par test reel avec Playwright : sans lui,
   la specificite de la regle de base ci-dessus, 0-2-0, battait toujours ces blocs a 0-1-0 et
   --calc-accent restait bleu sur toutes les pages, quel que soit le theme - bug present avant
   cette refonte, corrige ici). */
body.calc-theme-finance[class*="calc-page-"],
body.calc-theme-finances[class*="calc-page-"],
body.calc-theme-quotidien[class*="calc-page-"] {
  --calc-accent: var(--color-category-indigo);
  --calc-accent-deep: var(--color-category-indigo-deep);
}

body.calc-theme-transport[class*="calc-page-"] {
  --calc-accent: var(--color-category-cyan);
  --calc-accent-deep: var(--color-category-cyan-deep);
}

body.calc-theme-family[class*="calc-page-"],
body.calc-theme-famille[class*="calc-page-"] {
  --calc-accent: var(--color-category-pink);
  --calc-accent-deep: var(--color-category-pink-deep);
}

body.calc-theme-maison[class*="calc-page-"] {
  --calc-accent: var(--color-category-amber);
  --calc-accent-deep: var(--color-category-amber-deep);
}

body.calc-theme-sante[class*="calc-page-"] {
  --calc-accent: var(--color-category-emerald);
  --calc-accent-deep: var(--color-category-emerald-deep);
}

body.calc-theme-animaux[class*="calc-page-"] {
  --calc-accent: var(--color-category-teal);
  --calc-accent-deep: var(--color-category-teal-deep);
}

a { color: inherit; }
img { display: block; max-width: 100%; }

.prototype-topnav {
  box-sizing: border-box;
  position: sticky;
  top: 0;
  z-index: 70;
  width: 100%;
  min-height: 52px;
  margin: 0 0 18px;
  padding: 8px 18px;
  border: 1px solid var(--color-surface-border);
  border-radius: 16px;
  background: var(--color-surface);
  box-shadow: none;
}

.prototype-topnav.calculator-topnav,
.prototype-topnav.calc-topnav {
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: 16px;
}

.prototype-topnav-inner {
  display: contents;
  width: 100%;
  min-height: 100%;
}

.topnav-left {
  display: flex;
  align-items: center;
  min-width: 0;
}

.topnav-header-row {
  display: flex;
  align-items: center;
  min-width: 0;
}

.prototype-topnav .logo,
.prototype-topnav .brand-link {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  text-decoration: none;
  color: var(--color-text-primary);
  font-weight: 800;
  letter-spacing: -0.02em;
}

.prototype-topnav .logo img,
.prototype-topnav .brand-link img {
  width: 36px;
  height: 36px;
  border-radius: 9px;
  box-shadow: none;
  object-fit: contain;
}

.brand-word--light {
  color: var(--color-text-primary);
}

.brand-word--accent {
  /* Ancien texte en degrade (bleu -> violet -> cyan) retire : DESIGN.md interdit le gradient-text,
     y compris sur le logo. Un seul aplat de la couleur d'action unique du site. */
  color: var(--color-brand-electric);
}

.topnav-panel {
  min-width: 0;
}

.prototype-topnav.calculator-topnav .topnav-actions--spacer,
.prototype-topnav.calc-topnav .topnav-actions--spacer {
  min-width: 98px;
}

.prototype-nav {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: 18px;
  line-height: 1;
  min-height: 100%;
}

.prototype-nav > a,
.prototype-nav-trigger,
.topnav-link,
.topnav-cta {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  text-decoration: none;
  color: var(--color-text-secondary);
  font-size: 0.9rem;
  font-weight: 600;
  transition: color 180ms var(--ease-standard, cubic-bezier(0.4, 0, 0.2, 1));
}

.prototype-nav > a::before,
.prototype-nav-trigger::before {
  content: "";
  width: 4px;
  height: 4px;
  border-radius: 999px;
  background: var(--nav-dot, var(--color-text-muted));
}

.prototype-nav > a:nth-child(1) {
  --nav-dot: var(--color-category-cyan-deep);
}

.prototype-nav-item--themes .prototype-nav-trigger {
  --nav-dot: var(--color-category-amber-deep);
}

.prototype-nav-item--guides .prototype-nav-trigger {
  --nav-dot: var(--color-category-indigo-deep);
}

/* Bug d'accessibilite systeme decouvert (page nav) et corrige en Phase 10, generalise ici en
   Phase 11 au niveau du composant .prototype-nav/.prototype-nav-trigger. Audit complet effectue en
   Phase 11 (17 regles ":focus-visible { ... outline: none }" au total sur les deux fichiers CSS
   partages) : ce composant nav est le seul ou "outline: none" n'etait accompagne d'AUCUN indicateur
   visible de remplacement (le texte changeait de couleur uniquement sur :hover, pas sur
   :focus-visible avant ce correctif). 6 autres composants partagent un souci apparente mais
   distinct et non corrige ici (hors mandat de cette phase, qui portait sur le bug precis identifie
   en Phase 10) : .hero-cta, .home-nav a, .cookie-banner-links a, .cookie-btn et
   .member-secondary-button ne changent qu'un `transform: translateY()` de 1-4px sur :focus-visible,
   sans couleur/bordure/ombre - un indicateur nettement plus faible, potentiellement insuffisant,
   documente dans le livrable de cette phase comme un chantier distinct a part entiere (.hero-cta
   notamment est le CTA principal de 160+ pages). Corrige ici au niveau du composant partage, pas
   par page : :hover et :focus-visible sont desormais separes -
   :hover ne change que la couleur du texte (comportement inchange), :focus-visible recoit un vrai
   contour visible via --nav-focus-color. Ce token vaut --brand-transform (cyan accessible) par
   defaut - correct sur les 160+ headers actuels, restes clairs - et est redefini uniquement dans le
   scope .visual-identity-v1 .prototype-topnav (voir plus bas) pour passer au cyan plein sur fond
   marine, ou son contraste est reellement suffisant (verifie Phase 10 : 6.98:1) contrairement a un
   contour fin sur fond clair (1.81:1, insuffisant). Le composant gere son propre contexte, aucun
   hack par page. */
:root {
  --nav-focus-color: var(--brand-transform);
}

.prototype-nav > a:hover,
.prototype-nav-trigger:hover {
  color: var(--color-brand-electric);
}

.prototype-nav > a:focus-visible,
.prototype-nav-trigger:focus-visible {
  color: var(--color-brand-electric);
  outline: 2px solid var(--nav-focus-color);
  outline-offset: 2px;
}

.prototype-nav-item {
  position: relative;
}

.prototype-nav-trigger {
  padding: 0;
  border: 0;
  background: transparent;
  cursor: pointer;
}

.prototype-subnav {
  position: absolute;
  top: calc(100% + 12px);
  left: 0;
  display: grid;
  gap: 2px;
  min-width: 240px;
  padding: 10px;
  border: 1px solid var(--color-surface-border);
  border-radius: 16px;
  background: var(--color-surface);
  box-shadow: var(--shadow-soft);
  opacity: 0;
  pointer-events: none;
  transform: translateY(4px);
  transition: opacity 180ms var(--ease-standard, cubic-bezier(0.4, 0, 0.2, 1)), transform 180ms var(--ease-standard, cubic-bezier(0.4, 0, 0.2, 1));
}

.prototype-nav-item:hover .prototype-subnav,
.prototype-nav-item:focus-within .prototype-subnav {
  opacity: 1;
  transform: translateY(0);
  pointer-events: auto;
}

.prototype-subnav a {
  display: block;
  padding: 10px 12px;
  border-radius: 14px;
  color: var(--calc-text);
  text-decoration: none;
  font-size: 0.94rem;
  font-weight: 600;
}

.prototype-subnav a:hover,
.prototype-subnav a:focus-visible {
  background: rgba(37, 99, 235, 0.08);
  outline: none;
}

.topnav-actions {
  display: flex;
  align-items: center;
  gap: 12px;
  flex: 0 0 auto;
  line-height: 1;
  min-height: 100%;
}

.topnav-link,
.topnav-cta,
.hero-cta,
.covo-cta-button,
.result-cta,
.input-footer {
  box-sizing: border-box;
  max-width: 100%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 44px;
  padding: 0 18px;
  border-radius: 999px;
  border: 0;
  text-decoration: none;
  font: inherit;
  font-weight: 800;
  transition: transform 180ms ease, box-shadow 180ms ease, background-color 180ms ease, border-color 180ms ease;
}

.topnav-link {
  color: var(--color-text-primary);
  border: 1px solid var(--color-surface-border);
  background: var(--color-surface);
  box-shadow: none;
}

.topnav-cta,
.hero-cta,
.covo-cta-button,
.result-cta {
  /* DESIGN.md, Buttons : le bouton d'action principal utilise le rectangle a coins doux
     ({rounded.sm}), pas la pilule, et jamais de degrade. La pilule (999px) heritee du bloc
     .topnav-link/.hero-cta partage ci-dessus est corrigee ici specifiquement pour ces boutons
     d'action - .topnav-link (secondaire) garde la pilule car ce n'est pas une action principale. */
  border-radius: var(--radius-sm);
  background: var(--color-brand-electric);
  color: #fff;
  box-shadow: none;
}

.topnav-link:hover,
.topnav-link:focus-visible {
  background: var(--color-brand-soft);
  border-color: var(--color-brand-electric);
  outline: none;
}

.topnav-cta:hover,
.topnav-cta:focus-visible,
.hero-cta:hover,
.hero-cta:focus-visible,
.covo-cta-button:hover,
.covo-cta-button:focus-visible,
.result-cta:hover,
.result-cta:focus-visible {
  background: var(--color-brand-electric-deep);
  box-shadow: var(--shadow-soft);
  outline: none;
}

.hero-trust.hero-breadcrumb {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px;
  margin: 0 0 22px;
  color: var(--color-text-muted);
  font-size: 0.88rem;
}

.hero-trust.hero-breadcrumb a {
  color: var(--color-text-secondary);
  text-decoration: none;
}

.hero-large.calc-hero-shell {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(360px, 0.9fr);
  gap: 32px;
  align-items: center;
  margin-top: 0;
  padding: 12px 0 18px;
}

.hero-content {
  padding: 24px 0 18px;
}

/* Le fond suit toujours la couleur de categorie de la page (color-mix sur --calc-accent), mais le
   texte utilise sa variante -deep : plusieurs couleurs de categorie (cyan, rose...) sont trop
   claires pour rester lisibles en texte direct sur un fond presque blanc (AA). */
.hero-kicker,
.section-kicker,
.card-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin: 0 0 14px;
  padding: 7px 12px;
  border-radius: var(--radius-pill);
  background: color-mix(in srgb, var(--calc-accent, var(--color-brand-electric)) 12%, var(--color-surface));
  color: var(--calc-accent-deep, var(--color-brand-electric-deep));
  font-size: 0.72rem;
  font-weight: 800;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

.hero-large h1 {
  /* DESIGN.md v3, Typography > Display : echelle resserree (etait clamp(2.8rem,5.2vw,5rem)) - un
     audit reel a mesure que l'ancien H1 (4 lignes + badge + sous-titre + CTA + reassurance + carte
     demo) repoussait systematiquement le calculateur sous la ligne de flottaison a 1280x900. */
  margin: 0;
  max-width: 16ch;
  color: var(--color-text-primary);
  font-size: clamp(2.4rem, 4.4vw, 3.6rem);
  line-height: 1.05;
  letter-spacing: -0.02em;
  font-weight: 800;
}

.hero-subtitle {
  max-width: 46rem;
  margin: 18px 0 0;
  color: var(--calc-muted);
  font-size: 1.04rem;
  line-height: 1.72;
}

.hero-cta {
  margin-top: 24px;
}

.hero-reassurance {
  margin: 12px 0 0;
  color: var(--calc-muted);
  font-size: 0.92rem;
}

.hero-trust {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 16px;
}

.hero-trust span {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  min-height: 34px;
  padding: 0 12px;
  border-radius: var(--radius-sm);
  background: var(--color-surface);
  border: 1px solid var(--color-surface-border);
  color: var(--color-text-secondary);
  font-size: 0.88rem;
  font-weight: 700;
  box-shadow: none;
}

.hero-visual {
  position: relative;
  min-height: 560px;
}

.hero-large .hero-visual {
  display: block;
}

.hero-image {
  width: 100%;
  height: 560px;
  object-fit: cover;
  border-radius: var(--radius-lg);
  border: 1px solid var(--color-surface-border);
  box-shadow: var(--shadow-soft);
}

/* DESIGN.md v3 : plus de degrade radial ni de texture de grille decorative sous le badge -
   ancien "carte mockup flottante" retire. Le panneau est un support sobre, pas un decor. */
.hero-icon-panel {
  position: relative;
  width: 100%;
  height: 560px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 24px;
  border-radius: var(--radius-lg);
  overflow: hidden;
  border: 1px solid var(--color-surface-border);
  background: var(--color-surface);
  box-shadow: var(--shadow-soft);
}

.hero-icon-panel-badge {
  position: relative;
  z-index: 1;
  display: grid;
  place-items: center;
  width: 128px;
  height: 128px;
  border-radius: var(--radius-md);
  background: color-mix(in srgb, var(--calc-accent, var(--color-brand-electric)) 12%, var(--color-surface));
  border: 1px solid color-mix(in srgb, var(--calc-accent, var(--color-brand-electric)) 30%, var(--color-surface-border));
  box-shadow: none;
}

.hero-icon-panel-badge svg {
  width: 64px;
  height: 64px;
  color: var(--calc-accent-deep, var(--color-brand-electric-deep));
}

.hero-icon-panel-label {
  position: relative;
  z-index: 1;
  color: var(--color-text-secondary);
  font-size: 0.92rem;
  text-align: center;
  max-width: 26ch;
  line-height: 1.6;
}

.section-block,
.calculator-intro,
.calculator-workspace,
.explanation-section,
.benefits-section,
.related-calculators-section,
.calculator-faq-section,
.final-cta-section {
  width: var(--calc-page-width);
  margin: 68px auto 0;
}

/* DESIGN.md v3 : carte standard - plus de verre translucide/backdrop-filter, un aplat de surface
   avec bordure fine et une ombre discrete (voir "Elevation & Depth"). */
.glass-card,
.calculator-card,
.premium-card,
.covo-cta-card {
  background: var(--color-surface);
  border: 1px solid var(--color-surface-border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-soft);
  backdrop-filter: none;
}

.section-head {
  margin-bottom: 18px;
}

.section-head h2,
.seo-inline-card h2,
.insight-card h3,
.faq-card summary,
.covo-cta-card h2,
.footer-columns h3,
.calculator-section .section-head h2,
.result-head h3 {
  margin: 0;
  color: var(--color-text-primary);
  letter-spacing: -0.02em;
  font-weight: 800;
}

.section-head h2,
.seo-inline-card h2,
.covo-cta-card h2 {
  font-size: clamp(1.6rem, 2.2vw, 2.2rem);
  line-height: 1.08;
}

.section-head p,
.seo-inline-card > p:not(.section-kicker),
.covo-cta-card > p,
.faq-card p,
.tool-card p,
.insight-card p,
.footer-brand p,
.footer-bottom p,
.calculator-section .section-head p {
  margin: 0;
  color: var(--calc-muted);
  line-height: 1.7;
  font-size: 0.98rem;
}

.seo-inline-section,
.recommendations-section,
.linked-tools-section,
.faq-section,
.covo-cta-section,
.calculator-section,
.calculator-workspace,
.calculator-intro,
.explanation-section,
.benefits-section,
.related-calculators-section,
.calculator-faq-section,
.final-cta-section {
  width: var(--calc-page-width);
  margin-left: auto;
  margin-right: auto;
}

.seo-inline-card {
  padding: 0;
  display: grid;
  gap: 18px;
  background: transparent;
  border: 0;
  box-shadow: none;
}

.insights-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 18px;
}

.insight-card {
  padding: 24px 22px 22px;
  border-radius: var(--radius-md);
  background: var(--color-surface);
  border: 1px solid var(--color-surface-border);
  position: relative;
  overflow: hidden;
}

/* La barre de tete degradee a d'abord ete remplacee par un aplat uni, puis retiree completement
   (detecteur Impeccable, "side-tab" : une bordure/bande coloree sur un bord de carte est l'un des
   tics visuels les plus reconnaissables d'une interface generee par IA). Ces quatre cartes sont
   de simples blocs de reassurance, pas des categories du site : elles n'ont pas besoin d'un
   codage couleur individuel pour rester lisibles - la hierarchie typographique suffit, comme sur
   .tool-card et .piliers-card ailleurs sur cette meme page. */

.tools-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 14px;
}

.tools-grid--square {
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 14px;
}

.tool-card {
  display: grid;
  gap: 10px;
  align-content: start;
  min-height: 170px;
  padding: 18px;
  border-radius: var(--radius-md);
  background: var(--color-surface);
  border: 1px solid var(--color-surface-border);
  text-decoration: none;
  box-shadow: none;
  transition: transform 180ms ease, box-shadow 180ms ease, border-color 180ms ease;
}

.tool-card--square {
  min-height: 108px;
  padding: 18px 18px 16px;
  border-radius: 18px;
  position: relative;
}

.tool-card:hover,
.tool-card:focus-visible {
  transform: translateY(-3px);
  outline: none;
  border-color: var(--calc-accent, var(--color-brand-electric));
  box-shadow: var(--shadow-soft);
}

.tool-card--square .tool-icon {
  width: 28px;
  height: 28px;
  border-radius: 9px;
}

.tool-card--square h3 {
  margin: 0;
  font-size: 1.02rem;
  line-height: 1.15;
  letter-spacing: -0.03em;
}

.tool-card--square p {
  margin: 0;
  color: var(--calc-muted);
  line-height: 1.55;
  font-size: 0.86rem;
  padding-right: 18px;
}

.tool-card--square::after {
  content: "›";
  position: absolute;
  right: 14px;
  bottom: 12px;
  color: var(--color-text-muted);
  font-size: 1.2rem;
  line-height: 1;
}

/* DESIGN.md, Shapes > Systeme d'icones : "Jamais dans un carre/cercle de fond colore sans
   fonction" - le fond .color-brand-soft et le border-radius formaient exactement ce carre
   decoratif. Icone conservee simple, en currentColor via --calc-accent (audit UI/UX, D5). */
.tool-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 34px;
  height: 34px;
  color: var(--calc-accent, var(--color-brand-electric));
  font-size: 0.72rem;
  font-weight: 800;
  letter-spacing: 0.04em;
}

.tool-icon svg {
  width: 16px;
  height: 16px;
}

.tool-card--square .tool-icon svg {
  width: 14px;
  height: 14px;
}

.faq-card {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 14px;
  background: transparent;
  border: 0;
  box-shadow: none;
}

.faq-card details {
  border-radius: var(--radius-md);
  background: var(--color-surface);
  border: 1px solid var(--color-surface-border);
  box-shadow: none;
  overflow: clip;
  transition: border-color 180ms ease, box-shadow 180ms ease, transform 180ms ease;
}

.faq-card details:hover {
  border-color: color-mix(in srgb, var(--calc-accent, var(--color-brand-electric)) 30%, var(--color-surface-border));
  box-shadow: var(--shadow-soft);
}

.faq-card summary {
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  min-height: 74px;
  padding: 18px 20px;
  cursor: pointer;
}

.faq-card summary::-webkit-details-marker {
  display: none;
}

.faq-card p {
  padding: 0 20px 18px;
}

.covo-cta-section {
  margin-top: 66px;
}

.covo-cta-card {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: 18px;
  align-items: center;
  padding: 24px;
}

.covo-cta-copy {
  display: grid;
  gap: 12px;
}

.covo-cta-button,
.result-cta {
  min-width: 160px;
}

.calculator-grid {
  display: grid;
  /* Result panel gets slightly more room than the form (~54/46 rather than
     the previous ~52/48), with sane minimums so neither column gets
     cramped between breakpoints. */
  grid-template-columns: minmax(360px, 0.88fr) minmax(420px, 1fr);
  gap: 18px;
  align-items: start;
}

.calculator-form-card,
.calculator-card,
.result-card {
  position: relative;
}

.calculator-form-card,
.result-card {
  padding: 28px;
}

.calculator-form {
  display: grid;
  gap: 18px;
}

.input-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: 14px;
  align-items: center;
  padding: 0;
}

.input-label-group {
  display: grid;
  gap: 6px;
}

.input-label-group small {
  color: var(--calc-muted);
  font-size: 0.84rem;
  line-height: 1.4;
  max-width: 46ch;
}

.input-control {
  display: inline-flex;
  align-items: stretch;
  min-height: 54px;
  min-width: 180px;
  border-radius: var(--radius-md);
  overflow: clip;
  border: 1px solid var(--color-surface-border);
  background: var(--color-background-primary);
  box-shadow: none;
  transition: border-color 180ms ease, box-shadow 180ms ease, background-color 180ms ease;
}

.input-control:hover {
  border-color: color-mix(in srgb, var(--calc-accent) 40%, var(--color-surface-border));
  background: var(--color-surface);
}

.input-control:focus-within {
  border-color: var(--calc-accent-deep, var(--color-brand-electric-deep));
  background: var(--color-surface);
  box-shadow: 0 0 0 4px var(--color-brand-soft);
}

.input-control input:focus-visible,
.input-control select:focus-visible {
  outline: none;
}

/* Disabled fields must look unmistakably inactive. */
.input-control:has(:disabled) {
  opacity: 0.55;
}

.input-control:has(:disabled) input,
.input-control:has(:disabled) select {
  cursor: not-allowed;
}

/* No radio field exists in the registry today, but style it defensively so
   a future one matches the rest of the system with no extra work. */
.input-control input[type="radio"] {
  width: 22px;
  height: 22px;
  accent-color: var(--calc-accent-deep, var(--color-brand-electric-deep));
}

.input-control input,
.input-control select {
  flex: 1 1 auto;
  min-width: 0;
  padding: 0 16px;
  border: 0;
  background: transparent;
  color: var(--color-text-primary);
  font: inherit;
  font-size: 0.98rem;
  font-weight: 700;
  outline: none;
}

/* body is color-scheme: light (see the base rule above), so the native <select> popup already
   renders light by default - no explicit color-scheme override needed here anymore. */
.input-control select option {
  background-color: var(--color-surface);
  color: var(--color-text-primary);
  font-weight: 700;
}

/* Suffix (€, %, mois, km...) reads as a unit label, not a second button. */
.input-control strong {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 54px;
  padding: 0 14px;
  color: var(--calc-muted);
  border-left: 1px solid var(--color-surface-border);
  background: transparent;
  font-size: 0.86rem;
  font-weight: 700;
  white-space: nowrap;
}

.input-control:has(input[type="checkbox"]) {
  justify-content: flex-start;
  padding: 0 18px;
}

/* Slightly larger toggle switch than the original 44x26 - the real tap
   target is already the full row via the native <label for>, this just
   improves the visual affordance on touch screens. */
.input-control input[type="checkbox"] {
  appearance: none;
  -webkit-appearance: none;
  position: relative;
  flex: 0 0 auto;
  align-self: center;
  width: 46px;
  height: 27px;
  padding: 0;
  margin: 0;
  border-radius: var(--radius-pill);
  background: var(--color-surface-border);
  border: 1px solid var(--color-surface-border);
  box-shadow: none;
  cursor: pointer;
  transition: background-color 180ms ease, border-color 180ms ease;
}

.input-control input[type="checkbox"]::before {
  content: "";
  position: absolute;
  top: 2px;
  left: 2px;
  width: 21px;
  height: 21px;
  border-radius: 50%;
  background: var(--color-surface);
  box-shadow: 0 2px 6px rgba(15, 23, 42, 0.25);
  transition: transform 180ms cubic-bezier(0.22, 1, 0.36, 1);
}

/* Un seul aplat de la couleur d'action du site - le degrade bleu -> violet est retire
   (DESIGN.md v3 interdit les degrades decoratifs, y compris sur les toggles). */
.input-control input[type="checkbox"]:checked {
  background: var(--calc-accent);
  border-color: transparent;
}

.input-control input[type="checkbox"]:checked::before {
  transform: translateX(19px);
}

.input-control input[type="checkbox"]:focus-visible {
  outline: 2px solid var(--color-focus-ring, rgba(37, 99, 235, 0.72));
  outline-offset: 3px;
}

/* DESIGN.md v3, "Resultat de calcul (composant signature)" : plus de halo radial derriere le
   resultat. Une bordure coloree pleine sur un cote de carte a ete essayee puis retiree (detecteur
   Impeccable, "side-tab" : c'est un des tics visuels les plus reconnaissables d'une interface
   generee par IA, et ca contredit la "Regle du Murmure de Categorie" du systeme). La distinction
   vient du chiffre lui-meme (le plus grand texte de la page, en Archivo extra-bold), pas d'un
   cadre colore. */
.result-card {
  overflow: clip;
  background: var(--color-surface);
}

.result-card::before {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  border: 1px solid var(--color-surface-border);
  pointer-events: none;
}

.result-head {
  display: grid;
  gap: 10px;
  margin-bottom: 18px;
}

.result-lead {
  margin: 0;
  color: var(--calc-muted);
  line-height: 1.65;
}

.result-value {
  margin: 0;
  font-family: "Archivo", system-ui, sans-serif;
  font-size: clamp(2.4rem, 5vw, 3.7rem);
  font-weight: 800;
  letter-spacing: -0.02em;
  color: var(--color-text-primary);
  overflow-wrap: anywhere;
}

.result-value span {
  color: var(--calc-accent-deep, var(--color-brand-electric-deep));
}

.result-caption,
.result-impact {
  margin: 0;
  color: var(--calc-muted);
}

.result-alert-row {
  display: flex;
  align-items: center;
  gap: 10px;
}

.result-alert {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  flex: 1 1 auto;
  min-height: 46px;
  padding: 0 14px;
  border-radius: var(--radius-sm);
  background: var(--color-background-primary);
  border: 1px solid var(--color-surface-border);
  color: var(--color-text-secondary);
}

/* The info bubble already carried an aria-label and a data-tooltip string
   on every calculator page, but nothing ever rendered that content - it
   was a dead control. The rules below (and the ::after popover further
   down) make it functional: visible on hover/keyboard-focus for free via
   CSS, and toggleable by tap via the aria-expanded attribute a small
   shared script in calculator-template.js flips on click. No new copy is
   introduced - the tooltip only ever displays the data-tooltip text that
   was already there. */
.info-bubble {
  position: relative;
  width: 36px;
  height: 36px;
  min-width: 36px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 0;
  border-radius: 50%;
  background: var(--color-brand-soft);
  color: var(--color-brand-electric-deep);
  font-weight: 800;
  cursor: pointer;
  transition: background-color 180ms ease;
}

.info-bubble:hover,
.info-bubble:focus-visible {
  background: color-mix(in srgb, var(--color-brand-electric) 22%, transparent);
  outline: none;
}

.info-bubble:focus-visible {
  box-shadow: 0 0 0 3px var(--color-brand-soft);
}

/* Tooltip sombre volontaire (inversion de contraste) : c'est une info-bulle flottante au-dessus
   du contenu, pas une surface du systeme - elle doit rester lisible sur n'importe quel fond
   qu'elle survole. */
.info-bubble:hover::after,
.info-bubble:focus-visible::after,
.info-bubble[aria-expanded="true"]::after {
  content: attr(data-tooltip);
  position: absolute;
  bottom: calc(100% + 10px);
  right: 0;
  width: max-content;
  max-width: min(280px, 70vw);
  padding: 10px 12px;
  border-radius: var(--radius-sm);
  background: var(--color-text-primary);
  border: 1px solid var(--color-text-primary);
  box-shadow: var(--shadow-soft);
  color: #fff;
  font-size: 0.8rem;
  font-weight: 500;
  line-height: 1.5;
  text-align: left;
  white-space: normal;
  z-index: 20;
}

.result-scale-wrap {
  position: relative;
  height: 28px;
  margin-top: 8px;
}

/* Gauge marker: it was never actually positioned (no position:absolute),
   so the JS-computed offset (style.left, unchanged here) had zero visual
   effect. This restores the intended layout only - the math is untouched. */
.result-scale-marker {
  position: absolute;
  top: 0;
  transform: translateX(-50%);
  display: inline-flex;
  align-items: center;
  gap: 4px;
  white-space: nowrap;
  padding: 3px 10px;
  border-radius: var(--radius-pill);
  background: var(--color-text-primary);
  border: 1px solid var(--color-text-primary);
  box-shadow: var(--shadow-soft);
  font-size: 0.72rem;
  font-weight: 800;
  color: #fff;
  z-index: 1;
}

.result-scale-marker-arrow {
  color: var(--calc-accent-deep, var(--color-brand-electric-deep));
  font-size: 0.7rem;
  line-height: 1;
}

.result-scale,
.result-scale-labels {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 8px;
}

.scale-bar {
  height: 10px;
  border-radius: var(--radius-pill);
  background: var(--color-surface-border);
}

/* DESIGN.md v3 : chaque segment de la jauge est un aplat semantique unique, plus de degrade. */
.scale-bar-red { background: var(--color-error); }
.scale-bar-amber { background: var(--color-warning); }
.scale-bar-green { background: var(--color-success); }
.scale-bar-green-soft { background: var(--color-category-indigo); }

.result-scale-labels {
  margin-top: 6px;
  color: var(--calc-soft);
  font-size: 0.76rem;
}

.result-meta {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 12px;
  margin-top: 18px;
}

.result-meta p {
  display: grid;
  gap: 6px;
  margin: 0;
  padding: 14px 16px;
  border-radius: var(--radius-md);
  background: var(--color-background-primary);
  border: 1px solid var(--color-surface-border);
}

.result-meta span {
  color: var(--calc-soft);
  font-size: 0.74rem;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  font-weight: 800;
}

.result-meta strong {
  color: var(--color-text-primary);
  font-size: 0.98rem;
}

.input-note {
  margin: 6px 0 0;
  color: var(--calc-soft);
  font-size: 0.88rem;
}

/* Visually secondary - it must never compete with the result. Pill shape,
   min-height and font-weight come from the shared button rule above; only
   the surface (background/border/color/weight) needs to look muted here. */
.input-footer {
  width: 100%;
  margin-top: 14px;
  gap: 8px;
  background: var(--color-background-primary);
  border: 1px solid var(--color-surface-border);
  color: var(--calc-muted);
  font-weight: 600;
  font-size: 0.88rem;
}

.input-footer:hover,
.input-footer:focus-visible {
  border-color: var(--calc-accent-deep, var(--color-brand-electric-deep));
  background: var(--color-surface);
  color: var(--color-text-primary);
}

.input-footer:focus-visible {
  box-shadow: 0 0 0 3px var(--color-brand-soft);
}

.input-footer .footer-arrow {
  opacity: 0.65;
}

.site-footer {
  width: 100vw;
  margin-top: auto;
  padding: 0;
  margin-left: calc(50% - 50vw);
  margin-right: calc(50% - 50vw);
}

/* DESIGN.md v3 : plus de bande sombre translucide en pied de page - le systeme est clair unique
   (voir "Ce que ce systeme a delibberement abandonne"). Le pied de page se distingue par une
   simple bordure haute, comme le reste du site. */
.site-footer__inner {
  max-width: 1280px;
  margin: 0 auto;
  padding: 88px 40px 48px;
  box-sizing: border-box;
  border: 0;
  border-top: 1px solid var(--color-surface-border);
  border-radius: 0;
  background: var(--color-surface);
  box-shadow: none;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}

.site-footer__columns {
  display: grid;
  grid-template-columns: minmax(0, 1.8fr) repeat(3, minmax(0, 1fr));
  column-gap: 72px;
  row-gap: 48px;
  margin-top: 0;
  align-items: start;
}

.site-footer__brand {
  display: grid;
  gap: 20px;
  margin-bottom: 0;
  max-width: 38ch;
}

.footer-brand-link {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  text-decoration: none;
  color: inherit;
}

.footer-brand-mark {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border-radius: var(--radius-sm);
  object-fit: contain;
  box-shadow: none;
}

.footer-brand-wordmark {
  font-family: "Public Sans", sans-serif;
  font-size: 1.4rem;
  font-weight: 800;
  letter-spacing: -0.02em;
  color: var(--color-text-primary);
}

.footer-brand-wordmark span {
  color: var(--color-brand-electric);
  font-family: "Archivo", system-ui, sans-serif;
}

.site-footer__tagline {
  margin: 0;
  color: var(--color-text-secondary);
  line-height: 1.65;
  font-size: 0.86rem;
  max-width: 36ch;
}

.site-footer__badges {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 2px;
}

.site-footer__badge {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 7px 13px;
  border-radius: var(--radius-pill);
  border: 1px solid var(--color-surface-border);
  background: var(--color-background-primary);
  color: var(--color-text-secondary);
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.01em;
  white-space: nowrap;
}

.site-footer__badge-icon {
  width: 13px;
  height: 13px;
  color: var(--color-brand-electric);
  flex-shrink: 0;
}

.site-footer__col {
  display: grid;
  gap: 18px;
  align-content: start;
}

.site-footer__col strong {
  font-size: 0.8rem;
  letter-spacing: 0.13em;
  text-transform: uppercase;
  color: var(--color-text-primary);
  margin-bottom: 2px;
}

.site-footer__col a {
  color: var(--color-text-secondary);
  transition: color 200ms ease, transform 200ms ease;
  font-size: 0.82rem;
  line-height: 1.4;
  width: fit-content;
}

.site-footer__col a:hover {
  color: var(--color-brand-electric);
  transform: translateX(3px);
}

.site-footer__col a:focus-visible {
  color: var(--color-brand-electric);
  transform: translateX(3px);
  outline: 2px solid var(--color-focus-ring, rgba(37, 99, 235, 0.72));
  outline-offset: 3px;
}

.site-footer__meta {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 16px;
  margin-top: 64px;
  padding-top: 32px;
  border-top: 1px solid var(--color-surface-border);
  color: var(--color-text-muted);
  font-family: "Archivo", system-ui, sans-serif;
  font-size: 0.68rem;
  text-align: center;
}

.site-footer__meta span {
  flex: 1 1 auto;
  text-align: center;
}

.site-footer__socials {
  display: flex;
  align-items: center;
  gap: 18px;
}

.site-footer__socials a {
  color: var(--color-text-secondary);
  transition: color 200ms ease, transform 200ms ease;
}

.site-footer__socials a:hover {
  color: var(--color-brand-electric);
  transform: translateY(-2px);
}

.site-footer__socials a:focus-visible {
  color: var(--color-brand-electric);
  transform: translateY(-2px);
  outline: 2px solid var(--color-focus-ring, rgba(37, 99, 235, 0.72));
  outline-offset: 3px;
  border-radius: 4px;
}

.site-footer__socials svg {
  display: block;
  width: 16px;
  height: 16px;
}

@media (max-width: 1100px) {
  .site-footer__columns {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    column-gap: 48px;
    row-gap: 40px;
  }

  .site-footer__brand {
    grid-column: 1 / -1;
    max-width: 52ch;
  }
}

@media (max-width: 720px) {
  .site-footer__inner {
    padding: 64px 24px 40px;
  }

  .site-footer__columns {
    grid-template-columns: 1fr;
    row-gap: 40px;
  }

  .site-footer__brand {
    max-width: none;
  }
}

.member-secondary-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 46px;
  padding: 0 22px;
  border-radius: 999px;
  font-size: 0.9rem;
  font-weight: 700;
  letter-spacing: -0.01em;
  cursor: pointer;
  transition: transform 180ms ease, border-color 180ms ease, background-color 180ms ease;
  border: 1px solid var(--color-surface-border);
  background: var(--color-surface);
  color: var(--color-text-primary);
}

.member-secondary-button:hover,
.member-secondary-button:focus-visible {
  transform: translateY(-1px);
  outline: none;
}

.member-feedback {
  width: var(--calc-page-width);
  margin: 10px auto 0;
  color: var(--calc-muted);
  font-size: 0.86rem;
}

.member-feedback:empty {
  display: none;
}

@media (max-width: 1100px) {
  .hero-large.calc-hero-shell,
  .calculator-grid,
  .covo-cta-card,
  .footer-shell {
    grid-template-columns: 1fr;
  }

  .insights-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .tools-grid,
  .tools-grid--square {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

}

@media (max-width: 720px) {
  body.layout-premium-page[class*="calc-page-"] .page-shell {
    width: min(100% - 24px, 100%);
    padding-top: 10px;
    padding-bottom: 30px;
  }

  .prototype-topnav {
    grid-template-columns: 1fr;
    gap: 12px;
    padding: 12px 14px;
  }

  .prototype-topnav.calculator-topnav .topnav-actions--spacer,
  .prototype-topnav.calc-topnav .topnav-actions--spacer {
    display: none;
  }

  .prototype-nav {
    justify-content: flex-start;
  }

  .topnav-actions {
    flex-wrap: wrap;
  }

  .hero-large.calc-hero-shell {
    gap: 24px;
  }

  /* Le fil d'Ariane partage la classe .hero-trust avec les badges de reassurance ; la regle
     mobile de home-premium.css (.hero-trust { flex-direction: column }) est pensee pour ces
     badges (un par ligne) mais casse le fil d'Ariane (chaque "Accueil › Transport › ..." sur sa
     propre ligne pleine largeur). Le selecteur compose, deja utilise pour le style par defaut
     ci-dessus, reprend la main ici avec une specificite superieure. */
  .hero-trust.hero-breadcrumb {
    flex-direction: row;
    align-items: center;
  }

  .hero-trust.hero-breadcrumb a,
  .hero-trust.hero-breadcrumb span {
    width: auto;
  }

  .hero-visual {
    min-height: auto;
  }

  .hero-image {
    height: 360px;
  }

  .hero-icon-panel {
    height: 320px;
    gap: 18px;
  }

  .hero-icon-panel-badge {
    width: 96px;
    height: 96px;
    border-radius: var(--radius-lg);
  }

  .hero-icon-panel-badge svg {
    width: 48px;
    height: 48px;
  }

  .insights-grid,
  .tools-grid,
  .tools-grid--square,
  .faq-card,
  .result-meta,
  .footer-columns {
    grid-template-columns: 1fr;
  }

  .input-row {
    grid-template-columns: 1fr;
  }

  .input-control {
    width: 100%;
    min-width: 0;
  }

  .calculator-form-card,
  .result-card,
  .covo-cta-card,
  .footer-shell {
    padding: 20px;
  }

  .footer-shell {
    grid-template-columns: 1fr;
    padding: 48px 20px 24px;
  }

  .footer-bottom {
    margin-top: 28px;
    padding-top: 18px;
  }
}

/* ==========================================================================
   Calculator pages — UX optimization (shared, applies to every calculator
   page). Content-driving elements below (.calc-demo, .result-breakdown,
   .result-interpretation, .understand-result-grid) only render where a
   page's HTML/JS actually populates them; elsewhere they stay empty/absent
   and these rules have no visible effect.
   ========================================================================== */

body[class*="calc-page-"] .hero-large.calc-hero-shell {
  padding: 8px 0 12px;
}

body[class*="calc-page-"] .hero-content {
  padding: 14px 0 10px;
}

body[class*="calc-page-"] .hero-large h1 {
  font-size: clamp(2.2rem, 3.4vw, 3.4rem);
  line-height: 1.02;
}

body[class*="calc-page-"] .hero-subtitle {
  margin-top: 12px;
  font-size: 1rem;
  line-height: 1.6;
}

body[class*="calc-page-"] .hero-cta {
  margin-top: 18px;
}

body[class*="calc-page-"] .hero-trust {
  margin-top: 14px;
}

body[class*="calc-page-"] .hero-visual {
  min-height: 0;
}

/* DESIGN.md v3 : plus de degrade radial + fond quasi-noir sous cette carte de demonstration -
   c'etait la "carte mockup flottante" que le systeme interdit desormais. Meme traitement sobre
   que .hero-icon-panel : surface, bordure fine, ombre discrete. */
.calc-demo {
  position: relative;
  display: grid;
  gap: 14px;
  padding: 26px;
  border-radius: var(--radius-lg);
  border: 1px solid var(--color-surface-border);
  background: var(--color-surface);
  box-shadow: var(--shadow-soft);
}

.calc-demo__kicker {
  margin: 0;
  color: var(--calc-soft);
  font-size: 0.72rem;
  font-weight: 800;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

.calc-demo__rows {
  display: grid;
  gap: 10px;
}

.calc-demo__row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding-bottom: 10px;
  border-bottom: 1px solid var(--color-surface-border);
}

.calc-demo__row span {
  color: var(--calc-muted);
  font-size: 0.92rem;
}

.calc-demo__row strong {
  color: var(--color-text-primary);
  font-weight: 700;
  font-size: 0.98rem;
}

.calc-demo__divider {
  height: 1px;
  margin: 2px 0;
  background: var(--color-surface-border);
}

.calc-demo__highlight {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 14px 16px;
  border-radius: var(--radius-md);
  background: var(--color-background-primary);
  border: 1px solid var(--color-surface-border);
}

.calc-demo__highlight span {
  color: var(--calc-muted);
  font-size: 0.9rem;
  font-weight: 700;
}

.calc-demo__highlight strong {
  color: var(--color-text-primary);
  font-size: 1.3rem;
  font-weight: 800;
  letter-spacing: -0.02em;
}

.calc-demo__highlight--accent {
  border-color: color-mix(in srgb, var(--calc-accent) 30%, var(--color-surface-border));
}

.calc-demo__highlight--accent strong {
  color: var(--calc-accent-deep, var(--color-brand-electric-deep));
}

/* Form hierarchy: separate advanced options from the main fields.
   .input-row--advanced is added by buildField() whenever a registry field
   has advanced:true; the divider only renders at the transition point. */
#prototype-calculator-form.calculator-form {
  gap: 16px;
}

.input-row:not(.input-row--advanced) + .input-row--advanced,
.calculator-form > .input-row--advanced:first-child {
  position: relative;
  margin-top: 24px;
  padding-top: 26px;
}

.input-row:not(.input-row--advanced) + .input-row--advanced::before,
.calculator-form > .input-row--advanced:first-child::before {
  content: "Options avancées";
  position: absolute;
  top: 0;
  left: 0;
  color: var(--calc-soft);
  font-size: 0.74rem;
  font-weight: 800;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}

.input-row:not(.input-row--advanced) + .input-row--advanced::after,
.calculator-form > .input-row--advanced:first-child::after {
  content: "";
  position: absolute;
  top: 16px;
  left: 0;
  right: 0;
  height: 1px;
  background: var(--color-surface-border);
}

/* Result storytelling: breakdown rows + adaptive interpretation.
   Empty on any calculator whose isXXXPage branch hasn't populated them yet. */
.result-breakdown:empty,
.result-interpretation:empty {
  display: none;
}

.result-breakdown {
  display: grid;
  gap: 8px;
  margin-top: 18px;
  padding-top: 16px;
  border-top: 1px solid var(--color-surface-border);
}

.result-breakdown__row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 12px;
  row-gap: 4px;
  font-size: 0.9rem;
}

.result-breakdown__row span {
  flex: 1 1 auto;
  min-width: 0;
  color: var(--calc-muted);
}

.result-breakdown__row strong {
  flex: 0 0 auto;
  text-align: right;
  color: var(--color-text-primary);
  font-weight: 700;
}

.result-breakdown__divider {
  height: 1px;
  margin: 4px 0;
  background: var(--color-surface-border);
}

.result-breakdown__row--total span,
.result-breakdown__row--total strong {
  color: var(--color-text-primary);
  font-size: 0.98rem;
  font-weight: 800;
}

.result-breakdown__row--split strong {
  color: var(--calc-accent-deep, var(--color-brand-electric-deep));
  font-size: 1.05rem;
  font-weight: 850;
}

/* --- Composants propres a /calcul-prix-revient-km/ : classes uniques (prefixe prk-), rendues       */
/* soit par la branche isPrkPage de run() dans calculator-template.js, soit directement dans le      */
/* HTML de cette seule page (ex. .prk-skip-link). Aucun autre calculateur ne genere ces elements ;    */
/* les regles ci-dessous n'ont donc d'effet visuel sur aucune autre page.                             */

.prk-skip-link {
  position: absolute;
  top: -48px;
  left: 12px;
  z-index: 1000;
  padding: 12px 20px;
  border-radius: 10px;
  background: var(--calc-accent, #2563EB);
  color: #fff;
  font-weight: 800;
  font-size: 0.86rem;
  text-decoration: none;
  transition: top 180ms cubic-bezier(0.4, 0, 0.2, 1);
}

.prk-skip-link:focus-visible {
  top: 12px;
  outline: 2px solid #fff;
  outline-offset: 2px;
}

@media (prefers-reduced-motion: reduce) {
  .prk-skip-link {
    transition-duration: 0.01ms !important;
  }
}

.prk-breakdown-heading {
  margin: 0 0 2px;
  color: var(--calc-soft);
  font-size: 0.72rem;
  font-weight: 800;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}

.prk-usage-note {
  margin: 2px 0 4px;
  padding: 8px 10px;
  border-radius: var(--radius-sm);
  background: var(--color-background-primary);
  color: var(--calc-soft);
  font-size: 0.8rem;
  line-height: 1.5;
}

.prk-expert-toggle-wrap {
  grid-column: 1 / -1;
  margin: 4px 0 8px;
}

/* Reveal des champs avances : scope au body de cette page (.calc-page-calcul-prix-revient-km) car
   .input-row--advanced est une classe partagee par tous les calculateurs a options avancees -
   ces regles n'ont donc d'effet que sur cette page. Corrige apres coup (detecteur Impeccable,
   antipattern layout-transition) : une premiere version transitionnait max-height, ce qui provoque
   du layout thrash et contredit directement le Don't de DESIGN.md ("ne jamais animer une propriete
   de mise en page ; seules couleur, ombre, opacite et un leger translateY sont autorises"). Le
   masquage reste donc un display:none binaire (zero cout d'animation de layout), et seule
   l'apparition est animee via une @keyframes opacity+translateY qui rejoue naturellement a chaque
   passage display:none -> display:block (comportement standard des animations CSS). */
@keyframes prk-advanced-reveal {
  from { opacity: 0; transform: translateY(-6px); }
  to { opacity: 1; transform: translateY(0); }
}

body.calc-page-calcul-prix-revient-km .input-row--advanced {
  animation: prk-advanced-reveal 240ms cubic-bezier(0.4, 0, 0.2, 1);
}

body.calc-page-calcul-prix-revient-km .input-row--advanced.prk-advanced-hidden {
  display: none;
}

@media (prefers-reduced-motion: reduce) {
  body.calc-page-calcul-prix-revient-km .input-row--advanced {
    animation: none;
  }
}

.prk-expert-toggle {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  min-height: 44px;
  padding: 0 18px;
  border: 1px solid var(--color-surface-border);
  border-radius: var(--radius-pill);
  background: var(--color-surface);
  color: var(--calc-text);
  font: inherit;
  font-size: 0.86rem;
  font-weight: 700;
  cursor: pointer;
  transition: transform 180ms cubic-bezier(0.4, 0, 0.2, 1), border-color 180ms cubic-bezier(0.4, 0, 0.2, 1), background-color 180ms cubic-bezier(0.4, 0, 0.2, 1);
}

.prk-expert-toggle:hover,
.prk-expert-toggle:focus-visible {
  border-color: var(--calc-accent-deep, var(--color-brand-electric-deep));
  background: var(--color-background-primary);
  outline: none;
}

.prk-expert-toggle:focus-visible {
  outline: 2px solid var(--color-focus-ring, rgba(37, 99, 235, 0.72));
  outline-offset: 2px;
}

.prk-expert-toggle:active {
  transform: scale(0.97);
  transition-duration: 100ms;
}

.prk-expert-toggle[aria-expanded="true"] {
  border-color: var(--calc-accent-deep, var(--color-brand-electric-deep));
  color: var(--calc-accent-deep, var(--color-brand-electric-deep));
}

.prk-simulations {
  grid-column: 1 / -1;
  margin-top: 18px;
  padding-top: 18px;
  border-top: 1px solid var(--color-surface-border);
}

.prk-simulations__heading {
  margin: 0 0 12px;
  color: var(--calc-text);
  font-size: 0.98rem;
  font-weight: 800;
}

.prk-simulations__grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 12px;
}

.prk-sim-card {
  padding: 14px 16px;
  border: 1px solid var(--color-surface-border);
  border-radius: var(--radius-md);
  background: var(--color-background-primary);
}

.prk-sim-card__title {
  margin: 0 0 6px;
  color: var(--calc-muted);
  font-size: 0.82rem;
  font-weight: 700;
}

.prk-sim-card__value {
  margin: 0;
  color: var(--color-text-primary);
  font-family: "Archivo", system-ui, sans-serif;
  font-size: 1.1rem;
  font-weight: 700;
}

.prk-sim-card__delta {
  margin: 4px 0 0;
  font-size: 0.8rem;
  font-weight: 700;
  color: var(--calc-muted);
}

.prk-sim-card__delta--up {
  color: var(--color-error);
}

.prk-sim-card__delta--down {
  color: var(--color-success-deep);
}

.prk-sim-card__note {
  margin: 8px 0 0;
  color: var(--calc-soft);
  font-size: 0.76rem;
  line-height: 1.5;
}

@media (prefers-reduced-motion: reduce) {
  .prk-expert-toggle {
    transition-duration: 0.01ms !important;
  }
}

.prk-method-heading {
  margin: 0;
  color: var(--color-text-primary);
  font-size: 1.1rem;
  font-weight: 800;
  letter-spacing: -0.02em;
}

/* Tableaux SEO (bareme fiscal, reperes de cout par vehicule) - deplaces ici depuis un <style> local
   au <head> de la page (Phase 18), qui dupliquait ce meme patron "classes prk- partagees" sans
   raison : contenu statique de la section d'explication, aucun lien avec le Result Engine. */
.prk-table-wrap {
  overflow-x: auto;
  margin: 16px 0;
  border: 1px solid var(--color-surface-border);
  border-radius: var(--radius-md);
}

.prk-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 0.92em;
}

.prk-table th,
.prk-table td {
  padding: 10px 14px;
  text-align: left;
  border-bottom: 1px solid var(--color-surface-border);
}

.prk-table th {
  font-weight: 600;
  color: var(--color-text-secondary);
  background: rgba(0, 0, 0, 0.02);
}

.prk-table tbody tr:last-child td {
  border-bottom: none;
}

/* Utilitaire visually-hidden standard - generique, pas prk-specifique. Utilise ici pour les
   <caption> des tableaux ci-dessus ; reutilisable par une future page sans duplication. */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* Les deux corrections de contraste qui vivaient ici (couleur du lien de sources, kicker en aplat
   accent + texte blanc) ont ete ecrites contre l'ancien theme sombre. Le systeme clair unique
   (DESIGN.md v3) resout deja ces deux problemes par ses regles de base partagees
   (.seo-inline-card__sources a et .hero-kicker) - un aplat --calc-accent (parfois un cyan clair
   selon la categorie) avec du texte blanc echouerait meme le contraste AA ici. Les deux
   overrides sont donc retirees plutot que reconduites. */

/* Resserrage du hero (audit critique, P0) : sur desktop le calculateur demarrait a y=947px,
   entierement sous la ligne de flottaison - contraire a la regle produit de DESIGN.md. Aucun
   contenu retire, uniquement des marges reduites, scopees a cette page (.hero-cta, .hero-trust
   sont des classes partagees par les autres calculateurs). */
body.calc-page-calcul-prix-revient-km .hero-large.calc-hero-shell {
  padding: 4px 0 10px;
}

body.calc-page-calcul-prix-revient-km .hero-kicker {
  margin-bottom: 8px;
}

body.calc-page-calcul-prix-revient-km .hero-subtitle {
  margin-top: 10px;
}

body.calc-page-calcul-prix-revient-km .hero-cta {
  margin-top: 16px;
}

body.calc-page-calcul-prix-revient-km .hero-reassurance {
  margin-top: 6px;
}

body.calc-page-calcul-prix-revient-km .hero-trust:not(.hero-breadcrumb) {
  margin-top: 10px;
}

body.calc-page-calcul-prix-revient-km .hero-trust.hero-breadcrumb {
  margin: 0 0 14px;
}

/* Resserrage du hero (Golden Template pilote, phase 2 - audit UI/UX) : a 1440x900 le calculateur
   n'etait pas seulement sous la ligne de flottaison, il en etait pousse encore plus loin par le
   defilement automatique du navigateur vers le champ #personnes en autofocus (corrige separement
   dans calculator-registry.js). Ce resserrage reduit en plus la hauteur du hero lui-meme, sur le
   meme principe que calcul-prix-revient-km ci-dessus (marges reduites, aucun contenu retire ici -
   .hero-cta, .hero-trust sont des classes partagees par les autres calculateurs). */
body.calc-page-calcul-budget-courses .hero-large.calc-hero-shell {
  padding: 4px 0 10px;
}

body.calc-page-calcul-budget-courses .hero-kicker {
  margin-bottom: 8px;
}

body.calc-page-calcul-budget-courses .hero-subtitle {
  margin-top: 10px;
}

body.calc-page-calcul-budget-courses .hero-cta {
  margin-top: 16px;
}

body.calc-page-calcul-budget-courses .hero-trust:not(.hero-breadcrumb) {
  margin-top: 10px;
}

body.calc-page-calcul-budget-courses .hero-trust.hero-breadcrumb {
  margin: 0 0 14px;
}

/* ==========================================================================
   Result Engine (Phase 5 - composant de design system, docs/RESULT_ENGINE.md)
   ==========================================================================
   Remplace le bloc Phase 4 (scope body.calc-page-calcul-budget-courses) par un
   composant generique : toute la specificite est portee par la classe
   .result-engine-v2, ajoutee par calculator-template.js uniquement quand une
   page declare config.resultEngine.trace dans calculator-registry.js. Une
   page qui ne declare pas cette cle continue de rendre l'ancien moteur a
   l'identique - aucun changement visuel pour elle. Valide sur page pilote
   (Phase 4, calcul-budget-courses) puis reconduit a l'identique ici. */

/* Le noyau du moteur precedent devient redondant des qu'un calculateur
   adopte la Data Trace : jauge (necessite un texte d'explication pour
   fonctionner seule, exclue par le laboratoire C -> D1), doublons de texte
   (#result-caption, #result-interpretation) et .result-meta (labels
   statiques par regex de chemin, decorreles des valeurs reellement
   affichees - voir l'audit systeme dans le livrable Phase 5, section "Bug
   result-meta"). Masque uniquement pour les pages qui adoptent le nouveau
   moteur ; toujours genere normalement ailleurs. */
.result-engine-v2 .result-alert-row,
.result-engine-v2 .result-scale-wrap,
.result-engine-v2 .result-scale,
.result-engine-v2 .result-scale-labels,
.result-engine-v2 #result-caption,
.result-engine-v2 .result-meta,
.result-engine-v2 #result-interpretation {
  display: none;
}

/* Data Trace : Archivo, tabular-nums, couleur neutre (--color-text-muted,
   pas le bleu de marque - confirme par le test neutre/accent sur page
   pilote : le bleu se lit comme un lien cliquable et fait remonter la
   trace au-dessus de son rang dans la hierarchie). flex-wrap permet un
   repli propre sur 2 lignes a 360px sans jamais reduire la taille de police
   (section 11 de la specification Phase 5). */
.result-engine-v2 .re-trace-line {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  row-gap: 2px;
  gap: 6px;
  margin: 0 0 4px;
  font-family: "Archivo", system-ui, sans-serif;
  font-weight: 700;
  font-size: 0.94rem;
  font-variant-numeric: tabular-nums lining-nums;
  color: var(--color-text-muted);
}
.result-engine-v2 .re-trace-line .re-sep {
  color: var(--color-surface-border);
}

/* Encoche E1 : signature graphique unique du composant, geometrie figee
   (identite validee - Phase 4). Purement decorative (aria-hidden dans le
   HTML), jamais porteuse d'une information indispensable, jamais
   transformee en icone generique. */
.result-engine-v2 .re-gesture-e1 {
  position: relative;
  width: var(--result-gesture-width);
  height: var(--result-gesture-height);
  margin: 2px 0 6px 1px;
}
.result-engine-v2 .re-gesture-e1::before {
  content: "";
  position: absolute;
  left: 0; top: 0; bottom: 0;
  width: var(--result-gesture-stroke);
  background: var(--color-text-muted);
}
.result-engine-v2 .re-gesture-e1::after {
  content: "";
  position: absolute;
  left: 0; top: 4px;
  width: 7px;
  height: var(--result-gesture-stroke);
  background: var(--color-text-muted);
  transition: transform var(--result-motion-duration) cubic-bezier(0.4, 0, 0.2, 1);
}
.result-engine-v2 .re-gesture-e1.is-transforming::after {
  transform: translateY(2px);
}

@media (prefers-reduced-motion: reduce) {
  .result-engine-v2 .re-gesture-e1::after {
    transition: none;
  }
}

/* Bogue de flexbox partage decouvert pendant l'integration pilote (Phase 4) :
   un item flex ne retrecit pas sous sa largeur de contenu intrinseque sans
   min-width:0, ce qui peut empecher une valeur longue de revenir a la ligne
   sur petit ecran. .result-breakdown__row et son enfant <strong> restent des
   regles partagees par les 160+ pages - corrige ici uniquement pour les
   pages utilisant le nouveau moteur, en attendant la verification a plus
   large echelle avant un eventuel passage au niveau systeme (voir le
   livrable Phase 5, section "Bug mobile breakdown"). */
.result-engine-v2 .result-breakdown__row strong {
  min-width: 0;
  max-width: 100%;
  flex-basis: 100%;
  text-align: right;
}

/* ==========================================================================
   VISUAL IDENTITY SYSTEM (Phases 9-11, DESIGN.md > Visual Identity / Color
   Grammar) — composants partages, actives uniquement par la classe
   d'activation .visual-identity-v1 sur <body>. Aucune regle ici ne s'applique
   a une page qui ne porte pas cette classe : c'est le mecanisme d'activation
   controlee demande en Phase 11 (fondations partagees sans propagation).
   Aujourd'hui, seule /calcul-budget-courses/ porte cette classe (Phase 10).

   Architecture : tokens (home-premium.css :root) -> composants partages
   (ici) -> composition de page (juste une classe sur <body>). Remplace le
   pattern precedent "pilot-visual-identity-b-hybrid.css charge par page" -
   voir docs/RESULT_ENGINE.md et DESIGN.md pour la classification complete
   de l'ancien fichier pilote (conserve sur disque comme reference, plus lie
   a aucune page).

   Grammaire (figee, Phases 9-10) : MARINE = confiance/structure (rare) ;
   BLEU = action (reutilise --color-brand-electric, jamais duplique) ; CYAN
   accessible (--brand-transform) = interaction sur fond clair ; CYAN plein
   (--brand-transform-bright) = signal sur fond sombre uniquement ; MENTHE
   (--brand-result) = signature du Resultat, jamais un signal de succes. */

.visual-identity-v1 .prototype-topnav {
  background: var(--brand-trust);
  border-color: color-mix(in srgb, var(--brand-trust) 60%, black);
}

.visual-identity-v1 .prototype-nav > a,
.visual-identity-v1 .prototype-nav-trigger {
  color: #C3D3F5; /* clair sur marine, 7.07:1 mesure - Phase 9/10 */
}

.visual-identity-v1 .prototype-nav > a:hover,
.visual-identity-v1 .prototype-nav-trigger:hover {
  color: var(--brand-transform-bright);
}

.visual-identity-v1 .prototype-topnav {
  /* Sur fond marine, le contour de focus doit rester le cyan plein (deja
     verifie 6.98:1 sur marine, Phase 10) plutot que le cyan accessible par
     defaut (concu pour un fond clair) - le composant nav gere son propre
     contexte via ce seul override de token, aucune duplication de regle. */
  --nav-focus-color: var(--brand-transform-bright);
}

/* Sous-menus (Themes/Guides) : surface independante, reste claire - un
   popover sur fond marine casserait la lisibilite de son contenu sans
   apporter de valeur d'identite (ce n'est pas la zone de confiance,
   seulement une liste de navigation). */
.visual-identity-v1 .prototype-subnav {
  background: var(--color-surface);
}
.visual-identity-v1 .prototype-subnav a {
  color: var(--color-text-primary);
}

@media (prefers-reduced-motion: reduce) {
  .visual-identity-v1 .prototype-nav > a,
  .visual-identity-v1 .prototype-nav-trigger {
    transition: none;
  }
}

/* Kicker/eyebrow ("VOS DONNEES", "RESULTAT PRINCIPAL", hero-kicker) :
   heritaient de la couleur de categorie theme (indigo/violet pour le theme
   "quotidien", voir body.calc-theme-quotidien plus haut) - decorrelee de la
   marque (Phase 9). Remplace ici par le bleu d'action deja officiel : brand
   > category (section 27, Phase 11) - la marque prime sur le repere de
   categorie pour ce composant, sans supprimer le systeme de categories
   lui-meme (toujours actif ailleurs, ex. les points de couleur de nav).
   Bug systeme trouve et corrige en Phase 12 : ".visual-identity-v1" seul a
   une specificite (0,1,0), inferieure a celle des regles de theme plus haut
   dans ce fichier (ex. "body.calc-theme-finance[class*='calc-page-']" =
   (0,2,1)) - ces regles gagnaient silencieusement sur 5 des 6 pages du
   panel (seul calc-theme-quotidien, deja teste en Phase 9-11, coincidait
   par hasard). Le selecteur ci-dessous reprend exactement le motif des
   regles de theme (meme specificite (0,2,1), et vient apres elles dans ce
   fichier) pour garantir la victoire de la marque sur la categorie, quelle
   que soit celle-ci. Corrige au niveau du composant partage, pas page par
   page. */
body.visual-identity-v1[class*="calc-page-"] {
  --calc-accent: var(--color-brand-electric);
  --calc-accent-deep: var(--color-brand-electric-deep);
}

/* Inputs : le cyan accessible n'intervient qu'au moment de l'interaction
   (focus/hover), jamais en etat par defaut - conforme a la regle de
   frequence d'usage documentee dans DESIGN.md (section 19, Phase 11). */
.visual-identity-v1 .input-control:focus-within {
  border-color: var(--brand-transform);
  box-shadow: 0 0 0 4px color-mix(in srgb, var(--brand-transform) 20%, transparent);
}
.visual-identity-v1 .input-control:hover {
  border-color: color-mix(in srgb, var(--brand-transform) 35%, var(--color-surface-border));
}

/* Result Signature : liseré rare, uniquement sur le cadre de la carte.
   Structure/hierarchie du Result Engine inchangees ; Trace et Encoche
   gardent leur couleur neutre deja validee (Phases 4-7) - la menthe ne
   recolore jamais le composant, elle signe seulement son cadre. Jamais sur
   le chiffre (Result != Success, DESIGN.md). */
.visual-identity-v1 .result-card.result-engine-v2 {
  border-top: 3px solid var(--brand-result);
}

/* CTA final "Trust" : usage optionnel (section 25, Phase 11) - une page
   n'a pas besoin d'un bandeau marine pour respecter l'identite. Applique
   uniquement si le composant .covo-cta-card est present sur la page. */
.visual-identity-v1 .covo-cta-card {
  background: var(--brand-trust);
  border-color: color-mix(in srgb, var(--brand-trust) 60%, black);
}
.visual-identity-v1 .covo-cta-card h2,
.visual-identity-v1 .covo-cta-card p {
  color: #EAF1FF;
}
.visual-identity-v1 .covo-cta-card .section-kicker {
  background: color-mix(in srgb, var(--brand-transform-bright) 20%, transparent);
  color: #BFF6FF;
}
.visual-identity-v1 .covo-cta-card .covo-cta-button {
  background: #FFFFFF;
  color: var(--brand-trust);
}
.visual-identity-v1 .covo-cta-card .covo-cta-button:hover,
.visual-identity-v1 .covo-cta-card .covo-cta-button:focus-visible {
  background: #EAF1FF;
  box-shadow: none;
}

/* Footer volontairement non couvert par .visual-identity-v1 : DESIGN.md
   documente le retrait d'un pied de page sombre comme decision assumee.
   Empiler marine (header) + marine (CTA final) + marine (footer) romprait
   cette decision et creerait l'effet "sandwich sombre" explicitement a
   eviter (Phase 10). */

.seo-inline-card__sources {
  margin: 0;
  color: var(--calc-soft) !important;
  font-size: 0.86rem !important;
}

.seo-inline-card__sources a {
  color: var(--calc-accent-deep, var(--color-brand-electric-deep));
  text-decoration: underline;
  text-underline-offset: 2px;
}

.seo-inline-card__sources a:hover,
.seo-inline-card__sources a:focus-visible {
  color: var(--calc-accent-deep, var(--color-brand-electric-deep));
}

/* When a page supplies its own breakdown, the generic 2-box meta summary
   becomes redundant, so it's hidden alongside a populated breakdown. */
.result-card:has(.result-breakdown:not(:empty)) .result-meta {
  display: none;
}

.result-interpretation {
  display: grid;
  gap: 8px;
  margin-top: 16px;
  padding: 14px 16px;
  border-radius: var(--radius-md);
  background: var(--color-background-primary);
  border: 1px solid var(--color-surface-border);
}

.result-interpretation p {
  margin: 0;
  display: flex;
  align-items: flex-start;
  gap: 8px;
  color: var(--color-text-secondary);
  font-size: 0.88rem;
  line-height: 1.5;
}

.result-interpretation p::before {
  content: "•";
  color: var(--calc-accent-deep, var(--color-brand-electric-deep));
  font-weight: 800;
}

/* Comprendre votre résultat */
.understand-result-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 18px;
}

.understand-card {
  padding: 22px 22px 24px;
}

.understand-card__label {
  margin: 0 0 10px;
  color: var(--calc-accent-deep, var(--color-brand-electric-deep));
  font-size: 0.72rem;
  font-weight: 800;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}

.understand-card p:not(.understand-card__label) {
  margin: 0;
  color: var(--calc-muted);
  font-size: 0.92rem;
  line-height: 1.6;
}

/* Calculateurs associés — more inviting without new colors */
.related-calculators-section .tool-card--square {
  min-height: 130px;
  padding: 20px 20px 18px;
}

.related-calculators-section .tool-icon {
  width: 40px;
  height: 40px;
}

.related-calculators-section .tool-card--square .tool-icon svg {
  width: 18px;
  height: 18px;
}

.related-calculators-section .tool-card--square h3 {
  font-size: 1.08rem;
}

.related-calculators-section .tool-card--square::after {
  color: var(--calc-accent-deep, var(--color-brand-electric-deep));
  font-size: 1.4rem;
}

@media (max-width: 1100px) {
  .calc-demo {
    padding: 22px;
  }

  .understand-result-grid {
    grid-template-columns: 1fr;
  }
}

@media (max-width: 720px) {
  body[class*="calc-page-"] .hero-large.calc-hero-shell {
    gap: 20px;
  }

  .calc-demo {
    padding: 20px;
  }

  .calc-demo__highlight strong {
    font-size: 1.15rem;
  }
}

/* ==========================================================================
   Calculator pages — form/result premium polish (shared, every calculator).
   Purely visual: no field id/name, no compute logic, no analytics event is
   touched here. Every other change for this pass was merged directly into
   the base rules above (search "premium polish" comments); only the truly
   new selectors live here.
   ========================================================================== */

/* Form hierarchy: the label must clearly outrank its help text below it -
   there was no dedicated rule for it before, it just inherited body text. */
.input-label-text {
  color: var(--color-text-primary);
  font-size: 0.95rem;
  font-weight: 650;
  line-height: 1.35;
}

/* Synthesis sentence under the primary result value - populated generically
   in calculator-template.js from the same value/unit already shown above
   it, so it only ever states something the calculator itself just
   computed. Empty (and hidden) whenever there is nothing numeric to state
   yet, e.g. a calculator's own "please fill this field" placeholder state. */
.result-synthesis {
  margin: 6px 0 0;
  color: var(--calc-muted);
  font-size: 0.92rem;
  line-height: 1.55;
}

.result-synthesis:empty {
  display: none;
}

/* Micro-animation on result updates: light fade + lift, skipped entirely
   for reduced-motion users. Triggered in JS only when the displayed value
   actually changes, not on every keystroke. */
@keyframes calc-result-refresh {
  from { opacity: 0.4; transform: translateY(4px); }
  to { opacity: 1; transform: translateY(0); }
}

.result-value.is-updated,
.result-synthesis.is-updated,
.prk-sim-card__value.is-updated {
  animation: calc-result-refresh 220ms ease-out;
}

@media (prefers-reduced-motion: reduce) {
  .result-value.is-updated,
  .result-synthesis.is-updated,
  .prk-sim-card__value.is-updated {
    animation: none;
  }
}
