/* ============================================================
   NOVA HOME — nova-home.css                          ★ nova-home only ★
   The "Nova OS theme" redesign (Vincent's export): ink #0B1119 + a single
   teal accent #4FE3D1, Space Grotesk (headings/numbers) + Instrument Sans
   (body), calm phone-first surfaces, Duolingo-grade micro-motion.

   Loaded ONLY by homenav.js (nova-home boot) — EVERY rule is scoped under
   html.product-nova-home, so Empire OS and Nova OS never match a selector.
   This file:
     1. loads the two brand fonts,
     2. remaps the shared design tokens (dark = primary, light = warm) so all
        shared views (Plan/People/Money/Tracking/Wins/…) inherit the look,
     3. defines the reusable nh-* primitives (rings, streak dots, quests,
        anchors, timeline, debrief CTA) the Home + detail screens compose,
     4. carries the motion vocabulary (novaPulse, novaGlow, quest pop, ring fill).
   ============================================================ */
@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Instrument+Sans:ital,opsz,wght@0,14..32,400;0,14..32,500;0,14..32,600;0,14..32,700;1,14..32,400&display=swap');

/* ===============================================================
   1. FONTS + BASE PALETTE (dark is the product's home)
=============================================================== */
html.product-nova-home {
  --font-display: 'Space Grotesk', 'Instrument Sans', system-ui, sans-serif;
  --font-sans: 'Instrument Sans', system-ui, -apple-system, sans-serif;
  --font-mono: 'Space Grotesk', ui-monospace, 'SF Mono', monospace;

  /* Bespoke Nova Home tokens (used by nh-* primitives + the Home view) */
  --nh-ink: #0B1119;
  --nh-ink-2: #0E141D;
  --nh-surface: #10161F;
  --nh-surface-hover: #131B26;
  --nh-surface-2: #141C26;
  --nh-line: rgba(140, 170, 200, 0.12);
  --nh-line-soft: rgba(140, 170, 200, 0.06);
  --nh-text: #EDF2F7;
  --nh-text-2: #E9F1F7;
  /* Muted + dim carry most of Nova Home's small print (week strip, ring
     labels, anchor headers). Teardown 02 §S5 measured --nh-dim at 3.18:1 on
     --nh-surface. Both now clear 4.5:1 on ink/surface/surface-2 while staying
     the same cool blue-grey the theme is built from — the identity is the
     hue, not the lightness. */
  --nh-muted: #8395A7;   /* 6.15 / 5.90 / 5.57 */
  --nh-dim: #748ca0;     /* 5.41 / 5.19 / 4.90  (was #54697B · 3.01 on surface-2) */
  --nh-faint: #54697B;   /* decorative / disabled only */
  --nh-teal: #4FE3D1;
  --nh-teal-hi: #7FF0E2;
  --nh-teal-soft: rgba(79, 227, 209, 0.14);
  --nh-green: #3DDC97;
  --nh-coral: #F5806B;
  --nh-white: #F5F7FA;
  /* primary-CTA + Nova-disc role tokens (invert per theme below) */
  --nh-cta-bg: #F5F7FA;
  --nh-cta-fg: #06121D;
  --nh-disc-ring: rgba(11, 17, 25, 0.35);

  /* 5 life-category hues (calm, not neon) — Fitness/Faith/Finance/Relationships/Hope */
  --nh-cat-fitness: #4FE3D1;
  --nh-cat-faith: #9FB4FF;
  --nh-cat-finance: #3DDC97;
  --nh-cat-relationships: #F5A0B5;
  --nh-cat-hope: #F5C56B;
  /* On ink these hues already run 8.5–10.8:1, so the text-safe pair IS the
     hue. The light theme redefines them (see the light block). */
  --nh-cat-fitness-ink: var(--nh-cat-fitness);
  --nh-cat-faith-ink: var(--nh-cat-faith);
  --nh-cat-finance-ink: var(--nh-cat-finance);
  --nh-cat-relationships-ink: var(--nh-cat-relationships);
  --nh-cat-hope-ink: var(--nh-cat-hope);
}

/* ===============================================================
   2. TOKEN REMAP — DARK (primary). Ink surfaces + teal accent so every
   shared view repaints into the Nova OS theme with zero per-view edits.
=============================================================== */
html.product-nova-home[data-theme='dark'],
html.product-nova-home:not([data-theme='light']) {
  color-scheme: dark;

  --bg: var(--nh-ink);
  --surface-0: var(--nh-ink);
  --surface-1: var(--nh-surface);
  --surface-2: var(--nh-surface-2);
  --surface-3: #1a2331;
  --surface-glass: rgba(11, 17, 25, 0.82);
  --raised: var(--nh-surface);

  --text-100: var(--nh-text);
  --text-200: #D4DEE8;
  --text-300: #A7B6C6;          /* 9.16 / 8.78 / 8.29 */
  --text-400: #889aab;          /* 6.55 / 6.27 / 5.93 */
  --text-500: var(--nh-dim);    /* 5.41 / 5.19 / 4.90 */
  --text-faint: var(--nh-faint);

  --border-soft: var(--nh-line-soft);
  --border: var(--nh-line);
  --border-strong: rgba(140, 170, 200, 0.22);

  --accent: var(--nh-teal);
  --accent-hover: var(--nh-teal-hi);
  --accent-fg: #06121D;
  --accent-soft: var(--nh-teal-soft);
  --accent-ring: rgba(79, 227, 209, 0.30);
  --select-bg: rgba(79, 227, 209, 0.30);
  --select-fg: #ffffff;

  --green-400: var(--nh-green);  --green-bg: rgba(61, 220, 151, 0.13);
  --red-400:   var(--nh-coral);  --red-bg:   rgba(245, 128, 107, 0.13);
  --amber-400: var(--nh-cat-hope); --amber-bg: rgba(245, 197, 107, 0.13);
  --blue-400:  var(--nh-cat-faith); --blue-bg: rgba(159, 180, 255, 0.13);
  --violet-400:#b39be0; --violet-bg:rgba(179, 155, 224, 0.13);
  --teal-400:  var(--nh-teal);   --teal-bg:  var(--nh-teal-soft);
  --pink-400:  var(--nh-cat-relationships); --pink-bg: rgba(245, 160, 181, 0.13);

  --danger: var(--nh-coral);
}

/* ===============================================================
   2b. TOKEN REMAP — LIGHT (warm, clean). Keeps the teal identity, high
   contrast for daytime. Off-white paper, ink text.
=============================================================== */
html.product-nova-home[data-theme='light'] {
  color-scheme: light;

  /* theme-aware nh-* semantic tokens (brand hues stay constant) */
  --nh-ink: #F6F8FB;
  --nh-ink-2: #FFFFFF;
  --nh-surface: #FFFFFF;
  --nh-surface-hover: #F1F5F9;
  --nh-surface-2: #EAEFF5;
  --nh-line: rgba(11, 17, 25, 0.10);
  --nh-line-soft: rgba(11, 17, 25, 0.06);
  --nh-text: #0B1119;
  --nh-text-2: #1B2732;
  --nh-muted: #5A6B7C;   /* 5.48 on white */
  --nh-dim: #5d6d7e;     /* 5.31 / 5.16 / 4.88  (was #8695A6 · 2.65 on surface-2) */
  --nh-faint: #8695A6;   /* decorative / disabled only */
  --nh-teal: #0f786d;    /* was #12988a — see the --accent note below */
  --nh-teal-hi: #0c6a60;
  --nh-teal-soft: rgba(23, 179, 162, 0.14);
  --nh-green: #187a53;   /* 5.32 on white (was #1f9d6b · 3.45) */
  --nh-coral: #c13c22;   /* 5.33 on white (was #e0674f · 3.37) */
  --nh-cta-bg: #0B1119;
  --nh-cta-fg: #FFFFFF;
  --nh-disc-ring: rgba(11, 17, 25, 0.06);
  --nh-cat-fitness: #0E9486;
  --nh-cat-faith: #6f86e0;
  --nh-cat-finance: #1f9d6b;
  --nh-cat-relationships: #db6f8c;
  --nh-cat-hope: #d19a2e;
  --nh-ring-track: rgba(11, 17, 25, 0.08);

  --bg: #F6F8FB;
  --surface-0: #FFFFFF;
  --surface-1: #F2F5F9;
  --surface-2: #EAEFF5;
  --surface-3: #E1E8F0;
  --surface-glass: rgba(255, 255, 255, 0.85);
  --raised: #FFFFFF;

  /* Light was the worse half here too: #93A2B2 measured 2.39:1. */
  --text-100: #0B1119;
  --text-200: #26313D;
  --text-300: #47586A;   /* 6.87 / 7.31 / 6.32 */
  --text-400: #4f5c69;   /* 6.44 / 6.26 / 5.92  (was #6B7C8E · 3.71 on surface-2) */
  --text-500: #58697b;   /* 5.30 / 5.16 / 4.88  (was #93A2B2 · 2.26 on surface-2) */
  --text-faint: #93A2B2;

  --border-soft: rgba(11, 17, 25, 0.06);
  --border: rgba(11, 17, 25, 0.10);
  --border-strong: rgba(11, 17, 25, 0.16);

  /* THE LIGHT ACCENT. This was #17B3A2 with white text on it: 2.62:1 — i.e.
     every primary button, every unread count and every filled chip in Nova
     Home's light theme failed AA outright, and it was the most-repeated
     single failure in the light-mode measurement. Deepened to the same teal
     at a readable lightness (white on it = 5.35:1). Dark mode keeps the
     bright #4FE3D1 signature untouched, which is where the product lives —
     the identity is not lost, it is only legible in daylight. */
  --accent: #0f786d;
  --accent-hover: #0c6a60;
  --accent-fg: #FFFFFF;
  --accent-soft: rgba(23, 179, 162, 0.12);
  --accent-ring: rgba(23, 179, 162, 0.28);

  --green-400: #187a53;  --green-bg: rgba(31, 157, 107, 0.12);
  --red-400:   #c13c22;  --red-bg:   rgba(224, 103, 79, 0.12);
  --danger: #c13c22;

  /* The five life-category hues stay exactly as designed — they are dots,
     rings and fills, i.e. graphical objects (WCAG 1.4.11, 3:1), not text.
     Where a view prints a category NAME in its own colour it must use the
     -ink pair below instead; the bright hue on white is 2.5–3.7:1 and can
     never carry words. (Handoff: views/home-nova-home.js is the only caller.) */
  --nh-cat-fitness-ink: #0b796d;
  --nh-cat-faith-ink: #4361d7;
  --nh-cat-finance-ink: #187a53;
  --nh-cat-relationships-ink: #c43159;
  --nh-cat-hope-ink: #89651e;
}

/* ===============================================================
   3. ATMOSPHERE — ink backdrop with a soft teal aurora (dark only).
=============================================================== */
html.product-nova-home[data-theme='dark'] .eos-backdrop,
html.product-nova-home:not([data-theme='light']) .eos-backdrop {
  background:
    radial-gradient(90% 60% at 78% -8%, rgba(79, 227, 209, 0.10), transparent 60%),
    radial-gradient(70% 50% at 8% 4%, rgba(159, 180, 255, 0.06), transparent 55%),
    var(--nh-ink);
}

/* ===============================================================
   4. TYPE FEEL — display/number weight & tracking to match the export.
=============================================================== */
html.product-nova-home h1,
html.product-nova-home h2,
html.product-nova-home .display {
  font-family: var(--font-display);
  letter-spacing: -0.02em;
}
html.product-nova-home .mono { font-family: var(--font-mono); font-feature-settings: 'tnum' 1; }

/* ===============================================================
   5. THE NOVA CENTER BUTTON — white disc + ink house-spark mark (not teal).
   Overrides homenav.css so the accent remap doesn't tint the button.
   The mark is inline SVG (crisp at any DPR) injected by homenav.js.
=============================================================== */
@media (max-width: 900px) {
  html.product-nova-home .hn-nova {
    background: var(--nh-cta-bg);
    border-color: var(--nh-cta-bg);
    color: var(--nh-cta-fg);
    box-shadow: 0 8px 26px rgba(0, 0, 0, 0.5), 0 0 0 6px var(--nh-disc-ring);
  }
  html.product-nova-home .hn-nova::before {
    background: radial-gradient(125% 90% at 50% 0%, rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0) 55%);
  }
  html.product-nova-home[data-theme='light'] .hn-nova::before {
    background: radial-gradient(125% 90% at 50% 0%, rgba(255, 255, 255, 0.18), rgba(255, 255, 255, 0) 55%);
  }
  html.product-nova-home .hn-nova svg { width: 30px; height: 30px; position: relative; z-index: 1; }
  html.product-nova-home .hn-nova svg path { fill: var(--nh-cta-fg); }
  /* hold-to-quick-add hint: subtle breathing ring when armed */
  html.product-nova-home .hn-nova.arming { animation: nhNovaGlow 1.1s ease-in-out 4; }
  /* bottom bar: pure ink (fully opaque so content never ghosts through), hairline top */
  html.product-nova-home .home-nav {
    background: var(--nh-ink);
    border-top: 1px solid var(--nh-line);
  }
  html.product-nova-home .hn-tab.active { color: var(--nh-text); }
  html.product-nova-home .hn-tab.active svg { stroke: var(--nh-text); }
}

/* ===============================================================
   6. NH PRIMITIVES — reusable building blocks for Home + detail screens.
=============================================================== */

/* micro section label: 10px uppercase, wide tracking */
html.product-nova-home .nh-label {
  font: 600 var(--fs-2xs) var(--font-sans); letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--nh-dim);
}

/* card surface */
html.product-nova-home .nh-card {
  background: var(--nh-surface); border: 1px solid var(--nh-line);
  border-radius: var(--r-xl); padding: 16px;
}
html.product-nova-home .nh-card.tap { cursor: pointer; transition: background var(--mo-dur-2) var(--ease-out), transform var(--mo-dur-2) var(--ease-out); }
html.product-nova-home .nh-card.tap:active { transform: scale(0.99); background: var(--nh-surface-hover); }

/* ---- life-score RING (conic donut, animated arc) ----
   Three knobs, all optional, so one primitive scales from a 40px chip to an
   84px hero ring without a second copy of it:
     --r   diameter        (default 54px)
     --rw  stroke width    (default 6px — the arc, the track and the end-cap
                            all derive from this, so they can never disagree)
     --rv  centre number   (default 17px)
   Set --deg for the arc. Set --gdeg too and the stretch between the score and
   the goal paints as a pale ghost of the same hue — "here is how far you still
   have to go" — which needs no caption. A goal already passed makes --gdeg
   smaller than --deg, the ghost stop collapses to nothing, and the ring reads
   as a plain solid arc; leaving --gdeg unset does the same. */
html.product-nova-home .nh-ring {
  position: relative; width: var(--r, 54px); height: var(--r, 54px); flex: none;
}
html.product-nova-home .nh-ring::before {
  content: ''; position: absolute; inset: 0; border-radius: var(--r-pill);
  background: conic-gradient(
    var(--c, var(--nh-teal)) 0 var(--deg, 0deg),
    color-mix(in srgb, var(--c, var(--nh-teal)) 20%, var(--nh-ring-track, rgba(140, 170, 200, 0.10))) var(--deg, 0deg) var(--gdeg, 0deg),
    var(--nh-ring-track, rgba(140, 170, 200, 0.10)) max(var(--deg, 0deg), var(--gdeg, 0deg)) 360deg);
  -webkit-mask: radial-gradient(circle, transparent calc(50% - var(--rw, 6px)), #000 calc(50% - var(--rw, 6px) + 1px));
  mask: radial-gradient(circle, transparent calc(50% - var(--rw, 6px)), #000 calc(50% - var(--rw, 6px) + 1px));
  transition: --deg var(--mo-dur-4) var(--ease-out);
}
/* signature: a rounded end-cap dot that sweeps with the fill (Apple-Watch feel).
   Exactly as wide as the stroke, so the arc genuinely ends in a round cap. */
html.product-nova-home .nh-ring::after {
  content: ''; position: absolute; top: 0; left: calc(50% - var(--rw, 6px) / 2);
  width: var(--rw, 6px); height: var(--rw, 6px);
  border-radius: var(--r-pill); background: var(--c, var(--nh-teal));
  transform-origin: calc(var(--rw, 6px) / 2) calc(var(--r, 54px) / 2);
  transform: rotate(var(--deg, 0deg)); transition: transform var(--mo-dur-4) var(--ease-out);
}
html.product-nova-home .nh-ring[style*="--deg:0deg"]::after,
html.product-nova-home .nh-ring.zero::after { opacity: 0; }
html.product-nova-home .nh-ring > span {
  position: absolute; inset: 0; display: grid; place-items: center;
  font: 700 var(--rv, 17px)/1 var(--font-display); color: var(--nh-text); font-feature-settings: 'tnum' 1;
}
/* MUST inherit. ::before/::after are the elements that paint the arc and the
   end-cap, but --deg is set inline on .nh-ring itself. With inherits:false a
   pseudo-element reads the initial value instead of its originating element's,
   so every ring painted a 0deg arc — an empty track with a dot parked at 12
   o'clock. That was the "rings aren't ringing, it's just a dot" bug. */
@property --deg { syntax: '<angle>'; inherits: true; initial-value: 0deg; }

/* ---- STREAK week dots ---- */
html.product-nova-home .nh-week { display: flex; gap: 7px; }
html.product-nova-home .nh-week-day { display: flex; flex-direction: column; align-items: center; gap: 3px; }
html.product-nova-home .nh-week { gap: 8px; }
html.product-nova-home .nh-dot {
  width: 24px; height: 24px; border-radius: var(--r-pill);
  display: grid; place-items: center;
  font: 700 var(--fs-2xs) var(--font-display); color: var(--nh-dim);
  background: transparent; border: 1.5px solid var(--nh-line);
  transition: transform var(--mo-dur-2) var(--ease-out), background var(--mo-dur-2) var(--ease-out);
}
/* a done day only earns the coral fill when a streak is actually live; with no
   streak the past dots stay quiet (an invitation, not a loud scoreboard). */
html.product-nova-home .nh-dot.done { background: var(--nh-surface-2); border-color: transparent; color: var(--nh-dim); }
html.product-nova-home .nh-dot.done svg path { stroke: var(--nh-dim); }
html.product-nova-home .nh-week.lit .nh-dot.done { background: var(--nh-coral); border-color: var(--nh-coral); color: #06121D; }
html.product-nova-home .nh-week.lit .nh-dot.done svg path { stroke: #06121D; }
html.product-nova-home .nh-dot.today { border-color: var(--nh-teal); color: var(--nh-teal); }
html.product-nova-home .nh-dot.pop { animation: nhPop 340ms var(--ease-out); }
html.product-nova-home .nh-week-day > small { font: 500 var(--fs-2xs) var(--font-sans); color: var(--nh-dim); }

/* ---- QUEST / check row (Duolingo tap-to-complete) ---- */
html.product-nova-home .nh-quest {
  display: flex; align-items: center; gap: 14px; text-align: left;
  background: var(--nh-surface); border: 1px solid var(--nh-line); border-radius: var(--r-lg);
  padding: 14px 16px; cursor: pointer; -webkit-tap-highlight-color: transparent;
  transition: background var(--mo-dur-2) var(--ease-out), transform var(--mo-dur-1) var(--ease-out);
}
html.product-nova-home .nh-quest:hover { background: var(--nh-surface-hover); }
html.product-nova-home .nh-quest:active { transform: scale(0.985); }
html.product-nova-home .nh-check {
  width: 22px; height: 22px; border-radius: var(--r-sm); flex: none;
  border: 2px solid var(--nh-dim); background: transparent;
  display: grid; place-items: center;
  transition: background var(--mo-dur-2) var(--ease-out), border-color var(--mo-dur-2) var(--ease-out), transform var(--mo-dur-2) var(--ease-out);
}
html.product-nova-home .nh-check svg { width: 12px; height: 12px; opacity: 0; transform: scale(0.4); transition: opacity var(--mo-dur-2), transform var(--mo-dur-2) var(--ease-back, cubic-bezier(.34,1.56,.64,1)); }
html.product-nova-home .nh-check svg path { stroke: #06121D; stroke-width: 4; }
/* completion celebrates the CATEGORY: the check fills with the quest's own hue */
html.product-nova-home .nh-quest.done .nh-check { background: var(--qc, var(--nh-teal)); border-color: var(--qc, var(--nh-teal)); }
html.product-nova-home .nh-quest.done .nh-check svg { opacity: 1; transform: scale(1); }
html.product-nova-home .nh-quest.done .nh-quest-title { color: var(--nh-dim); text-decoration: line-through; }
html.product-nova-home .nh-quest.just-done .nh-check { animation: nhPop 380ms var(--ease-out); }
html.product-nova-home .nh-quest-title { flex: 1; text-align: left; font: 600 15px var(--font-sans); color: var(--nh-text); transition: color var(--mo-dur-2); }
html.product-nova-home .nh-quest-sub { font: 500 var(--fs-2xs) var(--font-sans); color: var(--nh-muted); }
html.product-nova-home .nh-quest-glyph { width: 34px; height: 34px; border-radius: var(--r-md); display: grid; place-items: center; background: var(--nh-surface-2); flex: none; }

/* ---- ANCHOR tile ---- */
html.product-nova-home .nh-anchor {
  flex: 1; background: var(--nh-surface); border: 1px solid var(--nh-line);
  border-radius: var(--r-xl); padding: 13px;
}
html.product-nova-home .nh-anchor-time { font: 700 12.5px var(--font-display); color: var(--nh-text); }
html.product-nova-home .nh-anchor-name { font: 600 var(--fs-2xs) var(--font-sans); color: var(--nh-text-2); margin-top: 5px; }
html.product-nova-home .nh-anchor-label { font: 500 var(--fs-2xs) var(--font-sans); margin-top: 3px; }
html.product-nova-home .nh-anchor .on-time { color: var(--nh-green); }
/* "log it" / "late" is a WORD, so it takes the -ink pair, not the graphic hue.
   `--nh-cat-hope` (#d19a2e) measured 2.51:1 on white and was the last contrast
   failure left in the product (20 nodes, Nova Home light). The -ink rung is the
   same amber deepened until it reads: 5.5:1. Dark mode already passes, so the
   token itself resolves back to the bright hue there. (§ tokens: the five life
   hues are dots and rings; anything with letters in it uses `-ink`.) */
html.product-nova-home .nh-anchor .late { color: var(--nh-cat-hope-ink); }
html.product-nova-home .nh-anchor .missed { color: var(--nh-coral); }

/* ---- EVENING DEBRIEF cta (dashed teal) ---- */
html.product-nova-home .nh-debrief {
  display: flex; justify-content: space-between; align-items: center; gap: 12px;
  background: repeating-linear-gradient(45deg, rgba(79,227,209,.14) 0 8px, rgba(79,227,209,.04) 8px 16px);
  border: 1px dashed rgba(79, 227, 209, 0.5); border-radius: var(--r-lg); padding: 12px 14px; cursor: pointer;
}
html.product-nova-home .nh-debrief-t { font: 600 13px var(--font-sans); color: var(--nh-teal); }
html.product-nova-home .nh-debrief-s { font: 500 var(--fs-2xs) var(--font-sans); color: var(--nh-muted); }
html.product-nova-home .nh-debrief-go { font: 700 12px var(--font-display); color: var(--nh-cta-fg); background: var(--nh-cta-bg); border-radius: var(--r-md); padding: 7px 13px; }

/* ---- pills / chips ---- */
html.product-nova-home .nh-pill {
  display: inline-flex; align-items: center; gap: 5px;
  font: 600 var(--fs-2xs) var(--font-sans); padding: 4px 10px; border-radius: var(--r-pill);
  background: var(--nh-surface-2); color: var(--nh-muted);
}
html.product-nova-home .nh-pill.teal { background: var(--nh-teal-soft); color: var(--nh-teal); }
html.product-nova-home .nh-pill.green { background: rgba(61,220,151,.14); color: var(--nh-green); }
html.product-nova-home .nh-pill.coral { background: rgba(245,128,107,.14); color: var(--nh-coral); }

/* ===============================================================
   7. MOTION VOCABULARY
=============================================================== */
@keyframes nhNovaGlow { 0%,100% { box-shadow: 0 8px 26px rgba(0,0,0,.5), 0 0 0 0 rgba(79,227,209,.5); } 50% { box-shadow: 0 8px 26px rgba(0,0,0,.5), 0 0 0 10px rgba(79,227,209,0); } }
@keyframes nhPop { 0% { transform: scale(1); } 45% { transform: scale(1.18); } 100% { transform: scale(1); } }
@keyframes nhPulse { 0%,100% { opacity: 1; } 50% { opacity: 0.35; } }
@keyframes nhCountUp { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
@keyframes nhRise { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }
/* WCAG 2.2.2 — decorative pulse, capped at 4s (was endless). */
html.product-nova-home .nh-pulse { animation: nhPulse 2s ease-in-out 2; }
@media (prefers-reduced-motion: reduce) {
  html.product-nova-home *, html.product-nova-home *::before { animation: none !important; transition: none !important; }
}
