/* =============================================================================
   25-controls.css — Buttons, fields & micro-components
   -----------------------------------------------------------------------------
   The control layer of the whole store. It answers three questions once, in
   this file, and nothing below is allowed to answer them a second time.

   1 — ONE RADIUS SCALE.  Two values. That is the whole scale.

         --ctl-r         6px    EVERY rectangle in the control layer: field,
                                select, textarea, tick box, panel, card,
                                dropdown, notice, badge, counter, summary,
                                segment, stepper, sort trigger.
         --ctl-r-action  999px  RESERVED for a primary action. The paper pill
                                is the store's commit gesture and nothing else
                                in the store is allowed to borrow its corner.

       A circle is not a corner. Three things are genuinely round because
       round is their affordance — the radio, the loading ring, and the round
       icon buttons (view toggle, pagination, card action) that echo the
       hero's dot rail. They take 50%, and they are the only exceptions.
       --ctl-r-1 / --ctl-r-2 survive as aliases of --ctl-r so that no rule
       written before this scale existed can reintroduce a third corner.

   2 — ONE INPUT TREATMENT.  Flat, not graded. The page ground is --night at
       #0e1611; a field is a FLAT slab of --ctl-field-face, mixed several
       steps up towards --ink so it separates from the page by tone alone,
       finished with a single 1px inset highlight along its top edge and a
       warm hairline. No gradient, no drop shadow, no bevel: depth in this
       system comes from surface tone and one lit edge, nothing else.
       Focus adds a 2px accent-tinted ring — never a browser outline.

       Three planes, in this order, and the order is the point:

         panel   below the page   --ctl-panel-face  (a form's own ground)
         page    --night
         field   above the page   --ctl-field-face  (the thing you type in)

   3 — NO RAW BROWSER ARTEFACTS.  §12 removes or redraws every user-agent
       widget the store can surface: spin buttons, the search-cancel cross,
       autofill / strong-password / contacts keys, the caps-lock glyph, the
       textarea resizer grip, calendar buttons, MS clear/reveal, file-upload
       buttons, colour swatches, tap flashes, focus outlines and the OS
       scrollbar inside every control that scrolls. Checkboxes and radios are
       not restyled — §4 rebuilds them from `appearance: none`.

   4 — ONE ACCENT PER VIEW.  Link-green was the loudest thing on the checkout:
       every inline link, every required asterisk, every helper. §4b sets
       inline links in cream under a 1px accent rule instead, and demotes the
       asterisks to muted. The saturated accent survives in exactly two
       places per view — the display type's period, and the order Total.

   This file loads last, so it carries its own media queries.
   ========================================================================== */

:root {
  /* --- Warm paper washes -------------------------------------------------
     The hero draws its chrome as paper at low alpha over the photograph.
     Reusing that instead of the cold grey --color-border makes the controls
     read as part of the same object as the hero, not as a UI kit bolted on. */
  --ctl-wash-1: rgba(236, 229, 214, 0.05);
  --ctl-wash-2: rgba(236, 229, 214, 0.085);
  --ctl-wash-3: rgba(236, 229, 214, 0.14);
  --ctl-hair:   rgba(236, 229, 214, 0.16);
  --ctl-hair-2: rgba(236, 229, 214, 0.24);
  --ctl-hair-3: rgba(236, 229, 214, 0.44);

  /* The lit paper the hero's CTA warms to on hover (journey.css uses the same
     value); and --night-2 as rgb so glass grounds can take an alpha of it. */
  --ctl-paper-lit: #fffaf0;
  --ctl-night-rgb: 7, 12, 8;

  /* rgb mirrors of palette tokens so component rules can take an alpha of
     them without ever writing a fresh hex. Note --color-primary-rgb is the
     ACCENT green (158, 201, 138) — the one that reads on a dark ground. */
  --ctl-danger-rgb: 226, 112, 92;               /* --color-danger  */
  --ctl-gold-rgb:   213, 160, 94;               /* --color-secondary */

  --ctl-ease: cubic-bezier(0.2, 0.75, 0.2, 1);

  /* Cast shadows survive on exactly one class of object: things that FLOAT
     over the page — a dropdown, a popover, a control sitting on a photograph.
     No button, field or panel casts a shadow. */
  --ctl-lift: 0 30px 64px -26px rgba(0, 0, 0, 1);

  /* ======================================================================
     THE RADIUS SCALE — two values, and the aliases that keep it two.
     ====================================================================== */
  --ctl-r:        6px;
  --ctl-r-action: 999px;
  --ctl-r-1: var(--ctl-r);
  --ctl-r-2: var(--ctl-r);
  --ctl-radius: var(--ctl-r-action);

  /* ======================================================================
     THE ROW — one height for everything that shares a line.
     ====================================================================== */
  --ctl-h:       48px;   /* the row: button, select, trigger, segment  */
  --ctl-h-sm:    38px;   /* inline action inside a notice or a widget  */
  --ctl-h-lg:    56px;   /* a commit button that owns its own line     */
  --ctl-field-h: 48px;   /* a field is a control, so it is 48 too      */
  --ctl-box:     18px;   /* the tick box                               */
  --ctl-track:   0.09em;

  /* ======================================================================
     THE FIELD — one flat material, declared once.

     face   a flat slab lifted off --color-surface-2 towards --ink until it
            separates from the --night page by tone alone
     crown  a single 1px inset highlight along the top edge — the ONLY
            modelling in the system
     edge   a warm hairline that is actually visible on that slab
     ====================================================================== */
  --ctl-field-face:       color-mix(in srgb, var(--color-surface-2) 91%, var(--ink));
  --ctl-field-face-hover: color-mix(in srgb, var(--color-surface-2) 86%, var(--ink));
  --ctl-field-face-focus: color-mix(in srgb, var(--color-surface-2) 83%, var(--ink));

  /* Kept as tokens, set to `none`: every historical `background-image:
     var(--ctl-field-fill)` in this file therefore paints nothing, which is
     how the gradient leaves the system in one line instead of forty. */
  --ctl-field-fill:       none;
  --ctl-field-fill-hover: none;
  --ctl-field-fill-focus: none;

  --ctl-field-edge:     color-mix(in srgb, var(--ink) 17%, transparent);
  --ctl-field-edge-lit: color-mix(in srgb, var(--ink) 17%, transparent);
  --ctl-field-edge-hov: color-mix(in srgb, var(--ink) 30%, transparent);
  --ctl-field-edge-foc: rgba(var(--color-primary-rgb), 0.75);

  --ctl-field-ink:  var(--color-dark);
  --ctl-field-hint: color-mix(in srgb, var(--color-text-light) 78%, transparent);

  /* The crown, and nothing else. */
  --ctl-field-depth:       inset 0 1px 0 rgba(236, 229, 214, 0.10);
  --ctl-field-depth-hover: inset 0 1px 0 rgba(236, 229, 214, 0.15);
  --ctl-field-depth-focus: inset 0 1px 0 rgba(236, 229, 214, 0.17),
                           0 0 0 2px rgba(var(--color-primary-rgb), 0.42);
  --ctl-field-depth-error: inset 0 1px 0 rgba(236, 229, 214, 0.12),
                           0 0 0 2px rgba(var(--ctl-danger-rgb), 0.38);

  /* A form panel sits BELOW the page ground so the field slabs on it read as
     raised. Three planes, in order: panel < page < field. */
  --ctl-panel-face: color-mix(in srgb, var(--night-2) 62%, transparent);
  --ctl-panel-edge: color-mix(in srgb, var(--ink) 11%, transparent);

  --ctl-field-transition:
      background-color 0.3s var(--ctl-ease), border-color 0.3s var(--ctl-ease),
      box-shadow 0.3s var(--ctl-ease), color 0.3s var(--ctl-ease);

  /* --- Focus -------------------------------------------------------------
     main.css and woocommerce.css already say `box-shadow: var(--focus-ring)`
     in a dozen places, so redefining the token upgrades every one of them at
     once: the same 2px accent-tinted ring the fields use. */
  --focus-ring: 0 0 0 2px rgba(var(--color-primary-rgb), 0.55);

  /* --- WooCommerce's own form variables -----------------------------------
     WooCommerce paints its fields straight from these, at a specificity the
     theme would otherwise need !important to beat. Declaring them is the
     supported way in, and it reaches controls no rule below ever names. */
  --wc-form-color-background: color-mix(in srgb, var(--color-surface-2) 91%, var(--ink));
  --wc-form-color-text:       var(--color-dark);
  --wc-form-border-color:     color-mix(in srgb, var(--ink) 17%, transparent);
  --wc-form-border-width:     1px;
  --wc-form-border-radius:    6px;

  /* Re-eased globally: nothing on this site should pop. */
  --transition: color 0.3s var(--ctl-ease), background-color 0.3s var(--ctl-ease),
                border-color 0.3s var(--ctl-ease), box-shadow 0.3s var(--ctl-ease),
                transform 0.35s var(--ctl-ease), opacity 0.3s var(--ctl-ease);

  /* Legacy aliases: the two cast shadows the button family used to take. */
  --ctl-shadow:       none;
  --ctl-shadow-hover: none;
}


/* =============================================================================
   1. THE BUTTON FAMILY — shared shape and voice
   ========================================================================== */

.btn,
.teashop-btn,
.woocommerce a.button,
.woocommerce button.button,
.woocommerce input.button,
.woocommerce a.button.alt,
.woocommerce button.button.alt,
.woocommerce input.button.alt,
.woocommerce #respond input#submit,
.woocommerce-page a.button,
.woocommerce-page button.button,
.woocommerce-page input.button,
.woocommerce .woocommerce-Button,
.woocommerce button.single_add_to_cart_button,
.woocommerce .variations_form button.single_add_to_cart_button.button,
.wc-block-components-button:not(.is-link),
.wp-block-button__link,
.wp-element-button,
a.wp-block-button__link.add_to_cart_button,
.wc-block-grid__product-add-to-cart a.wp-block-button__link,
.shop-filter-btn {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  min-height: var(--ctl-h);
  padding: 0 28px;
  border: 1px solid transparent;
  border-radius: var(--ctl-radius);
  font-family: var(--font-primary);
  font-size: 0.75rem;
  font-weight: 700;
  line-height: 1;
  letter-spacing: var(--ctl-track);
  text-transform: uppercase;
  text-align: center;
  white-space: nowrap;
  cursor: pointer;
  -webkit-appearance: none;
  appearance: none;
  transition: color 0.3s var(--ctl-ease), background 0.3s var(--ctl-ease),
              border-color 0.3s var(--ctl-ease), box-shadow 0.4s var(--ctl-ease),
              transform 0.4s var(--ctl-ease);
}


/* --- Primary: the paper pill ------------------------------------------------
   Lifted straight off .journey-cta. The gradient runs ink -> paper so the pill
   catches light at the top edge; the inset hairline is the highlight that
   stops it reading as a flat sticker. --------------------------------------- */

.btn-primary,
.teashop-btn-primary,
.woocommerce a.button,
.woocommerce button.button,
.woocommerce input.button,
.woocommerce a.button.alt,
.woocommerce button.button.alt,
.woocommerce input.button.alt,
.woocommerce #respond input#submit,
.woocommerce-page a.button,
.woocommerce-page button.button,
.woocommerce-page input.button,
.woocommerce .woocommerce-Button,
.woocommerce button.single_add_to_cart_button,
.woocommerce .variations_form button.single_add_to_cart_button.button,
.wc-block-components-button:not(.is-link),
.wp-block-button__link,
.wp-element-button,
a.wp-block-button__link.add_to_cart_button,
.wc-block-grid__product-add-to-cart a.wp-block-button__link,
.shop-filter-btn {
  --ctl-spinner: var(--night);
  --ctl-spinner-track: rgba(14, 22, 17, 0.22);
  background: var(--paper);
  color: var(--night);
  border-color: var(--paper);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.55);
}

.btn-primary:hover,
.teashop-btn-primary:hover,
.woocommerce a.button:hover,
.woocommerce button.button:hover,
.woocommerce input.button:hover,
.woocommerce a.button.alt:hover,
.woocommerce button.button.alt:hover,
.woocommerce input.button.alt:hover,
.woocommerce #respond input#submit:hover,
.woocommerce-page a.button:hover,
.woocommerce-page button.button:hover,
.woocommerce-page input.button:hover,
.woocommerce .woocommerce-Button:hover,
.woocommerce button.single_add_to_cart_button:hover,
.woocommerce .variations_form button.single_add_to_cart_button.button:hover,
.wc-block-components-button:not(.is-link):hover,
.wp-block-button__link:hover,
.wp-element-button:hover,
a.wp-block-button__link.add_to_cart_button:hover,
.wc-block-grid__product-add-to-cart a.wp-block-button__link:hover,
.shop-filter-btn:hover {
  background: var(--ctl-paper-lit);
  color: var(--night);
  border-color: var(--ctl-paper-lit);
  transform: none;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.8);
}

.btn-primary:active,
.woocommerce a.button:active,
.woocommerce button.button:active,
.woocommerce input.button:active,
.woocommerce button.button.alt:active,
.wc-block-components-button:not(.is-link):active,
.wp-element-button:active {
  transform: none;
  background: var(--neutral-300);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.3);
}

/* The block-button label lives in a child div that WordPress colours on its
   own; without this the pill reads as a blank bar. */
.wc-block-components-button:not(.is-link) .wc-block-components-button__text,
.wc-block-components-button.wp-element-button:not(.is-link) {
  color: var(--night);
}


/* --- Secondary: hairline pill ------------------------------------------------
   Everything that supports the primary action. WooCommerce's own semantics do
   most of the sorting for us: `.alt` is the real action, plain `.button` in a
   notice or on a coupon row is the supporting one. --------------------------- */

.btn-outline,
.btn-outline-white,
.btn-secondary,
.teashop-btn-outline,
.woocommerce .button[name="apply_coupon"],
.woocommerce .button[name="update_cart"],
.woocommerce .checkout_coupon .button,
.woocommerce a.button.wc-backward,
.woocommerce-message a.button,
.woocommerce-info a.button,
.woocommerce-message .button,
.woocommerce-info .button,
.woocommerce .cart .button[name="update_cart"] {
  --ctl-spinner: var(--paper);
  --ctl-spinner-track: rgba(236, 229, 214, 0.22);
  background: var(--ctl-wash-1);
  color: var(--color-dark);
  border-color: var(--ctl-hair-2);
  box-shadow: none;
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
}

.btn-outline:hover,
.btn-outline-white:hover,
.btn-secondary:hover,
.teashop-btn-outline:hover,
.woocommerce .button[name="apply_coupon"]:hover,
.woocommerce .button[name="update_cart"]:hover,
.woocommerce .checkout_coupon .button:hover,
.woocommerce a.button.wc-backward:hover,
.woocommerce-message a.button:hover,
.woocommerce-info a.button:hover,
.woocommerce-message .button:hover,
.woocommerce-info .button:hover {
  background: var(--ctl-wash-2);
  color: var(--ink);
  border-color: var(--ctl-hair-3);
  transform: none;
  box-shadow: none;
}


/* --- Ghost: text with a hover ground ---------------------------------------- */

.btn-ghost,
.teashop-btn-ghost,
.wc-block-components-button.is-link,
.woocommerce-remove-coupon,
.woocommerce .woocommerce-form-login__rememberme + .lost_password a {
  background: transparent;
  border-color: transparent;
  color: var(--color-text-light);
  box-shadow: none;
}

.btn-ghost {
  padding: 0 18px;
}

.btn-ghost:hover,
.teashop-btn-ghost:hover,
.wc-block-components-button.is-link:hover {
  background: var(--ctl-wash-1);
  border-color: transparent;
  color: var(--ink);
  transform: none;
}

/* Danger stays a hairline too — a red block would out-shout the primary. */
.btn-danger,
.teashop-btn-danger {
  background: rgba(var(--ctl-danger-rgb), 0.08);
  color: var(--color-danger);
  border-color: rgba(var(--ctl-danger-rgb), 0.38);
  box-shadow: none;
}
.btn-danger:hover,
.teashop-btn-danger:hover {
  background: rgba(var(--ctl-danger-rgb), 0.16);
  border-color: rgba(var(--ctl-danger-rgb), 0.62);
  color: var(--color-danger);
  transform: none;
}


/* --- Sizes ------------------------------------------------------------------ */

.btn-sm,
.woocommerce .button.small,
.woocommerce-message .button,
.woocommerce-info .button {
  min-height: var(--ctl-h-sm);
  padding: 0 18px;
  font-size: 0.7rem;
  letter-spacing: 0.1em;
}

.btn-lg {
  min-height: var(--ctl-h-lg);
  padding: 0 40px;
  font-size: 0.8rem;
}

.btn-block,
.btn.btn-block {
  width: 100%;
}

.btn-icon {
  padding: 0;
  width: var(--ctl-h);
  min-height: var(--ctl-h);
}

/* The commit buttons of the whole store get the large treatment and fill
   their column — they are the end of a funnel, not an inline control. */
.woocommerce button.woocommerce-form-login__submit,
.woocommerce input.woocommerce-form-login__submit,
.woocommerce button.woocommerce-form-register__submit,
.woocommerce input.woocommerce-form-register__submit,
.woocommerce a.checkout-button,
.wc-block-cart__submit-button,
.wc-block-components-checkout-place-order-button {
  min-height: var(--ctl-h-lg);
  padding: 0 34px;
  font-size: 0.78rem;
}

.woocommerce a.checkout-button,
.wc-block-cart__submit-button,
.wc-block-components-checkout-place-order-button {
  width: 100%;
}

/* --- #place_order ------------------------------------------------------------
   WooCommerce styles this with an ID selector, and the theme's woocommerce.css
   answers it with `#payment #place_order { display: block !important }` — two
   IDs plus a bang. Nothing short of the same specificity reaches the store's
   single most important button, so match it exactly. This overrides the
   theme's own declaration, not the plugin's. -------------------------------- */
.woocommerce-checkout #payment #place_order,
.woocommerce #payment #place_order,
.woocommerce-checkout #place_order,
.woocommerce #place_order {
  display: inline-flex !important;
  align-items: center;
  justify-content: center;
  gap: 10px;
  width: 100%;
  min-height: var(--ctl-h-lg);
  padding: 0 34px;
  border: 1px solid var(--paper);
  border-radius: var(--ctl-radius);
  background: var(--paper);
  color: var(--night);
  font-family: var(--font-primary);
  font-size: 0.78rem;
  font-weight: 700;
  line-height: 1;
  letter-spacing: var(--ctl-track);
  text-transform: uppercase;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.55);
}
.woocommerce-checkout #payment #place_order:hover,
.woocommerce #payment #place_order:hover,
.woocommerce-checkout #place_order:hover,
.woocommerce #place_order:hover {
  background: var(--ctl-paper-lit);
  border-color: var(--ctl-paper-lit);
  color: var(--night);
  transform: none;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.8);
}
.woocommerce-checkout #payment #place_order:disabled,
.woocommerce #place_order:disabled {
  background: var(--ctl-wash-1);
  border-color: var(--ctl-hair);
  color: var(--color-text-muted);
  box-shadow: none;
  transform: none;
  cursor: not-allowed;
}


/* --- The forward arrow ------------------------------------------------------
   The hero's CTA ends in an arrow; so does every button that moves the visitor
   one step further down the funnel. Set explicitly so WooCommerce's own icon
   webfont glyph can never show through. ------------------------------------- */

.woocommerce a.button.wc-forward::after,
.woocommerce a.checkout-button::after,
.woocommerce-checkout #payment #place_order::after,
.woocommerce #payment #place_order::after,
.woocommerce #place_order::after,
.wc-block-cart__submit-button::after,
.btn.btn-forward::after {
  content: "\2192";
  font-family: var(--font-primary);
  font-size: 1.05em;
  line-height: 1;
  position: static;
  margin: 0;
  opacity: 0.75;
  transition: transform 0.4s var(--ctl-ease), opacity 0.3s var(--ctl-ease);
}
.woocommerce a.button.wc-forward:hover::after,
.woocommerce a.checkout-button:hover::after,
.woocommerce-checkout #payment #place_order:hover::after,
.woocommerce #payment #place_order:hover::after,
.woocommerce #place_order:hover::after,
.wc-block-cart__submit-button:hover::after,
.btn.btn-forward:hover::after {
  transform: translateX(4px);
  opacity: 1;
}

/* Backward actions get the mirror. */
.woocommerce a.button.wc-backward::before {
  content: "\2190";
  font-family: var(--font-primary);
  font-size: 1.05em;
  line-height: 1;
  opacity: 0.7;
  transition: transform 0.4s var(--ctl-ease);
}
.woocommerce a.button.wc-backward:hover::before { transform: translateX(-4px); }


/* =============================================================================
   2. DISABLED & LOADING
   ========================================================================== */

.btn:disabled,
.btn[disabled],
.btn.disabled,
.teashop-btn:disabled,
.woocommerce a.button.disabled,
.woocommerce button.button:disabled,
.woocommerce button.button[disabled],
.woocommerce button.button.disabled,
.woocommerce input.button:disabled,
.woocommerce input.button[disabled],
.woocommerce .variations_form button.single_add_to_cart_button.button.disabled,
.woocommerce .variations_form button.single_add_to_cart_button.button:disabled,
.wc-block-components-button:not(.is-link):disabled,
.wp-element-button:disabled {
  background: var(--ctl-wash-1);
  color: var(--color-text-muted);
  border-color: var(--ctl-hair);
  box-shadow: none;
  transform: none;
  opacity: 1;
  cursor: not-allowed;
}

.btn:disabled:hover,
.btn[disabled]:hover,
.btn.disabled:hover,
.woocommerce a.button.disabled:hover,
.woocommerce button.button:disabled:hover,
.woocommerce button.button[disabled]:hover,
.woocommerce button.button.disabled:hover,
.woocommerce input.button:disabled:hover,
.woocommerce .variations_form button.single_add_to_cart_button.button.disabled:hover,
.woocommerce .variations_form button.single_add_to_cart_button.button:disabled:hover,
.wc-block-components-button:not(.is-link):disabled:hover,
.wp-element-button:disabled:hover {
  background: var(--ctl-wash-1);
  color: var(--color-text-muted);
  border-color: var(--ctl-hair);
  transform: none;
  box-shadow: none;
}

/* Loading — WooCommerce fades the button to 25% and spins a glyph from its own
   icon font in the corner. Hold the pill at full strength instead, blank the
   label and centre a proper ring in it. */
.btn.loading,
.btn.is-loading,
.woocommerce a.button.loading,
.woocommerce button.button.loading,
.woocommerce input.button.loading,
.woocommerce .button.loading,
a.wp-block-button__link.add_to_cart_button.loading,
[aria-busy="true"].button,
[aria-busy="true"].btn {
  color: transparent;
  opacity: 1;
  padding-right: 28px;
  pointer-events: none;
  transform: none;
}

.btn.loading::after,
.btn.is-loading::after,
.woocommerce a.button.loading::after,
.woocommerce button.button.loading::after,
.woocommerce input.button.loading::after,
.woocommerce .button.loading::after,
a.wp-block-button__link.add_to_cart_button.loading::after,
[aria-busy="true"].button::after,
[aria-busy="true"].btn::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 17px;
  height: 17px;
  margin: -9px 0 0 -9px;
  border-radius: 50%;
  border: 2px solid var(--ctl-spinner-track, rgba(236, 229, 214, 0.22));
  border-top-color: var(--ctl-spinner, var(--paper));
  animation: ctl-spin 0.72s linear infinite;
  opacity: 1;
  font-size: 0;
  transform: none;
}

@keyframes ctl-spin { to { transform: rotate(360deg); } }

/* WooCommerce's "View cart" confirmation link that appears beside an added
   product — a quiet accent link, never a second pill. */
.woocommerce a.added_to_cart {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin-left: 10px;
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--color-accent);
  border-bottom: 1px solid rgba(var(--color-primary-rgb), 0.35);
}


/* =============================================================================
   3. THE FIELD — one material, one corner, one focus
   -----------------------------------------------------------------------------
   Everything typable in the store is this object and nothing else: a warm slab
   cut from --color-surface-2, two full steps ABOVE the page ground, lit along
   its crown, settled along its foot, standing on a contact shadow, cornered at
   --ctl-r-1. The treatment it replaces punched a --night-2 void INTO the page
   and held it with a hairline at 16% paper: on a --night page that reads as a
   hole, not as a control, which is exactly how a form ends up looking unstyled
   underneath a styled header.

   The selector list below is one rule on purpose. It opens with a
   zero-specificity :where() catch-all so a control nobody ever named — a
   plugin's field, a widget's input, a date picker — still arrives dressed, and
   so any workstream that owns a field of its own (the header's search, the
   footer's newsletter rule) overrides it with a single class. The store's own
   class names follow at their natural specificity, which is what beats
   WooCommerce's plugin CSS without one !important.
   ========================================================================== */

:where(
  input[type="text"], input[type="email"], input[type="tel"], input[type="url"],
  input[type="password"], input[type="search"], input[type="number"],
  input[type="date"], input[type="datetime-local"], input[type="month"],
  input[type="time"], input[type="week"], select, textarea
),
.woocommerce input.input-text,
.woocommerce textarea,
.woocommerce select,
.woocommerce .woocommerce-Input,
.woocommerce .variations select,
.woocommerce form .form-row input.input-text,
.woocommerce form .form-row textarea,
.woocommerce form .form-row select,
.woocommerce-page form .form-row input.input-text,
.woocommerce-page form .form-row textarea,
.woocommerce-page form .form-row select,
.woocommerce-ordering select,
.form-group input:not([type="checkbox"]):not([type="radio"]),
.form-group select,
.form-group textarea,
.comment-form input[type="text"],
.comment-form input[type="email"],
.comment-form input[type="url"],
.comment-form textarea,
.wc-block-components-text-input input,
.wc-block-components-textarea,
.wc-block-components-combobox-control input,
.wc-block-components-select__select,
.wc-block-components-select__container select,
.wp-block-search__input,
.select2-container--default .select2-selection--single {
  min-height: var(--ctl-field-h);
  max-width: 100%;
  padding: 14px 16px;
  -webkit-appearance: none;
  appearance: none;
  background-color: var(--ctl-field-face);
  background-image: var(--ctl-field-fill);
  color: var(--ctl-field-ink);
  border: 1px solid var(--ctl-field-edge);
  border-top-color: var(--ctl-field-edge-lit);
  border-radius: var(--ctl-r-1);
  font-family: var(--font-primary);
  font-size: 0.9375rem;
  font-weight: 400;
  line-height: 1.5;
  letter-spacing: 0.005em;
  outline: none;
  box-shadow: var(--ctl-field-depth);
  transition: var(--ctl-field-transition);
}

/* Store fields fill their column. The :where() catch-all deliberately does
   not, so a stray control keeps its intrinsic width. */
.woocommerce input.input-text,
.woocommerce textarea,
.woocommerce select,
.woocommerce .woocommerce-Input,
.woocommerce .variations select,
.woocommerce form .form-row input.input-text,
.woocommerce form .form-row textarea,
.woocommerce form .form-row select,
.woocommerce-page form .form-row input.input-text,
.woocommerce-page form .form-row textarea,
.woocommerce-page form .form-row select,
.woocommerce-ordering select,
.form-group input:not([type="checkbox"]):not([type="radio"]),
.form-group select,
.form-group textarea,
.comment-form input[type="text"],
.comment-form input[type="email"],
.comment-form input[type="url"],
.comment-form textarea,
.wc-block-components-text-input input,
.wc-block-components-textarea,
.wc-block-components-combobox-control input,
.wc-block-components-select__select,
.wc-block-components-select__container select,
.wp-block-search__input,
.select2-container--default .select2-selection--single {
  width: 100%;
}

/* Hover raises the slab a little further off the page — the same gesture the
   buttons make, minus the translate. */
:where(
  input[type="text"], input[type="email"], input[type="tel"], input[type="url"],
  input[type="password"], input[type="search"], input[type="number"],
  input[type="date"], input[type="datetime-local"], input[type="month"],
  input[type="time"], input[type="week"], select, textarea
):hover,
.woocommerce input.input-text:hover,
.woocommerce textarea:hover,
.woocommerce select:hover,
.woocommerce .woocommerce-Input:hover,
.woocommerce .variations select:hover,
.woocommerce form .form-row input.input-text:hover,
.woocommerce form .form-row textarea:hover,
.woocommerce form .form-row select:hover,
.woocommerce-page form .form-row input.input-text:hover,
.woocommerce-page form .form-row textarea:hover,
.woocommerce-page form .form-row select:hover,
.woocommerce-ordering select:hover,
.form-group input:not([type="checkbox"]):not([type="radio"]):hover,
.form-group select:hover,
.form-group textarea:hover,
.comment-form input[type="text"]:hover,
.comment-form input[type="email"]:hover,
.comment-form input[type="url"]:hover,
.comment-form textarea:hover,
.wc-block-components-text-input input:hover,
.wc-block-components-textarea:hover,
.wc-block-components-combobox-control input:hover,
.wc-block-components-select__select:hover,
.wc-block-components-select__container select:hover,
.wp-block-search__input:hover,
.select2-container--default .select2-selection--single:hover {
  background-color: var(--ctl-field-face-hover);
  background-image: none;
  border-color: var(--ctl-field-edge-hov);
  box-shadow: var(--ctl-field-depth-hover);
}

/* Focus: the accent hairline plus a soft halo, never the UA ring. select2
   fakes focus with two container classes, so they join the same rule. */
:where(
  input[type="text"], input[type="email"], input[type="tel"], input[type="url"],
  input[type="password"], input[type="search"], input[type="number"],
  input[type="date"], input[type="datetime-local"], input[type="month"],
  input[type="time"], input[type="week"], select, textarea
):focus,
.woocommerce input.input-text:focus,
.woocommerce textarea:focus,
.woocommerce select:focus,
.woocommerce .woocommerce-Input:focus,
.woocommerce .variations select:focus,
.woocommerce form .form-row input.input-text:focus,
.woocommerce form .form-row textarea:focus,
.woocommerce form .form-row select:focus,
.woocommerce-page form .form-row input.input-text:focus,
.woocommerce-page form .form-row textarea:focus,
.woocommerce-page form .form-row select:focus,
.woocommerce-ordering select:focus,
.form-group input:not([type="checkbox"]):not([type="radio"]):focus,
.form-group select:focus,
.form-group textarea:focus,
.comment-form input[type="text"]:focus,
.comment-form input[type="email"]:focus,
.comment-form input[type="url"]:focus,
.comment-form textarea:focus,
.wc-block-components-text-input input:focus,
.wc-block-components-textarea:focus,
.wc-block-components-combobox-control input:focus,
.wc-block-components-select__select:focus,
.wc-block-components-select__container select:focus,
.wp-block-search__input:focus,
.select2-container--default .select2-selection--single:focus,
.select2-container--default.select2-container--focus .select2-selection--single,
.select2-container--default.select2-container--open .select2-selection--single {
  background-color: var(--ctl-field-face-focus);
  background-image: none;
  border-color: var(--ctl-field-edge-foc);
  box-shadow: var(--ctl-field-depth-focus);
  outline: none;
}

/* Placeholders sit a clear step below entered text so a filled field reads as
   filled at a glance. */
:where(
  input[type="text"], input[type="email"], input[type="tel"], input[type="url"],
  input[type="password"], input[type="search"], input[type="number"],
  input[type="date"], input[type="datetime-local"], input[type="month"],
  input[type="time"], input[type="week"], select, textarea
)::placeholder,
.woocommerce input.input-text::placeholder,
.woocommerce textarea::placeholder,
.woocommerce select::placeholder,
.woocommerce .woocommerce-Input::placeholder,
.woocommerce .variations select::placeholder,
.woocommerce form .form-row input.input-text::placeholder,
.woocommerce form .form-row textarea::placeholder,
.woocommerce form .form-row select::placeholder,
.woocommerce-page form .form-row input.input-text::placeholder,
.woocommerce-page form .form-row textarea::placeholder,
.woocommerce-page form .form-row select::placeholder,
.woocommerce-ordering select::placeholder,
.form-group input:not([type="checkbox"]):not([type="radio"])::placeholder,
.form-group select::placeholder,
.form-group textarea::placeholder,
.comment-form input[type="text"]::placeholder,
.comment-form input[type="email"]::placeholder,
.comment-form input[type="url"]::placeholder,
.comment-form textarea::placeholder,
.wc-block-components-text-input input::placeholder,
.wc-block-components-textarea::placeholder,
.wc-block-components-combobox-control input::placeholder,
.wc-block-components-select__select::placeholder,
.wc-block-components-select__container select::placeholder,
.wp-block-search__input::placeholder,
.select2-container--default .select2-selection--single::placeholder,
.select2-container--default .select2-selection--single .select2-selection__placeholder {
  color: var(--ctl-field-hint);
  opacity: 1;
  font-weight: 400;
  letter-spacing: 0.01em;
}


/* Disabled and read-only fields lose the slab: no lift, no crown, no cast —
   they sit flush with the page and read as "not yours to fill". Without this
   a disabled control is indistinguishable from a live one. */
.woocommerce input.input-text:disabled,
.woocommerce textarea:disabled,
.woocommerce select:disabled,
.woocommerce form .form-row input.input-text:disabled,
.woocommerce form .form-row select:disabled,
.form-group input:disabled,
.form-group select:disabled,
.form-group textarea:disabled,
.select2-container--disabled .select2-selection--single,
:where(input, select, textarea):disabled {
  background-color: transparent;
  background-image: none;
  border-color: var(--ctl-hair);
  border-top-color: var(--ctl-hair);
  color: var(--color-text-muted);
  box-shadow: none;
  cursor: not-allowed;
  opacity: 1;
}
.woocommerce input.input-text[readonly],
.woocommerce form .form-row input.input-text[readonly],
.form-group input[readonly],
:where(input, textarea)[readonly] {
  background-image: none;
  background-color: var(--ctl-wash-1);
  border-color: var(--ctl-hair);
  box-shadow: none;
  color: var(--color-text-light);
  cursor: default;
}
.woocommerce input.input-text:disabled:hover,
.woocommerce select:disabled:hover,
.form-group input:disabled:hover,
:where(input, select, textarea):disabled:hover,
:where(input, textarea)[readonly]:hover {
  background-image: none;
  border-color: var(--ctl-hair);
  box-shadow: none;
}


/* --- Textarea --------------------------------------------------------------
   The one field that is taller than it is deep. Same slab, more room, and the
   UA's grabber triangle is removed in section 12 — resizing still works. */
.woocommerce textarea,
.woocommerce form .form-row textarea,
.form-group textarea,
.comment-form textarea,
.wc-block-components-textarea,
:where(textarea) {
  min-height: 132px;
  padding-top: 15px;
  padding-bottom: 15px;
  resize: vertical;
  line-height: 1.65;
}

/* --- Native select ---------------------------------------------------------
   `appearance: none` above already removed the system widget, so nothing here
   is a UA chevron. The mark is drawn from two 1px diagonals in currentColor —
   no icon font, no data URI, no stock triangle — and it inherits every state
   the field already has because it is painted in the field's own ink. -------- */
.woocommerce select,
.woocommerce .variations select,
.woocommerce form .form-row select,
.woocommerce-page form .form-row select,
.woocommerce-ordering select,
.form-group select,
.wc-block-components-select__select,
.wc-block-components-select__container select,
:where(select) {
  padding-right: 46px;
  background-image:
    linear-gradient(to top right, transparent calc(50% - 0.7px), currentColor calc(50% - 0.7px), currentColor calc(50% + 0.7px), transparent calc(50% + 0.7px)),
    linear-gradient(to bottom right, transparent calc(50% - 0.7px), currentColor calc(50% - 0.7px), currentColor calc(50% + 0.7px), transparent calc(50% + 0.7px));
  background-size: 8px 8px, 8px 8px;
  background-position: right 24px center, right 17px center;
  background-repeat: no-repeat;
  cursor: pointer;
  text-overflow: ellipsis;
}

/* The popup itself is drawn by the OS; `color-scheme: dark` in main.css is
   what keeps it from opening white. These two only fix the rows' colours. */
.woocommerce select option,
.form-group select option,
:where(select) option,
:where(select) optgroup {
  background: var(--color-surface);
  color: var(--color-text);
}
:where(select) optgroup {
  color: var(--color-text-muted);
  font-style: normal;
}

/* --- Validation ------------------------------------------------------------
   WooCommerce only recolours the border; pair it with the field's own depth
   token so the state reads as the same object in a different mood. */
.woocommerce form .form-row.woocommerce-invalid input.input-text,
.woocommerce form .form-row.woocommerce-invalid select,
.woocommerce form .form-row.woocommerce-invalid textarea,
.woocommerce form .form-row.woocommerce-invalid .select2-container--default .select2-selection--single {
  border-color: rgba(var(--ctl-danger-rgb), 0.7);
  box-shadow: var(--ctl-field-depth-error);
}
.woocommerce form .form-row.woocommerce-validated input.input-text,
.woocommerce form .form-row.woocommerce-validated select,
.woocommerce form .form-row.woocommerce-validated .select2-container--default .select2-selection--single {
  border-color: rgba(var(--color-primary-rgb), 0.5);
}
.woocommerce form .form-row.woocommerce-invalid label,
.woocommerce form .form-row.woocommerce-invalid > label:not(.checkbox) {
  color: var(--color-danger);
}

/* Autofill. Chrome repaints the field near-white with black text and the only
   lever left is an inset shadow, which has to be an opaque colour — which is
   exactly why the field's face is a solid token and not a wash. */
.woocommerce input:-webkit-autofill,
.woocommerce input:-webkit-autofill:hover,
.woocommerce input:-webkit-autofill:focus,
.woocommerce input:-webkit-autofill:active,
.woocommerce textarea:-webkit-autofill,
.woocommerce select:-webkit-autofill,
.form-group input:-webkit-autofill,
.comment-form input:-webkit-autofill,
input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
textarea:-webkit-autofill,
select:-webkit-autofill {
  -webkit-text-fill-color: var(--ctl-field-ink);
  -webkit-box-shadow: 0 0 0 1000px var(--ctl-field-face) inset;
  box-shadow: 0 0 0 1000px var(--ctl-field-face) inset;
  caret-color: var(--color-accent);
  transition: background-color 100000s ease 0s;
}

/* Every field's caret is the accent — a 1px brand mark that only shows while
   someone is actually typing. */
.woocommerce input.input-text,
.woocommerce textarea,
.form-group input,
.form-group textarea,
:where(input, textarea) {
  caret-color: var(--color-accent);
}


/* --- Rhythm -----------------------------------------------------------------
   WooCommerce stacks its rows 16px apart, which on a 52px field reads as a
   list of boxes. 20px lets each label/field pair read as one unit with air
   around it — and the two address lines, which are one address, close back up
   to 8px so they group the way they are read. ------------------------------- */
.woocommerce form .form-row,
.woocommerce-page form .form-row {
  margin-bottom: var(--space-5);
}
.woocommerce form .form-row#billing_address_2_field,
.woocommerce form .form-row#shipping_address_2_field,
.woocommerce-page form .form-row#billing_address_2_field,
.woocommerce-page form .form-row#shipping_address_2_field {
  margin-top: -12px;
}
.woocommerce form .form-row:last-child { margin-bottom: 0; }


/* --- Labels & required ------------------------------------------------------
   Field labels take the hero's micro-kicker voice: 0.7rem, 0.13em, uppercase,
   muted. Checkbox labels are excluded — those are sentences, not labels. */

.woocommerce form .form-row > label:not(.woocommerce-form__label-for-checkbox):not(.checkbox),
.woocommerce-page form .form-row > label:not(.woocommerce-form__label-for-checkbox):not(.checkbox),
.woocommerce .woocommerce-address-fields .form-row > label:not(.checkbox),
.wc-block-components-text-input label,
.form-group > label,
.comment-form > p > label {
  display: block;
  margin-bottom: 9px;
  font-size: 0.7rem;
  font-weight: 600;
  line-height: 1.4;
  letter-spacing: 0.13em;
  text-transform: uppercase;
  color: var(--color-text-light);
  transition: color 0.3s var(--ctl-ease);
}

/* The label brightens with its own field — the pair reads as one component. */
.woocommerce form .form-row:focus-within > label:not(.woocommerce-form__label-for-checkbox):not(.checkbox),
.woocommerce-page form .form-row:focus-within > label:not(.woocommerce-form__label-for-checkbox):not(.checkbox),
.form-group:focus-within > label {
  color: var(--color-accent);
}

.woocommerce form .form-row .required,
.woocommerce .required {
  color: rgba(var(--color-primary-rgb), 0.85);
  border: 0;
  text-decoration: none;
  font-weight: 400;
}
.woocommerce form .form-row .optional {
  color: var(--color-text-muted);
  font-size: 0.92em;
  letter-spacing: 0.08em;
}

/* --- The password reveal ----------------------------------------------------
   WooCommerce ships this eye as an SVG data URI with `fill="#111111"` baked
   into it, so on a dark field it renders as a black smudge in the corner —
   the single most visible raw plugin artefact on My Account. It cannot be
   recoloured, only replaced: the same two glyphs are re-declared here as a
   MASK, which makes the icon take `currentColor` and therefore every state
   the rest of the control set already has. ---------------------------------- */
.woocommerce form .woocommerce-password-input input.input-text,
.woocommerce form .form-row .woocommerce-password-input input.input-text,
.woocommerce form .password-input input[type="password"],
.woocommerce-page form .password-input input[type="password"] {
  padding-right: 48px;
}
.woocommerce form .password-input,
.woocommerce-page form .password-input,
.woocommerce form .woocommerce-password-input { display: block; position: relative; }

.woocommerce form .show-password-input,
.woocommerce-page form .show-password-input,
.woocommerce form .woocommerce-password-input .show-password-input {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  right: 9px;
  padding: 0;
  border: 0;
  border-radius: var(--ctl-r-1);
  background-color: transparent;
  color: var(--color-text-light);
  transition: color 0.3s var(--ctl-ease), background-color 0.3s var(--ctl-ease);
}
.woocommerce form .show-password-input::before,
.woocommerce-page form .show-password-input::before {
  content: "";
  display: block;
  width: 19px;
  height: 19px;
  background-image: none;
  background-color: currentColor;
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  -webkit-mask-size: contain;
  mask-size: contain;
  -webkit-mask-position: center;
  mask-position: center;
  -webkit-mask-image: url('data:image/svg+xml,<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M17.3 3.3C16.9 2.9 16.2 2.9 15.7 3.3L13.3 5.7C12.2437 5.3079 11.1267 5.1048 10 5.1C6.2 5.2 2.8 7.2 1 10.5C1.2 10.9 1.5 11.3 1.8 11.7C2.6 12.8 3.6 13.7 4.7 14.4L3 16.1C2.6 16.5 2.5 17.2 3 17.7C3.4 18.1 4.1 18.2 4.6 17.7L17.3 4.9C17.7 4.4 17.7 3.7 17.3 3.3ZM6.7 12.3L5.4 13.6C4.2 12.9 3.1 11.9 2.3 10.7C3.5 9 5.1 7.8 7 7.2C5.7 8.6 5.6 10.8 6.7 12.3ZM10.1 9C9.6 8.5 9.7 7.7 10.2 7.2C10.7 6.8 11.4 6.8 11.9 7.2L10.1 9ZM18.3 9.5C17.8 8.8 17.2 8.1 16.5 7.6L15.5 8.6C16.3 9.2 17 9.9 17.6 10.8C15.9 13.4 13 15 9.9 15H9.1L8.1 16C8.8 15.9 9.4 16 10 16C13.3 16 16.4 14.4 18.3 11.7C18.6 11.3 18.8 10.9 19.1 10.5C18.8 10.2 18.6 9.8 18.3 9.5ZM14 10L10 14C12.2 14 14 12.2 14 10Z"/></svg>');
  mask-image: url('data:image/svg+xml,<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M17.3 3.3C16.9 2.9 16.2 2.9 15.7 3.3L13.3 5.7C12.2437 5.3079 11.1267 5.1048 10 5.1C6.2 5.2 2.8 7.2 1 10.5C1.2 10.9 1.5 11.3 1.8 11.7C2.6 12.8 3.6 13.7 4.7 14.4L3 16.1C2.6 16.5 2.5 17.2 3 17.7C3.4 18.1 4.1 18.2 4.6 17.7L17.3 4.9C17.7 4.4 17.7 3.7 17.3 3.3ZM6.7 12.3L5.4 13.6C4.2 12.9 3.1 11.9 2.3 10.7C3.5 9 5.1 7.8 7 7.2C5.7 8.6 5.6 10.8 6.7 12.3ZM10.1 9C9.6 8.5 9.7 7.7 10.2 7.2C10.7 6.8 11.4 6.8 11.9 7.2L10.1 9ZM18.3 9.5C17.8 8.8 17.2 8.1 16.5 7.6L15.5 8.6C16.3 9.2 17 9.9 17.6 10.8C15.9 13.4 13 15 9.9 15H9.1L8.1 16C8.8 15.9 9.4 16 10 16C13.3 16 16.4 14.4 18.3 11.7C18.6 11.3 18.8 10.9 19.1 10.5C18.8 10.2 18.6 9.8 18.3 9.5ZM14 10L10 14C12.2 14 14 12.2 14 10Z"/></svg>');
}
.woocommerce form .show-password-input.display-password::before,
.woocommerce-page form .show-password-input.display-password::before {
  background-image: none;
  -webkit-mask-image: url('data:image/svg+xml,<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M18.3 9.49999C15 4.89999 8.50002 3.79999 3.90002 7.19999C2.70002 8.09999 1.70002 9.29999 0.900024 10.6C1.10002 11 1.40002 11.4 1.70002 11.8C5.00002 16.4 11.3 17.4 15.9 14.2C16.8 13.5 17.6 12.8 18.3 11.8C18.6 11.4 18.8 11 19.1 10.6C18.8 10.2 18.6 9.79999 18.3 9.49999ZM10.1 7.19999C10.6 6.69999 11.4 6.69999 11.9 7.19999C12.4 7.69999 12.4 8.49999 11.9 8.99999C11.4 9.49999 10.6 9.49999 10.1 8.99999C9.60003 8.49999 9.60003 7.69999 10.1 7.19999ZM10 14.9C6.90002 14.9 4.00002 13.3 2.30002 10.7C3.50002 8.99999 5.10002 7.79999 7.00002 7.19999C6.30002 7.99999 6.00002 8.89999 6.00002 9.89999C6.00002 12.1 7.70002 14 10 14C12.2 14 14.1 12.3 14.1 9.99999V9.89999C14.1 8.89999 13.7 7.89999 13 7.19999C14.9 7.79999 16.5 8.99999 17.7 10.7C16 13.3 13.1 14.9 10 14.9Z"/></svg>');
  mask-image: url('data:image/svg+xml,<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M18.3 9.49999C15 4.89999 8.50002 3.79999 3.90002 7.19999C2.70002 8.09999 1.70002 9.29999 0.900024 10.6C1.10002 11 1.40002 11.4 1.70002 11.8C5.00002 16.4 11.3 17.4 15.9 14.2C16.8 13.5 17.6 12.8 18.3 11.8C18.6 11.4 18.8 11 19.1 10.6C18.8 10.2 18.6 9.79999 18.3 9.49999ZM10.1 7.19999C10.6 6.69999 11.4 6.69999 11.9 7.19999C12.4 7.69999 12.4 8.49999 11.9 8.99999C11.4 9.49999 10.6 9.49999 10.1 8.99999C9.60003 8.49999 9.60003 7.69999 10.1 7.19999ZM10 14.9C6.90002 14.9 4.00002 13.3 2.30002 10.7C3.50002 8.99999 5.10002 7.79999 7.00002 7.19999C6.30002 7.99999 6.00002 8.89999 6.00002 9.89999C6.00002 12.1 7.70002 14 10 14C12.2 14 14.1 12.3 14.1 9.99999V9.89999C14.1 8.89999 13.7 7.89999 13 7.19999C14.9 7.79999 16.5 8.99999 17.7 10.7C16 13.3 13.1 14.9 10 14.9Z"/></svg>');
}
.woocommerce form .show-password-input:hover,
.woocommerce-page form .show-password-input:hover {
  color: var(--color-accent);
  background-color: var(--ctl-wash-2);
}
.woocommerce form .show-password-input.display-password,
.woocommerce-page form .show-password-input.display-password {
  color: var(--color-accent);
}
.woocommerce form .show-password-input:focus-visible {
  outline: none;
  color: var(--color-accent);
  box-shadow: 0 0 0 2px rgba(var(--color-primary-rgb), 0.55);
}

/* The register form's strength meter — a strip, not a plugin banner. */
.woocommerce .woocommerce-password-strength {
  margin-top: 8px;
  padding: 9px 13px;
  border: 1px solid var(--ctl-hair);
  border-radius: var(--ctl-r-1);
  background: var(--ctl-wash-1);
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  text-align: left;
  color: var(--color-text-light);
}
.woocommerce .woocommerce-password-strength.strong { color: var(--color-accent); border-color: rgba(var(--color-primary-rgb), 0.4); }
.woocommerce .woocommerce-password-strength.short,
.woocommerce .woocommerce-password-strength.bad { color: var(--color-danger); border-color: rgba(var(--ctl-danger-rgb), 0.4); }
.woocommerce .woocommerce-password-strength.good { color: var(--color-secondary); border-color: rgba(var(--ctl-gold-rgb), 0.4); }
.woocommerce .woocommerce-password-hint {
  display: block;
  margin-top: 7px;
  font-size: 0.78rem;
  color: var(--color-text-muted);
}


/* =============================================================================
   3b. THE PLANES — what a field stands on
   -----------------------------------------------------------------------------
   A raised field only reads as raised if the thing behind it is not also
   raised. So the form panels invert: they sit BELOW the page ground, held by
   the faintest hairline. Three planes, in order — panel < page < field — which
   is the depth the control layer was missing.

   These are WooCommerce's own boxes, which ship with a 5px corner, a grey
   border and 20px of padding. They are part of the control layer, so they
   join the scale at --ctl-r-2 and take the panel plane.
   ========================================================================== */

.woocommerce form.login,
.woocommerce form.register,
.woocommerce form.lost_reset_password,
.woocommerce form.checkout_coupon,
.woocommerce-checkout .checkout_coupon,
.woocommerce-page form.login,
.woocommerce-page form.register,
.woocommerce-checkout #order_review,
.woocommerce-checkout #payment div.payment_box,
.woocommerce .woocommerce-address-fields__field-wrapper {
  border-radius: var(--ctl-r-2);
}

.woocommerce form.login,
.woocommerce form.register,
.woocommerce form.lost_reset_password,
.woocommerce form.checkout_coupon,
.woocommerce-checkout .checkout_coupon,
.woocommerce-page form.login,
.woocommerce-page form.register {
  position: relative;
  margin: 0 0 var(--space-7);
  /* Symmetrical. 40 top against 32 bottom left the card sitting a step low in
     its own frame, which is exactly the tell that says nobody looked at it. */
  padding: 44px;
  background: var(--ctl-panel-face);
  border: 1px solid var(--ctl-panel-edge);
  box-shadow: inset 0 1px 0 rgba(236, 229, 214, 0.03),
              0 30px 64px -54px rgba(0, 0, 0, 1);
}

/* The hero's signature: a 34x1px rule. Here it rides the panel's top edge and
   marks where the form begins. */
.woocommerce form.login::before,
.woocommerce form.register::before,
.woocommerce form.lost_reset_password::before,
.woocommerce-page form.login::before,
.woocommerce-page form.register::before {
  content: "";
  position: absolute;
  top: -1px;
  left: var(--space-8);
  width: 34px;
  height: 1px;
  background: var(--color-accent);
}

/* The checkout's summary card and payment box are the same plane. */
.woocommerce-checkout #order_review {
  background: var(--ctl-panel-face);
  border-color: var(--ctl-panel-edge);
}
.woocommerce-checkout #payment div.payment_box {
  background: var(--ctl-wash-1);
  border-color: var(--ctl-panel-edge);
}

/* Notices stand in the same view as the fields — on checkout they are the
   first two things above the form — so they take the panel plane, the same
   corner, and a 1px editorial rule down their leading edge instead of the
   3px coloured slab of an alert component. */
.woocommerce .woocommerce-message,
.woocommerce .woocommerce-info,
.woocommerce .woocommerce-error,
.woocommerce .woocommerce-noreviews,
.woocommerce-message,
.woocommerce-info,
.woocommerce-error {
  border: 1px solid var(--ctl-panel-edge);
  border-left: 2px solid var(--ctl-hair-2);
  border-radius: var(--ctl-r-2);
  background: var(--ctl-panel-face);
  box-shadow: inset 0 1px 0 rgba(236, 229, 214, 0.03);
  color: var(--color-text);
}
.woocommerce .woocommerce-message,
.woocommerce-message { border-left-color: var(--color-accent); }
.woocommerce .woocommerce-error,
.woocommerce-error { border-left-color: var(--color-danger); }


/* =============================================================================
   4. CHECKBOXES & RADIOS — rebuilt, not restyled
   -----------------------------------------------------------------------------
   `appearance: none` deletes the OS widget outright; everything you see below
   is drawn here. One box, one size, one behaviour:

     18px square, --ctl-r, sitting on the field surface
     1px stroke of the accent at 25% — the box announces itself as brand
       chrome even when it is empty, which is what stops it reading as a grey
       system square parked in an editorial page
     checked -> a solid --color-primary fill with a cream check cut into it
       (the palette's own rule: paper ink sits on the primary fill)
     the radio is the same object as a circle with a cream dot

   The box is floated into a 30px gutter and centred on the label's optical
   middle (top: 50%), so a one-line label and a two-line sentence both come
   out centred; and the rows that put a tick box next to a button centre the
   whole cluster on that button rather than hanging it from its top edge.
   ========================================================================== */

.woocommerce input[type="checkbox"],
.woocommerce .input-checkbox,
.woocommerce-page .input-checkbox,
.woocommerce-page .woocommerce-form__input-checkbox,
.woocommerce form .form-row .input-checkbox,
.woocommerce .woocommerce-form__input-checkbox,
input[type="checkbox"].input-checkbox,
input[type="checkbox"].woocommerce-form__input-checkbox,
.filter-item input[type="checkbox"],
.form-group input[type="checkbox"],
.wc-block-components-checkbox__input,
.woocommerce input[type="radio"],
.shipping-option-left input[type="radio"],
.payment-option-header input[type="radio"],
.woocommerce ul.wc_payment_methods input[type="radio"],
.form-group input[type="radio"],
:where(input[type="checkbox"], input[type="radio"]) {
  -webkit-appearance: none;
  appearance: none;
  display: inline-grid;
  place-content: center;
  flex: none;
  width: var(--ctl-box);
  height: var(--ctl-box);
  min-width: var(--ctl-box);
  min-height: var(--ctl-box);
  margin: 0;
  padding: 0;
  vertical-align: middle;
  /* An unticked box is a WELL, not a slab.  Given the field's own raised face
     it read at 18px as a small grey lozenge — the shape of a disabled input —
     and the faint green hairline was invisible against it.  Recessed below
     the panel with a warm paper edge, empty and ticked are now two obviously
     different states rather than two tones of the same one. */
  background-color: color-mix(in srgb, var(--night-2) 76%, transparent);
  background-image: none;
  border: 1px solid var(--ctl-hair-2);
  border-radius: var(--ctl-r);
  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.5);
  cursor: pointer;
  transition: background-color 0.24s var(--ctl-ease), border-color 0.24s var(--ctl-ease),
              box-shadow 0.24s var(--ctl-ease);
}

/* A circle is a shape, not a corner. */
.woocommerce input[type="radio"],
.shipping-option-left input[type="radio"],
.payment-option-header input[type="radio"],
.woocommerce ul.wc_payment_methods input[type="radio"],
.form-group input[type="radio"],
:where(input[type="radio"]) {
  border-radius: 50%;
}

.woocommerce input[type="checkbox"]:hover,
.woocommerce .input-checkbox:hover,
.woocommerce form .form-row .input-checkbox:hover,
.filter-item input[type="checkbox"]:hover,
.form-group input[type="checkbox"]:hover,
.woocommerce input[type="radio"]:hover,
.form-group input[type="radio"]:hover,
:where(input[type="checkbox"], input[type="radio"]):hover {
  background-color: color-mix(in srgb, var(--night-2) 60%, transparent);
  border-color: rgba(var(--color-primary-rgb), 0.62);
  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.5),
              0 0 0 3px rgba(var(--color-primary-rgb), 0.10);
}

/* The check is a clip-path, so it needs no icon font and scales cleanly. */
.woocommerce input[type="checkbox"]::before,
.woocommerce .input-checkbox::before,
.woocommerce form .form-row .input-checkbox::before,
input[type="checkbox"].input-checkbox::before,
input[type="checkbox"].woocommerce-form__input-checkbox::before,
.filter-item input[type="checkbox"]::before,
.form-group input[type="checkbox"]::before,
:where(input[type="checkbox"])::before {
  content: "";
  width: 11px;
  height: 11px;
  background: var(--paper);
  transform: scale(0.4);
  opacity: 0;
  transform-origin: center;
  transition: transform 0.22s var(--ctl-ease), opacity 0.16s var(--ctl-ease);
  clip-path: polygon(14% 47%, 0 61%, 39% 100%, 100% 19%, 86% 5%, 37% 71%);
}

.woocommerce input[type="checkbox"]:checked,
.woocommerce .input-checkbox:checked,
.woocommerce form .form-row .input-checkbox:checked,
input[type="checkbox"].input-checkbox:checked,
input[type="checkbox"].woocommerce-form__input-checkbox:checked,
.filter-item input[type="checkbox"]:checked,
.form-group input[type="checkbox"]:checked,
:where(input[type="checkbox"], input[type="radio"]):checked {
  background-color: var(--color-primary);
  background-image: none;
  border-color: var(--color-primary);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.22);
}

.woocommerce input[type="checkbox"]:checked::before,
.woocommerce .input-checkbox:checked::before,
.woocommerce form .form-row .input-checkbox:checked::before,
input[type="checkbox"].input-checkbox:checked::before,
input[type="checkbox"].woocommerce-form__input-checkbox:checked::before,
.filter-item input[type="checkbox"]:checked::before,
.form-group input[type="checkbox"]:checked::before,
:where(input[type="checkbox"]):checked::before {
  transform: scale(1);
  opacity: 1;
}

.woocommerce input[type="radio"]::before,
.shipping-option-left input[type="radio"]::before,
.payment-option-header input[type="radio"]::before,
.woocommerce ul.wc_payment_methods input[type="radio"]::before,
.form-group input[type="radio"]::before,
:where(input[type="radio"])::before {
  content: "";
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--paper);
  transform: scale(0);
  transition: transform 0.22s var(--ctl-ease);
}
.woocommerce input[type="radio"]:checked,
.shipping-option-left input[type="radio"]:checked,
.payment-option-header input[type="radio"]:checked,
.woocommerce ul.wc_payment_methods input[type="radio"]:checked,
.form-group input[type="radio"]:checked {
  background-color: var(--color-primary);
  border-color: var(--color-primary);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.22);
}
.woocommerce input[type="radio"]:checked::before,
.shipping-option-left input[type="radio"]:checked::before,
.payment-option-header input[type="radio"]:checked::before,
.woocommerce ul.wc_payment_methods input[type="radio"]:checked::before,
.form-group input[type="radio"]:checked::before,
:where(input[type="radio"]):checked::before {
  transform: scale(1);
}

.woocommerce input[type="checkbox"]:focus-visible,
.woocommerce input[type="radio"]:focus-visible,
.filter-item input[type="checkbox"]:focus-visible,
.form-group input[type="checkbox"]:focus-visible,
:where(input[type="checkbox"], input[type="radio"]):focus-visible {
  outline: none;
  border-color: rgba(var(--color-primary-rgb), 0.9);
  box-shadow: 0 0 0 2px rgba(var(--color-primary-rgb), 0.45);
}

/* --- The cluster ------------------------------------------------------------
   The sentence beside the box. A flex row would make a trailing `*` a sibling
   item and strand it at the end of the line, so the block is indented by one
   gutter and the box is floated into it — the text and its asterisk then flow
   as one sentence, and `top: 50%` centres the box on the sentence whether it
   runs to one line or three. ------------------------------------------------- */
.woocommerce .woocommerce-form__label-for-checkbox,
.woocommerce label.checkbox,
.woocommerce-form-login__rememberme,
.woocommerce form .form-row label.woocommerce-form__label-for-checkbox,
.woocommerce form .form-row label.checkbox,
.woocommerce form .form-row label.woocommerce-form-login__rememberme {
  display: block;
  position: relative;
  margin: 0;
  padding-left: 30px;
  font-family: var(--font-primary);
  font-size: 0.875rem;
  font-weight: 400;
  line-height: 1.6;
  letter-spacing: 0;
  text-transform: none;
  color: var(--color-text);
  cursor: pointer;
}
.woocommerce .woocommerce-form__label-for-checkbox span,
.woocommerce form .form-row label.woocommerce-form__label-for-checkbox span,
.woocommerce label.checkbox span {
  display: inline;
  font-weight: 400;
}
.woocommerce .woocommerce-form__label-for-checkbox > input[type="checkbox"],
.woocommerce label.checkbox > input[type="checkbox"],
.woocommerce-form-login__rememberme > input[type="checkbox"],
.woocommerce form .form-row label.woocommerce-form__label-for-checkbox > input[type="checkbox"],
.woocommerce form .form-row label.checkbox > input[type="checkbox"],
.woocommerce form .form-row label.woocommerce-form-login__rememberme > input[type="checkbox"] {
  position: absolute;
  left: 0;
  top: 50%;
  margin: 0;
  transform: translateY(-50%);
}
.woocommerce .woocommerce-form__label-for-checkbox:hover { color: var(--color-dark); }

/* The row that carries "Remember me" also carries the Log in button. Both are
   flex items on one centred line, so the cluster sits on the button's optical
   middle instead of hanging off its top edge. The button keeps its place at
   the head of the row. */
.woocommerce form.login p.form-row:not(.woocommerce-form-row),
.woocommerce-page form.login p.form-row:not(.woocommerce-form-row) {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 14px 22px;
}
.woocommerce form.login p.form-row:not(.woocommerce-form-row) > button,
.woocommerce form.login p.form-row:not(.woocommerce-form-row) > input.button,
.woocommerce-page form.login p.form-row:not(.woocommerce-form-row) > button {
  order: -1;
}
.woocommerce .woocommerce-form-login__rememberme,
.woocommerce form .form-row label.woocommerce-form-login__rememberme {
  display: inline-block;
  margin: 0;
  vertical-align: middle;
}
/* The login commit button joins the 48px row rather than towering over it. */
.woocommerce button.woocommerce-form-login__submit,
.woocommerce input.woocommerce-form-login__submit {
  min-height: var(--ctl-h);
  padding: 0 30px;
  font-size: 0.75rem;
}

/* Ship-to-a-different-address is a heading wrapping a checkbox; keep the
   heading voice and let the box sit in the same gutter. */
.woocommerce #ship-to-different-address label,
.woocommerce h3#ship-to-different-address label {
  padding-left: 30px;
  font-size: inherit;
  font-weight: inherit;
  font-family: inherit;
  line-height: inherit;
  color: inherit;
}


/* =============================================================================
   4b. LINK-GREEN, DEMOTED
   -----------------------------------------------------------------------------
   Inline links were the accent's biggest consumer: on one checkout the green
   appeared on the coupon toggle, the privacy link, the terms link, every
   required asterisk and the Total — five different greens fighting for the
   same eye. Inline links are now cream sitting on a 1px accent rule, which
   still reads unmistakably as a link but hands the saturated accent back to
   the two places that earn it: the display type's period, and the Total.
   ========================================================================== */

.woocommerce-info a:not(.button),
.woocommerce-message a:not(.button),
.woocommerce-error a:not(.button),
.woocommerce .woocommerce-info a:not(.button),
.woocommerce .woocommerce-message a:not(.button),
.woocommerce .woocommerce-error a:not(.button),
.woocommerce-privacy-policy-text a,
.woocommerce-terms-and-conditions-link,
.woocommerce-terms-and-conditions-checkbox-text a,
.woocommerce .woocommerce-LostPassword a,
.woocommerce .lost_password a,
.woocommerce-LostPassword a,
.woocommerce form .form-row a,
.woocommerce-form-login a,
.woocommerce-form-register a,
.woocommerce a.showcoupon,
.woocommerce a.added_to_cart,
.woocommerce-privacy-policy-link,
.page-article .post-content .woocommerce a:not(.button):not(.wp-element-button):not(.wp-block-button__link):not(.shop_table a) {
  color: var(--color-dark);
  font-weight: 500;
  border-bottom: 1px solid rgba(var(--color-primary-rgb), 0.5);
  padding-bottom: 1px;
  transition: color 0.3s var(--ctl-ease), border-color 0.3s var(--ctl-ease);
}
.woocommerce-info a:not(.button):hover,
.woocommerce-message a:not(.button):hover,
.woocommerce-privacy-policy-text a:hover,
.woocommerce-terms-and-conditions-link:hover,
.woocommerce .woocommerce-LostPassword a:hover,
.woocommerce .lost_password a:hover,
.woocommerce-LostPassword a:hover,
.woocommerce form .form-row a:hover,
.woocommerce a.showcoupon:hover,
.woocommerce a.added_to_cart:hover {
  color: var(--ink);
  border-bottom-color: var(--color-accent);
}

/* "View cart" beside an added product is a link, not a second pill. */
.woocommerce a.added_to_cart {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin-left: 10px;
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}

/* Required marks are punctuation, not signal — one per field is a rash of
   green otherwise. The optional tag matches them. */
.woocommerce form .form-row .required,
.woocommerce form .form-row abbr.required,
.woocommerce .required,
.woocommerce abbr.required,
.woocommerce-terms-and-conditions-checkbox-text + .required {
  color: var(--color-text-muted);
  border: 0;
  text-decoration: none;
  font-weight: 400;
}

/* A focused label brightens to cream; the accent moment on a focused field is
   the ring, and one accent moment is enough. */
.woocommerce form .form-row:focus-within > label:not(.woocommerce-form__label-for-checkbox):not(.checkbox),
.woocommerce-page form .form-row:focus-within > label:not(.woocommerce-form__label-for-checkbox):not(.checkbox),
.form-group:focus-within > label {
  color: var(--color-dark);
}


/* =============================================================================
   5. SELECT2 — WooCommerce swaps country/state for it
   -----------------------------------------------------------------------------
   The real <select> is hidden, so select2's <span> has to BE the field. It is
   already in section 3's selector list, which means it inherits the one field
   material, corner, hover, focus and placeholder for free. Everything here is
   layout: a span needs to be told to centre its own text, and the dropdown is
   portalled to the end of <body> where no .woocommerce wrapper can reach it.
   ========================================================================== */

.select2-container--default .select2-selection--single,
.woocommerce .select2-container--default .select2-selection--single {
  display: flex;
  align-items: center;
  height: var(--ctl-field-h);
  padding: 0 44px 0 16px;
  cursor: pointer;
}

.select2-container--default .select2-selection--single .select2-selection__rendered {
  padding: 0;
  color: var(--ctl-field-ink);
  font-family: var(--font-primary);
  font-size: 0.9375rem;
  line-height: 1.5;
  letter-spacing: 0.005em;
}

/* Select2 ships a solid CSS triangle; redraw it as the same hairline chevron
   the native selects get, and flip it when the list opens. */
.select2-container--default .select2-selection--single .select2-selection__arrow {
  top: 0;
  right: 15px;
  width: 12px;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}
.select2-container--default .select2-selection--single .select2-selection__arrow b {
  position: static;
  width: 7px;
  height: 7px;
  margin: -3px 0 0 0;
  border: 1px solid var(--ctl-field-ink);
  border-top: 0;
  border-left: 0;
  border-radius: 0;
  transform: rotate(45deg);
  transition: transform 0.3s var(--ctl-ease), border-color 0.3s var(--ctl-ease);
}
.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
  border-color: var(--color-accent);
  transform: rotate(-135deg);
  margin-top: 2px;
}

/* The dropdown is a surface that CONTAINS controls, so it takes --ctl-r-2. */
.select2-container--open .select2-dropdown,
.select2-dropdown {
  background-color: var(--color-surface);
  background-image: linear-gradient(180deg, var(--ctl-wash-1), transparent 120px);
  border: 1px solid var(--ctl-field-edge);
  border-radius: var(--ctl-r-2);
  overflow: hidden;
  box-shadow: 0 30px 64px -26px rgba(0, 0, 0, 1);
}
.select2-dropdown--below { margin-top: 8px; }
.select2-dropdown--above { margin-top: -8px; }

.select2-container--default .select2-search--dropdown {
  padding: 10px;
  border-bottom: 1px solid var(--ctl-hair);
}
.select2-container--default .select2-search--dropdown .select2-search__field {
  width: 100%;
  min-height: 40px;
  padding: 9px 13px;
  background-color: var(--ctl-field-face);
  background-image: var(--ctl-field-fill);
  border: 1px solid var(--ctl-field-edge);
  border-top-color: var(--ctl-field-edge-lit);
  border-radius: var(--ctl-r-1);
  box-shadow: var(--ctl-field-depth);
  color: var(--ctl-field-ink);
  font-family: var(--font-primary);
  font-size: 0.875rem;
  outline: none;
  transition: var(--ctl-field-transition);
}
.select2-container--default .select2-search--dropdown .select2-search__field:focus {
  background-color: var(--ctl-field-face-focus);
  background-image: none;
  border-color: var(--ctl-field-edge-foc);
  box-shadow: var(--ctl-field-depth-focus);
}

.select2-container--default .select2-results > .select2-results__options {
  max-height: 290px;
  padding: 6px;
}
.select2-container--default .select2-results__option {
  padding: 10px 13px;
  border-radius: var(--ctl-r-1);
  background-color: transparent;
  color: var(--color-text);
  font-size: 0.875rem;
  transition: background-color 0.18s var(--ctl-ease), color 0.18s var(--ctl-ease);
}
.select2-container--default .select2-results__option--highlighted[aria-selected],
.select2-container--default .select2-results__option--highlighted[data-selected] {
  background-color: var(--ctl-wash-2);
  color: var(--ink);
}
.select2-container--default .select2-results__option[aria-selected="true"],
.select2-container--default .select2-results__option[data-selected="true"] {
  background-color: rgba(var(--color-primary-rgb), 0.13);
  color: var(--color-accent);
  font-weight: 600;
}

/* Multi-select (used by some address / attribute fields). */
.select2-container--default .select2-selection--multiple {
  min-height: var(--ctl-field-h);
  padding: 7px 12px;
  background-color: var(--ctl-field-face);
  background-image: var(--ctl-field-fill);
  border: 1px solid var(--ctl-field-edge);
  border-top-color: var(--ctl-field-edge-lit);
  border-radius: var(--ctl-r-1);
  box-shadow: var(--ctl-field-depth);
}
.select2-container--default .select2-selection--multiple .select2-selection__choice {
  margin: 4px 6px 4px 0;
  padding: 4px 10px;
  background-color: var(--ctl-wash-2);
  border: 1px solid var(--ctl-hair-2);
  border-radius: var(--radius-pill);
  color: var(--color-dark);
  font-size: 0.75rem;
}
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
  color: var(--color-text-muted);
  margin-right: 6px;
}


/* =============================================================================
   6. BADGES & PILLS
   -----------------------------------------------------------------------------
   Saturated blocks out-shout the photography. Every badge becomes a glass pill:
   a dark ground, a hairline in its own colour, and the colour carried by the
   text rather than the fill.
   ========================================================================== */

.badge,
.woocommerce span.onsale,
.product-card-badges .badge {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 5px 11px 4px;
  min-height: 0;
  min-width: 0;
  border: 1px solid var(--ctl-hair-2);
  border-radius: var(--radius-pill);
  background: rgba(var(--ctl-night-rgb), 0.62);
  -webkit-backdrop-filter: blur(12px);
  backdrop-filter: blur(12px);
  color: var(--color-text-light);
  font-family: var(--font-primary);
  font-size: 0.7rem;
  font-weight: 600;
  line-height: 1.25;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  white-space: nowrap;
}

.badge-sale,
.woocommerce span.onsale {
  color: var(--color-secondary);
  border-color: rgba(var(--ctl-gold-rgb), 0.42);
  background: var(--color-secondary-050);
}
.badge-new {
  color: var(--color-accent);
  border-color: rgba(var(--color-primary-rgb), 0.42);
  background: var(--color-primary-050);
}
.badge-hot {
  color: var(--color-danger);
  border-color: rgba(var(--ctl-danger-rgb), 0.42);
  background: var(--color-danger-050);
}
.badge-out {
  color: var(--color-text-muted);
  border-color: var(--ctl-hair);
  background: rgba(var(--ctl-night-rgb), 0.78);
}

/* WooCommerce parks its sale badge with `top/left`; keep the offset generous
   so the pill sits inside the image's margin, not on its corner. */
.woocommerce span.onsale {
  top: 14px;
  left: 14px;
  padding: 5px 11px 4px;
  font-size: 0.7rem;
  font-weight: 600;
  border-radius: var(--radius-pill);
}

/* Small hairline counters — facet counts, stock notes. */
.filter-item .count,
.woocommerce .stock,
.rating-count {
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}
.filter-item .count {
  padding: 2px 8px;
  border: 1px solid var(--ctl-hair);
  border-radius: var(--radius-pill);
  background: transparent;
  color: var(--color-text-muted);
  line-height: 1.5;
}
.woocommerce .stock {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  color: var(--color-text-light);
}
.woocommerce .stock::before {
  content: "";
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: currentColor;
  flex: none;
}
.woocommerce .stock.in-stock { color: var(--color-accent); }
.woocommerce .stock.out-of-stock { color: var(--color-danger); }


/* =============================================================================
   7. STAR RATING
   ========================================================================== */

.star-rating {
  display: inline-flex;
  align-items: center;
  gap: 3px;
}
.star-rating .star {
  font-size: 0.8rem;
  line-height: 1;
  color: var(--color-secondary);
}
.star-rating .star.empty {
  color: rgba(var(--ctl-gold-rgb), 0.26);
}
.rating-count {
  margin-left: 8px;
  color: var(--color-text-muted);
}

/* WooCommerce's own webfont stars (product reviews). */
.woocommerce .star-rating:not(.teashop-stars) {
  color: var(--color-secondary);
  letter-spacing: 2px;
  font-size: 0.9em;
}
.woocommerce .star-rating:not(.teashop-stars)::before {
  color: rgba(var(--ctl-gold-rgb), 0.26);
}

/* The review form's clickable stars. */
.woocommerce #reviews #respond p.stars a {
  color: rgba(var(--ctl-gold-rgb), 0.34);
  transition: color 0.22s var(--ctl-ease), transform 0.22s var(--ctl-ease);
}
.woocommerce #reviews #respond p.stars a:hover,
.woocommerce #reviews #respond p.stars:hover a {
  color: var(--color-secondary);
}


/* =============================================================================
   8. MICRO-CHROME
   -----------------------------------------------------------------------------
   Pagination, view toggles, quantity steppers and card actions all used a
   saturated green fill on hover — the single most "default UI kit" gesture on
   the site. They now share the hairline/paper language of the buttons.
   ========================================================================== */

.page-btn,
.view-toggle-btn,
.product-action-btn {
  border-radius: var(--radius-pill);
  background: var(--ctl-wash-1);
  border: 1px solid var(--ctl-hair);
  color: var(--color-text-light);
  transition: var(--transition);
}
/* The card actions float over the photograph, so they need a real ground. */
.product-action-btn {
  background: rgba(var(--ctl-night-rgb), 0.66);
  -webkit-backdrop-filter: blur(14px);
  backdrop-filter: blur(14px);
  border-color: var(--ctl-hair-2);
  box-shadow: 0 10px 24px -14px rgba(0, 0, 0, 0.95);
}
.page-btn {
  width: 40px;
  height: 40px;
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.04em;
}
.page-btn:hover,
.view-toggle-btn:hover,
.product-action-btn:hover {
  background: var(--ctl-wash-3);
  border-color: var(--ctl-hair-3);
  color: var(--ink);
  transform: translateY(-1px);
}
.page-btn.active,
.view-toggle-btn.active {
  background: var(--paper);
  border-color: var(--paper);
  color: var(--night);
  transform: none;
  box-shadow: var(--ctl-shadow);
}
.page-btn.active:hover,
.view-toggle-btn.active:hover {
  background: var(--ink);
  border-color: var(--ink);
  color: var(--night);
}
.page-btn.disabled,
.page-btn.disabled:hover {
  opacity: 1;
  background: transparent;
  border-color: var(--ctl-hair);
  color: var(--color-text-muted);
  transform: none;
  cursor: not-allowed;
}

/* The stepper is a value editor, so it is a field: same material, same
   corner, with the buttons cut into it. */
.qty-control,
.wc-block-components-quantity-selector {
  border: 1px solid var(--ctl-field-edge);
  border-top-color: var(--ctl-field-edge-lit);
  border-radius: var(--ctl-r-1);
  background-color: var(--ctl-field-face);
  background-image: var(--ctl-field-fill);
  box-shadow: var(--ctl-field-depth);
  overflow: hidden;
}
.qty-btn {
  background: transparent;
  color: var(--color-text-light);
  font-size: 1rem;
  transition: var(--transition);
}
.qty-btn:hover {
  background: var(--ctl-wash-2);
  color: var(--ink);
}
.qty-input {
  background: transparent;
  border-left: 1px solid var(--ctl-field-edge);
  border-right: 1px solid var(--ctl-field-edge);
  color: var(--color-dark);
  font-size: 0.95rem;
  font-weight: 600;
  letter-spacing: 0.04em;
}

/* WooCommerce's own quantity input stands alone (no stepper wrapper), so it
   is a field in its own right. */
.woocommerce .quantity .qty,
.woocommerce div.quantity input.qty {
  min-height: var(--ctl-field-h);
  padding: 0 10px;
  background-color: var(--ctl-field-face);
  background-image: var(--ctl-field-fill);
  border: 1px solid var(--ctl-field-edge);
  border-top-color: var(--ctl-field-edge-lit);
  border-radius: var(--ctl-r-1);
  box-shadow: var(--ctl-field-depth);
  color: var(--ctl-field-ink);
  font-size: 0.95rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-align: center;
  transition: var(--ctl-field-transition);
}
.woocommerce .quantity .qty:focus,
.woocommerce div.quantity input.qty:focus {
  outline: none;
  background-color: var(--ctl-field-face-focus);
  background-image: none;
  border-color: var(--ctl-field-edge-foc);
  box-shadow: var(--ctl-field-depth-focus);
}

/* Block-cart quantity stepper — the last saturated green hover in the set. */
.wc-block-components-quantity-selector__button {
  color: var(--color-text-light);
  background: transparent;
  transition: var(--transition);
}
.wc-block-components-quantity-selector__button:hover {
  background: var(--ctl-wash-2);
  color: var(--ink);
}

/* Sidebar search submit — a hairline pill, not a green chip. */
.sidebar-widget .wp-block-search__button {
  padding: 0 16px;
  min-height: 40px;
  border: 1px solid var(--ctl-hair-2);
  border-radius: var(--radius-pill);
  background: var(--ctl-wash-1);
  color: var(--color-dark);
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}
.sidebar-widget .wp-block-search__button:hover {
  background: var(--ctl-wash-3);
  border-color: var(--ctl-hair-3);
  color: var(--ink);
}

/* The shop's sort trigger is a field, so it should look like one. */
/* The shop's sort control shows a value and opens a list: it is a select, so
   it is a field, not a pill. */
.shop-sort-trigger {
  min-height: 44px;
  padding: 0 15px;
  background-color: var(--ctl-field-face);
  background-image: var(--ctl-field-fill);
  border: 1px solid var(--ctl-field-edge);
  border-top-color: var(--ctl-field-edge-lit);
  border-radius: var(--ctl-r-1);
  box-shadow: var(--ctl-field-depth);
  color: var(--ctl-field-ink);
  font-size: 0.82rem;
  letter-spacing: 0.02em;
  transition: var(--ctl-field-transition);
}
.shop-sort-trigger:hover {
  background-color: var(--ctl-field-face-hover);
  background-image: none;
  border-color: var(--ctl-field-edge-hov);
  box-shadow: var(--ctl-field-depth-hover);
}
.shop-sort-custom.open .shop-sort-trigger {
  background-color: var(--ctl-field-face-focus);
  background-image: none;
  border-color: var(--ctl-field-edge-foc);
  box-shadow: var(--ctl-field-depth-focus);
}
.shop-sort-trigger svg {
  transition: transform 0.3s var(--ctl-ease);
}
.shop-sort-custom.open .shop-sort-trigger svg {
  transform: rotate(180deg);
}
/* The list it opens is a surface that holds controls. */
.shop-sort-dropdown {
  border-radius: var(--ctl-r-2);
  border: 1px solid var(--ctl-field-edge);
  background-color: var(--color-surface);
  box-shadow: 0 30px 64px -26px rgba(0, 0, 0, 1);
  overflow: hidden;
}

/* The base button rule sets `display: inline-flex`, which would reveal this
   drawer trigger on desktop; main.css only reveals it at <= 768px. */
.shop-filter-btn {
  display: none;
  min-height: 42px;
  padding: 0 20px;
  font-size: 0.7rem;
}
@media (max-width: 768px) {
  .shop-filter-btn { display: inline-flex; }
}


/* =============================================================================
   9. FOCUS — one designed ring for the whole control set
   -----------------------------------------------------------------------------
   The global :focus-visible in main.css draws a 2px green outline, which on a
   paper pill lands green-on-cream and reads as a browser artefact. Replace it
   with a double ring that clears the button's own edge in both directions.
   ========================================================================== */

.btn:focus-visible,
.teashop-btn:focus-visible,
.woocommerce a.button:focus-visible,
.woocommerce button.button:focus-visible,
.woocommerce input.button:focus-visible,
.woocommerce #respond input#submit:focus-visible,
.wc-block-components-button:focus-visible,
.wp-element-button:focus-visible,
.page-btn:focus-visible,
.view-toggle-btn:focus-visible,
.product-action-btn:focus-visible,
.qty-btn:focus-visible,
.shop-sort-trigger:focus-visible,
.shop-filter-btn:focus-visible {
  outline: none;
  box-shadow: 0 0 0 2px var(--color-bg),
              0 0 0 4px rgba(var(--color-primary-rgb), 0.95);
}

.woocommerce input.input-text:focus-visible,
.woocommerce textarea:focus-visible,
.woocommerce select:focus-visible,
.form-group input:focus-visible,
.form-group select:focus-visible,
.form-group textarea:focus-visible,
.comment-form input:focus-visible,
.comment-form textarea:focus-visible,
.select2-container--default .select2-selection--single:focus-visible,
.select2-search__field:focus-visible {
  outline: none;
}

/* WooCommerce marks its notices `tabindex="-1"` and its scripts focus them on
   load, so the checkout opened with a 2px green keyboard ring drawn around
   the "added to your cart" bar — a browser artefact sitting at the very top
   of the control layer. An element with tabindex="-1" is unreachable by
   tabbing, so it can never need a keyboard ring; only the elements a keyboard
   can actually land on keep theirs. */
[tabindex="-1"]:focus,
[tabindex="-1"]:focus-visible,
.woocommerce-message[tabindex]:focus-visible,
.woocommerce-info[tabindex]:focus-visible,
.woocommerce-error[tabindex]:focus-visible,
.woocommerce-NoticeGroup [tabindex]:focus-visible,
.woocommerce-notices-wrapper [tabindex]:focus-visible {
  outline: none;
  box-shadow: none;
}


/* =============================================================================
   12. RAW BROWSER ARTEFACTS — every one of them, removed or redrawn
   -----------------------------------------------------------------------------
   Chrome, Safari and Edge each paint a set of widgets INSIDE a control that no
   design system asked for: spin buttons, a cancel cross, an autofill key, a
   caps-lock glyph, a resizer grip, a calendar button, a file-upload button, a
   colour swatch, a tap flash and a fat grey scrollbar. Left alone they are the
   loudest un-designed thing in a checkout. Nothing below is decorative.
   ========================================================================== */

/* Search fields: the UA cancel cross and the old results affordances. */
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration,
input[type="search"]::-webkit-search-results-button,
input[type="search"]::-webkit-search-results-decoration {
  -webkit-appearance: none;
  appearance: none;
  display: none;
}

/* Number fields: the stepper arrows. Quantity is a designed stepper here. */
input[type="number"] {
  -moz-appearance: textfield;
  appearance: textfield;
}
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
  -webkit-appearance: none;
  appearance: none;
  margin: 0;
}

/* Safari's autofill / strong-password / contacts keys and the caps-lock
   glyph, all of which land as a coloured chip inside the field. */
input::-webkit-credentials-auto-fill-button,
input::-webkit-strong-password-auto-fill-button,
input::-webkit-contacts-auto-fill-button,
input::-webkit-caps-lock-indicator {
  display: none;
  visibility: hidden;
  width: 0;
  height: 0;
  margin: 0;
  pointer-events: none;
}
input::-webkit-textfield-decoration-container {
  margin: 0;
  padding: 0;
}

/* Edge / IE remnants that still ship in Windows builds. */
input::-ms-clear,
input::-ms-reveal { display: none; width: 0; height: 0; }
select::-ms-expand { display: none; }

/* The textarea grabber. Dragging the corner still resizes; the three grey
   diagonal lines the UA draws over our own corner do not. */
textarea::-webkit-resizer { display: none; }

/* Date / time pickers keep their button — it is the only way in — but it is
   recoloured to the field's own chrome instead of a blue system glyph. */
input::-webkit-calendar-picker-indicator {
  padding: 2px;
  margin-right: -2px;
  border-radius: var(--ctl-r-1);
  opacity: 0.5;
  cursor: pointer;
  transition: opacity 0.25s var(--ctl-ease), background-color 0.25s var(--ctl-ease);
}
input::-webkit-calendar-picker-indicator:hover {
  opacity: 1;
  background-color: var(--ctl-wash-2);
}
input::-webkit-datetime-edit-fields-wrapper { padding: 0; }
input::-webkit-datetime-edit-text { color: var(--color-text-muted); padding: 0 2px; }

/* File inputs: the UA button becomes a member of the button family. */
input[type="file"] {
  color: var(--color-text-light);
  font-size: 0.8rem;
}
input[type="file"]::-webkit-file-upload-button,
input[type="file"]::file-selector-button {
  margin-right: 14px;
  padding: 0 18px;
  min-height: var(--ctl-h-sm);
  border: 1px solid var(--ctl-hair-2);
  border-radius: var(--radius-pill);
  background: var(--ctl-wash-1);
  color: var(--color-dark);
  font-family: var(--font-primary);
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  cursor: pointer;
  transition: var(--transition);
}
input[type="file"]::-webkit-file-upload-button:hover,
input[type="file"]::file-selector-button:hover {
  background: var(--ctl-wash-3);
  border-color: var(--ctl-hair-3);
}

/* Colour inputs (a plugin can surface one) get the field's corner. */
input[type="color"] { padding: 4px; cursor: pointer; }
input[type="color"]::-webkit-color-swatch-wrapper { padding: 0; }
input[type="color"]::-webkit-color-swatch {
  border: 1px solid var(--ctl-hair-2);
  border-radius: var(--ctl-r-1);
}

/* Progress / meter, should a plugin render one. */
progress, meter { -webkit-appearance: none; appearance: none; height: 4px; border: 0; }
progress::-webkit-progress-bar { background: var(--ctl-wash-1); }
progress::-webkit-progress-value { background: var(--color-accent); }

/* The blue flash Android/iOS paint over a tapped control. */
.btn, .teashop-btn, button, input, select, textarea, label,
.woocommerce a.button, .page-btn, .view-toggle-btn, .product-action-btn,
.shop-sort-trigger, .shop-sort-option {
  -webkit-tap-highlight-color: transparent;
}

/* Selected text inside a control is brand, not system blue. */
input::selection, textarea::selection,
.select2-search__field::selection,
.select2-selection__rendered::selection {
  background: rgba(var(--color-primary-rgb), 0.3);
  color: var(--ink);
}

/* Every control that can scroll — the textarea, the select2 results, the shop
   sort list — gets the same hairline scrollbar rather than the OS one. */
textarea,
.shop-sort-dropdown,
.select2-container--default .select2-results > .select2-results__options {
  scrollbar-width: thin;
  scrollbar-color: var(--ctl-hair-2) transparent;
}
textarea::-webkit-scrollbar,
.shop-sort-dropdown::-webkit-scrollbar,
.select2-container--default .select2-results > .select2-results__options::-webkit-scrollbar {
  width: 12px;
  height: 12px;
}
textarea::-webkit-scrollbar-track,
.shop-sort-dropdown::-webkit-scrollbar-track,
.select2-container--default .select2-results > .select2-results__options::-webkit-scrollbar-track {
  background: transparent;
}
textarea::-webkit-scrollbar-thumb,
.shop-sort-dropdown::-webkit-scrollbar-thumb,
.select2-container--default .select2-results > .select2-results__options::-webkit-scrollbar-thumb {
  background: var(--ctl-hair-2);
  background-clip: padding-box;
  border: 4px solid transparent;
  border-radius: var(--radius-pill);
}
textarea::-webkit-scrollbar-thumb:hover,
.shop-sort-dropdown::-webkit-scrollbar-thumb:hover,
.select2-container--default .select2-results > .select2-results__options::-webkit-scrollbar-thumb:hover {
  background: var(--ctl-hair-3);
  background-clip: padding-box;
}
textarea::-webkit-scrollbar-corner { background: transparent; }

/* A <button> or <input type=submit> still carries UA chrome in some engines
   even after the button family sets its own. Belt and braces. */
button,
input[type="submit"],
input[type="button"],
input[type="reset"] {
  -webkit-appearance: none;
  appearance: none;
}

/* Firefox draws a dotted inner ring on every focused button. */
button::-moz-focus-inner,
input[type="submit"]::-moz-focus-inner,
input[type="button"]::-moz-focus-inner,
input[type="reset"]::-moz-focus-inner {
  border: 0;
  padding: 0;
}


/* =============================================================================
   10. NARROW WIDTHS
   -----------------------------------------------------------------------------
   Part files load after every media query in main.css, so the breakpoints for
   everything above have to live here.
   ========================================================================== */

@media (max-width: 991px) {
  :root {
    --ctl-h: 46px;
    --ctl-h-lg: 54px;
    --ctl-field-h: 50px;
  }
}

@media (max-width: 767px) {
  :root {
    --ctl-h: 46px;
    --ctl-h-sm: 36px;
    --ctl-h-lg: 52px;
    --ctl-field-h: 50px;
  }

  .btn,
  .woocommerce a.button,
  .woocommerce button.button,
  .woocommerce input.button,
  .wc-block-components-button:not(.is-link),
  .wp-element-button {
    padding: 0 22px;
    font-size: 0.72rem;
    letter-spacing: 0.08em;
  }

  /* Full-width commit buttons read better than a stranded pill on a phone. */
  .woocommerce .woocommerce-form-login__submit,
  .woocommerce .woocommerce-form-register__submit,
  .woocommerce #place_order,
  .woocommerce a.checkout-button {
    width: 100%;
  }

  /* A notice's inline action drops under the message instead of squeezing it. */
  .woocommerce-message .button,
  .woocommerce-info .button {
    margin-left: 0;
  }

  .woocommerce input.input-text,
  .woocommerce textarea,
  .woocommerce select,
  .woocommerce form .form-row input.input-text,
  .woocommerce form .form-row textarea,
  .woocommerce form .form-row select,
  .form-group input,
  .form-group select,
  .form-group textarea {
    /* 16px keeps iOS from zooming the viewport on focus. */
    font-size: 1rem;
    padding: 13px 16px;
  }

  .select2-container--default .select2-selection--single {
    padding-left: 16px;
  }
  .select2-container--default .select2-selection--single .select2-selection__rendered {
    font-size: 1rem;
  }
}

@media (max-width: 479px) {
  .btn,
  .woocommerce a.button,
  .woocommerce button.button,
  .woocommerce input.button {
    padding: 0 18px;
    font-size: 0.7rem;
  }
  .badge,
  .woocommerce span.onsale {
    padding: 4px 9px 3px;
    letter-spacing: 0.1em;
  }
}


/* =============================================================================
   11. REDUCED MOTION
   -----------------------------------------------------------------------------
   This file redefines --transition, and a plain :root here would beat the
   reduced-motion block in main.css no matter what the user asked for. Restate
   it last so the preference still wins.
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {
  :root { --transition: none; }

  .btn,
  .woocommerce a.button,
  .woocommerce button.button,
  .woocommerce input.button,
  .wc-block-components-button,
  .wp-element-button,
  .page-btn,
  .view-toggle-btn,
  .product-action-btn {
    transition: none;
  }
  .btn:hover,
  .woocommerce a.button:hover,
  .woocommerce button.button:hover,
  .woocommerce input.button:hover,
  .btn-outline:hover,
  .page-btn:hover,
  .view-toggle-btn:hover,
  .product-action-btn:hover {
    transform: none;
  }
  .btn.loading::after,
  .woocommerce .button.loading::after {
    animation-duration: 1.6s;
  }
}


/* =============================================================================
   13. THE AXIS, THE SURFACE AND THE WELL
   -----------------------------------------------------------------------------
   Round one was judged "a different and lesser designer" below the band: the
   type above the fold was set on the journey's 101px axis while everything
   under it — toolbar, sidebar, cards, pagination, the login card — started at
   24px, wore four unrelated corners, sat on grey fills inside 1px boxes, and
   breathed in 18–20px steps. This section is the answer, and it answers in the
   same order the objection was made.

     ONE AXIS      `.container` stops running a 24px gutter and takes the
                   journey's own measure — clamp(22px, 7vw, 108px), which is
                   100.8px at 1440 and lands every page's first pixel of
                   content on l=101, the exact left edge of `.journey-title`.
                   The footer already ran this value; now the whole document
                   does, header rail included.

     TWO CORNERS   2px on every rectangle, 999px on a true pill, 50% on the
                   three things that are genuinely round. 6 / 10 / 14 / 20 /
                   28 are collapsed at the token, so no rule anywhere in the
                   theme can reintroduce a third corner.

     NO CARDS      The control layer is a ruled ledger, not a box UI. The
                   sidebar widget, the toolbar and the product card lose their
                   fills and their 1px frames and are separated by a single
                   hairline top rule at 10% paper on the page's own ground.
                   Because `.shop-layout` aligns its columns to `start`, the
                   sidebar's first rule and the toolbar's rule are one
                   continuous line across the page.

     THE WELL      A field is now DARKER than whatever it stands on — a well
                   cut into the card, not a slab floating on it — and focus is
                   a 1px cream underline rather than a coloured ring.

     CREAM ONCE    Solid paper is the commit gesture. The pagination and view
                   toggles give it back and hold their active state on a 1px
                   cream hairline at 92% instead.

     RHYTHM        20px steps become 64 / 28 / 96 / 132. Nothing in the
                   control layer is allowed to breathe in less than a
                   half-step of the band above it.
   ========================================================================== */

:root {
  /* --- ONE AXIS --------------------------------------------------------
     The journey sets its copy on clamp(22px, 7vw, 108px). So does the
     footer. Now so does every container in the document, which is what
     puts .page-banner-title, .shop-layout, the account column and the
     header rail on one left edge instead of four. */
  --container-padding: clamp(22px, 7vw, 108px);

  /* --- TWO CORNERS -----------------------------------------------------
     One surface token. main.css declares five; they are all this now. */
  --radius-sm: 2px;
  --radius:    2px;
  --radius-md: 2px;
  --radius-lg: 2px;
  --radius-xl: 2px;
  --radius-pill: 999px;

  --ctl-r: 2px;
  --wc-form-border-radius: 2px;

  /* --- THE WELL --------------------------------------------------------
     Inverted from round one on purpose. The old field was mixed UP towards
     --ink, so on the login card — itself a dark panel — the input read as
     the brightest object on the screen. A form field is a place where
     something is missing; it should be the darkest thing in its own card. */
  --ctl-field-face:       rgba(0, 0, 0, 0.35);
  --ctl-field-face-hover: rgba(0, 0, 0, 0.42);
  --ctl-field-face-focus: rgba(0, 0, 0, 0.46);

  --ctl-field-edge:     rgba(236, 229, 214, 0.14);
  --ctl-field-edge-lit: rgba(236, 229, 214, 0.14);
  --ctl-field-edge-hov: rgba(236, 229, 214, 0.24);
  --ctl-field-edge-foc: rgba(236, 229, 214, 0.34);

  /* No crown, no ring. A well has no lit edge; focus is one cream rule
     drawn along its foot, which is the only place a caret ever is. */
  --ctl-field-depth:       none;
  --ctl-field-depth-hover: none;
  --ctl-field-depth-focus: inset 0 -1px 0 0 var(--paper);
  --ctl-field-depth-error: inset 0 -1px 0 0 rgba(var(--ctl-danger-rgb), 0.92);

  /* WooCommerce paints its own block fields from these. */
  --wc-form-color-background: rgba(0, 0, 0, 0.35);
  --wc-form-border-color:     rgba(236, 229, 214, 0.14);

  /* The hairline the whole ledger is ruled with. */
  --ctl-rule: rgba(236, 229, 214, 0.10);
  --ctl-rule-2: rgba(236, 229, 214, 0.16);
}


/* The header rail is on the axis too. A wordmark at 24px over a headline at
   101px was the first thing that gave the old page away, and the fix is not a
   compromise gutter for the chrome — it is the same line for everything, from
   the wordmark at the top of the document to the last footer column. */


/* =============================================================================
   13a. THE RULED LEDGER — sidebar, toolbar, card
   ========================================================================== */

.shop-page .sidebar-widget,
.blog-page .sidebar-widget,
.search-results-page .sidebar-widget,
.single-product-page .sidebar-widget,
.page-template-page-wishlist .sidebar-widget {
  background: transparent;
  border: 0;
  border-top: 1px solid var(--ctl-rule);
  border-radius: 0;
  overflow: visible;
  margin-bottom: 44px;
  padding-top: 0;
}

.shop-page .sidebar-widget-title,
.blog-page .sidebar-widget-title,
.search-results-page .sidebar-widget-title,
.single-product-page .sidebar-widget-title,
.page-template-page-wishlist .sidebar-widget-title {
  background: transparent;
  border: 0;
  border-radius: 0;
  padding: 20px 0 0;
  font-family: var(--font-primary);
  font-size: 0.7rem;          /* 11.2px — the journey kicker, to the pixel */
  font-weight: 500;
  line-height: 1;
  letter-spacing: 0.17em;     /* 1.904px at 11.2px */
  text-transform: uppercase;
  color: color-mix(in srgb, var(--paper) 76%, transparent);
}

.shop-page .sidebar-widget-title svg,
.blog-page .sidebar-widget-title svg,
.search-results-page .sidebar-widget-title svg,
.single-product-page .sidebar-widget-title svg {
  opacity: 0.5;
}

.shop-page .sidebar-widget-body,
.blog-page .sidebar-widget-body,
.search-results-page .sidebar-widget-body,
.single-product-page .sidebar-widget-body,
.page-template-page-wishlist .sidebar-widget-body {
  padding: 22px 0 0;
}

/* The toolbar. One line of HUD text and one line of controls on the page's
   own ground, ruled at the top so it shares a line with the sidebar. */
.shop-page .shop-toolbar,
.blog-page .shop-toolbar,
.search-results-page .shop-toolbar {
  background: transparent;
  border: 0;
  border-top: 1px solid var(--ctl-rule);
  border-radius: 0;
  padding: 20px 0 0;
  margin: 0 0 64px;
  min-height: 0;
}

.shop-page .shop-results,
.blog-page .shop-results {
  font-family: var(--font-primary);
  font-size: 0.7rem;
  font-weight: 500;
  letter-spacing: 0.17em;
  text-transform: uppercase;
  color: color-mix(in srgb, var(--paper) 60%, transparent);
}
.shop-page .shop-results strong,
.blog-page .shop-results strong {
  font-family: var(--font-heading);
  font-optical-sizing: auto;
  font-size: 1.02rem;
  font-weight: 300;
  letter-spacing: -0.01em;
  color: color-mix(in srgb, var(--paper) 90%, transparent);
  font-variant-numeric: tabular-nums;
}
.shop-page .shop-toolbar-label,
.blog-page .shop-toolbar-label {
  font-family: var(--font-primary);
  font-size: 0.7rem;
  font-weight: 500;
  letter-spacing: 0.17em;
  text-transform: uppercase;
  color: color-mix(in srgb, var(--paper) 46%, transparent);
}

/* The product card. No fill, no frame — a photograph and three lines of type
   hanging under a hairline, the way a printed catalogue sets a page. */
.shop-page .product-card,
.blog-page .product-card,
.search-results-page .product-card,
.single-product-page .product-card,
.page-template-page-wishlist .product-card {
  background: transparent;
  border: 0;
  border-top: 1px solid var(--ctl-rule);
  border-radius: 0;
  padding-top: 18px;
  box-shadow: none;
}
.shop-page .product-card:hover,
.blog-page .product-card:hover,
.search-results-page .product-card:hover,
.single-product-page .product-card:hover,
.page-template-page-wishlist .product-card:hover {
  transform: none;
  border-top-color: var(--ctl-rule-2);
}
.shop-page .product-card-image,
.search-results-page .product-card-image,
.single-product-page .product-card-image,
.page-template-page-wishlist .product-card-image {
  border-radius: 0;
  background: rgba(0, 0, 0, 0.28);
}
.shop-page .product-card-body,
.search-results-page .product-card-body,
.single-product-page .product-card-body,
.page-template-page-wishlist .product-card-body {
  padding-inline: 0;
}


/* =============================================================================
   13b. THE RHYTHM — the control layer breathes on the band's own steps
   ========================================================================== */

/* The vertical intervals themselves live in 05-motion.css §4, which owns the
   whole document's rhythm through `body :is(...)`; what belongs here is the
   measure of the ledger and the rules it is drawn with.

   An empty notices wrapper was quietly holding 20px at the top of .shop-main,
   which pushed the toolbar's rule 20px below the sidebar's — the two halves of
   one line, out by exactly the height of nothing. */
.woocommerce-notices-wrapper:empty { display: none; margin: 0; }

.shop-page .shop-layout,
.search-results-page .shop-layout {
  grid-template-columns: 236px minmax(0, 1fr);
  column-gap: clamp(40px, 4vw, 56px);
  align-items: start;
}

.shop-page .products-grid,
.blog-page .products-grid,
.search-results-page .products-grid,
.single-product-page .products-grid {
  gap: 28px 28px;
}

.shop-page .shop-pagination,
.blog-page .shop-pagination,
.search-results-page .shop-pagination {
  padding-top: 30px;
  border-top: 1px solid var(--ctl-rule);
  /* Everything else on this page hangs off the left edge; a centred rail of
     page numbers was the one thing still floating. */
  justify-content: flex-start;
}


/* =============================================================================
   13c. MY ACCOUNT — off the centre line, onto the axis
   -----------------------------------------------------------------------------
   The shortcode's own wrapper was centred at l=357, which put the one page a
   customer visits most on an axis nothing else in the store uses. It is now a
   two-column plate: the form on the journey's left edge, and a kicker and a
   Fraunces statement holding the right column so the width is spent rather
   than abandoned.
   ========================================================================== */

@media (min-width: 1080px) {
  .woocommerce-account .page-content-section > .container {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 340px;
    grid-template-rows: auto 1fr;
    column-gap: clamp(56px, 6vw, 96px);
    row-gap: 24px;
    align-items: start;
  }

  .woocommerce-account .page-content-section > .container > * {
    grid-column: 1;
    grid-row: 1 / -1;
    max-width: none;
    margin-inline: 0;
    width: 100%;
    padding-top: 20px;
    border-top: 1px solid var(--ctl-rule);
  }

  .woocommerce-account .page-content-section > .container::before {
    content: "Members";
    grid-column: 2;
    grid-row: 1;
    align-self: start;
    padding-top: 20px;
    border-top: 1px solid var(--ctl-rule);
    font-family: var(--font-primary);
    font-size: 0.7rem;
    font-weight: 500;
    line-height: 1;
    letter-spacing: 0.17em;
    text-transform: uppercase;
    color: color-mix(in srgb, var(--paper) 60%, transparent);
  }

  .woocommerce-account .page-content-section > .container::after {
    content: "Sign in to see what you ordered, where it went, and what is waiting to be poured next.";
    grid-column: 2;
    grid-row: 2;
    align-self: start;
    max-width: 20ch;
    font-family: var(--font-heading);
    font-optical-sizing: auto;
    font-size: clamp(1.3rem, 1.85vw, 1.7rem);
    font-weight: 300;
    line-height: 1.24;
    letter-spacing: -0.022em;
    color: color-mix(in srgb, var(--paper) 74%, transparent);
    text-wrap: balance;
  }

  /* Once logged in the right column would be talking to a customer who is
     already inside, so it changes what it says rather than staying wrong. */
  .woocommerce-account.logged-in .page-content-section > .container::before {
    content: "Your file";
  }
  .woocommerce-account.logged-in .page-content-section > .container::after {
    content: "Everything the shop keeps about you, and every pot it has sent.";
  }
}

/* The form itself: a real measure on an 812px column. */
.woocommerce-account .woocommerce form.login,
.woocommerce-account .woocommerce form.register,
.woocommerce-account .woocommerce form.lost_reset_password,
.woocommerce-account .woocommerce-page form.login {
  max-width: 620px;
}

.woocommerce-account .woocommerce > h2 {
  font-family: var(--font-heading);
  font-optical-sizing: auto;
  font-weight: 300;
  letter-spacing: -0.03em;
}


/* =============================================================================
   13d. SPEND CREAM ONCE
   -----------------------------------------------------------------------------
   Solid paper is the store's commit gesture — the Log in / Add to basket pill.
   A page number is not a commitment, so the active state gives the fill back
   and keeps a 1px cream hairline instead.
   ========================================================================== */

.page-btn.active,
.view-toggle-btn.active {
  background: transparent;
  border-color: color-mix(in srgb, var(--paper) 92%, transparent);
  color: color-mix(in srgb, var(--paper) 92%, transparent);
  box-shadow: none;
  transform: none;
}
.page-btn.active:hover,
.view-toggle-btn.active:hover {
  background: rgba(236, 229, 214, 0.08);
  border-color: var(--paper);
  color: var(--paper);
}


/* =============================================================================
   13e. THE WELL, WHERE A RULE STILL SAYS OTHERWISE
   -----------------------------------------------------------------------------
   §3 sets its focus box-shadow from the tokens above, so most of the store
   follows already. These are the places that hard-coded a face or a ring.
   ========================================================================== */

.woocommerce input.input-text:focus,
.woocommerce textarea:focus,
.woocommerce select:focus,
.woocommerce .woocommerce-Input:focus,
.woocommerce form .form-row input.input-text:focus,
.woocommerce form .form-row textarea:focus,
.woocommerce form .form-row select:focus,
.woocommerce-page form .form-row input.input-text:focus,
.woocommerce-ordering select:focus,
.form-group input:not([type="checkbox"]):not([type="radio"]):focus,
.form-group select:focus,
.form-group textarea:focus,
.comment-form input[type="text"]:focus,
.comment-form input[type="email"]:focus,
.comment-form input[type="url"]:focus,
.comment-form textarea:focus,
.wc-block-components-text-input input:focus,
.wc-block-components-select__select:focus,
.select2-container--default.select2-container--focus .select2-selection--single,
.select2-container--default.select2-container--open .select2-selection--single {
  background-color: var(--ctl-field-face-focus);
  border-color: var(--ctl-field-edge-foc);
  box-shadow: var(--ctl-field-depth-focus);
  outline: none;
}

/* select2's dropdown and the WooCommerce block panels are wells too. */
.select2-container--default .select2-dropdown,
.select2-container--default .select2-search--dropdown .select2-search__field {
  background-color: rgba(0, 0, 0, 0.35);
  border-color: rgba(236, 229, 214, 0.14);
  border-radius: 2px;
}


/* =============================================================================
   13f. NARROW — the ledger stacks, the axis relaxes
   ========================================================================== */

@media (max-width: 1079px) {
  .woocommerce-account .page-content-section > .container > * {
    max-width: none;
    margin-inline: 0;
  }
}

@media (max-width: 991px) {
  .shop-page .shop-layout,
  .search-results-page .shop-layout {
    grid-template-columns: minmax(0, 1fr);
  }
  .shop-page .shop-toolbar,
  .blog-page .shop-toolbar,
  .search-results-page .shop-toolbar {
    margin-bottom: 40px;
  }
  .shop-page .products-grid,
  .blog-page .products-grid,
  .search-results-page .products-grid {
    gap: 24px;
  }
  .shop-page .shop-pagination,
  .blog-page .shop-pagination,
  .search-results-page .shop-pagination {
    margin-top: 64px;
  }
}

@media (max-width: 600px) {
  .shop-page .products-grid,
  .blog-page .products-grid,
  .search-results-page .products-grid {
    gap: 20px;
  }
  .woocommerce form.login,
  .woocommerce form.register,
  .woocommerce form.lost_reset_password,
  .woocommerce-page form.login,
  .woocommerce-page form.register {
    padding: 28px 22px;
  }
}


/* =============================================================================
   13g. THE LEDGER REACHES THE JOURNAL
   -----------------------------------------------------------------------------
   The blog runs the same sidebar and the same grid as the shop, so it runs the
   same rules: no fills, no frames, one hairline. Its search widget was still
   wearing a saturated green submit block — the loudest object on a page whose
   whole accent budget is one full stop.
   ========================================================================== */

.blog-page .blog-card,
.search-results-page .blog-card {
  background: transparent;
  border: 0;
  border-top: 1px solid var(--ctl-rule);
  border-radius: 0;
  padding-top: 18px;
  box-shadow: none;
}
.blog-page .blog-card:hover,
.search-results-page .blog-card:hover {
  transform: none;
  border-top-color: var(--ctl-rule-2);
}
.blog-page .blog-card-image,
.search-results-page .blog-card-image {
  border-radius: 0;
  background: rgba(0, 0, 0, 0.28);
}
.blog-page .blog-card-body,
.search-results-page .blog-card-body { padding-inline: 0; }

.blog-page .blog-grid,
.search-results-page .blog-grid { gap: 28px; }

/* The widget search: a well and a hairline glyph, like every other field and
   every other icon button in the store. */
.teashop-searchform-input,
.sidebar-widget .teashop-searchform-input {
  background-color: var(--ctl-field-face);
  border: 1px solid var(--ctl-field-edge);
  border-radius: var(--ctl-r);
  box-shadow: none;
}
.teashop-searchform-input:focus,
.sidebar-widget .teashop-searchform-input:focus {
  background-color: var(--ctl-field-face-focus);
  border-color: var(--ctl-field-edge-foc);
  box-shadow: var(--ctl-field-depth-focus);
  outline: none;
}
.teashop-searchform-btn,
.sidebar-widget .teashop-searchform-btn {
  background: transparent;
  border: 1px solid var(--ctl-field-edge);
  border-radius: var(--ctl-r);
  color: color-mix(in srgb, var(--paper) 72%, transparent);
  box-shadow: none;
  transition: var(--transition);
}
.teashop-searchform-btn:hover,
.sidebar-widget .teashop-searchform-btn:hover {
  background: rgba(236, 229, 214, 0.08);
  border-color: var(--ctl-hair-3);
  color: var(--paper);
}
