/*
 * PDP Redesign — Direction A (Modern Delivery App)
 *
 * Loaded only when lafka_pdp_redesign_enabled() returns true. Enqueued
 * conditionally from lafka-theme/functions.php (W4-T21). All component
 * styles for the redesigned product detail page live here. Subsequent
 * tasks (W4-T11..T20) append component sections to this file.
 *
 * @since 5.16.0
 */

:root {
  --lafka-pdp-accent: #e4584b;
  --lafka-pdp-accent-dark: #c73d31;
  --lafka-pdp-text: #1a1a1a;
  --lafka-pdp-muted: #666;
  --lafka-pdp-border: #e0e0e0;
  --lafka-pdp-bg-soft: #fafafa;
  --lafka-pdp-bg-warm: #fff5f0;
  --lafka-pdp-bg-dark: #1a1a1a;
  --lafka-pdp-radius: 8px;
  --lafka-pdp-radius-chip: 6px;
  --lafka-pdp-shadow-card: 0 1px 3px rgba(0,0,0,.06), 0 4px 12px rgba(0,0,0,.04);
  --lafka-pdp-z-bar: 100;
  --lafka-pdp-z-drawer: 1000;
  --lafka-pdp-bar-h: 36px;
  --lafka-pdp-bar-h-mobile: 32px;
  --lafka-pdp-cta-h-mobile: 64px;
}

/*
 * Safety net: if any redesign component renders while the feature flag
 * is OFF (lafka-pdp-disabled body class added by functions.php), hide
 * it. Defends against partials being included by accident.
 */
body.lafka-pdp-disabled .lafka-pdp,
body.lafka-pdp-disabled .lafka-cart-drawer,
body.lafka-pdp-disabled .lafka-order-method-bar { display: none !important; }

/* === Order method bar (W4-T11) === */
.lafka-order-method-bar {
  position: fixed; top: 0; left: 0; right: 0;
  z-index: var(--lafka-pdp-z-bar);
  height: var(--lafka-pdp-bar-h);
  background: var(--lafka-pdp-bg-dark);
  color: #fff;
  font-size: 12px;
  display: flex; align-items: center;
}

.lafka-order-method-bar__inner {
  width: 100%; max-width: 1280px;
  margin: 0 auto; padding: 0 16px;
  display: flex; justify-content: space-between; align-items: center;
  gap: 12px;
}

.lafka-order-method-bar__method {
  background: none; border: none; color: #fff;
  display: flex; align-items: center; gap: 6px;
  cursor: pointer; padding: 0; font: inherit;
}

.lafka-order-method-bar__location { text-decoration: underline; text-underline-offset: 3px; }

.lafka-order-method-bar__switch { color: #ffd166; margin-left: 6px; font-weight: 500; }

.lafka-order-method-bar__right { display: flex; gap: 12px; align-items: center; }

.lafka-order-method-bar__phone { color: #fff; text-decoration: none; }

@media (max-width: 720px) {

  .lafka-order-method-bar { height: var(--lafka-pdp-bar-h-mobile); font-size: 11px; }

  .lafka-order-method-bar__inner { padding: 0 10px; gap: 6px; }

  .lafka-order-method-bar__phone { display: none; }
}

body { padding-top: var(--lafka-pdp-bar-h); }

@media (max-width: 720px) {

 body { padding-top: var(--lafka-pdp-bar-h-mobile); } }

/* === Method-switch modal (W4-T11) — built via createElement, no innerHTML === */
.lafka-method-modal__overlay {
  position: fixed; inset: 0;
  background: rgba(0,0,0,.5);
  z-index: var(--lafka-pdp-z-drawer);
  display: flex; align-items: center; justify-content: center;
}

.lafka-method-modal {
  background: #fff; padding: 24px;
  border-radius: var(--lafka-pdp-radius);
  max-width: 320px; width: calc(100% - 32px);
  position: relative;
}

.lafka-method-modal h3 { margin: 0 0 16px; font-size: 16px; }

.lafka-method-modal button:not(.lafka-method-modal__close) {
  display: block; width: 100%;
  padding: 12px; margin: 8px 0;
  background: #fff; border: 1.5px solid var(--lafka-pdp-border);
  border-radius: var(--lafka-pdp-radius-chip);
  font: inherit; cursor: pointer; text-align: left;
}

.lafka-method-modal button:not(.lafka-method-modal__close):hover {
  border-color: var(--lafka-pdp-accent);
  background: var(--lafka-pdp-bg-warm);
}

.lafka-method-modal__close {
  position: absolute; top: 8px; right: 12px;
  background: none; border: none;
  font-size: 22px; cursor: pointer;
  color: var(--lafka-pdp-muted);
}

/* === PDP pickers (W4-T12) === */
.lafka-pdp-picker { border: none; padding: 0; margin: 0 0 16px; }

.lafka-pdp-picker__label {
  display: block;
  font-size: 11px; font-weight: 600;
  text-transform: uppercase; letter-spacing: 1.5px;
  color: var(--lafka-pdp-text);
  margin: 0 0 8px;
}

.lafka-pdp-picker__chips { display: flex; flex-wrap: wrap; gap: 6px; }

.lafka-pdp-chip { display: inline-flex; align-items: center; cursor: pointer; user-select: none; }

.lafka-pdp-chip input { position: absolute; opacity: 0; pointer-events: none; }

.lafka-pdp-chip__inner {
  display: inline-flex; flex-direction: column; align-items: center;
  padding: 8px 14px;
  border: 1.5px solid var(--lafka-pdp-border);
  border-radius: var(--lafka-pdp-radius-chip);
  background: #fff;
  transition: border-color .12s, background .12s, color .12s;
  text-align: center; min-width: 64px;
}

.lafka-pdp-chip__name { font-size: 13px; font-weight: 500; }

.lafka-pdp-chip__price { font-size: 11px; color: var(--lafka-pdp-muted); margin-top: 2px; }

.lafka-pdp-chip:hover .lafka-pdp-chip__inner { border-color: var(--lafka-pdp-accent); }

.lafka-pdp-chip:has(:checked) .lafka-pdp-chip__inner {
  border-color: var(--lafka-pdp-accent);
  background: var(--lafka-pdp-accent);
  color: #fff;
}

.lafka-pdp-chip:has(:checked) .lafka-pdp-chip__price { color: rgba(255,255,255,.85); }

.lafka-pdp-chip:focus-within .lafka-pdp-chip__inner {
  outline: 2px solid var(--lafka-pdp-accent-dark);
  outline-offset: 2px;
}

/*
 * === Addon groups (plugin output) ===
 *
 * Targets the markup emitted by lafka-plugin's addon engine v2:
 *
 *   <div class="product-addon product-addon-{slug} {type}">
 *     <h3 class="addon-name">Premium Toppings</h3>
 *     <p class="form-row form-row-wide addon-wrap-...">
 *       <label>
 *         <input type="checkbox" class="addon addon-checkbox" />
 *         Artichoke Hearts ($3.50)
 *       </label>
 *     </p>
 *     ...
 *   </div>
 *
 * The plugin stays theme-agnostic; styling lives here. All visual decisions
 * (list-row pattern vs pill, price prominence, hover/selected states,
 * vegan-marker treatment) are theme choices and belong with the rest of
 * the PDP redesign tokens.
 *
 * Design choice: list rows over pills. Toppings are multi-select with
 * many options (15+ on Peppery's Premium Toppings); a list pattern
 * scans faster and makes "tick what you want" obvious. Pills work for
 * variations (one-of-N) where they communicate the choice space; for
 * many-of-N a tick list is clearer.
 */

.product-addon {
  background: var(--lafka-pdp-bg-warm);
  border-radius: var(--lafka-pdp-radius);
  padding: 12px 14px;
  margin: 14px 0;
}

.product-addon + .product-addon {
  margin-top: 10px;
}

/*
 * Heading is the click-target for the accordion. JS adds role=button +
 * tabindex=0 + aria-expanded; CSS handles the visual affordance: caret
 * indicator on the right that rotates on collapse, hover/focus state.
 *
 * The heading also hosts the live "<count> selected · +$X.XX" summary
 * span (.lafka-addon-summary) which JS stamps in. When something is
 * selected, the summary turns accent-colored to give the customer a
 * sense of running total without needing to scroll back up.
 */
.product-addon .addon-name {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 11px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 1.5px;
  color: var(--lafka-pdp-text);
  margin: 0;
  padding: 4px 0;
  line-height: 1.4;
  cursor: pointer;
  user-select: none;
  -webkit-tap-highlight-color: transparent;
}

.product-addon .addon-name:hover {
  color: var(--lafka-pdp-accent-dark);
}

.product-addon .addon-name:focus-visible {
  outline: 2px solid var(--lafka-pdp-accent);
  outline-offset: 4px;
  border-radius: 3px;
}

/* Caret indicator at the right edge of the heading. Down when expanded,
   right when collapsed. CSS-only chevron via two borders rotated 45°. */
.product-addon .addon-name::after {
  content: "";
  width: 7px;
  height: 7px;
  border-right: 2px solid currentcolor;
  border-bottom: 2px solid currentcolor;
  transform: rotate(45deg);
  transition: transform .15s ease;
  margin-left: 4px;
  flex-shrink: 0;
  position: relative;
  top: -2px;
  opacity: .55;
}

.product-addon[data-collapsed="true"] .addon-name::after {
  transform: rotate(-45deg);
  top: 0;
}

.product-addon .addon-name .required {
  color: var(--lafka-pdp-accent);
  text-decoration: none;
  margin-left: 4px;
}

/* Live selection summary: "<count> selected · +$X.XX" */
.product-addon .lafka-addon-summary {
  margin-left: auto;
  font-size: 11px;
  font-weight: 500;
  text-transform: none;
  letter-spacing: 0;
  color: var(--lafka-pdp-muted);
  white-space: nowrap;

  /* Empty by default — JS populates after selection. Reserve space so the
     caret doesn't jump when text appears. */
  min-height: 1em;
}

.product-addon .lafka-addon-summary.is-active {
  color: var(--lafka-pdp-accent);
  font-weight: 600;
}

/*
 * Collapsed state: hide the option list entirely. The heading bar
 * remains visible (and clickable to re-expand). Padding shrinks so
 * the collapsed group is compact.
 */
.product-addon[data-collapsed="true"] {
  padding-bottom: 8px;
}

.product-addon[data-collapsed="true"] p.form-row,
.product-addon[data-collapsed="true"] .lafka-addon-limit-message,
.product-addon[data-collapsed="true"] .addon-description {
  display: none;
}

/*
 * Expanded state on desktop: 2-column grid. Cuts the vertical scroll
 * roughly in half for groups with 16+ items. Each form-row becomes one
 * grid cell; heading/description span the full width.
 *
 * Mobile (default block flow) keeps 1 column — narrower viewport,
 * legibility priority.
 */
@media (min-width: 721px) {

  .product-addon:not([data-collapsed="true"]) {
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: 16px;
    row-gap: 0;
  }

  .product-addon:not([data-collapsed="true"]) .addon-name,
  .product-addon:not([data-collapsed="true"]) .addon-description {
    grid-column: 1 / -1;
  }

  /* In 2-col mode, the visual rhythm comes from the gap, not borders.
     Drop the inter-row borders to clean it up. */
  .product-addon:not([data-collapsed="true"]) p.form-row {
    border-top: none;
  }
}

/* Description block (uncommon — only when operator filled it in) */
.product-addon .addon-description {
  font-size: 12px;
  color: var(--lafka-pdp-muted);
  margin: 0 0 8px;
  line-height: 1.45;
}

.product-addon .addon-description p {
  margin: 0;
}

/* Each option row. Plugin emits <p class="form-row form-row-wide ...">
   wrapping a single <label>. We override the WC form-row defaults to make
   this a clean list item with name on the left and price on the right. */
.product-addon .form-row.addon-wrap-,
.product-addon p.form-row {
  margin: 0;
  padding: 0;
  border-top: 1px solid rgba(0, 0, 0, .06);
}

.product-addon p.form-row:first-of-type {
  border-top: none;
}

.product-addon p.form-row > label {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 2px;
  cursor: pointer;

  /* lafka-theme has site-wide `label { font-size: 12px !important }`
     that cascades through. Use !important to win the cascade — this
     is intentional, not a smell. */
  font-size: 13px !important;
  color: var(--lafka-pdp-text);
  margin: 0;
  line-height: 1.4;
  transition: color .12s;

  /* Override site-wide `label { text-transform: uppercase }` if the
     theme decides addon options should be sentence case. Currently
     leaving uppercase to match the rest of the PDP design tokens. */
}

.product-addon p.form-row > label:hover {
  color: var(--lafka-pdp-accent-dark);
}

/* Native checkbox/radio: visible, sized to feel tappable on mobile,
   accent-tinted when checked. */
.product-addon p.form-row > label input[type="checkbox"],
.product-addon p.form-row > label input[type="radio"] {
  width: 18px;
  height: 18px;
  margin: 0;
  flex: 0 0 auto;
  accent-color: var(--lafka-pdp-accent);
  cursor: pointer;
}

/* Option image (when an option has a custom image attachment). */
.product-addon p.form-row > label .lafka-addon-image-icon {
  flex: 0 0 auto;
  width: 24px;
  height: 24px;
  object-fit: contain;
}

/* Price block: wraps "($wc_price)" in <span class="lafka-addon-price">
   (added in lafka-plugin v8.17.3). Targeting the wrapper rather than
   the inner .woocommerce-Price-amount keeps the text-node parens part
   of the element being right-aligned — without this, flex margin-left:
   auto leaves the bare "(" stuck to the left of the label and orphans
   ")$3.50" on the right with a huge whitespace gap.

   Visual choice (theme): drop the parens and present as "+$3.50".
   Plugin still emits "(...)" as the back-compat default for themes
   that don't override. We hide the parens by zeroing font-size on
   the wrapper and restoring it on the inner price span. */
.product-addon p.form-row > label .lafka-addon-price {
  margin-left: auto;
  font-size: 0;
  font-weight: 600;
  color: var(--lafka-pdp-muted);
  white-space: nowrap;
}

.product-addon p.form-row > label .lafka-addon-price::before {
  content: "+";
  font-size: 13px;
  margin-right: 1px;
  font-weight: 500;
  color: inherit;
}

.product-addon p.form-row > label .lafka-addon-price .woocommerce-Price-amount {
  font-size: 13px;
}

.product-addon p.form-row > label .lafka-addon-price sup {
  font-size: 0.7em;
  vertical-align: super;
  font-weight: 500;
}

.product-addon p.form-row > label:has(:checked) .lafka-addon-price {
  color: var(--lafka-pdp-accent);
}

.product-addon p.form-row > label:has(:checked) {
  color: var(--lafka-pdp-text);
  font-weight: 500;
}

/* Vegan / dietary marker emoji: WP renders 🌱 etc. as Twemoji <img>.
   Size them inline with the label text and add a hair of left margin so
   they don't crash into the topping name. */
.product-addon p.form-row > label img.emoji,
.product-addon p.form-row > label .wp-smiley {
  width: 14px;
  height: 14px;
  margin: 0 0 0 4px;
  vertical-align: -2px;
}

/* Limit-message under the list ("Select up to N items.") */
.product-addon .lafka-addon-limit-message {
  display: block;
  font-size: 11px;
  color: var(--lafka-pdp-muted);
  margin-top: 8px;
  text-align: right;
}

/* Required-field hint (asterisk-only by default) */
.product-addon.required-product-addon .addon-name::after {
  content: "Required";
  display: inline-block;
  background: var(--lafka-pdp-accent);
  color: #fff;
  font-size: 9px;
  font-weight: 700;
  letter-spacing: 1px;
  padding: 2px 6px;
  border-radius: 3px;
  margin-left: 8px;
  vertical-align: middle;
}

.product-addon.required-product-addon .addon-name .required {
  display: none; /* the ::after badge replaces the bare * marker */
}

/* Textarea field type: full-width stacked layout instead of inline list */
.product-addon.textarea p.form-row {
  border-top: none;
  padding: 8px 0;
}

.product-addon.textarea p.form-row > label {
  padding: 0 0 4px;
  font-size: 12px;
  font-weight: 600;
  color: var(--lafka-pdp-muted);
  text-transform: uppercase;
  letter-spacing: 1px;
}

.product-addon.textarea textarea {
  width: 100%;
  min-height: 64px;
  padding: 8px 10px;
  border: 1.5px solid var(--lafka-pdp-border);
  border-radius: var(--lafka-pdp-radius-chip);
  font: inherit;
  font-size: 13px;
  resize: vertical;
}

.product-addon.textarea textarea:focus {
  border-color: var(--lafka-pdp-accent);
  outline: none;
}

/* Engine v2 totals widget (live-updated by the plugin's addons.js). The
   plugin emits a bare div; we give it the same warm-card treatment to
   anchor the running total below the toppings. */
#product-addons-total {
  background: #fff;
  border: 1px solid var(--lafka-pdp-border);
  border-radius: var(--lafka-pdp-radius);
  padding: 10px 14px;
  margin: 12px 0 0;
  font-size: 13px;
  display: none; /* shown by the plugin's JS only when total > 0 */
}

#product-addons-total[data-total]:not([data-total="0"]) {
  display: block;
}

#product-addons-total .product-addons-total-amount {
  color: var(--lafka-pdp-accent);
  font-weight: 700;
}

/* === Cart drawer (W4-T14) === */
.lafka-cart-drawer { position: fixed; inset: 0; z-index: var(--lafka-pdp-z-drawer); pointer-events: none; visibility: hidden; }

.lafka-cart-drawer[data-open="true"] { pointer-events: auto; visibility: visible; }

.lafka-cart-drawer__overlay { position: absolute; inset: 0; background: rgba(0,0,0,.4); opacity: 0; transition: opacity .25s ease; }

.lafka-cart-drawer[data-open="true"] .lafka-cart-drawer__overlay { opacity: 1; }

.lafka-cart-drawer__panel {
  position: absolute; right: 0; top: 0; bottom: 0;
  width: 400px; max-width: 92vw;
  background: #fff;
  display: flex; flex-direction: column;
  transform: translateX(100%);
  transition: transform .25s ease;
  box-shadow: -4px 0 24px rgba(0,0,0,.12);
}

.lafka-cart-drawer[data-open="true"] .lafka-cart-drawer__panel { transform: translateX(0); }

.lafka-cart-drawer__header { padding: 16px 20px; border-bottom: 1px solid var(--lafka-pdp-border); display: flex; justify-content: space-between; align-items: center; }

.lafka-cart-drawer__header h2 { margin: 0; font-size: 18px; }

.lafka-cart-drawer__close { background: none; border: none; font-size: 24px; cursor: pointer; color: var(--lafka-pdp-muted); padding: 0 4px; }

.lafka-cart-drawer__body { flex: 1; overflow-y: auto; padding: 16px 20px; }

.lafka-cart-drawer__items { list-style: none; padding: 0; margin: 0; }

.lafka-cart-drawer__item {
  display: grid; grid-template-columns: 56px 1fr auto;
  gap: 10px; align-items: center;
  padding: 10px 0; border-bottom: 1px solid #f0f0f0;
}

.lafka-cart-drawer__thumb img { width: 56px; height: 56px; object-fit: cover; border-radius: 4px; }

.lafka-cart-drawer__name { font-size: 13px; font-weight: 500; }

.lafka-cart-drawer__qty { font-size: 12px; color: var(--lafka-pdp-muted); }

.lafka-cart-drawer__price { font-size: 13px; font-weight: 600; }

.lafka-cart-drawer__remove {
  background: none; border: none; cursor: pointer;
  color: var(--lafka-pdp-muted); font-size: 18px;
  grid-column: 3; grid-row: 1;
}

.lafka-cart-drawer__footer { border-top: 1px solid var(--lafka-pdp-border); padding: 16px 20px; }

.lafka-cart-drawer__subtotal { display: flex; justify-content: space-between; font-size: 14px; margin-bottom: 6px; }

.lafka-cart-drawer__threshold { font-size: 12px; color: var(--lafka-pdp-muted); padding: 6px 0; }

.lafka-cart-drawer__threshold--reached { color: #2e7d32; font-weight: 500; }

.lafka-cart-drawer__actions { display: flex; gap: 8px; margin-top: 12px; }

.lafka-cart-drawer__continue { flex: 1; background: #fff; border: 1.5px solid var(--lafka-pdp-border); border-radius: var(--lafka-pdp-radius-chip); padding: 12px; cursor: pointer; font: inherit; }

.lafka-cart-drawer__checkout { flex: 1; background: var(--lafka-pdp-accent); color: #fff; border: none; border-radius: var(--lafka-pdp-radius-chip); padding: 12px; text-align: center; font-weight: 600; text-decoration: none; }

.lafka-cart-drawer__checkout:hover { background: var(--lafka-pdp-accent-dark); color: #fff; }

/* === Last-order card (W4-T16) === */
.lafka-pdp-last-order {
  background: var(--lafka-pdp-bg-soft);
  border: 1px solid var(--lafka-pdp-border);
  border-radius: var(--lafka-pdp-radius);
  padding: 12px 14px;
  margin: 14px 0;
}

.lafka-pdp-last-order__heading {
  font-size: 11px; font-weight: 600;
  text-transform: uppercase; letter-spacing: 1.5px;
  color: var(--lafka-pdp-muted);
}

.lafka-pdp-last-order__items { list-style: none; padding: 0; margin: 6px 0 10px; font-size: 13px; }

.lafka-pdp-last-order__items li { padding: 2px 0; }

.lafka-pdp-last-order__reorder {
  background: #fff;
  border: 1.5px solid var(--lafka-pdp-accent);
  color: var(--lafka-pdp-accent);
  padding: 6px 14px;
  border-radius: var(--lafka-pdp-radius-chip);
  font: inherit; font-weight: 600;
  cursor: pointer;
}

.lafka-pdp-last-order__reorder:hover { background: var(--lafka-pdp-accent); color: #fff; }

/* === Upsell row "Make it a meal" (W4-T17) === */
.lafka-pdp-upsell { margin: 24px 0; }

.lafka-pdp-upsell__heading { font-size: 14px; font-weight: 700; margin: 0 0 12px; }

.lafka-pdp-upsell__grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; }

@media (max-width: 720px) {

 .lafka-pdp-upsell__grid { grid-template-columns: repeat(2, 1fr); } }

.lafka-pdp-upsell__card {
  background: var(--lafka-pdp-bg-soft);
  border-radius: var(--lafka-pdp-radius);
  padding: 10px; text-align: center;
  display: flex; flex-direction: column; gap: 6px;
}

.lafka-pdp-upsell__link { color: inherit; text-decoration: none; }

.lafka-pdp-upsell__link img { width: 100%; aspect-ratio: 1; object-fit: cover; border-radius: 4px; }

.lafka-pdp-upsell__name { display: block; font-size: 12px; font-weight: 500; margin-top: 4px; }

.lafka-pdp-upsell__price { display: block; font-size: 11px; color: var(--lafka-pdp-muted); }

.lafka-pdp-upsell__add {
  background: #fff;
  border: 1.5px solid var(--lafka-pdp-accent);
  color: var(--lafka-pdp-accent);
  padding: 6px;
  border-radius: var(--lafka-pdp-radius-chip);
  font: inherit; font-weight: 600;
  cursor: pointer;
  margin-top: auto;
}

.lafka-pdp-upsell__add:hover { background: var(--lafka-pdp-accent); color: #fff; }

.lafka-pdp-upsell__add:disabled { opacity: .6; cursor: wait; }

/* === PDP summary (W4-T18) === */
.lafka-pdp-summary {
  background: #fff;
  border-radius: var(--lafka-pdp-radius);
  padding: 20px;
  box-shadow: var(--lafka-pdp-shadow-card);
  position: sticky;
  top: calc(var(--lafka-pdp-bar-h) + var(--lafka-header-h, 80px));
}

.lafka-pdp-eyebrow--bestseller {
  display: inline-block;
  font-size: 10px; font-weight: 700;
  letter-spacing: 1.5px;
  color: var(--lafka-pdp-accent);
  margin-bottom: 6px;
}

.lafka-pdp-summary__title { font-size: 28px; line-height: 1.15; margin: 0 0 8px; color: var(--lafka-pdp-text); }

.lafka-pdp-summary__short { font-size: 13px; color: var(--lafka-pdp-muted); margin-bottom: 14px; line-height: 1.5; }

.lafka-pdp-summary__short p { margin: 0; }

.lafka-pdp-summary__price { font-size: 28px; font-weight: 700; color: var(--lafka-pdp-accent); margin-bottom: 16px; }

.lafka-pdp-summary__price small { font-size: 11px; font-weight: 400; color: var(--lafka-pdp-muted); margin-left: 8px; }

.lafka-pdp-summary__cart-row { display: flex; gap: 10px; align-items: stretch; margin-top: 16px; }

/*
 * Cart-row reorder for variable products.
 *
 * The lafka-plugin addon engine hooks at woocommerce_single_variation
 * (priority 15) which fires AFTER .variations_button in the WC
 * template lifecycle. Without intervention, the customer sees:
 *   pickers → [qty + Add to Cart button] → toppings list
 * which surfaces the action before the user has even seen the
 * topping options. Visually we want:
 *   pickers → toppings list → [qty + Add to Cart button] → trust
 * so the cart-row is the final step after all selections.
 *
 * Achieve via flex order on the WC-managed wrapper. Doesn't move
 * any markup; .variations_button keeps its WC-expected position in
 * the DOM (so WC's variation JS still finds it for show/hide based
 * on variation availability), but visually it lands below the addons.
 *
 * Mobile: irrelevant because the cart-row is hidden on mobile
 * (sticky bottom CTA takes over) — but the order rule is harmless
 * either way.
 */
.single_variation_wrap {
  display: flex;
  flex-direction: column;
}

.single_variation_wrap .single_variation { order: 0; }

.single_variation_wrap .product-addon    { order: 1; }

.single_variation_wrap .variations_button { order: 2; }

.lafka-pdp-summary__qty { display: flex; align-items: center; border: 1.5px solid var(--lafka-pdp-border); border-radius: var(--lafka-pdp-radius-chip); }

.lafka-pdp-qty__btn { background: none; border: none; padding: 8px 12px; cursor: pointer; font: inherit; font-weight: 700; }

.lafka-pdp-qty__input { width: 36px; text-align: center; border: none; background: none; font: inherit; font-weight: 600; }

.lafka-pdp-qty__input::-webkit-outer-spin-button, .lafka-pdp-qty__input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }

.lafka-pdp-summary__cta {
  flex: 1;
  background: var(--lafka-pdp-accent); color: #fff;
  border: none; border-radius: var(--lafka-pdp-radius-chip);
  padding: 12px 16px; font: inherit; font-weight: 700;
  cursor: pointer;
  transition: background .12s, opacity .12s;
}

.lafka-pdp-summary__cta:hover:not(:disabled) { background: var(--lafka-pdp-accent-dark); }

.lafka-pdp-summary__cta:disabled { background: #ccc; cursor: not-allowed; opacity: .85; }

.lafka-pdp-summary__trust { font-size: 11px; color: var(--lafka-pdp-muted); margin-top: 12px; padding-top: 12px; border-top: 1px solid #f0f0f0; }

.lafka-pdp-trust--closed { color: var(--lafka-pdp-accent); font-weight: 500; }

/* === Mobile sticky bottom CTA === */
.lafka-pdp-mobile-cta { display: none; }

@media (max-width: 720px) {

  .lafka-pdp-summary { position: static; box-shadow: none; padding: 16px; }

  .lafka-pdp-summary__cart-row { display: none; }

  .lafka-pdp-mobile-cta {
    display: flex;
    position: fixed; bottom: 0; left: 0; right: 0;
    z-index: 90;
    background: #fff;
    border-top: 2px solid var(--lafka-pdp-accent);
    padding: 12px 16px calc(12px + env(safe-area-inset-bottom));
    gap: 10px; align-items: stretch;
    box-shadow: 0 -4px 16px rgba(0,0,0,.08);
  }

  .lafka-pdp-mobile-cta__qty { display: flex; align-items: center; border: 1.5px solid var(--lafka-pdp-border); border-radius: var(--lafka-pdp-radius-chip); }

  .lafka-pdp-mobile-cta__qty button { background: none; border: none; padding: 6px 10px; cursor: pointer; font: inherit; font-weight: 700; }

  .lafka-pdp-mobile-cta__qty span { padding: 0 8px; font-weight: 600; min-width: 18px; text-align: center; }

  .lafka-pdp-mobile-cta__btn {
    flex: 1;
    background: var(--lafka-pdp-accent); color: #fff;
    border: none; border-radius: var(--lafka-pdp-radius-chip);
    padding: 12px; font: inherit; font-weight: 700;
    cursor: pointer;
  }

  .lafka-pdp-mobile-cta__btn:disabled { background: #ccc; }

  /*
   * Hide the floating mini-cart icon on mobile single-product pages.
   * The sticky bottom cart-row IS the cart action; the floating cart
   * icon is redundant and overlaps the cart-row's button text — the
   * "Pick a crust to continue" CTA was rendering as "Pick a crust to
   * contin..." with the cart icon eating the right side.
   *
   * Other page types (category, home) keep the floating cart icon
   * since they don't have the sticky CTA bar.
   */
  body.single-product .lafka-search-cart-holder {
    display: none;
  }

  /*
   * Bottom padding accounts for the FULL height of the sticky cart-row,
   * not just the button's intrinsic height. The wrapper adds 12px top +
   * 12px bottom padding plus the iOS safe-area inset, so the actual
   * occupied space is ~88px–104px depending on device. Using just
   * --lafka-pdp-cta-h-mobile (64px) leaves the last topping item
   * clipped under the cart-row even when scrolled to the bottom.
   */
  body.single-product {
    padding-bottom: calc(var(--lafka-pdp-cta-h-mobile) + 28px + env(safe-area-inset-bottom));
  }

  /*
   * Mobile: tighten the addon group spacing further so the warm-card
   * background doesn't dominate a small viewport. Padding shrinks but
   * row tap targets stay >= 40px (each label is 10px+10px+~20px label
   * height = 40px) to remain accessible.
   */
  .product-addon {
    padding: 10px 12px;
    margin: 12px 0;
  }

  .product-addon p.form-row > label {
    padding: 11px 2px;
    font-size: 14px;
  }

  .product-addon p.form-row > label .lafka-addon-price::before {
    font-size: 14px;
  }

  .product-addon p.form-row > label .lafka-addon-price .woocommerce-Price-amount {
    font-size: 14px;
  }
}

/* === PDP tabs (W4-T19) === */
.lafka-pdp-tabs {
  margin: 32px 0;
  background: #fff;
  border-radius: var(--lafka-pdp-radius);
  padding: 20px;
  box-shadow: var(--lafka-pdp-shadow-card);
}

.lafka-pdp-tabs__buttons {
  display: flex; gap: 24px;
  border-bottom: 1px solid var(--lafka-pdp-border);
  padding-bottom: 8px; margin-bottom: 16px;
}

.lafka-pdp-tabs__buttons [role="tab"] {
  background: none; border: none;
  font-size: 11px; font-weight: 600;
  text-transform: uppercase; letter-spacing: 1.5px;
  color: var(--lafka-pdp-muted);
  padding: 0 0 8px; margin-bottom: -9px;
  cursor: pointer;
  border-bottom: 2px solid transparent;
}

.lafka-pdp-tabs__buttons [aria-selected="true"] {
  color: var(--lafka-pdp-accent);
  border-bottom-color: var(--lafka-pdp-accent);
}

.lafka-pdp-tabs__panel { font-size: 13px; line-height: 1.6; color: var(--lafka-pdp-text); }

.lafka-pdp-tabs__panel[hidden] { display: none; }

/*
 * === Cart page: hide orphan ":" rows for addon continuation lines ===
 *
 * The lafka-plugin's get_item_data emits the addon group label
 * (e.g. "Premium Toppings") only on the FIRST topping in each group,
 * with empty `name` for continuation rows so the label doesn't repeat
 * for every topping. WooCommerce's cart template renders each row as
 * <dt>{name}:</dt><dd>{value}</dd>, which means empty `name` becomes
 * a <dt class="variation-">:</dt> — a stray colon on its own line.
 *
 * lafka-theme already hides this for the legacy .cart-info layout +
 * the mini-cart widget. The modern WC cart shortcode uses td.product-
 * name directly (no .cart-info wrapper), which the parent rule misses.
 * Patch the gap here.
 *
 * Defense-in-depth: also hide via [class$="variation-"] in case the
 * exact class differs across WC versions.
 */
.woocommerce-cart-form td.product-name dl.variation dt.variation-,
.woocommerce-cart-form td.product-name dl.variation dt[class="variation-"],
.cart_item td.product-name dl.variation dt.variation-,
.cart_item td.product-name dl.variation dt[class="variation-"] {
  display: none;
}

/* The corresponding <dd> for the orphan dt should indent slightly so
   it visually associates with the parent group above it, instead of
   appearing as a top-level entry. */
.woocommerce-cart-form td.product-name dl.variation dt.variation- + dd,
.cart_item td.product-name dl.variation dt.variation- + dd {
  padding-left: 1em;
  color: var(--lafka-pdp-muted, #5e5e5e);
}

/* === PDP container (W4-T20) === */
.lafka-pdp__main { max-width: 1280px; margin: 0 auto; padding: 24px 16px; }

.lafka-pdp__breadcrumb { font-size: 11px; color: var(--lafka-pdp-muted); margin-bottom: 16px; }

.lafka-pdp__breadcrumb a { color: inherit; }

.lafka-pdp__hero {
  display: grid;
  grid-template-columns: 1.2fr 1fr;
  gap: 32px;
  margin-bottom: 32px;
}

@media (max-width: 960px) {

 .lafka-pdp__hero { grid-template-columns: 1fr; gap: 16px; } }

/* === PDP layout polish v5.8.5 — fix spacing issues observed post-deploy === */

/* Hero grid: align both columns at top so right column doesn't get stretched
   into a tall empty space below the summary card when the gallery image is
   taller than the summary content. */
.lafka-pdp__hero {
  align-items: start;
}

/* Cap gallery image height so the right-column summary stays in proportion.
   Without this, a 1200x1200 native pizza photo dominates the hero and the
   summary card looks like a tiny widget on the side. */
.lafka-pdp__gallery,
.lafka-pdp__gallery .woocommerce-product-gallery,
.lafka-pdp__gallery figure {
  align-self: start;
}

.lafka-pdp__gallery img {
  max-height: 540px;
  width: 100%;
  height: auto;
  object-fit: contain;
}

/* Summary card: tighten internal spacing so it feels content-dense rather
   than padded out with whitespace. */
.lafka-pdp-summary {
  padding: 16px 18px;
}

.lafka-pdp-summary__title {
  font-size: 24px;
  margin: 0 0 4px;
}

.lafka-pdp-summary__short {
  margin-bottom: 10px;
}

.lafka-pdp-summary__price {
  font-size: 24px;
  margin: 6px 0 12px;
}

.lafka-pdp-summary__cart-row {
  margin-top: 12px;
}

.lafka-pdp-summary__trust {
  margin-top: 10px;
  padding-top: 10px;
}

/* Picker block: reduce vertical rhythm */
.lafka-pdp-picker {
  margin: 0 0 12px;
}

.lafka-pdp-picker__chips {
  gap: 4px;
}

.lafka-pdp-chip__inner {
  padding: 6px 10px;
  min-width: 56px;
}

.lafka-pdp-chip__name {
  font-size: 12px;
}

.lafka-pdp-chip__price {
  font-size: 10px;
  margin-top: 1px;
}

/* Upsell row: switch to auto-fit so 2-3 cards don't leave a yawning gap on
   the right. minmax(180px, 1fr) keeps cards a reasonable size while letting
   the row collapse gracefully when fewer than 4 candidates are available. */
.lafka-pdp-upsell__grid {
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
}

@media (max-width: 720px) {

  .lafka-pdp-upsell__grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

/* Tabs: adjust padding so panel content doesn't look orphaned */
.lafka-pdp-tabs {
  margin: 24px 0;
  padding: 16px 20px;
}

.lafka-pdp-tabs__panel {
  padding-top: 4px;
}

/* Related products: when the parent theme's template renders an empty
   thumbnail (operator hasn't set a featured image), at least give the slot
   a subtle background instead of a hard-edged empty rectangle. Doesn't fix
   the underlying content gap — that's a wp-admin task. */
.lafka-pdp__main .related.products .product img,
.lafka-pdp__main .upsells.products .product img,
.lafka-pdp__main ul.products .product img {
  background: var(--lafka-pdp-bg-soft);
  min-height: 100px;
}

/* The full-width below-fold sections (upsell, tabs, related) should not be
   constrained by the hero grid — push them to span the container width. */
.lafka-pdp-upsell,
.lafka-pdp-tabs,
.lafka-pdp .related.products,
.lafka-pdp .upsells.products {
  grid-column: 1 / -1;
}
