/* IFS FX core — shared tokens for the 2026-09-24 design pass. READ-ONLY for lane work.
   Every lane writes its own fx/<lane>.css with its own class prefix. */
:root{
  --fx-navy:#141142; --fx-navy-2:#1d1a5a; --fx-ink:#0c0a2e;
  --fx-ember:#e64925; --fx-ember-deep:#c93812; --fx-flame:#ef383a; --fx-spark:#f97352;
  --fx-gold:#f9dd9a; --fx-paper:#f2e8d4; --fx-smoke:#d8d5ea; --fx-iron:#333333; --fx-iron-2:#282a2b;
  --fx-serif:'Playfair Display',Georgia,serif; --fx-sans:'Poppins',system-ui,sans-serif;
  --fx-ease-out:cubic-bezier(.16,1,.3,1); --fx-ease-forge:cubic-bezier(.7,0,.2,1);
  --fx-fast:180ms; --fx-med:420ms; --fx-slow:900ms;
}
/* Generic reveal hook: add data-fx-reveal; core.js adds .fx-in when it enters the viewport. */
[data-fx-reveal]{opacity:0;transform:translateY(14px);transition:opacity var(--fx-slow) var(--fx-ease-out),transform var(--fx-slow) var(--fx-ease-out)}
[data-fx-reveal].fx-in{opacity:1;transform:none}
.fx-sr{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
@media (prefers-reduced-motion: reduce){
  [data-fx-reveal]{opacity:1!important;transform:none!important;transition:none!important}
}
/* No-JS safety: if core.js never runs, nothing stays hidden. */
html:not(.fx-js) [data-fx-reveal]{opacity:1;transform:none}
/* Tailwind's .sr-only is not in the compiled tw.css, so screen-reader-only text was rendering visibly. */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}
