rustio-admin 0.31.0

Django Admin, but for Rust. A small, focused admin framework.
Documentation
/* ============================================================
 * rustio-admin / base / fonts  —  self-hosted @font-face (OFL-1.1)
 *
 * The RustIO Design System ships its faces via a Google Fonts CDN
 * @import; this framework self-hosts instead (no CDN round-trip, no
 * FOUT, no tracking surface). The woff2 are baked into the binary and
 * served from /static/fonts/ (see src/admin/routes.rs). The display /
 * body / mono families match the DS; Tajawal + Noto Naskh provide the
 * Arabic fallback used by the per-stack font lists in
 * tokens/typography.css. Thai / Devanagari / CJK @font-face live in
 * base/typography-i18n.css, lang-gated.
 *
 * Visual Contract v2.0: Inter is the single Latin face for both body and
 * display (titles lose the serif). The Spectral (display serif) and Hanken
 * Grotesk (body) faces of the prior design were retired once the contract
 * landed — their @font-face blocks, woff2 assets, and static routes are gone.
 * JetBrains Mono stays: the framework's mono stack is SFMono-system, but the
 * shop example's brand override (`--rio-font-mono`) still selects it.
 * ============================================================ */

/* Inter — body + display (variable wght 100..900) */
@font-face {
  font-family: "Inter";
  src: url("/static/fonts/InterVariable.woff2") format("woff2-variations"),
       url("/static/fonts/InterVariable.woff2") format("woff2");
  font-weight: 100 900; font-style: normal; font-display: swap;
}

/* JetBrains Mono — code / data (variable wght 400..700) */
@font-face {
  font-family: "JetBrains Mono";
  src: url("/static/fonts/JetBrainsMono-Variable-latin.woff2") format("woff2-variations"),
       url("/static/fonts/JetBrainsMono-Variable-latin.woff2") format("woff2");
  font-weight: 400 700; font-style: normal; font-display: swap;
}
@font-face {
  font-family: "JetBrains Mono";
  src: url("/static/fonts/JetBrainsMono-Variable-latinext.woff2") format("woff2-variations"),
       url("/static/fonts/JetBrainsMono-Variable-latinext.woff2") format("woff2");
  font-weight: 400 700; font-style: normal; font-display: swap;
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* Tajawal — Arabic UI (compact); three static weights, Arabic codepoints only */
@font-face { font-family: "Tajawal"; src: url("/static/fonts/Tajawal-Regular.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, U+200C-200E, U+2010-2011, U+204F, U+2E41; }
@font-face { font-family: "Tajawal"; src: url("/static/fonts/Tajawal-Medium.woff2") format("woff2"); font-weight: 500; font-style: normal; font-display: swap; unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF, U+200C-200E, U+2010-2011, U+204F, U+2E41; }
@font-face { font-family: "Tajawal"; src: url("/static/fonts/Tajawal-Bold.woff2") format("woff2"); font-weight: 700; font-style: normal; font-display: swap; unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF, U+200C-200E, U+2010-2011, U+204F, U+2E41; }

/* Noto Naskh Arabic — Arabic paragraph body (variable wght 400..700) */
@font-face {
  font-family: "Noto Naskh Arabic";
  src: url("/static/fonts/NotoNaskhArabic-Variable.woff2") format("woff2-variations"),
       url("/static/fonts/NotoNaskhArabic-Variable.woff2") format("woff2");
  font-weight: 400 700; font-style: normal; font-display: swap;
  unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF, U+200C-200E, U+2010-2011, U+204F, U+2E41;
}