/* ============================================================================
 * Frihat Lawyers & Consultants — SIGNED-OUT SCREENS component layer
 * ────────────────────────────────────────────────────────────────────────────
 * SCOPE — TWO CONSUMERS SINCE 2026-08-03, AND THE SECOND ONE IS WHY THE TITLE
 * OF THIS FILE CHANGED
 *
 *   1. Pages/Account/Login.cshtml. That page sets Layout = null, so it never
 *      receives the LeptonX global style bundle. It therefore links the platform
 *      layers it actually needs BY HAND, in the same order the bundle
 *      concatenates them, and this file loads last as the COMPONENT layer.
 *
 *   2. Themes/LeptonXLite/Layouts/Account.cshtml — the FLP override of the
 *      theme's account layout, which serves /Account/ForgotPassword,
 *      /Account/ResetPassword, /Account/Register and /Account/AccessDenied.
 *      Those pages were the whole unbranded half of the signed-out flow: a user
 *      who clicked "forgot password?" left the branded card and landed on the
 *      theme's generic logo-plus-two-cards composition. That layout now renders
 *      the SAME .frihat-login-card / .frihat-login-band / .frihat-login-body
 *      markup and links this file, so the two screens cannot drift.
 *
 *   THE TWO CONSUMERS DIFFER IN WHAT LOADS BEFORE THIS FILE, AND THAT IS THE
 *   ONLY THING TO KEEP IN MIND WHEN EDITING IT. Login links five platform layers
 *   by hand (00, 01, 04, 05, 08); the account layout gets the FULL bundle,
 *   00-tokens through 11-home plus the LeptonX shell overrides. So a rule here
 *   competes with more on the account pages than it does on Login. Nothing below
 *   currently depends on that difference: the canvas is identical on both (see
 *   section 2), and no frihat layer styles .abp-account-layout at all.
 *
 *   It defines no tokens of its own and writes no literal colour.
 *
 * ══ WHAT CHANGED ON 2026-08-03, AND WHY IT IS THE WHOLE POINT ══════════════
 *
 * THE PAGE WAS RUNNING A FIELD SYSTEM, A BUTTON SYSTEM AND AN ALERT SYSTEM OF
 * ITS OWN, by omission rather than by intent. It linked 00-tokens and 01-base
 * and nothing else, so:
 *
 *   · 05-forms.css never reached it. The fields fell back to 01-base's bare
 *     element rules, which are a FLOOR for pages no component layer has touched,
 *     not the platform field. They carry no fx-ctl-* locals, so no size step
 *     applies, the inline padding is the 16px button step rather than the 12px
 *     field step, there is no validation treatment, no reserved message row and
 *     NO AUTOFILL SUPPRESSION — which is why a Chrome-autofilled username on
 *     this screen rendered in the browser's own pale blue, in both themes, on
 *     the one screen every user sees first. That is precisely the class of
 *     defect the client described as fields "from another planet", and here it
 *     was on the front door.
 *   · 04-buttons.css never reached it, so section 6 of this file WAS the
 *     primary button: a bespoke reimplementation that had already drifted. It
 *     drove hover with a colour swap to fx-color-primary-hover, while the
 *     platform button drives hover with a brightness FILTER and deliberately
 *     pins the hover colour to the resting one; it set the button's shadow to
 *     none, while the platform primary rests on fx-shadow-stack; and it wrote
 *     its own press transform beside the platform's fx-btn-press-scale.
 *   · 08-feedback.css never reached it, so section 9 painted the SUPERSEDED
 *     tinted alert — a danger fill, a danger border and danger body text. The
 *     platform alert is a NEUTRAL panel whose only coloured parts are the icon
 *     and the heading, and 00-tokens 3.9 lists an alert surface on the FORBIDDEN
 *     list in its own right.
 *
 * THE FIX IS THE LINKS, NOT MORE CSS HERE. Login.cshtml now links 00-tokens,
 * 01-base, 04-buttons, 05-forms and 08-feedback, in bundle order, and this file
 * DELETED the three local systems that were standing in for them. What is left
 * is genuinely login-only: the page canvas, the card, the brand band, and the
 * four classes the Razor page names.
 *
 * ══ WHAT WAS REMOVED EARLIER, AND STAYS REMOVED ════════════════════════════
 *
 *   The frozen hex palette that once restated twenty-five tokens as a "fallback"
 *   and had already drifted from 00-tokens; the LeptonX bridge and the
 *   lpx-brand-logo swap, neither of which has markup to act on here; the
 *   per-language font-family switch, owned by 01-base section 3; the Arabic
 *   font-scale compensation, which the token layer sets to 1 in both languages;
 *   the navy scrim over /frihat/login-bg.jpg, a colour that predates the olive
 *   brand over an image the rest of the product never shows. login-bg.jpg is
 *   unreferenced and has NOT been deleted; if the photograph is ever wanted
 *   back it belongs behind var(fx-color-scrim), which is the token for that job.
 *
 * SPECIFICITY
 *   Nothing here needs to out-specify an inline style, because Login.cshtml has
 *   zero inline style and zero inline script (CLAUDE.md 2.7 — no inline pattern
 *   that would block a future CSP). What is left has to beat BOOTSTRAP, which it
 *   does on class count alone. No !important is used anywhere in this file.
 *
 * WHAT THE LINKED LAYERS ALREADY DO — DO NOT RESTATE ANY OF IT HERE
 *   01-base   body font, size, leading, tracking, ink and canvas; ::selection;
 *             and THE ONE focus indicator for the whole platform, a 2px outline
 *             at 2px offset on :focus-visible.
 *   04-buttons  every button shape, size step, state and the primary fill.
 *   05-forms  the fx-ctl-* field contract, the size steps, the well, the focus
 *             brighten, autofill suppression, labels, checkboxes, validation.
 *   08-feedback  the alert panel, its icon slot and its severity variants.
 *   A rule below that touches any of those exists ONLY to place the component on
 *   this page, never to restyle it.
 *
 * ══ 2026-08-14: TWO CORRECTIONS AND ONE NEW SECTION ════════════════════════
 *
 * THE CANVAS FIGURES IN SECTIONS 2, 3 AND 4 WERE MEASURED AGAINST A CANVAS THAT
 * NO LONGER EXISTS. They were taken on 2026-08-03 against
 * fx-color-surface-sunken. On 2026-08-04 01-base line 243 moved the document
 * canvas to fx-color-shell on the client's own instruction, and in LIGHT that
 * token resolves to green-800 — the same value fx-color-primary resolves to. So
 * every "vs the page behind the card" cell in those sections is stale, and one
 * consequence was a real visual defect rather than a rounding error:
 *
 *     LIGHT, before this change:  band fill #145a32 on canvas #145a32 = 1.000:1
 *
 * The brand band and the page were the SAME COLOUR, so the head of the card
 * dissolved into the canvas and the card read as a white sheet with a bite taken
 * out of the top. Section 11 fixes that for the sign-in screen by deepening its
 * brand pane in light only, and re-measures both themes. THE FIGURES STATED IN
 * SECTIONS 2, 3 AND 4 ARE LEFT AS WRITTEN, because they are the record of what
 * was measured on that date and against what; read them with this note.
 *
 * THE 05-forms HERO STEP IS NO LONGER INERT. Sections 6 and the Razor page both
 * record that the 44px step could not reach an input because section 1 of that
 * file sets the fx-ctl locals at (0,1,1) and every size class was a single class
 * at (0,1,0). 05-forms was repaired on 2026-08-07: section 1b now DOUBLES every
 * rung, so .form-control-lg.form-control-lg is (0,2,0) and clears it. The
 * sign-in screen therefore opts into the published step and forks nothing. The
 * account-layout card in section 6 still takes the unclassed 40px default and is
 * left alone deliberately: those screens are not hero forms.
 *
 * DO NOT
 *   rename any class defined here. frihat-login-card, frihat-login-band,
 *   frihat-login-wordmark, frihat-login-body, logo, title, forgot-link,
 *   frihat-lang-switch and frihat-alert are referenced from Login.cshtml, and
 *   all but forgot-link and frihat-alert are referenced a second time from
 *   Themes/LeptonXLite/Layouts/Account.cshtml. A rename now costs two files.
 *   The frihat-auth-* family added in section 11 has ONE consumer, Login.cshtml,
 *   and every one of its rules is written as a COMPOUND with the frihat-login-*
 *   class it refines — .frihat-login-card.frihat-auth, not .frihat-auth — so the
 *   composed screen is a modifier on the shared card rather than a second card.
 *   That is why the account layout inherits none of section 11 and needed no
 *   edit, and it is also what makes the specificity unambiguous instead of
 *   settled by source order.
 *   Do not add @import or @font-face; the IBM Plex faces are linked from the
 *   page head, self-hosted. NOTHING on this page may reference an external host:
 *   it is the one page an unauthenticated visitor always reaches, so a
 *   third-party request here would disclose the client IP of every sign-in
 *   attempt before any credential is entered.
 *
 * RTL
 *   Logical properties throughout. Nothing below needs a direction-specific
 *   rule, including the band and the language switcher.
 * ========================================================================== */


/* ── 1) Bootstrap bridge — THE LOGIN-PAGE SUBSET OF 03-leptonx SECTION 2 ────
 *
 * 03-leptonx.css owns the Bootstrap variable bridge for the platform. It is not
 * linked here — it is 196KB of shell overrides for a page with no shell — so the
 * handful of hooks this page can actually exercise are restated. THE VALUES ARE
 * COPIED FROM THAT FILE RATHER THAN CHOSEN AGAIN, and three of them had drifted:
 *
 *   bs-body-color        was fx-color-text-muted, the BODY tier. 03-leptonx maps
 *                        it to fx-color-text. The muted name is a trap: it is
 *                        10.4:1 content ink, not a dim grade.
 *   bs-border-color      was fx-color-border, the TRANSLUCENT family. That family
 *                        is for the edge of a floating surface; an in-flow rule
 *                        takes the OPAQUE family, fx-color-divider. 00-tokens 2.3
 *                        is explicit that the two are not interchangeable.
 *   bs-focus-ring-color  was transparent, which was correct while this page had
 *                        to suppress a Bootstrap glow it could not otherwise
 *                        reach. It no longer does: 04-buttons and 05-forms both
 *                        neutralise the vendor ring themselves, so pinning the
 *                        hook to the platform ring is now strictly better — a
 *                        Bootstrap control nobody has styled focuses in the
 *                        platform's own indicator instead of in nothing at all.
 *
 * bs-primary is deliberately NOT mapped to a fill anywhere. 03-leptonx records
 * why it is safe: Bootstrap 5.3 .btn-primary reads its own bs-btn-* locals and
 * never consults bs-primary, so this hook recolours no surface. It is kept
 * because utility classes such as .text-primary do read it.
 * ──────────────────────────────────────────────────────────────────────── */
:root {
    --bs-body-color:       var(--fx-color-text);
    --bs-body-bg:          var(--fx-color-level-0);
    --bs-secondary-color:  var(--fx-color-text-subtle);
    --bs-tertiary-color:   var(--fx-color-text-faint);
    --bs-secondary-bg:     var(--fx-color-level-2);
    --bs-tertiary-bg:      var(--fx-color-level-1);

    --bs-border-color:             var(--fx-color-divider);
    --bs-border-color-translucent: var(--fx-color-border);
    --bs-border-width:             var(--fx-border-width);

    --bs-border-radius:      var(--fx-radius-md);
    --bs-border-radius-sm:   var(--fx-radius-xs);
    --bs-border-radius-lg:   var(--fx-radius-lg);
    --bs-border-radius-pill: var(--fx-radius-control);

    --bs-primary:          var(--fx-color-primary);
    --bs-primary-rgb:      var(--fx-color-primary-rgb);
    --bs-link-color:       var(--fx-color-link);
    --bs-link-hover-color: var(--fx-color-link-hover);
    --bs-link-color-rgb:   var(--fx-color-link-rgb);

    --bs-focus-ring-width:   var(--fx-focus-width);
    --bs-focus-ring-opacity: 1;
    --bs-focus-ring-color:   var(--fx-color-focus-ring);
}


/* ── 2) Page canvas ────────────────────────────────────────────────────────
 * The canvas is fx-color-surface-sunken, the same plane the application's own
 * content sits on, so signing in and arriving at the dashboard are visibly one
 * product. It is inherited from 01-base and deliberately NOT restated here.
 *
 * IT MOVED, AND THIS CARD IS WHY. The body used to be fx-color-level-0. 01-base
 * line 227 moved it to fx-color-surface-sunken, and the comment over that line
 * cites THIS CARD as the platform's one correct example of a raised card on a
 * recessed canvas: the shell was changed to agree with the login screen rather
 * than the other way round. So the pair below is the reference, not an exception.
 *
 * RE-MEASURED 2026-08-03 in the running app, after the body moved underneath it:
 *
 *     light   card #ffffff on canvas #e8ece5 ..... 1.196:1   was 1.143 on level 0
 *     dark    card #1f2d23 on canvas #0c1a14 ..... 1.242:1   was 1.162 on level 0
 *
 * THE STEP GREW IN BOTH THEMES, which is the direction that had to hold: the
 * canvas moved AWAY from the card, not toward it. Nothing here needed changing
 * as a result, and that is the point of recording it. A level 3 plate on a
 * sunken canvas is four rungs, so 1.19 to 1.24 is the expected span for a pair
 * whose ADJACENT rungs are each 1.04 to 1.06.
 *
 * min-block-size uses svh with a vh fallback: on a phone the dynamic viewport
 * shrinks when the URL bar returns, and 100vh would push the card under it.
 * The padding is fx-gutter, the page margin token every other surface in the
 * system clamps by, so the card keeps the same edge distance as a dialog does.
 *
 * THE PAIR HOLDS UNCHANGED ON THE ACCOUNT LAYOUT, VERIFIED RATHER THAN ASSUMED.
 * That layout's <body> already computed to #e8ece5 in light before this file was
 * ever linked to it — the same fx-color-surface-sunken measured above — because
 * the canvas comes from 01-base and no LeptonX rule and no frihat layer sets a
 * background on .abp-account-layout. So the figures in the table above are the
 * figures on all five signed-out screens, not just on Login, and nothing was
 * re-derived.
 *
 * WHY THE SECOND SELECTOR. The account layout's body carries .abp-account-layout,
 * and a bare `body` is 0,0,1 — a single theme class rule would outrank it. The
 * qualified form is 0,1,1 and cannot lose to one. It is insurance rather than a
 * fix: measured on that layout, body resolves to display:block with no rule
 * setting display at all, so today the bare selector already wins on source
 * order. Stating it means a future LeptonX bump that adds an .abp-account-layout
 * display rule cannot silently un-centre the card.
 * ──────────────────────────────────────────────────────────────────────── */
body,
body.abp-account-layout {
    display: flex;
    align-items: center;
    justify-content: center;
    min-block-size: 100vh;
    min-block-size: 100svh;
    padding: var(--fx-gutter);
}


/* ── 3) The card — LINEAR DIALOG ANATOMY, RECONCILED WITH .modal ────────────
 *
 * 07-surfaces section 3 states the anatomy for every floating window in the
 * system, and .modal and .frihat-dialog both implement it. This card now matches
 * it property for property: level 3 surface, a 1px TRANSLUCENT hairline from the
 * fx-color-border-subtle family (the opaque fx-color-divider family is for
 * separators that sit in the flow), fx-radius-md, fx-shadow-float-lg, and a
 * width of min(ideal, 100vw minus two gutters).
 *
 * THREE THINGS WERE OFF AND ARE NOW RECONCILED:
 *
 *   THE IDEAL WAS A PIXEL LITERAL. 400px froze this one surface while every
 *   other surface in the system tracks the type scale under browser zoom. It is
 *   26rem now, which is 416px at the default root size and is the same ideal
 *   .frihat-dialog-confirm uses; the reasoning is recorded over that rule.
 *
 *   THE CLAMP WAS fx-space-4. A rhythm step is not the page margin. Every other
 *   surface clamps by fx-gutter, which re-tiers at a breakpoint; fx-space-4 does
 *   not, so at the wide tier this card sat inside the page margin and at the
 *   narrow tier it overhung it.
 *
 *   THE PADDING WAS fx-space-6. The dialog interior in the reference is 24px and
 *   fx-surface-pad-md is the fluid 18 to 26px surface step that lands on it,
 *   which is what .modal and .frihat-dialog both read. The card itself now
 *   carries NO padding at all: the band and the body own it, exactly as
 *   .frihat-dialog delegates its padding to its bands and its body.
 *
 * ONE DELIBERATE DEPARTURE, WITH ITS ARITHMETIC. .modal and .frihat-dialog drop
 * to level 1 in DARK, because a dialog there lands over a SCRIMMED page and the
 * shadow does the separating. This card has no scrim — it floats on the bare
 * page — and in dark the float shadow is black on near black and contributes
 * almost nothing. RE-MEASURED 2026-08-03 against the dark page as it now stands,
 * fx-color-surface-sunken #0c1a14 rather than the fx-color-level-0 #10211a this
 * table was originally written against:
 *     level 1  #17251b   1.12:1   the card edge is still not perceivable
 *     level 3  #1f2d23   1.24:1   a real step, and the brand band above reads
 *                                 against it at 2.79:1
 * The sunken canvas widened both figures by roughly 0.07, so the conclusion is
 * unchanged and level 1 remains too close to read as an edge.
 * So the card stays at level 3 in both themes. If a scrim is ever introduced
 * behind it, revisit this and follow .modal.
 *
 * overflow: clip lets the band run full bleed to the card's own rounded corners
 * without the band having to restate a radius. clip rather than hidden: it
 * creates no scroll container, so nothing here can become accidentally
 * scrollable, and it is the property 01-base already uses on the document.
 * ──────────────────────────────────────────────────────────────────────── */
.frihat-login-card {
    inline-size: min(26rem, calc(100vw - var(--fx-gutter) * 2));
    max-inline-size: 100%;

    background-color: var(--fx-color-level-3);
    border: var(--fx-border-width) solid var(--fx-color-border-subtle);
    border-radius: var(--fx-radius-md);
    box-shadow: var(--fx-shadow-float-lg);
    color: var(--fx-color-text-muted);
    overflow: clip;
}


/* ── 4) THE BRAND BAND — 00-tokens 3.9's SURFACE CLAUSE, PAID ───────────────
 *
 * ══ WHAT THIS IS, AND WHY IT IS NOT A FOURTEENTH SITE ══════════════════════
 *
 * On 2026-08-03 the client chose CLIO'S MODEL FOR THE APP SHELL: a dark rail
 * with the brand green moving to a FULL-BLEED HORIZONTAL TOP BAR. 03-leptonx
 * section 4 implements that band and records it as a brand surface of the same
 * date. THE SIGNED-OUT FLOW IS WHAT THAT SHELL DOES NOT REACH — the topbar is
 * chrome for an authenticated session and none of these five screens has one —
 * so the band is restated at the head of the card. It reads the SAME two knobs,
 * in the same order, off the same semantics.
 *
 * ORIGINALLY THIS SAID "THE ONE SCREEN", AND IT WAS TRUE OF THE FILE RATHER THAN
 * OF THE PRODUCT. Sign-in was the only signed-out screen anyone had branded;
 * forgot-password, reset-password, register and access-denied were sitting on the
 * theme's generic composition the whole time. Branding the account layout is what
 * made the sentence honest, and the band is now the head of every card an
 * unauthenticated visitor can reach.
 *
 * That framing matters. This is not a new surface derived on a stylesheet's own
 * initiative, which 3.9 forbids in terms ("a brand plane is the loudest thing
 * this design system can do, and it is not a move a stylesheet makes on its own
 * initiative"). It is the client's own band, applied to the screens his shell
 * decision could not reach. If he did not intend it to reach the signed-out
 * flow, deleting this section and one div in each of Login.cshtml and
 * Themes/LeptonXLite/Layouts/Account.cshtml reverts it completely.
 *
 * ══ S1 TO S4, RUN ══════════════════════════════════════════════════════════
 *
 *   S1 IDENTITY, NOT DECORATION. It carries the firm's mark and the firm's name
 *      and nothing else. With no content on it at all it still says whose
 *      product this is, which is the first half of Q1 exactly.
 *   S2 CHROME, NOT CONTENT. It frames. The form, the errors and the fields are
 *      all in the BODY below it, outside the fill. Nothing a user must read to
 *      act is painted on brand green. The one interactive thing on it is the
 *      language switcher, which is chrome by definition and sits on the shell's
 *      topbar for the same reason.
 *   S3 BOUNDED BY THE PAGE, NOT BY THE DATA. One band, on one screen, authored.
 *      It cannot recur per row, per result or per field.
 *   S4 ITS LADDER IS RE-DERIVED AND MEASURED. Below, in both themes.
 *
 * ══ THE LOCAL TIER SET — TWO KNOBS, EVERYTHING ELSE DERIVED ════════════════
 *
 * The surface clause is explicit that a brand plane may not inherit a page
 * token: fx-color-text-muted measures 1.35:1 on the light brand fill, and
 * fx-color-brand-text IS that fill in light. So the band declares fx-band-bg and
 * fx-band-fg and mixes everything else out of them, which is the pattern the
 * sidebar rail established and the topbar copied. The two inks are the pair
 * 00-tokens 2.2.1 decides CENTRALLY for every brand fill on the platform, so
 * this band cannot drift from the topbar, the welcome banner or the quick-link
 * tile.
 *
 * THERE IS NO THIRD INK and 2.2.1 records why: on a brand fill in dark the whole
 * theme has 0.66 of headroom over AA and the green ramp is frozen. Hierarchy on
 * this band is SIZE, WEIGHT and SPACE.
 *
 * MEASURED, light / dark. Light fill is the semantic at green-800 under the off
 * white ink; dark resolves one ramp step brighter to green-700 under pure white,
 * for the reason 00-tokens site 12 records — green-800 is 2.02:1 on the dark page
 * and would read as a smudge. The fill reads the SEMANTIC, never a primitive.
 *
 *   fx-band-bg   fill vs the CARD it sits on ......... 8.27 / 2.79
 *   fx-band-bg   fill vs the page behind the card .... 6.92 / 3.47   SC 1.4.11
 *                (re-measured 2026-08-03 on the sunken canvas; was 7.24 / 3.24
 *                 when the page was fx-color-level-0. Light fell because the
 *                 canvas darkened toward the band, dark rose for the same
 *                 reason, and the dark cell is the one that has to clear 3:1.)
 *   fx-band-fg   wordmark on the fill ................ 7.38 / 5.16   AA
 *   fx-band-fg-muted  resting switcher on the fill ... 5.38 / 4.64   AA
 *   fx-band-fg   hovered switcher on the fill ........ 7.38 / 5.16   AA
 *   fx-band-fg   the local focus ring on the fill .... 7.38 / 5.16   SC 1.4.11
 *
 * THE ONE FIGURE THAT NEEDS SAYING OUT LOUD is the 2.79:1 in dark: the band's
 * fill against the card is below the 3:1 non-text floor. SC 1.4.11 governs the
 * visual information required to IDENTIFY A USER INTERFACE COMPONENT, and this
 * band is a decorative identity plane — nothing about operating this screen
 * depends on perceiving its edge, and the wordmark on it clears AA at 5.16:1
 * regardless. The band against the PAGE, which is the boundary a user actually
 * sees at the top of the card, is 3.47:1 and clears. Recorded rather than
 * quietly rounded up.
 *
 * WHY THERE IS NO HOVER WASH ON THE BAND, unlike the topbar. The topbar's wash
 * is a 10 percent ink over the fill; on the DARK band the primary ink over that
 * wash measures 4.27:1, which is under AA for a label a user reads. The topbar
 * can carry it because its controls are icon buttons; a language switcher is a
 * WORD. So the switcher's hover promotes the INK a tier and adds an underline
 * instead, which is the icon rule from 00-tokens 2.2 applied to a link, and every
 * cell in the table above clears AA in both themes.
 * ──────────────────────────────────────────────────────────────────────── */
.frihat-login-band {
    --fx-band-bg:       var(--fx-color-primary);
    --fx-band-fg:       var(--fx-color-text-on-primary);
    --fx-band-fg-muted: var(--fx-color-text-on-primary-muted);

    /* LOAD BEARING. The global ring is green-800 in light, which is this
     * surface's own fill, so a focused switcher on the band would show no
     * indicator whatsoever; in dark green-500 on green-700 measures 1.59:1 and
     * fails SC 1.4.11 outright. The band's own ink measures 7.38:1 and 5.16:1.
     * This must move with fx-band-bg; if the band is ever returned to a page
     * plane, delete this line in the same change. */
    --fx-color-focus-ring: var(--fx-band-fg);

    display: flex;
    align-items: center;
    gap: var(--fx-space-3);
    /* The same 56px band height every dialog header, offcanvas header and
     * topbar in the system reads, so all of them grow together when the control
     * ladder steps up for touch. */
    min-block-size: var(--fx-dialog-band-h);
    padding-block: var(--fx-space-2);
    padding-inline: var(--fx-surface-pad-md);

    background-color: var(--fx-band-bg);
    color: var(--fx-band-fg);
}

/* THE MARK. A fixed square so the band height never depends on how the asset is
 * cropped, and fx-radius-sm so it reads as a deliberate app mark rather than as
 * a photograph that happens to be square. object-fit guards the same thing from
 * the other side: a replaced element with a different intrinsic ratio is
 * contained rather than stretched.
 *
 * IT CARRIES ITS OWN GROUND, which is why it is the only image on this page that
 * works in both themes. The asset it replaced, /frihat/logo.png, is a
 * transparent PNG whose artwork is black and gold: in dark mode the black half
 * of it — the book outline and the second line of the wordmark — simply
 * disappeared, so half the logo was invisible on every dark sign-in. See the
 * note in Login.cshtml. */
/* CIRCULAR AS OF 2026-08-14. The asset itself is now a disc — see the note over
 * the <img> in Login.cshtml — so this radius is a GUARD rather than the
 * mechanism: it keeps the box honest if a square asset is ever swapped back in,
 * and it costs nothing while the artwork already carries its own round ground. */
.frihat-login-band .logo {
    flex: 0 0 auto;
    inline-size: var(--fx-control-h-md);
    block-size: var(--fx-control-h-md);
    border-radius: var(--fx-radius-circle);
    object-fit: contain;
}

/* THE WORDMARK. 600 is the ceiling in this system and is reserved for page and
 * dialog titles; a wordmark is exactly that class of thing. Tracking is routed
 * through a token so the Arabic guard in 00-tokens can zero it — a cursive
 * script must never take negative letter-spacing, and no call site is allowed to
 * write one directly. */
.frihat-login-band .frihat-login-wordmark {
    flex: 1 1 auto;
    min-inline-size: 0;
    font-family: var(--fx-font-heading);
    font-size: var(--fx-text-base);
    font-weight: var(--fx-weight-semibold);
    line-height: var(--fx-leading-snug);
    letter-spacing: var(--fx-tracking-ui);
    color: var(--fx-band-fg);
}


/* ── 5) The card body ──────────────────────────────────────────────────────
 * fx-surface-pad-md, the same fluid 18 to 26px interior every dialog body in the
 * system uses. Nothing else: the fields, the label, the checkbox, the button and
 * the validation messages all arrive from the linked platform layers.
 * ──────────────────────────────────────────────────────────────────────── */
.frihat-login-body {
    padding: var(--fx-surface-pad-md);
}

/* THE TITLE. Semibold, not bold: in the retuned system hierarchy is carried by
 * size and by colour tier, and 700 would be a third simultaneous signal on a
 * screen that has one heading.
 *
 * It is START ALIGNED, not centred, and that is the change worth defending. The
 * band above it starts at the inline start, every label below it starts at the
 * inline start, and a centred heading between them is the only element on the
 * card with a different axis. Under RTL the whole column mirrors as one, with no
 * direction-specific rule anywhere.
 *
 * fx-text-2xl (18 to 20px), one step above the xl it used to take. This is the
 * only heading on the only screen in the product with no data on it, so it can
 * afford the step; fx-tracking-heading is the matching tracking rung and is
 * zeroed for Arabic by the same guard.
 * ──────────────────────────────────────────────────────────────────────── */
.frihat-login-card h1.title {
    margin-block: 0 var(--fx-space-5);
    font-family: var(--fx-font-heading);
    font-size: var(--fx-text-2xl);
    font-weight: var(--fx-weight-semibold);
    line-height: var(--fx-leading-snug);
    letter-spacing: var(--fx-tracking-heading);
    text-wrap: balance;
    color: var(--fx-color-text);
}


/* ── 6) Form placement — PLACEMENT ONLY ────────────────────────────────────
 * Every rule that used to live here is gone, because 05-forms.css now reaches
 * this page and owns all of it: the well, the fill, the radius, the padding, the
 * type size, the hover, the focus brighten, the autofill suppression, the label
 * tier, the checkbox silhouette, the checked brand fill and the validation
 * message with its reserved row.
 *
 * The markup opts into published SIZE STEPS and declares nothing: .fx-field on
 * each group (the 16px inter-group rhythm plus the reserved validation row that
 * stops the card jumping when an error arrives), the UNCLASSED 40px default on
 * the two fields, and .btn-lg on the action (40px), so field and action share one
 * silhouette.
 *
 * WHY NOT THE 44px HERO STEP, WHICH 05-forms NAMES FOR THIS EXACT SCREEN. It does
 * not currently reach an input element. Section 1 of that file sets the fx-ctl-*
 * locals on a selector list containing input[type="text"], which is 0,1,1, while
 * every published size step is a bare class at 0,1,0 — so on an input the base
 * step wins and the ladder is inert. Measured in the running app: .form-control-lg
 * and .fx-control-sm both render a 40px input, and the same classes on a textarea
 * or a select correctly render 44px because those bare-element selectors are only
 * 0,0,1. This page uses the step that actually renders rather than papering over
 * it with a local override; the defect is reported to the owner of 05-forms.
 *
 * WHAT IS LEFT IS RHYTHM, which is a form LAYOUT decision and belongs to the
 * page. The submit action is separated from the last field group by a full step
 * because it is the end of the form rather than another row in it.
 * ──────────────────────────────────────────────────────────────────────── */
.frihat-login-card .btn-block {
    margin-block-start: var(--fx-space-4);
}


/* ── 7) Secondary link ─────────────────────────────────────────────────────
 * Link text is a sanctioned brand site (00-tokens 3.9, site 8). Underline
 * appears on hover only, and the hover branch is gated on any-hover so a touch
 * device never leaves the link stuck in its hovered state after a tap.
 *
 * Start aligned with everything else in the body column. The old rule centred it
 * under a centred button; the button is still full width, but its LABEL is
 * centred by the button itself and the link is a separate line of body text.
 * ──────────────────────────────────────────────────────────────────────── */
.frihat-login-card .forgot-link {
    display: inline-block;
    margin-block-start: var(--fx-space-4);
    font-size: var(--fx-text-sm);
    text-decoration: none;
    color: var(--fx-color-link);
    transition: color var(--fx-dur-fast) var(--fx-ease-standard);
}

@media (any-hover: hover) {
    .frihat-login-card .forgot-link:hover {
        color: var(--fx-color-link-hover);
        text-decoration: underline;
    }
}


/* ── 8) Language switcher — ON THE BAND ────────────────────────────────────
 * It has moved out of the card body and onto the brand band, which is where the
 * app shell puts it: in the Clio model the language selector is a topbar item,
 * so sign-in and the shell now agree about what that control is and where it
 * lives. It also frees the body column, whose last line is now the
 * forgot-password link rather than a stray chip under it.
 *
 * IT IS THE ONE FOCUSABLE THING ON A BRAND SURFACE, which is what makes the
 * local focus-ring override in section 4 load bearing rather than defensive.
 *
 * AND IT IS WHY BOTH CONSUMERS RENDER IT AS PLAIN ANCHORS. The theme's account
 * layout shipped an N-language BOOTSTRAP DROPDOWN here, and moving that onto the
 * band would have been a quiet accessibility regression: section 4 re-points
 * fx-color-focus-ring at the band's own ink, and a dropdown PANEL rendered
 * inside the band inherits that override onto its menu items, where an off-white
 * ring on a white panel measures nothing. 03-leptonx section 4.0 records the same
 * trap, which is why it writes its three outlines by hand instead of re-declaring
 * the token. An anchor has no panel, so the override stays inside the surface it
 * was measured on. The account layout keeps ABP's own switch URL, so the choice
 * is persisted through the culture cookie; the anchors are a presentation choice
 * only and a third configured language simply adds a third link.
 *
 * Both of its colours are mixed from the band's own knobs, never from the page:
 * a page text tier on this fill measures 1.35:1. Rest is the band's dimmed step,
 * hover promotes to the band's primary ink and adds an underline, so the state
 * is never carried by colour alone and never by a wash the ink cannot clear.
 * Figures for all four cells are in the table in section 4.
 *
 * flex-end resolves against the writing direction, so it mirrors with no Razor
 * ternary and no direction-specific rule here.
 * ──────────────────────────────────────────────────────────────────────── */
.frihat-lang-switch {
    display: flex;
    flex: 0 0 auto;
    justify-content: flex-end;
    font-size: var(--fx-text-xs);
}

.frihat-lang-switch a {
    display: inline-flex;
    align-items: center;
    /* The SC 2.5.8 floor for a target carrying a text label. The token re-tiers
     * to 32px on a coarse pointer by itself, so there is no pointer media query
     * to write here. */
    min-block-size: var(--fx-control-h-sm);
    padding-inline: var(--fx-space-2);
    border-radius: var(--fx-radius-sm);
    color: var(--fx-band-fg-muted);
    font-weight: var(--fx-weight-medium);
    letter-spacing: var(--fx-tracking-ui);
    text-decoration: none;
    transition: color var(--fx-dur-fast) var(--fx-ease-standard);
}

@media (any-hover: hover) {
    .frihat-lang-switch a:hover {
        color: var(--fx-band-fg);
        text-decoration: underline;
    }
}


/* ── 9) The server-side error alert ────────────────────────────────────────
 * Server-side ModelState errors render here. CLAUDE.md working preferences:
 * errors surface as an inline alert, never as a raw stack of red text.
 *
 * THE PANEL ITSELF IS 08-feedback's AND NOTHING BELOW REDECLARES IT. That file
 * settled the alert on a NEUTRAL surface — one level step, a translucent
 * hairline, an 8px corner — where the only coloured things are the icon and the
 * heading. The tinted danger fill, danger border and danger body text this
 * section used to paint are exactly what that pass removed, and 00-tokens 3.9
 * names an alert surface on the FORBIDDEN list in its own right: a message is
 * content by definition, and a status hue painted as a large area is the themed
 * Bootstrap tell.
 *
 * The markup supplies the icon as <i class="alert-icon">, which 08-feedback
 * treats as REQUIRED rather than decorative: with the fill gone the glyph is
 * half the signal, not a redundancy, and it is what keeps the state off colour
 * alone for a greyscale or colour-blind reader.
 *
 * All that is left for this page is the gap to the form below it.
 * ──────────────────────────────────────────────────────────────────────── */
.frihat-login-card .frihat-alert {
    margin-block-end: var(--fx-space-4);
}

/* One <div> per ModelState error inside the message column. Two errors should
 * read as two lines, not as one run-on paragraph. */
.frihat-login-card .frihat-alert .alert-content > div + div {
    margin-block-start: var(--fx-space-1);
}


/* ── 10) User preferences ──────────────────────────────────────────────────
 * 01-base section 13 already collapses every fx-dur-* token to 0.01ms under a
 * reduced-motion request, and 04-buttons and 05-forms both gate their own
 * movement, so there is no local transition left to damp: the only two
 * transitions in this file are colour changes on links.
 *
 * prefers-contrast is likewise handled at the token level — 00-tokens promotes
 * every border and every text tier — so the only local concerns are the card's
 * translucent hairline, which must become a real line, and the band's dimmed
 * ink, which must collapse into the band's primary ink rather than stay a
 * second tier the promoted palette cannot reach.
 * ──────────────────────────────────────────────────────────────────────── */
@media (prefers-contrast: more) {
    .frihat-login-card {
        border-color: var(--fx-color-border-strong);
        box-shadow: none;
    }

    /* The band is a brand fill, so the promoted PAGE palette does not reach
     * inside it. Collapsing the dimmed step onto the primary ink is the
     * equivalent move: 5.38 / 4.64 becomes 7.38 / 5.16 in the two themes. */
    .frihat-login-band {
        --fx-band-fg-muted: var(--fx-band-fg);
    }

    .frihat-lang-switch a {
        text-decoration: underline;
    }
}

/* FORCED COLOURS. The user agent replaces every background and every colour with
 * a system pair, so the band's fill is gone and with it the only thing that made
 * the head of the card a band. A real line brings the structure back, and
 * forced-color-adjust is deliberately NOT set to none anywhere: overriding a
 * forced-colors user is the failure this mode exists to prevent.
 *
 * The card gets a stroke for the same reason — its translucent hairline is not
 * a system colour and does not survive — and the shadow is dropped because a
 * shadow carries no information in this mode and only muddies the edge. */
@media (forced-colors: active) {
    .frihat-login-card {
        border: var(--fx-border-width-strong) solid CanvasText;
        box-shadow: none;
    }

    .frihat-login-band {
        border-block-end: var(--fx-border-width-strong) solid CanvasText;
    }

    .frihat-login-band .logo {
        /* A raster mark is the one thing here that must keep its own colours:
         * forced colours would otherwise flatten the artwork into the system
         * pair and the mark would stop being a mark. */
        forced-color-adjust: none;
    }

    .frihat-lang-switch a {
        text-decoration: underline;
    }
}

/* PRINT. Signing in is not a thing anyone prints, but a page that prints badly
 * is a page nobody proofread. The brand fill is dropped rather than reproduced —
 * a full width green band costs a cartridge and carries nothing on paper — the
 * float shadow becomes a hairline, and the two controls that cannot be operated
 * on paper are removed. Nothing here uses a colour token, because print is
 * neither theme. */
@media print {
    body {
        display: block;
        min-block-size: auto;
        padding: 0;
    }

    .frihat-login-card {
        inline-size: auto;
        border: var(--fx-border-width) solid currentColor;
        box-shadow: none;
        overflow: visible;
    }

    .frihat-login-band {
        background-color: transparent;
        border-block-end: var(--fx-border-width) solid currentColor;
        color: inherit;
    }

    .frihat-login-band .frihat-login-wordmark,
    .frihat-lang-switch a {
        color: inherit;
    }

    .frihat-lang-switch,
    .frihat-login-card .btn,
    .frihat-login-card .forgot-link {
        display: none;
    }
}


/* ============================================================================
 * 11) THE COMPOSED SIGN-IN SCREEN — one consumer, Pages/Account/Login.cshtml
 * ────────────────────────────────────────────────────────────────────────────
 * WHAT THIS SECTION IS. Everything above it draws ONE plate: a brand band at the
 * head, a form under it, 26rem wide. That is still exactly what the four
 * account-layout screens get, and it is what this screen collapses back to below
 * the lg breakpoint. From 992px up the sign-in screen becomes a TWO-PANE
 * composition instead — a brand pane carrying the office's mark, the product
 * name and three lines of positioning, beside the form.
 *
 * IT IS A MODIFIER, NOT A SECOND CARD. Every selector below is a compound with
 * the class it refines: .frihat-login-card.frihat-auth for the plate,
 * .frihat-login-band.frihat-auth-brand for the pane, .frihat-login-body plus
 * .frihat-auth-panel for the form column. So the plate's fill, hairline, radius,
 * float shadow and overflow, the mark's square and radius, the wordmark's type,
 * the band's local ink pair, the band's focus-ring override and the whole
 * language switcher all arrive from sections 3, 4, 5, 7 and 8 unchanged — and
 * the account layout, which carries none of the frihat-auth-* classes, inherits
 * nothing from here. That is why branding the sign-in screen needed no edit to
 * Themes/LeptonXLite/Layouts/Account.cshtml.
 *
 * SPECIFICITY IS STATED, NEVER LEFT TO SOURCE ORDER. The compound form is what
 * makes that true: (0,2,0) against the (0,1,0) rules it refines, (0,3,0) where a
 * descendant of the band is retuned against section 4's (0,2,0). Section 1b of
 * 05-forms records why relying on file order is too fragile to stand on, and the
 * same reasoning applies inside a file.
 *
 * A MEDIA QUERY ADDS NO SPECIFICITY, and this file already contains three
 * preference tiers ABOVE this section. A base rule written here would therefore
 * out-order them at equal weight and silently blank them. So the preference
 * tiers for this screen are section 12, at the very END of the file, and each of
 * their selectors is a compound too — later in source AND at least as specific.
 * ========================================================================== */


/* ── 11.1) THE CANVAS — DEPTH FROM THE BRAND, NOT FROM AN ASSET ─────────────
 *
 * SCOPED TO THIS PAGE BY A CLASS ON body, AND THAT IS DELIBERATE. Section 2's
 * body rule is shared with the account layout; this one is not. body carries
 * .frihat-auth-page only on Login.cshtml, so the four account screens keep the
 * flat canvas they have today and nothing about them moves.
 *
 * NOTHING ON THE CANVAS CARRIES TEXT. Every readable thing on this screen sits
 * on the plate or on the brand pane, both of which are opaque fills painted over
 * this treatment. So neither the wash nor the grain can move a single foreground
 * ratio, which is the cleanest form the argument can take: there is no composite
 * to compute because there is nothing composited onto.
 *
 * THE WASH. A radial lift toward the top centre, both stops OPAQUE so no engine
 * has to interpolate through a premultiplied alpha and there is no grey fringe
 * to hunt. Its lighter stop mixes the shell toward the midpoint of level 2 and
 * the brand fill: in LIGHT that mixture lifts a mid-dark green, in DARK it
 * greens a near-black plane, and one expression therefore serves both themes
 * without a branch. `at 50% 0%` is symmetric on the inline axis, so the wash
 * mirrors under RTL with no direction-specific rule.
 *
 *   MEASURED, light / dark
 *     canvas base .. fx-color-shell ............. #145a32 / #0c1a14
 *     wash centre .. the mix below .............. #22643e / #0e2117
 *     wash vs base ..............................  1.17:1 / 1.06:1
 *     plate vs base ..............................  8.27:1 / 1.24:1
 *     plate vs wash centre .......................  7.09:1 / 1.17:1
 *
 * background-attachment: fixed keeps the wash anchored to the viewport rather
 * than to a body box whose height the card decides, so the composition does not
 * shift when a validation alert makes the card taller.
 * ──────────────────────────────────────────────────────────────────────── */
body.frihat-auth-page {
    background-image: radial-gradient(
        ellipse 130% 90% at 50% 0%,
        color-mix(
            in srgb,
            var(--fx-color-shell) 88%,
            color-mix(in srgb, var(--fx-color-level-2), var(--fx-color-primary))
        ) 0%,
        var(--fx-color-shell) 72%
    );
    background-repeat: no-repeat;
    background-attachment: fixed;
}

/* THE GRAIN. fx-texture-grain is an inline SVG data URI defined in 00-tokens,
 * and 03-leptonx records at three separate call sites that it was removed from
 * the shell and is retained in the token layer FOR THE LOGIN BACKDROP
 * specifically. This is that consumer, and it is the only one. No asset is
 * fetched: the whole texture is bytes inside the stylesheet, which matters on
 * the one page an unauthenticated visitor always reaches — a remote texture here
 * would disclose the client IP of every sign-in attempt before a credential is
 * typed.
 *
 * WHY A PSEUDO-ELEMENT RATHER THAN A SECOND background-image LAYER. The token is
 * a fixed SVG whose own rect is at opacity 0.5; laid on directly it would be an
 * order of magnitude too strong, and a background layer has no opacity of its own
 * to damp it with. The pseudo-element carries the token's paired
 * fx-texture-grain-opacity, so the strength stays a token decision.
 *
 * IT IS position: fixed, WHICH IS LOAD BEARING TWICE. An absolutely positioned
 * child of a flex container is not a flex item, so the grain cannot become a
 * third column beside the card; and z-index -1 puts it in the negative layer of
 * the root stacking context, above the propagated canvas fill and below every
 * in-flow element, so it never lands over the form. pointer-events: none is
 * insurance on the same point from the other side.
 *
 * WORST CASE MEASURED: 3.5 percent white over the canvas base is #1c6039 in
 * light and #15221c in dark, 1.10:1 and 1.09:1 from the fill it sits on. It is a
 * texture at the threshold of perception, which is the entire brief for it.
 * ──────────────────────────────────────────────────────────────────────── */
body.frihat-auth-page::before {
    content: "";
    position: fixed;
    inset: 0;
    z-index: -1;
    pointer-events: none;
    background-image: var(--fx-texture-grain);
    opacity: var(--fx-texture-grain-opacity);
}


/* ── 11.2) THE BRAND PANE — THE 1.000:1 FIX, AND ONLY IN LIGHT ─────────────
 *
 * THE DEFECT. Section 4 pins the band's fill to fx-color-primary so it can never
 * drift from the app shell's topbar, and that was right when the page canvas was
 * fx-color-surface-sunken. Since 2026-08-04 the canvas is fx-color-shell, and in
 * LIGHT both tokens resolve to green-800: the band's fill and the page behind it
 * were the same colour, 1.000:1, and the head of the card dissolved into the
 * page. The surface ladder forbids 1.000 anywhere, and this was the one place in
 * the product where it had appeared.
 *
 * THE FIX IS A DEEPENING, AND IT IS ASYMMETRIC BECAUSE THE PROBLEM IS. In light
 * the pane mixes the brand fill toward fx-color-primary-active, staying inside
 * the brand ramp and reading as the deeper spine of the card rather than as a new
 * hue. In DARK nothing is wrong: the canvas is near-black and the semantic fill
 * already stands 3.47:1 from it, while deepening WOULD cost the internal seam
 * against the plate, which measured 1.89:1 at the same mix. So dark keeps the
 * semantic exactly as section 4 states it.
 *
 * A PER-THEME MIX IS THE SANCTIONED SHAPE FOR THIS, not an exception to the token
 * model: 00-tokens 2.4.1 records that 03-leptonx 7.0 declares its rail ladder in
 * both themes for precisely this reason, "because the two planes need different
 * mix percentages to reach the same four RATIOS". Neither branch consumes an
 * fx-p-* primitive and neither writes a literal colour.
 *
 *   MEASURED, light / dark
 *     pane fill ................................. #104526 / #1e7d43
 *     pane vs canvas base ....... was 1.000:1 ->   1.34:1 / 3.47:1
 *     pane vs canvas wash centre ................  1.56:1 / 3.26:1
 *     pane vs the plate (internal seam) ......... 11.05:1 / 2.79:1
 *     fx-band-fg       product name, pitch ......  9.86:1 / 5.16:1   AA
 *     fx-band-fg-muted tagline, glyph, switcher .  7.16:1 / 4.65:1   AA
 *     fx-band-fg       the local focus ring .....  9.86:1 / 5.16:1   SC 1.4.11
 *
 * THE DARK CELLS ARE SECTION 4'S OWN FIGURES, unchanged, because dark's fill is
 * unchanged. The light cells all IMPROVED: the deeper pane lifts the band ink
 * from 7.38 to 9.86 and the dimmed step from 5.38 to 7.16, so the fix costs no
 * legibility anywhere. 1.34:1 for the pane against the canvas is a decorative
 * boundary, not a control boundary — SC 1.4.11 governs what identifies a user
 * interface component, and nothing about operating this screen depends on
 * perceiving where the pane ends. The edge a user actually sees is the PLATE's,
 * and that is white on green at 8.27:1 with fx-shadow-float-lg under it.
 * ──────────────────────────────────────────────────────────────────────── */
.frihat-login-band.frihat-auth-brand {
    --fx-band-bg: color-mix(
        in srgb,
        var(--fx-color-primary) 55%,
        var(--fx-color-primary-active)
    );
}

/* DARK KEEPS THE SEMANTIC. (0,4,1) against the (0,2,0) above, so the branch is
 * decided by weight rather than by which line came second. If the shell token is
 * ever repointed away from the brand green in light, delete BOTH rules and let
 * section 4 own the fill again — the deepening exists only to answer the
 * collision, and a pane one step off the topbar is a cost, not a feature. */
html[data-bs-theme="dark"] .frihat-login-band.frihat-auth-brand {
    --fx-band-bg: var(--fx-color-primary);
}


/* ── 11.3) BELOW 992px THE PANE IS TODAY'S BAND ────────────────────────────
 * Nothing here changes the narrow layout: section 4's flex row already puts the
 * mark, the wordmark and the language switcher on one 56px band, and that is the
 * shape this screen keeps on a phone and a tablet. The two elements the wide
 * composition adds are simply not shown yet.
 *
 * display: none RATHER THAN A REORDER. The tagline and the three positioning
 * lines are the brand pane's content, and the brand pane does not exist below the
 * breakpoint — on a phone this screen is one card the thumb can reach, which is
 * exactly the shape it had before this pass. Hiding them also removes them from
 * the accessibility tree, so a screen reader is not read a column that has no
 * visual counterpart. Nothing operational is hidden: every control, label, error
 * and link is in the form panel.
 *
 * ══ THE HIDE IS DECLARED ON THE ELEMENTS' OWN BASE RULES IN 11.6, NOT HERE, AND
 *    THAT IS A DEFECT THIS SECTION USED TO CONTAIN ═════════════════════════════
 *
 * It first stood as its own rule at this point in the file:
 *
 *     .frihat-login-band.frihat-auth-brand > .frihat-auth-tagline,
 *     .frihat-login-band.frihat-auth-brand > .frihat-auth-pitch { display: none }
 *
 * A CHILD COMBINATOR ADDS NO SPECIFICITY, so that selector is (0,3,0) — exactly
 * the weight of 11.6's own base rule for the pitch, which declares display: flex
 * and sits LATER in the file. The hide therefore lost on source order and the
 * positioning column rendered on every phone, stacked under the wordmark inside a
 * 56px band. It is the same class of failure as an inert preference tier, arriving
 * from the other direction: equal weight, and the loser written first.
 *
 * The fix is to give each element ONE display declaration in its base rule and let
 * the wide tier in 11.7 be the only thing that turns it on. Two rules for one
 * property, in a known order, instead of three at the same weight.
 * ──────────────────────────────────────────────────────────────────────── */


/* ── 11.4) THE FORM PANEL ──────────────────────────────────────────────────
 * The panel IS .frihat-login-body, so section 5's fx-surface-pad-md interior and
 * section 5's h1 treatment both arrive unchanged at the narrow tier. What these
 * classes add is the rhythm the composed screen needs, plus the wide tier's own
 * geometry in 11.7.
 * ──────────────────────────────────────────────────────────────────────── */

/* THE SUBTITLE. One line under the heading, on the tertiary tier so it supports
 * the h1 without competing with it. sm (13px) is the smallest step in this system
 * allowed to carry a readable sentence; the heading owns the size signal.
 * MEASURED on the plate: 5.97:1 light, 4.88:1 dark — both clear AA. */
.frihat-login-card.frihat-auth .frihat-auth-subtitle {
    margin-block: 0 var(--fx-space-5);
    font-size: var(--fx-text-sm);
    line-height: var(--fx-leading-normal);
    color: var(--fx-color-text-subtle);
}

/* THE HEADING GIVES UP ITS BOTTOM MARGIN TO THE SUBTITLE, and nothing else about
 * it moves. Section 5 states the whole type treatment on `.frihat-login-card
 * h1.title` at (0,2,1); this rule is (0,3,1) and touches two properties, so the
 * family, weight, leading, tracking and balance stay defined in exactly one
 * place. The size steps up one rung because this is the only heading on the only
 * screen in the product with no data on it, and it now has a subtitle beneath it
 * to anchor the step. */
.frihat-login-card.frihat-auth h1.title {
    margin-block-end: var(--fx-space-2);
    font-size: var(--fx-text-3xl);
}

/* THE META ROW — remember-me at the inline start, forgot-password at the inline
 * end, above the action. It replaces a stray link under the button and it is a
 * form LAYOUT decision, which is this file's job; both members arrive fully
 * dressed from 05-forms and section 7. space-between and flex-wrap resolve
 * against the writing direction, so the row mirrors under RTL and drops the link
 * onto a second line on a narrow card rather than overflowing it.
 *
 * NO BLOCK-START MARGIN, AND THAT IS THE DETERMINISTIC CHOICE RATHER THAN THE
 * LAZY ONE. The preceding .fx-field already ends on 05-forms' 16px inter-group
 * step. Adding a second margin here would collapse against it at the narrow tier,
 * where the panel is block flow, and NOT collapse at the wide tier, where 11.7
 * makes the panel a flex column — so the gap above this row would differ between
 * the two tiers by construction. Leaving the whole gap to the field keeps one
 * number in one place and both tiers identical. */
.frihat-login-card.frihat-auth .frihat-auth-meta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--fx-space-3);
    margin-block-start: 0;
}

/* Section 7 gives the link a full step of block-start margin because it used to
 * be the last line of the column. Inside the row it is a member, not a line, so
 * the margin is cancelled here — (0,3,0) against that rule's (0,2,0). */
.frihat-login-card.frihat-auth .frihat-auth-meta .forgot-link {
    margin-block-start: 0;
}

/* 05-forms gives every .form-check row a 4px block-end margin so stacked
 * checkboxes breathe. In a single-row flex assembly that margin is an
 * asymmetry — the checkbox would sit 4px higher than the link beside it — so it
 * is cancelled. (0,3,0) against that file's (0,1,0). */
.frihat-login-card.frihat-auth .frihat-auth-meta .form-check {
    margin-block-end: 0;
}


/* ── 11.5) THE HERO FIELDS — A PUBLISHED STEP, NOT A LOCAL FORK ────────────
 *
 * 05-forms 1b names its 44px rung "a hero field: the login form", and until
 * 2026-08-07 that rung could not reach an input: section 1 of that file sets the
 * fx-ctl locals on a selector list containing input[type="text"] at (0,1,1) while
 * every size class was a single class at (0,1,0), so on an input the base step
 * won and the ladder was inert. That is fixed upstream — 1b now DOUBLES every
 * rung, taking .form-control-lg.form-control-lg to (0,2,0) — so the correct
 * implementation of "the hero step for the login fields only" is to name the
 * class in the markup and write NO CSS AT ALL here.
 *
 * SO THERE IS NO SIZE RULE IN THIS SECTION, ON PURPOSE. A local redeclaration of
 * the four fx-ctl locals would have been a fork of a contract that works, and
 * 05-forms is explicit about the failure mode: "A consumer that needs a shape no
 * LOCAL provides has found a gap in this contract: extend the contract here,
 * never fork it there." The markup carries .form-control-lg on both fields,
 * .fx-control-lg on the password's input group so the group and its trailing
 * action track the same rung, and .btn-xl on the action so the 44px silhouette is
 * shared by field and button. If the upstream fix is ever reverted the page
 * degrades to the 40px default and stays coherent — the button rung would be the
 * only thing left out of step.
 *
 * THE REVEAL TOGGLE IS 05-forms' OWN CONTROL. .fx-input-action is described there
 * as "an icon only trailing action inside the field, e.g. a reveal toggle", and it
 * already supplies the transparent fill inside the group's well, the square
 * against fx-ctl-h, the gated hover wash and a focus ring pulled inward by a
 * negative offset so the group's overflow cannot clip it. Nothing about it is
 * restated here.
 *
 *   MEASURED, light / dark
 *     glyph at rest   text-subtle on the field fill ...  5.71:1 / 5.14:1
 *     glyph hovered   text on the hover wash .......... 13.92:1 / 11.27:1
 *     focus ring      on the field fill ...............  7.91:1 / 5.01:1
 * ──────────────────────────────────────────────────────────────────────── */


/* ── 11.6) THE POSITIONING COLUMN ──────────────────────────────────────────
 * Three lines that say what the platform is for, on the brand pane, visible from
 * 992px up. They are CONTENT — a real list, localized through WebResource in both
 * languages — so they are marked up as one, and their glyphs are aria-hidden
 * because each line already states its own meaning in words.
 *
 * TWO INKS AND NO THIRD. 00-tokens 2.2.1 rules that on a brand fill in dark the
 * whole theme has 0.66 of headroom over AA and the green ramp is frozen, so
 * hierarchy on a brand plane is SIZE, WEIGHT and SPACE. The line text takes the
 * pane's primary ink, the glyph beside it and the tagline above take the pane's
 * dimmed step, and that is the entire palette of this column. Both are mixed from
 * the band's own knobs by section 4, never inherited from the page ladder — a
 * page text tier on this fill measures 1.35:1.
 * ──────────────────────────────────────────────────────────────────────── */
/* display: none is the NARROW-TIER state, and 11.7 is the only thing that turns
 * either element on — see the note in 11.3 for the ordering defect that made this
 * the shape of the fix. */
.frihat-login-band.frihat-auth-brand .frihat-auth-tagline {
    display: none;
    margin: 0;
    font-size: var(--fx-text-sm);
    line-height: var(--fx-leading-normal);
    color: var(--fx-band-fg-muted);
}

.frihat-login-band.frihat-auth-brand .frihat-auth-pitch {
    display: none;
    flex-direction: column;
    gap: var(--fx-space-3);
    margin: 0;
    padding: 0;
    list-style: none;
}

.frihat-login-band.frihat-auth-brand .frihat-auth-pitch > li {
    display: flex;
    align-items: flex-start;
    gap: var(--fx-space-3);
    font-size: var(--fx-text-sm);
    line-height: var(--fx-leading-normal);
    color: var(--fx-band-fg);
}

/* The glyph is decoration attached to a line that reads correctly without it, so
 * it takes the dimmed step and the line keeps the primary ink. The block-start
 * nudge is optical: a 16px square beside a 1.7 leading line box sits high
 * without it. */
.frihat-login-band.frihat-auth-brand .frihat-auth-pitch > li > i {
    flex: 0 0 auto;
    inline-size: var(--fx-icon-md);
    margin-block-start: 0.25em;
    font-size: var(--fx-icon-sm);
    text-align: center;
    color: var(--fx-band-fg-muted);
}


/* ── 11.7) THE WIDE TIER — TWO PANES FROM 992px ────────────────────────────
 *
 * fx-bp-lg is the breakpoint the token layer already re-tiers fx-container-max
 * at, so the composition changes where the rest of the system changes rather than
 * at a number chosen here. Below it, everything above this block is the whole
 * screen and the shape is the card the account layout also draws.
 *
 * THE PLATE. 58rem tracks the type scale under browser zoom exactly as section
 * 3's 26rem does, and it clamps by fx-gutter — the page margin token that
 * re-tiers at a breakpoint — rather than by a rhythm step, for the reason section
 * 3 records. Two auto-placed grid children need no named areas: the pane is the
 * first child and takes the inline-start track, the panel takes the other, and
 * both mirror with the writing direction under RTL with no direction-specific
 * rule anywhere. The pane is the narrower track so the form, which is the task,
 * holds the wider one.
 *
 * align-items defaults to stretch, which is what makes the two panes the same
 * height without either of them being told a height.
 * ──────────────────────────────────────────────────────────────────────── */
@media (min-width: 992px) {
    .frihat-login-card.frihat-auth {
        inline-size: min(58rem, calc(100vw - var(--fx-gutter) * 2));
        display: grid;
        grid-template-columns: minmax(0, 0.95fr) minmax(0, 1.05fr);
    }

    /* THE PANE STOPS BEING A ROW AND BECOMES A COLUMN. Section 4's flex row is
     * replaced by a four-row grid: the mark and the language switcher share the
     * top row, the name and the tagline stack under it, and the positioning
     * column is anchored to the BOTTOM by giving its row the 1fr and sitting at
     * the block end of it. The pane's own padding steps up to fx-surface-pad-lg,
     * the 24 to 36px surface step, because a full-height pane at the 18 to 26px
     * step reads as a band that grew rather than as a composition. The shorthand
     * cancels section 4's two longhands. */
    .frihat-login-band.frihat-auth-brand {
        display: grid;
        grid-template-columns: auto 1fr;
        grid-template-rows: auto auto auto 1fr;
        grid-template-areas:
            "mark  switch"
            "name  name"
            "tag   tag"
            "pitch pitch";
        column-gap: var(--fx-space-3);
        row-gap: var(--fx-space-4);
        padding: var(--fx-surface-pad-lg);
    }

    .frihat-login-band.frihat-auth-brand .logo {
        grid-area: mark;
        /* Derived from the control ladder rather than stated: the hero control
         * height plus one rhythm step is 56px, the same height section 4 gives
         * the band itself, so the mark on the pane is exactly as tall as the
         * whole band is on a phone. It grows with the coarse-pointer tier for
         * free. */
        inline-size: calc(var(--fx-control-h-xl) + var(--fx-space-3));
        block-size: calc(var(--fx-control-h-xl) + var(--fx-space-3));
    }

    .frihat-login-band.frihat-auth-brand .frihat-lang-switch {
        grid-area: switch;
        align-self: start;
    }

    /* The product name is the pane's own headline now, so it steps from base to
     * 2xl and takes the matching tracking rung. It is NOT a heading element:
     * this screen has exactly one h1 and it is the form's. Tracking stays
     * tokenised so 00-tokens' Arabic guard can zero it — a cursive script must
     * never take negative letter-spacing. */
    .frihat-login-band.frihat-auth-brand .frihat-login-wordmark {
        grid-area: name;
        font-size: var(--fx-text-2xl);
        letter-spacing: var(--fx-tracking-heading);
    }

    .frihat-login-band.frihat-auth-brand .frihat-auth-tagline {
        grid-area: tag;
        display: block;
        /* The row gap already carries the space above; the tagline belongs to the
         * name, so it is pulled back onto it. */
        margin-block-start: calc(var(--fx-space-1) - var(--fx-space-4));
    }

    /* The hairline is re-derived from the pane's OWN ink, never from
     * fx-color-divider: 00-tokens 3.9's surface clause is explicit that a brand
     * plane may not inherit a page line, and the opaque divider family is
     * defined against the page ladder. MEASURED against the pane: 1.62:1 light,
     * 1.40:1 dark — inside the 1.03 to 1.5 band 00-tokens 2.3 sanctions for
     * structural separation, which identifies no control. */
    .frihat-login-band.frihat-auth-brand .frihat-auth-pitch {
        grid-area: pitch;
        /* The one place the column is turned on. Its base rule in 11.6 holds
         * display: none and every other property it needs, so this is a single
         * declaration rather than a second copy of the list. */
        display: flex;
        align-self: end;
        padding-block-start: var(--fx-space-5);
        border-block-start: var(--fx-border-width) solid
            color-mix(in srgb, var(--fx-band-fg) 18%, transparent);
    }

    /* THE FORM SITS OPTICALLY CENTRED IN ITS PANE rather than pinned to the block
     * start, because the pane beside it is full height and a form parked at the
     * top of a tall column reads as unfinished. It re-centres when a validation
     * alert makes the column taller, which is the correct behaviour: the alert is
     * part of the form. */
    .frihat-login-body.frihat-auth-panel {
        display: flex;
        flex-direction: column;
        justify-content: center;
        padding: var(--fx-surface-pad-lg);
    }
}


/* ── 11.8) THE MAINTENANCE PANEL (Pages/Maintenance, 2026-10-06) ───────────
 * The maintenance page wears the signed-out card whole, so the band, the pane,
 * the h1 and the subtitle above are already its own. What follows is only what
 * that page adds: a status mark above the heading, a reading measure for the
 * explanation, a live status line and a small status code. Semantic tokens
 * only, so all sixteen themes are covered without a per theme rule.
 * ──────────────────────────────────────────────────────────────────────── */

/* THE MARK. A warning tone, not danger: nothing the user did failed, and
 * nothing is lost. Round, so it echoes the platform mark in the band. */
.frihat-login-card .frihat-maintenance-mark {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    inline-size: 3.5rem;
    block-size: 3.5rem;
    margin-block-end: var(--fx-space-4);
    border-radius: 50%;
    border: var(--fx-border-width) solid var(--fx-color-warning-border);
    background-color: var(--fx-color-warning-bg);
    color: var(--fx-color-warning-fg);
    font-size: 1.5rem;
}

.frihat-login-card .frihat-maintenance-body {
    max-inline-size: 52ch;
    margin-block: 0 var(--fx-space-4);
    font-size: var(--fx-text-base);
    line-height: var(--fx-leading-relaxed);
    color: var(--fx-color-text);
}

/* The live line: tertiary, because it reports progress rather than content. A
 * fixed minimum height keeps the button below it from jumping as the countdown
 * text changes length. */
.frihat-login-card .frihat-maintenance-status {
    min-block-size: 1.5em;
    margin-block: 0 var(--fx-space-4);
    font-size: var(--fx-text-sm);
    color: var(--fx-color-text-subtle);
}

.frihat-login-card .frihat-maintenance-code {
    margin-block: var(--fx-space-4) 0;
    font-size: var(--fx-text-xs);
    color: var(--fx-color-text-subtle);
}


/* ============================================================================
 * 12) PREFERENCE TIERS FOR THE COMPOSED SCREEN — LAST IN THE FILE ON PURPOSE
 * ────────────────────────────────────────────────────────────────────────────
 * A MEDIA QUERY ADDS NO SPECIFICITY. Section 10's three preference blocks sit
 * ABOVE section 11, so a base rule written there would out-order them at equal
 * weight and quietly blank them — the exact failure a sweep of this codebase
 * found nine times. Everything below is therefore last in source order AND
 * written as a compound at (0,2,0) or heavier, so it wins on both counts, against
 * section 11's base rules and against section 10's (0,1,0) ones.
 *
 * Section 10 already covers what these screens share: the card's hairline becomes
 * a real line under prefers-contrast, the band's dimmed ink collapses onto its
 * primary ink, the band takes a CanvasText rule under forced colours, and print
 * drops the brand fill and the controls. What is left below is only what the
 * two-pane composition adds.
 * ========================================================================== */

@media (prefers-contrast: more) {
    /* The pane hairline is re-derived from the pane's own ink, so the promoted
     * PAGE palette cannot reach it — the same reason section 10 has to collapse
     * fx-band-fg-muted by hand. Raising the mix from 18 to 45 percent takes the
     * rule from 1.62:1 to a line that reads at a glance in both themes. */
    .frihat-login-band.frihat-auth-brand .frihat-auth-pitch {
        border-block-start-color: color-mix(
            in srgb,
            var(--fx-band-fg) 45%,
            transparent
        );
    }

    /* A texture is decoration, and a user who asked for more contrast asked for
     * less of exactly this. */
    body.frihat-auth-page::before {
        display: none;
    }
}

@media (forced-colors: active) {
    /* The user agent replaces every background with a system pair, so the wash is
     * gone anyway — but the grain layer is a full-viewport box with a
     * background-image, and forced colours do not reliably drop one. Hiding it
     * outright is the only guarantee that it cannot paint a system-coloured
     * rectangle over the whole screen. */
    body.frihat-auth-page {
        background-image: none;
    }

    body.frihat-auth-page::before {
        display: none;
    }

    /* The mix that draws the pitch rule is not a system colour and does not
     * survive; CanvasText brings the structure back. */
    .frihat-login-band.frihat-auth-brand .frihat-auth-pitch {
        border-block-start-color: CanvasText;
    }
}

@media (min-width: 992px) and (forced-colors: active) {
    /* Section 10 closes the band with a block-end rule, which is correct while
     * the band is a horizontal strip above the form. At the wide tier the pane is
     * a COLUMN beside the form, so the separator has to move to the inline end —
     * and the block-end rule has to be cancelled, or the pane is boxed on two
     * sides for no reason. Logical properties, so it mirrors under RTL. */
    .frihat-login-band.frihat-auth-brand {
        border-block-end: 0;
        border-inline-end: var(--fx-border-width-strong) solid CanvasText;
    }
}

@media print {
    /* Signing in is not a thing anyone prints, and section 10 already strips the
     * fill, the shadow and the controls. What is left is to undo the composition
     * itself: a two-column grid clamped to 58rem does not belong on a page whose
     * width the printer decides, and a positioning column is marketing on paper.
     * Every selector here is (0,2,0) or heavier, so it also answers section 11's
     * own base and wide-tier rules rather than only section 10's. */
    body.frihat-auth-page {
        background-image: none;
    }

    body.frihat-auth-page::before {
        display: none;
    }

    .frihat-login-card.frihat-auth {
        display: block;
        inline-size: auto;
    }

    .frihat-login-band.frihat-auth-brand {
        display: block;
        padding-block: var(--fx-space-3);
        padding-inline: 0;
    }

    .frihat-login-band.frihat-auth-brand > .frihat-auth-tagline,
    .frihat-login-band.frihat-auth-brand > .frihat-auth-pitch {
        display: none;
    }

    .frihat-login-card.frihat-auth .frihat-auth-meta {
        display: none;
    }
}
