/* ============================================================================
   CFC Reports — design system

   One stylesheet for both apps. `data-theme="portal"` on <html> is the filing
   portal a company sees; `data-theme="console"` is the operator console. The
   tokens change what each app feels like; the components do not change at all,
   so an operator with both open always knows which one they are looking at.

   Every component class is prefixed rg-. A short tail of app-specific classes
   (the country combobox, the multi-select, the date field) keeps the names the
   JavaScript creates at runtime.

   Fonts are self-hosted: the Content-Security-Policy sets font-src 'self', so
   no CDN can be reached. The woff2 files in static/fonts/ are the latin and
   latin-ext subsets lifted from the design's own artboards, so the screen uses
   the exact faces the mockups were drawn in.

   No inline style attributes anywhere: style-src 'self' blocks them. Anything
   that would need one — a meter width, a column width — has a class here.
   ========================================================================= */

/* The three families the September artboards are drawn in: Open Sans for
   text, Roboto Mono for headings — the headings really are monospace — and
   JetBrains Mono for every figure.

   The block below is GENERATED. `tools/extract_fonts.py` lifts the woff2
   files and these rules straight out of the artboard bundle, so the screen
   uses the same faces, subset for subset, as the drawing. Do not hand-edit
   it: the `unicode-range` lines are forty hex ranges that decide, per
   codepoint, whether an accented French name renders or falls back, and no
   one can proofread that. Run the tool instead:

       python -m cfc_portal.tools.extract_fonts
       python -m cfc_portal.tools.extract_fonts --check    # in CI

   Each family declares four weights over one file per subset because these
   are variable faces — same arrangement the previous build used. */

/* <<< generated by tools/extract_fonts.py — do not edit by hand */

@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/OpenSans-cyrillic-ext.woff2") format("woff2");
    unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F,
                  U+FE2E-FE2F;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/OpenSans-cyrillic.woff2") format("woff2");
    unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/OpenSans-greek-ext.woff2") format("woff2");
    unicode-range: U+1F00-1FFF;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/OpenSans-greek.woff2") format("woff2");
    unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1,
                  U+03A3-03FF;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/OpenSans-hebrew.woff2") format("woff2");
    unicode-range: U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC,
                  U+FB1D-FB4F;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/OpenSans-math.woff2") format("woff2");
    unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315,
                  U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333,
                  U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9,
                  U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5,
                  U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047,
                  U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E,
                  U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112,
                  U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192,
                  U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211,
                  U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319,
                  U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7,
                  U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7,
                  U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F,
                  U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE,
                  U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/OpenSans-symbols.woff2") format("woff2");
    unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0,
                  U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199,
                  U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299,
                  U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF,
                  U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF,
                  U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E,
                  U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB,
                  U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF,
                  U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315,
                  U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D,
                  U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF,
                  U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0,
                  U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415,
                  U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444,
                  U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D,
                  U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF,
                  U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6,
                  U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE,
                  U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513,
                  U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F,
                  U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD,
                  U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF,
                  U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC,
                  U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859,
                  U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1,
                  U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9,
                  U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6,
                  U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/OpenSans-vietnamese.woff2") format("woff2");
    unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169,
                  U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304,
                  U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/OpenSans-latin-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
                  U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF,
                  U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
                  U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/OpenSans-latin.woff2") format("woff2");
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
                  U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC,
                  U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/OpenSans-cyrillic-ext.woff2") format("woff2");
    unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F,
                  U+FE2E-FE2F;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/OpenSans-cyrillic.woff2") format("woff2");
    unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/OpenSans-greek-ext.woff2") format("woff2");
    unicode-range: U+1F00-1FFF;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/OpenSans-greek.woff2") format("woff2");
    unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1,
                  U+03A3-03FF;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/OpenSans-hebrew.woff2") format("woff2");
    unicode-range: U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC,
                  U+FB1D-FB4F;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/OpenSans-math.woff2") format("woff2");
    unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315,
                  U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333,
                  U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9,
                  U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5,
                  U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047,
                  U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E,
                  U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112,
                  U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192,
                  U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211,
                  U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319,
                  U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7,
                  U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7,
                  U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F,
                  U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE,
                  U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/OpenSans-symbols.woff2") format("woff2");
    unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0,
                  U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199,
                  U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299,
                  U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF,
                  U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF,
                  U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E,
                  U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB,
                  U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF,
                  U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315,
                  U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D,
                  U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF,
                  U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0,
                  U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415,
                  U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444,
                  U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D,
                  U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF,
                  U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6,
                  U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE,
                  U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513,
                  U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F,
                  U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD,
                  U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF,
                  U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC,
                  U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859,
                  U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1,
                  U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9,
                  U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6,
                  U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/OpenSans-vietnamese.woff2") format("woff2");
    unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169,
                  U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304,
                  U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/OpenSans-latin-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
                  U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF,
                  U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
                  U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/OpenSans-latin.woff2") format("woff2");
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
                  U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC,
                  U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/OpenSans-cyrillic-ext.woff2") format("woff2");
    unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F,
                  U+FE2E-FE2F;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/OpenSans-cyrillic.woff2") format("woff2");
    unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/OpenSans-greek-ext.woff2") format("woff2");
    unicode-range: U+1F00-1FFF;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/OpenSans-greek.woff2") format("woff2");
    unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1,
                  U+03A3-03FF;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/OpenSans-hebrew.woff2") format("woff2");
    unicode-range: U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC,
                  U+FB1D-FB4F;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/OpenSans-math.woff2") format("woff2");
    unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315,
                  U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333,
                  U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9,
                  U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5,
                  U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047,
                  U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E,
                  U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112,
                  U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192,
                  U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211,
                  U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319,
                  U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7,
                  U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7,
                  U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F,
                  U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE,
                  U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/OpenSans-symbols.woff2") format("woff2");
    unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0,
                  U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199,
                  U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299,
                  U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF,
                  U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF,
                  U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E,
                  U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB,
                  U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF,
                  U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315,
                  U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D,
                  U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF,
                  U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0,
                  U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415,
                  U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444,
                  U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D,
                  U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF,
                  U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6,
                  U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE,
                  U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513,
                  U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F,
                  U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD,
                  U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF,
                  U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC,
                  U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859,
                  U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1,
                  U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9,
                  U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6,
                  U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/OpenSans-vietnamese.woff2") format("woff2");
    unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169,
                  U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304,
                  U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/OpenSans-latin-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
                  U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF,
                  U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
                  U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/OpenSans-latin.woff2") format("woff2");
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
                  U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC,
                  U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/OpenSans-cyrillic-ext.woff2") format("woff2");
    unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F,
                  U+FE2E-FE2F;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/OpenSans-cyrillic.woff2") format("woff2");
    unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/OpenSans-greek-ext.woff2") format("woff2");
    unicode-range: U+1F00-1FFF;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/OpenSans-greek.woff2") format("woff2");
    unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1,
                  U+03A3-03FF;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/OpenSans-hebrew.woff2") format("woff2");
    unicode-range: U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC,
                  U+FB1D-FB4F;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/OpenSans-math.woff2") format("woff2");
    unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315,
                  U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333,
                  U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9,
                  U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5,
                  U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047,
                  U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E,
                  U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112,
                  U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192,
                  U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211,
                  U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319,
                  U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7,
                  U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7,
                  U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F,
                  U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE,
                  U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/OpenSans-symbols.woff2") format("woff2");
    unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0,
                  U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199,
                  U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299,
                  U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF,
                  U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF,
                  U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E,
                  U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB,
                  U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF,
                  U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315,
                  U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D,
                  U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF,
                  U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0,
                  U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415,
                  U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444,
                  U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D,
                  U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF,
                  U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6,
                  U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE,
                  U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513,
                  U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F,
                  U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD,
                  U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF,
                  U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC,
                  U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859,
                  U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1,
                  U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9,
                  U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6,
                  U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/OpenSans-vietnamese.woff2") format("woff2");
    unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169,
                  U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304,
                  U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/OpenSans-latin-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
                  U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF,
                  U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
                  U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
    font-family: "Open Sans"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/OpenSans-latin.woff2") format("woff2");
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
                  U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC,
                  U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/RobotoMono-cyrillic-ext.woff2") format("woff2");
    unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F,
                  U+FE2E-FE2F;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/RobotoMono-cyrillic.woff2") format("woff2");
    unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/RobotoMono-greek.woff2") format("woff2");
    unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1,
                  U+03A3-03FF;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/RobotoMono-vietnamese.woff2") format("woff2");
    unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169,
                  U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304,
                  U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/RobotoMono-latin-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
                  U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF,
                  U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
                  U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/RobotoMono-latin.woff2") format("woff2");
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
                  U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC,
                  U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/RobotoMono-cyrillic-ext.woff2") format("woff2");
    unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F,
                  U+FE2E-FE2F;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/RobotoMono-cyrillic.woff2") format("woff2");
    unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/RobotoMono-greek.woff2") format("woff2");
    unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1,
                  U+03A3-03FF;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/RobotoMono-vietnamese.woff2") format("woff2");
    unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169,
                  U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304,
                  U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/RobotoMono-latin-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
                  U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF,
                  U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
                  U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/RobotoMono-latin.woff2") format("woff2");
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
                  U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC,
                  U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/RobotoMono-cyrillic-ext.woff2") format("woff2");
    unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F,
                  U+FE2E-FE2F;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/RobotoMono-cyrillic.woff2") format("woff2");
    unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/RobotoMono-greek.woff2") format("woff2");
    unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1,
                  U+03A3-03FF;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/RobotoMono-vietnamese.woff2") format("woff2");
    unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169,
                  U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304,
                  U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/RobotoMono-latin-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
                  U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF,
                  U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
                  U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/RobotoMono-latin.woff2") format("woff2");
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
                  U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC,
                  U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/RobotoMono-cyrillic-ext.woff2") format("woff2");
    unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F,
                  U+FE2E-FE2F;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/RobotoMono-cyrillic.woff2") format("woff2");
    unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/RobotoMono-greek.woff2") format("woff2");
    unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1,
                  U+03A3-03FF;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/RobotoMono-vietnamese.woff2") format("woff2");
    unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169,
                  U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304,
                  U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/RobotoMono-latin-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
                  U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF,
                  U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
                  U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
    font-family: "Roboto Mono"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/RobotoMono-latin.woff2") format("woff2");
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
                  U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC,
                  U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/JetBrainsMono-cyrillic-ext.woff2") format("woff2");
    unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F,
                  U+FE2E-FE2F;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/JetBrainsMono-cyrillic.woff2") format("woff2");
    unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/JetBrainsMono-greek.woff2") format("woff2");
    unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1,
                  U+03A3-03FF;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/JetBrainsMono-vietnamese.woff2") format("woff2");
    unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169,
                  U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304,
                  U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/JetBrainsMono-latin-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
                  U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF,
                  U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
                  U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 400;
    font-display: swap;
    src: url("fonts/JetBrainsMono-latin.woff2") format("woff2");
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
                  U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC,
                  U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/JetBrainsMono-cyrillic-ext.woff2") format("woff2");
    unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F,
                  U+FE2E-FE2F;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/JetBrainsMono-cyrillic.woff2") format("woff2");
    unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/JetBrainsMono-greek.woff2") format("woff2");
    unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1,
                  U+03A3-03FF;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/JetBrainsMono-vietnamese.woff2") format("woff2");
    unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169,
                  U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304,
                  U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/JetBrainsMono-latin-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
                  U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF,
                  U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
                  U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 500;
    font-display: swap;
    src: url("fonts/JetBrainsMono-latin.woff2") format("woff2");
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
                  U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC,
                  U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/JetBrainsMono-cyrillic-ext.woff2") format("woff2");
    unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F,
                  U+FE2E-FE2F;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/JetBrainsMono-cyrillic.woff2") format("woff2");
    unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/JetBrainsMono-greek.woff2") format("woff2");
    unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1,
                  U+03A3-03FF;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/JetBrainsMono-vietnamese.woff2") format("woff2");
    unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169,
                  U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304,
                  U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/JetBrainsMono-latin-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
                  U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF,
                  U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
                  U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 600;
    font-display: swap;
    src: url("fonts/JetBrainsMono-latin.woff2") format("woff2");
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
                  U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC,
                  U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/JetBrainsMono-cyrillic-ext.woff2") format("woff2");
    unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F,
                  U+FE2E-FE2F;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/JetBrainsMono-cyrillic.woff2") format("woff2");
    unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/JetBrainsMono-greek.woff2") format("woff2");
    unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1,
                  U+03A3-03FF;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/JetBrainsMono-vietnamese.woff2") format("woff2");
    unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169,
                  U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304,
                  U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/JetBrainsMono-latin-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
                  U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF,
                  U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
                  U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
    font-family: "JetBrains Mono"; font-style: normal; font-weight: 700;
    font-display: swap;
    src: url("fonts/JetBrainsMono-latin.woff2") format("woff2");
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
                  U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC,
                  U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* generated by tools/extract_fonts.py >>> */

/* ── Tokens ──────────────────────────────────────────────────────────────────

   Every value here is lifted from the artboards. The variable *names* are
   unchanged from the previous build so no rule downstream needed editing —
   only what they point at.

   Two things worth knowing before changing any of them:

   · Success is the brand. There is no second green. A separate --confirm was
     what made the old build read as two competing greens at once.
   · There is no amber. Green says confirmed, --flag (deep green) says
     amended, grey says outstanding, red says faulty — and nothing else may
     mean any of those. tests/test_stylesheet.py enforces this by hue, so a
     new orange cannot creep back in under another name.
   ───────────────────────────────────────────────────────────────────────── */

:root, [data-theme="portal"] {
    /* surfaces */
    --ground: #F4F6F5;            /* the page behind the cards */
    --sheet: #FFFFFF;
    --sheet-sunk: #F8FAF9;        /* card header strip, thead, panel foot */
    --track: #E6EEEA;             /* progress track, segmented-control track */

    /* rules — the artboards use four weights, each with a job */
    --rule: #DDE5E1;              /* card border, header and footer rules */
    --rule-soft: #E6EEEA;         /* inside a card */
    --rule-faint: #EEF3F0;        /* between rows of one table */
    --rule-strong: #CDD9D3;       /* input border, quiet-button border */
    --field-border: #CDD9D3;      /* the same value, named for its one job */

    /* ink — four steps, not two */
    --ink: #14241D;
    --ink-muted: #4A5D55;
    --ink-faint: #7D8F87;         /* "AU REGISTRE CFCA" small caps */
    --ink-ghost: #9AABA3;         /* separators, an unselected radio ring */

    /* brand */
    --brand: #0B6B4A;
    --brand-strong: #0B6B4A;      /* was a second green; now the same one */
    --brand-hover: #084D36;
    --brand-deep: #084D36;
    --brand-soft: #EEF5F1;        /* selected tint, notice ground */
    --brand-tint: #F0F6F3;        /* the current row of a list */
    --brand-ink: #084D36;         /* chip text on --brand-soft */
    --on-brand: #FFFFFF;
    --half: #7CCBB7;              /* half-progress tick, "En cours" swatch */
    --spoke-todo: #D5DDDA;        /* an unlit spoke */
    --swatch-none: #DDE4E1;

    /* the motif is three distinct tints — do not collapse them */
    --motif-portal: #EEF5F1;      /* 760px login backdrop */
    --motif-console: #E4EEEA;     /* 640px console-login backdrop */
    --motif-watermark: #E6EEEB;   /* 180px declaration watermark */

    /* success is the brand */
    --confirm: #0B6B4A;
    --confirm-soft: #EEF5F1;

    /* The one thing that is neither "confirmed" nor "wrong": an answer that
       has changed since last year, and a report reopened for amendment.

       The artboards draw the matching state — their "En cours" dot — in amber
       #B7791F. We do not: green says confirmed, grey says outstanding, red
       says faulty, and nothing else may mean any of those. That decision is
       older than these artboards and it stands. tests/test_stylesheet.py
       enforces it by hue, so a new orange cannot creep back under a new name. */
    --flag: #9AABA3;              /* outstanding: the grey, not an amber */
    --flag-soft: #EEF3F0;

    /* Red is for faults only: a reconciliation that does not balance, an
       error summary, a deadline already missed. */
    --danger: #B42318;
    --danger-soft: #FEF3F2;

    --row-hover: #F0F6F3;         /* a console row under the pointer */

    --bar: #FFFFFF;
    --on-bar: #14241D;
    --on-bar-muted: #4A5D55;

    /* The artboards focus every control the same way, and it is a real
       outline offset by a pixel rather than the previous border swap. */
    --focus: #0B6B4A;
    --focus-ring: 0 0 0 4px #EEF5F1;

    /* There is exactly one shadow in the September artboards, on the header
       dropdown. Every other surface is a hairline on white. */
    --shadow-sheet: none;
    --shadow-pop: 0 10px 15px -3px rgba(0, 0, 0, .1),
                  0 4px 6px -4px rgba(0, 0, 0, .1);
}

/* The console is the same components in a denser rhythm. It is not a dark
   app: its masthead is white too — the 272px rail is what tells the two
   apart, not a colour. */
/* The console takes the same tokens. What tells the two apps apart is the
   272px rail, not a colour — and the console's ground is white rather than
   the portal's #F4F6F5, because a rail app with a tinted canvas reads as two
   panels rather than one screen. */
[data-theme="console"] {
    --ground: #FFFFFF;
    --sheet-sunk: #F8FAF9;
    --bar: #FFFFFF;
    --on-bar: #14241D;
    --on-bar-muted: #4A5D55;
    --shadow-sheet: none;
}

:root {
    --space-1: 4px;  --space-2: 8px;   --space-3: 12px;  --space-4: 16px;
    --space-5: 20px; --space-6: 24px;  --space-8: 32px;  --space-12: 48px;
    --space-16: 64px;

    /* The September artboards use four radii and no more: 3 for a mono code
       badge, 4 for anything you can press or type in, 6 for a card, and a
       pill for a status chip. The previous build had nine. */
    --r-3: 3px;      /* mono code badge, tick strip */
    --r-4: 4px;      /* input, button, segment, notice */
    --r-6: 6px;      /* card, panel, table wrapper, rail chip */
    --r-pill: 9999px;

    /* Kept so the console's own rules keep resolving while it is brought
       across; both collapse onto the four above. */
    --r-8: var(--r-6);   --r-10: var(--r-6);   --r-12: var(--r-6);
    --r-14: var(--r-6);  --r-16: var(--r-6);   --r-20: var(--r-6);

    /* Control heights are specified per context in the artboards rather than
       drawn from one scale, so they are listed rather than derived. */
    --h-input: 40px;       /* a field inside the form */
    --h-input-lg: 44px;    /* a field on the sign-in card */
    --h-btn: 44px;         /* prev, next, sign in */
    --h-btn-sm: 36px;      /* attach a file, a quiet action */
    --h-seg: 34px;         /* Confirmée / Modifiée */
    --h-pair: 40px;        /* Oui / Non */
    --h-chip: 24px;        --h-th: 40px;        --h-row: 48px;
    --h-header: 68px;      --h-footer: 56px;
    --h-mark: 34px;        /* a question chip in the rail */

    /* Kept while the console is brought across. */
    --h-cell: var(--h-input);      --h-field: var(--h-input-lg);
    --h-sigfield: var(--h-input-lg); --h-login: var(--h-input-lg);
    --h-submit: var(--h-btn);      --h-quiet: var(--h-btn-sm);
    --h-filter: 38px;              --h-console-btn: 40px;
    --h-search: 42px;              --h-icon: 44px;
    --h-nav: 44px;                 --h-nav-on: 48px;

    --rail: 300px;
    --w-body: 1440px;
    --pad-page: 32px;
    --pad-wide: 100px;

    --measure: 64ch;
    --control-height: var(--h-input);
    --control-height-dense: 32px;
    --row-height-dense: var(--h-row);

    /* The artboards' own three stacks. The headings really are monospace —
       that is a large part of how the reference reads — so --font-head is a
       separate token from --font-mono even though both are fixed-width: one
       is for display type, the other for figures, and they are different
       faces. */
    --font-sans: "Open Sans", system-ui, -apple-system, "Segoe UI", Helvetica,
                 Arial, sans-serif;
    --font-head: "Roboto Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;
    --font-mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;
}

/* ── Base ────────────────────────────────────────────────────────────────── */

*, *::before, *::after { box-sizing: border-box; }

/* The `hidden` attribute has to beat the component that owns the element.
   The UA stylesheet says `[hidden] { display: none }`, but any author rule
   setting a display — and .rg-gate2-panel, .rg-notice, .rg-recon-result and
   the country picker's panel all set one — outranks it, so the element stays
   on screen with its hidden attribute set and nothing looks wrong in the
   markup. That is how the amendment panel came to be visible beside an
   "Inchangée" answer. !important is the standard idiom here and is what a
   reset would give us. */
[hidden] { display: none !important; }

body {
    margin: 0; background: var(--ground); color: var(--ink);
    font-family: var(--font-sans); font-size: 15px; line-height: 24px;
    -webkit-font-smoothing: antialiased;
}

/* Display type is Roboto Mono in the artboards — the headings really are
   monospace, and that is a large part of how the reference reads. Set here
   once so every heading picks it up rather than each rule remembering. */
h1, h2, h3, .rg-head {
    font-family: var(--font-head); letter-spacing: -.025em;
}

.rg-num, .rg-amount-input, .rg-count, .rg-table td.rg-n {
    font-variant-numeric: tabular-nums lining-nums;
}
.rg-ref { font-family: var(--font-mono); font-size: 13px; line-height: 20px; }
.rg-overline {
    font-size: 11px; line-height: 16px; font-weight: 600; letter-spacing: .08em;
    color: var(--ink-muted);
}
.rg-sr, .vh {
    position: absolute !important;
    width: 1px !important; height: 1px !important;
    margin: -1px; padding: 0 !important; border: 0 !important;
    overflow: hidden; white-space: nowrap;
    clip: rect(0 0 0 0); clip-path: inset(50%);
    background: none !important;
}
.rg-muted { color: var(--ink-muted); }
.rg-danger { color: var(--danger); }

a { color: var(--brand); text-underline-offset: 3px; text-decoration-thickness: 1px; }
a:hover { color: var(--brand-deep); text-decoration-thickness: 2px; }
:focus-visible { outline: 2px solid var(--brand); outline-offset: 1px; }

@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: .01ms !important; transition-duration: .01ms !important;
    }
}
/* The app is one flex column that owns the viewport; `.rg-page` is its
   growing child, so the action bar it ends with lands on the bottom edge of a
   short page and stays in flow on a long one. */
.rg-app { min-height: 100vh; display: flex; flex-direction: column; }
.rg-page { flex: 1 0 auto; display: flex; flex-direction: column; }
.rg-page > .rg-shell { flex: 1 0 auto; }

/* Meter and column widths, as classes: style-src 'self' blocks the inline
   style attribute a percentage would otherwise need. */
.rg-w0   { width: 0%;   } .rg-w5   { width: 5%;   } .rg-w10  { width: 10%;  }
.rg-w15  { width: 15%;  } .rg-w20  { width: 20%;  } .rg-w25  { width: 25%;  }
.rg-w30  { width: 30%;  } .rg-w35  { width: 35%;  } .rg-w40  { width: 40%;  }
.rg-w45  { width: 45%;  } .rg-w50  { width: 50%;  } .rg-w55  { width: 55%;  }
.rg-w60  { width: 60%;  } .rg-w65  { width: 65%;  } .rg-w70  { width: 70%;  }
.rg-w75  { width: 75%;  } .rg-w80  { width: 80%;  } .rg-w85  { width: 85%;  }
.rg-w90  { width: 90%;  } .rg-w95  { width: 95%;  } .rg-w100 { width: 100%; }


/* The reconciliation bar needs finer steps than the 5% above: on a three-segment
   bar, rounding a shortfall to the nearest 5% makes the gap segment jump between
   nothing and something, which is exactly the reading the bar exists to give. */
.rg-f0   { width: 0%; } .rg-f1   { width: 1%; } .rg-f2   { width: 2%; } .rg-f3   { width: 3%; } .rg-f4   { width: 4%; }
.rg-f5   { width: 5%; } .rg-f6   { width: 6%; } .rg-f7   { width: 7%; } .rg-f8   { width: 8%; } .rg-f9   { width: 9%; }
.rg-f10  { width: 10%; } .rg-f11  { width: 11%; } .rg-f12  { width: 12%; } .rg-f13  { width: 13%; } .rg-f14  { width: 14%; }
.rg-f15  { width: 15%; } .rg-f16  { width: 16%; } .rg-f17  { width: 17%; } .rg-f18  { width: 18%; } .rg-f19  { width: 19%; }
.rg-f20  { width: 20%; } .rg-f21  { width: 21%; } .rg-f22  { width: 22%; } .rg-f23  { width: 23%; } .rg-f24  { width: 24%; }
.rg-f25  { width: 25%; } .rg-f26  { width: 26%; } .rg-f27  { width: 27%; } .rg-f28  { width: 28%; } .rg-f29  { width: 29%; }
.rg-f30  { width: 30%; } .rg-f31  { width: 31%; } .rg-f32  { width: 32%; } .rg-f33  { width: 33%; } .rg-f34  { width: 34%; }
.rg-f35  { width: 35%; } .rg-f36  { width: 36%; } .rg-f37  { width: 37%; } .rg-f38  { width: 38%; } .rg-f39  { width: 39%; }
.rg-f40  { width: 40%; } .rg-f41  { width: 41%; } .rg-f42  { width: 42%; } .rg-f43  { width: 43%; } .rg-f44  { width: 44%; }
.rg-f45  { width: 45%; } .rg-f46  { width: 46%; } .rg-f47  { width: 47%; } .rg-f48  { width: 48%; } .rg-f49  { width: 49%; }
.rg-f50  { width: 50%; } .rg-f51  { width: 51%; } .rg-f52  { width: 52%; } .rg-f53  { width: 53%; } .rg-f54  { width: 54%; }
.rg-f55  { width: 55%; } .rg-f56  { width: 56%; } .rg-f57  { width: 57%; } .rg-f58  { width: 58%; } .rg-f59  { width: 59%; }
.rg-f60  { width: 60%; } .rg-f61  { width: 61%; } .rg-f62  { width: 62%; } .rg-f63  { width: 63%; } .rg-f64  { width: 64%; }
.rg-f65  { width: 65%; } .rg-f66  { width: 66%; } .rg-f67  { width: 67%; } .rg-f68  { width: 68%; } .rg-f69  { width: 69%; }
.rg-f70  { width: 70%; } .rg-f71  { width: 71%; } .rg-f72  { width: 72%; } .rg-f73  { width: 73%; } .rg-f74  { width: 74%; }
.rg-f75  { width: 75%; } .rg-f76  { width: 76%; } .rg-f77  { width: 77%; } .rg-f78  { width: 78%; } .rg-f79  { width: 79%; }
.rg-f80  { width: 80%; } .rg-f81  { width: 81%; } .rg-f82  { width: 82%; } .rg-f83  { width: 83%; } .rg-f84  { width: 84%; }
.rg-f85  { width: 85%; } .rg-f86  { width: 86%; } .rg-f87  { width: 87%; } .rg-f88  { width: 88%; } .rg-f89  { width: 89%; }
.rg-f90  { width: 90%; } .rg-f91  { width: 91%; } .rg-f92  { width: 92%; } .rg-f93  { width: 93%; } .rg-f94  { width: 94%; }
.rg-f95  { width: 95%; } .rg-f96  { width: 96%; } .rg-f97  { width: 97%; } .rg-f98  { width: 98%; } .rg-f99  { width: 99%; }


/* Left offsets, for the one thing that is positioned rather than sized: the
   mark showing where the declared total falls on the reconciliation bar. */
.rg-l0   { left: 0%; } .rg-l1   { left: 1%; } .rg-l2   { left: 2%; } .rg-l3   { left: 3%; } .rg-l4   { left: 4%; }
.rg-l5   { left: 5%; } .rg-l6   { left: 6%; } .rg-l7   { left: 7%; } .rg-l8   { left: 8%; } .rg-l9   { left: 9%; }
.rg-l10  { left: 10%; } .rg-l11  { left: 11%; } .rg-l12  { left: 12%; } .rg-l13  { left: 13%; } .rg-l14  { left: 14%; }
.rg-l15  { left: 15%; } .rg-l16  { left: 16%; } .rg-l17  { left: 17%; } .rg-l18  { left: 18%; } .rg-l19  { left: 19%; }
.rg-l20  { left: 20%; } .rg-l21  { left: 21%; } .rg-l22  { left: 22%; } .rg-l23  { left: 23%; } .rg-l24  { left: 24%; }
.rg-l25  { left: 25%; } .rg-l26  { left: 26%; } .rg-l27  { left: 27%; } .rg-l28  { left: 28%; } .rg-l29  { left: 29%; }
.rg-l30  { left: 30%; } .rg-l31  { left: 31%; } .rg-l32  { left: 32%; } .rg-l33  { left: 33%; } .rg-l34  { left: 34%; }
.rg-l35  { left: 35%; } .rg-l36  { left: 36%; } .rg-l37  { left: 37%; } .rg-l38  { left: 38%; } .rg-l39  { left: 39%; }
.rg-l40  { left: 40%; } .rg-l41  { left: 41%; } .rg-l42  { left: 42%; } .rg-l43  { left: 43%; } .rg-l44  { left: 44%; }
.rg-l45  { left: 45%; } .rg-l46  { left: 46%; } .rg-l47  { left: 47%; } .rg-l48  { left: 48%; } .rg-l49  { left: 49%; }
.rg-l50  { left: 50%; } .rg-l51  { left: 51%; } .rg-l52  { left: 52%; } .rg-l53  { left: 53%; } .rg-l54  { left: 54%; }
.rg-l55  { left: 55%; } .rg-l56  { left: 56%; } .rg-l57  { left: 57%; } .rg-l58  { left: 58%; } .rg-l59  { left: 59%; }
.rg-l60  { left: 60%; } .rg-l61  { left: 61%; } .rg-l62  { left: 62%; } .rg-l63  { left: 63%; } .rg-l64  { left: 64%; }
.rg-l65  { left: 65%; } .rg-l66  { left: 66%; } .rg-l67  { left: 67%; } .rg-l68  { left: 68%; } .rg-l69  { left: 69%; }
.rg-l70  { left: 70%; } .rg-l71  { left: 71%; } .rg-l72  { left: 72%; } .rg-l73  { left: 73%; } .rg-l74  { left: 74%; }
.rg-l75  { left: 75%; } .rg-l76  { left: 76%; } .rg-l77  { left: 77%; } .rg-l78  { left: 78%; } .rg-l79  { left: 79%; }
.rg-l80  { left: 80%; } .rg-l81  { left: 81%; } .rg-l82  { left: 82%; } .rg-l83  { left: 83%; } .rg-l84  { left: 84%; }
.rg-l85  { left: 85%; } .rg-l86  { left: 86%; } .rg-l87  { left: 87%; } .rg-l88  { left: 88%; } .rg-l89  { left: 89%; }
.rg-l90  { left: 90%; } .rg-l91  { left: 91%; } .rg-l92  { left: 92%; } .rg-l93  { left: 93%; } .rg-l94  { left: 94%; }
.rg-l95  { left: 95%; } .rg-l96  { left: 96%; } .rg-l97  { left: 97%; } .rg-l98  { left: 98%; } .rg-l99  { left: 99%; }
.rg-l100 { left: 100%; }
.rg-f100 { width: 100%; }

/* ── Masthead (portal) ───────────────────────────────────────────────────── */

.rg-masthead { background: var(--bar); color: var(--on-bar); border-bottom: 1px solid var(--rule); }
/* Its own width and centring. This used to be an .rg-shell as well, which won
   the cascade and gave the band 32px of top padding and no bottom padding. */
.rg-masthead-inner {
    display: flex; align-items: center; gap: var(--space-4);
    height: var(--h-header); max-width: var(--w-body);
    margin: 0 auto; padding: 0 var(--pad-page);
}
.rg-authority { display: flex; flex-direction: column; line-height: 1.15; min-width: 0; }
.rg-authority-name {
    font-weight: 600; font-size: 20px; letter-spacing: -.01em; color: var(--on-bar);
    text-decoration: none;
}
.rg-authority-doc {
    font-size: 12px; font-weight: 400; letter-spacing: .08em;
    color: var(--ink-muted); margin-top: 0; white-space: nowrap;
    overflow: hidden; text-overflow: ellipsis;
}
.rg-masthead-meta {
    margin-left: auto; display: flex; align-items: center; gap: var(--space-5);
    font-size: 14px; color: var(--ink-muted); flex: none;
}
/* Company over year, right-aligned: two facts in the width of one. */
.rg-chip-co {
    display: inline-flex; flex-direction: column; align-items: flex-end;
    line-height: 1.3; min-width: 0;
}
.rg-masthead-co {
    font-weight: 600; color: var(--ink); max-width: 240px;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.rg-masthead-year { font-size: 12px; color: var(--ink-muted); white-space: nowrap; }
.rg-lang {
    display: inline-flex; border: 1px solid var(--rule); overflow: hidden;
    border-radius: var(--r-4);
}
.rg-lang a {
    padding: 5px 10px; font-size: 12px; font-weight: 600;
    color: var(--ink-muted); text-decoration: none;
}
.rg-lang a[aria-current] { background: var(--brand); color: var(--on-brand); }
.rg-lockup-mark {
    width: 40px; height: 40px; flex: none; border-radius: 50%;
    border: 1.5px solid var(--brand); display: grid; place-items: center;
    font-size: 11px; font-weight: 600; letter-spacing: .02em; color: var(--brand-deep);
}
.rg-lockup { display: flex; align-items: center; gap: var(--space-3); text-decoration: none; }

/* The official lockup is a bitmap, so it is sized by height only and the
   width follows — a fixed width would resample the wordmark. `height: auto`
   on the width attribute's account keeps it sharp on a retina screen, where
   the 1053px source is drawn into 133 CSS pixels. */
.rg-lockup-logo { display: block; height: 34px; width: auto; flex: none; }
/* The hairline is what stops the document's name reading as part of the
   wordmark. It is the only rule in the masthead. */
.rg-lockup-rule { width: 1px; height: 28px; background: var(--rule); flex: none; }
.rg-lockup .rg-authority-doc { margin-top: 0; }
.rg-sun-mark { display: block; }

/* "Deconnexion" as words, not an icon in a box. An icon-only sign-out in a
   masthead is a guess the reader has to make; the artboards spell it. */
.rg-masthead-out {
    font-size: 14px; color: var(--ink-muted); text-decoration: none;
    white-space: nowrap;
}
.rg-masthead-out:hover { color: var(--brand); text-decoration: none; }

@media (max-width: 720px) {
    .rg-authority-doc, .rg-lockup-rule, .rg-masthead-year { display: none; }
    .rg-masthead-co { max-width: 140px; }
    .rg-masthead-meta { gap: var(--space-3); }
    .rg-lockup-logo { height: 28px; }
}

/* ── the part band: title, deadline meter, and the eight tabs ───────────── */

/* A full-bleed white band under the masthead, not a heading inside the form
   column. In the artboards it spans the window and is bordered underneath,
   which is what separates "which part am I on" from "what does it ask". */
.rg-partband { background: var(--sheet); border-bottom: 1px solid var(--rule); }
.rg-partband-inner {
    max-width: var(--w-body); margin: 0 auto;
    padding: 28px var(--pad-page) 0;
    display: flex; flex-direction: column; gap: var(--space-5);
}
.rg-partband-top {
    display: flex; justify-content: space-between; align-items: flex-end;
    gap: var(--space-6); flex-wrap: wrap;
}
.rg-stephead { display: flex; flex-direction: column; gap: var(--space-2); max-width: 720px; }
.rg-part { font-size: 12px; color: var(--ink-muted); margin: 0; }
.rg-part-sep { color: var(--ink-ghost); }
.rg-steptitle {
    font-family: var(--font-head); font-weight: 700; color: var(--brand-deep);
    font-size: 32px; line-height: 1.2; letter-spacing: -.025em; margin: 0;
    text-wrap: balance;
}
.rg-steplede {
    margin: 0; max-width: var(--measure); color: var(--ink-muted);
    font-size: 15px; line-height: 1.6; text-wrap: pretty;
}

/* Échéance · Statut · Parties, in three celled boxes. */
.rg-bandmeter {
    display: flex; border: 1px solid var(--rule); border-radius: var(--r-4);
    font-size: 13px; flex: none;
}
.rg-bandmeter > div {
    padding: 10px var(--space-4); display: flex; flex-direction: column; gap: 2px;
}
.rg-bandmeter > div + div { border-left: 1px solid var(--rule); }
.rg-bandmeter dt, .rg-bandmeter-l {
    font-size: 11px; letter-spacing: .06em; color: var(--ink-muted); margin: 0;
}
.rg-bandmeter dd, .rg-bandmeter-v {
    margin: 0; font-family: var(--font-mono); font-variant-numeric: tabular-nums;
}
.rg-bandmeter-v[data-tone="over"] {
    font-family: var(--font-sans); color: var(--danger); font-weight: 600;
}

@media (max-width: 640px) {
    .rg-steptitle { font-size: 24px; line-height: 30px; }
    .rg-partband-inner { padding-top: var(--space-5); gap: var(--space-4); }
    .rg-bandmeter { width: 100%; }
}

/* ── Card ────────────────────────────────────────────────────────────────── */

.rg-card {
    background: var(--sheet); border: 1px solid var(--rule); border-radius: var(--r-6);
    box-shadow: var(--shadow-sheet); padding: var(--space-6); margin: 0;
    min-width: 0;   /* a fieldset does not shrink below its content without this */
}
.rg-card + .rg-card { margin-top: var(--space-3); }
.rg-card-head {
    display: flex; align-items: center; gap: var(--space-3);
    margin: 0 0 var(--space-4); padding: 0 0 var(--space-4);
    border-bottom: 1px solid var(--rule-soft); width: 100%;
}
.rg-card-num {
    font-family: var(--font-mono); font-weight: 600; font-size: 11px;
    color: var(--brand); background: var(--brand-soft); border-radius: var(--r-3);
    padding: 3px 6px;
}
.rg-card-title { font-weight: 600; font-size: 15px; line-height: 22px; margin: 0; }
.rg-card-status { margin-left: auto; font-size: 12px; color: var(--ink-muted); white-space: nowrap; }
.rg-card-intro { margin: 0 0 var(--space-4); color: var(--ink-muted); font-size: 14px; line-height: 1.6; max-width: var(--measure); text-wrap: pretty; }

@media (max-width: 640px) {
    .rg-card { padding: var(--space-4); border-left: 0; border-right: 0; border-radius: 0; }
    .rg-card-num { min-width: 0; }
}

/* ── Field ───────────────────────────────────────────────────────────────── */

.rg-field { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.rg-field + .rg-field { margin-top: var(--space-4); }
.rg-label { font-size: 14px; line-height: 20px; font-weight: 500; color: var(--ink); }
.rg-optional { font-weight: 400; color: var(--ink-muted); }
.rg-hint { font-size: 13px; line-height: 20px; color: var(--ink-muted); margin: 0; }
.rg-fieldnum {
    font-family: var(--font-mono); font-size: 12px; font-weight: 600;
    color: var(--brand);
}

.rg-input, .rg-select, .rg-textarea {
    font-family: var(--font-sans); font-size: 14px; color: var(--ink);
    background: var(--sheet);
    border: 1px solid var(--field-border); border-radius: var(--r-4);
    height: var(--h-input); padding: 0 var(--space-3);
    width: 100%; margin-top: 0;
}
.rg-textarea {
    height: auto; min-height: 140px; padding: var(--space-3);
    line-height: 22px; resize: vertical;
}
/* Without the reset a <select> draws the platform's own chevron, which is a
   different shape on every machine. The arrow below is part of the
   stylesheet, not an inline style, so style-src 'self' is unaffected. */
.rg-select {
    appearance: none; -webkit-appearance: none;
    padding-right: var(--space-8);
    /* viewBox *and* background-size. Without the viewBox the SVG has no
       intrinsic ratio, and a background image with no ratio is stretched to
       the positioning area — which is how this 16px chevron came to be
       drawn 300px wide across the nationalities table. */
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16' fill='none' stroke='%234A5D55' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6l4 4 4-4'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-size: 16px 16px;
    background-position: right var(--space-3) center;
}
.rg-input:hover, .rg-select:hover, .rg-textarea:hover { border-color: var(--ink-ghost); }
/* One focus treatment for every control, and it is the artboards' own: a real
   outline a pixel clear of the box, not a border swap. */
.rg-input:focus-visible, .rg-select:focus-visible, .rg-textarea:focus-visible {
    outline: 2px solid var(--brand); outline-offset: 1px;
    border-color: var(--field-border); box-shadow: none;
}
.rg-input[readonly] { background: var(--sheet-sunk); border-color: var(--rule); }
.rg-input:disabled, .rg-select:disabled, .rg-textarea:disabled {
    background: var(--sheet-sunk); color: var(--ink-muted); cursor: not-allowed;
}
.rg-input::placeholder, .rg-textarea::placeholder { color: var(--ink-muted); opacity: .8; }

.rg-field[data-invalid] .rg-input,
.rg-field[data-invalid] .rg-select,
.rg-field[data-invalid] .rg-textarea,
.rg-field[data-invalid] .combo__input {
    border-color: var(--danger); box-shadow: inset 0 0 0 1px var(--danger);
}
.rg-error {
    font-size: 14px; line-height: 20px; color: var(--danger); font-weight: 500;
    margin: 0; display: flex; gap: 6px;
}
.rg-error::before {
    content: "!"; flex: none; width: 18px; height: 18px; margin-top: 1px;
    border-radius: 50%; background: var(--danger); color: var(--sheet);
    font-size: 12px; line-height: 18px; text-align: center; font-weight: 700;
}
.rg-w-short { max-width: 200px; }

[data-theme="console"] .rg-input, [data-theme="console"] .rg-select {
    height: var(--control-height-dense); font-size: 14px;
}

/* ── a question and its answer, as a row ─────────────────────────────────

   The source form draws every plain-fields section as a two-cell table row —
   the question on the left, the answer box on the right — whether the label
   is a sentence ("Quel est le nombre de l'effectif salarié total ?") or a
   noun ("Nom"). This mirrors that.

   It replaced a grid of stacked label-over-input cells, which at the form's
   width resolved to three columns and left a long question towering over its
   neighbours. In one column every answer on the card lines up, which is the
   thing that actually makes a long card readable.
   ───────────────────────────────────────────────────────────────────────── */

.rg-qrows { display: flex; flex-direction: column; }
/* Where the source form closes one table and opens another inside a single
   subsection — III.B does it after the fifth question — the break is a real
   division of the material, so it is drawn rather than smoothed over. */
.rg-qrows-break { height: var(--space-6); }
.rg-qrows-break + .rg-qrow { border-top-width: 2px; border-top-color: var(--rule); }
.rg-qrow {
    /* The question column is capped, not 1fr. At 1440px a `1fr` question
       column is ~760px wide, so a short label like "Nom et fonction de la
       personne" left six hundred pixels of white between itself and its own
       input — the two stopped reading as one row. 520px is also about the
       measure a question should wrap at. */
    display: grid; grid-template-columns: minmax(0, 520px) 280px;
    justify-content: start;
    gap: var(--space-5); align-items: start;
    padding: var(--space-4) 0; border-top: 1px solid var(--rule-faint);
}
.rg-qrows > .rg-qrow:first-child { border-top: 0; padding-top: 0; }

/* Prose and lists do not fit a 260px column, so they take the width and put
   the question above themselves — which is also what the source gives them. */
.rg-qrow[data-wide] {
    grid-template-columns: minmax(0, 1fr); gap: var(--space-2);
    justify-content: stretch;
    padding: var(--space-5) 0;
}
.rg-qrow[data-wide] .rg-qrow-label { max-width: var(--measure); }
.rg-qrow[data-wide] .rg-textarea { min-height: 96px; }

.rg-qrow-ask {
    display: grid; grid-template-columns: auto minmax(0, 1fr);
    gap: 2px var(--space-3); align-items: baseline;
}
/* Its own column, so "III.A 1" stops running into the word after it. */
.rg-qrow-num {
    grid-row: 1 / span 2; align-self: start;
    font-family: var(--font-mono); font-size: 12px; font-weight: 600;
    color: var(--brand); white-space: nowrap;
}
.rg-qrow-label {
    font-size: 14px; line-height: 1.55; font-weight: 500; color: var(--ink);
    text-wrap: pretty;
}
.rg-qrow-ask .rg-hint { grid-column: 2; margin-top: 2px; }
.rg-qrow-ask > .rg-qrow-label:only-child,
.rg-qrow-ask > .rg-hint:first-child { grid-column: 1 / -1; }

.rg-qrow-answer { display: flex; flex-direction: column; gap: var(--space-3); min-width: 0; }
.rg-qrow-answer > .rg-input,
.rg-qrow-answer > .rg-select { width: 100%; }
/* A date box is narrower than a name box; 260px leaves the calendar button
   marooned at the end of an empty field. */
.rg-qrow-answer .rg-datefield { max-width: 220px; }

/* One question, more than one box. The small name is what tells them apart —
   "À fin décembre 2025" against "À fin mars 2026" — and without it the two
   boxes were indistinguishable, which is how the same figure ends up in
   both. */
.rg-qsub { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.rg-qsub-label { font-size: 12px; color: var(--ink-muted); line-height: 1.4; }

@media (max-width: 720px) {
    .rg-qrow { grid-template-columns: minmax(0, 1fr); gap: var(--space-2); }
}

/* The field grid inside a card. `auto-fit` rather than a fixed two columns:
   the artboards use repeat(auto-fit, minmax(220px, 1fr)) everywhere, which
   gives two columns in the form and one in the rail without a media query,
   and drops to one on a phone by itself. */
.rg-grid {
    display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--space-4);
}
@media (max-width: 720px) { .rg-grid { grid-template-columns: minmax(0, 1fr); } }
.rg-grid > .rg-field + .rg-field { margin-top: 0; }
.rg-span2 { grid-column: 1 / -1; }

/* ── Choice (segmented radio) ────────────────────────────────────────────── */

/* Standalone yes/no questions use the same segmented track as Partie I and
   the question tables — see .rg-seg. The .rg-choice pill that used to live
   here was a third way of asking the same question. */
.rg-seg-inline { max-width: 260px; margin-top: var(--space-1); }
.rg-field[data-invalid] .rg-seg-opt { border-color: var(--danger); }

/* Checkbox list (multi-answer questions). */
.rg-checks { display: flex; flex-direction: column; gap: var(--space-2); margin-top: var(--space-2); }
.rg-check {
    display: flex; align-items: flex-start; gap: var(--space-2);
    font-size: 15px; color: var(--ink); cursor: pointer;
}
.rg-check input { margin: 3px 0 0; width: 16px; height: 16px; accent-color: var(--brand-strong); flex: none; }


.rg-gate-onfile .rg-overline { font-size: 11px; }

.rg-gate-amend .rg-field + .rg-field { margin-top: 0; }
.rg-gate .rg-error { grid-column: 1 / -1; }

.rg-unitdecl .rg-hint { grid-column: 1 / -1; }

.rg-amount {
    display: flex; align-items: stretch; margin-top: var(--space-1);
    border: 1px solid var(--rule-strong); border-radius: var(--r-12);
    background: var(--sheet); max-width: 340px;
}
.rg-amount:focus-within { outline: none; border-color: var(--focus); box-shadow: var(--focus-ring); }
.rg-amount-input {
    flex: 1; min-width: 0; border: 0; background: transparent; font: inherit;
    font-family: var(--font-mono); font-size: 20px; font-weight: 500;
    text-align: right; padding: 0 var(--space-3);
    min-height: var(--control-height); color: var(--ink);
}
.rg-amount-input:focus { outline: none; }
.rg-amount-unit {
    display: flex; align-items: center; padding: 0 var(--space-3);
    border-left: 1px solid var(--rule); background: var(--sheet-sunk);
    font-size: 13px; font-weight: 600; letter-spacing: .04em; color: var(--ink-muted);
    border-radius: 0 var(--r-12) var(--r-12) 0; white-space: nowrap;
}
.rg-echo {
    font-size: 14px; line-height: 20px; color: var(--ink-muted);
    margin: var(--space-1) 0 0; max-width: 340px; text-align: right;
    font-variant-numeric: tabular-nums;
}
.rg-echo strong { font-weight: 600; color: var(--ink); }
.rg-field[data-invalid] .rg-amount { border-color: var(--danger); box-shadow: inset 0 0 0 1px var(--danger); }

/* ── Reconciliation ──────────────────────────────────────────────────────── */

.rg-recon-result {
    display: flex; justify-content: space-between; gap: var(--space-4);
    margin-top: var(--space-6); padding: var(--space-2) var(--space-3);
    border-radius: var(--r-10); font-size: 14px; font-weight: 500;
    max-width: 520px; flex-wrap: wrap;
}
.rg-recon-result[data-state="ok"] { background: var(--confirm-soft); color: var(--confirm); }
.rg-recon-result[data-state="off"] { background: var(--danger-soft); color: var(--danger); }
.rg-recon-result[data-state="warn"] { background: var(--danger-soft); color: var(--danger); }
.rg-recon-figure { font-variant-numeric: tabular-nums; white-space: nowrap; }
.rg-recon-note { flex-basis: 100%; font-weight: 400; }
.rg-meter-stack .s-filed { background: var(--confirm); }
.rg-meter-stack .s-progress { background: var(--half); }

/* ── Repeatable table ────────────────────────────────────────────────────── */

.rg-rtable-wrap {
    overflow-x: auto; border: 1px solid var(--rule); border-radius: var(--r-6);
    margin-top: var(--space-2);
}
.rg-rtable { width: 100%; border-collapse: collapse; font-size: 14px; }
.rg-rtable th {
    text-align: left; font-size: 11px; line-height: 16px; font-weight: 600;
    letter-spacing: .06em; color: var(--ink-muted); background: var(--sheet-sunk);
    height: var(--h-th); padding: 0 var(--space-3);
    border-bottom: 1px solid var(--rule); white-space: nowrap;
}
/* Tight cells: the input is the row's height, so padding around it only makes
   the row taller without making anything easier to hit. */
.rg-rtable td { padding: var(--space-2); border-bottom: 1px solid var(--rule-faint); vertical-align: middle; }
.rg-rtable tr:last-child td { border-bottom: 0; }
/* Money reads down a column, so it is mono and right-aligned. */
.rg-rtable td.rg-n, .rg-rtable th.rg-n { text-align: right; }
.rg-rtable td.rg-n .rg-input { font-family: var(--font-mono); text-align: right; }
.rg-rtable .rg-input, .rg-rtable .rg-select, .rg-rtable .combo__input { margin: 0; height: var(--h-input); font-size: 14px; }
.rg-rtable .rg-rownum {
    width: 2.5em; text-align: center; color: var(--brand);
    font-family: var(--font-mono); font-size: 12px; font-weight: 600;
}
.rg-rtable .rg-rowact { width: 3em; text-align: center; }
/* Quiet until you mean it. A delete button that is red at rest reads as a
   warning about the row it sits in. */
.rg-rtable .rg-rowact .rg-btn { color: var(--ink-muted); }
.rg-rtable .rg-rowact .rg-btn:hover { color: var(--danger); background: var(--danger-soft); }
/* The total is a real tfoot row under a rule, not a line of prose beneath
   the table — it belongs to the column it totals. */
.rg-rtable tfoot td {
    background: var(--sheet-sunk); font-weight: 600;
    padding: var(--space-3); border-top: 1px solid var(--rule); border-bottom: 0;
    font-family: var(--font-mono); font-variant-numeric: tabular-nums;
}
.rg-rtable tfoot th {
    background: var(--sheet-sunk); border-top: 1px solid var(--rule);
    border-bottom: 0; text-transform: none; letter-spacing: 0;
    font-family: var(--font-sans); font-size: 14px; color: var(--ink);
}
.rg-rtable-add { margin-top: var(--space-2); }
.rg-rtable-add .rg-btn {
    display: flex; width: 100%; height: var(--h-input);
    border: 1.5px dashed var(--brand); border-radius: var(--r-4);
    background: transparent; color: var(--brand); font-weight: 600; font-size: 14px;
}
.rg-rtable-add .rg-btn:hover { background: var(--brand-soft); border-color: var(--brand); }
.rg-rtable-unit { font-weight: 400; letter-spacing: 0; text-transform: none; }

/* A fixed matrix: the same question across several columns, as on paper. */
.rg-rtable-grid th { white-space: normal; }
.rg-rtable-grid .rg-rowhead {
    text-align: left; background: var(--sheet); font-family: var(--font-sans);
    font-size: 15px; font-weight: 500; letter-spacing: 0; color: var(--ink);
    text-transform: none; border-bottom: 1px solid var(--rule); white-space: normal;
}
.rg-rtable-grid .rg-rowtotal .rg-rowhead { font-weight: 600; color: var(--brand-deep); }
.rg-rtable-grid .rg-rowtotal .rg-input { background: var(--sheet-sunk); font-weight: 600; }
.rg-rtable-grid .rg-error { font-size: 13px; margin-top: var(--space-1); }

/* ── Buttons ─────────────────────────────────────────────────────────────── */

.rg-btn {
    display: inline-flex; align-items: center; justify-content: center; gap: var(--space-2);
    font-family: var(--font-sans); font-size: 14px; font-weight: 500; line-height: 20px;
    height: var(--h-btn); padding: 0 18px;
    border-radius: var(--r-4); border: 1px solid var(--field-border);
    background: var(--sheet); color: var(--ink); cursor: pointer;
    text-decoration: none; white-space: nowrap;
}
.rg-btn:hover { background: var(--brand-soft); border-color: var(--field-border); }
.rg-btn-primary {
    background: var(--brand); border-color: var(--brand); color: var(--on-brand);
    font-weight: 600; padding: 0 22px;
}
.rg-btn-primary:hover { background: var(--brand-hover); border-color: var(--brand-hover); color: var(--on-brand); }
/* An outlined brand button: the artboards' second-rank action. */
.rg-btn-quiet {
    border-color: var(--brand); background: var(--sheet); color: var(--brand);
    font-weight: 600;
}
.rg-btn-quiet:hover { background: var(--brand-soft); border-color: var(--brand); }
.rg-btn-danger { color: var(--danger); border-color: var(--danger); background: var(--sheet); }
.rg-btn-danger:hover { background: var(--danger-soft); border-color: var(--danger); }
.rg-btn[disabled], .rg-btn[aria-disabled="true"] {
    background: var(--sheet-sunk); border-color: var(--rule); color: var(--ink-muted);
    cursor: not-allowed;
}
.rg-btn:focus-visible { outline: 2px solid var(--brand); outline-offset: 1px; }
.rg-btn-sm, [data-theme="console"] .rg-btn {
    height: var(--h-btn-sm); padding: 0 14px; font-size: 13px; font-weight: 600;
}
.rg-btn-block { width: 100%; }
.rg-btn-icon { padding: 0; width: var(--control-height-dense); min-height: var(--control-height-dense); }
.rg-btn svg { width: 16px; height: 16px; flex: none; fill: none; stroke: currentColor; stroke-width: 1.6; }

/* ── Action bar ──────────────────────────────────────────────────────────── */

/* `margin-top: auto` inside a full-height flex column, never `sticky`. The
   artboards have no sticky or fixed element anywhere; a sticky bar detaches on
   a short page and re-docks at the end of a long one, which is exactly the
   "the footer keeps moving" complaint this replaces. */
/* The last thing in the form, not furniture over it. It sits inside the
   content column and lines up with the section cards, separated from the
   last of them by a rule — so it reads as the end of the step rather than as
   a toolbar that happens to be at the bottom of the window.

   It used to be `margin-top: auto` inside a 100vh column, which put it at
   the foot of the window on a short step and at the foot of the content on a
   long one: two different places, which is what read as movement. In the
   flow, after the last card, it is always in the same place relative to what
   you just filled in. */
.rg-actionbar {
    margin-top: var(--space-3);
    padding-top: var(--space-6);
    border-top: 1px solid var(--rule);
}
.rg-actionbar-inner {
    display: flex; align-items: center; gap: var(--space-4); flex-wrap: wrap;
}
.rg-actionbar .rg-btn { height: var(--h-btn); }
/* Prev and save-and-close group at the left, Suivant alone at the right —
   the artboards' space-between, got with an auto margin so the template
   keeps three siblings instead of growing a wrapper. */
.rg-actionbar .rg-btn-primary { margin-left: auto; }
/* Save-and-close is the third choice on this bar, so it stops competing with
   Suivant for the eye: plain text until you reach for it. */
.rg-actionbar .rg-btn[data-nav="exit"] {
    border-color: transparent; background: transparent; color: var(--ink-muted);
    padding: 0 var(--space-2);
}
.rg-actionbar .rg-btn[data-nav="exit"]:hover {
    border-color: transparent; background: transparent; color: var(--brand);
}
.rg-actionbar .rg-save {
    margin: 0 auto; font-size: 13px; color: var(--ink-muted);
    display: inline-flex; align-items: center; gap: 6px;
}


@keyframes rg-spin { to { transform: rotate(360deg); } }

@media (max-width: 640px) {
    /* Wrapped onto two rows, so here it does have to grow. */
    .rg-actionbar-inner { flex-wrap: wrap; gap: var(--space-2); }
    .rg-actionbar .rg-btn { flex: 1 1 auto; }
    .rg-actionbar .rg-btn-primary { margin-left: 0; width: 100%; order: -1; }
    .rg-actionbar .rg-save { order: -1; width: 100%; justify-content: center; }
    .rg-actionbar .rg-btn { flex: 1; padding: 0 var(--space-3); }
}

/* ── Notice ──────────────────────────────────────────────────────────────── */

/* The artboards' standing note is a green-tinted panel with no icon in it:
   14px on #eef5f1 in the deep green. The mark is kept for the two tones that
   are genuinely interruptions — an error and a confirmation — where a reader
   scanning the page needs to find it without reading it. */
.rg-notice {
    display: grid; grid-template-columns: auto 1fr; gap: var(--space-1) var(--space-3);
    padding: 14px var(--space-4); border-radius: var(--r-6);
    background: var(--brand-soft); color: var(--brand-deep);
    font-size: 14px; line-height: 1.55;
}
.rg-notice + .rg-notice, .rg-card + .rg-notice, .rg-notice + .rg-card { margin-top: var(--space-3); }
.rg-notice-mark {
    grid-row: 1 / span 3; width: 20px; height: 20px; border-radius: 50%;
    display: grid; place-items: center; font-size: 12px; font-weight: 700;
    background: var(--brand); color: var(--sheet); margin-top: 1px;
}
.rg-notice-title { font-weight: 600; }
.rg-notice p { margin: 0; }
.rg-notice p + p { margin-top: var(--space-1); }
.rg-notice ul { margin: var(--space-1) 0 0; padding-left: 1.1em; }
.rg-notice[data-tone="danger"] { background: var(--danger-soft); }
.rg-notice[data-tone="danger"] .rg-notice-mark { background: var(--danger); color: var(--sheet); }
.rg-notice[data-tone="danger"] .rg-notice-title { color: var(--danger); }
.rg-notice[data-tone="danger"] a { color: var(--danger); }
.rg-notice[data-tone="confirm"] { background: var(--confirm-soft); }
.rg-notice[data-tone="confirm"] .rg-notice-mark { background: var(--confirm); color: var(--sheet); }
.rg-notice[data-tone="confirm"] .rg-notice-title { color: var(--confirm); }

/* ── Upload slot ─────────────────────────────────────────────────────────── */

/* One bordered card holding a row per document, which is how the artboards
   draw Partie VII: a mono index, the name and why it is asked, then the
   state and the button. The previous build gave each document its own card
   with a 40px file tile; eighteen of those is a wall of icons. */
.rg-uploads {
    list-style: none; margin: 0; padding: 0;
    border: 1px solid var(--rule); border-radius: var(--r-6);
    background: var(--sheet); overflow: hidden;
}
.rg-upload {
    display: grid; grid-template-columns: 28px 1fr auto;
    gap: 3px var(--space-4); align-items: center;
    padding: var(--space-4) var(--space-6);
    border-top: 1px solid var(--rule-faint);
}
.rg-uploads > .rg-upload:first-child { border-top: 0; }
/* The index, in the same mono the question numbers use. */
.rg-upload-tile {
    grid-column: 1; grid-row: 1 / span 3; align-self: center;
    font-family: var(--font-mono); font-size: 12px; font-weight: 600;
    color: var(--brand); background: none; width: auto; height: auto;
    display: block;
}
.rg-upload-tile svg { display: none; }
.rg-upload-name { grid-column: 2; font-weight: 500; font-size: 14px; line-height: 1.5; }
.rg-upload-why { grid-column: 2; font-size: 13px; color: var(--ink-muted); line-height: 1.5; }
.rg-upload-action {
    grid-column: 3; grid-row: 1 / span 3; display: flex; align-items: center;
    gap: var(--space-2); flex-wrap: wrap; justify-content: flex-end;
}
.rg-upload-file {
    grid-column: 2; display: flex; align-items: center; gap: var(--space-2);
    font-family: var(--font-mono); font-size: 12px; color: var(--brand);
    flex-wrap: wrap;
}
.rg-upload-file a { overflow-wrap: anywhere; }
.rg-upload[data-state="error"] .rg-upload-file {
    font-family: var(--font-sans); color: var(--danger); font-weight: 500;
}
/* "Envoye", as a pill — the artboards' one status mark on this list. */
.rg-upload-sent {
    padding: 3px var(--space-2); border-radius: var(--r-pill);
    background: var(--brand-soft); color: var(--brand-deep);
    font-size: 12px; font-weight: 600; white-space: nowrap;
}

/* The strip above the list: what may be sent, and how many have been. */
.rg-uploads-head {
    display: flex; justify-content: space-between; align-items: center;
    gap: var(--space-4); flex-wrap: wrap;
    padding: var(--space-4) var(--space-6);
    background: var(--sheet-sunk);
    border: 1px solid var(--rule); border-radius: var(--r-6) var(--r-6) 0 0;
    font-size: 13px; color: var(--ink-muted);
}
/* The strip and the list are one box: the list drops its top border and its
   top corners so the two do not draw a double edge between them. */
.rg-uploads-head + .rg-uploads {
    border-top: 0; border-radius: 0 0 var(--r-6) var(--r-6);
}
.rg-uploads-count {
    font-family: var(--font-mono); font-size: 13px; color: var(--brand-deep);
}

@media (max-width: 640px) {
    .rg-upload { grid-template-columns: 28px 1fr; padding: var(--space-4); }
    .rg-upload-name, .rg-upload-why, .rg-upload-file { grid-column: 2; }
    .rg-upload-action { grid-column: 1 / -1; grid-row: auto; justify-content: flex-start; }
    .rg-uploads-head { padding: var(--space-3) var(--space-4); }
}

/* The file input itself is hidden; its label is the button. */
.rg-filepick { display: inline-flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
.rg-filepick input[type="file"] { position: absolute; width: 1px; height: 1px; opacity: 0; }
.rg-filepick input[type="file"]:focus-visible + .rg-filepick-btn { outline: 2px solid var(--brand); outline-offset: 1px; }
/* Filled green to attach, outlined to replace — the artboards' own pair. The
   [data-state] on the row is what says which of the two this is. */
.rg-filepick-btn {
    display: inline-flex; align-items: center; justify-content: center; gap: var(--space-2);
    height: var(--h-btn-sm); padding: 0 14px;
    border: 1px solid var(--brand); border-radius: var(--r-4);
    background: var(--brand); color: var(--on-brand);
    font-family: var(--font-sans); font-size: 13px; font-weight: 600;
    white-space: nowrap; cursor: pointer;
}
.rg-filepick-btn:hover { background: var(--brand-hover); border-color: var(--brand-hover); }
.rg-upload[data-state="done"] .rg-filepick-btn {
    background: var(--sheet); border-color: var(--field-border); color: var(--ink);
}
.rg-upload[data-state="done"] .rg-filepick-btn:hover { background: var(--brand-soft); }
.rg-filepick-name { font-size: 13px; color: var(--ink-muted); max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rg-filepick-name.is-set { color: var(--ink); font-weight: 500; }

/* ── Signature (moment C) ────────────────────────────────────────────────── */

.rg-declaration { font-size: 17px; line-height: 28px; max-width: var(--measure); margin: 0; }
.rg-declaration + .rg-declaration { margin-top: var(--space-3); }
.rg-declaration strong { font-weight: 700; }

.rg-consent {
    display: flex; gap: var(--space-3); align-items: flex-start; margin-top: var(--space-6);
    font-size: 15px; line-height: 22px; color: var(--ink); cursor: pointer; max-width: var(--measure);
}
.rg-consent input { margin: 3px 0 0; width: 16px; height: 16px; accent-color: var(--brand-strong); flex: none; }

.rg-sigpad { border: 1px solid var(--field-border); border-radius: var(--r-6); background: var(--sheet); max-width: 600px; }
/* Dashed, so the capture area does not read as one more box to type in. */
.rg-sigpad-canvas { border: 1.5px dashed var(--field-border); border-radius: var(--r-4); margin: var(--space-3); }
.rg-sigpad-canvas { position: relative; height: 180px; touch-action: none; }
.rg-sigpad-canvas::after {
    content: ""; position: absolute; left: var(--space-6); right: var(--space-6);
    bottom: 44px; border-bottom: 1px solid var(--rule-strong);
}
.rg-sigpad-x { position: absolute; left: var(--space-6); bottom: 48px; font-size: 20px; font-weight: 500; color: var(--ink-muted); }
.rg-sigpad-canvas canvas, .rg-sigpad-canvas img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; }
.rg-sigpad-foot {
    display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-4);
    padding: var(--space-3) var(--space-4); border-top: 1px solid var(--rule);
    background: var(--sheet-sunk); border-radius: 0 0 var(--r-14) var(--r-14);
    font-size: 13px; color: var(--ink-muted);
}
.rg-sigpad-foot .rg-btn { margin-left: auto; }
.rg-sigpad[data-state="void"] .rg-sigpad-canvas img { opacity: .35; filter: grayscale(1); }
.rg-sigpad[data-state="void"] .rg-sigpad-canvas::before {
    content: "ANNULÉE"; position: absolute; top: 50%; left: 50%;
    transform: translate(-50%, -60%) rotate(-12deg); font-weight: 800; font-size: 24px;
    letter-spacing: .22em; color: var(--danger); border: 3px solid var(--danger);
    padding: 4px 14px; border-radius: var(--r-6); background: var(--sheet); z-index: 1;
}

/* What the signature binds to — the hash, reference and timestamp. */
.rg-binding { margin-top: var(--space-6); padding: var(--space-4); background: var(--sheet-sunk); border-radius: var(--r-12); }
.rg-binding dl { display: grid; grid-template-columns: max-content 1fr; gap: var(--space-1) var(--space-4); margin: var(--space-3) 0 0; }
.rg-binding dt { font-size: 12px; font-weight: 600; letter-spacing: .06em; color: var(--ink-muted); }
.rg-binding dd { margin: 0; font-family: var(--font-mono); font-size: 13px; overflow-wrap: anywhere; }
@media (max-width: 640px) { .rg-binding dl { grid-template-columns: 1fr; gap: 0; } .rg-binding dd { margin-bottom: var(--space-2); } }

/* ── Receipt ─────────────────────────────────────────────────────────────── */

.rg-receipt {
    background: var(--sheet); border: 1px solid var(--rule); border-radius: var(--r-16);
    box-shadow: var(--shadow-sheet); overflow: hidden;
}


.rg-receipt dl { display: grid; grid-template-columns: max-content 1fr; gap: var(--space-2) var(--space-6); margin: 0; padding: var(--space-6); }
.rg-receipt dt { font-size: 12px; font-weight: 600; letter-spacing: .06em; color: var(--ink-muted); padding-top: 2px; }
.rg-receipt dd { margin: 0; overflow-wrap: anywhere; }
.rg-downloads {
    list-style: none; margin: 0; padding: 0 var(--space-6) var(--space-6);
    display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-2);
}
.rg-downloads a {
    display: flex; justify-content: space-between; align-items: center; gap: var(--space-3);
    padding: var(--space-3) var(--space-4); border: 1px solid var(--rule-strong);
    border-radius: var(--r-12); text-decoration: none; color: var(--ink);
    font-weight: 500; font-size: 15px;
}
.rg-downloads a:hover { border-color: var(--brand-strong); color: var(--brand-strong); }
.rg-downloads small { font-weight: 400; color: var(--ink-muted); font-size: 12px; font-family: var(--font-mono); text-align: right; }
.rg-downloads-bare { padding: 0; margin-top: var(--space-2); }
@media (max-width: 640px) {
    .rg-receipt dl { grid-template-columns: 1fr; gap: 0; }
    .rg-receipt dd { margin-bottom: var(--space-3); }
    .rg-downloads { grid-template-columns: 1fr; }
}

/* ── Sign in ─────────────────────────────────────────────────────────────── */


/* ── Status chip ─────────────────────────────────────────────────────────── */

.rg-chip {
    display: inline-flex; align-items: center; gap: 6px; font-size: 12px; line-height: 20px;
    font-weight: 600; padding: 0 var(--space-2); border-radius: var(--r-pill);
    white-space: nowrap; background: var(--sheet-sunk); color: var(--ink-muted);
}
.rg-chip::before {
    content: ""; width: 8px; height: 8px; flex: none; border-radius: 50%;
    box-sizing: border-box; border: 1.5px solid currentColor;
}
.rg-chip-plain::before { display: none; }
.rg-chip[data-status="filed"] { background: var(--confirm-soft); color: var(--confirm); }
.rg-chip[data-status="filed"]::before { background: currentColor; }
.rg-chip[data-status="progress"] { background: var(--sheet-sunk); color: var(--ink-muted); }
.rg-chip[data-status="progress"]::before { background: linear-gradient(90deg, currentColor 50%, transparent 50%); }
.rg-chip[data-status="late"] { background: var(--danger-soft); color: var(--danger); }
.rg-chip[data-status="late"]::before { content: "!"; border: 0; width: auto; height: auto; font-weight: 700; }
/* Amber, not green. A reopened report is one the CFCA has sent back; green is
   this palette's "filed" and was reading as the opposite of the fact. */
.rg-chip[data-status="reopened"] { background: var(--flag-soft); color: var(--flag); }
.rg-chip[data-status="reopened"]::before { border-style: dashed; }

.rg-siglvl { font-size: 12px; font-weight: 500; color: var(--ink-muted); white-space: nowrap; }
.rg-siglvl b { display: inline-block; width: 6px; height: 10px; margin-right: 1px; background: var(--rule); border-radius: 1px; vertical-align: -1px; }
.rg-siglvl b.on { background: var(--ink); }


.rg-completion-legend i.s-filed { background: var(--confirm); }
.rg-completion-legend i.s-progress { background: var(--half); }
.rg-completion-legend i.s-none { background: var(--rule); }

/* ── Console table ───────────────────────────────────────────────────────── */

.rg-toolbar { display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center; margin: var(--space-6) 0 var(--space-3); }
.rg-toolbar .rg-input { width: 280px; margin: 0; }
.rg-toolbar .rg-select { width: auto; margin: 0; }
.rg-table-wrap { background: var(--sheet); border: 1px solid var(--rule); border-radius: var(--r-16); overflow-x: auto; }
.rg-table { width: 100%; border-collapse: collapse; font-size: 14px; line-height: 20px; }
.rg-table th {
    position: sticky; top: 0; background: var(--sheet-sunk); text-align: left;
    font-size: 12px; line-height: 16px; font-weight: 600; letter-spacing: .06em;
    color: var(--ink-muted); height: var(--h-th); padding: 0 var(--space-3);
    border-bottom: 1px solid var(--rule-strong); white-space: nowrap; z-index: 1;
}
.rg-table th[aria-sort] { color: var(--ink); }
.rg-table th[aria-sort="descending"]::after { content: " ↓"; }
.rg-table th[aria-sort="ascending"]::after { content: " ↑"; }
.rg-table td { height: var(--row-height-dense); padding: 0 var(--space-3); border-bottom: 1px solid var(--rule); white-space: nowrap; }
.rg-table tbody tr:last-child td { border-bottom: 0; }
.rg-table tbody tr:hover { background: var(--row-hover); }
.rg-table td a { color: var(--ink); font-weight: 500; text-decoration: none; }
.rg-table td a:hover { color: var(--brand-strong); text-decoration: underline; }
.rg-table .rg-sub { display: block; font-size: 12px; line-height: 16px; color: var(--ink-muted); }
.rg-table .rg-n { text-align: right; }
.rg-table .rg-prog { display: flex; align-items: center; gap: var(--space-2); }
/* Ten cells, one per tenth. A 4px bar 56px wide is a decoration; a strip
   can be counted, and counting is what an operator scanning a column does. */
.rg-ts { display: inline-flex; gap: 2px; vertical-align: -1px; }
.rg-ts-cell { display: block; width: 5px; height: 14px; border-radius: 1px; background: var(--spoke-todo); }
.rg-ts-cell[data-on] { background: var(--brand); }
.rg-table .rg-prog .rg-ts-cell { height: 12px; }
.rg-table .rg-prog span.rg-num { width: 3.2em; text-align: right; font-size: 13px; color: var(--ink-muted); }
.rg-table td.rg-stale { color: var(--danger); font-weight: 500; }
.rg-table .rg-empty { text-align: center; color: var(--ink-muted); padding: var(--space-8) 0; white-space: normal; }
/* Amber, with the cream row it sits in — see .rg-table tr[data-new]. */
.rg-new { display: inline-block; font-size: 11px; line-height: 16px; font-weight: 700; letter-spacing: .04em; color: var(--flag); margin-left: var(--space-2); }
.rg-new::before { content: ""; display: inline-block; width: 6px; height: 6px; border-radius: 50%; background: var(--flag); margin-right: 4px; vertical-align: 1px; }

/* ── Journal ─────────────────────────────────────────────────────────────── */

.rg-journal { list-style: none; margin: 0; padding: 0; background: var(--sheet); border: 1px solid var(--rule); border-radius: var(--r-16); }
.rg-journal li {
    display: grid; grid-template-columns: 150px 120px 1fr auto; gap: var(--space-3);
    align-items: baseline; padding: var(--space-2) var(--space-3);
    border-bottom: 1px solid var(--rule); font-size: 14px;
}
.rg-journal li:last-child { border-bottom: 0; }
.rg-journal time { font-family: var(--font-mono); font-size: 12px; color: var(--ink-muted); white-space: nowrap; }
.rg-journal .rg-ev { font-size: 12px; font-weight: 600; letter-spacing: .04em; color: var(--ink-muted); }
.rg-journal li[data-kind="submit"] .rg-ev { color: var(--confirm); }
.rg-journal li[data-kind="operator"] .rg-ev { color: var(--brand-strong); }
.rg-journal li[data-kind="fail"] .rg-ev { color: var(--danger); }
.rg-journal .rg-what { overflow-wrap: anywhere; }
.rg-journal .rg-who { font-size: 12px; color: var(--ink-muted); text-align: right; overflow-wrap: anywhere; }
.rg-journal-tight li { grid-template-columns: 130px 1fr; }
@media (max-width: 720px) { .rg-journal li { grid-template-columns: 1fr; gap: 2px; } .rg-journal .rg-who { text-align: left; } }

/* ── Error page ──────────────────────────────────────────────────────────── */

.rg-errorpage { max-width: 560px; margin: var(--space-16) auto; padding: 0 var(--space-4); }
.rg-errorpage-code { font-family: var(--font-mono); font-size: 64px; line-height: 64px; font-weight: 500; color: var(--rule-strong); margin: 0; }
.rg-errorpage h1 { font-weight: 800; font-size: 26px; line-height: 32px; margin: var(--space-4) 0 var(--space-2); }
.rg-errorpage p { margin: 0 0 var(--space-6); color: var(--ink-muted); max-width: var(--measure); }

/* ── Recap (Review & sign, and the console's company page) ───────────────── */

.rg-recap { border: 1px solid var(--rule); border-radius: var(--r-6); background: var(--sheet); box-shadow: var(--shadow-sheet); }
.rg-recap + .rg-recap { margin-top: var(--space-2); }
.rg-recap-head {
    display: flex; align-items: center; gap: var(--space-3); width: 100%;
    padding: var(--space-4) var(--space-5); border: 0; background: none;
    font-family: var(--font-sans); font-weight: 600; font-size: 15px;
    color: var(--ink); cursor: pointer; text-align: left;
}
.rg-recap-head:hover { background: var(--sheet-sunk); }
.rg-recap-num {
    font-family: var(--font-mono); font-size: 12px; font-weight: 600;
    color: var(--brand); min-width: 2.5em;
}
/* The review step sends rather than continuing, so its primary lives in
   its own <form>; the auto margin is on the form, as it is on the button
   everywhere else. */
.rg-actionbar-send { margin-left: auto; }
.rg-recap-body { padding: var(--space-4) var(--space-5) var(--space-5); border-top: 1px solid var(--rule-soft); }
.rg-recap-foot { margin-top: var(--space-3); }

.rg-answers { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.3fr); gap: 0 var(--space-6); margin: 0; }
.rg-answers dt { font-size: 14px; color: var(--ink-muted); padding: var(--space-3) 0; border-top: 1px solid var(--rule-faint); }
.rg-answers dd { font-size: 14px; color: var(--ink); font-weight: 500; padding: var(--space-3) 0; border-top: 1px solid var(--rule-faint); margin: 0; overflow-wrap: anywhere; }
.rg-answers dt:first-of-type, .rg-answers dt:first-of-type + dd { border-top: 0; }
.rg-answers dd[data-empty] { color: var(--ink-muted); font-weight: 400; font-style: italic; }
@media (max-width: 640px) {
    .rg-answers { grid-template-columns: 1fr; }
    .rg-answers dt { border-top: 1px solid var(--rule); padding-bottom: 0; }
    .rg-answers dd { border-top: 0; padding-top: 2px; }
    .rg-answers dt:first-of-type + dd { border-top: 0; }
}
/* ── Console page furniture ────────────────────────────────────────── */

.rg-pagetitle { font-weight: 800; font-size: 28px; line-height: 34px; letter-spacing: -.01em; color: var(--brand-deep); margin: 0; }
.rg-pagesub { margin: var(--space-1) 0 0; font-size: 14px; color: var(--ink-muted); }

.rg-cols { display: grid; grid-template-columns: minmax(0, 1fr) 360px; gap: var(--space-6); align-items: start; }
.rg-cols-side { display: flex; flex-direction: column; gap: var(--space-6); position: sticky; top: var(--space-4); }
.rg-cols-main { display: flex; flex-direction: column; gap: var(--space-6); min-width: 0; }
.rg-cols-main .rg-card + .rg-card, .rg-cols-side .rg-card + .rg-card { margin-top: 0; }
@media (max-width: 1100px) { .rg-cols { grid-template-columns: 1fr; } .rg-cols-side { position: static; } }

.rg-siderow { display: flex; gap: var(--space-3); align-items: flex-start; justify-content: space-between; padding: var(--space-3) 0; border-top: 1px solid var(--rule); }
.rg-siderow:first-of-type { border-top: 0; padding-top: 0; }
.rg-siderow:last-of-type { padding-bottom: 0; }
.rg-siderow-t { font-size: 14px; font-weight: 500; color: var(--ink); overflow-wrap: anywhere; }
.rg-siderow-s { font-size: 12px; line-height: 18px; color: var(--ink-muted); margin-top: 2px; overflow-wrap: anywhere; }
.rg-onetime {
    font-family: var(--font-mono); font-size: 18px; letter-spacing: .04em;
    background: var(--sheet); border: 1px dashed var(--rule-strong);
    border-radius: var(--r-10); padding: var(--space-2) var(--space-3);
    margin-top: var(--space-2) !important; user-select: all; overflow-wrap: anywhere;
}
.rg-gaplist { margin: var(--space-2) 0 0; padding-left: 1.2em; font-size: 14px; color: var(--ink-muted); }
.rg-gaplist strong { color: var(--ink); font-weight: 600; }

/* ── Country combobox (built by controls.js) ─────────────────────────────── */

.combo { position: relative; }
.combo__input {
    font: inherit; font-size: 16px; color: var(--ink); background: var(--sheet);
    border: 1px solid var(--rule-strong); border-radius: var(--r-12);
    min-height: var(--control-height); padding: 0 32px 0 var(--space-3);
    width: 100%; margin-top: var(--space-1);
}
.combo__input:hover { border-color: var(--ink); }
.combo__input:focus-visible { outline: none; border-color: var(--focus); box-shadow: var(--focus-ring); }
.combo__caret { position: absolute; right: 11px; top: 50%; transform: translateY(-50%); pointer-events: none; color: var(--ink-muted); }
.combo__list {
    position: absolute; z-index: 20; left: 0; right: 0; top: calc(100% + 2px);
    max-height: 280px; overflow-y: auto; background: var(--sheet);
    border: 1px solid var(--rule-strong); border-radius: var(--r-12);
    box-shadow: 0 8px 24px rgba(17, 24, 39, .12); list-style: none; margin: 0; padding: 4px;
}
.combo__opt {
    display: flex; align-items: center; justify-content: space-between; gap: var(--space-2);
    padding: var(--space-2) var(--space-3); border-radius: var(--r-8);
    font-size: 15px; cursor: pointer;
}
.combo__opt:hover, .combo__opt.is-active { background: var(--brand-soft); }
.combo__opt[aria-selected="true"] { color: var(--brand-strong); font-weight: 600; }
.combo__opt[aria-selected="true"]::after { content: "✓"; font-size: 12px; }
.combo__iso { font-family: var(--font-mono); font-size: 11px; color: var(--ink-muted); }
.combo__empty { padding: var(--space-3); font-size: 14px; color: var(--ink-muted); }
[data-theme="console"] .combo__input, .rg-rtable .combo__input { min-height: var(--h-input); font-size: 14px; }

/* ── Multi-country picker (wizard.js) ────────────────────────────────────── */

.cms { position: relative; margin-top: var(--space-1); }
.cms__toggle {
    display: flex; align-items: center; justify-content: space-between; gap: var(--space-3);
    width: 100%; min-height: var(--control-height); padding: 0 var(--space-3);
    border: 1px solid var(--field-border); border-radius: var(--r-4);
    background: var(--sheet); font-family: var(--font-sans); font-size: 14px; color: var(--ink);
    text-align: left; cursor: pointer;
}
.cms__toggle:hover { border-color: var(--ink); }
.cms__toggle[aria-expanded="true"] { border-color: var(--ink); }
.cms__count { font-size: 13px; font-weight: 600; color: var(--ink-muted); flex: none; }
.cms__panel {
    position: absolute; z-index: 20; left: 0; right: 0; top: calc(100% + 2px);
    max-height: 340px; overflow-y: auto; padding: var(--space-3);
    background: var(--sheet); border: 1px solid var(--rule-strong);
    border-radius: var(--r-12); box-shadow: 0 8px 24px rgba(17, 24, 39, .12);
}
.cms__tools { display: flex; gap: var(--space-2); align-items: center; margin-bottom: var(--space-3); }
.cms__search { flex: 1 1 auto; margin: 0; min-height: 38px; font-size: 15px; }
.cms__none { font-size: 14px; color: var(--ink-muted); margin: 0; padding: var(--space-2) 0; }
.cms__grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: var(--space-1) var(--space-4); }
.cms__grid .rg-check, .cms__grid .choice { font-size: 14px; }

/* controls.js and wizard.js both create `.choice` labels; keep the name. */
.choice { display: flex; align-items: flex-start; gap: var(--space-2); font-size: 15px; color: var(--ink); cursor: pointer; }
.choice input { margin: 3px 0 0; width: 16px; height: 16px; accent-color: var(--brand-strong); flex: none; }

/* ── Date field (controls.js) ────────────────────────────────────────────── */

.datefield { position: relative; }
.datefield .rg-input { padding-right: 36px; font-variant-numeric: tabular-nums; }
.datefield__icon {
    position: absolute; right: 11px; top: calc(50% + 2px); transform: translateY(-50%);
    width: 16px; height: 16px; pointer-events: none; color: var(--ink-muted);
}

/* The signature pad, when the form is submitted with nothing drawn. */
.rg-sigpad[data-invalid] { border-color: var(--danger); box-shadow: inset 0 0 0 1px var(--danger); }

/* Review & sign: the declaration card's own rhythm. */
.rg-declaration-card .rg-declaration + .rg-grid { margin-top: var(--space-6); }
.rg-declaration-fields { margin-top: var(--space-6); }

/* ═══════════════════════════════════════════════════════════════════════════
   THE SHELL — masthead, sidebar, action bar

   The portal is a 272px rail beside a fluid column, not a centred measure
   under a top rail. The rail carries three things a company asks repeatedly:
   how much is left, when it is due, and which parts are still open. Putting
   them in a rail means they are answered without navigating.
   ═══════════════════════════════════════════════════════════════════════════ */

.rg-lockup-mark {
    font-family: var(--font-sans); font-weight: 700; font-size: 12px;
    letter-spacing: .02em; border-width: 1.5px;
}

/* The autosave state lives in the masthead, where it is visible from every
   part of the form rather than only when the action bar is on screen. */
.rg-chip-save {
    display: inline-flex; align-items: center; gap: 6px; white-space: nowrap;
    font-size: 13px; color: var(--ink-muted);
}
.rg-chip-save[data-state="idle"] { visibility: hidden; }
.rg-chip-save[data-state="saved"]::before { content: "¹3"; color: var(--brand); font-weight: 700; }
.rg-chip-save[data-state="saving"]::before {
    content: ""; width: 10px; height: 10px; border: 2px solid var(--rule-strong);
    border-top-color: var(--ink); border-radius: 50%; animation: rg-spin .8s linear infinite;
}
.rg-chip-save[data-state="offline"] { color: var(--danger); font-weight: 500; }

/* ── the two-column body ─────────────────────────────────────────────────── */

/* The artboards' proportions exactly: a 999-to-1 flex ratio between the form
   and the rail. The rail therefore keeps its 260px until the row can no
   longer hold 600px of form beside it, then wraps underneath by itself —
   no media query decides it, and none can get the breakpoint wrong.

   The rail is the *second* child here and in the DOM. That is the artboards'
   order and it is also the right reading order: the form first, the summary
   of it after. */
.rg-shell {
    display: flex; flex-wrap: wrap; align-items: flex-start; gap: var(--space-8);
    max-width: var(--w-body); width: 100%; margin: 0 auto;
    padding: var(--space-8) var(--pad-page) var(--space-16);
}
.rg-main {
    flex: 999 1 600px; min-width: 0;
    display: flex; flex-direction: column; gap: var(--space-3);
}
.rg-aside {
    flex: 1 1 var(--rail); max-width: 100%;
    position: sticky; top: var(--space-6);
    display: flex; flex-direction: column; gap: var(--space-4);
    /* No max-height and no overflow: both cards are shown whole. A
       scrollbar inside a sticky rail is a second scrollbar on the same
       screen, and it is never where the reader looks for it. What used to
       make the rail too tall — the collapse summary, the repeated deadline,
       the autosave note — has all gone, so it fits. */
}

/* ── the spoke sun ───────────────────────────────────────────────────────── */

/* Geometry comes in as attributes (CSP forbids inline styles); everything
   below is the part that does not vary with size. */
.rg-sun { display: block; }
.rg-sun-spoke { stroke: var(--brand); stroke-linecap: round; }
.rg-sun-spoke[data-state="todo"] { stroke: var(--spoke-todo); }
.rg-sun-spoke[data-state="done"],
.rg-sun-spoke[data-state="filed"]    { stroke: var(--brand); }
.rg-sun-spoke[data-state="progress"] { stroke: var(--half); }
.rg-sun-spoke[data-state="reopened"] { stroke: var(--flag); }
.rg-sun-spoke[data-state="none"]     { stroke: var(--swatch-none); }
.rg-sun-spoke[data-state="decor"]    { stroke: var(--motif-console); }

/* The oversized motif that bleeds off a sign-in page. Cropped by the panel's
   own overflow, never by a media query. */
.rg-sun-backdrop .rg-sun-spoke { stroke: var(--motif-portal); }
.rg-sun-backdrop-console .rg-sun-spoke { stroke: var(--motif-console); }
.rg-sun-watermark .rg-sun-spoke { stroke: var(--motif-watermark); }

/* The dial packs one spoke per company, so at any real campaign size the
   spokes are narrower than a round cap is wide — round them and neighbouring
   arcs bleed into one another. Butt caps keep the shares legible. */
.rg-sun-dial .rg-sun-spoke { stroke-linecap: butt; }

/* ── the rail's cards ──────────────────────────────────────── */

.rg-asidecard {
    background: var(--sheet); border: 1px solid var(--rule);
    border-radius: var(--r-6); box-shadow: var(--shadow-sheet);
    padding: var(--space-5);
    display: flex; flex-direction: column; gap: var(--space-3);
}
/* The rail's one accent, on the card that says how far through this step you
   are. One card carries it, not both: two green rules stacked read as a
   border pattern rather than as emphasis. */
.rg-asidecard[data-accent] { border-top: 3px solid var(--brand); }

/* ── saving, said where the work is ─────────────────────────────────────

   The masthead chip is the artboards' own and it stays, but on a step that
   runs to several thousand pixels it is off screen almost the whole time.
   The rail is sticky, so this one is always in view. Both carry
   [data-saved] and wizard.js updates every one of them.
   ───────────────────────────────────────────────────────────────────────── */

.rg-savebox {
    display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap;
    padding: 0 var(--space-2);
}
.rg-savestate { font-size: 12px; line-height: 16px; color: var(--ink-muted); }
/* Unlike the masthead chip this one is never hidden: before the first save
   its job is to say that saving happens at all. */
.rg-savestate[data-state="saved"] { color: var(--brand); font-weight: 600; }
.rg-savestate[data-state="offline"] { color: var(--danger); font-weight: 600; }

/* ── the rail: overall progress, and progress within this step ──────────── */

/* A percentage over a linear track, which is what the September artboards
   draw. The previous build used a 112px spoke ring here; the ring code stays
   in viz.py because the console's dial still uses it. */
.rg-prog-figure { display: flex; align-items: baseline; gap: 6px; }
.rg-prog-num {
    font-family: var(--font-head); font-size: 30px; font-weight: 700;
    line-height: 1; color: var(--brand-deep); font-variant-numeric: tabular-nums;
}
.rg-prog-unit { font-size: 14px; color: var(--ink-muted); }
.rg-prog-track {
    height: 6px; border-radius: var(--r-pill);
    background: var(--track); overflow: hidden;
}
/* A rule under the figure, so the eight parts below read as a list rather
   than as more of the same block. */
.rg-prog-track + nav { padding-top: var(--space-3); border-top: 1px solid var(--rule-faint); }
.rg-prog-fill { height: 100%; background: var(--brand); transition: width 240ms ease; }

/* One chip per numbered question in this step: answered, or still open.
   Rendered only where the step's questions are numbered one to one — see
   validation.question_marks(). A grid of chips that pointed at nothing on
   the page would be worse than no grid. */
.rg-marks {
    display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 6px;
}
.rg-mark {
    display: flex; align-items: center; justify-content: center;
    height: var(--h-mark); padding: 0 2px;
    border: 1px solid var(--field-border); border-radius: var(--r-6);
    background: var(--sheet); color: var(--ink-muted);
    font-family: var(--font-mono); font-size: 12px; font-weight: 600;
    text-decoration: none; white-space: nowrap; overflow: hidden;
}
.rg-mark:hover { border-color: var(--brand); color: var(--brand-deep); }
.rg-mark[data-state="done"] {
    background: var(--brand-soft); border-color: var(--brand);
    color: var(--brand-deep);
}
.rg-marks-legend {
    display: flex; flex-wrap: wrap; gap: var(--space-4);
    font-size: 13px; color: var(--ink-muted);
}
.rg-marks-legend span { display: inline-flex; align-items: center; gap: 6px; }
.rg-marks-legend i {
    width: 11px; height: 11px; flex: none; border-radius: 2px;
    border: 1px solid var(--field-border); background: var(--sheet);
}
.rg-marks-legend i.s-done { background: var(--brand); border-color: var(--brand); }

.rg-aside-rule { height: 1px; background: var(--rule); margin: var(--space-4) 0; }
.rg-aside-due { display: flex; align-items: baseline; justify-content: space-between; gap: var(--space-2); }
.rg-aside-due-label { font-size: 12px; color: var(--ink-muted); }
.rg-aside-due-value { font-variant-numeric: tabular-nums; }
.rg-aside-due-value { font-size: 14px; font-weight: 700; white-space: nowrap; }
/* A deadline that has not passed yet is a fact, not a warning. Only a
   missed one turns red — see the [data-tone="over"] rule below. */
.rg-aside-due[data-tone="soon"] .rg-aside-due-value { color: var(--ink); }
.rg-aside-due[data-tone="over"] .rg-aside-due-value { color: var(--danger); }

/* ── the completion ring ─────────────────────────────────────────────────── */

.rg-ring-wrap { position: relative; width: 112px; height: 112px; margin: 0 auto; }
.rg-ring-wrap .rg-sun-ring { width: 100%; height: auto; }
/* Centred on both axes. `align-items: baseline` put the line at the flex
   container's cross-start edge — the top of the 150px box — so the figure was
   drawn across the ring's upper spokes instead of inside its hole. The two
   numerals keep their shared baseline in an inner span. */
.rg-ring-centre {
    position: absolute; inset: 0; display: flex;
    align-items: center; justify-content: center; line-height: 1;
}
.rg-ring-figure { display: flex; align-items: baseline; gap: 1px; }
.rg-ring-num {
    font-family: var(--font-mono); font-size: 26px; font-weight: 500;
    color: var(--brand-deep); font-variant-numeric: tabular-nums;
}
.rg-ring-of { font-family: var(--font-mono); font-size: 13px; color: var(--ink-muted); }
.rg-ring-cap {
    display: block; text-align: center; font-size: 11px; font-weight: 600;
    letter-spacing: .08em; text-transform: uppercase; color: var(--ink-muted);
    margin-top: var(--space-2);
}

/* ── the eight parts ─────────────────────────────────────────────────────── */

.rg-parts { list-style: none; margin: 0; padding: 0; }
.rg-parts a, .rg-parts .rg-parts-row {
    display: grid; grid-template-columns: 26px minmax(0, 1fr) auto;
    align-items: center; gap: var(--space-2);
    min-height: 34px; padding: 6px var(--space-2); border-radius: var(--r-4);
    color: var(--ink); text-decoration: none; font-size: 14px;
}
.rg-parts a:hover { background: var(--brand-tint); }
/* A grid, not a flex row: the numeral, the name and the count each get their
   own column, so the counts line up down the rail instead of each sitting
   wherever its name ends. */
.rg-parts-num {
    font-family: var(--font-mono); font-size: 11px; color: var(--ink-faint);
}
.rg-parts-name { min-width: 0; overflow: hidden;
                 text-overflow: ellipsis; white-space: nowrap; }
/* The count of what is answered in that part, from step_completion — the
   artboards put a figure here rather than a tick, because "3 / 14" says both
   how far along the part is and how big it is. */
.rg-parts-mark {
    flex: none; font-family: var(--font-mono); font-size: 11px;
    color: var(--ink-muted); font-variant-numeric: tabular-nums;
}

.rg-parts li[data-state="current"] a,
.rg-parts li[data-state="current"] .rg-parts-row {
    font-weight: 600; color: var(--brand-deep); background: var(--brand-tint);
}
.rg-parts li[data-state="current"] .rg-parts-num { color: var(--brand); }
.rg-parts li[data-state="done"] .rg-parts-mark { color: var(--brand); font-weight: 600; }

/* ── the action bar ──────────────────────────────────────────────────────── */

/* `height`, not `min-height`: a min-height grows the moment a button label
   wraps, and a bar that changes height between steps reads as movement too. */
/* The signature step carries a 54px submit, so its bar is taller and drops
   the wash. */
/* Line the buttons up under <main> rather than under the whole shell: a
   Précédent that sits under the rail belongs to the rail, visually. */

/* The outstanding count, in the rail on a desktop and in the strip on a
   phone. It used to sit in the middle of the action bar; it moved when the
   bar moved to the end of the form, because it is something to keep an eye
   on rather than something to press. */
.rg-aside-left { display: block; font-size: 13px; line-height: 18px; color: var(--ink-muted); }
.rg-aside-left[data-state="done"] { color: var(--confirm); font-weight: 600; }
.rg-strip-left { flex: none; font-size: 12px; color: var(--ink-muted); text-align: right; }
.rg-strip-left[data-state="done"] { color: var(--confirm); font-weight: 600; }

/* ── under 900px the rail becomes a strip, and the parts go behind a menu ── */

.rg-contextstrip { display: none; }

@media (max-width: 900px) {
    /* .rg-shell is the page's two-column body and nothing else now, so this
       may safely stack it — it used to take the masthead and the action
       bar down with it, killing both layouts below 900px. */
    .rg-shell { display: block; padding: var(--space-4) var(--space-4) 0; }
    .rg-masthead-inner { padding: 0 var(--space-4); }
    .rg-aside { display: none; }
    .rg-main { padding-bottom: var(--space-8); }

    .rg-contextstrip {
        display: flex; align-items: center; gap: var(--space-3);
        padding: var(--space-3) 0; border-bottom: 1px solid var(--rule);
        margin-bottom: var(--space-4);
    }
    .rg-contextstrip .rg-ring-wrap { width: 52px; height: 52px; margin: 0; flex: none; }
    .rg-contextstrip .rg-ring-num { font-size: 13px; }
    .rg-contextstrip .rg-ring-of { display: none; }
    .rg-strip-text { flex: 1 1 auto; min-width: 0; }
    .rg-strip-part { font-family: var(--font-mono); font-size: 11px; color: var(--ink-muted); }
    .rg-strip-name { font-size: 15px; font-weight: 700; display: block; }
    .rg-strip-due { font-size: 13px; font-weight: 600; white-space: nowrap; }

    /* A <details> rather than a scripted panel: the menu then works with
       JavaScript off, for free, and needs no state of its own. */
    .rg-partsmenu { margin-bottom: var(--space-4); }
    .rg-partsmenu > summary {
        list-style: none; cursor: pointer; display: flex; align-items: center;
        gap: var(--space-2); min-height: 44px; padding: 0 var(--space-3);
        border: 1px solid var(--rule-strong); border-radius: var(--r-12);
        font-size: 14px; font-weight: 500;
    }
    .rg-partsmenu > summary::-webkit-details-marker { display: none; }
    .rg-partsmenu[open] > summary { border-bottom-left-radius: 0; border-bottom-right-radius: 0; }
    .rg-partsmenu .rg-parts {
        border: 1px solid var(--rule-strong); border-top: 0;
        border-radius: 0 0 var(--r-12) var(--r-12); padding: var(--space-2);
    }
}
@media (min-width: 901px) { .rg-partsmenu { display: none; } }

/* ═══════════════════════════════════════════════════════════════════════════
   THE ACCORDION

   A part is one page; its numbered sections are panels on that page. Built on
   <details>, and that choice is load-bearing rather than stylistic:
   collect_step() writes '' for every scalar key a POST does not carry, so any
   mechanism that took a collapsed section out of the DOM — or disabled it —
   would silently erase those answers on the next save. A closed <details>
   keeps its controls present and submitting.

   It also means the whole thing works with JavaScript off: every panel opens
   on its own. All wizard.js adds is "only one at a time".
   ═══════════════════════════════════════════════════════════════════════════ */

.rg-sec {
    background: var(--sheet); border: 1px solid var(--rule);
    border-radius: var(--r-6); box-shadow: var(--shadow-sheet);
}
.rg-sec + .rg-sec { margin-top: var(--space-3); }

.rg-sec-head {
    display: flex; align-items: center; gap: var(--space-3);
    padding: var(--space-4) var(--space-5); cursor: pointer;
    list-style: none;           /* Firefox */
    border-radius: var(--r-6); gap: var(--space-4);
}
.rg-sec-head::-webkit-details-marker { display: none; }   /* Safari, old Chrome */
.rg-sec-head:hover { background: var(--sheet-sunk); }
.rg-sec-head:focus-visible { outline: 2px solid var(--brand); outline-offset: -2px; }
.rg-sec[open] > .rg-sec-head {
    border-bottom: 1px solid var(--rule-soft);
    border-radius: var(--r-6) var(--r-6) 0 0;
}

.rg-sec-code {
    font-family: var(--font-mono); font-size: 11px; font-weight: 600;
    color: var(--brand); background: var(--brand-soft); border-radius: var(--r-3);
    padding: 3px 6px; flex: none; text-align: center;
}
.rg-sec-title {
    flex: 1 1 auto; min-width: 0;
    overflow: hidden; text-overflow: ellipsis;
    font-weight: 600; font-size: 15px; line-height: 22px; color: var(--ink);
}
.rg-sec-status { font-size: 12px; color: var(--ink-muted); white-space: nowrap; }

/* The dot says the state without reading: filled green when done, a hollow
   grey ring otherwise. The artboards draw the in-between state in amber; it
   is grey here, which is the standing decision and is also the truth — a
   part half answered is not a warning about anything. */
.rg-sec-dot {
    flex: none; width: 8px; height: 8px; box-sizing: border-box;
    border-radius: 50%; border: 1px solid var(--ink-ghost); background: transparent;
}
.rg-sec[data-state="complete"] .rg-sec-dot { background: var(--brand); border-color: var(--brand); }
.rg-sec[data-state="partial"] .rg-sec-status { color: var(--ink-muted); }
.rg-sec[data-state="complete"] .rg-sec-status { color: var(--brand); }

/* A section holding an error opens server-side, but it also has to look
   wrong from the outside — otherwise the summary at the top of the page
   points at something that gives no sign of being the problem. */
.rg-sec[data-problem] { border-color: var(--danger); }
.rg-sec[data-problem] .rg-sec-status { color: var(--danger); font-weight: 500; }

/* The chevron the artboards draw: two borders of an empty box, rotated.
   No SVG, no icon font, and nothing for the CSP to object to. */
.rg-sec-expander {
    flex: none; width: 7px; height: 7px; margin-left: 4px;
    border-right: 1.5px solid var(--ink-muted);
    border-bottom: 1.5px solid var(--ink-muted);
    transform: rotate(45deg) translate(-2px, -2px);
    transition: transform 120ms ease;
}
.rg-sec-expander svg { display: none; }
.rg-sec[open] .rg-sec-expander { transform: rotate(-135deg) translate(-2px, -2px); }
@media (prefers-reduced-motion: reduce) { .rg-sec-expander { transition: none; } }

.rg-sec-body { border: 0; margin: 0; padding: var(--space-5) var(--space-6) var(--space-6); min-width: 0; }
.rg-sec-body > .rg-grid { row-gap: var(--space-5); }
.rg-sec-body > .rg-card-intro { margin-top: 0; }

@media (max-width: 640px) {
    .rg-sec { border-left: 0; border-right: 0; border-radius: 0; }
    .rg-sec-head { padding: var(--space-3); }
    .rg-sec-title { font-size: 16px; }
    .rg-sec-status { display: none; }   /* the dot still carries the state */
    .rg-sec-body { padding: var(--space-4); }
}

/* ═══════════════════════════════════════════════════════════════════════════
   PARTIE I — THE IDENTITY GATE

   Fourteen facts the CFCA already holds, each of which the company must
   positively confirm or amend. Laid out as a register being checked line by
   line rather than a form being filled: the value on record is the subject of
   each row, and the company's job is to rule on it.

   Nothing is pre-answered. An unanswered row is drawn as visibly unfinished —
   dashed pills, a tinted background — because the failure mode here is a
   company assuming silence means "unchanged".
   ═══════════════════════════════════════════════════════════════════════════ */

.rg-gate2-head {
    display: flex; align-items: flex-start; justify-content: space-between;
    gap: var(--space-8); margin-bottom: var(--space-6);
}
.rg-gate2-head-text { min-width: 0; }
.rg-gate2-intro { margin: var(--space-2) 0 0; color: var(--ink-muted); max-width: var(--measure); }

.rg-gate2-legend { display: flex; gap: var(--space-4); margin-top: var(--space-4); font-size: 12px; color: var(--ink-muted); }
.rg-gate2-legend span { display: inline-flex; align-items: center; gap: 6px; }
.rg-legend-bar { display: inline-block; width: 4px; height: 12px; border-radius: 1px; }
.rg-legend-bar[data-state="same"]    { background: var(--brand); }
.rg-legend-bar[data-state="changed"] { background: var(--flag); }
.rg-legend-bar[data-state="pending"] { background: var(--spoke-todo); }

/* ── the gauge ───────────────────────────────────────────────────────────── */

.rg-gauge-wrap { position: relative; width: 128px; height: 128px; flex: none; }
.rg-gauge { display: block; }
.rg-gauge-spoke { stroke-width: 7; stroke-linecap: round; stroke: var(--rule); }
.rg-gauge-spoke[data-state="same"]    { stroke: var(--brand); }
.rg-gauge-spoke[data-state="changed"] { stroke: var(--flag); }
.rg-gauge-spoke[data-state="pending"] { stroke: var(--spoke-todo); }
.rg-gauge-centre {
    position: absolute; inset: 0; display: flex; flex-direction: column;
    align-items: center; justify-content: center; line-height: 1.1;
}
.rg-gauge-num { font-family: var(--font-mono); font-size: 30px; font-weight: 500; color: var(--brand-deep); font-variant-numeric: tabular-nums; }
.rg-gauge-of { font-size: 12px; color: var(--ink-muted); }

/* The gauge's small-screen twin. Same states, no geometry. */
/* Always visible, not a small-screen substitute. Fourteen cells read as a
   list of lines you can point at; the ring reads as a proportion. They answer
   different questions, so the artboards show both at once. */
.rg-ticks { display: flex; gap: 3px; margin: var(--space-3) 0 var(--space-6); }
.rg-tick { flex: 1 1 0; height: 22px; border-radius: var(--r-3); background: var(--spoke-todo); }
.rg-tick[data-state="same"]    { background: var(--brand); }
.rg-tick[data-state="changed"] { background: var(--flag); }
.rg-tick[data-state="pending"] { background: var(--spoke-todo); }

/* ── the table ───────────────────────────────────────────────────────────── */

.rg-gate2 { list-style: none; margin: 0; padding: 0; }
.rg-gate2-cols, .rg-gate2-row {
    display: grid; grid-template-columns: 250px minmax(0, 1fr) 232px;
    gap: var(--space-4); align-items: center;
}
.rg-gate2-cols {
    padding: 0 var(--space-2) var(--space-2);
    font-size: 12px; font-weight: 700; letter-spacing: .08em;
    color: var(--ink-muted); text-transform: uppercase;
}
.rg-gate2-row {
    padding: var(--space-3) var(--space-2);
    border-top: 1px solid var(--rule);
}
/* The same exchange, outside the fourteen-line table: one confirm row on its
   own in a plain-fields card. It needs no rule above it — there is no list
   for it to be a line of — and it sits to the left rather than stretching,
   so it lines up with the question rows around it. */
.rg-gate2-row-solo {
    border-top: 0; padding: 0;
    grid-template-columns: 250px minmax(0, 320px) 232px;
    justify-content: start; align-items: center;
}
.rg-gate2-row-solo .rg-gate2-panel { max-width: 620px; }
@media (max-width: 900px) {
    .rg-gate2-row-solo { grid-template-columns: minmax(0, 1fr); }
}
.rg-gate2-field { display: flex; align-items: baseline; gap: var(--space-2); min-width: 0; }
.rg-gate2-code {
    font-family: var(--font-mono); font-size: 11px; color: var(--ink-muted);
    flex: none; min-width: 3.6em;
}
.rg-gate2-label { font-size: 14px; }
/* Each value carries its own caption. A single header strip above the
   column only works while the column exists, and below 900px it does not. */
/* The plate needs a hairline, not just a fill. Its ground and an unanswered
   row's ground are both --sheet-sunk, so on every row nobody has answered
   yet — which is all of them, at the start — the plate dissolved into the
   row and the whole table read as flat grey. The fill alone only ever worked
   against the white of an answered row.

   It used to be propped up by an inset ring on .rg-seg beside it, which gave
   the eye something to hold; that ring had to go when the segmented control
   stopped being a filled track, and its absence is what made this visible. */
.rg-plate {
    display: block; min-width: 0; padding: var(--space-2) var(--space-3);
    background: var(--sheet-sunk); border-radius: var(--r-6);
    border: 1px solid var(--rule);
}
.rg-gate2-row[data-state="pending"] .rg-plate { background: var(--sheet); }
.rg-plate-cap {
    display: block; font-size: 10px; font-weight: 700; letter-spacing: .10em;
    text-transform: uppercase; color: var(--ink-muted); margin-bottom: 2px;
}
.rg-gate2-onfile { font-size: 15px; font-weight: 600; overflow-wrap: anywhere; }
.rg-gate2-onfile[data-empty] { font-weight: 400; font-style: italic; color: var(--ink-muted); }

/* An amended line is struck through where it stands, the way a corrected
   register reads — the old value stays visible, and stays wrong. */
.rg-gate2-row[data-state="changed"] .rg-gate2-onfile {
    text-decoration: line-through; text-decoration-color: var(--danger);
    text-decoration-thickness: 1.5px; color: var(--ink-muted); font-weight: 400;
}

/* Unanswered: cream row, dashed pills, amber code. Silence must not look
   like assent. */
.rg-gate2-row[data-state="pending"] { background: var(--sheet-sunk); }
.rg-gate2-row[data-state="pending"] .rg-gate2-code { color: var(--ink); font-weight: 700; }
/* No ring on .rg-seg: the two buttons carry their own borders now, and the
   row already says it is unanswered with its sunk ground, its bolder code
   and its grey tick in the strip above. */

.rg-gate2-row[data-invalid] { background: var(--danger-soft); }
.rg-gate2-row[data-invalid] .rg-seg-opt { border-color: var(--danger); }
.rg-gate2-row .rg-error { grid-column: 1 / -1; margin-top: var(--space-1); }

/* A grid's top-left cell. Usually empty; the investment table puts its own
   title there, which is where the printed form puts it. */
.rg-rtable-corner {
    text-align: left; font-size: 11px; font-weight: 700; letter-spacing: .04em;
    color: var(--ink-muted); text-transform: uppercase;
}

/* ── question tables: III.D, IV, VI.A, VI.B ──────────────────────────────── */

/* The four parts the printed form lays out as grids. A criterion per row, the
   answer columns headed once at the top — which is what lets a reader check
   forty answers by running down two columns instead of reading forty
   controls. */
.rg-qtable-wrap {
    margin-top: var(--space-2); overflow-x: auto;
    border: 1px solid var(--rule); border-radius: var(--r-16);
}
.rg-qtable { width: 100%; border-collapse: collapse; }
.rg-qtable th {
    height: var(--h-th); padding: 0 var(--space-3); text-align: center;
    background: var(--sheet-sunk); border-bottom: 1px solid var(--rule-strong);
    font-size: 12px; font-weight: 700; letter-spacing: .06em;
    color: var(--ink-muted); white-space: nowrap;
}
.rg-qtable th.rg-qtable-crit { text-align: left; }
.rg-qtable td {
    padding: var(--space-3); border-bottom: 1px solid var(--rule);
    vertical-align: top;
}
.rg-qtable tbody tr:last-child td { border-bottom: 0; }
.rg-qtable tbody tr:hover { background: var(--row-hover); }

/* The criterion column is the one that has to breathe: some of these run to
   three lines, and a fixed width would either truncate them or leave the
   answer columns adrift. */
.rg-qtable-crit { width: auto; min-width: 18em; }
.rg-qtable-n {
    display: inline-block; font-family: var(--font-mono); font-size: 12px;
    font-weight: 500; color: var(--ink-muted); min-width: 3.4em;
}
.rg-qtable-label { font-size: 14px; line-height: 20px; }

/* Two answer buttons, each filling its own column, exactly as the artboards
   draw them: 40px, a hairline, a radio dot, and a solid green fill when
   chosen. The previous build welded the two cells into one pill track; the
   artboards keep them apart with an 8px gap, which is also what lets the OUI
   and NON column headings keep pointing at something. */
.rg-qtable-yn { width: 88px; text-align: center; }
.rg-qtable td.rg-qtable-yn { padding: var(--space-3) var(--space-1); }
.rg-qtable-pick {
    position: relative; display: flex; align-items: center;
    justify-content: center; gap: var(--space-2);
    height: var(--h-pair); cursor: pointer;
    border: 1px solid var(--field-border); border-radius: var(--r-4);
    background: var(--sheet); font-size: 14px; font-weight: 600;
    color: var(--ink); transition: all 120ms ease;
}
.rg-qtable-pick input { position: absolute; width: 1px; height: 1px; opacity: 0; margin: 0; }
/* The dot is drawn on the ::before of the visible label, so the real radio
   stays a real radio and nothing here depends on a replaced control. */
.rg-qtable-pick::before {
    content: ""; flex: none; width: 14px; height: 14px; box-sizing: border-box;
    border-radius: var(--r-pill); border: 1px solid var(--ink-ghost);
    background: var(--sheet);
}
.rg-qtable-pick:hover { border-color: var(--brand); }
.rg-qtable-pick:has(input:checked) {
    background: var(--brand); border-color: var(--brand); color: var(--on-brand);
}
.rg-qtable-pick:has(input:checked)::before {
    border: 4px solid var(--on-brand); background: var(--brand);
}
.rg-qtable-pick:has(input:focus-visible) { outline: none; box-shadow: var(--focus-ring); }

.rg-qtable-com { width: 30%; min-width: 11em; }
.rg-qtable-input { margin-top: 0; min-height: var(--h-input); font-size: 14px; }

.rg-qtable tr[data-invalid] { background: var(--danger-soft); }
.rg-qtable tr[data-invalid] .rg-qtable-pick { border-color: var(--danger); }

/* What follows the table on paper: a prose question and its box, or the
   signatory block. */
.rg-qtable-tail { margin-top: var(--space-5); }

.rg-qtable-crit { min-width: 22em; }
.rg-qtable-com { min-width: 12em; }
@media (max-width: 900px) {
    /* .rg-qtable-wrap already scrolls; these keep the two text columns wide
       enough to read while it does, rather than letting the table squeeze
       them to two words a line. */
    .rg-qtable { min-width: 44em; }
}

/* ── Partie V's category card ───────────────────────────────── */

/* The card is a heading with the part's blocks under it, not a panel: the
   blocks inside it are already panels, and nesting a bordered box in a
   bordered box makes the letter look like a field group rather than a page
   of the form. */
.rg-vcard { margin-top: var(--space-8); }
.rg-vcard + .rg-vcard { margin-top: var(--space-6); }
.rg-vcard-head {
    display: flex; align-items: baseline; gap: var(--space-3);
    padding-bottom: var(--space-2); border-bottom: 2px solid var(--brand);
    cursor: pointer; list-style: none;
}
.rg-vcard-head::-webkit-details-marker { display: none; }
.rg-vcard-code {
    font-family: var(--font-mono); font-size: 13px; font-weight: 500;
    color: var(--brand-deep); flex: none;
}
.rg-vcard-title { font-size: 18px; font-weight: 800; color: var(--brand-deep); }
.rg-vcard-body { margin-top: var(--space-4); }

/* Collapsed, the heading stays but stops shouting. A company sees one card
   and it opens open; an operator previewing without a category sees all six,
   which is the only place collapsing one of them is useful. */
.rg-vcard:not([open]) .rg-vcard-head { border-bottom-color: var(--rule-strong); }
.rg-vcard:not([open]) .rg-vcard-title { color: var(--ink-muted); font-weight: 700; }

/* ── the two-up segmented answer ─────────────────────────────────────────── */

/* Two bordered buttons side by side, as the artboards draw them: 34px, a
   hairline each, and the selected one filled solid green. The previous build
   drew a pill track with the selection floating on a tinted shadow; the
   September artboards have no shadow anywhere except one dropdown, and a
   flat fill is what they use to say "this is the answer". */
.rg-seg {
    display: flex; gap: var(--space-2); flex-wrap: wrap;
}
.rg-seg-opt {
    position: relative; display: inline-flex; align-items: center;
    justify-content: center; height: var(--h-seg); padding: 0 14px;
    cursor: pointer; border: 1px solid var(--field-border);
    border-radius: var(--r-4); background: var(--sheet);
    font-size: 13px; font-weight: 600; color: var(--ink);
    text-align: center; transition: all 120ms ease;
}
/* A real radio, visually hidden rather than replaced: keyboard, form
   submission and assistive technology all keep working, and the ring below
   is driven by the input's own focus state. */
.rg-seg-opt input {
    position: absolute; width: 1px; height: 1px; opacity: 0; margin: 0;
}
.rg-seg-opt:hover { border-color: var(--brand); }
/* Both halves select the same way. "Modifiée" used to be drawn in amber to
   distinguish it; it is the same green now, and what says which answer was
   given is the word on the button. */
.rg-seg-opt:has(input:checked) {
    background: var(--brand); border-color: var(--brand);
    color: var(--on-brand);
}
.rg-seg-opt:has(input:focus-visible) { outline: none; box-shadow: var(--focus-ring); z-index: 1; }

/* ── the amendment panel ─────────────────────────────────────────────────── */

/* No fill. These are two ordinary follow-up fields; a green ground made them
   read as a status, which is what the segmented control above already says. */
.rg-gate2-panel {
    grid-column: 1 / -1;
    display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-4);
    padding: var(--space-4) 0 0; margin-top: var(--space-3);
    border-top: 1px solid var(--rule-soft); background: transparent;
}
.rg-gate2-panel .rg-field + .rg-field { margin-top: 0; }
.rg-gate2-panel .rg-input, .rg-gate2-panel .rg-select, .rg-gate2-panel .rg-textarea { background: var(--sheet); }
.rg-gate2-panel .rg-textarea { min-height: 72px; }

@media (max-width: 900px) {
    .rg-gate2-head { flex-direction: column; gap: var(--space-4); }
    .rg-gauge-wrap { display: none; }
    .rg-gate2-cols { display: none; }
    .rg-gate2-row { grid-template-columns: 1fr; gap: var(--space-2); }
}

/* ═══════════════════════════════════════════════════════════════════════════
   PARTIE V — MONEY THAT CANNOT BE MISREAD

   Three devices, in the order a misreading would happen:

   V.0  declare the unit once, with a worked example, so "12 480" is never
        ambiguous between dirhams and thousands;
   the amount field echoes every figure back in full dirhams, green when it
        has been scaled, because the echo is the number CFCA will record;
   the reconciliation spells the arithmetic out as an equation and says what
        to do about a difference, rather than only that there is one.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── the amount field ────────────────────────────────────────────────────── */

/* Welded, not floated: the tab is a full-height cell of the field with its
   own left rule, so the unit cannot be read apart from the figure — and a
   long figure runs up against the rule instead of sliding under the label. */
.rg-amount-tag {
    display: flex; align-items: center; align-self: stretch; flex: none;
    padding: 0 var(--space-3); border-left: 1px solid var(--rule);
    background: var(--sheet-sunk); color: var(--ink-muted);
    font-size: 13px; font-weight: 700; letter-spacing: .04em; white-space: nowrap;
    border-radius: 0 var(--r-12) var(--r-12) 0;
}

.rg-echo-chip {
    display: inline-block; font-family: var(--font-mono); font-size: 11px; font-weight: 600;
    padding: 0 5px; border-radius: var(--r-6); margin-right: 6px;
    background: var(--sheet-sunk); color: var(--ink-muted);
}

/* ── the reconciliation, as an equation ──────────────────────────────────── */

.rg-eq { margin-top: var(--space-6); padding: var(--space-4); background: var(--sheet-sunk); border-radius: var(--r-12); }
.rg-eq-row {
    display: grid; grid-template-columns: 1fr 24px 1fr 24px 1fr 24px 1.2fr;
    gap: var(--space-2); align-items: end;
}
.rg-eq-term { min-width: 0; }
.rg-eq-cap { display: block; font-size: 12px; color: var(--ink-muted); }
.rg-eq-fig {
    display: block; font-variant-numeric: tabular-nums; font-size: 15px;
    font-weight: 600; overflow-wrap: anywhere;
}
.rg-eq-op { text-align: center; font-size: 16px; color: var(--ink-muted); padding-bottom: 2px; }
.rg-eq-term[data-role="sum"] .rg-eq-fig { color: var(--brand-deep); }

.rg-eqbar {
    display: flex; height: 16px; margin-top: var(--space-4); position: relative;
    background: var(--rule); border-radius: var(--r-8); overflow: hidden;
}
.rg-eqbar-seg { display: block; height: 100%; }
.rg-eqbar-seg[data-part="morocco"]   { background: var(--brand-deep); }
.rg-eqbar-seg[data-part="africa"]    { background: var(--brand); }
.rg-eqbar-seg[data-part="ex_africa"] { background: var(--brand-soft); }
/* The shortfall is drawn as hatching rather than left blank: a gap that looks
   like background reads as "the bar ends here", not "something is missing". */
.rg-eqbar-gap {
    display: block; height: 100%;
    background: repeating-linear-gradient(45deg,
        var(--danger) 0 3px, transparent 3px 7px);
}
/* Where the declared total falls. When the zones overshoot, this sits inside
   the bar — which is precisely the picture. */
.rg-eqbar-tick { position: absolute; top: -3px; bottom: -3px; width: 2px; background: var(--ink); }

.rg-eq-legend { display: flex; flex-wrap: wrap; gap: var(--space-4); margin-top: var(--space-2); font-size: 12px; color: var(--ink-muted); }
.rg-eq-legend span { display: inline-flex; align-items: center; gap: 6px; }
.rg-eq-legend i { width: 10px; height: 10px; border-radius: 2px; }
.rg-eq-legend i[data-part="morocco"]   { background: var(--brand-deep); }
.rg-eq-legend i[data-part="africa"]    { background: var(--brand); }
.rg-eq-legend i[data-part="ex_africa"] { background: var(--brand-soft); border: 1px solid var(--rule-strong); }
.rg-eq-legend i[data-part="declared"]  { width: 2px; height: 14px; border-radius: 0; background: var(--ink); }

.rg-verdict {
    display: grid; grid-template-columns: 1fr auto; gap: var(--space-1) var(--space-4);
    margin-top: var(--space-4); padding: var(--space-3) var(--space-4);
    border-radius: var(--r-10); font-size: 14px;
}
.rg-verdict[data-state="ok"]  { background: var(--confirm-soft); }
.rg-verdict[data-state="off"] { background: var(--danger-soft); }
.rg-verdict-title { font-weight: 600; }
.rg-verdict[data-state="ok"]  .rg-verdict-title { color: var(--confirm); }
.rg-verdict[data-state="off"] .rg-verdict-title { color: var(--danger); }
/* The difference, and what to do about it. "Ne correspond pas" alone leaves
   someone to work out which of the four numbers to touch. */
.rg-verdict-body { grid-column: 1; color: var(--ink-muted); }
.rg-verdict-figure {
    grid-column: 2; grid-row: 1 / span 2; align-self: center;
    font-variant-numeric: tabular-nums; font-weight: 600; white-space: nowrap;
}
.rg-verdict[data-state="ok"]  .rg-verdict-figure { color: var(--confirm); }
.rg-verdict[data-state="off"] .rg-verdict-figure { color: var(--danger); }

@media (max-width: 640px) {
    .rg-eq-row { grid-template-columns: 1fr; gap: var(--space-1); }
    .rg-eq-op { text-align: left; }
    .rg-verdict { grid-template-columns: 1fr; }
    .rg-verdict-figure { grid-column: 1; grid-row: auto; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   PARTIE VIII — THE DECLARATION AND THE SIGNATURE

   The screen has one job beyond collecting a signature: making it plain what
   is being signed, and what the signature is worth. So the three law 43-20
   levels each state what they prove *and what they do not* — the second line
   is what stops a simple signature being over-read, by the company or by us.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── what is still open ──────────────────────────────────────────────────── */

.rg-ansrow {
    display: grid; grid-template-columns: 2.5em 1fr auto; gap: var(--space-3);
    align-items: center; min-height: 48px; padding: var(--space-2) 0;
    border-top: 1px solid var(--rule);
}
.rg-ansrow:first-of-type { border-top: 0; }
.rg-ansrow-num { font-family: var(--font-mono); font-weight: 500; color: var(--ink-muted); }
.rg-ansrow-name { font-weight: 500; min-width: 0; }
.rg-ansrow-state { font-size: 13px; color: var(--ink-muted); text-align: right; }
.rg-ansrow[data-state="open"] .rg-ansrow-state { color: var(--ink); font-weight: 700; }
.rg-ansrow[data-state="open"] .rg-ansrow-state a { color: inherit; }

/* ── the declaration ─────────────────────────────────────────────────────── */

/* The personalised sentence leads; the four legal lines follow it verbatim.
   They are stored with each signature as declaration_version, so rewriting
   them would quietly change what past signatories are recorded as having
   agreed to. */
.rg-declaration-lead {
    font-size: 18px; line-height: 30px;
    max-width: var(--measure); margin: 0 0 var(--space-4);
    padding-bottom: var(--space-4); border-bottom: 1px solid var(--rule);
}
.rg-declaration-lead strong { font-weight: 700; }

/* ── the three levels ────────────────────────────────────────────────────── */

.rg-lvlcards { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-3); margin-top: var(--space-4); }
.rg-lvlcard {
    display: flex; flex-direction: column; gap: var(--space-2);
    padding: var(--space-4); background: var(--sheet);
    border: 1px solid var(--rule); border-radius: var(--r-14);
}
.rg-lvlcard[data-state="active"]   { border-color: var(--brand); background: var(--brand-soft); }
.rg-lvlcard[data-state="verified"] { border-color: var(--confirm); background: var(--confirm-soft); }
.rg-lvlcard[data-state="void"]     { border-color: var(--danger); background: var(--danger-soft); }
.rg-lvlcard-head { display: flex; align-items: baseline; justify-content: space-between; gap: var(--space-2); }
.rg-lvl-eyebrow { font-size: 11px; font-weight: 600; letter-spacing: .1em; color: var(--ink-muted); }
.rg-lvl-badge {
    font-size: 11px; font-weight: 600; padding: 1px 6px; border-radius: var(--r-pill);
    background: var(--sheet-sunk); color: var(--ink-muted); white-space: nowrap;
}
.rg-lvlcard[data-state="active"] .rg-lvl-badge   { background: var(--brand); color: var(--on-brand); }
.rg-lvlcard[data-state="verified"] .rg-lvl-badge { background: var(--confirm); color: var(--sheet); }
.rg-lvlcard[data-state="void"] .rg-lvl-badge     { background: var(--danger); color: var(--sheet); }
.rg-lvl-name { font-weight: 800; font-size: 17px; }
.rg-lvl-how { font-size: 14px; line-height: 20px; color: var(--ink-muted); margin: 0; }

.rg-claims { margin-top: auto; padding-top: var(--space-3); border-top: 1px solid var(--rule); }
.rg-claim { display: block; font-size: 13px; line-height: 19px; margin-top: var(--space-1); }
.rg-claim b { font-weight: 600; }
.rg-claim[data-kind="proves"] { color: var(--ink); }
.rg-claim[data-kind="not"] { color: var(--ink-muted); }

@media (max-width: 860px) { .rg-lvlcards { grid-template-columns: 1fr; } }

/* ── signing area ────────────────────────────────────────────────────────── */

.rg-subhead {
    display: flex; align-items: baseline; gap: var(--space-2);
    margin: var(--space-8) 0 var(--space-2); padding-bottom: var(--space-2);
    border-bottom: 1px solid var(--rule);
}
.rg-subhead h3 { font-weight: 700; font-size: 17px; margin: 0; }
.rg-subhead span { font-size: 13px; color: var(--ink-muted); }

.rg-signarea { display: grid; grid-template-columns: 1.25fr 1fr; gap: var(--space-6); margin-top: var(--space-4); }
@media (max-width: 860px) { .rg-signarea { grid-template-columns: 1fr; } }

.rg-sigpad-head { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); margin: var(--space-4) 0 var(--space-2); }
.rg-sigpad-head span { font-size: 14px; font-weight: 600; }

/* ── the seal ────────────────────────────────────────────────────────────── */

/* Reversed out, because it is the one panel on this screen that asks for
   nothing: it states what has been computed from the answers. Dark green is
   the artboards' way of saying "this is a result, not a field". */
.rg-seal {
    display: flex; flex-direction: column; align-items: center; gap: var(--space-2);
    padding: var(--space-6) var(--space-4); background: var(--brand-deep);
    border-radius: var(--r-12); text-align: center; color: var(--on-brand);
}
.rg-sigil { display: block; }
/* On dark the four tones run the other way — pale is the emphasis. */
.rg-sigil-spoke { stroke-width: 2.4; stroke-linecap: round; stroke: var(--brand); }
.rg-sigil-spoke[data-tone="0"] { stroke: var(--brand-strong); }
.rg-sigil-spoke[data-tone="1"] { stroke: var(--brand); }
.rg-sigil-spoke[data-tone="2"] { stroke: var(--motif-console); }
.rg-sigil-spoke[data-tone="3"] { stroke: var(--on-brand); }
.rg-seal-title { font-size: 14px; font-weight: 800; letter-spacing: .02em; }
.rg-seal-body { font-size: 13px; line-height: 19px; color: var(--motif-console); margin: 0; max-width: 34ch; }
.rg-hashgrid {
    display: grid; grid-template-columns: repeat(4, max-content); gap: 2px var(--space-3);
    font-family: var(--font-mono); font-size: 11px; color: var(--on-brand);
    margin-top: var(--space-2);
}
.rg-seal-warn { font-size: 12px; color: var(--motif-console); margin: var(--space-2) 0 0; max-width: 34ch; }

/* ── the certificate route ───────────────────────────────────────────────── */

.rg-stepcards { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-3); margin-top: var(--space-4); }
.rg-stepcard {
    display: flex; flex-direction: column; gap: var(--space-2);
    padding: var(--space-4); border: 1px solid var(--rule); border-radius: var(--r-12);
}
.rg-stepcard-n { font-size: 22px; font-weight: 700; color: var(--brand-strong); line-height: 1; }
.rg-stepcard p { margin: 0; font-size: 14px; line-height: 20px; color: var(--ink-muted); }
.rg-stepcard .rg-btn, .rg-stepcard input[type="file"] { margin-top: auto; }
.rg-stepcard input[type="file"] { font-size: 12px; max-width: 100%; }
@media (max-width: 860px) { .rg-stepcards { grid-template-columns: 1fr; } }

/* ── the voided state ────────────────────────────────────────────────────── */

.rg-sigpad[data-state="void"] .rg-sigpad-canvas img,
.rg-sigpad[data-state="void"] .rg-sigpad-canvas canvas { opacity: .35; filter: grayscale(1); }

/* ═══════════════════════════════════════════════════════════════════════════
   THE RECEIPT, AND THE WAY IN

   Two ends of the same journey, and both are single-purpose screens rather
   than steps, so neither uses the rail.

   The receipt is the thing a company files away and quotes back months later,
   so the reference, the time and the fingerprint are the content — not
   decoration around a "thank you". The wording stays flat: no celebration,
   no illustration. A filing is not an achievement.
   ═══════════════════════════════════════════════════════════════════════════ */

.rg-receipt2 {
    display: grid; grid-template-columns: 380px minmax(0, 1fr); gap: var(--space-12);
    align-items: start; max-width: 1080px; margin: 0 auto;
    padding: var(--space-12) var(--space-8) var(--space-16);
}
@media (max-width: 900px) {
    .rg-receipt2 { grid-template-columns: 1fr; gap: var(--space-8); padding: var(--space-8) var(--space-4); }
}

/* ── the seal ────────────────────────────────────────────────────────────── */

.rg-seal-big { position: relative; width: 320px; height: 320px; margin: 0 auto; }
.rg-seal-big .rg-sun { width: 100%; height: auto; }
.rg-sun-seal .rg-sun-spoke { stroke: var(--confirm); }
/* The plaque the reference is printed on. Inset far enough that the spokes
   run behind nothing — the sun is the seal's edge, the plaque is its face. */
.rg-seal-plaque {
    position: absolute; inset: 58px; border-radius: 50%;
    background: var(--confirm-soft);
}
.rg-seal-stack {
    position: absolute; inset: 0; display: flex; flex-direction: column;
    align-items: center; justify-content: center; gap: var(--space-2); text-align: center;
}
.rg-seal-check { font-size: 26px; color: var(--confirm); line-height: 1; }
.rg-seal-word {
    font-size: 12px; font-weight: 800; letter-spacing: .22em; color: var(--confirm);
}
.rg-seal-ref { font-family: var(--font-mono); font-size: 17px; color: var(--brand-deep); }
.rg-seal-when { font-family: var(--font-mono); font-size: 11px; color: var(--ink-muted); }
.rg-seal-cap {
    display: block; text-align: center; margin-top: var(--space-4);
    font-size: 13px; color: var(--ink-muted);
}
@media (max-width: 400px) { .rg-seal-big { width: 260px; height: 260px; } .rg-seal-plaque { inset: 47px; } }

/* ── the facts beside it ─────────────────────────────────────────────────── */

.rg-receipt-pill {
    display: inline-flex; align-items: center; gap: var(--space-2);
    font-size: 13px; font-weight: 600; color: var(--confirm);
    background: var(--confirm-soft); border-radius: 999px; padding: 4px var(--space-3);
}
.rg-receipt-h1 {
    font-weight: 800; font-size: 40px; line-height: 46px;
    letter-spacing: -.02em; color: var(--brand-deep); margin: var(--space-4) 0 var(--space-3);
    text-wrap: balance;
}
@media (max-width: 640px) { .rg-receipt-h1 { font-size: 28px; line-height: 34px; } }
.rg-receipt-lede { margin: 0 0 var(--space-8); color: var(--ink-muted); max-width: var(--measure); }

.rg-kv { display: grid; grid-template-columns: 180px minmax(0, 1fr); margin: 0 0 var(--space-8); }
.rg-kv dt {
    font-size: 12px; font-weight: 600; letter-spacing: .06em; color: var(--ink-muted);
    padding: var(--space-3) 0; border-top: 1px solid var(--rule);
}
.rg-kv dd {
    margin: 0; padding: var(--space-3) 0; border-top: 1px solid var(--rule);
    overflow-wrap: anywhere;
}
@media (max-width: 560px) {
    .rg-kv { grid-template-columns: 1fr; }
    .rg-kv dd { border-top: 0; padding-top: 0; }
}

.rg-lockchip {
    display: inline-flex; align-items: center; gap: 6px; white-space: nowrap;
    font-size: 13px; font-weight: 500; color: var(--ink-muted);
    background: var(--sheet-sunk); border-radius: var(--r-pill); padding: 2px var(--space-2);
}

/* ═══════════════════════════════════════════════════════════════════════════
   SIGN IN
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── the sign-in stage ───────────────────────────────────────── */

/* A field of the brand's deep green, with the card centred on it. There was a
   photograph of the CFC tower here, screened over this same green; it is out
   at the client's request. The asset and the tool that cuts it are still in
   the tree — static/img/cfc-tower.jpg and tools/make_hero.py — unused, and
   kept only because this directory is not under version control. Nothing
   references them; deleting them is safe whenever the client says so.

   A vertical gradient rather than a flat fill: a single unbroken colour over
   a full viewport reads as a rendering fault more often than as a decision,
   and the darker foot lets the stage meet the white footer without a seam. */
/* ── the split sign-in: a photograph, and a form ─────────────────────────

   Both applications sign in this way — the portal at cfc.algonova.ma and the
   operator console beside it — so the shell lives here, in the stylesheet
   both load, rather than in admin.css which only the console loads.

   Below 900px the photograph is dropped rather than stacked. A picture above
   a login form on a phone is a screenful of scrolling before the first field.
   ───────────────────────────────────────────────────────────────────────── */

.rg-login { display: grid; grid-template-columns: 560px minmax(0, 1fr); min-height: 100vh; }
@media (max-width: 900px) { .rg-login { grid-template-columns: 1fr; } .rg-login-aside { display: none; } }
/* The panel is the photograph, edge to edge. No padding: anything inset
   here would sit on top of the picture, and there is nothing left to sit. */
.rg-login-aside {
    position: relative; overflow: hidden;
    background: var(--brand-deep); border-right: 1px solid var(--rule);
}
.rg-login-photo {
    display: block; width: 100%; height: 100%;
    object-fit: cover; object-position: center;
}
/* White, in both apps. The console's theme already sets --ground white; the
   portal's is #F4F6F5, which made the two sign-in pages — the same layout,
   side by side — read as different designs. The panel decides its own
   ground rather than inheriting the app's. */
.rg-login-main {
    position: relative;
    display: flex; align-items: center; justify-content: center;
    padding: var(--space-8) var(--space-4);
    background: var(--sheet);
}
/* The column caps the width, but the form caps it too. When the console's
   template had no .rg-login-col wrapper the form was unconstrained, and an
   error notice — a grid that grows to its content — stretched the whole
   sign-in across the panel. Two bounds, so neither template can lose it. */
.rg-login-form { width: 100%; max-width: 380px; }
.rg-login-form h2 { font-size: 26px; font-weight: 800; margin: 0 0 var(--space-1); }
.rg-login-form .rg-input { min-height: 48px; font-size: 16px; }
.rg-login-form .rg-btn { min-height: 48px; font-size: 16px; margin-top: var(--space-6); }
/* The masthead's three pieces, above the form: the lockup, the name of the
   document, and the language switch. They have nowhere else to be on a page
   that has no masthead. */
.rg-login-col { width: 100%; max-width: 380px; }
/* The lockup and the name of the document, centred over the form as one
   mark. Only these two: the language switch left this block for the corner
   of the page. */
.rg-login-head {
    display: flex; flex-direction: column; align-items: center;
    gap: var(--space-2); margin-bottom: var(--space-8); text-align: center;
}
.rg-login-head .rg-signin-mark .rg-lockup-logo { height: 40px; margin: 0 auto; }
.rg-login-doc {
    margin: 0; font-size: 12px; letter-spacing: .08em; color: var(--ink-muted);
}
/* Top right of the page, not in the run of the form. It is a setting for the
   whole screen rather than a step on the way to signing in, so it sits where
   a setting sits and stays out of the tab order between the two fields. */
.rg-login-lang {
    position: absolute; top: var(--space-6); right: var(--space-8); z-index: 1;
}
@media (max-width: 900px) {
    .rg-login-lang { top: var(--space-4); right: var(--space-4); }
}

/* The change-password screen keeps a visible heading where the sign-in page
   does not: being asked to replace a password is not self-evident from two
   boxes. Sized to sit under the lockup, not to compete with it. */
.rg-login-h1 {
    font-family: var(--font-head); font-size: 22px; font-weight: 700;
    letter-spacing: -.02em; color: var(--brand-deep);
    margin: 0 0 var(--space-2);
}
.rg-login-sub { margin: 0 0 var(--space-5); }

.rg-login-note { display: flex; align-items: center; gap: var(--space-2); margin-top: var(--space-4); font-size: 12px; color: var(--ink-muted); }

/* The lockup above a sign-in form. `.rg-lockup-logo` is display:block for
   the masthead, so it takes an auto margin rather than text-align from the
   span around it. */
.rg-signin-mark { display: block; }
.rg-receipt2 { flex: 1 0 auto; }
/* Centred. `.rg-lockup-logo` is display:block for the masthead, so it takes
   an auto margin rather than text-align from the span around it. */
.rg-signin-mark .rg-lockup-logo { height: 48px; width: auto; margin: 0 auto; }

.rg-signin-foot {
    margin: 0; padding-top: var(--space-4);
    border-top: 1px solid var(--rule-soft);
    font-size: 13px; line-height: 1.6; color: var(--ink-muted); text-wrap: pretty;
}

