/* ============================================================
   Tailored Kenyan — commerce layer
   Additive, loaded after styles.css and motion.css, never
   overriding the approved design (CLAUDE.md Rule 1).
   ============================================================ */

/* ---------- quick view ----------
   Native <dialog>. Open animation uses the house tokens; the global
   reduced-motion rule in styles.css kills it, which is the defined
   static fallback. ::backdrop escapes that rule, so it is static. */
dialog.qv{
  border:none;padding:0;background:var(--band-2);
  width:min(880px,calc(100vw - 32px));
  max-height:min(680px,calc(100vh - 48px));
  overflow:auto;
}
dialog.qv::backdrop{background:rgba(27,22,20,.55)}
dialog.qv[open]{animation:tk-qv-in var(--tk-t-fast) var(--tk-ease) both}
@keyframes tk-qv-in{
  from{opacity:0;transform:translateY(var(--tk-d-xs))}
  to{opacity:1;transform:none}
}

.qv-close{
  position:absolute;top:10px;right:10px;z-index:1;
  width:44px;height:44px;border:1px solid var(--rule);border-radius:50%;
  background:var(--band-2);color:var(--ink);font-size:15px;cursor:pointer;
}
.qv-body{display:grid;grid-template-columns:1fr 1fr}
.qv-img{width:100%;height:100%;object-fit:cover;display:block}
.qv-info{padding:32px 28px}
.qv-info h2{font-family:'Playfair Display',serif;font-size:26px;font-weight:500;margin:10px 0 0}
.qv-price{display:flex;align-items:baseline;gap:14px;margin:12px 0 0}
.qv-price span:first-child{font-size:18px;color:var(--wine-2)}
.qv-size{font-size:12px;color:var(--muted)}
.qv-desc{font-size:15px;line-height:1.85;color:var(--body);margin:16px 0 0}
.qv-block{margin:18px 0 0}
.qv-block p{font-size:15px;line-height:1.85;color:var(--body);margin:6px 0 0}
.qv-actions{display:flex;gap:12px;flex-wrap:wrap;margin:24px 0 0}

@media (max-width:768px){
  .qv-body{grid-template-columns:1fr}
  .qv-img{max-height:44vh}
  .qv-info{padding:24px 20px}
}

/* ---------- discover: filter block rhythm (spec §6) ----------
   Alignment and spacing only. No element moves, nothing merges,
   nothing becomes sticky. Horizontal gutters already match styles.css
   (.phead/.filters/.grid-wrap all pad 48px on desktop, 20px on mobile) —
   this only evens out the vertical rhythm between the three bands. */
body[data-page="discover"] .filters{padding-top:30px;padding-bottom:30px}
body[data-page="discover"] .filter-foot{align-items:baseline}

/* LAI keeps discovery decisive: one clear filter, a count, then a consistent
   result flow. The all-pieces view keeps each real clothing category intact
   as its own section rather than mixing unrelated silhouettes together. */
.category-filter{padding:0 0 28px;margin:0 0 26px;border-bottom:1px solid var(--rule)}
.category-heading{display:flex;justify-content:space-between;gap:20px;align-items:baseline;margin:0 0 15px}
.filter-label{margin:0;font-size:11px;letter-spacing:.22em;text-transform:uppercase;color:var(--muted)}
.category-summary{margin:0;font-size:12px;color:var(--muted)}
.category-summary b{font-weight:500;color:var(--body)}
.category-control{display:grid;grid-template-columns:auto minmax(220px,1fr) auto;align-items:center;gap:15px;max-width:620px}
.category-control label{flex:none;font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--muted)}
.category-control select{width:100%;min-width:0;min-height:52px;padding:0 42px 0 16px;border:1px solid var(--rule-2);background-color:var(--cream-lt);font-size:14px}
.category-control select:hover{border-color:var(--wine-2)}
.category-reset{font-size:11px;letter-spacing:.11em;text-transform:uppercase;color:var(--wine);white-space:nowrap}
.category-reset:hover{text-decoration:underline;text-underline-offset:4px}
.category-hint{margin:11px 0 0;padding-left:calc(58px + 15px);font-size:12px;color:var(--muted)}

.collection-group + .collection-group{margin-top:52px}
.collection-group-head{display:flex;align-items:baseline;justify-content:space-between;gap:20px;margin:0 0 18px;padding-top:1px;border-top:1px solid var(--rule)}
.collection-group-head h2{margin:17px 0 0;font:500 28px/1.05 'Playfair Display',serif;color:var(--ink-dk-2)}
.collection-group-head p{margin:0;font-size:11px;letter-spacing:.15em;text-transform:uppercase;color:var(--muted)}
.collection-group .pgrid{gap:18px}

/* A second photograph is only emitted when the catalogue really has one.
   It occupies the same crop, so revealing it changes no card geometry. */
.prod .prod-alt{opacity:0;z-index:1}
.prod:hover .prod-alt,.prod:focus-visible .prod-alt,.prod.show-alt .prod-alt{opacity:1}
.prod .prod-alt{transition:opacity var(--tk-t-hover) var(--tk-ease),transform var(--tk-t-card) var(--tk-ease)}
.prod .veil,.prod .cap{z-index:2}

.catalog-search{display:flex;align-items:center;gap:12px;min-width:min(100%,260px)}
.catalog-search label{font-size:12px;color:var(--muted);letter-spacing:.22em;text-transform:uppercase}
.catalog-search input{min-height:44px;min-width:0;width:180px;background:transparent;border:0;border-bottom:1px solid var(--rule-2);font:13px 'Jost',sans-serif;color:var(--ink)}

/* Owner-supplied size guide. The image is displayed unchanged so its approved
   measurements stay legible without a hand-transcribed duplicate. */
.size-guide{margin:22px 0 0;padding:10px;background:#fff;border:1px solid var(--rule)}
.size-guide img{display:block;width:100%;height:auto}

/* On wide screens the gallery is necessarily taller than its decision panel.
   Keeping the product details in view while the shopper compares photos and
   measurements avoids a long empty companion column before related pieces.
   Mobile stays in its approved linear reading order. */
@media (min-width:1001px){
  .pdp-info{position:sticky;top:24px;align-self:start}
}

@media (max-width:600px){
  .category-filter{margin-bottom:20px;padding-bottom:22px}
  .category-heading{display:block;margin-bottom:13px}
  .category-summary{margin-top:5px}
  .category-control{grid-template-columns:1fr auto;gap:8px;max-width:none}
  .category-control label{display:block;margin-bottom:5px}
  .category-control label{grid-column:1 / -1}
  .category-control select{width:100%}
  .category-hint{padding-left:0;margin-top:9px}
  .collection-group + .collection-group{margin-top:38px}
  .collection-group-head{margin-bottom:13px}
  .collection-group-head h2{margin-top:13px;font-size:24px}
  .collection-group .pgrid{gap:12px}
}

@media (prefers-reduced-motion:reduce){
  .prod .prod-alt{transition:none}
}

/* Checkout additions reuse the approved field/radio/button components. These
   rules only expose state; they do not change the frozen page geometry. */
body[data-page="cart"] [aria-busy="true"],
body[data-page="order"] [aria-busy="true"]{cursor:progress}
body[data-page="cart"] button:disabled,
body[data-page="order"] button:disabled{opacity:.58;cursor:not-allowed}
[data-address-field][hidden],[data-pickup-field][hidden]{display:none}
#payment-method .radio:last-child{border-bottom:1px solid var(--rule)}
#payment-method .radio[aria-disabled="true"]{opacity:.58}
body[data-page="order"] .paystate{min-height:360px;display:flex;flex-direction:column;align-items:center;justify-content:center}
body[data-page="order"] .paystate[hidden]{display:none}
body[data-page="order"] .fallback{width:min(100%,480px);text-align:left}
body[data-page="order"] [data-order-error]{margin-top:18px;color:var(--wine-2)}

/* Fulfilment progress tracker — additive to the approved order page (Rule 1),
   reuses existing colour/spacing tokens only. */
.fulfilment-track{display:flex;justify-content:space-between;list-style:none;
  width:min(100%,420px);margin:18px auto 0;padding:0}
.fulfilment-track li{flex:1;position:relative;text-align:center;
  font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
.fulfilment-track li:not(:last-child)::after{content:"";position:absolute;
  top:6px;left:calc(50% + 15px);right:calc(-50% + 15px);height:1px;background:var(--rule-2)}
.fulfilment-dot{display:block;width:13px;height:13px;border-radius:50%;
  margin:0 auto 8px;border:1px solid var(--rule-2);background:var(--card)}
.fulfilment-track li[data-state="done"]{color:var(--wine-2)}
.fulfilment-track li[data-state="done"] .fulfilment-dot{background:var(--wine-2);border-color:var(--wine-2)}
.fulfilment-track li[data-state="done"]:not(:last-child)::after{background:var(--wine-2)}
.fulfilment-track li[data-state="current"]{color:var(--wine-2)}
.fulfilment-track li[data-state="current"] .fulfilment-dot{background:var(--gold);border-color:var(--gold)}
