/* ==========================================================================
   OSTUGRUPP — TÄNULEHT · MINU KONTO · TELLIMUSE JÄLGIMINE
   assets/css/account-polish.css — loaded by inc/account-polish.php at
   wp_enqueue_scripts priority 25, and ONLY on the three surfaces named there.

   WHAT THIS FILE IS FOR
   Everything a shopper sees AFTER paying. The thank-you page is the single
   most emotionally loaded page in the shop — the shopper has just handed over
   money and is asking one question, "did that work" — and until this file it
   was WooCommerce's default: an unstyled two-column table under a paragraph.
   The account is where they come back to ask "where is it".

   SOURCES READ BEFORE A LINE OF THIS WAS WRITTEN
     assets/css/tokens.css                     every value below
     assets/css/woocommerce.css:1307-1524      the rules this file extends
     assets/css/woocommerce.css:1812-1839      the de-tabling pattern (Trap 11)
     assets/css/tracking.css                   the timeline + badge vocabulary
     assets/css/empty-states.css               the illustration route + family
     assets/css/surfaces-d4-d12.css            the elevation ladder (D4)
     assets/css/controls-d1-d2.css             the button/field ladder (D1/D2)
     assets/css/motion.css                     press feedback ownership
     docs/DISAIN-KOMPONENDID.md §D5 §D8 §D12   chips, tables, state colour
     design_handoff_ostugrupp_system/
       "Ostugrupp System Sample 01.dc.html":1606-1683   D8, verbatim
     LIVE: curl https://ostugrupp.ee/my-account-2/ and .../lost-password/
           (2026-08-14) — body class, wrapper markup and the login/register
           structure are read from the live HTML, not remembered.

   ADDED FOR SECTIONS 10-13 (v1.2.102, 2026-08-15)
     curl http://og.local/my-account-2/  and  .../lost-password/
       the local copy of the live database. Body classes, the #customer_login
       id, the register card's three tick rows and the reset form's structure
       are quoted from that HTML.
     plugins/woocommerce/templates/myaccount/
       my-address.php · form-edit-address.php · form-edit-account.php ·
       orders.php · view-order.php · navigation.php · dashboard.php
     plugins/woocommerce/templates/order/order-details.php
     plugins/woocommerce/includes/class-wc-order.php  (get_order_item_totals —
       which row is last, and which rows carry no sum at all)
     plugins/woocommerce/assets/css/woocommerce-layout.css     (the col2-set floats)
     plugins/woocommerce/assets/css/woocommerce-smallscreen.css (tbody th)
     assets/css/type-rhythm.css:205                            (the bare-h2 size)

   ──────────────────────────────────────────────────────────────────────
   THE THREE MOMENTS THIS FILE ACTUALLY DESIGNS
   Everything else in here is deliberately calm.
     1. THE CONFIRMATION — the "Täname" line becomes a real confirmation
        (mark, measure, rhythm) instead of a large paragraph. §1.
     2. THE ORDER STATUS — six WooCommerce statuses get ONE state language,
        built from the state tokens, shared by the desktop table and the
        phone card. §6.
     3. THE WAY OUT WHEN THERE IS NOTHING — "Sul ei ole veel ühtegi
        tellimust" stops being a grey bar with a button jammed into its
        right edge and becomes an invitation, in the same drawing family as
        the other four empty states. §7.

   ──────────────────────────────────────────────────────────────────────
   ⛔ MONTONIO (CLAUDE.md invariant 1). This file is loaded on the
   order-received page, where `is_checkout()` is TRUE — which is exactly why
   several other modules skip that page. Two guards:
     (i)  inc/account-polish.php never enqueues on the checkout itself, the
          order-pay screen or the add-payment-method screen. Only the
          order-received endpoint, the account and the tracking page.
     (ii) every selector below is fenced on ORDER or ACCOUNT markup
          (.woocommerce-order, .woocommerce-order-details,
          .woocommerce-customer-details, .woocommerce-MyAccount-*,
          .woocommerce-orders-table, .ostu-track). Not one generic
          `.form-row`, `.button` or `input` net exists in this file, so no
          rule here can reach a gateway control even if the stylesheet were
          served on a page it was not enqueued for (W3TC combining).
          v1.2.102 keeps that promise while adding form rules: §11 and §12 do
          touch a checkbox, a submit and a form wrapper, and every one of them
          is fenced on `#customer_login`, on
          `.u-columns.col2-set:has(.woocommerce-form-register)`, on
          `.woocommerce-ResetPassword` or on `.woocommerce-EditAccountForm` —
          four pieces of markup that exist only on the account, never on a
          page that can render a gateway list.
   The file contains none of the four names gate check 6a greps for, in code
   or in comment.

   ⚠️ CLAUDE.md TRAP 11 — the one that has cost this project two releases,
   both times in an order-shaped table. A non-table `display` on a `<td>`
   voids its `colspan` and hands the content to an anonymous cell. Two
   consequences are honoured throughout this file:
     • The thank-you / view-order details table STAYS a real table at every
       width (§2). It is two columns; it does not need de-tabling, and half
       a conversion is what the trap is made of.
     • The account's responsive tables are already HALF converted by
       woocommerce.css:1503-1523 (tr → block, td → flex, while `table` and
       `tbody` keep table display). §5b finishes that conversion the way
       woocommerce.css:1826-1835 finished the checkout summary: table, tbody
       and tfoot go to block as well, so no anonymous row or cell can be
       generated at all. Never half.

   ⚠️ CLAUDE.md TRAP 9 — the `woocommerce-page` body class changes the
   cascade. Every substantial rule below states the specificity it achieves
   and the declaration it must beat. Those numbers are ARITHMETIC, not
   measurement: this session had no browser (see §9).

   ⚠️ Every var() carries its literal. This theme deploys as a hand-built
   zip; a custom property that cannot resolve does not fall back to an older
   value, it poisons the whole declaration.
   ⚠️ --shadow-card resolves to main.css:98, NOT to tokens.css:238 (both
   declare it, main.css loads last — docs/DISAIN-KOMPONENDID.md §1). The
   literal fallbacks below are main.css's value, i.e. the one that renders.
   ========================================================================== */


/* ==========================================================================
   1 · TÄNULEHT — THE CONFIRMATION
   ==========================================================================
   Markup (WooCommerce checkout/thankyou.php + checkout/order-received.php):

     div.woocommerce-order
       p.woocommerce-notice.woocommerce-notice--success
         .woocommerce-thankyou-order-received          ← "Täname. …"
       ul.woocommerce-order-overview.order_details
         li.woocommerce-order-overview__order    (nr)
         li…__date · li…__email · li…__total · li…__… (method)
       [ hooks: woocommerce_thankyou → order details table, addresses ]

   What was here before: woocommerce.css:1308 turned the paragraph into a
   24-32px display heading and :1309-1311 turned the list into a flex card.
   Both are good and both stay — this section adds the two things a
   confirmation needs and a heading cannot give: a MARK that says "done", and
   a MEASURE, so the receipt is not 1376px wide on a laptop.

   ⛔ NOT DONE HERE, on purpose: no delivery date, no "arrives on", no
   countdown. The theme promises "keskmiselt 3-7 tööpäeva" while
   /muugitingimused/ says 1-14 and up to 45. Until the owner settles that,
   this page prints no date it cannot keep (pack rule 2: a wrong number is
   worse than no number). The honest answer to "when" is the status timeline
   — see the note at the end of this section. */

/* The measure. `.woocommerce-order` is a plain block child of `.woocommerce`
   (verified: the only grid this theme puts on a checkout wrapper is on
   `form.checkout`, woocommerce.css:1137 — NOT on `.woocommerce`, so there is
   no repeat of the empty-cart grid trap documented at empty-states.css:67).
   860px is wider than the tracking panel's 760px (tracking.css:9) because
   this page carries a two-column table and two addresses, and narrower than
   the page container, which is 1376px at 1440px viewport.
   Specificity (0,1,0); nothing else in the theme sets a width on this
   element, so it only has to exist. */
.woocommerce-order {
  width: 100%;
  max-width: 860px;
  margin-inline: auto;
}

/* ---- 1a · The mark --------------------------------------------------------
   A solid brand disc with a white check, centred above the line.

   WHY A BACKGROUND-IMAGE AND NOT A ROTATED PSEUDO-ELEMENT. The usual CSS
   tick is a box with two borders turned 45deg; its geometry has to be tuned
   by eye, and there was no browser in this session (§9). The check drawn
   below is the SAME path, stroke width and cap style that
   inc/order-tracking.php:370 already draws for a completed timeline step, so
   the two marks are one glyph. Same delivery route as
   empty-states.css:187-194, and the same consequence: inside a
   background-image the SVG is its own document, so `currentColor` cannot see
   the page and the stroke is the literal #ffffff. That is not a missing
   token — it is --text-on-brand's value, on a --brand disc, and it can never
   be anything else because the disc under it is fixed too.

   Base = 56px on a phone, 64px from 640px up. `position:static` is stated
   because core sets `position:absolute` on `.woocommerce-info::before` — a
   different element, but the same author habit, and being explicit costs
   nothing.
   Specificity (0,2,0) + pseudo-element. Nothing in core or in
   woocommerce.css touches `.woocommerce-thankyou-order-received::before`, so
   this only has to be valid, not to win an argument. */
.woocommerce-order > .woocommerce-thankyou-order-received {
  display: block;
  margin: 0 auto var(--space-24, 24px);
  max-width: 34ch;
  text-align: center;
  font: var(--h2, 700 clamp(24px, 3.2vw, 32px)/1.15 "Space Grotesk", "DM Sans", system-ui, sans-serif);
  letter-spacing: var(--h2-tracking, -.015em);
  color: var(--text, #0f172a);
}
.woocommerce-order > .woocommerce-thankyou-order-received::before {
  content: "";
  position: static;
  display: block;
  width: 56px;
  height: 56px;
  margin: 0 auto var(--space-16, 16px);
  border-radius: var(--radius-circle, 50%);
  background:
    var(--brand, #047857)
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E")
    center / 26px 26px no-repeat;
}
@media (min-width: 640px) {
  .woocommerce-order > .woocommerce-thankyou-order-received::before {
    width: 64px;
    height: 64px;
    background-size: 30px 30px;
  }
}

/* ---- 1b · The overview: a receipt on a phone, a stat row on a desk --------
   woocommerce.css:1309-1311 gives this list a flex card with a 24px gap and
   `li { display:flex; flex-direction:column }` — label above value. That is
   right at 1280px and wrong at 375px: five stacked label/value pairs with a
   long e-mail address in the middle read as a ragged column with no
   alignment to hang on.

   PHONE  → one column, label LEFT and value RIGHT on one baseline. This is
            the "silt: väärtus" row the whole shop already uses on small
            screens (D8), and it is what a receipt looks like.
   ≥560px → back to the pack's stat layout, three across, which lets the two
            long values (e-mail, makseviis) have a full column each.

   Specificity: `ul.woocommerce-order-overview` is emitted by exactly one
   template (checkout/thankyou.php) and always inside `.woocommerce-order`,
   so prefixing with it is free — the container rule is (0,2,0) against
   woocommerce.css:1309's (0,1,0), and the `li` rule is (0,2,1) against
   woocommerce.css:1310's (0,1,1). Both win on specificity, not on order. */
.woocommerce-order .woocommerce-order-overview {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 0;
  padding: var(--space-8, 8px) var(--space-20, 20px);
}
.woocommerce-order .woocommerce-order-overview > li {
  flex-direction: row;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-8, 8px) var(--space-16, 16px);
  padding: var(--space-12, 12px) 0;
  border-bottom: 1px solid var(--border, #e2e8f0);
}
.woocommerce-order .woocommerce-order-overview > li:last-child {
  border-bottom: 0;
}
/* The value. `strong` is core's element (thankyou.php wraps every value in
   one); woocommerce.css:1311 already gives it the display face at 18px.
   Here it only has to stop being a block so it can sit on the label's
   baseline, and to line its digits up. (0,3,1) — no competitor, stated for
   symmetry with the rule above. */
.woocommerce-order .woocommerce-order-overview > li strong {
  text-align: right;
  font-variant-numeric: tabular-nums;
  overflow-wrap: anywhere;
}
/* The total is the number the shopper is checking. One step up the price
   ladder, no colour change — this is a receipt, not an offer. */
.woocommerce-order .woocommerce-order-overview > li.woocommerce-order-overview__total strong {
  font: var(--price-md, 700 20px/24px "Space Grotesk", "DM Sans", system-ui, sans-serif);
  letter-spacing: var(--price-md-tracking, -.015em);
  color: var(--text, #0f172a);
}

@media (min-width: 560px) {
  .woocommerce-order .woocommerce-order-overview {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--space-24, 24px);
    padding: var(--space-24, 24px);
  }
  /* Back to the pack's stacked stat: label above value, no rule between. */
  .woocommerce-order .woocommerce-order-overview > li {
    flex-direction: column;
    align-items: flex-start;
    justify-content: flex-start;
    gap: var(--space-4, 4px);
    padding: 0;
    border-bottom: 0;
  }
  .woocommerce-order .woocommerce-order-overview > li strong {
    text-align: left;
  }
}

/* ---- 1c · The order that did NOT go through ------------------------------
   thankyou.php renders `.woocommerce-thankyou-order-failed` instead of the
   success line when the order failed, plus a `-failed-actions` paragraph
   holding the retry links. Those two are UNSTYLED today, and once §1a exists
   the contrast matters: a designed success page next to a bare paragraph
   makes the failure look like a broken page rather than a clear message.

   This is the smallest honest treatment — the pack's D6 shape (surface, 1px
   border, a 3px rule in the state colour, --radius-12) and nothing more. It
   deliberately does NOT reuse the confirmation mark, the measure or the
   heading size: a failure must not look like a confirmation.

   The retry links inside `-failed-actions` are left entirely alone. They
   lead to the pay-for-order screen and this file has no business shaping
   the way in there. Untested — no order can be failed from here (§9). */
.woocommerce-order > .woocommerce-thankyou-order-failed,
.woocommerce-order > .woocommerce-thankyou-order-failed-actions {
  max-width: 640px;
  margin: 0 auto var(--space-16, 16px);
  padding: var(--space-16, 16px) var(--space-20, 20px);
  background: var(--surface, #ffffff);
  border: 1px solid var(--border, #e2e8f0);
  border-left: 3px solid var(--state-error, #b91c1c);
  border-radius: var(--radius-12, 12px);
  font: var(--text-md, 400 16px/24px "DM Sans", "Segoe UI", sans-serif);
  color: var(--text, #0f172a);
}

/* ---- 1d · What this page still cannot say -------------------------------
   "What happens next" is CONTENT, and this file is a stylesheet — the PHP
   half of this module is enqueue-only by instruction. The answer already
   exists in the theme and is one line away from this page:

     inc/order-tracking.php builds the five-step timeline (Tellitud →
     Makstud → Pakitud → Teel → Kohal) and hangs it on `woocommerce_view_order`
     (:647) only. tracking.css is ALREADY enqueued on the order-received
     endpoint (inc/order-tracking.php:50), so the styling for it is on this
     page today with nothing to style.

   The exact edit is written out in the handover. Nothing in this file
   depends on it, and no dead CSS was written in anticipation of it — if the
   lead adds the hook, tracking.css dresses it, and §8 below gives it the
   right spacing whichever page it lands on. */


/* ==========================================================================
   2 · THE ORDER TABLE — thank-you AND view-order
   ==========================================================================
   Markup (WooCommerce order/order-details.php):
     table.woocommerce-table.woocommerce-table--order-details.shop_table
       thead > tr > th.product-name | th.product-total
       tbody > tr.order_item > td.product-name | td.product-total
       tfoot > tr > th (label) | td (value)     ← Vahesumma / Tarne / Kokku

   ⚠️ THIS TABLE IS NOT CONVERTED TO CARDS AND THAT IS THE DECISION, NOT AN
   OMISSION. Three reasons, in order:
     1. It carries NO `shop_table_responsive` class and NO `data-title`
        attributes, so the D8 card mechanism ("silti ei ehitata ise — core
        annab selle juba", sample:1677) has nothing to build from. Building
        labels here would mean inventing them, and the pack's own rule is
        that the label may come from exactly one place.
     2. It is TWO columns. The D8 rule exists because a six-column cart
        cannot be read on a phone; a name/price pair can, and does.
     3. CLAUDE.md Trap 11. Converting it would mean taking table, thead,
        tbody, tfoot, tr, th and td off table display together — all seven,
        never some — to buy a layout that is not better. The cheapest correct
        move was to leave the table a table and make it read well.

   On the thank-you page this table has NO theme styling at all today: every
   rule woocommerce.css:1480-1498 writes for order tables is fenced inside
   `.woocommerce-MyAccount-content`, which does not exist on that page. So
   the shopper's receipt renders in raw WooCommerce: a 5px radius, a
   `color-mix` border and 9px/12px cells. This section is what closes that.

   Specificity: core ships `.woocommerce table.shop_table` (0,2,0),
   `… th` (0,2,1), `… td` (0,2,1) and `… tfoot th` (0,2,2). Every rule below
   carries `.woocommerce .woocommerce-order-details table.shop_table…`, which
   is (0,3,1) bare, (0,3,2) with a cell element and (0,3,3) in the tfoot — so
   each one beats the core declaration it answers on SPECIFICITY, not on load
   order, which a plugin that recombines stylesheets can reorder. */

.woocommerce .woocommerce-order-details {
  margin-top: var(--space-32, 32px);
}
.woocommerce .woocommerce-order-details .woocommerce-order-details__title,
.woocommerce .woocommerce-customer-details .woocommerce-column__title {
  margin: 0 0 var(--space-16, 16px);
  font: var(--h4, 600 18px/26px "Space Grotesk", "DM Sans", system-ui, sans-serif);
  letter-spacing: var(--h4-tracking, -.005em);
  color: var(--text, #0f172a);
}

/* The shell. D4 level 0 — "sisuplokk lehel, tabeli ümbris" is a border and
   no shadow (docs/DISAIN-KOMPONENDID.md §D4). Same treatment
   woocommerce.css:1480-1485 gives the account tables, so a shopper who
   compares the thank-you page with /my-account-2/view-order/ sees one table.
   `border-collapse:separate` + `overflow:hidden` is what lets the radius
   actually clip the header row. */
.woocommerce .woocommerce-order-details table.shop_table {
  width: 100%;
  margin: 0;
  background: var(--surface, #ffffff);
  border: 1px solid var(--border, #e2e8f0);
  border-radius: var(--radius-16, 16px);
  border-collapse: separate;
  border-spacing: 0;
  overflow: hidden;
}
.woocommerce .woocommerce-order-details table.shop_table th {
  padding: var(--space-12, 12px) var(--space-16, 16px);
  text-align: left;
  background: var(--surface-muted, #f1f5f9);
  color: var(--text-muted, #475569);
  font: var(--label-sm, 600 12px/1 "DM Sans", "Segoe UI", sans-serif);
  letter-spacing: var(--label-sm-tracking, .06em);
  text-transform: uppercase;
  border-top: 0;
}
.woocommerce .woocommerce-order-details table.shop_table td {
  padding: var(--space-16, 16px);
  vertical-align: top;
  border-top: 1px solid var(--border, #e2e8f0);
  color: var(--text, #0f172a);
  font: var(--text-sm, 400 14px/20px "DM Sans", "Segoe UI", sans-serif);
}

/* The item. Name on the left, money on the right, digits aligned.
   `.product-total` is the column a shopper scans, so it is the one that gets
   tabular figures and `white-space:nowrap` — a price that wraps between the
   number and the € is the one wrap nobody forgives. */
.woocommerce .woocommerce-order-details table.shop_table td.product-name {
  font: var(--text-sm, 400 14px/20px "DM Sans", "Segoe UI", sans-serif);
  color: var(--text-muted, #475569);
}
.woocommerce .woocommerce-order-details table.shop_table td.product-name a {
  color: var(--text, #0f172a);
  font-weight: var(--fw-semibold, 600);
  text-decoration: none;
}
.woocommerce .woocommerce-order-details table.shop_table td.product-name a:hover {
  color: var(--brand, #047857);
  text-decoration: underline;
  text-underline-offset: 2px;
}
/* Core's `<strong class="product-quantity">× 2</strong>` sits inline after
   the name at full weight, where it reads as part of the product title. It
   is a count; it gets the count's voice. */
.woocommerce .woocommerce-order-details table.shop_table td.product-name .product-quantity {
  display: inline-block;
  margin-left: var(--space-4, 4px);
  color: var(--text-subtle, #64748b);
  font-weight: var(--fw-medium, 500);
  font-variant-numeric: tabular-nums;
}
.woocommerce .woocommerce-order-details table.shop_table td.product-name .wc-item-meta {
  margin: var(--space-4, 4px) 0 0;
  padding: 0;
  color: var(--text-subtle, #64748b);
  font: var(--text-xs, 400 13px/18px "DM Sans", "Segoe UI", sans-serif);
}
.woocommerce .woocommerce-order-details table.shop_table td.product-total {
  width: 1%;
  text-align: right;
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
  font-weight: var(--fw-semibold, 600);
}

/* The totals block. Core makes every tfoot cell bold
   (`.woocommerce table.shop_table tfoot th/td`, 0,2,2), which flattens
   "Vahesumma", "Tarne" and "Kokku" into one wall of bold. Only the LAST row
   is the number the shopper came for. These rules are (0,3,3). */
.woocommerce .woocommerce-order-details table.shop_table tfoot th,
.woocommerce .woocommerce-order-details table.shop_table tfoot td {
  padding: var(--space-12, 12px) var(--space-16, 16px);
  border-top: 1px solid var(--border, #e2e8f0);
  background: var(--surface-muted, #f1f5f9);
  font: var(--text-sm, 400 14px/20px "DM Sans", "Segoe UI", sans-serif);
  font-weight: var(--fw-medium, 500);
  color: var(--text-muted, #475569);
}
.woocommerce .woocommerce-order-details table.shop_table tfoot td {
  text-align: right;
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
  color: var(--text, #0f172a);
}

/* ⚠️ v1.2.102 — `tr:last-child` WAS THE WRONG TEST AND IT COULD OVERFLOW.
   The tfoot is not only the totals ladder. order-details.php appends two more
   rows AFTER it, inside the SAME tfoot:
     :103  <tr><th>Märkus:</th><td>…the shopper's own free-text note…</td></tr>
     :118  <tr><th class="order-actions--heading">Toimingud:</th><td>…buttons…</td></tr>
   Either one, when present, IS `tr:last-child`. The old rule then handed a
   whole sentence `white-space: nowrap` plus a 20px money face — a note of any
   length would have pushed the table wider than the page on a phone, which is
   checklist item 6, not a cosmetic slip. `$actions` is non-empty exactly when
   the order still needs the shopper to act, i.e. on the view-order page they
   are most likely to open.

   THE REPLACEMENT TEST. Every real totals row prints its value through
   wc_price(), which always emits `<span class="woocommerce-Price-amount
   amount">` (verified in this shop's rendered cart HTML, not assumed). The
   note row, the actions row and the method line carry no such span. So:
     "the grand total" = the last tfoot row that carries a price
                       = a row WITH a price that has no LATER sibling row
                         carrying one.
   `tr:has(td .woocommerce-Price-amount):not(:has(~ tr td .woocommerce-Price-amount))`
   says exactly that, and it stays correct when refund rows are present
   (refunds carry prices and sit before the total, so they are not last).

   SPECIFICITY. `:has()` and `:not()` each contribute their most specific
   argument, here `~ tr td .woocommerce-Price-amount` = (0,1,2):
     .woocommerce .woocommerce-order-details .shop_table  = 3 classes
     :has(td .woocommerce-Price-amount)                   = +1 class, +2 elements
     :not(:has(~ tr td .woocommerce-Price-amount))        = +1 class, +2 elements
     table tfoot tr td                                    = +4 elements
   → (0,5,8), against core's `.woocommerce table.shop_table tfoot td` (0,2,2).
   Won on specificity, not on load order.
   Without :has() support the rule is dropped and the total renders like the
   rows above it — quieter, never wrong. The de-emphasis rule below is what
   actually prevents the overflow, and it degrades the same safe way. */
.woocommerce .woocommerce-order-details table.shop_table tfoot tr:has(td .woocommerce-Price-amount):not(:has(~ tr td .woocommerce-Price-amount)) th,
.woocommerce .woocommerce-order-details table.shop_table tfoot tr:has(td .woocommerce-Price-amount):not(:has(~ tr td .woocommerce-Price-amount)) td {
  padding-top: var(--space-16, 16px);
  padding-bottom: var(--space-16, 16px);
  border-top: 2px solid var(--border-strong, #cbd5e1);
  color: var(--text, #0f172a);
}
.woocommerce .woocommerce-order-details table.shop_table tfoot tr:has(td .woocommerce-Price-amount):not(:has(~ tr td .woocommerce-Price-amount)) th {
  font: var(--label-md, 600 14px/16px "DM Sans", "Segoe UI", sans-serif);
  letter-spacing: var(--label-md-tracking, .02em);
  text-transform: uppercase;
}
.woocommerce .woocommerce-order-details table.shop_table tfoot tr:has(td .woocommerce-Price-amount):not(:has(~ tr td .woocommerce-Price-amount)) td {
  font: var(--price-md, 700 20px/24px "Space Grotesk", "DM Sans", system-ui, sans-serif);
  letter-spacing: var(--price-md-tracking, -.015em);
}

/* A tfoot row whose value is NOT a sum is prose or controls, so it loses the
   money face the block rule above gives every tfoot cell: it reads left, it
   wraps, and its digits are not forced onto a tabular grid. This is the rule
   that removes the overflow; the emphasis rule above only decides which row
   is loud. (0,4,6) — three classes, plus :not(:has(td .woocommerce-Price-amount))
   at (0,1,2), over table + tfoot + tr + td. */
.woocommerce .woocommerce-order-details table.shop_table tfoot tr:not(:has(td .woocommerce-Price-amount)) td {
  text-align: left;
  white-space: normal;
  overflow-wrap: anywhere;
  font-variant-numeric: normal;
}
/* ⛔ WHAT WAS NOT DONE HERE, AND WHY. The obvious next move is
   `tfoot tr:has(th.order-actions--heading) td { display:flex; gap:8px }` to
   lay the action buttons out properly. That is CLAUDE.md Trap 11 verbatim: a
   non-table `display` on a `<td>` makes the browser wrap it in an anonymous
   table cell, and this table is deliberately a REAL table at every width
   (see the decision at the head of §2). Half a conversion is what the trap is
   made of. The buttons are inline-flex controls already, so `text-align:left`
   plus `white-space:normal` above is enough to make them wrap and read as a
   row; the gap between them is the markup's own whitespace. */

/* Phone: the cells tighten, they do not restack (see the decision above).
   16px → 12px horizontal on a 375px screen buys 8px per row for the product
   name, which is the column that needs it. */
@media (max-width: 480px) {
  .woocommerce .woocommerce-order-details table.shop_table th,
  .woocommerce .woocommerce-order-details table.shop_table td,
  .woocommerce .woocommerce-order-details table.shop_table tfoot th,
  .woocommerce .woocommerce-order-details table.shop_table tfoot td {
    padding-left: var(--space-12, 12px);
    padding-right: var(--space-12, 12px);
  }
}

/* "Telli uuesti" — WooCommerce prints `<p class="order-again"><a class="button">`
   on a completed order. It is a secondary action next to a receipt, so it
   gets the secondary shape, not the green one. `.woocommerce .button` is
   (0,2,0); `.woocommerce .order-again .button` is (0,3,0). Height 44px =
   --tap-min, the pack's S button (D1: "S 44px · tootekaart, tabelirida"). */
.woocommerce .order-again {
  margin: var(--space-20, 20px) 0 0;
}
.woocommerce .order-again .button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: var(--tap-min, 44px);
  padding: 0 var(--space-20, 20px);
  background: var(--surface, #ffffff);
  color: var(--text, #0f172a);
  border: 1px solid var(--border-strong, #cbd5e1);
  border-radius: var(--radius-12, 12px);
  font: var(--label-md, 600 14px/16px "DM Sans", "Segoe UI", sans-serif);
  letter-spacing: var(--label-md-tracking, .02em);
}
.woocommerce .order-again .button:hover {
  background: var(--brand-a1, rgb(4 120 87 / .06));
  border-color: var(--brand-a3, rgb(4 120 87 / .20));
  color: var(--brand, #047857);
}


/* ==========================================================================
   3 · ADDRESSES ON THE ORDER — customer details
   ==========================================================================
   Markup (WooCommerce order/order-customer-details.php):
     section.woocommerce-customer-details
       section.woocommerce-columns--addresses.col2-set.addresses
         div.woocommerce-column--billing-address.col-1  > h2 + address
         div.woocommerce-column--shipping-address.col-2 > h2 + address

   Two things are wrong here today and both come from core:
     • The columns are FLOATS. `.woocommerce .col2-set .col-1 {float:left;
       width:48%}` (0,2,0) — two 48% floats with a 4% river between them and
       no equal-height relationship. The theme's grid fix for this shape
       (woocommerce.css:1376) is fenced on `:has(.woocommerce-form-register)`,
       i.e. the login page only, so it never reaches this one.
     • `address` carries core's asymmetric double border:
       `border:1px solid rgba(0,0,0,.1); border-bottom-width:2px;
       border-right-width:2px; border-radius:5px` (0,2,1) — a 2010 bevel
       that appears nowhere else in this shop.

   The column rule below is (0,3,0) and beats core's (0,2,0) outright.
   The `address` rule is the one honest exception in this file: core's
   selector is `.woocommerce .woocommerce-customer-details address`, which is
   (0,2,1) — the same shape mine would be. It is therefore written TWICE:
   once qualified with the real element (`section.woocommerce-customer-details`
   → (0,2,2), decisive) and once plain (→ (0,2,1), a tie that this file wins on
   load order). WooCommerce's order-customer-details.php does emit a
   `<section>`; the plain selector is the fallback for the day it does not.
   Specificity is computed per selector, so the pair genuinely covers both.

   Mobile first: one column, stacked. Two columns from 640px, where 2×~300px
   is still readable. */
.woocommerce .woocommerce-customer-details {
  margin-top: var(--space-32, 32px);
}
.woocommerce .woocommerce-customer-details .woocommerce-columns--addresses {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--space-16, 16px);
}
/* Kill the floats. Stated as a pair because core sets left/right separately,
   and `width:auto` has to be said too — a floated 48% that stops floating is
   still 48% wide. */
.woocommerce .woocommerce-customer-details .woocommerce-columns--addresses > .col-1,
.woocommerce .woocommerce-customer-details .woocommerce-columns--addresses > .col-2 {
  float: none;
  width: auto;
}
/* ⚠️ v1.2.102 — the radius here was --radius-12 and it was the odd one out.
   The thank-you page stacks four blocks of the SAME width, one under the
   other, and three of them already round at 16px: the overview card
   (woocommerce.css:1313, --radius-lg → --radius-16), the order table (§2) and
   — from this release — the pickup block below. A 12px corner in the middle of
   that column is exactly the "two boxes side by side with different corners"
   the polish pass exists to remove. 16px is also the token's own role for this
   size of box (tokens.css:231 "tootekaart, paneel"); 12px is the button and
   form-field step. */
.woocommerce section.woocommerce-customer-details address,
.woocommerce .woocommerce-customer-details address {
  padding: var(--space-16, 16px);
  background: var(--surface, #ffffff);
  border: 1px solid var(--border, #e2e8f0);
  border-radius: var(--radius-16, 16px);
  font: var(--text-sm, 400 14px/20px "DM Sans", "Segoe UI", sans-serif);
  font-style: normal;
  color: var(--text-muted, #475569);
}
@media (min-width: 640px) {
  .woocommerce .woocommerce-customer-details .woocommerce-columns--addresses {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--space-20, 20px);
  }
}

/* The theme's own pickup-point block (inc/pickup-points.php:498 renders it on
   `woocommerce_order_details_after_order_table`, i.e. between the table and
   the addresses on BOTH the thank-you page and view-order). It has a heading
   and a value and no surface of its own; given one, the three sections on
   this page read as three sections. Fenced on the theme's class, so it can
   only ever match markup this theme emitted. */
.woocommerce .og-pickup-order {
  margin-top: var(--space-24, 24px);
  padding: var(--space-16, 16px) var(--space-20, 20px);
  background: var(--surface-muted, #f1f5f9);
  border-radius: var(--radius-16, 16px); /* v1.2.102 — see the note at `address` above. */
}
.woocommerce .og-pickup-order .og-pickup-order__title {
  margin: 0 0 var(--space-4, 4px);
  font: var(--label-sm, 600 12px/1 "DM Sans", "Segoe UI", sans-serif);
  letter-spacing: var(--label-sm-tracking, .06em);
  text-transform: uppercase;
  color: var(--text-subtle, #64748b);
}
.woocommerce .og-pickup-order .og-pickup-order__value {
  margin: 0;
  font: var(--text-md, 400 16px/24px "DM Sans", "Segoe UI", sans-serif);
  font-weight: var(--fw-semibold, 600);
  color: var(--text, #0f172a);
}


/* ==========================================================================
   4 · MINU KONTO — THE NAVIGATION
   ==========================================================================
   woocommerce.css:1447-1456 already gives this list a white card with
   rounded rows and a green active state, so it is not unstyled. Three real
   defects remain, and one of them is a token violation:

   a) On a phone the nav is a SEVEN-ROW STACK above the content. At ~45px a
      row that is ~315px of chrome before the shopper reaches the thing they
      came for. Two columns halves it to four rows / ~180px. The breakpoint
      is 900px because that is exactly where woocommerce.css:1331 and :1345
      turn the account into a 260px sidebar — one number, two files, so the
      grid never disagrees with the column it lives in.
   b) The row height is 44px only by accident (12px + 12px padding plus a
      1.5 line-height on 14px type). Stated explicitly it survives a type
      change. Pack: --tap-min, "iga vajutatav asi ≥ 44×44".
   c) woocommerce.css:1454 paints the active row `rgb(4 120 87 / .10)` —
      #059669, the green tokens.css:10 says out loud does not exist any more
      ("#059669 on siit kustutatud"). --brand-a2 is the role for exactly this
      ("teisese nupu hover, kiip"). The visible difference is small (a
      slightly deeper, slightly less blue tint); the point is that the shop
      stops carrying two greens.

   Specificity: woocommerce.css:1451/1453 are `.woocommerce-MyAccount-navigation
   li a` (0,1,2) and `… li.is-active a` (0,2,2). Every rule below is prefixed
   with `.woocommerce-account`, giving (0,2,2) and (0,3,2). That body class is
   not left to WooCommerce — inc/woocommerce.php:491 force-adds it whenever the
   page really is the account, which is why it is safe to lean on here (Trap 9).
   Verified present in the live HTML, 2026-08-14. */

.woocommerce-account .woocommerce-MyAccount-navigation ul {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-4, 4px);
}
/* ⚠️ VISIBLE: the label drops from the inherited 16px to --label-md's 14px,
   which is the pack's role for a navigational label (D1/D5 use --label-md for
   exactly this). It is also what keeps two columns safe at 320px: inside a
   ~140px cell, "Allalaadimised" measures roughly 106px at 14px semibold and
   roughly 121px at 16px — the second wraps to two lines. Those two numbers
   are ESTIMATED from character count, not measured (§9); if the label wraps
   on a real 320px device the honest fix is one column below 380px, not a
   smaller type step. The 44px tap target is stated separately and does not
   depend on the type size either way. */
.woocommerce-account .woocommerce-MyAccount-navigation li a {
  display: flex;
  align-items: center;
  min-height: var(--tap-min, 44px);
  padding: var(--space-8, 8px) var(--space-12, 12px);
  border-radius: var(--radius-12, 12px);
  font: var(--label-md, 600 14px/16px "DM Sans", "Segoe UI", sans-serif);
  letter-spacing: var(--label-md-tracking, .02em);
  color: var(--text-muted, #475569);
  transition: background-color var(--dur, 200ms) var(--ease, cubic-bezier(.2, .6, .3, 1)),
              color var(--dur, 200ms) var(--ease, cubic-bezier(.2, .6, .3, 1));
}
.woocommerce-account .woocommerce-MyAccount-navigation li a:hover {
  background: var(--brand-a1, rgb(4 120 87 / .06));
  color: var(--brand, #047857);
}
/* The pack's one focus recipe. a11y.css:34-47 already draws a ring on every
   focusable element inside `.a11y-ready`; this states the token recipe on the
   element that most needs it and is harmless where a11y.css also fires — both
   draw a ring in --brand, and the later one wins with the same intent. */
.woocommerce-account .woocommerce-MyAccount-navigation li a:focus-visible {
  outline: none;
  box-shadow: var(--focus-ring, 0 0 0 2px #ffffff, 0 0 0 5px #047857);
}
/* ⚠️ `font-weight` is RESTATED here and it is not redundant. woocommerce.css:
   1455 gives the active row `font-weight: 700` at (0,2,2) — the same weight as
   the `li a` rule above, which carries a `font:` SHORTHAND and therefore resets
   font-weight to --label-md's 600. Equal specificity, later source: without
   this line the active row would silently lose its bold, and the diff would
   only say "added a file". `box-shadow: inset 3px 0 0 var(--green)` from that
   same rule is deliberately NOT restated — nothing here touches box-shadow on
   this element, so the green edge bar survives untouched. */
.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a {
  background: var(--brand-a2, rgb(4 120 87 / .12));
  color: var(--brand, #047857);
  font-weight: var(--fw-bold, 700);
}
/* "Logi välja" is the one destructive-ish row and it is always last. On an
   odd-numbered menu it would sit alone in the left column with a hole beside
   it; spanning it closes the hole and separates it from the navigation
   proper, which is what it is. */
.woocommerce-account .woocommerce-MyAccount-navigation li.woocommerce-MyAccount-navigation-link--customer-logout {
  grid-column: 1 / -1;
}
.woocommerce-account .woocommerce-MyAccount-navigation li.woocommerce-MyAccount-navigation-link--customer-logout a {
  color: var(--text-subtle, #64748b);
}

@media (min-width: 900px) {
  /* Sidebar width — back to one column, the way a sidebar reads, and back to
     woocommerce.css:1451's roomier row padding now that there is room. */
  .woocommerce-account .woocommerce-MyAccount-navigation ul {
    grid-template-columns: minmax(0, 1fr);
  }
  .woocommerce-account .woocommerce-MyAccount-navigation li a {
    padding: var(--space-12, 12px) var(--space-16, 16px);
  }
}


/* ==========================================================================
   5 · MINU KONTO — CONTENT
   ========================================================================== */

/* ---- 5a · The lead line --------------------------------------------------
   Two account views open with a bare paragraph and nothing else:
     dashboard  → "Tere NIMI (kas sa ei ole NIMI? Logi välja)"
     view-order → "Tellimus #123 esitati 14.08.2026 ja on hetkel Töötlemisel."
   Both are the sentence that orients the shopper, and both render at body
   size with no distinction from the content under them.
   woocommerce.css:1460 already selects exactly this element to zero its top
   margin — (0,1,1) — so this rule at (0,2,1) extends an existing hook rather
   than inventing one. On endpoints that open with a table or a notice, the
   selector simply matches nothing. */
.woocommerce-account .woocommerce-MyAccount-content > p:first-child {
  margin: 0 0 var(--space-20, 20px);
  font: var(--text-md, 400 16px/24px "DM Sans", "Segoe UI", sans-serif);
  color: var(--text-muted, #475569);
}

/* Order notes — `<ol class="woocommerce-OrderUpdates commentlist notes">` on
   view-order, one `<li class="comment note">` per update the shop wrote. This
   is the closest thing the shop has to a human speaking to the buyer after
   the sale, and core leaves it as an unstyled list. A quiet left rule and a
   muted meta line is the whole treatment; there is no data here worth a card.
   Fenced on the WooCommerce class, so it cannot reach the product reviews'
   `.commentlist`, which shares the second class. */
.woocommerce-account .woocommerce-OrderUpdates {
  margin: 0 0 var(--space-24, 24px);
  padding: 0;
  list-style: none;
}
.woocommerce-account .woocommerce-OrderUpdates li.note {
  margin: 0 0 var(--space-12, 12px);
  padding: var(--space-12, 12px) 0 var(--space-12, 12px) var(--space-16, 16px);
  border-left: 2px solid var(--border, #e2e8f0);
}
.woocommerce-account .woocommerce-OrderUpdates li.note:last-child {
  margin-bottom: 0;
}
.woocommerce-account .woocommerce-OrderUpdates li.note .meta {
  margin: 0 0 var(--space-4, 4px);
  font: var(--label-sm, 600 12px/1 "DM Sans", "Segoe UI", sans-serif);
  letter-spacing: var(--label-sm-tracking, .06em);
  text-transform: uppercase;
  color: var(--text-subtle, #64748b);
}
.woocommerce-account .woocommerce-OrderUpdates li.note .description p:last-child {
  margin-bottom: 0;
}

/* Address book — woocommerce.css:1470-1475 already cards these. The one gap
   is the "muuda" link, which is a plain text link where the pack expects a
   44px control. (0,4,1) against nothing; stated for the tap target only. */
.woocommerce-account .woocommerce-Addresses .woocommerce-Address-title a {
  display: inline-flex;
  align-items: center;
  min-height: var(--tap-min, 44px);
  font-weight: var(--fw-semibold, 600);
}

/* ---- 5b · THE ORDERS TABLE ON A PHONE ------------------------------------
   ==========================================================================
   ⚠️ CLAUDE.md TRAP 11 — THE HALF CONVERSION.

   woocommerce.css:1503-1523 turns the account's responsive tables into cards
   below 768px: `thead {display:none}`, `tr {display:block}`,
   `td {display:flex}` — but it leaves `table` and `tbody` on table display.
   That is HALF the conversion, and it is exactly the shape the trap
   describes: a block-level `tr` inside a `table-row-group` is wrapped by the
   browser in an anonymous table-ROW, and the block inside that is wrapped in
   an anonymous table-CELL. Every card in the list is therefore, structurally,
   the sole cell of column 1 of a one-column table.

   IT RENDERS CORRECTLY TODAY. The table is `width:100%` and the anonymous
   column is the only column, so it takes the full width and nothing looks
   wrong. That is precisely why this is worth fixing rather than leaving: the
   defect is invisible until a min-content width somewhere exceeds the
   viewport, and then it presents as an unrelated column blowing up — the
   symptom v1.2.63 spent a release chasing in the cart.

   The fix is the one woocommerce.css:1826-1835 already made for the checkout
   summary, and the header of that block says why: "take the WHOLE table off
   table display, so no anonymous cell can be generated. Never half."
   `thead` stays `display:none` — a box that is not generated cannot generate
   an anonymous wrapper either, so hiding it completes the conversion rather
   than breaking it. `tfoot` is listed although these two tables have none:
   if a plugin ever adds one, the conversion stays whole by default.

   Specificity: woocommerce.css:1504 is
   `.woocommerce-MyAccount-content table.shop_table_responsive` (0,2,1).
   Adding `.woocommerce-account` gives (0,3,1) — decisive, not order-dependent.
   ========================================================================== */
@media (max-width: 768px) {
  .woocommerce-account .woocommerce-MyAccount-content table.shop_table_responsive,
  .woocommerce-account .woocommerce-MyAccount-content table.shop_table_responsive tbody,
  .woocommerce-account .woocommerce-MyAccount-content table.shop_table_responsive tfoot {
    display: block;
    width: 100%;
  }
  .woocommerce-account .woocommerce-MyAccount-content table.shop_table_responsive thead {
    display: none;
  }

  /* Core's zebra. `.woocommerce table.shop_table_responsive tr:nth-child(2n) td`
     (woocommerce-smallscreen.css, 0,3,2) paints every second row
     rgba(0,0,0,.025). On a plain table that is a stripe; on the theme's CARD
     treatment it makes every second ORDER look greyed out, i.e. inactive.
     (0,4,2) beats it. */
  .woocommerce-account .woocommerce-MyAccount-content table.shop_table_responsive tr:nth-child(2n) td {
    background-color: transparent;
  }

  /* The card itself. woocommerce.css:1506-1508 already gives it a border, a
     radius and --shadow-card; this only raises the radius onto the panel step
     (--radius-16, tokens.css:231 "tootekaart, paneel") so an order card and a
     product card have the same corner. */
  .woocommerce-account .woocommerce-MyAccount-content table.shop_table_responsive tr {
    border-radius: var(--radius-16, 16px);
    overflow: hidden;
  }

  /* The label. Core writes `content: attr(data-title) ": "` at font-weight 700
     with `float:left`; woocommerce.css:1515-1518 restyles it. The float is
     inert (a flex item ignores float) and the content is CORE'S — this file
     does not write a second label anywhere, which is the pack's one hard rule
     for tables ("Silt tohib tulla ainult ühest kohast", sample:1677).
     What is added is a CEILING, not a style: `flex: 0 0 auto` (set at
     woocommerce.css:1517) means a long label — "Allalaadimisi jäänud" in the
     downloads table — refuses to shrink and can starve the value beside it to
     nothing. `max-width: 45%` lets it wrap instead. Nothing here changes what
     the label says or where it comes from. */
  .woocommerce-account .woocommerce-MyAccount-content table.shop_table_responsive td::before {
    max-width: 45%;
  }

  /* ⚠️ The ONE place a label is removed. WooCommerce's orders table defines
     its actions column with the label '&nbsp;' (wc_get_account_orders_columns),
     so `data-title` is a non-breaking space and core's pseudo-element renders
     a bare " : " above the button. Removing it is the second half of the same
     rule: where the label is meaningless, it comes from nowhere. */
  .woocommerce-account .woocommerce-MyAccount-content table.shop_table_responsive td.woocommerce-orders-table__cell-order-actions::before {
    content: none;
  }

  /* The action is the only control on the card; on a phone it gets the full
     width and the pack's S height. woocommerce.css:1523 sets 40px, which is
     under --tap-min. (0,5,2) against that rule's (0,3,2). */
  .woocommerce-account .woocommerce-MyAccount-content table.shop_table_responsive td.woocommerce-orders-table__cell-order-actions {
    padding-top: var(--space-12, 12px);
    padding-bottom: var(--space-12, 12px);
  }
  .woocommerce-account .woocommerce-MyAccount-content table.shop_table_responsive td.woocommerce-orders-table__cell-order-actions .button {
    flex: 1 1 auto;
    justify-content: center;
    min-height: var(--tap-min, 44px);
    margin: 0;
  }

  /* Money and order numbers line up. */
  .woocommerce-account .woocommerce-MyAccount-content table.shop_table_responsive td.woocommerce-orders-table__cell-order-total,
  .woocommerce-account .woocommerce-MyAccount-content table.shop_table_responsive td.woocommerce-orders-table__cell-order-number {
    font-variant-numeric: tabular-nums;
  }
}

/* Desktop rows. woocommerce.css:1497 gives the row button `min-height:38px`;
   D1 puts a table-row button at S = 44px ("S 44px · tootekaart, tabelirida",
   docs/DISAIN-KOMPONENDID.md §D1). ⚠️ VISIBLE CHANGE on /my-account-2/orders/
   at ≥769px: each row grows by 6px.
   (0,4,1) against woocommerce.css:1495-1498's (0,3,1). */
@media (min-width: 769px) {
  .woocommerce-account .woocommerce-orders-table td.woocommerce-orders-table__cell-order-actions .button,
  .woocommerce-account .woocommerce-table--order-downloads td.download-actions .button {
    min-height: var(--tap-min, 44px);
  }
  .woocommerce-account .woocommerce-orders-table td.woocommerce-orders-table__cell-order-total,
  .woocommerce-account .woocommerce-orders-table td.woocommerce-orders-table__cell-order-number {
    font-variant-numeric: tabular-nums;
  }
}


/* ==========================================================================
   6 · ORDER STATUS — ONE STATE LANGUAGE
   ==========================================================================
   WooCommerce puts the status on the ROW, not on the cell:
     tr.woocommerce-orders-table__row--status-processing
   and prints the human name into
     td.woocommerce-orders-table__cell-order-status.
   That row class is the only hook needed, and it is the reason this section
   can exist in a stylesheet at all.

   THE MAPPING. Six statuses, six ROLES, no new values — every colour below
   is a tokens.css state token, and each one matches the equivalent step of
   the tracking timeline (tracking.css:76-81) so the badge on
   /my-account-2/orders/ and the badge on the order page say the same thing
   in the same colour.

     pending    Makse ootel   --state-warning  #b45309  something is owed
     on-hold    Ootel         --state-warning  #b45309  same, from our side
     processing Töötlemisel   --state-info     #0369a1  in motion
     completed  Lõpetatud     --brand          #047857  done
     cancelled  Tühistatud    --state-error    #b91c1c  it will not happen
     failed     Nurjunud      --state-error    #b91c1c
     refunded   Tagastatud    --state-oos      #475569  neutral, not an error

   `refunded` is deliberately NOT red. tokens.css:43 makes the argument for
   the out-of-stock badge and it holds here: a completed refund is a resolved
   state, not a fault, and painting it the same red as a failed payment tells
   the shopper something untrue.

   ⚠️ COLOUR IS NOT THE ONLY CARRIER, so WCAG 1.4.1 is satisfied without a
   second cue: the cell's own text IS the status name in words ("Töötlemisel",
   "Lõpetatud"). The colour and the dot are reinforcement. This also means the
   whole section degrades safely in forced-colours mode, where neither
   survives.

   ⚠️ WHY THIS IS NOT A PILL. A pill needs an element and WooCommerce prints
   the status as a bare text node in the cell — there is nothing to wrap, and
   giving the `<td>` a non-table display to shrink-wrap it is Trap 11 with
   extra steps. So: a dot plus colour where the table is a table, and a tinted
   row where the table is already cards. Same language, two materials.
   Making it a real chip is a one-line PHP change and it is written out in the
   handover.

   Specificity: `tr.…--status-x td.…-order-status` = (0,2,2), which beats
   woocommerce.css:1490's `.woocommerce-orders-table .…-order-status` (0,2,0)
   — every one of these rules is a colour the current rule sets to
   --slate-dark, so beating it is required, not decorative. */

.woocommerce-orders-table__row--status-pending td.woocommerce-orders-table__cell-order-status,
.woocommerce-orders-table__row--status-on-hold td.woocommerce-orders-table__cell-order-status {
  color: var(--state-warning, #b45309);
}
.woocommerce-orders-table__row--status-processing td.woocommerce-orders-table__cell-order-status {
  color: var(--state-info, #0369a1);
}
.woocommerce-orders-table__row--status-completed td.woocommerce-orders-table__cell-order-status {
  color: var(--brand, #047857);
}
.woocommerce-orders-table__row--status-cancelled td.woocommerce-orders-table__cell-order-status,
.woocommerce-orders-table__row--status-failed td.woocommerce-orders-table__cell-order-status {
  color: var(--state-error, #b91c1c);
}
.woocommerce-orders-table__row--status-refunded td.woocommerce-orders-table__cell-order-status {
  color: var(--state-oos, #475569);
}
.woocommerce-orders-table td.woocommerce-orders-table__cell-order-status {
  font-weight: var(--fw-semibold, 600);
}

/* DESKTOP — the dot. `td::before` is completely free above 768px: WooCommerce
   enqueues woocommerce-smallscreen.css with `media="only screen and
   (max-width:768px)"`, so core's `content:attr(data-title)` cannot exist here,
   and woocommerce.css:1515 is inside a max-width:768px block too. Verified by
   reading both sheets, not assumed.
   The dot is the same 8px `background:currentColor` disc
   `.ostu-track__badge::before` uses (tracking.css:73-75) — one idiom, two
   surfaces. 769px is the exact complement of core's breakpoint; a viewport
   between 768 and 769 gets neither the label nor the dot, which is harmless. */
@media (min-width: 769px) {
  .woocommerce-orders-table td.woocommerce-orders-table__cell-order-status::before {
    content: "";
    display: inline-block;
    width: 8px;
    height: 8px;
    margin-right: var(--space-8, 8px);
    border-radius: var(--radius-circle, 50%);
    background: currentColor;
    vertical-align: middle;
  }
}

/* PHONE — the tinted row. Below 768px the table is cards (§5b) and the status
   cell is a flex row inside one, so it can carry a surface honestly: no
   anonymous cell can be generated because the whole table is off table
   display by then.

   ⚠️ ONLY TWO STATES GET A COLOURED TINT and that is pack rule 1, not an
   oversight: tokens.css ships alpha ladders for exactly two hues, --brand-a*
   and --danger-a*. There is no --info-a1 or --warning-a1, and inventing
   `rgb(3 105 161 / .06)` here would be adding a VALUE where the pack says to
   add a ROLE ("Uut väärtust ei lisata"). So: completed gets --brand-a1,
   cancelled and failed get --danger-a1, and every other status gets the
   neutral --surface-muted wash — which is opaque, not 6%, and is the pack's
   own "süvend" (a quiet block inside a surface, D4). The text colour above
   carries the state in all seven cases either way.
   (0,4,2) against woocommerce.css:1510's (0,2,1). */
@media (max-width: 768px) {
  .woocommerce-account .woocommerce-MyAccount-content table.shop_table_responsive td.woocommerce-orders-table__cell-order-status {
    background: var(--surface-muted, #f1f5f9);
  }
  .woocommerce-account .woocommerce-MyAccount-content table.shop_table_responsive tr.woocommerce-orders-table__row--status-completed td.woocommerce-orders-table__cell-order-status {
    background: var(--brand-a1, rgb(4 120 87 / .06));
  }
  .woocommerce-account .woocommerce-MyAccount-content table.shop_table_responsive tr.woocommerce-orders-table__row--status-cancelled td.woocommerce-orders-table__cell-order-status,
  .woocommerce-account .woocommerce-MyAccount-content table.shop_table_responsive tr.woocommerce-orders-table__row--status-failed td.woocommerce-orders-table__cell-order-status {
    background: var(--danger-a1, rgb(185 28 28 / .06));
  }
}


/* ==========================================================================
   7 · THE WAY OUT WHEN THERE IS NOTHING
   ==========================================================================
   WooCommerce's empty orders / downloads views are one box:

     <div class="woocommerce-message woocommerce-info …">
       <a class="woocommerce-Button button" href="/pood/">Sirvi tooteid</a>
       Sul ei ole veel ühtegi tellimust.
     </div>

   which core paints as a grey bar with a blue #1e85be glyph and
   `.woocommerce-info .button {float:right}` — so the ONE action on the page
   is a small dark chip wedged into the right edge of a notice, above a
   sentence that reads like an error. A shopper who has never ordered lands
   here from the header account link. It is the cheapest dead end in the shop.

   What it becomes: the fifth member of the empty-state family
   (assets/css/empty-states.css). Same drawing size, same 20px drop to the
   text, same single way out promoted to the green primary — matching the
   empty CART exactly (woocommerce.css:1110-1114), because "you have not
   bought anything yet" and "your cart is empty" are the same sentence at two
   moments and must not be two designs.

   THE DRAWING is assets/img/illustrations/empty-cart.svg, delivered as a
   background-image on ::before — the same route empty-states.css:187-194
   uses for search and 404, and for the same reason: the markup belongs to a
   template this module must not edit. It is decorative; the heading beside
   it says the same thing in words, so being invisible to assistive
   technology is correct rather than a compromise. The url() is relative to
   THIS file: assets/css/ → ../img/illustrations/.

   ⚠️ THE FENCE, and why it uses :has().
   `.woocommerce-MyAccount-content > .woocommerce-info` alone would also catch
   any genuine info NOTICE that a template prints into the content panel, and
   turning "palun logi sisse" into a centred illustration would be worse than
   doing nothing. The empty states are the only ones that CONTAIN the way out,
   so `:has(> .button)` is the exact test. Browsers without :has() drop the
   rule and get today's grey bar — the failure mode is "no new styling", never
   "styling in the wrong place" (same reasoning as empty-states.css:92).

   ⚠️ NO CARD, ON PURPOSE. `.woocommerce-MyAccount-content` is ALREADY a white
   bordered panel with --shadow-card (woocommerce.css:1459), so giving the
   empty state its own surface would put a card inside a card — two borders,
   two radii, 24px of dead space between them. D4's ladder has three rungs and
   this is not a fourth: the panel is the surface, the empty state is content
   in it. So this rule REMOVES core's border and background rather than
   replacing them, and the measure (46ch) is the only frame — the same 46ch
   the empty cart's lead line uses at woocommerce.css:1102, so the two empty
   states wrap at the same place.

   Specificity: `:has()` contributes its most specific argument, so
   `.woocommerce-MyAccount-content > .woocommerce-info:has(> .button)` is
   (0,3,0). It must beat, and does beat:
     core   `.woocommerce-error,.woocommerce-info,.woocommerce-message` (0,1,0)
     core   `.woocommerce-info::before`                                 (0,1,0)
     theme  woocommerce.css:1529-1531                                   (0,1,0)
   and the button rule below is (0,4,0) against core's
   `.woocommerce-info .button` (0,2,0).

   ⚠️ Toggle interaction, stated plainly: the other four empty states are
   switched by `show_empty_illustrations` (inc/empty-states.php). This fifth
   one is switched by `show_account_polish`. Turning the first off does not
   turn this off. Named in the handover so the owner is not surprised. */

/* ⚠️ WHY A FLEX COLUMN AND NOT A BLOCK. Core prints the button BEFORE the
   sentence, so a plain block reads drawing / button / sentence. The sentence
   is a bare TEXT NODE — there is nothing to select and re-order. In a flex
   container that text node becomes an anonymous flex item, which takes the
   initial `order: 0` and cannot be addressed by a selector; the button CAN be
   addressed, and `order: 1` sorts it after every order-0 item. That is the
   whole trick, and it is the only place in this file that leans on anonymous
   boxes. Unlike Trap 11 these are anonymous FLEX items: they are laid out
   where they stand and generate no column of their own, so nothing can be
   pulled into a phantom first column. */
.woocommerce-MyAccount-content > .woocommerce-info:has(> .button) {
  display: flex;
  flex-direction: column;
  align-items: center;
  max-width: 46ch;
  margin: 0 auto;
  padding: var(--space-24, 24px) 0 var(--space-32, 32px);
  text-align: center;
  background: none;
  border: 0;
  border-radius: 0;
  font: var(--text-md, 400 16px/24px "DM Sans", "Segoe UI", sans-serif);
  color: var(--text-muted, #475569);
}
/* Core's glyph becomes the drawing. `font-family` and `position` are restated
   because core sets both on this pseudo-element (`font-family:WooCommerce;
   position:absolute; top:1em; left:1.5em`) and an absolutely positioned
   background box would sit in the corner instead of above the text. */
.woocommerce-MyAccount-content > .woocommerce-info:has(> .button)::before {
  content: "";
  position: static;
  display: block;
  width: clamp(104px, 26vw, 136px);
  height: clamp(104px, 26vw, 136px);
  margin: 0 auto var(--space-20, 20px);
  font-family: inherit;
  background: url("../img/illustrations/empty-cart.svg") center / contain no-repeat;
}
/* Core adds `::after {content:" "; display:table; clear:both}` to clear its
   own float. With the float gone it is an empty box at the end of a centred
   card; removing it removes the stray gap under the button. */
.woocommerce-MyAccount-content > .woocommerce-info:has(> .button)::after {
  content: none;
}
/* The one action, promoted to the green primary — the same shape, height and
   weight woocommerce.css:1111-1114 gives the empty cart's "Sirvi tooteid",
   because "your cart is empty" and "you have not ordered yet" must not be two
   designs. `order: 1` is what puts it under the sentence (see above).
   No !important here: (0,4,0) already beats `.woocommerce .button` (0,2,0),
   and an !important in a file that loads this late is a debt, not a guard.
   52px is the pack's M button (D1: "M 52px · tootelehel, vormid"), which is
   the height the empty cart already uses for the same action. */
.woocommerce-MyAccount-content > .woocommerce-info:has(> .button) > .button {
  order: 1;
  float: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 52px;
  margin: var(--space-20, 20px) 0 0;
  padding: 0 30px;
  background: var(--brand, #047857);
  color: var(--text-on-brand, #ffffff);
  border-radius: var(--radius-12, 12px);
  font-weight: var(--fw-bold, 700);
  box-shadow: var(--glow-brand-sm, 0 1px 3px rgb(4 120 87 / .20));
}
.woocommerce-MyAccount-content > .woocommerce-info:has(> .button) > .button:hover {
  background: var(--brand-hover, #035e43);
}


/* ==========================================================================
   8 · THE TRACKING PANEL, WHEREVER IT LANDS
   ==========================================================================
   inc/order-tracking.php renders `.ostu-track` on `woocommerce_view_order`
   (:647), which puts it as a direct child of `.woocommerce-MyAccount-content`
   — NOT inside `.woocommerce-order-details`. tracking.css:207-208 spaces it
   with `.woocommerce-order-details .ostu-track` and `.woocommerce-view-order
   .ostu-track`; the second of those does match (WooCommerce adds a
   `woocommerce-{endpoint}` body class — confirmed on the live site, which
   carries `woocommerce-lost-password` on the lost-password page), so this is
   belt-and-braces rather than a repair.

   It is written as a `:last-child`-aware pair so the margin cannot double up
   with tracking.css's, and so the panel is spaced correctly if the lead adds
   the thank-you hook described in §1d. */
.woocommerce-MyAccount-content > .ostu-track,
.woocommerce-order > .ostu-track {
  margin-bottom: var(--space-32, 32px);
}
.woocommerce-MyAccount-content > .ostu-track:last-child,
.woocommerce-order > .ostu-track:last-child {
  margin-bottom: 0;
}


/* ==========================================================================
   9 · WHAT COULD NOT BE VERIFIED — read this before trusting a number
   ==========================================================================
   No browser and no real order were available in the session that wrote
   sections 1-8. (Sections 10-13 were added later; their own confession is
   §13, and it does not cancel this one.)

   1. NOT ONE COMPUTED VALUE WAS READ. Every specificity number above is
      arithmetic. CLAUDE.md Trap 1's second instance is exactly the case
      where a rule looked live in DevTools and was not applying, because a
      plugin stylesheet won — so the account nav, the orders table and the
      thank-you page must be looked at on a real device at 375 / 768 / 1280.
   2. THE THANK-YOU PAGE WAS NEVER SEEN. Its markup here is WooCommerce's
      thankyou.php / order-details.php / order-details-customer.php as
      shipped. Placing an order was not possible. Every selector degrades to
      matching nothing if a class differs.
      (The third filename read `order-customer-details.php` until v1.2.102;
      the file this install ships is templates/order/order-details-customer.php.
      The class names quoted from it in §3 were checked against it and are
      right — only the filename was wrong.)
   3. THE ORDERS TABLE WAS NEVER SEEN WITH ORDERS IN IT. The live account
      page was fetched logged-OUT (login + register only). The row status
      classes, `data-title="&nbsp;"` on the actions column and core's zebra
      are read from WooCommerce's own templates and stylesheet, not from this
      shop's rendered HTML.
   4. THE PUBLIC TRACKING PAGE DOES NOT EXIST. `[ostugrupp_tracking]` is
      published on no page of ostugrupp.ee — checked against the live page
      list on 2026-08-14. The timeline therefore only ever renders on
      /my-account-2/view-order/, for a logged-in customer. Flagged for the
      owner; nothing in this file depends on it.
   5. FORCED COLOURS was not tested. §6 is designed to lose nothing there
      because the status word carries the meaning; the dot and the tint are
      reinforcement only.
   ========================================================================== */


/* ==========================================================================
   10 · MINU KONTO — THE VIEWS THAT WERE NEVER OPENED   (v1.2.102)
   ==========================================================================
   §9 above says the account was only ever fetched LOGGED OUT. This section is
   what reading WooCommerce's own account templates against the stylesheets
   this page actually loads turned up. Every markup fact below is quoted from
   the template files shipped with the WooCommerce in this install, under
   plugins/woocommerce/templates/myaccount/ — not remembered.

   The seven defects (10a-10g) are all the same shape: a rule written for
   markup WooCommerce has since changed, or a core rule nobody noticed
   winning.

   ⚠️ NOTE ON THIS COMMENT AND EVERY OTHER ONE IN THE FILE: a CSS comment ends
   at the FIRST closing marker and does not nest (CLAUDE.md's own v1.2.98
   lesson — that is how parked code reached live). No path written below ever
   ends in a bare asterisk for that reason; a glob is written as a trailing
   slash instead.
   ========================================================================== */

/* ---- 10a · Block titles: the h3 that became an h2 ------------------------
   woocommerce.css:1478 says
     .woocommerce-Addresses .woocommerce-Address-title h3 { font-size: 16px }
   and my-address.php (template @version 9.3.0) emits
     <header class="woocommerce-Address-title title"><h2>Arve aadress</h2>…
   an h2. The rule has matched nothing since that template bumped, and the
   same is true of two more headings nobody gave a size to:
     form-edit-address.php  <form …><h2>Arve aadress</h2>
     view-order.php         <h2>Tellimuse uuendused</h2>

   What they get instead is type-rhythm.css:205,
     :where(body:not(…)) h2 { font-size: var(--fs-h2, clamp(24px,3.2vw,32px)) }
   at (0,0,1) — the only font-size rule in the theme that reaches a bare h2.
   So a card title inside a 20px-padded address box renders at 24px on a
   375px phone and 32px from ~1000px up, next to 14px body copy. That is the
   loudest thing on the page and it is a label.

   Two sizes, not one, because these are two different jobs:
     view / form title  → --h4 18px, the SAME size §2 gives
                          .woocommerce-order-details__title, so every block
                          title in the after-sale area is one size;
     address CARD title → 16px, which is the size woocommerce.css:1478 asked
                          for and could not deliver.
   Specificity, counted per selector — two classes plus one element, two
   classes plus two elements, three classes plus one element:
     (0,2,1), (0,2,2) and (0,3,1), against type-rhythm.css's (0,0,1).
   Not close. */
.woocommerce-account .woocommerce-MyAccount-content > h2,
.woocommerce-account .woocommerce-MyAccount-content > form > h2 {
  margin: 0 0 var(--space-16, 16px);
  font: var(--h4, 600 18px/26px "Space Grotesk", "DM Sans", system-ui, sans-serif);
  letter-spacing: var(--h4-tracking, -.005em);
  color: var(--text, #0f172a);
}
/* Longhands, not the `font:` shorthand: the shorthand would reset family and
   weight and then need both restated, which is how a heading quietly loses its
   display face (the same trap §4 documents at the active nav row). */
.woocommerce-account .woocommerce-Addresses .woocommerce-Address-title h2 {
  margin: 0;
  font-family: var(--font-display, "Space Grotesk", "DM Sans", system-ui, sans-serif);
  font-size: var(--fs-md, 16px);
  line-height: var(--lh-md, 24px);
  font-weight: var(--fw-semibold, 600);
  letter-spacing: var(--h4-tracking, -.005em);
  color: var(--text, #0f172a);
}

/* ---- 10b · The three yellow blobs on view-order --------------------------
   view-order.php builds its lead sentence with three <mark> elements:
     Tellimus <mark class="order-number">#123</mark> esitati
     <mark class="order-date">15.08.2026</mark> ja on hetkel
     <mark class="order-status">Töötlemisel</mark>.
   Nothing styles a bare `mark` on this page. That was checked, not assumed:
   the 36 stylesheets /my-account-2/ loads were listed from the rendered HTML
   and grepped, and so were WooCommerce's three; the only hits anywhere are
   `mark.count` (woocommerce.css:276, pack-components.css:213), which is the
   product-category badge. So the UA rule `mark { background: Mark }` stands
   and the shopper's order line is highlighter-pen yellow.

   The treatment keeps the emphasis and drops the paint. Colour is not the
   only carrier here either — the sentence names what each value is.
   (0,2,1); the only thing to beat is the user-agent sheet, which any author
   declaration outranks. */
.woocommerce-account .woocommerce-MyAccount-content mark {
  background: none;
  color: var(--text, #0f172a);
  font-weight: var(--fw-semibold, 600);
}
.woocommerce-account .woocommerce-MyAccount-content mark.order-number {
  font-variant-numeric: tabular-nums;
}

/* ---- 10c · The 1998 groove box on "Konto andmed" -------------------------
   form-edit-account.php wraps the password fields in
     <fieldset><legend>Parooli muutmine</legend> … three .form-row … </fieldset>
   and NOT ONE stylesheet this page loads declares `fieldset` or `legend` —
   grepped across the theme's sheets and WooCommerce's woocommerce.css,
   woocommerce-layout.css, woocommerce-smallscreen.css and wc-blocks.css. So
   the browser default stands: `border: 2px groove`, i.e. a bevelled inset box
   from the Windows-95 control palette, sitting inside a flat 2026 panel.

   It becomes the pack's "süvend" (D4: a quiet block inside a surface) —
   --surface-muted, no border, --radius-12 because this is a block INSIDE the
   panel and 16px is the panel's own step. The legend becomes the group label
   it is. `min-inline-size: 0` is stated because a fieldset's default
   `min-inline-size: min-content` is what makes a long field refuse to shrink
   inside one — the fieldset equivalent of the flex `min-width:0` trap, and
   the reason a fieldset can push a phone into horizontal scroll. */
.woocommerce-account .woocommerce-EditAccountForm fieldset {
  min-inline-size: 0;
  margin: var(--space-8, 8px) 0 var(--space-16, 16px);
  padding: var(--space-20, 20px);
  background: var(--surface-muted, #f1f5f9);
  border: 0;
  border-radius: var(--radius-12, 12px);
}
.woocommerce-account .woocommerce-EditAccountForm fieldset legend {
  display: block;
  float: none;
  width: 100%;
  margin: 0 0 var(--space-12, 12px);
  padding: 0;
  font: var(--label-md, 600 14px/16px "DM Sans", "Segoe UI", sans-serif);
  letter-spacing: var(--label-md-tracking, .02em);
  text-transform: uppercase;
  color: var(--text-subtle, #64748b);
}
/* woocommerce.css:1188 gives every .form-row `margin: 0 0 16px`. On the last
   row in the group that 16px lands on top of the fieldset's own 20px padding,
   so the box has 36px of air at the bottom and 20px at the top. (0,4,1). */
.woocommerce-account .woocommerce-EditAccountForm fieldset .form-row:last-child {
  margin-bottom: 0;
}

/* ---- 10d · The hint glued to the field -----------------------------------
   form-edit-account.php prints, INSIDE the display-name row,
     <span id="account_display_name_description"><em>Nii kuvatakse…</em></span>
   The row is `display:flex; flex-direction:column` (woocommerce.css:1188) and
   main.css:111 is `* { margin: 0 }`, so the hint is a flex item with no gap
   at all — its first line touches the 52px input's bottom border.
   `> span` is the description and only the description: the two other spans
   in this form (.required, .screen-reader-text) live inside the <label>.
   The italic goes: this theme has no italic role, and an <em> around a UI
   hint is core's habit, not emphasis. (0,3,1) — three classes over one
   element; nothing else selects this span. */
.woocommerce-account .woocommerce-EditAccountForm .form-row > span {
  margin-top: var(--space-8, 8px);
  font: var(--text-xs, 400 13px/18px "DM Sans", "Segoe UI", sans-serif);
  color: var(--text-subtle, #64748b);
}
.woocommerce-account .woocommerce-EditAccountForm .form-row > span em {
  font-style: normal;
}

/* ---- 10e · The address book was 48% wide ---------------------------------
   ⚠️ THE BIGGEST ONE IN THIS SECTION, and it is invisible in the stylesheet.

   my-address.php emits the wrapper as
     <div class="u-columns woocommerce-Addresses col2-set addresses">
       <div class="u-column1 col-1 woocommerce-Address"> … </div>
       <div class="u-column2 col-2 woocommerce-Address"> … </div>
   It carries `col2-set`, so WooCommerce's woocommerce-layout.css applies:
     .woocommerce .col2-set .col-1 { float: left;  width: 48% }   (0,2,0)
     .woocommerce .col2-set .col-2 { float: right; width: 48% }   (0,2,0)
   woocommerce.css:1474 then makes the wrapper `display: grid`. A grid item
   IGNORES `float` — but it does NOT ignore `width`. So each address card is
   48% of its own grid track, and nothing in the theme takes that width back:
   the only place `.col-1`/`.col-2` are neutralised is the checkout
   (woocommerce.css:1166), the login page (:1391) and, since v1.2.101, the
   order page (§3 of this file). The account's own address book was never in
   that list — grepped across all 53 sheets in assets/css.

   ARITHMETIC, at 1280px, on /my-account-2/edit-address/:
     container inner      1280 − 2×24                        = 1232px
     account grid         260px sidebar + 28px gap + 1fr     →  944px content
     panel inner          944 − 2×24 padding − 2×1 border    =  894px
     addresses grid       (894 − 20px gap) / 2               =  437px per track
     card, width: 48%     437 × .48                          =  210px
   i.e. a 210px card in a 437px column, twice, with 227px of white beside each.
   On a 375px phone the grid is ONE column of 283px and the card is 136px —
   about the width of the word "Tarneaadress".

   Kill the width and the float together: a floated 48% box that stops
   floating is still 48% wide, which is the same pair §3 states for the order
   page and the same one woocommerce.css:1396 states for the login columns.
   (0,3,0) against core's (0,2,0) — won on specificity. */
.woocommerce-account .woocommerce-Addresses > .col-1,
.woocommerce-account .woocommerce-Addresses > .col-2,
.woocommerce-account .woocommerce-Addresses > .u-column1,
.woocommerce-account .woocommerce-Addresses > .u-column2 {
  float: none;
  width: auto;
}

/* ---- 10f · The address FORM: one column at 894px -------------------------
   form-edit-address.php puts every field in
     <div class="woocommerce-address-fields__field-wrapper">
   and woocommerce_form_field marks the name pair `form-row-first` /
   `form-row-last`. woocommerce.css:1193 flattens both to `width:100%; float:
   none` for the whole site, and the two-column grid that replaces them
   (woocommerce.css:1196-1204) is fenced on `.woocommerce-checkout` — so on
   the account the shopper edits the SAME address in a single 894px column
   that the checkout lays out in two.

   Same pattern, same breakpoint, same gap as the checkout's. The span rule is
   written as `*:not(first):not(last)` rather than `> .form-row-wide` on
   purpose: anything a plugin injects into this wrapper that is not half of
   the name pair then spans instead of silently landing in column 1.
   (0,3,0) for the wrapper, (0,5,0) for the span rule (two :not() arguments,
   one class each); nothing else sets `display` on this wrapper. */
@media (min-width: 560px) {
  .woocommerce-account .woocommerce-MyAccount-content .woocommerce-address-fields__field-wrapper {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0 var(--space-16, 16px);
  }
  .woocommerce-account .woocommerce-MyAccount-content .woocommerce-address-fields__field-wrapper > *:not(.form-row-first):not(.form-row-last) {
    grid-column: 1 / -1;
  }
}

/* ---- 10g · THE ORDER NUMBER IS HIDDEN ON A PHONE -------------------------
   ⚠️ orders.php emits the order-number cell as a ROW HEADER, not a data cell:
     <th class="woocommerce-orders-table__cell
                woocommerce-orders-table__cell-order-number"
         data-title="Tellimus" scope="row"><a href="…">#1234</a></th>
   and WooCommerce's woocommerce-smallscreen.css — served with
   media="only screen and (max-width: 768px)" — ships
     .woocommerce table.shop_table_responsive tbody th { display: none }  (0,2,2)
   So below 768px the order card shows date, status, total and a button, and
   the ORDER NUMBER IS NOT ON IT. On the surface whose whole job is "which
   order was that".

   Two more consequences of the same misread, both in THIS file: §5b's
   `td.…-cell-order-number { font-variant-numeric: tabular-nums }` and the
   ≥769px twin at §5b's tail have never matched anything either — a `td` rule
   pointed at a `th`. Both are corrected below rather than left as dead bytes.

   ⚠️ TRAP 11 CLEARANCE, stated because this rule gives a `<th>` a non-table
   display. It is safe HERE and only here: §5b already takes `table`, `tbody`
   and `tfoot` to `display:block` and `thead` to `display:none` inside this
   same `max-width: 768px` query. There is no table, no table-row-group and no
   table-row left anywhere above this cell, so no anonymous cell can be built
   — which is exactly the reason §5b finished that conversion instead of
   leaving it half done.

   The cell mirrors woocommerce.css:1514-1516 declaration for declaration,
   including its 11px/14px padding. That padding is off the spacing scale, and
   matching it is still right: this cell sits directly above four cells that
   use it, and one row 1px taller than its neighbours is more visible than a
   scale purity nobody can see.
   Specificity: .woocommerce-account + .woocommerce-MyAccount-content +
   .shop_table_responsive + .…-cell-order-number = 4 classes, over
   table + tbody + th = 3 elements → (0,4,3), against core's (0,2,2). */
@media (max-width: 768px) {
  .woocommerce-account .woocommerce-MyAccount-content table.shop_table_responsive tbody th.woocommerce-orders-table__cell-order-number {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: var(--space-12, 12px);
    padding: 11px 14px;
    text-align: right;
    border-top: 0;
    border-bottom: 1px solid var(--border, #e2e8f0);
    font-weight: var(--fw-semibold, 600);
    font-variant-numeric: tabular-nums;
  }
  /* The label. The TEXT is still core's — `data-title` is written by
     wc_get_account_orders_columns() and this rule only reads it, so the pack's
     one hard rule for tables ("the label may come from exactly one place")
     holds. The declarations are woocommerce.css:1519-1522's, restated because
     that rule selects `td::before` and cannot reach a `th`, plus §5b's 45%
     ceiling so a long label wraps instead of starving the value. */
  .woocommerce-account .woocommerce-MyAccount-content table.shop_table_responsive tbody th.woocommerce-orders-table__cell-order-number::before {
    content: attr(data-title) ": ";
    flex: 0 0 auto;
    max-width: 45%;
    margin-right: var(--space-8, 8px);
    text-align: left;
    text-transform: uppercase;
    letter-spacing: .04em;
    font-size: var(--fs-2xs, 12px);
    font-weight: var(--fw-bold, 700);
    color: var(--text, #0f172a);
  }
}
/* The desktop twin of the dead `td` rule named above. (0,3,1). */
@media (min-width: 769px) {
  .woocommerce-account .woocommerce-orders-table th.woocommerce-orders-table__cell-order-number {
    font-variant-numeric: tabular-nums;
  }
}


/* ==========================================================================
   11 · LOGI SISSE / REGISTREERU — the two columns   (v1.2.102)
   ==========================================================================
   Markup read from the rendered page, not from a template
   (curl http://og.local/my-account-2/, 2026-08-15):

     div.u-columns.col2-set#customer_login
       div.u-column1.col-1  > h2 + form.woocommerce-form-login
       div.u-column2.col-2  > h2 + form.woocommerce-form-register

   ⚠️ ONE CORRECTION TO A COMMENT IN woocommerce.css. Its :1373 note says this
   store renders the wrapper "with NO #customer_login id". It does carry the
   id today — the attribute is in the HTML above. So the declaration that wins
   there comes from the `#customer_login` half of its selector lists, i.e.
   (1,2,0), and every rule below has to clear an ID. Both fences are written
   out for the same reason woocommerce.css writes both: whichever of the two
   the markup happens to offer, the rule lands.

   ⚠️ SCOPE PROMISE. This file's header says no generic `.form-row`, `.button`
   or `input` net exists in it. Section 11 adds rules that touch a checkbox and
   a submit — every one of them fenced on `#customer_login` or on
   `.u-columns.col2-set:has(.woocommerce-form-register)`, neither of which can
   exist anywhere but the logged-out account page. The promise stands: no
   selector here can reach a control on any other surface.
   ========================================================================== */

/* ---- 11a · Equal height ---------------------------------------------------
   woocommerce.css:1388 sets `align-items: start` from 768px up. The register
   column carries a benefits list, a 78px robot widget, two newsletter rows and
   a privacy paragraph that the login column does not, so the two cards differ
   by roughly 260px of height and the page ends on a ragged edge — the one
   thing the owner named ("võrdne kõrgus").

   ⚠️ VISIBLE: the LOGIN card grows to the register card's height. Its content
   stays at the top; what changes is where the card's bottom edge is.
   Specificity, per path, because the two are computed separately:
     mine (1,3,0)  .woocommerce-account .woocommerce #customer_login.u-columns
     theirs (1,2,0) .woocommerce-account #customer_login.u-columns
     mine (0,5,0)  … .u-columns.col2-set:has(.woocommerce-form-register)
     theirs (0,4,0) .woocommerce .u-columns.col2-set:has(…)
   Each path wins by exactly one class. */
@media (min-width: 768px) {
  .woocommerce-account .woocommerce #customer_login.u-columns,
  .woocommerce-account .woocommerce .u-columns.col2-set:has(.woocommerce-form-register) {
    align-items: stretch;
  }
}

/* ---- 11b · 50px is not a step ---------------------------------------------
   woocommerce.css:1412 gives both submits `min-height: 50px`. The pack's
   button ladder has no 50 — D1 is "M 52px · tootelehel, vormid", and 52px is
   what the empty-state action in §7 and the checkout's own fields already use.
   Two pixels, on the two biggest controls of the page.
   (1,2,0) and (0,5,0), one class over each of woocommerce.css's two paths. */
.woocommerce-account #customer_login .woocommerce-form-login__submit,
.woocommerce-account #customer_login .woocommerce-form-register__submit,
.woocommerce-account .u-columns.col2-set:has(.woocommerce-form-register) .woocommerce-form-login__submit,
.woocommerce-account .u-columns.col2-set:has(.woocommerce-form-register) .woocommerce-form-register__submit {
  min-height: 52px;
}

/* ---- 11c · Three checkbox rows, none of them 44px -------------------------
   The register column carries three tick rows and each one fails the target
   for a DIFFERENT reason. Class lists quoted from the rendered page:

     "Jäta mind meelde"
       <p class="form-row"><label class="woocommerce-form__label
          woocommerce-form__label-for-checkbox woocommerce-form-login__rememberme">
     "Subscribe to our newsletter"   (Mailchimp for WooCommerce)
       <p class="form-row form-row-wide mailchimp-newsletter"><label
          class="woocommerce-form__label woocommerce-form__label-for-checkbox inline">
     "Soovin liituda uudiskirjaga"   (MC4WP)
       <p class="mc4wp-checkbox …"><label><input type="checkbox">

   a11y.css:212 grants the 44px row to `.woocommerce-terms-and-conditions-wrapper
   …__label-for-checkbox` and to `.woocommerce form .form-row label.checkbox`.
   None of the three carries `.checkbox` and none is in the terms wrapper, so
   none of them gets it. a11y.css:204 does size the BOX to 20px for the first
   two, because both sit in a `.form-row`; the MC4WP row does not, so its box
   is still the browser's ~13px square.
   Result: three rows of roughly 24px, 24px and 20px where the requirement is
   44 — and the smallest of the three is the one that subscribes the shopper to
   something, which is the tick that most needs to be hard to hit by accident.

   All three become one row: 44px tall, the box 20px and not shrinkable, 12px
   between box and words. `align-items: center` matches woocommerce.css:1405's
   existing treatment of the remember-me row so nothing jumps. No `margin` is
   declared on the shared rule — the three rows sit in three different parents
   and each keeps the spacing its own parent gives it; the two that have none
   are handled separately below. */
.woocommerce-account #customer_login .woocommerce-form-login__rememberme,
.woocommerce-account #customer_login .mailchimp-newsletter > label,
.woocommerce-account #customer_login .mc4wp-checkbox > label,
.woocommerce-account .u-columns.col2-set:has(.woocommerce-form-register) .woocommerce-form-login__rememberme,
.woocommerce-account .u-columns.col2-set:has(.woocommerce-form-register) .mailchimp-newsletter > label,
.woocommerce-account .u-columns.col2-set:has(.woocommerce-form-register) .mc4wp-checkbox > label {
  display: flex;
  align-items: center;
  gap: var(--space-12, 12px);
  min-height: var(--tap-min, 44px);
  cursor: pointer;
}
/* Remember-me: woocommerce.css:1405 spaces it `4px 0 14px`. The row is now
   44px with the 20px box centred in it, so 12px of that air is already inside
   the row; 14px more under it put the submit 26px away while the rest of the
   form breathes at 16px. 8px puts it back on the form's own rhythm. */
.woocommerce-account #customer_login .woocommerce-form-login__rememberme,
.woocommerce-account .u-columns.col2-set:has(.woocommerce-form-register) .woocommerce-form-login__rememberme {
  margin: 0 0 var(--space-8, 8px);
}
/* The MC4WP row is a bare <p>, so main.css:111 (`* { margin: 0 }`) leaves it
   with none at all: today it is welded to the privacy paragraph above it and
   to the submit below it. It is the only element between them. */
.woocommerce-account #customer_login .mc4wp-checkbox,
.woocommerce-account .u-columns.col2-set:has(.woocommerce-form-register) .mc4wp-checkbox {
  margin: var(--space-8, 8px) 0 var(--space-16, 16px);
}
.woocommerce-account #customer_login .woocommerce-form-login__rememberme input[type="checkbox"],
.woocommerce-account #customer_login .mailchimp-newsletter input[type="checkbox"],
.woocommerce-account #customer_login .mc4wp-checkbox input[type="checkbox"],
.woocommerce-account .u-columns.col2-set:has(.woocommerce-form-register) .woocommerce-form-login__rememberme input[type="checkbox"],
.woocommerce-account .u-columns.col2-set:has(.woocommerce-form-register) .mailchimp-newsletter input[type="checkbox"],
.woocommerce-account .u-columns.col2-set:has(.woocommerce-form-register) .mc4wp-checkbox input[type="checkbox"] {
  flex: 0 0 auto;
  width: 20px;
  height: 20px;
  margin: 0;
}

/* ---- 11d · "Kaotasid parooli?" -------------------------------------------
   <p class="woocommerce-LostPassword lost_password"><a …>Kaotasid parooli?</a>
   main.css:111 zeroes the paragraph's margin, so the only space above it is
   the 16px the preceding .form-row leaves; the link itself is a ~20px line of
   text and it is the way out of a form the shopper has just failed. 44px, and
   the row centred under the full-width submit above it so the card ends on an
   axis instead of at the left margin. */
.woocommerce-account #customer_login .woocommerce-LostPassword,
.woocommerce-account .u-columns.col2-set:has(.woocommerce-form-register) .woocommerce-LostPassword {
  margin: var(--space-4, 4px) 0 0;
  text-align: center;
}
.woocommerce-account #customer_login .woocommerce-LostPassword a,
.woocommerce-account .u-columns.col2-set:has(.woocommerce-form-register) .woocommerce-LostPassword a {
  display: inline-flex;
  align-items: center;
  min-height: var(--tap-min, 44px);
  padding: 0 var(--space-8, 8px);
  font-size: var(--fs-sm, 14px);
  font-weight: var(--fw-semibold, 600);
}

/* ---- 11e · The stray <br> -------------------------------------------------
   The captcha plugin prints its widget followed by a literal `<br/>`, as a
   direct child of the form:  <div class="g-recaptcha"…></div><br/>
   Between two block boxes that <br> still generates a line box — about 26px at
   16px/1.6 — on top of the widget's own 14px bottom margin, in a form whose
   rhythm is 16px everywhere else. It carries no content and no meaning.
   Fenced on the two forms that have one, by their own class. */
.woocommerce-account form.register > br,
.woocommerce-account form.woocommerce-ResetPassword > br {
  display: none;
}


/* ==========================================================================
   12 · KADUNUD PAROOL — the page with no measure   (v1.2.102)
   ==========================================================================
   Rendered 2026-08-15, http://og.local/my-account-2/lost-password/:

     body class … woocommerce-account woocommerce-page woocommerce-lost-password
       div.woocommerce
         div.woocommerce-notices-wrapper   (empty)
         form.woocommerce-ResetPassword.lost_reset_password
           p                                  ← the explanation
           p.form-row.form-row-first          ← label + one text field
           div.g-recaptcha
           p.form-row                         ← the submit

   The form is a plain block child of `.woocommerce`, and `.woocommerce` is NOT
   a grid here: both account-grid rules need either the account nav
   (woocommerce.css:1331 — this page has none) or the `logged-in` body class
   (:1346 — the class list above does not carry it). So the form is the full
   width of the page container: 1232px at a 1280px viewport, 1376px at 1440px.
   One input and one button, stretched across the whole screen. It is one click
   from the login card and looks like a different website.

   ⚠️ THE CARD IS ADDED FROM 640px ONLY, AND THAT IS THE DECISION.
   This form carries the same robot widget the register column does, and that
   widget is a FIXED 304px wide. On a 375px phone the page container is 339px
   (375 − 2×18, main.css:480), so the form is 339px today and the widget fits
   with 35px to spare. Wrap it in a 28px-padded card and the usable width drops
   to 339 − 2 − 56 = 281px, which is 23px NARROWER than the widget: the card
   would buy a desktop improvement with a phone regression, and in this shop the
   phone wins. Below 640px this page therefore renders EXACTLY as it does today,
   to the byte. The two rhythm fixes (the lead paragraph here, the stray <br> in
   §11e) do apply at every width; neither can overflow anything.

   At 640px the container is 604px, the card 520px and its inner width
   520 − 2 − 2×28 = 462px, so the widget has 158px to spare. The card's values
   are woocommerce.css:1395-1399's, byte for byte, so the reset card and the
   login card are one card.
   ⚠️ The same rules also dress /my-account-2/lost-password/?key=…, the screen
   where the new password is typed: form-reset-password.php ships the same
   `woocommerce-ResetPassword` class and the same bare intro <p>. That is
   intended — it is the second half of the same errand.
   (0,2,1); nothing else in the theme sets a width on this form. */
.woocommerce-account .woocommerce-ResetPassword > p:first-child {
  margin: 0 0 var(--space-20, 20px);
  font: var(--text-md, 400 16px/24px "DM Sans", "Segoe UI", sans-serif);
  color: var(--text-muted, #475569);
  max-width: 60ch;
}
@media (min-width: 640px) {
  .woocommerce-account form.woocommerce-ResetPassword {
    width: 100%;
    max-width: 520px;
    margin-inline: auto;
    padding: 28px;
    background: var(--surface, #ffffff);
    border: 1px solid var(--border, #e2e8f0);
    border-radius: var(--radius-lg, 16px);
    box-shadow: var(--shadow-card, 0 1px 2px rgba(15, 23, 42, .04), 0 1px 3px rgba(15, 23, 42, .06));
  }
}


/* ==========================================================================
   13 · WHAT SECTIONS 10-12 DID NOT VERIFY   (v1.2.102)
   ==========================================================================
   Same confession as §9, updated. This session had a running local copy of the
   shop (http://og.local, same database as live) and used it — but only for
   what curl can reach.

   1. LOGGED-IN PAGES WERE STILL NEVER RENDERED. Everything in §10 is read
      from WooCommerce's own account templates in this install plus the
      stylesheets the logged-OUT account page actually loads. The markup is
      quoted, not remembered; the CASCADE is arithmetic. §10e and §10g are the
      two to check first, because both claim a core rule is winning.
   2. §10e's numbers (210px card in a 437px column) are computed from the
      container/grid/padding chain, not measured. What matters is the ratio:
      if the cards are not full-width in their column after this change, the
      fix did not land.
   3. THE LOGIN AND LOST-PASSWORD PAGES WERE RENDERED (curl, 2026-08-15) and
      the markup in §11 and §12 is quoted from that HTML. No computed value was
      read there either — no browser was used by this session.
   4. THE ROBOT WIDGET carries `data-theme="dark"` in the markup on both pages.
      That is the captcha plugin's own setting, not CSS, and this theme is
      light-only (CLAUDE.md invariant 5). Flagged for the owner; not touched.
   5. THE REGISTER CARD OFFERS THE NEWSLETTER TWICE, once in English
      ("Subscribe to our newsletter") and once in the site's own language.
      Two plugins asking the shopper the same question twice, and one of them
      asking it in the wrong language. Content, not styling — flagged, not
      fixed.
   ========================================================================== */
