/* AI Cloud component plugin: Foundation */
/* Web font loading (Inter + weights) now lives in the Typography module's typography.css @import. */

/* ===== Design tokens ===== */
:root{
    /* ===== Shell geometry ================================================
       --mp-rail is the VISIBLE rail width; the sidebar element is drawn --mp-pane-lap
       wider and runs UNDER the content pane, which starts at --mp-rail and paints over
       it. That is what lets .content carry a rounded corner: behind the curve there is
       always sidebar, so there is no gap to see through. The invariant is radius == lap
       and it is derived, not agreed — a radius LARGER than the lap exposes a wedge of
       page background where the rail and the bar meet at a right angle. The lap is also
       added to the sidebar's right padding, so the nav column keeps the width it had
       before the overlap and the white space either side of it stays equal. */
    --mp-rail:268px;
    --mp-sb-pad:14px;
    --mp-pane-lap:18px;

    /* The page gradient lives on the CONTENT PANE, not on <html>. Two reasons, and the
       second is not cosmetic. It is only visible on the pane now that the pane is an
       opaque surface of its own. And the rail and the app bar are both var(--mp-sidebar)
       at 75% over a 22px backdrop blur — identical layers — which rendered as two
       different shades purely because the backdrop under them differed: the logo sits
       deep in the top-left radial, the bar beside it is past its 35% falloff. With <html>
       flat they resolve to the same colour by construction, so they read as one piece
       without either of them naming a literal. */
    --mp-pane-bg:
        radial-gradient(circle at top left,#10335f 0%,transparent 35%),
        radial-gradient(circle at bottom right,#0a7d49 0%,transparent 30%),
        linear-gradient(180deg,#050816 0%,#09111f 100%);
    --mp-pane-shadow:rgba(0,0,0,.35);

    --bg:#060816;
    --black:#06111d;
    --panel:#0f1729cc;
    --panel-solid:#101828;
    --border:rgba(255,255,255,.08);
    --text:#f8fafc;
    --muted:#94a3b8;
    --purple:#8b5cf6;
    --blue:#0ea5e9;
    --amber:#f59e0b;
    --orange:;
    --pink:#ff6b8a;
    --red:#f43f5e;
    --green:#00EA5E;
    --green-soft:rgba(0,234,94,.12);
    --green-light:  #00e676;
    --grad-brand:linear-gradient(135deg,#00ea5e,#38bdf8);
    --shadow:0 10px 40px rgba(0,0,0,.35);
    --radius:5px; 
    --highlight:var(--green);
    --highlight-soft:rgba(0,234,94,.12);

    /* ===== Scheduling block grammar =====
   ONE definition of what a dated block looks like, shared by every surface that draws one. --acc
   carries the accent; consumers compose:
     background: color-mix(in srgb, var(--acc) var(--mp-block-fill), var(--panel));
     box-shadow: inset 0 0 0 var(--mp-block-hair)
                 color-mix(in srgb, var(--acc) var(--mp-block-border), transparent);
     border-left: var(--mp-block-rail) solid var(--acc);
   Percentages are tokens too, so a density change is one edit here.

   The ring may also be a BORDER, and the calendar composes it that way: its blocks are dragged and
   hover-expanded, and those states own box-shadow. The timeline cannot pay a border's half pixel on
   a time axis. Same numbers, two compositions.

   Provisional is part of the grammar: --mp-block-fill-soft plus a dashed ring at
   --mp-block-hair-soft, rail left solid. The hairline is not used for the dash because Chromium
   snaps 0.5px and 1px to the same painted line, and a dash needs more than that to read. */
    --mp-block-radius:8px;
    --mp-block-fill:22%;
    --mp-block-fill-soft:14%;
    --mp-block-border:55%;
    --mp-block-hair:0.5px;
    --mp-block-hair-soft:1px;
    --mp-block-rail:3px;
    /* Direct-manipulation knob: hidden at rest, revealed on hover. Sized here so the
       calendar's resize handles and the timeline's edge handles cannot diverge. */
    --mp-knob-size:8px;
    --mp-knob-ring:2px;
    --mp-knob-hit:14px;
 
    /* The content column's gutter. SINGLE SOURCE: .content pads by it, and the app bar
       bleeds through it with a matching negative margin (navigation-shell). Anything that
       has to line up with the page's left/right edge reads this — never a literal. Two
       copies of this number is how the bar ended up 10px short of the column edge. */
    --mp-content-pad:42px;

    /* The gap under a page's HEAD ROW — the control row a page opens with — and the
       surface beneath it. SINGLE SOURCE: .mp-seg-shell--rail (actions-badges) reads it for
       a standalone tab rail, .mpdg-toolbar (surfaces-data) reads it for a grid toolbar.
       Those were 20px and 16px, and before the rail modifier existed each module had
       invented its own third number. Two copies of this value is how Mail's tab bar ended
       up sitting 36px from its grid where Tasks sat 16px — the copies do not overwrite one
       another, they ADD, and neither stylesheet was wrong on its own.
       Held by tests/behavior/tab_rail_gap_test.js, which measures both contexts against
       this token in a real browser rather than against a literal of its own. */
    --mp-head-gap:16px;
    --btn-radius:   5px;
    --pill-radius:  999px;
    --transition:   .16s ease;
}

/* ===== Base reset ===== */
/* RESTORED IN v1.12.469, ON THE ARCHITECT'S CALL, AFTER BEING REMOVED IN v1.12.468.

   The removal's measurement still stands and is worth keeping written down: dropping this
   produced byte-identical screenshots at 1440, 1024, 980 and 760 in Chromium at dpr 2, against
   a control that moved 241 of 255 on 3.94% of pixels. So it buys nothing visible on Chrome,
   which already applies kerning and standard ligatures by default.

   What the removal was WRONGLY credited with was fixing a resize stall on Chrome/macOS. It did
   not. Nor did the content-visibility rule that replaced that credit at v1.12.469, which was
   measured to skip 0 of 100 rows during a drag and removed again at v1.12.471. The cause was
   `backdrop-filter:blur(8px)` on the base .btn class - 600 backdrop roots on a page of 100
   rows - and a trace from the installation puts checkerboarded_needs_raster at 130 before and
   0 after. Since the only argument left for removing THIS was a cost with no demonstrated
   symptom, it goes back rather than staying out on a rationale that collapsed.

   If it is ever removed again, remove it for a measured symptom, not for a measured cost. */
*{box-sizing:border-box;text-rendering: optimizeLegibility!important;}

html{
    /* Flat on purpose — the gradient is on .content. See --mp-pane-bg. Everything that
       sits on <html> is translucent chrome (the rail, the app bar), and a gradient here
       makes two identical layers resolve to two different colours. */
    background:var(--bg);
    height:100dvh;
}
/* The DOCUMENT does not scroll — .content does, so the pane always reaches the bottom
   edge and its rounded corner never moves. Consequence: window.scrollY is permanently 0
   and window.scrollTo() a no-op; anything needing the page scroll asks
   window.mpPageScroller(el) for the nearest scrolling ancestor. */
body{
    height:100dvh;
    overflow:hidden;
    margin:0;
    font-family:var(--mp-ff-sans,'Inter',sans-serif);
    font-size:var(--mp-fs-base,13px);
    color:var(--text);
}

a{color:inherit;text-decoration:none}

/* ===== Typography ===== */
h1,
.page-header h1{
    font-size:var(--mp-fs-4xl,32px);
    line-height:var(--mp-lh-tight,1.1);
    letter-spacing:var(--mp-ls-tighter,-0.03em);
    font-weight:var(--mp-fw-black,900);
    margin-top:0;
    margin-bottom:0;
}

h2{
    font-size:var(--mp-fs-3xl,24px);
    line-height:var(--mp-lh-snug,1.25);
    letter-spacing:var(--mp-ls-tight,-0.01em);
    font-weight:var(--mp-fw-heavy,800);
    margin-top:0;
}

h3{
    font-size:var(--mp-fs-xl,18px);
    line-height:var(--mp-lh-snug,1.25);
    letter-spacing:var(--mp-ls-tight,-0.01em);
    font-weight:var(--mp-fw-heavy,800);
}
strong,b{
    font-weight: var(--mp-fw-heavy,800);
}
.hidden{
    display:none;
}

.card h2{margin-bottom:16px}
.section-header h2{margin-bottom:6px}

@media(max-width:768px){
    h1,
    .page-header h1{font-size:var(--mp-fs-3xl,24px)}
    h2{font-size:var(--mp-fs-2xl,20px)}
    h3{font-size:var(--mp-fs-lg,16px)}
}

/* ===== Layout ===== */
/* The content column is a SURFACE, not a transparent gutter: it carries the page gradient,
   one rounded corner where the rail and the bar meet, a z-index above the fixed sidebar so
   it laps over it, and its own scroll so it is always exactly viewport-high.
   NOTE FOR ANYTHING ADDED HERE: no transform, filter, backdrop-filter, contain or
   will-change on this element or its ancestors. Each makes .content a containing block for
   position:fixed and silently offsets every popover and modal rendered inside the page.
   tests/behavior/app_shell_pane_test.js asserts it. */
.content{
    margin-left: var(--mp-rail);
    padding: var(--mp-appbar-gap) var(--mp-content-pad) var(--mp-content-pad);
    border-radius: var(--mp-pane-lap) 0 0 0;
    background: var(--mp-pane-bg);
    background-repeat: no-repeat;
    background-size: cover;
    /* position WITHOUT z-index, deliberately. The pane has to paint over the fixed rail,
       and the obvious way to do that — a z-index above the rail's — makes .content a
       stacking context, which caps EVERY descendant at the pane's own level. Modals are
       rendered inside the page: position:fixed, z-index 10000, and still painted under the
       app bar at 60, because 10000 inside a context at 20 is still 20. Measured on the
       tasks page at v1.12.433: elementFromPoint over the bar returned the bar's search
       input while a full-viewport modal was open.
       With both the rail and the pane at z-index:auto they sit on the same level and are
       painted in DOM order — <aside>, <header>, <main> — so the pane still covers the rail
       by being later, and nothing inside it is capped.
       DO NOT give this element a z-index. tests/behavior/app_shell_pane_test.js opens a
       fixed overlay inside the pane and asserts it wins over the bar. */
    position: relative;
    box-shadow: -6px 0 16px var(--mp-pane-shadow), 0 0 0 1px var(--border);
    height: calc(100dvh - var(--mp-appbar-h));
    overflow-y: auto;
    overscroll-behavior: contain;
}
/* ===== A page that owns its own height =====
   .content scrolls by default, which is right for stacked content. A grid is the other shape: as
   tall as the space it is given, nothing moving. A page declares which by carrying .mp-page-fill.

   It is a shell affordance because a module must not know the rail width, the bar height or the
   gutter — the calendar sized its grid against window.innerHeight minus a private 16px while the
   pane added --mp-content-pad below, and the difference was a scrollbar on every screen.

   The frame is even: below a pane that cannot scroll, padding is a frame edge, so it matches the
   top. And overflow:hidden means a fill page places its own scroller when it cannot compress
   further, rather than hiding content with no way to reach it. */
.content:has(> .mp-page-fill){
    display: flex;
    flex-direction: column;
    overflow: hidden;

    /* !important, and not for convenience. Below 1000px navigation-shell states the pane's default
       padding as a SHORTHAND with !important — `padding:88px var(--mp-content-pad) 28px!important`
       — so its bottom value reaches this element with a force ordinary specificity cannot answer.
       The narrow block then re-forces padding-top on its own line, which is why the frame read 20px
       above and 28px below on every fill route, the calendar included, from the day this contract
       shipped. Measured, not inferred: 760x820, top 20, bottom 28.

       The shorthand's bottom value is incidental there — the top and the sides are what that rule
       is for — but rewriting a load-bearing !important in the shell to fix a frame edge is the
       larger change and the riskier one. So the contract states its own bottom edge with the same
       force the default is stated with, in the file that owns the contract. */
    padding-bottom: var(--mp-appbar-gap) !important;
}

/* A direct child, so a banner or any other sibling the layout emits keeps its natural height
   and the fill page takes what is left, rather than the page assuming it is alone in there. */
.content > .mp-page-fill{
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;

    /* NO MARGIN BELOW A FRAME EDGE. Under a pane that cannot scroll, a bottom margin is not spacing
       between stacked cards — it is height the frame has to find somewhere, and it was 22 of the 43px
       the projects chart overflowed by before v1.12.451. It lives on THIS selector, and not on the
       surface that has the margin, for a reason that only shows up on the hosts that DO NOT fill:
       the class is added by an engine that cannot see whether the shell can grant it, so on a grid
       nested one level deep — modules and appearance both are — :has(> .mp-page-fill) never matches
       and no fill happens. A rule keyed on the CLASS would still have stripped their margin: a
       request that was refused, charged anyway. Keyed on the CONTRACT, the class is inert wherever
       the contract is not in force, which is what makes it safe for an engine to ask blindly. */
    margin-bottom: 0;
}

/* ON PAPER THERE IS NOTHING TO FILL. navigation-shell's print block already gives the pane back
   its natural height and its overflow; the fill contract has to come off with it, or a flex item
   sized to "whatever is left" is left of a box that no longer bounds anything. A printed plan is
   a document that paginates, not a viewport-high column.

   It lives HERE and not in the surface being printed, for the same reason the contract does: a
   grid that restated shell geometry to undo it would be the very coupling .mp-page-fill exists to
   remove. Every fill route inherits this — the calendar as well as the chart. */
@media print{
    .content:has(> .mp-page-fill),
    .content > .mp-page-fill{
        display: block !important;
    }
}

/* Login has no rail, no pane and no app bar; it is a page and it scrolls like one.

   And because it has no pane, it is the one route where the gradient has to stay on
   <html>. --mp-pane-bg moved to .content so it would be visible on an opaque surface and
   so the rail and the bar would resolve to one colour over a flat backdrop; neither
   reason applies here, because there is no .content and no translucent chrome to keep
   consistent. Same token, so the two routes cannot drift apart — the login screen shows
   the same gradient the workspace does, not a second copy of it. */
html.slug-login{
    --mp-rail:0px;
    --mp-pane-lap:0px;
    background:var(--mp-pane-bg);
    background-repeat:no-repeat;
    background-attachment:fixed;
    background-size:cover;
    height:auto;
}

html.slug-login body{
    height:auto;
    overflow:auto;
}

html.slug-login .content{
    margin-left:0px;
    background:none;
    box-shadow:none;
    height:auto;
    overflow:visible;
}

.content.is-leaving{
    opacity:.45;
    transform:translateY(4px);
}

.content.is-entering{
    animation:mpContentIn .16s ease both;
}

@keyframes mpContentIn{
    from{opacity:.35;transform:translateY(4px)}
    to{opacity:1;transform:translateY(0)}
}

body.mp-page-loading{cursor:progress}
body.mp-page-loading .sidebar nav a{pointer-events:none}

/* SKELETON — the shape of content that has not arrived yet.

   THE PLATFORM HAD NO DESTINATION FOR THIS, so each surface that needed one invented its own: the
   calendar covered its whole route with a backdrop-filtered scrim and a spinning orb, chat drew a
   brand mark behind a 320ms floor, and the sessions report dropped a real card to 30% opacity. Three
   answers to one question, and the register already records where that ends — a private canonical
   source is not a source of truth, it is a coincidence, and this is how a vocabulary reaches five
   copies each written by someone who believed there was one.

   WHAT A SKELETON IS FOR, and it is not decoration: an empty frame reads as "there is nothing here",
   which is a claim about the DATA. A placeholder says "something is coming", which is a claim about
   the REQUEST. Those are different sentences and a loading surface has to be able to say the second
   one without hiding the first.

   COMPOSED, NOT PRESCRIPTIVE. This owns the fill, the edge and the sheen; the CONSUMER owns the
   shape, because a session block, a drawer card and a table row are not the same rectangle. Built
   from tokens that already exist in both schemes rather than from three new names — a token is a
   promise to keep two palettes in step, and this needs no promise the palette has not already made.

   REDUCED MOTION LOSES THE SHEEN AND KEEPS THE SHAPE. Removing the animation must not remove the
   signal, and it must not be paid for elsewhere in wall-clock delay: whatever a caller does about
   this class, it must not be to wait. */
.mp-skeleton{
    position:relative;
    overflow:hidden;
    background:var(--mp-slate-11,rgba(148,163,184,.11));
    border:1px solid var(--mp-slate-18,rgba(148,163,184,.18));
    border-radius:var(--radius,5px);
}

.mp-skeleton::after{
    content:"";
    position:absolute;
    inset:0;
    transform:translateX(-100%);
    background:linear-gradient(90deg,transparent,var(--mp-slate-16,rgba(148,163,184,.16)),transparent);
    animation:mpSkeletonSheen 1.15s linear infinite;
}

@keyframes mpSkeletonSheen{
    to{transform:translateX(100%)}
}

@media (prefers-reduced-motion: reduce){
    .mp-skeleton::after{animation:none}
}

/* Page spacing */
.page-header,
body > h1:first-of-type,
main > h1:first-of-type,
.content > h1:first-of-type{
    margin-bottom:26px;
}

h1 + .card,

.page-header + .card,

h1 + section.card{

    margin-top:14px;

}


/* ===== Chip (removable token) ============================================
   ONE definition of the token chip, for every surface that lets a value be picked
   and dropped again: the app bar's search token field (navigation-shell) and the
   Tags control (forms-controls). It was written twice, and the copies had drifted
   on every axis that matters - 22px vs 24px, live --highlight vs a hardcoded
   rgba(54,211,153) that never flipped in light mode, a flat 16% tint vs a green->
   blue gradient, a neutral x vs one that went red on hover. Same object, two looks,
   depending on which field you were standing in.

   It lives here because both consumers load ABOVE foundation (navigation-shell 11,
   forms-controls 13): a primitive must sit under the surfaces that layer on it, or
   they end up fighting it with !important. Consumers add .mp-chip for the look and
   keep their own class as the behaviour hook.

   --mp-chip-c    the token's colour. Defaults to --highlight; a provider that knows
                  better sets it inline on the chip (search dims carry one per dim).
   --mp-chip-fill the ring's tint, derived not restated: one 16%, no second copy to drift.
   --mp-chip-h    the box. Anything that must line up with a chip borrows it.
   --mp-chip-max  the value's ellipsis budget; a surface with room raises it. */
:root{
    --mp-chip-c:var(--highlight);
    --mp-chip-h:22px;
    --mp-chip-max:190px;
}
/* --mp-chip-fill is declared HERE, not on :root, and that is load-bearing. A custom
   property's var()s are substituted at the element that DECLARES it - the resolved value
   is what inherits, not the recipe. On :root it would bake in :root's --mp-chip-c and a
   chip carrying an inline colour (search dims do) would retint its ring and keep a green
   fill. Measured: it did exactly that. Declared on the consumer, var(--mp-chip-c) resolves
   against the chip's own inline value.
   .mp-chip-tint is the same recipe for anything that must paint chip-coloured without
   being a chip - a suggestion previewing the chip it will become. */
.mp-chip,
.mp-chip-tint{
    --mp-chip-fill:color-mix(in srgb,var(--mp-chip-c) 16%,transparent);
}
.mp-chip{
    display:inline-flex;
    align-items:center;
    flex:0 1 auto;
    gap:5px;
    min-width:0;
    max-width:var(--mp-chip-max);
    height:var(--mp-chip-h);
    padding:0 2px 0 7px;
    border:1px solid var(--mp-chip-c);
    border-radius:999px;
    background:var(--mp-chip-fill);
    color:var(--mp-ink-strong);
    font-size:var(--mp-fs-xs,11px);
    font-weight:var(--mp-fw-heavy,800);
    line-height:var(--mp-lh-none,1);
    white-space:nowrap;
}
/* The mark says what the value IS when the field alone does not. In a multi-dimension
   field ("tag:x" beside "company:y") it carries the clause; in a mono-dimension field
   it restates the field's own icon on each token. Either way it must not out-shout the
   value: .62 was measured at ink parity with the word form it replaced. Colour needs no
   rule - the icon registry rewrites its #000 to currentColor, so the glyph rides the
   chip ink in both schemes. width/height override the registry's .mp-icon{width:1em},
   which here would resolve to --mp-fs-2xs (10px). The word skin (no .is-glyph) is the
   fallback for a dimension with no registered glyph, not a dead path. */
.mp-chip-mark{
    flex:0 0 auto;
    opacity:.62;
    text-transform:uppercase;
    letter-spacing:var(--mp-ls-wide,0.04em);
    font-size:var(--mp-fs-2xs,10px);
}
.mp-chip-mark.is-glyph svg{
    display:block;
    width:12px;
    height:12px;
}
.mp-chip-text{
    min-width:0;
    overflow:hidden;
    text-overflow:ellipsis;
    white-space:nowrap;
}
.mp-chip-x{
    display:inline-flex;
    align-items:center;
    justify-content:center;
    flex:0 0 16px;
    width:16px;
    height:16px;
    min-height:0;
    padding:0;
    border:0;
    border-radius:999px;
    appearance:none;
    background:var(--mp-fill-07);
    color:var(--mp-ink-strong);
    cursor:pointer;
    line-height:1;
    transition:background .14s ease;
}
.mp-chip-x:hover{background:var(--mp-fill-14);}
.mp-chip-x span{display:block;width:16px;height:16px;line-height:15px;text-align:center;pointer-events:none;}


/* ===== Light scheme ======================================================
   The per-user light palette. html[data-mp-scheme] is set by the core layout
   (>= 1.12.24) from the profile preference; these pairs override the :root
   dark tokens above by attribute specificity, no !important. Values seeded
   from the material-light palette. Components that still carry hardcoded
   dark colours keep rendering dark until their own conversion lands. */
html[data-mp-scheme="light"]{
    color-scheme:light;
    --bg:#f6f8fc;
    --panel:rgba(255,255,255,.92);
    --panel-solid:#ffffff;
    --border:rgba(15,23,42,.12);
    --text:#0f172a;
    --muted:#5b6a7d;
    --purple:#7c3aed;
    --blue:#0284c7;
    --amber:#d97706;
    --pink:#db2777;
    --red:#e11d48;
    --green:#00b84f;
    --green-soft:rgba(0,184,79,.10);
    --green-light:#00c853;
    --grad-brand:linear-gradient(135deg,#00d95a,#0ea5e9);
    --shadow:0 1px 2px rgba(15,23,42,.06),0 10px 28px rgba(15,23,42,.08);
    --highlight-soft:rgba(0,184,79,.10);
    --mp-pane-bg:
        radial-gradient(circle at top left,rgba(14,165,233,.13) 0%,transparent 36%),
        radial-gradient(circle at bottom right,rgba(0,184,79,.11) 0%,transparent 32%),
        linear-gradient(180deg,#ffffff 0%,#f6f8fc 46%,#edf3fb 100%);
    --mp-pane-shadow:rgba(15,23,42,.045);
}

/* ===== Shared scheme palette (--mp-*) ====================================
   The platform-wide semantic colour vocabulary consumed by theme components
   from forms-controls onward. Dark values are the exact literals those files
   carried before tokenization; light pairs are seeded from the material-light
   palette. surfaces-data predates this block and ships its own --mpdg-* pairs
   with identical values; converging the two is noted for a later pass.

   Keys are one-per-colour. Where a single dark colour needs two different light
   values (--mp-ink vs --mp-toggle-knob, both #e2e8f0), the consumer is split by
   context rather than the token being overloaded. */
:root{
    --mp-avatar-ring:rgba(2, 6, 23, 0.45);
    --mp-choice-bg-v:rgba(2, 6, 23, 0.74);
    --mp-choice-hi:rgba(15, 23, 42, 0.94);
    --mp-choice-hov:rgba(2, 6, 23, 0.92);
    --mp-choice-lo:rgba(2, 6, 23, 0.88);
    --mp-choice-on:#064e3b;
    --mp-danger-10:rgba(251, 113, 133, 0.1);
    --mp-danger-30:rgba(251, 113, 133, 0.3);
    --mp-deep-52:rgba(15, 23, 42, 0.52);
    --mp-deep-55:rgba(15, 23, 42, 0.55);
    --mp-fill-024:rgba(255, 255, 255, 0.024);
    --mp-fill-027:rgba(255, 255, 255, 0.027);
    --mp-fill-03:rgba(255, 255, 255, 0.03);
    --mp-fill-035:rgba(255, 255, 255, 0.035);
    --mp-fill-04:rgba(255, 255, 255, 0.04);
    --mp-fill-045:rgba(255, 255, 255, 0.045);
    --mp-fill-05:rgba(255, 255, 255, 0.05);
    --mp-fill-055:rgba(255, 255, 255, 0.055);
    --mp-fill-06:rgba(255, 255, 255, 0.06);
    --mp-fill-067:rgba(255, 255, 255, 0.067);
    --mp-fill-07:rgba(255, 255, 255, 0.07);
    --mp-fill-08:rgba(255, 255, 255, 0.08);
    --mp-fill-10:rgba(255, 255, 255, 0.1);
    --mp-fill-12:rgba(255, 255, 255, 0.12);
    --mp-fill-16:rgba(255, 255, 255, 0.16);
    --mp-fill-20:rgba(255, 255, 255, 0.2);
    --mp-fill-24:rgba(255, 255, 255, 0.24);
    --mp-fill-38:rgba(255, 255, 255, 0.38);
    --mp-hl-09:rgba(0, 234, 94, 0.09);
    --mp-hl-10:rgba(0, 234, 94, 0.1);
    --mp-hl-114:rgba(0, 234, 94, 0.114);
    --mp-hl-12:rgba(0, 234, 94, 0.12);
    --mp-hl-13:rgba(0, 234, 94, 0.13);
    --mp-hl-16:rgba(0, 234, 94, 0.16);
    --mp-hl-18:rgba(0, 234, 94, 0.18);
    --mp-hl-22:rgba(0, 234, 94, 0.22);
    --mp-hl-24:rgba(0, 234, 94, 0.24);
    --mp-hl-28:rgba(0, 234, 94, 0.28);
    --mp-hl-30:rgba(0, 234, 94, 0.3);
    --mp-hl-32:rgba(0, 234, 94, 0.32);
    --mp-hl-34:rgba(0, 234, 94, 0.34);
    --mp-hl-35:rgba(0, 234, 94, 0.35);
    --mp-hl-42:rgba(0, 234, 94, 0.42);
    --mp-hl-48:rgba(0, 234, 94, 0.48);
    --mp-hl-54:rgba(0, 234, 94, 0.54);
    --mp-hl-55:rgba(0, 234, 94, 0.55);
    --mp-hl-58:rgba(0, 234, 94, 0.58);
    --mp-ink:#e2e8f0;
    --mp-ink-90:rgba(226, 232, 240, 0.9);
    --mp-ink-92:rgba(226, 232, 240, 0.92);
    --mp-ink-check:#e5eefb;
    --mp-ink-dim:#64748b;
    --mp-ink-faint:#475569;
    --mp-ink-err:rgb(254, 202, 202);
    --mp-ink-hl-soft:#dfffe9;
    --mp-ink-icon:#9ca8bd;
    --mp-ink-invert:#fff;
    --mp-ink-item:#dbeafe;
    --mp-ink-label:rgba(148, 163, 184, 0.88);
    --mp-ink-muted:#94a3b8;
    --mp-ink-on-hl:#d1fae5;
    --mp-ink-ph:rgba(148, 163, 184, 0.78);
    --mp-ink-role:rgb(134, 239, 172);
    --mp-ink-soft:#cbd5e1;
    --mp-ink-soft-54:rgba(203, 213, 225, 0.54);
    --mp-ink-soft-62:rgba(203, 213, 225, 0.62);
    --mp-ink-soft-68:rgba(203, 213, 225, 0.68);
    --mp-ink-strong:#f8fafc;
    --mp-ink-title:#98a6bf;
    --mp-opt-on:rgb(6, 61, 34);
    --mp-panel-96:rgba(2, 6, 23, 0.96);
    --mp-panel-98:rgba(15, 23, 42, 0.98);
    --mp-scrim:rgba(2, 6, 23, 0.8);
    --mp-seg-hi:rgba(15, 23, 42, 0.92);
    --mp-seg-lo:rgba(2, 6, 23, 0.72);
    --mp-sh-14:rgba(0, 0, 0, 0.14);
    --mp-sh-16:rgba(0, 0, 0, 0.16);
    --mp-sh-18:rgba(0, 0, 0, 0.18);
    --mp-sh-20:rgba(0, 0, 0, 0.2);
    --mp-sh-22:rgba(0, 0, 0, 0.22);
    --mp-sh-45:rgba(0, 0, 0, 0.45);
    --mp-slate-043:rgba(148, 163, 184, 0.043);
    --mp-slate-06:rgba(148, 163, 184, 0.06);
    --mp-slate-11:rgba(148, 163, 184, 0.11);
    --mp-slate-12:rgba(148, 163, 184, 0.12);
    --mp-slate-16:rgba(148, 163, 184, 0.16);
    --mp-slate-18:rgba(148, 163, 184, 0.18);
    --mp-slate-20:rgba(148, 163, 184, 0.2);
    --mp-slate-22:rgba(148, 163, 184, 0.22);
    --mp-slate-25:rgba(148, 163, 184, 0.25);
    --mp-slate-28:rgba(148, 163, 184, 0.28);
    --mp-slate-30:rgba(148, 163, 184, 0.3);
    --mp-slate-32:rgba(148, 163, 184, 0.32);
    --mp-slate-34:rgba(148, 163, 184, 0.34);
    --mp-status-new:#22d3ee;
    --mp-status-review:#6366f1;
    --mp-toggle-knob:#e2e8f0;
}
html[data-mp-scheme="light"]{
    --mp-avatar-ring:rgba(255,255,255,.9);
    --mp-choice-bg-v:#ffffff;
    --mp-choice-hi:#ffffff;
    --mp-choice-hov:#f6f8fc;
    --mp-choice-lo:#eef2f7;
    --mp-choice-on:#059669;
    --mp-danger-10:rgba(225,29,72,.08);
    --mp-danger-30:rgba(225,29,72,.28);
    --mp-deep-52:rgba(15,23,42,.08);
    --mp-deep-55:rgba(15,23,42,.08);
    --mp-fill-024:rgba(15,23,42,.03);
    --mp-fill-027:rgba(15,23,42,.03);
    --mp-fill-03:rgba(15,23,42,.035);
    --mp-fill-035:rgba(15,23,42,.04);
    --mp-fill-04:rgba(15,23,42,.05);
    --mp-fill-045:rgba(15,23,42,.05);
    --mp-fill-05:rgba(15,23,42,.04);
    --mp-fill-055:rgba(15,23,42,.045);
    --mp-fill-06:rgba(15,23,42,.06);
    --mp-fill-067:rgba(15,23,42,.05);
    --mp-fill-07:rgba(15,23,42,.06);
    --mp-fill-08:rgba(15,23,42,.10);
    --mp-fill-10:rgba(15,23,42,.08);
    --mp-fill-12:rgba(15,23,42,.09);
    --mp-fill-16:rgba(15,23,42,.06);
    --mp-fill-20:rgba(15,23,42,.10);
    --mp-fill-24:rgba(255,255,255,.85);
    --mp-fill-38:rgba(255,255,255,.55);
    --mp-hl-09:rgba(0,184,79,.11);
    --mp-hl-10:rgba(0,184,79,.12);
    --mp-hl-114:rgba(0,184,79,.13);
    --mp-hl-12:rgba(0,184,79,.14);
    --mp-hl-13:rgba(0,184,79,.15);
    --mp-hl-16:rgba(0,184,79,.18);
    --mp-hl-18:rgba(0,184,79,.2);
    --mp-hl-22:rgba(0,184,79,.26);
    --mp-hl-24:rgba(0,184,79,.28);
    --mp-hl-28:rgba(0,184,79,.32);
    --mp-hl-30:rgba(0,184,79,.34);
    --mp-hl-32:rgba(0,184,79,.36);
    --mp-hl-34:rgba(0,184,79,.38);
    --mp-hl-35:rgba(0,184,79,.4);
    --mp-hl-42:rgba(0,150,64,.5);
    --mp-hl-48:rgba(0,150,64,.55);
    --mp-hl-54:rgba(0,150,64,.6);
    --mp-hl-55:rgba(0,150,64,.62);
    --mp-hl-58:rgba(0,150,64,.65);
    --mp-ink:#1e293b;
    --mp-ink-90:rgba(30,41,59,.9);
    --mp-ink-92:rgba(30,41,59,.92);
    --mp-ink-check:#1e293b;
    --mp-ink-dim:#6b7789;
    --mp-ink-faint:#94a3b8;
    --mp-ink-err:#b91c1c;
    --mp-ink-hl-soft:#047857;
    --mp-ink-icon:#64748b;
    --mp-ink-invert:#0f172a;
    --mp-ink-item:#24324a;
    --mp-ink-label:rgba(71,85,105,.9);
    --mp-ink-muted:#64748b;
    --mp-ink-on-hl:#065f46;
    --mp-ink-ph:#697585;
    --mp-ink-role:#047857;
    --mp-ink-soft:#334155;
    --mp-ink-soft-54:rgba(51,65,85,.6);
    --mp-ink-soft-62:rgba(51,65,85,.66);
    --mp-ink-soft-68:rgba(51,65,85,.7);
    --mp-ink-strong:#0f172a;
    --mp-ink-title:#64748b;
    --mp-opt-on:rgba(0,184,79,.18);
    --mp-panel-96:rgba(255,255,255,.97);
    --mp-panel-98:rgba(255,255,255,.98);
    --mp-scrim:rgba(248,250,252,.78);
    --mp-seg-hi:#f1f5f9;
    --mp-seg-lo:#e8edf5;
    --mp-sh-14:rgba(15,23,42,.05);
    --mp-sh-16:rgba(15,23,42,.06);
    --mp-sh-18:rgba(15,23,42,.07);
    --mp-sh-20:rgba(15,23,42,.08);
    --mp-sh-22:rgba(15,23,42,.09);
    --mp-sh-45:rgba(15,23,42,.18);
    --mp-slate-043:rgba(15,23,42,.03);
    --mp-slate-06:rgba(15,23,42,.04);
    --mp-slate-11:rgba(15,23,42,.05);
    --mp-slate-12:rgba(15,23,42,.06);
    --mp-slate-16:rgba(15,23,42,.16);
    --mp-slate-18:rgba(15,23,42,.14);
    --mp-slate-20:rgba(15,23,42,.16);
    --mp-slate-22:rgba(15,23,42,.14);
    --mp-slate-25:rgba(15,23,42,.18);
    --mp-slate-28:rgba(15,23,42,.22);
    --mp-slate-30:rgba(15,23,42,.28);
    --mp-slate-32:rgba(15,23,42,.3);
    --mp-slate-34:rgba(15,23,42,.32);
    --mp-status-new:#0891b2;
    --mp-status-review:#4f46e5;
    --mp-toggle-knob:#ffffff;
}

/* ----- navigation-shell pairs -------------------------------------------
   Sidebar, mobile top bar and the logout throbber. Brand artwork (the mark's
   conic gradient, the avatar gradient, their masks and glows) is deliberately
   NOT tokenized: it is the logo, not the interface. */
:root{
    --mp-backdrop:rgba(2,6,23,.72);
    --mp-danger-ink:#fb7185;
    --mp-accent-08:rgba(56,189,248,.08);
    --mp-accent-09:rgba(56,189,248,.09);
    --mp-accent-12:rgba(56,189,248,.12);
    --mp-accent-14:rgba(56,189,248,.14);
    --mp-danger-08:rgba(244,63,94,.08);
    --mp-fill-018:rgba(255,255,255,.018);
    --mp-fill-02:rgba(255,255,255,.02);
    --mp-fill-065:rgba(255,255,255,.065);
    --mp-fill-30:rgba(255,255,255,.30);
    --mp-hl-05:rgba(0,234,94,.05);
    --mp-hl-06:rgba(0,234,94,.06);
    --mp-hl-08:rgba(0,234,94,.08);
    --mp-hl-14:rgba(0,234,94,.14);
    --mp-hl-20:rgba(0,234,94,.20);
    --mp-hl-25:rgba(0,234,94,.25);
    --mp-ink-danger:#fecdd3;
    --mp-ink-nav:#dbe4ee;
    --mp-sh-24:rgba(0,0,0,.24);
    --mp-sh-32:rgba(0,0,0,.32);
    --mp-sh-38:rgba(0,0,0,.38);
    --mp-sh-50:rgba(0,0,0,.50);
    --mp-sidebar:rgba(6,8,22,.75);
    --mp-throbber-a:rgba(15,23,42,.42);
    --mp-throbber-b:rgba(2,6,23,.22);
    --mp-throbber-scrim:rgba(5,8,22,.74);
    --mp-throbber-sheen:rgba(15,23,42,.03);
    --mp-topbar-hi:rgba(7,12,29,.96);
    --mp-topbar-lo:rgba(7,12,29,.82);
}
html[data-mp-scheme="light"]{
    --mp-backdrop:rgba(15,23,42,.32);
    --mp-danger-ink:#e11d48;
    --mp-accent-08:rgba(2,132,199,.08);
    --mp-accent-09:rgba(2,132,199,.09);
    --mp-accent-12:rgba(2,132,199,.12);
    --mp-accent-14:rgba(2,132,199,.14);
    --mp-danger-08:rgba(225,29,72,.07);
    --mp-fill-018:rgba(15,23,42,.02);
    --mp-fill-02:rgba(15,23,42,.025);
    --mp-fill-065:rgba(15,23,42,.055);
    --mp-fill-30:rgba(255,255,255,.55);
    --mp-hl-05:rgba(0,184,79,.07);
    --mp-hl-06:rgba(0,184,79,.08);
    --mp-hl-08:rgba(0,184,79,.10);
    --mp-hl-14:rgba(0,184,79,.16);
    --mp-hl-20:rgba(0,184,79,.24);
    --mp-hl-25:rgba(0,150,64,.30);
    --mp-ink-danger:#b91c1c;
    --mp-ink-nav:#334155;
    --mp-sh-24:rgba(15,23,42,.09);
    --mp-sh-32:rgba(15,23,42,.12);
    --mp-sh-38:rgba(15,23,42,.14);
    --mp-sh-50:rgba(15,23,42,.18);
    --mp-sidebar:rgba(255,255,255,.82);
    --mp-throbber-a:rgba(15,23,42,.06);
    --mp-throbber-b:rgba(15,23,42,.04);
    --mp-throbber-scrim:rgba(248,250,252,.78);
    --mp-throbber-sheen:rgba(15,23,42,.05);
    --mp-topbar-hi:rgba(255,255,255,.96);
    --mp-topbar-lo:rgba(246,248,252,.86);
}

/* ----- actions-badges pairs ---------------------------------------------
   Buttons, action menus, status/role/kind badges. The primary button gradient
   and its #06111d glyph are brand artwork and stay literal. --mp-badge-mix is
   the colour a priority badge mixes its hue TOWARD: white on dark, ink on light. */
:root{
    --mp-accent-ink:#38bdf8;
    --mp-activate:#00e676;
    --mp-amber-10:rgba(245, 158, 11, .10);
    --mp-amber-11:rgba(245, 158, 11, .11);
    --mp-amber-12:rgba(245, 158, 11, .12);
    --mp-amber-14:rgba(245, 158, 11, .14);
    --mp-amber-18:rgba(245, 158, 11, .18);
    --mp-amber-28:rgba(245, 158, 11, .28);
    --mp-amber-30:rgba(245, 158, 11, .30);
    --mp-amber-32:rgba(245, 158, 11, .32);
    --mp-badge-mix:#ffffff;
    --mp-badge-hue-pct:70%;
    --mp-badge-ink-pct:30%;
    --mp-badge-bg-pct:14%;
    --mp-badge-bd-pct:40%;
    --mp-blue-10:rgba(59, 130, 246, .10);
    --mp-blue-22:rgba(59, 130, 246, .22);
    --mp-filepill:rgba(58, 145, 198, .12);
    --mp-fill-025:rgba(255, 255, 255, .025);
    --mp-hl-075:rgba(0, 234, 94, .075);
    --mp-hl-45:rgba(0,234,94,.45);
    --mp-ink-amber:#fde68a;
    --mp-ink-amber-soft:#fef3c7;
    --mp-ink-blue:#93c5fd;
    --mp-ink-btn:#e5edf8;
    --mp-ink-danger-strong:#ffd5de;
    --mp-ink-green:#bbf7d0;
    --mp-ink-hl-bright:#e5fbee;
    --mp-ink-neutral:#d1d5db;
    --mp-ink-violet:#c4b5fd;
    --mp-kind-cancel:#f43f5e;
    --mp-kind-event:#d946ef;
    --mp-kind-logged:#0ea5e9;
    --mp-kind-meeting:#14b8a6;
    --mp-kind-running:#f59e0b;
    --mp-kind-training:#ff6b8a;
    --mp-menu-hi:rgba(15,23,42,.96);
    --mp-menu-lo:rgba(2,6,23,.92);
    --mp-pink-075:rgba(255, 107, 138, .075);
    --mp-pink-26:rgba(255, 107, 138, .26);
    --mp-role-admin:#fbbf24;
    --mp-rose-11:rgba(251, 113, 133, .11);
    --mp-rose-12:rgba(251, 113, 133, .12);
    --mp-rose-34:rgba(251, 113, 133, .34);
    --mp-row-deep:rgba(8, 13, 28, .42);
    --mp-scrim-email:rgba(2,6,23,.72);
    --mp-seg-shell:rgba(15,23,42,.4);
    --mp-sh-30:rgba(0,0,0,.30);
    --mp-sky-14:rgba(14, 165, 233, .14);
    --mp-sky-32:rgba(14, 165, 233, .32);
    --mp-slate-055:rgba(148, 163, 184, .055);
    --mp-slate-08:rgba(148, 163, 184, .08);
    --mp-slate-10:rgba(148, 163, 184, .10);
    --mp-slate-24:rgba(148, 163, 184, .24);
    --mp-slate-26:rgba(148, 163, 184, .26);
    --mp-violet-10:rgba(139, 92, 246, .10);
    --mp-violet-20:rgba(139, 92, 246, .20);
    --mp-yellow-10:rgba(250, 204, 21, .10);
    --mp-yellow-28:rgba(250, 204, 21, .28);
}
html[data-mp-scheme="light"]{
    --mp-accent-ink:#0284c7;
    --mp-activate:#059669;
    --mp-amber-10:rgba(180,83,9,.10);
    --mp-amber-11:rgba(180,83,9,.11);
    --mp-amber-12:rgba(180,83,9,.12);
    --mp-amber-14:rgba(180,83,9,.14);
    --mp-amber-18:rgba(180,83,9,.20);
    --mp-amber-28:rgba(180,83,9,.30);
    --mp-amber-30:rgba(180,83,9,.32);
    --mp-amber-32:rgba(180,83,9,.34);
    --mp-badge-mix:#0f172a;
    --mp-badge-hue-pct:45%;
    --mp-badge-ink-pct:55%;
    --mp-badge-bg-pct:26%;
    --mp-badge-bd-pct:64%;
    --mp-blue-10:rgba(29,78,216,.10);
    --mp-blue-22:rgba(29,78,216,.24);
    --mp-filepill:rgba(2,132,199,.10);
    --mp-fill-025:rgba(15,23,42,.03);
    --mp-hl-075:rgba(0,184,79,.09);
    --mp-hl-45:rgba(0,150,64,.5);
    --mp-ink-amber:#92400e;
    --mp-ink-amber-soft:#92400e;
    --mp-ink-blue:#1d4ed8;
    --mp-ink-btn:#334155;
    --mp-ink-danger-strong:#be123c;
    --mp-ink-green:#065f46;
    --mp-ink-hl-bright:#047857;
    --mp-ink-neutral:#4b5563;
    --mp-ink-violet:#5b21b6;
    --mp-kind-cancel:#be123c;
    --mp-kind-event:#a21caf;
    --mp-kind-logged:#0369a1;
    --mp-kind-meeting:#0f766e;
    --mp-kind-running:#b45309;
    --mp-kind-training:#be185d;
    --mp-menu-hi:rgba(255,255,255,.98);
    --mp-menu-lo:rgba(255,255,255,.96);
    --mp-pink-075:rgba(190,24,93,.07);
    --mp-pink-26:rgba(190,24,93,.26);
    --mp-role-admin:#b45309;
    --mp-rose-11:rgba(225,29,72,.09);
    --mp-rose-12:rgba(225,29,72,.10);
    --mp-rose-34:rgba(225,29,72,.30);
    --mp-row-deep:rgba(15,23,42,.04);
    --mp-scrim-email:rgba(248,250,252,.72);
    --mp-seg-shell:rgba(15,23,42,.05);
    --mp-sh-30:rgba(15,23,42,.11);
    --mp-sky-14:rgba(2,132,199,.14);
    --mp-sky-32:rgba(2,132,199,.34);
    --mp-slate-055:rgba(15,23,42,.04);
    --mp-slate-08:rgba(15,23,42,.05);
    --mp-slate-10:rgba(15,23,42,.05);
    --mp-slate-24:rgba(15,23,42,.16);
    --mp-slate-26:rgba(15,23,42,.18);
    --mp-violet-10:rgba(109,40,217,.10);
    --mp-violet-20:rgba(109,40,217,.22);
    --mp-yellow-10:rgba(161,98,7,.10);
    --mp-yellow-28:rgba(161,98,7,.30);
}

/* ----- uploads-attachments pairs ---------------------------------------
   Dropzone, file rows, attachment buttons and the email preview. The upload
   submit gradient is brand artwork; the email frame is white paper in both
   schemes. The email-modal scrim reuses --mp-scrim-email. */
:root{
    --mp-fill-022:rgba(255,255,255,.022);
    --mp-fill-038:rgba(255,255,255,.038);
    --mp-hl-055:rgba(0,234,94,.055);
    --mp-hl-07:rgba(0,234,94,.07);
    --mp-hl-26:rgba(0,234,94,.26);
    --mp-hl-50:rgba(0,234,94,.50);
    --mp-hl-62:rgba(0,234,94,.62);
    --mp-hl-85:rgba(0,234,94,.85);
    --mp-ink-file:#9aa6bd;
    --mp-ink-filepill:#8fb6c9;
    --mp-ink-upload:#74ff9c;
    --mp-row-deep-48:rgba(8,13,28,.48);
    --mp-row-deep-52:rgba(8,13,28,.52);
}
html[data-mp-scheme="light"]{
    --mp-fill-022:rgba(15,23,42,.025);
    --mp-fill-038:rgba(15,23,42,.04);
    --mp-hl-055:rgba(0,184,79,.07);
    --mp-hl-07:rgba(0,184,79,.09);
    --mp-hl-26:rgba(0,184,79,.30);
    --mp-hl-50:rgba(0,150,64,.55);
    --mp-hl-62:rgba(0,150,64,.70);
    --mp-hl-85:rgba(0,150,64,.90);
    --mp-ink-file:#64748b;
    --mp-ink-filepill:#0369a1;
    --mp-ink-upload:#047857;
    --mp-row-deep-48:rgba(15,23,42,.05);
    --mp-row-deep-52:rgba(15,23,42,.06);
}

/* ----- dashboards pairs ------------------------------------------------
   KPI cards, dashboard tables, empty states. The KPI icon ink is its own token:
   the brand green reads at 1.6:1 on a white card, so light uses a deeper green. */
:root{
    --mp-ink-brand:#00EA5E;
    --mp-rose-14:rgba(251,113,133,.14);
    --mp-rose-20:rgba(251,113,133,.20);
}
html[data-mp-scheme="light"]{
    --mp-ink-brand:#047857;
    --mp-rose-14:rgba(225,29,72,.12);
    --mp-rose-20:rgba(225,29,72,.18);
}

/* ----- alerts-runtime pairs --------------------------------------------
   Toasts, runtime banners, confirm dialogs and tips. The alert backdrop dims the
   page in both schemes; the dialog itself becomes a white card. */
:root{
    --mp-backdrop-soft:rgba(2,6,23,.54);
    --mp-dialog:rgba(7,12,28,.98);
    --mp-fill-085:rgba(255,255,255,.085);
    --mp-ink-tip:#e9eefb;
    --mp-pink-10:rgba(255,107,138,.10);
    --mp-pink-12:rgba(255,107,138,.12);
    --mp-pink-24:rgba(255,107,138,.24);
    --mp-pink-30:rgba(255,107,138,.30);
    --mp-sh-34:rgba(0,0,0,.34);
    --mp-slate-38:rgba(148,163,184,.38);
}
html[data-mp-scheme="light"]{
    --mp-backdrop-soft:rgba(15,23,42,.28);
    --mp-dialog:rgba(255,255,255,.98);
    --mp-fill-085:rgba(15,23,42,.07);
    --mp-ink-tip:#1e293b;
    --mp-pink-10:rgba(190,24,93,.09);
    --mp-pink-12:rgba(190,24,93,.10);
    --mp-pink-24:rgba(190,24,93,.22);
    --mp-pink-30:rgba(190,24,93,.28);
    --mp-sh-34:rgba(15,23,42,.13);
    --mp-slate-38:rgba(15,23,42,.34);
}

/* ----- admin-system pairs ----------------------------------------------
   Admin panels, system tables and code blocks. */
:root{
    --mp-code-bg:rgba(2,6,23,.72);
}
html[data-mp-scheme="light"]{
    --mp-code-bg:rgba(15,23,42,.04);
}

/* ----- date-time-controls pairs ----------------------------------------
   Date pickers, time sliders, duration presets. The selected day keeps the brand
   gradient and the inks that sit on it. */
:root{
    --mp-cal-cell:rgb(16, 24, 39);
    --mp-cal-dim:rgba(15, 23, 42, 0.62);
    --mp-cal-panel:rgba(6, 16, 11, 0.95);
    --mp-cal-solid:rgb(6, 16, 11);
    --mp-fill-043:rgba(255, 255, 255, 0.043);
    --mp-fill-14:rgba(255, 255, 255, 0.14);
    --mp-fill-28:rgba(255, 255, 255, 0.28);
    --mp-fill-64:rgba(255, 255, 255, 0.64);
    --mp-fill-85:rgba(255, 255, 255, 0.85);
    --mp-hl-40:rgba(0, 234, 94, 0.4);
    --mp-ink-cal:rgb(220, 229, 243);
    --mp-ink-cal-soft:rgb(216, 222, 233);
    --mp-sh-25:rgba(0, 0, 0, 0.25);
    --mp-sh-28:rgba(0, 0, 0, 0.28);
}
html[data-mp-scheme="light"]{
    --mp-cal-cell:#f1f5f9;
    --mp-cal-dim:rgba(15,23,42,.06);
    --mp-cal-panel:rgba(255,255,255,.98);
    --mp-cal-solid:#ffffff;
    --mp-fill-043:rgba(15,23,42,.04);
    --mp-fill-14:rgba(15,23,42,.10);
    --mp-fill-28:rgba(15,23,42,.18);
    --mp-fill-64:rgba(15,23,42,.45);
    --mp-fill-85:rgba(15,23,42,.62);
    --mp-hl-40:rgba(0,150,64,.45);
    --mp-ink-cal:#1e293b;
    --mp-ink-cal-soft:#334155;
    --mp-sh-25:rgba(15,23,42,.10);
    --mp-sh-28:rgba(15,23,42,.11);
}

/* ----- auth-profile-passwords pairs ------------------------------------
   Login, profile and password screens. The login brand marks (conic gradient rings
   and their #000 radial mask paints) are artwork and stay literal. */
:root{
    --mp-accent-035:rgba(56,189,248,.035);
    --mp-accent-10:rgba(56,189,248,.10);
    --mp-accent-16:rgba(56,189,248,.16);
    --mp-accent-26:rgba(56,189,248,.26);
    --mp-deep-10:rgba(2,6,23,.10);
    --mp-dim-12:rgba(100,116,139,.12);
    --mp-fill-014:rgba(255,255,255,.014);
    --mp-fill-032:rgba(255,255,255,.032);
    --mp-ink-label-fill:#7f8da3;
    --mp-ink-label-idle:#9aa7ba;
    --mp-ink-login-on:#9ef7bd;
    --mp-ink-login-sub:#b7c3d3;
    --mp-lime-08:rgba(0,230,118,.08);
    --mp-lime-10:rgba(0,230,118,.10);
    --mp-lime-12:rgba(0,230,118,.12);
    --mp-lime-14:rgba(0,230,118,.14);
    --mp-lime-22:rgba(0,230,118,.22);
    --mp-lime-30:rgba(0,230,118,.30);
    --mp-lime-38:rgba(0,230,118,.38);
    --mp-login-feedback:rgba(5,8,22,.58);
    --mp-login-right-hi:rgba(15,23,42,.72);
    --mp-login-right-lo:rgba(15,23,42,.46);
    --mp-login-shell:rgba(10,14,28,.75);
    --mp-meter-3:#84cc16;
    --mp-pink-14:rgba(255,107,138,.14);
    --mp-slate-14:rgba(148,163,184,.14);
    --mp-slate-15:rgba(148,163,184,.15);
    --mp-slate-36:rgba(148,163,184,.36);
}
html[data-mp-scheme="light"]{
    --mp-accent-035:rgba(2,132,199,.04);
    --mp-accent-10:rgba(2,132,199,.10);
    --mp-accent-16:rgba(2,132,199,.16);
    --mp-accent-26:rgba(2,132,199,.26);
    --mp-deep-10:rgba(15,23,42,.05);
    --mp-dim-12:rgba(15,23,42,.06);
    --mp-fill-014:rgba(15,23,42,.02);
    --mp-fill-032:rgba(15,23,42,.035);
    --mp-ink-label-fill:#475569;
    --mp-ink-label-idle:#64748b;
    --mp-ink-login-on:#047857;
    --mp-ink-login-sub:#475569;
    --mp-lime-08:rgba(5,150,105,.09);
    --mp-lime-10:rgba(5,150,105,.11);
    --mp-lime-12:rgba(5,150,105,.13);
    --mp-lime-14:rgba(5,150,105,.15);
    --mp-lime-22:rgba(5,150,105,.24);
    --mp-lime-30:rgba(5,150,105,.32);
    --mp-lime-38:rgba(4,120,87,.42);
    --mp-login-feedback:rgba(248,250,252,.72);
    --mp-login-right-hi:rgba(255,255,255,.92);
    --mp-login-right-lo:rgba(246,248,252,.88);
    --mp-login-shell:rgba(255,255,255,.86);
    --mp-meter-3:#4d7c0f;
    --mp-pink-14:rgba(190,24,93,.12);
    --mp-slate-14:rgba(15,23,42,.07);
    --mp-slate-15:rgba(15,23,42,.07);
    --mp-slate-36:rgba(15,23,42,.32);
}

/* ----- buttons-module pairs --------------------------------------------
   ButtonRegistry sheet (modules/buttons). --mp-link-ink fixes link-button text,
   which rendered at 2.6:1 on a white card when it followed --green. */
:root{
    --mp-amber-16:rgba(245,158,11,.16);
    --mp-amber-46:rgba(245,158,11,.46);
    --mp-btn-backing:#0f1729;
    --mp-btn-sh-a:rgba(15,23,42,.25);
    --mp-btn-sh-b:rgba(2,6,23,.25);
    --mp-ink-amber-2:#fde3b3;
    --mp-ink-mint:#eafff3;
    --mp-ink-rose:#ffe2e8;
    --mp-link-ink:#00ea5e;
    --mp-link-ink-hover:#00c853;
    --mp-red-12:rgba(244,63,94,.12);
    --mp-rose-16:rgba(251,113,133,.16);
    --mp-rose-42:rgba(251,113,133,.42);
}
html[data-mp-scheme="light"]{
    --mp-amber-16:rgba(180,83,9,.16);
    --mp-amber-46:rgba(180,83,9,.46);
    --mp-btn-backing:#f1f5f9;
    --mp-btn-sh-a:rgba(15,23,42,.08);
    --mp-btn-sh-b:rgba(15,23,42,.06);
    --mp-ink-amber-2:#92400e;
    --mp-ink-mint:#065f46;
    --mp-ink-rose:#9f1239;
    --mp-link-ink:#047857;
    --mp-link-ink-hover:#065f46;
    --mp-red-12:rgba(225,29,72,.10);
    --mp-rose-16:rgba(225,29,72,.14);
    --mp-rose-42:rgba(225,29,72,.38);
}

/* ----- chat-module pairs -----------------------------------------------
   Chat panel, bubbles, mentions, reactions. The collapsed-widget bubble and the
   loading brand mark are artwork and stay literal. */
:root{
    --mp-chat-badge:rgba(15, 23, 42, 0.28);
    --mp-chat-btn:rgba(15, 23, 42, 0.58);
    --mp-chat-edit:rgba(15, 23, 42, 0.78);
    --mp-chat-empty:rgba(2, 6, 23, 0.86);
    --mp-chat-field:rgba(15, 23, 42, 0.34);
    --mp-chat-panel:rgba(15, 23, 42, 0.96);
    --mp-chat-toggle:rgba(2, 6, 23, 0.55);
    --mp-chat-well:rgba(2, 6, 23, 0.16);
    --mp-hl-11:rgba(0, 234, 94, 0.11);
    --mp-hl-52:rgba(0, 234, 94, 0.52);
    --mp-hl-60:rgba(0, 234, 94, 0.6);
    --mp-ink-mint-2:rgb(236, 253, 245);
    --mp-sh-35:rgba(0, 0, 0, 0.35);
    --mp-slate-40:rgba(148, 163, 184, 0.4);
}
html[data-mp-scheme="light"]{
    --mp-chat-badge:rgba(15,23,42,.06);
    --mp-chat-btn:rgba(15,23,42,.05);
    --mp-chat-edit:rgba(255,255,255,.92);
    --mp-chat-empty:rgba(15,23,42,.05);
    --mp-chat-field:rgba(255,255,255,.85);
    --mp-chat-panel:rgba(255,255,255,.98);
    --mp-chat-toggle:rgba(15,23,42,.05);
    --mp-chat-well:rgba(15,23,42,.04);
    --mp-hl-11:rgba(0,184,79,.13);
    --mp-hl-52:rgba(0,150,64,.58);
    --mp-hl-60:rgba(0,150,64,.68);
    --mp-ink-mint-2:#065f46;
    --mp-sh-35:rgba(15,23,42,.13);
    --mp-slate-40:rgba(15,23,42,.35);
}

/* ----- calendar-module pairs -------------------------------------------
   The mpc calendar grid. Only BARE literals are tokenized: 156 of the 331 sit inside
   var(--x, fallback) and never paint. Blocks and chips are color-mix(hue 26%, --panel),
   so their white text flips to ink. Brand artwork and the white email frame stay literal. */
:root{
    --mp-accent-11:rgba(56, 189, 248, .11);
    --mp-amber-hover:#e89409;
    --mp-cal-deep:rgba(2, 6, 23, .74);
    --mp-cal-dim-04:rgba(15, 23, 42, .04);
    --mp-cal-dim-46:rgba(15, 23, 42, .46);
    --mp-cal-green-32:rgba(4, 28, 15, .32);
    --mp-cal-green-50:rgba(4, 28, 15, .5);
    --mp-cal-green-72:rgba(4, 28, 15, .72);
    --mp-cal-green-92:rgba(4, 28, 15, .92);
    --mp-cal-line:rgba(202, 219, 247, .04);
    --mp-cal-line-09:rgba(205, 225, 255, .09);
    --mp-cal-line-10:rgba(205, 225, 255, .10);
    --mp-cal-line-12:rgba(220, 235, 255, .12);
    --mp-cal-pop:rgba(5, 10, 24, .70);
    --mp-cal-pop-2:rgba(5, 10, 24, .72);
    --mp-cal-pop-3:rgba(8, 14, 30, .82);
    --mp-cal-scrim:rgba(2, 6, 23, .50);
    --mp-cal-sel:rgba(148, 197, 255, .16);
    --mp-cal-well:rgba(12, 23, 48, .58);
    --mp-cal-well-2:rgba(4, 9, 24, .54);
    --mp-chip-mix:#000;
    --mp-fill-075:rgba(255, 255, 255, .075);
    --mp-fill-09:rgba(255, 255, 255, .09);
    --mp-fill-35:rgba(255, 255, 255, .35);
    --mp-fill-92:rgba(255, 255, 255, .92);
    --mp-hl-00:rgba(0, 234, 94, 0);
    --mp-hl-42b:rgba(0, 234, 94, .42);
    --mp-ink-cal-head:#c7d7ef;
    --mp-ink-cal-hi:rgba(229, 249, 255, .76);
    --mp-ink-red-soft:#fecaca;
    --mp-ink-sky:#7dd3fc;
    --mp-sh-14b:rgba(0, 0, 0, .14);
    --mp-sh-26:rgba(0, 0, 0, .26);
    --mp-sh-40b:rgba(0, 0, 0, .4);
    --mp-sh-50b:rgba(0, 0, 0, .5);
    --mp-sh-55:rgba(0, 0, 0, .55);
    --mp-sh-60:rgba(0, 0, 0, .6);
}
html[data-mp-scheme="light"]{
    --mp-accent-11:rgba(2,132,199,.11);
    --mp-amber-hover:#b45309;
    --mp-cal-deep:rgba(255,255,255,.94);
    --mp-cal-dim-04:rgba(15,23,42,.04);
    --mp-cal-dim-46:rgba(15,23,42,.05);
    --mp-cal-green-32:rgba(4, 28, 15, .32);
    --mp-cal-green-50:rgba(4, 28, 15, .5);
    --mp-cal-green-72:rgba(4, 28, 15, .72);
    --mp-cal-green-92:rgba(4, 28, 15, .92);
    --mp-cal-line:rgba(15,23,42,.05);
    --mp-cal-line-09:rgba(15,23,42,.06);
    --mp-cal-line-10:rgba(15,23,42,.07);
    --mp-cal-line-12:rgba(15,23,42,.08);
    --mp-cal-pop:rgba(255,255,255,.97);
    --mp-cal-pop-2:rgba(255,255,255,.96);
    --mp-cal-pop-3:rgba(255,255,255,.95);
    --mp-cal-scrim:rgba(15,23,42,.30);
    --mp-cal-sel:rgba(2,132,199,.14);
    --mp-cal-well:rgba(15,23,42,.05);
    --mp-cal-well-2:rgba(15,23,42,.04);
    --mp-chip-mix:#ffffff;
    --mp-fill-075:rgba(15,23,42,.06);
    --mp-fill-09:rgba(15,23,42,.07);
    --mp-fill-35:rgba(15,23,42,.22);
    --mp-fill-92:rgba(15,23,42,.72);
    --mp-hl-00:rgba(0,184,79,0);
    --mp-hl-42b:rgba(0,150,64,.48);
    --mp-ink-cal-head:#334155;
    --mp-ink-cal-hi:#0f172a;
    --mp-ink-red-soft:#b91c1c;
    --mp-ink-sky:#0369a1;
    --mp-sh-14b:rgba(15,23,42,.05);
    --mp-sh-26:rgba(15,23,42,.10);
    --mp-sh-40b:rgba(15,23,42,.15);
    --mp-sh-50b:rgba(15,23,42,.18);
    --mp-sh-55:rgba(15,23,42,.20);
    --mp-sh-60:rgba(15,23,42,.22);
}

/* ----- avatar-module pairs ---------------------------------------------
   Avatars, the colour picker and the calendar team dropdown. */
:root{
    --mp-av-ring:rgba(2,6,23,.55);
    --mp-avatar-base:#000;
    --mp-fill-50:rgba(255, 255, 255, .5);
    --mp-fill-55:rgba(255, 255, 255, .55);
    --mp-ring-bg:#0f172a;
    --mp-sh-42:rgba(0,0,0,.42);
    --mp-violet:#a855f7;
}
html[data-mp-scheme="light"]{
    --mp-av-ring:rgba(255,255,255,.9);
    --mp-avatar-base:#ffffff;
    --mp-fill-50:rgba(15,23,42,.32);
    --mp-fill-55:rgba(15,23,42,.36);
    --mp-ring-bg:#ffffff;
    --mp-sh-42:rgba(15,23,42,.15);
    --mp-violet:#7e22ce;
}

/* ----- palette gaps ------------------------------------------------------
   calendar.css consumes var(--teal, #14b8a6) and var(--fuchsia, #d946ef). Neither token
   existed, so the FALLBACK painted -- a var() fallback is only dead code when the token
   is declared. Dark values are the former literals; light deepens the hue. */
:root{
    --teal:#14b8a6;
    --fuchsia:#d946ef;
}
html[data-mp-scheme="light"]{
    --teal:#0f766e;
    --fuchsia:#a21caf;
}

/* ----- tooltip -----------------------------------------------------------
   Dark values are the exact stop-colors alerts-runtime/component.js writes onto the
   SVG. On light the bubble becomes a white card so its ink can be dark. */
:root{
    --mp-tip-hi:rgb(43,51,66);
    --mp-tip-lo:rgb(31,38,52);
    --mp-tip-stroke:rgba(164,180,207,.30);
}
html[data-mp-scheme="light"]{
    --mp-tip-hi:#ffffff;
    --mp-tip-lo:#f1f5f9;
    --mp-tip-stroke:rgba(15,23,42,.14);
}

/* ----- attachments-module pairs ----------------------------------------
   Attachment rows, thumbs and the pending badge. */
:root{
    --mp-att-deep:rgba(8,13,28,.72);
    --mp-att-deep-2:rgba(8,13,28,.55);
    --mp-att-pending:rgba(15,23,42,.30);
    --mp-att-row:rgba(15,23,42,.42);
    --mp-att-row-2:rgba(15,23,42,.32);
    --mp-hl-50b:rgba(0,234,94,.5);
    --mp-hl-60b:rgba(0,234,94,.6);
    --mp-hl-70:rgba(0,234,94,.7);
    --mp-ink-att:#e5eefc;
    --mp-ink-att-blue:#2b9fe0;
    --mp-ink-att-hl:#eafff1;
    --mp-ink-att-violet:#9b6dff;
    --mp-slate-35:rgba(148,163,184,.35);
}
html[data-mp-scheme="light"]{
    --mp-att-deep:rgba(255,255,255,.94);
    --mp-att-deep-2:rgba(15,23,42,.05);
    --mp-att-pending:rgba(15,23,42,.035);
    --mp-att-row:rgba(15,23,42,.05);
    --mp-att-row-2:rgba(15,23,42,.04);
    --mp-hl-50b:rgba(0,150,64,.55);
    --mp-hl-60b:rgba(0,150,64,.68);
    --mp-hl-70:rgba(0,150,64,.78);
    --mp-ink-att:#1e293b;
    --mp-ink-att-blue:#0369a1;
    --mp-ink-att-hl:#047857;
    --mp-ink-att-violet:#6d28d9;
    --mp-slate-35:rgba(15,23,42,.30);
}

/* ----- ink on a saturated fill ------------------------------------------
   A glyph sitting on a status accent must stay light in BOTH schemes: the fill is
   saturated either way. --mp-ink-invert cannot do this job -- it flips to ink on
   light, which made the hovered status icon a dark glyph on indigo. */
:root{
    --mp-on-accent:#fff;
}
html[data-mp-scheme="light"]{
    --mp-on-accent:#fff;
}

/* ----- collapsed chat glyph ----------------------------------------------
   The speech-bubble mask is filled with the brand gradient. That is an ICON, not the
   logo, and the brand stops read 1.38:1 / 1.82:1 on the light pill. Light deepens them
   to 4.67:1 / 5.05:1. The chevron button beside it keeps the brand fill - it is a
   button with a near-black glyph, like the primary button. */
:root{
    --mp-chat-glyph:linear-gradient(135deg, rgb(0, 234, 94), rgb(56, 189, 248));
}
html[data-mp-scheme="light"]{
    --mp-chat-glyph:linear-gradient(135deg, #047857, #0369a1);
}
/* Session-type accent tints + neutral/flash steps (Tasks Sessions panel; lifts with the
   future task-sessions component). Dark = the exact former sessions.css literals so dark is
   computed-identical; light = the darker light-palette hue at matching alpha, keeping the
   per-type coding legible on the light canvas. */
:root{
    --mp-violet-06:rgba(139,92,246,.06);
    --mp-violet-14:rgba(139,92,246,.14);
    --mp-violet-16:rgba(139,92,246,.16);
    --mp-violet-45:rgba(139,92,246,.45);
    --mp-violet-50:rgba(139,92,246,.5);
    --mp-violet-60:rgba(139,92,246,.6);
    --mp-violet-70:rgba(139,92,246,.7);
    --mp-sky-05:rgba(14,165,233,.05);
    --mp-sky-06:rgba(14,165,233,.06);
    --mp-sky-10:rgba(14,165,233,.10);
    --mp-sky-16:rgba(14,165,233,.16);
    --mp-sky-42:rgba(14,165,233,.42);
    --mp-sky-45:rgba(14,165,233,.45);
    --mp-sky-50:rgba(14,165,233,.5);
    --mp-sky-60:rgba(14,165,233,.6);
    --mp-sky-70:rgba(14,165,233,.7);
    --mp-amber-06:rgba(245,158,11,.06);
    --mp-amber-08:rgba(245,158,11,.08);
    --mp-amber-45:rgba(245,158,11,.45);
    --mp-amber-50:rgba(245,158,11,.5);
    --mp-teal-06:rgba(20,184,166,.06);
    --mp-teal-45:rgba(20,184,166,.45);
    --mp-fuchsia-06:rgba(217,70,239,.06);
    --mp-fuchsia-45:rgba(217,70,239,.45);
    --mp-pink-06:rgba(255,107,138,.06);
    --mp-pink-45:rgba(255,107,138,.45);
    --mp-red-40:rgba(244,63,94,.4);
    --mp-hl-04:rgba(0,234,94,.04);
    --mp-slate-05:rgba(148,163,184,.05);
    --mp-slate-45:rgba(148,163,184,.45);
}
html[data-mp-scheme="light"]{
    --mp-violet-06:rgba(109,40,217,.06);
    --mp-violet-14:rgba(109,40,217,.14);
    --mp-violet-16:rgba(109,40,217,.16);
    --mp-violet-45:rgba(109,40,217,.45);
    --mp-violet-50:rgba(109,40,217,.5);
    --mp-violet-60:rgba(109,40,217,.6);
    --mp-violet-70:rgba(109,40,217,.7);
    --mp-sky-05:rgba(2,132,199,.05);
    --mp-sky-06:rgba(2,132,199,.06);
    --mp-sky-10:rgba(2,132,199,.10);
    --mp-sky-16:rgba(2,132,199,.16);
    --mp-sky-42:rgba(2,132,199,.42);
    --mp-sky-45:rgba(2,132,199,.45);
    --mp-sky-50:rgba(2,132,199,.5);
    --mp-sky-60:rgba(2,132,199,.6);
    --mp-sky-70:rgba(2,132,199,.7);
    --mp-amber-06:rgba(180,83,9,.06);
    --mp-amber-08:rgba(180,83,9,.08);
    --mp-amber-45:rgba(180,83,9,.45);
    --mp-amber-50:rgba(180,83,9,.5);
    --mp-teal-06:rgba(13,148,136,.06);
    --mp-teal-45:rgba(13,148,136,.45);
    --mp-fuchsia-06:rgba(192,38,211,.06);
    --mp-fuchsia-45:rgba(192,38,211,.45);
    --mp-pink-06:rgba(190,24,93,.06);
    --mp-pink-45:rgba(190,24,93,.45);
    --mp-red-40:rgba(225,29,72,.4);
    --mp-hl-04:rgba(0,184,79,.06);
    --mp-slate-05:rgba(15,23,42,.04);
    --mp-slate-45:rgba(15,23,42,.38);
}
/* Dashboard overview accents + value/label ink (dashboard module; brand-blue accent
   alpha steps on the existing --mp-accent hue, plus the two near-white text shades used
   for stat values and accent-chip labels). Dark = the exact former literals; light = the
   darker sky base 2,132,199 and dark ink so the figures stay legible on the light canvas. */
:root{
    --mp-accent-30:rgba(56,189,248,.30);
    --mp-accent-35:rgba(56,189,248,.35);
    --mp-accent-55:rgba(56,189,248,.55);
    --mp-ink-accent-soft:#e0f2fe;
    --mp-ink-value:#f1f5f9;
}
html[data-mp-scheme="light"]{
    --mp-accent-30:rgba(2,132,199,.30);
    --mp-accent-35:rgba(2,132,199,.35);
    --mp-accent-55:rgba(2,132,199,.55);
    --mp-ink-accent-soft:#0369a1;
    --mp-ink-value:#0f172a;
}
/* Mail-service module accents (mail-service.css + notifications.css). Two new hue families:
   mint 81,196,138 (sent/success soft tints) -> light emerald 5,150,105; indigo 99,102,241 (mail
   accent) -> light 67,56,202; plus ink-indigo #a5b4fc, sh-12, hl-36, violet-35, sky-22 and the
   fill-18/25/34 hover steps. Dark = the exact former literals; light = darker hue / slate at
   matching intensity. Email/block preview canvases (#fff) and dark glyphs stay literal. */
:root{
    --mp-sky-22:rgba(14,165,233,.22);
    --mp-fill-18:rgba(255,255,255,.18);
    --mp-fill-25:rgba(255,255,255,.25);
    --mp-fill-34:rgba(255,255,255,.34);
    --mp-ink-indigo:#a5b4fc;
    --mp-sh-12:rgba(0,0,0,.12);
    --mp-hl-36:rgba(0,234,94,.36);
    --mp-violet-35:rgba(139,92,246,.35);
    --mp-mint-045:rgba(81,196,138,.045);
    --mp-mint-06:rgba(81,196,138,.06);
    --mp-mint-20:rgba(81,196,138,.20);
    --mp-mint-22:rgba(81,196,138,.22);
    --mp-mint-26:rgba(81,196,138,.26);
    --mp-indigo-05:rgba(99,102,241,.05);
    --mp-indigo-16:rgba(99,102,241,.16);
    --mp-indigo-20:rgba(99,102,241,.20);
    --mp-indigo-34:rgba(99,102,241,.34);
}
html[data-mp-scheme="light"]{
    --mp-sky-22:rgba(2,132,199,.22);
    --mp-fill-18:rgba(15,23,42,.10);
    --mp-fill-25:rgba(15,23,42,.15);
    --mp-fill-34:rgba(15,23,42,.21);
    --mp-ink-indigo:#4338ca;
    --mp-sh-12:rgba(15,23,42,.04);
    --mp-hl-36:rgba(0,184,79,.42);
    --mp-violet-35:rgba(109,40,217,.35);
    --mp-mint-045:rgba(5,150,105,.045);
    --mp-mint-06:rgba(5,150,105,.06);
    --mp-mint-20:rgba(5,150,105,.20);
    --mp-mint-22:rgba(5,150,105,.22);
    --mp-mint-26:rgba(5,150,105,.26);
    --mp-indigo-05:rgba(67,56,202,.05);
    --mp-indigo-16:rgba(67,56,202,.16);
    --mp-indigo-20:rgba(67,56,202,.20);
    --mp-indigo-34:rgba(67,56,202,.34);
}
/* Feedback module accents (feedback.css). New info blue family 96,165,250 (feature/planned
   badges) -> light 29,78,216, with ink-info #bfdbfe -> #1d4ed8; rose priority tints 08/24/25/72;
   translucent ink-strong 70/86 (message text); slate-07 and amber-26. Dark = the exact former
   literals; light = darker hue / dark ink at matching intensity. Hardcoded brand-green foregrounds
   now route through --mp-ink-brand (dark #00EA5E -> light #047857); the trigger gradient stays literal. */
:root{
    --mp-slate-07:rgba(148,163,184,.07);
    --mp-amber-26:rgba(245,158,11,.26);
    --mp-ink-strong-70:rgba(248,250,252,.7);
    --mp-ink-strong-86:rgba(248,250,252,.86);
    --mp-rose-08:rgba(251,113,133,.08);
    --mp-rose-24:rgba(251,113,133,.24);
    --mp-rose-25:rgba(251,113,133,.25);
    --mp-rose-72:rgba(251,113,133,.72);
    --mp-info-07:rgba(96,165,250,.07);
    --mp-info-24:rgba(96,165,250,.24);
    --mp-ink-info:#bfdbfe;
}
html[data-mp-scheme="light"]{
    --mp-slate-07:rgba(15,23,42,.04);
    --mp-amber-26:rgba(180,83,9,.28);
    --mp-ink-strong-70:rgba(15,23,42,.7);
    --mp-ink-strong-86:rgba(15,23,42,.86);
    --mp-rose-08:rgba(225,29,72,.07);
    --mp-rose-24:rgba(225,29,72,.21);
    --mp-rose-25:rgba(225,29,72,.22);
    --mp-rose-72:rgba(225,29,72,.62);
    --mp-info-07:rgba(29,78,216,.07);
    --mp-info-24:rgba(29,78,216,.24);
    --mp-ink-info:#1d4ed8;
}
/* Saved-views module accents (saved-views.css). slate-50/60 (dashed swatch + borders);
   well-35 recessed backing rgba(2,6,23,.35) -> faint slate; swatch-ring rgba(2,6,23,.9) inner
   gap -> light rgba(255,255,255,.9) (matches avatar-ring); red-10 error fill; ink-danger-2 #fda4af
   -> #be123c. Brand-green foreground routes through --mp-ink-brand; the active-tab gradient and the
   dark glyph-on-brand literals (#06111d/#06131c, dirty-dot) stay literal. Dark byte-identical. */
:root{
    --mp-slate-50:rgba(148,163,184,.5);
    --mp-slate-60:rgba(148,163,184,.6);
    --mp-well-35:rgba(2,6,23,.35);
    --mp-swatch-ring:rgba(2,6,23,.9);
    --mp-red-10:rgba(244,63,94,.1);
    --mp-ink-danger-2:#fda4af;
}
html[data-mp-scheme="light"]{
    --mp-slate-50:rgba(15,23,42,.42);
    --mp-slate-60:rgba(15,23,42,.48);
    --mp-well-35:rgba(15,23,42,.04);
    --mp-swatch-ring:rgba(255,255,255,.9);
    --mp-red-10:rgba(225,29,72,.08);
    --mp-ink-danger-2:#be123c;
}
/* File-transfers admin accent (file-transfers.css). accent-32 rgba(56,189,248,.32) ->
   light rgba(2,132,199,.32) for the info-badge border. The .transfer-landing-* preview rules
   are intentionally theme-independent and were left literal (kept dark in the admin preview). */
:root{
    --mp-accent-32:rgba(56,189,248,.32);
}
html[data-mp-scheme="light"]{
    --mp-accent-32:rgba(2,132,199,.32);
}
/* Icons-admin dev tool (icons-admin.css). Status/label inks green-2 #4ade80 -> #15803d and
   red-2 #f87171 -> #b91c1c (+ red4 tints); slate-75; amber-20/35/40 and accent-20/40 tile borders.
   The .mp-icon-pv-dark / .mp-icon-pv-light fixed preview swatches are kept literal (they show an
   icon on dark AND light regardless of the app scheme). Dark byte-identical. */
:root{
    --mp-ink-green-2:#4ade80;
    --mp-ink-red-2:#f87171;
    --mp-slate-75:rgba(148,163,184,.75);
    --mp-amber-20:rgba(245,158,11,.2);
    --mp-amber-35:rgba(245,158,11,.35);
    --mp-amber-40:rgba(245,158,11,.4);
    --mp-accent-20:rgba(56,189,248,.2);
    --mp-accent-40:rgba(56,189,248,.4);
    --mp-red4-10:rgba(248,113,113,.1);
    --mp-red4-30:rgba(248,113,113,.3);
}
html[data-mp-scheme="light"]{
    --mp-ink-green-2:#15803d;
    --mp-ink-red-2:#b91c1c;
    --mp-slate-75:rgba(15,23,42,.58);
    --mp-amber-20:rgba(180,83,9,.22);
    --mp-amber-35:rgba(180,83,9,.37);
    --mp-amber-40:rgba(180,83,9,.42);
    --mp-accent-20:rgba(2,132,199,.2);
    --mp-accent-40:rgba(2,132,199,.4);
    --mp-red4-10:rgba(185,28,28,.08);
    --mp-red4-30:rgba(185,28,28,.28);
}
/* Buttons-admin dev catalog (buttons-admin.css). Metadata label inks: slate1/2/3 (#8aa0b6/#9fb2c8/
   #aeb9c9 -> slate-600/mid/500), ink-sky-2 #bae6fd -> #0369a1, ink-violet-2 #d8b4fe -> #6d28d9,
   ink-amber-3 #fcd34d -> #b45309; plus violet-26 and danger-red tints red-14/26/34. Dark byte-
   identical. Final surface of the light/dark scheme programme. */
:root{
    --mp-ink-slate1:#8aa0b6;
    --mp-ink-slate2:#9fb2c8;
    --mp-ink-slate3:#aeb9c9;
    --mp-ink-sky-2:#bae6fd;
    --mp-ink-violet-2:#d8b4fe;
    --mp-ink-amber-3:#fcd34d;
    --mp-violet-26:rgba(139,92,246,.26);
    --mp-red-14:rgba(244,63,94,.14);
    --mp-red-26:rgba(244,63,94,.26);
    --mp-red-34:rgba(244,63,94,.34);
}
html[data-mp-scheme="light"]{
    --mp-ink-slate1:#475569;
    --mp-ink-slate2:#5b6b7f;
    --mp-ink-slate3:#64748b;
    --mp-ink-sky-2:#0369a1;
    --mp-ink-violet-2:#6d28d9;
    --mp-ink-amber-3:#b45309;
    --mp-violet-26:rgba(109,40,217,.26);
    --mp-red-14:rgba(225,29,72,.14);
    --mp-red-26:rgba(225,29,72,.26);
    --mp-red-34:rgba(225,29,72,.34);
}
/* Code-editor chrome (code-editor.css). The find/replace toolbar is app chrome and flips to
   light: code-bar-bg rgba(15,23,42,.48) -> light rgba(15,23,42,.04), code-field-bg -> #ffffff,
   hl-38 focus ring. code-surface KEEPS the code textarea/pane dark in light mode (opaque #0b1120),
   matching the material-darker CodeMirror pane. Dark byte-identical. */
:root{
    --mp-code-bar-bg:rgba(15,23,42,.48);
    --mp-code-field-bg:rgba(2,6,23,.62);
    --mp-code-surface:rgba(2,6,23,.72);
    --mp-hl-38:rgba(0,234,94,.38);
}
html[data-mp-scheme="light"]{
    --mp-code-bar-bg:rgba(15,23,42,.04);
    --mp-code-field-bg:#ffffff;
    --mp-code-surface:#0b1120;
    --mp-hl-38:rgba(0,150,64,.38);
}
/* Updates page (modules/updates/views/updates.php inline style). amber-05 backs the is-database
   toggle tint; the rest of the core-export pills/summary route through existing ink/slate/amber
   tokens so they flip in light mode instead of rendering light-on-light. Dark byte-identical. */
:root{
    --mp-amber-05:rgba(245,158,11,.05);
}
html[data-mp-scheme="light"]{
    --mp-amber-05:rgba(180,83,9,.05);
}
/* Intent-button leading-icon accent (buttons.css .btn--danger/success/warning .mp-icon). The icon
   takes the saturated accent; in light mode the plain --red/--green/--amber only flip to mid-tones
   that wash out on the pale button, so these flip DARK (like the label ink) for contrast. Dark
   byte-identical (matches --red/--green/--amber dark). */
:root{
    --mp-btn-accent-danger:#f43f5e;
    --mp-btn-accent-success:#00ea5e;
    --mp-btn-accent-warning:#f59e0b;
}
html[data-mp-scheme="light"]{
    --mp-btn-accent-danger:#be123c;
    --mp-btn-accent-success:#065f46;
    --mp-btn-accent-warning:#92400e;
}
/* Contacts PRIMARY-tag tints (contacts.css .mpdg-primary-tag). Sky-300 base (#7dd3fc) tints, distinct
   from the sky-500 --mp-sky-N family; light flips to the sky-600 base so the chip reads on white.
   Dark byte-identical. */
:root{
    --mp-sky3-12:rgba(125,211,252,.12);
    --mp-sky3-30:rgba(125,211,252,.30);
}
html[data-mp-scheme="light"]{
    --mp-sky3-12:rgba(2,132,199,.12);
    --mp-sky3-30:rgba(2,132,199,.30);
}

/* ── MPNotify dialogs and toasts ─────────────────────────────────────────────
   MOVED HERE FROM alerts-runtime IN v1.12.490, following MPNotify itself into
   app/assets/mp-core.js. A theme component can be disabled; the platform's only dialog cannot be
   allowed to render unstyled because somebody switched a layer off. Everything below is verbatim
   from its previous home except .mp-alert-field / .mp-alert-input, which are new and belong to the
   prompt variant that replaced the last window.prompt() call site. */
/* Global Nice Alerts v1.10.0 */
.mp-notify-root{
    position:fixed;
    inset:0;
    z-index:2147483000;
    pointer-events:none;
    font-family:inherit;
}

.mp-alert-backdrop{
    position:fixed;
    inset:0;
    display:flex;
    align-items:center;
    justify-content:center;
    padding:24px;
    background:var(--mp-backdrop-soft);
    backdrop-filter:blur(10px);
    -webkit-backdrop-filter:blur(10px);
    pointer-events:auto;
    animation:mpAlertFadeIn .14s ease-out;
}

.mp-alert-dialog{
    width:min(460px, calc(100vw - 36px));
    border:1px solid var(--mp-slate-22);
    border-radius:18px;
    background:
        radial-gradient(circle at 100% 100%, var(--mp-hl-10), transparent 40%),
        linear-gradient(180deg, var(--mp-panel-98), var(--mp-dialog));
    color:var(--mp-ink-btn);
    box-shadow:0 24px 80px var(--mp-sh-45), inset 0 1px 0 var(--mp-fill-06);
    overflow:hidden;
    transform:translateY(0) scale(1);
    animation:mpAlertPop .16s ease-out;
}

.mp-alert-header{
    display:flex;
    align-items:center;
    gap:12px;
    padding:20px 20px 0;
}

.mp-alert-icon{
    width:38px;
    height:38px;
    display:inline-flex;
    align-items:center;
    justify-content:center;
    border-radius:12px;
    background:var(--mp-hl-10);
    border:1px solid var(--mp-hl-24);
    color:var(--mp-ink-brand);
    font-weight:var(--mp-fw-black,900);
    line-height:var(--mp-lh-none,1);
    flex:0 0 auto;
}

.mp-alert-icon.is-danger{
    background:var(--mp-pink-10);
    border-color:var(--mp-pink-24);
    color:var(--pink);
}

/* Warning without destruction: the dialog cautions about a state while its primary action fixes it.
   Amber, the same amber a stale session wears on the block and in the drawer — one meaning per
   colour across the platform: this wants something from you. */
.mp-alert-icon.is-warn{
    background:var(--mp-amber-10,rgba(245,158,11,.10));
    border-color:var(--mp-amber-24,rgba(245,158,11,.24));
    color:var(--amber,#f59e0b);
}

.mp-alert-title{
    margin:0;
    font-size:var(--mp-fs-xl,18px);
    font-weight:var(--mp-fw-black,900);
    line-height:var(--mp-lh-snug,1.25);
}

.mp-alert-body{
    padding:14px 20px 18px;
    color:var(--mp-ink-soft);
    font-size:var(--mp-fs-md,14px);
    font-weight:var(--mp-fw-bold,700);
    line-height:var(--mp-lh-normal,1.4);
    white-space:pre-wrap;
    word-break:break-word;
}

/* A LIST as the subject, rather than a sentence. Capped at roughly five rows and scrolled, so a
   dialog reporting thirty-five open sessions stays a dialog instead of becoming a page. */
.mp-alert-list{
    margin:12px 0 0;
    max-height:190px;
    overflow-y:auto;
    border:1px solid var(--border,rgba(202,219,247,.14));
    border-radius:var(--radius,5px);
}

.mp-alert-list-row{
    display:flex;
    align-items:center;
    gap:10px;
    padding:7px 10px;
    font-weight:var(--mp-fw-regular,400);
}

.mp-alert-list-row + .mp-alert-list-row{
    border-top:1px solid var(--mp-fill-05,rgba(255,255,255,.05));
}

.mp-alert-list-txt{
    flex:1 1 auto;
    min-width:0;
    font-size:var(--mp-fs-sm,13px);
    color:var(--mp-ink-invert,#fff);
    white-space:nowrap;
    overflow:hidden;
    text-overflow:ellipsis;
}

.mp-alert-list-fig{
    flex:0 0 auto;
    font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
    font-size:var(--mp-fs-xs,12px);
    font-variant-numeric:tabular-nums;
    color:var(--mp-ink-invert,#fff);
}

.mp-alert-actions{
    display:flex;
    justify-content:flex-end;
    gap:10px;
    padding:14px 20px 20px;
    border-top:1px solid var(--mp-slate-12);
}
/* Stacked variant for multi-action confirms (MPNotify.choose): full-width buttons,
   primary/danger actions on top, Cancel at the bottom. */
.mp-alert-actions.is-stacked{
    flex-direction:column;
    align-items:stretch;
    justify-content:stretch;
}
.mp-alert-actions.is-stacked .mp-alert-btn{
    width:100%;
    text-align:center;
}

.mp-alert-btn{
    min-height:38px;
    padding:0 16px;
    border-radius:10px;
    border:1px solid var(--mp-slate-24);
    background:var(--mp-fill-055);
    color:var(--mp-ink-btn);
    font:inherit;
    font-size:var(--mp-fs-base,13px);
    font-weight:var(--mp-fw-black,900);
    cursor:pointer;
    transition:background .15s ease,border-color .15s ease,transform .15s ease;
}

.mp-alert-btn:hover{
    background:var(--mp-fill-085);
    border-color:var(--mp-slate-38);
    transform:translateY(-1px);
}

.mp-alert-btn.is-primary{
    border-color:var(--mp-hl-30);
    background:var(--mp-hl-12);
    color:var(--mp-ink-hl-soft);
}

.mp-alert-btn.is-danger{
    border-color:var(--mp-pink-30);
    background:var(--mp-pink-12);
    color:var(--mp-ink-danger-strong);
}

.mp-toast-stack{
    position:fixed;
    right:20px;
    bottom:20px;
    display:flex;
    flex-direction:column;
    gap:10px;
    pointer-events:none;
}

.mp-toast{
    width:min(420px, calc(100vw - 40px));
    padding:14px 16px;
    border-radius:14px;
    border:1px solid var(--mp-slate-20);
    background:var(--mp-choice-hi);
    color:var(--mp-ink-btn);
    box-shadow:0 16px 50px var(--mp-sh-34), inset 0 1px 0 var(--mp-fill-06);
    backdrop-filter:blur(10px);
    -webkit-backdrop-filter:blur(10px);
    font-size:var(--mp-fs-base,13px);
    font-weight:var(--mp-fw-heavy,800);
    line-height:var(--mp-lh-normal,1.4);
    animation:mpToastIn .16s ease-out;
    pointer-events:auto;
}

/* A toast that carries an action lays the label and the button on one row; the button is a
   quiet inline affordance, not a second primary — it is a way back, not a next step. */
.mp-toast.has-action{
    display:flex;
    align-items:center;
    gap:14px;
}

.mp-toast.has-action .mp-toast-text{
    flex:1 1 auto;
    min-width:0;
}

.mp-toast-action{
    flex:0 0 auto;
    appearance:none;
    border:1px solid var(--mp-slate-20);
    border-radius:999px;
    padding:5px 13px;
    background:var(--mp-fill-06);
    color:var(--mp-ink-btn);
    font-family:inherit;
    font-size:var(--mp-fs-sm,12px);
    font-weight:var(--mp-fw-heavy,800);
    line-height:1;
    cursor:pointer;
    transition:background .12s ease, border-color .12s ease;
}

.mp-toast-action:hover{
    background:var(--mp-fill-12);
    border-color:var(--mp-slate-30);
}

.mp-toast-action:focus-visible{
    outline:2px solid var(--mp-brand-ring,#38bdf8);
    outline-offset:2px;
}

@keyframes mpAlertFadeIn{from{opacity:0}to{opacity:1}}
@keyframes mpAlertPop{from{opacity:0;transform:translateY(10px) scale(.97)}to{opacity:1;transform:translateY(0) scale(1)}}
@keyframes mpToastIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}
/* The prompt variant's text field. Same control language as forms-controls' inputs rather than a
   bespoke one: this is a dialog with an input in it, not a new kind of input. */
.mp-alert-field{
    padding:0 1.25rem .25rem;
}
.mp-alert-input{
    width:100%;
    box-sizing:border-box;
    padding:.55rem .7rem;
    border-radius:var(--radius,5px);
    border:1px solid var(--mp-border,#1e293b);
    background:var(--mp-surface-2,#0b1522);
    color:var(--mp-text,#e2e8f0);
    font:inherit;
    font-size:.9rem;
}
.mp-alert-input:focus{
    outline:2px solid var(--mp-brand-ring,#38bdf8);
    outline-offset:1px;
    border-color:transparent;
}
