/* DE: Design-Tokens (Farb-/Abstands-/Typo-Variablen) und selbst-gehostete @font-face (HR9: kein CDN).
   EN: Design tokens (colour/spacing/type variables) and self-hosted @font-face (HR9: no CDN). */

/* wort.schule — design system (F1 foundation).
   Hand-authored modern CSS: semantic design tokens, logical properties for automatic
   LTR/RTL, light/dark. Served by Propshaft (no build step); one file, ordered by cascade
   (tokens → reset → base → layout → components). School fonts + Silbenbögen arrive in F2. */

/* ============================ tokens ============================ */
:root {
  color-scheme: light dark;

  /* primitives (oklch — warm paper, green ink, amber accent; not used directly by components) */
  --c-ink-900:oklch(.27 .02 152); --c-ink-700:oklch(.40 .02 152); --c-ink-500:oklch(.47 .018 152); --c-ink-300:oklch(.54 .016 152);
  --c-paper-0:oklch(1 0 0); --c-paper-50:oklch(.985 .008 110); --c-paper-100:oklch(.972 .009 110); --c-paper-200:oklch(.95 .012 110);
  --c-brand-800:oklch(.46 .13 152); --c-brand-700:oklch(.55 .13 152); --c-brand-600:oklch(.64 .13 152); --c-brand-100:oklch(.95 .035 152);
  --c-accent-700:oklch(.52 .12 64); --c-accent-600:oklch(.62 .13 66); --c-accent-100:oklch(.95 .045 75);
  --c-sky-700:oklch(.5 .12 245); --c-berry-700:oklch(.46 .14 350); --c-berry-100:oklch(.95 .04 350);
  --c-danger-700:oklch(.48 .17 22); --c-danger-600:oklch(.58 .18 22); --c-danger-100:oklch(.95 .04 25);

  /* semantic roles — components use ONLY these */
  --bg:var(--c-paper-50); --surface:var(--c-paper-0); --surface-2:var(--c-paper-100);
  --border:color-mix(in oklab, var(--c-ink-500) 26%, transparent);
  --text:var(--c-ink-900); --text-muted:var(--c-ink-500); --text-faint:var(--c-ink-300); --text-on-brand:var(--c-paper-0);
  --brand:var(--c-brand-700); --brand-strong:var(--c-brand-800); --brand-surface:var(--c-brand-100);
  --accent:var(--c-accent-700); --accent-surface:var(--c-accent-100);
  --link:var(--c-brand-800); --focus:oklch(.55 .19 252);
  /* status roles (editorial backend): amber=pending, red=error/0 %, berry=AI (always paired with ✦, HR11).
     --warn aliases the existing amber accent so there is ONE source; --danger/--ai are the genuinely new roles. */
  --warn:var(--accent); --warn-surface:var(--accent-surface);
  /* DE: `--danger-strong` ist die TEXT-Rolle auf einer Gefahren-Fläche — genau wie `--brand-strong` es auf
     `--brand-surface` ist (eine Zeile darüber in `editorial-accounts.css` steht das Muster schon).
     Ohne sie landete roter Text auf rötlichem Grund bei rund 3,9:1 und damit unter dem, was lesbar heißt.
     Wie bei `--brand-strong` dreht sich „strong" mit dem Thema: hell dunkler als `--danger`, dunkel heller.
     EN: `--danger-strong` is the TEXT role on a danger surface, exactly as `--brand-strong` is on
     `--brand-surface` (the line above it in `editorial-accounts.css` already shows the pattern). Without it,
     red text on reddish ground sat at about 3.9:1 — below legible. Like `--brand-strong`, "strong" turns with
     the theme: darker than `--danger` in light, lighter in dark. */
  --danger:var(--c-danger-600); --danger-strong:var(--c-danger-700); --danger-surface:var(--c-danger-100);
  --ai:var(--c-berry-700); --ai-surface:var(--c-berry-100);
  /* DE: „Erledigt/bestätigt" — bisher an vier Stellen als erfundenes `--ok` mit hartem Grün geschrieben, das
     im Dunkelmodus stehen blieb. Es aliast `--brand` aus demselben Grund wie `--warn` den Akzent: das Haus hat
     EIN Grün, und zwei getrennte Quellen dafür liefen sonst auseinander. Der bisherige Ersatzwert (#1a7f37)
     lag ohnehin praktisch auf `--c-brand-700`, die Anzeige ändert sich also kaum — sie folgt jetzt nur endlich
     dem Thema.
     EN: "done/confirmed" — previously written at four places as an invented `--ok` with a hard green that
     stayed put in dark mode. It aliases `--brand` for the same reason `--warn` aliases the accent: the house
     has ONE green, and two separate sources for it would drift. The old fallback (#1a7f37) sat practically on
     `--c-brand-700`, so the appearance barely changes — it merely follows the theme at last. */
  --ok:var(--brand-strong);
  /* Noun-class colours now live per class in noun-class-system.css (.nc-class-<key>) — ONE hue per sg/pl pair,
     keyed by the class NUMBER, from db/curriculum/otjiherero_class_colors.json — not a cyclic palette here. */

  /* spacing */
  --sp-2xs:.25rem; --sp-xs:.5rem; --sp-sm:.75rem; --sp-md:1rem; --sp-lg:1.5rem;
  --sp-xl:2rem; --sp-2xl:3rem; --sp-3xl:4.5rem;

  /* fluid type */
  /* the smallest step — tiny tags/badges (provenance „KI · ungeprüft", phonetic „klanglich ähnlich").
     It was referenced before it existed, so those tags silently fell back to the inherited body size and
     rendered far too large; defining it restores their intended small size. */
  --step--2:clamp(.72rem,.68rem + .18vw,.82rem);
  --step--1:clamp(.84rem,.8rem + .2vw,.95rem);
  --step-0:clamp(1rem,.95rem + .25vw,1.13rem);
  --step-1:clamp(1.2rem,1.1rem + .45vw,1.45rem);
  --step-2:clamp(1.45rem,1.3rem + .8vw,1.9rem);
  --step-3:clamp(1.75rem,1.5rem + 1.3vw,2.5rem);
  --step-4:clamp(2.1rem,1.7rem + 2vw,3rem);
  --step-5:clamp(2.5rem,1.9rem + 3vw,3.6rem);
  --lemma:clamp(2.4rem,1.8rem + 3vw,3.8rem);
  --measure:62ch;

  --radius-sm:.6rem; --radius-md:1rem; --radius-lg:1.6rem; --radius-pill:999px;
  --shadow-sm:0 1px 2px color-mix(in oklab,var(--c-ink-900) 9%,transparent);
  --shadow-md:0 8px 24px color-mix(in oklab,var(--c-ink-900) 12%,transparent);
  --ring:3px solid var(--focus);
  /* DE: Die Mindestgröße eines Bedienelements unter dem Finger. Steht hier, weil sie an ZWEI Stellen
     gebraucht wird: `base.css` vergrößert die Bedienelemente darauf, und wer daneben Text setzt, muss
     denselben Platz freihalten (`languages.css`). Als zweimal geratene Zahl liefen die beiden auseinander —
     der Pin einer Sprachkarte wuchs auf 44 px, die Eigenbezeichnung daneben reservierte weiter für 28.
     EN: A control's minimum size under a finger. It lives here because TWO places need it: `base.css` grows
     the controls to it, and whoever sets text beside one must keep the same room free (`languages.css`). As a
     number guessed twice the two drifted apart — a language card's pin grew to 44px while the autonym beside
     it kept reserving room for 28. */
  --touch-target:44px;
  --dur:200ms; --ease:cubic-bezier(.2,.7,.3,1);

  --font-ui:"Atkinson Hyperlegible",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
  --font-display:"Nunito",var(--font-ui);
  --font-lexical:"Noto Sans","Charis SIL","Gentium Plus","Iowan Old Style",Palatino,Georgia,serif;
  /* DE: Für Zeichenketten, die man Zeichen für Zeichen liest und nicht als Wort: Einmalkennwörter,
     HamNoSys-Notation, importierter Rohtext, Fehlerkennungen einer Bildanfrage. Dort trägt gleiche
     Zeichenbreite die Lesbarkeit — und `l`/`1`/`I` und `0`/`O` müssen unterscheidbar bleiben.
     Vier Flächen schrieben `var(--font-mono, …)`, obwohl es das Token nie gab; sie liefen alle auf ihren
     Ersatzwert, und zwei davon auf einen ANDEREN als die übrigen. Eine Schriftrolle, die je Fläche variiert,
     ist keine.
     EN: For strings read character by character rather than as a word: one-time passwords, HamNoSys notation,
     imported raw text, an image request's error codes. There equal character width carries legibility, and
     `l`/`1`/`I` and `0`/`O` must stay distinguishable. Four surfaces wrote `var(--font-mono, …)` although the
     token never existed; all fell back, and two of them to a DIFFERENT fallback than the rest. A type role
     that varies per surface is not one. */
  --font-mono:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace;
}

/* Arabic-script locales/elements lead with the matching webfont (#413): Naskh for Pashto/Dari/Arabic/Persian,
   Nastaliq for Urdu (the script Urdu readers expect). `:lang()` matches the UI `<html lang>` AND embedded
   content (a lemma `<bdi lang="ur">` inside a German page); overriding the variables lets children inherit. */
:lang(ar), :lang(fa), :lang(ps), :lang(prs), :lang(pus), :lang(fas) {
  --font-ui:"Noto Naskh Arabic","Atkinson Hyperlegible",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
  --font-lexical:"Noto Naskh Arabic","Noto Sans","Charis SIL","Gentium Plus","Iowan Old Style",Palatino,Georgia,serif;
}
:lang(ur), :lang(urd) {
  --font-ui:"Noto Nastaliq Urdu","Atkinson Hyperlegible",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
  --font-lexical:"Noto Nastaliq Urdu","Noto Sans","Charis SIL","Gentium Plus","Iowan Old Style",Palatino,Georgia,serif;
}

:root[data-theme="dark"] {
  --bg:oklch(.205 .014 152); --surface:oklch(.25 .016 152); --surface-2:oklch(.29 .017 152);
  --border:oklch(.41 .015 152);
  --text:oklch(.95 .01 110); --text-muted:oklch(.78 .012 110); --text-faint:oklch(.67 .012 110); --text-on-brand:oklch(.18 .02 150);
  --brand:oklch(.74 .12 152); --brand-strong:oklch(.82 .1 152); --brand-surface:oklch(.33 .05 152);
  --accent:oklch(.78 .11 70); --accent-surface:oklch(.35 .05 70);
  --link:oklch(.8 .1 152); --focus:oklch(.72 .16 252);
  --danger:oklch(.68 .16 22); --danger-strong:oklch(.79 .13 22); --danger-surface:oklch(.33 .06 25);
  --ai:oklch(.78 .12 350); --ai-surface:oklch(.34 .06 350);
  --shadow-md:0 8px 24px oklch(0 0 0 / .5);
}
@media (prefers-color-scheme:dark){
  :root:not([data-theme="light"]){
    --bg:oklch(.205 .014 152); --surface:oklch(.25 .016 152); --surface-2:oklch(.29 .017 152);
    --border:oklch(.41 .015 152);
    --text:oklch(.95 .01 110); --text-muted:oklch(.78 .012 110); --text-faint:oklch(.67 .012 110); --text-on-brand:oklch(.18 .02 150);
    --brand:oklch(.74 .12 152); --brand-strong:oklch(.82 .1 152); --brand-surface:oklch(.33 .05 152);
    --accent:oklch(.78 .11 70); --accent-surface:oklch(.35 .05 70); --link:oklch(.8 .1 152);
    --danger:oklch(.68 .16 22); --danger-strong:oklch(.79 .13 22); --danger-surface:oklch(.33 .06 25);
    --ai:oklch(.78 .12 350); --ai-surface:oklch(.34 .06 350);
    --focus:oklch(.72 .16 252); --shadow-md:0 8px 24px oklch(0 0 0 / .5);
  }
}

/* ==================== high-contrast theme (T1, WCAG 2.2) ====================
   A manual axis ORTHOGONAL to light/dark — there is light-high AND dark-high. Set via [data-contrast="high"] on
   <html> by the toggle + the no-flash <head> script (which also turns it on automatically when the OS asks for
   prefers-contrast:more and the user made no explicit choice). It overrides the SEMANTIC roles only: the didactic
   colours (der/die/das article colours, noun-class hues) and the ✦ AI-provenance signal keep their OWN hues so
   nothing meaningful is flattened (HR11); borders become full-strength text colour, muted/faint text loses its
   low contrast, soft shadows become solid outlines, and the focus ring thickens. */
:root[data-contrast="high"] {
  --bg:oklch(1 0 0); --surface:oklch(1 0 0); --surface-2:oklch(.96 0 0);
  --text:oklch(.13 0 0); --text-muted:oklch(.13 0 0); --text-faint:oklch(.3 0 0); --border:var(--text);
  --link:oklch(.32 .17 252); --focus:oklch(.45 .22 252);
  --brand:var(--c-brand-800); --shadow-sm:none; --shadow-md:0 0 0 2px var(--text); --ring:4px solid var(--focus);
}
:root[data-theme="dark"][data-contrast="high"] {
  --bg:oklch(0 0 0); --surface:oklch(.09 0 0); --surface-2:oklch(.15 0 0);
  --text:oklch(1 0 0); --text-muted:oklch(1 0 0); --text-faint:oklch(.82 0 0); --border:var(--text);
  --link:oklch(.85 .16 240); --focus:oklch(.85 .2 240); --shadow-md:0 0 0 2px var(--text);
  /* DE: --brand MUSS hier stehen. Der helle Hochkontrastblock hat dieselbe Spezifität und steht früher,
     gilt also mit — und setzt --brand auf das dunkle Grün. Ohne diese Zeile stünde die dunkle Schrift
     (--text-on-brand) darauf bei 2,8:1. Kontrast-Eigenschaften dürfen durchschlagen, Themen-
     Eigenschaften nicht. Gerechnet in test/assets/text_contrast_test.rb.
     EN: --brand MUST be here. The light high-contrast block has the same specificity and comes
     earlier, so it applies too and sets --brand to the dark green; without this line the dark
     --text-on-brand sat on it at 2.8:1. Contrast properties may carry over, theme properties not. */
  --brand:oklch(.82 .1 152);
}
@media (prefers-color-scheme:dark){
  :root:not([data-theme="light"])[data-contrast="high"] {
    --bg:oklch(0 0 0); --surface:oklch(.09 0 0); --surface-2:oklch(.15 0 0);
    --text:oklch(1 0 0); --text-muted:oklch(1 0 0); --text-faint:oklch(.82 0 0); --border:var(--text);
    --link:oklch(.85 .16 240); --focus:oklch(.85 .2 240); --shadow-md:0 0 0 2px var(--text);
    /* DE: --brand MUSS hier stehen. Der helle Hochkontrastblock hat dieselbe Spezifität und steht früher,
       gilt also mit — und setzt --brand auf das dunkle Grün. Ohne diese Zeile stünde die dunkle Schrift
       (--text-on-brand) darauf bei 2,8:1. Kontrast-Eigenschaften dürfen durchschlagen, Themen-
       Eigenschaften nicht. Gerechnet in test/assets/text_contrast_test.rb.
       EN: --brand MUST be here. The light high-contrast block has the same specificity and comes
       earlier, so it applies too and sets --brand to the dark green; without this line the dark
       --text-on-brand sat on it at 2.8:1. Contrast properties may carry over, theme properties not. */
    --brand:oklch(.82 .1 152);
  }
}

/* ==================== Bundesland region accent (T3, ADR 0055) ====================
   A restrained, purely visual accent for a Bundesland subdomain's regional edition — CSS-only over the SHARED
   lexicon (HR10), never a copy. Keyed on [data-region] on <html> (the DNS label already in the URL — no
   tracking, HR9). The accent reads --region-accent, which defaults to the tenant brand (--brand) so an
   un-themed region inherits the brand rather than a guessed colour; a region overrides it per subdomain, e.g.
     :root[data-region="sh"] { --region-accent: <the region's colour>; }
   Off the region (bare host, reserved labels) there is no [data-region], so the plain site stays plain.
   A slim top bar in the accent — logical border-block-start so it sits correctly under RTL too. */
:root { --region-accent:var(--brand); }
:root[data-region] body { border-block-start:4px solid var(--region-accent); }

/* UI + display web fonts — self-hosted (no third-party request; Hard Rule 9). Atkinson Hyperlegible
   (body/UI, accessibility-first) + Nunito (display headings). OFL; served from public/fonts so the
   url() stays stable across deploys. School fonts (Silbenbögen) live further down, unchanged. */
@font-face{font-family:"Atkinson Hyperlegible";src:url("/fonts/AtkinsonHyperlegible-Regular.woff2") format("woff2");font-weight:400;font-style:normal;font-display:swap}
@font-face{font-family:"Atkinson Hyperlegible";src:url("/fonts/AtkinsonHyperlegible-Bold.woff2") format("woff2");font-weight:700;font-style:normal;font-display:swap}
@font-face{font-family:"Nunito";src:url("/fonts/Nunito-Bold.woff2") format("woff2");font-weight:700;font-style:normal;font-display:swap}
@font-face{font-family:"Nunito";src:url("/fonts/Nunito-ExtraBold.woff2") format("woff2");font-weight:800;font-style:normal;font-display:swap}
@font-face{font-family:"Nunito";src:url("/fonts/Nunito-Black.woff2") format("woff2");font-weight:900;font-style:normal;font-display:swap}
/* Charis SIL (--font-lexical) — self-hosted so lemmata, autonyms, glosses and example sentences in click and
   tone languages actually render. Previously only NAMED in the stack and never loaded, so it fell back to
   Georgia, which lacks click letters (ǀǁǂǃ, in latin-ext U+01C0-01C3) and tone marks → tofu for naq/her/tsn.
   SIL's font for minority/African orthographies (covers clicks, IPA, the modifier apostrophe U+02BC, tone).
   OFL 1.1 (see CharisSIL-OFL.txt). Self-subset from the FULL Charis SIL 7.000 via pyftsubset (layout features
   kept for mark positioning), NOT the @fontsource pre-subset — so the latin + latin-ext faces now carry the
   WHOLE combining-diacritics block (U+0300-036F, incl. the previously-missing U+0302/U+030C) and the spacing-
   modifier + modifier-tone letters (U+02B0-02FF, U+A700-A71F). Both faces carry the marks so base+mark stay in
   one face (per-cluster fallback ⇒ tone attaches, no tofu) for naq/her/ktz. HR9: self-hosted, no CDN. */
@font-face{font-family:"Charis SIL";font-weight:400;font-style:normal;font-display:swap;src:url("/fonts/charis-sil-latin-400-normal.woff2") format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02B0-02FF,U+0300-036F,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+A700-A71F,U+FEFF,U+FFFD}
@font-face{font-family:"Charis SIL";font-weight:700;font-style:normal;font-display:swap;src:url("/fonts/charis-sil-latin-700-normal.woff2") format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02B0-02FF,U+0300-036F,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+A700-A71F,U+FEFF,U+FFFD}
@font-face{font-family:"Charis SIL";font-weight:400;font-style:normal;font-display:swap;src:url("/fonts/charis-sil-latin-ext-400-normal.woff2") format("woff2");unicode-range:U+0100-02AF,U+02B0-02FF,U+0300-036F,U+1AB0-1AFF,U+1D00-1DBF,U+1DC0-1DFF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A700-A7FF}
@font-face{font-family:"Charis SIL";font-weight:700;font-style:normal;font-display:swap;src:url("/fonts/charis-sil-latin-ext-700-normal.woff2") format("woff2");unicode-range:U+0100-02AF,U+02B0-02FF,U+0300-036F,U+1AB0-1AFF,U+1D00-1DBF,U+1DC0-1DFF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A700-A7FF}
@font-face{font-family:"Charis SIL";font-weight:400;font-style:normal;font-display:swap;src:url("/fonts/charis-sil-vietnamese-400-normal.woff2") format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}
/* Noto Sans (--font-lexical PRIMARY; owner's call — a friendlier sans headword than the Charis SIL serif). Like
   Charis SIL it is self-subset from the FULL Noto Sans (notofonts.github.io, OFL) via pyftsubset, so BOTH latin +
   latin-ext faces carry the WHOLE combining-diacritics block (U+0300-036F, incl. U+030C/U+0302) and the spacing-
   modifier letters (U+02B0-02FF), with GPOS kept — clicks (ǀǁǂǃ, U+01C0-01C3), IPA (U+0250-02AF), tone marks and
   Otjiherero ḓṋṱ render AND attach (base+mark in one face → no tofu) for naq/her/ktz (HR2). The @fontsource
   PRE-subset is NOT used (it drops U+030C/U+0302 → tone breaks). Charis SIL stays the fallback for any glyph Noto
   Sans lacks. Ranges mirror Charis SIL's. OFL 1.1 (NotoSans-OFL.txt). HR9: self-hosted, no CDN. */
@font-face{font-family:"Noto Sans";font-weight:400;font-style:normal;font-display:swap;src:url("/fonts/noto-sans-latin-400-normal.woff2") format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02B0-02FF,U+0300-036F,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+A700-A71F,U+FEFF,U+FFFD}
@font-face{font-family:"Noto Sans";font-weight:700;font-style:normal;font-display:swap;src:url("/fonts/noto-sans-latin-700-normal.woff2") format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02B0-02FF,U+0300-036F,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+A700-A71F,U+FEFF,U+FFFD}
@font-face{font-family:"Noto Sans";font-weight:400;font-style:normal;font-display:swap;src:url("/fonts/noto-sans-latin-ext-400-normal.woff2") format("woff2");unicode-range:U+0100-02AF,U+02B0-02FF,U+0300-036F,U+1AB0-1AFF,U+1D00-1DBF,U+1DC0-1DFF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A700-A7FF}
@font-face{font-family:"Noto Sans";font-weight:700;font-style:normal;font-display:swap;src:url("/fonts/noto-sans-latin-ext-700-normal.woff2") format("woff2");unicode-range:U+0100-02AF,U+02B0-02FF,U+0300-036F,U+1AB0-1AFF,U+1D00-1DBF,U+1DC0-1DFF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A700-A7FF}
@font-face{font-family:"Charis SIL";font-weight:700;font-style:normal;font-display:swap;src:url("/fonts/charis-sil-vietnamese-700-normal.woff2") format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}
/* Arabic-script webfonts (self-hosted, HR9 no CDN; OFL in public/fonts/NotoArabic-OFL.txt; delivered by
   Ops/#413, sha256-verified). unicode-range = Arabic + Supplement + Extended-A + Presentation Forms A/B, so
   the browser fetches them only for Arabic glyphs and Latin falls through cleanly. */
@font-face{font-family:"Noto Naskh Arabic";src:url("/fonts/noto-naskh-arabic.woff2") format("woff2");font-weight:400;font-style:normal;font-display:swap;unicode-range:U+0600-06FF,U+0750-077F,U+08A0-08FF,U+FB50-FDFF,U+FE70-FEFF}
@font-face{font-family:"Noto Nastaliq Urdu";src:url("/fonts/noto-nastaliq-urdu.woff2") format("woff2");font-weight:400;font-style:normal;font-display:swap;unicode-range:U+0600-06FF,U+0750-077F,U+08A0-08FF,U+FB50-FDFF,U+FE70-FEFF}

