/* ============================================================================
   tokens.css — the ONLY file allowed to contain a colour value.

   Layer 1: each theme sets six primitive numbers (brand lightness / chroma /
            hue, for two brand colours).
   Layer 2: every semantic token is derived from those.
   Layer 3: components (in Tailwind / app.css) consume semantics only.

   Adding a theme is ~10 lines in Layer 1. Never write a hex or oklch() value
   in a component — a CI lint rule fails the build if you do.

   OKLCH, not hex: lightness is perceptually uniform, so contrast ratios can be
   reasoned about arithmetically instead of eyeballed per theme.
   ============================================================================ */

/* ============================================================
   LAYER 1 — theme primitives. Each theme sets ONLY these.
   bl/bc/bh = brand lightness / chroma / hue (OKLCH)
   ============================================================ */
[data-theme="najd"]  { --bl:48; --bc:.105; --bh:195;  --b2l:75; --b2c:.135; --b2h:85;  --theme-label:"Najd"; }
[data-theme="sadu"]  { --bl:52; --bc:.195; --bh:22;   --b2l:70; --b2c:.120; --b2h:62;  --theme-label:"Sadu"; }
[data-theme="night"] { --bl:55; --bc:.150; --bh:238;  --b2l:68; --b2c:.185; --b2h:305; --theme-label:"Riyadh Night"; }
[data-theme="dawn"]  { --bl:60; --bc:.155; --bh:35;   --b2l:60; --b2c:.090; --b2h:152; --theme-label:"Desert Dawn"; }
[data-theme="hc"]    { --bl:32; --bc:.180; --bh:250;  --b2l:40; --b2c:.180; --b2h:30;  --theme-label:"High Contrast"; }

/* ============================================================
   LAYER 2 — semantic tokens, derived. Written ONCE.
   ============================================================ */
:root{
  --accent:          oklch(calc(var(--bl) * 1%) var(--bc) var(--bh));
  --accent-hover:    oklch(calc((var(--bl) - 6) * 1%) var(--bc) var(--bh));
  --accent-active:   oklch(calc((var(--bl) - 12) * 1%) var(--bc) var(--bh));
  --accent-subtle:   oklch(95.5% calc(var(--bc) * .22) var(--bh));
  --accent-border:   oklch(88% calc(var(--bc) * .35) var(--bh));
  --accent-contrast: oklch(99% .01 var(--bh));
  --accent-2:        oklch(calc(var(--b2l) * 1%) var(--b2c) var(--b2h));
  --accent-2-subtle: oklch(95% calc(var(--b2c) * .25) var(--b2h));

  --surface-base:    oklch(98.8% .006 var(--bh));
  --surface-raised:  oklch(100% 0 0);
  --surface-sunken:  oklch(96.4% .012 var(--bh));
  --surface-inset:   oklch(97.6% .009 var(--bh));
  --surface-inverse: oklch(22% .028 var(--bh));

  --text-primary:    oklch(23% .030 var(--bh));
  --text-secondary:  oklch(46% .022 var(--bh));
  --text-tertiary:   oklch(61% .016 var(--bh));
  --text-on-accent:  oklch(99% .01 var(--bh));
  --text-on-inverse: oklch(97% .01 var(--bh));

  --border-subtle:   oklch(93.5% .010 var(--bh));
  --border-default:  oklch(87% .018 var(--bh));
  --border-strong:   oklch(74% .028 var(--bh));

  --success:oklch(52% .13 150); --success-subtle:oklch(95.5% .04 150); --success-text:oklch(38% .11 150);
  --warning:oklch(66% .15 78);  --warning-subtle:oklch(96% .06 78);    --warning-text:oklch(45% .12 62);
  --danger: oklch(53% .19 25);  --danger-subtle: oklch(96% .04 25);    --danger-text: oklch(43% .17 25);
  --info:   oklch(55% .14 250); --info-subtle:   oklch(96% .04 250);   --info-text:   oklch(42% .13 250);

  --state-open:oklch(52% .13 150); --state-closing:oklch(62% .16 62); --state-awarded:oklch(52% .16 295);
  --state-progress:oklch(53% .14 250); --state-delivered:oklch(50% .11 195);
  --state-completed:oklch(44% .12 155); --state-disputed:oklch(53% .19 25); --state-cancelled:oklch(60% .01 260);

  --tier-identity:oklch(64% .012 260); --tier-student:oklch(56% .15 248); --tier-institution:oklch(70% .14 85);
  --money-in:oklch(50% .13 152); --money-out:oklch(52% .16 28);
  --money-escrow:oklch(55% .13 250); --money-fee:oklch(60% .02 265);

  --r-sm:.375rem; --r-md:.625rem; --r-lg:1rem; --r-xl:1.5rem; --r-full:999px;
  --sh-1:0 1px 2px oklch(30% .04 var(--bh) / .07), 0 1px 3px oklch(30% .04 var(--bh) / .05);
  --sh-2:0 4px 10px oklch(30% .05 var(--bh) / .08), 0 1px 3px oklch(30% .04 var(--bh) / .06);
  --sh-3:0 14px 34px oklch(30% .06 var(--bh) / .13), 0 4px 10px oklch(30% .05 var(--bh) / .07);
  --sh-accent:0 6px 22px oklch(calc(var(--bl) * 1%) var(--bc) var(--bh) / .28);

  --font-en:'Inter',system-ui,sans-serif;
  --font-ar:'IBM Plex Sans Arabic','Inter',system-ui,sans-serif;
  --font-display-ar:'Noto Kufi Arabic','IBM Plex Sans Arabic',sans-serif;
  --font-mono:'JetBrains Mono',ui-monospace,monospace;
  --dur:200ms; --dur-fast:120ms; --ease:cubic-bezier(.2,.8,.2,1);
  --dir:1;
}
[dir="rtl"]{ --dir:-1; }

/* dark mode overrides — surfaces + text only */
[data-mode="dark"]{
  --accent:          oklch(70% calc(var(--bc) * .95) var(--bh));
  --accent-hover:    oklch(76% calc(var(--bc) * .9) var(--bh));
  --accent-active:   oklch(64% var(--bc) var(--bh));
  --accent-subtle:   oklch(28% calc(var(--bc) * .35) var(--bh));
  --accent-border:   oklch(40% calc(var(--bc) * .45) var(--bh));
  --accent-contrast: oklch(16% .03 var(--bh));
  --accent-2:        oklch(76% calc(var(--b2c) * .9) var(--b2h));
  --accent-2-subtle: oklch(30% calc(var(--b2c) * .3) var(--b2h));

  --surface-base:    oklch(16.5% .020 var(--bh));
  --surface-raised:  oklch(21% .024 var(--bh));
  --surface-sunken:  oklch(13% .018 var(--bh));
  --surface-inset:   oklch(19% .022 var(--bh));
  --surface-inverse: oklch(96% .01 var(--bh));

  --text-primary:    oklch(96.5% .012 var(--bh));
  --text-secondary:  oklch(78% .018 var(--bh));
  --text-tertiary:   oklch(62% .018 var(--bh));
  --text-on-accent:  oklch(16% .03 var(--bh));
  --text-on-inverse: oklch(20% .02 var(--bh));

  --border-subtle:   oklch(26% .020 var(--bh));
  --border-default:  oklch(33% .026 var(--bh));
  --border-strong:   oklch(48% .034 var(--bh));

  --success:oklch(72% .15 152); --success-subtle:oklch(28% .06 152); --success-text:oklch(82% .13 152);
  --warning:oklch(80% .15 82);  --warning-subtle:oklch(30% .07 74);  --warning-text:oklch(88% .13 82);
  --danger: oklch(68% .18 27);  --danger-subtle: oklch(28% .07 27);  --danger-text: oklch(82% .15 27);
  --info:   oklch(72% .14 250); --info-subtle:   oklch(27% .06 250); --info-text:   oklch(84% .12 250);

  --state-open:oklch(72% .15 152); --state-closing:oklch(80% .15 78); --state-awarded:oklch(72% .16 295);
  --state-progress:oklch(72% .14 250); --state-delivered:oklch(70% .11 195);
  --state-completed:oklch(74% .14 155); --state-disputed:oklch(70% .18 27); --state-cancelled:oklch(65% .012 260);
  --tier-identity:oklch(70% .014 260); --tier-student:oklch(72% .14 248); --tier-institution:oklch(82% .13 88);
  --money-in:oklch(74% .14 152); --money-out:oklch(72% .16 28);
  --money-escrow:oklch(74% .13 250); --money-fee:oklch(70% .02 265);

  --sh-1:0 1px 2px oklch(0% 0 0 / .5); --sh-2:0 4px 12px oklch(0% 0 0 / .45);
  --sh-3:0 16px 40px oklch(0% 0 0 / .5);
  --sh-accent:0 6px 26px oklch(70% var(--bc) var(--bh) / .32);
}
