/* This file, plus ../../../tailwind.config.js, is now "the config" CONSTITUTION.md
   §4 means by "the brand lives in the Tailwind config" -- hash-locked by
   ontakt_ui/tests/test_design_gate.py, which also proves the served
   ontakt.css is reproducible from this source by the pinned Tailwind CLI
   (backend/tools/tailwind/). Regenerate with:
     backend/tools/tailwind/tailwindcss-<platform> -c tailwind.config.js \
       -i ontakt_ui/static/ontakt/tailwind_input.css \
       -o ontakt_ui/static/ontakt/ontakt.css
   Never edit ontakt.css directly -- it is generated output and the gate
   will reject a hand-edited copy that no longer matches this source.

   TAILWIND_MIGRATION_PLAN.md Phase B moved the toolchain and the 27 colour
   custom properties (see tailwind.config.js's own comment on why the
   plan's "46" doesn't match what's actually in this file, and why colour
   tokens bind to var(--x) rather than a literal value) -- Phase C is what
   moves the templates below off these component classes and onto Tailwind
   utilities.

   CASCADE ORDER, and why this is plain CSS rather than `@layer components`.
   A utility class must win a specificity tie against a hand-authored class
   on the same element (`class="card text-red-500"` must render red), which
   requires this CSS to sit, in the generated output, BEFORE the utilities
   Tailwind emits for `@tailwind utilities`. Partway through Phase C.1 that
   was solved by wrapping the whole file in `@layer components { ... }` --
   but a `@layer`'s contents are emitted ONLY for class names Tailwind finds
   by scanning `content`, unlike plain top-level CSS, which is always
   emitted regardless of whether anything in `content` references it. That
   silently purged classes built in Python (`views.py`'s `"col-3"`) and at
   runtime in JS, `4fdad19`'s incident.

   The actual fix needs no layer at all: `@tailwind utilities` is moved to
   the BOTTOM of this file, after all the hand-authored CSS below, instead
   of being wrapped in `@layer components` up top. Plain CSS that sits
   textually before `@tailwind utilities` loses cascade ties to a utility on
   the same element -- exactly the behaviour `@layer components` was added
   to get -- and, being plain top-level CSS rather than an `@layer` body, it
   is never subject to content-scanning and can never be purged, regardless
   of what `content` does or does not list. This makes the failure mode
   structurally impossible rather than something `content`'s globs must be
   remembered to keep covering (`ontakt_ui/tests/test_design_gate.py`'s
   `AllDeclaredClassesSurviveTests` also proves it empirically). `content`
   still matters for utility classes themselves -- Tailwind only emits the
   utilities it finds referenced there -- so the broadened globs `4fdad19`
   added stay, as the correct mechanism for THAT half. */

*, ::before, ::after {
  --tw-border-spacing-x: 0;
  --tw-border-spacing-y: 0;
  --tw-translate-x: 0;
  --tw-translate-y: 0;
  --tw-rotate: 0;
  --tw-skew-x: 0;
  --tw-skew-y: 0;
  --tw-scale-x: 1;
  --tw-scale-y: 1;
  --tw-pan-x:  ;
  --tw-pan-y:  ;
  --tw-pinch-zoom:  ;
  --tw-scroll-snap-strictness: proximity;
  --tw-gradient-from-position:  ;
  --tw-gradient-via-position:  ;
  --tw-gradient-to-position:  ;
  --tw-ordinal:  ;
  --tw-slashed-zero:  ;
  --tw-numeric-figure:  ;
  --tw-numeric-spacing:  ;
  --tw-numeric-fraction:  ;
  --tw-ring-inset:  ;
  --tw-ring-offset-width: 0px;
  --tw-ring-offset-color: #fff;
  --tw-ring-color: rgb(59 130 246 / 0.5);
  --tw-ring-offset-shadow: 0 0 #0000;
  --tw-ring-shadow: 0 0 #0000;
  --tw-shadow: 0 0 #0000;
  --tw-shadow-colored: 0 0 #0000;
  --tw-blur:  ;
  --tw-brightness:  ;
  --tw-contrast:  ;
  --tw-grayscale:  ;
  --tw-hue-rotate:  ;
  --tw-invert:  ;
  --tw-saturate:  ;
  --tw-sepia:  ;
  --tw-drop-shadow:  ;
  --tw-backdrop-blur:  ;
  --tw-backdrop-brightness:  ;
  --tw-backdrop-contrast:  ;
  --tw-backdrop-grayscale:  ;
  --tw-backdrop-hue-rotate:  ;
  --tw-backdrop-invert:  ;
  --tw-backdrop-opacity:  ;
  --tw-backdrop-saturate:  ;
  --tw-backdrop-sepia:  ;
  --tw-contain-size:  ;
  --tw-contain-layout:  ;
  --tw-contain-paint:  ;
  --tw-contain-style:  ;
}

::backdrop {
  --tw-border-spacing-x: 0;
  --tw-border-spacing-y: 0;
  --tw-translate-x: 0;
  --tw-translate-y: 0;
  --tw-rotate: 0;
  --tw-skew-x: 0;
  --tw-skew-y: 0;
  --tw-scale-x: 1;
  --tw-scale-y: 1;
  --tw-pan-x:  ;
  --tw-pan-y:  ;
  --tw-pinch-zoom:  ;
  --tw-scroll-snap-strictness: proximity;
  --tw-gradient-from-position:  ;
  --tw-gradient-via-position:  ;
  --tw-gradient-to-position:  ;
  --tw-ordinal:  ;
  --tw-slashed-zero:  ;
  --tw-numeric-figure:  ;
  --tw-numeric-spacing:  ;
  --tw-numeric-fraction:  ;
  --tw-ring-inset:  ;
  --tw-ring-offset-width: 0px;
  --tw-ring-offset-color: #fff;
  --tw-ring-color: rgb(59 130 246 / 0.5);
  --tw-ring-offset-shadow: 0 0 #0000;
  --tw-ring-shadow: 0 0 #0000;
  --tw-shadow: 0 0 #0000;
  --tw-shadow-colored: 0 0 #0000;
  --tw-blur:  ;
  --tw-brightness:  ;
  --tw-contrast:  ;
  --tw-grayscale:  ;
  --tw-hue-rotate:  ;
  --tw-invert:  ;
  --tw-saturate:  ;
  --tw-sepia:  ;
  --tw-drop-shadow:  ;
  --tw-backdrop-blur:  ;
  --tw-backdrop-brightness:  ;
  --tw-backdrop-contrast:  ;
  --tw-backdrop-grayscale:  ;
  --tw-backdrop-hue-rotate:  ;
  --tw-backdrop-invert:  ;
  --tw-backdrop-opacity:  ;
  --tw-backdrop-saturate:  ;
  --tw-backdrop-sepia:  ;
  --tw-contain-size:  ;
  --tw-contain-layout:  ;
  --tw-contain-paint:  ;
  --tw-contain-style:  ;
}

.container {
  width: 100%;
}

@media (min-width: 640px) {
  .container {
    max-width: 640px;
  }
}

@media (min-width: 768px) {
  .container {
    max-width: 768px;
  }
}

@media (min-width: 1024px) {
  .container {
    max-width: 1024px;
  }
}

@media (min-width: 1280px) {
  .container {
    max-width: 1280px;
  }
}

@media (min-width: 1536px) {
  .container {
    max-width: 1536px;
  }
}

/* EVERY BORDER IN THIS APP WAS OFF, and silently.

   `tailwind.config.js` carries `corePlugins: { preflight: false }`.
   Tailwind's preflight is, among other things, what sets `border-style:
   solid` on every element. Without it, `border-style` defaults to `none`,
   and `border-width: 1px` WITH `border-style: none` computes to ZERO. The
   `.border` class exists in the served CSS, matches the element, and the
   browser paints nothing.

   MEASURED on the live app on 2026-09-07, asking the browser for the
   `getComputedStyle` of every element with a border class:

     /plant/?range=30d      16 x `border` and 3 x `border-b`  ->  0px,0px,0px,0px
     /settings/camera/      36 x `border` and 10 more         ->  0px,0px,0px,0px

   It is the same family as the `border-primary/40` and `bg-primary/5`
   failure (see the `primaryBg` note in tokens.json): the class is written,
   the CSS is generated, and it is not seen. A numbered `{% step %}` circle
   found it, coming out without a ring even after its colour was fixed.

   The rule below is EXACTLY Tailwind's preflight rule, with our `hairline`
   as the default colour instead of Tailwind's grey. It goes here, in the
   hand-written half and before `@tailwind utilities`, so any border
   utility beats it on specificity. */

*,
::before,
::after {
  border-width: 0;
  border-style: solid;
  border-color: var(--hairline);
}

/* OnTakt design system v2 — borderless surfaces, one orange gradient ramp.
   - Card padding: 22px (`spacing.card`, tailwind.config.js). Grid gap: 16px
     (`gap-4`) -- the KPI grid, the one grid in the system. This line read
     "20px" until 2026-08-29, and 20px genuinely was the value: `.kpi-grid`
     carried `gap: 20px` before the Tailwind conversion, which snapped it to
     the nearest standard step. That looked like drift to correct, so it was
     corrected back to 20px -- and the owner, seeing both rendered side by
     side, kept the 16px: at four columns the wider gap wastes horizontal
     space the tiles could use. The accident turned out to be the better
     value, so the prose moves to meet the code rather than the other way
     round. `spacing.kpi` (20px) stays in the config for other uses.
     Internal stack gap: mostly 8px (`gap-2`, 97 uses across the live
     templates -- corrected 2026-08-28; this line previously said "10-12px",
     which undercounted the actual most-common value).
   - Radius: four steps, now named in the config by what they wrap --
     `rounded-card` 16px (cards, panels), `rounded-media` 12px (image
     frames), `rounded-code` 10px (documentation's formula `<pre>` blocks,
     pairing with the `code` font-size step) and `rounded-pill` 9999px (nav,
     pills, buttons, bars, tracks). Named 2026-08-28: `borderRadius` was the
     last axis with no scale, so these lived as three Tailwind defaults plus
     one arbitrary value the scale ratchet could not see.
   - No borders. Elevation = a faint white-tint surface over the app background.
   - Color: orange gradient = active/emphasis/every chart fill. Green/red = status pills
     and the two named exceptions (pace track, shift on/off-target bars) only. */

/* >>> GENERATED from tools/design/tokens.json -- do not edit by hand */

:root {
  --appBg: #0a0a0a;
  --surface: #171717;
  --surfaceHover: #262626;
  --skeleton: #262626;
  --track: #404040;
  --textMain: #fafafa;
  --textMuted: #a3a3a3;
  /* RAISED FROM #7d7d86 TO #85858e FOR CONTRAST. Measured 2026-09-07 on
     `surfaceHover` composited over `appBg`, which is a card's real background:
     #7d7d86 gave 4.36:1 and fails AA for 11px text, which is exactly the size
     this role lives at -- scope labels and dimmed rows. #85858e gives 4.86.
     Same hue, same role. */
  --textDim: #a3a3a3;
  /* TWO NEW STEPS OF THE NEUTRAL RAMP, 2026-09-10, and they are truly new:
     the ramp had none that would do. Measured on the rendered page, not
     computed: `textFaint` failed AA in BOTH themes at once.

        light   #a3a3a3 on white     2.52   needs 4.5
        dark    #737373 on #171717   3.78   needs 4.5

     And there was nowhere to move it. In light, #525252 is already `textMuted`
     AND `textDim`, so dropping there merges three roles into one colour; the
     only intermediate step was #737373, which passes on white (4.74) and fails
     on the page background (4.35). In dark the problem is the mirror image and
     points the other way.

     IT IS A FINDING ABOUT THE RAMP, NOT ABOUT A PRODUCT. OnTakt and the ERP hit
     the SAME value and the SAME deficit separately, each measuring its own:
     there is no step that is at once distinguishable from #525252 and
     AA-compatible on #f5f5f5. Two independent consumers tripping in the same
     place is the proof that a step is missing, not that someone chose badly.

        light   #6b6b6b   5.33 on white     4.89 on #f5f5f5
        dark    #858585   5.37 on #0a0a0a   4.86 on #171717

     With MARGIN, not grazing the minimum: #6e6e6e and #808080 also pass, by
     hundredths, and a token that passes by 0.01 fails again as soon as
     someone changes a surface. The owner chose this over the two alternatives
     --- 'use faint only on white' and 'accept the deficit' --- because both are
     rules someone has to remember, and this one was already forgotten twice. */
  --textFaint: #858585;
  --primary: #ff6600;
  --primaryLight: #ff8c47;
  /* The hover orange. AMENDED 2026-09-08: it was #e65c00 -- an orange DARKER than the brand -- and the approved design uses #ff7a1f, which is LIGHTER. It slipped because the brief's token summary carried 16 pairs and the export has 26: it was compared against the summary instead of the source. The ten missing were precisely the states (hover, press) and the soft fills. */
  --primaryHover: #ff7a1f;
  --seriesC: #d4a017;
  --success: #22c55e;
  --successBg: rgba(34,197,94,.14);
  --successText: #4ade80;
  --danger: #ef4444;
  --dangerBg: rgba(239,68,68,.14);
  --dangerText: #f87171;
  --headingColor: #fafafa;
  --hairline: #262626;
  --hairlineStrong: #404040;
  --overlayFaint: rgba(255,255,255,0.04);
  --hoverStrong: rgba(255,255,255,0.1);
  --glowA: rgba(255,255,255,0.035);
  --glowB: rgba(255,255,255,0.01);
  --toastBg: #fafafa;
  --toastText: #0a0a0a;
  /* The `control` role (input, button, select, textarea). It did not exist:
     the scale jumped from `media` 12px to `pill` 9999px, so every control
     chose freely and 70% ended up pill -- five completely round text fields.
     8px sits below `code` (10px) on purpose: a control is smaller and more
     frequent than a code block, and 8 separates it cleanly from 9999 without
     reading sharp. Bootstrap's default 6px would sit 4px from `code` and lose
     the role distinction in the same layout.
      AMENDED 2026-09-08: it is now 10px, not 8. The approved design draws its controls at 10 and the design wins. A consequence this paragraph denied: `control` and `code` are THE SAME, so the role separation argued above no longer exists in the scale. The argument stays written because it explains why 8 was right while it was -- but the current value is 10, and whoever reads this must not 'fix' it back. */
  --radius-control: 10px;
  /* The brand orange AT 15% ALPHA, for a surface that states the tone
     without shouting it. Not a new colour: it is the rule this same file
     already wrote for `info` and `warning` -- role = the tone, background =
     the same tone at 15% -- applied to `primary`, the only role that had it
     without a token.

     WHY IT WAS NEEDED, measured 2026-09-07: `tailwind.config.js` binds every
     colour to `var(--token)` and does NOT declare the `<alpha-value>` marker,
     so an opacity modifier -- `bg-primary/5`, `border-primary/40` -- GENERATES
     NOTHING. The class is written, it does not appear in the served CSS, and
     the element stays transparent. Five new uses fell there the same day, two
     in a component nobody called yet: they would have debuted invisible. The
     gate `test_all_template_classes_are_in_the_frozen_inventory` catches it,
     and it is the same shape as the `col-3` failure the header of
     `tailwind.config.js` recounts.

     RULE: in this system a translucent surface is a TOKEN, never a `/NN`. If
     the tone you need is missing, it is added here. */
  --primaryBg: rgba(255,102,0,.16);
  /* The same orange AT 40% ALPHA, for a BORDER that states the tone without
     becoming the strongest element of the card. `primaryBg` (15%) is a
     surface and is too faint for a 1px stroke; `primary` at full strength
     around a 24px number shouts louder than the number.

     WHY IT WAS NEEDED, measured the afternoon of 2026-09-07: the constant
     `STEP_NUM_CLASSES` in `ontakt_extras.py` -- the numbered circle of
     `{% step %}` -- asked for `border-primary/40`. Counted in the served CSS:
     `bg-primaryBg` generates 1 rule, `border-primary` 2, `text-primaryLight`
     1, and `border-primary/40` generates ZERO. The component had been declared
     since that morning WITHOUT ANYONE CALLING IT, so it would have debuted
     with a borderless circle -- exactly the invisible debut the `primaryBg`
     note describes and believed closed.

     The gate read 21/21 meanwhile, and that is not a gate failure: it scans
     TEMPLATES, and this class lived in a Python constant no template used
     yet. A component declared and uncalled is covered by nothing.

     RULE, again and with one more case: in this system a translucent surface
     or border is a TOKEN, never a `/NN`. */
  --primaryBorder: rgba(255, 102, 0, 0.4);
  /* The brand orange on a light background. #ff6600 gives 2.94:1 on white
     and fails WCAG AA; on --appBg it gives 6.78:1 and passes. #c75000 is the
     same hue and the same saturation, darkened until it crosses 4.5:1 (it
     lands on 4.59:1). Derived by a reproducible rule, not by eye -- which is
     why it is a system token and not a local ERP patch, where the need first
     appeared.

     IT WAS DERIVED AGAINST THE WRONG WHITE. #c75000 was derived to cross 4.5:1
     on #ffffff (it lands on 4.59), but the app's light-theme background is
     `appBg` = #f5f5f6, which is darker: there the same colour drops to 4.21
     and fails. #bd4c00 gives 4.59 on the REAL background. The error was not
     the method but the background it was measured against. */
  --primaryOnLight: #bd4c00;
  /* The brand orange on ITS OWN TINT in the light theme: the export's info
     banner is `bg-accent-soft text-accent`, i.e. #ff6600 on `primaryBg` (14%
     orange over the surface), and there it gives 2.52:1. `primaryOnLight`
     does not reach either: it was derived against appBg (4.59) and on the tint
     it drops to 4.30 on surface and 3.96 on appBg. Same rule, another
     background: same hue and saturation, darkened until it crosses 4.5 on the
     tint composited over BOTH backgrounds where a banner is drawn. #ae4600 is
     the first step that crosses: 4.91 on the tint on surface (#ffeadb), 4.52
     on the tint on appBg (#f6e1d3). Light theme only; in dark `primary` on the
     tint already gives 4.92 / 5.62. Measured 2026-09-11. */
  --primaryOnTint: #ae4600;
  /* THE TINTED SURFACE, one gesture with two uses: the menu's active row
     and the CTA. It came out of `NAV_ON_CLASSES` in `ontakt_extras.py`, where
     it lived as three literals inside a Python constant -- exactly the way the
     three different radii that `radius-bar` came to close were born. The
     gradient fades to the right. The ring (`tintRing`) is only set when the
     gradient has room to disappear: on a ~900px CTA yes, on a 40px menu row
     no. */
  --tintFrom: rgba(255, 102, 0, 0.28);
  --tintTo: rgba(255, 102, 0, 0.02);
  --tintRing: rgba(255, 102, 0, 0.18);
  /* THE LIGHT END OF THE PRIMARY BUTTON. `primary` #ff6600 with white text
     gives 2.94:1 and fails even WCAG's large-text threshold (3.0). #f76300 is
     `primary` lowered THE MINIMUM needed to cross it -- 3.12 -- and to the eye
     it is the same orange: (255,102,0) against (247,99,0). Derived by rule
     and reproducible, like `primaryOnLight`, not chosen by eye. The dark end
     of the gradient, `primaryHover`, already gave 3.56. The button's text also
     rises to 14px/700, which is where WCAG counts it as large text. */
  --primaryBtn: #ff6600;
  /* NEARLY BLACK ON FULL-STRENGTH ORANGE. Where text sits on the orange with
     no room to lower it -- the labels of the stacked variant-split bars --
     white gives 2.94:1 and this gives 6.38 on #ff6600 and 5.26 on #e65c00. It
     was already used hand-written as the literal #1a1005; here it has a name. */
  --onPrimary: #0a0a0a;
  /* The INFO role. It did not exist, and the gap is real in all three:
     measured over Open WebUI's 132 stock colours, the INFO role weighs 30
     uses -- as many as WARNING (30) and more than DANGER (27). And in Odoo,
     $o-info stayed at Bootstrap's #17a2b8, foreign to the brand.

     The value was NOT invented. The four status tokens that already existed
     are IDENTICAL to Tailwind's palette byte for byte (success = green-500,
     successText = green-400, danger = red-500, dangerText = red-400), so there
     was an unwritten rule: role = Tailwind-500, text on dark = Tailwind-400,
     background = the same tone at 15% alpha. `info` is that rule applied to
     blue-500. It is the only chromatic voice outside the orange family, and
     it is accepted because blue = informative is a universal convention. */
  --info: #3b82f6;
  --infoBg: rgba(59, 130, 246, 0.15);
  --infoText: #60a5fa;
  /* The WARNING role, same rule, on yellow-500.

     Yellow and NOT amber, decided with data: amber-500 (#f59e0b) sits right
     next to the brand orange (#ff6600) and would be confused with it on the
     same card; yellow-500 (#eab308) is not. Open WebUI already votes the same
     on its own: 26 uses of yellow against 4 of orange. */
  --warning: #f59e0b;
  --warningBg: rgba(245,158,11,.14);
  --warningText: #facc15;
  --primaryPress: #e05a00;
  --dangerHover: #dc2626;
  --onPrimaryDark: #fafafa;
  --successOnInverse: #15803d;
  /* The logo's bars. They were hand-written hex inside the <svg> of `base.html`, right by chance -- the mark has never changed. As a token they stop depending on that chance. */
  --mark: #e4e4e7;
  --markAccent: #ff6600;
  /* The next two steps of the design's orange ramp. The ramp lives in JS for the charts -- seventeen canvas values, and promoting them all would contradict the token count the owner fixed -- but the `Split by variant` stacked bar is painted with DOM, not canvas, so ITS two steps do have to exist as CSS colours. With the variant stack they are THREE (`rampB`/`rampC`/`rampD`): the design's ramp has four steps and the first is the brand orange, already a token. A fourth colour borrowed from another family -- tried with `textFaint` -- reads as a category of another nature, not as the fourth variant. */
  --rampB: #c24d00;
  --rampC: #7a3100;
  --rampD: #3d1a00;
  /* THE TWO FACES OF THE SYSTEM, and the second is not new: it was in use
     undeclared. `documentation.html` renders nine formula blocks with
     `font-mono`, and `tailwind.config.js` only declared `sans` -- so that mono
     fell to Tailwind's default stack: whatever the operating system gave,
     different on every machine. Declaring it adds no font, it names the one
     that was already there.

     JetBrains Mono and no other: it is designed to be read at 11-13px, which
     is where the role lives -- `caption` (11px) and `code` (12.5px) of this
     same scale --, it brings tabular figures, and it is on Google Fonts, where
     Inter is already served from (`base.html`, `login.html`). None of the
     three is true of the default stack.

     THE ROLE, so it does not become decoration: `mono` is the voice of what is
     MEASURED -- a formula, an identifier, a figure compared with another, a
     scope label. `sans` is the product's voice. A title does not go in mono
     because it looks technical. */
  --font-sans: 'Archivo', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
  --font-mono: 'Azeret Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  /* MOTION (docs/DESIGN_SYSTEM.html, Motion; owner 2026-09-19: "smooth"). One
     tempo, every duration a multiple of 50 ms; enter slower than leave; three
     monotonic easings (Material 3's standard set, never its emphasized
     overshoot); a 4 px rise for content and menus, an 8 px lift for the modal
     and the toast; scale and blur never. tailwind.config.js names the same
     values (`duration-enter`, `ease-move`); the two must agree. */
  --motion-quick: 100ms;
  --motion-leave: 150ms;
  --motion-enter: 200ms;
  --motion-change: 300ms;
  --motion-draw: 500ms;
  --motion-loop: 2s;
  --motion-hold: 6s;
  --motion-fade: 1.4s;
  --ease-enter: cubic-bezier(0, 0, 0, 1);
  --ease-leave: cubic-bezier(.3, 0, 1, 1);
  --ease-move: cubic-bezier(.2, 0, 0, 1);
  --rise: 4px;
  --lift: 8px;
}

[data-theme="light"] {
  --appBg: #f5f5f5;
  --surface: #ffffff;
  --surfaceHover: #f5f5f5;
  --skeleton: #e5e5e5;
  --track: #d4d4d4;
  --textMain: #171717;
  --textMuted: #525252;
  --textDim: #525252;
  --textFaint: #6b6b6b;
  --headingColor: #171717;
  --hairline: #e5e5e5;
  --hairlineStrong: #d4d4d4;
  --overlayFaint: rgba(0,0,0,0.045);
  --hoverStrong: rgba(0,0,0,0.09);
  --glowA: rgba(0,0,0,0.05);
  --glowB: rgba(0,0,0,0.01);
  --successText: #146c34;
  --dangerText: #a81919;
  --toastBg: #171717;
  --toastText: #f5f5f5;
  --infoText: #295bac;
  --warningText: #755904;
  --dangerHover: #991b1b;
  --successOnInverse: #4ade80;
  --mark: #18181b;
  --markAccent: #c75000;
  --rampB: #ff944d;
  --rampC: #ffbf99;
  --rampD: #ffe0cc;
  --success: #15803d;
  --successBg: rgba(21,128,61,.12);
  --warning: #b45309;
  --warningBg: rgba(180,83,9,.12);
  --danger: #b91c1c;
  --dangerBg: rgba(185,28,28,.12);
  --primaryBg: rgba(255,102,0,.14);
  --onPrimary: #171717;
}

/* <<< GENERATED */

/* THE SCREEN SWAP. htmx wraps a boosted navigation in a View Transition
   (`hx-swap="outerHTML transition:true"`, live.py): the old content fades
   150 ms accelerate, the new fades in 200 ms decelerate with the 4 px rise.
   No slide, no direction: a plant screen is not a stack of pages. The
   sidebar and header are identical in both snapshots, so they hold still. */

/* A full navigation (a form's redirect, a page without the boost) makes the
   same transition, cross-document, where the browser supports it. */

@view-transition {
  navigation: auto;
}

@keyframes vt-out {
  to {
    opacity: 0;
  }
}

@keyframes vt-in {
  from {
    opacity: 0;
    transform: translateY(var(--rise));
  }
}

::view-transition-old(root) {
  animation: vt-out var(--motion-leave) var(--ease-leave) both;
}

::view-transition-new(root) {
  animation: vt-in var(--motion-enter) var(--ease-enter) both;
}

/* Reduced motion keeps every fade and removes every displacement, growth
   and loop (WCAG 2.3.3 is about motion, not opacity; a cut is the thing
   this system exists to remove). */

@media (prefers-reduced-motion: reduce) {
  ::view-transition-new(root) {
    animation-name: vt-out;
    animation-direction: reverse;
  }

  *, ::before, ::after {
    animation: none !important;
    transition-property: opacity, background-color, color, border-color !important;
  }
}

[data-theme="light"] {
  --appBg: #f5f5f5;
  --surface: #ffffff;
  --surfaceHover: #f5f5f5;
  --skeleton: #e5e5e5;
  --track: #d4d4d4;
  --textMain: #171717;
  --textMuted: #525252;
  --textDim: #525252;
  --textFaint: #6b6b6b;
  --headingColor: #171717;
  --hairline: #e5e5e5;
  --hairlineStrong: #d4d4d4;
  --overlayFaint: rgba(0,0,0,0.045);
  --hoverStrong: rgba(0,0,0,0.09);
  --glowA: rgba(0,0,0,0.05);
  --glowB: rgba(0,0,0,0.01);
  --successText: #146c34;
  --dangerText: #a81919;
  --toastBg: #171717;
  --toastText: #f5f5f5;
  --infoText: #295bac;
  --warningText: #755904;
  --dangerHover: #991b1b;
  --successOnInverse: #4ade80;
  --mark: #18181b;
  --markAccent: #c75000;
  --rampB: #ff944d;
  --rampC: #ffbf99;
  --rampD: #ffe0cc;
  --success: #15803d;
  --successBg: rgba(21,128,61,.12);
  --warning: #b45309;
  --warningBg: rgba(180,83,9,.12);
  --danger: #b91c1c;
  --dangerBg: rgba(185,28,28,.12);
  --primaryBg: rgba(255,102,0,.14);
  --onPrimary: #171717;
}

[data-theme="light"] ::-webkit-scrollbar-thumb {
  background: #d4d4d8;
}

[data-theme="light"] ::-webkit-scrollbar-thumb:hover {
  background: #a1a1aa;
}

/* `.toggle`'s light-theme override converted to inline utilities 2026-08-28
   (`TOGGLE_OFF_CLASSES`'s own `[[data-theme=light]_&]:bg-[rgba(0,0,0,0.12)]`
   -- only the "off" string needs it, see the note above `.toggle`). */

/* `.card` dropped from this list -- CARD_CLASSES's own `transition-
   [background-color,color,transform]` (ontakt_ui/templatetags/
   ontakt_extras.py; mock.js's copy) now carries the same theme-toggle
   fade for a `.card` element. `.sidebar` dropped too -- it carries the same
   `transition-[background-color,color]` inline now (see `.sidebar`'s note
   below). */

body {
  transition: background-color .15s, color .15s;
}

/* `.theme-toggle`/`.menu-toggle` convert to inline utilities below but stay
   declared: interactions.js selects both by class name at runtime
   (`.querySelectorAll(".theme-toggle")`/`.querySelectorAll(".menu-toggle")`),
   so each is a JS hook carrying its own layout alongside. icon-sun/icon-moon
   (inside `.theme-toggle`) already convert via `[[data-theme=light]_&]:hidden`/
   `hidden [[data-theme=light]_&]:block` on each svg -- an arbitrary variant
   compiles to `[data-theme=light] .util{...}`, beating a plain `.hidden` on
   specificity the same way the old descendant rule did. */

/* The `control` role: the radius is set by this rule, not by a class per
   element.

   Measured before writing it: 148 of 288 controls in the three products
   carry NO radius class (131 of 140 here). Requiring `rounded-control` on
   each would be 148 edits and a gate red from the first commit on elements
   that are fine. One rule, one place.

   Plain CSS and not `@layer base`, for the same reason as the rest of the
   file: the body of a `@layer` is only emitted for classes Tailwind finds
   scanning `content`, and an ELEMENT rule has no class to find -- it would
   be purged whole and in silence. Same failure mode as the `4fdad19`
   incident documented above.

   And sitting before `@tailwind utilities`, a utility on the element
   itself wins the tie: a control that truly needs another radius can still
   ask for it. The gate decides whether that exception holds.

   `[data-role="control"]` is here because the tag does not always reach:
   in `_date_filter.html` a <label> IS the visual box of an <input
   type="date"> with no background or border of its own, and in the sidebar
   an <a> is an interactive target like a button. Both declare the role and
   take the same radius; without this line the <label> stayed at 0px,
   square. */

input, button, select, textarea,
[data-role="control"] {
  border-radius: var(--radius-control);
  font-family: inherit;
}

/* THE SAME RULE, AND NOW THE TYPOGRAPHY TOO. `font-family` is not inherited
   by a control: the browser gives it its own and that is that, so without
   this line every <button>, <input> or <select> that does not ask for a
   font explicitly comes out in the system's. With `preflight` off nothing
   else sets it.

   Measured before touching it, walking the PAINTED TEXT NODES of the 48
   reachable screens and reading their parent's computed font --- not the
   classes, not the elements ---: 8,503 nodes in the three brand fonts and
   41 outside. Counting CONTROLS instead of painted text gave 529, and of
   those 417 are not drawn (hidden) and 105 are icon buttons whose glyph is
   painted by a child with its own font. The figure that mattered was 41.

   The 41 came from three places and none was an old template: 22 from a
   button that writes its classes by hand instead of using the shared tag,
   18 from <code> without a class, and 1 from another hand-made button. The
   fix is not to chase the three. It is that the gap stops existing: the
   next control someone adds without a font class can no longer come out
   wrong.

   `code`, `kbd`, `samp` and `pre` do NOT take `inherit` but the brand mono,
   and the difference matters: inheriting would give them the sans and the
   18 nodes of `/docs/metrics/` --- code identifiers, not prose --- would
   lose their shape. The browser already gave them a mono; what they lacked
   was that it be OURS. */

code, kbd, samp, pre {
  font-family: var(--font-mono);
  font-size: 14px;
  font-feature-settings: "liga" 0, "calt" 0;
}

/* 14px, not the browser's `smaller`: the mono voice is never under 14
   (owner, 2026-09-19). The 18 <code> nodes of /docs/metrics/ sat at 12. */

* {
  box-sizing: border-box;
}

html, body {
  margin: 0;
  padding: 0;
  height: 100%;
  overflow: hidden;
}

body {
  background: var(--appBg);
  color: var(--textMain);
  font-family: var(--font-sans);
  /* Composition, docs/DESIGN_SYSTEM.html, "Reading size and Larger text"
     (2026-09-26): "every screen uses Archivo at width 106 -- the wider cut
     opens the letters instead of spacing them". `font-stretch` inherits, so
     one declaration on `body` reaches every figure and control that does
     not already claim `font-family: var(--font-mono)` for itself (`code`,
     `kbd`, `samp`, `pre` above, and Azeret Mono generally -- neither carries
     a width axis, so `font-stretch` on them is a no-op, not a second
     value to keep in step). fonts.css's Archivo faces now declare
     `font-stretch: 62% 125%` precisely so this percentage resolves to a
     real instance instead of clamping to the static font's 100%. */
  font-stretch: 106%;
  -webkit-font-smoothing: antialiased;
}

/* READING SIZE (Composition, docs/DESIGN_SYSTEM.html; Larger text,
   2026-09-26): the five type roles Larger text raises, as custom
   properties so the scoped rule below can change only what sits under
   `#main-content` -- never the sidebar, never the header. Base values are
   this scale's own body/control/meta/subtle/eyebrow/lg pixel sizes;
   turning them into variables changes no pixel by itself, the same reason
   colours point at `var(--token)` instead of a literal (see this file's
   own colour tokens, and `theme.extend.borderRadius.control` in
   tailwind.config.js). */

:root {
  --fs-body: 15px;
  --fs-control: 14px;
  --fs-meta: 14px;
  --fs-subtle: 12px;
  --fs-eyebrow: 11px;
  --fs-lg: 18px;
}

/* LARGER TEXT, ON: an ATTRIBUTE selector, not a class -- `data-text-size`,
   set by controls.js the same way `data-theme` already is (see the
   `[data-theme="light"]` block above), because the bespoke-class ratchet
   just below (`ontakt_ui/tests/test_design_gate.py`'s
   `_declared_bespoke_classes()`) scans this file for a literal `.name` in
   a selector and a class here would be flagged as a new hand-authored one.
   Scoped to `#main-content`, base.html's own content column under the
   header (`ontakt_ui/templates/base.html`) -- the Larger text control only
   ever sits in the header, and the sidebar keeps its own size regardless.
   Values: docs/DESIGN_SYSTEM.html, "Reading size and Larger text". */

[data-text-size="station"] #main-content {
  --fs-body: 22px;
  --fs-control: 20px;
  --fs-meta: 18px;
  --fs-subtle: 18px;
  --fs-eyebrow: 18px;
  --fs-lg: 26px;
}

/* The link colour does not claim the controls either, for the same reason
   as its light-theme partner right below: an <a> that is a BUTTON or a
   CARD brings its own colour, and an element rule (0,0,1) treads on it as
   easily as the theme one. Seen while fixing the light one --- excluding
   the controls there left them inheriting THIS orange, which on white
   gives 2.31:1. Fixing one half of a pair without looking at the other is
   how the next defect is made. */

/* First the floor: EVERY link inherits the colour of its context and does
   not underline. Without this line, excluding the controls from the rule
   below left them with no colour at all --- and then the browser's default
   blue painted, `rgb(0,0,238)`, which on `#171717` gives 1.91:1. The DARK
   theme sweep uncovered it right after fixing the light one: the fix of
   one half created the defect in the other, the third time tonight. */

a {
  color: inherit;
  text-decoration: none;
}

a:not([class*="bg-"]) {
  color: var(--primaryLight);
}

a:not([class*="bg-"]):hover {
  color: var(--primary);
}

/* The same link in the LIGHT theme. `--primaryLight` (#ff8c47) is an
   orange FOR A DARK BACKGROUND: on #f5f5f6 it gives 2.1:1 nominal and,
   measured by pixels on a 12px link, 1.42:1 -- the antialiasing lightens
   it further. The `[data-theme="light"]` block did not redefine it, so
   EVERY link in the app in light came out illegible.
   `--primaryOnLight` (#c75000) exists exactly for this and gives 4.59:1 on
   white; it is the same value and the same reason as `$link-color` in the
   ERP (`OnTakt-ERP/docs/BRANDING.md`). `--primaryLight` is not touched in
   the light block on purpose: it is also the light stop of the primary
   button's gradient, and changing it there would invert it. */

/* BUT IT DOES NOT CLAIM THE CONTROLS, and this is the fix of 2026-09-09.

   `[data-theme="light"] a` has specificity (0,1,1) -- attribute + element --
   and a Tailwind utility like `.text-onPrimaryDark` has (0,1,0). So on ANY
   <a> this rule won and the button's text colour never got applied.
   Measured in the light theme on the live app:

     `Assign reasons`  background rgb(10,10,10)   text rgb(189,76,0)   3.96:1
     `Today` active    background rgb(255,102,0)  text rgb(189,76,0)   1.70:1

   1.70 is orange on orange: practically invisible, and it is exactly the
   capture the owner sent ("orange on orange, not enough contrast").

   What has to be seen is that NOTHING WAS BROKEN. The button's class string
   was right, `--onPrimaryDark` is `#fafafa` and has no override in light.
   The utility simply lost the cascade, and painted the wrong colour with
   not a single error.

   `:not([class*="bg-"])` separates the two by the only thing that truly
   distinguishes them: a CONTENT link declares no background; a control
   does. It fixes every button at once -- the ones there are and the ones to
   come -- without scattering `!important` across the variants, which would
   be a second answer to "what colour is this text" arguing with the first. */

[data-theme="light"] a:not([class*="bg-"]) {
  color: var(--primaryOnLight);
}

[data-theme="light"] a:not([class*="bg-"]):hover {
  color: var(--primary);
}

::-webkit-scrollbar {
  width: 6px;
  height: 6px;
}

::-webkit-scrollbar-track {
  background: transparent;
}

::-webkit-scrollbar-thumb {
  background: #3f3f46;
  border-radius: 3px;
}

::-webkit-scrollbar-thumb:hover {
  background: #52525b;
}

/* ── App shell: sidebar + main ───────────────────────────────── */

/* `.shell`/`.sidebar-head`/`.brand`/`.navgroup`/`.main`/`.topbar`/`.content`
   all convert to inline Tailwind utilities -- base.html's only call site,
   mock.js's own copies (SHELL_CLASSES/SIDEBAR_HEAD_CLASSES/BRAND_CLASSES/
   MAIN_CLASSES/TOPBAR_CLASSES/CONTENT_CLASSES) for the mockups.
   `.content > *`'s :nth-child stagger (the fadeUp entrance + its 20/40/60/
   80ms delays) is now `[&>*]:animate-[...]`/`[&>*:nth-child(N)]:[animation-
   delay:...]` directly on the same element -- an arbitrary child-combinator
   variant scopes the rule to the element's own children exactly like the
   descendant selector did, without needing every child template to carry
   its own class.

   `.sidebar`/`.sidebar-body` stay declared: interactions.js selects both by
   class name at runtime (`.closest(".sidebar")`/`.querySelectorAll(
   ".sidebar-body .nav")`), so each is a JS hook carrying its own layout
   alongside. `.sidebar`'s own light-theme tint override (a hardcoded
   rgba(0,0,0,0.018) -- every other surface token flips for light through a
   CSS variable, this one never did, see the removed comment this replaces)
   is now `[[data-theme=light]_&]:bg-[rgba(0,0,0,0.018)]` inline, the same
   arbitrary-variant trick as icon-sun/icon-moon. */

/* `.kpi-grid`/`.kpi` both converted to inline Tailwind utilities
   (ontakt_ui/templatetags/ontakt_extras.py's KPI_GRID_CLASSES / the
   `{% kpigrid %}` tag; `_kpi_card.html`'s own literal string for `.kpi`
   itself; mock.js's own copies of both for the mockups) -- both sides
   now use the standard breakpoint scale (1 col below `sm`, 2 from `sm`,
   4 from `lg`) instead of the `auto-fit`/`minmax` + three ad-hoc
   breakpoints this used to need. `.kpi`'s own mobile size bump (520px)
   is `tailwind.config.js`'s `phone:` screen; the 1199px override
   (below) had already collapsed onto `lg:` (1024px) as a deliberate
   snap-to-scale, not reproduced verbatim. `.kpi::before`'s orange
   top-accent line is dropped, not carried forward -- confirmed dead in
   production behind `CARD_CLASSES`' own `before:*` chain before this
   (ontakt_extras.py's own note on why), same as `.card::before` was. */

/* `.barchart`'s mobile centering (`justify-content: safe center` below
   900px) converted to inline utilities 2026-08-28 -- mock.js's
   `BARCHART_CLASSES` (`nav:justify-[safe_center]`, `nav:` being this
   file's existing 900px screen). See the note further down (search
   `.barchart`) for the whole family's conversion. */

/* ── Text roles ──────────────────────────────────────────────── */

/* `h2`/`lbl`/`val`/`unit`/`panel-sub` converted to inline Tailwind
   utilities 2026-08-28. A 2026-08-27 restoration of these four (plus
   `gauge-value`/`stat-strip-label`/`stat-strip-value`, elsewhere in this
   file) rested on the belief that spec/test_screens_agree.py matched
   these exact class names by regex -- re-read fresh, it does not: every
   one of those seven locators already matches by `data-testid` with the
   class attribute wildcarded (BUSINESS_DECISIONS.md §26 had already
   re-pointed them the same day, and this file's comment was simply never
   updated after). Only `.date-seg` below still locks a literal
   `class="..."` string. See ontakt_ui/tests/test_design_gate.py's
   ALLOWED_CLASSES for the full accounting of every call site moved. */

/* ── Cards / KPIs / pills ─────────────────────────────────────
   `.card`/`.kpi-grid`/`.kpi-base`/`.kpi-row`/`.btn`(+ `.primary`/
   `.danger-outline`/`.lg`)/`.panel`/`.panel-head`/`.no-body-pad`/
   `.select-wrap`/`.select-native`/`.select-chevron` all converted to
   inline Tailwind utilities -- ontakt_ui/templatetags/ontakt_extras.py's
   CardNode/PanelNode/PanelHeadNode/WrapperNode/btn_classes/
   select_native_classes/SelectWrapNode in the live app, mock.js's own
   byte-for-byte copies of the same constants for the 14 mockups (the
   only remaining reason any of these stayed declared -- the live app
   converted them a batch earlier). `.kpi`/`.kpi::before` converted too,
   see the note above `.kpi-grid`. */

/* Station card (plant summary): `.station`/`.station-top`/`.station-id`/
   `.station-proc`/`.station.off` all converted to inline utilities
   2026-08-28 (`p-5 flex flex-col gap-3 cursor-pointer` + a conditional
   `opacity-[.55]`, `_kpi_card.html`-style, at each of the four call sites
   -- hub_dashboard.html, plant_summary.html, program_switch.html,
   station_picker.html -- plus mock.js's own `stationCard`). `.station`'s
   own `transition`/`:active{transform:scale(.97)}` (below) were already
   dead: every call site wraps `{% card %}`/`Mock.CARD_CLASSES`, whose own
   `transition-[background-color,color,transform] duration-150
   active:scale-[.97]` utility sits later in the cascade (this file's
   `@tailwind utilities` is at the bottom) and already won the tie on the
   identical properties -- same shape as `.kpi::before`'s dead accent line. */

/* ── Table ───────────────────────────────────────────────────── */

/* table.data's whole family converts to one class list
   (ontakt_extras.py's `table_data_classes` tag / TABLE_DATA_CLASSES;
   mock.js's own copy) applied to the `<table>` tag itself, using
   Tailwind's arbitrary child-combinator variants (`[&_td]:...`) to reach
   thead/th/tbody tr/td without touching any of them individually --
   the same mechanism `.content`'s `:nth-child` stagger already uses.
   `row-unassigned`/`flash-once`/`strong` stay literal marker tokens
   (server-conditional or JS-toggled) the table's own compound selectors
   (`[&_tbody_tr.row-unassigned]:...` etc.) key off. */

/* ── Bar chart (full range: zero periods render as a flat baseline mark) ── */

/* `.barchart` and its whole `.bar-col`/`.bar-value`/`.bar-fill`/`.bar`/
   `.bar-zero`/`.bar-label` child family converted to inline utilities
   2026-08-28 -- one combined class list on the container (mock.js's
   `BARCHART_CLASSES`), same "container plus its children" pattern
   `table.data`'s TABLE_DATA_CLASSES already used: each arbitrary child-
   combinator variant reaches its own marker class directly, so the child
   class names stay as literal markers on the elements with no CSS rule of
   their own. `.bar-value.real` is NOT carried forward -- it was a dead,
   no-op modifier (see mock.js's own note by BARCHART_CLASSES). Mockup-only
   (mock.js's `barchart()`/`groupedBarchart()`): the 3 Django partials that
   used to share this markup (`_barchart.html`/`_grouped_barchart.html`/
   the shift chart) all draw with Chart.js now; only the mockups
   (plant_summary, production, quality, downtime, documentation) still
   render the plain div/height-percent bars this family styles. */

/* ── Chart.js canvas + its always-present fallback table ─────────
   TAILWIND_MIGRATION_PLAN.md Gap C.2 / Constitution G3: the table is the
   real content, server-rendered and visible by default; interactions.js's
   initCharts() only hides it once a Chart.js canvas has been built
   successfully. If Chart.js never loads or throws, the table simply never
   gets hidden -- there is no failure state to style. */

/* `.chart-wrap`/`.chart-canvas-box`'s own styling converted to inline
   utilities 2026-08-28 (`relative` / `relative w-full h-[220px]
   [&_canvas]:max-w-full`, at all three call sites -- _barchart.html,
   _grouped_barchart.html, _rankbars.html), so neither rule is declared
   here any more -- but both class names stay on the elements as bare
   selector hooks (interactions.js's initCharts() still finds them by
   class name at runtime, `.querySelectorAll(".chart-wrap")`/
   `.querySelector(".chart-canvas-box")`), so they stay in
   ontakt_ui/tests/test_design_gate.py's ALLOWED_CLASSES, same role
   `.sidebar`'s own hook-only entry has there. */

/* ── Ranked horizontal bars ───────────────────────────────────── */

/* `.rankbars`/`.rankbar-row`/`.rankbar-label`/`.rankbar-track`/
   `.rankbar-fill`/`.rankbar-value` (+ the grow animation and its
   `:nth-child` stagger, further down) all converted to inline utilities
   2026-08-28 -- mock.js's `RANKBARS_CLASSES`, one combined class list on
   the container using arbitrary child-combinator variants, same pattern
   `table.data`'s TABLE_DATA_CLASSES already used. Mockup-only: Chart.js
   draws this chart in the live app (_rankbars.html). */

/* ── Pace segmented bar (status is the fact — exception) ─────── */

/* `.pace-track`(+ its `> span` grow animation)/`.pace-legend`/
   `.pace-legend-row`/`.pace-dot`/`.pace-legend-label`/`.pace-legend-val`
   all converted to inline utilities 2026-08-28 -- mockup-only
   (production.html, documentation.html; Chart.js draws this chart in the
   live app). The grow animation folds into `.pace-track`'s own
   `[&>span]:animate-[growW_.5s_ease-out_both]` at its one call site. */

/* ── Half-meter gauge ────────────────────────────────────────── */

/* `.gauge-wrap`/`.gauge-value` both converted to inline utilities
   2026-08-28 (`relative w-[120px] h-[72px]`, and `.gauge-wrap svg
   path[stroke-dashoffset]`'s grow animation is now `animate-grow-dash`
   injected directly onto the fill path -- see the note above `.kpi-grid`
   for `.gauge-value` and the mockup's own note for the animation swap).
   plant_summary.html's mockup was the only remaining call site. */

/* ── Live Run trigger row ────────────────────────────────────── */

/* `.trigger-row`/`.trigger-serial`/`.trigger-actions` convert to inline
   Tailwind utilities but stay declared: interactions.js selects all three
   by class name at runtime (`.closest(".trigger-row")`/`.querySelector(
   ".trigger-serial")`/`.closest(".trigger-actions")`/`.querySelectorAll(
   ".trigger-actions")`), so each is now a JS hook carrying its own layout
   alongside, not a styled selector of its own. `.trigger-stack` and
   `.trigger-select-row` had no such hook (grepped interactions.js -- only
   the three above appear) and are fully gone: `.trigger-stack`'s mobile
   column-stack is folded directly into `_live_run_live.html`'s/
   `_classifier_live.html`'s own `trigger-row` element as `nav:flex-col`
   (its only two call sites, always paired with `trigger-row` before this),
   and `.trigger-select-row`'s mobile rule (`display:flex;gap:12px`) was
   exactly redundant with `.trigger-actions`'s own unconditional rule at
   the same two call sites, so it is dropped rather than reproduced.

   The two mockups (`live_run.html`/`classifier_live.html`, raw JS in the
   page itself, not mock.js) use `.trigger-row`/`.trigger-serial` WITHOUT
   `.trigger-stack` -- no column-stack, and the serial text keeps the
   plain `nav:text-[22px]` shrink instead of the live app's `nav:text-
   [20px]` (the more specific `.trigger-stack .trigger-serial input` rule
   used to win there whenever `.trigger-stack` was present, which was
   always, in the two live templates only) -- so each of the four call
   sites (2 live templates + 2 mockups) carries its own literal, already-
   resolved utility string rather than a shared constant that can't
   express the difference. */

/* BTN_BASE_CLASSES's own `[&[hidden]]:hidden` (ontakt_ui/templatetags/
   ontakt_extras.py; mock.js's copy) carries forward the fix this used to
   be: a `.btn`'s own `display:inline-flex` outranked the `[hidden]` UA
   style (an author class always beats the attribute's default), so a
   hidden Attach scan button rendered visible anyway without it -- same
   fix `.date-seg-picker[hidden]` above still needs on its own account. */

/* ── Search input ────────────────────────────────────────────── */

/* Keeps the search box pinned to the right edge of .panel-head even when
   it wraps to its own line on narrow widths -- .panel-head's own
   justify-content:space-between only pushes it right while a sibling
   still shares that line; alone on a wrapped line it would sit at the
   start instead. */

/* ── Status card (sidebar) ───────────────────────────────────── */

@keyframes pulse {
  0%, 100% {
    opacity: 1;
  }

  50% {
    opacity: .4;
  }
}

/* ── Schedule rows ───────────────────────────────────────────── */

/* `.sched-row`/`.sched-row:hover`/`.sched-row:active` converted to inline
   utilities 2026-08-28 -- one call site, `_quality_lookup_result.html`. */

/* ── Form fields ─────────────────────────────────────────────── */

/* `.field`/`.field-row` convert to inline Tailwind utilities -- deferred
   three times before this, since `.field input, .field select`'s
   descendant rule reached every raw <input>/<select> nested in a `.field`
   across ~15 templates and 60+ call sites. No block tag can rewrite an
   arbitrary child tag's own class attribute (an <input> is the caller's
   markup, not content a tag renders), so each one now carries
   ontakt_extras.py's `field_input_classes` tag directly on its own
   `class=""` -- same shape as `btn_classes`/`select_native_classes`.
   `select_native_classes` alone (appearance-none + the chevron gutter)
   never carried the base look, so every <select> using it needs
   `field_input_classes` too, not just `.field`'s own container conversion.
   `.compact-grid .field input`'s own override (Settings' numeric fields
   grid, below) is `field_input_classes compact=True` -- a fully separate
   string rather than composing with the plain variant, since stacking two
   arbitrary-value utilities for the same property (`padding`/`width`) risks
   an unpredictable winner (Tailwind's own plugin order, not the class
   list's source order, decides those ties). mock.js's own copies of both
   constants cover the mockups; hub_station.html/_live_run_live.html/
   _classifier_live.html's own `.field` divs are read-only (a label + a
   plain span, no input) and needed only the container conversion. */

/* `.toggle`/`.toggle::before`/`.toggle::after`/`.toggle.on`/`.toggle.on::after`
   converted to inline utilities 2026-08-28 -- ontakt_ui/templatetags/
   ontakt_extras.py's TOGGLE_ON_CLASSES/TOGGLE_OFF_CLASSES (settings_base.html's
   3 call sites via `{% toggle_classes %}`); mock.js's own copies (camera_
   connection.html's MQTT toggle, settings.html's module/category/cause
   toggles). `before:-inset-3` reproduces the `inset: -12px` invisible
   44px touch-target expansion around the visible 36x20 switch verbatim. */

/* `.reason-row`/`.reason-row:first-child`/`.reason-row.compact` converted
   to inline utilities 2026-08-28 -- `flex items-center justify-between
   gap-3 p-[14px_22px] border-t border-hairline first:border-t-0` (the
   `.compact` variant swaps in `p-[10px_18px]`) at every call site: core/
   station_list.html, core/certificate_status.html, sec/audit_log.html,
   camera_connection.html (live + mockup), settings_base.html, and
   settings.html's mock.js-built module/category/cause rows. */

/* ── Sidebar status card ─────────────────────────────────────── */

/* .glow-card* moved to landing.html as utilities (Phase C.1, 2026-08-26) --
   it was landing-exclusive despite the "sidebar status card" heading (the
   name outlived an earlier use). */

/* ── Landing (public marketing page) ──────────────────────────
   TAILWIND_MIGRATION_PLAN.md Phase C.1, 2026-08-26: landing.html was the
   first template converted. Every class here that was used ONLY on that
   page (landing-nav, landing-wrap, hero*, kicker, section*, feature-*,
   oee-row/label/num, email-capture*, footer, glow-card*) moved to inline
   Tailwind utilities in the template and its rule was deleted here.
   `.oee-track`/`.oee-fill` converted 2026-08-28 (`flex-1 h-2 rounded-full
   bg-track overflow-hidden` / `block h-full rounded-full bg-[linear-
   gradient(90deg,rgba(255,102,0,0.15),var(--primary))]` plus the grow-in
   animation folded directly onto each call site, since the shared
   selector below no longer needs to reach it) at its three remaining call
   sites -- ontakt_counter/counter_production.html, ontakt_ui/
   production.html, and the mockup copies (mock.js's counter_production.html/
   production.html string templates). */

/* ── Motion: page-in, growth, skeleton, toast, live flash ── */

/* fadeUp: the content column's entrance, the 4 px rise. toastIn: the 8 px
   lift. No scale anywhere (Motion, 2026-09-19); shimmer and flashPulse are
   gone with it -- the skeleton pulses, the trigger tints like a row. */

@keyframes fadeUp {
  from {
    opacity: 0;
    transform: translateY(var(--rise));
  }

  to {
    opacity: 1;
    transform: translateY(0);
  }
}

@keyframes toastIn {
  from {
    opacity: 0;
    transform: translateY(var(--lift));
  }

  to {
    opacity: 1;
    transform: translateY(0);
  }
}

@keyframes rowFlash {
  0% {
    background: rgba(255,102,0,.16);
  }

  100% {
    background: transparent;
  }
}

@keyframes growH {
  from {
    height: 0;
  }
}

/* THE ORB WAS WITHDRAWN ON 2026-09-09 and with it the LAST argued exception
   to "Tailwind by default": they were the only six hand-made classes the
   product had left --- `.orb`, `.orb-layer`, `.orb-sheen`, `.orb-rim`,
   `.orb-glow`, `.orb-wrap` --- plus `@property --angle` and two
   `@keyframes`. This file's count of hand-made classes is now ZERO.

   What was there was a sphere with a conic gradient, inner sheen, rim and
   halo. The owner named it: "an orange circle and that's it", and it shared
   not one shape with the rest of the product --- not the arc, not the bar,
   not the compass. Now the assistant is the living MARK: the logo's four
   bars in `_orb.html`, each with its own duration, with
   `theme.extend.keyframes` doing the work these 110 lines did.

   `--orb-amplitude` survives intact: `ontask.js` still writes it from the
   AnalyserNode and the orb still reads it for its scale. */

/* `.card`/`.btn`/`a.card` dropped from this shared selector list --
   CARD_CLASSES/BTN_BASE_CLASSES (ontakt_ui/templatetags/ontakt_extras.py;
   mock.js's own copies for the mockups) already carry this exact
   transition/active-scale/shimmer-skeleton behavior as inline utilities
   (`transition-[background-color,transform] duration-150 active:scale-
   [.97]`, plus CARD_CLASSES's `before:*`/`[.is-loading_&]:*` chain for the
   shimmer). `.station`/`.toggle`/`.sched-row` all converted above --
   `.sched-row`'s own transition/active-scale folds directly into its one
   call site's utility string instead. */

/* `.flash-once`'s own single-element rule converted to inline utilities
   2026-08-28 (`interactions.js`'s trigger flash uses `animate-[flashPulse_
   1.1s_ease-out_1]` directly). The literal "flash-once" class name stays,
   JS-applied to the table's newest row only -- table.data's own row-flash
   variant is part of TABLE_DATA_CLASSES (`[&_tbody_tr.flash-once]:
   [animation:rowFlash_1.4s_ease-out_1]`), applied from the <table> tag
   itself, and needs that literal marker on the row to key off. */

/* `.toast-stack`/`.toast`/`.toast.out` converted to inline utilities
   2026-08-28 (interactions.js's `OnTaktToast`/`toastStack`) -- `.toast-stack`
   stays a real JS selector hook (re-queried across calls), carrying its
   layout as inline utilities alongside; `.toast` itself was never queried
   anywhere and drops outright. */

/* ── Sidebar nav groups: gap between groups, not just within one ──
   .sect already carries its own margin-bottom (above), which separates a
   group's label from ITS OWN links -- but nothing separated one group's
   last link from the next group's label without this. Only the inter-
   group gap is added, via the sibling combinator, so the first section
   keeps its tight single margin-bottom. */

#sidebar-nav {
  display: flex;
  flex-direction: column;
}

/* ── Date field (compact pill-shaped date picker trigger) ────── */

/* `.date-field`/`.date-seg-row`/`.date-seg-btn`/`.date-seg-custom`(+
   `.active`) converted to inline Tailwind utilities -- `_date_filter.html`'s
   only call site (ontakt_extras.py's `date_seg_custom_classes` tag for the
   one conditional case), plus mock.js's own copy for the mockups.
   `.date-seg-picker` stays declared: interactions.js's own `.querySelector(
   ".date-seg-picker")` selects it by class name at runtime -- a pure JS
   hook now, no styling of its own -- but carries its own layout as inline
   utilities alongside, same as any other converted element. The mobile
   `[hidden]` override -- desktop always shows the date inputs inline
   regardless of the `hidden` attribute, only ≤900px actually hides them --
   is now `nav:[&[hidden]]:hidden` directly on the form. `.date-seg-custom`/
   `.date-field` stay declared too, JS-hook-only in mock.js's own
   `wireDateFilter` (`.date-seg-custom`/`.date-field` selectors) -- the live
   app's `_date_filter.html` needs neither literal marker, since
   interactions.js has no equivalent runtime lookup for either.

   `.date-seg` itself is NOT converted: spec/test_screens_agree.py's
   `test_plant_summary_station_tiles_never_echo_the_selected_range` locks
   its class attribute to the literal, exact string `class="date-seg"` (no
   trailing utilities) by regex, to read `data-range` as a non-styling
   state signal -- that file belongs to another session per this project's
   own working method, so this stays real CSS rather than routing the test
   change elsewhere mid-batch. */

/* ── Dialog + slide-in panel ──────────────────────────────────
   Two audited-write interaction shapes: a centered modal (confirm/review
   steps) and a right-edge slide-in (record detail). Folded in from
   mockups/mock.css 2026-08-22 per the design-gate rebuild (BACKEND_
   REBUILD_PLAN_V2.md §9.10) — every class below is now part of the frozen
   system, not mockup scaffolding.

   `.modal-backdrop`/`.modal-card`/`.modal-head`/`.modal-step` converted to
   inline Tailwind utilities -- none of the four is a JS selector hook
   (interactions.js reaches the live dialog by id, `#assign-modal`/
   `#assign-modal-close`, never by these class names, including in its own
   "Serial required" JS-built markup), so no marker needed anywhere.
   `.modal-backdrop`'s replacement (`fixed inset-0 z-[200] bg-black/[.55]`)
   matches `#part-panel-backdrop`'s own already-converted string exactly --
   same overlay, same opacity. `.modal-card`'s two-layer background
   (`linear-gradient(...)` over a solid `var(--appBg)` fallback, the same
   shorthand `.slide-panel` used) splits into `bg-appBg` +
   `bg-[linear-gradient(...)]` -- Tailwind routes a bare color token to
   `background-color` and a gradient function to `background-image`
   automatically, reproducing the shorthand's two declarations exactly.

   `.slide-panel`/`.slide-panel.slide-panel-open` converted 2026-08-28,
   base.html's one call site (`#part-panel`) -- not a JS selector hook
   (interactions.js reaches it by id), so the open/close transform is now
   `[&[aria-hidden=false]]:translate-x-0` keyed directly off the
   `aria-hidden` attribute the same listener already toggled in lockstep
   with the class, rather than a separate `classList` flip. */

/* `.clickable-row` converts to inline utilities (ontakt_extras.py's
   `clickable_row_classes` tag / CLICKABLE_ROW_CLASSES; mock.js's own copy)
   -- not scoped under `table.data` in the original rule, so it stayed its
   own conversion rather than folding into TABLE_DATA_CLASSES. Not a JS
   hook either (interactions.js only mentions it in a comment; the mockups'
   own `wireClickableRows` selects by `[data-part]`, never this class), so
   the literal class name drops entirely.

   Downtime's row-unassigned danger tint (including on hover, where
   `table.data tbody tr:hover` would otherwise outrank a plain class
   selector on specificity) is now part of TABLE_DATA_CLASSES
   (`[&_tbody_tr.row-unassigned]:bg-dangerBg`/
   `[&_tbody_tr.row-unassigned:hover]:bg-dangerBg` -- the compound selector
   itself carries the higher specificity that used to need the explicit
   `tr` qualifier). */

/* ── Compact form grid (Settings: many short numeric fields) ─── */

/* `.compact-grid` converted to inline utilities 2026-08-28 (`grid grid-
   cols-[repeat(auto-fill,148px)] gap-x-5 gap-y-3.5`) -- ontakt_counter/
   settings.html, _inspection_settings.html, settings_base.html, and the
   settings.html mockup, whose own inline `<style>` block duplicated this
   exact rule (plus dead `.field`/`.lbl`/`.field-unit*` selectors matching
   nothing still rendered) and is deleted in the same commit, not just
   this one rule inside it. `.reason-row.compact` converted with
   `.reason-row` above. */

/* ── Compact one-row stat strip ───────────────────────────────
   `.stat-strip`/`.stat-strip-item`/`.stat-strip-label`/`.stat-strip-value`
   all converted to inline Tailwind utilities 2026-08-28 -- the live app's
   `_counter_live.html`/`_live_run_live.html`/`_classifier_live.html`
   already carried the converted form (`{% card extra="flex flex-wrap
   items-center gap-y-[10px] gap-x-[22px] p-[14px_22px]
   [@media(max-width:640px)]:gap-x-4 [@media(max-width:640px)]:p-[14px_18px]"
   %}` for the container, `data-testid`-hooked inline utilities for each
   item), only mock.js's `statStrip()` still drew with the literal class
   names -- brought to parity in the same commit. See the note above
   `.kpi-grid` for why the once-claimed spec/test_screens_agree.py lock on
   `stat-strip-label`/`stat-strip-value` turned out to already be a
   `data-testid` locator, not a class-name one. */

/* ── Hero gauge ────────────────────────────────────────────────
   `.gauge-hero`/`.gauge-hero-arc`(+`svg`)/`.gauge-hero-value`/
   `.gauge-hero-caption` all converted to inline utilities 2026-08-28 --
   ontakt_counter/_counter_live.html (the one live call site) and
   mock.js's `gaugeHero()`. The value's dual `font-size` (px fallback,
   then the `cqw` container-query line that wins where supported) is two
   stacked arbitrary-property utilities in the same order -- verified
   with the pinned Tailwind CLI that Tailwind compiles them in the order
   they appear in `class=""`, so the cascade still resolves the same way.
   The caption's mobile size bump retires the file's last ad-hoc
   breakpoint (420px) onto the existing `phone:` (520px) screen, per
   CLAUDE.md's "collapse toward the standard scale as each block is
   retired" -- a small, deliberate widening of where it shrinks, not a
   pixel-identical carry-forward. */

/* ── Monospace formula block (Documentation) ──────────────────
   Renders the actual formula a page computes, verbatim, next to its prose
   explanation -- reads as code/math, not body copy. */

/* ── Interaction states ─────────────────────────────────────── */

/* `a.card`/`a.card:hover` retired -- CardNode's own `hover:bg-surfaceHover`
   (added when `tag="a"`, alongside CARD_CLASSES's own `transition-
   [background-color,color,transform]`) carries this forward; mock.js's/
   index.html's anchor-flavored cards carry the same pair inline. */

a:focus-visible, button:focus-visible, input:focus-visible, select:focus-visible {
  outline: 2px solid var(--primary);
  outline-offset: 2px;
}

.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;
}

.pointer-events-none {
  pointer-events: none;
}

.visible {
  visibility: visible;
}

.invisible {
  visibility: hidden;
}

.collapse {
  visibility: collapse;
}

.static {
  position: static;
}

.fixed {
  position: fixed;
}

.absolute {
  position: absolute;
}

.relative {
  position: relative;
}

.sticky {
  position: sticky;
}

.-inset-1\.5 {
  inset: -0.375rem;
}

.-inset-3 {
  inset: -0.75rem;
}

.inset-0 {
  inset: 0px;
}

.inset-x-0 {
  left: 0px;
  right: 0px;
}

.-left-\[9999px\] {
  left: -9999px;
}

.bottom-0 {
  bottom: 0px;
}

.bottom-1 {
  bottom: 0.25rem;
}

.bottom-7 {
  bottom: 1.75rem;
}

.bottom-\[max\(1\.75rem\2c env\(safe-area-inset-bottom\)\)\] {
  bottom: max(1.75rem, env(safe-area-inset-bottom));
}

.bottom-full {
  bottom: 100%;
}

.left-0 {
  left: 0px;
}

.left-1\.5 {
  left: 0.375rem;
}

.left-3 {
  left: 0.75rem;
}

.left-\[292px\] {
  left: 292px;
}

.left-\[max\(292px\2c calc\(\(100vw-1704px\)\/2\+292px\)\)\] {
  left: max(292px, calc((100vw - 1704px) / 2 + 292px));
}

.right-0 {
  right: 0px;
}

.right-1\.5 {
  right: 0.375rem;
}

.right-2 {
  right: 0.5rem;
}

.right-3 {
  right: 0.75rem;
}

.right-3\.5 {
  right: 0.875rem;
}

.right-\[max\(2\.5rem\2c calc\(\(100vw-1704px\)\/2\+2\.5rem\)\)\] {
  right: max(2.5rem, calc((100vw - 1704px) / 2 + 2.5rem));
}

.right-snug {
  right: 10px;
}

.top-0 {
  top: 0px;
}

.top-1\.5 {
  top: 0.375rem;
}

.top-1\/2 {
  top: 50%;
}

.top-2 {
  top: 0.5rem;
}

.top-\[68px\] {
  top: 68px;
}

.top-\[76px\] {
  top: 76px;
}

.top-full {
  top: 100%;
}

.z-0 {
  z-index: 0;
}

.z-10 {
  z-index: 10;
}

.z-40 {
  z-index: 40;
}

.z-\[199\] {
  z-index: 199;
}

.z-\[200\] {
  z-index: 200;
}

.z-\[201\] {
  z-index: 201;
}

.z-\[300\] {
  z-index: 300;
}

.order-first {
  order: -9999;
}

.col-span-1 {
  grid-column: span 1 / span 1;
}

.col-span-2 {
  grid-column: span 2 / span 2;
}

.col-span-4 {
  grid-column: span 4 / span 4;
}

.col-span-full {
  grid-column: 1 / -1;
}

.m-0 {
  margin: 0px;
}

.m-auto {
  margin: auto;
}

.m-card {
  margin: 22px;
}

.-mx-6 {
  margin-left: -1.5rem;
  margin-right: -1.5rem;
}

.mx-1 {
  margin-left: 0.25rem;
  margin-right: 0.25rem;
}

.mx-10 {
  margin-left: 2.5rem;
  margin-right: 2.5rem;
}

.mx-auto {
  margin-left: auto;
  margin-right: auto;
}

.mx-card {
  margin-left: 22px;
  margin-right: 22px;
}

.my-1\.5 {
  margin-top: 0.375rem;
  margin-bottom: 0.375rem;
}

.my-2 {
  margin-top: 0.5rem;
  margin-bottom: 0.5rem;
}

.my-6 {
  margin-top: 1.5rem;
  margin-bottom: 1.5rem;
}

.-mb-card {
  margin-bottom: -22px;
}

.-mr-2\.5 {
  margin-right: -0.625rem;
}

.-mr-px {
  margin-right: -1px;
}

.-mt-2 {
  margin-top: -0.5rem;
}

.mb-1 {
  margin-bottom: 0.25rem;
}

.mb-1\.5 {
  margin-bottom: 0.375rem;
}

.mb-10 {
  margin-bottom: 2.5rem;
}

.mb-2 {
  margin-bottom: 0.5rem;
}

.mb-2\.5 {
  margin-bottom: 0.625rem;
}

.mb-3 {
  margin-bottom: 0.75rem;
}

.mb-3\.5 {
  margin-bottom: 0.875rem;
}

.mb-4 {
  margin-bottom: 1rem;
}

.mb-5 {
  margin-bottom: 1.25rem;
}

.mb-6 {
  margin-bottom: 1.5rem;
}

.mb-8 {
  margin-bottom: 2rem;
}

.mb-card {
  margin-bottom: 22px;
}

.mb-snug {
  margin-bottom: 10px;
}

.ml-1 {
  margin-left: 0.25rem;
}

.ml-2 {
  margin-left: 0.5rem;
}

.ml-3 {
  margin-left: 0.75rem;
}

.ml-auto {
  margin-left: auto;
}

.ml-px {
  margin-left: 1px;
}

.mt-0\.5 {
  margin-top: 0.125rem;
}

.mt-1 {
  margin-top: 0.25rem;
}

.mt-1\.5 {
  margin-top: 0.375rem;
}

.mt-10 {
  margin-top: 2.5rem;
}

.mt-2 {
  margin-top: 0.5rem;
}

.mt-2\.5 {
  margin-top: 0.625rem;
}

.mt-3 {
  margin-top: 0.75rem;
}

.mt-4 {
  margin-top: 1rem;
}

.mt-5 {
  margin-top: 1.25rem;
}

.mt-6 {
  margin-top: 1.5rem;
}

.mt-8 {
  margin-top: 2rem;
}

.mt-\[6px\] {
  margin-top: 6px;
}

.mt-auto {
  margin-top: auto;
}

.mt-cozy {
  margin-top: 14px;
}

.box-border {
  box-sizing: border-box;
}

.block {
  display: block;
}

.inline {
  display: inline;
}

.flex {
  display: flex;
}

.inline-flex {
  display: inline-flex;
}

.\!table {
  display: table !important;
}

.table {
  display: table;
}

.\!grid {
  display: grid !important;
}

.grid {
  display: grid;
}

.contents {
  display: contents;
}

.hidden {
  display: none;
}

.aspect-\[1520\/960\] {
  aspect-ratio: 1520/960;
}

.aspect-\[4\/3\] {
  aspect-ratio: 4/3;
}

.aspect-\[560\/260\] {
  aspect-ratio: 560/260;
}

.h-1\.5 {
  height: 0.375rem;
}

.h-10 {
  height: 2.5rem;
}

.h-11 {
  height: 2.75rem;
}

.h-12 {
  height: 3rem;
}

.h-14 {
  height: 3.5rem;
}

.h-2 {
  height: 0.5rem;
}

.h-2\.5 {
  height: 0.625rem;
}

.h-20 {
  height: 5rem;
}

.h-4 {
  height: 1rem;
}

.h-5 {
  height: 1.25rem;
}

.h-6 {
  height: 1.5rem;
}

.h-7 {
  height: 1.75rem;
}

.h-8 {
  height: 2rem;
}

.h-9 {
  height: 2.25rem;
}

.h-\[104px\] {
  height: 104px;
}

.h-\[10px\] {
  height: 10px;
}

.h-\[11px\] {
  height: 11px;
}

.h-\[220px\] {
  height: 220px;
}

.h-\[22px\] {
  height: 22px;
}

.h-\[31px\] {
  height: 31px;
}

.h-\[37\.5\%\] {
  height: 37.5%;
}

.h-\[50\%\] {
  height: 50%;
}

.h-\[60px\] {
  height: 60px;
}

.h-\[62\.5\%\] {
  height: 62.5%;
}

.h-\[72px\] {
  height: 72px;
}

.h-\[87\.5\%\] {
  height: 87.5%;
}

.h-\[Npx\] {
  height: Npx;
}

.h-\[var\(--orb-size\2c 80px\)\] {
  height: var(--orb-size,80px);
}

.h-auto {
  height: auto;
}

.h-compact {
  height: 18px;
}

.h-cursor {
  height: 34px;
}

.h-dvh {
  height: 100dvh;
}

.h-full {
  height: 100%;
}

.h-px {
  height: 1px;
}

.h-scan {
  height: 72px;
}

.h-screen {
  height: 100vh;
}

.max-h-\[7\.5rem\] {
  max-height: 7.5rem;
}

.max-h-\[86vh\] {
  max-height: 86vh;
}

.min-h-0 {
  min-height: 0px;
}

.min-h-11 {
  min-height: 2.75rem;
}

.min-h-7 {
  min-height: 1.75rem;
}

.min-h-8 {
  min-height: 2rem;
}

.min-h-\[220px\] {
  min-height: 220px;
}

.min-h-\[260px\] {
  min-height: 260px;
}

.min-h-\[40px\] {
  min-height: 40px;
}

.min-h-\[44px\] {
  min-height: 44px;
}

.min-h-\[48px\] {
  min-height: 48px;
}

.min-h-\[Npx\] {
  min-height: Npx;
}

.min-h-screen {
  min-height: 100vh;
}

.min-h-topbar {
  min-height: 68px;
}

.w-0\.5 {
  width: 0.125rem;
}

.w-1\.5 {
  width: 0.375rem;
}

.w-1\/2 {
  width: 50%;
}

.w-10 {
  width: 2.5rem;
}

.w-11 {
  width: 2.75rem;
}

.w-12 {
  width: 3rem;
}

.w-2 {
  width: 0.5rem;
}

.w-2\.5 {
  width: 0.625rem;
}

.w-2\/3 {
  width: 66.666667%;
}

.w-3\.5 {
  width: 0.875rem;
}

.w-32 {
  width: 8rem;
}

.w-4 {
  width: 1rem;
}

.w-5 {
  width: 1.25rem;
}

.w-6 {
  width: 1.5rem;
}

.w-7 {
  width: 1.75rem;
}

.w-8 {
  width: 2rem;
}

.w-9 {
  width: 2.25rem;
}

.w-\[11\%\] {
  width: 11%;
}

.w-\[148px\] {
  width: 148px;
}

.w-\[15\%\] {
  width: 15%;
}

.w-\[17\%\] {
  width: 17%;
}

.w-\[17\.5\%\] {
  width: 17.5%;
}

.w-\[18px\] {
  width: 18px;
}

.w-\[19\%\] {
  width: 19%;
}

.w-\[22\%\] {
  width: 22%;
}

.w-\[22px\] {
  width: 22px;
}

.w-\[24\%\] {
  width: 24%;
}

.w-\[264px\] {
  width: 264px;
}

.w-\[42\%\] {
  width: 42%;
}

.w-\[420px\] {
  width: 420px;
}

.w-\[52px\] {
  width: 52px;
}

.w-\[560px\] {
  width: 560px;
}

.w-\[600px\] {
  width: 600px;
}

.w-\[63\%\] {
  width: 63%;
}

.w-\[76px\] {
  width: 76px;
}

.w-\[78\%\] {
  width: 78%;
}

.w-\[8\%\] {
  width: 8%;
}

.w-\[90px\] {
  width: 90px;
}

.w-\[91\%\] {
  width: 91%;
}

.w-\[96\%\] {
  width: 96%;
}

.w-\[Npx\] {
  width: Npx;
}

.w-\[min\(420px\2c 92vw\)\] {
  width: min(420px, 92vw);
}

.w-\[var\(--orb-size\2c 80px\)\] {
  width: var(--orb-size,80px);
}

.w-auto {
  width: auto;
}

.w-compact {
  width: 18px;
}

.w-full {
  width: 100%;
}

.w-px {
  width: 1px;
}

.w-screen {
  width: 100vw;
}

.min-w-0 {
  min-width: 0px;
}

.min-w-56 {
  min-width: 14rem;
}

.min-w-\[148px\] {
  min-width: 148px;
}

.min-w-\[150px\] {
  min-width: 150px;
}

.min-w-\[220px\] {
  min-width: 220px;
}

.min-w-\[22px\] {
  min-width: 22px;
}

.min-w-\[260px\] {
  min-width: 260px;
}

.min-w-\[44px\] {
  min-width: 44px;
}

.min-w-\[52px\] {
  min-width: 52px;
}

.min-w-\[720px\] {
  min-width: 720px;
}

.min-w-\[880px\] {
  min-width: 880px;
}

.min-w-\[Npx\] {
  min-width: Npx;
}

.min-w-statCell {
  min-width: 120px;
}

.max-w-0 {
  max-width: 0px;
}

.max-w-\[100px\] {
  max-width: 100px;
}

.max-w-\[1080px\] {
  max-width: 1080px;
}

.max-w-\[1200px\] {
  max-width: 1200px;
}

.max-w-\[120px\] {
  max-width: 120px;
}

.max-w-\[130px\] {
  max-width: 130px;
}

.max-w-\[140px\] {
  max-width: 140px;
}

.max-w-\[1440px\] {
  max-width: 1440px;
}

.max-w-\[155px\] {
  max-width: 155px;
}

.max-w-\[1704px\] {
  max-width: 1704px;
}

.max-w-\[220px\] {
  max-width: 220px;
}

.max-w-\[280px\] {
  max-width: 280px;
}

.max-w-\[420px\] {
  max-width: 420px;
}

.max-w-\[440px\] {
  max-width: 440px;
}

.max-w-\[560px\] {
  max-width: 560px;
}

.max-w-\[640px\] {
  max-width: 640px;
}

.max-w-\[720px\] {
  max-width: 720px;
}

.max-w-\[760px\] {
  max-width: 760px;
}

.max-w-\[Npx\] {
  max-width: Npx;
}

.max-w-\[calc\(100vw-2rem\)\] {
  max-width: calc(100vw - 2rem);
}

.max-w-\[calc\(100vw-48px\)\] {
  max-width: calc(100vw - 48px);
}

.max-w-\[min\(480px\2c calc\(100vw-2rem\)\)\] {
  max-width: min(480px, calc(100vw - 2rem));
}

.max-w-full {
  max-width: 100%;
}

.flex-1 {
  flex: 1 1 0%;
}

.flex-none {
  flex: none;
}

.shrink {
  flex-shrink: 1;
}

.shrink-0 {
  flex-shrink: 0;
}

.flex-grow {
  flex-grow: 1;
}

.grow {
  flex-grow: 1;
}

.basis-\[240px\] {
  flex-basis: 240px;
}

.basis-full {
  flex-basis: 100%;
}

.border-collapse {
  border-collapse: collapse;
}

.origin-center {
  transform-origin: center;
}

.-translate-x-1\/2 {
  --tw-translate-x: -50%;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.-translate-y-1\/2 {
  --tw-translate-y: -50%;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.translate-x-0 {
  --tw-translate-x: 0px;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.translate-x-4 {
  --tw-translate-x: 1rem;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.translate-x-full {
  --tw-translate-x: 100%;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.translate-y-1 {
  --tw-translate-y: 0.25rem;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.translate-y-2 {
  --tw-translate-y: 0.5rem;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.scale-\[calc\(1\+var\(--orb-amplitude\2c 0\)\*0\.1\)\] {
  --tw-scale-x: calc(1 + var(--orb-amplitude,0) * 0.1);
  --tw-scale-y: calc(1 + var(--orb-amplitude,0) * 0.1);
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.transform {
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.animate-\[\.\.\.\] {
  animation: ...;
}

@keyframes pulse {
  50% {
    opacity: .5;
  }
}

.animate-\[pulse_2s_ease-in-out_infinite\] {
  animation: pulse 2s ease-in-out infinite;
}

.animate-\[rowFlash_1\.4s_ease-out_1\] {
  animation: rowFlash 1.4s ease-out 1;
}

.animate-\[toastIn_200ms_cubic-bezier\(0\2c 0\2c 0\2c 1\)_both\] {
  animation: toastIn 200ms cubic-bezier(0,0,0,1) both;
}

.animate-\[vt-out_150ms_cubic-bezier\(\.3\2c 0\2c 1\2c 1\)_both\] {
  animation: vt-out 150ms cubic-bezier(.3,0,1,1) both;
}

@keyframes breathe {
  50% {
    opacity: .35;
  }
}

.animate-breathe {
  animation: breathe 1.2s ease-in-out infinite;
}

@keyframes growW {
  from {
    width: 0;
  }
}

.animate-grow-w {
  animation: growW .5s ease-out .1s both;
}

@keyframes orbBar {
  0%, 100% {
    transform: scaleY(1);
  }

  50% {
    transform: scaleY(.38);
  }
}

.animate-orb-bar-1 {
  animation: orbBar 1.13s ease-in-out infinite;
}

@keyframes orbBar {
  0%, 100% {
    transform: scaleY(1);
  }

  50% {
    transform: scaleY(.38);
  }
}

.animate-orb-bar-2 {
  animation: orbBar 1.69s ease-in-out infinite;
}

@keyframes orbBar {
  0%, 100% {
    transform: scaleY(1);
  }

  50% {
    transform: scaleY(.38);
  }
}

.animate-orb-bar-3 {
  animation: orbBar .97s ease-in-out infinite;
}

@keyframes orbBar {
  0%, 100% {
    transform: scaleY(1);
  }

  50% {
    transform: scaleY(.38);
  }
}

.animate-orb-bar-4 {
  animation: orbBar 1.41s ease-in-out infinite;
}

@keyframes pulse {
  50% {
    opacity: .5;
  }
}

.animate-pulse {
  animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}

.cursor-not-allowed {
  cursor: not-allowed;
}

.cursor-pointer {
  cursor: pointer;
}

.select-none {
  -webkit-user-select: none;
     -moz-user-select: none;
          user-select: none;
}

.scroll-mt-5 {
  scroll-margin-top: 1.25rem;
}

.list-none {
  list-style-type: none;
}

.appearance-none {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
}

.grid-cols-1 {
  grid-template-columns: repeat(1, minmax(0, 1fr));
}

.grid-cols-12 {
  grid-template-columns: repeat(12, minmax(0, 1fr));
}

.grid-cols-2 {
  grid-template-columns: repeat(2, minmax(0, 1fr));
}

.grid-cols-3 {
  grid-template-columns: repeat(3, minmax(0, 1fr));
}

.grid-cols-7 {
  grid-template-columns: repeat(7, minmax(0, 1fr));
}

.grid-cols-\[110px_1fr\] {
  grid-template-columns: 110px 1fr;
}

.grid-cols-\[120px_1fr\] {
  grid-template-columns: 120px 1fr;
}

.grid-cols-\[52px_10px_1fr\] {
  grid-template-columns: 52px 10px 1fr;
}

.grid-cols-\[auto_1fr\] {
  grid-template-columns: auto 1fr;
}

.grid-cols-\[auto_1fr_auto\] {
  grid-template-columns: auto 1fr auto;
}

.grid-cols-\[repeat\(auto-fill\2c 148px\)\] {
  grid-template-columns: repeat(auto-fill,148px);
}

.flex-row {
  flex-direction: row;
}

.flex-col {
  flex-direction: column;
}

.flex-wrap {
  flex-wrap: wrap;
}

.flex-nowrap {
  flex-wrap: nowrap;
}

.place-items-center {
  place-items: center;
}

.content-center {
  align-content: center;
}

.items-start {
  align-items: flex-start;
}

.items-end {
  align-items: flex-end;
}

.items-center {
  align-items: center;
}

.items-baseline {
  align-items: baseline;
}

.items-stretch {
  align-items: stretch;
}

.justify-end {
  justify-content: flex-end;
}

.justify-center {
  justify-content: center;
}

.justify-between {
  justify-content: space-between;
}

.justify-items-stretch {
  justify-items: stretch;
}

.gap-0 {
  gap: 0px;
}

.gap-0\.5 {
  gap: 0.125rem;
}

.gap-1 {
  gap: 0.25rem;
}

.gap-1\.5 {
  gap: 0.375rem;
}

.gap-2 {
  gap: 0.5rem;
}

.gap-2\.5 {
  gap: 0.625rem;
}

.gap-3 {
  gap: 0.75rem;
}

.gap-3\.5 {
  gap: 0.875rem;
}

.gap-4 {
  gap: 1rem;
}

.gap-5 {
  gap: 1.25rem;
}

.gap-6 {
  gap: 1.5rem;
}

.gap-7 {
  gap: 1.75rem;
}

.gap-8 {
  gap: 2rem;
}

.gap-\[2\.8px\] {
  gap: 2.8px;
}

.gap-compact {
  gap: 18px;
}

.gap-cozy {
  gap: 14px;
}

.gap-snug {
  gap: 10px;
}

.gap-x-3 {
  -moz-column-gap: 0.75rem;
       column-gap: 0.75rem;
}

.gap-x-4 {
  -moz-column-gap: 1rem;
       column-gap: 1rem;
}

.gap-x-5 {
  -moz-column-gap: 1.25rem;
       column-gap: 1.25rem;
}

.gap-x-6 {
  -moz-column-gap: 1.5rem;
       column-gap: 1.5rem;
}

.gap-x-8 {
  -moz-column-gap: 2rem;
       column-gap: 2rem;
}

.gap-x-card {
  -moz-column-gap: 22px;
       column-gap: 22px;
}

.gap-y-1 {
  row-gap: 0.25rem;
}

.gap-y-1\.5 {
  row-gap: 0.375rem;
}

.gap-y-3 {
  row-gap: 0.75rem;
}

.gap-y-3\.5 {
  row-gap: 0.875rem;
}

.gap-y-5 {
  row-gap: 1.25rem;
}

.gap-y-7 {
  row-gap: 1.75rem;
}

.gap-y-\[Npx\] {
  row-gap: Npx;
}

.gap-y-cozy {
  row-gap: 14px;
}

.gap-y-kpi {
  row-gap: 20px;
}

.gap-y-snug {
  row-gap: 10px;
}

.divide-y > :not([hidden]) ~ :not([hidden]) {
  --tw-divide-y-reverse: 0;
  border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
  border-bottom-width: calc(1px * var(--tw-divide-y-reverse));
}

.self-start {
  align-self: flex-start;
}

.self-center {
  align-self: center;
}

.self-stretch {
  align-self: stretch;
}

.overflow-auto {
  overflow: auto;
}

.overflow-hidden {
  overflow: hidden;
}

.overflow-x-auto {
  overflow-x: auto;
}

.overflow-y-auto {
  overflow-y: auto;
}

.overflow-x-hidden {
  overflow-x: hidden;
}

.overscroll-none {
  overscroll-behavior: none;
}

.truncate {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.text-ellipsis {
  text-overflow: ellipsis;
}

.whitespace-normal {
  white-space: normal;
}

.whitespace-nowrap {
  white-space: nowrap;
}

.whitespace-pre {
  white-space: pre;
}

.whitespace-pre-wrap {
  white-space: pre-wrap;
}

.break-words {
  overflow-wrap: break-word;
}

.rounded {
  border-radius: 0.25rem;
}

.rounded-2xl {
  border-radius: 1rem;
}

.rounded-\[10px\] {
  border-radius: 10px;
}

.rounded-bar {
  border-radius: 3px;
}

.rounded-card {
  border-radius: 16px;
}

.rounded-chip {
  border-radius: 6px;
}

.rounded-code {
  border-radius: 10px;
}

.rounded-control {
  border-radius: var(--radius-control);
}

.rounded-full {
  border-radius: 9999px;
}

.rounded-lg {
  border-radius: 0.5rem;
}

.rounded-list {
  border-radius: 8px;
}

.rounded-media {
  border-radius: 12px;
}

.rounded-pill {
  border-radius: 9999px;
}

.rounded-b-2xl {
  border-bottom-right-radius: 1rem;
  border-bottom-left-radius: 1rem;
}

.border {
  border-width: 1px;
}

.border-0 {
  border-width: 0px;
}

.border-2 {
  border-width: 2px;
}

.border-b {
  border-bottom-width: 1px;
}

.border-l-2 {
  border-left-width: 2px;
}

.border-r {
  border-right-width: 1px;
}

.border-t {
  border-top-width: 1px;
}

.border-none {
  border-style: none;
}

.border-danger {
  border-color: var(--danger);
}

.border-hairline {
  border-color: var(--hairline);
}

.border-hairlineStrong {
  border-color: var(--hairlineStrong);
}

.border-primary {
  border-color: var(--primary);
}

.border-primaryBorder {
  border-color: var(--primaryBorder);
}

.border-transparent {
  border-color: transparent;
}

.\!bg-primary {
  background-color: var(--primary) !important;
}

.bg-\[rgba\(255\2c 102\2c 0\2c 0\.15\)\] {
  background-color: rgba(255,102,0,0.15);
}

.bg-appBg {
  background-color: var(--appBg);
}

.bg-black\/\[\.55\] {
  background-color: rgb(0 0 0 / .55);
}

.bg-current {
  background-color: currentColor;
}

.bg-danger {
  background-color: var(--danger);
}

.bg-dangerBg {
  background-color: var(--dangerBg);
}

.bg-hairline {
  background-color: var(--hairline);
}

.bg-hairlineStrong {
  background-color: var(--hairlineStrong);
}

.bg-onPrimary {
  background-color: var(--onPrimary);
}

.bg-overlayFaint {
  background-color: var(--overlayFaint);
}

.bg-primary {
  background-color: var(--primary);
}

.bg-primaryBg {
  background-color: var(--primaryBg);
}

.bg-primaryBtn {
  background-color: var(--primaryBtn);
}

.bg-primaryLight {
  background-color: var(--primaryLight);
}

.bg-skeleton {
  background-color: var(--skeleton);
}

.bg-success {
  background-color: var(--success);
}

.bg-successBg {
  background-color: var(--successBg);
}

.bg-surface {
  background-color: var(--surface);
}

.bg-surfaceHover {
  background-color: var(--surfaceHover);
}

.bg-textFaint {
  background-color: var(--textFaint);
}

.bg-textMain {
  background-color: var(--textMain);
}

.bg-toastBg {
  background-color: var(--toastBg);
}

.bg-track {
  background-color: var(--track);
}

.bg-transparent {
  background-color: transparent;
}

.bg-warning {
  background-color: var(--warning);
}

.bg-warningBg {
  background-color: var(--warningBg);
}

.bg-white {
  --tw-bg-opacity: 1;
  background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
}

.bg-\[linear-gradient\(\.\.\.\)\] {
  background-image: linear-gradient(...);
}

.bg-\[linear-gradient\(\.\.\.\2c var\(--primaryBtn\)\2c \.\.\.\)\] {
  background-image: linear-gradient(...,var(--primaryBtn),...);
}

.bg-\[linear-gradient\(var\(--surfaceHover\)\2c var\(--surfaceHover\)\)\] {
  background-image: linear-gradient(var(--surfaceHover),var(--surfaceHover));
}

.bg-\[radial-gradient\(1100px_600px_at_10\%_-10\%\2c rgba\(255\2c 102\2c 0\2c 0\.08\)\2c transparent_60\%\)\] {
  background-image: radial-gradient(1100px 600px at 10% -10%,rgba(255,102,0,0.08),transparent 60%);
}

.fill-mark {
  fill: var(--mark);
}

.fill-markAccent {
  fill: var(--markAccent);
}

.object-contain {
  -o-object-fit: contain;
     object-fit: contain;
}

.object-cover {
  -o-object-fit: cover;
     object-fit: cover;
}

.p-0 {
  padding: 0px;
}

.p-1 {
  padding: 0.25rem;
}

.p-1\.5 {
  padding: 0.375rem;
}

.p-3 {
  padding: 0.75rem;
}

.p-4 {
  padding: 1rem;
}

.p-5 {
  padding: 1.25rem;
}

.p-6 {
  padding: 1.5rem;
}

.p-7 {
  padding: 1.75rem;
}

.p-\[12px_16px\] {
  padding: 12px 16px;
}

.p-\[22px\] {
  padding: 22px;
}

.p-\[8px_40px_40px\] {
  padding: 8px 40px 40px;
}

.p-\[Npx\] {
  padding: Npx;
}

.p-\[Npx_Mpx\] {
  padding: Npx Mpx;
}

.p-card {
  padding: 22px;
}

.p-compact {
  padding: 18px;
}

.px-0 {
  padding-left: 0px;
  padding-right: 0px;
}

.px-1\.5 {
  padding-left: 0.375rem;
  padding-right: 0.375rem;
}

.px-10 {
  padding-left: 2.5rem;
  padding-right: 2.5rem;
}

.px-2 {
  padding-left: 0.5rem;
  padding-right: 0.5rem;
}

.px-2\.5 {
  padding-left: 0.625rem;
  padding-right: 0.625rem;
}

.px-3 {
  padding-left: 0.75rem;
  padding-right: 0.75rem;
}

.px-3\.5 {
  padding-left: 0.875rem;
  padding-right: 0.875rem;
}

.px-4 {
  padding-left: 1rem;
  padding-right: 1rem;
}

.px-5 {
  padding-left: 1.25rem;
  padding-right: 1.25rem;
}

.px-6 {
  padding-left: 1.5rem;
  padding-right: 1.5rem;
}

.px-7 {
  padding-left: 1.75rem;
  padding-right: 1.75rem;
}

.px-\[22px\] {
  padding-left: 22px;
  padding-right: 22px;
}

.px-\[9px\] {
  padding-left: 9px;
  padding-right: 9px;
}

.px-\[Npx\] {
  padding-left: Npx;
  padding-right: Npx;
}

.px-card {
  padding-left: 22px;
  padding-right: 22px;
}

.px-compact {
  padding-left: 18px;
  padding-right: 18px;
}

.px-cozy {
  padding-left: 14px;
  padding-right: 14px;
}

.px-kpi {
  padding-left: 20px;
  padding-right: 20px;
}

.px-pill {
  padding-left: 9px;
  padding-right: 9px;
}

.px-wide {
  padding-left: 30px;
  padding-right: 30px;
}

.py-0 {
  padding-top: 0px;
  padding-bottom: 0px;
}

.py-1 {
  padding-top: 0.25rem;
  padding-bottom: 0.25rem;
}

.py-1\.5 {
  padding-top: 0.375rem;
  padding-bottom: 0.375rem;
}

.py-16 {
  padding-top: 4rem;
  padding-bottom: 4rem;
}

.py-2 {
  padding-top: 0.5rem;
  padding-bottom: 0.5rem;
}

.py-2\.5 {
  padding-top: 0.625rem;
  padding-bottom: 0.625rem;
}

.py-3 {
  padding-top: 0.75rem;
  padding-bottom: 0.75rem;
}

.py-3\.5 {
  padding-top: 0.875rem;
  padding-bottom: 0.875rem;
}

.py-4 {
  padding-top: 1rem;
  padding-bottom: 1rem;
}

.py-5 {
  padding-top: 1.25rem;
  padding-bottom: 1.25rem;
}

.py-8 {
  padding-top: 2rem;
  padding-bottom: 2rem;
}

.py-9 {
  padding-top: 2.25rem;
  padding-bottom: 2.25rem;
}

.py-\[7px\] {
  padding-top: 7px;
  padding-bottom: 7px;
}

.py-compact {
  padding-top: 18px;
  padding-bottom: 18px;
}

.py-cozy {
  padding-top: 14px;
  padding-bottom: 14px;
}

.py-kpi {
  padding-top: 20px;
  padding-bottom: 20px;
}

.py-roomy {
  padding-top: 26px;
  padding-bottom: 26px;
}

.pb-1 {
  padding-bottom: 0.25rem;
}

.pb-1\.5 {
  padding-bottom: 0.375rem;
}

.pb-10 {
  padding-bottom: 2.5rem;
}

.pb-16 {
  padding-bottom: 4rem;
}

.pb-2 {
  padding-bottom: 0.5rem;
}

.pb-2\.5 {
  padding-bottom: 0.625rem;
}

.pb-3 {
  padding-bottom: 0.75rem;
}

.pb-3\.5 {
  padding-bottom: 0.875rem;
}

.pb-4 {
  padding-bottom: 1rem;
}

.pb-5 {
  padding-bottom: 1.25rem;
}

.pb-\[env\(safe-area-inset-bottom\)\] {
  padding-bottom: env(safe-area-inset-bottom);
}

.pb-card {
  padding-bottom: 22px;
}

.pb-compact {
  padding-bottom: 18px;
}

.pb-cozy {
  padding-bottom: 14px;
}

.pl-1\.5 {
  padding-left: 0.375rem;
}

.pl-11 {
  padding-left: 2.75rem;
}

.pl-2 {
  padding-left: 0.5rem;
}

.pl-3\.5 {
  padding-left: 0.875rem;
}

.pl-5 {
  padding-left: 1.25rem;
}

.pl-7 {
  padding-left: 1.75rem;
}

.pl-\[max\(1\.5rem\2c env\(safe-area-inset-left\)\)\] {
  padding-left: max(1.5rem, env(safe-area-inset-left));
}

.pl-\[max\(2\.5rem\2c env\(safe-area-inset-left\)\)\] {
  padding-left: max(2.5rem, env(safe-area-inset-left));
}

.pl-compact {
  padding-left: 18px;
}

.pl-cozy {
  padding-left: 14px;
}

.pr-0\.5 {
  padding-right: 0.125rem;
}

.pr-10 {
  padding-right: 2.5rem;
}

.pr-12 {
  padding-right: 3rem;
}

.pr-2 {
  padding-right: 0.5rem;
}

.pr-3 {
  padding-right: 0.75rem;
}

.pr-\[34px\] {
  padding-right: 34px;
}

.pr-\[env\(safe-area-inset-right\)\] {
  padding-right: env(safe-area-inset-right);
}

.pr-\[max\(1\.5rem\2c env\(safe-area-inset-right\)\)\] {
  padding-right: max(1.5rem, env(safe-area-inset-right));
}

.pr-\[max\(2\.5rem\2c env\(safe-area-inset-right\)\)\] {
  padding-right: max(2.5rem, env(safe-area-inset-right));
}

.pr-card {
  padding-right: 22px;
}

.pr-indent {
  padding-right: 38px;
}

.pt-1\.5 {
  padding-top: 0.375rem;
}

.pt-10 {
  padding-top: 2.5rem;
}

.pt-2 {
  padding-top: 0.5rem;
}

.pt-2\.5 {
  padding-top: 0.625rem;
}

.pt-24 {
  padding-top: 6rem;
}

.pt-3 {
  padding-top: 0.75rem;
}

.pt-4 {
  padding-top: 1rem;
}

.pt-5 {
  padding-top: 1.25rem;
}

.pt-7 {
  padding-top: 1.75rem;
}

.pt-8 {
  padding-top: 2rem;
}

.pt-\[env\(safe-area-inset-top\)\] {
  padding-top: env(safe-area-inset-top);
}

.pt-card {
  padding-top: 22px;
}

.pt-kpi {
  padding-top: 20px;
}

.pt-snug {
  padding-top: 10px;
}

.text-left {
  text-align: left;
}

.text-center {
  text-align: center;
}

.text-right {
  text-align: right;
}

.align-middle {
  vertical-align: middle;
}

.font-mono {
  font-family: var(--font-mono);
  font-feature-settings: "liga" 0, "calt" 0;
}

.font-sans {
  font-family: var(--font-sans);
}

.font-symbols {
  font-family: Material Symbols Rounded;
}

.text-2xl {
  font-size: 1.5rem;
  line-height: 2rem;
}

.text-3xl {
  font-size: 1.875rem;
  line-height: 2.25rem;
}

.text-\[11px\] {
  font-size: 11px;
}

.text-\[14px\] {
  font-size: 14px;
}

.text-\[15px\] {
  font-size: 15px;
}

.text-\[16cqw\] {
  font-size: 16cqw;
}

.text-\[40px\] {
  font-size: 40px;
}

.text-\[clamp\(2rem\2c 7cqw\2c 5\.5rem\)\] {
  font-size: clamp(2rem, 7cqw, 5.5rem);
}

.text-base {
  font-size: 1rem;
  line-height: 1.5rem;
}

.text-body {
  font-size: var(--fs-body);
  line-height: 1.3;
}

.text-brand {
  font-size: 17px;
  line-height: 1.3;
  font-weight: 600;
}

.text-caption {
  font-size: 11px;
  line-height: 16px;
}

.text-control {
  font-size: var(--fs-control);
  line-height: 20px;
}

.text-ctaFigure {
  font-size: 88px;
  line-height: 1;
  letter-spacing: -0.04em;
  font-weight: 700;
}

.text-ctaTitle {
  font-size: 28px;
  line-height: 1.15;
  letter-spacing: -0.02em;
  font-weight: 700;
}

.text-dialogTitle {
  font-size: 20px;
  line-height: 1.3;
  letter-spacing: -0.01em;
  font-weight: 600;
}

.text-eyebrow {
  font-size: var(--fs-eyebrow);
  line-height: 16px;
  letter-spacing: 0.08em;
  font-weight: 600;
}

.text-figureSm {
  font-size: 32px;
  line-height: 1;
  letter-spacing: -0.03em;
  font-weight: 600;
}

.text-gaugeValue {
  font-size: 34px;
  line-height: 1;
  letter-spacing: -0.03em;
  font-weight: 700;
}

.text-heading {
  font-size: 15px;
  line-height: 1.3;
  font-weight: 600;
}

.text-icon {
  font-size: 22px;
}

.text-iconLg {
  font-size: 24px;
}

.text-iconSm {
  font-size: 20px;
}

.text-iconState {
  font-size: 40px;
}

.text-iconXl {
  font-size: 32px;
}

.text-iconXs {
  font-size: 18px;
}

.text-lg {
  font-size: var(--fs-lg);
  line-height: 28px;
}

.text-meta {
  font-size: var(--fs-meta);
  line-height: 16px;
}

.text-pageTitle {
  font-size: 36px;
  line-height: 1.1;
  letter-spacing: -0.02em;
  font-weight: 600;
}

.text-panelTitle {
  font-size: 18px;
  line-height: 1.3;
  letter-spacing: -0.01em;
  font-weight: 600;
}

.text-scan {
  font-size: 28px;
  line-height: 40px;
}

.text-scanIdle {
  font-size: 22px;
  letter-spacing: 0.04em;
}

.text-sectionTitle {
  font-size: 28px;
  line-height: 1.15;
  letter-spacing: -0.02em;
  font-weight: 600;
}

.text-sm {
  font-size: 0.875rem;
  line-height: 1.25rem;
}

.text-stat {
  font-size: 32px;
}

.text-statSm {
  font-size: 16px;
  line-height: 24px;
  font-weight: 700;
}

.text-subtle {
  font-size: var(--fs-subtle);
  line-height: 16px;
}

.text-xl {
  font-size: 1.25rem;
  line-height: 1.75rem;
}

.font-bold {
  font-weight: 700;
}

.font-medium {
  font-weight: 500;
}

.font-normal {
  font-weight: 400;
}

.font-semibold {
  font-weight: 600;
}

.uppercase {
  text-transform: uppercase;
}

.capitalize {
  text-transform: capitalize;
}

.normal-case {
  text-transform: none;
}

.italic {
  font-style: italic;
}

.ordinal {
  --tw-ordinal: ordinal;
  font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);
}

.tabular-nums {
  --tw-numeric-spacing: tabular-nums;
  font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);
}

.leading-4 {
  line-height: 1rem;
}

.leading-6 {
  line-height: 1.5rem;
}

.leading-7 {
  line-height: 1.75rem;
}

.leading-\[1\.15\] {
  line-height: 1.15;
}

.leading-\[1\.7\] {
  line-height: 1.7;
}

.leading-\[22px\] {
  line-height: 22px;
}

.leading-none {
  line-height: 1;
}

.leading-normal {
  line-height: 1.5;
}

.leading-relaxed {
  line-height: 1.625;
}

.leading-tight {
  line-height: 1.25;
}

.tracking-\[-0\.02em\] {
  letter-spacing: -0.02em;
}

.tracking-\[-0\.03em\] {
  letter-spacing: -0.03em;
}

.tracking-\[-0\.04em\] {
  letter-spacing: -0.04em;
}

.tracking-\[0\.04em\] {
  letter-spacing: 0.04em;
}

.tracking-\[0\.06em\] {
  letter-spacing: 0.06em;
}

.tracking-\[0\.1em\] {
  letter-spacing: 0.1em;
}

.tracking-heading {
  letter-spacing: -0.01em;
}

.tracking-label {
  letter-spacing: 0.08em;
}

.tracking-normal {
  letter-spacing: 0em;
}

.tracking-tight {
  letter-spacing: -0.025em;
}

.tracking-wider {
  letter-spacing: 0.05em;
}

.tracking-widest {
  letter-spacing: 0.1em;
}

.text-\[Npx\] {
  color: Npx;
}

.text-danger {
  color: var(--danger);
}

.text-dangerText {
  color: var(--dangerText);
}

.text-headingColor {
  color: var(--headingColor);
}

.text-onPrimary {
  color: var(--onPrimary);
}

.text-onPrimaryDark {
  color: var(--onPrimaryDark);
}

.text-primary {
  color: var(--primary);
}

.text-primaryLight {
  color: var(--primaryLight);
}

.text-success {
  color: var(--success);
}

.text-successText {
  color: var(--successText);
}

.text-textDim {
  color: var(--textDim);
}

.text-textFaint {
  color: var(--textFaint);
}

.text-textMain {
  color: var(--textMain);
}

.text-textMuted {
  color: var(--textMuted);
}

.text-toastText {
  color: var(--toastText);
}

.text-warning {
  color: var(--warning);
}

.text-warningText {
  color: var(--warningText);
}

.text-white {
  --tw-text-opacity: 1;
  color: rgb(255 255 255 / var(--tw-text-opacity, 1));
}

.underline {
  text-decoration-line: underline;
}

.no-underline {
  text-decoration-line: none;
}

.underline-offset-2 {
  text-underline-offset: 2px;
}

.caret-transparent {
  caret-color: transparent;
}

.accent-primary {
  accent-color: var(--primary);
}

.opacity-0 {
  opacity: 0;
}

.opacity-40 {
  opacity: 0.4;
}

.opacity-50 {
  opacity: 0.5;
}

.opacity-75 {
  opacity: 0.75;
}

.opacity-85 {
  opacity: 0.85;
}

.opacity-\[\.55\] {
  opacity: .55;
}

.shadow {
  --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
  --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.shadow-\[0_0_0_3px_var\(--successBg\)\] {
  --tw-shadow: 0 0 0 3px var(--successBg);
  --tw-shadow-colored: 0 0 0 3px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.shadow-\[0_12px_32px_rgba\(0\2c 0\2c 0\2c 0\.25\)\] {
  --tw-shadow: 0 12px 32px rgba(0,0,0,0.25);
  --tw-shadow-colored: 0 12px 32px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.shadow-\[0_16px_32px_-8px_rgba\(0\2c 0\2c 0\2c \.35\)\] {
  --tw-shadow: 0 16px 32px -8px rgba(0,0,0,.35);
  --tw-shadow-colored: 0 16px 32px -8px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.shadow-\[0_20px_48px_rgba\(0\2c 0\2c 0\2c 0\.35\)\] {
  --tw-shadow: 0 20px 48px rgba(0,0,0,0.35);
  --tw-shadow-colored: 0 20px 48px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.shadow-\[0_24px_64px_rgba\(0\2c 0\2c 0\2c 0\.5\)\] {
  --tw-shadow: 0 24px 64px rgba(0,0,0,0.5);
  --tw-shadow-colored: 0 24px 64px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.shadow-\[0_8px_24px_-12px_rgba\(0\2c 0\2c 0\2c 0\.6\)\] {
  --tw-shadow: 0 8px 24px -12px rgba(0,0,0,0.6);
  --tw-shadow-colored: 0 8px 24px -12px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.shadow-\[inset_0_0_0_1px_rgba\(239\2c 68\2c 68\2c 0\.4\)\] {
  --tw-shadow: inset 0 0 0 1px rgba(239,68,68,0.4);
  --tw-shadow-colored: inset 0 0 0 1px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.shadow-\[inset_0_0_0_1px_var\(--hairlineStrong\)\] {
  --tw-shadow: inset 0 0 0 1px var(--hairlineStrong);
  --tw-shadow-colored: inset 0 0 0 1px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.shadow-\[inset_0_0_0_1px_var\(--primaryBorder\)\] {
  --tw-shadow: inset 0 0 0 1px var(--primaryBorder);
  --tw-shadow-colored: inset 0 0 0 1px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.outline-none {
  outline: 2px solid transparent;
  outline-offset: 2px;
}

.ring {
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}

.ring-\[3px\] {
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}

.ring-dangerBg {
  --tw-ring-color: var(--dangerBg);
}

.blur {
  --tw-blur: blur(8px);
  filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
}

.brightness-0 {
  --tw-brightness: brightness(0);
  filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
}

.drop-shadow-\[0_1px_4px_rgba\(0\2c 0\2c 0\2c 0\.9\)\] {
  --tw-drop-shadow: drop-shadow(0 1px 4px rgba(0,0,0,0.9));
  filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
}

.drop-shadow-\[0_2px_16px_rgba\(0\2c 0\2c 0\2c 0\.9\)\] {
  --tw-drop-shadow: drop-shadow(0 2px 16px rgba(0,0,0,0.9));
  filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
}

.invert {
  --tw-invert: invert(100%);
  filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
}

.filter {
  filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
}

.transition {
  transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;
  transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
  transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}

.transition-\[background-color\2c color\2c border-color\] {
  transition-property: background-color,color,border-color;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}

.transition-\[background-color\2c color\] {
  transition-property: background-color,color;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}

.transition-\[background-color\] {
  transition-property: background-color;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}

.transition-\[opacity\2c transform\] {
  transition-property: opacity,transform;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}

.transition-colors {
  transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}

.transition-opacity {
  transition-property: opacity;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}

.transition-transform {
  transition-property: transform;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}

.duration-100 {
  transition-duration: 100ms;
}

.duration-150 {
  transition-duration: 150ms;
}

.duration-200 {
  transition-duration: 200ms;
}

.duration-\[220ms\] {
  transition-duration: 220ms;
}

.duration-\[90ms\] {
  transition-duration: 90ms;
}

.duration-change {
  transition-duration: 300ms;
}

.duration-enter {
  transition-duration: 200ms;
}

.duration-leave {
  transition-duration: 150ms;
}

.duration-quick {
  transition-duration: 100ms;
}

.ease-enter {
  transition-timing-function: cubic-bezier(0, 0, 0, 1);
}

.ease-in-out {
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
}

.ease-leave {
  transition-timing-function: cubic-bezier(.3, 0, 1, 1);
}

.ease-linear {
  transition-timing-function: linear;
}

.ease-move {
  transition-timing-function: cubic-bezier(.2, 0, 0, 1);
}

.ease-out {
  transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
}

.will-change-\[opacity\2c transform\] {
  will-change: opacity,transform;
}

.\[--orb-size\:22px\] {
  --orb-size: 22px;
}

.\[--orb-size\:28px\] {
  --orb-size: 28px;
}

.\[animation-delay\:\.25s\] {
  animation-delay: .25s;
}

.\[animation-delay\:\.5s\] {
  animation-delay: .5s;
}

.\[color-scheme\:dark\] {
  color-scheme: dark;
}

.\[container-type\:inline-size\] {
  container-type: inline-size;
}

.\[grid-template-columns\:180px_1fr\] {
  grid-template-columns: 180px 1fr;
}

.\[grid-template-columns\:repeat\(auto-fit\2c minmax\(150px\2c 1fr\)\)\] {
  grid-template-columns: repeat(auto-fit,minmax(150px,1fr));
}

.\[grid-template-columns\:repeat\(auto-fit\2c minmax\(200px\2c 1fr\)\)\] {
  grid-template-columns: repeat(auto-fit,minmax(200px,1fr));
}

.\[grid-template-columns\:repeat\(auto-fit\2c minmax\(260px\2c 1fr\)\)\] {
  grid-template-columns: repeat(auto-fit,minmax(260px,1fr));
}

.file\:mr-3::file-selector-button {
  margin-right: 0.75rem;
}

.file\:h-9::file-selector-button {
  height: 2.25rem;
}

.file\:cursor-pointer::file-selector-button {
  cursor: pointer;
}

.file\:border-0::file-selector-button {
  border-width: 0px;
}

.file\:bg-surfaceHover::file-selector-button {
  background-color: var(--surfaceHover);
}

.file\:px-3::file-selector-button {
  padding-left: 0.75rem;
  padding-right: 0.75rem;
}

.file\:text-textMain::file-selector-button {
  color: var(--textMain);
}

.placeholder\:text-scanIdle::-moz-placeholder {
  font-size: 22px;
  letter-spacing: 0.04em;
}

.placeholder\:text-scanIdle::placeholder {
  font-size: 22px;
  letter-spacing: 0.04em;
}

.placeholder\:font-medium::-moz-placeholder {
  font-weight: 500;
}

.placeholder\:font-medium::placeholder {
  font-weight: 500;
}

.placeholder\:text-textDim::-moz-placeholder {
  color: var(--textDim);
}

.placeholder\:text-textDim::placeholder {
  color: var(--textDim);
}

.placeholder\:text-textFaint::-moz-placeholder {
  color: var(--textFaint);
}

.placeholder\:text-textFaint::placeholder {
  color: var(--textFaint);
}

.placeholder\:text-textMuted::-moz-placeholder {
  color: var(--textMuted);
}

.placeholder\:text-textMuted::placeholder {
  color: var(--textMuted);
}

.backdrop\:bg-black\/60::backdrop {
  background-color: rgb(0 0 0 / 0.6);
}

.backdrop\:backdrop-blur-sm::backdrop {
  --tw-backdrop-blur: blur(4px);
  -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
  backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
}

.before\:pointer-events-none::before {
  content: var(--tw-content);
  pointer-events: none;
}

.before\:absolute::before {
  content: var(--tw-content);
  position: absolute;
}

.before\:-inset-1\.5::before {
  content: var(--tw-content);
  inset: -0.375rem;
}

.before\:-inset-3::before {
  content: var(--tw-content);
  inset: -0.75rem;
}

.before\:inset-0::before {
  content: var(--tw-content);
  inset: 0px;
}

.before\:z-\[5\]::before {
  content: var(--tw-content);
  z-index: 5;
}

.before\:rounded-card::before {
  content: var(--tw-content);
  border-radius: 16px;
}

.before\:bg-surface::before {
  content: var(--tw-content);
  background-color: var(--surface);
}

.before\:opacity-0::before {
  content: var(--tw-content);
  opacity: 0;
}

.before\:transition-opacity::before {
  content: var(--tw-content);
  transition-property: opacity;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}

.before\:duration-leave::before {
  content: var(--tw-content);
  transition-duration: 150ms;
}

.before\:ease-leave::before {
  content: var(--tw-content);
  transition-timing-function: cubic-bezier(.3, 0, 1, 1);
}

.before\:content-\[\'\'\]::before {
  --tw-content: '';
  content: var(--tw-content);
}

.after\:absolute::after {
  content: var(--tw-content);
  position: absolute;
}

.after\:-inset-1\.5::after {
  content: var(--tw-content);
  inset: -0.375rem;
}

.after\:-inset-2\.5::after {
  content: var(--tw-content);
  inset: -0.625rem;
}

.after\:-inset-y-\[7px\]::after {
  content: var(--tw-content);
  top: -7px;
  bottom: -7px;
}

.after\:inset-x-0::after {
  content: var(--tw-content);
  left: 0px;
  right: 0px;
}

.after\:left-1::after {
  content: var(--tw-content);
  left: 0.25rem;
}

.after\:left-\[24px\]::after {
  content: var(--tw-content);
  left: 24px;
}

.after\:top-1::after {
  content: var(--tw-content);
  top: 0.25rem;
}

.after\:h-6::after {
  content: var(--tw-content);
  height: 1.5rem;
}

.after\:w-6::after {
  content: var(--tw-content);
  width: 1.5rem;
}

.after\:rounded-pill::after {
  content: var(--tw-content);
  border-radius: 9999px;
}

.after\:bg-onPrimary::after {
  content: var(--tw-content);
  background-color: var(--onPrimary);
}

.after\:bg-surface::after {
  content: var(--tw-content);
  background-color: var(--surface);
}

.after\:transition-\[left\]::after {
  content: var(--tw-content);
  transition-property: left;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}

.after\:duration-leave::after {
  content: var(--tw-content);
  transition-duration: 150ms;
}

.after\:ease-move::after {
  content: var(--tw-content);
  transition-timing-function: cubic-bezier(.2, 0, 0, 1);
}

.after\:content-\[\'\'\]::after {
  --tw-content: '';
  content: var(--tw-content);
}

.after\:content-\[\\\'\\\'\]::after {
  --tw-content: \'\';
  content: var(--tw-content);
}

.first\:border-t-0:first-child {
  border-top-width: 0px;
}

.first\:pt-0:first-child {
  padding-top: 0px;
}

.last\:mr-0:last-child {
  margin-right: 0px;
}

.last\:border-r-0:last-child {
  border-right-width: 0px;
}

.empty\:hidden:empty {
  display: none;
}

.hover\:border-hairlineStrong:hover {
  border-color: var(--hairlineStrong);
}

.hover\:border-primary:hover {
  border-color: var(--primary);
}

.hover\:bg-dangerHover:hover {
  background-color: var(--dangerHover);
}

.hover\:bg-hoverStrong:hover {
  background-color: var(--hoverStrong);
}

.hover\:bg-primaryHover:hover {
  background-color: var(--primaryHover);
}

.hover\:bg-surfaceHover:hover {
  background-color: var(--surfaceHover);
}

.hover\:text-headingColor:hover {
  color: var(--headingColor);
}

.hover\:text-primary:hover {
  color: var(--primary);
}

.hover\:text-textMain:hover {
  color: var(--textMain);
}

.hover\:underline:hover {
  text-decoration-line: underline;
}

.hover\:no-underline:hover {
  text-decoration-line: none;
}

.hover\:opacity-90:hover {
  opacity: 0.9;
}

.file\:hover\:bg-hoverStrong:hover::file-selector-button {
  background-color: var(--hoverStrong);
}

.focus\:left-3:focus {
  left: 0.75rem;
}

.focus\:border-danger:focus {
  border-color: var(--danger);
}

.focus\:border-primary:focus {
  border-color: var(--primary);
}

.focus\:outline-none:focus {
  outline: 2px solid transparent;
  outline-offset: 2px;
}

.focus\:ring-\[3px\]:focus {
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}

.focus\:ring-dangerBg:focus {
  --tw-ring-color: var(--dangerBg);
}

.focus\:ring-primaryBg:focus {
  --tw-ring-color: var(--primaryBg);
}

.focus-visible\:left-3:focus-visible {
  left: 0.75rem;
}

.focus-visible\:outline-none:focus-visible {
  outline: 2px solid transparent;
  outline-offset: 2px;
}

.focus-visible\:outline:focus-visible {
  outline-style: solid;
}

.focus-visible\:outline-2:focus-visible {
  outline-width: 2px;
}

.focus-visible\:outline-offset-2:focus-visible {
  outline-offset: 2px;
}

.focus-visible\:outline-offset-\[-2px\]:focus-visible {
  outline-offset: -2px;
}

.focus-visible\:outline-primary:focus-visible {
  outline-color: var(--primary);
}

.focus-visible\:ring-2:focus-visible {
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}

.focus-visible\:ring-\[3px\]:focus-visible {
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}

.focus-visible\:ring-inset:focus-visible {
  --tw-ring-inset: inset;
}

.focus-visible\:ring-primary:focus-visible {
  --tw-ring-color: var(--primary);
}

.focus-visible\:ring-offset-\[3px\]:focus-visible {
  --tw-ring-offset-width: 3px;
}

.focus-visible\:ring-offset-surface:focus-visible {
  --tw-ring-offset-color: var(--surface);
}

.active\:bg-hairline:active {
  background-color: var(--hairline);
}

.active\:bg-primaryPress:active {
  background-color: var(--primaryPress);
}

.disabled\:pointer-events-none:disabled {
  pointer-events: none;
}

.disabled\:opacity-40:disabled {
  opacity: 0.4;
}

.group[open] .group-open\:rotate-90 {
  --tw-rotate: 90deg;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.group.nav-open .group-\[\.nav-open\]\:block {
  display: block;
}

.group.nav-open .group-\[\.nav-open\]\:hidden {
  display: none;
}

.group.on .group-\[\.on\]\:text-primary {
  color: var(--primary);
}

.group.on .group-\[\.on\]\:\[font-variation-settings\:\'FILL\'_1\] {
  font-variation-settings: 'FILL' 1;
}

.peer:-moz-placeholder-shown ~ .peer-placeholder-shown\:hidden {
  display: none;
}

.peer:placeholder-shown ~ .peer-placeholder-shown\:hidden {
  display: none;
}

.aria-checked\:font-semibold[aria-checked="true"] {
  font-weight: 600;
}

.aria-expanded\:border-primary[aria-expanded="true"] {
  border-color: var(--primary);
}

.aria-expanded\:bg-surfaceHover[aria-expanded="true"] {
  background-color: var(--surfaceHover);
}

.aria-expanded\:text-textMain[aria-expanded="true"] {
  color: var(--textMain);
}

.aria-expanded\:ring-\[3px\][aria-expanded="true"] {
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}

.aria-expanded\:ring-primaryBg[aria-expanded="true"] {
  --tw-ring-color: var(--primaryBg);
}

.aria-pressed\:border-primary[aria-pressed="true"] {
  border-color: var(--primary);
}

.aria-pressed\:bg-primaryBg[aria-pressed="true"] {
  background-color: var(--primaryBg);
}

.aria-pressed\:font-semibold[aria-pressed="true"] {
  font-weight: 600;
}

.aria-pressed\:text-headingColor[aria-pressed="true"] {
  color: var(--headingColor);
}

.group[aria-checked="true"] .group-aria-checked\:inline {
  display: inline;
}

.group[aria-expanded="true"] .group-aria-expanded\:text-primary {
  color: var(--primary);
}

.group[aria-pressed="true"] .group-aria-pressed\:inline {
  display: inline;
}

.data-\[scan-state\=idle\]\:border-primary[data-scan-state="idle"] {
  border-color: var(--primary);
}

.data-\[scan-state\=rejected\]\:border-danger[data-scan-state="rejected"] {
  border-color: var(--danger);
}

.data-\[scan-state\=scanned\]\:border-primary[data-scan-state="scanned"] {
  border-color: var(--primary);
}

.data-\[range\=end\]\:bg-primary[data-range="end"] {
  background-color: var(--primary);
}

.data-\[range\=in\]\:bg-primaryBg[data-range="in"] {
  background-color: var(--primaryBg);
}

.data-\[range\=end\]\:font-semibold[data-range="end"] {
  font-weight: 600;
}

.data-\[range\=end\]\:text-onPrimary[data-range="end"] {
  color: var(--onPrimary);
}

.group[data-scan-state="idle"] .group-data-\[scan-state\=idle\]\:block {
  display: block;
}

@media (prefers-reduced-motion: reduce) {
  .motion-reduce\:scale-100 {
    --tw-scale-x: 1;
    --tw-scale-y: 1;
    transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
  }

  .motion-reduce\:animate-none {
    animation: none;
  }

  .motion-reduce\:transition-none {
    transition-property: none;
  }
}

@media (min-width: 640px) {
  .sm\:not-sr-only {
    position: static;
    width: auto;
    height: auto;
    padding: 0;
    margin: 0;
    overflow: visible;
    clip: auto;
    white-space: normal;
  }

  .sm\:inline-block {
    display: inline-block;
  }

  .sm\:inline {
    display: inline;
  }

  .sm\:flex {
    display: flex;
  }

  .sm\:inline-flex {
    display: inline-flex;
  }

  .sm\:w-auto {
    width: auto;
  }

  .sm\:min-w-\[56px\] {
    min-width: 56px;
  }

  .sm\:grid-cols-2 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .sm\:grid-cols-4 {
    grid-template-columns: repeat(4, minmax(0, 1fr));
  }

  .sm\:grid-cols-\[240px_1fr\] {
    grid-template-columns: 240px 1fr;
  }

  .sm\:flex-nowrap {
    flex-wrap: nowrap;
  }

  .sm\:justify-start {
    justify-content: flex-start;
  }

  .sm\:gap-3\.5 {
    gap: 0.875rem;
  }

  .sm\:gap-5 {
    gap: 1.25rem;
  }

  .sm\:overflow-hidden {
    overflow: hidden;
  }

  .sm\:border-hairlineStrong {
    border-color: var(--hairlineStrong);
  }

  .sm\:px-10 {
    padding-left: 2.5rem;
    padding-right: 2.5rem;
  }

  .sm\:px-3 {
    padding-left: 0.75rem;
    padding-right: 0.75rem;
  }

  .sm\:pl-3 {
    padding-left: 0.75rem;
  }

  .sm\:pr-cozy {
    padding-right: 14px;
  }

  .sm\:text-figure {
    font-size: 56px;
    line-height: 1;
    letter-spacing: -0.03em;
    font-weight: 600;
  }

  .sm\:text-pageTitle {
    font-size: 36px;
    line-height: 1.1;
    letter-spacing: -0.02em;
    font-weight: 600;
  }

  .sm\:text-statLg {
    font-size: 46px;
    line-height: 1;
    letter-spacing: -0.03em;
    font-weight: 600;
  }
}

@media (min-width: 768px) {
  .md\:grid-cols-2 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .md\:grid-cols-3 {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }

  .md\:gap-x-10 {
    -moz-column-gap: 2.5rem;
         column-gap: 2.5rem;
  }
}

@media (min-width: 1024px) {
  .lg\:col-span-12 {
    grid-column: span 12 / span 12;
  }

  .lg\:col-span-2 {
    grid-column: span 2 / span 2;
  }

  .lg\:col-span-3 {
    grid-column: span 3 / span 3;
  }

  .lg\:col-span-4 {
    grid-column: span 4 / span 4;
  }

  .lg\:col-span-5 {
    grid-column: span 5 / span 5;
  }

  .lg\:col-span-6 {
    grid-column: span 6 / span 6;
  }

  .lg\:col-span-7 {
    grid-column: span 7 / span 7;
  }

  .lg\:col-span-8 {
    grid-column: span 8 / span 8;
  }

  .lg\:inline {
    display: inline;
  }

  .lg\:aspect-auto {
    aspect-ratio: auto;
  }

  .lg\:h-liveFrame {
    height: max(16rem, calc(100dvh - 19rem));
  }

  .lg\:h-liveFrameBare {
    height: max(16rem, calc(100dvh - 12.75rem));
  }

  .lg\:max-w-\[260px\] {
    max-width: 260px;
  }

  .lg\:grid-cols-12 {
    grid-template-columns: repeat(12, minmax(0, 1fr));
  }

  .lg\:grid-cols-2 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .lg\:grid-cols-3 {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }

  .lg\:grid-cols-4 {
    grid-template-columns: repeat(4, minmax(0, 1fr));
  }

  .lg\:grid-cols-7 {
    grid-template-columns: repeat(7, minmax(0, 1fr));
  }

  .lg\:grid-cols-\[minmax\(0\2c 3fr\)_minmax\(0\2c 2fr\)\] {
    grid-template-columns: minmax(0,3fr) minmax(0,2fr);
  }

  .lg\:grid-cols-console {
    grid-template-columns: minmax(0, 1fr) 24rem;
  }

  .lg\:flex-wrap {
    flex-wrap: wrap;
  }

  .lg\:justify-items-center {
    justify-items: center;
  }

  .lg\:overflow-hidden {
    overflow: hidden;
  }

  .lg\:overflow-y-auto {
    overflow-y: auto;
  }

  .lg\:p-card {
    padding: 22px;
  }
}

@media (min-width: 1280px) {
  .xl\:block {
    display: block;
  }

  .xl\:inline-block {
    display: inline-block;
  }

  .xl\:inline {
    display: inline;
  }

  .xl\:flex {
    display: flex;
  }

  .xl\:hidden {
    display: none;
  }

  .xl\:h-\[52px\] {
    height: 52px;
  }

  .xl\:w-\[264px\] {
    width: 264px;
  }

  .xl\:w-auto {
    width: auto;
  }

  .xl\:max-w-\[220px\] {
    max-width: 220px;
  }

  .xl\:max-w-\[240px\] {
    max-width: 240px;
  }

  .xl\:grid-cols-4 {
    grid-template-columns: repeat(4, minmax(0, 1fr));
  }

  .xl\:grid-cols-5 {
    grid-template-columns: repeat(5, minmax(0, 1fr));
  }

  .xl\:flex-row {
    flex-direction: row;
  }

  .xl\:items-center {
    align-items: center;
  }

  .xl\:items-stretch {
    align-items: stretch;
  }

  .xl\:justify-start {
    justify-content: flex-start;
  }

  .xl\:gap-1\.5 {
    gap: 0.375rem;
  }

  .xl\:gap-2\.5 {
    gap: 0.625rem;
  }

  .xl\:gap-3 {
    gap: 0.75rem;
  }

  .xl\:px-3 {
    padding-left: 0.75rem;
    padding-right: 0.75rem;
  }

  .xl\:px-cozy {
    padding-left: 14px;
    padding-right: 14px;
  }

  .xl\:px-snug {
    padding-left: 10px;
    padding-right: 10px;
  }

  .xl\:pl-8 {
    padding-left: 2rem;
  }
}

@media (max-width: 900px) {
  .nav\:fixed {
    position: fixed;
  }

  .nav\:absolute {
    position: absolute;
  }

  .nav\:relative {
    position: relative;
  }

  .nav\:inset-x-0 {
    left: 0px;
    right: 0px;
  }

  .nav\:inset-x-4 {
    left: 1rem;
    right: 1rem;
  }

  .nav\:left-4 {
    left: 1rem;
  }

  .nav\:left-\[max\(1rem\2c env\(safe-area-inset-left\)\)\] {
    left: max(1rem, env(safe-area-inset-left));
  }

  .nav\:right-4 {
    right: 1rem;
  }

  .nav\:right-\[max\(1rem\2c env\(safe-area-inset-right\)\)\] {
    right: max(1rem, env(safe-area-inset-right));
  }

  .nav\:top-4 {
    top: 1rem;
  }

  .nav\:top-\[68px\] {
    top: 68px;
  }

  .nav\:z-30 {
    z-index: 30;
  }

  .nav\:mr-1 {
    margin-right: 0.25rem;
  }

  .nav\:mt-0 {
    margin-top: 0px;
  }

  .nav\:block {
    display: block;
  }

  .nav\:inline {
    display: inline;
  }

  .nav\:flex {
    display: flex;
  }

  .nav\:hidden {
    display: none;
  }

  .nav\:h-8 {
    height: 2rem;
  }

  .nav\:h-\[22px\] {
    height: 22px;
  }

  .nav\:h-auto {
    height: auto;
  }

  .nav\:h-full {
    height: 100%;
  }

  .nav\:max-h-\[calc\(100vh-2rem\)\] {
    max-height: calc(100vh - 2rem);
  }

  .nav\:max-h-\[calc\(100vh-68px\)\] {
    max-height: calc(100vh - 68px);
  }

  .nav\:min-h-0 {
    min-height: 0px;
  }

  .nav\:w-12 {
    width: 3rem;
  }

  .nav\:w-8 {
    width: 2rem;
  }

  .nav\:w-\[22px\] {
    width: 22px;
  }

  .nav\:w-auto {
    width: auto;
  }

  .nav\:w-full {
    width: 100%;
  }

  .nav\:\!min-w-0 {
    min-width: 0px !important;
  }

  .nav\:max-w-none {
    max-width: none;
  }

  .nav\:flex-1 {
    flex: 1 1 0%;
  }

  .nav\:flex-none {
    flex: none;
  }

  .nav\:shrink {
    flex-shrink: 1;
  }

  .nav\:shrink-0 {
    flex-shrink: 0;
  }

  .nav\:basis-full {
    flex-basis: 100%;
  }

  .nav\:cursor-pointer {
    cursor: pointer;
  }

  .nav\:flex-row {
    flex-direction: row;
  }

  .nav\:flex-col {
    flex-direction: column;
  }

  .nav\:flex-wrap {
    flex-wrap: wrap;
  }

  .nav\:items-center {
    align-items: center;
  }

  .nav\:justify-start {
    justify-content: flex-start;
  }

  .nav\:justify-center {
    justify-content: center;
  }

  .nav\:gap-0 {
    gap: 0px;
  }

  .nav\:gap-3 {
    gap: 0.75rem;
  }

  .nav\:overflow-visible {
    overflow: visible;
  }

  .nav\:overflow-y-auto {
    overflow-y: auto;
  }

  .nav\:truncate {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }

  .nav\:rounded-pill {
    border-radius: 9999px;
  }

  .nav\:rounded-b-card {
    border-bottom-right-radius: 16px;
    border-bottom-left-radius: 16px;
  }

  .nav\:border-b {
    border-bottom-width: 1px;
  }

  .nav\:border-r-0 {
    border-right-width: 0px;
  }

  .nav\:border-none {
    border-style: none;
  }

  .nav\:bg-appBg {
    background-color: var(--appBg);
  }

  .nav\:bg-surfaceHover {
    background-color: var(--surfaceHover);
  }

  .nav\:p-0 {
    padding: 0px;
  }

  .nav\:p-5 {
    padding: 1.25rem;
  }

  .nav\:p-\[12px_16px_16px\] {
    padding: 12px 16px 16px;
  }

  .nav\:px-0 {
    padding-left: 0px;
    padding-right: 0px;
  }

  .nav\:px-3 {
    padding-left: 0.75rem;
    padding-right: 0.75rem;
  }

  .nav\:px-5 {
    padding-left: 1.25rem;
    padding-right: 1.25rem;
  }

  .nav\:py-0 {
    padding-top: 0px;
    padding-bottom: 0px;
  }

  .nav\:py-5 {
    padding-top: 1.25rem;
    padding-bottom: 1.25rem;
  }

  .nav\:py-\[11px\] {
    padding-top: 11px;
    padding-bottom: 11px;
  }

  .nav\:pl-8 {
    padding-left: 2rem;
  }

  .nav\:pl-\[max\(1\.25rem\2c env\(safe-area-inset-left\)\)\] {
    padding-left: max(1.25rem, env(safe-area-inset-left));
  }

  .nav\:pr-\[max\(1\.25rem\2c env\(safe-area-inset-right\)\)\] {
    padding-right: max(1.25rem, env(safe-area-inset-right));
  }

  .nav\:text-scanCompact {
    font-size: 20px;
    line-height: 28px;
  }

  .nav\:text-textMuted {
    color: var(--textMuted);
  }

  .nav\:shadow-\[0_16px_32px_-8px_rgba\(0\2c 0\2c 0\2c 0\.4\)\] {
    --tw-shadow: 0 16px 32px -8px rgba(0,0,0,0.4);
    --tw-shadow-colored: 0 16px 32px -8px var(--tw-shadow-color);
    box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
  }

  .nav\:\[grid-template-columns\:1fr\] {
    grid-template-columns: 1fr;
  }

  .nav\:placeholder\:text-scanCompact::-moz-placeholder {
    font-size: 20px;
    line-height: 28px;
  }

  .nav\:placeholder\:text-scanCompact::placeholder {
    font-size: 20px;
    line-height: 28px;
  }

  .nav\:before\:absolute::before {
    content: var(--tw-content);
    position: absolute;
  }

  .nav\:before\:-inset-1\.5::before {
    content: var(--tw-content);
    inset: -0.375rem;
  }

  .nav\:before\:content-\[\'\'\]::before {
    --tw-content: '';
    content: var(--tw-content);
  }

  .nav\:hover\:bg-hoverStrong:hover {
    background-color: var(--hoverStrong);
  }

  .group.nav-open .nav\:group-\[\.nav-open\]\:flex {
    display: flex;
  }
}

@media (max-width: 520px) {
  .phone\:text-\[46px\] {
    font-size: 46px;
  }

  .phone\:text-meta {
    font-size: var(--fs-meta);
    line-height: 16px;
  }
}

.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker {
  display: none;
}

@keyframes orbBar {
  0%, 100% {
    transform: scaleY(1);
  }

  50% {
    transform: scaleY(.38);
  }
}

.\[\&\:hover_g_rect\:nth-child\(1\)\]\:animate-orb-bar-1:hover g rect:nth-child(1) {
  animation: orbBar 1.13s ease-in-out infinite;
}

@keyframes orbBar {
  0%, 100% {
    transform: scaleY(1);
  }

  50% {
    transform: scaleY(.38);
  }
}

.\[\&\:hover_g_rect\:nth-child\(2\)\]\:animate-orb-bar-2:hover g rect:nth-child(2) {
  animation: orbBar 1.69s ease-in-out infinite;
}

@keyframes orbBar {
  0%, 100% {
    transform: scaleY(1);
  }

  50% {
    transform: scaleY(.38);
  }
}

.\[\&\:hover_g_rect\:nth-child\(3\)\]\:animate-orb-bar-3:hover g rect:nth-child(3) {
  animation: orbBar .97s ease-in-out infinite;
}

@keyframes orbBar {
  0%, 100% {
    transform: scaleY(1);
  }

  50% {
    transform: scaleY(.38);
  }
}

.\[\&\:hover_g_rect\:nth-child\(4\)\]\:animate-orb-bar-4:hover g rect:nth-child(4) {
  animation: orbBar 1.41s ease-in-out infinite;
}

.\[\&\:not\(\.on\)\]\:text-textMuted:not(.on) {
  color: var(--textMuted);
}

.\[\&\:not\(\.on\)\]\:hover\:bg-surfaceHover:hover:not(.on) {
  background-color: var(--surfaceHover);
}

.\[\&\:not\(\.on\)\]\:hover\:text-textMain:hover:not(.on) {
  color: var(--textMain);
}

.\[\&\:not\(\[open\]\)\]\:hidden:not([open]) {
  display: none;
}

.\[\&\>\*\:nth-child\(2\)\]\:\[animation-delay\:20ms\]>*:nth-child(2) {
  animation-delay: 20ms;
}

.\[\&\>\*\:nth-child\(3\)\]\:\[animation-delay\:40ms\]>*:nth-child(3) {
  animation-delay: 40ms;
}

.\[\&\>\*\:nth-child\(4\)\]\:\[animation-delay\:60ms\]>*:nth-child(4) {
  animation-delay: 60ms;
}

.\[\&\>\*\:nth-child\(N\)\]\:\[animation-delay\:\.\.\.\]>*:nth-child(N) {
  animation-delay: ...;
}

.\[\&\>\*\:nth-child\(n\+5\)\]\:\[animation-delay\:80ms\]>*:nth-child(n+5) {
  animation-delay: 80ms;
}

.\[\&\>\*\]\:min-w-0>* {
  min-width: 0px;
}

.\[\&\>\*\]\:flex-shrink-0>* {
  flex-shrink: 0;
}

.\[\&\>\*\]\:animate-\[\.\.\.\]>* {
  animation: ...;
}

.\[\&\>\*\]\:animate-\[fadeUp_200ms_cubic-bezier\(0\2c 0\2c 0\2c 1\)_both\]>* {
  animation: fadeUp 200ms cubic-bezier(0,0,0,1) both;
}

@media (min-width: 640px) {
  .sm\:\[\&\>\*\]\:flex-none>* {
    flex: none;
  }
}

@media (min-width: 1024px) {
  .lg\:\[\&\>\:last-child\:nth-child\(odd\)\]\:col-span-2>:last-child:nth-child(odd) {
    grid-column: span 2 / span 2;
  }
}

.\[\&\>option\]\:bg-appBg>option {
  background-color: var(--appBg);
}

.\[\&\>option\]\:text-textMain>option {
  color: var(--textMain);
}

.\[\&\>span\:nth-of-type\(2\)\]\:min-w-0>span:nth-of-type(2) {
  min-width: 0px;
}

.\[\&\>span\:nth-of-type\(2\)\]\:flex-initial>span:nth-of-type(2) {
  flex: 0 1 auto;
}

.\[\&\>svg\]\:block>svg {
  display: block;
}

.\[\&\>svg\]\:h-full>svg {
  height: 100%;
}

.\[\&\>svg\]\:w-full>svg {
  width: 100%;
}

.\[\&\[aria-hidden\=false\]\]\:translate-x-0[aria-hidden=false] {
  --tw-translate-x: 0px;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.\[\&\[aria-hidden\=false\]\]\:shadow-\[-20px_0_60px_rgba\(0\2c 0\2c 0\2c 0\.4\)\][aria-hidden=false] {
  --tw-shadow: -20px 0 60px rgba(0,0,0,0.4);
  --tw-shadow-colored: -20px 0 60px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}

.\[\&\[data-theme\=light\]\]\:\[color-scheme\:light\][data-theme=light] {
  color-scheme: light;
}

.\[\&\[data-warn\]\]\:text-warningText[data-warn] {
  color: var(--warningText);
}

.\[\&\[hidden\]\]\:hidden[hidden] {
  display: none;
}

.\[\&_\[data-mine\]\]\:text-textDim [data-mine] {
  color: var(--textDim);
}

.\[\&_\[data-tail\]\]\:text-textDim [data-tail] {
  color: var(--textDim);
}

.\[\&_canvas\]\:absolute canvas {
  position: absolute;
}

.\[\&_canvas\]\:inset-0 canvas {
  inset: 0px;
}

.\[\&_canvas\]\:max-w-full canvas {
  max-width: 100%;
}

.\[\&_g_rect\]\:origin-center g rect {
  transform-origin: center;
}

.\[\&_g_rect\]\:\[transform-box\:fill-box\] g rect {
  transform-box: fill-box;
}

@media (prefers-reduced-motion: reduce) {
  .motion-reduce\:\[\&_g_rect\]\:\!animate-none g rect {
    animation: none !important;
  }
}

.\[\&_span\]\:transition-colors span {
  transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}

.\[\&_span\]\:duration-500 span {
  transition-duration: 500ms;
}

.\[\&_span\]\:ease-move span {
  transition-timing-function: cubic-bezier(.2, 0, 0, 1);
}

@media (prefers-reduced-motion: reduce) {
  .motion-reduce\:\[\&_span\]\:transition-none span {
    transition-property: none;
  }
}

.\[\&_tbody_tr\.flash-once\]\:\[animation\:rowFlash_1\.4s_ease-out_1\] tbody tr.flash-once {
  animation: rowFlash 1.4s ease-out 1;
}

.\[\&_tbody_tr\.row-unassigned\:hover\]\:bg-dangerBg tbody tr.row-unassigned:hover {
  background-color: var(--dangerBg);
}

.\[\&_tbody_tr\.row-unassigned\]\:bg-dangerBg tbody tr.row-unassigned {
  background-color: var(--dangerBg);
}

.\[\&_tbody_tr\:hover\]\:bg-surfaceHover tbody tr:hover {
  background-color: var(--surfaceHover);
}

@media (max-width: 900px) {
  .nav\:\[\&_tbody_tr\:hover\]\:bg-surface tbody tr:hover {
    background-color: var(--surface);
  }
}

.\[\&_tbody_tr\:last-child_td\]\:border-b-0 tbody tr:last-child td {
  border-bottom-width: 0px;
}

.\[\&_tbody_tr\]\:h-14 tbody tr {
  height: 3.5rem;
}

.\[\&_tbody_tr\]\:border-b tbody tr {
  border-bottom-width: 1px;
}

.\[\&_tbody_tr\]\:border-hairline tbody tr {
  border-color: var(--hairline);
}

.\[\&_tbody_tr\]\:transition-\[background-color\2c color\] tbody tr {
  transition-property: background-color,color;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}

.\[\&_tbody_tr\]\:duration-150 tbody tr {
  transition-duration: 150ms;
}

@media (max-width: 900px) {
  .nav\:\[\&_tbody_tr\]\:mb-2\.5 tbody tr {
    margin-bottom: 0.625rem;
  }

  .nav\:\[\&_tbody_tr\]\:block tbody tr {
    display: block;
  }

  .nav\:\[\&_tbody_tr\]\:h-auto tbody tr {
    height: auto;
  }

  .nav\:\[\&_tbody_tr\]\:rounded-media tbody tr {
    border-radius: 12px;
  }

  .nav\:\[\&_tbody_tr\]\:border-b-0 tbody tr {
    border-bottom-width: 0px;
  }

  .nav\:\[\&_tbody_tr\]\:bg-surface tbody tr {
    background-color: var(--surface);
  }
}

.\[\&_td\.num\]\:text-right td.num {
  text-align: right;
}

.\[\&_td\.num\]\:font-mono td.num {
  font-family: var(--font-mono);
  font-feature-settings: "liga" 0, "calt" 0;
}

.\[\&_td\.num\]\:tabular-nums td.num {
  --tw-numeric-spacing: tabular-nums;
  font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);
}

.\[\&_td\.strong\]\:font-medium td.strong {
  font-weight: 500;
}

.\[\&_td\.strong\]\:text-headingColor td.strong {
  color: var(--headingColor);
}

.\[\&_td\:first-child\]\:whitespace-nowrap td:first-child {
  white-space: nowrap;
}

.\[\&_td\:first-child\]\:pl-card td:first-child {
  padding-left: 22px;
}

.\[\&_td\:first-child\]\:font-medium td:first-child {
  font-weight: 500;
}

.\[\&_td\:first-child\]\:text-headingColor td:first-child {
  color: var(--headingColor);
}

@media (max-width: 900px) {
  .nav\:\[\&_td\:first-child\]\:border-t-0 td:first-child {
    border-top-width: 0px;
  }
}

.\[\&_td\:last-child\]\:pr-card td:last-child {
  padding-right: 22px;
}

.\[\&_td\]\:border-b td {
  border-bottom-width: 1px;
}

.\[\&_td\]\:border-hairline td {
  border-color: var(--hairline);
}

.\[\&_td\]\:px-3 td {
  padding-left: 0.75rem;
  padding-right: 0.75rem;
}

.\[\&_td\]\:px-4 td {
  padding-left: 1rem;
  padding-right: 1rem;
}

.\[\&_td\]\:px-card td {
  padding-left: 22px;
  padding-right: 22px;
}

.\[\&_td\]\:py-0 td {
  padding-top: 0px;
  padding-bottom: 0px;
}

.\[\&_td\]\:py-2\.5 td {
  padding-top: 0.625rem;
  padding-bottom: 0.625rem;
}

.\[\&_td\]\:py-3 td {
  padding-top: 0.75rem;
  padding-bottom: 0.75rem;
}

.\[\&_td\]\:align-top td {
  vertical-align: top;
}

.\[\&_td\]\:text-base td {
  font-size: 1rem;
  line-height: 1.5rem;
}

@media (max-width: 900px) {
  .nav\:\[\&_td\]\:flex td {
    display: flex;
  }

  .nav\:\[\&_td\]\:min-w-0 td {
    min-width: 0px;
  }

  .nav\:\[\&_td\]\:items-baseline td {
    align-items: baseline;
  }

  .nav\:\[\&_td\]\:justify-between td {
    justify-content: space-between;
  }

  .nav\:\[\&_td\]\:gap-3 td {
    gap: 0.75rem;
  }

  .nav\:\[\&_td\]\:border-t td {
    border-top-width: 1px;
  }

  .nav\:\[\&_td\]\:border-hairline td {
    border-color: var(--hairline);
  }

  .nav\:\[\&_td\]\:px-4 td {
    padding-left: 1rem;
    padding-right: 1rem;
  }

  .nav\:\[\&_td\]\:py-2\.5 td {
    padding-top: 0.625rem;
    padding-bottom: 0.625rem;
  }

  .nav\:\[\&_td\]\:text-right td {
    text-align: right;
  }

  .nav\:\[\&_td\]\:\[overflow-wrap\:break-word\] td {
    overflow-wrap: break-word;
  }

  .nav\:\[\&_td\]\:before\:flex-none td::before {
    content: var(--tw-content);
    flex: none;
  }

  .nav\:\[\&_td\]\:before\:text-left td::before {
    content: var(--tw-content);
    text-align: left;
  }

  .nav\:\[\&_td\]\:before\:font-sans td::before {
    content: var(--tw-content);
    font-family: var(--font-sans);
  }

  .nav\:\[\&_td\]\:before\:text-subtle td::before {
    content: var(--tw-content);
    font-size: var(--fs-subtle);
    line-height: 16px;
  }

  .nav\:\[\&_td\]\:before\:font-semibold td::before {
    content: var(--tw-content);
    font-weight: 600;
  }

  .nav\:\[\&_td\]\:before\:uppercase td::before {
    content: var(--tw-content);
    text-transform: uppercase;
  }

  .nav\:\[\&_td\]\:before\:tracking-label td::before {
    content: var(--tw-content);
    letter-spacing: 0.08em;
  }

  .nav\:\[\&_td\]\:before\:text-textMuted td::before {
    content: var(--tw-content);
    color: var(--textMuted);
  }

  .nav\:\[\&_td\]\:before\:content-\[attr\(data-label\)\] td::before {
    --tw-content: attr(data-label);
    content: var(--tw-content);
  }
}

.\[\&_th\:first-child\]\:pl-card th:first-child {
  padding-left: 22px;
}

.\[\&_th\:last-child\]\:pr-card th:last-child {
  padding-right: 22px;
}

.\[\&_th\]\:border-b th {
  border-bottom-width: 1px;
}

.\[\&_th\]\:border-hairline th {
  border-color: var(--hairline);
}

.\[\&_th\]\:px-3 th {
  padding-left: 0.75rem;
  padding-right: 0.75rem;
}

.\[\&_th\]\:px-4 th {
  padding-left: 1rem;
  padding-right: 1rem;
}

.\[\&_th\]\:px-card th {
  padding-left: 22px;
  padding-right: 22px;
}

.\[\&_th\]\:py-2\.5 th {
  padding-top: 0.625rem;
  padding-bottom: 0.625rem;
}

.\[\&_th\]\:py-3 th {
  padding-top: 0.75rem;
  padding-bottom: 0.75rem;
}

.\[\&_th\]\:text-left th {
  text-align: left;
}

.\[\&_th\]\:font-mono th {
  font-family: var(--font-mono);
  font-feature-settings: "liga" 0, "calt" 0;
}

.\[\&_th\]\:text-meta th {
  font-size: var(--fs-meta);
  line-height: 16px;
}

.\[\&_th\]\:font-semibold th {
  font-weight: 600;
}

.\[\&_th\]\:uppercase th {
  text-transform: uppercase;
}

.\[\&_th\]\:tracking-\[0\.1em\] th {
  letter-spacing: 0.1em;
}

.\[\&_th\]\:tracking-wider th {
  letter-spacing: 0.05em;
}

.\[\&_th\]\:text-textDim th {
  color: var(--textDim);
}

.\[\&_th\]\:text-textMuted th {
  color: var(--textMuted);
}

@media (max-width: 900px) {
  .nav\:\[\&_thead\]\:\[display\:none\] thead {
    display: none;
  }
}

.\[\&_tr\.clickable\:hover\]\:bg-surfaceHover tr.clickable:hover {
  background-color: var(--surfaceHover);
}

.\[\&_tr\.clickable\]\:cursor-pointer tr.clickable {
  cursor: pointer;
}

.is-loading .\[\.is-loading_\&\]\:before\:pointer-events-auto::before {
  content: var(--tw-content);
  pointer-events: auto;
}

@keyframes pulse {
  50% {
    content: var(--tw-content);
    opacity: .5;
  }
}

.is-loading .\[\.is-loading_\&\]\:before\:animate-pulse::before {
  content: var(--tw-content);
  animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}

.is-loading .\[\.is-loading_\&\]\:before\:opacity-100::before {
  content: var(--tw-content);
  opacity: 1;
}

.is-loading .\[\.is-loading_\&_\*\]\:opacity-0 * {
  opacity: 0;
}

@media(max-width:640px) {
  .\[\@media\(max-width\:640px\)\]\:gap-x-4 {
    -moz-column-gap: 1rem;
         column-gap: 1rem;
  }

  .\[\@media\(max-width\:640px\)\]\:px-compact {
    padding-left: 18px;
    padding-right: 18px;
  }

  .\[\@media\(max-width\:640px\)\]\:py-cozy {
    padding-top: 14px;
    padding-bottom: 14px;
  }
}

[data-text-size=station] .\[\[data-text-size\=station\]_\&\]\:flex-wrap {
  flex-wrap: wrap;
}

[data-text-size=station] .\[\[data-text-size\=station\]_\&\]\:overflow-visible {
  overflow: visible;
}

[data-theme=light] .\[\[data-theme\=light\]_\&\]\:block {
  display: block;
}

[data-theme=light] .\[\[data-theme\=light\]_\&\]\:inline {
  display: inline;
}

[data-theme=light] .\[\[data-theme\=light\]_\&\]\:hidden {
  display: none;
}

[data-theme=light] .\[\[data-theme\=light\]_\&\]\:text-primaryOnLight {
  color: var(--primaryOnLight);
}

[data-theme=light] .\[\[data-theme\=light\]_\&\]\:text-primaryOnTint {
  color: var(--primaryOnTint);
}

@media (max-width: 900px) {
  [data-theme=light] .nav\:\[\[data-theme\=light\]_\&\]\:shadow-\[0_16px_32px_-8px_rgba\(0\2c 0\2c 0\2c 0\.18\)\] {
    --tw-shadow: 0 16px 32px -8px rgba(0,0,0,0.18);
    --tw-shadow-colored: 0 16px 32px -8px var(--tw-shadow-color);
    box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
  }
}

[data-voice=connecting] .\[\[data-voice\=connecting\]_\&\]\:opacity-40 {
  opacity: 0.4;
}

[data-voice=error] .\[\[data-voice\=error\]_\&\]\:inline-block {
  display: inline-block;
}

[data-voice=error] .\[\[data-voice\=error\]_\&\]\:inline {
  display: inline;
}

[data-voice=error] .\[\[data-voice\=error\]_\&\]\:hidden {
  display: none;
}

[data-voice=error] .\[\[data-voice\=error\]_\&\]\:text-dangerText {
  color: var(--dangerText);
}

[data-voice=error] .\[\[data-voice\=error\]_\&\]\:opacity-40 {
  opacity: 0.4;
}
