/* ============================================================
   pm-components.css — ปุ่ม · ลิงก์เฉพาะทาง · nav · การ์ด · chip · callout
   ที่มา: docs/design.md §6, §7.1, §7.3, §7.5, §8.3, §8.5
   ⛔ ห้ามมีค่า hex (B-1) · ⛔ ระยะทุกค่ามาจาก --s1…--s8 (§8.1)

   🔴 ไม่มี component สำหรับดาว/คะแนนรีวิวในไฟล์นี้ โดยเจตนา
      D-4 + P-1 + M-7: มีรีวิวจริง 0 รายการ → ต้องซ่อน ไม่ใช่แสดง 0 ดาว
      ห้ามเพิ่ม .pm-rating / .pm-stars จนกว่าจะมีรีวิวจริง ≥ 10 รายการ
   ============================================================ */

/* ============================================================
   1. ปุ่ม — design.md §7.1
   พื้นปุ่มหลักมีได้สีเดียวคือ --color-brand (B-2)
   ห้ามเป็นพื้นปุ่มหลัก: --color-accent · --color-accent-field
                        --color-line · --color-shade
   ============================================================ */
.pm-btn{
  display:inline-flex; align-items:center; justify-content:center; gap:var(--s1);
  min-height:48px;                    /* §7.1 · ผ่าน F-3 (≥44px) */
  padding:0 30px;                     /* §7.1 ระบุตรง ๆ */
  border:0; border-radius:var(--radius);
  font-family:var(--font-body); font-size:15px; font-weight:600; line-height:1;
  text-decoration:none; cursor:pointer;
  transition:background-color var(--dur-micro) ease, border-color var(--dur-micro) ease,
             color var(--dur-micro) ease;
}
/* ปุ่มที่มีไอคอนต้องมีข้อความกำกับเสมอ ไม่ใช่ไอคอนเปล่า — §7.1 */
.pm-btn svg{ flex:none; width:20px; height:20px; stroke:currentColor; }

.pm-btn--primary{ background:var(--color-brand); color:var(--color-on-night); }  /* 5.20 ✅ */
.pm-btn--primary:hover{ background:var(--color-ink); color:var(--color-on-night); } /* §7.1 · on-night บน ink ✅ */
/* ⚠️ แก้ 26 ก.ย. 2026 — ต้องระบุ color ตอน hover ด้วย ไม่งั้นปุ่มที่เป็น <a> แพ้ `a:hover` ของ pm-base.css
   (0,1,1) ชนะ .pm-btn--*:hover ไม่ได้ แต่ชนะ .pm-btn--* (0,1,0) → ตัวอักษรกลายเป็น brand-ink บน ink ≈2:1 (วัดจริง)
   รายงาน docs/report-starter-ritual-2026-09-26.md §5 · ปุ่ม <button> ไม่โดน */

.pm-btn--secondary{ background:transparent; color:var(--color-ink);
                    border:1px solid var(--color-line-strong); }                  /* 3.07 ✅ */
.pm-btn--secondary:hover{ border-color:var(--color-ink); background:var(--color-surface); }

/* Primary บนพื้นเข้ม — กลับด้าน (§3.2 · §7.1) */
.pm-btn--on-night{ background:var(--color-on-night); color:var(--color-brand); }  /* 5.20 ✅ */
.pm-btn--on-night:hover{ background:var(--color-accent-field); }

/* ปุ่มรองบนพื้นเข้ม — เพิ่ม 15 ก.ย. 2026 (§5)
   ทำไมต้องมี: แถวการ์ด 3 ใบเดิมใช้ .pm-btn--on-night สองใบ (พื้นครีมทึบ = ดังที่สุดในแถบ)
   และ .pm-btn--primary หนึ่งใบ → ใบที่ "ควรแนะนำ" กลับได้ปุ่มที่เงียบกว่าอีกสองใบ
   ปุ่มนี้คือขั้นรอง ทำให้เหลือ primary ใบเดียวจริง ๆ ในหนึ่งแถว
   ⚠️ ต้องอยู่หลัง .pm-btn ในไฟล์ เพราะ border:0 ของ .pm-btn มีน้ำหนักเท่ากัน (0,1,0) */
.pm-btn--ghost-night{ background:transparent; color:var(--color-on-night);
                      border:1px solid var(--color-on-night-2); }              /* ขอบ 7.71 ✅ */
.pm-btn--ghost-night:hover{ background:var(--color-night-chip); border-color:var(--color-on-night); color:var(--color-on-night); } /* color: เหตุผลเดียวกับ primary:hover (แก้ 26 ก.ย.) */

/* ปุ่มเล็ก (Add to cart ในการ์ด) — §7.1 */
.pm-btn--sm{ min-height:44px; padding:0 18px; font-size:var(--fs-h6); }           /* 14px · F-3 ✅ */

/* ============================================================
   2. ลิงก์เฉพาะทาง — design.md §6
   ระยะห่างระหว่างลิงก์ที่กดได้ ≥ 8px (F-3)
   ============================================================ */

/* ลิงก์เดี่ยว / CTA ข้อความ */
.pm-link-cta{
  display:inline-flex; align-items:center; gap:var(--s1);
  min-height:44px;                    /* F-3 ✅ */
  font-size:14.5px; font-weight:600;  /* §6 ระบุตรง ๆ */
  color:var(--color-ink);
  text-decoration:none;
  border-bottom:1px solid var(--color-line-strong);
}
.pm-link-cta:hover{ color:var(--color-brand-ink); border-bottom-color:var(--color-brand-ink); }

/* .pm-link-cta บนพื้นเข้ม — บั๊กจริงที่เจอ 11 ก.ย. 2026 (วัดได้ 1.00:1)
   `:where(.pm-band--night,.on-night) a` มีน้ำหนัก (0,0,1) จึงแพ้ .pm-link-cta (0,1,0)
   ผล: ลิงก์ "Shop nano care" / "Compare all three" ได้สี --color-ink บนพื้น night
       ซึ่ง --color-ink กับ --color-night เป็นค่าเดียวกันเป๊ะ → ตัวอักษรหายไปสนิท
       (ไม่เขียนค่า hex ตรงนี้ แม้จะเป็นคอมเมนต์ — เงื่อนไขผ่าน B-1 คือ grep ทั้งไฟล์)
   เขียนคู่ของมันไว้ที่นี่ที่ (0,2,0) ให้ชนะแน่นอน */
:where(.pm-band--night,.pm-card--night,.pm-band--brand,.on-night,.on-brand) .pm-link-cta{
  color:var(--color-on-night);                          /* 12.59 ✅ */
  border-bottom-color:var(--color-line-night);          /* 3.51 ✅ */
}
:where(.pm-band--night,.pm-card--night,.pm-band--brand,.on-night,.on-brand) .pm-link-cta:hover{
  color:var(--color-on-night); border-bottom-color:var(--color-on-night);
}
/* การ์ดนุ่ม lavender อยู่บนแถบเข้มก็จริง แต่พื้นมันสว่าง — ต้องกลับเป็น ink */
.pm-band--night .pm-card--soft .pm-link-cta,
.on-night .pm-card--soft .pm-link-cta{
  color:var(--color-ink); border-bottom-color:var(--color-line-strong);
}

/* ลิงก์บนพื้นเข้ม
   🔴 ใช้ :where() เพื่อให้ specificity = (0,0,1) ไม่ใช่ (0,1,1)
   ถ้าเขียน `.pm-band--night a` ตรง ๆ มันจะชนะ `.pm-btn--on-night` (0,1,0)
   → ปุ่มหลักบนแถบเข้มจะได้ตัวอักษร cream บนพื้น cream = 1:1 มองไม่เห็น
   :where() ให้ค่า 0 จึงยังชนะ `a` เปล่าจาก pm-base.css ด้วยลำดับไฟล์
   แต่แพ้ทุก component class ตามที่ควรเป็น */
:where(.pm-band--night,.on-night) a{
  color:var(--color-on-night);
  text-decoration:none;
  border-bottom:1px solid var(--color-line-night);   /* 3.51 ✅ */
}
:where(.pm-band--night,.on-night) a:hover{ border-bottom-color:var(--color-on-night); }

/* ลิงก์บนพื้น brand — cream ทึบ (5.20) ห้ามใช้ cream โปร่งแสง (§4.2 ข้อ 6–7) */
:where(.pm-band--brand,.on-brand) a{
  color:var(--color-on-night);
  text-decoration:none;
  border-bottom:1px solid var(--color-on-night);
}
:where(.pm-band--brand,.on-brand) a:hover{ border-bottom-width:2px; }

/* ลิงก์ในเมนู (nav) */
.pm-nav__link{
  display:inline-flex; align-items:center;
  min-height:44px;                    /* F-3 ✅ */
  padding-inline:var(--s2);
  font-size:15px; font-weight:500;
  color:var(--color-ink);
  text-decoration:none;
  border-bottom:1px solid transparent;
}
.pm-nav__link:hover{ color:var(--color-brand-ink); border-bottom-color:var(--color-brand-ink); }
.pm-nav__link[aria-current]{ color:var(--color-brand-ink); font-weight:600; }

/* ลิงก์ที่ active อยู่ (TOC / nav) — §6 แถบซ้าย 2px */
.pm-link-active{
  color:var(--color-brand-ink); font-weight:600;
  border-left:2px solid var(--color-brand);
  padding-left:var(--s2);
  text-decoration:none;
}

/* breadcrumb — §6 · 12.5px 500 uppercase .12em */
.pm-breadcrumb{ font-size:var(--fs-label); line-height:1.2; color:var(--color-ink-muted); }
.pm-breadcrumb a{
  display:inline-flex; align-items:center; min-height:44px;   /* F-3 ✅ */
  font-weight:500; text-transform:uppercase; letter-spacing:.12em;
  color:var(--color-ink-muted); text-decoration:none;
}
.pm-breadcrumb a:hover{ color:var(--color-brand-ink); text-decoration:underline; }

/* eyebrow / label — §5.4 --fs-label · ต่างจาก h6 ชัดเจน (§5.3)
   ⚠️ ไม่ใช่แท็ก heading — ใช้ <p> หรือ <span> เท่านั้น */
.pm-eyebrow{
  font-size:var(--fs-label); line-height:1.2; font-weight:500;
  text-transform:uppercase; letter-spacing:.12em;
  color:var(--color-ink-muted);
}
/* บนการ์ดนุ่ม lavender ห้ามใช้ --color-accent เป็น eyebrow (4.11 ตก) — §4.2 ข้อ 1 */
.pm-card--soft .pm-eyebrow{ color:var(--color-ink-muted); }   /* 5.95 ✅ */
.pm-band--night .pm-eyebrow{ color:var(--color-on-night-3); } /* 7.10 ✅ */

/* ============================================================
   3. การ์ด — design.md §6 (ลิงก์ที่ห่อทั้งการ์ด) · §8.3
   เงาไม่เคยเป็นตัวบอกขอบเขตของ control — ต้องมีขอบเสมอ (§8.3)
   ============================================================ */
.pm-card{
  background:var(--color-surface);
  border:1px solid var(--color-line);
  border-radius:var(--radius);
  padding:var(--s3);
  transition:border-color var(--dur-micro) ease, box-shadow var(--dur-micro) ease;
}
.pm-card__title{ color:var(--color-ink); }
/* ทั้งการ์ดคลิกได้ · ไม่มีเส้นใต้ · หัวการ์ดเป็นตัวบอก — §6 */
.pm-card--link{ position:relative; }
.pm-card--link a{ text-decoration:none; border-bottom:0; }
/* เป้ากดคือ "ทั้งใบ" ไม่ใช่แค่ตัวหนังสือหัวการ์ด — F-3
   บั๊กจริงที่วัดได้ 11 ก.ย.: <a> ในหัวการ์ดสินค้าสูงแค่ 24px (ต้อง ≥44)
   position:relative ข้างบนถูกเตรียมไว้เพื่อบรรทัดนี้อยู่แล้ว แต่ยังไม่เคยเขียน
   ⚠️ ต้องมี <a> เดียวต่อการ์ดหนึ่งใบ — ถ้ามีสองตัว ตัวหลังจะทับตัวแรกจนกดไม่ได้ */
.pm-card--link a::after{ content:""; position:absolute; inset:0; }
.pm-card--link:hover{ border-color:var(--color-brand); box-shadow:var(--shadow-card); }
.pm-card--link:hover .pm-card__title{ color:var(--color-brand-ink); }
/* ring รอบการ์ดทั้งใบ — §6 */
.pm-card--link:focus-within{ outline:2px solid var(--color-brand-ink); outline-offset:3px; }

/* 🔴 บั๊กที่เจ้าของงานแจ้ง 22 ก.ย. 2026 — "กด add to cart / คลิกตรงสินค้า แล้วมีกรอบโผล่ออกมา"
   `:focus-within` เป็นจริงกับ **การโฟกัสด้วยเมาส์** ด้วย ไม่ใช่เฉพาะคีย์บอร์ด
   → กฎข้างบนจึงตีกรอบการ์ดให้คนที่ใช้เมาส์ ทั้งที่ ring มีไว้บอกตำแหน่งของคีย์บอร์ดเท่านั้น

   เส้นทางที่ทำซ้ำได้จริงบน staging (ไม่ได้เดาจากโค้ด):
     คลิกการ์ด → ไปหน้าสินค้า → กด Back → เบราว์เซอร์คืนโฟกัสให้ <a> ใบเดิม
     → การ์ดติดกรอบค้างไว้ ทั้งที่ไม่เคยแตะคีย์บอร์ด (วัดได้ outline rgb(90,84,16) 1 ใบ)

   ⛔ ห้ามแก้ด้วยการถอดกฎข้างบนทิ้ง — ไล่ Tab แล้วต้องยังเห็น ring (F-2)
   วิธีแก้: ปิด ring เฉพาะกรณี "มีโฟกัสอยู่ในการ์ด แต่ไม่มีตัวไหนเป็น :focus-visible"
     เมาส์  → :focus-within = true · :focus-visible = false → ไม่มีกรอบ ✅
     คีย์บอร์ด → :focus-visible = true → กฎนี้ไม่ติด กรอบยังอยู่ ✅ (F-2 ผ่าน)

   ℹ️ เบราว์เซอร์ที่ไม่รองรับ :has() จะทิ้งกฎนี้ทั้งบรรทัด → กลับไปเป็นพฤติกรรมเดิม
      (เห็นกรอบตอนคลิก) ซึ่ง **ยังผ่าน F-2 อยู่** จึงเขียนเป็น progressive enhancement
      โดยตั้งใจ — เหตุผลเดียวกับบล็อกที่บรรทัด ~815 ซึ่งอธิบายไว้แล้ว
   ℹ️ specificity (0,3,0) > กฎข้างบน (0,2,0) · และ < ตัวกลบบรรทัด ~815 (0,5,0)
      ตัวกลบนั้นจึงยังทำงานตามเดิมทุกประการ */
.pm-card--link:focus-within:not(:has(:focus-visible)){ outline:none; }

/* ============================================================
   3b. การ์ดสามชั้น (Home §4) — เพิ่ม 15 ก.ย. 2026
   โจทย์: "การแสดงราคา" ต้องอ่านออกว่าเป็นราคา และเทียบสามใบได้ในแนวเดียวกัน
   ⛔ ไม่มีค่า hex — ทุกค่ามาจาก pm-tokens.css (B-1)
   ⛔ ไม่มี JS — ทุกอย่างเป็น CSS ล้วน (C-10)
   ============================================================ */

/* ป้าย "Start here" — ใบเดียวในกริดเท่านั้น (ใบที่ lead = true)
   แทนที่ "การ์ดพื้นเข้ม" ซึ่งเดิมไปอยู่ใบที่ 3 และสื่อความหมายสวนทางกับข้อความ
   พื้น --color-brand + ตัวอักษร --color-on-night = 5.20:1 ✅ B-3 (ต้องการ 4.5) */
/* แถวหัวการ์ด — eyebrow ซ้าย ป้ายขวา · min-height เท่ากันทุกใบไม่ว่าจะมีป้ายหรือไม่
   32px = padding ของป้าย (8+8) + line-height 1.2 ของ 12.5px (15px) ปัดขึ้น
   ถ้าไม่ล็อกความสูงแถวนี้ ใบที่มีป้ายจะสูงกว่าใบอื่น แล้วหัวการ์ดจะเหลื่อมกันทันที */
.pm-layer__top{
  display:flex; align-items:center; justify-content:space-between;
  gap:var(--s2); flex-wrap:wrap; min-height:32px;
}
.pm-layer__top .pm-eyebrow{ margin:0; }

.pm-layer__flag{
  margin:0;
  background:var(--color-brand); color:var(--color-on-night);
  border-radius:var(--radius);
  padding:var(--s1) calc(var(--s1) + var(--s1) / 2);
  font-size:var(--fs-label); font-weight:600; line-height:1.2;   /* 12.5px = ขั้นต่ำ B-4 */
  text-transform:uppercase; letter-spacing:.12em;
}
/* ขอบของใบที่แนะนำ — เน้นด้วยขอบ ไม่ใช่ด้วยพื้นทั้งใบ จึงไม่กิน "โควตาสีเข้ม" ของหน้า (B-2) */
.pm-layer.is-lead{ border-color:var(--color-brand); }

.pm-layer__formats{ margin:0; }

/* ราคาและปุ่มถูกดันลงก้นการ์ดเสมอ → ราคาของทั้งสามใบอยู่แนวเดียวกัน
   แม้ body จะยาวไม่เท่ากัน ซึ่งเป็นเงื่อนไขที่ทำให้ "เทียบราคา" ทำได้จริง */
.pm-layer__foot{
  margin-top:auto;
  display:flex; flex-direction:column; gap:var(--s2);
  padding-top:var(--s3);
  border-top:1px solid var(--color-line);
}
.pm-layer__price{ display:flex; flex-direction:column; gap:var(--s1); margin:0; }
/* label บอกว่าตัวเลขข้างล่างคือ "ราคาเริ่มต้น" ไม่ใช่ราคาของสินค้าชิ้นใดชิ้นหนึ่ง
   เดิมเขียนรวบเป็น "From $39" ซึ่งอ่านเร็ว ๆ แล้วแยกไม่ออกว่าเป็นราคาหรือส่วนลด */
.pm-layer__pricelabel{
  font-size:var(--fs-label); line-height:1.2; font-weight:500;
  text-transform:uppercase; letter-spacing:.12em;
  color:var(--color-ink-muted);
}
/* 🔴 ขนาด/ฟอนต์/น้ำหนัก ของตัวเลขราคา **ย้ายไปอยู่ที่บล็อก "ระบบราคา" ท้ายไฟล์แล้ว** (15 ก.ย. 2026 รอบ 11)
   เหลือไว้ที่นี่เฉพาะสีซึ่งขึ้นกับพื้นของ section
   ⛔ ห้ามเขียน font-size ให้ตัวเลขราคากลับมาที่นี่อีก — ดูข้อห้ามในบล็อกนั้น
   (ของเดิมคือ 21px/600 ซึ่งเป็นค่าที่ไม่ตรงกับราคาที่อื่นบนหน้าเดียวกันสักที่) */
.pm-layer__priceval{ color:var(--color-ink); }
.pm-card--night .pm-layer__priceval,
.on-night .pm-layer__priceval{ color:var(--color-on-night); }
.pm-card--night .pm-layer__pricelabel,
.on-night .pm-layer__pricelabel{ color:var(--color-on-night-3); }  /* 7.10 ✅ */
.pm-card--night .pm-layer__foot,
.on-night .pm-layer__foot{ border-top-color:var(--color-line-night); }

/* `.pm-card--link a` (0,1,1) ถอด border-bottom ของ .pm-link-cta (0,1,0) ออก
   ถ้าไม่คืนให้ CTA จะไม่มีเส้นใต้เลยและดูไม่ออกว่าเป็นลิงก์ — เขียนคู่ของมันที่ (0,2,0) */
.pm-card--link .pm-link-cta{ border-bottom:1px solid var(--color-line-strong); }
.pm-card--link:hover .pm-link-cta{ border-bottom-color:var(--color-brand-ink); }

/* หมายเหตุค่าที่ยังไม่อนุมัติ ใต้กริด — scaffolding ของช่วง preview */
.pm-layers__foot{ margin:var(--s3) 0 0; }

/* การ์ดนุ่ม lavender — โควตา 1 ใบต่อหน้า (B-2 · §3.1) */
.pm-card--soft{ background:var(--color-accent-field); border-color:var(--color-accent-field); }

/* การ์ดที่ "เป็น" พื้นเข้มเสียเอง (ไม่ใช่การ์ดที่วางอยู่บนแถบเข้ม)
   🔴 ห้ามใช้ .pm-band--night กับ .pm-card เพื่อทำแบบนี้ — เป็นบั๊กจริงที่เจอ 11 ก.ย.:
      ทั้งคู่ specificity (0,1,0) แต่ .pm-card มาทีหลังในลำดับไฟล์ (C-7) จึงชนะเรื่องพื้น
      ได้พื้น --color-surface แต่หัวเรื่องถูก .pm-band--night h3 ย้อมเป็น cream
      → cream บน cream = 1:1 มองไม่เห็น (ชนิดเดียวกับที่คอมเมนต์ :where() ข้างบนกันไว้) */
.pm-card--night{
  background:var(--color-night);
  border-color:var(--color-night);
  color:var(--color-on-night-2);
}
.pm-card--night .pm-card__title,
.pm-card--night h1,.pm-card--night h2,.pm-card--night h3,.pm-card--night h4{ color:var(--color-on-night); }
.pm-card--night .pm-eyebrow{ color:var(--color-on-night-3); }   /* 7.10 ✅ */
.pm-card--night .pm-text-small,
.pm-card--night .pm-text-body,
.pm-card--night .pm-text-meta{ color:var(--color-on-night-2); } /* 7.71 ✅ */

/* การ์ดบนแถบเข้ม — §3.1 */
.pm-band--night .pm-card{
  background:var(--color-night-card);
  border-color:var(--color-line-night);
  color:var(--color-on-night-2);
}

/* การ์ดนุ่ม lavender เมื่อวางอยู่บนแถบเข้ม — บั๊กจริงที่เจอ 11 ก.ย. 2026
   `.pm-band--night .pm-card` มีน้ำหนัก (0,2,0) จึงชนะ `.pm-card--soft` (0,1,0)
   → การ์ดใบกลางของ Ritual Sets กลายเป็นการ์ดเข้มเหมือนอีกสองใบ ไม่ใช่ lavender
   บล็อกนี้คืนค่าให้ครบทุก property ที่ scope พื้นเข้มแย่งไป ไม่ใช่แค่พื้นหลัง
   ⚠️ ถ้าเพิ่มกฎ `.pm-band--night X` ตัวใหม่ ต้องกลับมาเพิ่มคู่ของมันที่นี่ด้วย */
.pm-band--night .pm-card--soft,
.on-night .pm-card--soft{
  background:var(--color-accent-field);
  border-color:var(--color-accent-field);
  color:var(--color-ink-body);
}
.pm-band--night .pm-card--soft .pm-card__title,
.on-night .pm-card--soft .pm-card__title,
.pm-band--night .pm-card--soft h1,.pm-band--night .pm-card--soft h2,
.pm-band--night .pm-card--soft h3,.pm-band--night .pm-card--soft h4{
  color:var(--color-ink);             /* 11.24 บน accent-field ✅ */
}
.pm-band--night .pm-card--soft .pm-eyebrow,
.on-night .pm-card--soft .pm-eyebrow{
  color:var(--color-ink-muted);       /* 5.95 ✅ — ห้ามใช้ --color-accent (4.11 ตก §4.2 ข้อ 1) */
}
.pm-band--night .pm-card--soft .pm-text-small,
.pm-band--night .pm-card--soft .pm-text-body,
.on-night .pm-card--soft .pm-text-small,
.on-night .pm-card--soft .pm-text-body{ color:var(--color-ink-body); }   /* 7.49 ✅ */
.pm-band--night .pm-card--soft .pm-chip,
.on-night .pm-card--soft .pm-chip{
  background:var(--color-surface); border-color:var(--color-line-strong);
  color:var(--color-ink-muted);
}

/* ============================================================
   4. chip / badge — design.md §7.3
   radius 2px (ไม่ใช่แคปซูล) · badge ห้ามเล็กกว่า 12px (B-4)
   ============================================================ */
.pm-chip{
  display:inline-flex; align-items:center; gap:var(--s1);
  min-height:44px; padding:0 var(--s2);      /* F-3 ✅ */
  background:var(--color-surface);
  border:1px solid var(--color-line-strong);
  border-radius:var(--radius);
  font-size:var(--fs-label); font-weight:500; line-height:1.2;
  text-transform:uppercase; letter-spacing:.12em;
  color:var(--color-ink-muted);
  text-decoration:none;
}
.pm-chip[aria-pressed="true"],.pm-chip--selected{
  background:var(--color-brand); border-color:var(--color-brand);
  color:var(--color-on-night);               /* 5.20 ✅ */
}
/* ⚠️ ตัวอักษรของ chip บนแถบเข้มต้องเป็น --color-on-night (ทึบ) ไม่ใช่ on-night-2
   วัดจริง 11 ก.ย.: on-night-2 บนพื้น night-chip (cream .14 ทับ night) = 4.33 → ตก 4.5
   on-night บนพื้นเดียวกัน = 11.28 ✅ · ชนิดเดียวกับ §4.2 ข้อ 6–7 (cream โปร่งแสงบนพื้นเข้ม) */
.pm-band--night .pm-chip,
.pm-card--night .pm-chip,
.on-night .pm-chip{
  background:var(--color-night-chip); border-color:var(--color-line-night);
  color:var(--color-on-night);
}

/* ============================================================
   5. กล่องเตือน (callout) — design.md §7.5
   🔴 ระบบนี้ไม่มีสีแดง โดยเจตนา (มติ 10 ก.ย. รอบที่ 7)
      ตัวแยกคือ รูปทรง + ไอคอน + น้ำหนัก ไม่ใช่สี — ตรงกับ F-1
   ============================================================ */
.pm-callout{
  background:var(--color-surface);
  border:1px solid var(--color-line-strong);
  border-radius:var(--radius);
  padding:var(--s3);
  color:var(--color-ink-body);
  font-size:var(--fs-body);
}
.pm-callout h5{ color:var(--color-ink); margin-bottom:var(--s1); }

/* info — บริบท · เกร็ด · ขอบซ้าย 3px · ไอคอนไม่บังคับ */
.pm-callout--info{ border-left:3px solid var(--color-line-strong); }

/* warn — ความปลอดภัย · ขอบซ้าย 4px · ไอคอน + หัวข้อ h5 บังคับ
   ⛔ ห้ามใช้เป็นของประดับ — เฉพาะข้อความที่มีผลต่อความปลอดภัยจริง
   D-1 · D-2 ยังบังคับ: ห้าม claim รักษาโรค */
.pm-callout--warn{ border-left:4px solid var(--color-ink); }
.pm-callout--warn h5{ display:flex; align-items:center; gap:var(--s1); }
.pm-callout--warn h5 svg{ flex:none; width:24px; height:24px;
                          stroke:currentColor; color:var(--color-ink); }

/* ============================================================
   6. Motion ของ section — design.md §8.5
   animate ได้เฉพาะ transform และ opacity — ห้าม width / height
   (การปิดเมื่อ prefers-reduced-motion อยู่ที่ pm-base.css)
   ============================================================ */
.pm-reveal{
  opacity:0; transform:translateY(var(--s2));
  transition:opacity var(--dur-section) var(--ease-section),
             transform var(--dur-section) var(--ease-section);
}
.pm-reveal.is-in{ opacity:1; transform:none; }

/* ============================================================
   H · component เฉพาะหน้า Home (Case A)
   ที่มา: Claude Design `Case A - Home.dc.html` — แปลงจาก inline style
   ⛔ ห้ามมีค่า hex (B-1) · ⛔ ไม่มีดาว/คะแนนรีวิว (D-4 · P-1 · M-7)
   เพิ่มเมื่อ 11 ก.ย. 2026 — รายงาน report-home-template-2026-09-11.md
   ============================================================ */

/* ---- eyebrow แบบมีเส้นลากต่อท้าย — ใช้กับหัว section เท่านั้น ----
   artboard ใช้ ::after เป็นเส้น --color-line (ประดับล้วน ไม่ใช่ affordance) */
.pm-eyebrow--rule{ display:flex; align-items:center; gap:var(--s2); margin-bottom:var(--s3); }
.pm-eyebrow--rule::after{ content:""; flex:1; height:1px; background:var(--color-line); }

/* ---- คำโปรยใต้ h1 ---- */
.pm-deck{ font-size:var(--fs-deck); line-height:1.62; color:var(--color-ink-body); }
.pm-band--night .pm-deck,.on-night .pm-deck{ color:var(--color-on-night-2); }

/* ---- ป้ายชื่อช่องภาพที่ยังไม่มีภาพจริง (P-2) ----
   🔴 ข้อความอยู่ "ใต้" กรอบภาพเสมอ ไม่ใช่ทับบน --color-shade
      เพราะ pm-tokens.css ระบุว่า --color-shade ห้ามมีตัวอักษรบนนี้
   ลบทั้งคลาสนี้ทิ้งเมื่อภาพจริงมาแล้ว */
/* ⛔ 15 ก.ย. 2026 — .pm-photo-note / __shotnote / __foot / __note ไม่ถูก render บนหน้าอีกแล้ว
   คงสไตล์ไว้เพราะไฟล์ preview เก่ายัง <link> มาที่ไฟล์นี้ · ดู docs/home-photo-briefs-and-pending-values.md */
.pm-photo-note{
  display:block; margin-top:var(--s1);
  font-size:var(--fs-meta); line-height:1.45; color:var(--color-ink-muted);
}

/* ---- แผงภาพ hero — พื้น --color-shade-deep รองรับตัวอักษร cream ได้ (8.01) ---- */
/* ⚠️ superseded 14 ก.ย. 2026 — hero.php ใช้ .pm-banner__media แทนแล้ว
   คงไว้เพื่ออ้างอิง/ย้อนกลับ (โฟลเดอร์นี้ไม่ใช่ git repo) ห้ามลบ */
.pm-hero__panel{
  aspect-ratio:var(--ratio-hero);
  border-radius:var(--radius-hero);
  background:var(--color-shade-deep);
  color:var(--color-on-night);
  display:flex; align-items:flex-end;
  padding:var(--s4);
  box-shadow:var(--shadow-lift);
}
.pm-hero__panel h2,.pm-hero__panel p{ color:var(--color-on-night); }
.pm-hero__panel .pm-eyebrow{ color:var(--color-on-night-2); }   /* 7.71 ✅ */

/* ============================================================
   Banner — เขียนใหม่ 14 ก.ย. 2026 (รอบ 2) · โครงสร้างอยู่ที่ pm-layout.css §1b

   🔴 บล็อกเดิมของรอบแรกถูก **ลบทิ้งทั้งก้อน** ไม่ใช่แก้ค่า
      ทุกกฎในบล็อกนั้น (h1 · eyebrow · ink-accent · ปุ่มรอง · เส้น eyebrow--rule)
      ตั้งค่าเป็นสีตระกูล on-night เพราะพื้นเดิมเป็น night
      พอพื้นกลายเป็น --color-surface มันจะได้ cream บน cream = มองไม่เห็นทุกบรรทัด
      → บนพื้นสว่าง **ค่าตั้งต้นของธีมถูกอยู่แล้ว จึงไม่ต้อง override อะไรเลย**
      (--color-ink 12.34 · --color-ink-body 8.24 · --color-ink-muted 6.55 บน surface)
      ⛔ ห้ามเติมกฎ scope สีให้แบนเนอร์นี้อีก เว้นแต่วัด contrast แล้วตกจริง
   ============================================================ */

/* ============================================================
   Banner slider — เพิ่ม 14 ก.ย. 2026 (รอบ 7) · โครงสร้างอยู่ที่ pm-layout.css §1a
   ============================================================ */

/* หัวสไลด์ที่ 2–5 — **ไม่ใช่แท็ก heading โดยเจตนา** (C-11)
   <h1> มีได้ใบเดียวต่อหน้าและเป็นของสไลด์ที่ 1
   ถ้าใช้ <h2> จะกลายเป็นหัวข้อระดับหน้าเท่ากับ section จริงของ Home ทุกอัน
   ค่าทั้งสี่บรรทัดยกมาจากกฎ h2 ใน pm-base.css ตรงตัว ไม่ได้คิดค่าใหม่ */
.pm-slide__title{
  font-family:var(--font-display); font-weight:400;
  font-size:var(--fs-d3); line-height:1.08; letter-spacing:-.014em;
  color:var(--color-ink);
  margin:0;
}
.pm-slide__title--lg{ font-size:var(--fs-d2); line-height:1.04; }

/* ---- สไลด์ที่ 2 — พื้น brand · **ใบเดียวที่ทำได้** (B-2 · §3.2) ----
   ⛔ ห้ามสร้าง .pm-slide--* ใบที่สองที่ใช้พื้นเข้มหรือพื้น brand
   ทุกบรรทัดข้างล่างคือคู่ที่ต้องเขียนคืน เพราะ scope พื้น brand แย่งสีไปจากค่าตั้งต้น
   (บั๊กชนิดเดียวกับที่ไฟล์นี้เตือนไว้สามที่ — cream บน cream) */
.pm-slide--promotion{ background:var(--color-brand); }
.pm-slide--promotion .pm-slide__title{ color:var(--color-on-night); }   /* 5.20 ✅ */
.pm-slide--promotion .pm-eyebrow{ color:var(--color-on-night); }        /* 5.20 ✅ */
.pm-slide--promotion .pm-deck,
.pm-slide--promotion .pm-text-small,
.pm-slide--promotion .pm-text-meta{ color:var(--color-on-night); }      /* 5.20 ✅ */

/* ปุ่ม outline บนพื้น brand — ตัวอักษรและขอบต้องเป็น cream ทึบ
   §4.2: ห้ามใช้ cream โปร่งแสงบนพื้น brand */
.pm-btn--outline-night{
  background:transparent; color:var(--color-on-night);
  border:1px solid var(--color-on-night);
}
.pm-btn--outline-night:hover{ background:var(--color-on-night); color:var(--color-brand); }

/* 🔴 ขนาด/ฟอนต์/น้ำหนัก ย้ายไปบล็อก "ระบบราคา" ท้ายไฟล์ (15 ก.ย. 2026 รอบ 11) — ของเดิมคือ 34px */
.pm-slide__setprice{ color:var(--color-on-night); margin:0; }
.pm-slide__setnote{ margin:var(--s1) 0 0; }
.pm-slide__sets li > div{ min-width:0; }
.pm-slide__foot{ margin:var(--s5) 0 0; }

/* ---- ช่องรอภาพของสไลด์ (P-2) — เพิ่ม 14 ก.ย. 2026 รอบ 8 ----
   พื้น --color-shade ตามบทบาท "พื้นช่องภาพ placeholder" ใน design.md §3.1
   ⛔ ห้ามวางตัวอักษรทับบนนี้ (1.28 กับ ink ไม่พอ) — ป้ายอยู่ "ใต้" เสมอ
   🔴 อัตราส่วนทุกตัวมาจากชุดของ B-7 เท่านั้น ไม่มีตัวไหนคิดขึ้นใหม่
   🔴 หน้าตาที่ต่างกันระหว่างสไลด์มาจาก **ขนาด · ตำแหน่ง · ทรงมุม** ไม่ใช่จากอัตราส่วน */
.pm-slide__shot{
  display:block; width:100%;
  background:var(--color-shade);
  border:1px solid var(--color-line);
  border-radius:var(--radius);
}
.pm-slide__shot--sq{    aspect-ratio:var(--ratio-product); width:104px; flex:none; }   /* 1:1  สไลด์ 2 */
.pm-slide__shot--tall{  aspect-ratio:var(--ratio-hero); }                              /* 4:5  สไลด์ 3 */
.pm-slide__shot--thumb{ aspect-ratio:var(--ratio-product); width:84px; flex:none; }    /* 1:1  สไลด์ 4 */
.pm-slide__shot--wide{  aspect-ratio:var(--ratio-article); width:132px; flex:none; }   /* 16:10 สไลด์ 5 */

/* บนพื้น brand ขอบต้องเป็น cream โปร่ง ไม่ใช่ --color-line ที่จางจนหายไปในโอลีฟ */
.pm-slide--promotion .pm-slide__shot{ border-color:var(--color-line-night); }  /* 3.51 ✅ */

.pm-slide__shotnote{ margin-top:var(--s3); }

/* แก้ 15 ต.ค. 2026 — ช่องที่ได้ภาพจริงแล้ว (.has-img) · ช่องที่ยังไม่มีภาพยังเป็นพื้น --color-shade เดิม
   overflow:hidden ให้มุม --radius ตัดภาพด้วย · ภาพเต็มกรอบใช้ cover (อัตราส่วนช่องมาจากชุด B-7 เดิม ไม่เปลี่ยน) */
.pm-slide__shot.has-img{ overflow:hidden; }
.pm-slide__shot.has-img img{ display:block; width:100%; height:100%; object-fit:cover; }
/* ภาพพื้นโปร่งใส (มติ 6 ต.ค. "ไม่มี bg นะ") — ไม่มีกล่องพื้น ไม่มีขอบ · contain ไม่ตัดสินค้า · แบบเดียวกับ .pm-media--cutout */
.pm-slide__shot--cutout{ background:none; border-color:transparent; }
.pm-slide__shot--cutout.has-img img{ object-fit:contain; }  /* ต้องหนักกว่า .pm-slide__shot.has-img img (0,2,1) — วัด 15 ต.ค.: ตัวเดิม (0,1,1) แพ้ ได้ cover */
/* 🔴 --color-on-night-2 วัดได้ 3.18:1 บนพื้น brand → ตก B-3 (ต้อง ≥4.5 ที่ 13px)
   ค่า 7.71 ที่จำไว้เป็นค่าบนพื้น --color-night ไม่ใช่บนพื้น brand — คนละพื้น คนละค่า
   ⛔ อย่าเอาตัวเลข contrast ของพื้น night มาใช้กับพื้น brand */
.pm-slide--promotion .pm-photo-note{ color:var(--color-on-night); }            /* 5.20 บน brand ✅ */

/* ---- ไอคอนของสไลด์ (B-8 SVG เท่านั้น · ประดับล้วน จึง aria-hidden ที่ markup) ---- */
.pm-slide__ico{ display:block; margin-bottom:var(--s2); }
.pm-slide__ico svg{ width:24px; height:24px; stroke:var(--color-brand-ink); }  /* 6.19 ✅ */
.pm-slide__coltitle{
  font-size:var(--fs-h5); font-weight:600; line-height:1.35;
  color:var(--color-ink); margin:0 0 var(--s1);
}

/* ---- สไลด์ที่ 4 — การ์ดเป้าหมาย ---- */
.pm-slide__goals .pm-card{ padding:var(--s3); width:100%; }
.pm-slide__goals .pm-slide__ico{ margin:0; }
.pm-slide__goaltitle{ display:block; font-size:var(--fs-d6); line-height:1.25;
                      font-family:var(--font-display); font-weight:400; }
.pm-slide__goalnote{ display:block; color:var(--color-ink-muted); }

/* ---- สไลด์ที่ 5 — รายการอ่านมีเลขกำกับ ---- */
.pm-slide__num{
  font-family:var(--font-display); font-weight:400;
  font-size:var(--fs-d5); line-height:1; color:var(--color-line-strong);  /* 3.07 · ประดับ ไม่ใช่สาระ */
  min-width:2ch;
}
.pm-slide__readtitle{ display:block; font-size:var(--fs-d6); line-height:1.25;
                      font-family:var(--font-display); font-weight:400; }
.pm-slide__readtitle a{ color:var(--color-ink); text-decoration:none; border-bottom:0; }
.pm-slide__readtitle a:hover{ color:var(--color-brand-ink); }

/* ---- ปุ่ม/จุดของแผงควบคุม ----
   F-3: เป้ากด ≥44×44 และห่างกัน ≥8px (gap --s1) · F-2: focus ring เห็นชัด */
.pm-slider__btn{
  display:inline-flex; align-items:center; justify-content:center;
  width:44px; height:44px; padding:0;
  background:var(--color-surface); color:var(--color-ink);
  border:1px solid var(--color-line-strong);          /* 3.07 ✅ ขอบ control */
  border-radius:var(--radius); cursor:pointer;
  transition:border-color var(--dur-micro) ease, background-color var(--dur-micro) ease;
}
.pm-slider__btn svg{ width:20px; height:20px; stroke:currentColor; fill:none;
                     stroke-width:1.5; stroke-linecap:round; stroke-linejoin:round; }
.pm-slider__btn:hover{ border-color:var(--color-ink); }
.pm-slider__btn:focus-visible{ outline:2px solid var(--color-brand-ink); outline-offset:2px; }
.pm-slider__ico{ display:inline-flex; }
/* 🔴 บั๊กจริงที่เจอ 14 ก.ย.: .pm-slider__ico (0,1,0) เป็น author style จึงชนะ
   `[hidden]{display:none}` ของ UA stylesheet → ไอคอน play กับ pause โผล่พร้อมกัน
   ต้องเขียนคู่ของมันไว้เองที่ (0,1,1) ⛔ อย่าแก้ด้วยการเลิกใช้ attribute hidden */
.pm-slider__ico[hidden]{ display:none; }

/* จุดบอกตำแหน่ง — เป้ากดคือ 44×44 เต็ม แต่ "ขีด" ที่เห็นเล็กกว่านั้น
   (เป้ากดเล็กคือบั๊ก F-3 ที่เจอมาแล้วในการ์ดสินค้า 11 ก.ย.) */
.pm-slider__dot{
  position:relative; width:44px; height:44px; padding:0;
  background:none; border:0; cursor:pointer;
}
.pm-slider__dot::after{
  content:""; position:absolute; inset:50% 10px auto; transform:translateY(-50%);
  height:2px; background:var(--color-line-strong);     /* 3.07 ✅ */
  transition:background-color var(--dur-micro) ease;
}
.pm-slider__dot[aria-current="true"]::after{ height:3px; background:var(--color-brand); }
.pm-slider__dot:focus-visible{ outline:2px solid var(--color-brand-ink); outline-offset:-4px; }

/* หัวการ์ดลอย — เป็น <p> ไม่ใช่ heading (เหตุผลอยู่ใน hero.php · C-11)
   ค่าทั้งสี่บรรทัดยกมาจากกฎ h3 ใน pm-base.css ตรงตัว ไม่ได้คิดค่าใหม่
   (ลดจาก h3=--fs-d5 เพราะการ์ดแคบลงเหลือ 240px — --fs-d3 เดิมล้นกรอบ) */
.pm-banner__cardtitle{
  font-family:var(--font-display); font-weight:400;
  font-size:var(--fs-d5); line-height:1.18; letter-spacing:-.008em;
  margin:0;
}

/* ---- ข้อเท็จจริงคู่ dt/dd (hero + ตารางข้อเท็จจริง) ---- */
.pm-fact dt{ display:block; margin-bottom:var(--s1); }
.pm-fact dd{ margin:0; font-size:var(--fs-small); line-height:1.55; color:var(--color-ink-body); }
.pm-fact--strong dd{ color:var(--color-ink); font-weight:600; }

/* ---- การ์ดสินค้า ----
   🔴 ไม่มีช่องคะแนน/ดาวในโครงนี้โดยเจตนา — D-4 · P-1 · M-7
      ห้ามเพิ่มจนกว่าจะมีรีวิวจริง ≥ 10 รายการ */
/* 🔴 รื้อ 15 ก.ย. 2026 (รอบ §6) — ของเดิมอยู่ที่ css/pm-components.css.superseded-2026-09-15c
   วินิจฉัย 6 ข้อเขียนไว้ที่หัว template-parts/home/catalogue.php (ที่เดียว ไม่เขียนซ้ำ)

   ⚠️ บทเรียนจากรอบ §5: ของเดิมมี `style="font-size:var(--fs-d6)"` และ `style="flex:1"`
      ฝังอยู่ใน markup — ค่าพวกนี้ถูก **ย้ายเข้ามาไว้ในไฟล์นี้** ไม่ได้ถูกทิ้ง
      (รอบ §5 เคยถอด inline gap ออกแล้วลืมย้ายค่า → การ์ดแคบลงเงียบ ๆ 11px) */
.pm-prodcard{ padding:0; overflow:hidden; display:flex; flex-direction:column; }
.pm-prodcard__media{ position:relative; }
.pm-prodcard__body{ display:flex; flex-direction:column; gap:var(--s1); flex:1; padding:var(--s3); }

/* 🔴 แก้รอบที่ 2 (15 ก.ย. 2026) — เดิมมี `.pm-prodcard__top` ที่วางชื่อหมวดคู่กับป้าย `Start here`
   วัดจริงแล้วป้ายตัดบรรทัดในการ์ดใบกว้าง (ครึ่งขวากว้างแค่ 237px) ทำให้ชื่อสินค้าของใบนั้น
   เริ่มคนละระดับกับเพื่อนบ้าน → **ย้ายป้ายไปเป็นป้ายมุมภาพ** และเนื้อการ์ดเหลือโครงเดียวทุกใบ
   ⛔ ห้ามแทรกองค์ประกอบที่มีเฉพาะบางใบกลับเข้ามาในเนื้อการ์ด */
.pm-prodcard__cat{ margin:0; }

/* ย้ายมาจาก inline style ของ markup เดิม — ห้ามลบโดยไม่ย้ายค่าไปที่อื่นก่อน
   min-height = 2 บรรทัด: ชื่อสั้น 1 บรรทัดกับชื่อ 2 บรรทัดจะดันบรรทัดขนาดลงเท่ากัน
   (ชื่อที่ยาว 3–4 บรรทัดยังดันลงต่อ — ราคายังตรงแนวเพราะ margin-top:auto ที่แถวราคา) */
.pm-prodcard__name{ margin:0; font-size:var(--fs-d6); min-height:2.4em; }
.pm-prodcard__size{ margin:0; }

/* margin-top:auto แทน `style="flex:1"` ที่บรรทัดขนาด
   ของเดิมยืดบรรทัด "ขนาด" ให้สูงเท่าที่เหลือ → ช่องว่างตายอยู่ "กลาง" การ์ด
   ของใหม่ดันเฉพาะแถวราคาลงไปชิดขอบล่าง → ช่องว่างไปอยู่ "ใต้" ข้อความ และราคาสามใบตรงแนวกัน */
.pm-prodcard__foot{
  margin-top:auto; padding-top:var(--s2);
  border-top:1px solid var(--color-line);
  display:flex; align-items:center; justify-content:space-between; gap:var(--s2);
}
/* 🔴 16 ก.ย. 2026 (รอบปุ่ม Add to cart) — แถวนี้ **ย้ายเข้าไปอยู่ใน `.pm-buy` แล้ว**
   และ `margin-top:auto` ข้างบนยังทำงานเหมือนเดิมทุกประการ เพราะ .pm-buy เป็น
   flex column ที่ `flex:1` → ช่องว่างที่เหลือของการ์ดไปตกอยู่ **เหนือ** แถวราคาเช่นเคย
   ผลที่ต้องเป็นจริงตลอดไป: **ราคาของทุกใบในแถวเดียวกันอยู่แนวเดียวกัน**
   ⛔ ห้ามถอด margin-top:auto และห้ามถอด flex:1 ของ .pm-buy — ถอดข้อไหนก็เสียแนวทันที
   ℹ️ ลูกศร `.pm-prodcard__go` **ไม่อยู่ในแถวนี้อีกแล้ว** (ย้ายไป .pm-prodcard__top)
      justify-content:space-between จึงไม่มีผลอะไรวันนี้ แต่คงไว้เผื่อมีของชิ้นที่สอง */
/* ลูกศร = สัญญาณถาวรว่าการ์ดกดได้ · ของเดิมไม่มีสัญญาณอะไรเลยทั้งใบ
   ⛔ ห้ามซ่อนแล้วให้โผล่ตอน hover — จอสัมผัสไม่มี hover
   ขยับเข้าเล็กน้อยตอน hover เท่านั้น (ตัวมันเองยังเห็นอยู่ตลอด) */
.pm-prodcard__go{
  flex:none; display:inline-flex; color:var(--color-brand-ink);
  transition:transform var(--dur-micro) ease;
}
.pm-prodcard__go svg{ width:20px; height:20px; }
.pm-card--link:hover .pm-prodcard__go{ transform:translateX(3px); }
@media(prefers-reduced-motion:reduce){ .pm-prodcard__go{ transition:none; }
                                       .pm-card--link:hover .pm-prodcard__go{ transform:none; } }
/* ราคาเป็นตัวหลักของการ์ดร้านค้า — ของเดิมใช้ --fs-deck (18px sans) ซึ่ง **เล็กกว่าชื่อสินค้า**
   ของใหม่ใช้ตัวพิมพ์ display ขนาด --fs-d5 (29px · ย่อเหลือ 25px ที่จอแคบตาม token เอง) */
.pm-prodcard__price{
  display:flex; align-items:baseline; flex-wrap:wrap; gap:var(--s1);
  margin:0; min-width:0; color:var(--color-ink);
}
/* 🔴🔴 ขนาดราคา — แก้ 15 ก.ย. 2026 (รอบที่ 10) ตามคำสั่ง
   "ขนาด font แสดงราคาให้ size เท่ากับตรงแสดงราคาของ woocommerce ตอนนี้เล็กบ้างใหญ่บ้าง มันงง"

   อาการที่วัดได้ก่อนแก้ — **ราคาเดียวกัน บรรทัดเดียวกัน สองขนาด**:
       "From $45.00 to $110.00"  →  `$45.00` = **29px** · `to $110.00` = **13px**
   เกิดกับการ์ด variable product 3 ใบ (Nano Cream · Nano Serum · Herb Powder)

   ค่าอ้างอิงจาก WooCommerce ของจริงบน staging (วัดเอง ไม่ได้เดา):
       หน้า archive `/shop/` การ์ดสินค้า → **18px** / weight 500
       หน้าสินค้าเดี่ยว                    → 58px (ทั้งสองปลายของช่วงราคาขนาดเท่ากัน)
   การ์ดของเราเป็น "การ์ดในกริด" แบบเดียวกับ archive → ใช้ **18px** = `--fs-deck` ที่มีอยู่แล้วในสเกล
   ⛔ ห้ามเขียน 18px ตรง ๆ — ต้องมาจาก token เสมอ (B-4)

   ⚠️ **ข้อนี้ย้อนมติของรอบ §6 เมื่อเช้าวันเดียวกัน** ที่ขยายราคาเป็น 29px เพราะคำสั่ง "ราคา เน้นหรือยัง"
      คำสั่งล่าสุดชนะ · ถ้าจะให้เด่นกว่านี้อีกครั้ง เปลี่ยน token ที่บรรทัดเดียวนี้ได้ทันที
   ⛔ ลำดับความสำคัญของ "From/to" ตอนนี้มาจาก **สี** (--color-ink-muted) ไม่ใช่ขนาดอีกต่อไป
      ห้ามกลับไปย่อขนาดมันเพื่อให้ดูรอง — นั่นคือต้นเหตุของอาการที่เพิ่งแก้ */
/* 🔴 ขนาด/ฟอนต์/น้ำหนัก ย้ายไปบล็อก "ระบบราคา" ท้ายไฟล์ (15 ก.ย. 2026 รอบ 11) */
/* "From" / "to $110" — ของจริงบน staging มี variable product 3 ใบที่มีช่วงราคา
   ⛔ ห้ามถอดสองคลาสนี้ทิ้ง: ถ้าการ์ดแสดงแต่เลขต่ำสุดเปล่า ๆ = บอกราคาผิดต่อผู้ซื้อ */
.pm-prodcard__from,
.pm-prodcard__to{ color:var(--color-ink-muted); }

/* ใบสุดท้ายของกริด — ทางเข้าหมวด Ritual Bundles ไม่ใช่สินค้า
   จงใจ "ไม่เหมือนการ์ดสินค้า": ไม่มีช่องภาพ ไม่มีราคา พื้นจมลงไปเป็น --color-paper
   ⛔ พื้นใบนี้ห้ามใช้ --color-shade — pm-tokens.css เขียนกำกับไว้เองว่า "ห้ามมีตัวอักษรบนนี้"
      (เกือบใช้ไปแล้วรอบนี้ · --color-paper คือพื้นเดียวกับพื้นหน้า จึงอ่านเป็น "ใบที่ไม่ใช่สินค้า")
   ⛔ ห้ามใส่ราคาชุดลงใบนี้จนกว่า §5 จะถูกเคาะ (หน้าเดียวกันจะมีราคาชุดสองชุดที่ขัดกัน) */
.pm-prodcard--more{
  padding:var(--s3); background:var(--color-paper);
  display:flex; flex-direction:column; gap:var(--s1);
  text-decoration:none; color:var(--color-ink);
}
.pm-prodcard--more p{ margin:0; }
/* ใบนี้เป็นใบกว้าง 2 ช่อง จึงต้องกินความสูงเต็มแถวโดยไม่มีพื้นที่เปล่า
   ไม่มีช่องภาพ 1:1 มาล็อกความสูง — นี่คือเหตุผลที่ย้าย "ใบกว้าง" มาไว้ที่ใบนี้ */
.pm-prodcard--more{ justify-content:center; padding:var(--s4); }
.pm-prodcard--more .pm-prodcard__moretitle{ max-width:22ch; }
.pm-prodcard--more .pm-text-meta{ max-width:34ch; }
/* ตอนกว้าง 2 ช่อง: ข้อความซ้าย · ปุ่มนำทางขวา — ไม่งั้นครึ่งขวาของใบว่างเปล่า
   (ใช้ .is-featured เป็นตัวเงื่อนไข จึงกลับเป็นคอลัมน์เดียวเองที่ ≤680px ที่ span กลับเป็น 1) */
@media(min-width:681px){
  .pm-prodcard--more.is-featured{
    flex-direction:row; align-items:center; justify-content:space-between; gap:var(--s4);
  }
  .pm-prodcard--more.is-featured > div{ display:flex; flex-direction:column; gap:var(--s1); }
  .pm-prodcard--more.is-featured .pm-prodcard__morecta{ margin-top:0; padding-top:0; flex:none; }
}
.pm-prodcard--more:hover{ border-color:var(--color-brand); box-shadow:var(--shadow-card); }
.pm-prodcard--more:focus-visible{ outline:2px solid var(--color-brand-ink); outline-offset:3px; }
.pm-prodcard__moretitle{ font-family:var(--font-display); font-size:var(--fs-d6); line-height:1.2; color:var(--color-ink); }
.pm-prodcard__morecta{
  margin-top:auto; padding-top:var(--s2);
  display:inline-flex; align-items:center; gap:var(--s1);
  font-size:var(--fs-label); font-weight:600; line-height:1.2;
  text-transform:uppercase; letter-spacing:.12em; color:var(--color-brand-ink);
}
.pm-prodcard__morecta svg{ width:18px; height:18px; flex:none; }

/* ---- ที่ออกของ notice บนหน้า Home/Shop (16 ก.ย. 2026) ----
   🔴 ต้องไม่กินที่เลยเมื่อไม่มี notice — คิวว่างแล้ว WooCommerce ไม่ echo อะไรออกมา
      แต่ <div> ยังอยู่ · ⛔ ห้ามใส่ padding/margin/border ให้ตัว .pm-notices เอง
      ถ้าใส่ หน้าจะมีช่องว่างลอยใต้หัวเว็บทุกหน้าโดยไม่มีใครรู้ว่ามาจากไหน
   ระยะห่างจึงไปอยู่ที่ "ลูกที่มีจริง" แทน (:not(:empty) ของตัวข้อความ) */
/* ℹ️ ไม่มี fallback ให้ `:has()` โดยตั้งใจ — ถ้าไม่รองรับ ผลคือ <div> เปล่าที่สูง 0
   (ไม่ได้ตั้ง padding/margin ไว้อยู่แล้ว) จึงไม่เห็นความต่าง */
.pm-notices:not(:has(*)){ display:none; }
.pm-notices > *:first-child{ margin-top:var(--s3); }
.pm-notices > *:last-child{ margin-bottom:0; }

/* ============================================================
   แถวบนของเนื้อการ์ด + บล็อกซื้อ (16 ก.ย. 2026 · รอบปุ่ม Add to cart)
   คำสั่งเจ้าของงาน: "ตรงที่แสดงสินค้า อะ อยากได้เพิ่ม ปุ่ม add to cart ไปด้วยนะ"
   markup: template-parts/product/card-buy.php (ไฟล์เดียว ใช้ทั้ง Home §6 และ Shop)
   ⛔ ไม่มีค่า hex ในบล็อกนี้ — ทุกสีมาจาก pm-tokens.css (B-1)
   ============================================================ */

/* ---- แถวบน: ชื่อหมวด (ซ้าย) + ลูกศร (ขวา) ----
   ⚠️ `.pm-prodcard__top` เคยถูกถอดออกเมื่อ 15 ก.ย. เพราะป้าย `Start here` ที่เป็น
      **ข้อความ** ตัดบรรทัดในการ์ดใบแคบ แล้วดันชื่อสินค้าให้เริ่มคนละระดับกับเพื่อนบ้าน
      รอบนี้ของที่วางคือไอคอน 20px ที่กว้างคงที่ ไม่มีวันตัดบรรทัด → อาการเดิมไม่กลับมา
   ⛔ ห้ามเอาของที่เป็น "ข้อความยาวไม่แน่นอน" กลับมาวางในแถวนี้อีก */
.pm-prodcard__top{
  display:flex; align-items:flex-start; justify-content:space-between; gap:var(--s2);
}
.pm-prodcard__top .pm-prodcard__cat{ min-width:0; }

/* ---- 🔴🔴 บล็อกซื้อ — บรรทัด z-index คือหัวใจของทั้งรอบนี้ ----

   `.pm-card--link a::after{position:absolute;inset:0}` สร้างเลเยอร์คลุม **การ์ดทั้งใบ**
   เพื่อให้กดตรงไหนก็เข้าหน้าสินค้าได้ (F-3 · เป้ากด 44px)
   ⛔⛔ ถ้าไม่ยกบล็อกนี้ขึ้นมาทับเลเยอร์นั้น **ปุ่ม Add และ radio จะกดไม่ได้เลย**
        ทั้งที่ markup ถูกทุกตัวอักษรและไม่มี error ใด ๆ ให้เห็น — อาการเงียบสนิท
        (เลเยอร์นั้นอยู่เหนือกว่าเพราะ ::after มาทีหลังใน stacking order ของ .pm-card--link)
   🔴 ต้องมีครบทั้งคู่: `position:relative` (ทำให้ z-index มีผล) + `z-index:1`

   ผลที่ตามมาโดยตั้งใจ: พื้นที่ครึ่งล่างของการ์ด (ขนาด · ราคา · ปุ่ม) **ไม่ใช่ลิงก์อีกต่อไป**
   ทางเข้าหน้าสินค้าเหลือ: ภาพ · ชื่อหมวด · ชื่อสินค้า · ลูกศรมุมขวาบน — ยังเกิน 44px สบาย
   ⛔ ห้าม "แก้" ด้วยการเอา ::after กลับมาคลุมทับปุ่ม — จะกลับไปกดปุ่มไม่ได้เหมือนเดิม

   flex:1 + margin-top:auto ที่ .pm-prodcard__foot = ราคาของทุกใบอยู่แนวเดียวกัน
   ⛔ ห้ามถอด flex:1 (อ่านเหตุผลเต็มที่บล็อก .pm-prodcard__foot ข้างบน) */
.pm-buy{
  position:relative; z-index:1;
  display:flex; flex-direction:column; gap:var(--s2);
  flex:1; margin:0; min-width:0;
}

/* ---- ปุ่ม Add to cart ----
   เต็มความกว้างการ์ด: เป็นการกระทำหลักของการ์ด และทำให้เป้ากดกว้างสุดโดยไม่ต้องคิดอะไรอีก
   .pm-btn ให้ min-height:48px มาแล้ว → F-3 (≥44px) ผ่านโดยไม่ต้องประกาศซ้ำ
   ⛔ ห้ามย่อเป็นปุ่มไอคอนมุมการ์ด · ⛔ ห้ามใส่ padding แนวนอนน้อยกว่าของ .pm-btn */
.pm-buy__btn{ width:100%; }
/* ระหว่างรอ Store API ตอบ — ⛔ ห้ามใช้ disabled ตรงนี้: ถ้า JS ตายกลางทาง
   ปุ่มจะค้างกดไม่ได้ถาวร · aria-busy + pointer-events ถอนตัวเองได้เสมอ */
.pm-buy__btn[aria-busy="true"]{ pointer-events:none; opacity:.72; }

/* ข้อความแทนปุ่มเมื่อซื้อจากกริดไม่ได้ (ของหมด / ยังตั้งราคาไม่ครบ / ชนิดสินค้าที่ต้องเลือกในหน้าสินค้า)
   🔴 สูงเท่าปุ่มโดยประมาณ เพื่อให้แถวราคาของใบนั้นไม่หลุดแนวจากเพื่อนบ้านมากนัก
   ⛔ ห้ามเปลี่ยนเป็น <a> — `.pm-card--link a::after` จะสร้างเลเยอร์คลุมทั้งใบตัวที่สอง
      ทับตัวแรกจนกดการ์ดไม่ได้ (บั๊กจริง บันทึกไว้ที่ .pm-card--link ~168) */
.pm-buy__note{
  margin:0; min-height:48px;
  display:flex; align-items:center;
  font-size:var(--fs-meta); line-height:1.3;
  color:var(--color-ink-muted);                /* 6.68 ✅ B-3 */
}

/* ---- ชิปขนาดที่กดได้จริง ----
   🔴 รอบก่อนเขียนเตือนตัวเองไว้ตรง ๆ ว่า *"วันไหนทำให้มันกดได้จริง ต้องกลับมาใส่ 44px
      และแก้เรื่อง <a> ซ้อนใน .pm-card--link ด้วย"* — **รอบนี้คือวันนั้น ทำครบทั้งสองข้อ**
      (44px อยู่ที่ .pm-size ข้างล่าง · เรื่องเลเยอร์อยู่ที่ .pm-buy ข้างบน)

   radio ตัวจริงถูกซ่อนด้วย .pm-visually-hidden ซึ่งใช้ clip-path **ไม่ใช่ display:none**
   ⛔ ห้ามเปลี่ยนเป็น display:none หรือ visibility:hidden — จะกด Tab ไปไม่ถึง (F-2 ตก)
   ป้ายที่เห็นคือ <label for> จริง → คลิกที่ไหนในป้ายก็เลือกได้ (F-5) */
.pm-size__radio{ accent-color:var(--color-brand); }

/* 🔴 บล็อกนี้อยู่ **ก่อน** `.pm-size` เดิมในไฟล์ (ของเดิมอยู่ท้ายไฟล์ราวบรรทัด 1690)
   แต่ยังชนะเพราะ **ความจำเพาะสูงกว่า** ไม่ใช่เพราะลำดับ:
       `.pm-sizes__list .pm-size` = (0,2,0)   ชนะ   `.pm-size` = (0,1,0)
   ⛔ ห้าม "ทำให้อ่านง่ายขึ้น" ด้วยการตัดเหลือ `.pm-size` — จะแพ้ของเดิมทันทีเพราะ
      ของเดิมอยู่ทีหลังในไฟล์ แล้วชิปจะกลับไปสูง ~31px ซึ่งตก F-3 โดยไม่มีอะไรฟ้อง

   🔴 `align-items:center` ต้องเขียนทับของเดิมที่เป็น `baseline`
      baseline ใช้ได้ตอนชิปสูงพอดีตัวอักษร · พอบังคับ 44px แล้วตัวอักษรจะไปเกาะขอบบน */
.pm-sizes__list .pm-size{
  min-height:44px;                              /* F-3 ✅ — เป็น control แล้ว ไม่ใช่ข้อความอีกต่อไป */
  align-items:center;
  transition:border-color var(--dur-micro) ease, background-color var(--dur-micro) ease;
}
/* 🔴 `cursor:pointer` ให้ **เฉพาะชิปที่กดได้จริง** คือตัวที่เป็น <label>
   การ์ดที่ซื้อจากกริดไม่ได้ (ของหมดทุกขนาด / ชนิดสินค้าที่ต้องเลือกในหน้าสินค้า) render
   ชิปเป็น <span> ซึ่ง **ไม่ใช่ control** — ถ้าให้ pointer ด้วย จะโกหกว่ากดได้แล้วกดไม่ติด
   ⛔ ห้ามย้าย cursor กลับขึ้นไปในกฎข้างบน */
.pm-sizes__list label.pm-size{ cursor:pointer; }
/* ℹ️ ระยะห่างระหว่างเป้า ≥8px (F-3) มาจาก `.pm-sizes__list{gap:var(--s1)}` ที่ประกาศไว้
   ท้ายไฟล์อยู่แล้ว (--s1 = 8px พอดี) — ⛔ ไม่ประกาศซ้ำที่นี่ เพราะความจำเพาะเท่ากัน
   แต่ของเดิมอยู่ทีหลัง ของที่เขียนซ้ำตรงนี้จะเป็นกฎที่ไม่เคยถูกใช้ (ของตายในไฟล์)
   ⛔ ถ้าวันหนึ่งต้องเปลี่ยน gap ให้ไปเปลี่ยนที่ประกาศเดิมท้ายไฟล์ ที่เดียว */

/* ขนาดที่ถูกเลือกอยู่ — ใช้ตัวเชื่อม `+` ไม่ใช่ :has()
   🔴 radio เป็นพี่น้องที่อยู่ติดกันก่อน label เสมอใน markup → `+` ใช้ได้ทุกเบราว์เซอร์
      (ต่างจาก .pm-pay ของหน้า checkout ที่ต้องพึ่ง :has() เพราะโครงมาจาก WooCommerce)
   ⛔ ห้ามสลับลำดับ radio/label ใน card-buy.php — กฎนี้จะตายเงียบ ๆ ทันที
   ⛔ ห้ามสื่อ "ถูกเลือก" ด้วยสีอย่างเดียว — ขอบหนาขึ้น + พื้นเปลี่ยน + ตัวหนังสือเข้ม (F-5) */
.pm-size__radio:checked + .pm-size{
  border-color:var(--color-brand);
  box-shadow:inset 0 0 0 1px var(--color-brand); /* = ขอบหนา 2px โดยไม่ขยับ layout */
  background:var(--color-shade);
  color:var(--color-ink);
}
.pm-size__radio:checked + .pm-size .pm-size__price{ color:var(--color-brand-ink); }  /* 6.35 ✅ */

/* focus ring ต้องไปตกที่ป้าย เพราะ radio ตัวจริงมองไม่เห็น (F-2) */
.pm-size__radio:focus-visible + .pm-size{
  outline:2px solid var(--color-brand-ink); outline-offset:2px;
}
.pm-sizes__list label.pm-size:hover{ border-color:var(--color-brand); }

/* ขนาดที่หมด — radio ถูก disabled ไว้ · ⛔ ห้ามซ่อนทิ้ง คนต้องรู้ว่ามีขนาดนี้อยู่
   ข้อความ "Out of stock" อยู่ในป้ายจริงแล้ว จึงไม่ได้สื่อด้วยสีอย่างเดียว (F-5) */
.pm-size__radio:disabled + .pm-size{ cursor:not-allowed; }
.pm-size__radio:disabled + .pm-size:hover{ border-color:var(--color-line-strong); }

/* 🔴 ring รอบการ์ดทั้งใบตอน focus-within — **ปิดเมื่อโฟกัสอยู่ในบล็อกซื้อ**
   ของเดิมออกแบบไว้ตอนที่การ์ดมีของกดได้ชิ้นเดียว (ชื่อสินค้า) → ring = "การ์ดใบนี้ถูกโฟกัส"
   ตอนนี้การ์ดหนึ่งใบมี 3–4 tab stop → ไล่ Tab แล้วจะเห็นกรอบใหญ่ครอบการ์ดวาบซ้ำทุกครั้ง
   ซึ่งกลบ ring ของตัวที่โฟกัสจริงจนดูไม่ออกว่าอยู่ตรงไหน
   ⛔ ห้ามถอด :focus-within ทิ้งทั้งกฎ — ตอนโฟกัสที่ชื่อสินค้ายังต้องมี ring ครอบการ์ดเหมือนเดิม */
/* ℹ️ **ตั้งใจไม่ทำ fallback ให้ `:has()` ตรงนี้** — ต่างจาก `.pm-pay` ของหน้า checkout
   ที่เขียนเตือนไว้ว่าห้ามถอด fallback · เหตุผล: ที่นั่น `:has()` เป็นตัว **บอกสถานะที่เลือกอยู่**
   ถ้าไม่ทำงาน คนจะไม่รู้ว่าเลือกวิธีจ่ายอันไหน = เสียข้อมูล
   ที่นี่ `:has()` แค่ **กลบ ring ซ้อน** — ถ้าเบราว์เซอร์ไม่รองรับ ผลคือเห็นกรอบสองชั้น
   ซึ่งยังใช้งานได้ครบและยัง **ผ่าน F-2** (focus ยังมองเห็นชัด) จึงไม่คุ้มกับการเติมคลาสด้วย JS
   ⛔ อย่าอ่านข้อนี้ว่า "ลืมทำ fallback" */
.pm-card--link.pm-prodcard:focus-within:has(.pm-buy :focus-visible){ outline:none; }

@media(prefers-reduced-motion:reduce){
  .pm-sizes__list .pm-size{ transition:none; }
}

/* ขอบใบที่แนะนำ — เน้นด้วยขอบ ไม่ใช่พื้นทั้งใบ จึงไม่กินโควตาสีเข้มของหน้า (B-2)
   ชนิดเดียวกับ .pm-layer.is-lead (§4) และ .pm-ritual.is-pick (§5) */
.pm-prodcard.is-lead{ border-color:var(--color-brand); }

/* หมายเหตุนั่งร้านใต้กริด — ของเดิมพิมพ์ซ้ำทุกใบด้วยน้ำหนักเท่าข้อความสินค้า */
/* 🔴🔴 ตัวกรองหมวดหมู่ของ §6 (15 ก.ย. 2026 · รอบที่ 7) — บรรทัดนี้สำคัญกว่าที่ตาเห็น
   `.pm-prodcard` ข้างบนประกาศ `display:flex` ซึ่ง **ความจำเพาะเท่ากับ `[hidden]`** ใน pm-base.css
   และไฟล์นี้โหลดทีหลัง → `.pm-prodcard{display:flex}` ชนะ `[hidden]{display:none}` เสมอ
   ผลคือ JS ตั้ง `hidden` แล้วการ์ด **ยังโผล่อยู่** และยังเป็น tab stop อยู่ (F-2 ตก)
   ⛔ ห้ามลบกฎนี้ · ⛔ ถ้าเพิ่มคลาสไหนที่ตั้ง display ให้การ์ด ต้องเพิ่มคู่ [hidden] ตรงนี้ด้วย */
.pm-prodcard[hidden]{ display:none; }
.pm-prodgrid__empty[hidden]{ display:none; }

/* ข้อความเมื่อกรองแล้วไม่เหลือสักใบ — วางใต้กริด ไม่ได้อยู่ในกริด จึงไม่กินช่องของ grid */
.pm-prodgrid__empty{ margin:var(--s4) 0 0; color:var(--color-ink-muted); }

/* ตัวกรองเป็นลิงก์จริง จึงต้องมี focus ring ที่มองเห็นชัดเท่าปุ่ม (F-2) */
.pm-catfilter .pm-chip:focus-visible{ outline:2px solid var(--color-brand-ink); outline-offset:3px; }

.pm-prodgrid__note{ margin-top:var(--s3); }
.pm-prodgrid__foot{ margin:var(--s3) 0 0; }

/* จำนวนสินค้าในแต่ละหมวด — ตัวเลขจริงจาก staging ไม่ใช่ตัวเลขประดับ */
.pm-chip__count{
  margin-left:var(--s1); padding-left:var(--s1);
  border-left:1px solid currentColor;
  font-variant-numeric:tabular-nums; opacity:.85;
}
/* ป้ายมุมภาพ — ตัวอักษร 12.5px = --fs-label (B-4 ขั้นต่ำ)
   ⚠️ `.pm-tag--lead` ใช้พิกัดเดียวกับ `.pm-tag` เป๊ะ — ตอนนี้ไม่ชนกันเพราะใบ lead มี sizes = 0
      **ถ้าจะให้ใบไหนมีสองป้ายพร้อมกัน ต้องเลื่อนตำแหน่งป้ายที่สองก่อน** ไม่งั้นทับกันสนิท */
.pm-tag{
  position:absolute; top:var(--s1); left:var(--s1);
  background:var(--color-night); color:var(--color-on-night);
  border-radius:var(--radius);
  padding:var(--s1) calc(var(--s1) + var(--s1) / 2);
  font-size:var(--fs-label); font-weight:600; line-height:1.2;
}
/* ป้ายแนะนำ — สีแบรนด์ให้ต่างจากป้ายข้อเท็จจริง แต่รูปทรง/ตำแหน่ง/ขนาดเดียวกัน
   จึงอ่านเป็น "ป้าย" ไม่ใช่ "ปุ่ม" (ของเดิมอยู่ในเนื้อการ์ดและหน้าตาเหมือน .pm-btn เป๊ะ)
   ⛔ ห้ามเปลี่ยนข้อความเป็น Bestseller / Most popular (M-7 · D-5) */
.pm-tag--lead{ background:var(--color-brand); color:var(--color-on-night); }

/* ---- การ์ด ritual set บนแถบเข้ม · ใบกลางเป็นการ์ดนุ่ม lavender ----
   โควตา --color-accent-field = 1 ใบต่อหน้า (B-2) — ใบนี้คือใบนั้น

   🔴 รื้อ 15 ก.ย. 2026 — ของเดิมอยู่ที่ pm-components.css.superseded-2026-09-15b
   วินิจฉัย 5 ข้อเขียนไว้ที่หัว template-parts/home/rituals.php (ที่เดียว ไม่เขียนซ้ำ)

   ⚠️ กฎข้อบังคับของบล็อกนี้ — บล็อก `.pm-band--night .pm-card--soft` (บรรทัด ~267)
      เตือนไว้แล้วว่า `.pm-band--night .pm-card` (0,2,0) ชนะ `.pm-card--soft` (0,1,0)
      **ทุกคลาสใหม่ในบล็อกนี้ที่กำหนดสีบนพื้นเข้ม ต้องมีคู่ของมันในส่วน "การ์ดนุ่ม" ข้างล่าง**
      ไม่งั้นใบกลางจะได้ตัวอักษรครีมบนพื้นลาเวนเดอร์ = มองไม่เห็น */
.pm-ritual{ display:flex; flex-direction:column; gap:var(--s2); padding:var(--s4) var(--s3); }

/* หัวการ์ด: ชื่อชุด + ป้ายแนะนำ · min-height ทำให้สามใบเริ่มบรรทัดถัดไปที่ระดับเดียวกัน
   แม้ใบเดียวเท่านั้นที่มีป้าย — บั๊กแบบนี้เกิดจริงตอนทำ §4 (ป้ายดันเนื้อหาใบแรกลง) */
.pm-ritual__head{ display:flex; align-items:center; justify-content:space-between;
                  gap:var(--s2); flex-wrap:wrap; min-height:34px; }
.pm-ritual__head .pm-card__title{ margin:0; }
.pm-ritual__note{ margin:0; }

/* ของในชุด — แทนช่องว่างเปล่า 40px ของเดิม
   ขีดนำหน้าเป็นกล่องพื้นหลัง ไม่ใช่ content:"—" จึงไม่มีอะไรให้ screen reader อ่านเกิน */
.pm-ritual__includes{
  list-style:none; margin:0; padding:var(--s2) 0 0;
  border-top:1px solid var(--color-line-night);
  display:flex; flex-direction:column; gap:var(--s1);
  font-size:var(--fs-meta); line-height:1.35; color:var(--color-on-night-2);   /* 13px · B-4 ✅ */
}
.pm-ritual__includes li{ display:flex; align-items:center; gap:var(--s1); }
.pm-ritual__includes li::before{ content:""; flex:none; width:8px; height:1px; background:currentColor; }
/* แก้ 28 ก.ย. 2026 — แถวมีชื่อสินค้าจริง + ราคา (rituals.php) · ชื่อยาวตัดบรรทัดได้ ราคาไม่ตัด
   สีสืบจาก li ทั้งคู่ (on-night-2 / ink-body บนการ์ดนุ่ม) จึงไม่มีคู่สีใหม่ต้องเพิ่มในส่วนการ์ดนุ่ม */
.pm-ritual__includes li:has(.pm-ritual__item){ align-items:flex-start; }
.pm-ritual__includes li:has(.pm-ritual__item)::before{ margin-top:.68em; }
.pm-ritual__item{ flex:1; min-width:0; }
.pm-ritual__itemprice{ flex:none; font-variant-numeric:tabular-nums; }

/* ท้ายการ์ด — ยึดก้นการ์ดด้วย margin-top:auto จึงเรียงแนวเดียวกันทั้งสามใบ
   แม้จำนวนของในชุดจะไม่เท่ากัน (2 ชิ้น vs 3 ชิ้น) */
.pm-ritual__foot{ margin-top:auto; display:flex; flex-direction:column; gap:var(--s1); padding-top:var(--s3); }

/* ราคา + ส่วนลด อยู่บรรทัดเดียวกัน — ของเดิมวางส่วนลดไว้มุมขวาบน ห่างจากราคาสุดการ์ด */
.pm-ritual__price{
  display:flex; align-items:center; justify-content:space-between;
  gap:var(--s2); flex-wrap:wrap; margin:0;
}
/* 🔴 ขนาด/ฟอนต์/น้ำหนัก ย้ายไปบล็อก "ระบบราคา" ท้ายไฟล์ (15 ก.ย. 2026 รอบ 11) — ของเดิมคือ 34px */
.pm-ritual__now{ /* สีมาจาก .pm-card--soft / .on-night ข้างล่าง */ }
.pm-ritual__save{
  flex:none; border:1px solid var(--color-on-night-2); border-radius:var(--radius);
  padding:var(--s1) calc(var(--s1) + var(--s1) / 2);
  font-family:var(--font-body); font-size:var(--fs-label); font-weight:600; line-height:1.2;
  text-transform:uppercase; letter-spacing:.12em; color:var(--color-on-night);
}
/* 🔴 ป้าย "Bought separately" ห้ามถอด — ตัวเลขคือผลบวกชิ้นเดี่ยว ไม่ใช่ราคาที่เคยขาย
      เหตุผลเต็มอยู่ที่ pm_home_rituals() ข้อ 4 */
.pm-ritual__sep{ margin:0; font-size:var(--fs-meta); line-height:1.4; color:var(--color-on-night-2); }
.pm-ritual__was{ text-decoration:line-through; }
.pm-ritual__foot .pm-btn{ margin-top:var(--s2); width:100%; }

/* 🔴 gap ของกริดนี้เคยเป็น inline style `gap:var(--s2)` บน .pm-grid--3 ในของเดิม
   ตอนย้าย inline style เข้ามาที่นี่ 15 ก.ย. เกือบตกหล่นไป ซึ่งจะทำให้ตกไปใช้
   ค่าปริยายของ .pm-grid (--s4 = 32px) แล้วการ์ดแคบลงจาก 344px เหลือ 333px เงียบ ๆ
   → เขียนไว้เป็นกฎที่นี่ ไม่ใช่ inline style อีกแล้ว */
.pm-rituals{ gap:var(--s2); }

/* ใบที่ถูกแนะนำ — ขอบสีแบรนด์ idiom เดียวกับ .pm-layer.is-lead ของ §4 */
.pm-ritual.is-pick{ border-color:var(--color-brand); }

/* คำโปรยที่ตอบว่า "แล้วเอาใบไหน" · หมายเหตุ scaffolding ใต้กริด */
.pm-rituals__deck{ max-width:44ch; margin:var(--s2) 0 0; }
.pm-rituals__foot{ margin:var(--s3) 0 0; }

/* ---- คู่ของทุกกฎข้างบน สำหรับการ์ดนุ่ม lavender (ดูคำเตือนหัวบล็อก) ---- */
.pm-band--night .pm-card--soft .pm-ritual__includes,
.on-night .pm-card--soft .pm-ritual__includes{
  border-top-color:var(--color-line-strong); color:var(--color-ink-body);   /* 7.49 ✅ */
}
.pm-band--night .pm-card--soft .pm-ritual__now,
.on-night .pm-card--soft .pm-ritual__now{ color:var(--color-ink); }        /* 12.59 ✅ */
.pm-band--night .pm-card--soft .pm-ritual__sep,
.on-night .pm-card--soft .pm-ritual__sep{ color:var(--color-ink-muted); }  /* 6.68 ✅ */
.pm-band--night .pm-card--soft .pm-ritual__save,
.on-night .pm-card--soft .pm-ritual__save{
  border-color:var(--color-ink-muted); color:var(--color-ink);
}

/* 🔴 เดิมบล็อกนี้ย่อราคาของ §5 ลงหนึ่งขั้นที่ ≤1180px เพราะตอนนั้นราคาเป็น 34px
   แล้วชนกับป้ายส่วนลดจนตกบรรทัด · **ถอดออก 15 ก.ย. 2026 (รอบที่ 11)**
   ตอนนี้ราคาทั้งหน้าเป็น 18px จากบล็อก "ระบบราคา" ท้ายไฟล์ จึงไม่มีอะไรให้ต้องย่ออีก
   ⛔ ข้อนี้คือตัวอย่างว่าทำไมต้องมีที่ตั้งขนาดราคา "ที่เดียว" — กฎนี้ซ่อนอยู่ใน media query
      ห่างจากกฎหลักไป 330 บรรทัด และรอดสายตามาได้ทุกรอบจนกระทั่งไล่ grep หาทั้งไฟล์ */
@media(max-width:1180px){
  .pm-ritual{ padding:var(--s3); }
}

/* ---- ตัวเลขลำดับการอ่าน 01 · 02 · 03 ---- */
.pm-ordinal{
  font-family:var(--font-display); font-weight:400; font-size:var(--fs-d6);
  line-height:1; color:var(--color-brand-ink);      /* 6.85 ✅ ไม่ใช่ accent-field (1.12) */
}

/* ---- การ์ดลำดับการอ่าน (ลิงก์ห่อทั้งใบ) ---- */
.pm-readcard{ display:flex; flex-direction:column; gap:var(--s2); width:100%;
              text-decoration:none; border-bottom:0; color:var(--color-ink); }
.pm-readcard__meta{ display:flex; align-items:baseline; gap:var(--s2); }

/* ============================================================
   7. การเข้าของ section แบบไม่ใช้ JS — design.md §8.5
   .pm-reveal (ข้างบน) ต้องมี JS มาเติม .is-in · .pm-rise ไม่ต้อง
   ใช้กับของครึ่งบนจอเท่านั้น เพื่อไม่ให้เนื้อหาล่างซ่อนถ้า CSS มาช้า
   animate เฉพาะ opacity + transform (B-9) · ปิดเองที่ pm-base.css (F-6)
   ============================================================ */
@keyframes pm-rise{ from{ opacity:0; transform:translate3d(0,var(--s2),0); } to{ opacity:1; transform:none; } }
.pm-rise{ animation:pm-rise var(--dur-section) var(--ease-section) both; }
.pm-rise--1{ animation-delay:.06s; }
.pm-rise--2{ animation-delay:.12s; }
.pm-rise--3{ animation-delay:.18s; }
.pm-rise--4{ animation-delay:.24s; }

/* ---- ตารางเงื่อนไขค่าส่ง (สไลด์ที่ 3) — เพิ่ม 14 ก.ย. 2026 รอบ 9 ----
   🔴 ตารางเดียวของทั้ง slider · เงื่อนไขมีสองแกน (ยอดซื้อ × ระดับบริการ) จึงต้องเป็นตารางจริง
   ⛔ ห้ามใส่ background ให้แถวสลับ — พื้นเว็บเป็น paper และ §3.1 ให้ --color-shade
      ทำหน้าที่ "พื้นช่องภาพ" อยู่แล้ว เอามาทำ zebra จะอ่านเป็นช่องภาพเปล่า */
.pm-tablewrap{ overflow-x:auto; }
.pm-ship{
  width:100%; margin:0;
  border-collapse:collapse;
  text-align:left;
  font-size:var(--fs-small);
}
.pm-ship th,.pm-ship td{
  /* 🔴 --s1 ไม่ใช่ --s2 ในแนวตั้ง: ตารางนี้อยู่คอลัมน์เดียวกับภาพ 4:5
     ทุก 1px ที่สูงขึ้นถูกคูณด้วย 5 ใบ (แถว flex เดียวกัน) · วัดแล้วประหยัด 48px */
  padding:var(--s1) var(--s3) var(--s1) 0;
  border-bottom:1px solid var(--color-line);
  vertical-align:baseline;
}
.pm-ship thead th{
  border-bottom:1px solid var(--color-line-strong);
  color:var(--color-ink-muted);
  font-weight:400;
  letter-spacing:.12em;          /* ตามค่าเดียวกับ .pm-eyebrow — ระบบยังไม่มี token ของ letter-spacing */
  text-transform:uppercase;
  font-size:var(--fs-meta);
}
.pm-ship tbody th{ color:var(--color-ink); font-weight:500; white-space:nowrap; }
.pm-ship td{ color:var(--color-ink-body); }
/* "Free" ต้องอ่านออกโดยไม่ต้องพึ่งสี — ใช้น้ำหนักตัวอักษร + สีหมึกเข้ม ไม่ใช่สีเขียว
   (F-1/B-3: ห้ามสื่อความหมายด้วยสีอย่างเดียว · และโควตา accent ของหน้านี้ใช้ครบแล้ว)
   🔴 ต้องเขียน `td.pm-ship__free` ไม่ใช่ `.pm-ship__free` เฉย ๆ
      `.pm-ship td` มีน้ำหนัก (0,1,1) ส่วนคลาสเดี่ยวมี (0,1,0) → คลาสเดี่ยวแพ้ สีไม่เปลี่ยน
      วัดแล้ว: ก่อนแก้ ทั้ง Free และ Charged ได้ contrast 9.35 เท่ากันเป๊ะ = สีไม่ถูกใช้จริง
      (บั๊กชนิดเดียวกันนี้เจอ 3 ครั้งในรอบเดียว — ดู .pm-row--center และ .pm-sr-only) */
.pm-ship td.pm-ship__free{ color:var(--color-ink); font-weight:600; }

/* ============================================================================
   ส่วนหัวของเว็บ — Case A  (เพิ่ม 14 ก.ย. 2026 · รอบ header)
   ที่มา: Claude Design `CaseANav.dc.html` · markup อยู่ที่ header.php
          + inc/class-pm-walker-header.php

   🔴 ทำไมอยู่ในไฟล์นี้ ไม่แยกเป็น css/pm-header.css
      บล็อก enqueue ใน functions.php วนลูปอาเรย์ตายตัว
      array('tokens','base','layout','components','utilities') และมี file_exists()
      ที่ `continue` เงียบ ๆ → ไฟล์ชื่ออื่นจะ **ไม่ถูก enqueue และไม่มี error**
      และตรวจจับบน staging ไม่ได้ด้วย เพราะธีม bajaar-child ยังไม่ activate
      (ไฟล์ preview <link> ตรง จึงไม่มีวันจับอาการนี้ได้เช่นกัน)
      → ต่อท้าย components ปลอดภัยที่สุด และตรงลำดับ C-7 อยู่แล้ว (ส่วนหัวคือ component)
      ⛔ ถ้าจะแยกไฟล์จริง ต้องแก้อาเรย์ในลูปพร้อมกันในการแก้ครั้งเดียว

   ⛔ ห้ามมีค่า hex ที่นี่ (B-1) — ทุกสีมาจาก pm-tokens.css
   ⛔ ห้ามใช้ระยะนอกสเกล --s1…--s8
   ============================================================================ */

/* ---- แถบประกาศบนสุด ----
   contrast: --color-on-night บน --color-brand = 5.20 ✅ (pm-tokens.css บันทึกไว้)
   ขนาด --fs-label 12.5px = เล็กที่สุดในระบบ · B-4 กำหนดเพดาน 12px ✅ */
.pm-announce{
  background:var(--color-brand);
  color:var(--color-on-night);
}
.pm-announce__text{
  max-width:var(--wrap);
  margin:0 auto;
  padding:var(--s1) var(--pad);
  font-size:var(--fs-label);
  line-height:1.5;
  letter-spacing:.02em;
  text-align:center;
}
/* ค่าส่งฟรีแยก span เพื่อให้หล่นบรรทัดใหม่ได้เองบนจอแคบ ไม่ต้องมี media query */
.pm-announce__ship{ display:inline-block; }

/* ---- โครงของส่วนหัว ----
   position:sticky ทำให้ .pm-header เป็น containing block ของพาเนลลอยทุกตัว
   (mega · แผงค้นหา) — ห้ามถอด position ออกโดยไม่ย้ายจุดยึดของพาเนล */
.pm-header{
  position:sticky; top:0; z-index:60;
  background:var(--color-paper);
  border-bottom:1px solid var(--color-line);
}
.pm-header__bar{
  display:flex; align-items:center; justify-content:space-between;
  gap:var(--s3);
  min-height:68px;
}

/* ---- โลโก้ + ป้ายกำกับ ----
   🔴 โลโก้เป็น PNG 224×65 (attachment 4259) — เป็น raster ไม่ใช่ SVG
      สูง 34px บนจอ 2× ต้องการภาพกว้าง ~234px ซึ่งไฟล์จริงมี 224px → เฉียดพอดี
      ถ้าจะทำให้คมจริงต้องขอไฟล์ SVG หรือ PNG 2× (บันทึกเป็นหนี้ในรายงานรอบนี้) */
.pm-brand{
  display:flex; align-items:center; gap:var(--s2);
  flex:none; min-width:0;
  text-decoration:none; border-bottom:0;
  color:var(--color-brand);
}
/* 🔴 ตัวเลือกต้องเป็น `.pm-brand .pm-brand__logo` ไม่ใช่ `.pm-brand__logo` เดี่ยว ๆ —
   **นี่คือการแข่ง specificity ที่แพ้มาแล้วจริงบน staging (วัด 15 ก.ย. 2026)**
   ธีมแม่/รีเซ็ตของ Bajaar มีบรรทัด `embed, img:not([draggable]), object, video{ max-width:100%; height:auto; }`
   `:not([draggable])` นับเป็น attribute selector → specificity (0,1,1) **สูงกว่า** คลาสเดี่ยว (0,1,0)
   ผลคือ `height` ของโลโก้ถูก `height:auto` ชนะ → <img> กลับไปใช้ขนาดจริง 224×65
   แล้ว .pm-util ถูกดันจนล้นขอบขวาบนมือถือ (วัดที่ 387px: scrollWidth 474 > 387 = ล้น 87px)
   ⛔ ห้ามแก้ด้วย !important (C-7) และห้ามใช้ `img.pm-brand__logo` ซึ่งได้ (0,1,1) เท่ากัน —
      เสมอกันแล้วไปตัดสินที่ลำดับโหลด ซึ่งเป็นความเปราะบางแบบเดียวกับที่เพิ่งแก้
   ✅ `.pm-brand .pm-brand__logo` = (0,2,0) ชนะขาด และยังอยู่ในโครง BEM เดิม
   ⚠️ ทุกกฎที่ตั้ง height/width ให้ <img> โดยใช้ "คลาสเดียว" ในไฟล์นี้มีอาการเดียวกัน — ต้องเขียนแบบนี้ */
.pm-brand .pm-brand__logo{ display:block; width:auto; height:34px; }
/* ใช้เมื่อเว็บยังไม่ได้ตั้ง custom_logo — ตามไฟล์ออกแบบคือ wordmark เซริฟ */
.pm-brand__word{
  font-family:var(--font-display);
  font-size:var(--fs-d6);
  line-height:1;
  letter-spacing:-.01em;
  white-space:nowrap;
}
/* ป้าย "the specialist store"
   🔴 ไฟล์ออกแบบใช้ IBM Plex Mono — **ธีมนี้มี 2 family เท่านั้น** (มติ 10 ก.ย. · design.md §5.1)
      จึงใช้ --font-body + letter-spacing แทน ไม่เพิ่ม family ที่สาม (B-5 · C-9 font budget)
   contrast: --color-ink-muted บน --color-paper = 6.68 ✅ */
.pm-brand__tag{
  font-size:var(--fs-label);
  letter-spacing:.06em;
  color:var(--color-ink-muted);
  white-space:nowrap;
}

/* ---- เมนูหลัก เดสก์ท็อป ---- */
.pm-nav__list{
  display:flex; align-items:center;
  gap:var(--s1);
  margin:0; padding:0; list-style:none;
}
/* padding-block ทำหน้าที่เป็น "สะพาน" ระหว่างปุ่มกับพาเนล
   ถ้าไม่มี เมาส์จะหลุด :hover ตอนเลื่อนลงไปหาพาเนล แล้วพาเนลปิดใส่หน้า
   🔴 ใช้ --s1 (8px) ไม่ใช่ --s3 (24px): ปุ่มสูง 44px ตาม F-3 อยู่แล้ว
      --s3 ทำให้รายการสูง 24+44+24 = 92px แล้ว **ดันแถบหัวจาก 68px เป็น 92px**
      (วัดจริงในเบราว์เซอร์ 14 ก.ย. ก่อนแก้: .pm-header__bar = 91.98px)
      ไฟล์ออกแบบล็อกความสูงแถบไว้ที่ 68px · --s1 ให้ 8+44+8 = 60 < 68 → แถบคงที่ 68 */
.pm-nav__item{ position:relative; padding-block:var(--s1); }
/* 🔴 ป้ายเมนูห้ามตัดบรรทัด — "Shop by Goal" และ "Ritual Sets" ขึ้นสามบรรทัดตอนไม่มีบรรทัดนี้
   แล้วดันแถบหัวจาก 68px เป็น ~100px (เห็นจริงในภาพแรกที่ render 14 ก.ย.)
   ตรงกับ white-space:nowrap ที่ไฟล์ออกแบบตั้งไว้ที่ <nav> */
.pm-nav__list > .pm-nav__item > .pm-nav__link{ white-space:nowrap; padding-inline:var(--s1); }

/* .pm-nav__link มีนิยามอยู่แล้วข้างบนไฟล์นี้ — ที่นี่เติมเฉพาะกรณีที่เป็น <button> */
button.pm-nav__link{
  background:none; border:0; border-bottom:1px solid transparent;
  font-family:inherit; cursor:pointer;
}
.pm-nav__trigger{ gap:var(--s1); }
.pm-nav__chev{ flex:none; transition:transform var(--dur-micro) ease; }
.pm-nav__item:hover > .pm-nav__trigger .pm-nav__chev,
.pm-nav__item:focus-within > .pm-nav__trigger .pm-nav__chev,
.pm-nav__item.is-open > .pm-nav__trigger .pm-nav__chev{ transform:rotate(180deg); }

/* 🔴 รายการที่ยังไม่มีปลายทางจริง (url = '#' ทั้ง 52 รายการ ตั้งแต่ 11 ก.ย.)
   **เป็น <a> เหมือนรายการปกติทุกประการ** — ชี้ได้ กดได้ โชว์ URL ได้ Tab ถึง
   (คำสั่งเจ้าของงาน 14 ก.ย. · รอบก่อนหน้าเคยทำเป็น <span> แล้วถูกตีกลับ)
   คลาสนี้เหลือไว้เป็น **เครื่องหมายให้ grep** ว่าเหลือกี่รายการที่ยังไม่มีปลายทาง
   ⛔ ห้ามใส่ cursor:default / pointer-events:none / opacity ที่นี่ —
      จะทำให้กลับไปเป็นปัญหาเดิมคือ "ดูเหมือนเมนูแต่ใช้งานไม่ได้" */

/* ---- พาเนล mega ----
   เปิดได้ 3 ทาง และ **สองทางแรกไม่ต้องมี JS** (C-10):
     :hover          — เมาส์
     :focus-within   — คีย์บอร์ด (จึงต้องมี <button> ที่ depth 0 ไม่ใช่ <span>)
     .is-open        — JS ใส่ให้ตอนแตะบนจอสัมผัส */
.pm-mega{
  position:absolute; top:100%; left:0;
  display:none;
  background:var(--color-surface);
  border:1px solid var(--color-line);
  border-radius:var(--radius);
  padding:var(--s2) 0;
  box-shadow:var(--shadow-card);
  max-width:calc(100vw - var(--s4));
}
.pm-nav__item:hover > .pm-mega,
.pm-nav__item:focus-within > .pm-mega,
.pm-nav__item.is-open > .pm-mega{ display:block; }

/* เมนูสองตัวขวาสุด (About Us · Contact Us) พาเนลจะล้นขอบขวาของจอ
   จัดชิดขวาแทนชิดซ้ายด้วย :nth-last-child แทนการใส่คลาสมือ — จำนวนเมนูเปลี่ยนได้เอง */
.pm-nav__item:nth-last-child(-n+2) > .pm-mega{ left:auto; right:0; }

.pm-mega__in{ display:flex; gap:var(--s3); }
.pm-mega__col{ min-width:230px; }
/* หัวคอลัมน์
   🔴 ไฟล์ออกแบบใช้ --color-accent (lavender) แต่ **design.md §3.2 ให้โควตา accent
      แค่ 3 จุดต่อหน้า** และส่วนหัวมี kicker 8 อันซึ่งอยู่ทุกหน้าของเว็บ
      → ใช้ --color-ink-muted แทน (6.68 บน paper · สูงกว่าบน surface) ✅ B-3
      ⛔ ถ้าเจ้าของงานอยากได้ lavender จริง ต้องแก้โควตาใน design.md §3.2 ก่อน ไม่ใช่แก้ที่นี่ */
.pm-mega__kicker{
  display:block;
  padding:0 var(--s2) var(--s1);
  font-size:var(--fs-label);
  font-weight:500;
  letter-spacing:.12em;
  text-transform:uppercase;
  color:var(--color-ink-muted);
}
.pm-mega__list{ margin:0; padding:0; list-style:none; }
.pm-mega__link{
  display:flex; align-items:center;
  min-height:44px;                    /* F-3 ✅ */
  padding:0 var(--s2);
  font-size:var(--fs-small);          /* 15px · B-4 ✅ */
  color:var(--color-ink);             /* 12.59 บน surface ✅ */
  text-decoration:none; border-bottom:0;
}
/* ทุกรายการเป็น <a> แล้ว จึงไม่ต้องมีตัวเลือก a. นำหน้าให้สับสน */
.pm-mega__link:hover{ background:var(--color-paper); color:var(--color-brand-ink); }

/* ---- ปุ่ม utility (ค้นหา · บัญชี · ตะกร้า) ----
   gap --s1 = 8px → ระยะห่างระหว่าง touch target ผ่าน F-3 ✅ */
.pm-util{ display:flex; align-items:center; gap:var(--s1); flex:none; }
.pm-util__btn{
  display:inline-flex; align-items:center; gap:var(--s1);
  min-height:44px; min-width:44px;    /* F-3 ✅ */
  padding-inline:var(--s2);
  background:none; border:0; border-bottom:0;
  font-family:inherit; font-size:var(--fs-h6); font-weight:500;
  color:var(--color-ink);
  text-decoration:none; cursor:pointer;
  list-style:none;                    /* <summary> — ซ่อนสามเหลี่ยมของเบราว์เซอร์ */
}
.pm-util__btn::-webkit-details-marker{ display:none; }
/* 🔴 ป้าย Search / Account / Cart ถูก **ซ่อนจากสายตาทุกความกว้าง** ไม่ใช่แค่บนมือถือ
      เหตุผลเป็นตัวเลข: คอนเทนเนอร์ตันที่ --wrap 1240px → เนื้อที่จริง **1160px คงที่**
      ทุกจอที่กว้างกว่านั้น · วัดจริงตอนมีป้าย: ต้องใช้ **1,417px** → ล้นคอนเทนเนอร์ 158px
      และเกิด horizontal scroll ที่ 1280 และ 1440
      ซ่อนป้าย (−166px) + บีบ padding/gap (−136px) → เหลือ **1,095px** ซึ่งพอดีใน 1160
      ⛔ **ต้องเป็น visually-hidden ไม่ใช่ display:none** — SVG ทุกตัวเป็น aria-hidden
         ถ้าซ่อนป้ายด้วย display:none ปุ่มจะ **ไม่เหลือชื่อให้ screen reader อ่านเลย**
         (บั๊กที่เขียนไว้จริงในร่างแรกของรอบนี้ ตอนที่ซ่อนเฉพาะ ≤900px) */
.pm-util__label{
  position:absolute; width:1px; height:1px;
  padding:0; margin:-1px; overflow:hidden;
  clip-path:inset(50%); white-space:nowrap; border:0;
}
.pm-util__btn{ padding-inline:var(--s1); }
.pm-util__btn:hover{ color:var(--color-brand-ink); }
.pm-util__ico{ flex:none; }
.pm-util__btn--cart{ color:var(--color-brand); }
.pm-util__count{ font-variant-numeric:tabular-nums; }

/* ---- แผงค้นหา ----
   ยึดกับ .pm-header (sticky = positioned) ไม่ใช่กับ .pm-util */
.pm-searchpanel{
  position:absolute; top:100%; left:0; right:0;
  background:var(--color-surface);
  border-top:1px solid var(--color-line);
  border-bottom:1px solid var(--color-line);
}
.pm-searchpanel__form{ display:flex; gap:var(--s1); padding-block:var(--s2); }
.pm-searchpanel__input{
  flex:1; min-width:0; min-height:46px;
  padding:0 var(--s2);
  background:var(--color-paper);
  border:1px solid var(--color-line-strong);   /* 3.07 — ขอบ control ✅ */
  border-radius:var(--radius);
  font-family:inherit; font-size:var(--fs-body);
  color:var(--color-ink);
}

/* ---- ลิ้นชักเมนูมือถือ ----
   <details> ทำ toggle/คีย์บอร์ด/สถานะเองทั้งหมด → ไม่มี JS ก็ครบ (C-10)

   🔴 ปุ่มอยู่ **ในแถว utility** ไม่ใช่แถวเต็มความกว้างใต้แถบหัว — ตรงกับไฟล์ออกแบบ
      (`data-camenubtn` อยู่ในกล่อง flex เดียวกับ search/account/cart)
      ถ้าวางเป็นแถวแยก ที่ 375px ส่วนที่ติดหน้าจอจะเป็น 53+68+48 = 169px แทนที่จะเป็น 121px
   พาเนลยึดกับ .pm-header (sticky = positioned) แบบเดียวกับ .pm-searchpanel */
.pm-mnav{ display:none; }
.pm-mnav__toggle{ font-size:var(--fs-h6); }
.pm-mnav__toggle-open,
.pm-mnav__toggle-close{ display:flex; align-items:center; gap:var(--s1); }
.pm-mnav__toggle-close{ display:none; }
.pm-mnav[open] .pm-mnav__toggle-open{ display:none; }
.pm-mnav[open] .pm-mnav__toggle-close{ display:flex; }

.pm-mnav__panelwrap{
  position:absolute; top:100%; left:0; right:0;
  background:var(--color-surface);
  border-top:1px solid var(--color-line);
  border-bottom:1px solid var(--color-line);
  /* เหลือที่ให้แถบประกาศ + แถบหัวเสมอ — ลิ้นชักยาวแค่ไหนก็ไม่ดันจอจนกดปิดไม่ได้ */
  max-height:calc(100dvh - var(--s8));
  overflow:auto;
}
.pm-mnav__inner{ padding-block:var(--s2); }
.pm-mnav__list{ margin:0; padding:0; list-style:none; }
.pm-mnav__item{ border-top:1px solid var(--color-line); }
.pm-mnav__summary,
.pm-mnav__link,
.pm-mnav__self{
  display:flex; align-items:center; justify-content:space-between; gap:var(--s2);
  min-height:48px;                    /* F-3 ✅ */
  font-size:var(--fs-body);
  font-weight:500;
  color:var(--color-ink);
  text-decoration:none; border-bottom:0;
  cursor:pointer; list-style:none;
}
.pm-mnav__summary::-webkit-details-marker{ display:none; }
.pm-mnav__group[open] > .pm-mnav__summary .pm-nav__chev{ transform:rotate(180deg); }
.pm-mnav__panel{ padding-bottom:var(--s2); }
/* ในมือถือ kicker เป็นตัวคั่นกลุ่ม ไม่ใช่หัวคอลัมน์ — ให้ระยะน้อยลงและไม่ต้องมี min-width */
.pm-mnav__panel .pm-mega__col{ min-width:0; }
.pm-mnav__panel .pm-mega__kicker{ padding-top:var(--s2); }
.pm-mnav__panel .pm-mega__link{ padding-left:var(--s3); }

/* ---- จุดสลับเดสก์ท็อป ↔ มือถือ ----
   🔴 **1180px ไม่ใช่ 900px ตามไฟล์ออกแบบ — และนี่คือค่าที่วัดมา ไม่ใช่ค่าที่เลือกเอง**
      วัดจริง: แถบเมนูเดสก์ท็อป (โลโก้ + ป้าย + เมนู 6 ตัว + ปุ่ม utility) ต้องการ
      **อย่างน้อย 1,095px** แม้จะบีบ padding/gap จนสุดในบล็อก 1200px ข้างบนแล้ว
      → ที่ 901px และ 1024px ซึ่งไฟล์ออกแบบยังให้เป็นเดสก์ท็อป เกิด horizontal scroll จริง
        (scrollWidth 1095 > clientWidth) และพาเนล mega หลุดขอบจอ
      ⛔ ทางแก้ที่ **ไม่** เลือก: ซ่อนรายการเมนูบางตัว (ชน C-10) · ลดปุ่มต่ำกว่า 44px (ชน F-3)
         · ลดตัวอักษรต่ำกว่า 15px (ชน B-4)
      ⚠️ เผื่อระยะไว้ 85px เพราะ **ฟอนต์จริงยังไม่ได้โหลด** (B-5 ยังไม่ผ่าน) — ความกว้างของ
         ป้ายเมนูจะเปลี่ยนเมื่อ Instrument Serif / Hanken Grotesk มาถึง ต้องวัดซ้ำตอนนั้น */
@media (max-width:1180px){
  .pm-nav{ display:none; }
  .pm-mnav{ display:block; }   /* <details> ใน flex row — block ไม่ใช่ inline-flex เพราะ <summary> คุมความสูงเอง */
  .pm-header__bar{ gap:var(--s2); }
  .pm-brand__tag{ display:none; }     /* ที่ไม่พอ — ตรงกับ data-cahide-narrow ในไฟล์ออกแบบ */
  .pm-searchpanel__form{ padding-inline:var(--pad); }

  /* 🔴 แถว utility มี 4 ปุ่มบนมือถือ (Menu · Search · Account · Cart) ไม่ใช่ 3
     วัดจริงที่ 375px ก่อนแก้: .pm-util กว้าง 223.8px + โลโก้ 117px + ระยะ 16 + padding 44
     = 400.8px → **ล้นขอบขวา 3px** (scrollWidth 378 > clientWidth 375)
     แก้ที่ padding ของปุ่มกับความสูงโลโก้ ไม่ใช่ที่ min-width — min-width:44px คือ F-3 ห้ามลด */
  /* ต้องเป็นตัวเลือกคู่เหมือนกฎฐาน ไม่งั้นแพ้ `img:not([draggable]){height:auto}` เหมือนเดิม (ดูคอมเมนต์ที่กฎฐาน) */
  .pm-brand .pm-brand__logo{ height:30px; }    /* 224×65 → กว้าง ~103px */
}

/* B-9 · F-6 — ไม่ต้องเขียนกฎปิด motion ซ้ำที่นี่
   pm-base.css §Motion มี `*{animation:none!important;transition:none!important}`
   ใต้ prefers-reduced-motion อยู่แล้ว ซึ่งกินทุก selector รวมถึง .pm-nav__chev
   เขียนซ้ำ = มีสองที่ให้ลืมแก้ ไม่ได้เพิ่มความปลอดภัยอะไร */

/* ============================================================
   ส่วนท้ายของเว็บ (footer.php) — เพิ่ม 14 ก.ย. 2026 · รอบ footer
   ที่มา: `CaseAFooter.dc.html`
   ⛔ ไม่มีค่า hex ที่นี่ (B-1) — ทุกสีเป็น var() จาก pm-tokens.css

   ── ตารางแปลงค่าจากไฟล์ออกแบบมาเป็น token ──────────────────────
   ไฟล์ออกแบบใช้ `rgba(247,244,236,…)` **8 ระดับความทึบ** บนฐานสีที่ไม่ใช่
   --color-paper ด้วยซ้ำ · ชุด token มีให้ 3 ระดับ จึงยุบตามบทบาท ไม่ใช่ตามเลข:
     alpha .78 / .72  ตัวอักษรบนพื้นเข้ม  → --color-on-night-2   (7.71 ✅)
     สีกระดาษเต็มค่า  หัวข้อ / ตัวเน้น     → --color-on-night     (12.59 ✅)
     alpha .15 / .25  เส้นคั่น / ขอบป้าย   → --color-line-night   (3.51 ✅)
     alpha .45        กรอบเส้นประ DBD      → --color-line-night   (3.51 ✅)
     สี lavender อ่อน hover               → --color-accent-field
   (⛔ ไม่เขียนค่า hex ไว้ที่นี่แม้จะเป็นคอมเมนต์ — เงื่อนไขผ่าน B-1 คือ grep ทั้งไฟล์)
   ⛔ ห้ามเพิ่ม token ใหม่เพื่อให้ตรงกับไฟล์ออกแบบเป๊ะ — pm-tokens.css เขียนไว้เองว่า
      ห้ามแก้ค่าโดยไม่แก้ design.md §10.2 ก่อน

   ✅ **ปลดหนี้ B-3 ที่ค้างมาจาก 6 ก.ย.**: รายงานรอบนั้น (§4) ยอมรับว่ากรอบป้าย
      VISA/MASTERCARD ใช้ .25 = **2.16:1 ต่ำกว่า 3:1** และยกไปแก้ทีหลัง
      การยุบมาที่ --color-line-night ทำให้เป็น 3.51 → **ผ่าน B-3 แล้ว**
   ============================================================ */

/* ---- กล่อง CTA (render เฉพาะเมื่อมีเบอร์ WhatsApp ที่ยืนยันแล้ว) ---- */
.pm-footcta{ padding-block:var(--s6) 0; }

.pm-footcta__box{
  display:grid; grid-template-columns:1.1fr .9fr;
  gap:var(--s4); align-items:center;
  border:1px solid var(--color-line-night);
  border-radius:var(--radius);
  padding:var(--s5);
}
.pm-footcta__title{ color:var(--color-on-night); margin-bottom:var(--s1); max-width:20ch; }
.pm-footcta__text{ color:var(--color-on-night-2); font-size:var(--fs-small); max-width:46ch; margin:0; }
.pm-footcta__actions{ justify-content:flex-end; }

/* ---- โครงของ footer ---- */
.pm-footer{ margin-top:var(--s6); }
/* 🔴 14 ก.ย. 2026 — พอกล่อง CTA WhatsApp กลับมา render จริง margin นี้กลายเป็น
   **แถบสีพื้นกระดาษสูง 64px คั่นกลางพื้นเข้มสองก้อน** (วัดจริงบนหน้าแรก ไม่ได้เดา)
   margin-top มีไว้กันกรณี **ไม่มี** กล่อง CTA เท่านั้น — เมื่อมีกล่อง ต้องชนกันสนิท
   ⛔ ห้ามแก้ด้วยการลบ margin-top ทิ้ง — หน้าที่ไม่มีกล่อง CTA จะไปติดเนื้อหาทันที */
.pm-footcta + .pm-footer{ margin-top:0; }
.pm-footer p{ margin:0; }

/* ---- จดหมายข่าว ---- */
.pm-news__box{
  display:grid; grid-template-columns:1.1fr .9fr;
  gap:var(--s3) var(--s4); align-items:center;
  border-top:1px solid var(--color-line-night);
  border-bottom:1px solid var(--color-line-night);
  padding-block:var(--s4);
}
.pm-news__title{ font-size:var(--fs-d5); color:var(--color-on-night); margin-bottom:var(--s1); }
.pm-news__text{ color:var(--color-on-night-2); font-size:var(--fs-small); max-width:44ch; }

.pm-news__form{ display:flex; flex-direction:column; gap:var(--s1); }
/* label ของ pm-base.css เป็นสี --color-ink ซึ่งหายไปบนพื้นเข้ม — ต้องกลับด้าน */
.pm-news__form label{ color:var(--color-on-night-2); }
.pm-news__row{ display:flex; gap:var(--s1); flex-wrap:wrap; }
/* input ใช้ค่าจาก pm-base.css ทั้งหมด (พื้น surface · ขอบ line-strong · สูง 48px)
   ที่นี่กำหนดแค่การยืดหด ไม่ทับสีหรือขนาด */
.pm-news__input{ flex:1 1 200px; min-width:0; }
.pm-news__note{ min-height:20px; font-size:var(--fs-meta); color:var(--color-on-night-2); }
/* MC4WP ปล่อยข้อความตอบกลับมาเป็น <div class="mc4wp-alert"><p>…</p></div> */
.pm-news__note p{ margin:0; color:var(--color-on-night); font-weight:500; }

/* ---- กริดลิงก์ ----
   1.4fr + 4 คอลัมน์ ตามไฟล์ออกแบบ · คอลัมน์แรกเป็นบล็อกแบรนด์ ไม่ได้มาจากเมนู */
.pm-foot__grid{
  display:grid; grid-template-columns:1.4fr 4fr;
  gap:var(--s4) var(--s3);
  padding-block:var(--s5) var(--s3);
}
.pm-foot__word{ font-family:var(--font-display); font-size:var(--fs-d5); color:var(--color-on-night); }
/* 🔴 เขียน `.pm-footer` นำหน้า ไม่ใช่ `.pm-foot__tag` เปล่า ๆ — เรื่อง specificity ล้วน
   `.pm-footer p` ข้างบนมีน้ำหนัก (0,1,1) ส่วน `.pm-foot__tag` เปล่ามี (0,1,0) → แพ้
   ผลคือ margin ที่ตั้งไว้จะไม่มีผลเลยแบบเงียบ ๆ
   ⛔ ห้าม "แก้" ด้วย !important — C-7 อนุญาต !important เฉพาะตอนทับสไตล์ปลั๊กอินภายนอก
      ไม่ใช่ตอนทับ reset ของตัวเอง ซึ่งแก้ด้วย selector ได้ */
.pm-footer .pm-foot__tag{
  font-size:var(--fs-label); letter-spacing:.06em;      /* แทน IBM Plex Mono — C-9 font budget
                                                           มติเดียวกับ report-header-2026-09-14.md §2 ข้อ 4 */
  /* 🔴 **ไม่ใช่ --color-accent-field** ทั้งที่ไฟล์ออกแบบใช้ lavender ตรงนี้
     design.md §3.2 ให้โควตาตระกูล accent (`--color-accent` + `--color-accent-field`)
     ไว้ **3 จุดต่อหน้า** คือ (1) ตัวอักษร accent (2) การ์ดนุ่ม 1 ใบ (3) hover
     ป้ายนี้อยู่ **ทุกหน้าของเว็บ** → ถ้าใช้ lavender = กินโควตาช่อง (1) ทิ้งก่อนที่
     เนื้อหาของแต่ละหน้าจะได้ใช้ · ช่อง (2) ก็ถูก `.pm-card--soft` จองไปแล้ว (บรรทัด ~506)
     เป็นเหตุผลเดียวกับที่รอบ header ถอด lavender ออกจากหัวคอลัมน์ mega ทั้ง 8 อัน
     (report-header-2026-09-14.md §2 ข้อ 3) — และ `.pm-brand__tag` ของ header
     ซึ่งเป็นข้อความเดียวกันเป๊ะ ก็ใช้ --color-ink-muted ไม่ใช่ accent
     ⚠️ hover ของลิงก์ footer ยังใช้ accent-field ได้ = ช่อง (3) และเกิดทีละจุดเท่านั้น
     ⛔ ถ้าเจ้าของงานอยาก lavender จริง ต้องแก้โควตาใน design.md §3.2 ก่อน ไม่ใช่แก้ที่นี่ */
  color:var(--color-on-night-2);      /* 7.71 ✅ — คู่ของ --color-ink-muted บนพื้นเข้ม */
  margin:var(--s1) 0 var(--s2);
}
.pm-foot__blurb{ font-size:var(--fs-h6); color:var(--color-on-night-2); max-width:34ch; }

/* เมนู footer ทั้งก้อนถูก render เป็น <ul class="pm-foot__cols"> ตัวเดียว
   แต่ละ <li> คือหนึ่งคอลัมน์ → ทำให้ <ul> ตัวนี้เป็นกริด 4 ช่องในตัวมันเอง
   ⛔ ทางที่ **ไม่** เลือก: `display:contents` บน <ul> เพื่อยกทั้ง 4 <li> ขึ้นไปเป็น
      item ของ .pm-foot__grid โดยตรง — มันลบ role="list" ออกจาก a11y tree
      (บั๊กที่ยังมีอยู่ใน Safari/VoiceOver) → screen reader เลิกประกาศว่า
      "รายการ 6 รายการ" ซึ่งเป็นข้อมูลที่ผู้ใช้คีย์บอร์ดใช้ตัดสินใจว่าจะข้ามหรือไม่ */
.pm-foot__cols{
  display:grid; grid-template-columns:repeat(4,1fr);
  gap:var(--s4) var(--s3);
  list-style:none; margin:0; padding:0;
}
.pm-foot__col{ list-style:none; }

.pm-foot__head{
  font-family:var(--font-body);
  font-size:var(--fs-label); font-weight:500;
  text-transform:uppercase; letter-spacing:.06em;
  color:var(--color-on-night-2);                        /* 7.71 ✅ */
  margin:0 0 var(--s1);
}
.pm-foot__list{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; }

/* 🔴 34px คือค่าของไฟล์ออกแบบ และมัน **ตก F-3** ที่เขียนว่าเป้ากด ≥ 44×44px วัดที่ 375px
   วัดจริงในเบราว์เซอร์รอบนี้: ลิงก์ทั้ง 31 เส้นสูง **34px** ทุกความกว้าง
   → ต่ำกว่าเพดาน 10px · เป็นบั๊กชนิดเดียวกับที่ template-parts/home/discover.php
     เคยเจอแล้วแก้ไปแล้ว (ลิงก์ในประโยคสูง 18px → แยกเป็น .pm-link-cta 44px)
   ค่าฐานจึงเป็น 34px (ตามไฟล์ออกแบบ) แล้ว **ขยายเป็น 44px ที่ ≤1180px** ข้างล่าง
   ⛔ ห้ามลดกลับเป็น 34px ทุกความกว้างเพื่อให้ footer สั้นลง */
.pm-foot__link{
  display:flex; align-items:center;
  min-height:34px;
  font-size:var(--fs-small); line-height:1.3;
  color:var(--color-on-night-2);
  text-decoration:none;
  /* 🔴 border-bottom:0 ไม่ใช่ของเกิน — `:where(.pm-band--night,.on-night) a` (บรรทัด ~84)
     ใส่เส้นใต้ให้ **ลิงก์ทุกเส้นบนพื้นเข้ม** และ <footer> ของเราถือทั้งสองคลาสนั้น
     ผลที่เห็นจริงในเบราว์เซอร์ก่อนแก้: ลิงก์ 26 เส้นในกริดมีเส้นใต้เต็มความกว้างคอลัมน์
     (เพราะ .pm-foot__link เป็น display:flex กว้างเต็มช่อง ไม่ใช่กว้างเท่าตัวอักษร)
     = ตารางเส้นถี่ที่ไม่มีในไฟล์ออกแบบ และอ่านว่า "ตาราง" ไม่ใช่ "รายการลิงก์"
     ⛔ ห้ามแก้ที่กฎ :where() ข้างบน — มันถูกต้องสำหรับลิงก์ในเนื้อความบนแถบเข้ม
        คอมเมนต์ของมันอธิบายไว้แล้วว่าทำไมต้องมีน้ำหนัก (0,0,1) */
  border-bottom:0;
}
/* 🔴 14 ก.ย. 2026 — เอาเส้นใต้ตอน hover ออกตามคำสั่งเจ้าของงาน
   ⚠️ ทำไมถึงทำได้โดยไม่ตก WCAG 1.4.1 (สีต้องไม่ใช่สิ่งเดียวที่บอกว่านี่คือลิงก์):
      1.4.1 คุม "ลิงก์ที่ฝังอยู่ในเนื้อความ" ซึ่งต้องแยกออกจากตัวอักษรรอบ ๆ ให้ได้
      ลิงก์สองชุดนี้อยู่ใน **รายการนำทาง** ไม่มีข้อความอื่นปนในบรรทัดเดียวกัน
      ตำแหน่งและบริบทบอกว่าเป็นลิงก์อยู่แล้ว — เส้นใต้จึงไม่ใช่ตัวแบกเงื่อนไข
   ⛔ ห้ามเอา `:focus-visible` ออกตามไปด้วย — วงแหวนโฟกัสของ pm-base.css คือสิ่งที่
      คนใช้คีย์บอร์ดใช้หาตำแหน่ง (F-2) และมันคนละเรื่องกับ hover
   ⛔ ห้ามเอากฎ hover ทิ้งทั้งบรรทัด — ต้องเหลือการเปลี่ยนสีไว้เป็นสัญญาณว่า "กดได้" */
.pm-foot__link:hover{ color:var(--color-accent-field); }

/* ---- แถวชำระเงิน + เครื่องหมาย ---- */
.pm-foot__trust{
  display:flex; flex-wrap:wrap; gap:var(--s3) var(--s4);
  align-items:flex-start; justify-content:space-between;
  padding-bottom:var(--s3);
}
.pm-foot__pay{ display:flex; flex-direction:column; gap:var(--s1); }
.pm-foot__paylead{ display:flex; flex-wrap:wrap; align-items:center; gap:var(--s1); }
.pm-foot__chip{
  display:inline-flex; align-items:center;
  min-height:30px; padding:0 var(--s1);
  border:1px solid var(--color-line-night);             /* 3.51 ✅ — ปลดหนี้ B-3 ของ 6 ก.ย. */
  border-radius:var(--radius);
  font-size:var(--fs-label); letter-spacing:.04em;
  color:var(--color-on-night-2);
}
.pm-foot__paynote{ font-size:var(--fs-meta); line-height:1.45; color:var(--color-on-night-2); }

.pm-foot__marks{ display:flex; flex-wrap:wrap; align-items:flex-start; gap:var(--s2) var(--s3); }
.pm-foot__secure{
  display:inline-flex; align-items:center; gap:var(--s1);
  min-height:44px; font-size:var(--fs-meta); color:var(--color-on-night-2);
}
.pm-foot__ico{ flex:none; width:18px; height:18px; stroke:currentColor; }

/* ช่อง DBD — กรอบเส้นประคือสัญญาณว่า "ยังไม่ใช่ของจริง" ไม่ใช่การตกแต่ง
   ⛔ ห้ามเปลี่ยนเป็นเส้นทึบจนกว่า script ของ DBD จะเข้ามาแทนกล่องนี้จริง */
.pm-foot__dbd{
  display:inline-flex; align-items:center; gap:var(--s1);
  min-height:44px; padding:0 var(--s2);                 /* F-3 ✅ */
  border:1px dashed var(--color-line-night);            /* 3.51 ✅ */
  border-radius:var(--radius);
  font-size:var(--fs-label); letter-spacing:.04em;
  color:var(--color-on-night-2);
}

/* ---- disclaimer (D-3) + แถบกฎหมาย + บรรทัดลิขสิทธิ์ ---- */
.pm-foot__legalnote{
  border-top:1px solid var(--color-line-night);
  padding-block:var(--s2);
  display:flex; flex-direction:column; gap:var(--s1);
}
.pm-foot__legalnote p{
  font-size:var(--fs-label);                            /* 12.5px — B-4 ห้ามต่ำกว่า 12px */
  line-height:1.5;
  color:var(--color-on-night-2);                        /* 7.71 ✅ ไม่ใช่สีจาง ๆ ที่อ่านไม่ออก */
  max-width:var(--measure-prose);
}

/* 🔴 14 ก.ย. 2026 — เส้นคั่นเหนือแถบกฎหมาย **หายไปเพราะรอบที่แล้วเอา disclaimer ออก**
   เส้นในไฟล์ออกแบบเส้นนี้เคยถูกวาดด้วย `border-top` ของ `.pm-foot__legalnote`
   พอ markup ของ disclaimer ถูกลบ เส้นก็หายไปด้วยโดยไม่มีใครตั้งใจ
   → ย้ายเส้นมาไว้กับ `.pm-foot__legal` ซึ่งเป็นกล่องที่ **อยู่เสมอ** ไม่ผูกกับ disclaimer
   ⛔ ห้ามลบ border-top ของ .pm-foot__legalnote ทิ้ง — วันที่ disclaimer กลับมา
      มันต้องมีเส้นของตัวเอง และกฎ sibling ข้างล่างจะกันไม่ให้เส้นซ้อนกันสองเส้นเอง */
.pm-foot__legal{
  border-top:1px solid var(--color-line-night);
  padding-top:var(--s2);
}
/* ถ้า disclaimer กลับมา เส้นจะเป็นของ .pm-foot__legalnote แทน — ตัวล่างต้องไม่วาดซ้ำ */
.pm-foot__legalnote + .pm-foot__legal{ border-top:0; padding-top:0; }

.pm-foot__legallist{
  list-style:none; margin:0; padding:0;
  display:flex; flex-wrap:wrap; gap:0 var(--s3);
}
.pm-foot__legallist a{
  display:inline-flex; align-items:center;
  min-height:34px;
  font-size:var(--fs-meta);
  color:var(--color-on-night-2);
  text-decoration:none;
  border-bottom:0;                  /* เหตุผลเดียวกับ .pm-foot__link ข้างบน */
}
.pm-foot__legallist a:hover{ color:var(--color-accent-field); }   /* เหตุผลเดียวกับ .pm-foot__link:hover ข้างบน */

.pm-foot__base{ padding-block:var(--s1) var(--s4); }
.pm-foot__copy{
  font-size:var(--fs-label); line-height:1.6;
  letter-spacing:.04em;
  color:var(--color-on-night-2);
}

/* ============================================================
   จุดสลับของ footer
   เลขทั้งสามมาจากไฟล์ออกแบบตรง ๆ (1100 / 900 / 640) — โครงของ footer
   ไม่มีแถวแนวนอนยาว ๆ แบบแถบเมนู จึงไม่ต้องเลื่อนจุดสลับแบบที่ header ต้องทำ
   ============================================================ */
/* 🔴 F-3 — เป้ากด 44px บนทุกความกว้างที่ถือว่าเป็นจอสัมผัส
   ใช้ **1180px** ซึ่งเป็นจุดเดียวกับที่แถบเมนูสลับเป็นลิ้นชักมือถือ (ดูบล็อก header ข้างบน)
   ไม่ได้เลือกเลขใหม่ — มีเลขนี้ในธีมอยู่แล้ว การมีจุดสลับสองค่าคือของที่ลืมแก้ในอนาคต
   ⚠️ ราคาที่จ่าย: ที่ 375px footer สูงขึ้นจาก 1834px เป็นประมาณ 2150px
      เพราะเมนูมี 26 ลิงก์เรียงเดี่ยว — ถ้าเจ้าของงานรับไม่ได้ ทางแก้คือ
      **ลดจำนวนรายการในเมนู** ไม่ใช่ลดความสูงของเป้ากด */
@media (max-width:1180px){
  .pm-foot__link,
  .pm-foot__legallist a{ min-height:44px; }
}

@media (max-width:1100px){
  .pm-foot__grid{ grid-template-columns:1fr; }
  .pm-foot__cols{ grid-template-columns:repeat(2,1fr); }
}

@media (max-width:900px){
  .pm-footcta__box,
  .pm-news__box{ grid-template-columns:1fr; }
  .pm-footcta__actions{ justify-content:flex-start; }
  /* แถวเครื่องหมายเป็น 3 กลุ่ม — space-between แยกมันผิดที่ทันทีที่ขึ้นบรรทัดใหม่ */
  .pm-foot__trust{ flex-direction:column; justify-content:flex-start; }
}

@media (max-width:640px){
  .pm-foot__cols{ grid-template-columns:1fr; }
}

@media (max-width:520px){
  .pm-foot__marks{ flex-direction:column; }
}

/* =============================================================================
   ระบบราคา — ที่เดียวของทั้งหน้าที่ตั้งขนาดตัวเลขราคา
   เพิ่ม 15 ก.ย. 2026 (รอบที่ 11) ตามคำสั่ง "ราคาทั้งหน้าให้เป็นระบบเดียวกันเลย"

   🔴 ก่อนแก้ ราคาบนหน้าเดียวกันมี **4 ขนาด** และไม่มีที่ไหนอ้างอิงกันเลย:
       §6 การ์ดสินค้า `.pm-prodcard__now`  18px  display 400
       §4 ราคาเริ่มต้น `.pm-layer__priceval` 21px  **600**
       §1 สไลด์ 2      `.pm-slide__setprice` 34px  display 400
       §5 ชุด ritual   `.pm-ritual__now`     34px  display 400
     แต่ละค่าถูกตั้งไว้คนละที่ในไฟล์นี้ ใครแก้ที่หนึ่งจึงไม่มีทางรู้ว่าอีกสามที่ยังไม่ตรง

   ค่าอ้างอิง: **WooCommerce ของจริงบน staging** — การ์ดสินค้าบนหน้า archive `/shop/` = **18px**
   ซึ่งตรงกับ `--fs-deck` ที่มีอยู่ในสเกลอยู่แล้ว (ไม่ได้เพิ่มค่าใหม่ · ไม่เขียน px ตรง ๆ · B-4)

   ⛔⛔ **ห้ามตั้ง font-size / font-family / font-weight ให้ตัวเลขราคาที่อื่นอีก**
        ต้องเพิ่ม selector เข้ามาในรายการนี้เท่านั้น มิฉะนั้นจะกลับไปเป็น 4 ขนาดเหมือนเดิม
   ⛔ **สีไม่ได้อยู่ในบล็อกนี้โดยเจตนา** — ราคาบนพื้นเข้ม (§1 · §5) กับพื้นสว่าง (§4 · §6) ใช้คนละสี
      สีจึงยังอยู่กับ section ของมัน · ระบบนี้คุมเฉพาะ "รูปทรงของตัวเลข"
   ⛔ **ป้ายและหมายเหตุรอบราคาไม่อยู่ในระบบนี้** — `Starts at` · `Save $16` · `Bought separately`
      เป็น "ป้าย" ไม่ใช่ "ราคา" · มันต่างจากราคาด้วย **สีและตัวพิมพ์** ไม่ใช่ขนาด
      ⛔ ห้ามดึงมันเข้ามาที่นี่เพื่อให้ "เท่ากันหมด" — ป้ายขนาดเท่าราคาจะแย่งน้ำหนักสายตาจากราคา
   ============================================================================= */
.pm-prodcard__now,
.pm-prodcard__from,
.pm-prodcard__to,
.pm-layer__priceval,
.pm-slide__setprice,
.pm-ritual__now{
  font-family:var(--font-display);
  font-weight:400;
  font-size:var(--fs-deck);
  line-height:1.2;
}

/* ============================================================
   หน้า Shop — ตัวกรองแนวตั้ง · แถบเรียง · การ์ดหมวดท้ายหน้า
   เพิ่ม 16 ก.ย. 2026 · รายงาน docs/report-shop-2026-09-16.md
   ⛔ ไม่มีค่า hex ในบล็อกนี้แม้แต่ค่าเดียว — ทุกสีมาจาก pm-tokens.css (B-1)
   ============================================================ */

.pm-shopside__block + .pm-shopside__block{
  border-top:1px solid var(--color-line); padding-top:var(--s3);
}

/* ---- รายการหมวดแนวตั้ง ---- */
.pm-catlist{ display:flex; flex-direction:column; gap:2px; margin-top:var(--s2); }
.pm-catlist__item{
  display:flex; align-items:center; justify-content:space-between; gap:var(--s1);
  min-height:44px;                      /* F-3 ✅ เป้ากดขั้นต่ำ */
  padding:var(--s1) var(--s2);
  border-radius:var(--radius);
  font-size:var(--fs-small); font-weight:500; line-height:1.2;
  color:var(--color-ink); text-decoration:none; border-bottom:0;
}
.pm-catlist__item:hover{ background:var(--color-surface); color:var(--color-brand-ink); }
.pm-catlist__item:focus-visible{ outline:2px solid var(--color-brand-ink); outline-offset:2px; }

/* สถานะที่เลือก — คลาสตัวเดียวกับที่ pm-catfilter.js สลับให้ (pm-chip--selected)
   ⛔ ห้ามเปลี่ยนชื่อคลาสนี้โดยไม่แก้ pm-catfilter.js พร้อมกัน */
.pm-catlist__item.pm-chip--selected{
  background:var(--color-brand); color:var(--color-on-night);
}
.pm-catlist__item.pm-chip--selected:hover{ color:var(--color-on-night); }
.pm-catlist__item.pm-chip--selected .pm-chip__count{ color:var(--color-on-night-3); }

/* ---- การ์ดพาไป Shop by Goal ---- */
.pm-shopside__promo{ display:flex; flex-direction:column; gap:var(--s2); align-items:flex-start; }
.pm-shopside__promotitle{ margin:0; }

/* ---- แถบบนกริด: จำนวน + ปุ่มเรียง ---- */
.pm-shopbar{
  display:flex; align-items:center; justify-content:space-between;
  gap:var(--s3); flex-wrap:wrap;
  padding-bottom:var(--s2); margin-bottom:var(--s3);
  border-bottom:1px solid var(--color-line);
}
.pm-shopbar__count{ margin:0; }
.pm-shopbar__sorts{ display:flex; gap:var(--s1); flex-wrap:wrap; }
.pm-shopbar__sorts .pm-chip:focus-visible{ outline:2px solid var(--color-brand-ink); outline-offset:3px; }

/* ---- แถบ "How the catalogue is organised" ----
   ⚠️ **ไม่ใช้ .pm-band--brand** เพราะ .pm-band มี padding-block:var(--s8) = แถบเต็มความกว้าง
   ส่วนไฟล์ออกแบบวางกล่องนี้ **ไว้ในกรอบ container** พร้อม padding 48px รอบด้าน */
.pm-shopranges__band{
  background:var(--color-brand); color:var(--color-on-night);
  border-radius:var(--radius); padding:var(--s5);
}
.pm-shopranges__band h2{ color:var(--color-on-night); }   /* 5.20 บน brand ✅ */
@media(max-width:680px){ .pm-shopranges__band{ padding:var(--s4); } }

/* 🔴 **แก้ 16 ก.ย. 2026 หลังคำนวณ contrast จริง — เคยเขียนผิดมาก่อน**
   ของเดิมทำการ์ดเป็นกล่องโปร่งแสง (--color-night-card) วางบนพื้น brand แล้วย้อม
   ตัวหนังสือด้วย --color-on-night-2 / --color-on-night-3 โดยลอกคอมเมนต์ "7.71 ✅ / 7.10 ✅"
   มาจาก .pm-card--night ด้วย
   ⚠️ **ตัวเลขสองตัวนั้นวัดบน --color-night ไม่ใช่บน --color-brand**
      วัดจริงบนพื้น brand ที่ผสม night-card แล้ว: on-night-2 = **2.83** · on-night-3 = **2.60**
      → ตกทั้งคู่ (ต้อง ≥ 4.5) เป็นการอ้างตัวเลขผิดที่ ไม่ใช่แค่สีไม่สวย
   ✅ ทางแก้: **เลิกประดิษฐ์พื้นผิวใหม่** ปล่อยให้ .pm-card--night เป็นคนให้พื้น (--color-night)
      ซึ่งเป็นคู่สีที่ถูกวัดและรับรองไว้แล้วทั้งชุด → 7.10 / 7.71 กลับมาเป็นจริงตามที่เขียน
   ⛔ ห้ามใส่ background ทับ .pm-shoprange อีก โดยไม่คำนวณ contrast ของคู่สีใหม่ทั้งชุด */
.pm-shoprange{
  display:flex; flex-direction:column; gap:var(--s1);
  padding:var(--s3); text-decoration:none; border-bottom:0;
}
.pm-shoprange:hover{ border-color:var(--color-on-night-3); }
.pm-shoprange:focus-visible{ outline:2px solid var(--color-on-night); outline-offset:3px; }
.pm-shoprange__name{ color:var(--color-on-night); margin:0; }
.pm-shoprange__num{ margin:0; }
/* จำนวนสินค้าถูกดันไปติดขอบล่างเสมอ → การ์ดทั้ง 4 ใบมีบรรทัดนี้ตรงกันแม้ชื่อหมวดยาวไม่เท่ากัน */
.pm-shoprange__count{ margin:auto 0 0; padding-top:var(--s2); }

/* ---- ตัวเลือกขนาดบนการ์ดสินค้า (หน้า Shop) ----
   เพิ่ม 16 ก.ย. 2026 (รอบที่ 2) · คำสั่ง "ปรับให้เห็นว่ามีตัวเลือกขนาดนะ"
   ⛔ ไม่มีค่า hex ในบล็อกนี้ — ทุกสีมาจาก pm-tokens.css (B-1)

   🔴 ชิปพวกนี้ **ไม่ใช่ control** — เป็น <span> ในการ์ดที่ทั้งใบเป็นลิงก์อยู่แล้ว
      จึง **ไม่ต้องมี** min-height 44px ตาม F-3 (F-3 คุมเป้าที่กดได้ ไม่ใช่ข้อความ)
      ⛔ วันไหนทำให้มันกดได้จริง ต้องกลับมาใส่ 44px และแก้เรื่อง <a> ซ้อนใน .pm-card--link ด้วย */
.pm-sizes{ margin:0; }
.pm-sizes__label{
  margin:0 0 var(--s1);
  font-size:var(--fs-label); line-height:1.2; font-weight:500;
  text-transform:uppercase; letter-spacing:.12em;
  color:var(--color-ink-muted);
}
.pm-sizes__list{
  list-style:none; margin:0; padding:0;
  display:flex; flex-wrap:wrap; gap:var(--s1);
}
/* แต่ละชิป = ขนาดหนึ่ง + ราคาของขนาดนั้น
   ราคาต่อขนาดต่างกันมากของจริง (15 g = $45 · 40 g = $110) การซ่อนไว้จึงเสียข้อมูลที่คนใช้ตัดสินใจ */
.pm-size{
  display:inline-flex; align-items:baseline; gap:6px;
  border:1px solid var(--color-line-strong);   /* 3.07 — ขอบ control */
  border-radius:var(--radius);
  padding:5px 10px;
  font-size:var(--fs-meta); line-height:1.3;
  color:var(--color-ink);
  background:var(--color-surface);
}
.pm-size__label{ font-weight:600; }
.pm-size__price{ color:var(--color-ink-muted); }

/* ขนาดที่หมด — ⛔ ห้ามสื่อด้วยสีอย่างเดียว ต้องมีข้อความกำกับด้วย (F-5 · ตาบอดสี)
   ข้อความ "Out of stock" จึงอยู่ในชิปจริง ไม่ได้ทำเป็นแค่สีจาง */
.pm-size--out{ border-style:dashed; background:transparent; }
.pm-size--out .pm-size__label,
.pm-size--out .pm-size__price{ color:var(--color-ink-muted); }
.pm-size__out{
  font-size:var(--fs-label); text-transform:uppercase; letter-spacing:.08em;
  color:var(--color-ink-muted);
}

/* ============================================================
   ตะกร้า + ลิ้นชักตะกร้า (16 ก.ย. 2026)
   ที่มา: `Case A - Cart.dc.html` + ลิ้นชักใน `CaseANav.dc.html`
   รายงาน: docs/report-cart-minicart-2026-09-16.md
   ⛔ ไม่มีค่า hex ในบล็อกนี้ — ทุกสีมาจาก pm-tokens.css (B-1)
   ============================================================ */

/* ---- ฟิลด์ทั่วไป (ใช้ทั้งคูปองหน้าตะกร้าและคูปองในลิ้นชัก) ---- */
.pm-field__label{
  display:block;
  font-size:var(--fs-label); line-height:1.3;
  letter-spacing:.06em; text-transform:uppercase;
  color:var(--color-ink-muted);
  margin-bottom:var(--s1);
}
.pm-input{
  min-height:46px;                              /* F-3 ≥ 44px */
  padding:0 var(--s2);
  background:var(--color-surface);
  border:1px solid var(--color-line-strong);    /* 3.07 — ขอบ control ✅ */
  border-radius:var(--radius);
  font-family:inherit; font-size:var(--fs-small);
  color:var(--color-ink);
}

/* ============================================================
   1) รายการสินค้าในตะกร้า
   🔴 ต้นฉบับเป็น <table> และ **ยังเป็น <table> อยู่** — ดูเหตุผลที่หัวไฟล์
      woocommerce/cart/cart.php · ที่นี่แค่เปลี่ยน display ให้เป็นการ์ด
      role="table"/"row"/"cell" ใน PHP เป็นตัวรักษา a11y tree ที่ display ทำหาย
   ============================================================ */
/* 🔴 `tr` **ไม่อยู่** ในรายการรีเซ็ตนี้โดยเจตนา
   `.pm-cartlist tr` มีความจำเพาะ (0,1,1) ซึ่ง **ชนะ** `.pm-cartline` (0,1,0)
   ถ้าใส่ tr ตรงนี้ display:block จะทับ display:grid ข้างล่างจนแถวไม่เป็นกริด
   (เจอจริงตอนตรวจ preview รอบแรก 16 ก.ย. — ภาพสินค้าเบ่งเต็มคอลัมน์)
   แถวที่ไม่ใช่ .pm-cartline (แถวปุ่มท้ายตาราง) จัดการที่ .pm-cart__actions เอง */
.pm-cartlist,
.pm-cartlist tbody,
.pm-cartlist td{ display:block; width:auto; }
.pm-cartlist > tbody > tr{ display:block; width:auto; }
.pm-cartlist{
  border:1px solid var(--color-line);
  /* artboard: มุม 22px · padding 14px 30px 24px (16 ก.ย. 2026 — ปรับให้ตรง artboard)
     ใช้ --s2/--s4/--s3 = 16/32/24 ต่างจาก artboard 2px ต่อด้าน **เพื่ออยู่บนสเกลระยะห่าง** */
  border-radius:var(--radius-xl);
  background:var(--color-surface);
  padding:var(--s2) var(--s4) var(--s3);
  margin:0;
}

/* ต้องมี .pm-cartlist นำหน้าให้ความจำเพาะ (0,2,1) ชนะบล็อกรีเซ็ตข้างบน (0,1,1) */
.pm-cartlist > tbody > tr.pm-cartline{
  display:grid;
  grid-template-columns:92px auto minmax(0,1fr) auto;
  column-gap:var(--s3); row-gap:var(--s2);
  align-items:start;
  padding-block:var(--s3);
  border-top:1px solid var(--color-line);
}
.pm-cartline .product-thumbnail{ grid-column:1; grid-row:1 / span 2; }
.pm-cartline .product-name    { grid-column:2 / 4; grid-row:1; }
.pm-cartline .product-subtotal{ grid-column:4; grid-row:1; text-align:right; }
.pm-cartline .product-quantity{ grid-column:2; grid-row:2; }
.pm-cartline .product-remove  { grid-column:3; grid-row:2; align-self:center; }
.pm-cartline .product-price   { grid-column:4; grid-row:2; text-align:right; }

/* 🔴 `.pm-media` เป็น <span> ที่นี่ (อยู่ใน <td>) → ค่าเริ่มต้นเป็น inline ซึ่งรับ width ไม่ได้
   ต้องบังคับ display:block เอง ไม่งั้นภาพเบ่งเต็มคอลัมน์ (เจอจริงตอนตรวจ preview 16 ก.ย.) */
/* ⛔ ห้ามแก้ `.pm-media` ตัวกลางที่ pm-layout.css — Home/Shop ใช้ร่วมกันและยังเป็นมุม 2px
   artboard ของตะกร้าใช้ 12px · --radius-sm (10px) เป็นขั้นที่ใกล้ที่สุดในชุดที่มีอยู่ */
.pm-cartline .pm-media{ display:block; width:92px; border-radius:var(--radius-sm); }
.pm-cartline .product-name a{
  font-family:var(--font-display);
  font-size:var(--fs-d6); line-height:1.2;
  color:var(--color-brand-ink); text-decoration:none;
}
.pm-cartline .product-name a:hover{ text-decoration:underline; }
/* meta ของ variation ที่ WooCommerce พ่นออกมา (wc_get_formatted_cart_item_data) */
.pm-cartline .variation{
  margin:var(--s1) 0 0;
  font-size:var(--fs-meta); color:var(--color-ink-muted);
}
.pm-cartline .variation dt,
.pm-cartline .variation dd{ display:inline; margin:0; }
.pm-cartline .variation dd{ margin-right:var(--s1); }

.pm-cartline .product-subtotal{ font-size:var(--fs-h5); font-weight:600; color:var(--color-ink); }
.pm-cartline .product-price   { font-size:var(--fs-meta); color:var(--color-ink-muted); }

.pm-cartline__remove{
  display:inline-flex; align-items:center;
  min-height:44px;                              /* F-3 */
  font-size:var(--fs-meta); color:var(--color-ink-muted);
  text-decoration:underline;
}
.pm-cartline__remove:hover{ color:var(--color-brand-ink); }

/* ============================================================
   ตัวปรับจำนวน  −  N  +  (16 ก.ย. 2026 · คำสั่ง "ทำเป็น - 1 + แบบ ux ui สวย ๆ")

   🔴 ปุ่มมาใน HTML ตั้งแต่แรก ไม่ได้ถูก JS ฉีดเข้ามาอีกแล้ว
      ของเดิม (pm-cart.js) ฉีดทีหลัง → ปิด JS ไม่มีปุ่ม และต่อให้เปิด JS ปุ่มก็มาช้า
      จนคนไม่ทันเห็นว่ากดได้ ซึ่งเป็นสิ่งที่เจ้าของงานทักมา
   ⛔ ห้ามทำให้ปุ่มดูจางจนเหมือนกดไม่ได้ — ทั้งชุดต้องอ่านออกว่าเป็นปุ่มตั้งแต่แรกเห็น
   ============================================================ */
.pm-qty{
  display:inline-flex; align-items:center;
  border:1px solid var(--color-line-strong);   /* 3.07 — ขอบ control ✅ */
  /* artboard ใช้ขอบสีอ่อนกว่านี้ (1.82) ซึ่งตกเกณฑ์ขอบ control (F-1)
     → คง token เดิมตามมติ "ก" ของรอบ checkout
     ⛔ ปุ่มยังต้อง 44×44 ห้ามลดลงตาม padding 7px/14px ของ artboard (F-3)
     🔴 **ความมนอยู่ที่นี่ไม่ได้** — ตัวปรับจำนวนตัวนี้ถูกใช้ใน **ลิ้นชักตะกร้า** ด้วย
        (`pm_qty_stepper()` ที่ inc/cart-content.php · ลิ้นชักอยู่ใน header.php = โผล่ทุกหน้า)
        ถ้าทำให้มนที่นี่ Home/Shop จะเปลี่ยนตามทันทีโดยไม่ได้ตรวจ ซึ่งเป็นสิ่งที่
        คอมเมนต์ของ --radius:2px ใน pm-tokens.css ห้ามไว้ตรง ๆ → ดูกฎ .pm-cart .pm-qty ข้างล่าง */
  border-radius:var(--radius);
  background:var(--color-surface);
  overflow:hidden;
}
/* มุมกลมตาม artboard — **เฉพาะบนหน้าตะกร้า** · ลิ้นชักยังเหลี่ยม 2px เหมือน Home/Shop
   (0,2,0) ชนะกฎข้างบน (0,1,0) · ลิ้นชักอยู่นอก <main class="pm-cart"> จึงไม่โดน */
.pm-cart .pm-qty{ border-radius:var(--radius-pill); }
.pm-qty__btn{
  width:44px; height:44px;                     /* F-3 ✅ */
  display:inline-flex; align-items:center; justify-content:center;
  background:transparent; border:0;
  font-family:var(--font-body); font-size:var(--fs-h5); font-weight:600; line-height:1;
  color:var(--color-brand-ink); cursor:pointer;
}
.pm-qty__btn:hover:not(:disabled){ background:var(--color-shade); color:var(--color-ink); }
/* ปุ่มที่กดไม่ได้จริง ๆ (จำนวน = 1 หรือชนเพดานสต็อก) — PHP เป็นคนตั้ง ไม่ใช่ JS */
.pm-qty__btn:disabled{ color:var(--color-ink-muted); cursor:default; }
/* ระหว่างรอเซิร์ฟเวอร์ตอบ — กันกดซ้ำ
   ⛔ **ห้ามใช้ opacity บอกสถานะ** — เคยทำแล้วตัวอักษรตกต่ำกว่า 4.5:1 (B-3)
      ดูบทเรียนใน docs/report-cart-minicart-2026-09-16.md §3.4 ข้อ 2 */
.pm-qty__btn.is-busy{ pointer-events:none; }
.pm-qty[aria-busy="true"]{ border-color:var(--color-accent); }

.pm-qty__num{
  width:48px; height:44px;
  border:0; border-inline:1px solid var(--color-line);
  background:transparent;
  font-family:var(--font-body); font-size:var(--fs-small); text-align:center;
  color:var(--color-ink);
  font-variant-numeric:tabular-nums;
  -moz-appearance:textfield; appearance:textfield;
}
/* ปุ่มลูกศรของ input[type=number] ซ้ำซ้อนกับปุ่ม − + ที่เราวาดเอง และเล็กกว่า 44px */
.pm-qty__num::-webkit-outer-spin-button,
.pm-qty__num::-webkit-inner-spin-button{ -webkit-appearance:none; margin:0; }

/* สินค้าที่ตั้งว่าซื้อได้ชิ้นเดียว — ไม่มีปุ่มให้กด แสดงเลขเฉย ๆ */
.pm-qty--fixed{
  margin:0; min-height:44px;
  display:inline-flex; align-items:center;
  font-size:var(--fs-small); color:var(--color-ink-body);
}

/* ---- แถวปุ่มท้ายรายการ ---- */
/* 🔴 ต้องมี selector ยาวเท่าบล็อกรีเซ็ต `.pm-cartlist td` (0,1,1) ไม่งั้นแพ้ display:block
   นี่คือกับดักความจำเพาะตัวเดียวกับที่เจอกับ .pm-cartline และกฎมือถือ — **จุดที่สาม**
   ⛔ อาการเวลาพลาด: ไม่ error ไม่มีอะไรฟ้อง แค่ flex ไม่ทำงาน แล้วช่องคูปองยืดเต็มแถว */
.pm-cartlist > tbody > tr > td.pm-cart__actions{
  display:flex; flex-wrap:wrap; align-items:flex-end; gap:var(--s3);
  padding-block:var(--s3) 0;
  border-top:1px solid var(--color-line);
}
/* 🔴 ห้ามใช้ flex:1 — ช่องคูปองจะยืดจนดัน "Update cart" ตกบรรทัดใหม่ทุกครั้ง
   (เจอจริงตอนตรวจ preview 16 ก.ย.) · ให้กว้างคงที่แล้วปล่อยที่ว่างไว้ทางขวา */
.pm-cart__coupon{ flex:0 1 380px; min-width:0; }
.pm-cart__couponrow{ display:flex; gap:var(--s1); }
.pm-cart__couponrow .pm-input{ flex:1; min-width:0; }
/* 🔴 ปุ่ม "Update cart" ยังอยู่เสมอ — เป็นทางของคนที่พิมพ์เลขเองแล้วไม่มี JS
   ⛔ ห้ามซ่อนด้วย display:none และ **ห้ามหรี่ด้วย opacity**
      (เคยใส่ opacity:.55 แล้วตัวอักษรตกเหลือ ~3.4:1 ไม่ผ่าน B-3 — รายงาน §3.4 ข้อ 2) */

/* ---- แถวท้ายการ์ด — "Keep shopping" (16 ก.ย. 2026 · ย้ายเข้ามาในการ์ดตาม artboard) ----
   🔴 ต้องเขียน selector ให้ยาวเท่าบล็อกรีเซ็ต `.pm-cartlist td` (0,1,1) ไม่งั้นแพ้ display:block
      — **กับดักความจำเพาะตัวเดียวกับ .pm-cartline · .pm-cart__actions · กฎมือถือ (จุดที่สี่)** */
.pm-cartlist > tbody > tr > td.pm-cart__foot{
  display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between; gap:var(--s2);
  padding-block:var(--s3) 0;
  border-top:1px solid var(--color-line);
}
/* margin-top เดิมมีไว้ตอนลิงก์ลอยอยู่ใต้การ์ด — ตอนนี้แถวเป็นคนคุมระยะเอง */
.pm-cart__back{ margin:0; font-size:var(--fs-small); font-weight:600; }

.pm-cart__empty{
  border:1px solid var(--color-line);
  border-radius:var(--radius-xl);   /* การ์ดหลักใบเดียวกันของหน้านี้ */
  background:var(--color-surface);
  padding:var(--s6) var(--s4);
  text-align:center;
}
.pm-cart__emptytitle{
  font-family:var(--font-display); font-size:var(--fs-d4);
  color:var(--color-brand-ink); margin:0 0 var(--s3);
}

@media(max-width:700px){
  /* 🔴 16 ก.ย. 2026 — บรรทัดนี้ **ไม่เคยมีผลเลย** ตั้งแต่วันที่เขียน
     ชั้นที่ทับ CSS ของ Woo (`.pm-cart table.shop_table.pm-cartlist` = 0,3,2)
     ประกาศ padding แบบย่อทั้งก้อน จึงชนะ (0,1,0) ตัวนี้ทุกครั้ง
     ⛔ media query ไม่เพิ่มความจำเพาะ — ต้องเขียน selector ให้ยาวเท่ากันเท่านั้น
     🔴 และต่อให้เขียนยาวเท่ากัน **ที่นี่ก็ยังแพ้** เพราะความจำเพาะเท่ากันแล้วตัวที่อยู่
        ท้ายไฟล์ชนะ — บล็อกที่ทับ CSS ของ Woo อยู่ล่างกว่าบรรทัดนี้ราว 300 บรรทัด
        → ตัวที่ชนะจริงถูกวางไว้ท้ายบล็อกนั้นแทน (ค้นหา "padding มือถือของการ์ดรายการ")
     เก็บบรรทัดเดิมไว้ให้เห็นที่มา */
  .pm-cartlist{ padding-inline:var(--s3); }
  /* 🔴 ความจำเพาะต้องเท่ากับกฎเดสก์ท็อป (0,2,1) — media query ไม่ได้เพิ่มความจำเพาะให้
     เขียนสั้นเป็น .pm-cartline เฉย ๆ = (0,1,0) จะแพ้และคอลัมน์ไม่เปลี่ยนที่จอเล็ก */
  .pm-cartlist > tbody > tr.pm-cartline{ grid-template-columns:76px minmax(0,1fr); column-gap:var(--s2); }
  .pm-cartline .product-thumbnail{ grid-column:1; grid-row:1 / -1; }
  .pm-cartline .product-name    { grid-column:2; grid-row:1; }
  .pm-cartline .product-subtotal{ grid-column:2; grid-row:2; text-align:left; }
  .pm-cartline .product-price   { grid-column:2; grid-row:3; text-align:left; }
  .pm-cartline .product-quantity{ grid-column:2; grid-row:4; }
  .pm-cartline .product-remove  { grid-column:2; grid-row:5; justify-self:start; }
  .pm-cartline .pm-media{ width:76px; }
}

/* ============================================================
   2) การ์ดสรุปยอด
   🔴 พื้นเข้ม = --color-night · ไฟล์ออกแบบใช้ gradient ที่ยังไม่มี token (ดู cart-totals.php)
   ============================================================ */
.pm-summary{
  /* 16 ก.ย. 2026 — ใช้ gradient ตาม artboard ได้แล้ว เพราะวัด contrast ปลายอ่อนครบทุกคู่
     (ดูตารางที่หัวบล็อก --color-night-2 ใน pm-tokens.css)
     ⛔ ห้ามสลับลำดับสองสีนี้ — ปลายอ่อนต้องอยู่มุมบนซ้ายตาม artboard
     🔴 ตัวสำรองให้เบราว์เซอร์ที่ไม่รู้จัก gradient คือ --color-night (ปลายเข้ม = คู่ที่ contrast สูงกว่า) */
  background:var(--color-night);
  background-image:linear-gradient(160deg,var(--color-night-2),var(--color-night));
  color:var(--color-on-night);
  border-radius:var(--radius-xl);
  padding:var(--s4);
}
.pm-summary__eyebrow{
  margin:0 0 var(--s3);
  font-size:var(--fs-label); letter-spacing:.24em; text-transform:uppercase;
  font-weight:600; color:var(--color-gold);   /* 8.06 บนปลายเข้ม · 6.49 บนปลายอ่อน ✅ */
}
.pm-summary__table,
.pm-summary__table tbody,
.pm-summary__table tr,
.pm-summary__table th,
.pm-summary__table td{ display:block; width:auto; }
.pm-summary__table{ margin:0; border:0; }
.pm-summary__table tr{
  display:flex; align-items:baseline; justify-content:space-between; gap:var(--s2);
  padding-block:var(--s1);
}
.pm-summary__table th{
  font-weight:400; text-align:left;
  font-size:var(--fs-small); color:var(--color-on-night-2);   /* 7.71 ✅ */
}
.pm-summary__table td{ text-align:right; font-size:var(--fs-small); }
.pm-summary__table .amount{ font-variant-numeric:tabular-nums; }

.pm-summary .cart-discount td{ color:var(--color-gold); }

/* ── วิธีจัดส่งในการ์ดสรุปยอด ─────────────────────────────────────────────────
   🔴 เขียนใหม่ทั้งบล็อก 17 ก.ย. 2026 — ของเดิม (16 ก.ย.) ตั้งไว้ตอนที่ร้าน
      **มีวิธีส่งเดียว** WooCommerce จึงพ่นเป็น hidden input + ข้อความล้วน
      กฎเดิมมีแค่ `#shipping_method{text-align:right}` + `label{display:block}`
   ⛔ พอรอบกฎค่าส่ง (17 ก.ย.) ทำให้มี **2 ตัวเลือกจริง** โครงเดิมพังทันที:
      radio ตัวจริงโดนกฎฟอร์มของธีมแม่ยืดเป็น **229×48** (กว้างเต็มคอลัมน์)
      → วงกลมยักษ์ลอยคนละบรรทัดกับป้าย · ข้อความชิดขวาอ่านไม่ออก
      (ภาพจากเจ้าของงาน 17 ก.ย. · docs/report-cart-shipping-select-2026-09-17.md)
   ✅ หน้าตาใหม่ = การ์ด radio ชุดเดียวกับหน้า checkout (`.pm-review #shipping_method`)
      แต่ย้อมด้วย token พื้นเข้ม เพราะการ์ดสรุปยอดเป็น gradient night
   ⛔ ห้ามตัดป้ายด้วย text-overflow:ellipsis — เป็นข้อมูลราคาที่ลูกค้าต้องอ่านครบ
      ป้ายมาจากปลั๊กอินค่าส่ง ยาวสั้นเปลี่ยนเมื่อไรก็ได้ (เคยยาว 4 บรรทัด)
   ⛔ **ไม่ผูก `#pm-main` เหมือนฝั่ง checkout** — ไฟล์ preview ของตะกร้ามี <main> สามอัน
      (สามสถานะในหน้าเดียว) จะใส่ id ซ้ำกันไม่ได้ · ใช้ `.pm-cart` ที่ <main> แทน
   🔴 **ทุก selector ในบล็อกนี้ต้องเป็น `.pm-cart .pm-summary ul#shipping_method li …`**
      ไม่ใช่ `.pm-summary #shipping_method …` เฉย ๆ — `woocommerce.css` มี
          `.woocommerce ul#shipping_method li label{ display:inline }`  = (1,1,2)
      ซึ่ง **หนักกว่า** `.pm-summary #shipping_method label` = (1,1,1) → label ไม่ยอมเป็น flex
      แล้วราคา/คำว่า Free ก็ไม่ไปชิดขวา (เห็นตอนวัดจริง ไม่เห็นตอนอ่านโค้ด)
      แบบปัจจุบัน = (1,2,3) ชนะขาด ไม่ต้องพึ่งลำดับการโหลดไฟล์
   ───────────────────────────────────────────────────────────────────────── */
/* แถวนี้เลิกเป็น "หัวข้อซ้าย / ค่าขวา" — ตัวเลือกต้องได้ความกว้างเต็มการ์ด */
.pm-cart .pm-summary__table tr.woocommerce-shipping-totals{ display:block; padding-block:var(--s2); }
.pm-cart .pm-summary tr.woocommerce-shipping-totals th{
  display:block; margin:0 0 var(--s1); text-align:left;
  font-size:var(--fs-label); font-weight:600; letter-spacing:.14em; text-transform:uppercase;
  color:var(--color-on-night-2);               /* 7.71 บนปลายเข้ม · 6.21 บนปลายอ่อน ✅ */
}
.pm-cart .pm-summary tr.woocommerce-shipping-totals td{ display:block; text-align:left; min-width:0; }
.pm-cart .pm-summary ul#shipping_method{
  list-style:none; margin:0; padding:0; min-width:0; text-align:left;
  display:flex; flex-direction:column; gap:var(--s1);
}
/* 🔴 โครงของ WooCommerce คือ `<li><input><label></li>` — input เป็น **พี่น้อง** ของ label
   ตัว flex จึงต้องอยู่ที่ li ไม่ใช่ที่ label (บทเรียนเดียวกับหน้า checkout 16 ก.ย.) */
.pm-cart .pm-summary ul#shipping_method li{
  display:flex; align-items:center; gap:var(--s2); min-width:0; margin:0;
  padding:var(--s1) var(--s2);
  border:1px solid var(--color-line-night);
  border-radius:var(--radius-md);              /* artboard 14px */
  background:var(--color-night-card);
}
/* ⛔ ต้องกำหนดขนาด radio เอง — กฎฟอร์มของธีมแม่ให้ input ทุกตัวกว้างเต็มคอลัมน์และสูง 48px
   วัดจริงก่อนแก้ 229×48 · หลังแก้ 18×18 · ไม่ต้องใช้ !important เพราะสองไอดีชนะแล้ว (C-7) */
.pm-cart .pm-summary ul#shipping_method li input[type="radio"]{
  width:18px; height:18px; min-width:18px; min-height:0; flex:none;
  margin:0; padding:0;
  appearance:auto; -webkit-appearance:radio;
  accent-color:var(--color-gold);              /* วงที่เลือกอยู่ต้องเห็นได้บนพื้นเข้ม */
}
/* 🔴 `gap:0 .35em` จำเป็น ไม่ใช่ของตกแต่ง — ป้ายคือ `ชื่อวิธีส่ง: <span class="amount">`
   พอ label เป็น flex ข้อความกับ span กลายเป็น flex item คนละตัว ช่องว่างจะถูกกลืน */
.pm-cart .pm-summary ul#shipping_method li label{
  display:flex; align-items:center; flex-wrap:wrap; gap:0 .35em;
  flex:1 1 auto; min-width:0; margin:0;
  min-height:44px;                             /* F-3 ✅ กดได้ทั้งแถว */
  text-align:left; font-size:var(--fs-meta); line-height:1.4;
  color:var(--color-on-night); cursor:pointer; overflow-wrap:anywhere;
}
/* ราคาชิดขวาเสมอ — ได้ผลทั้งป้ายสั้นบรรทัดเดียวและป้ายยาวหลายบรรทัด
   🔴 `.pm-ship-free` คือคำว่า Free ที่ pm_ship_label_free() ห่อ span ให้ (mu-plugin)
      ⛔ ห้ามให้มันใช้ class `woocommerce-Price-amount` — มันไม่ใช่ตัวเลขราคา
         และจะไปโดนกฎ tabular-nums / ตัวจัดรูปแบบสกุลเงินของ WooCommerce */
.pm-cart .pm-summary ul#shipping_method li label .amount{
  margin-left:auto; padding-left:var(--s2); white-space:nowrap; font-variant-numeric:tabular-nums;
}
.pm-cart .pm-summary ul#shipping_method li label .pm-ship-free{
  margin-left:auto; padding-left:var(--s2); white-space:nowrap;
}
/* สถานะที่เลือกอยู่ — :has() จึงไม่ต้องพึ่ง JS เติมคลาส (C-10) */
.pm-cart .pm-summary ul#shipping_method li:has(input[type="radio"]:checked){
  border-color:var(--color-gold); background:var(--color-night-chip);
}
.pm-cart .pm-summary ul#shipping_method li:has(input[type="radio"]:focus-visible){
  outline:2px solid var(--color-on-night); outline-offset:2px;
}
/* เหลือวิธีส่งเดียว WooCommerce พ่น hidden input + ข้อความล้วน (ไม่มีอะไรให้เลือก)
   ⛔ ตอนนั้นห้ามวาดกรอบการ์ด ไม่งั้นได้กล่องเปล่าที่กดไม่ได้ · และไม่ต้องกันที่ 44px */
.pm-cart .pm-summary ul#shipping_method li:not(:has(input[type="radio"])){
  border:0; background:none; padding:0;
}
.pm-cart .pm-summary ul#shipping_method li:not(:has(input[type="radio"])) label{ min-height:0; }
.pm-summary .woocommerce-shipping-destination,
.pm-summary .shipping-calculator-button{ font-size:var(--fs-meta); color:var(--color-on-night-2); }

.pm-summary__total{
  margin-top:var(--s2); padding-top:var(--s3);
  border-top:1px solid var(--color-line-night);   /* 3.51 บน night ✅ */
}
.pm-summary__total th{ font-size:var(--fs-h6); color:var(--color-on-night-2); }
.pm-summary__total td{ font-family:var(--font-display); font-size:var(--fs-d4b); line-height:1; }

.pm-summary__note{
  margin:var(--s2) 0 0;
  font-size:var(--fs-label); color:var(--color-on-night-2);
}
.pm-summary__cta{ margin-top:var(--s3); }
/* ปุ่ม Proceed to checkout ของ WooCommerce — ใช้หน้าตาเดียวกับ .pm-btn--on-night */
.pm-summary__cta .checkout-button{
  display:flex; align-items:center; justify-content:center;
  width:100%; min-height:50px; padding:0 var(--s3);
  background:var(--color-on-night); color:var(--color-brand);   /* 5.20 ✅ */
  border:0; border-radius:var(--radius-pill);   /* artboard */
  font-family:var(--font-body); font-size:var(--fs-small); font-weight:600;
  text-decoration:none;
}
.pm-summary__cta .checkout-button:hover{ background:var(--color-accent-field); }

/* ============================================================
   3) ลิ้นชักตะกร้า (mini cart)
   🔴 เริ่มต้นมี attribute `hidden` จาก PHP — pm-minicart.js เป็นคนถอด
      ⛔ ห้ามเขียนกฎที่บังคับ display ทับ [hidden] ที่นี่ (จะโผล่ให้คนที่ปิด JS)
   ============================================================ */
.pm-minicart{ position:fixed; inset:0; z-index:var(--z-drawer); }
.pm-minicart[hidden]{ display:none; }
/* 🔴 ระหว่างที่ลิ้นชักเลื่อนออก (400ms) มันยัง `inset:0` เต็มจออยู่ และ `hidden` ยังไม่ถูกใส่
   ถ้าไม่ปิด pointer-events ฉากหลังที่มองไม่เห็นจะกินคลิกทั้งหน้าไปจนกว่าจะครบเวลา
   ⛔ ห้ามแก้ด้วยการใส่ hidden ทันทีตอนปิด — จะไม่เห็นลิ้นชักเลื่อนออกเลย */
.pm-minicart:not(.is-open){ pointer-events:none; }
.pm-minicart.is-open{ pointer-events:auto; }

.pm-minicart__scrim{
  position:absolute; inset:0;
  background:var(--color-scrim);
  opacity:0;
  transition:opacity var(--dur-drawer) var(--ease-drawer);
}
.pm-minicart.is-open .pm-minicart__scrim{ opacity:1; }

.pm-minicart__panel{
  position:absolute; top:0; right:0;
  /* 🔴 `100%` ไม่ใช่ `100vw` — 100vw รวมความกว้างของแถบเลื่อนด้วย ทำให้ลิ้นชัก
     กว้างเกินพื้นที่ที่มองเห็นจริงและดันขอบซ้ายหลุดออกนอกจอที่ 375px
     (เจอจริงตอนวัด preview ที่ 375px · 16 ก.ย.) */
  width:min(420px,100%); height:100%;
  display:flex; flex-direction:column;
  background:var(--color-paper);
  border-left:1px solid var(--color-line);
  /* 🔴 --shadow-drawer ไม่ใช่ --shadow-lift — ลิ้นชักมาจากขอบขวา เงาต้องทอดไปทางซ้าย
     🔴 --dur-drawer .38s < 400ms ที่ pm-minicart.js ใส่ `hidden` กลับ
        ของเดิมใช้ --dur-section .55s → ถูกซ่อนตั้งแต่ยังเลื่อนไม่สุด (เห็นเป็นภาพกระตุกตอนปิด) */
  box-shadow:var(--shadow-drawer);
  transform:translateX(100%);
  transition:transform var(--dur-drawer) var(--ease-drawer);
}
.pm-minicart.is-open .pm-minicart__panel{ transform:translateX(0); }

/* B-9 · F-6 — ปิด motion ทั้งหมดเมื่อระบบขอ */
@media(prefers-reduced-motion:reduce){
  .pm-minicart__scrim,
  .pm-minicart__panel{ transition:none; }
}

/* 🔴 ไฟล์ออกแบบวาง "Your cart" กับบรรทัดจำนวนชิ้นไว้ในหัวเดียวกัน แล้วขีดเส้นใต้ทั้งก้อน
   แต่บรรทัดจำนวนชิ้น **ต้องอยู่ในตัว fragment** ไม่งั้นมันค้างค่าเดิมหลัง add-to-cart
   (เหตุผลเต็มอยู่หัว woocommerce/cart/mini-cart.php) และหัวลิ้นชัก **ต้องอยู่นอก fragment**
   เพราะ pm-minicart.js จับปุ่มปิดครั้งเดียวตอน init (js บรรทัด 38) — ถ้าปุ่มถูกแทนใหม่ มันตาย
   ✅ ทางออก: ไม่ย้าย DOM เลย · ย้าย **เส้นคั่น** ลงไปไว้ใต้บรรทัดจำนวนชิ้นแทน
      ได้ภาพเดียวกับ artboard (ชื่อ + ปุ่มปิด / จำนวนชิ้น / เส้นคั่นเต็มความกว้าง)
   ⛔ ห้ามใช้ align-items:baseline ตาม artboard — ที่นั่นหัวมีลูกสองตัว ที่นี่มีตัวเดียว
      baseline จะไปจับเส้นฐานของ svg ในปุ่มปิดแทน */
.pm-minicart__head{
  flex:none;
  display:flex; align-items:center; justify-content:space-between; gap:var(--s2);
  padding:var(--s3) var(--s3) 0;
}
.pm-minicart__title{
  margin:0;
  font-family:var(--font-display); font-size:var(--fs-d5b); line-height:1.1;   /* artboard 24px */
  color:var(--color-ink);
}
.pm-minicart__close{
  flex:none;
  width:44px; height:44px;                      /* F-3 ✅ */
  display:inline-flex; align-items:center; justify-content:center;
  background:transparent;
  border:1px solid var(--color-line-strong);
  border-radius:var(--radius);
  color:var(--color-ink); cursor:pointer;
}
.pm-minicart__close:hover{ background:var(--color-shade); }

.pm-minicart__body{
  flex:1; min-height:0;
  display:flex; flex-direction:column;
}
/* เส้นคั่นของหัวลิ้นชักอยู่ที่บรรทัดนี้ (ดูหมายเหตุที่ .pm-minicart__head) */
.pm-minicart__count{
  flex:none; margin:0;
  padding:var(--s1) var(--s3) var(--s2);
  border-bottom:1px solid var(--color-line);
  font-size:var(--fs-label); letter-spacing:.1em;
  color:var(--color-ink-muted);
}
.pm-minicart__scroll{ flex:1; min-height:0; overflow-y:auto; padding:0 var(--s3); }
.pm-minicart__list{ list-style:none; margin:0; padding:0; }
/* 🔴 สองคอลัมน์ ไม่ใช่สามแล้ว — ลิงก์ Remove ย้ายลงไปอยู่แถวเดียวกับตัวปรับจำนวน
   ตาม `CaseANav.dc.html` (เดิมเป็นกากบาทลอยมุมขวาบน ซึ่งไฟล์ออกแบบไม่มี)
   ความสูงแถวรวม: 64 + 24×2 = 112px เทียบ artboard 74 + 18×2 = 110px — คุมที่ผลรวม
   ⛔ ห้ามไล่เปลี่ยนรูปเป็น 74px เพราะ 74 ไม่มีในสเกลระยะ (--s6 = 64) */
.pm-minicart__item{
  display:grid;
  grid-template-columns:64px minmax(0,1fr);
  column-gap:var(--s2);
  align-items:start;
  padding-block:var(--s3);
  border-bottom:1px solid var(--color-shade);   /* = ค่าเส้นคั่นของ artboard */
}
.pm-minicart__thumb{ display:block; width:64px; }   /* เหตุผลเดียวกับ .pm-cartline .pm-media */
.pm-minicart__text{ display:flex; flex-direction:column; gap:4px; min-width:0; }
.pm-minicart__name{
  font-size:var(--fs-h6); font-weight:600; line-height:1.3;
  color:var(--color-ink); text-decoration:none;
}
.pm-minicart__name:hover{ color:var(--color-brand-ink); text-decoration:underline; }

/* ชื่อสินค้ากับยอดรวมของบรรทัด อยู่แถวเดียวกัน ชิดคนละข้าง */
.pm-minicart__top{ display:flex; align-items:baseline; justify-content:space-between; gap:var(--s2); }
.pm-minicart__linetotal{
  flex:none;
  font-size:var(--fs-h6); font-weight:600;
  color:var(--color-ink); font-variant-numeric:tabular-nums; white-space:nowrap;
}
/* แถวล่างของรายการ: [ตัวปรับจำนวน + ราคาต่อหน่วย] ...... [Remove]
   🔴 Remove เป็น **พี่น้อง** ของ .pm-minicart__qty ไม่ใช่ลูก — ก้อน qty ทั้งก้อนวิ่งผ่าน
      apply_filters('woocommerce_widget_cart_item_quantity') ปลั๊กอินที่คืนค่าของตัวเองมา
      จะลบลิงก์ Remove หายไปทั้งอันถ้าเอาไปใส่ข้างใน */
/* 🔴 grid สองคอลัมน์ ไม่ใช่ flex-wrap — วัดที่ลิ้นชักกว้าง 375px แล้วเจอว่า flex ห่อทั้งก้อน
      ตัวปรับจำนวนลงไปบรรทัดหนึ่ง แล้วดัน Remove ไปอีกบรรทัด (สูง 110px ต่อแถว)
      ซึ่งไฟล์ออกแบบให้ตัวปรับจำนวนกับ Remove อยู่แถวเดียวกันเสมอ
   ✅ minmax(0,1fr) บีบคอลัมน์ซ้ายให้แคบลงแทน → "ราคาต่อหน่วย" ในนั้นเป็นฝ่ายตกบรรทัด
      Remove ยังอยู่ขวาของตัวปรับจำนวนทุกความกว้าง
   ⛔ อย่าเปลี่ยนเป็น `auto auto` — คอลัมน์ซ้ายจะกาง max-content แล้วดัน Remove ล้นออกนอกลิ้นชัก */
.pm-minicart__controls{
  display:grid; grid-template-columns:minmax(0,1fr) auto;
  align-items:center; column-gap:var(--s2);
  padding-top:var(--s1);
}
.pm-minicart__qty{
  display:flex; align-items:center; flex-wrap:wrap;
  column-gap:var(--s2); row-gap:var(--s1);
}
.pm-minicart__qtyform{ margin:0; }
.pm-minicart__each{ font-size:var(--fs-label); color:var(--color-ink-muted); }

.pm-minicart__item .variation{ margin:0; font-size:var(--fs-label); color:var(--color-ink-muted); }
.pm-minicart__item .variation dt,
.pm-minicart__item .variation dd{ display:inline; margin:0; }
/* artboard เขียนคำว่า "Remove" ขีดเส้นใต้ ไม่ใช่กากบาท — และหน้าตะกร้าก็ใช้แบบเดียวกันอยู่แล้ว
   (.pm-cartline__remove) ⛔ ต้องมีกฎคู่ในบล็อกทับ CSS ของ Woo ด้วย ไม่งั้นบนหน้า /cart/
   `.woocommerce a.remove` (0,2,1) จะเปลี่ยนมันกลับเป็นกากบาทกลมสีแดง */
.pm-minicart__remove{
  display:inline-flex; align-items:center;
  min-height:44px;                              /* F-3 ✅ */
  font-size:var(--fs-meta); line-height:1.3;
  color:var(--color-ink-muted); text-decoration:underline;
}
.pm-minicart__remove:hover{ color:var(--color-brand-ink); }

.pm-minicart__foot{
  flex:none;
  border-top:1px solid var(--color-line);
  background:var(--color-surface);
  padding:var(--s3);
}
.pm-minicart__couponrow{ display:flex; gap:var(--s1); }
/* ⛔ .pm-input เป็นของใช้ทั้งเว็บ (ลิ้นชักอยู่ใน header.php = ทุกหน้า) — ห้ามแก้ตัวฐาน
   artboard ให้ช่องคูปองในลิ้นชักพื้นครีมเข้ม (paper) ตัวพิมพ์ใหญ่ เพราะมันวางบนพื้น surface */
.pm-minicart__couponrow .pm-input{
  flex:1; min-width:0;
  background:var(--color-paper);
  font-size:var(--fs-meta); text-transform:uppercase;
}
/* ⛔ ปุ่ม Apply ในลิ้นชักอยู่บนพื้นสว่าง ไม่ใช่พื้นเข้ม — ใช้ secondary ไม่ใช่ ghost-night */
.pm-minicart__coupon .pm-btn--ghost-night{
  background:transparent; color:var(--color-brand-ink);
  border:1px solid var(--color-line-strong);
}
.pm-minicart__coupon .pm-btn--ghost-night:hover{
  background:var(--color-shade); border-color:var(--color-ink);
}
/* ---- แถวยอดในลิ้นชัก (16 ก.ย. 2026 · "คูปองเมื่อมีการใช้งานจะต้องนับรวมไปด้วย") ----
   🔴 ต้องประกาศ **ก่อน** .pm-minicart__total — แถวยอดรวมใส่สองคลาสพร้อมกัน
      ความจำเพาะเท่ากัน (0,1,0) → ตัวที่อยู่ท้ายไฟล์ชนะ จึงต้องให้ __total อยู่ล่าง
      ไม่งั้นเส้นคั่นบนกับตัวเลขใหญ่ของยอดรวมจะถูกแถวธรรมดาลบทิ้ง */
.pm-minicart__row{
  display:flex; align-items:baseline; justify-content:space-between; gap:var(--s2);
  margin:var(--s1) 0 0;
  font-size:var(--fs-meta); color:var(--color-ink-muted);
}
.pm-minicart__row .amount{ color:var(--color-ink-body); font-variant-numeric:tabular-nums; }
/* ส่วนลด — สีเดียวกับที่หน้าตะกร้าใช้บนพื้นสว่าง (บนพื้นเข้มใช้ --color-gold)
   ⛔ ห้ามสื่อความหมายด้วยสีอย่างเดียว (F-5) — ป้ายข้างหน้าบอกชื่อคูปองอยู่แล้ว */
.pm-minicart__row--discount,
.pm-minicart__row--discount .amount{ color:var(--color-brand-ink); }
/* ลิงก์ [Remove] ที่ WooCommerce แถมมากับ wc_cart_totals_coupon_html()
   🔴 เป็นลิงก์จริงที่มี nonce → ใช้ได้จากทุกหน้า ไม่ต้องพึ่ง JS ของหน้าตะกร้า */
.pm-minicart__row .woocommerce-remove-coupon{
  display:inline-flex; align-items:center; min-height:44px;   /* F-3 */
  margin-left:var(--s1);
  font-size:var(--fs-label); color:var(--color-ink-muted); text-decoration:underline;
}
.pm-minicart__row .woocommerce-remove-coupon:hover{ color:var(--color-brand-ink); }

.pm-minicart__total{
  display:flex; align-items:baseline; justify-content:space-between; gap:var(--s2);
  margin:var(--s3) 0 0;
  padding-top:var(--s2);
  border-top:1px solid var(--color-line);
  font-size:var(--fs-small); color:var(--color-ink-muted);
}
.pm-minicart__total .amount{
  font-family:var(--font-display); font-size:var(--fs-d6);
  color:var(--color-ink); font-variant-numeric:tabular-nums;
}
.pm-minicart__note{ margin:var(--s1) 0 0; font-size:var(--fs-label); color:var(--color-ink-muted); }

/* ปุ่มท้ายลิ้นชักมาจาก hook ของ WooCommerce (View cart แล้วตามด้วย Checkout)
   🔴 ไฟล์ออกแบบให้ Checkout อยู่บน — สลับด้วย order ของ flex
      ⛔ ห้ามถอด hook แล้วเขียนปุ่มเอง ปลั๊กอินชำระเงินเกาะ hook นี้ได้ */
.pm-minicart__buttons{
  display:flex; flex-direction:column; gap:var(--s1);
  margin:var(--s3) 0 0;
}
.pm-minicart__buttons .button{
  display:flex; align-items:center; justify-content:center;
  min-height:48px; padding:0 var(--s3);
  border:1px solid var(--color-brand); border-radius:var(--radius);
  background:transparent; color:var(--color-brand-ink);
  font-family:var(--font-body); font-size:var(--fs-h6); font-weight:600;
  text-decoration:none;
  order:2;
}
.pm-minicart__buttons .checkout{
  order:1;
  min-height:50px;
  background:var(--color-brand); color:var(--color-on-night);   /* 5.20 ✅ */
  font-size:var(--fs-small);
}
.pm-minicart__buttons .checkout:hover{ background:var(--color-ink); }
.pm-minicart__buttons .button:not(.checkout):hover{ background:var(--color-shade); }

.pm-minicart__empty{ padding:var(--s6) var(--s3); text-align:center; }
.pm-minicart__emptytitle{
  margin:0 0 var(--s2);
  font-family:var(--font-display); font-size:var(--fs-d6); color:var(--color-ink);  /* artboard 20px */
}
.pm-minicart__emptylink{ font-size:var(--fs-small); color:var(--color-brand-ink); }

/* ============================================================
   🔴 ชนะ CSS ของ WooCommerce เอง — เฉพาะในขอบเขต .pm-cart
   (16 ก.ย. 2026 · เจอหลังขึ้น staging · รายงาน §8.5)

   ── ทำไมต้องมีบล็อกนี้ ────────────────────────────────────────────────────
   ไฟล์ preview ไม่ได้โหลด `woocommerce.css` เลย หน้าตาจึงถูกในเครื่องแต่เพี้ยนบนเว็บจริง
   (เขียนเตือนตัวเองไว้แล้วที่รายงาน §5 — แล้วมันก็เกิดขึ้นจริง)
   WooCommerce ใช้ selector ที่ลึกกว่าเรา เช่น
     `.woocommerce a.remove`                                    (0,2,1)
     `.woocommerce-cart .cart-collaterals .cart_totals table td` (0,4,1)
   ซึ่งชนะกฎคลาสเดี่ยวของเราทุกครั้ง

   ── ทำไม **ไม่** ใช้ !important ──────────────────────────────────────────
   วัดลำดับโหลดจริงบน staging: `woocommerce.css` อยู่ลำดับ 26 · `pm-components.css` อยู่ 52
   → CSS ของเรามาทีหลัง **ความจำเพาะเท่ากันเมื่อไร เราชนะ**
   จึงแค่ไล่ความจำเพาะให้ "เท่า" ไม่ใช่ทุบด้วย !important (C-7 อยากให้ใช้เท่าที่จำเป็นจริง ๆ)
   ⛔ ถ้าวันหนึ่งมีคนย้าย enqueue ของเราไปก่อน WooCommerce บล็อกนี้จะหยุดทำงานเงียบ ๆ
      → เงื่อนไขตรวจ: `pm-components.css` ต้องอยู่หลัง `woocommerce.css` ใน DOM เสมอ
   ============================================================ */

/* ---- 1) ลิงก์ Remove — Woo ทำเป็นกากบาทกลมสีแดงตัวใหญ่ ---- */
.pm-cart a.remove{
  display:inline-flex; align-items:center;
  width:auto; height:auto; min-height:44px;      /* F-3 */
  font-size:var(--fs-meta); line-height:1.3; font-weight:400;
  text-align:left; border-radius:0;
  color:var(--color-ink-muted); background:none;
  text-decoration:underline;
}
/* 🔴 วัดบน /cart/ จริง 16 ก.ย.: ตัวอักษรยังเป็น **แดง rgb(170,0,0)**
   `woocommerce.css` ประกาศ `.woocommerce a.remove{ color:var(--wc-red) !important }`
   → ไม่มีทางชนะด้วยความจำเพาะ ต้องใช้ !important ตอบ (กรณีเดียวกับหนี้ 17 ที่ C-7 อนุญาต)
   ℹ️ contrast ของสีแดงนั้นผ่าน (7.62) — ที่แก้คือ **สีหลุดชุดสี** ไม่ใช่เรื่องอ่านไม่ออก
   ℹ️ ลิ้นชักไม่โดนกฎนี้ เพราะมันอยู่ **นอก** กล่อง `.woocommerce` (วัดแล้วได้ ink-muted ถูกต้อง)
      ⛔ ถ้าวันหนึ่งลิ้นชักถูกย้ายเข้าไปอยู่ในกล่องนั้น ให้เติม `.pm-minicart a.remove` เข้าคู่กันทันที */
.pm-cart a.remove{ color:var(--color-ink-muted) !important; }
.pm-cart a.remove:hover{ color:var(--color-brand-ink) !important; background:none; }

/* ---- 1ก) ลิงก์ Remove **ในลิ้นชัก** — 16 ก.ย. 2026 ----
   🔴 ลิ้นชักถูกวาดจาก header.php จึงอยู่บนทุกหน้า **รวมหน้า /cart/ ที่ body มีคลาส `woocommerce`**
      `.woocommerce a.remove` (0,2,1) จึงเอื้อมถึงลิงก์ในลิ้นชักด้วย และชนะ .pm-minicart__remove (0,1,0)
      ผลถ้าไม่มีบล็อกนี้: preview สวย แต่บน /cart/ จริงลิงก์กลายเป็นกากบาทกลมสีแดง 24.75px
      (เคยเกิดมาแล้วกับหน้าตะกร้า — ตารางอาการข้อ 1 ในรายงาน 16 ก.ย.)
   ⛔ ห้ามรวมกับ selector ของ .pm-cart ข้างบน — คนละขอบเขต ถ้ารวมแล้ววันหนึ่งใครแก้ตัวหนึ่ง
      อีกตัวจะเปลี่ยนตามโดยไม่ได้ตรวจ */
.pm-minicart a.remove{
  display:inline-flex; align-items:center;
  width:auto; height:auto; min-height:44px;      /* F-3 */
  font-size:var(--fs-meta); line-height:1.3; font-weight:400;
  text-align:left; border-radius:0;
  color:var(--color-ink-muted); background:none;
  text-decoration:underline;
}
.pm-minicart a.remove:hover{ color:var(--color-brand-ink); background:none; }

/* ---- 1ข) **ทั้งรายการในลิ้นชัก** — เพิ่ม 17 ก.ย. 2026 (เจอหลังผูกหน้า Shop เข้ากับ page จริง)
   ─────────────────────────────────────────────────────────────────────────────
   🔴 คำเตือนที่เขียนไว้เองในข้อ 1ก ("ถ้าวันหนึ่งลิ้นชักไปอยู่ในกล่อง .woocommerce…")
      **เกิดขึ้นจริงแล้ว และมาจากทางที่ไม่ได้คิดไว้** — ไม่ใช่ลิ้นชักย้ายที่
      แต่ `<body>` ของหน้า WooCommerce **มีคลาส `woocommerce` อยู่แล้ว**
      (`/shop/` · `/cart/` · `/checkout/` · หน้าสินค้า · หน้าหมวด)
      → `.woocommerce ul.cart_list li …` เอื้อมถึงลิ้นชักที่ header.php วาดไว้ทุกหน้าเหล่านั้น
   🔴 ทำไมเพิ่งเห็นตอนนี้: ก่อนหน้านี้ `/shop/` ถูก ShopEngine ยึดไว้ เจ้าของงานจึงไม่ได้เปิด
      ลิ้นชักบนหน้า Woo จริง ๆ · **บั๊กนี้มีอยู่บน /cart/ /checkout/ มาตลอดโดยไม่มีใครเห็น**
   ⛔ ไฟล์ preview ไม่มีวันเห็น — preview ไม่โหลด `woocommerce.css` และ body ไม่มีคลาสนั้น

   ── กฎของ Woo ที่ต้องเอาชนะ (วัดจริงบน /shop/ 17 ก.ย.) ──────────────────────
     `.woocommerce ul.cart_list li`      (0,2,2) → padding:4px 0        (ของเรา 24px)
     `.woocommerce ul.cart_list li img`  (0,2,3) → float:right · width:32px · margin-left:4px
     `.woocommerce ul.cart_list li a`    (0,2,3) → display:block · font-weight:700
     `.woocommerce a.remove`             (0,2,1) → สีแดง **!important**
   ⛔ ตั้งใจให้ทุกกฎข้างล่าง **หนักกว่า** ไม่ใช่ "เท่ากันแล้วชนะด้วยลำดับโหลด"
      (บทเรียน 17 ก.ย. รอบกล่องวิธีส่ง: พอถอด id ออกเพื่อให้ preview ใช้ได้ ของก็แพ้เงียบ ๆ)
   ─────────────────────────────────────────────────────────────────────────── */
/* 🔴🔴 ตัวร้ายที่สุดของชุดนี้ — **clearfix ของ Woo กลายเป็น grid item**
   `.woocommerce ul.cart_list li::before / ::after { content:" "; display:table }` (clearfix ยุค float)
   ⛔ pseudo-element ของ grid container **นับเป็นลูกของกริดด้วย** → ::before กินช่อง (1,1)
      รูปเลื่อนไปช่อง (1,2) · กล่องข้อความตกไปแถวสอง (2,1) กว้างแค่ 64px · ::after กิน (2,2)
      = หน้าตาที่เจ้าของงานเห็น (รูปลอยขวา ชื่อสินค้าบีบเป็นคอลัมน์แคบ Remove ทับตัวปรับจำนวน)
   ℹ️ วัดจริง: `grid-template-rows` กลายเป็น `64px 186px` ทั้งที่ควรมีแถวเดียว */
.pm-minicart ul.pm-minicart__list{ margin:0; padding:0; list-style:none; }
.pm-minicart .pm-minicart__list li.pm-minicart__item::before,
.pm-minicart .pm-minicart__list li.pm-minicart__item::after{ content:none; display:none; }
/* dl ของ variation ก็โดน clearfix ชุดเดียวกัน (สินค้าที่มีตัวเลือกขนาด 4 ใน 13 SKU)
   ⛔ dt/dd ในนั้นเป็น inline อยู่แล้ว ไม่ต้องมี clearfix และมันเพิ่มแถวเปล่าให้กล่อง */
.pm-minicart .pm-minicart__item .variation::before,
.pm-minicart .pm-minicart__item .variation::after{ content:none; display:none; }

/* (0,3,1) ชนะ (0,2,2) — ระยะห่างแถวกลับมาเป็นของ artboard */
.pm-minicart .pm-minicart__list li.pm-minicart__item{ margin:0; padding:var(--s3) 0; }

/* (0,3,1) ชนะ (0,2,3) — ⛔ float:right คือตัวที่ทำให้รูปเด้งไปขวาแล้วเลย์เอาต์กริดพัง */
.pm-minicart .pm-minicart__item .pm-minicart__thumb img{
  float:none; width:100%; height:auto; margin:0; box-shadow:none;
}

/* (0,3,1) ชนะ (0,2,3) — ชื่อสินค้าโดนบังคับเป็น 700 และลิงก์ Remove โดนบังคับเป็น block
   จนหลุดลงไปทับตัวปรับจำนวน (เห็นในภาพที่เจ้าของงานส่งมา 17 ก.ย.) */
.pm-minicart .pm-minicart__item a.pm-minicart__name{ display:block; font-weight:600; }
.pm-minicart .pm-minicart__item a.pm-minicart__remove{
  display:inline-flex; width:auto; font-weight:400; text-decoration:underline;
}
/* 🔴 สีแดงของ Woo เป็น `!important` → ต้องตอบด้วย !important เหมือนกรณี .pm-cart a.remove
   (C-7 อนุญาตเฉพาะกรณีที่อีกฝั่งใช้ !important ก่อน) */
.pm-minicart .pm-minicart__item a.pm-minicart__remove{ color:var(--color-ink-muted) !important; }
.pm-minicart .pm-minicart__item a.pm-minicart__remove:hover{ color:var(--color-brand-ink) !important; }

/* ---- 2) ตารางรายการสินค้า — ล้างกรอบ/ระยะของ Woo ---- */
.pm-cart table.shop_table{
  width:auto; margin:0; border:1px solid var(--color-line); border-radius:var(--radius-xl);
  border-collapse:separate; border-spacing:0;
}
.pm-cart table.shop_table th,
.pm-cart table.shop_table td{
  padding:0; border-top:0; line-height:inherit; font-weight:inherit; vertical-align:baseline;
}
/* 🔴 วัดบน /cart/ จริง 16 ก.ย. (รอบอัป staging): การ์ดรายการยัง **มุมเหลี่ยม 0px**
   ทั้งที่ preview ได้ 22px · ตัวที่ทับคือ `.woocommerce .woocommerce-cart-form table.shop_table` (0,3,1)
   ซึ่งชนะ `.pm-cart table.shop_table` (0,2,1) ของเรา แล้วสั่ง border-radius:0 ทับ
   ⛔ ไล่ความจำเพาะให้ **เท่ากัน** (0,3,1) พอ ไม่ต้อง !important — CSS ของเราโหลดลำดับ 52 · Woo ลำดับ 26 */
.pm-cart .woocommerce-cart-form table.shop_table{ border-radius:var(--radius-xl); }

/* คืนระยะของเราหลังล้างของ Woo (ต้องมาหลังบล็อกล้างเสมอ) */
.pm-cart table.shop_table.pm-cartlist{ padding:var(--s2) var(--s4) var(--s3); background:var(--color-surface); }
/* padding มือถือของการ์ดรายการ — ต้องอยู่ **หลัง** บรรทัดบนเสมอ (ความจำเพาะเท่ากัน ตัวท้ายชนะ) */
@media(max-width:700px){
  .pm-cart table.shop_table.pm-cartlist{ padding-inline:var(--s3); }
}
.pm-cart .pm-cartlist > tbody > tr.pm-cartline{ padding-block:var(--s3); border-top:1px solid var(--color-line); }
.pm-cart .pm-cartlist > tbody > tr > td.pm-cart__actions{ padding-block:var(--s3) 0; border-top:1px solid var(--color-line); }
.pm-cart .pm-cartlist > tbody > tr > td.pm-cart__foot{ padding-block:var(--s3) 0; border-top:1px solid var(--color-line); }

/* ---- 3) การ์ดสรุปยอด — ตัวที่พังหนักที่สุด ----
   Woo ลอย `.cart_totals` ไปขวาแล้วบีบเหลือ 48% + ตั้งความกว้าง th/td เป็น 25/75%
   ซึ่งทำให้ตัวอักษรซ้อนกันเมื่อเราเปลี่ยนแถวเป็น flex */
.pm-cart .cart-collaterals,
.pm-cart .cart-collaterals .cart_totals{
  float:none; width:auto; margin:0;
}
.pm-cart .cart-collaterals .cart_totals table{
  width:auto; margin:0; border:0; border-collapse:separate; border-spacing:0;
}
.pm-cart .cart-collaterals .cart_totals table tr th,
.pm-cart .cart-collaterals .cart_totals table tr td{
  width:auto; padding:0; border:0; vertical-align:baseline; line-height:inherit;
}
.pm-cart .cart-collaterals .cart_totals table tr:first-child td,
.pm-cart .cart-collaterals .cart_totals table tr:first-child th{ border-top:0; }
/* คืนของเรา */
.pm-cart .pm-summary__table tr{ padding-block:var(--s1); }
.pm-cart .pm-summary__total{ margin-top:var(--s2); padding-top:var(--s3); border-top:1px solid var(--color-line-night); }
.pm-cart .cart-collaterals .cart_totals .woocommerce-shipping-destination,
.pm-cart .cart-collaterals .shipping-calculator-button{
  font-size:var(--fs-meta); color:var(--color-on-night-2);
}

/* ---- 4) ช่องจำนวนของ Woo (`.quantity .qty`) ---- */
.pm-cart .quantity .qty{
  width:48px; height:44px; padding:0; margin:0;
  border:0; border-inline:1px solid var(--color-line); background:transparent;
  text-align:center; font-family:var(--font-body); font-size:var(--fs-small); color:var(--color-ink);
}

/* ---- 5) ปุ่ม Proceed to checkout ---- */
.pm-cart .wc-proceed-to-checkout a.checkout-button{
  display:flex; align-items:center; justify-content:center;
  width:100%; min-height:50px; padding:0 var(--s3); margin:0;
  background:var(--color-on-night); color:var(--color-brand);   /* 5.20 ✅ */
  /* 16 ก.ย. 2026 — ต้องขยับพร้อม .pm-summary__cta .checkout-button (0,2,0)
     เพราะ selector นี้ (0,3,1) ชนะมันเสมอ → ถ้าลืม ปุ่มจะยังเหลี่ยมบนหน้าจริง
     ทั้งที่ไฟล์ preview ดูมนแล้ว (บทเรียน §8.5 ของรายงานรอบก่อน) */
  border:0; border-radius:var(--radius-pill);
  font-family:var(--font-body); font-size:var(--fs-small); font-weight:600;
  text-align:center; text-decoration:none;
}
.pm-cart .wc-proceed-to-checkout a.checkout-button:hover{ background:var(--color-accent-field); color:var(--color-brand); }

/* ---- 6) พื้นการ์ดสรุปยอด — 🔴 ข้อที่อันตรายที่สุดในชุดนี้ ----
   `.woocommerce .cart-collaterals .cart_totals` (0,3,1) ตั้งพื้นเป็นสีเทาอ่อน
   ซึ่งชนะ `.pm-summary` (0,1,0) ของเรา → ได้ **ตัวอักษรสีสว่างบนพื้นสว่าง**
   วัดจริงบน staging ก่อนแก้: background = rgb(247,248,251) ขณะที่ color = rgb(244,241,230)
   = อ่านไม่ออกเลย และ **B-3 ตกทั้งการ์ด**
   ⛔ ห้ามแก้ด้วยการเปลี่ยนสีตัวอักษรให้เข้ม — การ์ดนี้ออกแบบมาให้เป็นพื้นเข้ม */
.pm-cart .cart-collaterals .cart_totals{
  /* 16 ก.ย. 2026 — เหตุผลเดียวกับปุ่มข้างบน: selector นี้ (0,3,0) ชนะ .pm-summary (0,1,0)
     ⛔ ถ้าแก้ gradient/มุมที่ .pm-summary อย่างเดียว หน้าจริงจะยังเป็นพื้นทึบมุมเหลี่ยม */
  background:var(--color-night);
  background-image:linear-gradient(160deg,var(--color-night-2),var(--color-night));
  color:var(--color-on-night);
  border-radius:var(--radius-xl); padding:var(--s4);
}

/* ---- 7) ธีมแม่บังคับ text-align:center ให้ทุกช่องตาราง ----
   `style.css` ของธีมแม่มี `table > tbody > tr > td { text-align:center }` (0,0,4)
   ซึ่งชนะกฎที่ไม่ได้ระบุ text-align ของเรา → ชื่อสินค้าไปกองกลางช่อง
   กฎคลาสของเรา (เช่น .pm-summary__table td = 0,2,0) ยังชนะกฎนี้อยู่แล้ว
   จึงรีเซ็ตเป็น left ได้โดยไม่กระทบช่องที่ตั้งใจให้ชิดขวา */
.pm-cart table > tbody > tr > td,
.pm-cart table > tbody > tr > th,
.pm-cart table > thead > tr > th{ text-align:left; }

/* ---- 8) 🔴 สีของตัวเลขเงิน — Additional CSS ทับด้วย !important ----
   `#wp-custom-css` (หนี้ 17 · 226 ค่าสีดิบ) มีกฎ
     `.woocommerce-Price-amount.amount { color: rgb(46,74,49) !important }`
   ผลบนหน้าจริง: ยอดเงินในการ์ดสรุปยอด (พื้นเข้ม) วัดได้ **1.45:1** — B-3 ตกแบบอ่านไม่ออกเลย

   ⛔ นี่คือกรณีที่ C-7 อนุญาตให้ใช้ `!important` — ทับสไตล์ที่มาจาก **นอกธีม** และมี `!important` มาก่อน
      ไม่มีทางชนะด้วยความจำเพาะเพราะฝั่งนั้นประกาศ !important ไว้แล้ว
   ✅ ใช้ `inherit` ไม่ใช่สีตายตัว → บนพื้นเข้มได้ --color-on-night · บนพื้นสว่างได้สีเนื้อความ
      (และไม่ต้องเพิ่มค่าสีใหม่ = B-1 ยังผ่าน)
   🔴 วันที่ย้าย Additional CSS ออกตามแผนหนี้ 17 **ให้ลบสองบรรทัดนี้ทิ้งด้วย** */
.pm-cart .woocommerce-Price-amount.amount{ color:inherit !important; }
.pm-minicart .woocommerce-Price-amount.amount{ color:inherit !important; }

/* ---- 9) ชื่อสินค้าในรายการ — Woo ตั้งเป็นเทา 14px ----
   `.woocommerce .woocommerce-cart-form .cart_item .product-name a` (0,4,1)
   ชนะกฎ (0,2,1) ของเรา → ได้เทา rgb(151,151,151) บนพื้นครีม = **2.87:1** (B-3 ตก)
   แก้ด้วยการไล่ความจำเพาะให้เท่ากัน แล้วอาศัยว่า CSS ของเราโหลดทีหลัง */
.pm-cart .woocommerce-cart-form .cart_item .product-name a{
  font-family:var(--font-display); font-size:var(--fs-d6); line-height:1.2;
  color:var(--color-brand-ink); text-decoration:none;
}
.pm-cart .woocommerce-cart-form .cart_item .product-name a:hover{ text-decoration:underline; }

/* ---- 10) แถวปุ่มท้ายตาราง — Woo ดันไปชิดขวา ---- */
.pm-cart table.cart td.actions,
.pm-cart .pm-cartlist > tbody > tr > td.pm-cart__actions{ text-align:left; }

/* ---- 11) ปุ่มของ WooCommerce — `.woocommerce .checkout-button.button.alt.wc-forward` (0,5,0) ----
   ชนะกฎ (0,3,1) ของเรา → ปุ่ม Checkout ได้พื้นน้ำเงินของ Woo ขณะที่ตัวอักษรยังเป็นสีแบรนด์
   วัดบนหน้าจริงก่อนแก้: **1.09:1** (ตัวอักษรกับพื้นเกือบสีเดียวกัน) — อ่านไม่ออก
   ⛔ ไล่ความจำเพาะให้สูงกว่า ไม่ใช้ !important (CSS ของเราโหลดทีหลังอยู่แล้ว) */
.pm-cart .wc-proceed-to-checkout a.checkout-button.button.alt.wc-forward{
  background:var(--color-on-night); color:var(--color-brand);   /* 5.20 ✅ */
  border:0;
  /* 🔴 วัดบน /cart/ จริง 16 ก.ย.: ปุ่มได้มุม **4px** ไม่ใช่ pill
     `.woocommerce .checkout-button.button.alt.wc-forward` (0,5,0) ชนะกฎมุมของเราที่ (0,3,1)
     → ย้าย border-radius มาอยู่ในกฎ (0,6,1) ตัวนี้ซึ่งชนะอยู่แล้ว */
  border-radius:var(--radius-pill);
}
.pm-cart .wc-proceed-to-checkout a.checkout-button.button.alt.wc-forward:hover{
  background:var(--color-accent-field); color:var(--color-brand);
}
/* ปุ่มท้ายลิ้นชักโดน Woo ทับด้วยกฎชุดเดียวกัน */
.pm-minicart .pm-minicart__buttons a.button.wc-forward{
  background:transparent; color:var(--color-brand-ink);
  border:1px solid var(--color-brand);
}
.pm-minicart .pm-minicart__buttons a.button.checkout.wc-forward{
  background:var(--color-brand); color:var(--color-on-night);   /* 5.20 ✅ */
  border:1px solid var(--color-brand);
}
.pm-minicart .pm-minicart__buttons a.button.checkout.wc-forward:hover{ background:var(--color-ink); border-color:var(--color-ink); }
.pm-minicart .pm-minicart__buttons a.button.wc-forward:not(.checkout):hover{ background:var(--color-shade); }

/* ============================================================
   ข้อความแจ้งของ WooCommerce บนหน้าตะกร้า (16 ก.ย. 2026 · Q-10)
   markup มาจาก woocommerce/notices/*.php ที่เรา override
   ⛔ ห้ามใช้สีบอกความหมายอย่างเดียว (F-5) — ทั้งสามแบบมีเส้นซ้ายคนละสี
      **และมีข้อความของมันเองอยู่แล้ว** จึงไม่ต้องพึ่งสีในการอ่านความหมาย
   ============================================================ */
.pm-cart .pm-notice{
  margin:0 0 var(--s3);
  padding:var(--s3);
  background:var(--color-surface);
  border:1px solid var(--color-line);
  border-left:3px solid var(--color-line-strong);
  border-radius:var(--radius);
  font-size:var(--fs-small); line-height:1.55;
  color:var(--color-ink-body);
  list-style:none;
}
.pm-cart .pm-notice--success{ border-left-color:var(--color-brand); }
.pm-cart .pm-notice--error{ border-left-color:var(--color-accent); }
.pm-cart ul.pm-notice{ padding-left:var(--s3); }
.pm-cart ul.pm-notice li{ margin:0; }
.pm-cart ul.pm-notice li + li{ margin-top:var(--s1); }

/* ปุ่ม/ลิงก์ที่ WooCommerce แปะมาในข้อความ (เช่น "View cart" · "Undo?") */
.pm-cart .pm-notice .button,
.pm-cart .pm-notice a{
  display:inline-flex; align-items:center;
  min-height:44px;                              /* F-3 */
  padding:0; margin:0 0 0 var(--s2);
  background:none; border:0; border-radius:0;
  font-family:var(--font-body); font-size:var(--fs-small); font-weight:600;
  color:var(--color-brand-ink); text-decoration:underline;
}
.pm-cart .pm-notice a:hover{ color:var(--color-ink); }

/* ข้อความตะกร้าว่างในการ์ดของเรา (มาจาก wc_empty_cart_message ที่เราย้ายมาวาดเอง) */
.pm-cart__emptytext{
  margin:0 0 var(--s3);
  font-size:var(--fs-small); color:var(--color-ink-muted);
}

/* ---- 🔴 Additional CSS ประกาศกล่องข้อความไว้ด้วย !important ทุก property ----
   `#wp-custom-css` (หนี้ 17) มี `.woocommerce-message { … !important }` ครบชุด:
     font-family:"DM Sans" · font-size:14px · color · background · border · border-top:3px
   ทั้งหมดเป็น `!important` จาก **นอกธีม** → ไม่มีทางชนะด้วยความจำเพาะอย่างเดียว
   ⛔ นี่คือกรณีที่ C-7 อนุญาต และเป็นตัวเดียวกับที่ใช้กับสีตัวเลขเงิน (ข้อ 8)
   🔴 ความจำเพาะ (0,2,0) ของเราชนะ (0,1,0) ของฝั่งนั้นเมื่อทั้งคู่เป็น !important
   🔴 `DM Sans` ที่ฝั่งนั้นบังคับไว้ **หลุดจากเกราะฟอนต์ใน pm-utilities.css**
      เพราะบล็อกนั้นไล่เฉพาะ p/a/li/td/th/label/input/... — **ไม่มี div**
      ⛔ อย่าไปเพิ่ม `div` เข้าไปในบล็อกนั้น จะลากทั้งหน้า · แก้เฉพาะจุดที่นี่ถูกกว่า
   ✅ ลบบล็อกนี้ทิ้งได้ทันทีที่ย้าย Additional CSS ออกตามแผนหนี้ 17 */
.pm-cart .pm-notice{
  font-family:var(--font-body) !important;
  font-size:var(--fs-small) !important;
  color:var(--color-ink-body) !important;
  background:var(--color-surface) !important;
  border:1px solid var(--color-line) !important;
  border-left:3px solid var(--color-line-strong) !important;
  border-radius:var(--radius) !important;
  padding:var(--s3) !important;
}
.pm-cart .pm-notice--success{ border-left-color:var(--color-brand) !important; }
.pm-cart .pm-notice--error{ border-left-color:var(--color-accent) !important; }

/* ════════════════════════════════════════════════════════════════════════════
   🔴🔴 17 ก.ย. 2026 — ทั้งส่วนของหน้า Checkout ข้างล่างนี้ถูกเปลี่ยนหัว selector
        จาก `.pm-checkout …` เป็น **`#pm-main.pm-checkout …`** ทุกกฎ
   ════════════════════════════════════════════════════════════════════════════
   **ไม่มีค่าใดถูกแก้แม้แต่ค่าเดียว** — เปลี่ยนเฉพาะ "น้ำหนักความจำเพาะ"

   ทำไม: บนหน้าจริง (ไม่ใช่ไฟล์ preview) มี CSS จากนอกธีมทับอยู่สามชั้น
     · `woocommerce.css` · `woocommerce-layout.css` ของ WooCommerce 11.1.0
     · `woocommerce.css?ver=1.6` + `bajaar-style-inline-css` ของธีมแม่ Bajaar
     · `#wp-custom-css` (Additional CSS ของดีไซน์เก่า) ที่ใช้ `!important`
   กฎคลาสเดี่ยวของเรา (0,1,0)–(0,2,0) **แพ้แทบทุกนัด** โดยเฉพาะกับตาราง
   `table.shop_table th/td` ที่ Bajaar ตีกรอบทุกช่อง → ยอดเงินกลายเป็นกล่อง ๆ

   `<main id="pm-main" class="pm-checkout">` เป็น element เดียวกัน การใช้ id จึง
   **ไม่เปลี่ยนว่ากฎจับอะไร** แต่ยกทุกกฎขึ้นเป็น (1,x,y) ซึ่งชนะทั้ง Bajaar และ
   กฎ `:is()` ที่มี id ซ่อนอยู่ข้างใน โดย **ไม่ต้องใช้ `!important`** (C-7)

   ⛔ ห้ามถอด `#pm-main` ออกเพื่อความสวยงามของโค้ด — หน้าจะกลับไปเละเหมือนเดิม
   ⛔ ห้ามใช้ `#pm-main` เปล่า ๆ (ไม่มี `.pm-checkout`) — หน้าอื่นใช้ id เดียวกัน
   🔴 คลาสทั้งหมดในส่วนนี้ (pm-check · pm-checkout* · pm-coupon* · pm-fieldgrid ·
      pm-pay* · pm-review* · pm-terms) ใช้เฉพาะหน้า checkout — ตรวจแล้วด้วย grep
      ทั้งโฟลเดอร์ธีม จึงไม่มีหน้าอื่นเสียหายจากการ scope ให้แคบลง
   ════════════════════════════════════════════════════════════════════════════ */

/* ============================================================
   หน้าชำระเงิน — Case A (16 ก.ย. 2026)
   ที่มา: `Case A - Checkout.dc.html`
   รายงาน: docs/report-checkout-2026-09-16.md
   ⛔ ไม่มีค่า hex ในบล็อกนี้ — ทุกสีมาจาก pm-tokens.css (B-1)

   🔴 การแมปค่าจากไฟล์ออกแบบมายัง token (เหมือนที่ cart-totals.php §1 ทำ)
      ไฟล์ออกแบบใช้ขอบมน 14/18/22px และพื้นการ์ด FFFDF8
      ชุด token มี --radius:2px และ --color-surface:FFFDF6
      → **ใช้ของที่มีอยู่** ไม่สร้างค่าใหม่ · ความต่างอยู่ที่ความมนของมุมเท่านั้น
      ⛔ ห้ามเติม hex ใหม่ลง pm-tokens.css เพื่อให้ตรงไฟล์ออกแบบ —
         CLAUDE.md ห้ามคิดค่าสี/ฟอนต์เอง ต้องขอจาก Claude Design ก่อน (รายงาน §4)
   ============================================================ */

/* ---- การ์ดของหน้านี้ ---- */
#pm-main.pm-checkout .pm-checkout__card{ padding:var(--s4); border-radius:var(--radius-xl); }   /* artboard 22px */
/* ไฟล์ออกแบบ: หัวการ์ดคอลัมน์ซ้าย 28px · คอลัมน์ขวา 24px
   สเกลของธีมมี d5=29 / d6=21 → ใช้ d5 ฝั่งซ้าย (ใกล้ 28 ที่สุดและอยู่ในสเกล)
   ⛔ ไม่สร้างขั้น 28/24 ขึ้นมาใหม่ — design.md §26 ถือว่าค่าที่ไม่อยู่ในสเกลคือหนี้ที่ต้องปรับเข้าสเกล */
#pm-main.pm-checkout .pm-checkout__cardtitle{
  font-size:var(--fs-d5); line-height:1.15;     /* artboard 28px ≈ d5 29 */
  color:var(--color-brand-ink);                 /* 6.35 บน surface ✅ B-3 */
  margin:0 0 var(--s3);
}
#pm-main.pm-checkout .pm-checkout__aside .pm-checkout__cardtitle{ font-size:var(--fs-d5b); }   /* artboard 24px */
/* หัวการ์ดที่เป็น <h3> ครอบ checkbox (Ship to a different address?)
   🔴 โครง h3>label มาจาก WooCommerce ห้ามรื้อ — ดู woocommerce/checkout/form-shipping.php
      จึงลดน้ำหนักให้ดูเป็น control ไม่ใช่หัวเรื่อง */
#pm-main.pm-checkout .pm-checkout__cardtitle--toggle{ margin-bottom:0; font-size:var(--fs-h5); }
#pm-main.pm-checkout .pm-checkout__cardtitle--toggle + .shipping_address{ margin-top:var(--s3); }

/* ---- กริดของช่องกรอก ----
   🔴 `.form-row-first`/`.form-row-last`/`.form-row-wide` เป็นคลาสที่ **WooCommerce กำหนดมา**
      ตาม woocommerce_default_address_fields ⛔ ห้ามเพิ่ม/ถอดที่ PHP — จัดที่นี่อย่างเดียว */
#pm-main.pm-checkout .pm-fieldgrid{
  display:grid; grid-template-columns:1fr 1fr; gap:var(--s2);
}
#pm-main.pm-checkout .pm-fieldgrid .form-row{ margin:0; min-width:0; display:flex; flex-direction:column; }
#pm-main.pm-checkout .pm-fieldgrid .form-row-wide,
#pm-main.pm-checkout .pm-fieldgrid .form-row.notes,
#pm-main.pm-checkout .pm-fieldgrid .form-row.create-account{ grid-column:1 / -1; }
/* ⛔ ล้าง float/width เดิมของ woocommerce.css ที่ยังบังคับ 47% อยู่
   ไม่ล้าง = ช่องกรอกซ้อนกันครึ่งช่องในกริด */
#pm-main.pm-checkout .pm-fieldgrid .form-row-first,
#pm-main.pm-checkout .pm-fieldgrid .form-row-last{ float:none; width:auto; }
#pm-main.pm-checkout .pm-fieldgrid::after{ content:none; }

/* ไฟล์ออกแบบ: 12px · letter-spacing .14em · weight 600
   🔴 ขนาดคง 12.5px ตาม --fs-label — **B-4 ห้ามต่ำกว่า 12.5px** จึงลงไป 12px ไม่ได้
      (design.md §"เพดานล่างที่ไม่ผ่อน") · ส่วนระยะตัวอักษรกับน้ำหนักทำตามได้ */
#pm-main.pm-checkout .pm-field__label{
  margin-bottom:var(--s1);
  letter-spacing:.14em;
  font-weight:600;
}
/* เครื่องหมายบังคับกรอก — ใช้สี accent ตามไฟล์ออกแบบ
   🔴 ไม่ใช่สีเนื้อความ (B-2 ห้าม accent เป็นสีเนื้อความ) แต่ตัวนี้เป็นสัญลักษณ์ ไม่ใช่ข้อความ
      และไม่ได้เป็นตัวบอกสถานะเพียงลำพัง — คำว่า "required" อยู่ใน title/aria แล้ว (F-1) */
#pm-main.pm-checkout .required{ color:var(--color-accent); text-decoration:none; border:0; }
#pm-main.pm-checkout .optional{ color:var(--color-ink-muted); }

/* ช่องกรอกทุกชนิดที่ WooCommerce สร้าง
   🔴 เขียนเป็น element selector เพราะ .pm-input ถูกใส่ผ่านฟิลเตอร์
      woocommerce_form_field_args ซึ่ง **ไม่ครอบคลุม textarea ทุกกรณี** */
#pm-main.pm-checkout .input-text,
#pm-main.pm-checkout textarea,
#pm-main.pm-checkout select{
  width:100%; min-height:46px;                  /* F-3 ≥ 44px ✅ */
  padding:0 var(--s2);
  background:var(--color-surface);
  /* 🔴 artboard ใช้ขอบ C6BEA9 ซึ่งวัดได้ **1.82** ต่ำกว่าเกณฑ์ขอบ control 3:1 ของ F-1
     จึงคง --color-line-strong (3.42) ไว้ตามทางเลือก "ก" ที่เจ้าของงานยังไม่ได้เลือกเป็นอย่างอื่น
     ⛔ อย่าเปลี่ยนเป็น C6BEA9 โดยไม่บันทึกเป็นหนี้ a11y */
  border:1px solid var(--color-line-strong);    /* 3.42 — ขอบ control ✅ */
  border-radius:var(--radius-sm);               /* artboard 10px */
  font-family:inherit; font-size:var(--fs-small);
  color:var(--color-ink);
}
#pm-main.pm-checkout textarea{ padding:var(--s2); min-height:96px; resize:vertical; line-height:1.5; }
.pm-checkout .input-text:focus,
.pm-checkout textarea:focus,
#pm-main.pm-checkout select:focus{
  outline:2px solid var(--color-brand-ink); outline-offset:2px;   /* F-2 */
  border-color:var(--color-brand-ink);
}
/* ข้อความช่วยใต้ช่อง (เช่น คำอธิบายอีเมล) */
#pm-main.pm-checkout .description,
#pm-main.pm-checkout .woocommerce-input-wrapper + .description{
  font-size:var(--fs-meta); color:var(--color-ink-muted); margin:var(--s1) 0 0;
}
/* ช่องที่ WooCommerce ทำเครื่องหมายว่าผิด */
#pm-main.pm-checkout .woocommerce-invalid .input-text,
#pm-main.pm-checkout .woocommerce-invalid select{ border-color:var(--color-accent); }

/* ---- select2 ของช่อง Country / State ----
   🔴 WooCommerce render ช่องนี้เป็น select2 (`wc-enhanced-select`) ไม่ใช่ <select> ธรรมดา
      ถ้าไม่คุม DOM ที่ select2 สร้าง จะได้หน้าที่จัดสวยแล้วมี control แปลกปลอมหนึ่งตัว
   ⛔ ห้ามปิด select2 เพื่อให้จัดง่าย — มันคือตัวที่ทำให้เลือกประเทศจาก 200 กว่ารายการได้จริง */
#pm-main.pm-checkout .select2-container{ width:100% !important; }  /* select2 เขียน width แบบ inline มาเอง — ทับได้ทางเดียว (C-7) */
#pm-main.pm-checkout .select2-container .select2-selection--single{
  height:46px;                                   /* F-3 ✅ */
  background:var(--color-surface);
  border:1px solid var(--color-line-strong);
  border-radius:var(--radius-sm);
  display:flex; align-items:center;
}
#pm-main.pm-checkout .select2-container .select2-selection--single .select2-selection__rendered{
  padding:0 var(--s2); line-height:1.4;
  font-size:var(--fs-small); color:var(--color-ink);
}
#pm-main.pm-checkout .select2-container .select2-selection--single .select2-selection__arrow{ height:44px; right:var(--s1); }
#pm-main.pm-checkout .select2-container--focus .select2-selection--single,
#pm-main.pm-checkout .select2-container--open .select2-selection--single{
  outline:2px solid var(--color-brand-ink); outline-offset:2px; border-color:var(--color-brand-ink);
}

/* ---- checkbox แถวเดียว (สร้างบัญชี · ส่งที่อยู่อื่น · ยอมรับเงื่อนไข) ---- */
#pm-main.pm-checkout .pm-check{
  display:flex; gap:var(--s2); align-items:center;
  cursor:pointer; margin:0;
  min-height:44px;                               /* F-3 — พื้นที่กดของ label ทั้งแถว ✅ */
  font-size:var(--fs-small); color:var(--color-ink-body);
}
#pm-main.pm-checkout .pm-check input[type="checkbox"]{
  width:20px; height:20px; flex:none; margin:0;
  accent-color:var(--color-brand);
}
#pm-main.pm-checkout .pm-check input[type="checkbox"]:focus-visible{ outline:2px solid var(--color-brand-ink); outline-offset:2px; }

/* ---- แถบคูปอง ---- */
#pm-main.pm-checkout .pm-couponbar{ margin-bottom:var(--s3); }
#pm-main.pm-checkout .pm-couponbar .woocommerce-info,
#pm-main.pm-checkout .pm-couponbar .woocommerce-message{
  background:var(--color-surface);
  border:1px solid var(--color-line);
  border-radius:var(--radius-md);               /* artboard 14px */
  padding:var(--s2) var(--s3);
  font-size:var(--fs-small); color:var(--color-ink-body);
  margin:0;
}
#pm-main.pm-checkout .pm-couponbar .showcoupon{ color:var(--color-brand-ink); font-weight:600; }
#pm-main.pm-checkout .pm-couponform{
  display:flex; gap:var(--s2); flex-wrap:wrap; align-items:flex-end;
  background:var(--color-surface);
  border:1px solid var(--color-line);
  border-radius:var(--radius-md);
  padding:var(--s3);
  margin:calc(var(--s1) * -1) 0 var(--s3);
}
#pm-main.pm-checkout .pm-couponform .form-row{ margin:0; }
#pm-main.pm-checkout .pm-couponform .form-row-first{ flex:1 1 220px; min-width:0; }
#pm-main.pm-checkout .pm-couponform .pm-input{ width:100%; }
#pm-main.pm-checkout .pm-couponform::after{ content:none; }

/* ============================================================
   สรุปออเดอร์ในคอลัมน์ขวา
   🔴 ต้นฉบับเป็น <table> และ **ยังเป็น <table> อยู่** — ดูเหตุผลที่หัวไฟล์
      woocommerce/checkout/review-order.php · ที่นี่แค่เปลี่ยน display
      role="table"/"row"/"cell" ใน PHP เป็นตัวรักษา a11y tree ที่ display ทำหาย
   ============================================================ */
#pm-main.pm-checkout .pm-review,
#pm-main.pm-checkout .pm-review tbody,
#pm-main.pm-checkout .pm-review tfoot,
#pm-main.pm-checkout .pm-review th,
#pm-main.pm-checkout .pm-review td{ display:block; width:auto; }
/* 🔴 `tr` **ไม่อยู่** ในรายการรีเซ็ตนี้โดยเจตนา — เหตุผลเดียวกับ .pm-cartlist
   `.pm-review tr` (0,1,1) จะชนะ `.pm-review__line` (0,1,0) แล้วทับ display:grid */
/* 🔴 ครึ่งล่างของการ์ด "Your order" — ต่อกับ .pm-checkout__asidetitle ที่เป็นครึ่งบน
   (เหตุผลที่ต้องแบ่งสองครึ่งอยู่ที่ pm-layout.css) */
#pm-main.pm-checkout .pm-review{
  margin:0; border-collapse:collapse;
  background:var(--color-surface);
  border:1px solid var(--color-line);
  border-top:0;
  border-radius:0 0 var(--radius-xl) var(--radius-xl);
  padding:var(--s3);
}

/* 🔴 กริดของแถวมี **สองคอลัมน์** ไม่ใช่สามคอลัมน์ — ลูกโดยตรงของ <tr> คือ <td> สองใบเท่านั้น
   (`td.product-name` กับ `td.product-total`) ส่วนรูปกับชื่อเป็น <span> ที่อยู่ *ข้างใน* td ใบแรก
   ⛔ เคยเขียนเป็น `56px minmax(0,1fr) auto` เมื่อ 16 ก.ย. ซึ่งผิด:
      คอลัมน์ 56px ไปตกใส่ `td.product-name` ทั้งใบ → ชื่อสินค้าถูกบีบเหลือบรรทัดละคำ
      (เจอตอนเปิด preview จริงที่ 1440px ไม่ใช่ตอนอ่านโค้ด)
   🔴 รูป+ชื่อจัดกันเองที่ `td.product-name` ข้างล่าง ไม่ใช่ที่ระดับ <tr> */
#pm-main.pm-checkout .pm-review > tbody > tr.pm-review__line{
  display:grid;
  grid-template-columns:minmax(0,1fr) auto;
  gap:var(--s2);
  align-items:center;
  padding:var(--s2) 0;
  border-top:1px solid var(--color-line);
}
#pm-main.pm-checkout .pm-review > tbody > tr.pm-review__line:first-child{ border-top:0; padding-top:0; }
#pm-main.pm-checkout .pm-review__line .product-name{
  display:flex; gap:var(--s2); align-items:center; min-width:0;
}
/* 🔴 `.pm-media` เป็น <span> ที่นี่ (อยู่ใน <td>) → ค่าเริ่มต้นเป็น inline ซึ่งรับ width ไม่ได้ */
#pm-main.pm-checkout .pm-review__thumb{ display:block; width:52px; flex:none; border-radius:var(--radius-sm); overflow:hidden; }   /* artboard 52px / 10px */
#pm-main.pm-checkout .pm-review__body{ display:block; min-width:0; }
#pm-main.pm-checkout .pm-review__name{
  display:block;
  font-size:var(--fs-h6); font-weight:600; line-height:1.3;
  color:var(--color-brand-ink);                 /* 6.35 ✅ */
}
#pm-main.pm-checkout .pm-review__name .product-quantity{ color:var(--color-ink-muted); font-weight:400; }
#pm-main.pm-checkout .pm-review .product-total{ text-align:right; font-size:var(--fs-small); font-weight:600; color:var(--color-ink); }
/* ตัวเลือกสินค้า (variation) ที่ wc_get_formatted_cart_item_data() พ่นออกมา */
#pm-main.pm-checkout .pm-review__body dl.variation{ margin:2px 0 0; font-size:var(--fs-meta); color:var(--color-ink-muted); }
#pm-main.pm-checkout .pm-review__body dl.variation dt,
#pm-main.pm-checkout .pm-review__body dl.variation dd{ display:inline; margin:0; }
#pm-main.pm-checkout .pm-review__body dl.variation dd{ margin-right:var(--s1); }

/* แถวยอดเงิน */
#pm-main.pm-checkout .pm-review > tfoot > tr{
  display:flex; justify-content:space-between; gap:var(--s2);
  align-items:baseline;
  padding:var(--s1) 0;
  font-size:var(--fs-small);
}
#pm-main.pm-checkout .pm-review > tfoot > tr:first-child{ border-top:1px solid var(--color-line); padding-top:var(--s2); margin-top:var(--s2); }
#pm-main.pm-checkout .pm-review > tfoot th{ font-weight:400; color:var(--color-ink-muted); text-align:left; }
#pm-main.pm-checkout .pm-review > tfoot td{ text-align:right; color:var(--color-ink); font-weight:600; }
#pm-main.pm-checkout .pm-review .amount{ font-variant-numeric:tabular-nums; }
#pm-main.pm-checkout .pm-review .cart-discount td{ color:var(--color-brand-ink); }

/* วิธีจัดส่ง — 🔴 render อยู่ **ในตารางนี้** ตาม WooCommerce ไม่ได้ย้ายออก
   (ไฟล์ออกแบบแยกเป็นการ์ดต่างหาก · เหตุผลที่ไม่ย้ายอยู่ที่หัว review-order.php §3) */
/* 🔴 ไฟล์ออกแบบแยก "Shipping method" เป็นการ์ดของตัวเองในคอลัมน์ขวา
   ⛔ **ย้ายออกจากตารางไม่ได้** — `wc_cart_totals_shipping_html()` ต้องอยู่ในเขต fragment
      '.woocommerce-checkout-review-order-table' ไม่งั้นตัวเลือกจะไม่อัปเดตตอนเปลี่ยนที่อยู่
      (และถ้า echo นอก <table> จะงอกซ้ำทุกครั้งที่รีเฟรช — บั๊กที่แก้ไปแล้ว)
   ✅ จึงทำให้มัน **อ่านเป็นกล่องแยก** อยู่ในการ์ดเดียวกันแทน: มีเส้นคาด พื้นต่างระดับ และหัวข้อของตัวเอง
      หัวข้อ "Shipping method" มาจากฟิลเตอร์ woocommerce_shipping_package_name ใน functions.php */
#pm-main.pm-checkout .pm-review > tfoot > tr.woocommerce-shipping-totals{
  display:block;
  margin:var(--s2) 0;
  padding:var(--s2);
  background:var(--color-paper);
  border:1px solid var(--color-line);
  border-radius:var(--radius-md);
}
#pm-main.pm-checkout .pm-review .woocommerce-shipping-totals th{
  display:block; margin-bottom:var(--s2);
  font-size:var(--fs-label); font-weight:600;
  letter-spacing:.14em; text-transform:uppercase;
  color:var(--color-ink-muted);
  text-align:left;
}
/* ⛔ แถว tfoot ทั่วไปตั้ง `text-align:right` ไว้สำหรับคอลัมน์ตัวเลข
   กล่องวิธีส่งไม่ใช่แถวตัวเลข ต้องล้างทิ้ง ไม่งั้นข้อความตัวเลือกจะชิดขวาและอ่านยาก */
#pm-main.pm-checkout .pm-review > tfoot > tr.woocommerce-shipping-totals td{ text-align:left; min-width:0; }
/* 🔴 `#shipping_method` เป็น <ul> ที่ไม่มี min-width:0 จะดันกล่องกว้างตามคำที่ยาวที่สุด
   ทำให้การ์ดทั้งใบล้นออกนอกคอลัมน์ขวาที่จอแคบ */
#pm-main.pm-checkout .pm-review #shipping_method{ min-width:0; }
#pm-main.pm-checkout .pm-review #shipping_method li{ min-width:0; }
#pm-main.pm-checkout .pm-review #shipping_method{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:var(--s1); }
#pm-main.pm-checkout .pm-review #shipping_method li{ margin:0; }
/* 🔴 โครงของ WooCommerce คือ `<li><input><label></li>` — **input เป็นพี่น้องกับ label ไม่ได้อยู่ข้างใน**
   ⛔ เคยตั้ง flex ไว้ที่ `label` (16 ก.ย.) ซึ่งผิด → radio หลุดไปลอยมุมขวาบน ข้อความชิดขวา
      (เห็นตอนเปิด preview จริง ไม่เห็นตอนอ่านโค้ด)
   ✅ ตัว flex ต้องเป็น `li` เพื่อให้ radio กับข้อความอยู่บรรทัดเดียวกัน */
#pm-main.pm-checkout .pm-review #shipping_method li{
  display:flex; gap:var(--s2); align-items:center;
  padding:var(--s1) var(--s2);
  border:1px solid var(--color-line);
  border-radius:var(--radius-md);               /* artboard 14px */
  background:var(--color-surface);
}
/* 🔴 `gap:0 .35em` จำเป็น ไม่ใช่ของตกแต่ง
   WooCommerce พ่นป้ายเป็น `Standard shipping: <span class="amount">$10.00</span>`
   พอ label เป็น flex ตัวอักษรกับ <span> กลายเป็น flex item คนละตัว → **ช่องว่างระหว่างกันถูกกลืน**
   ได้ผลเป็น "Standard shipping:$10.00" ติดกัน (เห็นตอนเปิด preview จริง)
   ⛔ อย่าแก้ด้วยการเติม &nbsp; ใน PHP — ป้ายมาจาก WooCommerce ไม่ใช่ของเรา */
#pm-main.pm-checkout .pm-review #shipping_method label{
  display:flex; align-items:center; flex-wrap:wrap;
  gap:0 .35em;
  flex:1; min-width:0; margin:0;
  min-height:44px;                               /* F-3 ✅ พื้นที่กดเต็มแถว */
  text-align:left;                               /* ทับ text-align:right ของแถว tfoot */
  font-size:var(--fs-small); color:var(--color-ink-body);
  cursor:pointer;
  /* 🔴 ป้ายวิธีส่งเป็น **ข้อความที่ตั้งในปลั๊กอิน** เปลี่ยนเมื่อไรก็ได้โดยไม่มีใครบอกเรา
     วันนี้ยาว 4 บรรทัด ("Express Parcel Service by DHL | Note: Enjoy Free Shipping…")
     พรุ่งนี้อาจสั้นเหลือ "Standard" / "Express" → **เลย์เอาต์ต้องไม่พังทั้งสองทาง**
     ⛔ ห้ามตั้งความสูงตายตัวหรือ white-space:nowrap ให้แถวนี้ */
  overflow-wrap:anywhere;                        /* คำยาวไม่มีช่องว่างต้องตัดได้ ไม่ดันขอบทะลุ */
}
/* ราคาไปชิดขวาเสมอ ตามไฟล์ออกแบบ — ได้ผลทั้งป้ายสั้นและป้ายยาว
   ป้ายสั้น: ชื่อซ้าย ราคาขวา บรรทัดเดียว · ป้ายยาว: ข้อความไหลหลายบรรทัด ราคายังชิดขวา */
#pm-main.pm-checkout .pm-review #shipping_method label .amount{ margin-left:auto; padding-left:var(--s2); white-space:nowrap; }
/* 🔴 ตอนค่าส่งเป็น 0 ป้ายไม่มี <span class="amount"> ให้จับ — pm_ship_label_free() (mu-plugin)
   จึงห่อคำว่า Free ด้วย `.pm-ship-free` เพื่อให้ชิดขวาตำแหน่งเดียวกับราคาของอีกตัวเลือก
   ⛔ ห้ามใช้ class ของ WooCommerce (`amount`) กับคำที่ไม่ใช่ตัวเลข */
#pm-main.pm-checkout .pm-review #shipping_method label .pm-ship-free{ margin-left:auto; padding-left:var(--s2); white-space:nowrap; }
/* ⛔ ต้องล้าง min-height/min-width ด้วย ไม่ใช่แค่ width/height (แก้ 17 ก.ย. 2026)
   กฎฟอร์มของธีมแม่ตั้ง `min-height:48px` ไว้กับ input ทุกตัว → วัดจริงได้ **18×48**
   คือวงรีสูงผิดรูป ไม่ใช่วงกลม · มองข้ามไปตอนรอบ 16 ก.ย. เพราะดูแต่ width */
#pm-main.pm-checkout .pm-review #shipping_method input[type="radio"]{
  width:18px; height:18px; min-width:18px; min-height:0; flex:none; margin:0; padding:0;
  appearance:auto; -webkit-appearance:radio;
  accent-color:var(--color-brand);
}
/* สถานะที่เลือกอยู่ — :has() จึงไม่ต้องพึ่ง JS เติมคลาส (C-10) เหมือน .pm-pay */
#pm-main.pm-checkout .pm-review #shipping_method li:has(input:checked){ border-color:var(--color-brand); background:var(--color-shade); }
#pm-main.pm-checkout .pm-review #shipping_method li:has(input:focus-visible){ outline:2px solid var(--color-brand-ink); outline-offset:2px; }
/* เหลือวิธีส่งเดียว WooCommerce จะ render เป็น hidden input + ข้อความล้วน (ไม่มี radio ให้เลือก)
   ⛔ ตอนนั้นห้ามวาดกรอบการ์ด ไม่งั้นได้กล่องเปล่าที่กดไม่ได้ */
#pm-main.pm-checkout .pm-review #shipping_method li:not(:has(input[type="radio"])){
  border:0; background:none; padding:0;
  font-size:var(--fs-small); color:var(--color-ink-body);
}
#pm-main.pm-checkout .pm-review .woocommerce-shipping-destination{ font-size:var(--fs-meta); color:var(--color-ink-muted); margin:var(--s1) 0 0; }
#pm-main.pm-checkout .pm-review .shipping-calculator-button{ font-size:var(--fs-meta); color:var(--color-brand-ink); }

#pm-main.pm-checkout .pm-review__total{ border-top:1px solid var(--color-line); margin-top:var(--s1); padding-top:var(--s2) !important; } /* ทับ padding ของแถวทั่วไปข้างบน (C-7) */
#pm-main.pm-checkout .pm-review__total th{ font-size:var(--fs-h6); color:var(--color-ink-muted); }
/* ไฟล์ออกแบบใช้ 34px — ตรงกับ --fs-d4 ในสเกลพอดี ไม่ต้องคิดค่าใหม่ */
#pm-main.pm-checkout .pm-review__total td{ font-family:var(--font-display); font-size:var(--fs-d4); line-height:1; color:var(--color-brand-ink); font-weight:400; }

/* 🔴 ตอนนี้เป็น `<tr>` ใน <tfoot> แล้ว (ดูเหตุผลที่ functions.php)
   จึงต้องล้าง display:flex ของแถว tfoot ทั่วไปออก ไม่งั้นลิงก์จะถูกดันไปชิดขวา */
#pm-main.pm-checkout .pm-review > tfoot > tr.pm-review__editrow{
  display:block; padding:0; border-top:0;
}
#pm-main.pm-checkout .pm-review__editrow td{ text-align:left; }
/* 🔴 ต้องสูง 44px ตาม F-3 — เป็น **ลิงก์เดี่ยว** ไม่ใช่ลิงก์ในย่อหน้า
   จึงไม่เข้าข้อยกเว้น "ลิงก์ในเนื้อความ" ที่ design.md §7.4 ผ่อนให้
   (วัดจริงตอนตรวจจอแคบได้ 21px — ไม่เห็นตอนอ่านโค้ด)
   ⛔ อย่าใช้ padding อย่างเดียว เพราะ inline element ไม่ขยายความสูงกล่องตาม padding แนวตั้ง */
#pm-main.pm-checkout .pm-review__edit{
  display:inline-flex; align-items:center;
  min-height:44px;
  font-size:var(--fs-meta); font-weight:600; color:var(--color-brand-ink);
}
#pm-main.pm-checkout .pm-review__edit::before{ content:"\2190"; margin-right:6px; }   /* ← ตามไฟล์ออกแบบ */

/* ============================================================
   การ์ดชำระเงิน
   🔴 อ่านหัวไฟล์ woocommerce/checkout/payment-method.php ก่อนแก้บล็อกนี้ —
      ไฟล์ออกแบบวาดช่องกรอกบัตรและ badge Stripe ไว้ ซึ่ง **ไม่มีของจริงรองรับ**
   ============================================================ */
#pm-main.pm-checkout #payment .pm-checkout__pay{ padding:var(--s4); }
#pm-main.pm-checkout #payment .pm-paylist{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:var(--s2); }

#pm-main.pm-checkout #payment .pm-pay{
  border:1px solid var(--color-line);
  border-radius:var(--radius-md);               /* artboard 14px */
  background:var(--color-surface);
  overflow:hidden;
  position:relative;
}
/* 🔴 radio ตัวจริงยังอยู่ใน DOM และยังโฟกัสได้ — ซ่อนแบบ .pm-visually-hidden ไม่ได้
   เพราะ checkout.js อ่าน :checked ของมัน · จึงวางทับ label แล้วทำให้มองไม่เห็นแทน
   ⛔ ห้ามใช้ display:none — จะกด Tab ไปไม่ถึงและ checkout.js จะเลือกวิธีจ่ายไม่ได้ */
#pm-main.pm-checkout #payment .pm-pay__radio{
  position:absolute; left:var(--s3); top:calc(var(--s3) - 1px);
  width:18px; height:18px; margin:0;
  accent-color:var(--color-brand);
}
#pm-main.pm-checkout #payment .pm-pay__label{
  display:flex; flex-wrap:wrap; gap:var(--s1) var(--s2); align-items:center;
  padding:var(--s3) var(--s3) var(--s3) calc(var(--s3) + 18px + var(--s2));
  min-height:44px;                               /* F-3 ✅ */
  cursor:pointer;
  margin:0;
}
#pm-main.pm-checkout #payment .pm-pay__name{
  font-size:var(--fs-small); font-weight:600; line-height:1.3;
  color:var(--color-brand-ink);                 /* 6.35 ✅ */
  min-width:0;                                   /* ชื่อ gateway ของ 2C2P ยาวมาก ต้องตัดบรรทัดได้ */
}
#pm-main.pm-checkout #payment .pm-pay__icon{ display:inline-flex; gap:6px; align-items:center; }
#pm-main.pm-checkout #payment .pm-pay__icon img{ max-height:22px; width:auto; display:block; }

/* การ์ดที่ถูกเลือกอยู่ — :has() ทำให้ไม่ต้องพึ่ง JS เติมคลาส (C-10)
   🔴 มีคู่ `.pm-pay.is-chosen` ไว้ด้วยเผื่อ browser ที่ยังไม่รองรับ :has()
      ⛔ อย่าถอด fallback นี้ทิ้ง — WooCommerce ไม่ได้เติมคลาสให้ ต้องอาศัย :has() เป็นหลัก */
#pm-main.pm-checkout #payment .pm-pay:has(.pm-pay__radio:checked){ border-color:var(--color-brand); background:var(--color-shade); }
#pm-main.pm-checkout #payment .pm-pay:has(.pm-pay__radio:focus-visible){ outline:2px solid var(--color-brand-ink); outline-offset:2px; }

#pm-main.pm-checkout #payment .pm-pay .payment_box{
  background:var(--color-paybox);               /* artboard FAF7EF */
  border-top:1px solid var(--color-paybox-line);
  padding:var(--s3);
  font-size:var(--fs-meta); line-height:1.55;
  color:var(--color-ink-body);
}
#pm-main.pm-checkout #payment .pm-pay .payment_box p{ margin:0; }
#pm-main.pm-checkout #payment .pm-pay .payment_box p + p{ margin-top:var(--s1); }

/* ---- เงื่อนไข / นโยบายความเป็นส่วนตัว ----
   🔴 วันนี้ในนี้มีแต่ข้อความนโยบายความเป็นส่วนตัว — checkbox ยอมรับเงื่อนไขยังไม่ render
      เพราะ woocommerce_terms_page_id ยังว่าง (ดูหัวไฟล์ woocommerce/checkout/terms.php) */
#pm-main.pm-checkout #payment .pm-terms{ margin:var(--s3) 0 0; }
#pm-main.pm-checkout #payment .pm-terms .woocommerce-privacy-policy-text p{
  font-size:var(--fs-meta); line-height:1.55; color:var(--color-ink-muted); margin:0;
}
#pm-main.pm-checkout #payment .pm-terms .woocommerce-privacy-policy-link{ color:var(--color-brand-ink); font-weight:600; }

/* ---- ปุ่มสั่งซื้อ ---- */
#pm-main.pm-checkout #payment .pm-checkout__place{ margin:var(--s3) 0 0; padding:0; }
#pm-main.pm-checkout #payment .pm-checkout__submit{ width:100%; border-radius:var(--radius-pill); min-height:56px; }   /* artboard แคปซูล padding 18px */
#pm-main.pm-checkout #payment .pm-checkout__place noscript{ display:block; font-size:var(--fs-meta); color:var(--color-ink-body); margin-bottom:var(--s2); }

/* ---- แถบความมั่นใจท้ายคอลัมน์ขวา ---- */
#pm-main.pm-checkout .pm-checkout__assure{
  list-style:none; margin:0; padding:var(--s3);
  background:var(--color-surface);
  border:1px solid var(--color-line);
  border-radius:var(--radius-lg);               /* artboard 18px */
  display:flex; flex-direction:column; gap:var(--s1);
  font-size:var(--fs-meta); line-height:1.5; color:var(--color-ink-body);
}
#pm-main.pm-checkout .pm-checkout__assure a{ color:var(--color-brand-ink); font-weight:600; }

@media(max-width:1024px){
  /* ปุ่มสั่งซื้อต้องอยู่ในระยะนิ้วโป้งเมื่อคอลัมน์ขวาไหลลงมาต่อท้าย */
  #pm-main.pm-checkout .pm-checkout__card{ padding:var(--s3); }
}
@media(max-width:560px){
  /* ⛔ ยุบเป็นคอลัมน์เดียว — ที่ 375px ช่องคู่จะแคบจนชื่อเมืองพิมพ์แล้วอ่านไม่ออก */
  #pm-main.pm-checkout .pm-fieldgrid{ grid-template-columns:1fr; }
  #pm-main.pm-checkout .pm-review__thumb{ width:48px; }
}

/* ============================================================
   รอบขึ้น staging 17 ก.ย. 2026 — **ความจำเพาะของหน้า Checkout**
   รายงาน: docs/report-checkout-staging-2026-09-17.md
   ============================================================
   บล็อกนี้ไม่ได้เพิ่มดีไซน์ใหม่แม้แต่ค่าเดียว — ทุกค่าซ้ำกับกฎข้างบนทั้งหมด
   มีไว้เพื่อ **ไล่ความจำเพาะ** ให้ชนะของที่ประกาศมาจากนอกธีม ซึ่งวัดได้บนหน้าจริง
   เท่านั้น (preview แบบ static ไม่มีไฟล์พวกนี้ จึงไม่มีทางเห็น)

   คู่แข่งที่วัดได้จริงบน /wp-stagging/checkout/ (17 ก.ย. 2026)
     · ธีมแม่ Bajaar `woocommerce.css?ver=1.6` ลำดับ 40
         `.woocommerce-checkout .woocommerce form .form-row input.input-text`  (0,4,1)
         `.checkout.woocommerce-checkout h3`                                   (0,2,1)
         `.woocommerce button.button.alt`                                      (0,3,0)
         `.woocommerce table.shop_table.woocommerce-checkout-review-order-table th` (0,3,1)
     · WooCommerce core ลำดับ 26 · select2 ลำดับ 22
         `.woocommerce-checkout #payment div.payment_box`                      (1,1,2)
         `.woocommerce table.shop_table`                                       (0,2,1)
     · Additional CSS (`wp-custom-css`) ลำดับ 58 — ส่วนของหน้า checkout **ถูกย้ายออกแล้ว**
       รอบนี้ (ดูรายงาน §4) เหลือเฉพาะกฎ global ที่ยังใช้ `!important` กับราคา

   ⛔ ไม่ใช้ `!important` ยกเว้นข้อ 7 ข้อเดียว ซึ่งฝั่งตรงข้ามประกาศ `!important`
      มาจากนอกธีมก่อน จึงไม่มีทางชนะด้วยความจำเพาะ (C-7 อนุญาตกรณีนี้ตรง ๆ)
   ⛔ เงื่อนไขที่ต้องจริงตลอด: `pm-components.css` (52) ต้องอยู่หลัง
      `woocommerce.css` (26 · 40) และ `select2.css` (22) ใน DOM เสมอ
   ============================================================ */

/* ---- 1) ช่องกรอก · textarea — Bajaar ใส่ radius 4px + ขอบสีเทาอมฟ้ามาทับ ---- */
#pm-main.pm-checkout form.checkout .form-row input.input-text,
#pm-main.pm-checkout form.checkout .form-row textarea.input-text{
  border:1px solid var(--color-line-strong);
  border-radius:var(--radius-sm);               /* artboard 10px */
}
.pm-checkout form.checkout .form-row input.input-text:focus,
#pm-main.pm-checkout form.checkout .form-row textarea.input-text:focus{
  border-color:var(--color-brand-ink);
}

/* ---- 2) select2 ของ Country / State ---- */
#pm-main.pm-checkout form.checkout .form-row .select2-container .select2-selection--single{
  border:1px solid var(--color-line-strong);
  border-radius:var(--radius-sm);
}

/* ---- 3) หัวการ์ด — Bajaar บังคับ h3 ในฟอร์ม checkout เป็น 18px ---- */
#pm-main.pm-checkout form.checkout h3.pm-checkout__cardtitle{
  font-size:var(--fs-d5);                       /* artboard 28 → สเกล 29 */
}
#pm-main.pm-checkout form.checkout .pm-checkout__aside h3.pm-checkout__cardtitle{
  font-size:var(--fs-d5b);                      /* artboard 24 */
}
/* ⛔ ต้องอยู่ **หลัง** สองกฎบน — ความจำเพาะเท่ากับกฎแรก ตัวท้ายจึงชนะ
   (h3 ใบนี้ครอบ checkbox "Ship to a different address?" ไม่ใช่หัวการ์ด) */
#pm-main.pm-checkout form.checkout h3.pm-checkout__cardtitle--toggle{
  font-size:var(--fs-h5);
}

/* ---- 4) ตารางสรุปออเดอร์ — core ให้ radius 5px กับ table.shop_table ทุกใบ ---- */
#pm-main.pm-checkout table.shop_table.pm-review{
  border:1px solid var(--color-line);
  border-top:0;
  border-radius:0 0 var(--radius-xl) var(--radius-xl);   /* ครึ่งล่างของการ์ด */
}

/* ---- 5) กล่องคำอธิบายช่องทางจ่ายเงิน — core ใช้ #payment จึงมี id ในความจำเพาะ ---- */
#pm-main.pm-checkout #payment div.payment_box{
  background:var(--color-paybox);
  border-top:1px solid var(--color-paybox-line);
  color:var(--color-ink-body);
}

/* ---- 6) แถวยอดรวม — Bajaar บังคับ th ในตารางสรุปเป็น 16px ---- */
#pm-main.pm-checkout table.pm-review tr.pm-review__total th{
  font-size:var(--fs-h6); color:var(--color-ink-muted);
}
#pm-main.pm-checkout table.pm-review tr.pm-review__total td{
  font-family:var(--font-display); font-size:var(--fs-d4);
  line-height:1; color:var(--color-brand-ink); font-weight:400;
}

/* ---- 7) 🔴 กรณีเดียวที่ต้องใช้ !important ----
   `wp-custom-css` ประกาศ `.woocommerce-Price-amount.amount{font-family:"DM Sans"!important}`
   ไว้เป็นกฎ global (ไม่ได้อยู่ในส่วน checkout ที่ย้ายออกไปแล้ว) → ความจำเพาะเอาชนะไม่ได้
   🔴 "DM Sans" ไม่ได้ถูกโหลดบนเว็บนี้เลย ราคาจึงตกไปที่ sans-serif ของเครื่อง = หลุดชุดฟอนต์
   ⛔ ขอบเขตจำกัดที่ `.pm-checkout` เท่านั้น — หน้าอื่นยังเป็นหนี้ที่ต้องเก็บแยก */
#pm-main.pm-checkout .pm-review .woocommerce-Price-amount.amount{
  font-family:var(--font-body) !important;
}
#pm-main.pm-checkout .pm-review tr.pm-review__total .woocommerce-Price-amount.amount{
  font-family:var(--font-display) !important;
}

/* ---- 8) ปุ่ม Place order — `.woocommerce button.button.alt` ให้พื้นสีน้ำเงินของ Bajaar ---- */
#pm-main.pm-checkout #payment #place_order.pm-checkout__submit{
  background:var(--color-brand); color:var(--color-on-night);   /* 5.20 ✅ */
  border:0; border-radius:var(--radius-pill);
  font-family:var(--font-body); font-size:15px; font-weight:600;
}
#pm-main.pm-checkout #payment #place_order.pm-checkout__submit:hover{ background:var(--color-ink); }

/* ---- 9) ฟอร์มคูปอง — อยู่ **นอก** `form.checkout` จึงไม่โดนกฎข้อ 1 ----
   `<form class="checkout_coupon">` เป็นพี่น้องกับฟอร์มหลัก (โครงของ WooCommerce)
   คู่แข่ง: `.woocommerce form.checkout_coupon` (0,2,1) · `.woocommerce .checkout_coupon .button` (0,3,0) */
#pm-main.pm-checkout form.checkout_coupon.pm-couponform{
  border:1px solid var(--color-line-strong);
  border-radius:var(--radius-md);               /* artboard 14px */
}
#pm-main.pm-checkout form.checkout_coupon .form-row input.input-text{
  border:1px solid var(--color-line-strong);
  border-radius:var(--radius-sm);
}
/* 🔴 ปุ่ม "Apply coupon" — ต้องนำหน้าด้วย **`#pm-main`** ไม่ใช่ `.pm-checkout`
   ธีมแม่ Bajaar (`bajaar-style-inline-css`) มีกฎรวมยักษ์ตัวหนึ่งที่พ่นสีแบรนด์ของมันเอง
   ลงกับ selector list ยาวมาก **และในลิสต์นั้นมี id อยู่ด้วย** → ทั้งกฎจึงมีความจำเพาะ
   ระดับ id (1,0,x) ซึ่ง **ชนะ selector คลาสล้วนของเราทุกแบบ** (ทดสอบแล้วถึง (0,4,3) ก็ยังแพ้)
   ⛔ อย่าแก้ด้วย !important — แค่ยืม id ของ <main id="pm-main"> ที่ template มีอยู่แล้วก็พอ
   🔴 ปุ่ม Place order ไม่เจอปัญหานี้เพราะกฎของมันใช้ `#place_order` อยู่แล้ว */
#pm-main.pm-checkout form.checkout_coupon button.pm-btn--secondary{
  background:transparent; color:var(--color-ink);
  border:1px solid var(--color-line-strong);
  border-radius:var(--radius);
}
#pm-main.pm-checkout form.checkout_coupon button.pm-btn--secondary:hover{
  border-color:var(--color-ink); background:var(--color-surface);
}

/* ---- 10) 🔴 แถบ "Have a coupon?" — `!important` ตัวที่สอง และเหตุผลเดียวกับข้อ 7 ----
   `wp-custom-css` ส่วน **03 GLOBAL WOOCOMMERCE NOTICES** (ยังอยู่ · เป็นกฎ global)
   ประกาศ `.woocommerce-info{background:!important;color:!important;border-radius:!important}`
   → เอาชนะด้วยความจำเพาะไม่ได้ · จำกัดขอบเขตไว้ที่ `.pm-checkout` เท่านั้น
   🔴 หน้าอื่น (cart · shop · account) ยังโดนกฎ global ชุดนี้อยู่ — เป็นหนี้ที่ต้องเก็บแยก */
#pm-main.pm-checkout .pm-couponbar .woocommerce-info{
  background:var(--color-surface) !important;
  color:var(--color-ink-body) !important;
  border-radius:var(--radius-md) !important;
}

/* ---- 11) สองข้อที่เจอตอนวัดที่ 555px บนหน้าจริง (17 ก.ย. 2026) ----

   11.1 ล้นขอบแนวนอน 2px — ตัวการคือ **label ของช่องคูปองที่เป็น screen-reader-text**
        ฟิลเตอร์ของเราเติมคลาส `pm-field__label` ให้ label ทุกใบ รวมถึงใบที่ WooCommerce
        ตั้งใจให้ซ่อนไว้สำหรับ screen reader → กฎ `display:block;width:100%` ของเราไป
        ทับการซ่อน ทำให้กล่องกว้าง 512px ยื่นออกไป 558px (จอ 555px)
   ⛔ ห้ามแก้ด้วยการเอา label ออก — คนที่ใช้ screen reader ต้องได้ยินชื่อช่อง (F-1) */
#pm-main.pm-checkout .pm-field__label.screen-reader-text{
  position:absolute; width:1px; height:1px; padding:0; margin:-1px;
  overflow:hidden; clip-path:inset(50%); white-space:nowrap; border:0;
}

/* 11.2 ลิงก์ WhatsApp ในกล่องความมั่นใจสูง 19px — ต่ำกว่า F-3
        เป็น **ลิงก์เดี่ยวใน <li>** ไม่ใช่ลิงก์ในย่อหน้า จึงไม่เข้าข้อยกเว้น design.md §7.4
        (กรณีเดียวกับลิงก์ "Edit cart" ที่แก้ไปแล้วเมื่อ 16 ก.ย.) */
#pm-main.pm-checkout .pm-checkout__assure a{
  display:inline-flex; align-items:center; min-height:44px;
}

/* ---- 12) กล่องข้อความ (notice) ของหน้า checkout — คู่แฝดของบล็อก `.pm-cart .pm-notice` ----
   เพิ่ม 17 ก.ย. 2026 ตอนตรวจว่า error ตอนกรอกไม่ครบจะหน้าตาเป็นอย่างไร
   เหตุผลเดียวกับฝั่งตะกร้าทุกประการ: `wp-custom-css` **ส่วน 03 GLOBAL WOOCOMMERCE NOTICES**
   (ส่วน global — ไม่ได้ถูกย้ายออกพร้อมส่วนของ checkout) ประกาศ `!important` ครบชุดให้
   `.woocommerce-message` และ `.woocommerce-error` → ต้องตอบด้วย `!important` เหมือนกัน
   🔴 ถ้าไม่มีบล็อกนี้ ข้อความ "กรอกช่องนี้ไม่ครบ" จะโผล่มาเป็นดีไซน์เก่า (DM Sans · มุม 6px)
      กลางฟอร์ม Case A — เป็นจุดที่คนเห็นตอนกำลังจะจ่ายเงินพอดี
   ✅ ลบทั้งบล็อกได้ทันทีที่เก็บกวาด Additional CSS ส่วนที่เหลือ (01–09, 11–12) */
#pm-main.pm-checkout .pm-notice{
  margin:0 0 var(--s3) !important;
  padding:var(--s3) !important;
  background:var(--color-surface) !important;
  border:1px solid var(--color-line) !important;
  border-left:3px solid var(--color-line-strong) !important;
  border-radius:var(--radius) !important;
  font-family:var(--font-body) !important;
  font-size:var(--fs-small) !important;
  line-height:1.55;
  color:var(--color-ink-body) !important;
  list-style:none;
}
#pm-main.pm-checkout .pm-notice--success{ border-left-color:var(--color-brand) !important; }
#pm-main.pm-checkout .pm-notice--error{ border-left-color:var(--color-accent) !important; }
#pm-main.pm-checkout ul.pm-notice{ padding-left:var(--s3) !important; }
#pm-main.pm-checkout ul.pm-notice li{ margin:0; }
#pm-main.pm-checkout ul.pm-notice li + li{ margin-top:var(--s1); }
#pm-main.pm-checkout .pm-notice .button,
#pm-main.pm-checkout .pm-notice a{
  display:inline-flex; align-items:center;
  min-height:44px;                              /* F-3 */
  background:none !important; border:0 !important; border-radius:0 !important;
  font-family:var(--font-body) !important; font-weight:600;
  color:var(--color-brand-ink) !important; text-decoration:underline !important;
}

/* ════════════════════════════════════════════════════════════════════════════
   13) 🔴🔴 ชั้น "ล้างของนอกธีม" ของหน้า Checkout — เพิ่ม 17 ก.ย. 2026
   ════════════════════════════════════════════════════════════════════════════
   ปัญหาที่ข้อ 1–12 แก้ไม่ได้: กฎจากนอกธีม **ตั้งค่า property ที่ CSS ของเราไม่เคยเขียน**
   (ขอบทุกช่องของตาราง · padding 9/12px · text-align:center · font-size 14px ·
    uppercase + weight 600 ของหัวข้อ · พื้นและกรอบของกล่องจ่ายเงิน)
   → ไล่ความจำเพาะเท่าไรก็ไม่ชนะ เพราะ **ไม่มีอะไรไปแข่งด้วย** ต้องประกาศล้างเอง

   วิธีวัดว่าอะไรเกิน: เปิดหน้าจริง → ปิด stylesheet ทุกตัวที่ไม่ใช่ `pm-*.css`
   → อ่าน computed style ซ้ำ → ต่างกันตรงไหนคือของนอกธีมล้วน ๆ
   (เท่ากับเทียบกับ `preview/preview-checkout-2026-09-16.html` ซึ่งโหลดเฉพาะ pm-*.css)

   🔴 **ใช้ `:where()` โดยตั้งใจ** — `:where()` มีความจำเพาะ **0**
      ทั้งกฎจึงหนักเท่า `#pm-main.pm-checkout` = (1,1,0) เท่านั้น
      → ชนะของนอกธีมทุกตัว แต่ **แพ้กฎจริงของเราเองทุกข้อ** (ซึ่งมี (1,2,0) ขึ้นไป)
      ⛔ ห้ามเปลี่ยน `:where(...)` เป็น selector ธรรมดา — จะกลายเป็นตัวที่ทับงานตัวเอง
   ⛔ ห้ามใช้ `!important` ที่นี่ ด้วยเหตุผลเดียวกัน
   ════════════════════════════════════════════════════════════════════════════ */

/* ---- 13.1 หัวข้อ — Bajaar บังคับ uppercase + weight 600 ให้ h3 ในฟอร์ม checkout ----
   ค่าที่ล้างกลับไปคือค่าของ `pm-base.css` เอง (h1–h4 = weight 400 · margin 0) */
#pm-main.pm-checkout :where(h1,h2,h3,h4){
  font-weight:400; text-transform:none; margin:0; padding:0;
}
#pm-main.pm-checkout :where(h5,h6){
  font-weight:600; text-transform:none; margin:0; padding:0;
}

/* ---- 13.2 ตารางสรุปออเดอร์ — ต้นเหตุของ "ยอดเงินกลายเป็นกล่อง ๆ" ----
   `.woocommerce table.shop_table th/td` ของ Bajaar ใส่ border 1px รอบทุกช่อง +
   padding 9px/12px + text-align:center + font-size 14px ทั้งที่การ์ดของเราเป็น grid
   🔴 นี่คือสิ่งที่เห็นในภาพที่เจ้าของงานส่งมา: ราคาแต่ละบรรทัดมีกรอบล้อมรอบ */
#pm-main.pm-checkout :where(table,thead,tbody,tfoot,tr,th,td){
  border:0; background:transparent; box-shadow:none;
  padding:0; margin:0;
  font-family:inherit; font-size:inherit; font-weight:inherit;
  line-height:inherit; letter-spacing:inherit;
  color:inherit; text-align:inherit; text-transform:none;
  vertical-align:baseline;
}

/* ---- 13.3 กล่องช่องทางจ่ายเงิน · เงื่อนไข · ปุ่ม ----
   WooCommerce ให้ `#payment` พื้นเทา มุม 5px และวาดสามเหลี่ยมด้วย `::before`
   ให้ `.payment_box` — ทั้งหมดไม่มีในไฟล์ออกแบบ */
/* 🔴 ต้องมี `#payment` อยู่ **นอก** :where() — ของ WooCommerce คือ
   `.woocommerce-checkout #payment ul.payment_methods` (1,2,1) ซึ่งหนักกว่า (1,1,0)
   ⛔ กฎจริงของเราในบล็อกจ่ายเงินจึงถูกเติม `#payment` ให้เป็น (2,2,0) ไปพร้อมกัน */
#pm-main.pm-checkout #payment,
#pm-main.pm-checkout #payment :where(ul,li,div,p){
  background:transparent; border:0; border-radius:0; box-shadow:none;
  padding:0; margin:0;
  font-family:inherit; font-size:inherit; font-weight:inherit;
  line-height:inherit; color:inherit; text-align:inherit; text-transform:none;
}
#pm-main.pm-checkout #payment div.payment_box::before,
#pm-main.pm-checkout #payment ul.payment_methods::after{
  content:none; display:none; border:0;
}

/* ---- 13.4 ปุ่มสั่งซื้อ — Bajaar ตั้ง display:block + capitalize ----
   ค่าที่ถูกต้องคือของ `.pm-btn` เอง (inline-flex จัดกลางในตัว) */
#pm-main.pm-checkout :where(button,input[type="submit"]){ text-transform:none; }
#pm-main.pm-checkout #payment #place_order.pm-checkout__submit{
  display:inline-flex; align-items:center; justify-content:center;
}


/* ---- 13.5 สามจุดสุดท้ายที่ต้องเรียกชื่อ id ตรง ๆ (วัดแล้วว่ายังแพ้) ----
   ทุกค่าซ้ำกับกฎข้างบน ไม่มีค่าใหม่ */

/* หัวการ์ด "Your order" — Woo ของ Bajaar เจาะจงถึง id: `.checkout.woocommerce-checkout h3#order_review_heading` (1,3,1) */
#pm-main.pm-checkout h3#order_review_heading.pm-checkout__asidetitle{
  padding:var(--s3) var(--s3) 0;
}

/* ปุ่มสั่งซื้อ — `.woocommerce button.button.alt{padding:14px 15px}` ชนะ `.pm-btn` (0,1,0) */
#pm-main.pm-checkout #payment #place_order.pm-checkout__submit{
  padding:0 30px; min-height:56px;
  /* `.woocommerce #payment #place_order{text-transform:capitalize}` (2,1,0)
     ทำให้ป้าย "Place order" กลายเป็น "Place Order" — ไม่ตรงไฟล์ออกแบบ */
  text-transform:none;
}


/* ════════════════════════════════════════════════════════════════════════════
   14) หน้าสินค้าเดี่ยว (Case A) — เพิ่ม 18 ก.ย. 2026
   ════════════════════════════════════════════════════════════════════════════
   ที่มา: Claude Design `Case A - Product.dc.html` · รายงาน docs/report-product-2026-09-18.md

   🔴🔴 **ทุก selector ในบล็อกนี้ขึ้นต้นด้วย `#pm-main.pm-product` โดยตั้งใจ**
   คำสั่งเจ้าของงานรอบนี้: *"เรื่อง css จะไปชนกับใน ตัวก่อนหน้านั้น
   เราจะเน้นให้ มันแสดงของเราเท่านั้นตัวเก่าจะไม่ต้องแสดงออกมานะ"*

   หน้าสินค้าเป็นหน้าที่มี CSS มาชนเยอะที่สุดในเว็บนี้ — นับจริงบน staging 18 ก.ย. 2026
   ได้ **53 stylesheet** และ **4 ตัวโหลดทีหลัง pm-components.css** ได้แก่
   `elementor/frontend.min.css` · `uploads/elementor/css/post-8355.css` (ShopEngine
   `PM Single Product`) · `post-3155.css` (Elementor Kit) · ชุด Fluent Forms
   → **ลำดับไฟล์ช่วยเราไม่ได้** ต้องชนะด้วยความจำเพาะอย่างเดียว
   `#pm-main.pm-product` = (1,1,0) ซึ่งหนักกว่าทุกอย่างที่ของพวกนั้นใช้จริง

   ── ชั้นป้องกันที่สอง: **ไม่ยืมชื่อคลาสของ WooCommerce เลย** ────────────────
   CSS ของ WooCommerce ฝั่งหน้าสินค้าทั้งก้อนเกาะอยู่ใต้ `.woocommerce div.product …`
   (`div.images` · `div.summary` · `form.cart` · `.quantity` · `span.price` ·
    `.woocommerce-tabs ul.tabs` · `table.shop_attributes` · `span.onsale`)
   เทมเพลตของเราไม่ใช้ชื่อพวกนี้แม้แต่ชื่อเดียว → กฎเหล่านั้น **ไม่มีวัน match**
   ⛔ ห้าม session ไหนเติมคลาสของ WooCommerce กลับเข้า markup เพื่อ "ให้ปลั๊กอินอื่นทำงานได้"
      ถ้าต้องการ ให้เติมเป็น data-attribute แทน · หรือคุยกันก่อนว่าจะยอมรับ CSS ก้อนไหนเข้ามา
   ⛔ ห้ามเรียก woocommerce_show_product_images() / woocommerce_output_product_data_tabs()
      — ทั้งคู่พ่นคลาสชุดนั้นออกมาเอง (เหตุผลเต็มอยู่หัว template-parts/product/gallery.php)

   ── ตัวที่ยังเอื้อมถึงเราได้ และถูกจัดการที่ไหน ─────────────────────────────
   1. `wp-custom-css` §01 GLOBAL FONT OVERRIDE (`h1..h6` / `body,p,li,…` + !important)
      → แก้ที่ **pm-utilities.css** บล็อกฟอนต์ (ต้องเติมคลาส `.pm-product` เข้าไปด้วย — ทำแล้ว)
   2. `wp-custom-css` §04 GLOBAL PRICE COLOR (`.woocommerce-Price-amount.amount` + !important)
      → ข้อ 14.9 ข้างล่าง
   3. กฎระดับ element ของ Bajaar/Woo ที่เกาะ `body.woocommerce` (ตาราง · ปุ่ม · หัวข้อ)
      → ชั้นล้าง `:where()` ข้อ 14.10
   ════════════════════════════════════════════════════════════════════════════ */

/* ---- 14.1 §1 ภาพสินค้า ---- */
#pm-main.pm-product .pm-gallery__main{
  /* ⛔ ห้ามใส่ border-radius ใหญ่ — --radius 2px คือมุมของทั้งธีม (pm-tokens.css) */
  border:1px solid var(--color-line);
}
#pm-main.pm-product .pm-gallery__thumb{
  display:block;
  border:1px solid var(--color-line);
  border-radius:var(--radius);
  overflow:hidden;
  /* B-9: micro-interaction 150–250ms · animate เฉพาะ transform/opacity
     ที่นี่เปลี่ยนแค่สีขอบ จึงใส่ transition ที่ border-color อย่างเดียว */
  transition:border-color var(--dur-micro) ease;
}
#pm-main.pm-product .pm-gallery__thumb:hover{ border-color:var(--color-line-strong); }
/* ใบที่กำลังแสดงอยู่ — ⛔ ห้ามสื่อด้วยสีอย่างเดียว markup มี aria-current ควบคู่แล้ว */
#pm-main.pm-product .pm-gallery__thumb.is-current{
  border-color:var(--color-brand); border-width:2px;
}

/* ---- 14.2 §1 คอลัมน์ขวา ---- */
#pm-main.pm-product .pm-pdp__title{
  font-size:var(--fs-d2);
  color:var(--color-brand-ink);   /* artboard ใช้ --color-brand (5.20) ซึ่งต่ำกว่า 4.5 ไม่ได้ที่ขนาดนี้…
                                     …จริง ๆ 5.20 ผ่าน แต่ใช้ --color-brand-ink (6.4x) ให้เท่ากับหัวเรื่องหน้าอื่น */
  margin:var(--s1) 0 var(--s2);
}
#pm-main.pm-product .pm-pdp__deck{ max-width:52ch; margin:0 0 var(--s3); }

#pm-main.pm-product .pm-pdp__price{ margin:0 0 var(--s3); }
#pm-main.pm-product .pm-pdp__amount{
  font-family:var(--font-display);
  font-size:var(--fs-d3);
  line-height:1;
  color:var(--color-brand-ink);
  font-variant-numeric:tabular-nums;
}

/* แถวซื้อ — ช่องจำนวนซ้าย ปุ่มขวา · ปุ่มยืดเต็มที่เหลือเหมือน artboard */
#pm-main.pm-product .pm-pdp__buy{
  display:flex; flex-wrap:wrap; align-items:center; gap:var(--s2);
  margin:0 0 var(--s3);
}
#pm-main.pm-product .pm-pdp__add{ flex:1 1 220px; min-height:56px; }

/* ปุ่ม −/+ ถูกซ่อนจาก PHP (`hidden`) · JS เป็นคนถอดออก
   ⛔ ห้ามใช้ `display:none` ที่นี่เพื่อซ่อน — attribute `hidden` ทำหน้าที่นั้นอยู่แล้ว
      และถ้าเขียนทับด้วย display:block ปุ่มจะโผล่กลับมาทั้งที่ยังไม่มี JS (F-2) */
#pm-main.pm-product .pm-qty--pdp{ flex:none; }
/* 🔴🔴 บั๊กที่จับได้ตอนทดสอบแบบปิด JS (18 ก.ย. 2026) — **ต้องมีบรรทัดนี้**
   `.pm-qty__btn{display:inline-flex}` (0,1,0) มาทีหลังกฎ `[hidden]{display:none}` ของเบราว์เซอร์
   ซึ่งจำเพาะเท่ากัน → **ปุ่ม −/+ โผล่ทั้งที่ยังมี attribute `hidden` อยู่**
   ผลคือคนที่ปิด JS เห็นปุ่มสองปุ่มที่กดแล้วไม่เกิดอะไร = กับดัก F-2 เป๊ะ ๆ
   ⛔ ห้ามลบบรรทัดนี้ · ⛔ ห้ามแก้ด้วยการถอด `hidden` ออกจาก PHP แล้วให้ JS เป็นคนเติม
      (ระหว่างที่ JS ยังไม่ทำงาน ปุ่มจะโผล่อยู่ดี) */
#pm-main.pm-product .pm-qty--pdp .pm-qty__btn[hidden]{ display:none; }

/* ---- 14.3 §1 แถวความมั่นใจ ---- */
#pm-main.pm-product .pm-assure{
  list-style:none; margin:var(--s3) 0; padding:var(--s3) 0;
  border-top:1px solid var(--color-line);
  border-bottom:1px solid var(--color-line);
  display:flex; flex-wrap:wrap; gap:var(--s2) var(--s4);
}
#pm-main.pm-product .pm-assure__item{
  display:flex; align-items:center; gap:var(--s1);
  font-size:var(--fs-small); color:var(--color-ink-body);
}
#pm-main.pm-product .pm-assure__ico{ flex:none; color:var(--color-brand-ink); }

/* ---- 14.4 §1 SKU / หมวด / แท็ก ---- */
#pm-main.pm-product .pm-meta{ margin:0; display:flex; flex-direction:column; gap:var(--s1); }
#pm-main.pm-product .pm-meta__row{ display:flex; flex-wrap:wrap; gap:var(--s1); font-size:var(--fs-small); }
#pm-main.pm-product .pm-meta__row dt{ font-weight:600; color:var(--color-ink); }
#pm-main.pm-product .pm-meta__row dd{ margin:0; color:var(--color-ink-muted); }
/* F-3: ลิงก์หมวด/แท็กต้องกดได้จริงบนมือถือ — วัดก่อนแก้ 18 ก.ย. 2026 ได้สูง **20px**
   ใช้วิธีเดียวกับ `.pm-breadcrumb a` ของธีมนี้ (inline-flex + min-height)
   ⛔ ห้ามแก้ด้วยการเพิ่ม padding อย่างเดียว — padding แนวตั้งบน inline element ไม่ดันกล่องจริง */
#pm-main.pm-product .pm-meta__row dd a{
  display:inline-flex; align-items:center; min-height:44px;
  color:var(--color-ink-muted);
  text-decoration:underline; text-underline-offset:3px;
}
#pm-main.pm-product .pm-meta__row dd a:hover{ color:var(--color-brand-ink); }
/* แถวจึงต้องจัดกลางแนวตั้งตามลิงก์ที่สูงขึ้น ไม่งั้น dt กับ dd จะไม่อยู่บรรทัดเดียวกัน */
#pm-main.pm-product .pm-meta__row{ align-items:center; }

/* ---- 14.5 §2 แถบสเปก (พื้น brand) ---- */
/* 🔴 `.pm-band--brand` ตั้งสีตัวอักษรเป็น --color-on-night ให้แล้วที่ pm-layout.css
      ที่นี่จึงตั้งแต่โครงกับขนาด ไม่ตั้งสีซ้ำ */
/* 🔴 บนพื้น --color-brand ใช้ได้ **สีเดียว** คือ --color-on-night (5.19:1 ✅)
      วัดจริง 18 ก.ย. 2026: --color-on-night-2 บน brand = **3.18:1** ตกเกณฑ์ B-3 (ต้อง ≥ 4.5)
      · --color-on-night-3 บน brand = 2.93:1 ยิ่งตก
      ⚠️ ค่า 7.71 / 7.10 ที่เขียนกำกับ token ไว้คือ **บนพื้น --color-night** ไม่ใช่บน brand
      ⛔ ห้ามใช้ on-night-2/3 บนแถบ brand ทุกกรณี
      แยกหัวข้อกับป้ายออกจากกันด้วย **ขนาดกับ letter-spacing** ไม่ใช่ด้วยความอ่อนของสี */
#pm-main.pm-product .pm-specs__head{ color:var(--color-on-night); margin:0 0 var(--s3); text-align:center; }
#pm-main.pm-product .pm-specs__cell{
  /* dt มาก่อน dd ใน DOM (HTML spec) → กลับลำดับที่การแสดงผล ไม่ใช่ที่ markup */
  display:flex; flex-direction:column-reverse; gap:var(--s1);
  border:1px solid var(--color-line-night);
  border-radius:var(--radius);
  background:var(--color-night-card);
  padding:var(--s3);
}
#pm-main.pm-product .pm-specs__val{
  margin:0;
  font-family:var(--font-display); font-size:var(--fs-d4); line-height:1.1;
  color:var(--color-on-night);
}
#pm-main.pm-product .pm-specs__lab{
  font-size:var(--fs-meta); line-height:1.4;
  letter-spacing:.06em;
  color:var(--color-on-night);   /* 5.19 บน brand ✅ — ดูเหตุผลที่ .pm-specs__head */
}

/* ---- 14.6 §3 แท็บ ---- */
#pm-main.pm-product .pm-details__head{ margin:0 0 var(--s3); }

/* 🔴 แถบปุ่มถูกซ่อนจนกว่า JS จะเติม `.is-js` ให้ (C-10)
   ⛔ ห้ามเอา display:none ออก — ไม่มี JS แล้วปุ่มพวกนี้จะเป็น tab stop ที่กดแล้วไม่เกิดอะไร (F-2) */
#pm-main.pm-product .pm-tabs__list{ display:none; }
#pm-main.pm-product .pm-tabs.is-js .pm-tabs__list{
  display:flex; flex-wrap:wrap; gap:var(--s1);
  border-bottom:1px solid var(--color-line);
  margin-bottom:var(--s4);
}
#pm-main.pm-product .pm-tabs__btn{
  background:none; border:0; border-bottom:2px solid transparent;
  margin-bottom:-1px;
  min-height:44px; padding:0 var(--s2);      /* F-3 ✅ */
  font-family:var(--font-body); font-size:var(--fs-h6); font-weight:600;
  color:var(--color-ink-muted); cursor:pointer;
  transition:color var(--dur-micro) ease, border-color var(--dur-micro) ease;
}
#pm-main.pm-product .pm-tabs__btn:hover{ color:var(--color-ink); }
#pm-main.pm-product .pm-tabs__btn[aria-selected="true"]{
  color:var(--color-brand-ink); border-bottom-color:var(--color-brand);
}
/* ไม่มี JS = ทุก panel เรียงต่อกัน จึงต้องมีระยะคั่นและเส้นแบ่งของตัวเอง */
#pm-main.pm-product .pm-tabs__panel + .pm-tabs__panel{
  margin-top:var(--s5); padding-top:var(--s5); border-top:1px solid var(--color-line);
}
#pm-main.pm-product .pm-tabs.is-js .pm-tabs__panel + .pm-tabs__panel{
  margin-top:0; padding-top:0; border-top:0;
}
/* หัวข้อของแต่ละ panel — จำเป็นเมื่อไม่มี JS · ซ้ำซ้อนเมื่อมีปุ่มแท็บแล้ว */
/* 🔴 แก้ 21 ก.ย. 2026 — ชื่อ panel เปลี่ยนจาก <h3> เป็น <h2> (แผน §2 D2) ขนาดจึงต้องขยับตาม
   d5 29 → **d4 34** = ขั้นของ `h2` ในคอลัมน์ "หน้าเนื้อหายาว" ของ design.md §5.3
   ทำให้ได้สเกลที่ลดหลั่นจริง: h2 แท็บ 34 → h3 ในเนื้อหา 29 → h4 21 (สัญญา .pm-prose บล็อก 15)
   ⚠️ **หนี้ที่ยังไม่เคาะ:** สีตรงนี้เป็น --color-brand-ink (ของเดิม 18 ก.ย.) แต่ design.md §5.2
      เขียนว่า "สีของหัวเรื่อง = --color-ink ทุกขั้น" และสัญญา .pm-prose ก็ใช้ --color-ink
      → หัวข้อแท็บกับหัวข้อในเนื้อหาจะคนละสี · ไม่แก้ในรอบนี้เพราะกระทบ .pm-pdp__title ด้วย
      (ทั้งคู่ตั้งไว้พร้อมกันเมื่อ 18 ก.ย.) ต้องเคาะเป็นเรื่องเดียวกัน */
#pm-main.pm-product .pm-tabs__title{ font-size:var(--fs-d4); line-height:1.15; letter-spacing:0;
                                     margin:0 0 var(--s3); color:var(--color-brand-ink); }
#pm-main.pm-product .pm-tabs.is-js .pm-tabs__title{
  /* ⛔ ห้ามใช้ display:none — screen reader ยังควรอ่านชื่อ panel ได้
     ใช้ชุดเดียวกับ .pm-visually-hidden (pm-utilities.css) */
  position:absolute; width:1px; height:1px; margin:-1px; padding:0;
  overflow:hidden; clip-path:inset(50%); white-space:nowrap; border:0;
}

/* ---- 14.7 §3 กล่อง "เนื้อหายังไม่ผ่าน" ----
   🔴 กล่องนี้ **ไม่ใช่ของตกแต่ง** — มันคือสิ่งที่ทำให้เอาเนื้อหาดิบมาแสดงได้โดยไม่โกหกคนอ่าน
   ⛔ ห้ามลบ · ห้ามทำให้จางลงเพื่อให้หน้าดูสวย · จะลบได้วันที่เนื้อหาถูกเขียนใหม่จริงเท่านั้น
   ⛔ ห้ามสื่อด้วยสีอย่างเดียว — ข้อความ "Not approved for publication" อยู่ใน DOM จริง (F-5) */
#pm-main.pm-product .pm-rawnote{
  border:1px solid var(--color-accent);
  border-left:4px solid var(--color-accent);
  border-radius:var(--radius);
  background:var(--color-accent-field);
  padding:var(--s3);
}
#pm-main.pm-product .pm-rawnote__flag{
  display:flex; align-items:center; gap:var(--s1);
  margin:0 0 var(--s1);
  font-size:var(--fs-small); color:var(--color-ink);
}
#pm-main.pm-product .pm-rawnote__ico{ flex:none; color:var(--color-accent); }
#pm-main.pm-product .pm-rawnote__why{
  margin:0 0 var(--s3); max-width:62ch;
  font-size:var(--fs-small); color:var(--color-ink-body);
}
/* เนื้อหาดิบเอง — วางบนพื้น surface เพื่อให้เห็นชัดว่า "ก้อนนี้คือของที่ยกมา ไม่ใช่ของที่ออกแบบ" */
#pm-main.pm-product .pm-rawnote__body{
  background:var(--color-surface);
  border:1px solid var(--color-line);
  border-radius:var(--radius);
  padding:var(--s3);
  max-width:none;
}
/* หัวข้อในเนื้อหาดิบ — เป็น <p class="pm-rawnote__h"> ไม่ใช่ <h2> (ดูเหตุผลใน details.php)
   🔴 ขนาดต้องเล็กกว่าหัวข้อจริงของหน้าอย่างชัดเจน ไม่งั้นก้อนที่ยังไม่ผ่านจะดูสำคัญกว่าเนื้อหาจริง
      วัดก่อนแก้ 18 ก.ย. 2026: <h2> ในกล่องนี้สูง **46px** เท่าหัวข้อ section ของหน้า */
#pm-main.pm-product .pm-rawnote__h{
  margin:var(--s3) 0 var(--s1);
  font-size:var(--fs-h5); line-height:1.3;
  color:var(--color-ink);
  /* ✅ C-7: `!important` ทับ **inline style ที่ฝังมากับเนื้อหาเก่า** (`style="font-weight: 300"`)
     ไม่ได้ทับ CSS ของใคร · inline style ชนะกฎธรรมดาทุกข้อไม่ว่าจะจำเพาะแค่ไหน */
  font-weight:600 !important;
}
#pm-main.pm-product .pm-rawnote__body > :first-child{ margin-top:0; }

/* ---- 14.8 §3 ตารางค่าส่ง · §4 กล่องความปลอดภัย · §5 ---- */
#pm-main.pm-product .pm-shiptable{
  width:100%; border-collapse:collapse;
  font-size:var(--fs-small); color:var(--color-ink-body);
}
#pm-main.pm-product .pm-shiptable th,
#pm-main.pm-product .pm-shiptable td{
  text-align:left; padding:var(--s2);
  border-bottom:1px solid var(--color-line);
}
#pm-main.pm-product .pm-shiptable thead th{
  font-size:var(--fs-label); font-weight:500;
  text-transform:uppercase; letter-spacing:.12em;
  color:var(--color-ink-muted);
}
#pm-main.pm-product .pm-shiptable tbody th{ font-weight:600; color:var(--color-ink); }
#pm-main.pm-product .pm-details__note{ margin:var(--s2) 0 0; color:var(--color-ink-muted); max-width:62ch; }

#pm-main.pm-product .pm-safety__box{ max-width:var(--measure-body); }
#pm-main.pm-product .pm-safety__eyebrow{ margin:0 0 var(--s1); }
#pm-main.pm-product .pm-safety__title{ font-size:var(--fs-d5); margin:0 0 var(--s2); color:var(--color-brand-ink); }
#pm-main.pm-product .pm-safety__warn{ margin:0 0 var(--s3); max-width:62ch; }
#pm-main.pm-product .pm-safety__discl{
  border-top:1px solid var(--color-line); padding-top:var(--s2);
  display:flex; flex-direction:column; gap:var(--s1);
}
/* D-3 — ⛔ ห้ามลดขนาดตัวอักษรของ disclaimer ต่ำกว่า --fs-label (12.5px คือพื้นของ B-4) */
#pm-main.pm-product .pm-safety__discl .pm-text-small{ margin:0; color:var(--color-ink-muted); max-width:72ch; }

/* ════════════════════════════════════════════════════════════════════════════
   14.9 🔴 คืนค่าราคาที่ `wp-custom-css` §04 ยึดไปด้วย !important
   ════════════════════════════════════════════════════════════════════════════
   `wp-custom-css` ประกาศ `.woocommerce-Price-amount.amount{ color:#2E4A31!important;
   font-family:'DM Sans'!important; font-weight:500!important }` = (0,2,0) + !important
   ทั้งเว็บ · `wc_price()` พ่นคลาสคู่นั้นออกมาเสมอ
   C-7 ยอมให้ใช้ `!important` เพื่อทับสไตล์จากนอกธีม **และต้องมีคอมเมนต์เหตุผล** — นี่คือคอมเมนต์นั้น
   🔴 (1,3,0) + !important > (0,2,0) + !important → ชนะโดยไม่ต้องพึ่งลำดับไฟล์
   ⛔ ห้ามแก้ด้วยการไปลบ §04 ออกจาก Additional CSS — 41KB ก้อนนั้นยังคุมหน้าเก่าอยู่ (หนี้ 17)
   ✅ ลบบล็อกนี้ได้วันที่หนี้ 17 ถูกเคลียร์
   (แบบเดียวกับ `.pm-cart .woocommerce-Price-amount.amount` ข้อ 11)
   ════════════════════════════════════════════════════════════════════════════ */
#pm-main.pm-product .woocommerce-Price-amount.amount{
  color:inherit !important;
  font-family:inherit !important;
  font-weight:inherit !important;
}

/* ════════════════════════════════════════════════════════════════════════════
   14.10 🔴🔴 ชั้น "ล้างของนอกธีม" ของหน้าสินค้า
   ════════════════════════════════════════════════════════════════════════════
   หลักการเดียวกับข้อ 13 ของหน้า Checkout: ของที่พังคือ **property ที่ CSS ของเรา
   ไม่เคยเขียน** จึงไม่มีอะไรไปแข่งด้วย → ต้องประกาศล้างเอง

   🔴 `:where()` มีความจำเพาะ **0** → ทั้งกฎหนักเท่า `#pm-main.pm-product` = (1,1,0)
      ชนะของนอกธีมทุกตัว แต่ **แพ้กฎจริงของเราเองทุกข้อข้างบน** (ซึ่งมี (1,2,0) ขึ้นไป)
   ⛔ ห้ามเปลี่ยน `:where(...)` เป็น selector ธรรมดา · ⛔ ห้ามใช้ !important ที่นี่

   ⚠️ **ยังไม่ได้วัดในคาสเคดจริง** — รอบนี้เป็น local อย่างเดียวตามคำสั่งเจ้าของงาน
      ไฟล์ preview โหลดเฉพาะ pm-*.css จึง diff = 0 โดยอัตโนมัติ **ซึ่งไม่ได้พิสูจน์อะไรเลย**
      รายการข้างล่างมาจากการ *อ่าน* CSS ของนอกธีมบนเซิร์ฟเวอร์ ไม่ใช่จากการวัดหน้าจริง
      🔴 วันที่เอาขึ้น staging ต้องวัดซ้ำด้วยวิธีของรอบ checkout (ปิด stylesheet ที่ไม่ใช่ pm-*
         แล้ว diff computed style) ก่อนนับว่าข้อนี้ผ่าน
   ════════════════════════════════════════════════════════════════════════════ */

/* ---- 14.10.1 หัวข้อ — `wp-custom-css` §01 และธีมแม่บังคับ uppercase/weight ให้ h1–h6 ----
   ค่าที่ล้างกลับไปคือค่าของ pm-base.css เอง */
#pm-main.pm-product :where(h1,h2,h3,h4){ font-weight:400; text-transform:none; margin:0; padding:0; }
#pm-main.pm-product :where(h5,h6){       font-weight:600; text-transform:none; margin:0; padding:0; }

/* ---- 14.10.2 ตาราง — `.woocommerce table` ของ Bajaar ใส่ border/padding/align รอบทุกช่อง ----
   กฎจริงของตารางค่าส่งอยู่ที่ 14.8 ซึ่ง (1,2,0) จึงชนะชั้นนี้ */
#pm-main.pm-product :where(table,thead,tbody,tfoot,tr,th,td){
  border:0; background:transparent; box-shadow:none;
  padding:0; margin:0; text-align:left;
  font-family:inherit; font-size:inherit; font-weight:inherit;
  line-height:inherit; color:inherit;
}

/* ---- 14.10.3 ปุ่ม/ช่องกรอก — `.woocommerce button.button` ตั้งพื้น/มุม/ตัวพิมพ์ของตัวเอง ----
   🔴 `.woocommerce .quantity .qty{width:3.631em}` ไม่เอื้อมถึงเรา (ไม่มีคลาส .quantity)
      แต่กฎ `input[type=number]` ระดับ element ของธีมแม่เอื้อมถึง */
#pm-main.pm-product :where(button,input[type="submit"]){ text-transform:none; }
#pm-main.pm-product :where(input,select,textarea){
  font-family:inherit; font-size:inherit; line-height:inherit;
}

/* ---- 14.10.4 เนื้อหาดิบ — style="" ที่ฝังมากับข้อความเก่า ----
   🔴 ข้อความในฐานข้อมูลฝัง `style="font-weight:300"` / `"font-weight:400"` มากับ <h2>/<p> ทุกตัว
      inline style ชนะ CSS ทุกกฎที่ไม่ใช่ !important → หัวข้อในกล่องเนื้อหาดิบจะบางผิดรูป
   ⛔ ห้ามแก้ด้วยการไปลบ style ออกจากฐานข้อมูล — เนื้อหาก้อนนี้กำลังจะถูกเขียนใหม่ทั้งก้อนอยู่แล้ว
      และการแก้ฐานข้อมูลบน staging อยู่นอกขอบเขตของรอบนี้ (คำสั่ง: local เท่านั้น)
   ✅ C-7: `!important` ที่นี่ทับ **inline style ของเนื้อหา ไม่ใช่ของ CSS ตัวอื่น** — เหตุผลอยู่บรรทัดนี้ */
/* 🔴 หัวข้อของเนื้อหาดิบถูกลดชั้นเป็น `<p class="pm-rawnote__h">` ตั้งแต่ฝั่ง PHP แล้ว
      (pm_product_demote_headings() — เหตุผลเต็มอยู่ที่นั่น) ที่เหลือตรงนี้จึงมีแต่ย่อหน้ากับรายการ
   ⛔ `:not(.pm-rawnote__h)` ห้ามถอด — ไม่งั้นกฎนี้จะไปล้าง weight 600 ของหัวข้อที่ถูกลดชั้นมา
   ⛔ ห้ามใส่ b/strong/i/em ในรายการ — ของพวกนั้นไม่มี inline style ติดมา ปล่อยไว้ตามเดิมถูกแล้ว
   🔴 ฟอนต์ (font-family) ไม่ได้อยู่ที่นี่ — `.pm-product p` ใน pm-utilities.css คุมให้อยู่แล้ว */
#pm-main.pm-product .pm-rawnote__body :where(p:not(.pm-rawnote__h),li){ font-weight:inherit !important; }
#pm-main.pm-product .pm-rawnote__body :where(a){
  /* ลิงก์ในเนื้อหาดิบชี้ออกไปโดเมนอื่น (A-3/E-4) — ทำให้เห็นชัดว่าเป็นของที่ต้องเอาออก */
  text-decoration:underline; text-decoration-style:dashed; text-underline-offset:3px;
}

/* ═══════════════════════════════════════════════════════════════════════════
   15) `.pm-prose` — สัญญาการแสดงผลของเนื้อหาที่คนเขียน  (21 ก.ย. 2026)
   แผนเต็ม: docs/plan-product-tabs-2026-09-21.md §3 · ตารางสัญญาอยู่ที่ §3.2

   🔴 **ขอบเขต `#pm-main .pm-prose` โดยตั้งใจ — ไม่ใช่ `.pm-product`**
      `content-pattern.md` §1.1 ห้าม "สองเวอร์ชัน" ของค่าชุดเดียวกันระหว่าง T1/T2/T3
      ถ้าเขียนบล็อกนี้ใต้ `#pm-main.pm-product` วันที่ทำหน้า Article/Discover จะต้องก๊อปทั้งบล็อก
      = สร้างความเพี้ยนแบบที่ §1.1 เตือนไว้พอดี · หน้าไหนอยากได้ก็แค่ใส่คลาส .pm-prose
      ✅ เรื่อง "CSS ชนกับธีมเก่า" ยังคุมอยู่ด้วย `#pm-main` (id = specificity 100) ไม่ได้อาศัย .pm-product

   🔴 **ค่าทุกค่ามาจากที่อื่น ไม่มีค่าไหนคิดขึ้นใหม่ที่นี่**
      ขนาด/family/น้ำหนัก/สี → design.md §5.3 §5.4 (ซึ่ง pm-base.css ทำไว้แล้วระดับ element)
      ระยะบน/ล่าง            → content-pattern.md §3 (ตารางสัญญาระดับหัวเรื่อง)
      ความกว้าง 62ch         → content-pattern.md §1.2 = --measure-prose
   ⛔ ห้ามเพิ่ม token ใหม่ในบล็อกนี้ · ⛔ ห้ามเขียน hex (B-1)

   ── PDP ใช้คอลัมน์ "หน้าเนื้อหายาว" ของ design.md §5.3 ──────────────────────
   หลักฐาน: .pm-pdp__title (h1 ของหน้าสินค้า) = --fs-d2 58px ซึ่งเป็นคอลัมน์เนื้อหายาว
   → h2 ในเนื้อหาจึงเป็น d4 34 ไม่ใช่ d3 46 · ตรงกับ content-pattern.md §3 ที่ล็อกไว้
   pm-base.css ทำค่านี้ไว้แล้วในชื่อ `.is-article` — ที่นี่ผูกค่าเดียวกันเข้ากับ .pm-prose
   ⛔ ห้ามแก้ค่าใน pm-base.css เพื่อให้หน้านี้ถูก — จะลากหน้าอื่นไปด้วย
   ═══════════════════════════════════════════════════════════════════════════ */

/* 🔴 **กล่อง `.pm-rawnote__body` จงใจ *ไม่* ใช้คลาสนี้** (ถอดออกเมื่อ 21 ก.ย. 2026)
   เนื้อหาดิบที่ยังไม่ผ่านต้องดูเป็น "ของที่ยกมา" ไม่ใช่ "ของที่ออกแบบแล้ว" — กฎ 14.7 ข้างบน
   วัดตอนที่ยังมีคลาสติดอยู่: เนื้อหาดิบได้ 17.5px/1.78 · 62ch · จุด bullet สีโอลีฟ = ดูผ่านแล้ว
   ⛔ ถ้าวันหนึ่งมีคนใส่ `pm-prose` กลับเข้าไปในกล่องนั้น อาการจะกลับมาทันทีโดยไม่มีอะไรฟ้อง

   15.1 กล่องเนื้อหา */
#pm-main .pm-prose{
  max-width:none;                 /* ⚠️ ทับ .pm-prose{max-width:62ch} ของ pm-layout.css บรรทัด 48
                                     เหตุผล: 62ch เป็นความกว้างของ **ย่อหน้า** ไม่ใช่ของ **ตาราง/figure**
                                     ตารางค่าส่งที่ถูกบีบเหลือ 62ch จะมีสกอลล์แนวนอนโดยไม่จำเป็น
                                     → ย้ายเพดาน 62ch ไปไว้ที่ p/ul/ol/blockquote ทีละตัวใน 15.3 */
  color:var(--color-ink-body);
}
#pm-main .pm-prose > :first-child{ margin-top:0; }   /* กฎจังหวะข้อ 1 — แท็บต้องไม่เปิดมาพร้อมช่องว่าง 48px */
#pm-main .pm-prose > :last-child{  margin-bottom:0; }

/* 15.2 หัวเรื่อง h2–h6
   ขนาด/family/น้ำหนัก/สี มาจาก pm-base.css อยู่แล้ว — ที่เพิ่มที่นี่คือ **จังหวะ** ซึ่ง pm-base ไม่มี
   🔴 h2 กับ h3 เขียนขนาดซ้ำเพราะ pm-base ให้ h2 = d3 46 (คอลัมน์หน้าการตลาด)
      เนื้อหาต้องเป็นคอลัมน์เนื้อหายาว = d4 34 (เหมือน .is-article h2) */
#pm-main .pm-prose h2{
  font-size:var(--fs-d4); line-height:1.15; letter-spacing:0;
  margin:var(--s5) 0 var(--s2);
}
#pm-main .pm-prose h3{ margin:var(--s4) 0 var(--s2); }   /* d5 29 · ค่าจาก pm-base */
#pm-main .pm-prose h4{ margin:var(--s3) 0 var(--s1); }   /* d6 21 */
#pm-main .pm-prose h5{ margin:var(--s3) 0 var(--s1); }   /* 17 sans 600 */
#pm-main .pm-prose h6{ margin:var(--s2) 0 var(--s1); }   /* 14 sans 600 uppercase — ตัวใหญ่มาจาก pm-base */

/* กฎจังหวะข้อ 2 — หัวเรื่องติดกัน: ระยะบนของตัวที่สองลดเป็น --s2 (content-pattern.md §3 ข้อ 4)
   ⛔ ห้ามเปลี่ยนเป็น margin:0 — สองหัวข้อที่ติดกันสนิทอ่านเป็นบรรทัดเดียว */
#pm-main .pm-prose :where(h2,h3,h4,h5,h6) + :where(h2,h3,h4,h5,h6){ margin-top:var(--s2); }

/* 15.3 ย่อหน้าและรายการ — เพดานความกว้างอยู่ที่ตัวข้อความ ไม่ใช่ที่กล่อง (ดูเหตุผลใน 15.1) */
#pm-main .pm-prose :where(p,ul,ol){
  font-size:var(--fs-body-long); line-height:1.78;     /* design.md §5.4 --text-body-long */
  color:var(--color-ink-body);
  max-width:var(--measure-prose);                      /* 62ch — content-pattern.md §1.2 */
  margin:0 0 var(--s3);
}
#pm-main .pm-prose :where(ul,ol){ padding-left:var(--s3); }
#pm-main .pm-prose li{ margin:0 0 var(--s1); }
#pm-main .pm-prose li:last-child{ margin-bottom:0; }
#pm-main .pm-prose :where(ul,ol) :where(ul,ol){ margin:var(--s1) 0 0; }  /* รายการซ้อน */
#pm-main .pm-prose li::marker{ color:var(--color-brand); }
/* ↑ ถัง 20% ของ B-2 (--color-brand) ไม่ใช่ถัง 10% — จุด bullet ด้วย --color-accent-field
   คือสิ่งที่ content-pattern.md §4.3 บันทึกไว้เป็น **หนี้ 34** ห้ามทำซ้ำที่นี่ */

/* 15.4 ข้อความระดับ inline */
#pm-main .pm-prose :where(strong,b){ font-weight:600; color:var(--color-ink); }  /* §5.1 ไม่มี 700/800 */
#pm-main .pm-prose :where(em,i){ font-style:italic; }
/* 🔴 <strong> ที่ซ้อนอยู่ *ในหัวเรื่อง* ต้องไม่หนาขึ้น — เพิ่ม 21 ก.ย. 2026 (รอบที่สอง)
   เนื้อหาจริงเขียนหัวข้อมาเป็น `<h2><b><strong>Features:</strong></b></h2>` ทั้งไฟล์
   ถ้าปล่อยให้ weight 600 ทำงาน จะได้ **Instrument Serif ปลอมหนา** (synthetic bold) เพราะ
   ระบบมี Instrument Serif น้ำหนักเดียวคือ 400 (design.md §5.1 · เพดาน C-9) — เบราว์เซอร์
   จะยืดเส้นเอาเองซึ่งดูต่างจากฟอนต์จริงชัดเจน และเป็นน้ำหนักที่ไม่มีอยู่ในระบบ
   ⛔ ห้ามแก้ด้วยการเพิ่มน้ำหนักฟอนต์เข้ามาในระบบ — นั่นคือการดัน C-9 ให้เกินเพดาน
   ✅ หัวเรื่องเป็นการเน้นอยู่แล้ว <strong> ข้างในจึงไม่ต้องเน้นซ้ำ */
#pm-main .pm-prose :where(h1,h2,h3,h4) :where(strong,b){ font-weight:inherit; }
#pm-main .pm-prose a{ text-decoration:underline; text-underline-offset:2px; }    /* F-1 — สีไม่ใช่สัญญาณเดียว */

/* 15.5 ตาราง — B06 บังคับ <table>/<th>/<td> จริง ห้าม display:grid
   ⛔ พื้นหัวตารางห้ามเป็น --color-shade — token นั้นเขียนกำกับไว้เองว่า "ห้ามมีตัวอักษรบนนี้" */
#pm-main .pm-prose table{
  width:100%; border-collapse:collapse;
  font-size:var(--fs-small); line-height:1.55;
  margin:var(--s4) 0;
}
#pm-main .pm-prose :where(th,td){
  text-align:left; padding:var(--s2);
  border-bottom:1px solid var(--color-line);
  vertical-align:top;
}
#pm-main .pm-prose th{
  font-size:var(--fs-label); font-weight:500;      /* 12.5px = เล็กสุดของระบบ ยังเหนือเพดาน B-4 */
  text-transform:uppercase; letter-spacing:.12em;
  color:var(--color-ink-muted);
  border-bottom-color:var(--color-line-strong);
}
#pm-main .pm-prose caption{
  font-size:var(--fs-meta); color:var(--color-ink-muted);
  text-align:left; padding-bottom:var(--s1);
}

/* 15.6 ของอื่นในเนื้อหา */
#pm-main .pm-prose blockquote{ margin:var(--s4) 0; max-width:var(--measure-prose); }  /* หน้าตาจาก pm-base */
#pm-main .pm-prose figure{ margin:var(--s4) 0; }
#pm-main .pm-prose img{ max-width:100%; height:auto; border-radius:var(--radius); }
#pm-main .pm-prose figcaption{
  font-size:var(--fs-meta); line-height:1.45; color:var(--color-ink-muted);
  margin-top:var(--s1);
}
#pm-main .pm-prose hr{ margin:var(--s5) 0; }

/* 15.7 ⛔ สิ่งที่ห้ามมีใน .pm-prose — เขียนเป็น CSS เพื่อให้พังเห็นชัดถ้ามีคนใส่มา
   h1 ในเนื้อหาละเมิด C-11 (h1 เดียวต่อหน้า = ชื่อสินค้า) · ชั้น normalize ฝั่ง PHP เลื่อนมันลงเป็น h3
   ถ้ามันหลุดมาถึงตรงนี้แปลว่าชั้น normalize ถูกข้าม → ต้องเห็นว่าผิด ไม่ใช่ดูเนียน */
#pm-main .pm-prose h1{ outline:2px dashed var(--color-accent); outline-offset:4px; }

/* 15.8 ชุดรูปแบบ HTML ที่พนักงานเขียนเอง — มติ 23 ก.ย. 2026 (รอบที่ 2)
   คำสั่งเจ้าของงาน: *"แค่ใส่แค่ html ก็พอ … กำหนดหมดทั้ง h2 - h6 ตาราง faq dropdown … สินค้าต่างๆ"*
   คู่มือ: docs/article-authoring-guide.md §4 · แม่แบบ: docs/article-html-starter.html
   🔴 CSS ล้วน ไม่มี JS · ใช้ได้กับทุกหน้าที่ใส่ .pm-prose (บทความ · แท็บสินค้า)
   ⛔ ชื่อคลาสต้องตรงกับคู่มือ — เพิ่มคลาสใหม่ที่นี่ต้องเพิ่มในคู่มือด้วย
   ⛔ ส่วนที่มีตำแหน่งตายตัว (pm-quick-answer · pm-takeaways · pm-faq · pm-sources) **ไม่มีกฎที่นี่**
      เพราะ PHP (pm_article_extract) ดึงออกจากเนื้อหาไปวางใน spine แล้ว — มันไม่เคยถึง .pm-prose */

/* เนื้อหาเก่าที่ editor ทิ้งไว้ */
#pm-main .pm-prose{ overflow-wrap:anywhere; }        /* URL ยาวที่วางเป็นข้อความ — วัด 390px: ล้น 422 > 387 (post 7753) */
#pm-main .pm-prose p:empty{ display:none; }
#pm-main .pm-prose .wp-block-separator{ border:0; border-top:1px solid var(--color-line); opacity:1; width:auto; max-width:none; }
@media(max-width:680px){
  #pm-main .pm-prose table{ display:block; overflow-x:auto; white-space:nowrap; }   /* ตารางกว้าง → เลื่อนในตาราง ไม่ดันหน้า */
}

/* <dl class="pm-facts"> — ป้าย : ค่า (B11) */
#pm-main .pm-prose .pm-facts{
  display:grid; grid-template-columns:minmax(0,max-content) minmax(0,1fr); gap:var(--s1) var(--s3);
  margin:var(--s4) 0; padding:var(--s2) var(--s3); max-width:none;
  background:var(--color-surface); border:1px solid var(--color-line); border-radius:var(--radius);
}
#pm-main .pm-prose .pm-facts dt{ font-size:var(--fs-label); font-weight:500; text-transform:uppercase; letter-spacing:.12em; color:var(--color-ink-muted); padding-top:.3em; }
#pm-main .pm-prose .pm-facts dd{ margin:0; color:var(--color-ink); }
@media(max-width:680px){ #pm-main .pm-prose .pm-facts{ grid-template-columns:minmax(0,1fr); } #pm-main .pm-prose .pm-facts dd{ margin-bottom:var(--s1); } }

/* <ol class="pm-steps"><li><h5>…</h5><p>…</p></li> — ลำดับขั้น (B05)
   ตัวเลข --color-ink-muted ไม่ใช่ --color-accent-field ของไฟล์ออกแบบ (B-2 · หนี้ 34) */
#pm-main .pm-prose .pm-steps{ list-style:none; counter-reset:pm-step; padding:0; margin:var(--s4) 0; max-width:none; }
#pm-main .pm-prose .pm-steps > li{
  counter-increment:pm-step; position:relative; margin:0;
  padding:var(--s3) 0 var(--s3) var(--s6);
  border-top:1px solid var(--color-line);
}
#pm-main .pm-prose .pm-steps > li::before{
  content:counter(pm-step); position:absolute; left:0; top:var(--s3);
  font-family:var(--font-display); font-size:var(--fs-d4); line-height:1; color:var(--color-ink-muted);
}
#pm-main .pm-prose .pm-steps h5{ margin-top:0; }
#pm-main .pm-prose .pm-steps p{ margin:0; }

/* <ul class="pm-cards"><li><p class="pm-card-tag">…</p><h4>…</h4><p>…</p></li> — การ์ดกริด (B09)
   ⛔ ไม่ใช่ .pm-tag — ชื่อนั้นเป็นป้ายลอยบนช่องภาพ (บล็อก 4 · position:absolute) ชนกันแล้วป้ายหาย (เจอ 23 ก.ย.) */
#pm-main .pm-prose .pm-cards{ list-style:none; padding:0; margin:var(--s4) 0; max-width:none; display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:var(--s2); }
#pm-main .pm-prose .pm-cards > li{ margin:0; padding:var(--s3); background:var(--color-surface); border:1px solid var(--color-line); border-radius:var(--radius); }
#pm-main .pm-prose .pm-cards h4{ margin:var(--s1) 0; }
#pm-main .pm-prose .pm-cards p{ margin:0; font-size:var(--fs-small); line-height:1.6; color:var(--color-ink-muted); }
#pm-main .pm-prose .pm-cards p.pm-card-tag{ font-size:var(--fs-label); font-weight:500; text-transform:uppercase; letter-spacing:.12em; }
@media(max-width:1024px){ #pm-main .pm-prose .pm-cards{ grid-template-columns:repeat(2,minmax(0,1fr)); } }
@media(max-width:680px){ #pm-main .pm-prose .pm-cards{ grid-template-columns:minmax(0,1fr); } }

/* <aside class="pm-note">…</aside> · <aside class="pm-note pm-note--warn">…</aside> (B07)
   🔴 ระบบไม่มีสีเตือน (design.md §7.5) — warn แยกด้วย **ขอบซ้าย 4px สี ink + ไอคอน** ไม่ใช่สี */
#pm-main .pm-prose .pm-note{
  margin:var(--s4) 0; padding:var(--s3); max-width:none;
  background:var(--color-surface); border:1px solid var(--color-brand); border-radius:var(--radius);
}
#pm-main .pm-prose .pm-note :where(p,ul,ol){ font-size:var(--fs-small); line-height:1.65; }
#pm-main .pm-prose .pm-note > :last-child{ margin-bottom:0; }
#pm-main .pm-prose .pm-note h5{ margin-top:0; }
#pm-main .pm-prose .pm-note--warn{ border-color:var(--color-line-strong); border-left:4px solid var(--color-ink); position:relative; padding-left:calc(var(--s3) + var(--s4)); }
#pm-main .pm-prose .pm-note--warn::before{
  content:""; position:absolute; left:var(--s3); top:calc(var(--s3) + 2px); width:20px; height:20px;
  background:var(--color-ink);
  -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3 2 21h20L12 3Z'/%3E%3Cpath d='M12 10v5M12 18h.01'/%3E%3C/svg%3E") center/contain no-repeat;
          mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3 2 21h20L12 3Z'/%3E%3Cpath d='M12 10v5M12 18h.01'/%3E%3C/svg%3E") center/contain no-repeat;
}

/* <div class="pm-products" data-ids="…"> → PHP แทนด้วย <ul class="pm-artprods"> (B12) — ล้างสไตล์รายการของ .pm-prose */
#pm-main .pm-prose .pm-artprods{ list-style:none; padding:0; margin:var(--s4) 0; max-width:none; overflow-wrap:normal; }  /* ⛔ ห้ามรับ overflow-wrap:anywhere ของ .pm-prose — ชิปขนาด "15 g" แตกกลางคำ (วัด 23 ก.ย.) */
#pm-main .pm-prose .pm-artprods > li{ margin:0; }
#pm-main .pm-prose .pm-artprods .pm-size__label{ white-space:nowrap; }  /* แก้ 24 ก.ย. — ชิปของหมด (ขนาด · ราคา · Out of stock) บีบป้ายเหลือ 21px แล้ว "15 g" ตัดที่ช่องว่าง (ดูบน staging การ์ดกว้าง ~130px) */
/* ⚠️ p ในการ์ดต้องไม่รับขนาด/ความกว้างของย่อหน้าเนื้อหา (17.5px · 62ch) — การ์ดมีระบบของมันเอง
   (ราคาในแถว .pm-prodcard__price · ป้าย "Choose your size" · ข้อความของหมด มาจาก card-buy.php) */
#pm-main .pm-prose .pm-artprods p{ margin:0; font-size:var(--fs-meta); line-height:1.4; max-width:none; }
#pm-main .pm-prose .pm-artprods .pm-prodcard__price{ font-size:var(--fs-deck); }
#pm-main .pm-prose .pm-artprods a{ text-decoration:none; }

/* ═══════════════════════════════════════════════════════════════════════════
   16) `.pm-attrs` — แท็บ Additional information (สร้างจาก product attribute)
   แผน: docs/plan-product-tabs-2026-09-21.md §2 D3/D4

   🔴 ใช้ <dl>/<dt>/<dd> ไม่ใช่ <table> — ข้อมูลนี้เป็น **คู่ชื่อ-ค่า** ไม่ใช่กริดสองแกน
      (ตารางค่าส่งใน panel ถัดไปเป็นกริดสองแกนจริง จึงเป็น <table> — สองอย่างนี้ไม่เหมือนกัน)
   🔴 ไม่มีแถว = ไม่มีแท็บ — ฝั่ง PHP ตัดทั้งใบ ไม่ใช่ซ่อนด้วย CSS
   ═══════════════════════════════════════════════════════════════════════════ */
#pm-main .pm-attrs{
  margin:0; max-width:var(--measure-body);
  border-top:1px solid var(--color-line);
}
#pm-main .pm-attrs__row{
  display:grid; grid-template-columns:minmax(140px,220px) 1fr;
  gap:var(--s2) var(--s4);
  padding:var(--s2) 0;
  border-bottom:1px solid var(--color-line);
}
#pm-main .pm-attrs__lab{
  font-size:var(--fs-label); font-weight:500;
  text-transform:uppercase; letter-spacing:.12em;   /* = --text-label ของ design.md §5.4 */
  color:var(--color-ink-muted);
  line-height:1.2; padding-top:.35em;               /* จัดให้เส้นฐานตรงกับค่าที่ตัวโตกว่า */
}
#pm-main .pm-attrs__val{
  margin:0;
  font-size:var(--fs-body); line-height:1.65; color:var(--color-ink);
}
@media (max-width:680px){
  #pm-main .pm-attrs__row{ grid-template-columns:1fr; gap:var(--s1); }
}

/* ═══════════════════════════════════════════════════════════════════════════
   17) `.pm-reviews` — แท็บ Reviews  (ออกแบบ 21 ก.ย. 2026)
   เทมเพลต: template-parts/product/reviews-panel.php
   รายงาน: docs/report-product-tabs-2026-09-21.md §15

   🔴 **บล็อกนี้เขียนไว้ล่วงหน้า — วันนี้ยังไม่มีอะไรมาใช้มันเลยสักจุด**
      ตรวจ staging 21 ก.ย. 2026: รีวิวที่อนุมัติแล้วและมีคะแนน = **0 ใบทั้งร้าน**
      ⛔ ห้ามใช้บล็อกนี้เป็นเหตุผลว่า "ระบบรีวิวพร้อมแล้ว" — ที่พร้อมคือ *หน้าตา* ไม่ใช่ *ข้อมูล*
      ⛔ **ห้าม hardcode ดาวหรือคะแนนลง HTML ที่ไหนทั้งสิ้น** (D-4 · P-1 · M-7)
         ทุกดวงต้องมาจาก rating จริงของคอมเมนต์ใบนั้น

   🔴 **ไม่มีสีใหม่ในบล็อกนี้** — ดาวใช้ `--color-brand` (ถัง 20% ของ B-2 เหมือนปุ่มและ marker)
      ⛔ ห้ามใช้สีเหลือง/ทองของ "ดาวรีวิว" ตามธรรมเนียมเว็บทั่วไป — ไม่มีค่านั้นในระบบ
      และการเพิ่มเข้ามาคือการเพิ่ม hex นอกไฟล์ token (B-1)
   ═══════════════════════════════════════════════════════════════════════════ */

/* 17.1 ดาว — ใช้ร่วมกันทั้งกล่องสรุปและการ์ดรีวิว */
#pm-main .pm-stars{ display:inline-flex; gap:2px; color:var(--color-brand); line-height:1; }
#pm-main .pm-stars svg{ display:block; }
/* ดาวที่ยังไม่ติด = เส้นขอบอย่างเดียว · ⛔ ห้ามใช้ opacity แทน — จะได้สีที่ไม่เคยวัด contrast */
#pm-main .pm-stars__s{ color:var(--color-line-strong); }
#pm-main .pm-stars__s.is-on{ color:var(--color-brand); }

/* 17.2 กล่องสรุปคะแนน — โผล่เฉพาะเมื่อผ่านประตู D-4 (ชั้นข้อมูลเป็นคนตัดสิน ไม่ใช่ CSS) */
#pm-main .pm-reviews__summary{
  display:grid; grid-template-columns:auto 1fr;
  gap:var(--s3) var(--s6);
  align-items:center;
  padding:var(--s3); margin:0 0 var(--s5);
  background:var(--color-surface);
  border:1px solid var(--color-line);
  border-radius:var(--radius);
  max-width:var(--measure-body);
}
#pm-main .pm-reviews__score{ text-align:center; }
#pm-main .pm-reviews__avg{
  font-family:var(--font-display); font-size:var(--fs-d3); line-height:1;
  color:var(--color-ink); margin:0 0 var(--s1);
}
#pm-main .pm-reviews__score .pm-stars{ margin-bottom:var(--s1); }

/* 17.3 แถบกระจายคะแนน */
#pm-main .pm-reviews__dist{ width:100%; border-collapse:collapse; margin:0; }
#pm-main .pm-reviews__dist th,
#pm-main .pm-reviews__dist td{ padding:3px 0; border:0; vertical-align:middle; }
#pm-main .pm-reviews__dist th{
  text-align:left; white-space:nowrap; padding-right:var(--s2);
  font-size:var(--fs-meta); font-weight:400; color:var(--color-ink-muted);
  text-transform:none; letter-spacing:normal;   /* ทับกฎ th ของบล็อก 15 — แถวนี้เป็นป้ายไม่ใช่หัวตาราง */
}
/* 🔴 ช่องของแถบต้อง `width:100%` — ไม่ใช่การตกแต่ง แต่เป็นวิธีบอก table auto-layout
   ว่าให้ยกพื้นที่ที่เหลือมาให้ช่องนี้ · ถ้าไม่มี ช่องจะกว้าง **0px** เพราะเนื้อข้างในเป็น
   block ที่กว้าง 100% ของศูนย์ (เจอจริงตอนตรวจ: bar.offsetWidth = 0 แถบหายทั้งตาราง)
   ⛔ ห้ามแก้ด้วย table-layout:fixed — ช่อง "5 star" กับตัวเลขท้ายแถวต้องกว้างตามเนื้อหา */
#pm-main .pm-reviews__barcell{ width:100%; min-width:120px; padding-right:var(--s2); }
#pm-main .pm-reviews__bar{
  display:block; height:8px; width:100%;
  background:var(--color-shade);       /* ✅ ไม่มีตัวอักษรบนนี้ — ตรงเงื่อนไขของ token */
  border-radius:var(--radius-pill); overflow:hidden;
}
#pm-main .pm-reviews__barfill{
  display:block; height:100%;
  background:var(--color-brand);
  border-radius:var(--radius-pill);
}
#pm-main .pm-reviews__n{
  text-align:right; padding-left:var(--s2); white-space:nowrap;
  font-size:var(--fs-meta); color:var(--color-ink-muted);
}

/* 17.4 ข้อความอธิบายตอนที่ยังไม่ถึงเกณฑ์ — 🔴 ห้ามลบ (F-5: เหตุผลต้องอ่านได้จริง) */
#pm-main .pm-reviews__hold{
  margin:0 0 var(--s4); padding:var(--s2) var(--s3);
  max-width:var(--measure-prose);
  color:var(--color-ink-body);
  border-left:4px solid var(--color-line-strong);   /* §7.5 — ไม่มีสีเตือนในระบบนี้ */
  background:var(--color-surface);
}

/* 17.5 รายการรีวิว */
#pm-main .pm-reviews__list{ list-style:none; margin:0; padding:0; max-width:var(--measure-body); }
#pm-main .pm-reviews__item{ margin:0; padding:var(--s3) 0; border-top:1px solid var(--color-line); }
#pm-main .pm-reviews__item:first-child{ border-top:0; padding-top:0; }
#pm-main .pm-review .pm-stars{ margin-bottom:var(--s2); }
#pm-main .pm-review__text{
  margin:0 0 var(--s2); max-width:var(--measure-prose);
  font-size:var(--fs-body); line-height:1.65; color:var(--color-ink);
}
#pm-main .pm-review__by{
  display:flex; flex-wrap:wrap; align-items:center; gap:var(--s1) var(--s2);
  margin:0; font-size:var(--fs-meta); color:var(--color-ink-muted);
}
#pm-main .pm-review__name{ font-weight:600; color:var(--color-ink); }
/* ป้าย "Verified purchase" — ⛔ โผล่เฉพาะใบที่ meta verified ของมันเองเป็นจริง (D-5) */
#pm-main .pm-review__ok{
  display:inline-flex; align-items:center; gap:4px;
  color:var(--color-brand-ink); font-weight:600;
}
#pm-main .pm-review__ok svg{ flex:none; }

@media (max-width:680px){
  #pm-main .pm-reviews__summary{ grid-template-columns:1fr; gap:var(--s3); }
  #pm-main .pm-reviews__score{ text-align:left; }
}

/* ============================================================
   18. ผัง inline ของบล็อกซื้อ — ปุ่ม Add อยู่ "ขวาของแถวราคา" (21 ก.ย. 2026)
   คำสั่งเจ้าของงาน: "ให้ทำการออกแบบ ux ui ฝั่งขวาหน่อย เป็นปุ่ม กด add to cart นะ"
   markup: template-parts/product/card-buy.php ($args['layout'] = 'inline')
   ใช้ที่: การ์ด §5 "More to look at" ของหน้าสินค้า (related.php) — **ที่เดียว**

   ⛔ ไม่มีค่า hex ในบล็อกนี้ · ไม่มีขนาดตัวอักษรใหม่ · ไม่มี token ใหม่ (B-1 · B-4)
      ปุ่มทั้งใบมาจาก `.pm-btn` + `.pm-btn--secondary` + `.pm-btn--sm` ที่มีอยู่แล้ว
      (`.pm-btn--sm` = design.md §7.1 แถว "ปุ่มเล็ก (Add to cart ในการ์ด)" 44px · 14px/600)
      **รอบนี้เป็นผู้ใช้รายแรกของ `.pm-btn--sm`** — ก่อนหน้านี้ประกาศไว้แล้วไม่มีใครเรียก
   ============================================================ */

/* แถวราคาเป็น flex + space-between อยู่แล้วตั้งแต่ 15 ก.ย. — ที่เพิ่มคือ "ทางหนี" เมื่อแคบ
   🔴 flex-wrap ต้องมี: ครึ่งซ้ายอาจเป็นช่วงราคา "From $36.00 to $220.00" ซึ่งยาวกว่าครึ่งใบ
      ⛔ ห้ามแก้ด้วยการย่อขนาดราคา — 15 ก.ย. เพิ่งแก้อาการ "ราคาเดียวกันสองขนาด" ไปแล้ว
   row-gap ทำงานเฉพาะตอนตกบรรทัดจริง จึงไม่มีผลกับใบที่พอดีบรรทัดเดียว */
.pm-buy--inline .pm-prodcard__foot{ flex-wrap:wrap; row-gap:var(--s2); }

/* ปุ่มกว้างเท่าเนื้อหา (ผัง stack กว้าง 100%) · margin-left:auto ทำให้ยังชิดขวาเสมอ
   แม้ตกลงไปอยู่บรรทัดของตัวเอง — ⛔ ห้ามใช้ justify-content:flex-end แทน
   เพราะตอนอยู่บรรทัดเดียวกัน ราคาต้องยังชิดซ้าย */
.pm-buy--inline .pm-buy__btn{ width:auto; flex:none; margin-left:auto; }

/* 🔴 สถานะ hover — เปลี่ยนเป็นหน้าตาของปุ่มหลัก ไม่ใช่แค่ขอบเข้มขึ้น
   เหตุผล: พื้นการ์ดคือ --color-surface อยู่แล้ว และ hover ปกติของ .pm-btn--secondary
   ก็คือ --color-surface → ถ้าไม่เขียนข้อนี้ hover จะ "แทบไม่มีอะไรเปลี่ยน" บนการ์ด
   ⛔ ห้ามเติมสีใหม่ — สองค่านี้คือคู่เดียวกับ .pm-btn--primary (5.20 ✅ B-3)
   ℹ️ จอสัมผัสไม่มี hover → สถานะพักต้องอ่านออกว่ากดได้อยู่แล้ว (ขอบ + ไอคอนถุง) */
.pm-buy--inline .pm-buy__btn:hover{
  background:var(--color-brand); border-color:var(--color-brand); color:var(--color-on-night);
}

/* ข้อความแทนปุ่ม (ของหมด / ยังตั้งราคาไม่ครบ) — อยู่ในช่องเดียวกับที่ปุ่มจะอยู่
   🔴🔴 **44px ไม่ใช่ 0** — สูงเท่าปุ่มเล็กเป๊ะ ๆ โดยเจตนา
      วัดจริงตอนตั้งเป็น 0: ใบที่ไม่มีปุ่มดันแถวราคาของตัวเองลงไป **8px** ต่ำกว่าใบข้าง ๆ
      ซึ่งพังมติรอบ 15 ก.ย. ที่ว่า "ราคาของทุกใบในแถวเดียวกันต้องอยู่แนวเดียวกัน"
      (ผัง stack ใช้ 48px ด้วยเหตุผลเดียวกัน เพราะปุ่มที่นั่นสูง 48px)
   ⛔ ห้ามเปลี่ยนตัวเลขนี้โดยไม่เปลี่ยน min-height ของ .pm-btn--sm ให้ตรงกัน
   ชิดขวาเพื่อให้ "ตำแหน่งของคำตอบ" อยู่ที่เดิมกับปุ่มของใบข้าง ๆ */
.pm-buy--inline .pm-buy__note--inline{
  min-height:44px; margin-left:auto; text-align:right;
}

/* ชิปขนาดของ variable product ยังอยู่ "เหนือ" แถวราคาเหมือนผัง stack
   🔴 ⛔ ห้ามย่อชิปลงไปอยู่ในแถวราคาด้วย — ปุ่มเดียวเลือกขนาดแทนคนซื้อไม่ได้
      (card-buy.php เขียนห้ามไว้ตรง ๆ: "ห้ามแก้ด้วยการเดา variation แรกให้ผู้ใช้")
   ระยะห่างของ .pm-buy (gap:--s2) ใช้ร่วมกันทั้งสองผัง จึงไม่มีอะไรต้องประกาศเพิ่ม */

/* ============================================================
   19. ปุ่มถาม WhatsApp บนหน้าสินค้า (21 ก.ย. 2026)
   คำสั่งเจ้าของงาน: "เพิ่มหน่อย ปุ่มตรงใต้ add to cart อีก 1 ปุ่ม เป็นปุ่ม chat via whatsApp"
   markup: template-parts/product/summary.php · URL มาจาก pm_product_whatsapp()

   ⛔ ไม่มีค่า hex · ⛔ **ไม่มีสีเขียวของแบรนด์ WhatsApp** (มติ 15 ก.ย. 2026 · B-1)
      ปุ่มใช้ .pm-btn--secondary ที่มีอยู่แล้ว = ขอบ --color-line-strong + ตัวอักษร --color-ink
   ============================================================ */

/* 🔴 ย่อหน้าครอบปุ่ม — `.pm-pdp__buy` มี margin-bottom:var(--s3) อยู่แล้ว
   ถ้าใส่ margin-top ให้ตัวนี้อีก ระยะจะกลายเป็นสองช่องบวกกัน แล้วปุ่มสองตัวจะดูไม่เป็นกลุ่มเดียวกัน
   ⛔ ห้ามใส่ margin-top · ระยะที่เห็นทั้งหมดมาจาก margin-bottom ของแถวซื้อที่เดียว */
#pm-main.pm-product .pm-pdp__ask{ margin:0 0 var(--s3); }

/* เต็มความกว้างของคอลัมน์ขวา เพื่อให้เป็น "ขั้นถัดไป" ที่กดง่าย ไม่ใช่ลิงก์เล็ก ๆ
   🔴 **สูง 48px ตาม .pm-btn ปกติ ไม่ใช่ 56px แบบปุ่ม Add to cart**
      ความต่างของความสูงคือสิ่งที่บอกลำดับความสำคัญโดยไม่ต้องอ่านสี
      ⛔ ห้ามทำให้สูงเท่ากัน — ปุ่มสองตัวซ้อนกันที่สูงเท่ากันจะอ่านเป็นน้ำหนักเท่ากัน
   F-3 ผ่านสบาย (48px > 44px) */
#pm-main.pm-product .pm-pdp__wa{ width:100%; }

/* ไอคอนลูกโป่งคำพูด — `.pm-btn svg` กำหนด 20px + stroke:currentColor ไว้แล้ว
   จึงไม่ต้องประกาศอะไรเพิ่ม · บรรทัดนี้มีไว้บันทึกว่า **ตั้งใจไม่ประกาศ** */
