/* ==========================================================================
   Account `.box` cards — SHARED COMPONENT

   Promoted out of `pages/_t24.css` on T26. This is the THIRD time this theme has made this
   exact correction — the filter rail, the column shell, and the account nav were all promoted
   after a page-scoped rule left sibling routes unstyled — and T24 predicted this one in
   writing: its delta 14 says "whoever owns the account family should either promote this to a
   shared component or accept the divergence knowingly." T26 is that moment.

   THE DESIGN WAS ONE CLASS AWAY FROM THE PAGE THAT NEEDED IT. T24 scoped its card treatment to
   `.customer-account-index`, which cannot match `.customer-address-index`. So `/customer/address/`
   measured its two default-address boxes TRANSPARENT with `border: 0px` — not because nobody had
   designed them, but because the design could not reach them.

   WHAT BLANK IS DOING HERE, AND WHY IT MUST BE CLEARED BEFORE ANY GRID:
   `.account .column.main .block:not(.widget) .block-content .box { width: 48.8% }` at (0,7,0),
   inside `@media (min-width: 768px)`. It is ACTIVE on every account route right now — the live
   measurement on `/customer/address/` is 508 / 1042 = **0.4875**, the same 0.488 fingerprint
   `pages/_t25.css` chased for four rounds. The instant a `.block-content` becomes a grid, its
   tracks are (1042-16)/2 = 513px and each box renders at 48.8% of THAT — roughly 250px, leaving
   half of every track empty. `float` and `clear` are inert on grid items; `width` is the one
   that breaks.

   AND THE WEIGHT WAS RAISED TOO FAR, WHICH REGRESSED A CLOSED TASK ON A SECOND AXIS.

   `.block-content.block-content` took every rule here to (0,10,0). T24's own mobile override -
   `padding: 18px` at `<=639` - stayed at (0,9,0) in its page sheet, where before the promotion
   the two TIED and the later one won. At (0,10,0) it loses, so the dashboard's four cards
   rendered 22px instead of 18px below 640. Sixteen dead longhands, one declaration, mobile only.
   Six gates missed it because a 4px difference at one breakpoint looks like nothing.

   This is the same failure as the route over-reach, on a different axis: A PROMOTION'S BLAST
   RADIUS IS NOT ONLY WHICH ROUTES THE SELECTOR REACHES, BUT WHAT WEIGHT IT ARRIVES AT. Moving a
   rule between files changes its neighbours AND its rank, and the rank change is invisible in a
   diff.

   The doubling is gone. At (0,9,0) these still clear Blank's width (0,7,0), float (0,8,0) and
   clearfix (0,6,1) outright, and they tie T24's page rules exactly as they did before the move -
   so source order decides again, which is what T24 was written against.

   ORIGINAL NOTE, superseded: T24's selector carried BOTH body classes
   and reached (0,9,0). Dropping `.customer-account-index` for `.account` alone would land on
   (0,8,0) — a TIE with Blank's float rule, decided by sheet order rather than weight, which is
   exactly what T24's own comment says it was avoiding.

   A repeated `.block-content` class was used to buy that point back - and THAT is what broke T24
   at mobile, per the note above. The correct resolution is not a heavier selector: it is to land
   on the SAME weight T24's rules already use, so the two tie and source order decides, which is
   the relationship T24 was written against and verified at.

   ALSO NEUTRALISED HERE: Blank's clearfix on `.block-content`. `content: ''; display: table` on
   a GRID CONTAINER makes each pseudo a grid ITEM — on T25 that ate a track and pushed a fourth
   card onto a second row while every card measured correctly. Owned at (0,6,1), so these clear
   it at (0,7,1). The tell is more grid rows than the item count needs.
   ========================================================================== */

/* (0,10,0) — see the header. Blank's width rule is (0,7,0) and its float rule (0,8,0).

   THE RESET IS ROUTE-SCOPED TOO, AND THE COMMENT THAT USED TO SIT HERE WAS WRONG.

   It said: "There is no route where an account box wants to be 48.8% of a grid track it does not
   know about, so applying it everywhere cannot surprise a page." S2 disproved that with a
   counterfactual. On `/sales/order/invoice/`, `/shipment/` and `/print/`, `.block-content` is NOT
   a grid — so Blank's `48.8% + float` is a WORKING 2x2 layout there, and undoing it stacked all
   four boxes into one full-width column, **2.06x taller** (verticalSpan 159.4 -> 328.5).

   That is the same mistake as the skin regression it was written to explain, one layer down: I
   reasoned about what the rule DOES rather than about where it LANDS. "It only undoes things" is
   not a safety property — undoing a framework layout is still changing a page, and a page nobody
   designed is exactly where that goes unnoticed.

   So both halves are now scoped to the two routes that grid this container. Nothing else needs
   the reset: `/sales/order/view/` grids its own and carries its own reset in `_t25.css` (verified
   — with it, four boxes share one row; without it, two rows), and the remaining NINE account
   routes match no `.box` at all. This sentence said ELEVEN and counted invoice, shipment and
   print among them - eight lines after this same file states those three render four `.box`
   each. They DO carry boxes; they are excluded by SCOPE, not by absence, which is precisely the
   distinction the route-scoping fix rests on, contradicted in the sentence a future author reads
   before widening these lists.

   What this component is, honestly stated: deduplication between two pages that happen to want
   the same thing, not a theme-wide primitive. Adding a third route is one edit to these lists,
   and the lists are the record of which pages have been designed. */
.customer-account-index.account .column.main .block:not(.widget) .block-content .box:not(.widget),
.customer-address-index.account .column.main .block:not(.widget) .block-content .box:not(.widget) {
  width: auto;
  float: none;
  clear: none;
  margin: 0;
}

/* The clearfix pseudos, at (0,7,1) against Blank's (0,6,1). `display: none` rather than
   `content: none`: the clearfix exists to contain Blank's floats, and grid already contains
   them, so the pseudos have no remaining job on any route this component reaches. */
.customer-account-index.account .column.main .block:not(.widget) .block-content::before,
.customer-account-index.account .column.main .block:not(.widget) .block-content::after,
.customer-address-index.account .column.main .block:not(.widget) .block-content::before,
.customer-address-index.account .column.main .block:not(.widget) .block-content::after {
  display: none;
}

/* ==========================================================================
   THE CARD SKIN IS OPT-IN BY ROUTE, AND THE FIRST VERSION OF THIS FILE WAS NOT.

   S1 found that the skin below, when scoped to `.account` like the reset above, reached FIVE
   routes carrying `.box` elements rather than the two it was written for — and REGRESSED A
   CLOSED TASK. On `/sales/order/view/`, `_t25.css` declares `padding: 16px`,
   `border-radius: var(--hrv-radius-md)` and DELIBERATELY no fill, at (0,3,0). The skin at
   (0,9,0) beat all three: measured 22px, 18px and `rgb(255,255,255)`, 32 element-diffs, page
   height 1943 -> 1983px at 375. T25 spent four review rounds on those boxes and every one of
   its declarations there became dead.

   It also silently restyled `/sales/order/invoice/`, `/shipment/` and `/print/` — four boxes
   each, previously unstyled, now full-width cards. S1's note on those is the sharp one: it
   looked at the render and said it "does not look broken, it looks plausible. That is the
   problem" — a large undesigned change no gate had seen.

   And it broke the account/guest parity that T25 went to the compiled `styles-l.css` to
   establish, because the component is gated on `.account` and guest carries none.

   WHAT I GOT WRONG, PRECISELY: I asked the reviewer to prove T24 had not regressed and never
   considered T25. A promotion's blast radius is every route the SELECTOR reaches, not the
   routes the task was thinking about. The reset above is unconditionally correct — undoing
   Blank's damage helps any account box. The SKIN is a per-page design decision and had no
   business travelling with it.

   Routes are listed explicitly rather than via `.account`. Adding one is one edit here, and the
   list is the record of which pages have actually been designed.
   ========================================================================== */

/* THE CARD BOUNDARY IS ON THE `.box`, NOT ON THE BLOCK, and T24 records getting this wrong
   first: making the BLOCK the card rendered two wide slabs each wrapping two bare boxes.
   Four discrete tiles versus two panels is a materially different page. */
.customer-account-index.account .column.main .block:not(.widget) .block-content .box:not(.widget),
.customer-address-index.account .column.main .block:not(.widget) .block-content .box:not(.widget) {
  background: var(--hrv-surface);
  border: 1px solid var(--hrv-border);
  border-radius: var(--hrv-radius);
  padding: 22px;
}

.customer-account-index.account .column.main .block:not(.widget) .block-content .box .box-title,
.customer-address-index.account .column.main .block:not(.widget) .block-content .box .box-title {
  display: block;
  margin: 0 0 8px;
}

/* The comp's uppercase eyebrow. Blank wraps the label in a `<span>` and sets the `.box-title`
   itself to `inline-block` at (0,6,0) — the size and tracking therefore go on the span, which
   is where the text actually is. */
.customer-account-index.account .column.main .block:not(.widget) .block-content .box .box-title > span,
.customer-address-index.account .column.main .block:not(.widget) .block-content .box .box-title > span {
  font-size: 12px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--hrv-text-muted);
}

/* `.box-content` AND `.box-actions` ARE DELIBERATELY NOT HERE — the two comps disagree.
   T24's dashboard body is `line-height: 1.6` on `--hrv-text`; T26's address body is `1.8` on the
   comp's muted `tx 58%`. Hoisting either would silently restyle the other page, which is the
   opposite of what a promotion is for. A shared component should carry what is genuinely the
   same, not everything that happens to share a selector — the card boundary and the eyebrow are
   identical on both, the body copy is not. Pages own their own body treatment. */

/* THE GRID DELIBERATELY IS NOT HERE, and that is a scope decision rather than an omission.

   `.account .column.main .block:not(.widget) .block-content` matches many blocks across the
   twelve account routes this component reaches. WHICH of them should be two-up is a per-page
   design question, and `display: grid` on all of them is a blast radius nobody has measured.

   Putting `grid-template-columns` here without `display: grid` would be worse than either
   choice: inert on every route until some page opts in, i.e. exactly the dead-declaration
   pattern this theme has now removed eleven of. So the page sheets own the grid, and this
   component owns the two things that are unconditionally right for an account box — undoing
   Blank's 48.8% width and its clearfix, and drawing the card.

   T24's own measurement is worth carrying to whoever writes the next grid:
   `repeat(auto-fit, minmax(280px, 1fr))` produced THREE tracks for two boxes, because auto-fit
   sizes tracks from the minmax and the container, not from the item count. It collapses empty
   tracks; it does not stop creating them. Use explicit tracks and handle `:only-child`. */
