/* ==========================================================================
   prototype-final.css — the single-file prototype's own stylesheet

   GENERATED FILE — DO NOT EDIT.
   Extracted verbatim from wwwroot/mde-well-portal-final.html
   lines 166-2124, by tools/extract-prototype.js.
   Edit the prototype and re-run the extractor; an edit made here is lost
   on the next import and, worse, is lost silently.

   IT LOADS BEFORE tokens.css ON PURPOSE, and _Layout.cshtml says why: the two
   prototypes in docs/01_Prototype disagree (--c-primary #1e40af here vs #005ea2
   there, and both define .card/.btn/.inp/.chip). This one is the only place
   .gis, .dashbar, .fcode, .dashmore and .grid--dash exist.

   ONE DECLARATION IS NOT COPIED THROUGH: the Merriweather font-family on
   h1,h2,h3,.serif. The portal ships one family (Inter, self-hosted). See the
   comment above this write() in tools/extract-prototype.js for why it is
   deleted at import rather than overridden in brand.css.
   ======================================================================= */

  /* ==========================================================================
   * THE BOX MODEL, DECLARED HERE RATHER THAN BORROWED FROM A CDN
   * Author: Sharmila Parthiban.  Added 8/24/2026.
   *
   * THIS IS THE ACTUAL CAUSE OF "the content and column values are not aligned",
   * reported repeatedly and survived every correction made to the column widths.
   * Those corrections were all real and none of them could have worked, because
   * the widths were never the fault. The fault was that this file had NO
   * box-sizing rule of its own — `grep box-sizing` returned nothing — and was
   * silently relying on Tailwind's Preflight, which arrives from
   * cdn.tailwindcss.com, to supply `*{box-sizing:border-box}`.
   *
   * WHAT THAT DOES TO THIS TABLE. Every cell carries `padding:.45rem .55rem`,
   * so 1.1rem of horizontal padding per column. With border-box — Tailwind
   * present — the padding sits INSIDE the width the <col> declares, the eight
   * declared percentages are the widths actually drawn, and the header sits over
   * its data. With content-box, which is the CSS default and therefore what
   * applies the moment Tailwind is not there, that 1.1rem is ADDED to every
   * column. Eight columns of declared width plus 8.8rem of padding cannot fit a
   * table that is 100% wide, so the engine renegotiates the geometry against
   * content — and the header row, whose cells wrap, renegotiates differently
   * from the body rows, whose cells hold buttons that cannot. The labels come to
   * rest over the wrong columns, and they move again at every window width and
   * zoom level.
   *
   * WHY IT LOOKED INTERMITTENT AND UNFIXABLE. The page loads Tailwind, Font
   * Awesome, Leaflet and Google Fonts from four different CDNs. On a machine that
   * can reach them the grid is correct and the widths look like the problem is
   * solved; on MDE's network, behind the firewall and content security policy
   * this project has already documented, Preflight never arrives and the grid is
   * wrong — with nothing in the file to say why, because the rule it depended on
   * was never written down in it. Same file, two different box models, depending
   * on the network. That is the "repeated trial" in the report.
   *
   * So the box model is now stated locally and the table no longer has an opinion
   * about whether a CDN answered. This is one line of CSS and it is the one the
   * width arithmetic in COLUMNS has been resting on all along.
   * ========================================================================== */
  *,*::before,*::after{box-sizing:border-box}

  /* ==========================================================================
   * LOCAL FALLBACKS FOR THE UTILITY CLASSES THE GRID'S LAYOUT NEEDS
   *
   * The same dependency, one level up. The dashboard cells are built in
   * JavaScript with Tailwind utility class names — `flex items-start gap-1
   * flex-wrap` puts the status chip beside its clock icon, `font-semibold`
   * separates a primary value from its sub-line. None of those names is defined
   * anywhere in this file, so without the CDN a flex row becomes two stacked
   * blocks and the row grows a line, which changes the height of all eight cells
   * and reads as more misalignment on top of the box-model fault above.
   *
   * These are declared with Tailwind's own values, so when the CDN DOES answer
   * the two agree and nothing changes visually either way. They are not an
   * attempt to reimplement Tailwind — only the handful the grid's geometry
   * actually depends on, which is why the list is short and specific.
   *
   * The right long-term fix is to stop loading a utility framework from an
   * unpinned CDN at all, exactly as the sibling index.html shell already
   * concluded. That is a larger change than an alignment defect should carry, so
   * it is recorded as an open question rather than done quietly here.
   * ========================================================================== */
  .flex{display:flex}
  .inline-flex{display:inline-flex}
  .flex-wrap{flex-wrap:wrap}
  .items-start{align-items:flex-start}
  .items-center{align-items:center}
  .gap-1{gap:.25rem}
  .gap-1\.5{gap:.375rem}
  .gap-x-1{column-gap:.25rem}
  .gap-y-1{row-gap:.25rem}
  .font-normal{font-weight:400}
  .font-semibold{font-weight:600}
  .font-bold{font-weight:700}
  .font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}
  .underline{text-decoration-line:underline}
  .text-center{text-align:center}
  .whitespace-nowrap{white-space:nowrap}
  .py-4{padding-top:1rem;padding-bottom:1rem}
  .mt-0\.5{margin-top:.125rem}
  .mt-1{margin-top:.25rem}
  .mt-2{margin-top:.5rem}
  .mb-2{margin-bottom:.5rem}
  .mb-3{margin-bottom:.75rem}
  .mr-1{margin-right:.25rem}
  /* The four text colours the grid names. Each is Tailwind's own hex, and each
     clears 4.5:1 on the white cell fill and on the #f8fafc hover fill. */
  .text-blue-800{color:#1e40af}
  .text-amber-800{color:#92400e}
  .text-slate-600{color:#475569}
  .text-slate-400{color:#94a3b8}

  /* ---- the sort-direction cue, and why it is NOT text-slate-400 ------------- *
   * Author: Sharmila Parthiban.  Added 8/24/2026 during the 508 audit.
   *
   * WCAG 1.4.11 Non-text Contrast, and 1.4.3 as well since these are characters.
   * The ▲ ▼ ↕ beside each dashboard column label used to carry Tailwind's
   * text-slate-400 (#94a3b8). Against the #f1f5f9 header fill that measures
   * 2.34:1, against a 3:1 floor for a graphical control cue and 4.5:1 for text.
   * It is the only thing on screen that says WHICH column is sorted and in which
   * direction, so a low-vision user reading the grid cannot see the answer —
   * aria-sort tells a screen reader and tells a magnifier user nothing.
   *
   * It gets its own class name rather than a corrected .text-slate-400 because
   * Tailwind, when the CDN answers, injects its own .text-slate-400 at runtime
   * with equal specificity and later in the cascade, so it would win and the
   * defect would come back on exactly the machines where the page looks fine.
   * `sortcue` is a name Tailwind does not define, so this rule holds either way.
   *
   * #475569 is slate-600, already in use elsewhere in this file: 6.92:1 on the
   * header fill and 7.58:1 on white. The glyph stays aria-hidden — aria-sort on
   * the th is the programmatic carrier, and announcing both would say it twice. */
  .sortcue{color:#475569}

  /* ---- the dark surfaces, or white text lands on white --------------------- *
   * Author: Sharmila Parthiban.  Added 8/24/2026 during the 508 audit, and this
   * is the worst thing the CDN dependency does.
   *
   * Three surfaces in this page are dark cards — the header strip, the workspace
   * package banner and the form-package banner — and they are painted by
   * `bg-slate-800`, with `text-white`, `text-slate-200` and `text-slate-300` on
   * top. NONE of those four class names is defined in this file. When Tailwind
   * answers, the cards are dark and the text is 14.63:1, 11.87:1 and 9.85:1. When
   * it does not, `bg-slate-800` paints nothing, the card stays white, and white
   * text sits on white paper at 1:1 — WCAG 1.4.3 failed absolutely, and the
   * content is not merely hard to read but INVISIBLE, including the package
   * identifier and the application summary in the workspace banner.
   *
   * A misaligned column is a nuisance. A banner whose text cannot be seen at all
   * is a person unable to do the work, so these four are declared locally with
   * Tailwind's own values, exactly like the layout utilities above. The print
   * block already forces these surfaces to dark ink on white paper, so paper was
   * never affected — only the screen, and only off the network.
   *
   * The gradient on the MDE seal badge gets a solid fallback for the same reason:
   * `bg-gradient-to-br` is a background-IMAGE in Tailwind, so a background-COLOUR
   * underneath it is invisible when the gradient loads and is the only thing
   * holding the white glyph up when it does not.                              */
  .bg-slate-800{background-color:#1e293b}
  .text-white{color:#fff}
  .text-slate-200{color:#e2e8f0}
  .text-slate-300{color:#cbd5e1}
  .bg-gradient-to-br{background-color:#1e3a8a}

  /* ---- tokens (mirrors css/tokens.css; USWDS-aligned) ------------------- */
  :root{
    --c-ink:#1b1b1b; --c-ink-muted:#565c65; --c-line:#cbd5e1;
    --c-primary:#1e40af; --c-primary-dark:#1e3a8a;
    --c-form-green:#216e1f; --c-form-yellow:#936f38; --c-form-blue:#2e6276;
    --c-form-white:#565c65; --c-form-purple:#54278f; --c-form-teal:#0f6e78;
    --focus-ring:0 0 0 2px #ffffff, 0 0 0 6px #2491ff;

    /* ---- the type scale — ONE SCALE, ANCHORED ON USWDS -------------------- *
     * Author: Sharmila Parthiban.  Re-anchored 8/25/2026.
     *
     * WHY IT WAS INCONSISTENT, and it genuinely was. When the tables were
     * converted to USWDS the page acquired a SECOND type scale. USWDS sizes its
     * own components and does not ask permission:
     *
     *     usa-table  1.13rem   usa-input   1.13rem   usa-button  1.13rem
     *     usa-label  1.13rem   usa-legend  1.13rem   usa-prose   1.13rem
     *     usa-tag    0.93rem
     *
     * Against the old scale below — body 14px, floor 13px, micro 12px — that put
     * 18px table cells next to 13px hints, a 5px step with nothing in between,
     * and it made --fs-h2 at 17px SMALLER than the body text of the table
     * underneath it. A heading smaller than the data it introduces is the single
     * most visible symptom, and it is what "make it consistent" is pointing at.
     *
     * THE DECISION: align UP to USWDS rather than override USWDS downward. Three
     * reasons, in order of weight.
     *   1. There is no way to hold a component library at arm's length on type.
     *      Overriding eight component font-sizes means eight rules that have to
     *      be re-checked at every USWDS upgrade, and one missed rule puts the
     *      inconsistency straight back.
     *   2. Larger is more accessible, and this is a Section 508 target. The old
     *      12px micro was already documented as below this file's own stated
     *      13px floor - an exception granted under space pressure. Aligning up
     *      retires that exception instead of spreading it.
     *   3. The tables at 1.13rem were reviewed and accepted. Matching everything
     *      else to the tables is therefore matching the part already approved.
     *
     * THE SCALE. Four sizes, every one a USWDS value, so no step in the page is
     * a size USWDS does not also use:
     *
     *   --fs-body   1.13rem  18px  running prose, primary values, table cells.
     *                             The same number usa-table sets, so a cell
     *                             this file styles and a cell USWDS styles are
     *                             the same size.
     *   --fs-floor  1rem     16px  THE FLOOR for anything a user must read to do
     *                             the work: hints, secondary lines, help text.
     *                             One step down from body, not four.
     *   --fs-micro  0.93rem  15px  chips and badges ONLY - exactly usa-tag, so a
     *                             usa-tag and a legacy .chip beside it match.
     *                             Never the sole carrier of a meaning.
     *   --fs-h1/h2/h3             headings, and every one is now LARGER than
     *                             --fs-body, which was the defect.
     *
     * Nothing is below 15px anywhere. The cost is honest: rows are taller than
     * they were, and a dense grid shows fewer of them per screen. That is the
     * trade a 508 target implies, and the row-detail panels are what absorb it -
     * the grid carries five short columns and the detail lives in the panel, so
     * height per row buys legibility rather than losing information.           */
    /* THE SIZES, AND HOW THEY GOT HERE. Three passes on 8/25/2026, recorded
       because the middle one was wrong and the reasoning is worth keeping.

         draft 1   18 / 16 / 15   matched USWDS exactly. Consistent and too big —
                                  a dense permit grid scrolled for everything.
         draft 2   16 / 15 / 14   still too big, reported as such.
         NOW       14 / 13 / 12   the sizes this file used before any of this, and
                                  which county staff have been reading all along.

       So the SIZES are back where they started and the CONSISTENCY is the change
       that stuck: every one of these is now the single source for the whole page,
       including the eight USWDS components that previously set their own 18px.
       Nothing is 3px off its neighbour any more, and no heading is smaller than
       the body text it introduces — --fs-h3 at 16px against 14px body was the
       specific defect, and h1/h2/h3 are now 22/18/16.

       12px is chips and badges ONLY, and every chip repeats its meaning as a word
       elsewhere on the row, so nothing is readable only at 12px. Tablet does not
       shrink these further — it buys density from PADDING instead, which is the
       right lever: a tablet is held further from the eye than a laptop, so
       shrinking type to win columns loses more than it gains. */
    --fs-body:0.875rem;                /* 14px — running text, primary values   */
    --fs-floor:0.8125rem;              /* 13px — hints and secondary lines      */
    --fs-micro:0.75rem;                /* 12px — chips and badges ONLY          */
    --fs-h1:1.375rem; --fs-h2:1.125rem; --fs-h3:1rem;
    --lh-tight:1.3; --lh-body:1.5;
  }
  /* ==========================================================================
   * ONE FONT FAMILY, AND WHY THE SERIF WENT
   * Author: Sharmila Parthiban.  8/25/2026.
   *
   * The page was running THREE families: Inter for body, Merriweather for every
   * h1/h2/h3, and whatever USWDS sets on its own components — so a table heading,
   * a section heading and a form label were three different typefaces, two of them
   * fetched from Google Fonts. That is the same class of inconsistency as the type
   * sizes, and it had the same second failure: off the network both webfonts fell
   * back silently, Merriweather to Georgia and Inter to system-ui, so headings
   * became serif and body sans on exactly the machines where the portal is used.
   *
   * ONE STACK NOW, on everything. Public Sans first because it is the USWDS
   * typeface, so where USWDS has it the page and the components agree; then a
   * system stack that needs no network at all. Nothing in this file loads a
   * webfont for text any more.
   *
   * MONOSPACE IS KEPT, and it is functional rather than decorative. Permit
   * numbers, licence numbers and well tags are compared character by character by
   * people reading them off paper, and 0/O and 1/l/I have to be distinguishable.
   * That is the only justified exception and it is confined to .font-mono.
   *
   * WHAT THIS DOES AND DOES NOT DO FOR A SCREEN READER. Typeface has no effect on
   * what assistive technology announces — it reads the DOM, not the rendering. The
   * things that DO matter are handled elsewhere and are worth naming so nobody
   * assumes a font change bought them: no text is delivered as an image anywhere
   * in this file; every icon is aria-hidden and paired with a word, so a missing
   * icon font costs nothing; and the uppercase on usa-tag is applied with
   * text-transform, which means the DOM still holds "Payment Pending" in sentence
   * case. That last one is the real trap — literal capitals in the markup are read
   * letter by letter by some configurations, so a tag must never be typed in caps.
   * ========================================================================== */
  html{scroll-behavior:smooth}
  html,body,button,input,select,textarea,optgroup,
  h1,h2,h3,h4,h5,h6,.serif,
  .usa-table,.usa-tag,.usa-label,.usa-legend,.usa-input,.usa-select,
  .usa-textarea,.usa-button,.usa-hint,.usa-prose{
    font-family:'Public Sans','Source Sans Pro',system-ui,-apple-system,'Segoe UI',
      Roboto,'Helvetica Neue',Arial,sans-serif;
  }
  body{color:var(--c-ink);background:#f1f5f9;
    font-size:var(--fs-body);line-height:var(--lh-body);
    /* Tabular figures line up permit numbers, fees and dates in a column
       instead of letting a 1 be half the width of a 0. */
    font-variant-numeric:tabular-nums;
    -webkit-font-smoothing:antialiased}
  h1,h2,h3,.serif{/* Merriweather font-family stripped by the extractor: one family only. */line-height:var(--lh-tight)}
  /* Scoped through `body` deliberately. Tailwind's preflight resets headings to
     `font-size:inherit` and is injected at runtime, so a bare `h1` rule here may
     land before it and lose. `body h1` outranks preflight while still losing to
     a Tailwind size utility in the markup — which is the cascade we want: the
     utility wins where one is written, this scale applies everywhere else. */
  body h1{font-size:var(--fs-h1)}
  body h2{font-size:var(--fs-h2)}
  body h3{font-size:var(--fs-h3)}
  .text-floor{font-size:var(--fs-floor)}
  .text-micro{font-size:var(--fs-micro)}

  /* ---- the utility size names, pinned to the scale ------------------------- *
   * Added 8/25/2026 by Sharmila Parthiban, finishing the consistency pass.
   *
   * text-base, text-lg, text-xl and text-2xl are used 26 times in this file and
   * NOT ONE of them was declared here - they were resolving from the utility CDN
   * at 1rem, 1.125rem, 1.25rem and 1.5rem. Two consequences, and the first is the
   * one that was visible:
   *
   *   Every modal heading carries class="text-base". At the CDN's 1rem that is
   *   16px, against body text now at 18px - so the heading of a dialogue was
   *   SMALLER than the text inside it. That is the same defect as --fs-h2 being
   *   smaller than the table it introduced, arriving by a different route.
   *
   *   And off the network they resolved to nothing at all, so the same headings
   *   fell back to whatever the element inherited - inconsistent in a third way,
   *   and only on the machines where the page is actually used.
   *
   * They are declared here in terms of the tokens, so a utility class can no
   * longer introduce a size the scale does not contain. text-xl and text-2xl both
   * resolve to --fs-h1: the scale has five steps - 15, 16, 18, 22, 28 - and
   * inventing a sixth to give a utility name its own value would put back exactly
   * the raggedness this pass removed. Two names, one size, is consistency.      */
  .text-base{font-size:var(--fs-body)}
  .text-lg{font-size:var(--fs-h2)}
  .text-xl{font-size:var(--fs-h1)}
  .text-2xl{font-size:var(--fs-h1)}

  /* ==========================================================================
   * USWDS COMPONENT TYPE, BROUGHT ONTO THE SCALE
   * Author: Sharmila Parthiban.  8/25/2026.
   *
   * USWDS sets its own font-size on eight components — usa-table, usa-input,
   * usa-select, usa-textarea, usa-label, usa-legend, usa-button and usa-prose all
   * at 1.13rem (18px), and usa-tag at 0.93rem. Left alone, those eight are 3px
   * larger than everything this file styles, which is the inconsistency that was
   * reported: an 18px table cell beside a 15px hint, in the same row.
   *
   * THE DIRECTION OF THE FIX CHANGED, and the reason is worth recording. The
   * first pass aligned the FILE UP to USWDS, on the argument that holding a
   * component library at arm's length on type means rules to re-check at every
   * upgrade. That was sound in principle and wrong in practice: 18px running text
   * makes a dense permit grid scroll for everything, and the instruction was
   * explicitly for smaller. So the eight are brought DOWN to the tokens instead.
   *
   * WHAT THIS COSTS, stated plainly so nobody is surprised at the next upgrade:
   * this block is a THEME OVERRIDE. If USWDS is upgraded, or if a ninth component
   * that sets its own font-size is adopted, this list has to be revisited or that
   * component will sit 3px off the rest of the page. That is the whole maintenance
   * burden and it is confined to this one block on purpose — nothing else in the
   * file overrides USWDS type. The proper long-term fix is to theme USWDS at the
   * Sass level with $theme-body-font-size, which a single-file prototype cannot
   * do; recorded so the .NET build does it properly rather than inheriting this.
   *
   * Selectors are deliberately no more specific than USWDS's own single-class
   * rules and are declared AFTER them in source order, so they win the tie
   * without !important. Nothing here changes a colour, a spacing or a border —
   * only the size, and only to a value already in the scale.
   * ========================================================================== */
  .usa-table,
  .usa-table td,
  .usa-table th,
  .usa-prose{font-size:var(--fs-body)}
  .usa-label,
  .usa-legend,
  .usa-input,
  .usa-select,
  .usa-textarea,
  .usa-button{font-size:var(--fs-body)}
  .usa-hint{font-size:var(--fs-floor)}
  .usa-tag{font-size:var(--fs-micro)}
  /* A caption is a label for the table, not a heading competing with it. */
  .usa-table caption{font-size:var(--fs-h3)}

  /* ==========================================================================
   * RESPONSIVE: TABLET AND BELOW
   * Author: Sharmila Parthiban.  8/25/2026.
   *
   * The page already had a viewport meta tag and two stray media queries. What it
   * did not have was a type scale or a density that changed with the screen, so a
   * tablet got desktop measurements on two thirds of the width.
   *
   * ONE STEP DOWN PER BREAKPOINT, and it stops. The tokens are redeclared rather
   * than every rule rewritten - every font-size in this file resolves through a
   * token, so three declarations move the whole page.
   *
   *   >=1024px  desktop      16 / 15 / 14
   *   640-1023  tablet       15 / 14 / 13
   *   <640px    phone        15 / 14 / 13  and single-column layout
   *
   * 13px IS THE FLOOR AND IT DOES NOT GO BELOW IT. That was this project's own
   * documented floor before any of this, it is only reached by chips and badges
   * that always repeat their meaning as words elsewhere, and "small but not too
   * small" is precisely a floor rather than a ratio. A tablet held at arm's length
   * needs the same angular size as a laptop at desk distance, so shrinking type
   * further to win columns is a false economy - the horizontal scroll on the
   * table container is the right way to spend the missing width, because it is
   * recoverable by the user and lost legibility is not.
   *
   * The 640px breakpoint is USWDS's own `tablet` token, so this file and the
   * component library change gear at the same width rather than 40px apart.
   * ========================================================================== */
  /* ==========================================================================
   * FITS THE WINDOW — no page-level sideways scroll, at any width
   * Author: Sharmila Parthiban.  8/25/2026.
   *
   * THE BUG, and it is in the design system's own build. Maryland's USWDS
   * stylesheet declares:
   *
   *     .usa-table-container--scrollable{margin:1.25rem 0;overflow-y:hidden}
   *
   * There is no overflow-x. USWDS 3 upstream sets `overflow-x:auto` on that class
   * — that is the entire point of a class called "scrollable" — and this build
   * omits it. So the container never scrolled, and the dashboard table, which
   * carries min-width:60rem to stop its columns being crushed, pushed the whole
   * PAGE sideways instead of scrolling inside its own box. On a 768px tablet that
   * is a 960px table dragging a horizontal scrollbar onto the document, which is
   * precisely "it does not fit the window".
   *
   * Declared locally so it is true whichever build answers — the vendored MDWDS
   * copy, the CDN, or neither. This is the one rule in the file that exists
   * because a dependency is wrong rather than absent, so it must NOT be removed
   * when the CDN links are swapped for local ones.
   *
   * max-width:100% on the container is the other half: without it the box itself
   * can be sized by its content, and a box that grows to fit cannot clip or scroll
   * what is inside it.
   * ========================================================================== */
  .usa-table-container--scrollable{
    overflow-x:auto;
    /* NO overflow-y. Corrected 8/25/2026, and this line was my own bug.
       It read `overflow-y:hidden`, copying USWDS's intent that a table container
       scrolls sideways only. Combined with the max-height the dashboard container
       carried, that box could neither grow nor scroll downwards — so opening a row
       detail, or "Expand all details", produced panels that were clipped at the
       fold and appeared to overlap the rows beneath them. The grid looked broken
       precisely when it was doing the right thing.
       Leaving overflow-y unset means it stays `visible`, so a container grows to
       whatever is inside it and the PAGE scrolls. Sideways scrolling still works,
       which is the behaviour the class is named for. */
    max-width:100%;
    /* Momentum scrolling on touch, and a visible scrollbar on macOS where they are
       hidden by default — a scroll region nobody can see is a scroll region nobody
       uses. The tabindex="0" on the container is what makes it reachable without a
       pointer at all. */
    -webkit-overflow-scrolling:touch;
  }

  /* The page shell. max-w-[1600px] is a utility this file never declared, so the
     shell had no maximum locally and the arbitrary-value syntax would not resolve
     off the network either. */
  .max-w-\[1600px\]{max-width:1600px}

  /* Nothing else may exceed the viewport. Media and embeds are the usual culprits;
     the map is a fixed-height box that would otherwise keep its intrinsic width. */
  img,svg,canvas,video,iframe{max-width:100%}
  img,canvas,video{height:auto}
  .leafmap{max-width:100%}
  /* Long unbroken strings — a permit reference, a URL in help text, a schema
     identifier like lk_jurisdiction_required_attachment — are the other way a page
     gets pushed wide. They break rather than overflow. */
  p,li,dd,dt,td,th,summary,figcaption{overflow-wrap:break-word}

  /* Dialogues have to fit too. 66rem is 1056px, wider than any tablet in portrait,
     so the large modal was overflowing the window on the exact devices this pass is
     about. min() keeps the desktop size and yields on a narrow screen. */
  .modal{max-width:min(44rem, calc(100vw - 1.5rem))}
  .modal--lg{max-width:min(66rem, calc(100vw - 1.5rem))}

  @media (max-width:1023px){
    /* NO type change here, and that is deliberate. The desktop scale is already
       14/13/12; a tablet is held further from the eye than a laptop, so taking it
       to 13/12/11 would make it harder to read on the device where reading is
       harder. Density comes from padding instead — the same rows fit, at the same
       size, by spending the whitespace rather than the type.
       Headings do come down one step: a 22px h1 that is right on a 1600px page is
       oversized on a 768px one, and a heading has size to spare. */
    :root{ --fs-h1:1.25rem; --fs-h2:1.0625rem; }
    /* Padding is what actually decides how many rows a tablet shows, and USWDS's
       table padding is generous for a 10in screen. */
    .usa-table td, .usa-table th{padding:.5rem .5rem}
    /* The masthead and page gutters stop wasting a tablet's width. */
    .max-w-\[1600px\]{padding-left:.75rem;padding-right:.75rem}
  }

  @media (max-width:639px){
    /* Every multi-column layout collapses. These are the grid utilities this file
       uses; at phone width a two-column definition list is two half-width columns
       of wrapped text, which is harder to read than one full-width column. */
    .grid-cols-2,
    .sm\:grid-cols-2, .sm\:grid-cols-3,
    .md\:grid-cols-2, .md\:grid-cols-4,
    .lg\:grid-cols-3, .lg\:grid-cols-4,
    .xl\:grid-cols-3, .xl\:grid-cols-4, .xl\:grid-cols-7{
      grid-template-columns:1fr;
    }
    /* A fixed table cannot be read on a 375px screen: fixed layout will not grow a
       column to fit, so it clips. Auto layout plus the scrollable container lets
       the columns take the width they need and the user scroll to them - and every
       cell carries data-label, so USWDS's stacked view has what it needs if this
       grid is ever switched to it. */
    table.grid--fixed, table.grid--dash{table-layout:auto}
    .usa-table td, .usa-table th{padding:.45rem .4rem}
  }
  /* Proportional figures where a number is inside a sentence rather than a
     column, because tabular digits look gappy in running text. */
  p,.hint,.howto__bd{font-variant-numeric:normal}

  /* ---- accessibility --------------------------------------------------- */
  .skip-link{position:absolute;left:-9999px;top:0;z-index:100;background:#1e3a8a;color:#fff;
    padding:.6rem 1rem;font-weight:600}
  .skip-link:focus{left:0}
  *:focus-visible{outline:none;box-shadow:var(--focus-ring)}
  .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
    clip:rect(0,0,0,0);white-space:nowrap;border:0}
  [aria-invalid="true"]{border-color:#b50909 !important;background:#fef2f2}

  /* ---- primitives ------------------------------------------------------ */
  .card{background:#fff;border:1px solid var(--c-line);border-radius:.5rem}
  .lbl{display:block;font-size:var(--fs-floor);font-weight:600;color:#334155;margin-bottom:.25rem}
  .lbl .req{color:#b50909;margin-left:.15rem}
  .inp{width:100%;border:1px solid #94a3b8;border-radius:.25rem;padding:.4rem .5rem;
    font-size:var(--fs-floor);background:#fff}
  .inp:disabled{background:#f1f5f9;color:#475569}
  .ro{padding:.4rem .5rem;font-size:var(--fs-floor);background:#f8fafc;
    border:1px dashed var(--c-line);border-radius:.25rem;min-height:2rem}
  /* A hint is instruction, not decoration — it is read to do the work, so it
     sits at the floor rather than below it. max-width keeps it to a measure the
     eye can track instead of stretching across a 24-inch monitor. */
  .hint{font-size:var(--fs-floor);line-height:var(--lh-body);color:var(--c-ink-muted);
    margin-top:.2rem;max-width:82ch}
  .hint.mb-0{margin-bottom:0}
  /* An inline direction: the same words, but promoted to sit beside a control
     rather than under it, with the icon optically aligned to the first line. */
  .hintline{display:flex;gap:.4rem;align-items:flex-start;font-size:var(--fs-floor);
    line-height:var(--lh-body);color:#334155;max-width:82ch;margin:.25rem 0 0}
  .hintline > i{flex:0 0 auto;margin-top:.18rem;color:#1e40af}
  /* A named key. Kept at the floor rather than shrunk, because the whole point of
     naming a key is that somebody can read it. */
  kbd{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:var(--fs-micro);
    font-weight:700;background:#f1f5f9;border:1px solid #94a3b8;border-bottom-width:2px;
    border-radius:.2rem;padding:0 .3rem;color:#1b1b1b;white-space:nowrap}
  .btn{display:inline-flex;align-items:center;gap:.4rem;border-radius:.25rem;padding:.45rem .8rem;
    font-size:var(--fs-floor);font-weight:600;border:1px solid transparent;cursor:pointer}
  .btn-primary{background:var(--c-primary);color:#fff}
  .btn-primary:hover{background:var(--c-primary-dark)}
  .btn-outline{background:#fff;color:var(--c-primary);border-color:var(--c-primary)}
  .btn-danger{background:#b50909;color:#fff}
  .btn-neutral{background:#e2e8f0;color:#1e293b;border-color:#cbd5e1}
  /* For the dark bands only — the form header, and anywhere else a panel supplies
     its own fill. An outline button CANNOT be made to work on a dark band by
     overriding its text colour: .btn-outline paints itself #fff, so `!text-white`
     left white text on a white button and both controls became invisible. This
     variant has no fill of its own, so it borrows the band behind it. White on
     slate-800 measures about 13:1, and the border is light enough to read as a
     button rather than as plain text. */
  .btn-inverse{background:transparent;color:#fff;border-color:#cbd5e1}
  .btn-inverse:hover{background:rgba(255,255,255,.14)}
  .btn-inverse:focus-visible{outline:3px solid #fff;outline-offset:2px}
  .btn:disabled{opacity:.45;cursor:not-allowed}
  .chip{display:inline-flex;align-items:center;gap:.3rem;font-size:var(--fs-micro);font-weight:700;
    line-height:1.35;padding:.1rem .45rem;border-radius:999px;text-transform:uppercase;
    letter-spacing:.02em;background:#e2e8f0;color:#334155}
  /* The form's own short code, shown beside a button label. Monospaced because
     it is an identifier, and aria-hidden wherever the words beside it already
     say the same thing. */
  .fcode{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:var(--fs-micro);
    font-weight:700;background:rgba(255,255,255,.22);border-radius:.2rem;padding:0 .25rem}
  .btn-outline .fcode,.btn-neutral .fcode{background:#e2e8f0;color:#1e293b}

  /* ---- the package obligation strip ------------------------------------ *
   * Until this existed, every surface in the system showed only what had been
   * FILED. A package with four reports in and three outstanding looked exactly
   * like a finished one, so "waiting on me, not sure what it is" was the honest
   * reading of the screen. One tile per form fixes that: the form's own colour
   * glyph, its short code as text, and a SECOND glyph whose shape states what
   * the package owes on it — filed, due, blocked, waived, not required.
   *
   * Both glyphs differ in SHAPE as well as hue, and the whole sentence rides
   * along in the accessible name and the tooltip, so the tile is a summary and
   * never the only place the answer exists. Colour carries nothing alone.
   *
   * currentColor for the border, with the state colour set inline, keeps a tile
   * to one colour decision instead of three that can drift apart.           */
  .pkg{display:flex;flex-wrap:wrap;gap:.25rem;align-items:center}
  .pkgt{display:inline-flex;align-items:center;gap:.25rem;font-size:var(--fs-micro);
    font-weight:700;line-height:1.3;padding:.1rem .35rem;border-radius:.25rem;
    border:1px solid currentColor;background:#fff;white-space:nowrap}
  .pkgt__code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.02em}
  button.pkgt{cursor:pointer;font-family:inherit}
  button.pkgt .pkgt__code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
  button.pkgt:hover{background:#f1f5f9}
  button.pkgt:focus-visible{outline:3px solid #1b1b1b;outline-offset:1px}
  /* The full list, for the package banner and the print-out. A tile cannot say
     WHY a form is not required, and the why is the entire point. */
  .pkgl{display:grid;gap:.35rem;margin:0;padding:0;list-style:none}
  .pkgl > li{display:grid;grid-template-columns:auto 1fr;gap:.5rem;align-items:start;
    padding:.35rem .5rem;border:1px solid #e2e8f0;border-radius:.35rem;background:#fff}
  .pkgl__why{font-size:var(--fs-floor);color:#334155;font-weight:400;margin:.15rem 0 0}
  .pkgl__nm{font-size:var(--fs-floor);font-weight:700;color:#1b1b1b}

  /* One bucket — yours, theirs, maybe, done, not required. The heading is the
     first thing read, so it carries whose it is and how many, and it is a real
     heading on paper as well as on screen. The three buckets that need no action
     are <details>, and their summary reuses the collapsible affordances the rest
     of the file already uses rather than inventing a second idiom. */
  .pkgg{border:1px solid #e2e8f0;border-radius:.35rem;background:#f8fafc;padding:.5rem}
  .pkgg__hd{font-size:var(--fs-floor);font-weight:700;color:#1b1b1b;margin:0 0 .1rem}
  details.pkgg > summary.pkgg__hd{cursor:pointer;list-style:none}
  details.pkgg > summary.pkgg__hd::-webkit-details-marker{display:none}
  details.pkgg > summary.pkgg__hd::before{content:'\25B8';display:inline-block;
    margin-right:.35rem;transition:transform .15s}
  details.pkgg[open] > summary.pkgg__hd::before{transform:rotate(90deg)}
  details.pkgg > summary.pkgg__hd:focus-visible{outline:3px solid #1b1b1b;outline-offset:2px}

  /* ---- .gicon — a whole panel of information as ONE button in a grid cell *
   * Added 8/24/2026 for the package column; generalised the same day for
   * "Whose action & what blocks it", after the grid was reported STILL crowded
   * with only one of the two reduced.
   *
   * Both cells had the same shape of problem. Each held a chip plus two or three
   * sentences, so each was, in every one of two hundred rows, both wider than it
   * needed to be and taller than the six columns beside it — and row height is
   * set by the tallest cell no matter how the width is declared. Between them
   * they had 42% of the table for two facts that reduce to a word and a number.
   *
   * ONE class for both, deliberately. Two icon buttons in adjacent columns that
   * looked or behaved differently would be worse than the crowding: the reader
   * has to learn the affordance once, not twice. Each is built by
   * WS.gridIconButton and each carries the same four layers —
   *   the GLYPH        the answer, by shape, so it survives greyscale
   *   the NUMBER       the count that matters, or an em dash for none
   *   the DOT          the same answer again by colour, never on its own
   *   hover or focus   the title tooltip: the full sentences, for the skimmer
   *   click or Enter   a modal: the full card, for the reader who has stopped
   * and a .gicon__print span that spells the cell out on paper, where neither
   * hover nor click exists.
   *
   * 2.25rem square is a deliberate floor — above the 24x24 CSS-pixel minimum for
   * a pointer target (WCAG 2.2 SC 2.5.8) with room to spare, because a target
   * that small in a dense grid is a target people miss.                        */
  .gicon{display:inline-flex;align-items:center;justify-content:center;gap:.2rem;
    min-width:2.25rem;min-height:2.25rem;padding:.15rem .35rem;cursor:pointer;
    font-family:inherit;font-size:var(--fs-floor);font-weight:700;line-height:1;
    border:1px solid #cbd5e1;border-radius:.35rem;background:#fff;position:relative}
  .gicon:hover{background:#f1f5f9}
  .gicon:focus-visible{outline:3px solid #1b1b1b;outline-offset:2px}
  .gicon__n{font-variant-numeric:tabular-nums}
  /* The dot repeats what the glyph and the number already say — it is the
     at-a-glance layer, never the only carrier. */
  .gicon__dot{width:.45rem;height:.45rem;border-radius:50%;flex:0 0 auto}
  /* Written into the button, hidden on screen, revealed by @media print. It is a
     real text node rather than a CSS ::after content string so that it can hold
     the record's own summary, and so that Find on Page reaches it. */
  .gicon__print{display:none}

  /* ---- form colour coding ---------------------------------------------- *
   * Colour is an ACCENT, never the message. Each form shows a coloured icon
   * plus a visually hidden colour name, so the coding survives greyscale
   * printing, colour-blindness and a screen reader. Section 508 forbids
   * colour as the sole means of conveying information.                     */
  .fclr{font-size:var(--fs-micro);line-height:1;flex:none}
  .legend{display:flex;flex-wrap:wrap;gap:.6rem 1rem;align-items:center}
  .legend > span{display:inline-flex;align-items:center;gap:.35rem;font-size:var(--fs-floor);
    color:#334155}
  @media(prefers-reduced-motion:reduce){
    html{scroll-behavior:auto}
    *{transition:none !important;animation:none !important}
  }

  /* ---- form grid: field span 1..12 ------------------------------------- */
  .fgrid{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:.75rem 1rem}
  .fld{grid-column:span 12}
  @media(min-width:768px){
    .s2{grid-column:span 2}.s3{grid-column:span 3}.s4{grid-column:span 4}
    .s5{grid-column:span 5}.s6{grid-column:span 6}.s8{grid-column:span 8}
    .s9{grid-column:span 9}.s12{grid-column:span 12}
  }
  .sec{border:1px solid var(--c-line);border-radius:.5rem;margin-bottom:1rem;background:#fff}
  /* The section header is a <summary>: it folds the section away. `list-style`
     plus the WebKit marker rule remove the browser's own triangle, because a
     flex summary renders it inconsistently across engines; the caret below is
     drawn instead and rotates on open. The border-bottom is only drawn when the
     section is open — a closed section should read as one quiet bar. */
  .sec__hd{background:#f8fafc;padding:.5rem .75rem;cursor:pointer;list-style:none;
    font-weight:700;font-size:var(--fs-floor);display:flex;justify-content:space-between;
    align-items:center;gap:.5rem;border-radius:.4rem}
  .sec__hd::-webkit-details-marker{display:none}
  .sec[open] > .sec__hd{border-bottom:1px solid var(--c-line);border-radius:.4rem .4rem 0 0}
  .sec__hd::after{content:'\25B8';color:#475569;font-size:var(--fs-micro);flex:0 0 auto;
    transition:transform .12s ease-in-out}
  .sec[open] > .sec__hd::after{transform:rotate(90deg)}
  .sec__hd:hover{background:#f1f5f9}
  .sec__hd:focus-visible{outline:3px solid var(--c-primary);outline-offset:2px}
  .sec__bd{padding:.85rem}

  /* ---- owner groups: what you submitted vs what the county manages -------- *
   * One fold per party. The header carries counts so the question "is anything
   * still outstanding for me in here?" is answered without opening it. Each
   * group is distinguished by an icon and a heading as well as a left border, so
   * nothing depends on the hue.                                               */
  .grp{border:1px solid #cbd5e1;border-radius:.5rem;margin-bottom:.9rem;background:#f8fafc}
  .grp__hd{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;
    gap:.4rem .75rem;padding:.55rem .75rem;cursor:pointer;list-style:none;
    font-size:var(--fs-floor);border-radius:.45rem}
  .grp__hd::-webkit-details-marker{display:none}
  .grp__hd:hover{background:#f1f5f9}
  .grp__hd:focus-visible{outline:3px solid var(--c-primary);outline-offset:2px}
  .grp__ttl{font-weight:800;display:inline-flex;align-items:center;gap:.4rem;color:#0f172a}
  .grp__ttl::before{content:'\25B8';color:#475569;font-size:var(--fs-micro);
    transition:transform .12s ease-in-out}
  .grp[open] > .grp__hd > .grp__ttl::before{transform:rotate(90deg)}
  .grp__counts{display:inline-flex;align-items:center;gap:.4rem;flex-wrap:wrap;color:#475569}
  .grp__bd{padding:.6rem .65rem .1rem}
  .grp__blurb{font-size:var(--fs-floor);color:#475569;margin:0 0 .6rem;max-width:78ch}
  .grp--driller{border-left:4px solid var(--c-primary)}
  .grp--shared{border-left:4px double #7c2d12}
  .grp--office-laa{border-left:4px solid #b45309}
  .grp--office-mde{border-left:4px solid #4338ca}
  .expandbar{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;margin-bottom:.6rem}
  .expandbar .hint{flex:1 1 16rem}
  @media(prefers-reduced-motion:reduce){
    .sec__hd::after,.grp__ttl::before,summary.gis__hd::after{transition:none}
  }

  /* ---- GIS address & property history explorer --------------------------- *
   * A dark band, because this is the control people reach for first and it must
   * not be mistaken for the grid's own column filters directly below it. The
   * fill is decoration only: every label is real visible text, and both text
   * colours below are AA or better on #0f172a. The primary action uses a deep
   * amber (#b45309, 5.0:1 against white) rather than the brighter orange of the
   * mock-up, which measures about 2.8:1 and would fail.                       */
  .gis{background:#0f172a;border-radius:.5rem;border:1px solid #1e293b;overflow:hidden}
  .gis__hd{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;
    gap:.35rem 1rem;padding:.6rem .85rem;background:#0b1220;border-bottom:1px solid #1e293b}
  /* The header doubles as the <details> summary, so it has to look and behave like
     a control: a pointer, no native triangle (the marker cannot be positioned or
     coloured reliably across engines), and a focus ring of its own. The chevron is
     drawn on the ::after so it sits at the END of the band rather than jammed
     against the icon at the start. */
  summary.gis__hd{cursor:pointer;list-style:none}
  summary.gis__hd::-webkit-details-marker{display:none}
  summary.gis__hd::after{content:'\25B8';color:#fbbf24;font-size:var(--fs-micro);
    flex:0 0 auto;margin-left:auto;transition:transform .12s ease-out}
  .gis[open] > summary.gis__hd::after{transform:rotate(90deg)}
  summary.gis__hd:hover{background:#111c2e}
  summary.gis__hd:focus-visible{outline:3px solid #7dd3fc;outline-offset:-3px}
  .gis__ttl{font-size:var(--fs-h3);font-weight:700;color:#fbbf24;display:inline-flex;
    align-items:center;gap:.45rem}
  .gis__sub{font-size:var(--fs-floor);color:#cbd5e1}
  .gis__bd{padding:.75rem .85rem}
  .gis__row{display:flex;flex-wrap:wrap;gap:.6rem .75rem;align-items:flex-end}
  .gis__f{flex:1 1 11rem;min-width:9rem}
  .gis__f--wide{flex:3 1 24rem}
  .gis__lbl{display:block;font-size:var(--fs-floor);font-weight:600;color:#e2e8f0;margin-bottom:.25rem}
  .gis__acts{display:flex;flex-wrap:wrap;gap:.5rem;flex:0 0 auto}
  .gis__hint{font-size:var(--fs-floor);line-height:var(--lh-body);color:#e2e8f0;
    margin:.55rem 0 0;max-width:92ch}
  .gis__out{background:#f8fafc;border-top:1px solid #1e293b;padding:.75rem .85rem}
  .gis__out:empty{display:none}
  .btn-gis{background:#b45309;color:#fff;border-color:#7c2d12}
  .btn-gis:hover{background:#92400e}
  .btn-gis-ghost{background:transparent;color:#e2e8f0;border-color:#64748b}
  .btn-gis-ghost:hover{background:#1e293b}
  /* The focus ring's inner white stroke is invisible on a dark fill. */
  .gis *:focus-visible{box-shadow:0 0 0 2px #0f172a,0 0 0 6px #7dd3fc}

  /* ---- dashboard toolbar: what the grid shows, and what you can do to it -- */
  .dashbar{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;
    gap:.6rem 1rem;background:#fff;border:1px solid var(--c-line);border-radius:.5rem;
    padding:.6rem .75rem;margin-bottom:.6rem}
  .dashbar__fs{border:0;padding:0;margin:0;min-width:0}
  .dashbar__lg{font-size:var(--fs-floor);font-weight:700;color:#334155;padding:0;margin-bottom:.2rem}
  .dashbar__acts{display:flex;flex-wrap:wrap;gap:.5rem}

  /* ---- the site sketch -------------------------------------------------- *
   * Markers are a letter in an outlined badge: shape and character, so they are
   * still distinguishable in greyscale, and each one carries its own text row in
   * the table beneath the map.                                               */
  .sketch{display:block}
  .sk-bar{display:flex;flex-wrap:wrap;align-items:center;gap:.4rem .5rem;margin:.5rem 0}
  .sk-bar__lbl{font-size:var(--fs-floor);font-weight:600;color:#334155;margin-left:.35rem}
  .sk-bar .btn[aria-pressed="true"]{background:var(--c-primary);color:#fff;border-color:#1e3a8a}
  .sk-bar .btn[aria-pressed="true"]::after{content:'\2713';font-weight:800}
  .sk-typed{border:1px solid var(--c-line);border-radius:.375rem;padding:.5rem .6rem;margin-top:.6rem;
    background:#f8fafc}
  .sk-typed__lg{font-size:var(--fs-floor);font-weight:700;color:#334155;padding:0 .25rem}
  .sk-typed__row{display:grid;grid-template-columns:repeat(auto-fit,minmax(9rem,1fr));gap:.5rem .75rem}
  .sk-typed__acts{display:flex;flex-wrap:wrap;gap:.5rem;margin-top:.5rem}
  .sk-key{display:inline-grid;place-items:center;width:1.25rem;height:1.25rem;flex:none;
    font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:var(--fs-micro);
    font-weight:800;line-height:1;
    background:#fff;color:#0f172a;border:2px solid #0f172a;border-radius:.2rem}
  .sk-key--w{border-radius:999px;background:#1e40af;color:#fff;border-color:#0b1220}
  .sk-key--b{border-radius:0;border-style:dashed}
  .sk-key--f{border-radius:.2rem}
  /* A cluster badge holds two characters — W2, W3 — and the square above is sized
     for one. Fixed at 1.25rem the second character is clipped, and a clipped well
     number on a site plan is the kind of error that gets a permit issued against
     the wrong bore. So the badge is allowed to grow sideways while keeping its
     height, which keeps it aligned with the single-character badges beside it. */
  .sk-key--wide{width:auto;min-width:1.25rem;padding:0 .18rem;border-radius:999px}
  /* A well drawn outside the traced property boundary. Not a colour on its own —
     every use of this is paired with the word "outside" in the table and in the
     marker's own accessible name. */
  .sk-key--out{background:#7f1d1d;color:#fff;border-color:#450a0a}
  .sk-icon{background:transparent;border:0}
  .leaflet-container .sk-key{box-shadow:0 1px 3px rgba(0,0,0,.45)}

  /* ---- instructions and directions -------------------------------------- *
   * Every form carries its own guidance, folded into a native <details> so it
   * is keyboard operable and announced as expanded or collapsed. The wording
   * lives on the form definition as DATA, so a twelfth form arrives with its
   * own directions and there is no separate help page to drift out of step
   * with the fields.
   *
   * Typography: the heading sits at the floor, the body at the floor, and the
   * text is held to a ~78ch measure so a line is trackable by eye. The step
   * numbers are aligned on their right edge (list-style-position:outside plus a
   * padding gutter) so "9." and "10." do not shunt the sentence sideways.     */
  .howto{border:1px solid #bfdbfe;background:#eff6ff;border-radius:.375rem;margin:0 0 .6rem}
  .howto__hd{display:flex;align-items:flex-start;gap:.4rem;padding:.45rem .6rem;cursor:pointer;
    list-style:none;font-size:var(--fs-floor);line-height:var(--lh-body);font-weight:700;
    color:#1e3a8a}
  .howto__hd::-webkit-details-marker{display:none}
  .howto__hd > i:first-child{margin-top:.15rem;flex:0 0 auto}
  .howto__hd::after{content:'\25B8';margin-left:auto;padding-left:.5rem;color:#1e3a8a;
    font-size:var(--fs-micro);line-height:1.5;flex:0 0 auto}
  .howto[open] > .howto__hd::after{content:'\25BE'}
  .howto__hd:focus-visible{outline:3px solid var(--c-primary);outline-offset:2px}
  .howto__bd{padding:.5rem .7rem .6rem;border-top:1px solid #bfdbfe}
  /* Who files it / when / what happens next — a two-column definition list, so
     the labels form one clean left edge and the answers another. It collapses
     to stacked rows on a narrow screen rather than squeezing to two words wide. */
  .howto__facts{display:grid;grid-template-columns:max-content minmax(0,1fr);
    gap:.2rem .75rem;margin:0 0 .55rem;font-size:var(--fs-floor);line-height:var(--lh-body)}
  .howto__facts > dt{font-weight:700;color:#1e3a8a;white-space:nowrap}
  .howto__facts > dd{margin:0;color:#1b1b1b;max-width:78ch}
  @media(max-width:640px){
    .howto__facts{grid-template-columns:minmax(0,1fr);gap:0 0}
    .howto__facts > dd{margin-bottom:.4rem}
  }
  .howto__lead{font-size:var(--fs-floor);line-height:var(--lh-body);font-weight:700;
    color:#1e3a8a;margin:.5rem 0 .15rem}
  .howto__steps{margin:.25rem 0 .4rem;padding-left:1.6rem;font-size:var(--fs-floor);
    line-height:var(--lh-body);color:#1b1b1b;max-width:78ch}
  .howto__steps > li{margin-bottom:.3rem;padding-left:.1rem}
  .howto__steps > li::marker{font-weight:700;color:#1e3a8a}
  /* Cautions are a separate list with their own marker and their own colour, and
     the marker is a character rather than a hue so it survives greyscale. */
  .howto__watch{list-style:none;padding-left:1.6rem}
  .howto__watch > li{position:relative}
  .howto__watch > li::before{content:'\26A0';position:absolute;left:-1.35rem;top:0;
    color:#92400e;font-weight:700}

  /* ---- supporting documents and photographs ------------------------------ *
   * A named slot per document rather than one anonymous upload box, so the
   * county sees the photograph of the well tag beside the report it belongs to,
   * and a missing required item can be checked at filing time and named in the
   * error summary. Visually it reuses the .howto shell — instructions and the
   * things the instructions ask for should not look like two different systems.
   * The fill is neutral rather than blue so it reads as a task list, not help. */
  .atts{border-color:#cbd5e1;background:#f8fafc}
  .atts > .howto__hd{color:#0f172a}
  .atts > .howto__hd::after{color:#475569}
  .atts > .howto__bd{border-top-color:#cbd5e1}
  .atts__counts{display:inline-flex;flex-wrap:wrap;align-items:center;gap:.3rem;
    margin-left:.5rem;flex:0 1 auto}
  .att{border:1px solid #e2e8f0;border-left:3px solid #94a3b8;border-radius:.3rem;background:#fff;
    padding:.5rem .6rem;margin-bottom:.5rem}
  /* A required item gets a heavier left edge AND the word "Required" in a chip
     AND an asterisk icon — three signals, never the colour alone (508). */
  .att--req{border-left-color:#991b1b}
  .att--done{border-left-color:#14532d}
  .att__hd{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;
    gap:.3rem .75rem}
  .att__lbl{font-size:var(--fs-floor);line-height:var(--lh-body);font-weight:700;color:#0f172a;
    display:inline-flex;align-items:baseline;gap:.4rem;cursor:pointer}
  .att__chips{display:inline-flex;flex-wrap:wrap;align-items:center;gap:.3rem}
  .att__why{font-size:var(--fs-floor);line-height:var(--lh-body);color:#475569;
    margin:.2rem 0 .4rem;max-width:78ch}
  /* A file input is the one control that will not honour a width, so it is given
     its own line and a matching border instead of being crammed into the grid. */
  .att__inp{max-width:34rem;padding:.35rem .4rem;cursor:pointer}
  .att__inp:disabled{cursor:not-allowed}
  .att__files{list-style:none;margin:.4rem 0 0;padding:0;font-size:var(--fs-floor);
    line-height:var(--lh-body)}
  .att__files > li{display:flex;align-items:baseline;gap:.4rem;padding:.2rem 0;
    border-top:1px dotted #e2e8f0;color:#1b1b1b}
  .att__files > li:first-child{border-top:0}
  .att__files > li > i{color:#14532d;flex:0 0 auto}
  .att__rm{margin-left:auto;flex:0 0 auto;background:transparent;border:1px solid #cbd5e1;
    border-radius:.2rem;color:#991b1b;font-size:var(--fs-micro);line-height:1;
    padding:.15rem .35rem;cursor:pointer}
  .att__rm:hover{background:#fee2e2;border-color:#991b1b}
  .zone-tag{font-size:var(--fs-micro);font-weight:700;line-height:1.35;color:#475569;
    background:#e2e8f0;padding:.05rem .35rem;border-radius:.2rem;white-space:nowrap}

  /* ---- whose section is this? ------------------------------------------- *
   * A section you may edit looks ordinary. A section that belongs to another
   * role is dimmed, gets a distinct LEFT BORDER, and states in words who owns
   * it — three signals, so the meaning never rests on colour alone (508). The
   * dimming is applied to the body only: the heading and the ownership badge
   * stay at full contrast so they remain readable at AA.                     */
  .sec--own{border-left:4px solid var(--c-primary)}
  .sec--other{border-left:4px dashed #94a3b8;background:#fbfcfd}
  .sec--other > .sec__bd{opacity:.72}
  .sec--other .inp,.sec--other .ro{background:#f1f5f9;color:#475569}
  .owner-tag{display:inline-flex;align-items:center;gap:.3rem;font-size:var(--fs-micro);
    font-weight:700;line-height:1.35;text-transform:uppercase;letter-spacing:.03em;
    padding:.1rem .4rem;border-radius:.2rem;border:1px solid currentColor;white-space:nowrap}
  .owner-tag--you{color:#14532d;background:#dcfce7}
  .owner-tag--laa{color:#7c2d12;background:#ffedd5}
  .owner-tag--mde{color:#3730a3;background:#e0e7ff}
  .owner-note{font-size:var(--fs-floor);color:#475569;margin-top:.35rem}

  /* ---- section headers, colour-coded by WHOSE section it is -------------- *
   * The ask was to colour the section header for the role it belongs to. The
   * hues are lifted from the owner-tag palette above rather than chosen again,
   * so the bar down the left of a header and the badge on the right of the same
   * header are never two different greens for the same fact.
   *
   * COLOUR IS NEVER THE CARRIER. Every one of these headers already states its
   * owner in words and an icon in the owner-tag ("COUNTY OFFICE ONLY", padlock),
   * and the body repeats the full sentence. So the colour is a fourth, redundant
   * cue for someone scanning a long form quickly — remove all colour and the
   * screen still says exactly who fills in what, which is the WCAG 1.4.1 test.
   *
   * A 6px bar, not a saturated fill: the header carries a heading, a citation,
   * a filled-in count and a badge, and a strong background would fight the AA
   * contrast of all four. The tints are the palest step of each hue, checked
   * against #0f172a body text.
   *
   * The zone comes from grantingZone, not from sec.zone, so a section that two
   * parties may fill shows the teal shared colour to whichever of them is
   * looking at it rather than claiming to belong to the driller alone.         */
  .sec[data-zone] > .sec__hd{border-left:6px solid #cbd5e1}
  .sec[data-zone="DRILLER"]    > .sec__hd{border-left-color:#14532d;background:#f0fdf4}
  .sec[data-zone="DRILLER"]    > .sec__hd:hover{background:#dcfce7}
  .sec[data-zone="OFFICE_LAA"] > .sec__hd{border-left-color:#7c2d12;background:#fff7ed}
  .sec[data-zone="OFFICE_LAA"] > .sec__hd:hover{background:#ffedd5}
  .sec[data-zone="OFFICE_MDE"] > .sec__hd{border-left-color:#3730a3;background:#eef2ff}
  .sec[data-zone="OFFICE_MDE"] > .sec__hd:hover{background:#e0e7ff}
  .sec[data-zone="SHARED"]     > .sec__hd{border-left-color:#0f6e78;background:#f0fdfa}
  .sec[data-zone="SHARED"]     > .sec__hd:hover{background:#ccfbf1}
  /* The zone key on the form page, so the coding is explained once on the screen
     that uses it instead of being something a user has to infer. */
  .zonekey{display:flex;flex-wrap:wrap;gap:.75rem;align-items:center}
  .zonekey__i{display:inline-flex;align-items:center;gap:.35rem;font-size:var(--fs-floor)}
  .zonekey__sw{width:.85rem;height:.85rem;border-radius:.15rem;border:1px solid #475569;
    flex:0 0 auto}

  /* ---- form and report titles, in the form's own colour ----------------- *
   * The forms ARE known by their colours in this program — the green form, the
   * yellow form — because the paper set was a carbon-copy pad and that is what
   * people call them. So the title carries the colour of the form it names.
   * WS.formIcon already puts the coloured glyph and the colour WORD next to the
   * title, which is what keeps this from being colour-only.                   */
  .form-title{border-left:8px solid var(--c-line);padding-left:.6rem}
  .form-title-bar{border-top:4px solid var(--c-line)}

  /* ---- tabs (real tablist) --------------------------------------------- */
  .tab{position:relative;display:inline-flex;align-items:center;gap:.35rem;padding:.5rem .7rem;
    font-size:var(--fs-floor);font-weight:600;color:#334155;border-bottom:3px solid transparent;
    background:transparent;white-space:nowrap;cursor:pointer}
  .tab[aria-selected="true"]{color:var(--c-primary);border-bottom-color:var(--c-primary);background:#eff6ff}
  .tab[data-locked="true"]{color:#94a3b8;cursor:not-allowed}
  .tab__badge{font-size:var(--fs-micro);font-weight:800;line-height:1.4;padding:0 .3rem;
    border-radius:.2rem;background:#e2e8f0;white-space:nowrap}
  .tab__badge--filed{background:#dcfce7;color:#14532d}
  .tab__badge--locked{background:#f1f5f9;color:#64748b}

  /* ---- tables ---------------------------------------------------------- */
  .tbl-wrap{overflow:auto;border:1px solid var(--c-line);border-radius:.375rem;background:#fff}
  /* Re-targeted 8/25/2026 from `table.grid`, which matched nothing after the USWDS
     conversion. Width matters for consistency: usa-table is width:auto by default,
     so it shrinks to its content. The dashboard carries width-full and every other
     table did not, which left sixteen tables at fifteen different widths inside
     identically sized cards. All of them are full width now.
     font-size is deliberately not restated — the .usa-table rule further up already
     puts every table on --fs-body, and declaring it twice invites the two to drift. */
  .usa-table{width:100%;border-collapse:collapse}
  /* ---- why these rules are split by thead / tbody ------------------------ *
   * The first cell of every body row is a <th scope="row">, which is correct
   * markup — it is what lets a screen reader announce "File the completion
   * report within 45 days, Application status after: unchanged" instead of
   * reading a bare value with no idea which row it belongs to.
   *
   * The consequence, when one `table.grid th` rule covered both, was that every
   * ROW header also inherited the three properties meant only for the COLUMN
   * headers, and the Developer Blueprint tables came out misaligned:
   *
   *   position:sticky; top:0  — a sticky cell inside tbody sticks to the top of
   *       the scrolling wrapper, so the first column visually detached from its
   *       own row and slid over the rows above it.
   *   white-space:nowrap      — the blueprint's first column is a sentence, not
   *       a label, so it could not wrap and forced the table far wider than the
   *       card, pushing every other column sideways.
   *   background:#f1f5f9      — the header fill down the first column read as a
   *       second header rather than as data.
   *
   * So: nowrap and the fill belong to thead th alone. Body row headers are laid
   * out exactly like a td, and keep only a slightly heavier weight to show they
   * are the row's label.
   *
   * ---- and why the STICKY moved off `th` and onto `thead` -------------------
   * The dashboard's thead holds TWO rows: the column labels, and a row of
   * per-column filter boxes underneath them. With `position:sticky; top:0` on
   * every `thead th`, both rows pinned to the SAME offset — so as soon as the
   * grid scrolled, the filter row climbed on top of the label row and the header
   * stopped lining up with the columns underneath it. That is the misalignment.
   *
   * Sticking the `thead` itself pins the two rows as one block, in their proper
   * order, whatever their heights are. Positioning row two at a hard-coded `top`
   * would have worked at one zoom level and drifted at every other.
   *
   * Supported with `border-collapse:collapse` in Chrome 91+, Firefox 59+ and
   * Safari 14+. Older engines ignore it and the header simply scrolls out of
   * view, which loses a convenience; the previous behaviour lost the alignment,
   * which loses the data. The `background` on `th` stays either way, or body
   * rows would show through the pinned header.                                */
  /* RE-TARGETED 8/25/2026 from `table.grid thead`. No table carries .grid since the
     USWDS conversion, so this matched nothing and the sticky header was silently
     lost on every table in the portal — the one feature that makes a 200-row grid
     readable, gone without an error. Sticky stays on THEAD rather than on TH:
     this table has two header rows, and sticking each cell pinned both rows to the
     same offset so the filter row climbed over the labels on scroll. */
  .usa-table thead{position:sticky;top:0;z-index:2}
  /* ==========================================================================
   * ONE HEADER COLOUR, ON EVERY TABLE
   * Author: Sharmila Parthiban.  8/25/2026.
   *
   * THE INCONSISTENCY, and it was a specificity collision rather than a choice.
   * USWDS declares `.usa-table th{background-color:#dfe1e2}` — on th, NOT on
   * thead th — so it fills every header cell including the `<th scope="row">` that
   * leads each body row. This file then declared `.usa-table thead th` with a
   * lighter #f1f5f9, and being more specific it won. Net effect: the column
   * headers were LIGHTER than the row headers underneath them, so the first column
   * of every table read as a darker band than the header row itself. That is what
   * "table header colour is not consistent" was pointing at.
   *
   * Resolved by choosing ONE colour and applying it to the header row only:
   *   thead th        #dfe1e2   USWDS's own header grey, so this file and the
   *                             component library agree rather than differing by a
   *                             shade. Measured: #1b1b1b text on it is 13.13:1 and
   *                             the sort cue at #475569 is 5.78:1, both clear.
   *   tbody th        no fill   A row header is DATA — the application number —
   *                             not a header band. Filling it was the original
   *                             defect the file recorded when it split
   *                             `table.grid th` into thead and tbody rules; USWDS
   *                             reintroduced it, and this puts it back.
   *
   * ROLE COLOUR IS UNTOUCHED, which is the exception asked for. The forty
   * `.sec__hd` section headers keep their zone tints — driller green, county
   * orange, MDE indigo — because there the colour IS the information: it says which
   * party owns that part of the form. A TABLE header says nothing about a role, so
   * it has no business carrying a role colour, and every table now looks the same
   * whichever screen it is on.
   * ========================================================================== */
  .usa-table thead th{background-color:#dfe1e2;color:#1b1b1b}
  .usa-table tbody th{background-color:transparent}
  .usa-table tbody tr:hover{background:#f8fafc}
  /* RE-TARGETED 8/25/2026. These three rules were written for `table.grid`, which
     no table carries since the USWDS conversion, so they matched nothing —
     alignment, padding and the row-header weight were all silently coming from
     USWDS instead. Most of what they set is now USWDS's job and is deliberately
     NOT restated here: usa-table supplies its own padding, borders and left
     alignment, and duplicating them would be CSS that looks load-bearing and is
     not. What is kept is the two things USWDS does differently from this file's
     intent: header cells align left and wrap rather than being centred, and a body
     row header is slightly heavier than its data without becoming a second header
     band. */
  /* ==========================================================================
   * TABLE DATA IS TOP-ALIGNED, EVERYWHERE
   * Author: Sharmila Parthiban.  8/25/2026.
   *
   * USWDS sets no vertical-align on td at all, so the browser default of `middle`
   * applied. Only `tbody th` was top, and only because this file said so — which
   * produced the worst version of the problem: in a row where one cell wraps to three
   * lines, the row header sat at the top and every data cell beside it floated to the
   * vertical centre, so nothing lined up with anything and the row read as broken.
   * Cells wrap now that the truncation is gone, so this went from a detail to the
   * thing you notice first.
   *
   * TOP, not middle, and the reason is scanning. A reader compares the FIRST line of
   * each cell across a row — the applicant against the driller against the status.
   * With middle alignment the first lines sit at different heights depending on how
   * many lines each neighbour happens to have, so the eye has to re-find the baseline
   * in every cell. Top alignment means every cell starts on the same line and the
   * comparison is free.
   *
   * HEADERS STAY BOTTOM-ALIGNED, deliberately, and that is not an inconsistency: a
   * column label belongs directly above the data it names, so a two-line heading
   * should hang down to meet the rows rather than float up away from them.
   *
   * One rule on .usa-table covers all sixteen tables. The per-table copies below —
   * grid--dash, grid--fixed — are left in place because they are harmless and they
   * document their own history, but they are no longer what makes this true.
   * ========================================================================== */
  .usa-table thead th{text-align:left;vertical-align:bottom}
  .usa-table tbody th,
  .usa-table tbody td,
  .usa-table tfoot th,
  .usa-table tfoot td{vertical-align:top}
  .usa-table tbody th{font-weight:600}

  /* ==========================================================================
   * DENSE REFERENCE TABLES — fit the page, no sideways scroll
   * Author: Sharmila Parthiban.  8/25/2026.
   *
   * Three screens are reference LISTS rather than work queues: the 24 Local
   * Approving Authorities, the Well Tag Inventory and the County Contacts
   * directory. They are consulted, not worked in, and they were all scrolling
   * sideways because they were built at the same density as the dashboard.
   *
   * usa-table--compact is USWDS's own modifier and does most of the work. This
   * class adds the two things it does not: a step down in type for the cells only,
   * and much tighter horizontal padding, which is where the width actually goes —
   * twelve columns at .55rem each side spend 13rem of the table on whitespace
   * before a single character is drawn.
   *
   * NO FIXED LAYOUT, as asked. These tables declare no <colgroup> and carry no
   * grid--fixed, so the browser sizes each column to its content. That is the right
   * answer for a reference list: the MDE number column takes the two characters it
   * needs instead of the twelfth of the table a declared width would give it, and
   * nothing overflows because nothing is pinned. table-layout is stated explicitly
   * rather than left to inherit, so a future rule cannot quietly pin them.
   *
   * THE HEADINGS STILL WRAP. With auto layout a nowrap header sets a floor under
   * its column width, and "Local Approving Authority" would then be the widest
   * thing in the table. Wrapping the header to two lines costs one row of height
   * once; not wrapping it costs width on every row.
   * ========================================================================== */
  .usa-table--dense{table-layout:auto}
  .usa-table--dense td,
  .usa-table--dense th{padding:.25rem .35rem;font-size:var(--fs-floor);line-height:1.35}
  .usa-table--dense thead th{white-space:normal;vertical-align:bottom}
  /* Sub-lines inside a grouped cell. This is what makes six columns carry twelve
     columns' worth of facts: the related values stack instead of spreading. */
  .usa-table--dense .sub{display:block;font-size:var(--fs-micro);color:var(--c-ink-muted)}
  .usa-table--dense .num{font-variant-numeric:tabular-nums;white-space:nowrap}

  /* ==========================================================================
   * CELLS WRAP INSIDE A SCROLLABLE CONTAINER — overriding USWDS
   * Author: Sharmila Parthiban.  8/25/2026.
   *
   * USWDS declares, in its own stylesheet:
   *
   *     .usa-table-container--scrollable td{white-space:nowrap}
   *
   * That is a deliberate choice on their part and a reasonable one in isolation: if
   * a table is going to scroll sideways, wrapping cells fights the scrolling. But it
   * is applied to EVERY td inside the container, and because every table in this
   * portal is now in one, it switched nowrap back on across the whole application.
   *
   * That is what "text is not wrapped, it is going outside the table" was. It also
   * explains why removing the truncation from .cellone did not produce wrapping:
   * .cellone no longer says anything about white-space, so with nothing setting it
   * to normal, USWDS's nowrap simply won. Two separate rules had to go, and only
   * one of them was mine.
   *
   * THE TRADE, stated because it is a real one. Nowrap plus sideways scrolling suits
   * a wide numeric table where every column is short and the reader compares down a
   * column. It does not suit this application: the cells hold addresses, company
   * names and reasons, of unbounded length, and the instruction is that the tables
   * fit the screen. Wrapping spends height, of which a page has plenty, instead of
   * width, of which it has none.
   *
   * Specificity, deliberately: `.usa-table-container--scrollable .usa-table td` is
   * 0,2,1 against USWDS's 0,1,1, so this wins on specificity and does not depend on
   * which stylesheet loads last — the CDN link and this inline block could arrive in
   * either order. No !important, for the same reason: an override that needs
   * !important is one nobody can override in turn.
   *
   * overflow-wrap:break-word handles the case wrapping alone cannot — a long
   * unbroken token such as lk_jurisdiction_required_attachment has no space to break
   * at, and would still push the column wide.
   * ========================================================================== */
  .usa-table-container--scrollable .usa-table td,
  .usa-table-container--scrollable .usa-table th{
    white-space:normal;
    overflow-wrap:break-word;
  }
  /* The exceptions, and they are narrow on purpose: a figure or a coded identifier
     that breaks mid-token is harder to read broken than scrolled to. */
  .usa-table-container--scrollable .usa-table .num,
  .usa-table-container--scrollable .usa-table .font-mono{white-space:nowrap}
  th button{all:unset;cursor:pointer;font-weight:700;display:inline-flex;gap:.3rem;align-items:center}

  /* ---- fixed column geometry, for the Blueprint AND the dashboard ------- *
   * THE DEFECT THIS FIXES: on the Blueprint the column headers did not line up
   * over the data underneath them.
   *
   * The cause is the combination of three things that are each reasonable on
   * their own. `table.grid` is `width:100%`; `thead th` is `white-space:nowrap`,
   * so a header label sets a floor under its column's width; and the Blueprint's
   * content is wildly uneven — section 7 pairs a 4-character "Null" column with
   * a 1,200-character explanation, and section 3 puts seven full role names
   * across the head of a matrix whose cells contain "grant", "DENY" or "·".
   *
   * Under automatic table layout the engine then has to satisfy the nowrap
   * headers first and share what is left by content, so the table grows wider
   * than its card and `.tbl-wrap` starts scrolling sideways. What the reader
   * sees is a header sitting over the wrong data: the long prose column has
   * swallowed the width, the narrow columns are pinched to their header text,
   * and the association between a heading and the values beneath it is lost.
   * Worse, it resolves differently at different widths and zoom levels, which is
   * why it reads as intermittent.
   *
   * `table-layout:fixed` plus an explicit <col> width per column takes the
   * decision away from the content: the column edges are declared, the first row
   * cannot renegotiate them, and every engine draws the same grid. Two knock-on
   * rules are required, not optional — with fixed layout a header that cannot
   * wrap would simply be clipped, and a long unbroken identifier like
   * `lk_jurisdiction_required_attachment` would overflow its cell. So headers
   * wrap here, and long tokens are allowed to break.
   *
   * THE DASHBOARD NOW USES IT TOO — 8/24/2026. It did not, and the note here
   * used to say why: "there the columns hold short, similar values and sizing to
   * content is the better answer". That stopped being true the moment the package
   * column grew a tile strip and two sentences, and the misalignment was reported
   * again against the dashboard. Two separate faults were in play:
   *
   *   1. The eight declared column widths summed to 142%, not 100%
   *      (16+18+20+16+20+16+14+22). Under automatic layout a browser treats each
   *      as a suggestion and, faced with an impossible set, renegotiates the lot
   *      against content — so no column ended up where its header said it would,
   *      and it resolved differently at every window width and on every filter.
   *   2. One cell held far more than its neighbours, so content-based sizing gave
   *      it the space and pinched everything else.
   *
   * Both are fixed: the percentages now sum to 100, the dashboard declares a
   * <col> per column and takes fixed layout, and the package column is reduced to
   * one icon (see WS.packageIconCell) so no cell is an outlier again.
   *
   * ---- WHY THE FLOOR IS 60rem AND NOT 52rem ---------------------------------
   * Raised 8/24/2026, and this is the one number in the file that is pure
   * arithmetic rather than judgement. Four columns are now a single .gicon button
   * at 6% each, and under table-layout:fixed a column NEVER grows to fit its
   * content — content that does not fit simply overflows into the neighbouring
   * cell. So the narrowest column has to be wide enough for the widest thing put
   * in it, or the grid draws itself wrong:
   *
   *   .gicon min-width               2.25rem
   *   its 1px borders, both sides  + 0.125rem
   *   td padding, .45rem .55rem    + 1.1rem
   *   ------------------------------------------
   *   a 6% column must be at least   3.475rem
   *
   * 6% of 52rem is 3.12rem — short by a third of a rem, four times over, which is
   * exactly the "header does not line up with the data" that was reported again
   * after the icons went in. 6% of 60rem is 3.6rem, which clears it.
   *
   * Below 60rem .tbl-wrap scrolls sideways, which it already did below 52rem;
   * the only change is that the scrollbar appears a little sooner on a narrow
   * window. ws_checkColumnWidths() asserts this relationship rather than trusting
   * the comment, so shrinking a column or fattening the button is caught on the
   * page. The Blueprint tables share the class and the floor, and their columns
   * are far wider than 6%, so nothing there is affected but the scroll point.  */
  /* ---- CORRECTED 8/25/2026 — the selector, and the floor ------------------- *
   * Author: Sharmila Parthiban.
   *
   * This rule read `table.grid.grid--fixed`, requiring BOTH classes. When the
   * tables were converted to USWDS they stopped carrying .grid — they are
   * `usa-table usa-table--striped grid--fixed` now — so this rule silently matched
   * nothing. Two things were lost at once and neither would have thrown an error:
   * table-layout:fixed, so the Blueprint and Help tables went back to negotiating
   * their columns against content and the prose column took the table again, which
   * is the exact misalignment reported twice; and the min-width floor.
   *
   * The selector is now on grid--fixed alone, so it holds regardless of what else
   * the table carries.
   *
   * THE FLOOR DROPS FROM 60rem TO 46rem. 60 was arithmetic for the OLD dashboard:
   * eight columns of which four were 6% icon buttons needing 3.475rem each, so the
   * table had to be at least 60rem for 6% to clear it. Those icon columns no
   * longer exist. What is left on this class is the Blueprint and Help tables,
   * whose narrowest declared column is 6% of the table holding a short coded value,
   * and 6% of 46rem is 2.76rem — enough for "Null" or "bit" with padding.
   *
   * 46rem is chosen against the window, not the content: it is 736px, so a 768px
   * tablet in portrait fits these tables with NO horizontal scroll at all. Above
   * that the declared widths do the work; below it the container scrolls, which is
   * why the container rule above had to be fixed first. A floor that forced a
   * scrollbar onto every tablet was the larger of the two problems.             */
  table.grid--fixed{table-layout:fixed;min-width:46rem}

  /* ======================= THE DASHBOARD TABLE, FIFTH ATTEMPT ================
   * Author: Sharmila Parthiban.  8/24/2026.
   *
   * Reported for the fifth time: "STILL PROTOTYPE IS NOT ALIGNED IN TABLEWISE".
   * Four fixes had been tried — rebalancing the widths to 100, declaring
   * box-sizing locally, cutting eight columns to five, adding gridlines — and the
   * header still did not sit over its data. So the mechanism goes, not the numbers.
   *
   * WHAT WAS ACTUALLY WRONG: table-layout:fixed. Under fixed layout a column is
   * exactly as wide as its <col> says and NEVER GROWS TO FIT ITS CONTENT. Content
   * that does not fit does not wrap the column wider — IT OVERFLOWS SIDEWAYS INTO
   * THE NEIGHBOURING CELL. The column edge is where it was declared, the header sits
   * exactly over that edge, and the VALUE is drawn somewhere else. That reads as
   * "the data is not aligned with the column", it is impossible to fix by moving
   * percentages around, and it is why every previous attempt failed: they were all
   * adjusting the one thing that was already correct.
   *
   * The fix is to stop declaring the geometry and let the browser compute it.
   * THE HEADER AND THE BODY ARE IN THE SAME TABLE. Under table-layout:auto the
   * engine measures every row INCLUDING the header rows and produces one set of
   * column widths that all of them share. Misalignment stops being something to
   * get right and becomes structurally impossible — there is no code path in any
   * engine that gives a <th> one width and the <td> beneath it another.
   *
   * The <colgroup> percentages are KEPT and are still useful: under auto layout a
   * <col> width is a PREFERENCE rather than a command, so the proportions are
   * honoured where the content allows and quietly ignored where it does not. That
   * is exactly the behaviour wanted — the intended shape, with correctness winning
   * whenever the two disagree.
   *
   * AND border-collapse GOES TO separate. `position:sticky` on <thead> combined
   * with border-collapse:collapse is a genuine WebKit/Blink defect: with collapsed
   * borders the table paints the borders rather than the cells, so a sticky header
   * is composited without them and can be drawn a pixel or two off its column.
   * Two of the reported symptoms — a header slightly out of register, and the
   * header's gridlines vanishing while the body kept its own — are that bug and not
   * the geometry at all. border-spacing:0 keeps the cells flush, so it looks
   * identical to a collapsed table while sticking correctly.
   *
   * min-width is kept: below it the wrapper scrolls sideways instead of crushing
   * five columns into a phone width. A scrollbar is a known gesture; a 40px column
   * of wrapped single characters is not.
   * ========================================================================== */
  table.grid--dash{
    table-layout:auto;
    min-width:60rem;
    border-collapse:separate;
    border-spacing:0;
  }
  /* These three came free with .grid--fixed and have to be restated, because
     dropping that class also dropped them — and the first one is load-bearing.
     table.grid thead th sets white-space:nowrap, which under AUTO layout is far
     worse than under fixed: a header that cannot wrap sets a hard minimum width
     for its whole column, so "Applicant & well site" and "Well driller & filed"
     would each demand a single unbroken line and force the table wider than its
     card — pushing the very misalignment this change removes. Headers must wrap. */
  /* ======================= THE ONE-LINE RULE, AND WHY ========================
   * Author: Sharmila Parthiban.  8/24/2026, after the alignment was reported wrong
   * a fifth time and the rendered row was pasted back to me. That paste settled it.
   *
   * The five cells of one row contained 1, 3, 3, 2 and 2 lines of text. Every column
   * was the correct width and every header sat exactly over its own column — and the
   * row still read as a ragged vertical block rather than a table row, because with
   * vertical-align:top the values in a five-line-tall row start at five different
   * places and only one of them lines up with anything. THAT is the design flaw. It
   * was never a geometry bug, which is why box-sizing, re-balanced widths, fewer
   * columns, gridlines and auto layout each fixed something real and none of them
   * fixed what was being reported.
   *
   * SO EVERY CELL IS NOW EXACTLY ONE LINE, and every row is exactly one line tall.
   * A table whose rows are a uniform height cannot look misaligned: the baselines
   * agree by construction. The sub-lines are not lost — they are in the row's own
   * details panel, which is what "have all details as I will be lost" asked for.
   *
   * nowrap plus ellipsis is what ENFORCES it. Without them a long owner name wraps,
   * that one row becomes two lines tall, and the raggedness is back in a single row.
   * The full value is on the title attribute AND repeated in the panel, so nothing
   * is reachable only by hover — a tooltip is a convenience, never the only route.
   * ========================================================================== */
  /* ---- CORRECTED 8/25/2026: the truncation is gone ------------------------- *
   * Author: Sharmila Parthiban.
   *
   * The rule above this comment used to read:
   *
   *     white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
   *
   * and it was the wrong trade. It was introduced to make every row exactly one
   * line tall so the baselines could not look ragged, and it did achieve that.
   * What it cost was the CONTENT: "Chesapeake Drilling & Pump Co." became
   * "Chesapeake Drilling & Pu…", a street address lost its town, and a driller
   * licence number could disappear entirely. The reported problem became the
   * table content, which is a worse defect than the one being fixed — a clerk
   * cannot search for what the table will not show them, and an ellipsis in a
   * permit record is a value somebody has to open a panel to trust.
   *
   * Cells wrap now. USWDS tables are designed to wrap: usa-table sets its own
   * padding and line-height, the --striped modifier carries row separation, and a
   * two-line row under a stripe does not read as misalignment the way a two-line
   * row between hairline rules did. The uniform-height argument was solving for a
   * table that no longer exists.
   *
   * .cellone is kept as a class rather than deleted because it is applied at
   * eleven call sites and still does something worth doing — it strips the default
   * paragraph margin so a two-line cell does not gain a blank line. The title
   * attribute at those call sites is also kept: it is now a convenience rather
   * than the only route to a truncated value, which is what it should always have
   * been.                                                                      */
  #dash-table tbody .cellone{
    margin:0;
    line-height:1.5;
    overflow-wrap:anywhere;
  }
  /* The chip and the disclosure button sit inside a .cellone, so they must not
     introduce height of their own beyond the line box. */
  #dash-table tbody .cellone > .chip,
  #dash-table tbody .cellone > .dashmore{vertical-align:middle}
  /* 24px stays. The one-line rule must not be paid for out of the WCAG 2.2 SC 2.5.8
     target size — a 13px line at 1.5 plus the row padding leaves about 29px of row,
     so a 24px button fits inside a single-line row and nothing has to give. */
  #dash-table tbody .cellone > .dashmore{min-height:24px;padding:0 .35rem}

  table.grid--dash thead th{white-space:normal;vertical-align:bottom}
  table.grid--dash th,
  table.grid--dash td{word-break:break-word;overflow-wrap:anywhere}
  table.grid--dash tbody td,
  table.grid--dash tbody th{vertical-align:top}
  /* Re-targeted 8/25/2026 off `table.grid.grid--fixed`, which no longer matched. */
  table.grid--fixed thead th{white-space:normal;vertical-align:bottom}
  table.grid--fixed th,
  table.grid--fixed td{word-break:break-word;overflow-wrap:anywhere}
  /* Vertical alignment matters as much as horizontal on a fixed grid: cells of
     very different heights centred against one another read as misaligned even
     when the column edges are exact. */
  table.grid--fixed tbody td,
  table.grid--fixed tbody th{vertical-align:top}

  /* ---- the dashboard's secondary lines ---------------------------------- *
   * A deliberate, narrow exception to the 13px floor, and it is written down
   * here rather than left as a mystery. Every SECONDARY line inside a dashboard
   * cell — the driller company under the applicant, the review clock under the
   * status, the payment reference — drops to 12px so seven columns of metadata
   * fit without the row heights fighting one another.
   *
   * What keeps it defensible: none of it is the only place the fact appears. The
   * primary value in each cell stays at the floor, the record view shows every
   * one of these lines at 13px, and nothing here is the sole route to anything —
   * the row is a summary of a record that is one click away. It is scoped to
   * #dash-table alone; no form, no report and no printed page inherits it.    */
  #dash-table tbody .hint{font-size:var(--fs-micro);line-height:1.35}

  /* ---- the redesigned grid: density, and the disclosure ---------------------- *
   * Author: Sharmila Parthiban.  8/24/2026.
   *
   * "Make font size small" was asked for, and this is the half of it that does not
   * cost anything: the type stays at the 13px floor and the AIR comes out instead.
   * Row padding drops from .45/.55rem to .3/.5rem and the primary line-height from
   * 1.5 to 1.35, which takes roughly a fifth off the height of every row. The other
   * half — 12px primary values — is not done here on purpose; see the note in the
   * COLUMNS banner and Q18.                                                      */
  #dash-table thead th,
  #dash-table tbody td,
  #dash-table tbody th{padding:.3rem .5rem;line-height:1.35}

  /* ---- MAKE IT LOOK LIKE A TABLE: LIGHT GREY GRIDLINES ---------------------- *
   * Author: Sharmila Parthiban.  8/24/2026, asked for as "make the table as table
   * I want the border light grey".
   *
   * The grid had horizontal rules only — a bottom border per row and nothing
   * vertical. That is a fashionable way to draw a table and it is the wrong one
   * here, and it is very likely part of why the columns kept being reported as not
   * lining up with their headers. WITHOUT VERTICAL RULES THERE IS NOTHING ON SCREEN
   * THAT SHOWS WHERE A COLUMN ENDS. The reader infers the boundary from where the
   * text happens to start, so a short value in a wide column looks like it belongs
   * to the neighbour, and a header centred over a ragged run of values looks
   * offset even when the geometry is exact to the pixel. Drawing the boundary makes
   * the alignment visible instead of inferred — and it is the cheapest of all the
   * fixes attempted for that complaint.
   *
   * #e2e8f0 for the internal lines: light grey, as asked, and deliberately lighter
   * than the --c-line used on the table's outer edge so the frame still reads as the
   * frame. Gridlines are structural decoration, so there is no contrast minimum to
   * meet — but they must not compete with the text, which is why they are this
   * light and not the border colour used everywhere else.                        */
  #dash-table{border:1px solid var(--c-line)}
  #dash-table thead th,
  #dash-table tbody td,
  #dash-table tbody th{border-right:1px solid #e2e8f0}
  /* No rule hanging off the right-hand edge — the table's own border is there. */
  #dash-table thead th:last-child,
  #dash-table tbody td:last-child,
  #dash-table tbody th:last-child{border-right:0}
  /* The two header rows keep a heavier line under the block so the labels and their
     filter boxes read as one unit sitting above the data, not as two more rows. */
  #dash-table thead tr:last-child th{border-bottom:2px solid var(--c-line)}
  /* The detail panel is one cell spanning the width, so it must not inherit a
     vertical rule — a gridline through the middle of a prose panel reads as a
     column boundary that is not there. */
  #dash-table tbody tr.dashdet__row > td{border-right:0}

  /* THE DISCLOSURE BUTTON, SIZED TO WCAG 2.2 SC 2.5.8 TARGET SIZE (MINIMUM).
     The criterion asks for 24×24 CSS px. This is the one control in the grid a user
     hits on every row, two hundred times a shift, and the old glyph buttons were
     2.25rem square only because a 6% column could not hold anything wider. Stated as
     a min-height/min-width in px rather than rem so the guarantee does not quietly
     fail if the root font size is reduced. */
  .dashmore{display:inline-flex;align-items:center;gap:.3rem;
    min-height:24px;min-width:24px;padding:.15rem .4rem;
    font-family:inherit;font-size:var(--fs-floor);font-weight:600;line-height:1.2;
    color:#1e40af;background:#fff;border:1px solid #94a3b8;border-radius:.25rem;
    cursor:pointer;text-align:left}
  .dashmore:hover{background:#eff6ff;border-color:#1e40af}
  /* Was .7rem — an ad-hoc size that belonged to no scale. On the token now, like
     everything else. It is a decorative chevron beside a word, so micro is the
     right step; the disclosure it sits in still meets the 24px target. */
  .dashmore__chev{font-size:var(--fs-micro);line-height:1}
  /* Expanded state carries a fill AND the chevron turns AND the words change from
     "Show" to "Hide" — three carriers, so the state never rests on colour alone. */
  .dashmore[aria-expanded="true"]{background:#1e40af;color:#fff;border-color:#0b1220}

  /* ---- the panel ---- *
   * Its own type scale and its own layout, deliberately not the grid's: nothing in
   * here is competing for column width, so the values can be given room. A CSS grid
   * of term/value pairs that collapses to one column on a narrow screen. */
  .dashdet__row > td{background:#f8fafc;border-bottom:2px solid var(--c-line);
    padding:.6rem .8rem}
  .dashdet{display:grid;grid-template-columns:repeat(auto-fit,minmax(17rem,1fr));
    gap:.5rem 1.25rem;align-items:start}
  .dashdet__grp{min-width:0}
  .dashdet__h{margin:0 0 .2rem;font-size:var(--fs-floor);font-weight:800;color:#0f172a;
    border-bottom:1px solid var(--c-line);padding-bottom:.15rem}
  .dashdet__dl{display:grid;grid-template-columns:minmax(7rem,auto) 1fr;
    gap:.1rem .6rem;margin:0;font-size:var(--fs-floor)}
  .dashdet__dl dt{color:var(--c-ink-muted);font-weight:600}
  /* min-width:0 so a long unbroken reference cannot push the value column wider than
     its share and reintroduce the very misalignment this redesign removed. */
  .dashdet__dl dd{margin:0;min-width:0;overflow-wrap:anywhere;color:#0f172a}
  .dashdet__warn{color:#7f1d1d;font-weight:600}
  /* ---- the two folded groups inside the panel ---- *
   * A <details> whose <summary> is styled exactly like the other groups' headings,
   * so the panel reads as four equal sections of which two happen to be closed —
   * not as two headings and two odd widgets. The marker is the only difference and
   * it is the affordance, so it stays. */
  .dashdet__fold{min-width:0}
  .dashdet__h--fold{cursor:pointer;list-style-position:inside}
  .dashdet__h--fold::marker{color:var(--c-ink-muted)}
  .dashdet__fold[open] > .dashdet__h--fold{margin-bottom:.2rem}
  .dashdet__h--fold:focus-visible{outline:3px solid var(--c-primary);outline-offset:2px}
  /* Closed, the summary is the whole of what the reader gets, so the count lives in
     the heading text — "Whose action it is (2 blocking)" — rather than only inside.
     A fold that hides its own magnitude makes people open every one to find out
     whether it was worth opening. */
  /* ---- the generic table toolbar: filters, page size, paging -------------- *
   * Added 8/25/2026. The filter row lives inside the thead so it sticks and scrolls
   * with the header rather than drifting away from the columns it filters. The inputs
   * are sized down hard: a full-width usa-input in every column would make the header
   * taller than the rows beneath it. */
  /* ==========================================================================
   * THE TABLE TOOLBAR AND THE FILTER ROW — presentation pass, 8/26/2026
   * Author: Sharmila Parthiban.
   *
   * WHAT WAS WRONG, and it was not the sizes. The controls were correct and looked
   * unfinished, which is its own defect: a screen a county clerk works in all day
   * that reads as a developer's scaffold undermines confidence in the data on it.
   * Three specific things:
   *
   * 1. A PERMANENT ROW OF RAW INPUT BOXES IN EVERY COLUMN HEADER. Six to sixteen
   *    bare text fields sat above every table whether or not anybody was filtering.
   *    That is the single biggest reason it looked industrial — it put the machinery
   *    of the page in front of the content. The row is now BEHIND A TOGGLE and closed
   *    by default, so the table leads with its data and the filters appear when asked
   *    for. The toggle carries a count when filters are active, so a hidden filter can
   *    never be silently narrowing the results.
   *
   * 2. THE CONTROLS WERE A LOOSE RUN OF ELEMENTS. A label, a select, a pager and a
   *    sentence, all floating on the page background with nothing saying they belonged
   *    together. They are one strip now — a bordered, rounded bar with the count on
   *    the left and the controls on the right, which is where a reader expects to find
   *    each.
   *
   * 3. NOTHING SHOWED WHICH COLUMN WAS FILTERING. An input with two characters in it
   *    looks like an empty input at a glance, so a narrowed table looked like a table
   *    with missing rows. An active filter now carries a blue border and a tinted
   *    fill, and a Clear button appears beside the toggle.
   *
   * Colours are USWDS tokens rather than new ones: #005ea2 primary for the active
   * state, #f0f0f0 base-lightest for the bar. Nothing here introduces a colour the
   * design system does not already use.
   * ========================================================================== */
  .tblx__bar{
    display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;
    margin:.5rem 0;padding:.35rem .5rem;
    background:#f0f0f0;border:1px solid #dfe1e2;border-radius:.35rem;
  }
  /* The count goes first and takes the slack, which pushes every control to the right
     edge as one group instead of leaving them scattered mid-bar. */
  .tblx__note{font-size:var(--fs-floor);color:#454545;flex:1 1 auto;min-width:8rem}
  .tblx__pager{display:inline-flex;align-items:center;gap:.15rem}
  .tblx__spacer{flex:0 0 1px;align-self:stretch;background:#dfe1e2;margin:0 .15rem}

  /* ---- the filter toggle, and the clear button beside it ------------------- */
  /* ==========================================================================
   * ONE CONTROL HEIGHT ACROSS THE WHOLE TOOLBAR — 8/26/2026
   *
   * The controls were not aligned and the reason was arithmetic, not layout. The
   * pager was raised to 2rem (32px) while the select, the toggle and the clear button
   * were left at 1.75rem (28px), so the bar held two control heights side by side.
   * align-items:center then centred a 28px control against a 32px one, which puts
   * their borders 2px out at top and bottom — visible, and exactly the kind of
   * near-miss that reads as sloppy rather than as a bug.
   *
   * --ctl-h is declared once and every control in the bar uses it. Changing the
   * height of the toolbar is now one number, and nothing can be left behind.
   *
   * THE LABEL IS CENTRED AGAINST ITS CONTROL, not baseline-aligned to it. USWDS puts
   * a label above its input, which is right in a form and wrong in a toolbar: inline,
   * a label sitting on the text baseline of a bordered control appears to float above
   * centre because the control's border extends below the baseline. Centring the flex
   * item is what makes "Rows" line up with the box beside it.
   * ========================================================================== */
  .tblx__bar{ --ctl-h:2rem; }
  /* Every direct child sits on the centre line. line-height is normalised too: a
     control inheriting 1.35 from the page and one setting 1 of its own are different
     heights even when both are told to be --ctl-h. */
  .tblx__bar > *{align-self:center}
  .tblx__bar label{
    display:inline-flex;align-items:center;height:var(--ctl-h);
    margin:0;line-height:1;white-space:nowrap;
  }
  .tblx__toggle{
    display:inline-flex;align-items:center;justify-content:center;gap:.3rem;
    font-family:inherit;font-size:var(--fs-micro);font-weight:600;line-height:1;
    height:var(--ctl-h);padding:0 .5rem;cursor:pointer;
    color:#005ea2;background:#fff;border:1px solid #a9aeb1;border-radius:.25rem;
    /* Border included in the height, or a 1px border makes this control 2px taller
       than the select beside it and the alignment goes again. */
    box-sizing:border-box;
  }
  .tblx__toggle:hover{background:#f0f6fb;border-color:#005ea2}
  .tblx__toggle:focus-visible{outline:3px solid #1b1b1b;outline-offset:2px}
  /* Pressed state is a real change of fill, not only a border — a toggle whose only
     "on" signal is a 1px border reads as off. */
  .tblx__toggle[aria-expanded="true"]{background:#005ea2;color:#fff;border-color:#005ea2}
  /* The count of active filters. It rides on the toggle so the number is attached to
     the control that reveals what it counts. */
  .tblx__count{
    display:inline-block;min-width:1.1rem;padding:0 .25rem;
    font-size:var(--fs-micro);font-weight:700;line-height:1.3;text-align:center;
    color:#fff;background:#b50909;border-radius:.6rem;
  }

  /* ---- the filter row itself ---------------------------------------------- */
  /* Hidden by the hidden ATTRIBUTE, so it leaves the accessibility tree too — a
     collapsed filter row that a screen reader still walks through is sixteen inputs
     the user was told were not there. */
  .tblx__filters th{
    padding:.25rem .3rem !important;
    background-color:#f0f6fb;
    border-top:2px solid #005ea2;
  }
  .tblx__f{
    font-size:var(--fs-micro) !important;
    padding:.2rem .35rem !important;
    height:auto !important;line-height:1.3 !important;
    width:100% !important;min-width:3rem;
    border:1px solid #a9aeb1 !important;border-radius:.25rem !important;
    background:#fff;
  }
  .tblx__f:focus{outline:3px solid #1b1b1b;outline-offset:1px;border-color:#005ea2 !important}
  /* ACTIVE: set by script when the box has content. Border AND fill, because a
     colour-only change at 1px is not a change anybody sees. */
  .tblx__f--on{
    border:2px solid #005ea2 !important;background:#e7f2fa !important;font-weight:600;
  }

  /* ==========================================================================
   * THE PAGER AND THE PAGE-SIZE BOX, SIZED FOR A TOOLBAR
   * Author: Sharmila Parthiban.  8/25/2026.
   *
   * USWDS ships pagination at 1.13rem — 18px — with 2.5rem (40px) targets, 1rem of
   * margin above and below, and justify-content:center. Those are the right values
   * for a pagination bar that is the main control at the foot of a page of search
   * results. They are wrong for a strip of chrome above a reference table, where the
   * pager is not the point of the screen: it took two lines, centred itself away from
   * the controls beside it, and was the largest type in the toolbar.
   *
   * WHERE THE SHRINKING STOPS, AND WHY IT STOPS THERE. 1.75rem is 28px, which clears
   * the 24×24 CSS px floor of WCAG 2.2 SC 2.5.8 Target Size (Minimum) with 4px to
   * spare. That floor is honoured elsewhere in this file — the row-detail disclosure
   * is explicitly held at 24px — and a pager is exactly the kind of control that gets
   * pressed repeatedly, often on a touch screen, by somebody working through a queue.
   * "Small" was the instruction; below 24px it stops being a size choice and becomes
   * an accessibility failure, so it stops at 28.
   *
   * The type goes to --fs-micro, 12px, which is this file's chips-and-badges step. A
   * page number is a badge: two or three characters, read at a glance, never prose.
   * The four-colour contrast requirement still applies and USWDS's #005ea2 on white
   * is 6.72:1, so shrinking it costs nothing there.
   * ========================================================================== */
  .tblx__bar .usa-pagination,
  #dash-pager .usa-pagination{
    margin:0;
    font-size:var(--fs-micro);
    line-height:1.2;
    justify-content:flex-start;
    background:transparent;
  }
  .tblx__bar .usa-pagination__item,
  #dash-pager .usa-pagination__item{
    /* 2rem = 32px, the shared --ctl-h. Above the 24px SC 2.5.8 floor with room, and
       the same height as every other control in the bar so the borders line up. */
    height:var(--ctl-h, 2rem);
    min-width:var(--ctl-h, 2rem);
    margin-left:.1rem;
    margin-right:.1rem;
  }
  .tblx__bar .usa-pagination__button,
  #dash-pager .usa-pagination__button{
    padding:.15rem .35rem;
    border-radius:.25rem;
    background:#fff;
  }
  .tblx__bar .usa-pagination__button:hover,
  #dash-pager .usa-pagination__button:hover{background:#f0f6fb;border-color:#005ea2}
  /* THE CURRENT PAGE IS FILLED, not merely bordered. USWDS marks it with a heavier
     bottom border, which at this size is two pixels of difference and easy to miss —
     so "which page am I on" became a question. Filled reads instantly, and the text
     goes white for 6.72:1 against #005ea2. aria-current carries it for a screen
     reader either way. */
  .tblx__bar .usa-pagination__button.usa-current,
  #dash-pager .usa-pagination__button.usa-current{
    background:#005ea2;color:#fff;border-color:#005ea2;font-weight:700;
  }
  .tblx__bar .usa-pagination__overflow,
  #dash-pager .usa-pagination__overflow{padding:.15rem .2rem}
  /* The arrow labels are the widest thing in the pager. On a toolbar the icon plus
     the accessible name is enough, so the visible word is dropped below tablet width
     and kept on a wide screen where there is room for it. */
  .tblx__bar .usa-pagination__link,
  #dash-pager .usa-pagination__link{padding:.15rem .35rem;gap:.15rem}
  .tblx__bar .usa-icon,
  #dash-pager .usa-icon{width:1rem;height:1rem}
  @media (max-width:1023px){
    .tblx__bar .usa-pagination__link-text,
    #dash-pager .usa-pagination__link-text{
      /* Visually hidden, not display:none — the arrow keeps its accessible name. */
      position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);
      white-space:nowrap;
    }
  }

  /* The page-size box. It holds "10", "25" or "All (24)" — four characters at most —
     so a control sized for an address is four times wider than it needs to be. The
     USWDS chevron needs room on the right, hence the padding rather than a bare
     width. Height matches the pager buttons so the toolbar sits on one line. */
  .tblx__bar .usa-select,
  #dash-page-size{
    font-size:var(--fs-micro) !important;
    height:var(--ctl-h, 2rem) !important;
    line-height:1 !important;
    padding:0 1.6rem 0 .4rem !important;
    width:auto !important;
    min-width:5.5rem;
    background-size:.7rem;
    box-sizing:border-box !important;
    /* USWDS gives a select a top margin for stacked form layout. In a toolbar that
       pushes it below the label beside it. */
    margin:0 !important;
  }
  /* Their labels shrink with them, or the label is larger than the control it names. */
  .tblx__bar .usa-label,
  label[for="dash-page-size"]{
    font-size:var(--fs-micro);margin:0;
    display:inline-flex;align-items:center;height:var(--ctl-h, 2rem);line-height:1;
    white-space:nowrap;
  }
  /* The dashboard's own toolbar gets the same variable and the same centring, so the
     grid's controls and the fifteen other tables' controls are one design rather than
     two that happen to look similar. */
  #dash-page-size, #dash-pager{ --ctl-h:2rem; }
  #dash-pager{display:inline-flex;align-items:center;gap:.15rem}
  .tblx__filters th{padding:.2rem .25rem !important;background-color:#eef2f7}
  .tblx__f{font-size:var(--fs-micro) !important;padding:.15rem .3rem !important;
    height:auto !important;width:100% !important;min-width:3rem}
  @media print{ .tblx__bar,.tblx__filters{display:none} }

  /* ---- SDAT property search, and the well-history results ---------------- */
  .propsearch__res{max-height:22rem;overflow-y:auto}
  .propsearch__hit{border:1px solid var(--c-line);border-radius:.375rem;
    padding:.4rem .5rem;margin:.35rem 0;background:#fff}
  .propsearch__hit:hover{background:#f8fafc}
  /* A legacy record is marked, never merely ordered differently. The left rule and
     the tag both say it, because a reader scanning a list of wells has to be able to
     tell a permit this system issued from one imported out of SDWIS — the second
     kind cannot be opened, corrected or acted on here. */
  .wellhist__legacy{border-left:4px solid #92400e;background:#fffbeb}
  .wellhist__current{border-left:4px solid #166534}
  .dashdet__foldn{font-weight:600;color:var(--c-ink-muted)}
  /* The click cue on a collapsed group. Styled as a small affordance rather than
     prose: it is a hint attached to the control, not a sentence to read. It is
     no-print because on paper there is nothing to click and the groups print open. */
  .dashdet__cue{font-size:var(--fs-micro);font-weight:600;color:var(--c-primary);
    border:1px solid var(--c-primary);border-radius:.25rem;padding:0 .3rem;
    margin-left:.35rem;white-space:nowrap}
  @media print{ .dashdet__cue{display:none} }
  @media print{
    /* On paper there is no clicking, so both folds print open. */
    .dashdet__fold > .dashdet__dl{display:grid !important}
    .dashdet__h--fold{list-style:none}
  }
  .dashdet__ul{margin:.1rem 0 0;padding-left:1.1rem}
  .dashdet__ul li{margin:0 0 .1rem}
  .dashdet__ul--forms{list-style:none;padding-left:0}
  .dashdet__code{display:inline-block;min-width:2.6rem;
    font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:700}
  .dashdet__state{font-weight:700}
  /* PRINT. The panels that are OPEN print, and the disclosure buttons do not — a
     button is meaningless on paper.
     What this deliberately does NOT do is force the closed rows visible. `hidden`
     could be overridden here with display:table-row !important, and it would print
     a run of empty grey bands: the panel's contents are built on first open, so a
     row that was never opened has an empty cell to show. Rather than pre-build two
     hundred panels to make a CSS rule true, "Expand all details" below the grid
     opens them for real, and printing after that gives a complete document. */
  @media print{
    .dashdet__row > td{background:#fff !important}
    .dashmore{display:none !important}
  }
  /* The min-width is what keeps the fix honest on a narrow screen. Percentage
     columns of a 100%-wide table divide whatever space there is, so on a phone a
     13% column becomes about 48px — the header wraps to five lines and the
     alignment is technically perfect and practically unreadable. Below 52rem the
     table stops shrinking and .tbl-wrap scrolls sideways instead, which is the
     right trade: a scrollbar is a known gesture, a crushed column is not. The
     percentages still resolve against the used width, so the proportions above
     hold whether the table is scrolled or not.
     On paper there is no scrollbar to offer, so the floor is dropped and the
     table is allowed to fit the page — see the print block below. */

  /* ---- misc ------------------------------------------------------------ */
  .leafmap{height:260px;border:1px solid var(--c-line);border-radius:.375rem;z-index:0}
  .step-node{display:flex;flex-direction:column;align-items:center;gap:.25rem;flex:1}
  .step-dot{width:2rem;height:2rem;border-radius:999px;display:grid;place-items:center;
    font-weight:800;font-size:var(--fs-micro);line-height:1;
    background:#e2e8f0;color:#475569;border:2px solid #cbd5e1}
  .step-node[data-state="active"] .step-dot{background:var(--c-primary);color:#fff;border-color:var(--c-primary-dark)}
  .step-node[data-state="done"] .step-dot{background:var(--c-form-green);color:#fff;border-color:#14532d}

  /* ---- step review accordion (last step of a stepped form) -------------- *
   * A native <details>/<summary>: keyboard operable, announced as expanded or
   * collapsed, and it works with JavaScript disabled. The status chips carry an
   * icon and a word as well as a hue, so a greyscale print or a colour-blind
   * reader loses nothing. Both chip colours are AA against their fill.        */
  .stepsum{border:1px solid var(--c-line);border-radius:.375rem;margin-bottom:.5rem;background:#fff}
  .stepsum__hd{display:flex;align-items:center;justify-content:space-between;gap:.5rem;
    padding:.45rem .6rem;cursor:pointer;font-weight:600;list-style:none}
  .stepsum__hd::-webkit-details-marker{display:none}
  .stepsum__hd::after{content:'▸';color:#64748b;font-size:var(--fs-micro)}
  .stepsum[open] > .stepsum__hd::after{content:'▾'}
  .stepsum__hd:focus-visible{outline:3px solid var(--c-primary);outline-offset:1px}
  .stepsum__bd{padding:.6rem;border-top:1px solid #e2e8f0}
  .chip--ok{background:#dcfce7;color:#14532d;border:1px solid #14532d}
  .chip--warn{background:#fee2e2;color:#991b1b;border:1px solid #991b1b}
  ::-webkit-scrollbar{width:10px;height:10px}
  ::-webkit-scrollbar-thumb{background:#94a3b8;border-radius:6px}
  ::-webkit-scrollbar-track{background:#e2e8f0}
  .modal-back{position:fixed;inset:0;background:rgba(15,23,42,.6);z-index:60;display:none;
    align-items:flex-start;justify-content:center;padding:2rem 1rem;overflow:auto}
  .modal-back.open{display:flex}
  /* ---- CORRECTED 8/25/2026: this pair was overriding the responsive clamp ---- *
   * Author: Sharmila Parthiban.
   *
   * .modal and .modal--lg are declared TWICE in this stylesheet — once earlier with a
   * min() clamp added when the page was made to fit a tablet, and again here with the
   * original flat max-width. This pair is later in source order at the same
   * specificity, so THIS pair won and the clamp did nothing: a large dialogue stayed
   * 66rem — 1056px — and overflowed the window on any tablet in portrait, putting its
   * own right-hand edge and buttons off screen. That is most of what was reported as
   * the popup not being clear: it was wider than the screen it was on.
   *
   * The clamp is folded in HERE rather than by deleting this rule, because this is
   * the declaration carrying the fill, the radius and the shadow.
   *
   * A HEIGHT LIMIT TOO, which neither declaration had. A dialogue taller than the
   * viewport had no scroll of its own — .modal-back scrolls, but that moves the whole
   * dialogue including its heading, so a reader scrolling to a button loses the title
   * that says what they are deciding about. Now the header stays and the body
   * scrolls, so the title and the close button are visible however long the content
   * is. overscroll-behavior:contain stops a flick at the end of the list scrolling
   * the page behind the dialogue.                                                 */
  .modal{background:#fff;border-radius:.5rem;width:100%;
    max-width:min(44rem, calc(100vw - 1.5rem));
    max-height:calc(100vh - 4rem);
    display:flex;flex-direction:column;
    box-shadow:0 20px 40px rgba(0,0,0,.3)}
  .modal--lg{max-width:min(66rem, calc(100vw - 1.5rem))}
  /* The header is the first child and does not scroll; the body is the last child
     and does. Structural selectors rather than new classes, so the twelve existing
     modal shells need no markup change. */
  .modal > :first-child{flex:0 0 auto}
  .modal > :last-child{overflow-y:auto;overscroll-behavior:contain}
  /* ---- print ------------------------------------------------------------ *
   * THE DEFECT THIS FIXES: a printed form came out with its title, kicker and
   * subtitle missing. They were not missing — they were white on white.
   *
   * Every dark band on this page carries white text, and the contrast comes from
   * the FILL. Print pipelines drop background colours by default, so the fill
   * goes and the white text stays, and the heading vanishes off the page. It is
   * the worst kind of defect because the screen looks right and only the paper
   * is wrong, so nobody sees it until a county has already filed the copy.
   *
   * The fix re-inks rather than asking for the background back. `print-color-
   * adjust:exact` would work in theory, but it is routinely overridden by the
   * driver, by the "background graphics" tick in the browser dialogue, and by
   * every office printer set to draft — so a page that depends on it is a page
   * that is legible only sometimes. Dark ink on white paper is legible always,
   * and it uses a fraction of the toner.                                      */
  @media print{
    .no-print{display:none !important}
    body{background:#fff;font-size:11pt}
    .sec{break-inside:avoid}
    /* Panels whose contrast came from a dark fill. The descendant rule is what
       brings back text-slate-300 and text-slate-400 sub-lines, which are legible
       on slate-800 and invisible on paper. */
    .bg-slate-800,.bg-slate-900,.bg-blue-900,.gis,.gis__hd{
      background:#fff !important;border:1px solid #1b1b1b !important}
    .bg-slate-800 *,.bg-slate-900 *,.bg-blue-900 *,.gis *{color:#1b1b1b !important}
    /* Filled controls and chips. A chip keeps its outline so it still reads as a
       chip in greyscale — the status word inside it is the meaning, and the word
       survives, but a chip with no edge reads as loose text. */
    .btn-primary,.btn-danger,.btn-inverse,.btn-gis,.chip{
      background:#fff !important;color:#1b1b1b !important;border:1px solid #1b1b1b !important}
    /* Table headers lose their fill too, so the rule under them has to be the
       thing that separates header from data. */
    /* Re-targeted to .usa-table on 8/25/2026. Every rule in this print block was
       written for `table.grid` and matched nothing after the USWDS conversion, so
       printed tables had silently lost ALL of it: the header kept a grey fill that
       the printer either drops or wastes toner on, the sticky header stayed sticky
       and printed once instead of repeating, the fixed-layout floor kept forcing a
       960px table onto a portrait page, and rows split across page breaks. None of
       that throws an error — it just comes out wrong on paper, which is the failure
       mode this whole block exists to prevent. */
    .usa-table thead th{background:#fff !important;border-bottom:2px solid #1b1b1b !important}
    /* Sticky is meaningless on paper and, in some engines, it prints the header
       once over the first rows instead of at the top of each page. */
    .usa-table thead{position:static !important}
    /* A printed page cannot be scrolled sideways, so anything past the right
       margin is simply lost. The 52rem floor that protects the fixed-layout
       Blueprint tables on a narrow screen has to come off here and let them fit
       the paper; the percentage column widths keep the proportions, so the
       headers stay over their own data at whatever width the page allows.
       thead is also asked to repeat on every page — a twelve-row table that
       breaks across a page boundary otherwise leaves the second half unlabelled. */
    table.grid--fixed{min-width:0 !important}
    .usa-table thead{display:table-header-group}
    .usa-table tr{break-inside:avoid;page-break-inside:avoid}
    /* The scroll container must not clip on paper either — there is no scrollbar to
       offer, so an overflow box would simply cut the table off at the margin. */
    .usa-table-container--scrollable{overflow:visible !important;max-width:none !important}
    /* A package tile prints as black on white like everything else. Its state is
       carried by the glyph SHAPE and by the sentence in the list beside it, so
       losing the colour costs nothing — which is the test every piece of colour
       coding in this file has to pass. */
    .pkgt{color:#1b1b1b !important;background:#fff !important}
    .pkgl > li{break-inside:avoid;page-break-inside:avoid}
    /* A bucket must not be split across a page — "Yours to do now (2)" on one
       sheet and its two rows on the next is worse than starting a page early.
       A folded bucket prints folded, as every other <details> in this file does,
       which is why each heading carries its own count: a printed "Done — filed
       or waived (6)" still states the fact even with the six rows folded away,
       and the tile strip above the list shows all eleven regardless. */
    .pkgg{break-inside:avoid;page-break-inside:avoid;background:#fff !important;
      border-color:#1b1b1b !important}
    details.pkgg > summary.pkgg__hd::before{content:'' !important;margin:0 !important}
    /* THE ONE PLACE AN ICON IS NOT ENOUGH. On paper nobody can hover a tooltip or
       click a modal, so a printed dashboard row would show a glyph and a number
       and no way to find out what they meant. Both icon buttons therefore print
       as their own text: the count keeps its meaning, the dot goes (it never
       carried anything on its own), and .gicon__print — hidden on screen,
       revealed here — spells the cell out beside it. */
    .gicon{background:#fff !important;color:#1b1b1b !important;
      min-width:0 !important;min-height:0 !important;padding:0 !important;border:0 !important}
    .gicon__dot{display:none !important}
    .gicon__print{display:inline !important}
  }
