/* ============================================================================
   THE UPPERCASE VOICE — one sheet, every surface.

   Celina, 6 Aug 2026, ruling:
     "UPPER CASE LOCK is for design. Follow exact format for official documents
      like Visas, Passports etc. Everything else should be UPPER CASE. the
      sentance case dotted around the site … lose the premium feel."

   The rule lived only in crew-ui.css, which just ELEVEN surfaces load. The other
   twenty-one — copyright, sync, ingest, travel, tour, inbox, shell, index — had
   no uppercase voice at all. That is the "sentence case dotted around the site":
   not drift within a page, whole pages that never got the treatment.

   The carve-outs below are CORRECTNESS, not taste, and they are the same three
   crew-ui.css has always carried. They win via !important + specificity.
   ============================================================================ */

body { text-transform: uppercase; letter-spacing: .026em; }

/* form controls reset text-transform in the UA sheet, so <button> does NOT
   inherit body uppercase — target it explicitly. */
button { text-transform: uppercase; }

/* --- CARVE-OUT (a): live user input is NEVER transformed, and placeholders
   read exactly as typed. Typing lowercase and seeing caps is a lie about what
   will be saved. --- */
input, select, textarea, option, optgroup {
  text-transform: none !important; letter-spacing: normal !important;
}
input::placeholder, textarea::placeholder {
  text-transform: none !important; letter-spacing: normal !important;
}

/* --- CARVE-OUT (b): OFFICIAL DOCUMENT COPY — passport, visa, ID — rendered
   EXACTLY as written. This is the one her ruling names outright: a passport
   name is a legal string, not a design surface. --- */
.keepcase, .keepcase * { text-transform: none !important; }

/* --- CARVE-OUT (c): emails and URLs shown as text. Case can be meaningful and
   lowercase reads correct. Anchored links are auto-exempt; free-text spans take
   .keepcase / .lower / .email / .url. The two cross-surface nav link classes are
   excluded from the exemption — the nav is chrome, not content (her 3 Aug note,
   "still see sentance case on nav bar"). --- */
a[href^="mailto:"]:not(.rollon-xnav__link):not(.rollon-strip__link),
a[href^="http:"]:not(.rollon-xnav__link):not(.rollon-strip__link),
a[href^="https:"]:not(.rollon-xnav__link):not(.rollon-strip__link),
a[href^="tel:"]:not(.rollon-xnav__link):not(.rollon-strip__link),
.lower, .email, .url { text-transform: none !important; }

/* --- CARVE-OUT (d): OUTGOING CORRESPONDENCE IS NEVER SHOUTED.

   Celina, 18 Aug 2026, about to send an invoice to EMMMA:
     "the UPPER case rule should not be applied to emails."

   She is right and it is the same principle as carve-out (b), not a new one. Her
   6 Aug ruling was "UPPER CASE LOCK is for DESIGN", and an email is not design:
   it is a letter leaving the building with her name on it. A client reading
   "PLEASE FIND ATTACHED INVOICE INV-0042" is being shouted at by their own
   supplier, and every complaint she has made about the site reading amateur has
   been about exactly this kind of mismatch between chrome and content.

   THE TRAP THIS FIXES IS SPECIFICALLY A PREVIEW ONE, and it is worse than a
   cosmetic bug. text-transform changes what is PAINTED and never what is stored,
   so the invoice email preview showed her SHOUTING COPY while the bytes queued
   for send were correctly sentence case. The preview was lying in both
   directions: it is the one surface whose whole job is to show her exactly what
   the recipient will get, and it was the one surface guaranteed not to.

   Applies to anything carrying .emailcopy — the compose preview, a rendered
   template, a queued message body. NOT to the chrome around it: the SEND button,
   the panel heading and the field labels stay UPPER, because those are design. */
.emailcopy, .emailcopy * { text-transform: none !important; letter-spacing: normal !important; }

/* --- CARVE-OUT (f): LONG TEXT READS AS WRITTEN.

   Celina, 18 Aug, ruling after finding the review rows unreadable:
     "Design elements (buttons etc) upper case but long text or data can be written sentance"

   This is the GENERAL CASE the carve-outs above were each approximating. Every one of them says the
   same thing in a different costume: the uppercase voice is for the INTERFACE, never for content. A
   passport is content. An email is content. A paragraph is content.

   MEASURED WHEN SHE REPORTED IT: whole sentences were being uppercased across 295 writer-correction
   rows, 221 lyric rows and 100 deal notes. All-caps prose is slower to read for anyone and materially
   harder with ADHD, so a 40-word note in caps is not a style choice, it is a wall. Her word for it
   was "screaming", and it was literal.

   The class is applied by assets/prose-case.js, which decides per CONTAINER and never per string:
   mixed case down one column reads as a bug rather than as a voice. Chrome is untouched at any
   length; buttons, chips, labels, headers and nav all keep the shout. */
.prosecase, .prosecase * { text-transform: none !important; letter-spacing: normal !important; }

/* --- CARVE-OUT (e): NAMES AND TITLES, AS WRITTEN.

   Celina, 6 Aug 2026, amending her own earlier ruling:
     "Song Titles should stay in the case that they are written on the file or
      from previous entries. Passports, Visas, Song Titles and Artists should not
      use the UPPER CASE rule."

   This REVERSES the 5 Aug position, where a proposal to exempt titles and names
   was rejected. It is now settled the other way, and it draws a cleaner line than
   the old one did:

       CHROME IS UPPERCASE. DATA KEEPS ITS CASE.

   A button, a column head, a status pill, a nav link — those are design, and the
   lock owns them. A song title, an artist or writer name, a person's legal name —
   those are the record itself. `Wednesday's Child [EP]` is how the file is named
   and how the split sheet reads; WEDNESDAY'S CHILD [EP] is a different string,
   and on a cue sheet or a registration that difference is a correctness problem,
   not a taste one. It sits under the same clause as the passport for exactly that
   reason.

   `.keepcase` still covers passport / visa / ID. These are its siblings, named
   for what they are so a render site declares its intent rather than borrowing
   the ID exemption. --- */
.songtitle, .artistname, .personname, .writername, .companyname,
.songtitle *, .artistname *, .personname *, .writername *, .companyname * {
  text-transform: none !important;
}

/* STRUCTURAL, so a render site cannot be missed by forgetting to tag it.
   On every record surface the card's own heading IS the record — the song title
   on copyright/sync, the person's name on a directory card — and `.ttl` / `.art`
   are the title and artist cells of the song tables. Verified against these
   pages: neither class is ever used for chrome, and the column headers are
   <th>/.hcell, which stay uppercase. */
.ttl, .art,
.pcard > .hdrrow > h2,
.tp > h3,
.shp-t, .shp-a,
.rec-title, .recname {
  text-transform: none !important;
}

/* --- CARVE-OUT (d): QUOTED CORRESPONDENCE — an inbound email body, reproduced
   verbatim. Celina, 6 Aug 2026, on the inbox board: "amend the design so super
   easy on the eye."

   This sits under the SAME clause as the passport: her ruling exempts anything
   reproduced in its exact format, and someone else's sentence is exactly that.
   Uppercasing it is a misquote — and unreadable at length, because all-caps
   removes the ascender/descender shape the eye reads words by. A paragraph of
   it is fine on a button and punishing across 373 cards.

   The card's FURNITURE stays uppercase: subject, sender, status pill, labels,
   every control. Only the quoted body reads as it was written. --- */
.asread, .asread * { text-transform: none !important; letter-spacing: normal !important; }

/* small runs need a touch more tracking to stay legible in all-caps. */
.hint, .foot, .pagefoot, .muted, .note { letter-spacing: .05em; }


/* --- CARVE-OUT (g): A GRID CELL HOLDS DATA. ITS HEADER IS CHROME.

   Celina, 18 Aug: "Names and Data can be in Sentance Case." / "DESIGN pieces UPPER." / "Songs should
   not be in UPPER unless written in upper."

   MEASURED on the Directory the moment she said it: 108 of 165 visible data cells were being
   uppercased. Not titles, not headings, DATA: "G major" read G MAJOR, "117.0", "27 May 2024",
   "mood: sexy". A key signature and a mood tag are values, not design.

   WHY CARVE-OUT (f) COULD NEVER CATCH THIS, and it is the lesson of the day: (f) un-shouts long runs,
   and a key signature is SEVEN characters. Length is the wrong axis. It was never about how long the
   text is, it is about WHAT THE THING IS. So this rule is structural rather than metric: in a data
   grid the VALUES are data and the COLUMN HEADERS are chrome, and that holds on every surface with a
   table whether or not anyone remembered to tag it.

   NOT A DATA-INTEGRITY BUG, and worth recording so nobody panics next time: text-transform changes
   what is PAINTED and never what is stored, and assets/view-export.js contains ZERO textContent reads
   because it exports from the data. So no CSV, cue sheet or registration ever carried the shouted
   form. Her WEDNESDAY'S CHILD [EP] concern is real for anything that reads the SCREEN; nothing does.

   CHROME INSIDE A CELL KEEPS ITS VOICE. A status pill, a chip, a button or an action verb that lives
   in a cell is still design and is excluded below, so the rule does not quietly soften the interface
   the way carve-out (f) was guarded against. --- */
td, .cell, .rc-fval, td *, .cell *, .rc-fval * { text-transform: none !important; }
/* ...but anything that is CHROME wearing a cell's clothes stays UPPER. .cpill is the renderer's
   pill (grid-page/field-types) and had slipped through this list - her morning screenshot,
   23 Aug: the STATUS pills read lowercase in the grid while the card said PAID. */
td button, td .chip, td .pill, td .cpill, td .btn, td .tbtn, td .bbtn, td .rowedit, td [role="button"],
.cell button, .cell .chip, .cell .pill, .cell .cpill, .cell .btn, .cell [role="button"] { text-transform: uppercase !important; }
/* ...and so is the summary row's FUNCTION LABEL. `.sk` is the word SUM, AVERAGE, COUNT or FILLED
   that the foot prints before its figure (assets/grid-page.js 3405, assets/grid-kit.js 197,
   templates.html 507). It names an operation; it is not a value out of her book. MEASURED on
   /finance-v2 08 Sep 2026: computed text-transform read `none` on that span and the band under her
   totals said "Sum" while every other label on the page said its word in full caps. The rule that
   was already declaring uppercase for it (assets/grid-page.css 221) lost to line 177 above, which
   carries !important; this is the same list, and the same reason, that .cpill was added to. */
td .sk { text-transform: uppercase !important; }
/* Column headers are the design of the table, not its contents. */
th, .hcell { text-transform: uppercase !important; }

/* --- CARVE-OUT (h): THE RECORD CARD IS THE RECORD. ------------------------------------------

   Celina, 26 Aug 2026: "somewhere along the line all my directory records were changed to UPPER -
   I only asked for design of the app to be upper not all my records."

   NOTHING WAS CHANGED, and that is worth saying first because it is the frightening reading.
   Checked in her data the moment she said it: `Emma Ruchefsky` is stored exactly like that, and
   only 143 of 13,067 people are stored in caps - names that genuinely are, like EMMMA and FKJ.
   text-transform paints; it never writes. Her records are untouched.

   WHAT WAS ACTUALLY WRONG. Carve-out (g) settled this for the GRID - "in a data grid the VALUES are
   data and the COLUMN HEADERS are chrome" - and exempted td / .cell / .rc-fval. The record CARD
   renders neither: its heading is #rtitle and its values are .fv. So the one surface that is
   nothing BUT a record was the one surface still shouting it. Measured on her own card: the DOM
   read "Emma Ruchefsky (ID)" and the screen read "EMMA RUCHEFSKY (ID)".

   This is (g) again, applied to the shape it missed, and it is structural for the same reason:
   not because a name is long, but because of WHAT THE THING IS.

   CHROME INSIDE THE CARD KEEPS ITS VOICE, exactly as it does inside a cell - the section headings,
   the pills, the desk controls and every button stay UPPER, because those are design. --- */
#rtitle, #rsubtitle, .rfield .fv, .rfield .fv *,
.rgc .fv, .rgc .fv *, .rgc #rtitle, .rgc #rsubtitle {
  text-transform: none !important;
}
/* THE CARD HERO WEARS NO RING AT REST (A-c4-4, 08 Sep 2026). grid.html focusRecModal focuses
   #rtitle (tabindex -1) on EVERY open, so the browser's default focus ring - a blue that is not
   hers (rgb(0,95,204) light, rgb(153,200,255) dark), and an underline - painted on a title she
   never tabbed to, on every open. The hero carries tabindex -1 (grid.html 9028), so a keyboard Tab
   SKIPS it and it is only ever focused programmatically; it therefore never earns a ring, and the
   ring is removed outright. The keyboard ring she does meet lives on the card's real controls,
   which wear her blue on :focus-visible already (form-engine.css, select.css, the dock). MEASURED
   08 Sep 2026: :focus-visible alone did NOT clear it, because a programmatic focus on the open
   still matched :focus-visible in Chromium and painted the ring at rest; and `outline: none` alone
   left outline-width computing to 3px, so the width is zeroed explicitly. */
#rtitle, .rgc #rtitle { outline-style: none !important; outline-width: 0 !important; text-decoration: none !important; }
/* AND THE RING A KEYBOARD EARNS IS HERS (the A-c4-4 verifier's finding, 08 Sep 2026): the first Tab
   stop in the card, button#rprev.srcbtn, wore the browser's own blue (rgb(0,95,204) light,
   rgb(153,200,255) dark) because no control in the card carried a :focus-visible rule. One rule,
   her --blue, the estate's own 2px, on every button and field the card holds. */
.rgc button:focus-visible, .rgc .srcbtn:focus-visible, #racts .srcbtn:focus-visible, #rhead .srcbtn:focus-visible,
.rgc input:focus-visible, .rgc textarea:focus-visible, .rgc select:focus-visible { outline: 2px solid var(--blue) !important; outline-offset: 1px; }
/* BUT NEVER INSIDE A BOX (her 17 Sep 2026 15:01 shot: HOME ADDRESS wore two blue rectangles). A form-engine box (.rf-box) IS the ring:
   it paints its own border on :focus-within, so the input inside must draw nothing. The crew profile wears .rgc for the caps lock,
   and the card rule above reached its inputs with !important, beating form-engine.css. One carve-out at the owner of the rule. */
.rgc .rf-box > input:focus-visible, .rgc .rf-box > textarea:focus-visible, .rgc .rf-box input:focus-visible, .rgc .rf-box textarea:focus-visible { outline: 0 !important; outline-width: 0 !important; box-shadow: none !important; }
/* ...but anything that is CHROME wearing a value's clothes stays UPPER — the same guard carve-out
   (g) needed the day a status pill slipped through it. */
.rfield .fv button, .rfield .fv .chip, .rfield .fv .pill, .rfield .fv .cpill,
.rfield .fv .spchip, .rfield .fv .ctl-b, .rfield .fv [role="button"], .rfield .fv .invlk,
.rgc .fv button, .rgc .fv .chip, .rgc .fv .pill, .rgc .fv .cpill,
.rgc .fv .spchip, .rgc .fv .ctl-b, .rgc .fv [role="button"], .rgc .fv .invlk {
  text-transform: uppercase !important;
}

/* --- CARVE-OUT (i): A LINKED-RECORD PILL IS THE RECORD, NOT CHROME. ------------------------------

   Her 04 Sep 2026 pill ruling makes the split explicit: a LINKED-RECORD pill (a person, a company,
   a song - RECIPIENTS, WRITERS, ARTIST, CLIENT, PUBLISHER, MASTER OWNER, SPLITS) is drawn as an
   OUTLINE chip because it OPENS a record, while a single-select or status value is a filled tag.
   The two rules above swept EVERY `.cpill` back to uppercase to catch the status pill that once
   read lowercase (23 Aug) - correct for a status, wrong for a name. `Donna Nixon` on an outline
   chip is the record, and `DONNA NIXON` is a different string, exactly the WEDNESDAY'S CHILD [EP]
   concern carve-outs (g)/(h) settled for the cell and the card heading.

   So the meaning split settles the casing too: a LINKED pill (the renderer's `.clickable`, and the
   removable reference `.cpill--chip` whose name is the <button> `.cpillname`) keeps its case; a
   PLAIN `.cpill` (single-select / status) stays UPPER above, because a chosen value from a fixed
   list is chrome. The `.clickable` / `--chip` specificity clears the `button` and `.cpill` rules
   above; the descendant reach covers the inner name button the card's `.fv button` rule was
   shouting. */
td .cpill.clickable, td .cpill.clickable *, td .cpill--chip, td .cpill--chip *,
.cell .cpill.clickable, .cell .cpill.clickable *, .cell .cpill--chip, .cell .cpill--chip *,
.rfield .fv .cpill.clickable, .rfield .fv .cpill.clickable *,
.rfield .fv .cpill--chip, .rfield .fv .cpill--chip *, .rfield .fv .cpillname,
.rgc .fv .cpill.clickable, .rgc .fv .cpill.clickable *,
.rgc .fv .cpill--chip, .rgc .fv .cpill--chip *, .rgc .fv .cpillname {
  text-transform: none !important;
}

/* NO FIELD ON A PHONE IS SMALLER THAN 16PX (31 Aug 2026, the phone seat of the ONE APP board).
   iOS Safari zooms the whole page when a focused input is under 16px, and then does not zoom back
   out - so one tap on a search box leaves her scrolled sideways on a page she has to pinch to
   recover. The estate carried roughly thirty of these across twelve files: build 13px, decide 13px,
   travel-board 12.5/13/13.5, travel 14px, days 12px, tour-mgmt 12.5px, inbox 12px, invite 12.5px,
   templates 12px, grid 12.5/14/15px and about twenty more inline.
   ONE RULE, NOT THIRTY EDITS. assets/grid-page.css:1375 already does exactly this for the grid
   chassis's own editors, which is why /onerecord was the one surface that did NOT have the fault.
   This is that same rule promoted to the sheet 31 of 32 surfaces load, so it sweeps the estate
   rather than the file someone happened to be looking at.
   COARSE POINTERS ONLY: a mouse never zooms, so the desktop type scale is untouched. */
@media (pointer: coarse) {
  input, select, textarea { font-size: 16px; }
}
