/* ============================================================
   Primunity — main stylesheet ("Aurora SaaS" design system).
   Self-hosted, no CDNs (strict CSP). Fonts load from /assets/fonts
   via fonts.css. Import order matters: tokens -> base -> motion ->
   background -> component library -> layout/features -> responsive.
   ============================================================ */
/* NOTE: @import URLs carry a manual ?v token because a static stylesheet cannot
   cache-bust its own imports by mtime (only the parent <link> gets ?v=mtime via
   asset()). BUMP the token below whenever any @import'd core module changes so
   users pick up CSS without a hard refresh.
   THE CROSS-ROOT RULE: TWO of the imports below are ALSO imported by site.css,
   the other root (the admin/auth/marketing layouts load it instead of this
   manifest) — fonts.css and modules/overlay-fx.css; nothing else here is shared.
   For those two the ?v MUST match in BOTH roots, or a visitor who crosses roots
   (/login -> /dashboard) stores identical bytes under two cache keys. Bump them
   together. To re-derive the pair, intersect the two roots' @import lists. */
@import url('fonts.css?v=6');
@import url('modules/variables.css?v=7');
@import url('modules/base.css?v=6');
@import url('modules/motion.css?v=6');
@import url('modules/background.css?v=5');
/* v=17: the context-banner block was rewritten (the inline background/color moved
   OUT of layouts/dashboard.php INTO this sheet) and .pmu-dropdown gained its
   open-state ring + <optgroup> group rules. THIS BUMP IS NOT COSMETIC: primunity.css
   itself did not change, so its own ?v=mtime from asset() stays the same and a
   returning browser re-uses the CACHED manifest — which means it also re-uses the
   cached components.css?v=16, i.e. the OLD banner rules, while the new markup no
   longer carries the inline background those rules were written to be beaten by.
   The scope bar would render with NO background at all: white text on the page.
   Bump this token whenever an @import'ed module changes; that is what the header
   above means. */
/* v=18: `.modal`'s `visibility` left the 200ms in-transition (GH #37). This bump is
   NOT cosmetic either — it is the whole delivery of a FOCUS fix: a returning browser
   that re-used components.css?v=17 would keep the old rule, keep the panel
   unfocusable for the first 200ms, and the shared focus-in would go on silently
   no-oping for that visitor while the JS half looked installed. */
@import url('modules/components.css?v=18');
/* STAYS HERE ON PURPOSE (the mirror of the course.css/player.css note below):
   core/sortable.css was ALSO page-<link>ed by Clients/show, Exercises/program_edit
   and Nutrition/nutrition_edit, so those three screens fetched it twice under two
   cache keys. The manifest is the correct home, not the page link, because
   app.js:12 imports initSortables from core/sortable.js unconditionally — every
   dashboard page can grow a [data-sortable] container, and Exercises/workout_edit
   already emits one while Courses/edit (course-builder.js) and Posts (posts.js)
   call upgradeSortable() without linking any sheet. The three page links are gone.
   All of its selectors are [data-sortable*] attributes and JS-minted
   .pmu-sortable__* classes; no view emits them literally, so no view can be
   audited for "does it link this sheet". Keep it global. */
@import url('core/sortable.css?v=1');
@import url('core/datepicker.css?v=2');
@import url('modules/admin-selector.css?v=8');
@import url('modules/markdown.css?v=7');
@import url('modules/forms.css?v=6');
@import url('modules/tables.css?v=7');
/* STAYS HERE ON PURPOSE — same story: Admin/Views/tenant_detail.php page-<link>ed
   it as well, and that view renders on layouts/dashboard (which loads THIS
   manifest), so /admin/tenants/{id} fetched charts.css twice. The manifest wins
   because charts.css is the single home of the shared KPI micro-chart visuals
   (.kpi-bars*, .an-spark-tip*), and the ONE renderer that draws them is
   core/kpi-bars.js — reached two ways: modules/sparks.js for the declarative
   [data-spark-values] hosts from partials/spark.php, and modules/admin-console.js /
   modules/analytics-chart.js for their own hosts. .stat__spark is emitted by
   Dashboard/index, Analytics/index, Files/index, Admin/overview, Admin/tenant_detail
   and partials/spark.php — all on layouts/dashboard. The page link is gone.
   (core/sparkline.js, the older inline-SVG renderer, has ZERO loaders and draws
   nothing on any page — do not cite it here again; see its own file header.) */
@import url('modules/charts.css?v=8');
@import url('modules/feed.css?v=7');
@import url('modules/layout.css?v=10');
@import url('modules/auth.css?v=6');
/* NOT HERE ON PURPOSE — course.css + player.css were @import'ed here AND
   page-<link>ed by the views that need them, so every page fetched them TWICE
   under two different cache keys (?v=mtime from asset() vs the hand-bumped ?v
   below). A returning visitor could hold a STALE copy under one key and a fresh
   copy under the other, with the winner decided by cascade order.
   They are course-screen-only sheets (66 KB combined), so the page <link> is the
   correct home and the manifest copy is gone:
     · modules/course.css  -> Courses/Views/{index,edit,landing,reviews}.php
     · modules/player.css  -> Courses/Views/{player,landing}.php
   landing.php gained an explicit player.css link because it emits .lesson-article,
   which ONLY player.css defines. If a new screen needs either sheet, page-<link>
   it there — do not re-add it here. */
@import url('modules/pmu-player.css?v=6');
/* v=7: the closed off-canvas panels (.sidebar mobile drawer, .nav__links public
   sheet) became visibility:hidden — the declaration that actually takes their
   controls out of the tab order (GH #27). THIS BUMP IS NOT COSMETIC, per the rule
   in this file's header: primunity.css's own ?v=mtime is unchanged by editing an
   @import'ed module, so a returning browser would re-use the cached manifest AND
   its cached responsive.css?v=6 — i.e. keep the transform-only drawer whose 21
   off-screen controls stay tabbable, while core/motion.js (cache-busted by mtime
   through <script src>) has already moved on. The a11y fix simply would not ship. */
@import url('modules/responsive.css?v=7');
/* LAST: the shared overlay out-animation layer (.is-closing / [data-ofx]).
   Its rules are written html-prefixed + doubled-class on purpose — page-scoped
   <link>s land after primunity.css, so being last here is not enough. */
@import url('modules/overlay-fx.css?v=2');
/* LAST: the shared DRAG FEEDBACK layer (lift / travelling drop slot / landing).
   Same convention as overlay-fx above — being last here is still not enough,
   because page sheets are <link>ed AFTER primunity.css, so every selector inside
   is html-prefixed + doubled-class. Paired with core/sortable.js. */
@import url('modules/drag-fx.css?v=1');
