/* ============================================================================
 * La2etlak — 6B PUBLIC CONTENT TEMPLATES (L4)
 * ============================================================================
 * Ported by 6B-PUBLIC-CONTENT-TEMPLATES-STAGE-B-FINAL-PORT-001 from the locked
 * design package:
 *
 *   docs/design/locked/2026-08-11/phase-6b-public-content-templates.html  FINAL AUTHORITY
 *   docs/design/locked/2026-08-11/phase-6a-component-system.html          shared-component authority
 *   docs/design/locked/2026-08-11/uploads/DESIGN_RULES.md                 rule layer
 *   docs/design/locked/2026-08-11/FINAL_DESIGN_FOUNDATION.md              token / role contract
 *
 * PORT, DO NOT INTERPRET. Every value below is copied from the locked board.
 * Do not "tidy", round or re-derive a number here.
 *
 * -- ONE OWNER, FIVE TEMPLATES ----------------------------------------------
 * This is the ONE stylesheet of the 6B family. It serves all five L4 templates —
 * Editorial, Legal, Help, Contact and the public system response — because they
 * are one family that shares one vocabulary, exactly as the board's frame 01
 * requires. There is no about.css / terms.css / faq.css / errors.css: six
 * competing design systems is the failure mode this file exists to prevent
 * (CLAUDE.md section 6).
 *
 * -- THE `pc-` PREFIX -------------------------------------------------------
 * Every member carries a `pc-` prefix, mechanically applied to the board's own
 * class name, for the reason 5E carries `msg-`, 5F `ntf-`, 5G `dsh-`, 5H `set-`,
 * 5J `rcl-`, 5K `prf-`, 5L `sub-` and 4C `au-`: the board's short names already
 * have owners in the ported layer or in Bootstrap — `.bc` is Item Detail's,
 * `.fld` and `.stack` are far too generic to claim, `.alert` and `.status` would
 * collide with Bootstrap, `.code` and `.dr` are HTML-shaped names, and `.cats`
 * neighbours Search's filter vocabulary. Correspondence to the board is by
 * `data-parity` hook, never by name (PARITY_METHOD section 4).
 *
 * -- WHAT THIS FILE DELIBERATELY DOES NOT OWN -------------------------------
 * `.btn` / `.b-pri` / `.b-sec` / `.b-quiet` / `.btn.sm`, the `.ico` mask family,
 * `.vh` and `.wrap` are foundation.css's. The Public Shell header, drawer and
 * footer are public-shell.css's. Nothing here re-declares one of them, and
 * nothing here re-points one to suit this board.
 *
 * THE BUTTON SIZE, RECORDED BECAUSE IT LOOKS LIKE A DIVERGENCE AND IS NOT.
 * The 6B board declares `.btn{min-height:44px;padding:0 16px;font:600 14px/1}`
 * — and so does the 6A component-system board, which is the button's OWN
 * subject board. foundation.css's `.btn` is 48px/15px, ported from
 * phase-3-homepage-redesign-v3.html and consumed by fourteen closed families.
 * Re-pointing it would move every one of them, which is the ruling `--warnBg`
 * got in 5E and the icons got in 5F. foundation's `.btn.sm` is
 * `min-height:44px; font-size:14px; padding:0 16px` — byte-identical to what
 * both 6-series boards declare — so this family consumes `.btn.sm` and the
 * shared owner is neither forked nor moved. Reconciling foundation with the 6A
 * component system is 6A's own Stage A -> C, not 6B's.
 *
 * -- ONE KNOWN DUPLICATION IN KIND, DELIBERATELY LEFT -----------------------
 * `.pc-bc` restates a breadcrumb that item-detail.css also declares as `.bc`,
 * for exactly the reason 5C's `.rfbc` and 5D's `.claim-bc` do: the breadcrumb is
 * genuinely SHARED and its correct owner is the Public shell family (ledger
 * section 1 row 2), which is not ported yet. Moving it there now would mean
 * editing three closed families' stylesheets and re-verifying them for no visual
 * gain. The class is NAMED differently rather than re-declaring `.bc`, so the
 * ownership guard still sees exactly one owner per name.
 *
 * Its VALUES are the 6B board's own, not a copy of item-detail's, because this
 * board is this family's FINAL AUTHORITY and `.pc-bc` is a 6B-owned name that
 * moves no closed family. Three values differ from the 5B breadcrumb and the
 * board states all three outright: 12px rather than 13px, an explicit `--muted`
 * ink rather than the inherited body ink, and the 44px target floor on the link,
 * which item-detail.css does not declare and which both 6-series boards do. The
 * SEPARATOR is the shared `.ico i-chev-r` mask where the board draws a text
 * chevron — the ported layer has one icon construction and this family does not
 * fork it. Declared in tests/Design/maps/public-content.json.
 * ========================================================================== */


/* ============================================================================
   1 - THE CONTENT REGION AND THE BREADCRUMB
   ============================================================================
   `.pc-page` is the board's own `.bd`: the content region's vertical rhythm.
   The board draws it as a 14px-inset grid with a 10px gap inside its simulated
   viewport; production keeps that VERTICAL rhythm and takes its HORIZONTAL
   gutter from the shared `.wrap` measure every ported page uses, because the
   page gutter is the Public Shell's settled property and not this family's.

   `.pc-bc` is the board's `.bc` — the breadcrumb ROW itself, which is why the
   class sits on the `<ol>` and the `<nav>` around it carries only the label.
   Ported from the 6B board rather than copied from item-detail.css `.bc`: this
   board is the family's FINAL AUTHORITY, `.pc-bc` is a 6B-owned name, and
   porting it moves no closed family. The two differ in three values the board
   states outright — 12px against 13px, `--muted` against inherited ink, and the
   44px target floor on the link, which item-detail.css does not declare and
   both 6-series boards do.
   ========================================================================== */

.la2-pg .pc-page {
    display: grid;
    gap: 10px;
    padding-block: 14px;
}

.la2-pg .pc-bc {
    list-style: none;
    margin: 0;
    padding: 0;
    font-size: 12px;
    color: var(--muted);
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    align-items: center;
}

.la2-pg .pc-bc li { display: inline-flex; align-items: center; gap: 6px; }

.la2-pg .pc-bc a { color: var(--muted); }
.la2-pg .pc-bc a:hover { color: var(--act); }
.la2-pg .pc-bc .ico { width: 15px; height: 15px; color: var(--muted); opacity: .7; }

/* The board sets these inline on the current crumb; a class is the port of the
   rendered result. */
.la2-pg .pc-bc [aria-current] { color: var(--head); font-weight: 600; }


/* ============================================================================
   2 - THE ONE PROSE MEASURE   (board `.pr`)
   ----------------------------------------------------------------------------
   "One measure. Prose holds a single readable column of about 68 characters;
   nothing widens it for decoration" — frame 01. All five templates share it.
   ========================================================================== */

.la2-pg .pc-pr { max-width: 68ch; min-width: 0; }

.la2-pg .pc-pr p { margin: 0 0 11px; font-size: 14px; line-height: 1.7; }
.la2-pg .pc-pr h2 { font-size: 19px; margin: 20px 0 7px; }
.la2-pg .pc-pr h3 { font-size: 15px; margin: 15px 0 5px; }

.la2-pg .pc-pr ul,
.la2-pg .pc-pr ol { margin: 0 0 11px; padding-inline-start: 20px; }
.la2-pg .pc-pr li { margin: 0 0 6px; font-size: 13.5px; line-height: 1.65; }

/* The page title, in the three sizes the board sets inline per frame: 29px on
   the Editorial proof, 28px on Legal and Help, and 24px on Contact and the
   system response. Type does not shrink to fit a long heading; the heading wraps
   inside the measure (matrix 2, "Long heading"). */
.la2-pg .pc-ttl { font-size: 24px; }
.la2-pg .pc-ttl-lg { font-size: 28px; }
.la2-pg .pc-ttl-xl { font-size: 29px; }

/* The opening paragraph, board `.pr .lead`.
   ONE consumer: the Help page's own subtitle, which is a real lang string. The
   Editorial and Legal templates render NO lede — `pages` has no separate intro
   column and "an introduction is never invented to balance layout" (matrix 2),
   so the region is absent there rather than filled. */
/* SPECIFICITY, NOT DECLARATION ORDER. The board's `.pr .lead` (0,2,0) beats its
   `.pr p` (0,1,1); scoping both with `.la2-pg` would have inverted that —
   `.la2-pg .pc-pr p` is (0,2,1) against a bare `.la2-pg .pc-lede` at (0,2,0) —
   and the lede would silently render as an ordinary paragraph. Measured, not
   assumed: 5F, 5J, 5K and 5L each paid for this once (PARITY_METHOD 5). */
.la2-pg .pc-pr .pc-lede {
    font-size: 15.5px;
    line-height: 1.62;
    color: var(--head);
    margin-bottom: 14px;
}

/* The escaped plain-text CMS body. `nl2br(e($body))` is the ONE rendering
   contract (6B-AUTH-01, ledger section 74.4) and the repository holds no
   sanitizer, no Markdown parser and no HTML policy — so this container styles
   TEXT and line breaks, and nothing else. It carries the same measure
   typography a paragraph inside `.pc-pr` carries, because that is what the
   body is. */
.la2-pg .pc-body { font-size: 14px; line-height: 1.7; }

/* THE THREE PARAGRAPH ROLES ARE SCOPED UNDER `.pc-pr`, AND THAT IS LOAD-BEARING.
   `.la2-pg .pc-pr p` is (0,2,1); a bare `.la2-pg .pc-<role>` is (0,2,0), so the
   generic paragraph rule would WIN and the lede, the Last-updated line and the
   privacy note would all silently render as ordinary body copy. The board has
   the same pair at (0,1,1) against (0,2,0), where the role wins — adding the
   `.la2-pg` scope to both is what inverts it. Measured on all three, not
   assumed (PARITY_METHOD 5: reproduce the RENDERED result, never the
   declaration).

   Legal "Last updated" — board `.m1` under the title (frame 03). The ONE
   truthful source is `pages.updated_at` (ledger section 74.4); the semantic
   `<time>` carries the machine value and the visible text is the localized
   absolute date, never a relative "updated recently" (matrix 2). */
.la2-pg .pc-pr .pc-upd { color: var(--muted); font-size: 11.5px; margin: 8px 0 14px; }

/* The section heading a template owns itself — Contact's "Published contact
   details" / "Before you write" / "Send a message", and Legal's Contact
   destination. The board sets `font-size:15px` inline on each. */
.la2-pg .pc-sh { font-size: 15px; margin: 0 0 6px; }
.la2-pg .pc-sh-b { font-size: 15px; margin: 0 0 8px; }

/* The quiet note under the Contact form — board `.m1`. */
.la2-pg .pc-pr .pc-note { color: var(--muted); font-size: 11.5px; margin: 0; }


/* ============================================================================
   3 - DEFINITION ROWS   (board `.dr`)
   ----------------------------------------------------------------------------
   Contact's published contact details and its three runtime-supplied guidance
   slots. The Legal template's definition rows come from PROSE and have no
   runtime data source, so they are ABSENT there — declared, never invented.
   Stacked below 700px, on the region's OWN available width.
   ========================================================================== */

.la2-pg .pc-dr { margin: 0 0 13px; border-top: 1px solid var(--line); }

.la2-pg .pc-dr > div {
    display: grid;
    gap: 2px;
    padding: 10px 0;
    border-bottom: 1px solid var(--line);
}

@media (min-width: 700px) {
    .la2-pg .pc-dr > div { grid-template-columns: 200px 1fr; gap: 16px; }
}

/* The board's frame sets a margin PER INSTANCE — 10px under the published
   details and 14px under the guidance slots — rather than taking the class
   default. Reproducing the rendered result, not the declaration. */
.la2-pg .pc-dr-details { margin-bottom: 10px; }
.la2-pg .pc-dr-guidance { margin-bottom: 14px; }

.la2-pg .pc-dr b { color: var(--head); font-size: 13.5px; }

.la2-pg .pc-dr span {
    font-size: 13.5px;
    line-height: 1.6;
    overflow-wrap: anywhere;
    min-width: 0;
}


/* ============================================================================
   4 - HELP: CATEGORY ANCHORS + PROGRESSIVE DISCLOSURE  (board `.cats`, `.dis`)
   ----------------------------------------------------------------------------
   Ordinary anchors to headings in the same document: no tab roles, no
   scrollspy, no client-side routing (frame 01). The disclosure is REAL BUTTONS
   with `aria-expanded` and `aria-controls`; the source ships every answer OPEN
   and the enhancement collapses them, so without JavaScript the page is a plain
   question-and-answer document with nothing unreachable. Several answers may be
   open at once — there is no exclusive accordion here and no `data-bs-parent`.
   ========================================================================== */

.la2-pg .pc-cats { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 14px; }

.la2-pg .pc-cats a {
    border: 1px solid var(--edge);
    border-radius: 999px;
    background: var(--band2);
    padding: 0 14px;
    min-height: 44px;
    display: inline-flex;
    align-items: center;
    font-size: 13px;
    color: var(--body);
}

.la2-pg .pc-cats a[aria-current] {
    background: var(--plate);
    border-color: var(--act);
    color: var(--head);
    font-weight: 600;
}

.la2-pg .pc-dis { display: grid; gap: 8px; margin: 0 0 14px; }

.la2-pg .pc-dis > div {
    border: 1px solid var(--line);
    border-radius: var(--r2);
    background: var(--bg);
}

.la2-pg .pc-disq { margin: 0; }

.la2-pg .pc-dis button {
    width: 100%;
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 12px;
    min-height: 52px;
    padding: 11px 14px;
    background: transparent;
    border: 0;
    color: var(--head);
    font: 600 14.5px/1.45 'Source Serif 4', Georgia, serif;
    text-align: start;
    cursor: pointer;
}

[dir="rtl"] .la2-pg .pc-dis button { font-family: 'Noto Naskh Arabic', serif; }

/* The chevron. Decorative on both sides: state is carried by `aria-expanded`,
   NEVER by the icon alone (frame 04 caption). The board draws an inline <svg>;
   the ported layer paints the SHARED `.ico` mask family, which is the one icon
   construction in this product and is guarded at source by
   DesignCssOwnershipTest. */
.la2-pg .pc-mk {
    width: 22px;
    height: 22px;
    flex: none;
    color: var(--act);
    transform-origin: 50% 50%;
}

.la2-pg .pc-dis [aria-expanded="false"] .pc-mk { transform: rotate(-90deg); }

@media (prefers-reduced-motion: no-preference) {
    .la2-pg .pc-mk { transition: transform .18s ease; }
}

.la2-pg .pc-ans {
    padding: 11px 14px 13px;
    font-size: 13.5px;
    line-height: 1.65;
    border-top: 1px solid var(--line);
}

/* An author `display` defeats the UA `[hidden]` rule at ANY specificity, and
   this region is hidden from script — so the component declares `[hidden]`
   itself (CLAUDE.md section 6, the two resets one family already paid for).
   Without this the enhancement would set the attribute and the answer would
   stay on screen. */
.la2-pg .pc-ans[hidden] { display: none; }

.la2-pg .pc-ans p { margin: 0 0 8px; }
.la2-pg .pc-ans ul { margin: 0 0 8px; padding-inline-start: 19px; }
.la2-pg .pc-ans li { margin-bottom: 5px; }


/* ============================================================================
   5 - CONTACT: FORM SCAFFOLDING, OUTCOMES AND THE SECURITY STATE
   ----------------------------------------------------------------------------
   Board `.stack`, `.fld`, `.alert`, `.status`, `.cbox`. Four business fields —
   name, email, subject, message — and nothing else; the CAPTCHA is a
   conditional SECURITY STATE, never a fifth field, and is ABSENT rather than
   disabled whenever the runtime does not require it.
   ========================================================================== */

.la2-pg .pc-stack { display: grid; gap: 9px; }

.la2-pg .pc-fld { display: grid; gap: 5px; }

.la2-pg .pc-fld label { font-size: 12.5px; font-weight: 600; color: var(--head); }

.la2-pg .pc-fi,
.la2-pg .pc-ta {
    min-height: 44px;
    border: 1px solid var(--edge);
    border-radius: var(--r1);
    background: var(--bg);
    color: var(--head);
    font: inherit;
    padding: 9px 11px;
    width: 100%;
}

.la2-pg .pc-ta { min-height: 88px; }

.la2-pg .pc-hint { font-size: 11.5px; color: var(--muted); }
.la2-pg .pc-err { font-size: 11.5px; color: var(--erI); font-weight: 600; }

/* The invalid field keeps its own message, a two-pixel border AND a word — the
   state is never carried by colour alone (frame 05 caption). Fields never move
   on error and typed values are preserved. */
.la2-pg .pc-bad .pc-fi,
.la2-pg .pc-bad .pc-ta { border-color: var(--erI); border-width: 2px; }

.la2-pg .pc-alert {
    border: 1px solid var(--inEd);
    background: var(--inBg);
    color: var(--head);
    border-radius: var(--r1);
    padding: 10px 12px;
    font-size: 12.5px;
    display: flex;
    gap: 8px;
}

/* Two instance margins the board sets inline: 12px under the validation summary,
   and 11px above / 12px below the receipt. */
.la2-pg .pc-summary { margin-bottom: 12px; }
.la2-pg .pc-receipt { margin: 11px 0 12px; }

.la2-pg .pc-alert.pc-ok { border-color: var(--okEd); background: var(--okBg); }
.la2-pg .pc-alert.pc-er { border-color: var(--erEd); background: var(--erBg); }

/* 44px targets, the board's own `.bc a, .toc a, .ft a, .rel a, .alert a` rule.
   The validation summary's field links are the primary route to a field, so
   they are measured on the control exactly as every other target is. */
.la2-pg .pc-alert a,
.la2-pg .pc-bc a,
.la2-pg .pc-sysft a {
    display: inline-flex;
    align-items: center;
    min-width: 44px;
    min-height: 44px;
}

.la2-pg .pc-alert a { text-decoration: underline; }

/* Processing, announced in WORDS through `role="status"` — never a spinner
   alone (matrix 2). */
.la2-pg .pc-status { font-size: 12.5px; color: var(--head); }

/* The conditional security challenge's own region. The widget inside it is the
   SHARED `<x-captcha.turnstile>` component, which the CLOSED 4C family also
   consumes; this declares the region AROUND it and nothing about the
   provider's own markup. */
.la2-pg .pc-cbox {
    border: 1px solid var(--line);
    border-radius: var(--r2);
    padding: 12px;
    background: var(--bg);
    font-size: 12.5px;
}

.la2-pg .pc-cbox-t { color: var(--head); font-weight: 600; font-size: 13px; margin-bottom: 5px; }

/* The success confirmation SUPERSEDES the submitted form on the same URL — it
   is part of the document, not only a toast, and not a separate route. */
.la2-pg .pc-acts { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }


/* ============================================================================
   6 - TEMPLATE 5: THE PUBLIC SYSTEM RESPONSE
   ----------------------------------------------------------------------------
   Board frame 06. A MINIMAL shell relationship, and that is a resilience
   contract rather than a style: the response has to render when the
   infrastructure is itself the failure source, so it reaches no database, no
   cache, no session, no view composer and no service (ledger section 74.7).
   This block is therefore the ONLY design the system template loads, and it is
   loaded as an ordinary static stylesheet.
   ========================================================================== */

/* REMOVING A CSS FRAMEWORK REMOVES ITS RESETS TOO (CLAUDE.md section 6).
   The system response deliberately loads no Bootstrap, so Reboot's
   `body { margin: 0 }` is gone and the UA's own 8px body margin applies — which
   inset the whole page by 8px on every side and made the head strip and the
   footer stop short of the viewport edge. MEASURED at 344px against a 360px
   viewport, not inferred. This is the family's own reset for the one page that
   has no framework under it; every other 6B page still gets Bootstrap's.
   Audit the next reset before adding a second dependency-free document. */
.la2-pg.pc-sys-page { margin: 0; }

.la2-pg .pc-syshd {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 10px;
    padding: 9px 11px;
    background: var(--band2);
    border-bottom: 1px solid var(--line);
    font-size: 12px;
}

.la2-pg .pc-sysbrand { color: var(--head); font-weight: 700; }

.la2-pg.pc-sys-page { min-height: 100vh; display: flex; flex-direction: column; }

/* The body region takes the space between the head strip and the footer and
   centres the response block on both axes. */
.la2-pg .pc-sysbd {
    flex: 1 0 auto;
    display: grid;
    place-items: center;
    padding: 24px 16px;
}

/* Status identifier - one H1 - one short explanation - one primary recovery
   action - one optional secondary. Quiet, non-promotional, non-diagnostic. */
.la2-pg .pc-sys {
    display: grid;
    gap: 12px;
    justify-items: center;
    text-align: center;
    padding: 22px 4px;
    max-width: 56ch;
    gap: 16px;
}

.la2-pg .pc-sys .pc-ttl { font-size: clamp(28px, 5.5vw, 38px); line-height: 1.3; overflow-wrap: anywhere; }

.la2-pg .pc-sys p { margin: 0; font-size: 17px; line-height: 1.7; }

/* The status identifier, for every system code. It is never the SOLE statement
   of what happened - the heading and the explanation both say it in words.
   Solid orange like the Post a Report CTA (--orn fill, --ornInk text). */
.la2-pg .pc-code {
    font: 700 17px/1 ui-monospace, monospace;
    letter-spacing: .14em;
    background: var(--orn);
    color: var(--ornInk);
    border: 1px solid var(--orn);
    border-radius: 999px;
    padding: 11px 20px;
}

.la2-pg .pc-sysft {
    border-top: 1px solid var(--line);
    background: var(--band2);
    padding: 10px 14px;
    display: flex;
    flex-wrap: wrap;
    gap: 4px 18px;
    font-size: 12.5px;
    align-items: center;
}

.la2-pg .pc-cr { color: var(--muted); font-size: 11.5px; }
