/* ==========================================================================
   Print — docs/ui-spec.md §1.5. Same markup as the screen; this is a CSS
   layer over it, never a second template.

   The screen theme is dark. A dark theme that prints as a dark theme is a
   spent cartridge and an unreadable list, so the FIRST thing this file does
   is re-author the fourteen colour tokens for paper: white field, black
   ink, same token names. Every component then inherits the right thing for
   free instead of needing its own !important override.

   Second hard rule, which survives the first: every component that can
   appear here must be legible with ZERO colour and ZERO background fill.
   Office printers routinely drop background colours regardless of
   print-color-adjust, and the sheet gets photocopied in black and white.
   So state is carried by WORDS, BORDER WEIGHT and BORDER STYLE — the amber
   and the red are a bonus for whoever has a colour printer, never the
   signal itself.
   ========================================================================== */

:root {
  color-scheme: light;

  --bg: #FFFFFF;
  --bg: oklch(1 0 255);
  --surface: #FFFFFF;
  --surface: oklch(1 0 255);
  --surface-raised: #F4F5F7;
  --surface-raised: oklch(0.970 0.003 255);

  --line: #B4B8BC;
  --line: oklch(0.780 0.008 255);
  --line-strong: #6E7277;
  --line-strong: oklch(0.550 0.010 255);

  --ink: #111418;
  --ink: oklch(0.190 0.010 255);
  --ink-muted: #43484E;
  --ink-muted: oklch(0.400 0.012 255);
  --ink-faint: #65696F;
  --ink-faint: oklch(0.520 0.010 255);

  --accent: #111418;
  --accent: oklch(0.190 0.010 255);
  --on-accent: #FFFFFF;
  --on-accent: oklch(1 0 255);
  --accent-wash: #EDEFF1;
  --accent-wash: oklch(0.950 0.004 255);

  /* Darkened for paper: the screen's light amber/red/blue are unreadable on
     white. Measured on white — awaiting 7.6:1, stale 8.8:1, moved 7.8:1. */
  --state-await: #7A4800;
  --state-await: oklch(0.450 0.105 68);
  --state-stale: #941617;
  --state-stale: oklch(0.430 0.160 27);
  --state-moved: #085491;
  --state-moved: oklch(0.440 0.120 250);
}

/* ---- chrome that means nothing on paper ---------------------------------- */
.sidenav,
.sidenav__signout,
.tabbar__signout,
.tabbar,
.daynav,
.dayfoot,
/* The day's filter block is controls; its EFFECT is confessed in words at the
   top of the sheet instead (.print-filter-note below).

   NAMED EXPLICITLY, and that matters more since 2026-08-10, when the block
   became the Database screen's whole filter panel — a search box, six selects
   and a footnote — back inside a `<details>`. `details > *:not(summary)` near
   the end of this file force-opens every disclosure on paper (so a court group
   a clerk collapsed still prints), and a printed sheet carrying seven
   force-opened controls would be absurd. `.filters` is on the FORM, which
   wraps the disclosure, so one rule takes the summary down with the panel. */
.filters,
.monthnav,
.no-print,
.htmx-indicator,
.destructive-action,
.back-link,
.skip-link,
.print-button,
.undo-banner,
.override,
.results-widen,
.jump-strip,
.mode-tabs,
.find-form,
.find-miss__actions,
.find-foot,
.overline,
.page-lede,
.copy-button,
.row-actions,
.row-detail__link,
.results-table .col-track,
.results-hatch,
.results-retry,
.find-miss__hatch,
form:not(.keep-print) {
  display: none !important;
}

/* ---- the ghost screen never reaches paper --------------------------------
   A ghost of an answer on a printed sheet is the worst artefact this product
   could produce: rows of grey bars that a reader could take for redacted or
   pending cases. The in-flight block goes with it — it is a statement about
   a request that is not happening on paper. */
.skeleton,
.results-status,
.inflight,
.saved-band__looking,
.search-form__cost {
  display: none !important;
}

/* ---- the Search screen's two bands both print (ui-spec.md §2.4) ----------
   The saved band lives INSIDE the search form, and `form:not(.keep-print)`
   above would take it down with the form. A printed search sheet that shows
   the portal's rows and silently drops the ones we already hold is a sheet
   that misrepresents the screen it came from — so the form is kept as a bare
   container and everything in it EXCEPT the band is hidden. Same specificity
   as the rule above (0,1,1), declared after it, so it wins.

   Both bands keep their source heading. A printed search sheet with no
   "FROM THE COURT PORTAL" line on it cannot say where its rows came from. */
form.search-form {
  display: block !important;
  background: none;
  border: none;
  padding: 0;
  margin: 0;
  max-width: none;
}
form.search-form > *:not(#saved-scope),
#saved-scope > .form-field {
  display: none !important;
}
.saved-band {
  background: none;
  border-top: none;
  border-bottom: 1pt solid var(--ink);
  margin: 0 0 8pt;
  padding: 0 0 4pt;
}
.saved-band__note { color: var(--ink-muted); font-size: 9pt; }
.saved-band__more { color: var(--ink-muted); font-size: 9pt; }
.case-card__view { display: none !important; }   /* a control, not a record */
.results-banner__source { color: var(--ink); font-weight: 700; }

/* A printed results list is a record of what the registry answered, so an
   expanded row keeps its stage/date line -- only the controls go. The detail
   has to read as part of the case above it, never as a row of its own, which
   is why the only rule in this table is the one BETWEEN cases. */
.results-table .result-row { border-bottom: 0.5pt solid var(--ink); }
.results-table .result-row > tr > td { border-bottom: none; }
.row-detail { background: none; padding-top: 0; }
.row-detail__asof, .row-detail__note { color: var(--ink-muted); }
/* A refusal has to survive a black-and-white photocopier: border weight, not
   the red, is what carries it once the hue is gone. */
.row-detail--error { border-left: 2pt solid var(--ink); padding-left: 5pt; }
.row-detail__error { color: var(--ink); font-weight: 700; }
.row-flag {
  border: 0.5pt solid var(--ink);
  color: var(--ink);
  padding: 0 3pt;
}

/* ---- page ---------------------------------------------------------------- */
body,
body.has-chrome {
  background: #fff;
  color: var(--ink);
  font-size: 10.5pt;
  line-height: 1.35;
  padding: 0;   /* the screen shell reserves room for fixed nav; paper has none */
}
.page, main.page, .page.page--wide {
  max-width: none;
  margin: 0;
  padding: 0;
}
a { color: var(--ink); text-decoration: none; }

/* ---- the day header becomes the sheet's own title ------------------------- */
.dayhead {
  border-top: none;
  border-bottom: 1.5pt solid var(--ink);
  padding: 0 0 3pt;
  margin: 0 0 6pt;
}
.dayhead__label { font-size: 8.5pt; color: var(--ink); }
.dayhead__date { font-size: 16pt; margin: 1pt 0 0; }
.dayhead__weekday { color: var(--ink); }
.dayhead__count { font-size: 9.5pt; color: var(--ink); margin: 1pt 0 0; }
/* "why this day" is exactly as load-bearing on paper as on screen — the
   sheet in a corridor has to say which day it is a list of, and why. */
.dayhead__note {
  border-left: 1.5pt solid var(--ink);
  background: none;
  color: var(--ink);
  font-size: 9pt;
  padding: 2pt 5pt;
  margin: 4pt 0 0;
}

/* ---- grouping headers = the diary's section breaks ------------------------
   `.week-heading` was the third selector here until 2026-08-10 and named the
   date that separated one day from the next on the week sheet. There is no
   week sheet: a printed page is now always ONE day, whose date is in the
   header at the top, so the only breaks left inside the list are the town and
   the court. */
.section-bar, .case-group__heading {
  color: var(--ink) !important;
  background: none !important;
  font-size: 10pt;
  font-weight: 700;
  letter-spacing: 0.04em;
  border-bottom: 1pt solid var(--ink);
  border-top: none;
  padding: 0 0 2pt;
  margin: 10pt 0 4pt;
  break-after: avoid;
}
caption.section-bar { margin: 0 0 2pt; text-align: left; }
.section-bar .section-bar__count { color: var(--ink-muted); font-weight: 400; }
/* Town and court are both <details> on screen. `details > *:not(summary)` near
   the end of this file force-opens them, so anything the clerk collapsed
   before pressing Print still prints in full — a sheet that silently omits a
   court is the worst artefact this product could put in someone's hand. The
   disclosures' own affordances have no ink. */
.case-group__marker,
.place-group__marker { display: none !important; }
.case-group__summary,
.place-group__summary { display: block; margin: 0; }
.case-group__summary .case-group__heading { margin: 10pt 0 4pt; }

/* The town is the sheet's major break: a rule above AND below, so a list that
   runs to three pages still says which town each page belongs to. The courts
   under it keep their single hairline, and the indent is dropped — paper is
   narrow and the heading ranks already carry the nesting. */
.place-group__heading {
  color: var(--ink) !important;
  font-size: 12pt;
  font-weight: 800;
  letter-spacing: 0.02em;
  border-bottom: 1.5pt solid var(--ink);
  padding: 0 0 2pt;
  margin: 12pt 0 4pt;
  break-after: avoid;
}
.place-group__count { color: var(--ink-muted); font-weight: 400; font-size: 9pt; }
.place-group__body { padding-left: 0; }
.place-group { margin: 0; }

/* ---- one dense row per case, never split across a page edge --------------- */
.case-card {
  break-inside: avoid;
  border: none;
  border-bottom: 0.5pt solid var(--line-strong);
  border-left: none;
  padding: 4pt 0 5pt;
  margin: 0;
  background: none;
}
/* Stale keeps a heavy left rule and Awaiting a dashed one — border WEIGHT
   and STYLE, not colour, are what survive a black-and-white photocopier. */
.case-card--stale { border-left: 3pt double var(--ink); padding-left: 6pt; }
.case-card--awaiting { border-left: 1.5pt dashed var(--ink); padding-left: 6pt; }
.case-card--moved { border-left: 1.5pt solid var(--ink); padding-left: 6pt; }
.case-card__number { color: var(--ink); font-size: 11pt; padding: 0; margin: 0; }

/* PAPER IS NEVER TRUNCATED. The screen caps the cause title at two lines (a
   client request, and a documented deviation from §0.2) — the sheet does not,
   because a name clipped at "KARNATAKA BANK LTD., REPRESENTED BY ITS AUTHO…"
   on a page carried into a courtroom is a name that cannot be checked against
   the physical file, which is the only reason the line is on the row at all.
   All five declarations have to be undone: `-webkit-line-clamp` alone leaves
   `overflow: hidden` on a `-webkit-box`, which still clips. */
.case-card__title {
  margin: 1pt 0 2pt;
  color: var(--ink);
  display: block;
  -webkit-line-clamp: none;
  line-clamp: none;
  overflow: visible;
}
.case-card__title .vs { color: var(--ink-muted); }
.case-card__meta { color: var(--ink-muted); font-size: 8.5pt; margin: 1pt 0; }
.case-card__asof { color: var(--ink-muted); font-size: 8.5pt; margin: 1pt 0 0; }
.case-card__dates {
  font-size: 10pt;
  margin: 1pt 0;
  gap: 1pt 14pt;
  padding-top: 1pt;
  border-top: none;
}
.case-card__dates .label,
.case-card__foot .label { color: var(--ink-muted); }

/* The two ranked fields keep their labels and their prominence on paper — a
   sheet whose next date reads at the same weight as the judge's name is a
   sheet that has to be searched rather than scanned. The band's rules are
   dropped to one hairline above: two rules plus the card's own bottom border
   is three lines of ink per case, and on a 25-case day that is what the page
   ends up looking like. */
.case-card__key {
  gap: 1pt 14pt;
  margin: 1pt 0 2pt;
  padding: 1pt 0 0;
  border-top: 0.5pt solid var(--line);
  border-bottom: none;
}
.case-card__key-label { color: var(--ink-muted); font-size: 7.5pt; }
.case-card__key-value { color: var(--ink); font-size: 10.5pt; font-weight: 700; }
.case-card__key-value .next-value--awaiting,
.case-card__key-value .next-value--stale { font-size: 9.5pt; }
.case-card__foot { gap: 0 4pt; }
.case-card__foot-sep { color: var(--ink-muted); }
.case-card__status { color: var(--ink-muted); font-size: 8.5pt; }

/* ---- state: bracketed, bordered TEXT — no fill, ever ---------------------- */
.state {
  color: var(--ink) !important;
  padding: 0 3pt;
  font-size: 8.5pt;
  letter-spacing: 0.04em;
}
.state::before { content: "[ "; }
.state::after { content: " ]"; }
.state .icon { display: none; }   /* the words carry the state on paper */
/* ...which is why the confirmed state's word, hidden on screen since the tick
   replaced it, is put BACK here. Without both rules a confirmed row would
   print an empty state slot: the icon is dropped above and the word is
   clipped by the screen sheet. */
.state--confirmed .state__word {
  position: static;
  width: auto; height: auto;
  margin: 0;
  overflow: visible;
  clip: auto;
}
.state--confirmed { border: none; padding: 0; font-weight: 400; color: var(--ink-muted) !important; }
.state--confirmed::before, .state--confirmed::after { content: ""; }
.state--awaiting { border: 1pt dashed var(--ink); font-weight: 700; }
.state--stale { border: 2.5pt solid var(--ink); font-weight: 800; }
.state--moved { border: 1pt solid var(--ink); font-weight: 700; }
.state--closed { border: 0.5pt solid var(--ink-muted); font-weight: 400; }

.next-value { color: var(--ink); }
.next-value--awaiting { border-left: 1pt dashed var(--ink); color: var(--ink); }
.next-value--stale { border-left: 2pt solid var(--ink); color: var(--ink); font-weight: 700; }
/* "Enter the confirmed date" is a screen action */
.next-value--stale .next-value__action { display: none; }

/* ---- transferred / disposed ---------------------------------------------- */
.banner {
  background: none !important;
  border: 0.5pt solid var(--line-strong);
  padding: 2pt 4pt;
  margin: 2pt 0;
  color: var(--ink);
}
.banner-transferred { color: var(--ink); border: 1.5pt solid var(--ink); font-weight: 700; }
.banner-disposed { color: var(--ink-muted); border: 0.5pt solid var(--line-strong); }
.banner-info, .banner-error, .banner-success { color: var(--ink); border: 0.5pt solid var(--ink); }

/* ---- what the sheet is, forced into words (§1.5, §1.7) -------------------
   Both of these are `display: none` on screen and forced here. They say
   something about the PAPER that the screen says with controls the paper does
   not have: that the list was narrowed, and that a month sheet is not a diary.
   Without the first, a filtered list carried into a courtroom is an incomplete
   diary with nothing on its face to say so — the same class of failure as an
   empty cell where a date belongs. */
.print-only {
  display: block !important;
  font-size: 9.5pt;
  color: var(--ink);
}
.print-filter-note {
  font-weight: 700;
  border: 1pt solid var(--ink);
  padding: 3pt 6pt;
  margin: 0 0 6pt;
}
.month-only-counts {
  border-top: 0.5pt solid var(--line-strong);
  padding-top: 3pt;
  margin-top: 6pt;
  font-style: normal;
}

/* ---- the no-times line goes onto the paper too (§1.1a) -------------------
   On screen it forecloses "the app is missing something"; on paper it
   forecloses the same question asked by whoever the sheet was handed to. */
.daynote-times {
  color: var(--ink-muted);
  font-size: 8.5pt;
  margin: 6pt 0 0;
  padding-top: 3pt;
  border-top: 0.5pt solid var(--line-strong);
}

/* ==========================================================================
   The month on paper (§1.7) — a DIFFERENT problem from the day sheet, and
   answered differently.

   The day sheet is carried into a courtroom; the month sheet is pinned above
   the clerk's desk, and it must not be mistaken for the first. It prints as a
   grid, A4 portrait, in the same @page margins as everything else (182mm
   usable ÷ 7 = 26mm a column, so no landscape override and one page setup in
   the product).

   THE SURFACE STEP DOES NOT SURVIVE PRINTING — printers drop background fills
   regardless of print-color-adjust — so "has listings" / "has none" becomes
   WEIGHT: a count in bold black, or a 0 in grey. Weight and border style
   survive a black-and-white photocopier; fill does not.

   Order is unchanged from the screen: grid, then the note block, then the
   "counts are the next dates we hold" line. Print is a CSS layer, not a fork.
   ========================================================================== */
.monthhead {
  border-top: none;
  border-bottom: 1.5pt solid var(--ink);
  padding: 0 0 3pt;
  margin: 0 0 6pt;
}
.monthhead__title { font-size: 16pt; margin: 0; }
.monthhead__count { font-size: 9.5pt; color: var(--ink); margin: 1pt 0 0; }
.month { margin: 0 0 6pt; }
.month__wd {
  color: var(--ink);
  font-size: 8pt;
  padding: 0 0 2pt;
  border-bottom: 1pt solid var(--ink);
}
.month__cell { border: 0.5pt solid var(--line-strong); }
.month__week { break-inside: avoid; }
.mcell {
  min-height: 16mm;
  padding: 2pt;
  background: none !important;
  color: var(--ink);
  border-top: none;
}
.mcell__date { font-size: 11pt; color: var(--ink); }
.mcell--out .mcell__date, .mcell--empty .mcell__date { color: var(--ink-muted); }
.mcell__count { font-size: 8.5pt; font-weight: 800; color: var(--ink); }
.mcell__n--zero { font-weight: 400; color: var(--ink-muted); }
.mcell__l3 { font-size: 7.5pt; color: var(--ink-muted); }
/* today's rule and the came-from inversion are both screen devices; on paper
   the sheet is pinned to a wall and outlives the day it was printed on */
.mcell--today .mcell__date { font-weight: 700; }
.mcell--today .mcell__date::after { content: "" !important; }
.mcell--selected { background: none !important; color: var(--ink); }
.mcell--selected .mcell__date,
.mcell--selected .mcell__count,
.mcell--selected .mcell__l3 { color: var(--ink); }
.mcell__todayline { display: none !important; }
/* The overlay that opens the panel is an interaction, and it has no ink. */
.mcell-hit { display: none !important; }
/* Same for the one that makes a whole case row open its case page, and for
   the search result row's equivalent. */
.case-card__hit,
.row-hit { display: none !important; }

/* THE DAY PANEL DOES NOT PRINT (§1.7a) — it carries `.no-print`, hidden at the
   top of this file. `Print this month` produces the sheet pinned above the
   clerk's desk: a grid of counts, no case names. A day's list is printed from
   the day, where it is the whole page and carries its own header, its filter
   confession and its stale-case warning; a month sheet with one day's cases
   stapled to the side of it would be neither document.

   The two-column layout goes with it, or the grid would keep rendering into
   a 1fr column beside an empty 320px one. */
.month-layout { display: block !important; }
.month-note { color: var(--ink); font-size: 9pt; margin: 2pt 0; }
.month-confess { color: var(--ink-muted); font-size: 8.5pt; margin: 4pt 0 0; max-width: none; }

/* ---- the stale warning must survive onto the carried sheet (§1.5) --------- */
.print-stale-note {
  display: block !important;
  font-weight: 800;
  font-size: 10.5pt;
  border: 2pt solid var(--ink);
  padding: 3pt 6pt;
  margin: 0 0 6pt;
}

/* ---- tables / detail page ------------------------------------------------- */
.data-table, .detail-table, .results-table {
  border: 0.5pt solid var(--ink);
  background: none;
  font-size: 9pt;
}
.data-table th, .detail-table th {
  background: none;
  color: var(--ink);
  border-bottom: 1pt solid var(--ink);
}
.data-table td, .detail-table td { border-color: var(--line-strong); color: var(--ink); }
.court-heading, .case-number-line, .cause-title { color: var(--ink); }
.empty-state, .muted { color: var(--ink-muted); }
.panel, .dialog { background: none; border: 0.5pt solid var(--line-strong); }

section { margin-bottom: 8pt; }

/* ==========================================================================
   Case detail on paper — docs/ui-spec.md §3.9

   He prints a case page when he is about to argue it, and that sheet is the
   whole record for the matter. Two rules govern everything below.
   ========================================================================== */

/* ---- FORCED OPEN, not "as left on screen" --------------------------------
   Printing a collapsed record would be printing a page that says a record
   exists and then withholds it — the worst artefact this product could put
   in someone's hand. Every order sheet on file prints, however many there
   are; a case's paper record running to four pages is his call.

   TWO RULES, because browsers hide a closed <details> by two different
   mechanisms and the ONE-rule version silently fails on current Chrome —
   caught by rendering to PDF, exactly as the spec insists (§3.9):

     * older engines (and Firefox/Safari) apply `display: none` to the
       content assigned into the UA slot, which the first rule overrides;
     * Chrome/Edge 131+ instead put `content-visibility: hidden` on the
       ::details-content pseudo, which `display: block` on the CHILD cannot
       reach. On Chrome 151 the child measured 40px tall and printed
       completely blank — a summary saying "Order sheet" over an empty box,
       i.e. the precise artefact this section exists to prevent.

   Both are kept: neither browser understands the other's rule, and an
   unknown selector is ignored rather than fatal. */
details > *:not(summary) { display: block !important; }
details::details-content {
  content-visibility: visible !important;
  display: block !important;
}
.sheet {
  border-left: none;
  border-top: 0.5pt solid var(--line-strong);
  margin-top: 2pt;
  max-width: none;     /* 68ch is a screen measure; paper has its own */
}
.sheet__summary {
  min-height: 0;
  padding: 2pt 0 1pt;
  color: var(--ink);
  font-size: 8pt;
  background: none !important;
  max-width: none;
}
.sheet__marker { display: none; }          /* a control affordance, not a record */
.sheet__checked { color: var(--ink-muted); }
.sheet__body {
  background: none;
  border-top: none;
  border-left: 1pt solid var(--ink);
  padding: 2pt 0 3pt 6pt;
  font-size: 9.5pt;
  line-height: 1.3;
  max-width: none;
  /* a paragraph must not strand a single line over a page edge */
  orphans: 2;
  widows: 2;
}

/* ---- states 2-4 print as their own line, border style intact -------------
   "Not fetched yet" PRINTS: a gap he can see is a gap he can plan around, a
   silently omitted one is not. Border STYLE is what survives a black-and-
   white photocopier; hue does not, and there is none here to lose. */
.sheet-note {
  color: var(--ink) !important;
  padding: 2pt 0 2pt 6pt;
  font-size: 8.5pt;
}
.sheet-note--gap { border-left: 1pt dotted var(--ink); }
.sheet-note--none { border-left: 1.5pt solid var(--ink); }

/* ---- one sitting = one unbreakable unit ----------------------------------
   The cell keeps real horizontal padding on paper: without it the note's
   left rule — the thing carrying the state — is drawn ON the table's own
   border and the first letter of "Order sheet" is clipped by it. */
.history-table .sitting { break-inside: avoid; }
.history-table .sitting > tr:not(:last-child) > td { border-bottom: none; }
.history-table .sitting__sheet > td { padding: 0 5pt 3pt; }
.section-head { margin-bottom: 3pt; }
.section-head__note { color: var(--ink-muted); }

/* ---- acts, process count, the em-dash legend ----------------------------- */
.section-bar--nested { margin-top: 6pt; }
.acts-list dt { color: var(--ink); }
.acts-list dd { color: var(--ink-muted); font-size: 9pt; margin-bottom: 3pt; }
.acts-list__none { color: var(--ink-muted); }
.process-count { color: var(--ink-muted); }
.legend-line { color: var(--ink-muted); font-size: 8.5pt; margin-top: 6pt; }
.pointer-line { color: var(--ink); font-size: 9pt; }
.pointer-line a { color: var(--ink); }

/* ---- the paper's own honesty label (§1.5 footer stamp) --------------------
   `position: fixed` is what makes a browser REPEAT an element on every
   printed page, and every page is what this line has to be on. Once the sheet
   is carried into a signal-dead corridor it is the only way to know how old
   the paper in hand is, and page 2 of a week's list is exactly as likely to be
   the page someone is holding as page 1.

   It is parked in an enlarged bottom page margin (@page below reserves 20mm;
   the flowed content stops above it), so a repeating footer cannot land on top
   of the last case on a full page. */
.print-footer {
  display: block !important;
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  text-align: center;
  font-size: 8pt;
  color: var(--ink);
  background: #fff;
  border-top: 0.5pt solid var(--line-strong);
  padding-top: 3pt;
}

@page {
  size: A4;
  margin: 14mm 12mm 20mm;
}

/* ==========================================================================
   The LOCKED hearing band on a Search result (search-rework.md E6).

   On screen an unsaved portal card blurs an empty placeholder behind a button
   that spends a portal request. On PAPER both halves are nonsense: a blurred
   grey bar is not a fact, and "Show hearing date · about 3 seconds" is an
   instruction to press something that is not there. Worse, a reader could take
   the bars for a redacted value rather than an unasked question -- the same
   artefact the results skeleton is hidden to avoid.

   So the placeholder and the button go, and a SENTENCE takes their place. It
   has to be a sentence: an omitted band would leave the card silently missing
   the field every other card on the sheet carries, and "absent" would read as
   "none" rather than as "not asked". */
.case-card__lock-ghosts,
.case-card__lock {
  display: none !important;
}
.case-card__key--locked {
  border-top: 0.5pt solid var(--line);
  border-bottom: none;
  padding: 1pt 0 0;
  margin: 1pt 0 2pt;
}
.case-card__key--locked::after {
  content: "Hearing date not fetched — this case has not been opened.";
  display: block;
  color: var(--ink-muted);
  font-size: 9pt;
}
/* The dotted rail that marks a locked card on screen is a texture, and a
   dotted 3pt rule reads as damage on paper. Weight carries it instead, the
   same way the three freshness states do. */
.case-card--locked { border-left: 0.5pt dotted var(--ink-muted); padding-left: 5pt; }
