/**
 * TactaBlue — My Account (Design V2), self-contained page CSS.
 *
 * Ported from the client mockup "My-account-tactablue-v3 (1).html" (its inline <style>),
 * filtered rule-by-rule rather than by line range.
 *
 * DELIBERATELY OMITTED — every rule selecting .tb-util/.tb-hdr/.tb-logo/.tb-search/
 * .tb-hicons/.tb-hcount/.tb-burger/.tb-nav/.tb-allcat/.tb-mnav/.tb-foot/.tb-drawer/
 * .tb-citem/.tb-qty/.tb-skip (shared chrome) and .tb-devnote/.tb-panel/.reveal +
 * @keyframes tbfade (mockup-only preview scaffolding).
 *
 * WHY (BATCH-PROGRESS.md gotcha #7): css/home-v10.css owns that shared chrome and is
 * enqueued whenever header/footer v2 is active. This file declares a dependency on it and
 * therefore prints LAST, so any duplicate kept here would shadow home-v10 — including its
 * media queries — and desync the header/footer on this page only. .reveal is omitted for
 * the same reason: home-v10.js drives it, and without that the sidebar would be stuck at
 * opacity:0. The account panels are real server-rendered endpoint pages now, so the
 * mockup s show/hide .tb-panel rules would hide every panel.
 */

  /* ===== shared TactaBlue theme tokens (identical to Cart / Checkout / Shop) ===== */
  .tb-home{--navy:#0A5098;--navy-d:#083E77;--navy-ink:#0C1E33;--ink:#16202B;--body:#3A4653;
    --muted:#626E7A;--paper:#fff;--mist:#F4F7FA;--mist2:#EAF1F8;--line:#DCE4EC;--line-2:#cfe0f1;
    --accent:#E7A33C;--accent-d:#D08F2C;--accent-ink:#0C1E33;--good:#217B48;--good-bg:#EFF8F2;
    --warn:#B4790E;--warn-bg:#FBF3E2;--danger:#B4232B;--danger-bg:#FBEDED;
    --disp:'Oswald',system-ui,sans-serif;--text:'Roboto',system-ui,sans-serif;
    font-family:var(--text);color:var(--body);line-height:1.6;background:var(--paper);
    -webkit-font-smoothing:antialiased;}
  .tb-home,.tb-home *{box-sizing:border-box;}
  /* The mockup's `html,body{margin:0;padding:0}` reset is omitted on purpose: the mockup is a
     standalone document, whereas this stylesheet loads inside the live theme and an unscoped
     element reset would leak to every page sharing the stylesheet cache. The theme already
     zeroes body margin. */
  .tb-home img{max-width:100%;display:block;}
  .tb-home a{color:inherit;text-decoration:none;}
  .tb-wrap{max-width:1560px;margin:0 auto;padding:0 28px;}
  /* Scoped to .tb-acctpage (this page's wrapper), NOT .tb-home.
     footer-v2.php renders the footer inside its OWN .tb-home wrapper, so a `.tb-home h4`
     rule here would also match the footer column headings ("QUICK LINKS", "NEWSLETTER").
     It ties with home-v10's `.tb-foot h4{color:#fff;margin:0 0 15px}` on specificity and,
     because this stylesheet prints last, would win — turning those headings dark navy on
     the dark footer and collapsing their spacing, on this page only.
     tb-brands.css / tb-register.css avoid this only because they still carry their own
     `.tb-foot h4` copy further down the file; this file drops all chrome rules, so the
     heading rule is scoped to the page instead. Page CSS should style the page, not the
     shared chrome. */
  .tb-acctpage h1,.tb-acctpage h2,.tb-acctpage h3,.tb-acctpage h4{font-family:var(--disp);color:var(--ink);line-height:1.1;font-weight:600;margin:0;}
  .tb-eyebrow{font-family:var(--disp);font-weight:600;font-size:13px;letter-spacing:.18em;text-transform:uppercase;color:var(--navy);display:inline-flex;align-items:center;gap:9px;}
  .tb-eyebrow::before{content:"";width:20px;height:2px;background:var(--accent);display:inline-block;}
  .tb-btn{display:inline-flex;align-items:center;justify-content:center;gap:9px;font-family:var(--text);font-weight:600;font-size:15px;padding:14px 30px;min-height:48px;border:1px solid transparent;cursor:pointer;transition:.18s;text-align:center;}
  .tb-btn--accent{background:var(--accent);color:var(--accent-ink);}
  .tb-btn--accent:hover{background:var(--accent-d);}
  .tb-btn--navy{background:var(--navy);color:#fff;}
  .tb-btn--navy:hover{background:var(--navy-d);}
  .tb-btn--outline{background:#fff;color:var(--navy);border-color:var(--navy);}
  .tb-btn--outline:hover{background:var(--mist2);}
  .tb-btn--sm{padding:9px 16px;min-height:0;font-size:13px;}
  .tb-home a.tb-btn--navy{color:#fff;}
  .tb-home a.tb-btn--accent{color:var(--accent-ink);}
  .tb-home a.tb-btn--outline{color:var(--navy);}
  .tb-home a.tb-btn:focus-visible,.tb-home button.tb-btn:focus-visible{outline:3px solid var(--accent);outline-offset:3px;}
  /* The mockup's all-categories dropdown block (.dropdown_cat/.drop_heading/.cat-tree/
     .cat-row/.cat-toggle) was REMOVED here in P14 (finding B6). It is shared header chrome,
     owned by css/style.css + inc/header-category-tree.php, and this file's own header says
     chrome is omitted — but the block had been left in. Most of it was inert by specificity,
     however `.drop_heading .view-all-cats` and `.drop_heading .close_cat(:hover)` had no
     competitor anywhere in the theme, so the site header's All-Categories dropdown rendered
     with a different link colour and a restyled close button on /my-account/ ONLY. Exactly
     the bug class fixed in 6a16b59 (`.tb-home h4` reaching the footer headings). */
  /* ---------- account banner ---------- */
  .tb-shbanner{position:relative;background:var(--navy-ink);overflow:hidden;}
  .tb-shbanner__img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:.28;}
  .tb-shbanner__scrim{position:absolute;inset:0;background:linear-gradient(90deg,var(--navy-ink) 20%,rgba(12,30,51,.72) 60%,rgba(12,30,51,.5));}
  .tb-shbanner .tb-wrap{position:relative;padding:52px 28px 46px;}
  .tb-shbanner .tb-eyebrow{color:#BBD4EC;}
  .tb-home .tb-shbanner__title{font-family:var(--disp);font-weight:700;color:#fff;font-size:clamp(30px,4vw,46px);line-height:1.05;margin:12px 0 14px;}
  .tb-shbanner__intro{color:#cfe0f0;font-size:15px;line-height:1.65;max-width:760px;margin:0 0 16px;}
  .tb-shbanner__intro strong{color:#fff;}
  .tb-crumb{display:flex;flex-wrap:wrap;gap:8px;align-items:center;font-size:13px;color:#9fc0e0;list-style:none;margin:0;padding:0;}
  .tb-crumb li{display:flex;align-items:center;gap:8px;}
  .tb-crumb li:not(:last-child)::after{content:"/";color:#5c7997;}
  .tb-crumb a:hover{color:#fff;}
  .tb-crumb li:last-child{color:#fff;font-weight:500;}
  /* ---------- account layout ---------- */
  .tb-acct{padding:40px 0 64px;}
  .tb-acct__grid{display:grid;grid-template-columns:294px 1fr;gap:28px;align-items:start;}
  .tb-acct__content{min-width:0;}
  /* sidebar */
  .tb-side{position:sticky;top:16px;display:flex;flex-direction:column;gap:18px;}
  .tb-usercard{border:1px solid var(--line);background:#fff;padding:22px 20px;text-align:center;}
  /* object-fit: the same class is used for the initials tile AND for an uploaded avatar,
     which is forced to a 76x76 square here — without it a non-square upload is squashed. */
  .tb-usercard__avatar{width:76px;height:76px;border-radius:50%;margin:0 auto 12px;display:grid;place-items:center;background:var(--mist2);border:2px solid var(--line);font-family:var(--disp);font-weight:700;font-size:28px;color:var(--navy);object-fit:cover;}
  .tb-usercard__name{font-family:var(--disp);font-weight:600;font-size:19px;color:var(--navy-ink);line-height:1.15;}
  .tb-usercard__email{font-size:12.5px;color:var(--muted);margin-top:3px;word-break:break-word;}
  .tb-chip{display:inline-flex;align-items:center;gap:6px;margin-top:12px;padding:5px 11px;background:var(--good-bg);color:var(--good);border:1px solid #c7e6d4;font-size:11.5px;font-weight:700;font-family:var(--disp);letter-spacing:.05em;text-transform:uppercase;}
  .tb-chip svg{width:13px;height:13px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .tb-usercard__since{font-size:11.5px;color:var(--muted);margin-top:12px;}
  .tb-anav{border:1px solid var(--line);background:#fff;}
  .tb-anav a{display:flex;align-items:center;gap:12px;padding:13px 18px;font-size:14px;font-weight:500;color:var(--body);border-left:3px solid transparent;border-bottom:1px solid var(--line);transition:.14s;}
  .tb-anav a:last-child{border-bottom:0;}
  .tb-anav a svg{width:19px;height:19px;stroke:var(--muted);fill:none;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;flex:none;transition:.14s;}
  .tb-anav a .lbl{flex:1;}
  .tb-anav a .pill{background:var(--mist2);color:var(--navy);font-size:11px;font-weight:700;font-family:var(--disp);padding:2px 8px;border-radius:10px;}
  .tb-anav a:hover{background:var(--mist);color:var(--navy);}
  .tb-anav a:hover svg{stroke:var(--navy);}
  .tb-anav a.is-active{background:var(--mist2);color:var(--navy-ink);border-left-color:var(--accent);font-weight:700;}
  .tb-anav a.is-active svg{stroke:var(--navy);}
  .tb-anav a.tb-anav__logout{color:var(--danger);}
  .tb-anav a.tb-anav__logout svg{stroke:var(--danger);}
  .tb-anav a.tb-anav__logout:hover{background:var(--danger-bg);}
  .tb-help{border:1px solid var(--line);background:var(--navy-ink);color:#cfe0f0;padding:18px;}
  .tb-help h4{color:#fff;font-family:var(--disp);text-transform:uppercase;letter-spacing:.06em;font-size:13px;margin-bottom:8px;}
  .tb-help p{font-size:12.5px;line-height:1.6;margin:0 0 12px;}
  .tb-help a{color:var(--accent);font-weight:600;font-size:13px;}
  .tb-help a:hover{color:var(--accent-d);}
  .tb-phead{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:20px;}
  .tb-phead h2{font-size:clamp(22px,2.4vw,28px);color:var(--navy-ink);}
  .tb-phead p{font-size:14px;color:var(--muted);margin:5px 0 0;}
  .tb-notice{display:flex;gap:12px;align-items:flex-start;border:1px solid #c7ddf1;background:var(--mist2);padding:14px 16px;margin-bottom:22px;font-size:13.5px;color:var(--navy-ink);}
  .tb-notice svg{width:20px;height:20px;stroke:var(--navy);fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;flex:none;margin-top:1px;}
  /* stat cards */
  .tb-stats{display:grid;grid-template-columns:repeat(2,1fr);gap:14px;margin-bottom:26px;}
  .tb-stat{border:1px solid var(--line);background:#fff;padding:18px;display:flex;align-items:center;gap:14px;}
  .tb-stat .ic{width:46px;height:46px;background:var(--mist2);display:grid;place-items:center;flex:none;}
  .tb-stat .ic svg{width:23px;height:23px;stroke:var(--navy);fill:none;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}
  .tb-stat .num{font-family:var(--disp);font-weight:700;font-size:26px;color:var(--navy-ink);line-height:1;}
  .tb-stat .lbl{font-size:12.5px;color:var(--muted);margin-top:3px;}
  /* quick action cards (kept + extended from the original dashboard) */

  /* section block heading inside a panel */
  .tb-block{margin-top:30px;}
  .tb-block__head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:14px;}
  .tb-block__head h3{font-size:18px;color:var(--navy-ink);}
  .tb-block__head a{font-size:13px;font-weight:600;color:var(--navy);}
  .tb-block__head a:hover{color:var(--accent-d);}
  /* orders toolbar (search / filter) */
  .tb-otools{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:16px;}
  .tb-otools .srch{flex:1 1 260px;display:flex;align-items:center;gap:8px;border:1px solid var(--line);background:#fff;padding:0 12px;height:44px;min-width:0;}
  .tb-otools .srch svg{width:18px;height:18px;stroke:var(--muted);fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;flex:none;}
  .tb-otools .srch input{flex:1;border:0;outline:none;font:inherit;font-size:14px;min-width:0;background:transparent;}
  .tb-otools select{height:44px;border:1px solid var(--line);background:#fff;padding:0 12px;font:inherit;font-size:14px;color:var(--body);}
  .tb-noorders td{text-align:center;color:var(--muted);padding:34px 16px;}
  /* orders table */
  .tb-tablewrap{border:1px solid var(--line);background:#fff;overflow-x:auto;}
  table.tb-orders{width:100%;border-collapse:collapse;min-width:640px;}
  .tb-orders th{font-family:var(--disp);text-transform:uppercase;letter-spacing:.05em;font-size:11.5px;color:var(--muted);text-align:left;padding:13px 16px;background:var(--mist);border-bottom:1px solid var(--line);white-space:nowrap;}
  .tb-orders td{padding:14px 16px;border-bottom:1px solid var(--line);font-size:13.5px;vertical-align:middle;}
  .tb-orders tr:last-child td{border-bottom:0;}
  .tb-orders tr:hover td{background:#FBFCFE;}
  .tb-orders .onum{font-weight:600;color:var(--navy);}
  .tb-orders .otot{font-family:var(--disp);font-weight:600;color:var(--navy-ink);}
  .tb-orders .oact{display:flex;gap:7px;flex-wrap:wrap;}
  .tb-status{display:inline-flex;align-items:center;gap:6px;font-family:var(--disp);font-weight:600;font-size:11px;letter-spacing:.04em;text-transform:uppercase;padding:4px 9px;white-space:nowrap;}
  .tb-status::before{content:"";width:7px;height:7px;border-radius:50%;background:currentColor;}
  .tb-status--done{background:var(--good-bg);color:var(--good);}
  .tb-status--transit{background:var(--mist2);color:var(--navy);}
  .tb-status--proc{background:var(--warn-bg);color:var(--warn);}
  .tb-status--cancel{background:var(--danger-bg);color:var(--danger);}
  /* orders pagination — not in the mockup (it shows a single static page); built from the
     mockup's own button styles so it needs no new visual language. */
  .tb-pager{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:12px;margin-top:18px;}
  .tb-pager__info{font-size:13px;color:var(--muted);}
  .tb-pager__note{font-size:12.5px;color:var(--muted);margin:14px 0 0;}
  /* address / detail cards */
  .tb-cards2{display:grid;grid-template-columns:1fr 1fr;gap:18px;}
  .tb-addr{border:1px solid var(--line);background:#fff;padding:22px;position:relative;}
  .tb-addr h3{font-size:15px;color:var(--navy-ink);display:flex;align-items:center;gap:8px;margin-bottom:12px;}
  .tb-addr h3 svg{width:18px;height:18px;stroke:var(--navy);fill:none;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}
  .tb-addr address{font-style:normal;font-size:14px;line-height:1.7;color:var(--body);}
  .tb-addr .edit{position:absolute;top:20px;right:20px;font-size:13px;font-weight:600;color:var(--navy);}
  .tb-addr .edit:hover{color:var(--accent-d);}
  .tb-addr__empty{color:var(--muted);font-size:14px;}
  /* forms */
  .tb-form{border:1px solid var(--line);background:#fff;padding:26px;max-width:720px;}
  .tb-fs{border:0;padding:0;margin:0 0 22px;}
  .tb-fs>legend{font-family:var(--disp);text-transform:uppercase;letter-spacing:.05em;font-size:12.5px;color:var(--muted);padding:0;margin-bottom:14px;width:100%;border-bottom:1px solid var(--line);padding-bottom:8px;}
  .tb-fgrid{display:grid;grid-template-columns:1fr 1fr;gap:16px;}
  .tb-field{display:flex;flex-direction:column;gap:6px;margin-bottom:16px;}
  .tb-field--full{grid-column:1 / -1;}
  .tb-field label{font-size:13px;font-weight:600;color:var(--navy-ink);}
  .tb-field label .req{color:var(--danger);}
  .tb-field input,.tb-field select{height:46px;border:1px solid var(--line);padding:0 13px;font:inherit;font-size:14px;background:#fff;outline:none;transition:.14s;}
  .tb-field input:focus,.tb-field select:focus{border-color:var(--navy);outline:2px solid rgba(10,80,152,.15);outline-offset:0;}
  .tb-field .hint{font-size:12px;color:var(--muted);}
  .tb-form__actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:6px;}
  /* read-only fields (Business account).
     The mockup draws payment terms and tax-exemption status as editable <select>s; they
     are admin-set here, so they must not LOOK editable either — no box, no chevron, just
     the value on a rule. Same .tb-field/.tb-fgrid geometry so a read-only row and an
     editable one line up when P11 adds the editable ones beside them. */
  .tb-field__label{font-size:13px;font-weight:600;color:var(--navy-ink);}
  .tb-ro{min-height:46px;display:flex;align-items:center;font-size:14px;font-weight:600;color:var(--navy-ink);border-bottom:1px solid var(--line);word-break:break-word;}
  .tb-ro--empty{font-weight:400;color:var(--muted);}
  .tb-rohint{display:flex;gap:8px;align-items:flex-start;font-size:12px;color:var(--muted);margin:2px 0 0;}
  .tb-rohint svg{width:14px;height:14px;stroke:var(--muted);fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;flex:none;margin-top:2px;}
  /* the certificate row is a link + two pieces of metadata on one value line */
  .tb-cert__link{font-weight:600;}
  .tb-cert__meta{font-weight:400;color:var(--muted);font-size:13px;margin-left:10px;}
  .tb-cert__state{font-family:var(--disp);font-size:10.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--navy);background:var(--mist2);border:1px solid #c7ddf1;padding:3px 8px;margin-left:10px;}
  /* save / error feedback. .tb-notice is the info variant; these two restate only colour. */
  .tb-notice--good{border-color:#c7e6d4;background:var(--good-bg);}
  .tb-notice--good svg{stroke:var(--good);}
  .tb-notice--bad{border-color:#f0c9c9;background:#fdf3f3;}
  .tb-notice--bad svg{stroke:var(--danger);}
  /* payment methods */
  .tb-paylist{display:flex;flex-direction:column;gap:12px;}
  .tb-pay{display:flex;align-items:center;gap:16px;border:1px solid var(--line);background:#fff;padding:16px 18px;}
  .tb-pay__brand{width:52px;height:34px;border:1px solid var(--line);border-radius:5px;display:grid;place-items:center;font-family:var(--disp);font-weight:700;font-size:12px;color:var(--navy-ink);background:var(--mist);flex:none;letter-spacing:.02em;}
  .tb-pay__info{flex:1;min-width:0;}
  .tb-pay__num{font-weight:600;color:var(--navy-ink);font-size:14.5px;}
  .tb-pay__meta{font-size:12.5px;color:var(--muted);}
  .tb-pay__default{font-family:var(--disp);font-size:10.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--good);background:var(--good-bg);border:1px solid #c7e6d4;padding:3px 8px;}
  .tb-pay__remove{border:0;background:none;color:var(--danger);font-size:13px;font-weight:600;cursor:pointer;}
  .tb-pay__remove:hover{text-decoration:underline;}
  /* The mockup's Remove <button> is a real nonced <a> in the build (WooCommerce owns the
     URL). `.tb-home a{color:inherit}` (0,1,1) out-specifies `.tb-pay__remove` (0,1,0), so
     the colour has to be restated at (0,2,0) or the link renders body-grey. */
  .tb-acctpage a.tb-pay__remove{color:var(--danger);}
  .tb-acctpage a.tb-pay__action{color:var(--navy);font-size:13px;font-weight:600;}
  .tb-acctpage a.tb-pay__action:hover{color:var(--accent-d);}
  /* the mockup spaces its trailing notices with an inline style */
  .tb-notice--spaced{margin-top:22px;}
  /* icon inside a button (downloads) */
  .tb-btn__ic{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;flex:none;}
  /* empty state */
  .tb-empty{border:1px dashed var(--line);background:var(--mist);text-align:center;padding:46px 20px;color:var(--muted);}
  .tb-empty svg{width:40px;height:40px;stroke:var(--line-2);fill:none;stroke-width:1.4;margin:0 auto 14px;}
  .tb-empty h3{color:var(--navy-ink);font-size:18px;margin-bottom:6px;}
  .tb-empty p{font-size:14px;margin:0 0 18px;}
  /* The mockup's cart-drawer block (.tb-drawer__head/__close/__body/__empty/__foot/__btns)
     was REMOVED here in P14 (finding B6). It is shared chrome owned by css/home-v10.css, the
     account markup contains no drawer at all, and this file's header already says chrome is
     omitted. It matched nothing — dead weight that would have shadowed home-v10 the moment
     the drawer ever rendered on this page. */
  /* ---------- responsive ---------- */
  @media(max-width:1040px){.tb-acct__grid{grid-template-columns:1fr;}
    .tb-side{position:static;flex-direction:row;flex-wrap:wrap;}
    .tb-usercard{flex:1 1 240px;min-width:0;} .tb-anav{flex:2 1 340px;min-width:0;} .tb-help{flex:1 1 100%;min-width:0;}
    .tb-stats{grid-template-columns:repeat(2,1fr);}}
  @media(max-width:760px){
  .tb-wrap{padding:0 16px;}
  .tb-acct__grid,.tb-side,.tb-usercard,.tb-anav,.tb-help,.tb-acct__content{width:100%;max-width:100%;min-width:0;}
  }
  @media(max-width:640px){
  .tb-crumb{display:none;}
  .tb-shbanner .tb-wrap{padding:24px 16px;}
  .tb-shbanner__title{font-size:26px;}
  .tb-stats,.tb-cards2,.tb-fgrid{grid-template-columns:1fr;}
  .tb-side{flex-direction:column;}
  .tb-form{padding:20px;}
  .tb-anav a .pill{display:none;}
  /* order/downloads tables collapse to stacked cards (no horizontal scroll) */
    .tb-tablewrap{overflow-x:visible;border:0;background:transparent;}
  table.tb-orders{min-width:0;}
  .tb-orders thead{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);}
  .tb-orders,.tb-orders tbody,.tb-orders tr,.tb-orders td{display:block;width:100%;}
  /* …but `display:block` would UNHIDE the rows tb-account.js hides and the .tb-noorders row,
     which relied on bootstrap.min.css's `[hidden]{display:none!important}`. Don't let this
     page's layout depend on a vendor stylesheet staying enqueued (P14 worth-doing item). */
  .tb-orders tr[hidden],.tb-orders td[hidden]{display:none;}
  .tb-orders tr{border:1px solid var(--line);background:#fff;margin-bottom:12px;padding:6px 4px;}
  .tb-orders tr:hover td{background:transparent;}
  .tb-orders td{border:0;padding:8px 14px;display:flex;justify-content:space-between;gap:14px;align-items:center;}
  .tb-orders td::before{content:attr(data-label);font-family:var(--disp);text-transform:uppercase;letter-spacing:.05em;font-size:11px;color:var(--muted);flex:none;}
  .tb-orders td.oact-cell{display:block;}
  .tb-orders td.oact-cell::before{content:none;}
  /* the JS "no matches" row is a message, not a field: no data-label, stays centred */
  .tb-orders .tb-noorders td{display:block;text-align:center;}
  .tb-orders .tb-noorders td::before{content:none;}
  .tb-orders .oact{margin-top:2px;}
  .tb-orders .oact .tb-btn{flex:1 1 auto;}
  }

  /* ---------- logged-out /my-account/ : sign-in + lost password ----------
     WooCommerce renders form-login.php DIRECTLY when logged out — my-account.php is
     never called, so the V2 shell (and its .tb-wrap) does not run and those templates
     bring their own .tb-auth section. Everything structural (.tb-auth, .tb-auth__card,
     .tb-field, .tb-input, .tb-check) plus the audited THEME-CASCADE GUARDS come from
     tb-register.css, which inc/account-v2.php enqueues alongside this file while logged
     out, and whose guards are scoped to .tb-registerpage — a class the page template
     adds to the wrapper for exactly this reason. Only the single-column framing and the
     remember/lost row are new. */
  .tb-acctpage .tb-auth__solo{max-width:520px;margin:0 auto;}
  .tb-acctpage .tb-auth__solo .tb-auth__card{border:1px solid var(--line);box-shadow:0 20px 50px rgba(10,44,82,.10);}
  /* two cards only if woocommerce_enable_myaccount_registration is switched back on */
  .tb-acctpage .tb-auth__solo--two{max-width:1000px;display:grid;grid-template-columns:1fr 1fr;gap:24px;align-items:start;}
  .tb-acctpage .tb-auth__row{display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;margin:2px 0 20px;}
  .tb-acctpage .tb-auth__remember{margin:0;align-items:center;font-size:13px;color:var(--body);cursor:pointer;}
  .tb-acctpage .tb-auth__remember input{margin-top:0;}
  .tb-acctpage .tb-auth__lost{font-size:13px;font-weight:600;color:var(--navy);}
  .tb-acctpage .tb-auth__lost:hover{color:var(--accent-d);}
  .tb-acctpage .tb-auth__note{font-size:13px;color:var(--muted);margin:0 0 18px;}
  /* P14/B3 — WooCommerce notices, now emitted INSIDE the card (see form-login.php). */
  .tb-acctpage .tb-auth__card .woocommerce-notices-wrapper{margin:0;}
  .tb-acctpage .tb-auth__card .woocommerce-notices-wrapper > *{margin:0 0 18px;font-size:14px;}
  /* Safety net: anything that still emits a notice outside the card (a plugin on another
     hook) at least stays inside the page container instead of going edge-to-edge. */
  .tb-acctpage > .woocommerce > .woocommerce-notices-wrapper{max-width:1560px;margin:22px auto 0;padding:0 28px;}
  @media(max-width:760px){.tb-acctpage > .woocommerce > .woocommerce-notices-wrapper{padding:0 16px;}}
  @media(max-width:760px){
    .tb-acctpage .tb-auth__solo--two{grid-template-columns:1fr;}
    .tb-acctpage .tb-auth__solo .tb-auth__card{padding:30px 22px;}
  }

  /* ============================================================================
     THEME-CASCADE GUARDS
     Rules from OTHER stylesheets that reach into this page and win. Each one is
     documented with its source and why it applies; scoped to .tb-acctpage so
     nothing here can leak into the shared header/footer (which render inside
     their own .tb-home). Extended in P13 after the full whowins.js sweep.
     ============================================================================ */

  /* woocommerce-layout.css (plugin, always enqueued on account pages):
       .woocommerce-account .woocommerce-MyAccount-content{float:right;width:68%}
     The V2 shell deliberately KEEPS the woocommerce-MyAccount-content class because
     WooCommerce core JS and several plugins key off it — so that 68% lands on our
     grid item and squeezes the content column to 722px inside its 1062px track.
     Specificity (0,3,0) beats the plugin's (0,2,0) regardless of print order. */
  .tb-acctpage .tb-acct__grid > .tb-acct__content{width:auto;float:none;}

  /* css/style.css:27 `p{line-height:1.5rem}` (0,0,1) out-specifies every plain .tb-*
     class on this page. The design inherits 1.6 from the body instead (a .tb-phead
     sub-heading rendered 24px instead of 22.4px). Element-scoped to .tb-acctpage, never
     .tb-home — the footer renders inside its own .tb-home and must not be touched. */
  .tb-acctpage p{line-height:1.6;}

  /* css/style.css:234 `label{color:#000;font-size:.875rem;line-height:normal;
     margin-bottom:.55rem}` (0,0,1). The orders search box IS a <label>, so it inherited
     an 8.8px bottom margin that broke the single-row toolbar. */
  .tb-acctpage .tb-otools .srch{margin-bottom:0;font-size:16px;line-height:1.6;color:var(--body);}

  /* css/style.css:247 `select{width:100%;margin-bottom:1.5rem;position:relative;
     appearance:none;background-image:url(../images/select-black-icon.svg)}` (0,0,1).
     `width:100%` is what stacked the toolbar into three rows; `appearance:none` removed
     the native dropdown arrow, and the page CSS's own `background:#fff` shorthand had
     already dropped style.css's replacement arrow image — leaving a select with no
     affordance at all. Restore the native control. */
  .tb-acctpage .tb-otools select{width:auto;margin-bottom:0;position:static;-webkit-appearance:auto;-moz-appearance:auto;appearance:auto;line-height:normal;}

  /* css/style.css:214 `input:not([type=submit],[type=radio],[type=checkbox],[type=file])`
     (0,1,1) beats `.tb-otools .srch input` on every property that rule does not restate:
     padding .71rem/1.25rem, border-radius .25rem and width:100%. (The higher-specificity
     copy at style.css:3997 needs a `section.my_account_page` ancestor, which the V2 shell
     never renders.) The mockup leaves the input's padding at the UA default, so restate
     that value rather than zeroing it — 1px/2px is what a bare <input> renders. */
  .tb-acctpage .tb-otools .srch input{padding:1px 2px;border-radius:0;width:auto;line-height:1.6;}

  /* woocommerce-layout.css (plugin): `.woocommerce img,.woocommerce-page img{height:auto;
     max-width:100%}` (0,1,1) beats the plain `.tb-usercard__avatar` (0,1,0), so an uploaded
     avatar ignored its own `height:76px` and rendered at the image's aspect ratio — a 300x160
     upload came out 76x42 in a 76px round tile. (P14 finding B1; only visible once a user
     actually HAS a profile_image, which no local user did.) `img.` makes this (0,2,1). */
  .tb-acctpage img.tb-usercard__avatar{height:76px;width:76px;object-fit:cover;}

  /* woocommerce-layout.css (plugin): `.woocommerce-account .woocommerce-MyAccount-navigation
     {float:left;width:30%}` (0,2,0). P14 finding B4 restored that class on the V2 <nav>
     because plugins and core JS key off it — which drags in a 30% width that, on a flex
     column 294px wide, would shrink the whole endpoint nav to 88px. (0,3,0) answers it. */
  .tb-acctpage .tb-side > .tb-anav{float:none;width:auto;}

  /* css/bootstrap.min.css (enqueued globally) `address{margin-bottom:1rem}` (0,0,1) —
     adds 16px under the address block inside every .tb-addr card. */
  .tb-acctpage address{margin-bottom:0;}

  /* --- account-details form (the same offenders the Register page hit) ---
     css/style.css:234 `label{line-height:normal;margin-bottom:.55rem}` — .tb-field is a
     flex column whose `gap` already provides the spacing, so that margin adds a second
     one and the collapsed line-height shortens every label by ~6px.
     css/style.css:214 `input:not([type=submit],…){border-radius:.25rem}` — the design's
     inputs are square.
     css/bootstrap.min.css `button,input,…{line-height:inherit}` — inherited 1.6 makes a
     .tb-btn 54px tall instead of 48px (this is the same bug that made Register's submit
     54px). Only <button> needs it; the .tb-btn links elsewhere on the page are unaffected. */
  .tb-acctpage .tb-field label{line-height:1.6;margin-bottom:0;}
  .tb-acctpage .tb-field input{border-radius:0;}
  .tb-acctpage button.tb-btn{line-height:normal;}

  /* inc/profile-edit.php injects the avatar upload as a bare `<p class="woocommerce-form-row">`
     with a plain file input. It is a theme feature, not a plugin's, but it is shared with the
     V1 template, so it is styled here to match .tb-field rather than rewritten. */
  .tb-acctpage .tb-form .woocommerce-form-row{display:flex;flex-direction:column;gap:6px;margin:0 0 16px;}
  .tb-acctpage .tb-form .woocommerce-form-row label{font-size:13px;font-weight:600;color:var(--navy-ink);line-height:1.6;margin-bottom:0;}
  .tb-acctpage .tb-form .woocommerce-form-row br{display:none;}
  .tb-acctpage .tb-form .woocommerce-form-row img{width:64px;height:64px;object-fit:cover;border:1px solid var(--line);margin:0;}
  .tb-acctpage .tb-form input[type=file]{font-size:13px;color:var(--body);}

  /* woocommerce.css reaches the sign-in form through the WooCommerce classes that
     form-login.php deliberately keeps (Woo JS and plugins key off them):
       `.woocommerce form.login{border:1px solid #cfc8d8;padding:20px;margin:2em 0;
         border-radius:5px}` (0,2,1) drew a grey rounded box inside the card;
       `.woocommerce button.button{background:#e9e6ed;color:#515151;border:0;
         border-radius:3px;display:inline-block;line-height:1;font-weight:700}` (0,2,1)
         rendered the accent submit grey;
       `.woocommerce .woocommerce-form-login .woocommerce-form-login__submit{float:left;
         margin-right:1em}` (0,3,0) floated the submit, squeezing the trust line into a
         one-word-per-line column beside it.
     Each guard below is one step more specific than the rule it answers. */
  .tb-acctpage .tb-auth form.login{border:0;padding:0;margin:0;border-radius:0;}
  .tb-acctpage .tb-auth form .tb-auth__submit{float:none;margin-right:0;width:100%;}
  .tb-acctpage .tb-auth__card button.tb-btn{display:inline-flex;align-items:center;justify-content:center;gap:9px;border:1px solid transparent;border-radius:0;min-height:48px;padding:14px 30px;font-family:var(--text);font-size:15px;font-weight:600;line-height:normal;text-shadow:none;box-shadow:none;}
  .tb-acctpage .tb-auth__card button.tb-btn--accent{background:var(--accent);color:var(--accent-ink);}
  .tb-acctpage .tb-auth__card button.tb-btn--accent:hover{background:var(--accent-d);}
  .tb-acctpage .tb-auth__card button.tb-btn--navy{background:var(--navy);color:#fff;}
  .tb-acctpage .tb-auth__card button.tb-btn--navy:hover{background:var(--navy-d);}

  /* --- Business account panel ---
     css/style.css:38 `p:last-child{margin:0}` is (0,1,1) and BEATS `.tb-rohint` (0,1,0).
     The hint is the last child of its <fieldset>, so that rule wins and collapses the
     2px it needs to sit off the value above it. Answered one step more specific.
     css/style.css:27 `p{color:var(--Text,#71757d);font-size:1rem;font-family:Roboto}` is
     only (0,0,1), so the class already wins there — restated anyway would be noise. */
  .tb-acctpage .tb-rohint{margin:2px 0 0;}

  /* `.tb-field input` (0,1,1) sets height:46px and padding:0 13px for TEXT inputs, and
     also matches the certificate <input type=file>, whose control needs real vertical
     room. style.css's `input:not([type=submit],[type=radio],[type=checkbox],[type=file])`
     deliberately excludes file inputs, so this is answering our own rule, not the theme's. */
  .tb-acctpage .tb-field input[type=file]{height:auto;padding:11px 13px;background:#fff;font-size:13px;color:var(--body);}

  /* `.tb-home a{color:inherit}` (0,1,1) out-specifies `.tb-cert__link` (0,1,0), exactly as
     it did for the payment-methods Remove link — restate the colour at (0,2,0). */
  .tb-acctpage a.tb-cert__link{color:var(--navy);}
  .tb-acctpage a.tb-cert__link:hover{color:var(--accent-d);}

  /* The certificate value line wraps three items on a narrow column, so it cannot keep
     `.tb-ro`'s single-line flex centring. */
  .tb-acctpage .tb-field--full .tb-ro{flex-wrap:wrap;gap:2px 0;padding:11px 0;}

  /* ---------- P13: endpoints this batch did NOT redesign ----------
     The V2 shell wraps every account endpoint, so view-order, edit-address and
     add-payment-method render stock WooCommerce markup inside the new card. Full skinning
     is deferred; this is the minimum that stops them looking like a different website.

     Everything here is scoped INSIDE `.woocommerce-MyAccount-content`, which is what keeps
     it off our own work: the only other templates that keep Woo's `button` class are
     form-login.php and form-lost-password.php, and those render logged-out where the shell
     (and therefore this container) does not exist at all. Verified, not assumed.

     1. `woocommerce.css .woocommerce a.button / button.button {background:#e9e6ed;
        color:#515151;border:0;border-radius:3px}` (0,2,1) renders every stock action grey —
        the same rule that greyed the sign-in submit in P8. Answered at (0,3,1). */
  .tb-acctpage .woocommerce-MyAccount-content a.button,
  .tb-acctpage .woocommerce-MyAccount-content button.button,
  .tb-acctpage .woocommerce-MyAccount-content input.button{display:inline-flex;align-items:center;justify-content:center;gap:9px;min-height:48px;padding:14px 30px;border:1px solid var(--navy);border-radius:0;background:#fff;color:var(--navy);font-family:var(--text);font-size:15px;font-weight:600;line-height:normal;text-shadow:none;box-shadow:none;cursor:pointer;}
  .tb-acctpage .woocommerce-MyAccount-content a.button:hover,
  .tb-acctpage .woocommerce-MyAccount-content button.button:hover,
  .tb-acctpage .woocommerce-MyAccount-content input.button:hover{background:var(--mist2);color:var(--navy);}
  /* the one that actually submits the form is the primary action */
  .tb-acctpage .woocommerce-MyAccount-content button.button[type=submit],
  .tb-acctpage .woocommerce-MyAccount-content input.button[type=submit]{background:var(--accent);border-color:var(--accent);color:var(--accent-ink);}
  .tb-acctpage .woocommerce-MyAccount-content button.button[type=submit]:hover,
  .tb-acctpage .woocommerce-MyAccount-content input.button[type=submit]:hover{background:var(--accent-d);border-color:var(--accent-d);color:var(--accent-ink);}

  /* 2. Stock templates print bare headings, which land at 39px against a 28px panel
        heading. Targeted by WooCommerce's own title classes and by "a heading inside a
        stock form" — NOT by a blanket `h2`, because our panel headings are equally
        class-less and a blanket rule would silently own them too. */
  .tb-acctpage .woocommerce-MyAccount-content .woocommerce-order-details__title,
  .tb-acctpage .woocommerce-MyAccount-content .woocommerce-column__title,
  .tb-acctpage .woocommerce-MyAccount-content .woocommerce-Address-title,
  .tb-acctpage .woocommerce-MyAccount-content form h2,
  .tb-acctpage .woocommerce-MyAccount-content > h2{font-size:clamp(20px,2vw,24px);margin:0 0 14px;}
  .tb-acctpage .woocommerce-MyAccount-content form h3,
  .tb-acctpage .woocommerce-MyAccount-content > h3{font-size:18px;margin:0 0 12px;}
