/* ==========================================================================
   Components
   --------------------------------------------------------------------------
   หลักการ: ทุก class ขึ้นต้นด้วย mo- เพื่อไม่ชนกับ GeneratePress และ core blocks
   ห้ามใช้ !important — ถ้าต้องใช้แปลว่า specificity ผิดตั้งแต่แรก
   ========================================================================== */

/* --- Base ---------------------------------------------------------------- */
body {
  font-family: var(--font-body);
  font-size: var(--fs-body);
  line-height: var(--lh-body);
  color: var(--c-ink);
  /* พื้นหลังหลักของเว็บคือ paper ไม่ใช่ cream — ดู tokens.css
     ตั้งเป็น cream อยู่พักหนึ่งโดยไม่ได้ตั้งใจ ผลคือ section ธรรมดากับ
     .mo-section--tint กลายเป็นสีเดียวกัน จังหวะสลับ paper/cream ที่ Design.md
     กำหนดไว้จึงไม่เคยเกิดขึ้นจริง แก้กลับแล้ว 26 ส.ค. 2569 */
  background: var(--c-surface);
  -webkit-font-smoothing: antialiased;
}

h1, h2, h3, .mo-display {
  font-family: var(--font-display);
  font-weight: var(--fw-display);   /* ต้นฉบับใช้หัวข้อน้ำหนักบาง ไม่ใช่ bold */
  line-height: var(--lh-tight);
  color: var(--c-ink);
  letter-spacing: var(--ls-tight);
  /* เกลี่ยความยาวแต่ละบรรทัดให้ใกล้เคียงกัน แทนที่จะอัดบรรทัดแรกเต็มแล้วเหลือหางสั้น ๆ
     สำคัญกับภาษาไทยเป็นพิเศษ เพราะไม่มีช่องว่างระหว่างคำ เบราว์เซอร์จึงตัดตรงไหนก็ได้
     ที่พอดีขอบ — กล่องยิ่งแคบยิ่งตัดกลางคำบ่อย */
  text-wrap: balance;
}

h1 { font-size: var(--fs-hero); }
h2 { font-size: var(--fs-h2); }
h3 { font-size: var(--fs-h3); }

a { color: var(--c-accent-text); text-underline-offset: 0.2em; }
a:hover { color: var(--c-brand); }

:where(a, button, input, select, textarea, [tabindex]):focus-visible {
  outline: 3px solid var(--c-focus);
  outline-offset: 2px;
}

/* --- Section ------------------------------------------------------------- */
.mo-section { padding-block: var(--section-y); }

/* บล็อก Columns ของ WordPress มีระยะใต้ตัวเอง 1.75em (~30px) ติดมาเสมอ
   section ที่จบด้วยแถวคอลัมน์จึงห่างล่าง 84px แต่ห่างบน 54px — วัดเจอ 24 ก.ย. 2569
   5 จุดบนหน้าบริการ และมีแบบเดียวกันที่หน้าแรก (คำถามที่พบบ่อย · Visit Us)
   ระยะบน-ล่างของ section ต้องมาจาก --section-y ทางเดียว ไม่งั้นจังหวะของหน้าเพี้ยน
   ตัดเฉพาะแถวที่เป็น "ตัวสุดท้าย" แถวคอลัมน์กลาง section ยังเว้นระยะตามเดิม */
.mo-wrap > .wp-block-columns:last-child,
.mo-wrap > .wp-block-group__inner-container > .wp-block-columns:last-child { margin-bottom: 0; }

/* ปลดกรอบ 1200px ของธีมแม่เฉพาะหน้าที่ประกอบจาก section ของดีไซน์นี้
   (คลาส mo-fullbleed ใส่จาก body_class ใน functions.php — ดูเหตุผลที่นั่น)
   ความกว้างเนื้อหาไปคุมที่ .mo-wrap ข้างในแทน

   **พื้นหลังต้องปลดด้วย — จุดที่ 4 ที่เพิ่งเจอ 26 ส.ค. 2569**
   โหมด "กล่องเดียว" ของธีมแม่ทาพื้น #page เป็น **ขาวล้วน #ffffff**
   (กฎ `.one-container .container` ใช้ตัวแปร --base-3 ของ GeneratePress)
   กล่องนี้ทับพื้น paper ที่ body ตั้งไว้จนมองไม่เห็นเลย ผลที่ตามมาสองข้อ
   · section ธรรมดาไม่ได้เป็น paper อย่างที่ Design.md กำหนด แต่เป็นขาวล้วน
   · ปลายช่วงไล่สีของ .mo-section--tint จบที่ paper ซึ่ง **ไม่ใช่สีเดียวกับขาว**
     ต่างกัน 4 ระดับ วัดจากภาพเรนเดอร์จริงแล้ว → เห็นเป็นเส้นคมพาดขวางจอ
     ตรงหัวและท้ายทุก section ที่ไล่สี ทั้งที่ตัวการไล่สีเนียนอยู่แล้ว
   **นี่คือ "กรอบเหลี่ยม" ที่ยังเห็นอยู่หลังทำเฟดรอบสอง ไม่ใช่ความผิดของเฟด**
   ตั้งเป็นโปร่งใส ไม่ใช่ทา paper ทับ เพื่อให้เหลือแหล่งความจริงที่ body ที่เดียว */
.mo-fullbleed #page.grid-container {
  max-width: none;
  padding-inline: 0;
  background: transparent;
}

/* ธีมแม่ใส่กรอบขาวมีเงาให้บทความทุกชิ้น ซึ่งกินพื้นที่และตัดแถบสีขาด */
.mo-fullbleed .inside-article {
  padding: 0;
  background: none;
  box-shadow: none;
}

/* ธีมแม่ตั้งค่าเป็นโหมด "กล่องเดียว" (one-container) ซึ่งใส่ padding 40px รอบกล่องเนื้อหา
   แถบสีของ section จึงถูกดันเข้ามาจากขอบจอด้านละ 40px แล้วพื้นขาวของกล่อง #page
   โผล่เป็นขอบขาวรอบเว็บ — เป็นคนละจุดกับกรอบ 1200px ข้างบน ต้องปลดทั้งสองที่
   ระยะห่างบน-ล่างของดีไซน์นี้คุมที่ .mo-section เอง ไม่ได้พึ่ง padding ก้อนนี้ */
.mo-fullbleed .site-content {
  padding: 0;
}

/* ธีมแม่ยังใส่กรอบ 1200px + padding 40px ให้กล่องซ้อนของบล็อกกลุ่มทุกใบในเนื้อหาด้วย
   (ตั้งมาจาก Customizer > Layout > Blocks ของ GeneratePress)
   section ของดีไซน์นี้ซ้อนกันสามชั้น padding เลยทบกันชั้นละ 40px
   และความกว้างถูกบีบซ้ำทุกชั้น — ความกว้างที่ถูกต้องคุมที่ .mo-wrap ชั้นเดียวพอ */
.mo-fullbleed .site-main .wp-block-group__inner-container {
  max-width: none;
  padding: 0;
}

/* --- กล่องซ้อนของบล็อก "กลุ่ม" ------------------------------------------------
   ตอนบันทึกหน้า WordPress ห่อของข้างในบล็อกกลุ่มด้วยกล่องอีกใบ
   (.wp-block-group__inner-container) ทั้งที่ pattern ไม่ได้เขียนไว้
   คลาสที่ทำหน้าที่ "จัดเรียงลูกของตัวเอง" จึงเห็นลูกแค่ใบเดียวคือกล่องซ้อนนั้น
   ของจริงที่ต้องเรียงอยู่ลึกลงไปอีกชั้น การจัดเรียงเลยไม่เกิด

   ซ้ำร้าย GeneratePress สั่งกล่องซ้อนไว้ว่า margin ซ้ายขวาเป็น auto
   พอไปอยู่ในแถวแบบ flex กล่องจึงถูกจัดกึ่งกลาง แล้วลากของข้างในเยื้องตามไปด้วย

   display:contents สั่งให้กล่องซ้อนไม่ถูกนับเป็นกล่อง ลูกจริงขึ้นมาเป็นลูกชั้นบนตรง ๆ
   ทั้ง max-width และ margin auto ของมันจึงไม่มีผลไปด้วยในตัว

   เพิ่มคลาสใหม่ที่จัดเรียงลูกเมื่อไหร่ ต้องมาเติมในรายการนี้ด้วย
   ระวัง: display:contents ไม่ได้ย้ายตำแหน่งใน DOM ให้ กฎที่เลือกลูกด้วยเครื่องหมาย >
   จะยังชี้ไปที่กล่องซ้อน ไม่ใช่ของจริง เขียนกฎของคลาสพวกนี้เป็นแบบ "ลูกหลาน" เท่านั้น
--------------------------------------------------------------------------- */
.mo-features > .wp-block-group__inner-container,
.mo-hero__actions > .wp-block-group__inner-container,
.mo-cta-row > .wp-block-group__inner-container,
.mo-team > .wp-block-group__inner-container,
.mo-split > .wp-block-group__inner-container,
.mo-card--service > .wp-block-group__inner-container,
.mo-card__body > .wp-block-group__inner-container,
.mo-head--split > .wp-block-group__inner-container {
  display: contents;
}

/* ระยะห่างระหว่างลูกคุมด้วย gap ของตัวจัดเรียงที่เดียว
   ไม่งั้นจะได้ระยะจาก margin ของบล็อกย่อหน้าซ้อนเข้ามาอีกชุด */
.mo-features > .wp-block-group__inner-container > * { margin-block: 0; }

/* แถบสีของ section กินเต็มความกว้างจอ แต่เนื้อหาข้างในต้องอยู่ในกรอบ 1200px
   ตัวคุมความกว้างจึงต้องเป็นชั้นใน ไม่ใช่ตัว section เอง — ถ้าไปใส่ที่ section
   พื้นหลังจะหดตามไปด้วยแล้วจังหวะแถบสลับที่เป็นเอกลักษณ์ของดีไซน์จะหายไปทันที */
.mo-wrap {
  max-width: var(--wrap-wide);
  margin-inline: auto;
  /* เขียนเป็น var() ซ้อน เพื่อให้สกินอื่น (เช่น .mo-v2) เปลี่ยนระยะขอบได้จากที่เดียว
     ไม่ต้องมาเขียนทับกฎนี้ ค่าตั้งต้นยังเป็น --sp-3 เหมือนเดิมทุกประการ */
  padding-inline: var(--wrap-pad, var(--sp-3));
}

/* ระดับ Narrow ของ design-fixes ข้อ 4 — ใส่คู่กับ .mo-wrap ที่ section ไหนก็ได้
   ที่เนื้อหาข้างในเป็นข้อความล้วน แล้วทั้ง section (หัวข้อด้วย) จะแคบพร้อมกัน

   **ต้องคุมที่ระดับ section ไม่ใช่ที่ตัวเนื้อหา** ถ้าไปคุมแค่ตัวเนื้อหา
   หัวข้อจะยังกว้าง 1200px อยู่ ขอบซ้ายของหัวข้อกับของเนื้อหาจึงไม่ตรงกัน
   ตาอ่านออกทันทีว่าเยื้อง ทั้งที่แต่ละชิ้นถูกของมันเอง */
.mo-wrap--narrow { max-width: var(--wrap-narrow); }

/* --- แกนซ้ายแกนเดียวทั้งหน้า (design-fixes ข้อ 2.1) ---------------------------
   section ที่หัวข้อชิดซ้าย เนื้อหาข้างในต้องเริ่มที่ขอบเดียวกับหัวข้อ
   ไม่ใช่ลอยอยู่กลาง section

   บล็อกพวกนี้จำกัดความกว้างตัวเองแล้ว `margin-inline: auto` เพื่อจัดกึ่งกลาง
   ซึ่งถูกสำหรับ section ที่หัวข้อกึ่งกลาง แต่พอหัวข้อชิดซ้ายมันจะเยื้องกันทันที
   ตาอ่านออกว่า "ขอบไม่ตรงกัน" แม้แต่ละชิ้นจะถูกของมันเอง

   **ห้ามแก้ด้วยการใส่ .mo-wrap--narrow ให้ section แทน** ลองแล้วไม่ได้ผล
   เพราะ --narrow ย่อทั้ง section แล้วจัดกึ่งกลาง ขอบซ้ายจึงขยับเข้ามา
   168px เทียบกับ section อื่น = ยิ่งได้แกนเพิ่มมาอีกแกน ตรงข้ามกับที่ต้องการ
   → --narrow เหมาะกับหน้าที่ทุก section เป็นแบบเดียวกัน (เช่นบล็อกบทความหน้าแรก)
     ส่วนหน้าที่ต้องมีแกนเดียวยาวตลอด ต้องคุมที่ตัวเนื้อหาแบบนี้
-------------------------------------------------------------------------- */
.mo-wrap:has(.mo-head--left, .mo-head--split)
  :where(.mo-steps, .mo-faq, .mo-postlist, .mo-narrow, .mo-reviewer) {
  margin-inline: 0;
}

.mo-narrow {
  max-width: var(--content-narrow);
  margin-inline: auto;
}

.mo-eyebrow {
  font-size: var(--fs-small);
  font-weight: 600;
  letter-spacing: 0.08em;
  color: var(--c-brand);
  margin-bottom: var(--sp-1);
  display: block;
}

/* --- Button -------------------------------------------------------------- */
.mo-btn {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-1);
  padding: 0.85em 1.9em;
  border-radius: var(--radius-pill);
  background: var(--c-brand);
  color: var(--c-ink-invert);
  font-weight: 600;
  line-height: 1.2;
  text-decoration: none;
  transition: background var(--dur) var(--ease), transform var(--dur) var(--ease);
}
.mo-btn:hover { background: var(--c-brand-dark); color: var(--c-ink-invert); transform: translateY(-1px); }

.mo-btn--ghost {
  background: transparent;
  color: var(--c-brand);
  box-shadow: inset 0 0 0 1.5px var(--c-brand);
}
.mo-btn--ghost:hover { background: var(--c-canvas); color: var(--c-brand-dark); }

/* **ปุ่มโครงร่างบนพื้นมืดมองไม่เห็นเลย — เจอ 28 ส.ค. 2569 ตอนทำ section บทความ**
   ค่าเริ่มต้นของปุ่มนี้คือตัวหนังสือ navy กับเส้นขอบ navy
   พอไปวางบนแถบ navy จึงได้ navy บนพื้น navy คอนทราสต์ราว 1:1
   ปุ่มยังกดได้และยังอยู่ในลำดับ Tab แต่ตาคนมองไม่เห็นว่ามีปุ่มอยู่ตรงนั้น
   → เป็นบั๊กของทั้งธีม ไม่ใช่ของ section เดียว หน้าแรกไม่เคยเจอเพราะ hero เป็นพื้นสว่าง
   ขอบใช้ทองแดงอ่อนโปร่งแสง ไม่ใช่ครีมทึบ จะได้ไม่แข่งความเด่นกับปุ่มหลัก */
.mo-section--night .mo-btn--ghost,
.mo-pagehero .mo-btn--ghost {
  color: var(--c-ink-invert);
  box-shadow: inset 0 0 0 1.5px rgba(196, 166, 127, .7);
}
.mo-section--night .mo-btn--ghost:hover,
.mo-pagehero .mo-btn--ghost:hover {
  background: rgba(251, 250, 248, .12);
  color: var(--c-ink-invert);
}

/* ปุ่มหลักบนพื้น navy ก็จมหายเหมือนกัน — พื้นปุ่มเป็น navy เท่ากับพื้น hero พอดี
   เหลือแค่ตัวหนังสือขาวลอย ๆ อ่านไม่ออกว่าเป็นปุ่ม (เห็นตอนทำหน้า hero พื้นมืด
   หน้าแรกของเว็บ 25 ส.ค. 2569 — หน้าแรกไม่เจอเพราะ hero เป็นพื้นสว่าง)
   สลับเป็นปุ่มพื้นสว่างตัวหนังสือ navy ให้อัตโนมัติ คนแก้เนื้อหาไม่ต้องจำว่า
   หน้าไหนต้องใช้ปุ่มรุ่นไหน — เว้นรุ่นที่เจาะจงมาแล้วไว้ ไม่ไปทับของที่เขาตั้งใจเลือก */
:where(.mo-hero, .mo-pagehero) .mo-btn:not(.mo-btn--ghost):not(.mo-btn--light):not(.mo-btn--accent) {
  background: var(--c-surface);
  color: var(--c-brand);
}
:where(.mo-hero, .mo-pagehero) .mo-btn:not(.mo-btn--ghost):not(.mo-btn--light):not(.mo-btn--accent):hover {
  background: var(--c-canvas);
  color: var(--c-brand-dark);
}

/* hero พื้นสว่างต้องกลับไปใช้ปุ่ม navy ตามเดิม */
.mo-hero--light .mo-btn:not(.mo-btn--ghost):not(.mo-btn--light):not(.mo-btn--accent) {
  background: var(--c-brand);
  color: var(--c-ink-invert);
}
.mo-hero--light .mo-btn:not(.mo-btn--ghost):not(.mo-btn--light):not(.mo-btn--accent):hover {
  background: var(--c-brand-dark);
}

/* ปุ่มโปร่งบนพื้น navy ต้องกลับเป็นเส้นขาว ไม่งั้นตัวหนังสือ navy จมหายไปกับพื้น */
:where(.mo-hero, .mo-pagehero) .mo-btn--ghost {
  color: var(--c-ink-invert);
  box-shadow: inset 0 0 0 1.5px rgba(251, 250, 248, .45);
}
:where(.mo-hero, .mo-pagehero) .mo-btn--ghost:hover {
  background: rgba(251, 250, 248, .12);
  color: var(--c-ink-invert);
}

/* --- Card ---------------------------------------------------------------- */
.mo-card {
  background: var(--c-surface);
  border: 1px solid var(--c-line);
  border-radius: var(--radius-card);
  padding: var(--sp-3);
  transition: box-shadow var(--dur) var(--ease), border-color var(--dur) var(--ease);
}
.mo-card:hover { box-shadow: var(--shadow-card); border-color: transparent; }
.mo-card h3 { margin-top: 0; }

/* การ์ดเด่น — ใช้กับบริการเรือธงที่ต้องการให้สะดุดตากว่าใบอื่นในแถวเดียวกัน */
.mo-card--featured {
  background: var(--c-brand);
  border-color: transparent;
  color: var(--c-ink-invert);
}
.mo-card--featured h3 { color: var(--c-ink-invert); }
.mo-card--featured a { color: var(--c-accent-light); }

/* บรรทัดหมวดหมู่/วันที่เหนือหัวข้อการ์ดบทความ */
.mo-card__meta {
  font-size: var(--fs-micro);
  letter-spacing: var(--ls-eyebrow);
  color: var(--c-accent-text);
  margin: 0 0 var(--sp-1);
}

/* --- ย่อหน้าเนื้อความในหน้า landing -----------------------------------------
   หน้าที่ต้องติดอันดับต้องมีเนื้อความจริงให้อ่าน ไม่ใช่มีแต่หัวข้อกับการ์ด
   จำกัดความกว้างไว้ ~60 ตัวอักษร เพราะบรรทัดยาวกว่านั้นสายตาหาต้นบรรทัดถัดไปไม่เจอ
--------------------------------------------------------------------------- */
.mo-prose { max-width: 60ch; }
.mo-prose p + p { margin-top: var(--sp-2); }

/* หมายเหตุตัวเล็กท้ายกล่อง — ใช้กับข้อความกำกับที่ไม่ใช่เนื้อหาหลัก */
/* ข้อความกำกับ/ปฏิเสธความรับผิดทางการแพทย์
   **เปลี่ยนจาก --c-ink-soft เป็น navy 70% เมื่อ 28 ส.ค. 2569** (design-fixes ข้อ 2.6)
   ของเดิมเป็นเทาน้ำเงินซึ่งอ่อนเกินไปสำหรับข้อความที่ "ยิ่งต้องอ่านออก"
   ตรรกะของดีไซน์ทั่วไปคือคำกำกับควรถอยไปอยู่ข้างหลัง แต่ข้อความชุดนี้ตรงกันข้าม —
   มันคือส่วนที่บอกว่าอะไรที่คลินิกไม่ได้รับปาก ต้องอ่านออกพอ ๆ กับคำโฆษณา
   navy 70% ได้ 6.0:1 บนพื้น paper และ 5.5:1 บนพื้น cream (เดิม 5.2 / 4.7)
   ขนาด --fs-small = 15px ซึ่งเกินขั้นต่ำ 14px ที่กำหนดไว้ */
.mo-note {
  font-size: var(--fs-small);
  color: color-mix(in srgb, var(--c-ink) 70%, transparent);
  margin-bottom: 0;
}

/* --- Hero ---------------------------------------------------------------- */
/* ตัว .mo-hero กับ .mo-hero__lead อยู่ในหมวด "ถอดมาจาก Healtch kit" ข้างล่าง */
.mo-hero__actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-2);
  margin-top: var(--sp-3);
}

/* --- Article (ปลายทางของ SEO pipeline) ------------------------------------ */
.mo-article { max-width: var(--content-narrow); }
.mo-article h2 { margin-top: var(--sp-5); }
.mo-article h3 { margin-top: var(--sp-4); }
.mo-article :where(ul, ol) { padding-left: 1.4em; }
.mo-article li + li { margin-top: 0.4em; }
.mo-article img { border-radius: var(--radius-img); }

/* กล่อง "สรุปคำตอบ" ท้าย/ต้นบทความ — ช่วยทั้ง featured snippet และ AI overview */
.mo-answer {
  background: var(--c-canvas);
  border-left: 4px solid var(--c-accent);
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
  padding: var(--sp-3);
  margin-block: var(--sp-4);
}
.mo-answer > :first-child { margin-top: 0; }
.mo-answer > :last-child { margin-bottom: 0; }

/* ==========================================================================
   Components ที่ถอดมาจาก Healtch kit
   ========================================================================== */

/* --- Eyebrow --------------------------------------------------------------
   ป้ายกำกับเหนือหัวข้อทุก section เป็นตัวคุมจังหวะของทั้งหน้า
   บอกคนอ่านว่ากำลังอยู่ส่วนไหน — ห้ามตัดออก

   เดิมเป็นชิปแคปซูลมีกรอบและจุดนำหน้าตามต้นฉบับ Healtch kit
   25 ส.ค. 2569 เจ้าของเลือกแบบ B: เหลือแต่ตัวอักษร ไม่มีกรอบ ไม่มีจุด
   กรอบทำให้ป้ายกลายเป็นวัตถุอีกชิ้นบนหน้า ตัดออกแล้วหัวข้อใหญ่เด่นขึ้นทันที

   ตัวอักษรจึงต้องรับงานที่กรอบเคยทำ คือบอกว่านี่คือ "ป้าย" ไม่ใช่ประโยค
   ทำได้ด้วยสามอย่างพร้อมกัน — สีทองแดง น้ำหนักหนา และจัดตัวอักษรห่าง

   **ข้อความในป้ายต้องเป็นภาษาอังกฤษ** และต้องมี lang="en" กำกับทุกจุด
   เหตุผลไม่ใช่ความสวยอย่างเดียว: ภาษาไทยจัดตัวอักษรห่างไม่ได้
   เพราะสระกับวรรณยุกต์ซ้อนบนล่างของพยัญชนะ พอดันให้ห่างจะดูหลุดออกจากกัน
   (ยกเว้นชิปในหัวเว็บ ซึ่งเป็นข้อความบอกที่ตั้งจริง ไม่ใช่ป้ายกำกับ
    ตัวนั้นยังเป็นไทยและยังเป็นแคปซูลอยู่ ใช้คลาส .mo-chip--pill)

   คำในป้ายต้องเป็นคำบอกทางเท่านั้น ห้ามใช้คำอวด เช่น Expert / Best /
   Leading / No.1 — พ.ร.บ. สถานพยาบาลห้ามโฆษณาอ้างความเหนือกว่า
------------------------------------------------------------------------- */
.mo-chip {
  /* **ต้องเป็น block ไม่ใช่ inline-block** — ของเดิมเป็น inline-block ตกค้างมาจาก
     ตอนที่ป้ายยังเป็นแคปซูลมีกรอบ ซึ่งต้องหดตามความยาวข้อความ
     พอเป็นตัวอักษรล้วนแล้วมันไม่ได้ช่วยอะไร แต่กลับทำให้ **ระยะติดลบไม่ทำงาน**
     เพราะกล่องแบบ inline ถูกความสูงบรรทัดของกล่องแม่ค้ำไว้เป็นขั้นต่ำ
     ดันระยะลบเข้าไปเท่าไหร่ก็ถูกกลืนหมด — ทดลองแล้ว ใส่ 4rem ขยับ ใส่ -0.8rem ไม่ขยับ
     การจัดกึ่งกลาง/ชิดซ้ายไม่เสีย เพราะคุมด้วย text-align ของกล่องหัวข้ออยู่แล้ว
     (.mo-chip--pill ไม่กระทบ มันสั่ง inline-flex ทับอยู่แล้ว) */
  display: block;
  /* ป้ายไม่ถือระยะใต้ตัวเอง ระยะป้าย→หัวข้อมาจาก margin-top ของหัวข้อที่เดียว
     ถ้าปล่อยให้ป้ายถือด้วย จะได้ระยะเริ่มต้นของย่อหน้าจากธีมแม่ซึ่งคิดเป็น
     เท่าของขนาดตัวอักษร → ขยายป้ายทีไร ป้ายลอยห่างหัวข้อทุกที */
  margin-bottom: 0;
  font-family: var(--font-display);
  font-size: var(--fs-eyebrow);
  font-weight: var(--fw-strong);
  letter-spacing: 0.18em;
  line-height: 1;
  color: var(--c-accent-text);
}
.mo-chip--invert { color: var(--c-accent-light); }

/* ชิปแคปซูลแบบเดิม เหลือที่ใช้ที่เดียวคือหัวเว็บ
   ตรงนั้นเป็นข้อความไทยบอกประเภทคลินิกกับทำเล ไม่ใช่ป้ายกำกับ section
   จึงไม่จัดตัวอักษรห่าง และยังต้องการพื้นหลังเพราะวางทับภาพ */
.mo-chip--pill {
  display: inline-flex;
  align-items: center;
  gap: 0.5em;
  padding: 0.45em 1.1em;
  border: 1px solid var(--c-line);
  border-radius: var(--radius-pill);
  background: var(--c-surface);
  font-family: var(--font-body);
  font-size: var(--fs-micro);
  letter-spacing: var(--ls-eyebrow);
  color: var(--c-ink-soft);
}
.mo-chip--pill::before {
  content: "";
  width: 6px; height: 6px;
  border-radius: 50%;
  background: var(--c-accent);
}
.mo-chip--pill.mo-chip--invert {
  background: rgba(251,250,248,.10);
  border-color: rgba(196,166,127,.4);
  color: var(--c-accent-light);
}

/* --- Section heading block ------------------------------------------------ */
/* ความกว้างคุมด้วย --head-width ใน tokens.css — เดิมฝังไว้ตรงนี้ 40ch แล้ว 54ch
   ทั้งสองค่าแคบเกินไปสำหรับหัวข้อไทย ตัดบรรทัดกลางคำบ่อย จึงย้ายออกไปเป็น token ให้ปรับง่าย */
/* ระยะใต้กล่องหัวข้อ ก่อนถึงเนื้อหาของ section
   ไม่ใช้ --sp-5 ตายตัวเพราะบนมือถือ 64px ดันหัวข้อกับเนื้อหาห่างกันเกินไป
   จนต้องเลื่อนจอถึงจะเห็นว่าหัวข้อนี้พูดถึงอะไร */
.mo-head { text-align: center; max-width: var(--head-width); margin-inline: auto;
  margin-bottom: clamp(2rem, 1.25rem + 2vw, 3rem); }
/* ระยะจากป้ายอังกฤษลงมาหาหัวข้อไทย คุมด้วย --eyebrow-gap ใน tokens.css
   เดิมเป็น 1.15rem ตั้งไว้ตอนที่ป้ายยังเป็นแคปซูลมีกรอบ พอถอดกรอบออกแล้วยังไม่ได้ลดตาม
   ป้ายจึงลอยห่างหัวข้อ — ลดลงเมื่อ 26 ส.ค. 2569 ตามที่เจ้าของสั่ง */
.mo-head h2 { margin: var(--eyebrow-gap) 0 var(--sp-2); }
/* section ที่ไม่มีป้ายอังกฤษนำ (7 จาก 10 ตาม design-fixes ข้อ 2) ไม่ต้องเว้นระยะบน
   --eyebrow-gap มีหน้าที่เว้นระยะ "จากป้ายลงมาหาหัวข้อ" ไม่มีป้ายก็ไม่มีอะไรให้เว้นจาก
   ปล่อยไว้จะได้ช่องว่างลอยอยู่เหนือหัวข้อ แล้วระยะเปิด section ของแบบมีป้าย
   กับแบบไม่มีป้ายจะไม่ตรงกัน ทั้งที่ควรเริ่มที่ระดับเดียวกัน */
.mo-head:not(:has(.mo-chip)) h2 { margin-top: 0; }
/* **ต้องยกเว้น .mo-chip ออกไป — บั๊กที่ซ่อนอยู่จนถึง 26 ส.ค. 2569**
   ป้ายอังกฤษเหนือหัวข้อก็เป็นบล็อกย่อหน้าเหมือนกัน กฎนี้จึงกินป้ายไปด้วย
   และ `.mo-head p` แรงกว่า `.mo-chip` (คลาส+อีลิเมนต์ ชนะ คลาสเปล่า)
   ผลคือป้ายไม่เคยได้สีทองแดงกับขนาดของตัวเองเลยสักครั้ง ออกมาเป็นเทาน้ำเงิน
   ขนาดเท่าย่อหน้านำ — ซึ่งทำให้มันอ่านเหมือนประโยค ไม่ใช่ป้ายกำกับ
   ตรงข้ามกับที่ตั้งใจไว้ตอนถอดกรอบแคปซูลออก (ดูเหตุผลที่บล็อก .mo-chip ข้างบน)
   แก้ด้วยการตัดป้ายออกจากขอบเขตของกฎ ไม่ใช่ไปเพิ่มความแรงให้ .mo-chip
   เพราะต้นเหตุคือกฎนี้กว้างเกินไป ไม่ใช่ .mo-chip อ่อนเกินไป */
.mo-head p:not(.mo-chip) { color: var(--c-ink-soft); font-size: var(--fs-lead); text-wrap: pretty; }
.mo-head--left { text-align: left; margin-inline: 0; }

/* ปรับความกว้างกล่องหัวข้อเป็นราย section โดยไม่ต้องแตะไฟล์
   พิมพ์คลาสในช่อง "คลาส CSS เพิ่มเติม" ของกล่องหัวข้อในหน้าจอแก้ไข
   ค่าเริ่มต้นของทั้งเว็บอยู่ที่ --head-width ใน tokens.css */
.mo-head--wide { max-width: var(--head-wide); }
.mo-head--full { max-width: none; }

/* หัวข้อแบบสองคอลัมน์ — หัวข้อซ้าย คำอธิบายขวา
   ใช้สลับกับแบบกึ่งกลางเพื่อไม่ให้ทุก section เปิดหน้าเหมือนกันหมด
   หน้าที่ทุกส่วนจัดกึ่งกลางเรียงกันยาว ๆ จะอ่านออกมาแข็งและซ้ำ */
/* **ระยะระหว่างแถวต้องเป็นศูนย์ ห้ามใส่ --eyebrow-gap ตรงนี้**
   --eyebrow-gap เป็นค่าติดลบ (เหตุผลอยู่ที่ tokens.css) และ gap ของตาราง
   รับค่าติดลบไม่ได้ ถ้าใส่ลงไป เบราว์เซอร์จะทิ้งทั้งบรรทัด
   ระยะซ้ายขวา 4rem จะหายไปด้วย หัวข้อกับคำอธิบายจะไปติดกันโดยไม่มีอะไรเตือน
   → ระยะป้าย→หัวข้อของแบบนี้ไปฝากไว้ที่ margin-top ของ h2 แทน ซึ่งติดลบได้ */
.mo-head--split {
  text-align: left;
  max-width: none;
  gap: 0 var(--sp-5);
  display: grid;
  align-items: end;
}
.mo-head--split .mo-chip { justify-self: start; }

/* ระยะห่างระหว่างบรรทัดคุมด้วย margin ของหัวข้อที่เดียว
   ล้าง margin ที่ติดมากับบล็อกย่อหน้าทิ้ง ไม่งั้นจะได้ระยะซ้อนกันสองชุด */
.mo-head--split p { margin-block: 0; }

/* ไม่ต้องเขียนกฎ margin ของ h2 ซ้ำที่นี่ — กล่องนี้มีคลาส .mo-head ติดมาด้วยเสมอ
   จึงได้ระยะชุดเดียวกับหัวข้อแบบกึ่งกลางอยู่แล้ว ทั้งระยะบนและระยะล่าง */

@media (min-width: 900px) {
  .mo-head--split { grid-template-columns: 1fr 1fr; }
  /* ป้ายแคปซูลกินเต็มแถวบน แล้วหัวข้อกับคำอธิบายค่อยแยกซ้ายขวาในแถวถัดมา */
  .mo-head--split .mo-chip { grid-column: 1 / -1; }
  .mo-head--split p:last-child { margin-bottom: .4em; }
  /* พอแยกซ้ายขวาแล้ว หัวข้อกับคำอธิบายอยู่แถวเดียวกัน ไม่ได้ซ้อนกัน
     ระยะใต้หัวข้อจึงต้องคืนเป็นศูนย์ ไม่งั้นหัวข้อจะถูกดันลอยขึ้นจากเส้นฐาน */
  .mo-head--split h2 { margin-bottom: 0; }
}

/* --- Section backgrounds -------------------------------------------------- */
/* --- รอยต่อระหว่าง section แบบไล่จาง ----------------------------------------
   ปัญหาเดิม: ทุก section จบด้วยเส้นตรงคมกริบ หน้าเว็บจึงอ่านออกมาเป็นกล่อง
   สี่เหลี่ยมวางซ้อนกัน ไม่ใช่หน้าเดียวที่ไหลต่อกัน

   **รอบแรกทำแล้วออกมาดูตลก แก้ใหม่ 26 ส.ค. 2569 — สาเหตุมีสองข้อ**

   ข้อแรก ไล่สีแบบเส้นตรงจะเห็นรอยพับตรงหัวและท้าย เพราะตาคนไวต่อ
   "จุดที่อัตราการเปลี่ยนสีเปลี่ยนกะทันหัน" มากกว่าตัวการเปลี่ยนสีเอง
   (ปรากฏการณ์ Mach band) ต่อให้สีสองสีใกล้กันแค่ไหนก็ยังเห็นเป็นขีดจาง ๆ
   แก้ด้วยการใส่จุดสีกลางทางตามเส้นโค้ง smoothstep 3t²-2t³
   ซึ่งออกตัวและเข้าเส้นชัยด้วยความชันศูนย์ หัวกับท้ายจึงไม่มีรอยพับ

   ข้อสอง ช่วงไล่สั้นเกินไป 96px บนแถบสูง 800px อ่านออกมาเป็น "ขอบเบลอ"
   ไม่ใช่ "การไล่" ยืดเป็น 176px บนเดสก์ท็อป

   ไม่มีคลาสให้ใส่มือ — CSS ดูเองว่าเพื่อนบ้านเป็นสีอะไรด้วย :has() และ
   ตัวเลือกพี่น้อง เพราะถ้าใส่คลาสมือ วันไหนสลับลำดับ section ในหน้าจอแก้ไข
   รอยต่อจะผิดทันทีโดยไม่มีอะไรเตือน

   ถ้าเบราว์เซอร์ไม่รู้จัก :has() กฎนั้นจะถูกทิ้งทั้งกฎ ผลคือได้ขอบคมแบบเดิม
   ไม่พัง จึงต้องเขียนกฎ :has() แยกกฎเสมอ ห้ามเอาไปรวมในรายการตัวเลือกเดียวกัน
   กับตัวเลือกอื่น ไม่งั้นตัวเลือกอื่นจะถูกทิ้งไปด้วย

   **พื้น navy ไม่ไล่ ใช้ขอบคม — ตั้งใจ** ลองแล้วไม่เวิร์ก
   คู่สีที่ต่างกันมากขนาด navy กับ cream ต้องใช้ช่วงไล่ยาว 200px ขึ้นไป
   ถึงจะดูเป็นการไล่ ไม่ใช่ขอบเบลอ แต่ยาวขนาดนั้นไม่ได้
   เพราะ eyebrow อยู่ห่างจากขอบบนแค่ 80px มันจะไปนั่งบนพื้นที่จางไปแล้ว
   คอนทราสต์ตกจนไม่ผ่านเกณฑ์ ขอบคมบนแถบสีเข้มอ่านออกมาเป็นโครงสร้างที่ตั้งใจอยู่แล้ว
-------------------------------------------------------------------------- */
.mo-section--tint {
  /* **ปิดการไล่สีเมื่อ 28 ส.ค. 2569** (design-fixes.md ข้อ 2.5)
     ค่าเดิม clamp(4rem, 2rem + 9vw, 11rem) — ใส่กลับได้ด้วยการแก้บรรทัดนี้บรรทัดเดียว
     กลไกไล่สีข้างล่างยังอยู่ครบ ไม่ได้ลบ พอ seam เป็น 0 จุดสีกลางทางทุกจุด
     จะยุบไปกองที่ขอบพร้อมกัน เหลือเป็นสีทึบพอดี

     **ข้อนี้กลับคำตัดสินใจเมื่อ 26 ส.ค. 2569** ซึ่งทำไว้เพื่อแก้อาการ "หน้าอ่านออกมา
     เป็นกล่องสี่เหลี่ยมวางซ้อนกัน" การไล่สีแก้อาการนั้นได้จริง แต่ราคาที่จ่ายคือ
     **บอกไม่ได้ว่า section จบตรงไหน** ซึ่งเจ้าของเห็นว่าแพงกว่า
     → ที่สำคัญ: ตอนตัดสินใจครั้งนั้น cream ยังเป็น #f6f0e9 ซึ่งห่างจาก paper
     แค่ 4 ระดับ ขอบคมจึงแทบไม่มีน้ำหนักอยู่แล้ว พอเปลี่ยนเป็น #efe6da ตามข้อ 3
     ขอบคมกลายเป็นเส้นแบ่งที่อ่านได้จริง เหตุผลเดิมที่ต้องไล่สีจึงหมดไปครึ่งหนึ่ง */
  --mo-seam: 0px;
  --mo-seam-t: var(--mo-seam);
  --mo-seam-b: var(--mo-seam);

  /* จุดสีกลางทางคำนวณจาก smoothstep ที่ t = .15 .30 .50 .70 .85
     ได้สัดส่วน cream = 6% 22% 50% 78% 94% ตามลำดับ
     เขียนเป็น color-mix ไม่ใช่รหัสสี จะได้เปลี่ยนพาเลตต์ที่ tokens.css ที่เดียวจบ */
  background: linear-gradient(180deg,
    var(--c-surface) 0,
    color-mix(in srgb, var(--c-canvas)  6%, var(--c-surface)) calc(var(--mo-seam-t) * .15),
    color-mix(in srgb, var(--c-canvas) 22%, var(--c-surface)) calc(var(--mo-seam-t) * .30),
    color-mix(in srgb, var(--c-canvas) 50%, var(--c-surface)) calc(var(--mo-seam-t) * .50),
    color-mix(in srgb, var(--c-canvas) 78%, var(--c-surface)) calc(var(--mo-seam-t) * .70),
    color-mix(in srgb, var(--c-canvas) 94%, var(--c-surface)) calc(var(--mo-seam-t) * .85),
    var(--c-canvas) var(--mo-seam-t),
    var(--c-canvas) calc(100% - var(--mo-seam-b)),
    color-mix(in srgb, var(--c-canvas) 94%, var(--c-surface)) calc(100% - var(--mo-seam-b) * .85),
    color-mix(in srgb, var(--c-canvas) 78%, var(--c-surface)) calc(100% - var(--mo-seam-b) * .70),
    color-mix(in srgb, var(--c-canvas) 50%, var(--c-surface)) calc(100% - var(--mo-seam-b) * .50),
    color-mix(in srgb, var(--c-canvas) 22%, var(--c-surface)) calc(100% - var(--mo-seam-b) * .30),
    color-mix(in srgb, var(--c-canvas)  6%, var(--c-surface)) calc(100% - var(--mo-seam-b) * .15),
    var(--c-surface) 100%);
}

/* ด้านที่ติดกับพื้นมืดต้องเป็นขอบคม ไล่จางเป็น paper ตรงนั้นจะได้แถบสว่าง
   แปลก ๆ คั่นระหว่าง cream กับ navy
   ตั้งเป็น 0 แล้วจุดสีกลางทางทุกจุดจะยุบมากองที่ 0 พร้อมกัน = ขอบคมพอดี */
.mo-section--night + .mo-section--tint { --mo-seam-t: 0px; }
.mo-section--tint:has(+ .mo-section--night) { --mo-seam-b: 0px; }

/* ใต้ hero ก็ไม่ไล่เหมือนกัน — เจ้าของสั่งเมื่อ 26 ส.ค. 2569
   hero เป็นแถบภาพถ่าย ขอบล่างของมันคือขอบของ **รูป** ไม่ใช่ขอบของแถบสี
   การไล่สีของ section ที่อยู่ถัดลงมาช่วยอะไรตรงนั้นไม่ได้เลย เพราะรอยที่ตาเห็น
   อยู่เหนือขึ้นไปที่ตัวรูป กลับกลายเป็นได้แถบ paper คั่นเพิ่มมาอีกชั้นแทน
   → รอยต่อตรงนี้จะไปแก้ที่ไฟล์รูปโดยตรง ไม่ใช่แก้ด้วย CSS
   ครอบ .mo-pagehero ด้วยเพราะเป็นแถบเต็มความกว้างเหมือนกันและเป็นพื้นมืด
   ซึ่งเข้ากฎ "ด้านที่ติดพื้นมืดต้องเป็นขอบคม" ข้างบนอยู่แล้ว */
.mo-hero + .mo-section--tint,
.mo-pagehero + .mo-section--tint { --mo-seam-t: 0px; }

.mo-section--night {
  background: var(--c-night);
  color: rgba(251,250,248,.85);
  background-size: cover;
  background-position: center;
  position: relative;
  isolation: isolate;
}
.mo-section--night::before {
  content: "";
  position: absolute; inset: 0; z-index: -1;
  background: linear-gradient(180deg, rgba(19,32,53,.86), rgba(19,32,53,.94));
}
/* เพิ่ม h1 เข้ามาเมื่อ 2 ก.ย. 2569 — เดิมมีแค่ h2 กับ h3 เพราะยังไม่เคยมีหน้าไหน
   วาง h1 ไว้บนพื้นเข้ม (ฮีโร่เดิมใช้ .mo-hero / .mo-pagehero ซึ่งมีกฎสีของตัวเอง)
   พอหน้า /home-v2/ เอาฮีโร่มาไว้ใน .mo-section--night ตัวหนังสือหัวเรื่องจึงเป็น
   กรมท่าบนพื้นกรมท่า = มองไม่เห็นทั้งบรรทัด */
.mo-section--night :where(h1, h2, h3) { color: var(--c-ink-invert); }

/* ข้อความรองพวกนี้กำหนดสีเทาเข้มไว้เองสำหรับพื้นสว่าง พอมาอยู่บนพื้น navy จะจมหาย
   ต้องดึงกลับเป็นสีอ่อน — ยกเว้นที่อยู่ในการ์ดพื้นสว่างซึ่งใช้สีเดิมถูกอยู่แล้ว
   ยกเว้น .mo-chip ด้วยเหตุผลเดียวกับที่ .mo-head p ข้างบน — ป้ายมีสีของตัวเอง
   สำหรับพื้นมืดอยู่แล้วคือ .mo-chip--invert ถ้าปล่อยให้กฎนี้กิน ป้ายจะกลายเป็นขาว
   แล้วหายไปกลืนกับหัวข้อที่อยู่ใต้มันซึ่งก็ขาวเหมือนกัน */
/* **ย่อหน้าใต้หัวข้อไม่เคยได้สีอ่อนจริงเลย — แก้ 24 ก.ย. 2569**
   เดิม .mo-head p อยู่ใน :where() รวมกับอีกสองตัว ซึ่งทำให้ความแรงเหลือ 0-1-0
   แพ้ .mo-head p:not(.mo-chip) (0-2-1) ที่สั่งเทาน้ำเงินไว้สำหรับพื้นสว่าง
   ย่อหน้าใต้หัวข้อบนพื้นกรมท่าจึงเป็น #5c6675 บน #132035 = ราว 2.9:1 ไม่ผ่านเกณฑ์
   วัดเจอตอนทำหน้าบริการ แต่เป็นทุกหน้าที่มีแถบกรมท่า (หน้าแรก Visit Us · about)
   → แยกตัวนี้ออกมาเป็นตัวเลือกที่แรงกว่า (0-3-1) แก้ด้วยความแรงของตัวเลือก ไม่ได้บังคับ
   → ข้อยกเว้นของการ์ดพื้นสว่างต้องแรงเท่ากันด้วย และอยู่บรรทัดถัดไปจึงชนะ
   (.mo-note กับ .mo-prose ทำงานถูกอยู่แล้ว เพราะความแรงเท่าคู่แข่งแต่อยู่ทีหลัง) */
.mo-section--night > * :where(.mo-note, .mo-prose),
.mo-section--night .mo-head p:not(.mo-chip) { color: rgba(251,250,248,.8); }
.mo-section--night :where(.mo-card, .mo-feature, .mo-rows) :where(.mo-note, .mo-prose),
.mo-section--night :where(.mo-card, .mo-feature, .mo-rows) .mo-head p:not(.mo-chip) { color: var(--c-ink-soft); }

/* --- Hero ----------------------------------------------------------------- */
.mo-hero {
  background: var(--c-night) center/cover;
  color: var(--c-ink-invert);
  /* **ระยะบนขยายเมื่อ 23 ก.ย. 2569 ตอนหัวเว็บเต็มจอมาใช้ทั้งเว็บ**
     หัวเว็บลอยทับฮีโร่อยู่ (position: absolute) ระยะบนจึงต้องเผื่อความสูงหัวเว็บ
     พอโลโก้ใหญ่ขึ้น หัวเว็บสูงจาก 92 เป็น 129px ที่จอ 1440 ค่าเดิมให้ระยะบน 136px
     จึงเหลือช่องว่างใต้หัวเว็บแค่ 7px ซึ่งเบียดจนดูเหมือนชนกัน
     ใช้ค่าเดียวกับ .mo-v2-hero จะได้ไม่มีเลขวิเศษสองชุดให้ลืมแก้ตัวใดตัวหนึ่ง
     **ขยายโลโก้เมื่อไหร่ ต้องมาวัดค่านี้ใหม่ทุกครั้ง สองค่านี้ผูกกันอยู่** */
  padding-block: clamp(4rem, 2rem + 10vw, 12rem) clamp(2.5rem, 2rem + 3.5vw, 4.5rem);
  position: relative;
  isolation: isolate;
}
.mo-hero::before {
  content: "";
  position: absolute; inset: 0; z-index: -1;
  background: linear-gradient(105deg, rgba(19,32,53,.82) 35%, rgba(19,32,53,.20));
}
.mo-hero h1 { color: var(--c-ink-invert); }
.mo-hero__lead { color: rgba(251,250,248,.82); font-size: var(--fs-lead); }

/* --- ความกว้างกล่องข้อความใน hero -------------------------------------------
   ของเดิมคุมความกว้างแยกกันสามที่ — หัวข้อ 15ch · ย่อหน้า 46ch · แถบสรุป 42rem
   สามค่านี้ไม่เท่ากัน ขอบขวาของแต่ละบรรทัดจึงไม่ตรงกัน และหัวข้อแคบกว่าเพื่อนมาก
   ย้ายมาคุมที่กล่องใบเดียว ของข้างในไหลตามกล่องหมด เหลือค่าให้ปรับค่าเดียว

   ค่าเริ่มต้นอยู่ที่ --hero-text-width ใน tokens.css
   ถ้าอยากปรับเฉพาะบางหน้าโดยไม่แตะไฟล์ ให้พิมพ์คลาส --narrow / --wide / --full
   ลงในช่อง "คลาส CSS เพิ่มเติม" ของกล่องข้อความในหน้าจอแก้ไข

   คุมเฉพาะจอ 861px ขึ้นไป ซึ่งเป็นช่วงที่ยังมีภาพคนอยู่ทางขวา
   จอแคบกว่านั้นภาพถูกปิดไปแล้ว กล่องข้อความใช้เต็มความกว้างได้เลย
--------------------------------------------------------------------------- */
@media (min-width: 861px) {
  .mo-hero__text         { max-width: var(--hero-text-width); }
  .mo-hero__text--narrow { max-width: var(--hero-text-narrow); }
  .mo-hero__text--wide   { max-width: var(--hero-text-wide); }
  .mo-hero__text--full   { max-width: 100%; }
}

/* แถบข้อมูลสรุปมี max-width ของตัวเองไว้ใช้ตอนไปอยู่ใน .mo-pagehero
   พอมาอยู่ในกล่องข้อความของ hero ต้องปล่อยให้กว้างเท่ากล่อง ไม่งั้นปรับกล่องแล้วมันไม่ตาม */
.mo-hero__text .mo-specbar { max-width: 100%; }

/* --- Hero แบบพื้นสว่าง -------------------------------------------------------
   ใช้เมื่อภาพหลักของ hero ถ่าย/เรนเดอร์มาบนพื้นขาว ซึ่งตัดพื้นหลังออกไม่ได้
   วางภาพพื้นขาวบน hero น้ำเงินจะได้กล่องขาวแปะกลางจอ จึงต้องพลิกทั้ง hero เป็นสว่าง
   เมื่อใช้ตัวนี้ ต้องไล่สีพื้นของ section ถัดไปใหม่ทั้งหน้าด้วย (กฎห้ามสีเดียวกันติดกัน)
--------------------------------------------------------------------------- */
.mo-hero--light {
  /* ภาพกินเต็มความกว้างจอ ไม่ได้วางเป็นรูปในกรอบ — เพราะพื้นขาวของภาพกับพื้นขาวของเว็บ
     ไม่ใช่เฉดเดียวกัน วางเป็นกรอบเมื่อไหร่จะเห็นรอยต่อเป็นสี่เหลี่ยมทันที
     ยึดขอบขวาไว้ เพราะตัวคนอยู่ขวา ส่วนที่ถูกตัดตอนจอแคบคือพื้นว่างด้านซ้ายซึ่งตัดได้ */
  background: var(--c-surface) url("../images/hero-banner.webp") no-repeat right center / cover;
  color: var(--c-ink);
}
.mo-hero--light::before { content: none; }

/* จอแคบ: ตัดภาพออก เหลือแต่ตัวหนังสือ
   ถ้าปล่อยไว้ ภาพแนวนอนจะถูกขยายจนตัวคนหลุดออกนอกจอ เหลือแต่พื้นเทา
   แถมยังต้องโหลดไฟล์ทิ้งเปล่า ๆ บนเครื่องที่เน็ตช้าที่สุด */
@media (max-width: 860px) {
  .mo-hero--light { background-image: none; }

  /* พอตัดภาพออก hero ก็เหลือเป็นพื้น paper เรียบ ๆ ไม่ใช่แถบภาพอีกต่อไป
     เหตุผลที่ยกเลิกการไล่สีใต้ hero จึงหมดไปด้วย — คืนการไล่สีให้ section ถัดไป
     ไม่งั้นจอมือถือจะได้เส้นคม paper/cream คั่นกลับมาแทน
     **จงใจเขียนไว้ในบล็อกเดียวกับที่ตัดภาพ** จะได้ไม่มีเลข 860px สองที่ให้แก้ไม่ครบ */
  .mo-hero--light + .mo-section--tint { --mo-seam-t: var(--mo-seam); }
}
.mo-hero--light h1 { color: var(--c-ink); }
.mo-hero--light .mo-hero__lead { color: var(--c-ink-soft); }

.mo-hero--light .mo-btn--ghost {
  color: var(--c-brand);
  box-shadow: inset 0 0 0 1.5px var(--c-brand);
}
.mo-hero--light .mo-btn--ghost:hover { background: var(--c-canvas); color: var(--c-brand-dark); }

.mo-hero--light .mo-specbar {
  background: var(--c-surface);
  border-color: var(--c-line);
  backdrop-filter: none;
}
.mo-hero--light .mo-spec + .mo-spec { border-left-color: var(--c-line); }
.mo-hero--light .mo-spec__label { color: var(--c-accent-text); }
.mo-hero--light .mo-spec__value { color: var(--c-ink); }

/* --- Button --------------------------------------------------------------- */
/* ต้นฉบับมีวงกลมลูกศรติดท้ายปุ่ม — ทำด้วย pseudo-element ไม่ต้องใส่ไอคอนในเนื้อหา */
.mo-btn--arrow::after {
  content: "→";
  display: grid;
  place-items: center;
  width: 1.75em; height: 1.75em;
  margin-right: -1em;
  border-radius: 50%;
  background: var(--c-surface);
  color: var(--c-brand);
  font-size: .8em;
  transition: transform var(--dur) var(--ease);
}
.mo-btn--arrow:hover::after { transform: translateX(3px); }
.mo-btn--light { background: var(--c-surface); color: var(--c-brand); }
.mo-btn--accent { background: var(--c-accent); color: var(--c-brand); }
.mo-btn--accent:hover { background: var(--c-accent-light); color: var(--c-brand); }
.mo-btn--light:hover { background: var(--c-canvas); color: var(--c-brand-dark); }

/* --- Stat row ------------------------------------------------------------- */
.mo-stats {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: var(--sp-3);
  margin-top: var(--sp-5);
  text-align: center;
}
.mo-stats > * + * { border-left: 1px solid var(--c-line); }
@media (max-width: 767px) { .mo-stats > * + * { border-left: 0; border-top: 1px solid var(--c-line); padding-top: var(--sp-3); } }
.mo-stat__num { font-family: var(--font-display); font-size: clamp(2rem, 1.4rem + 2.4vw, 3rem); line-height: 1; }
.mo-stat__label { font-weight: var(--fw-strong); margin-top: var(--sp-1); }
.mo-stat__note { font-size: var(--fs-small); color: var(--c-ink-soft); }

/* --- Numbered row (ส่วน "Wellness That Fits Your Schedule") ---------------- */
/* การ์ดสีอ่อนที่วางบน section พื้นมืด — ต้องดึงสีตัวหนังสือกลับเป็นเข้ม
   ไม่งั้นข้อความที่ไม่ได้กำหนดสีเองจะสืบทอดสีขาวจาก section แล้วจมหายไปกับพื้นการ์ด */
.mo-rows {
  background: var(--c-surface);
  color: var(--c-ink);
  border-radius: var(--radius-card);
  padding: var(--sp-2);
}
/* สามช่อง: เลข+ชื่อขั้น / คำอธิบาย / ปุ่ม
   แถวไหนใส่ภาพประกอบเข้ามา ช่องภาพจะแทรกให้เองโดยไม่ต้องเติมคลาส */
.mo-row {
  display: grid;
  grid-template-columns: 14rem 1fr auto;
  align-items: center;
  gap: var(--sp-3);
  padding: var(--sp-3) var(--sp-2);
}
.mo-row:has(img) { grid-template-columns: 14rem 7rem 1fr auto; }
.mo-row + .mo-row { border-top: 1px solid var(--c-line); }

/* ตัวเลขลำดับตัวใหญ่สีทองแดง — เป็นจุดสะดุดตาเดียวของ section นี้
   ถ้าปล่อยให้เล็กเท่าเนื้อหา ทั้งบล็อกจะอ่านออกมาเป็นตารางข้อมูลแทนที่จะเป็นลำดับขั้น */
.mo-row__num {
  font-family: var(--font-display);
  font-size: var(--fs-num);
  line-height: 1;
  color: var(--c-accent);
}
.mo-row__num b {
  display: block;
  margin-top: var(--sp-1);
  font-family: var(--font-body);
  font-size: var(--fs-body);
  line-height: var(--lh-tight);
  color: var(--c-ink);
  font-weight: var(--fw-strong);
}
.mo-row img { border-radius: var(--radius-sm); }
.mo-row__desc { font-size: var(--fs-small); color: var(--c-ink-soft); }
@media (max-width: 900px) {
  .mo-row { grid-template-columns: 1fr; text-align: left; }
}

/* --- Pricing / package card ------------------------------------------------ */
.mo-plans { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: var(--sp-3); align-items: start; }
.mo-plan {
  background: var(--c-surface);
  border-radius: var(--radius-card);
  padding: var(--sp-4) var(--sp-3);
  text-align: center;
}
.mo-plan--featured { background: var(--c-brand); color: var(--c-ink-invert); padding-block: calc(var(--sp-4) + var(--sp-2)); }
.mo-plan--featured :where(h3, .mo-plan__price) { color: var(--c-ink-invert); }
.mo-plan--featured .mo-btn { background: var(--c-surface); color: var(--c-brand); }
.mo-plan__price { font-family: var(--font-display); font-size: 2.5rem; line-height: 1; }
.mo-plan__price small { font-size: var(--fs-small); color: inherit; opacity: .75; }
.mo-plan ul { list-style: none; padding: 0; margin: var(--sp-3) 0; font-size: var(--fs-small); }
.mo-plan li { padding-block: .35em; }

/* --- Team card ------------------------------------------------------------- */
.mo-team { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: var(--sp-3); }
/* บล็อกรูปห่อด้วย figure และย่อหน้ามาจากบล็อกย่อหน้า ทั้งคู่มีระยะขอบติดมา
   ต้องล้างก่อนกฎ __name ข้างล่าง ไม่งั้นระยะห่างชื่อกับรูปเพี้ยน */
.mo-person figure { margin: 0; }
.mo-person :where(p) { margin-block: 0; }   /* :where() ความแรงเป็นศูนย์ กฎ __name ข้างล่างจึงยังชนะ */
.mo-person img { border-radius: var(--radius-img); width: 100%; height: auto; aspect-ratio: 4/5; object-fit: cover; }
.mo-person__name { font-family: var(--font-display); font-size: var(--fs-h3); margin-top: var(--sp-2); }
.mo-person__role, .mo-person__license { font-size: var(--fs-small); color: var(--c-ink-soft); }
.mo-person__license { font-variant-numeric: tabular-nums; }

/* ทีมสองคน — จำกัดความกว้างการ์ดแล้วจัดกึ่งกลาง
   ถ้าปล่อยให้ auto-fit ยืดเต็ม 1200px การ์ดสองใบจะกว้างใบละ 590px
   รูปคนถูกยืดจนสัดส่วนดูผิด และเหลือที่ว่างใต้ชื่อเป็นแถบยาว
   → ได้รูปคนที่ 3 เมื่อไหร่ให้เอาคลาสนี้ออกจาก pattern ตะแกรงจะกลับเป็น 3 คอลัมน์เอง */
.mo-team--pair {
  grid-template-columns: repeat(auto-fit, minmax(240px, 320px));
  justify-content: center;
}

/* ช่องที่ตั้งใจเว้นไว้รอข้อมูลจริงจากคลินิก — ไม่ใช่ข้อความที่ลืมแก้
   ทำให้ดูต่างจากข้อความจริงชัด ๆ จะได้ไม่มีใครเผลออ่านว่าเป็นเนื้อหา
   และคนที่มาเติมทีหลังเห็นทันทีว่าต้องเติมตรงไหนบ้าง
   **เอาออกพร้อมกับตอนเติมข้อมูลจริง** อย่าปล่อยให้คลาสค้างอยู่กับข้อความจริง */
.mo-pending {
  color: var(--c-ink-soft);
  font-style: italic;
  text-decoration: underline dashed var(--c-line);
  text-underline-offset: .35em;
}

/* --- Footer wordmark ------------------------------------------------------- */
/* ตัวอักษรยักษ์ท้ายเว็บ — เป็นของตกแต่ง ต้องซ่อนจาก screen reader */
/* ออกแบบไว้สำหรับคำสั้นอย่าง "Moveon" — ดู moveon_wordmark ใน functions.php
   ว่าทำไมห้ามเอาชื่อเว็บเต็มมาใส่ กติกาสองข้อล่างเป็นตาข่ายกันพลาดเฉย ๆ
   ถ้าวันหลังใครใส่คำยาว หน้าเว็บจะได้ไม่ล้มทั้งหน้า */
.mo-wordmark {
  font-family: var(--font-display);
  /* ปรับสองรอบในวันเดียว (31 ส.ค. 2569) — บันทึกไว้กันปรับวนอีก

     รอบแรกตีความคำว่า "ให้เต็ม" เป็น "ตัวอักษรกว้างเท่าจอ" จึงตั้ง 27.8vw ไม่มีเพดาน
     ผลคือบนจอกว้างตัวอักษรสูงราว 420px ซึ่ง **สูงกว่าเนื้อหาท้ายเว็บทั้งก้อน**
     เจ้าของบอกว่า "ใหญ่และกว้างมากเกินไป" → คำว่าให้เต็มหมายถึงให้เข้าไปอยู่ใน
     ท้ายเว็บ ไม่ใช่ให้ตัวอักษรกินทุกพิกเซล

     20vw ทำให้คำกว้างราว 70% ของจอเท่ากันทุกขนาด เหลือขอบซ้ายขวาให้หายใจ
     และความสูงลดลงราวหนึ่งในสี่ — ยังเป็นวอร์ดมาร์กตัวโต แต่ไม่ทับเนื้อหาข้างบน

     เพดาน 26rem มีไว้กันจอ 4K ที่ 20vw จะแปลว่าตัวอักษรสูงกว่า 600px
     ส่วนพื้น 3rem กันจอเล็กมากไม่ให้เล็กจนอ่านไม่ออก

     **ตัวเลขมาจากการวัดหน้าจริง ไม่ได้คำนวณจากทฤษฎี** เปลี่ยนคำในวอร์ดมาร์ก
     เมื่อไหร่ต้องวัดใหม่ เพราะคำยาวไม่เท่ากันก็กินที่ไม่เท่ากัน */
  font-size: clamp(3rem, 20vw, 26rem);
  line-height: .8;
  text-align: center;
  background: linear-gradient(180deg, var(--c-accent), rgba(163,127,83,0));
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  user-select: none;
  margin-top: var(--sp-4);
  overflow: hidden;      /* คำยาวเกินให้ถูกตัด ไม่ใช่ดันหน้าเว็บให้เลื่อนแนวนอนได้ */
  line-break: loose;     /* ไทยไม่มีช่องว่างระหว่างคำ ต้องบอกให้ตัดบรรทัดได้ */
}

/* ==========================================================================
   Inner pages — ถอดจาก about / contact / our-program / program-detail
   ========================================================================== */

/* --- Page hero (ทุกหน้ารองใช้ตัวนี้) --------------------------------------- */
.mo-pagehero {
  background: var(--c-night) center/cover;
  color: var(--c-ink-invert);
  text-align: center;
  /* **ระยะบนกับล่างไม่เท่ากันแล้วตั้งแต่ 23 ก.ย. 2569 — ตั้งใจ**
     หัวเว็บลอยทับหัวหน้ารองอยู่ (position: absolute) เฉพาะ "ระยะบน" จึงต้องเผื่อ
     ความสูงหัวเว็บ ส่วนระยะล่างไม่ได้ทับอะไร ขยายไปก็แค่ทำให้แถบสูงขึ้นเฉย ๆ

     ตอนหัวเว็บเต็มจอมาใช้ทั้งเว็บ หัวเว็บสูงจาก 108 เป็น 129px ที่จอ 1440
     ค่าเดิม (เพดาน 9rem = 144px) จึงเหลือช่องว่างใต้หัวเว็บแค่ 15px จากเดิม 36px
     **ขยับแค่เพดาน ไม่แตะขาต่ำกับขากลาง** จอ 375 กับ 768 จึงได้ค่าเท่าเดิมเป๊ะ
     (85.5px และ 124.8px) ซึ่งเป็นระยะที่เจ้าของเห็นและรับไปแล้ว
     เพดานใหม่ 11rem = 176px ได้ช่องว่างกลับมา 47px เท่ากับที่หน้าแรกได้
     **ขยายโลโก้เมื่อไหร่ ต้องมาวัดค่านี้ใหม่ทุกครั้ง สองค่านี้ผูกกันอยู่** */
  padding-block: clamp(5rem, 3rem + 10vw, 11rem) clamp(5rem, 3rem + 10vw, 9rem);
  position: relative;
  isolation: isolate;
}
/* หัวหน้ารองแบบมีภาพพื้นหลัง — ใช้ชั้นทับสีกรมท่าของ .mo-pagehero ที่มีอยู่แล้ว
   ภาพต้นฉบับสว่าง พอมีชั้นทับ .75→.88 ทับ จึงได้พื้นเข้มที่ยังเห็นเส้นกระดูกสันหลัง
   เรืองทองอยู่จาง ๆ — ได้บรรยากาศแบบภาพเต็มจอโดยไม่ต้องหารูปใหม่
   ประกาศเป็น background-image ตัวเดียว ไม่ใช่ shorthand จะได้ไม่ล้างค่า center/cover
   ที่ .mo-pagehero ตั้งไว้ */
.mo-pagehero--photo { background-image: url("../images/hero-banner.webp"); }

.mo-pagehero::before {
  content: "";
  position: absolute; inset: 0; z-index: -1;
  background: linear-gradient(180deg, rgba(19,32,53,.75), rgba(19,32,53,.88));
}
/* **ระยะป้าย→หัวข้อของหัวหน้ารองมาคนละทางกับใน .mo-head ต้องตั้งเองทั้งสองฝั่ง**
   ใน .mo-head บล็อกกลุ่มของ WordPress ล้างระยะใต้ลูกทุกตัวเป็นศูนย์ให้อยู่แล้ว
   ระยะจึงมาจาก margin-top ของหัวข้ออย่างเดียว แต่หัวหน้ารองไม่ได้เป็นบล็อกกลุ่มแบบนั้น
   ป้ายยังกินระยะใต้ย่อหน้าเริ่มต้นของธีมแม่อยู่ ซึ่งคิดเป็น **เท่าของขนาดตัวอักษร**
   → ยิ่งขยายป้าย ป้ายยิ่งลอยห่างหัวข้อ วัดแล้วห่างขึ้นจาก 39px เป็น 50px
   ตอนที่กำลังแก้ให้ชิดขึ้นพอดี
   สั่งศูนย์ที่ป้าย แล้วให้ระยะจริงมาจาก margin-top ของ h1 ทางเดียว
   จะได้ใช้กลไกเดียวกับหัวข้อของ section และรับค่าติดลบได้ */
.mo-pagehero .mo-chip { margin-bottom: 0; }
.mo-pagehero h1 {
  color: var(--c-ink-invert);
  max-width: 18ch;
  margin-inline: auto;
  /* **หัก 1rem ออกจากค่ากลาง เป็นค่าชดเชยที่วัดมา ไม่ใช่เลขมั่ว**
     ใส่ค่ากลางตรง ๆ แล้ววัดได้ 36px ทั้งที่หัวข้อ section ได้ 19px ทั้งที่สั่งเท่ากัน
     ต่างกันเพราะสองเรื่องที่ CSS ไม่รู้ — ป้ายบนหัวหน้ารองเป็นคำที่ไม่มีหางลงล่าง
     (Treatments) จึงเหลือที่ว่างใต้ตัวอักษรไว้เปล่า ๆ และหัวเรื่องที่นี่ตัวใหญ่กว่า
     หัวข้อ section เกือบครึ่ง ที่ว่างเหนือตัวอักษรจึงมากกว่าตามไปด้วย
     → ถ้าเปลี่ยนคำในป้ายหรือขนาดหัวเรื่องเมื่อไหร่ ต้องเรนเดอร์วัดค่านี้ใหม่ */
  margin-top: calc(var(--eyebrow-gap) - 1rem);
}
/* ยกเว้น .mo-chip ด้วยเหตุผลเดียวกับ .mo-head p — ป้ายก็เป็นบล็อกย่อหน้าเหมือนกัน
   กฎนี้แรงกว่า .mo-chip จึงกลืนทั้งสีและขนาดของป้ายไปหมด
   ป้ายบนหัวหน้ารองจึงเคยเป็นขาวจาง ๆ ตัวเล็ก ไม่ใช่ทองแดงอ่อนตัวโตอย่างที่ตั้งใจ
   ถ้าไม่แก้พร้อมกัน ป้ายบนหัวหน้ารองจะเป็นจุดเดียวในเว็บที่หน้าตาไม่เหมือนที่อื่น */
.mo-pagehero p:not(.mo-chip) { color: rgba(251,250,248,.82); max-width: 52ch; margin-inline: auto; font-size: var(--fs-small); }
.mo-pagehero--left { text-align: left; }

/* ห้ามใช้ :where() ตรงนี้ — :where() มีความแรงเป็นศูนย์ ตัวเลือกทั้งบรรทัดจึงเหลือ
   แค่คลาสเดียว แล้วแพ้ .mo-pagehero h1 ข้างบนซึ่งมีคลาส+อีลิเมนต์
   ผลคือ --left ไม่เคยทำงานจริง หัวเรื่องกับย่อหน้ายังถูกจัดกึ่งกลางในกล่อง
   ของตัวเอง (18ch / 52ch) แล้วลอยไปอยู่กลางจอ ไม่ตรงกับ chip ที่ชิดซ้าย
   (เห็นตอนเรนเดอร์หน้าบริการที่ 1440px เมื่อ 25 ส.ค. 2569) */
/* **ต้องมี :not(.mo-chip) ตรงนี้ด้วย ไม่ใช่แค่ที่กฎกึ่งกลาง — เจอ 28 ส.ค. 2569**
   รอบที่แล้วแก้เรื่อง :where() ไปแล้วก็จริง แต่ยังเหลือบั๊กเดียวกันอีกชั้น
   `.mo-pagehero p:not(.mo-chip)` มีความแรง 0-2-1 (สองคลาส + อีลิเมนต์)
   ส่วน `.mo-pagehero--left p` มีแค่ 0-1-1 → **ย่อหน้ายังถูกจัดกึ่งกลางตลอด**
   หัวเรื่องไม่เจอปัญหาเพราะ `.mo-pagehero h1` ก็ 0-1-1 เท่ากัน เสมอกันแล้วตัวหลังชนะ
   ผลที่เห็นคือหัวเรื่องชิดซ้ายแต่ย่อหน้าใต้มันลอยไปกลางจอ ไม่ตรงแกนกัน
   → **บทเรียนซ้ำรอบสอง: เขียนกฎล้างค่าเมื่อไหร่ ต้องนับความแรงให้ตรงกับกฎที่จะล้าง**
   ไม่ใช่แค่เขียนให้ "เจาะจงกว่าในสายตา" */
.mo-pagehero--left h1,
.mo-pagehero--left p:not(.mo-chip) { margin-inline: 0; }

/* ย่อหน้านำของหน้ารองยาวได้กว่าเดิม — 52ch แคบไปเมื่อจัดชิดซ้าย
   ตกบรรทัดถี่จนอ่านสะดุด (design-fixes ข้อ 2.2 ระบุ 60–70 ตัวอักษร) */
.mo-pagehero--left p:not(.mo-chip) { max-width: 66ch; }

/* หน้ารองที่ไม่มีป้ายอังกฤษนำ ไม่ต้องหักระยะชดเชยของป้าย
   ค่า calc(--eyebrow-gap - 1rem) ข้างบนเป็นค่าชดเชยที่วัดจากคำว่า "Treatments"
   ไม่มีป้ายแล้วมันจะกลายเป็นระยะติดลบลอย ๆ ที่ไม่ได้ชดเชยอะไรเลย */
.mo-pagehero:not(:has(.mo-chip)) h1 { margin-top: 0; }

/* --- Spec bar (แถบ 4 ช่องท้าย hero ของหน้า program detail) ------------------
   ใช้เป็น "ข้อมูลสรุปการรักษา" — ระยะเวลา / จำนวนครั้ง / ความเหมาะสม
   ตำแหน่งนี้เป็นจุดที่ Google ดึงไปทำ snippet ได้บ่อย ควรใส่ข้อเท็จจริงล้วน
--------------------------------------------------------------------------- */
.mo-specbar {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  background: rgba(19,32,53,.55);
  backdrop-filter: blur(6px);
  border: 1px solid rgba(196,166,127,.28);
  border-radius: var(--radius-sm);
  overflow: hidden;
  margin-top: var(--sp-4);
  max-width: 42rem;
}
/* ช่วงเวลาทำการต้องอยู่บรรทัดเดียว — "10.00–19.00" ตกบรรทัดตรงขีดกลางได้
   แล้วช่องนั้นจะสูงกว่าช่องอื่นในแถวเดียวกัน ตัวเลขไม่อยู่ระดับเดียวกันทั้งแถว
   ลดระยะขอบซ้ายขวาในช่องลงหนึ่งขั้น แลกที่ว่างให้ตัวเลขพอดีบรรทัดเดียว */
.mo-spec { padding: var(--sp-2); }
.mo-spec + .mo-spec { border-left: 1px solid rgba(196,166,127,.28); }
.mo-spec__label { font-size: var(--fs-micro); letter-spacing: var(--ls-eyebrow); color: var(--c-accent-light); }
.mo-spec__value { font-family: var(--font-display); font-size: var(--fs-h3); color: var(--c-ink-invert); white-space: nowrap; }

/* --- Split (ภาพซ้าย / เนื้อหาขวา) ------------------------------------------
   ตัวเลข 400px คือ "ความกว้างต่ำสุดที่คอลัมน์หนึ่งยังอ่านสบาย"
   ต่ำกว่านั้นให้ยุบเป็นแถวเดียวแทน ไม่ใช่บีบสองคอลัมน์ต่อ

   **ของเดิมเป็น 320px ซึ่งต่ำเกินไป** ที่จอ 768px มันยังยืนยันแบ่งสองคอลัมน์
   ได้คอลัมน์ละราว 345px ผลคือรูปเล็กจนดูไม่ออกว่าเป็นใคร และข้อความไทย
   ตัดบรรทัดถี่จนอ่านสะดุด — เปลี่ยนเป็น 400px เมื่อ 27 ส.ค. 2569
   ตอนนี้ยุบเป็นแถวเดียวตั้งแต่ราว 880px ลงมา ซึ่งครอบทั้งแท็บเล็ตและมือถือ */
.mo-split {
  display: grid;
  /* **ต้องมี min() ครอบ ไม่งั้นจอแคบกว่า 400px จะล้นออกนอกจอ — แก้ 28 ส.ค. 2569**
     minmax(400px, 1fr) อ่านว่า "คอลัมน์นี้ห้ามแคบกว่า 400px ไม่ว่าอะไรจะเกิดขึ้น"
     พอ auto-fit ยุบเหลือคอลัมน์เดียวบนจอ 375px คอลัมน์นั้นก็ยัง 400px อยู่ดี
     ตะแกรงจึงกว้างกว่าจอ ข้อความล้นออกไปทางขวาแล้วทั้งหน้าเลื่อนซ้ายขวาได้
     min(400px, 100%) แปลว่า "400px หรือเท่าที่มี แล้วแต่อันไหนน้อยกว่า"
     → เจอ repeat(auto-fit, minmax(<ค่าคงที่>, 1fr)) ที่ไหนอีก ต้องครอบ min() ทุกที่ */
  grid-template-columns: repeat(auto-fit, minmax(min(400px, 100%), 1fr));
  gap: clamp(var(--sp-3), 4vw, var(--sp-5));
  align-items: center;
}
/* ห้ามใช้ > ที่นี่ — display:contents ไม่ได้ย้ายตำแหน่งใน DOM
   ตัวที่เลือกด้วย > จะไปชี้กล่องซ้อนของบล็อกกลุ่ม ไม่ใช่ของจริง */
.mo-split--text-first :where(img, figure, .mo-portrait):first-child { order: 0; }
.mo-split img { border-radius: var(--radius-img); width: 100%; height: auto; }

/* คอลลาจภาพ แบบหน้า about
   ภาพใบแรกสูงเป็นสองแถว อีกสองใบซ้อนกันในคอลัมน์ขวา
   grid-auto-rows: 1fr บังคับให้สองแถวสูงเท่ากันและยืดเต็มความสูงที่มี
   (เดิมใบแรกถูกสั่ง align-self: start ซึ่งขัดกับการกินสองแถว — มันจองที่ไว้แล้วไม่ยืด
   เหลือช่องว่างใต้ภาพ ทำให้คอลลาจเตี้ยกว่าคอลัมน์ข้อความข้าง ๆ อย่างเห็นได้ชัด) */
.mo-collage {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-auto-rows: 1fr;
  gap: var(--sp-2);
  align-self: stretch;
  min-height: 24rem;
}
.mo-collage > :first-child { grid-row: span 2; }
@media (max-width: 600px) {
  .mo-collage { grid-template-columns: 1fr; grid-auto-rows: auto; min-height: 0; }
  .mo-collage > :first-child { grid-row: auto; }
}

/* --- Feature card + icon badge --------------------------------------------- */
.mo-features { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: var(--sp-2); }

/* กำหนดจำนวนคอลัมน์ตรง ๆ เมื่อรู้จำนวนการ์ดแน่นอน
   ปล่อยให้ auto-fit คิดเองแล้วการ์ด 6 ใบจะเรียงเป็น 4+2 เหลือเศษห้อย ดูไม่เรียบร้อย */
@media (min-width: 640px) {
  .mo-features--3, .mo-features--4 { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 960px) {
  .mo-features--3 { grid-template-columns: repeat(3, 1fr); }
  .mo-features--4 { grid-template-columns: repeat(4, 1fr); }
}

.mo-feature {
  background: var(--c-surface);
  border-radius: var(--radius-card);
  padding: var(--sp-3);
}
.mo-feature h3 { margin: var(--sp-2) 0 var(--sp-1); }
.mo-feature p { font-size: var(--fs-small); color: var(--c-ink-soft); margin: 0; }
.mo-icon {
  display: grid;
  place-items: center;
  width: 2.75rem; height: 2.75rem;
  border-radius: 50%;
  background: var(--c-brand);
  color: var(--c-accent-light);
  font-size: 1.1rem;
}
.mo-icon--outline { background: transparent; border: 1px solid var(--c-accent); color: var(--c-accent-text); }

/* --- Checklist (รายการมีเส้นคั่นแบบหน้า about) ------------------------------ */
.mo-checklist { list-style: none; padding: 0; margin: var(--sp-3) 0 0; }
.mo-checklist:first-child { margin-top: 0; }
.mo-checklist li {
  display: flex;
  gap: var(--sp-2);
  padding: .8em 0;
  border-bottom: 1px solid var(--c-line);
  font-size: var(--fs-body);
  line-height: var(--lh-tight);
}
/* ใช้ --c-accent-text ไม่ใช่ --c-accent เพราะนี่เป็น "ตัวอักษร" จริง ๆ ไม่ใช่รูป
   ขนาดราว 19px ซึ่งต่ำกว่าเกณฑ์ข้อความใหญ่ ทองแดงอ่อนจึงไม่ผ่าน AA (design-fixes ข้อ 3) */
.mo-checklist li::before {
  content: "✳";
  color: var(--c-accent-text);
  font-size: 1.15em;
  line-height: inherit;
  flex: none;
}
.mo-checklist li:last-child { border-bottom: 0; }

/* --- Checklist สองคอลัมน์ --------------------------------------------------
   ใช้กับรายการสั้น ๆ ที่ไม่ได้เรียงตามลำดับ (เช่น "เตรียมอะไรมาบ้าง")
   เรียงลงมาคอลัมน์เดียวแล้วหน้ายืดยาวเกินจำเป็น ทั้งที่แต่ละข้อไม่ได้ต่อเนื่องกัน

   minmax(min(28rem, 100%), 1fr) ไม่ใช่ minmax(28rem, 1fr) — ถ้าไม่ครอบ min()
   ตะแกรงจะกว้างกว่าจอมือถือแล้วเลื่อนซ้ายขวาได้
   (กับดักที่ Design.md บันทึกไว้ เจอมาแล้ว 2 จุดเมื่อ 28 ส.ค. 2569)

   **28rem ไม่ใช่ 20rem — ตัวเลขนี้เป็นตัวกำหนดว่าได้กี่คอลัมน์**
   ลองด้วย 20rem (320px) ก่อนแล้วได้ 3 คอลัมน์บนจอ 1440 เพราะกล่อง .mo-wrap
   กว้าง 1152px หารด้วย 320 ได้ 3.6 — ของ 4 ข้อเลยเรียงเป็น 3+1 ดูเหมือนวางพลาด
   28rem (448px) ทำให้ 1152px ใส่ได้ 2 คอลัมน์พอดี (448×2+40 = 936) และ 3 ไม่พอ
   (448×3+80 = 1424) จึงล็อกเป็น 2 คอลัมน์บนจอกว้างตามที่ไฟล์เนื้อหากำหนด

   เส้นคั่นของข้อสุดท้ายต้องคืนกลับมา — กฎ :last-child ข้างบนตัดเส้นให้ข้อท้ายสุด
   ซึ่งถูกตอนเรียงคอลัมน์เดียว แต่พอเป็นสองคอลัมน์ ข้อท้ายของคอลัมน์ซ้าย
   ไม่ใช่ข้อสุดท้ายของรายการ เส้นจึงขาดไปข้างเดียวดูเหมือนพลาด */
.mo-checklist--two {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(28rem, 100%), 1fr));
  column-gap: var(--sp-4);
}
.mo-checklist--two li:last-child { border-bottom: 1px solid var(--c-line); }

/* --- Checklist แบบมีรูปประกอบต่อข้อ ----------------------------------------
   ใช้กับรายการที่ "ต้องเห็นถึงจะเข้าใจ" เช่น สัญญาณกระดูกสันหลังคด
   คำอธิบายอย่างเดียวนึกภาพไม่ออกว่าต้องไปส่องกระจกดูตรงไหน

   รูปในนี้สื่อเรื่องเดียวกับข้อความข้าง ๆ จึงนับเป็นของตกแต่ง ต้องใส่ alt=""
   ไม่งั้นโปรแกรมอ่านหน้าจอจะอ่านซ้ำสองรอบทุกข้อ
--------------------------------------------------------------------------- */
.mo-checklist--visual li {
  align-items: center;
  gap: var(--sp-2);
  padding: .7em 0;
}
.mo-checklist--visual li::before { content: none; }
.mo-checklist--visual :where(img, .mo-thumb) {
  flex: none;
  width: 4.5rem;
  height: 4.5rem;
  border-radius: var(--radius-sm);
  object-fit: cover;
  background: var(--c-canvas);
}
@media (max-width: 480px) {
  .mo-checklist--visual :where(img, .mo-thumb) { width: 3.5rem; height: 3.5rem; }
}

/* --- Signals (การ์ดสัญญาณเตือน — ภาพลายเส้น + คำอธิบายใต้ภาพ) ------------------
   **เปลี่ยนจากภาพถ่าย 8 ใบเป็นลายเส้น 6 ใบเมื่อ 28 ส.ค. 2569** (design-fixes ข้อ 6)

   ของเดิมเป็นภาพถ่ายหลังคนบนพื้น navy ทั้งแปดใบ ซึ่งพังด้วยเหตุผลเดียว —
   **ภาพถ่ายเลือกไม่ได้ว่าจะไม่แสดงอะไร** ทุกใบติดผม ผิว เสื้อ ฉากหลังมาด้วยหมด
   ของพวกนั้นเหมือนกันทั้งแปดใบ ส่วนที่ต่างจริง (ไหล่เอียงกี่องศา) เล็กจนมองไม่เห็น
   ตากวาดแล้วเห็นเป็น "รูปหลังคน" แปดใบซ้ำกัน ไม่ใช่แปดอาการ

   ภาพชุดที่ใช้อยู่เป็น **เงาคนทึบสีกรมท่า + ระบายทองแดงจุดเดียวต่อหนึ่งใบ**
   ตรงอวัยวะที่ข้อนั้นพูดถึงพอดี ทองแดงทั้งหกจุดจึงอยู่คนละที่บนร่างกาย
   ตากวาดแล้วเห็นจุดทองแดงก่อน จึงรู้ทันทีว่าใบนี้พูดถึงตรงไหน โดยไม่ต้องอ่าน

   → **กฎที่ต้องรักษาไว้เมื่อเพิ่มข้อใหม่: จุดทองแดงห้ามทับตำแหน่งของหกใบเดิม**
     ไม่ใช่แค่ "ภาพต้องสวย" — ตำแหน่งของทองแดงคือกลไกที่ทำให้แยกใบออกจากกัน

   **เคยลองลายเส้นโปร่งแล้วไม่ผ่าน** (28 ส.ค. 2569 รอบแรกของวันเดียวกัน)
   เส้นบางไม่มีน้ำหนัก พอย่อเหลือ ~190px วางบนหน้าที่มีรูปถ่ายจริงกับแถบสีทึบ
   เต็มไปหมด มันอ่านออกมาเป็น "แบบร่างที่ยังไม่ได้ลงสี" ไม่ใช่ไอคอนที่ทำเสร็จแล้ว
   → บนหน้านี้ ภาพที่มีเนื้อทึบเท่านั้นที่ยืนอยู่ได้

   **สีฝังอยู่ในไฟล์ภาพ ไม่ได้มาจาก token** ต่างจากไอคอนอื่นในธีมที่ใช้ currentColor
   เป็นข้อแลกที่ยอมรับแล้ว เพราะภาพสองสีทึบทำด้วย CSS ไม่ได้
   → **เปลี่ยนสีกรมท่าหรือทองแดงใน tokens.css เมื่อไหร่ ภาพหกใบนี้จะไม่เปลี่ยนตาม**
     ต้องทำไฟล์ใหม่ (สคริปต์ที่ใช้ทำอยู่ในประวัติ git ของงานวันที่ 28 ส.ค. 2569)

   alt="" ทุกใบ — ภาพสื่อเรื่องเดียวกับข้อความข้าง ๆ อยู่แล้ว
   ไม่งั้นโปรแกรมอ่านหน้าจอจะอ่านซ้ำสองรอบทุกข้อ
--------------------------------------------------------------------------- */
.mo-signals {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--sp-3);
  list-style: none;
  padding: 0;
  margin: 0;
}

/* 3 คอลัมน์บนจอกว้าง — 6 ข้อลงตัวเป็น 3×2 พอดี
   เดิมเป็น 4 คอลัมน์ตอนยังมี 8 ข้อ ลดจำนวนข้อแล้วต้องลดคอลัมน์ตาม
   ไม่งั้นแถวล่างเหลือ 2 ใบลอยอยู่ครึ่งแถว
   จุดตัด 900px ตรงกับ .mo-rows ที่อยู่ในหน้าเดียวกัน แก้ที่หนึ่งควรดูอีกที่ด้วย */
@media (min-width: 900px) {
  .mo-signals { grid-template-columns: repeat(3, 1fr); }
}

.mo-signals li { display: flex; flex-direction: column; gap: var(--sp-2); align-items: center; }

/* กรอบรองภาพ — พื้น paper บนแถบ cream คือจุดที่พาเลตต์ใหม่ได้ทำงานจริง
   ตอน cream ยังเป็น #f6f0e9 กรอบนี้จะจมหายไปกับพื้น จึงทำไม่ได้มาก่อน */
.mo-signals__icon {
  display: grid;
  place-items: center;
  width: 100%;
  /* คุมความกว้างสูงสุดไว้ ไม่งั้นบนจอ 1440 กรอบจะกว้างใบละ 380px
     กลายเป็นช่องว่างสี่เหลี่ยมใหญ่ที่มีลายเส้นเล็ก ๆ อยู่ตรงกลาง
     และ section เดียวยาวเกินหนึ่งหน้าจอทั้งที่มีแค่ 6 ข้อ */
  max-width: 12rem;
  aspect-ratio: 1;
  border-radius: var(--radius-img);
  background: var(--c-surface);
  border: 1px solid var(--c-line);
}

.mo-signals__icon img {
  /* 72% เดิมเล็กไป กรอบเหลือที่ว่างรอบตัวเยอะจนภาพดูลอย
     เกิน 84% ตัวคนจะไปชนขอบกรอบ */
  width: 82%;
  /* ต้องมี height:auto — แท็ก <img> มีแอตทริบิวต์ height="512" ซึ่งเบราว์เซอร์
     ถือเป็นความสูงตายตัว รูปจะถูกบีบให้เตี้ยลงตามสัดส่วนที่ผิด
     (กับดักเดียวกับที่เคยเจอตอนใช้ภาพถ่ายชุดเดิม) */
  height: auto;
  display: block;
}

.mo-signals__label {
  font-size: var(--fs-lead);
  line-height: var(--lh-body);
  text-align: center;
  /* pretty แค่กันคำโดดบรรทัดสุดท้าย แต่ข้อความจัดกึ่งกลางที่ตกสองบรรทัด
     ถ้ายาวไม่เท่ากันจะเห็นเป็นสามเหลี่ยมเบี้ยว ชัดกว่าตอนชิดซ้ายมาก */
  text-wrap: balance;
}

/* ข้อความสรุป + ปุ่มท้ายรายการ — คุมความกว้างไว้ ไม่งั้นบรรทัดยาวเต็ม 1200px อ่านยาก */
.mo-signals__foot {
  max-width: 54ch;
  margin: var(--sp-4) auto 0;
  text-align: center;
}
.mo-signals__foot > * + * { margin-top: var(--sp-3); }

/* --- การ์ดบริการ (รูปด้านบน ข้อความด้านล่าง) ------------------------------------
   **แทนที่ .mo-card--photo เมื่อ 28 ส.ค. 2569** (design-fixes ข้อ 5)

   ของเดิมเป็นบล็อก "หน้าปก" ที่วางตัวอักษรทับลงบนรูปถ่ายโดยตรง
   ซึ่งพาไปสู่ทางตันที่แก้ด้วย CSS ไม่ได้ — รูปบริการทั้งหกใบสว่างมืดไม่เท่ากัน
   ชั้นไล่สีที่ทึบพอให้ตัวอักษรขาวอ่านออกบน "ใบที่สว่างที่สุด" ก็ทึบเกินไป
   สำหรับอีกห้าใบ ผลคือรูปทั้งชุดกลายเป็นสี่เหลี่ยม navy คล้ายกันหมด
   → เสียทั้งรูปและเสียทั้งความอ่านง่าย เพราะสองอย่างนี้แย่งพื้นที่เดียวกันอยู่

   แยกชั้นกันคนละส่วนแล้วทั้งคู่ได้เต็ม รูปไม่ถูกทาทับ ข้อความอยู่บนพื้นทึบ
   คอนทราสต์จึงเป็นค่าคงที่ ไม่ขึ้นกับว่ารูปในการ์ดใบนั้นสว่างแค่ไหน

   พื้นข้อความเป็น paper (มาจาก .mo-card) ไม่ใช่ครีม เพราะ section นี้เป็นแถบครีม
   การ์ดครีมบนแถบครีมจะกลืนหายไปทั้งใบ
--------------------------------------------------------------------------- */
.mo-card--service {
  display: flex;
  flex-direction: column;
  padding: 0;          /* ระยะขอบย้ายไปอยู่ที่ .mo-card__body รูปจะได้ชนขอบการ์ด */
  overflow: hidden;    /* ตัดมุมรูปให้โค้งตามการ์ด */
}

.mo-card--service .mo-card__media { margin: 0; }

.mo-card--service .mo-card__media img {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 4 / 3;
  object-fit: cover;
}

/* กรอบรอรูปที่ยังไม่มีในคลังสื่อ — สูงเท่ารูปจริงเพื่อไม่ให้การ์ดในแถวสูงไม่เท่ากัน */
.mo-card--service .mo-card__media.mo-ph {
  aspect-ratio: 4 / 3;
  min-height: 0;
  border: 0;
  border-bottom: 1px dashed var(--c-line);
  border-radius: 0;
}

/* flex:1 ทำให้กล่องข้อความยืดเต็มความสูงที่เหลือ การ์ดในแถวเดียวกันจึงสูงเท่ากัน
   แม้คำอธิบายจะยาวไม่เท่ากัน */
.mo-card__body {
  display: flex;
  flex-direction: column;
  flex: 1;
  padding: var(--sp-3);
}

/* **หัวข้อการ์ดต้องคุมขนาดเอง ไม่ปล่อยไปตามระดับหัวเรื่อง (24 ก.ย. 2569)**

   การ์ดบริการในหน้าแรกใช้ h3 เพราะมีหัวข้อ section เป็น h2 คั่นอยู่ข้างบน
   แต่หน้ารวม /service/ ไม่มี section คั่น ชื่อบริการจึงต้องเป็น h2
   ไม่งั้นลำดับหัวเรื่องข้ามจาก h1 ไป h3 ซึ่งผิดโครงสร้างและโปรแกรมอ่านหน้าจอสับสน

   ปัญหาคือ h2 ทั้งเว็บมีขนาด --fs-h2 (40px) ซึ่งใหญ่เกินกล่องกว้าง ~310px มาก
   **ชื่อบริการยาว ๆ จึงยาวกว่าความกว้างการ์ด เบราว์เซอร์เลยจำใจตัดกลางคำ**
   เห็นจริงตอนเรนเดอร์: "การกระตุ้นกล้า" ขึ้นบรรทัดหนึ่ง "มเนื้อด้วยไฟฟ้า" อีกบรรทัด
   ซึ่งผิดข้อบังคับภาษาไทยข้อ 4 ใน Design.md เต็ม ๆ

   **รากปัญหาคือขนาดตัวอักษร ไม่ใช่การตัดคำ** แก้ด้วย line-break หรือ word-break
   ไม่หาย เพราะคำมันยาวกว่ากล่องจริง ๆ เบราว์เซอร์ไม่มีทางเลือกอื่น
   สั่งขนาดตามบทบาท (หัวข้อการ์ด) ไม่ใช่ตามระดับ (h2/h3) ทั้งสองระดับจึงหน้าตาเท่ากัน
   ได้ทั้งลำดับหัวเรื่องที่ถูกและขนาดที่พอดีกล่อง */
.mo-card__body :where(h2, h3) {
  font-size: var(--fs-h3);
  margin: 0 0 var(--sp-1);
}
.mo-card__body p { margin: 0; }

/* margin-top:auto ดันลิงก์ลงไปติดก้นการ์ดเสมอ ลิงก์ของทั้งหกใบจึงอยู่ระดับเดียวกัน
   ต้องมี flex:1 ที่ .mo-card__body ข้างบนก่อน ไม่งั้น auto ไม่มีที่ว่างให้ดัน */
.mo-card__more {
  margin-top: auto;
  padding-top: var(--sp-2);
  color: var(--c-accent-text);
  font-weight: var(--fw-strong);
  font-size: var(--fs-small);
}
.mo-card__more a { color: inherit; text-decoration: none; }
.mo-card__more a:hover { text-decoration: underline; }

/* แถวปุ่มปิดท้าย section — จัดกึ่งกลาง รองรับหลายปุ่มและตกบรรทัดบนจอแคบ */
.mo-cta-row {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-2);
  justify-content: center;
  margin-top: var(--sp-4);
}
.mo-cta-row p { margin: 0; }

/* ปุ่มใน hero เป็น <p> ที่มาจากบล็อกย่อหน้า ต้องล้างระยะขอบทิ้ง
   ไม่งั้นระยะห่างระหว่างปุ่มจะเพี้ยนจากที่ gap ตั้งไว้ */
.mo-hero__actions p { margin: 0; }

/* --- Quote band (แถบสีเต็มความกว้าง) --------------------------------------- */
.mo-quoteband {
  background: var(--c-brand);
  color: var(--c-ink-invert);
  text-align: center;
  padding-block: var(--section-y);
  /* แถบนี้ไม่มี .mo-wrap ครอบ จอแคบคำพูดจึงชิดขอบจอ ~8px (เห็น 28 ก.ย. 2569) — ใช้ขอบชุดเดียวกับ .mo-wrap */
  padding-inline: var(--wrap-pad);
}
.mo-quoteband blockquote {
  font-family: var(--font-display);
  font-size: clamp(1.25rem, 1rem + 1.4vw, 1.9rem);
  line-height: 1.5;
  max-width: 32ch;
  margin-inline: auto;
  border: 0;
  padding: 0;
}
.mo-quoteband cite { display: block; margin-top: var(--sp-3); color: var(--c-accent-light); font-style: normal; font-size: var(--fs-small); }

/* --- FAQ -------------------------------------------------------------------
   ใช้ <details>/<summary> ของ HTML แท้ ไม่ใช้ JavaScript
   ได้ keyboard กับโปรแกรมอ่านหน้าจอถูกต้องฟรี และ Google อ่านคำตอบที่ยังไม่กางได้

   ของเดิมเป็นกล่อง navy ทึบ 7 ก้อนเรียงลงมาบนพื้นครีม ซึ่งขัดกับดีไซน์เอง
   จังหวะแถบสลับ paper/cream/navy ที่เป็นเอกลักษณ์เสียไป กลายเป็นก้อนดำกลางหน้า
   เปลี่ยนเป็นการ์ดพื้นกระดาษขอบเส้นบาง ใช้ภาษาเดียวกับ .mo-card ที่ใช้อยู่แล้วทั้งเว็บ
   แล้วเก็บ navy ไว้ให้ section ที่ตั้งใจให้มืดจริง ๆ
--------------------------------------------------------------------------- */
.mo-faq {
  display: grid;
  gap: var(--sp-2);
  max-width: var(--wrap-narrow);
  margin-inline: auto;
  /* เปิดให้ความสูง auto เคลื่อนไหวได้ ใช้กับ ::details-content ข้างล่าง
     เบราว์เซอร์ที่ยังไม่รองรับจะกางทันทีแบบเดิม ไม่พัง */
  interpolate-size: allow-keywords;
}

.mo-faq__item {
  background: var(--c-surface);
  border: 1px solid var(--c-line);
  border-radius: var(--radius-card);
  overflow: hidden;
  transition: border-color var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}
.mo-faq__item:hover { border-color: var(--c-accent); }

/* ข้อที่กางอยู่ต้องดูออกทันทีว่าคืออันไหน ใช้เส้นทองแดงด้านซ้ายเป็นตัวบอก
   ไม่ได้เปลี่ยนสีพื้น เพราะจะกลายเป็นก้อนหนักแบบเดิม */
.mo-faq__item[open] {
  border-color: transparent;
  box-shadow: var(--shadow-card);
}
.mo-faq__item[open] summary { box-shadow: inset 3px 0 0 var(--c-accent); }

.mo-faq__item summary {
  position: relative;
  display: block;
  padding: var(--sp-3);
  padding-inline-end: calc(var(--sp-3) * 2.4);
  cursor: pointer;
  list-style: none;
  /* คำถามคือส่วนที่คนกวาดตาหา ต้องอ่านง่าย และใช้ฟอนต์หัวข้อน้ำหนักบาง
     ตามเอกลักษณ์ของดีไซน์ ไม่ใช่ตัวหนาขนาดเล็กแบบเดิม */
  font-family: var(--font-display);
  font-weight: var(--fw-display);
  font-size: var(--fs-h3);
  line-height: var(--lh-tight);
  color: var(--c-ink);
  transition: color var(--dur) var(--ease);
}
.mo-faq__item summary::-webkit-details-marker { display: none; }
.mo-faq__item summary:hover { color: var(--c-accent-text); }

/* เครื่องหมายบวกที่กลายเป็นลบตอนกาง วาดด้วยเส้นสองเส้น ไม่ใช้ตัวอักษร
   ตัวอักษรลูกศรแต่ละฟอนต์วาดไม่เหมือนกันและลอยไม่ตรงกลาง */
.mo-faq__item summary::before,
.mo-faq__item summary::after {
  content: "";
  position: absolute;
  inset-inline-end: var(--sp-3);
  inset-block-start: calc(var(--sp-3) + .55em);
  width: .85rem;
  height: 2px;
  background: var(--c-accent);
  transition: transform var(--dur) var(--ease), opacity var(--dur) var(--ease);
}
.mo-faq__item summary::after { transform: rotate(90deg); }
.mo-faq__item[open] summary::after { transform: rotate(0deg); opacity: 0; }

/* คำตอบ */
.mo-faq__item > :not(summary) {
  padding: 0 var(--sp-3) var(--sp-3);
  margin: 0;
  color: var(--c-ink-soft);
  font-size: var(--fs-body);
  line-height: var(--lh-body);
}

/* กางแบบค่อย ๆ เลื่อนแทนการกระตุก ทำด้วย CSS ล้วน ไม่ต้องพึ่ง JavaScript
   --dur กลายเป็น 0.01ms เองเมื่อผู้ใช้ตั้งค่าลดการเคลื่อนไหว */
.mo-faq__item::details-content {
  block-size: 0;
  overflow: hidden;
  transition: block-size var(--dur) var(--ease), content-visibility var(--dur) allow-discrete;
}
.mo-faq__item[open]::details-content { block-size: auto; }

/* กรอบไฮไลต์ตอนกด Tab — summary ไม่ได้อยู่ในรายการรวมที่ต้นไฟล์
   ถ้าไม่เขียนเพิ่มจะได้กรอบมาตรฐานของเบราว์เซอร์ ไม่ใช่สีทองแดงของดีไซน์ */
.mo-faq__item summary:focus-visible {
  outline: 3px solid var(--c-focus);
  outline-offset: -3px;
}

/* --- Contact ---------------------------------------------------------------- */
.mo-contact { display: grid; grid-template-columns: minmax(280px, 2fr) 3fr; gap: var(--sp-3); align-items: stretch; }
@media (max-width: 860px) { .mo-contact { grid-template-columns: 1fr; } }
.mo-formcard { background: var(--c-canvas); border-radius: var(--radius-card); padding: var(--sp-3); }
.mo-formcard :where(input, textarea, select) {
  width: 100%;
  background: var(--c-surface);
  border: 1px solid var(--c-line);
  border-radius: var(--radius-sm);
  padding: .7em .9em;
  font: inherit;
  color: var(--c-ink);
}
.mo-formcard label { display: block; font-size: var(--fs-micro); letter-spacing: var(--ls-eyebrow); color: var(--c-ink-soft); margin-bottom: .35em; }

/* กล่องแผนที่: โหลด iframe เมื่อผู้ใช้กดเท่านั้น (ดูเหตุผลใน README) */
.mo-mapcard { position: relative; border-radius: var(--radius-card); overflow: hidden; min-height: 22rem; background: var(--c-canvas) center/cover; }
.mo-mapcard iframe { width: 100%; height: 100%; border: 0; display: block; }
.mo-infostrip {
  position: absolute; left: var(--sp-2); right: var(--sp-2); bottom: var(--sp-2);
  display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));
  gap: var(--sp-2);
  background: var(--c-surface);
  border-radius: var(--radius-sm);
  padding: var(--sp-2);
  text-align: center;
  box-shadow: var(--shadow-card);
}
.mo-infostrip b { display: block; font-weight: var(--fw-strong); margin-top: .35em; }

/* --- Visit Us: ฟอร์ม+ช่องทางติดต่อ ซ้าย · แผนที่ ขวา -------------------------

   ใช้บล็อก Columns ของ WordPress ไม่ได้ใช้ตะแกรง .mo-contact ข้างบน
   **เหตุผลคือกับดักเดียวกับที่เจอตอนทำการ์ดบทความ** — บล็อก Group พ่นกล่องซ้อน
   ข้างในให้อีกชั้น (`.wp-block-group__inner-container`) ตะแกรงที่สั่งไว้ที่ตัวนอก
   จึงไม่ได้จัดลูกทั้งสองฝั่ง แต่ไปจัดกล่องซ้อนใบเดียวแทน = เหลือคอลัมน์เดียว
   บล็อก Columns ไม่มีปัญหานี้ และคนแก้เนื้อหาลากสลับซ้ายขวาเองได้ในหลังเว็บ

   (`.mo-contact` ของเดิมยังอยู่ ยังไม่มีหน้าไหนใช้ — **มันมีบั๊กนี้อยู่**
   วันไหนหยิบไปใช้จริงจะเจอว่าเหลือคอลัมน์เดียว ให้มาอ่านคอมเมนต์นี้) */
/* **section นี้กินเต็มความกว้างจอ ไม่มี .mo-wrap ครอบ**

   ทุก section อื่นในหน้าคุมเนื้อหาไว้ที่ 1200px เท่ากันหมด ซึ่งอ่านง่ายก็จริง
   แต่พอเรียงกันหลาย section ติดกัน ขอบซ้ายขวาเป็นเส้นตรงเดียวยาวตลอดหน้า
   เจ้าของบอกว่า "ดูน่าเบื่อ" (31 ส.ค. 2569) — จุดนี้จึงตั้งใจแหกกรอบนั้น
   ให้แผนที่ชนขอบจอฝั่งขวาจริง ๆ และฟอร์มได้พื้นที่กว้างกว่าเดิม

   padding-block เป็น 0 เพราะแผนที่ต้องชนขอบบนล่างของ section ด้วย
   ไม่งั้นจะเหลือแถบพื้นขาวคาดหัวท้ายแผนที่ แล้วไม่เรียกว่าเต็ม */
.mo-section--flush { padding-block: 0; }

/* gap เป็น 0 เพื่อให้สองฝั่งเป็น "กล่องเดียว" ไม่ใช่การ์ดสองใบวางคู่กัน
   (บล็อก Columns ตั้ง gap มาให้เป็นค่าตั้งต้น ต้องสั่งทับ)

   **ห้ามใส่ max-width ให้แถบนี้** เคยลองใส่เพดาน 1600px เมื่อ 1 ก.ย. 2569
   เพราะอ่านคำว่า "กว้างไป" ของเจ้าของผิด ที่เจ้าของหมายถึงจริง ๆ คือแถบมัน **ยาว**
   (สูง 1510px) ไม่ใช่กว้าง พอใส่เพดานแล้วแผนที่เลิกชนขอบจอ ซึ่งผิดจากที่สั่งไว้แต่แรก
   → ถอดเพดานออกแล้ว แถบนี้ต้องกินเต็มความกว้างจอเสมอ
   → ความสูงไปแก้ที่ padding ของ .mo-visit__panel กับความสูงฟอร์มแทน */
.mo-visit { gap: 0; margin-block: 0; align-items: stretch; }
.mo-visit .wp-block-column { display: flex; flex-direction: column; }

/* ฝั่งซ้าย — แผงฟอร์ม
   ยืมคลาส .mo-formcard มาเพื่อให้ CSS ของช่องกรอกและของ Fluent Forms ข้างล่าง
   ทำงานเหมือนเดิม แล้วถอนหน้าตา "การ์ด" ของมันออกตรงนี้ (มุมมน + ระยะขอบ)
   เพราะตอนนี้มันไม่ใช่การ์ดลอยแล้ว แต่เป็นครึ่งซ้ายของแถบเต็มจอ */
.mo-visit__panel {
  flex: 1;
  border-radius: 0;
  display: flex;
  /* ระยะบน-ล่างใช้ค่าของตัวเอง ไม่ใช่ --section-y ของ section ทั่วไป (1 ก.ย. 2569)
     เจ้าของบอกว่าแถบนี้ "ยาวเกิน" วัดแล้วสูง 1510px ซึ่งสูงกว่าจอแล็ปท็อปทั้งจอ
     --section-y ให้ 80px ต่อด้าน รวมสองด้าน 160px ทั้งที่แถบนี้เนื้อหาแน่นอยู่แล้ว
     ไม่ต้องการอากาศเท่า section ที่มีแค่หัวข้อกับการ์ด */
  padding: clamp(var(--sp-4), 3vw, var(--sp-5)) clamp(var(--sp-3), 4.5vw, var(--sp-6));

  /* พื้นขาวแทนครีม (เจ้าของสั่ง 31 ส.ค. 2569)
     ใช้ --c-surface ไม่ใช่ #ffffff — ขาวล้วนไม่มีในพาเลตต์ และ CLAUDE.md ระบุว่า
     เจอ #ffffff บนพื้นหลังเมื่อไหร่ให้ถือว่าเป็นของธีมแม่รั่วมา
     --c-surface (#fbfaf8) คือ "ขาว" ของดีไซน์นี้ ตาอ่านเป็นขาวแต่ยังอยู่ในพาเลตต์
     ทับค่าครีมที่สืบมาจาก .mo-formcard ได้เพราะกฎนี้อยู่ล่างกว่าในไฟล์ */
  background: var(--c-surface);
}

/* กรอบจาง ๆ ขอบมนรอบตัวฟอร์ม (เจ้าของสั่ง 31 ส.ค. 2569)

   พอพื้นแผงเปลี่ยนจากครีมเป็นขาว ตัวฟอร์มจะไม่มีอะไรแยกมันออกจากพื้นอีก
   กรอบบาง ๆ จึงทำหน้าที่บอกขอบเขตแทนสีพื้นที่หายไป

   เขียนที่ตัว <form> ของ Fluent Forms โดยตรง จะได้ไม่ต้องไปเพิ่มกล่องครอบใน
   เนื้อหาหน้า — เนื้อหาอยู่ในฐานข้อมูล แก้แล้วต้องไล่แก้ทุกหน้าที่วาง section นี้

   **เลือกที่ .mo-formcard ไม่ใช่ .mo-visit__panel (1 ก.ย. 2569)**
   หน้าติดต่อมีฟอร์มอยู่ใน section ของตัวเองซึ่งไม่ได้อยู่ในแผง Visit Us
   ผูกกับ .mo-formcard แล้วฟอร์มทุกที่ในเว็บได้กรอบเดียวกันหมดโดยไม่ต้องเขียนซ้ำ
   (.mo-formcard เป็นคลาสเดียวกับที่สไตล์ Fluent Forms ทั้งชุด scope ไว้อยู่แล้ว) */
.mo-formcard .frm-fluent-form {
  border: 1px solid var(--c-line);
  border-radius: var(--radius-card);
  padding: var(--sp-3);
}

/* คุมความยาวบรรทัดไม่ให้ยืดจนอ่านยากบนจอกว้าง

   **ต้องเขียนสองบรรทัดให้ชนะกฎปลดกรอบของหน้าเต็มจอ (31 ส.ค. 2569)**
   `.mo-fullbleed .site-main .wp-block-group__inner-container` ข้างบนสั่ง
   `max-width: none` ด้วยความแรง 0-3-0 ส่วนกฎนี้เขียนไว้แค่ 0-2-0 จึงแพ้เงียบ ๆ
   ผลคือ **ฟอร์มยืดเต็มแผงบนจอกว้าง** ทั้งที่ตั้งเพดานไว้แล้ว — มองไม่เห็นที่จอ 1440
   เพราะระยะขอบเป็นตัวจำกัดความกว้างอยู่ก่อน เพดานยังไม่ทันได้ทำงาน
   เห็นก็ต่อเมื่อเปิดบนจอที่กว้างกว่านั้นมาก (เจ้าของเจอเองแล้วส่งภาพมา)
   บรรทัดที่มี .mo-fullbleed จึงมีไว้เพื่อเสมอกันที่ 0-3-0 แล้วชนะด้วยลำดับที่อยู่ล่างกว่า
   ส่วนบรรทัดสั้นไว้ใช้กับหน้าที่ไม่ได้เป็นแบบเต็มจอ — ห้ามแก้ด้วย !important (กฎข้อ 3)

   34rem (544px) เป็นความกว้างที่ฟอร์มคอลัมน์เดียวอ่านสบาย ไม่ใช่แถบยาวเหยียด
   ตรงกับที่เห็นบนจอ 1440 อยู่แล้ว (539px) ซึ่งเป็นสัดส่วนที่ผ่านตามาแล้ว */
.mo-visit__panel > .wp-block-group__inner-container,
.mo-fullbleed .mo-visit__panel > .wp-block-group__inner-container {
  flex: 1;
  width: 100%;
  max-width: 34rem;
  margin-inline: auto;
  display: flex;
  flex-direction: column;
  justify-content: center;
}

/* หัวข้อในแผงซ้ายชิดซ้าย ไม่ใช่กึ่งกลางแบบ section อื่น */
.mo-visit__panel .mo-head { margin-bottom: var(--sp-2); }

/* --- บีบฟอร์มในแถบ Visit Us ให้เตี้ยลง (1 ก.ย. 2569) ---------------------
   **เฉพาะในแถบนี้เท่านั้น ฟอร์มบนหน้าติดต่อยังโปร่งเหมือนเดิม**
   หน้าติดต่อมีทั้งหน้าให้ฟอร์มหายใจ แต่ในแถบ Visit Us ฟอร์มกินความสูง 802px
   จาก 1510px ของทั้งแถบ (53%) ซึ่งเป็นตัวการหลักที่ทำให้แถบยาวเกิน

   ลดสามจุดที่ไม่กระทบการใช้งาน ไม่ได้ตัดช่องกรอกออกสักช่อง */
.mo-visit__panel .ff-el-group { margin-bottom: var(--sp-1); }
.mo-visit__panel .frm-fluent-form :where(input, select) { padding-block: .5em; }
/* กล่องเล่าอาการตั้งมา 4 บรรทัด ซึ่งยาวกว่าที่คนส่วนใหญ่พิมพ์จริง
   เหลือราว 3 บรรทัดยังพอเห็นข้อความตัวอย่างครบ และยืดเองได้ตอนพิมพ์ */
.mo-visit__panel .frm-fluent-form textarea { min-height: 0; height: 4.6em; }

/* บล็อกที่อยู่ในแผงข้าง — <address> เอียงเองโดยปริยายตามค่ามาตรฐานของเบราว์เซอร์
   **ฟอนต์ไทยไม่มีตัวเอียงจริง เบราว์เซอร์จึงบิดตัวอักษรเอาเอง** ผลคือสระกับ
   วรรณยุกต์เอียงไปคนละองศากับตัวพยัญชนะ อ่านแล้วรู้สึกว่าตัวหนังสือเพี้ยน
   (จุดเดียวกับที่ .mo-footer address ในท้ายเว็บต้องสั่ง normal ไว้แล้ว) */
.mo-address {
  font-style: normal;
  line-height: var(--lh-body);
  margin: 0;
}

/* ฝั่งขวา — แผนที่ชนขอบทุกด้าน ไม่มีมุมมน

   **พื้นก่อนกดต้องเป็น navy ไม่ใช่ครีม** — ค่าตั้งต้นของ .mo-mapcard เป็นครีม
   ซึ่งเมื่อก่อนใช้ได้เพราะมันเป็นการ์ดลอยบนพื้น paper แต่ตอนนี้มันแปะติดแผงฟอร์ม
   ที่เป็นครีมเหมือนกัน ครีมชนครีมแล้วมองไม่ออกว่ามีสองฝั่ง เห็นเป็นพื้นที่ว่าง
   ก้อนเดียวที่มีปุ่มลอยอยู่กลาง (เห็นจริงตอนเรนเดอร์รอบแรก 31 ส.ค. 2569)
   พอเป็น navy จึงอ่านออกทันทีว่าเป็นครึ่งขวาของแถบ และได้จังหวะสองโทนที่คมขึ้น */
.mo-visit .mo-mapcard { flex: 1; border-radius: 0; background: var(--c-brand); }

/* ข้อความกับปุ่มบนพื้น navy ต้องกลับเป็นโทนสว่าง เหตุผลเดียวกับ .mo-section--night
   ใช้ token ไม่ใช่รหัสสีดิบ (กฎเหล็กข้อ 4) */
.mo-visit .mo-mapcard__ask p { color: var(--c-accent-light); }
.mo-visit .mo-mapcard__ask .mo-btn--ghost {
  color: var(--c-ink-invert);
  box-shadow: inset 0 0 0 1.5px var(--c-accent-light);
}
.mo-visit .mo-mapcard__ask .mo-btn--ghost:hover {
  background: var(--c-brand-dark);
  color: var(--c-ink-invert);
}

/* จอแคบบล็อก Columns จะยุบเป็นแถวเดียวที่ 781px
   ตอนนั้นแผนที่ไม่มีฝั่งซ้ายให้ยืดสูงตามแล้ว ต้องกำหนดความสูงของตัวเอง */
@media (max-width: 781px) {
  .mo-visit .mo-mapcard { min-height: 24rem; }
}

/* --- ช่องทางติดต่อในการ์ดซ้าย --- */
.mo-channels {
  list-style: none;
  margin: var(--sp-3) 0 0;
  padding: 0;
  border-top: 1px solid var(--c-line);
}
.mo-channels li {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: var(--sp-2);
  padding-block: .65em;
  border-bottom: 1px solid var(--c-line);
  font-size: var(--fs-small);
  line-height: var(--lh-body);
}
.mo-channels li > span { color: var(--c-ink-soft); flex: none; }
.mo-channels :where(a, b) {
  font-weight: var(--fw-strong);
  color: var(--c-ink);
  text-align: right;
  text-decoration: none;
}
.mo-channels a:hover { color: var(--c-accent-text); }

/* --- กล่องแผนที่ก่อนกด --- */
/* display:grid เพื่อให้ iframe ที่มาแทนทีหลังยืดเต็มกล่องเอง (ลูกกริดยืดเป็นค่าตั้งต้น)
   ส่วนกล่องคำถามก่อนกดสั่ง place-self ให้อยู่กลางแทน */
.mo-mapcard { display: grid; }
.mo-mapcard__ask {
  place-self: center;
  text-align: center;
  padding: var(--sp-3);
}
.mo-mapcard__ask p {
  margin: 0 0 var(--sp-2);
  font-size: var(--fs-small);
  color: var(--c-ink-soft);
}

/* --- ฟอร์มนัดหมาย (Fluent Forms) ในการ์ดซ้าย -------------------------------

   **ปรับสีที่ "ตัวแปร" ของปลั๊กอิน ไม่ใช่ไล่เขียนทับทีละกฎ**
   Fluent Forms ประกาศสีของตัวเองเป็น CSS custom property ไว้ให้แล้ว
   ตั้งค่าใหม่ที่นี่จุดเดียวจึงเปลี่ยนได้ทั้งฟอร์ม โดยไม่ต้องสู้เรื่องความแรงของ
   selector และไม่ต้องใช้ !important (กฎเหล็กข้อ 3) — และถ้าปลั๊กอินอัปเดต
   เพิ่มกฎใหม่ที่ใช้ตัวแปรเดิม กฎใหม่นั้นก็จะได้สีของเราไปเองโดยไม่ต้องมาแก้ตาม

   ไฟล์ CSS ของปลั๊กอินโหลด **ก่อน** components.css เสมอ (ตรวจจากลำดับใน HTML
   ของหน้าจริงแล้ว) ค่าที่ตั้งตรงนี้จึงชนะ

   **ตั้งใจไม่แตะ --fluentform-danger** ตัวนั้นคือสีแดงของข้อความแจ้งเตือน
   ตอนกรอกผิด ซึ่งเป็นสัญญาณเชิงหน้าที่ ไม่ใช่สีของดีไซน์ เปลี่ยนเป็นทองแดงแล้ว
   คนกรอกผิดจะไม่ทันสังเกตว่ามีอะไรผิด — อันตรายกว่าการมีสีนอกพาเลตต์เล็กน้อย */
.mo-formcard {
  --fluentform-primary: var(--c-accent);
  --fluentform-secondary: var(--c-ink-soft);
  --fluentform-border-color: var(--c-line);
  --fluentform-border-radius: var(--radius-sm);
}

.mo-formcard .ff-el-group { margin-bottom: var(--sp-2); }

/* **กล่องติ๊กต้องถอนกฎ width:100% ของ .mo-formcard ข้างบนออก**
   กฎนั้นเขียนไว้สำหรับช่องกรอกข้อความ พอมันไปโดนช่องติ๊กด้วย
   กล่องติ๊กจะกลายเป็นแถบกว้างเต็มการ์ดแล้วลอยไปอยู่กลาง แยกจากข้อความของมัน
   (เห็นจริงตอนใส่ฟอร์มครั้งแรก 31 ส.ค. 2569) */
.mo-formcard :where(input[type="checkbox"], input[type="radio"]) { width: auto; }

/* ข้อความยินยอมเป็นประโยคที่ต้องอ่านจริง ไม่ใช่ป้ายกำกับช่อง
   จึงต้องถอนขนาดจิ๋วกับระยะห่างตัวอักษรของ .mo-formcard label ออก */
.mo-formcard .ff-el-form-check-label {
  display: flex;
  align-items: flex-start;
  gap: .6em;
  margin: 0;
  font-size: var(--fs-small);
  letter-spacing: normal;
  line-height: var(--lh-body);
  color: var(--c-ink);
}
.mo-formcard .ff-el-form-check-input { margin-top: .45em; flex: none; }

/* ดอกจันบอกช่องบังคับ — ใช้ทองแดงเข้ม 5.0:1 บนพื้นครีม ผ่านเกณฑ์ AA
   (ค่าเดิมของปลั๊กอินเป็นแดง ซึ่งเป็นสีนอกพาเลตต์ และตรงนี้ไม่ใช่การแจ้งเตือน
   เป็นแค่เครื่องหมายบอกว่าต้องกรอก ตัวสัญลักษณ์ * สื่อความหมายอยู่แล้ว) */
.mo-formcard .ff-el-is-required.asterisk-right label::after,
.mo-formcard .ff-el-is-required.asterisk-left label::before { color: var(--c-accent-text); }

/* ข้อความหลังส่งสำเร็จ */
.mo-formcard .ff-message-success {
  background: var(--c-surface);
  border: 1px solid var(--c-accent);
  border-radius: var(--radius-sm);
  padding: var(--sp-2);
  font-size: var(--fs-small);
  line-height: var(--lh-body);
  color: var(--c-ink);
}
.mo-infostrip span { font-size: var(--fs-small); color: var(--c-ink-soft); }
.mo-infostrip .mo-icon { margin-inline: auto; width: 2.25rem; height: 2.25rem; }

/* --- Benefits list ---------------------------------------------------------- */
.mo-benefits { background: var(--c-canvas); border-radius: var(--radius-card); padding: var(--sp-4) var(--sp-3); }
.mo-benefits ul { list-style: none; padding: 0; margin: var(--sp-3) 0 0; }
.mo-benefits li { padding-left: 1.9em; position: relative; }
.mo-benefits li + li { margin-top: var(--sp-2); padding-top: var(--sp-2); border-top: 1px solid var(--c-line); }
.mo-benefits li::before {
  content: "✓";
  position: absolute; left: 0; top: .15em;
  color: var(--c-accent-text);
  font-weight: var(--fw-strong);
}
.mo-benefits b { display: block; }
.mo-benefits small { color: var(--c-ink-soft); font-size: var(--fs-small); line-height: var(--lh-body); }

/* --- Gallery mosaic --------------------------------------------------------- */
.mo-mosaic { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: var(--sp-2); }
.mo-mosaic img { width: 100%; height: 100%; object-fit: cover; border-radius: var(--radius-img); }
/* ประกาศเฉพาะจอกว้าง จอเล็กจะได้ไม่ต้องมาสั่งยกเลิกทับทีหลัง (เลี่ยง !important) */
@media (min-width: 601px) {
  .mo-mosaic > :nth-child(3n+1) { grid-row: span 2; }
}

/* --- Pull quote (ในหน้าแนะนำผู้ดูแล) ---------------------------------------- */
.mo-pullquote {
  background: var(--c-canvas);
  border-left: 3px solid var(--c-accent);
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
  padding: var(--sp-3);
  margin-top: var(--sp-3);
}
.mo-pullquote b { font-family: var(--font-display); font-weight: var(--fw-display); font-size: var(--fs-h3); display: block; margin-bottom: var(--sp-1); }
.mo-pullquote cite { color: var(--c-accent-text); font-style: normal; font-size: var(--fs-small); }

/* ==========================================================================
   Header / Footer / Single post
   ========================================================================== */

/* --- Header ---------------------------------------------------------------- */
.site-header { background: var(--c-surface); transition: background var(--dur) var(--ease), box-shadow var(--dur) var(--ease); }

/* หัวเว็บกินเต็มความกว้างจอ — ใช้ทั้งเว็บตั้งแต่ 23 ก.ย. 2569
   (เจ้าของสั่ง "ปรับ Header ของทุกหน้าให้เหมือนกับหน้าแรก")

   **ตัวที่คุมความกว้างไม่ใช่ .site-header** แถบนั้นเต็มจออยู่แล้ว
   ตัวที่คุมคือกล่องข้างใน .inside-header ซึ่งธีมแม่ตั้งเพดานไว้ 1200px
   ผ่านคลาส .grid-container ที่มันแปะมาให้ (ความแรง 0-1-0)
   ปลดด้วย max-width: none ที่ 0-2-0 ซึ่งแรงกว่าพอดี

   เดิมกฎชุดนี้ผูกไว้กับ .mo-v2 จึงมีผลเฉพาะหน้าแรก ถอด .mo-v2 ออกเมื่อ 23 ก.ย. 2569
   ทุกหน้าจึงได้หัวเว็บหน้าตาเดียวกัน — **เหลือกฎหัวเว็บชุดเดียวในไฟล์นี้**
   ถ้าจะย้อนกลับเป็นหัวเว็บมีกรอบ ต้องคืนสี่ค่าพร้อมกัน: ลบ max-width ทิ้ง ·
   padding ทั้งสองเป็น --sp-3 · โลโก้ clamp(8rem, 9vw, 10.5rem) · เมนูตาราง 1fr auto 1fr

   **ยกเลิกเจตนาเดิมที่ให้โลโก้ตรงแนวกับเนื้อหาข้างล่าง** ตอนหัวเว็บมีกรอบ
   จงใจตั้งระยะขอบให้เท่า .mo-wrap เพื่อให้โลโก้อยู่แนวตั้งเดียวกับ chip
   พอเป็นเต็มจอ โลโก้ไปอยู่ที่ ~86px ส่วนเนื้อหาเริ่มที่ ~112px = เหลื่อมกัน ~26px
   ซึ่งมากพอจนอ่านเป็นความตั้งใจ ไม่ใช่ความผิดพลาด — เป็นนิยามของหัวเว็บเต็มจอ

   ระยะขอบไล่ตามความกว้างจอ ไม่ใช่ค่าคงที่ จอใหญ่จะได้ไม่ชิดขอบเกินไป
   ระยะบนล่างต้องโตตามโลโก้ด้วย ไม่งั้นโลโก้ที่ใหญ่ขึ้นจะอัดชิดขอบบน */
.site-header .inside-header {
  max-width: none;
  padding-block: clamp(var(--sp-3), 2.4vw, var(--sp-4));
  padding-inline: clamp(var(--sp-4), 6vw, var(--sp-6));
}

/* ตอนเลื่อนลงแล้วหัวเว็บมาติดบนจอ ให้เตี้ยลงหนึ่งขั้น
   หัวเว็บแบบติดหน้าจอกินพื้นที่อ่านตลอดเวลา ยิ่งสูงยิ่งเหลือที่อ่านน้อย */
.mo-stuck .site-header .inside-header { padding-block: var(--sp-2); }

/* --- โลโก้ ------------------------------------------------------------------
   ธีมแม่พ่นรูปโลโก้ออกมาที่ขนาดไฟล์จริง (2560px) โดยไม่คุมความกว้างให้เลย
   ใส่โลโก้ปุ๊บโลโก้กินเต็มหน้าจอทันที (เจอจริง 25 ส.ค. 2569)
   ค่า Logo Width ใน Customizer เป็นของ GP Premium ตัวฟรีไม่มีผล ต้องคุมเอง
---------------------------------------------------------------------------- */
.site-header .site-logo img {
  display: block;
  /* โลโก้เป็นแนวนอน 5.25:1 ความสูงจึงโตตามเองโดยไม่ต้องตั้ง
     **ค่านี้ผูกกับระยะบนของฮีโร่ทั้งสามตัว** (.mo-hero / .mo-pagehero / .mo-v2-hero)
     ขยายโลโก้เมื่อไหร่หัวเว็บสูงขึ้น แล้วไปเบียดฮีโร่ทันที — ต้องวัดระยะบนใหม่ทุกครั้ง */
  width: clamp(11rem, 15vw, 18rem);
  height: auto;
}

.site-branding-container {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
}

/* --- หัวเว็บแสดงเฉพาะโลโก้ ไม่แสดงชื่อไทย (เจ้าของสั่ง 27 ส.ค. 2569) ------------
   เดิมซ่อนชื่อไว้เฉพาะจอแคบกว่า 768px เพราะวางคู่กันไม่พอความกว้าง
   ตอนนี้ยกกฎเดิมออกมาให้ใช้ทุกความกว้าง เหตุผลและกลไกเหมือนเดิมทุกอย่าง

   **ตรวจแล้วก่อนเอาออก — ชื่อตามใบอนุญาตยังอยู่ที่ท้ายเว็บ**
   (`© 2026 มูฟออนคลินิกกายภาพบำบัด`) ซึ่งเป็นจุดที่กฎหมายสถานพยาบาลต้องการจริง ๆ
   CLAUDE.md ระบุไว้ว่าหัวเว็บใช้ชื่อแบรนด์ได้ ถ้าท้ายเว็บ หน้าติดต่อ และ schema
   ยังเป็นชื่อเต็มตามใบอนุญาต → **ห้ามเอาชื่อออกจากท้ายเว็บตามไปด้วยเด็ดขาด**
   ถ้าเอาออกทั้งสองที่ ชื่อตามใบอนุญาตจะหายไปจากเว็บทั้งเว็บ

   ชื่อยังอยู่ในข้อความกำกับรูปโลโก้ (alt) โปรแกรมอ่านหน้าจอจึงยังอ่านชื่อได้อยู่
   ที่หายไปคือชื่อที่ตาคนเห็นเท่านั้น

   :has() ทำให้กฎนี้ทำงานเฉพาะตอนที่มีโลโก้จริง — ถ้าวันหลังถอดโลโก้ออก
   ชื่อจะกลับมาแสดงเองโดยไม่ต้องมาแก้ตรงนี้ ไม่เหลือหัวเว็บว่างเปล่า

   **ห้ามแก้ด้วย min-width: 0 ที่กล่องชื่อ** ลองแล้ว 25 ส.ค. 2569 — กล่องหดได้จริง
   แต่ชื่อไปตัดกลางคำเป็นสี่บรรทัด ("กายภาพบำบั" ขึ้นบรรทัดใหม่ว่า "ด")
   ผิดกฎภาษาไทยใน Design.md ข้อ 4 เต็ม ๆ

   **ถ้าเอาชื่อกลับมา ต้องเอากฎสีกลับมาด้วย** ของเดิมอยู่ในประวัติ git ก่อนวันนี้
   กับดักตรงนั้นคือลำดับของกฎ — หน้าแรกมีทั้ง mo-has-hero และ mo-has-hero--light
   ความแรงเท่ากัน ตัวที่อยู่ล่างกว่าชนะ สลับที่เมื่อไหร่ชื่อจะขาวบนพื้นสว่าง = หายไปเลย
---------------------------------------------------------------------------- */
.site-branding-container:has(.site-logo) .main-title { display: none; }

/* --- เมนูชิดขวาสุดของหัวเว็บ -------------------------------------------------
   **กลับคำตัดสินใจเมื่อ 27 ส.ค. 2569 ที่ให้เมนูอยู่กลางหัวเว็บ**
   ทดลองใน .mo-v2 เมื่อ 2 ก.ย. 2569 แล้วยกมาใช้ทั้งเว็บเมื่อ 23 ก.ย. 2569
   (เจ้าของสั่ง "ปรับ Header ของทุกหน้าให้เหมือนกับหน้าแรก")

   ธีมแม่ตั้งหัวเว็บเป็นแถว flex แล้วดันเมนูไปขวาสุดด้วย margin-left: auto
   ซึ่งได้ตำแหน่งที่ต้องการอยู่แล้ว **แต่ยังใช้ตารางต่อ ไม่กลับไปใช้ flex**
   เพราะ flex ของธีมแม่วัดจาก "ที่ว่างที่เหลือหลังหักโลโก้" ขอบขวาของเมนู
   จึงขยับตามความกว้างโลโก้ ส่วนตารางยึดกับขอบในของหัวเว็บตรง ๆ ไม่ขึ้นกับโลโก้
   วัดแล้วขอบขวาเมนูตรงกับขอบในของหัวเว็บพอดีทุกความกว้าง

   เหลือ 2 ช่อง `auto 1fr` โลโก้อยู่ช่องซ้าย เมนูกินช่องขวาแล้วชิดขอบด้วย justify-self
   (ของเดิมเป็น 3 ช่อง `1fr auto 1fr` เพื่อให้เมนูอยู่กลางหัวเว็บจริง ๆ
   พอจะให้ชิดขวาก็ไม่ต้องใช้ช่องที่สามแล้ว)

   **769px ต้องตรงกับจุดที่ธีมแม่สลับเป็นเมนูมือถือ (max-width: 768px)**
   ต่ำกว่านั้นปุ่มเมนูมือถือจะโผล่มาเป็นลูกอีกตัว ตารางจะเพี้ยนทันที
   ถ้าวันหลังเปลี่ยนจุดสลับเมนูใน Customizer ต้องมาแก้เลขนี้ตาม
---------------------------------------------------------------------------- */
@media (min-width: 769px) {
  .site-header .inside-header {
    display: grid;
    grid-template-columns: auto 1fr;
  }
  .site-header #site-navigation {
    grid-column: 2;
    justify-self: end;
    margin-left: 0;   /* ล้าง margin-left: auto ของธีมแม่ที่ดันเมนูไปขวา */
  }
}

/* โลโก้เป็นสีทองอ่อนอมชมพู #BFA095 วัดแล้วได้ 6.75:1 บนพื้น navy (ชัดดี)
   แต่เหลือ 2.32:1 บนพื้นสว่าง จางจนแทบมองไม่เห็น — เป็นสีสำหรับพื้นเข้มโดยธรรมชาติ
   (ตำแหน่งเดียวกับ --c-accent-light ในพาเลตต์ ซึ่ง Design.md ระบุว่าใช้บนพื้น navy เท่านั้น)

   ระหว่างรอไฟล์เวอร์ชันสีเข้มจากคนออกแบบ หรี่ความสว่างลงชั่วคราวเมื่ออยู่บนพื้นสว่าง
   **วิธีนี้ใช้ได้เพราะโลโก้เป็นสีเดียวล้วน** ถ้าวันหลังเปลี่ยนเป็นโลโก้หลายสีจะเพี้ยนทันที
   ให้ลบบล็อกนี้แล้วสลับไฟล์แทน */
.mo-has-hero--light .site-logo img,
.mo-stuck .site-logo img,
body:not(.mo-has-hero) .site-logo img {
  filter: brightness(0.62) saturate(1.15);
}

/* โปร่งใสทับ hero — class มาจาก body_class() ใน functions.php */
.mo-has-hero .site-header {
  position: absolute;
  inset: 0 0 auto;
  z-index: 10;
  background: transparent;
}
/* ตัวเลือกยาวผิดปกติในสามบล็อกข้างล่าง — จำเป็น ไม่ใช่เผลอ
   GeneratePress พ่นสีเมนูจาก Customizer เป็น CSS ฝังในหน้า ด้วยตัวเลือก
   `.main-navigation .main-nav ul li a` และพ่นพื้นหลังเมนูด้วย `.main-navigation`
   ของเดิมตรงนี้เขียนสั้นกว่าและใช้ :where() ซึ่งมีความแรงเป็นศูนย์ จึงแพ้ทุกครั้ง
   **หัวเว็บโปร่งใสทับ hero จึงไม่เคยทำงานจริงมาตั้งแต่ต้น**

   ไม่มีใครเห็นเพราะหน้าแรกใช้ hero พื้นสว่าง ตัวหนังสือเข้มบนพื้นสว่างเลยดูถูกอยู่แล้ว
   เพิ่งโผล่ตอนมีหน้า hero พื้นมืดหน้าแรกของเว็บ (25 ส.ค. 2569) — ชื่อเว็บกลายเป็น
   navy บนพื้น navy มองไม่เห็น และเมนูมีพื้นขาวเป็นกล่องลอยอยู่บนภาพมืด

   เขียนยาวเท่าที่จำเป็นให้ชนะ ห้ามแก้ด้วย !important (กฎข้อ 3)
   ธีมแม่ใช้ `.main-title` ไม่ใช่ `.site-title` — ของเดิมสะกดผิดตัวด้วย

   **ตัวเลือก .main-title ในบล็อกพวกนี้ยังไม่ตาย ห้ามลบทิ้งเพราะเห็นว่าชื่อถูกซ่อนอยู่**
   กฎที่ซ่อนชื่อผูกกับ :has(.site-logo) ถ้าวันไหนถอดโลโก้ออก ชื่อจะกลับมาแสดงเอง
   ลบสีทิ้งไปตอนนี้ = วันนั้นจะได้ชื่อ navy บนพื้น navy มองไม่เห็น
   ซึ่งเป็นบั๊กเดิมเป๊ะ ๆ ที่บล็อกนี้เกิดมาเพื่อแก้ */
.mo-has-hero .site-header .main-navigation { background: transparent; }
.mo-has-hero .site-header .main-navigation .main-nav > ul > li > a,
.mo-has-hero .site-header .site-branding .main-title a { color: var(--c-ink-invert); }

/* hero พื้นสว่าง — เมนูต้องกลับเป็นตัวหนังสือเข้ม ไม่งั้นขาวบนขาว มองไม่เห็นทั้งแถบ */
.mo-has-hero--light .site-header .main-navigation .main-nav > ul > li > a,
.mo-has-hero--light .site-header .site-branding .main-title a { color: var(--c-ink); }
.mo-has-hero--light .main-navigation .mo-nav-cta > a { background: var(--c-brand); color: var(--c-ink-invert); }

/* ตอนเลื่อนลง — ติดบนสุดและทึบ ใช้ทั้งกรณีมีและไม่มี hero */
.mo-stuck .site-header {
  position: fixed;
  inset: 0 0 auto;
  z-index: 20;
  background: var(--c-surface);
  box-shadow: 0 1px 0 var(--c-line);
}
/* **หน้าที่ไม่มีฮีโร่เข้าพวกกับสถานะ "เลื่อนลงแล้ว" ตั้งแต่ 23 ก.ย. 2569**
   ทั้งสองสถานะคือหัวเว็บพื้นครีมทึบเหมือนกัน หน้าตาจึงต้องเหมือนกันด้วย

   ของเดิมเขียนไว้เฉพาะ .mo-stuck **หน้าที่ไม่มีฮีโร่จึงไม่เคยมีกฎสีของตัวเองเลย**
   แล้วตกไปใช้ค่าจาก Customizer ของธีมแม่ ซึ่งพ่น CSS ฝังในหน้ามาทับ
   ผลที่เห็นบนหน้า /blog/ และ **บทความทุกบทความจาก pipeline**:
   · เมนูมีพื้นขาวเป็นกล่องลอยอยู่บนหัวเว็บพื้นครีม (ธีมแม่ตั้งพื้นเมนูเป็นขาว)
   · ตัวหนังสือเมนูเป็นเทาดำ #222 ของธีมแม่ ไม่ใช่ navy ของพาเลตต์
   บั๊กนี้มีมาก่อนแล้ว แต่มองข้ามได้ตอนเมนูยังอยู่กลางจอและตัวเล็ก
   พอหัวเว็บเป็นแบบเดียวกับหน้าแรก กล่องขาวเลยกว้างขึ้นจนเห็นชัด

   ตัวเลือกต้องยาวถึง .site-header ถึงจะชนะ Customizer (0-4-4 ชนะ 0-2-3)
   เหตุผลเดียวกับที่บล็อกหัวเว็บโปร่งใสเขียนกำกับไว้ **เขียนสั้นแล้วแพ้เงียบ** */
.mo-stuck .site-header .main-navigation,
body:not(.mo-has-hero) .site-header .main-navigation { background: transparent; }
.mo-stuck .site-header .main-navigation .main-nav > ul > li > a,
.mo-stuck .site-header .site-branding .main-title a,
body:not(.mo-has-hero) .site-header .main-navigation .main-nav > ul > li > a,
body:not(.mo-has-hero) .site-header .site-branding .main-title a { color: var(--c-ink); }

@media (prefers-reduced-motion: no-preference) {
  .mo-stuck .site-header { animation: mo-drop var(--dur) var(--ease); }
}
@keyframes mo-drop { from { transform: translateY(-100%); } }

/* เมนูทรงแคปซูล */
.main-navigation .main-nav > ul { gap: .25rem; }
.main-navigation .main-nav > ul > li > a {
  border-radius: var(--radius-pill);
  padding-inline: 1.1em;
  letter-spacing: .02em;
}

/* ขนาดตัวอักษรเมนู — ทดลองใน .mo-v2 เมื่อ 2 ก.ย. 2569 แล้วยกมาใช้ทั้งเว็บ 23 ก.ย. 2569
   (20px บนเดสก์ท็อป · 17.7px ที่จอ 375 · เดิมเป็น --fs-small = 15px ทุกความกว้าง)

   **เขียนแยกออกมาจากบล็อกแคปซูลข้างบน เพราะบล็อกนั้นแรงไม่พอ**
   ค่า 15px เดิมมาจาก Customizer ของธีมแม่ ซึ่งพ่นเป็น CSS ฝังในหน้าด้วยตัวเลือก
   `.main-navigation .main-nav ul li a` (0-2-3) เท่ากับบล็อกแคปซูลพอดี
   เสมอกันแล้วใครอยู่ทีหลังชนะ ซึ่งคือ Customizer เพราะฝังในหน้า
   ต้องยาวถึง `.site-header` (0-3-3) ถึงจะชนะแน่ **เขียนสั้นแล้วแพ้เงียบ**
   (บทเรียนเดิมจากตอนทำหัวเว็บโปร่งใสที่แพ้มาแล้วรอบหนึ่ง) */
.site-header .main-navigation .main-nav > ul > li > a { font-size: var(--fs-lead); }

/* เมนูหดตามความกว้างจอ ให้ 7 รายการอยู่บรรทัดเดียวตั้งแต่ 1000px (ค่าอธิบายใน tokens.css)
   เฉพาะ ≥769px — ต่ำกว่านั้นเป็นเมนูมือถือ ยังใช้ขนาดเดิม
   · ปุ่ม CTA ไม่หดระยะใน ปุ่มต้องยังดูเป็นปุ่ม (ตัวอักษรหดตามเมนูได้)
   · เมนูที่มีเมนูย่อยไม่มีระยะขวาอยู่แล้ว (ธีมแม่ใช้ที่ตรงนั้นวางลูกศร)
     ใส่ padding-inline ทั้งคู่จะไปเติมระยะขวาให้ลูกศรด้วย กว้างเกินมา 44px (ลองแล้ว) */
@media (min-width: 769px) {
  .site-header .main-navigation .main-nav > ul > li > a { font-size: var(--fs-nav); }
  .main-navigation .main-nav > ul > li:not(.mo-nav-cta) > a { padding-left: var(--nav-pad); }
  .main-navigation .main-nav > ul > li:not(.mo-nav-cta):not(.menu-item-has-children) > a { padding-right: var(--nav-pad); }
}
/* **ยกเว้นปุ่ม CTA ออกจากสถานะ hover และ "หน้าปัจจุบัน" (1 ก.ย. 2569)**

   ปุ่ม CTA เป็นปุ่ม ไม่ใช่ลิงก์เมนู จึงไม่ควรรับการไฮไลต์แบบ "คุณอยู่หน้านี้"
   และของเดิมมีบั๊กสองตัวที่มองไม่เห็นจนกว่าจะมีปุ่มจริง

   · ตอนอยู่บนหน้าติดต่อ WordPress ใส่คลาส current-menu-item ให้ปุ่มเอง
     กฎนี้ (0-3-2) แรงกว่ากฎพื้นทองของปุ่ม (0-3-1) พื้นปุ่มจึงเหลือทองจาง 16%
     กลายเป็นกลืนกับหัวเว็บพื้น navy — **ปุ่มหายไปบนหน้าที่มันลิงก์ไปเอง**
   · ตอนเอาเมาส์ชี้ก็เป็นแบบเดียวกัน กฎ hover (0-3-3) แรงกว่ากฎ hover ของปุ่ม (0-3-1)

   ยกเว้นด้วย :not() แทนการไล่เพิ่มความแรงให้กฎปุ่ม เพราะได้ทั้งสองสถานะในครั้งเดียว
   และอ่านออกว่า "ปุ่มไม่เข้าพวกกับลิงก์เมนู" ซึ่งตรงกับความตั้งใจจริง */
.main-navigation .main-nav > ul > li:not(.mo-nav-cta):hover > a,
.main-navigation .main-nav > ul > li[class*="current"]:not(.mo-nav-cta) > a {
  background: rgba(163,127,83,.16);
}

/* บนหัวเว็บพื้นสว่าง แคปซูลทองแดงจาง ๆ กลายเป็นก้อนเบจลอย ๆ
   ที่สว่างและใหญ่กว่าทุกอย่างในหัวเว็บ ตาจึงวิ่งไปหามันก่อนโลโก้
   บนพื้น navy ไม่มีปัญหานี้เพราะแคปซูลอ่านออกว่าเป็นสถานะ

   พื้นสว่างเปลี่ยนเป็นบอกด้วย "สีตัวหนังสือ" แทน — ทองแดงเข้ม (5.2:1 ผ่าน AA)
   อ่านออกว่าเป็นหน้าที่อยู่ตอนนี้เหมือนกัน แต่ไม่แย่งสายตาจากโลโก้ */
.mo-has-hero--light .main-navigation .main-nav > ul > li[class*="current"]:not(.mo-nav-cta) > a,
.mo-stuck .main-navigation .main-nav > ul > li[class*="current"]:not(.mo-nav-cta) > a,
body:not(.mo-has-hero) .main-navigation .main-nav > ul > li[class*="current"]:not(.mo-nav-cta) > a {
  background: transparent;
  color: var(--c-accent-text);
}
.mo-stuck .main-navigation .main-nav > ul > li[class*="current"]:not(.mo-nav-cta) > a { background: var(--c-canvas); }

/* ปุ่ม CTA ในเมนู — ใส่คลาส mo-nav-cta ที่รายการเมนูใน Appearance > Menus
   (ถ้าไม่เห็นช่อง CSS Classes ให้เปิดจาก Screen Options มุมขวาบน) */
.main-navigation .mo-nav-cta > a {
  background: var(--c-brand);
  color: var(--c-ink-invert);
  padding-inline: 1.5em;
}
/* **ต้องเขียนยาวเท่ากับกฎสีลิงก์เมนูของหัวเว็บโปร่งใส ไม่งั้นแพ้ (1 ก.ย. 2569)**

   `.mo-has-hero .site-header .main-navigation .main-nav ul li a` สั่งลิงก์เมนู
   ทุกตัวเป็นสีครีมเพื่อให้อ่านออกบนภาพ hero มืด กฎนั้นแรง 0-4-3
   ส่วนกฎปุ่มแบบสั้น (`.mo-has-hero .main-navigation .mo-nav-cta > a`) แรงแค่ 0-3-1
   จึงได้พื้นทองมาแต่ตัวหนังสือยังเป็นครีม = **ครีมบนทอง 2.9:1 ไม่ผ่านเกณฑ์ AA**
   (วัดจากหน้าจริงตอนทำหน้าติดต่อ 1 ก.ย. 2569 — เห็นก็ต่อเมื่อมีปุ่มจริงในเมนู)

   กฎนี้ 0-5-3 จึงชนะทั้งพื้นและสีตัวหนังสือ
   ครอบทั้ง hero มืดและ hero สว่าง เพราะทั้งสองแบบมีคลาส .mo-has-hero เหมือนกัน

   **ใช้ --c-brand-dark ไม่ใช่ --c-brand** วัดแล้ว navy ปกติบนทองได้ 4.45:1
   ซึ่งต่ำกว่าเกณฑ์ AA (4.5) อยู่นิดเดียว ตัวหนังสือปุ่มขนาด 15px นับเป็นข้อความปกติ
   จึงต้องผ่าน 4.5 — navy เข้มให้ 5.1:1 ผ่านสบาย และเป็น token ที่มีอยู่แล้ว
   ไม่ได้เพิ่มสีใหม่เข้าพาเลตต์ */
/* **เติม body:not(.mo-has-hero) เมื่อ 23 ก.ย. 2569 — บั๊กเดียวกันเป๊ะ อีกหน้าหนึ่ง**
   หน้าที่ไม่มีฮีโร่ (/blog/ และบทความทุกบทความจาก pipeline) ไม่เข้าเงื่อนไข .mo-has-hero
   จึงตกไปใช้กฎปุ่มแบบสั้น `.main-navigation .mo-nav-cta > a` ซึ่งแรงแค่ 0-2-1
   แล้วแพ้ Customizer ของธีมแม่ (0-2-3) ที่สั่งตัวหนังสือเมนูเป็น #222

   ผลคือ **ปุ่ม "นัดหมาย" เป็นเทาดำบนพื้น navy = 1.3:1 มองไม่เห็นทั้งปุ่ม**
   ซึ่งเป็นปุ่มที่สำคัญที่สุดในหัวเว็บ วัดจากหน้า /blog/ จริงเมื่อ 23 ก.ย. 2569
   (บั๊กฝาแฝดของที่เขียนกำกับไว้ข้างบน ต่างกันแค่ว่ารอบนั้นเป็นครีมบนทอง 2.9:1
   **บทเรียนซ้ำรอบสาม: เขียนกฎล้างค่าเมื่อไหร่ ต้องไล่ให้ครบทุกสถานะของ body**
   ของเดิมไล่แค่ "มีฮีโร่" กับ "เลื่อนลงแล้ว" ลืม "ไม่มีฮีโร่" ซึ่งเป็นสถานะที่
   บทความทุกบทความในเว็บใช้อยู่ — จุดที่พังเยอะที่สุดแต่ไม่มีใครเปิดดูตอนทำดีไซน์)

   ให้พื้นทองเหมือนกันทั้งสามสถานะ เพราะหน้าแรกตอนเลื่อนลง (หัวเว็บพื้นครีมทึบ)
   ก็ได้ปุ่มทองอยู่แล้ว หน้าที่ไม่มีฮีโร่ซึ่งพื้นครีมเหมือนกันจึงต้องได้ปุ่มทองด้วย
   navy เข้มบนทองวัดได้ 5.1:1 ผ่าน AA */
.mo-has-hero .site-header .main-navigation .main-nav ul li.mo-nav-cta > a,
body:not(.mo-has-hero) .site-header .main-navigation .main-nav ul li.mo-nav-cta > a {
  background: var(--c-accent);
  color: var(--c-brand-dark);
}
/* **hover ต้องไล่ทั้งสองสถานะให้ตรงกับกฎพื้นข้างบน ไม่ใช่เขียนรวบเป็นบรรทัดเดียว**
   สองบรรทัดข้างบนความแรงไม่เท่ากัน (0-5-3 กับ 0-5-4 เพราะตัวหลังมี body: not() เพิ่ม)
   ถ้าเขียน hover สั้นกว่านั้นจะแพ้ **เฉพาะหน้าที่ไม่มีฮีโร่** ซึ่งเป็นแบบที่หาเจอยากที่สุด
   เพราะบนหน้าที่มีฮีโร่จะดูเหมือนทำงานปกติทุกอย่าง

   ของเดิมเขียนว่า `.main-navigation .mo-nav-cta > a:hover` (0-2-2)
   ซึ่งแพ้กฎพื้น 0-5-3 อยู่แล้ว **ปุ่มนัดหมายจึงไม่เคยเปลี่ยนสีตอนเอาเมาส์ชี้เลย
   บนหน้าที่มีฮีโร่** เป็นบั๊กเดิมที่เพิ่งมาเจอตอนไล่ความแรงรอบนี้ */
.mo-has-hero .site-header .main-navigation .main-nav ul li.mo-nav-cta > a:hover,
body:not(.mo-has-hero) .site-header .main-navigation .main-nav ul li.mo-nav-cta > a:hover {
  background: var(--c-brand-dark);
  color: var(--c-ink-invert);
}

/* --- เมนูย่อย (กล่องที่หล่นลงมาตอนชี้ "บริการของเรา") -----------------------
   **ทั้งบล็อกนี้เขียนใหม่ 23 ก.ย. 2569 — ก่อนหน้านี้ธีมนี้ไม่มีกฎของเมนูย่อยเลย
   สักบรรทัดเดียว** หน้าตาที่เห็นทั้งหมดจึงเป็นค่าตั้งต้นของ GeneratePress ล้วน

   สามอย่างที่พัง และข้อแรกทำให้เมนูย่อย **อ่านไม่ออกทั้งกล่อง**

   1. **ตัวหนังสือครีมบนพื้นเทาอ่อน = 1.05:1 มองไม่เห็นเลย**
      กฎสีของหัวเว็บโปร่งใสเขียนว่า `.main-nav ul li a` ซึ่งกิน**ทุกชั้น**
      ไม่ใช่แค่เมนูชั้นบน ลิงก์ในกล่องเมนูย่อยจึงถูกสั่งให้เป็นครีมตามไปด้วย
      ทั้งที่มันไม่ได้อยู่บนภาพฮีโร่ มันอยู่บนกล่องพื้นเทาอ่อน #f0f0f0 ของธีมแม่
      → แก้ที่ต้นเหตุ: เปลี่ยนกฎสีทั้งสี่ชุดเป็น `> ul > li > a` ให้คุมแค่ชั้นบน
        **ไม่ได้แก้ด้วยการเขียนกฎใหม่มาทับ** เพราะจะเหลือกฎสองชุดแย่งกันสั่งสีเดียวกัน
      → **เห็นเฉพาะหน้าที่ฮีโร่พื้นมืด** (about · contact · our-team · pricing ·
        privacy · หน้าบริการ 6 หน้า) หน้าแรกกับ /blog/ ตัวหนังสือเป็น navy อยู่แล้ว
        เลยอ่านออกมาตลอด **จึงไม่มีใครเห็นบั๊กนี้จนกว่าจะเปิดหน้าอื่น**

   2. **พื้นกล่องเป็นเทา #f0f0f0 ซึ่งไม่มีอยู่ในพาเลตต์ของเว็บนี้เลย**
      เป็นสีตั้งต้นของธีมแม่ล้วน ๆ → เปลี่ยนเป็น --c-canvas ซึ่งเป็นโทนครีม
      ที่เว็บใช้เป็น "พื้นที่ยกระดับ" อยู่แล้ว + เงาและขอบให้อ่านออกว่าเป็นกล่องลอย
      ทั้งบนภาพฮีโร่มืดและบนหัวเว็บพื้นครีม

   3. **กล่องกว้าง 200px ตายตัว ชื่อบริการภาษาไทยจึงตกบรรทัดเป็น 2-3 บรรทัดทุกอัน**
      ("เทคนิคขยับข้อต่อและดัดปรับโครงสร้าง" ตกเป็น 3 บรรทัด)
      → ปล่อยให้กล่องกว้างตามเนื้อหา แล้วคุมเพดานไว้ไม่ให้ยาวเกินที่ตากวาดสบาย

   **ตัวอักษรเมนูย่อยเล็กกว่าเมนูชั้นบน (15px เทียบกับ 20px) — ตั้งใจ**
   เมนูย่อยเป็นทางเลือกรอง ไม่ใช่ทางหลัก ถ้าใช้ 20px เท่ากัน กล่องต้องกว้างเกิน 400px
   ถึงจะใส่ชื่อบริการได้บรรทัดเดียว ซึ่งกลายเป็นแผ่นใหญ่ห้อยลงมาบังหน้าเว็บ
   **นี่เป็นจุดเดียวที่ตั้งใจให้ไม่เหมือนหน้าแรกเป๊ะ** เพราะของหน้าแรกเองก็ตกบรรทัด
   เป็น 3 บรรทัดเหมือนกัน คือไม่ได้ถูกอยู่แต่แรก จึงแก้ให้เหมือนกันทุกหน้าในแบบที่ถูก

   ตัวเลือกต้องยาวถึง .site-header ถึงจะชนะธีมแม่ (0-3-4 ชนะ 0-2-4)
   **เขียนสั้นแล้วแพ้เงียบ** เหมือนทุกบล็อกในหมวดนี้
---------------------------------------------------------------------------- */
.site-header .main-navigation .main-nav ul ul {
  /* **max-content ไม่ใช่ auto** — auto คือ "หดให้พอดีเนื้อหา" ซึ่งเบราว์เซอร์
     ตัดคำไทยได้เองตามพจนานุกรม มันเลยหดจนเหลือเท่า min-width แล้วชื่อบริการ
     ยังตกบรรทัดอยู่เหมือนเดิม (ลองมาแล้ว 23 ก.ย. 2569)
     max-content แปลว่า "กว้างเท่ารายการที่ยาวที่สุดแบบไม่ตัดบรรทัดเลย"
     กล่องจึงโตตามชื่อบริการจริง ไม่ต้องมานั่งตั้งเลขความกว้างเอง
     **เพิ่มบริการที่ชื่อยาวกว่านี้เมื่อไหร่ กล่องขยายตามเอง ไม่ต้องมาแก้ตรงนี้**
     เพดาน 26rem กันไว้เผื่อวันหลังมีชื่อยาวผิดปกติ ถึงตอนนั้นให้ตกบรรทัดดีกว่า
     ปล่อยให้กล่องยาวจนล้นขอบจอ (เมนูชิดขวา กล่องจึงงอกไปทางขวาได้ไม่มาก) */
  width: max-content;
  min-width: 14rem;
  max-width: 26rem;
  background: var(--c-canvas);
  border: 1px solid var(--c-line);
  border-radius: var(--radius-sm);
  box-shadow: var(--shadow-card);
  /* เว้นขอบบนล่างให้ลิงก์ไม่ไปชนมุมมนของกล่อง
     **ใช้วิธีนี้แทน overflow: hidden** เพราะธีมแม่ใช้ overflow คุมการซ่อน/แสดง
     กล่องอยู่ (ตอนปิดเป็น hidden ตอนเปิดเป็น visible) ไปทับมันแล้วกล่องจะไม่ยอมเปิด */
  padding-block: var(--sp-1);
}

.site-header .main-navigation .main-nav ul ul li a {
  font-size: var(--fs-small);
  color: var(--c-ink);
  padding: var(--sp-1) var(--sp-2);
  /* ล้างมุมแคปซูลของเมนูชั้นบน ในกล่องเมนูย่อยลิงก์เป็นแถวเต็มความกว้าง ไม่ใช่เม็ดยา */
  border-radius: 0;
}

/* ชี้อยู่รายการไหน และรายการที่เป็นหน้าปัจจุบัน ใช้สัญญาณเดียวกับเมนูชั้นบน
   คือบอกด้วยสีตัวหนังสือทองแดงเข้ม (5.9:1 บนพื้น paper ผ่าน AA)
   ไม่ใช้แคปซูลทองจาง เพราะในกล่องแคบ ๆ มันกลายเป็นก้อนสีที่แย่งสายตา */
.site-header .main-navigation .main-nav ul ul li a:hover,
.site-header .main-navigation .main-nav ul ul li[class*="current"] > a {
  background: var(--c-surface);
  color: var(--c-accent-text);
}

/* เมนูมือถือของ GP ตัวฟรี */
.main-navigation .menu-toggle { color: inherit; }

/* ธีมแม่ใส่พื้นเทาจาง ๆ ให้ปุ่มเมนูมือถือ ซึ่งเป็นสีที่ไม่ได้อยู่ในพาเลตต์
   บนหัวเว็บพื้นครีมจึงเห็นเป็นกล่องเทาลอยอยู่ ไม่เข้ากับที่เหลือทั้งหน้า */
.site-header .main-navigation .menu-toggle { background: transparent; }

/* **ถอดสองกฎออกจากบล็อกนี้เมื่อ 23 ก.ย. 2569 — ตั้งใจ ไม่ได้ลืม**
   เดิมมี `.site-header .site-logo img { width: 8rem }` กับ
   `.site-header .inside-header { padding-block: var(--sp-2) }` อยู่ด้วย

   สองกฎนั้น **ตายไปแล้วตั้งแต่หน้าแรกเปลี่ยนเป็นสกิน v2** เพราะกฎของ v2 เขียนยาวกว่า
   (0-3-1 ชนะ 0-2-1) หน้าแรกบนมือถือจึงใช้โลโก้ 176px กับระยะบนล่าง 24px มาตลอด
   ส่วนหน้าอื่นยังได้ 128px กับ 16px — **หัวเว็บมือถือจึงไม่เหมือนกันมาตั้งแต่ต้น**
   ตอนถอด .mo-v2 ออกจากกฎหลัก ความแรงเลยเท่ากัน (0-2-1) แล้วสองกฎนี้จะกลับมาชนะ
   ซึ่งจะทำให้ทุกหน้า "เหมือนกัน" จริง แต่เหมือนกันในแบบที่ไม่ใช่หน้าแรก
   จึงเอาออก ให้ทุกหน้าไหลตาม clamp ชุดเดียวกับเดสก์ท็อป

   ค่า clamp ทั้งสองมีขาต่ำรองรับจอแคบอยู่แล้ว (โลโก้ 11rem · ระยะบนล่าง --sp-3)
   วัดที่จอ 375 แล้วโลโก้ 176px + ปุ่มเมนูยังอยู่ในกรอบ 360px ไม่ล้น */
@media (max-width: 768px) {
  .has-inline-mobile-toggle .inside-header { align-items: center; }

  /* **28 ก.ย. 2569 รอบสี่ — หัวเว็บมือถือสูง 108px ทั้งที่โลโก้สูงแค่ 33px** (เจ้าของทักว่า
     ใต้เมนูโล่งหลายหน้า) ตัวที่ดันความสูงคือปุ่มเมนูสามขีด ธีมแม่ตั้ง line-height 60px
     ให้ทุกลิงก์เมนูรวมถึงปุ่มนี้ บวกระยะบนล่างอีกข้างละ 24px = 108px
     → ปุ่มเหลือสูง 48px (ยังกดง่าย เกินขั้นต่ำ 44px ของปุ่มบนจอสัมผัส) และระยะบนล่าง
     ลดเป็น --sp-2 เท่ากับตอนหัวเว็บติดบนจอ หัวเว็บจึงเหลือ 80px ทุกหน้า */
  .site-header .inside-header { padding-block: var(--sp-2); }
  .site-header .main-navigation .menu-toggle { line-height: calc(var(--sp-4) + var(--sp-1)); }

  /* จอแคบหัวเว็บเป็นพื้นสว่างเสมอ (กฎข้างล่างสั่ง position: static + พื้นครีม)
     โลโก้จึงต้องหรี่ลงด้วย ไม่งั้นทองอ่อนบนครีมจางจนแทบมองไม่เห็น */
  .site-logo img { filter: brightness(0.62) saturate(1.15); }
}

@media (max-width: 768px) {
  .mo-has-hero .site-header { position: static; background: var(--c-surface); }
  .mo-has-hero .site-header .main-navigation .main-nav > ul > li > a,
  .mo-has-hero .site-header .site-branding .main-title a { color: var(--c-ink); }

  /* **28 ก.ย. 2569 — ระยะบนของฮีโร่ยังเผื่อพื้นที่ให้หัวเว็บลอยทับอยู่ ทั้งที่บรรทัด
     บนสุดสั่งให้หัวเว็บกลับมาอยู่ใน flow ปกติแล้ว (position: static)** ผลคือจอมือถือ
     ได้ช่องว่างสองชั้นซ้อนกัน: ความสูงหัวเว็บจริง + ระยะบนของฮีโร่ที่ยังคิดว่าหัวเว็บลอยอยู่
     (เจ้าของสังเกตเห็นว่าหลายหน้าบนมือถือมีช่องว่างเกินจำเป็นด้านบน)
     → ลดเหลือระยะเดียวกับที่ section ทั่วไปใช้คั่นกัน (--section-y) พอเป็นช่วงหายใจ
     ปกติ ไม่ใช่ระยะที่คำนวณมาเผื่อหัวเว็บซึ่งไม่มีอยู่แล้วที่ความกว้างนี้
     ไม่แตะระยะล่างของ .mo-hero / .mo-pagehero เพราะฝั่งนั้นไม่เคยเผื่อหัวเว็บอยู่แล้ว */
  .mo-hero, .mo-pagehero { padding-top: var(--section-y); }
}

/* --- Footer ---------------------------------------------------------------- */
/* พื้นท้ายเว็บใช้ --c-brand-dark ตั้งแต่ 24 ก.ย. 2569 (เดิม --c-brand)
   สเปก v2 ข้อ 1 ให้ใช้สีเข้มที่สุดกับท้ายเว็บ เพื่อแยกชั้นออกจากพื้น navy ปกติ
   เดิมสั่งไว้ในบล็อก .mo-v2 ท้ายเว็บจึงเรนเดอร์คนละสีระหว่างหน้าแรกกับหน้าอื่น
   ทั้งที่เป็น markup ชุดเดียวกัน **แก้ที่กฎเดิมเลย ไม่เขียนกฎใหม่มาทับ** */
.site-footer { background: var(--c-brand-dark); color: rgba(251,250,248,.78); }
.site-footer :where(a, .widget-title) { color: var(--c-ink-invert); }
.site-footer a:hover { color: var(--c-accent-light); }
.site-footer .widget-title {
  font-size: var(--fs-micro);
  letter-spacing: var(--ls-eyebrow);
  color: var(--c-accent-light);
  margin-bottom: var(--sp-2);
}
.site-footer ul { list-style: none; padding: 0; }
.site-footer li { padding-block: .2em; font-size: var(--fs-small); }

/* เนื้อหาท้ายเว็บ — ที่ตั้ง เวลาทำการ บริการ (markup อยู่ที่ generate_footer ใน functions.php)

   สืบสีตัวหนังสือและสีลิงก์จาก .site-footer ข้างบนทั้งหมด ไม่ประกาศสีซ้ำที่นี่
   กฎลิงก์ของ .site-footer เขียนด้วย :where() ซึ่งมีน้ำหนักเป็นศูนย์
   ถ้าเผลอประกาศสีลิงก์ที่นี่จะทับมันทันทีโดยไม่ตั้งใจ แล้วสถานะ hover จะหาย */
.mo-footer { padding-block: var(--sp-5) var(--sp-4); }

/* minmax(min(...), 1fr) ไม่ใช่ minmax(16rem, 1fr) — ค่าคงที่เปล่า ๆ ทำให้คอลัมน์
   ยังกว้าง 16rem อยู่แม้ยุบเหลือคอลัมน์เดียวบนจอ 375px แล้วทั้งหน้าเลื่อนซ้ายขวาได้
   (กับดักที่ Design.md บันทึกไว้ เจอมาแล้ว 2 จุดเมื่อ 28 ส.ค. 2569) */
.mo-footer__grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(16rem, 100%), 1fr));
  gap: var(--sp-4);
}

.mo-footer__title {
  font-family: var(--font-display);
  font-weight: var(--fw-display);
  font-size: var(--fs-micro);
  letter-spacing: var(--ls-eyebrow);
  color: var(--c-accent-light);
  margin: 0 0 var(--sp-2);
}
.mo-footer__title--gap { margin-top: var(--sp-3); }

/* line-height ต้องเป็น --lh-body (1.8) ไม่ใช่ค่ามาตรฐาน — ที่อยู่มีสระบนกับ
   วรรณยุกต์ซ้อนสองชั้น ("พื้น" "ห้วยขวาง") ต่ำกว่า 1.7 แล้ววรรณยุกต์บรรทัดบน
   จะชนสระบรรทัดล่าง (ข้อบังคับภาษาไทยข้อ 1 ใน Design.md) */
.mo-footer p,
.mo-footer address {
  margin: 0;
  font-size: var(--fs-small);
  line-height: var(--lh-body);
  font-style: normal;   /* <address> เอียงเองโดยปริยาย ที่อยู่ไทยเอียงแล้วอ่านยาก */
}
.mo-footer__brand { font-weight: var(--fw-strong); color: var(--c-ink-invert); }

.mo-footer ul { list-style: none; margin: 0; padding: 0; }
.mo-footer li { padding-block: .2em; font-size: var(--fs-small); line-height: var(--lh-body); }

.mo-footer__maplink { display: inline-block; margin-top: var(--sp-2); font-size: var(--fs-small); }
.mo-footer__ext { font-size: .85em; }
.mo-footer__all { color: var(--c-accent-light); }
.site-info { background: var(--c-brand-dark); color: rgba(251,250,248,.6); font-size: var(--fs-small); border-top: 1px solid rgba(196,166,127,.22); }

/* ลิงก์นโยบายความเป็นส่วนตัวต่อท้ายบรรทัดลิขสิทธิ์
   ขีดคั่นวาดด้วย ::before เพื่อไม่ให้ screen reader อ่านสัญลักษณ์ออกมา
   และเพื่อให้ขีดหายไปเองเวลาหน้านโยบายยังเป็นฉบับร่าง (ตอนนั้นไม่มีลิงก์เลย) */
.mo-footer__legal { color: var(--c-accent-light); }
.mo-footer__legal::before { content: "·"; margin-inline: .6em; color: rgba(251,250,248,.4); }

/* **ถอน background-color ออกแล้ว 31 ส.ค. 2569** ตอนย้ายวอร์ดมาร์กเข้าไปในท้ายเว็บ
   กฎเดิมทาพื้นกรมท่าให้ตัวมันเองเพราะเคยอยู่นอกท้ายเว็บ แต่ไม่เคยได้ผลอย่างที่ตั้งใจ —
   `background-clip: text` ตัดพื้นทุกชั้นให้เหลือเฉพาะในตัวอักษร สีกรมท่าจึงไปอยู่
   *ข้างใน* ตัวอักษร (ทำให้ปลายตัวอักษรทึบเป็นกรมท่าแทนที่จะจางหาย) ส่วนแถบรอบ ๆ
   ยังเป็นสีครีมของหน้าเหมือนเดิม
   ตอนนี้อยู่ในท้ายเว็บแล้ว พื้นกรมท่ามาจาก .site-footer เอง และช่วงจางของไล่สี
   จะจางไปหาพื้นท้ายเว็บจริง ๆ ตามที่ออกแบบไว้ตั้งแต่แรก */
.mo-wordmark { margin: var(--sp-4) 0 0; padding-inline: 0; }

/* --- Single post ------------------------------------------------------------ */
.mo-posthead { max-width: var(--content-narrow); margin: 0 auto var(--sp-4); }
.mo-posthead h1 { font-size: var(--fs-h2); margin: var(--sp-2) 0 var(--sp-1); }
.mo-posthead__meta { font-size: var(--fs-small); color: var(--c-ink-soft); margin: 0; }

.mo-toc {
  max-width: var(--content-narrow);
  background: var(--c-canvas);
  border-radius: var(--radius-sm);
  padding: var(--sp-3);
  margin-bottom: var(--sp-4);
}
.mo-toc b { font-size: var(--fs-micro); letter-spacing: var(--ls-eyebrow); color: var(--c-accent-text); }
.mo-toc ol { margin: var(--sp-2) 0 0; padding-left: 1.3em; font-size: var(--fs-small); }
.mo-toc li { padding-block: .2em; }
.mo-toc a { color: var(--c-ink); text-decoration: none; }
.mo-toc a:hover { color: var(--c-accent-text); text-decoration: underline; }

/* header ลอยทับตอน jump ไปหัวข้อ — กันหัวข้อโดนบัง */
:where(h2, h3)[id] { scroll-margin-top: 5.5rem; }
/* section ที่เป็นปลายทางของลิงก์ในหน้า (เช่น #booking-form หน้าติดต่อ · 25 ก.ย. 2569)
   ระยะบนของ section (~54px) น้อยกว่าหัวเว็บที่ลอยตาม (~92px) หัวข้อจึงโดนบังครึ่งบรรทัด */
.mo-section[id] { scroll-margin-top: 5.5rem; }

/* บีบความกว้างเนื้อความบทความให้อ่านสบาย — ตั้งใจใช้กับ "บทความ" เท่านั้น
   แต่ `.single` คือคลาสที่ WordPress ใส่ให้ **เนื้อหาเดี่ยวทุกชนิด** ไม่ใช่แค่บทความ
   หน้าบริการซึ่งเป็น custom post type จึงโดนบีบเหลือ 720px ไปด้วยทั้งหน้า
   แถบสีของทุก section เลยกว้างแค่ 720px กลางจอ แทนที่จะกินเต็มความกว้าง
   (พบจริงที่ /service/scoliosis-treatment/ เมื่อ 25 ส.ค. 2569
   เห็นชัดตอนเรนเดอร์ที่ 1440px แล้ววัดขอบแถบสี)

   หน้าแรกไม่โดนเพราะเป็น "หน้า" (Page) ซึ่งได้คลาส `page` ไม่ใช่ `single`
   → ยกเว้นด้วย :not(.mo-fullbleed) ไม่ใช่เปลี่ยนไปเจาะจง `.single-post`
   เพราะเงื่อนไขที่ตัดสินจริง ๆ คือ "หน้านี้ประกอบจาก section ของดีไซน์หรือเปล่า"
   ซึ่งเป็นคำถามเดียวกับที่ .mo-fullbleed ตอบอยู่แล้วข้างบน
   วันหลังถ้ามีบทความในชนิดเนื้อหาอื่น กฎนี้ก็ยังครอบให้เองโดยไม่ต้องมาแก้ */
.single:not(.mo-fullbleed) .entry-content { max-width: var(--content-narrow); margin-inline: auto; }
.single:not(.mo-fullbleed) .entry-content > .alignwide,
.single:not(.mo-fullbleed) .entry-content > .alignfull { max-width: none; }

/* --- กล่องแทนรูปที่ยังไม่มี --------------------------------------------------
   ตั้งใจให้เห็นชัดว่าตรงนี้รอรูปถ่ายจริง ไม่ใช่ช่องว่างที่ลืมไป
   ยกมาจากหน้าตัวอย่าง — ตอนย้าย pattern ลงธีมรอบแรกลืมคลาสนี้ไว้
   กล่องรอรูปทุกจุดเลยไม่มีกรอบ เหลือแต่ตัวหนังสือลอย

   ลบทั้งบล็อกนี้ได้เมื่อไหร่ = ได้รูปถ่ายจริงครบทุกจุดแล้ว
--------------------------------------------------------------------------- */
.mo-ph {
  display: grid;
  place-items: center;
  border: 1px dashed var(--c-line);
  border-radius: var(--radius-img);
  background: var(--c-canvas);
  color: var(--c-ink-soft);
  font-size: var(--fs-small);
  text-align: center;
  padding: var(--sp-2);
  min-height: 12rem;
}
.mo-person .mo-ph { aspect-ratio: 4/5; min-height: 0; }
.mo-collage .mo-ph { min-height: 0; height: 100%; }
.mo-thumb.mo-ph { min-height: 0; font-size: var(--fs-body); color: var(--c-accent-text); }

/* --- ภาพไดคัท วางบนพื้นเว็บตรง ๆ ไม่มีแผ่นสีรอง -------------------------------
   ใช้กับภาพที่ตัดพื้นหลังออกแล้ว (ไดคัท)

   **เดิมมีแผ่นสีครีมรองอยู่ข้างหลัง เอาออกแล้ว 27 ส.ค. 2569 (เจ้าของสั่ง)**
   เหตุผลเดิมที่ใส่ไว้คือกลัวว่าภาพโปร่งใสจะ "ลอย" ไม่มีอะไรยึด
   แต่พอวางจริงแล้วแผ่นสีกินพื้นที่สูงกว่าคอลัมน์ข้อความข้าง ๆ อย่างเห็นได้ชัด
   และตัวคนก็เล็กลงเพราะต้องย่อให้พอดีแผ่น → เอาแผ่นออกแล้วสองปัญหาหายพร้อมกัน

   **ต้องครอปขอบโปร่งใสรอบตัวคนออกจากไฟล์ด้วย ไม่ใช่แก้แค่ CSS**
   ไฟล์ที่ส่งมาเป็นจัตุรัสและมีที่ว่างรอบตัวราว 12% ทุกด้าน
   พอไม่มีแผ่นสีรอง ที่ว่างนั้นกลายเป็นช่องโหว่ที่มองไม่เห็นแต่ยังกินที่จริง
   ตัวคนจึงดูเล็กและเยื้องขึ้นจากที่ควรเป็น ครอปแล้วสัดส่วนถึงจะตรงกับข้อความข้าง ๆ

   ความสูงไม่ได้ล็อกไว้แล้ว ปล่อยให้ไปตามสัดส่วนจริงของไฟล์
   ไฟล์ปัจจุบัน 1000×1100 → ที่คอลัมน์กว้างราว 545px จะสูงราว 600px
   ซึ่งพอดีกับความสูงของคอลัมน์ข้อความ ถ้าเปลี่ยนไฟล์ใหม่ต้องเรนเดอร์วัดอีกที
--------------------------------------------------------------------------- */
/* 34rem คือความกว้างที่รูปได้อยู่แล้วบนเดสก์ท็อป (คอลัมน์ละราว 544px)
   บนเดสก์ท็อปค่านี้จึงไม่มีผลอะไรเลย แต่ตอนจอแคบแล้วตารางยุบเหลือแถวเดียว
   รูปจะพุ่งไปกว้างเต็มจอทันทีและสูงเกือบเต็มหน้าจอ ต้องเลื่อนผ่านนานกว่าจะถึงข้อความ
   คุมไว้เท่าเดิมแล้วจัดกึ่งกลาง — ได้ผลโดยไม่ต้องเพิ่ม media query ใหม่อีกจุด */
.mo-portrait { margin-inline: auto; margin-block: 0; max-width: 34rem; }
.mo-portrait img {
  width: 100%;
  height: auto;
  border-radius: 0;   /* ภาพไดคัทไม่มีขอบให้มน มุมเป็นพื้นที่โปร่งใสอยู่แล้ว */
}

/* กล่องรอรูป (.mo-ph) ยังต้องมีกรอบสัดส่วนเหมือนเดิม ไม่งั้นจะยุบแบน
   เพราะมันไม่มีเนื้อหาข้างในมาดันความสูงให้เหมือนรูปจริง
   :has() ทำให้กรอบกลับมาเฉพาะตอนที่ยังไม่มีรูปจริงเท่านั้น */
.mo-portrait:has(.mo-ph) { aspect-ratio: 3 / 4; }
.mo-portrait .mo-ph {
  width: 100%;
  height: 100%;
  min-height: 0;
}

/* กรอบรูปเป็นบล็อกรูปของ WordPress ซึ่งห่อด้วย <figure> อีกชั้น
   ต้องล้างระยะขอบของ figure ไม่งั้นกรอบจะเยื้องจากคอลัมน์ข้าง ๆ */
figure.mo-portrait { display: block; }

/* --- Reviews (ครอบวิดเจ็ตรีวิวจากปลั๊กอินภายนอก) -------------------------------
   ตัดสินใจ 23 ส.ค. 2569: ใช้ Trustindex ดึงรีวิวจริงจาก Google
   เหตุผลที่ต้องมีคลาสครอบ — วิดเจ็ตของปลั๊กอินมาพร้อมหน้าตาของตัวเอง
   (การ์ดขาว เงาเข้ม ฟอนต์ระบบ ดาวสีเหลือง) ซึ่งไม่เข้ากับพาเลตต์ navy/ทองแดง/ครีม
   ถ้าปล่อยไว้จะดูเหมือนของแปะเพิ่มทีหลัง ไม่ใช่ส่วนหนึ่งของเว็บ

   คลาสนี้จำกัดความกว้างและคุมฟอนต์ให้กลับมาเป็นของเว็บ
   ส่วนสีของวิดเจ็ตต้องไปตั้งในหน้าตั้งค่าของปลั๊กอินเอง แก้จากตรงนี้ไม่ได้ทั้งหมด
--------------------------------------------------------------------------- */
.mo-reviews {
  max-width: var(--wrap-narrow);
  margin-inline: auto;
}
.mo-reviews :where(p, span, div, a) { font-family: var(--font-body); }

/* ข้อความกำกับใต้รีวิว — เว็บสถานพยาบาลต้องบอกว่าผลลัพธ์แต่ละคนไม่เท่ากัน
   ไม่ใช่แค่มารยาท แต่กันการถูกตีความว่าโฆษณาอ้างผลการรักษา */
.mo-reviews__note {
  max-width: 54ch;
  margin: var(--sp-3) auto 0;
  text-align: center;
}

/* --- Steps (ลำดับขั้นของการมาใช้บริการ) ---------------------------------------
   แยกจาก .mo-rows โดยตั้งใจ แม้เนื้อหาคล้ายกัน เพราะสองอย่างนี้ "เป็นคนละชนิด"

   .mo-rows คือตารางข้อมูล — แต่ละแถวเท่ากัน ไม่มีก่อนหลัง
   .mo-steps คือลำดับเวลา — ต้องอ่านออกว่ามีขั้น 1 ก่อนขั้น 2

   ของเดิมส่วนนี้ใช้ .mo-rows คือแถวคั่นเส้นในกล่องขาว ตาจึงอ่านเป็นตาราง
   ไม่ใช่เส้นทางที่คนไข้จะเดินผ่าน ทั้งที่เนื้อหาบอกว่าเป็นลำดับชัด ๆ

   ตัว markup ใช้ <ol> ด้วย โปรแกรมอ่านหน้าจอจะได้บอกว่า "รายการ 4 ข้อ ข้อที่ 1"
   ซึ่งเป็นข้อมูลที่คนตาบอดควรได้เท่ากับคนที่เห็นเส้นเชื่อม
--------------------------------------------------------------------------- */
.mo-steps {
  list-style: none;
  max-width: var(--wrap-narrow);
  margin-inline: auto;
  padding: 0;
}

.mo-step {
  position: relative;
  display: grid;
  grid-template-columns: 3.5rem 1fr;
  gap: var(--sp-3);
  padding-bottom: var(--sp-4);
}
.mo-step:last-child { padding-bottom: 0; }

/* เส้นเชื่อมหมุด — ตัวที่ทำให้อ่านออกว่าเป็นเส้นทางเดียวกัน ไม่ใช่ 4 ก้อนแยกกัน
   เริ่มใต้หมุดและจบเหนือหมุดถัดไป จะได้ไม่ลอดผ่านตัวเลข */
.mo-step:not(:last-child)::before {
  content: "";
  position: absolute;
  inset-inline-start: 1.75rem;
  inset-block: 4rem .5rem;
  width: 1px;
  background: var(--c-line);
}

.mo-step__num {
  width: 3.5rem;
  height: 3.5rem;
  border: 1px solid var(--c-accent);
  border-radius: 50%;
  display: grid;
  place-items: center;
  margin: 0;
  font-family: var(--font-display);
  font-size: var(--fs-h3);
  color: var(--c-accent-text);
  font-variant-numeric: tabular-nums;   /* เลขทุกตัวกว้างเท่ากัน หมุดจะได้ไม่เบี้ยว */
}

.mo-step__body h3 { margin: 0 0 var(--sp-1); }
.mo-step__body p { margin: 0; color: var(--c-ink-soft); }

@media (max-width: 600px) {
  .mo-step { grid-template-columns: 2.75rem 1fr; gap: var(--sp-2); }
  .mo-step__num { width: 2.75rem; height: 2.75rem; font-size: var(--fs-body); }
  .mo-step:not(:last-child)::before { inset-inline-start: 1.375rem; inset-block-start: 3.2rem; }
}

/* --- การ์ดหลักการบนพื้น navy ---------------------------------------------------
   บนพื้นเข้ม การ์ดขาว 6 ใบเรียงกันอ่านออกมาเป็นก้อนหนัก 6 ก้อน
   และเนื้อหาในแต่ละใบน้อยกว่าขนาดกล่องมาก จึงเห็นที่ว่างเด่นกว่าตัวหนังสือ

   เอาพื้นขาวออก เหลือเส้นคั่นบาง ๆ ให้พื้น navy ได้ทำงาน
   ทองแดงกลายเป็นสิ่งที่เด่นแทน ซึ่งตรงกับที่ Design.md ตั้งใจให้เป็นสี accent

   จำกัดขอบเขตไว้ที่ section พื้นมืดเท่านั้น เผื่อวันหลังเอา .mo-feature
   ไปใช้บนพื้นสว่างจะได้ยังเป็นการ์ดขาวเหมือนเดิม
--------------------------------------------------------------------------- */
.mo-section--night .mo-feature {
  background: transparent;
  border-radius: 0;
  padding: var(--sp-3) 0 0;
  border-top: 1px solid rgba(196, 166, 127, .3);
}
.mo-section--night .mo-feature h3 { color: var(--c-ink-invert); margin-top: var(--sp-2); }
.mo-section--night .mo-feature p { color: rgba(251, 250, 248, .78); }
/* การ์ดทึบบนพื้นมืด — ตัวเลือกใหม่ ไม่ได้แทนที่ของเดิม (31 ส.ค. 2569)

   ค่าตั้งต้นข้างบนทำให้การ์ดบนพื้นมืดโปร่งใส เหลือแค่เส้นคาดหัว ซึ่งดูสะอาดดี
   และหน้าแรกใช้อยู่ **ห้ามเปลี่ยนของเดิม** — แต่เทมเพลตที่เจ้าของส่งมาอ้างอิง
   ใช้การ์ดทึบสีอ่อนบนพื้นภาพ ซึ่งอ่านง่ายกว่าเมื่อพื้นหลังเป็นภาพถ่ายที่มีลาย
   จึงทำเป็นคลาสเสริมให้เลือกใช้เป็น section ไป

   ความแรง 0-3-0 ชนะกฎเดิมที่ 0-2-0 พอดี ไม่ต้องใช้ !important (กฎเหล็กข้อ 3) */
.mo-section--night .mo-features--solid .mo-feature {
  background: var(--c-surface);
  border-radius: var(--radius-card);
  border-top: 0;
  padding: var(--sp-3);
}
.mo-section--night .mo-features--solid .mo-feature h3 { color: var(--c-ink); margin-top: 0; }
.mo-section--night .mo-features--solid .mo-feature p { color: var(--c-ink-soft); }

.mo-section--night .mo-icon {
  background: transparent;
  border: 1px solid var(--c-accent);
  color: var(--c-accent-light);
}

/* --- Factbar (แถบข้อมูลติดต่อ) -------------------------------------------------
   เนื้อหาส่วนนี้คือ "ข้อเท็จจริง 4 อย่าง" ที่คนมาหาเพื่อลงมือทำต่อ
   ไม่ใช่ 4 สิ่งที่ต้องเลือกอย่างใดอย่างหนึ่ง การ์ด 4 ใบจึงสื่อผิด
   แถบเดียวแบ่งช่องด้วยเส้นบางอ่านออกว่าเป็นชุดข้อมูลชุดเดียวกัน

   เส้นคั่นมาจากพื้นหลังของตะแกรงที่ลอดผ่านช่องว่าง 1px ไม่ได้วาดเป็น border ราย
   ช่อง วิธีนี้เส้นจะถูกต้องเสมอไม่ว่าจอแคบแล้วช่องจะตกบรรทัดยังไง
--------------------------------------------------------------------------- */
.mo-factbar {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
  gap: 1px;
  background: var(--c-line);
  border: 1px solid var(--c-line);
  border-radius: var(--radius-card);
  overflow: hidden;
  margin-top: var(--sp-4);
}

.mo-fact {
  background: var(--c-surface);
  padding: var(--sp-3);
  display: flex;
  flex-direction: column;
  gap: var(--sp-1);
}

.mo-fact__label {
  font-size: var(--fs-micro);
  letter-spacing: var(--ls-eyebrow);
  color: var(--c-accent-text);
  margin: 0;
}

.mo-fact__value {
  font-family: var(--font-display);
  font-size: var(--fs-h3);
  line-height: var(--lh-tight);
  color: var(--c-ink);
  margin: 0;
}
.mo-fact__value a { color: inherit; text-decoration: none; }
.mo-fact__value a:hover { color: var(--c-accent-text); }

/* --- Post list (รายการบทความ) --------------------------------------------------
   บทความคือ "ลิงก์ที่พาไปที่อื่น" ไม่ใช่สินค้าให้เลือก
   เดิมใช้การ์ด 3 ใบเรียงแนวนอน ซึ่งหน้าตาเหมือนการ์ดบริการเป๊ะ
   ทั้งที่ทำหน้าที่คนละอย่าง และทำให้หน้าเว็บมีตะแกรง 3 คอลัมน์ซ้ำกันหลายส่วน

   เปลี่ยนเป็นรายการแนวตั้งแบบสารบัญ อ่านออกว่าเป็นของให้กดเข้าไปอ่านต่อ
   และตัดจังหวะตะแกรง 3 คอลัมน์ที่ซ้ำอยู่ทั้งหน้า
--------------------------------------------------------------------------- */
/* **ยกเครื่องเมื่อ 28 ส.ค. 2569** (design-fixes ข้อ 1 — "ดูเหมือนลิงก์ดิบ")
   ของเดิมเป็นข้อความสามบรรทัดคั่นด้วยเส้นผมบนพื้น navy ไม่มีพื้นรองอะไรเลย
   ซึ่งบังเอิญเป็นหน้าตาเดียวกับลิสต์ที่ยังไม่ได้จัดสไตล์ของเบราว์เซอร์พอดี
   ตาจึงอ่านว่าเป็นของที่ยังทำไม่เสร็จ ทั้งที่เนื้อหาครบแล้ว

   สิ่งที่ขาดไปคือ **ขอบเขตของแต่ละรายการ** ไม่ใช่สีหรือขนาดตัวอักษร
   ใส่พื้นโปร่งแสงจาง ๆ กับขอบให้แต่ละแถวเป็นก้อนของตัวเอง แล้วเว้นช่องระหว่างก้อน
   แทนเส้นคั่น — เส้นคั่นสื่อว่า "ต่อกันเป็นเนื้อเดียว" ช่องว่างสื่อว่า "แยกชิ้น กดได้"

   ไม่เปลี่ยนเป็นการ์ด 3 คอลัมน์ตามที่ design-fixes เปิดทางไว้ เพราะหน้านี้มีตะแกรง
   3 คอลัมน์อยู่แล้วสองชุด (บริการ · เช็กอาการ) เพิ่มอีกชุดจะยิ่งซ้ำจังหวะเดิม

   ความกว้างไม่ได้คุมที่นี่แล้ว ไปคุมที่ .mo-wrap--narrow ของ section แทน
   หัวข้อกับลิสต์จะได้ขอบซ้ายตรงกัน (design-fixes ข้อ 4) */
.mo-postlist {
  list-style: none;
  padding: 0;
  display: grid;
  gap: var(--sp-2);
  /* รายการบทความเป็นเนื้อหาข้อความ = ระดับ Narrow (design-fixes ข้อ 4)
     ต้องคุมที่นี่ ไม่ใช่ที่ .mo-wrap--narrow ของ section เพราะหน้าบริการ
     ต้องรักษาแกนซ้ายแกนเดียวไว้ ย่อทั้ง section แล้วขอบซ้ายจะขยับ */
  max-width: var(--wrap-narrow);
  margin: 0 auto;
}

/* **การ์ดเป็นพื้นครีมทึบ ไม่ใช่ navy โปร่งแสง — เปลี่ยน 28 ส.ค. 2569**
   (design-fixes ข้อ 2.4 · เจ้าของเลือกทางนี้เอง)

   รอบแรกลองพื้น navy โปร่งแสง + ขอบทองแดง ซึ่งแก้เรื่อง "ไม่รู้ว่าเป็นการ์ด" ได้
   แต่ไม่ได้แก้ปัญหาที่ใหญ่กว่า — **บรรทัดหมวดหมู่ในการ์ดใช้ทองแดงเข้ม
   `--c-accent-text` ซึ่งบนพื้น navy ได้แค่ 2.7:1 ไม่ผ่านเกณฑ์**
   พอเปลี่ยนพื้นการ์ดเป็นครีม สีเดิมทุกตัวก็กลับมาผ่านเองโดยไม่ต้องแก้ทีละจุด
   (ทองแดงเข้มบนครีม 5.0:1 · navy บนครีม 13.2:1)
   → เป็นตัวอย่างที่ดีของ "แก้ที่พื้น ไม่ใช่ไล่แก้ตัวหนังสือทีละบรรทัด"

   ผลพลอยได้: แถบ navy ทั้งแถบไม่ทึบตันเหมือนเดิม มีก้อนสว่างคั่นให้ตาพัก */
.mo-postlist a {
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: center;
  gap: var(--sp-3);
  padding: var(--sp-3);
  border-radius: var(--radius-card);
  background: var(--c-canvas);
  border: 1px solid transparent;
  text-decoration: none;
  color: var(--c-ink);
  transition: border-color var(--dur) var(--ease), transform var(--dur) var(--ease);
}
.mo-postlist a:hover {
  border-color: var(--c-accent);
  transform: translateY(-2px);
}

/* ลูกศรเลื่อนตอนชี้ บอกว่ากดแล้วไปที่อื่น ไม่ใช่กางออกในที่เดิม
   ใช้ --c-accent ไม่ใช่ --c-accent-light เพราะตอนนี้อยู่บนพื้นครีม ไม่ใช่พื้น navy แล้ว
   (ทองแดงอ่อนทำมาสำหรับพื้นเข้ม วางบนครีมแล้วจาง) */
.mo-postlist a::after {
  content: "→";
  color: var(--c-accent);
  font-size: var(--fs-h3);
  transition: transform var(--dur) var(--ease);
}
.mo-postlist a:hover::after { transform: translateX(.25rem); }

/* ต้องเขียนสีทับที่นี่ เพราะ .mo-section--night :where(h2, h3) สั่งหัวข้อเป็นสีครีม
   ให้ทุกอย่างในแถบมืด แต่การ์ดใบนี้เป็นเกาะพื้นสว่างในแถบนั้น จึงต้องกลับเป็น navy
   ความแรงเท่ากันพอดี (0-1-1) กฎนี้อยู่ล่างกว่าจึงชนะ */
.mo-postlist h3 {
  margin: var(--sp-1) 0 0;
  color: var(--c-ink);
  transition: color var(--dur) var(--ease);
}
.mo-postlist a:hover h3 { color: var(--c-accent-text); }
.mo-postlist .mo-card__meta { color: var(--c-accent-text); }
/* สีต้องสั่งเองด้วย ไม่งั้นรับสีครีมที่ .mo-section--night ตั้งให้ทั้งแถบมา
   แล้วจะเป็นครีมบนครีม (การ์ดใบนี้เป็นเกาะพื้นสว่างในแถบมืด) */
.mo-postlist p { margin: var(--sp-1) 0 0; font-size: var(--fs-small); color: var(--c-ink-soft); }

/* --- การ์ดบทความพร้อมรูป (Query Loop ของ WordPress) --------------------------

   ต่างจาก .mo-postlist ข้างบนตรงที่ **ดึงบทความจริงจากฐานข้อมูล ไม่ได้พิมพ์ตายตัว**
   ใช้บล็อกมาตรฐานของ WordPress ล้วน (query · post-template · post-featured-image ·
   post-terms · post-title · post-excerpt) จึงไม่ได้พึ่งปลั๊กอินหรือโค้ดในธีมเลย
   ถอดธีมนี้ออกวันไหน บล็อกยังทำงานต่อได้ — ต่างจากทางที่ใช้ shortcode

   .mo-postlist ยังอยู่ ยังมีหน้าบริการใช้อยู่ ห้ามลบ

   **จงใจไม่ใช้ระบบตะแกรงของบล็อก** (layout.type=grid ของ post-template)
   เพราะมันจะไปสร้างไฟล์ CSS ของตัวเองแทรกในหน้า แล้วระยะห่างจะไม่ได้มาจาก token
   ในไฟล์นี้ คุมเองตรงนี้ที่เดียวชัดกว่า */
.mo-postcards .wp-block-post-template {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  /* minmax(min(...), 1fr) ไม่ใช่ minmax(17rem, 1fr) — กับดักจอแคบใน Design.md */
  grid-template-columns: repeat(auto-fit, minmax(min(17rem, 100%), 1fr));
  gap: var(--sp-3);
}

/* การ์ดเป็นพื้นครีมทึบด้วยเหตุผลเดียวกับ .mo-postlist ข้างบน —
   บรรทัดหมวดหมู่ใช้ทองแดงเข้มซึ่งบนพื้น navy ได้แค่ 2.7:1 ไม่ผ่านเกณฑ์
   พอพื้นการ์ดเป็นครีม สีเดิมทุกตัวกลับมาผ่านเองโดยไม่ต้องไล่แก้ทีละบรรทัด

   overflow: hidden เพื่อให้มุมรูปโค้งตามมุมการ์ด ไม่ใช่โผล่เป็นเหลี่ยมทับมุมมน */
.mo-postcards .wp-block-post {
  display: flex;
  flex-direction: column;
  background: var(--c-canvas);
  border: 1px solid transparent;
  border-radius: var(--radius-card);
  overflow: hidden;
  transition: border-color var(--dur) var(--ease), transform var(--dur) var(--ease);
}
.mo-postcards .wp-block-post:hover {
  border-color: var(--c-accent);
  transform: translateY(-2px);
}

.mo-postcards .wp-block-post-featured-image { margin: 0; }
.mo-postcards .wp-block-post-featured-image img { display: block; width: 100%; }

.mo-postcard__body { padding: var(--sp-3); }

/* สีทุกตัวในการ์ดต้องสั่งเอง — .mo-section--night ตั้ง color ให้ทั้งแถบเป็นสีครีม
   ปล่อยไว้จะได้ครีมบนครีม (การ์ดใบนี้เป็นเกาะพื้นสว่างในแถบมืด) */
.mo-postcards .mo-card__meta {
  margin: 0;
  font-size: var(--fs-micro);
  letter-spacing: var(--ls-eyebrow);
  color: var(--c-accent-text);
}
.mo-postcards .mo-card__meta a { color: inherit; text-decoration: none; }

/* ต้องแรงพอชนะ `.mo-section--night :where(h2, h3)` ที่สั่งหัวข้อเป็นครีมทั้งแถบ
   กฎนั้นแรง 0-1-1 (:where() ไม่นับ) กฎนี้ 0-2-0 จึงชนะ — ห้ามแก้ด้วย !important */
.mo-postcards .wp-block-post-title {
  margin: var(--sp-1) 0 0;
  font-size: var(--fs-h3);
  color: var(--c-ink);
}
.mo-postcards .wp-block-post-title a {
  color: inherit;
  text-decoration: none;
  transition: color var(--dur) var(--ease);
}
.mo-postcards .wp-block-post:hover .wp-block-post-title a { color: var(--c-accent-text); }

.mo-postcards .wp-block-post-excerpt { margin: var(--sp-1) 0 0; }
.mo-postcards .wp-block-post-excerpt__excerpt {
  margin: 0;
  font-size: var(--fs-small);
  line-height: var(--lh-body);
  color: var(--c-ink-soft);
}

/* ดันลิงก์ "อ่านต่อ" ไปติดก้นการ์ดเสมอ ให้ทุกใบอยู่ระดับเดียวกัน
   ไม่งั้นใบที่คำอธิบายสั้นกว่าจะมีลิงก์ลอยอยู่กลางการ์ด แถวการ์ดดูไม่เป็นระเบียบ
   **ต้องต่อ flex ลงไปสามชั้น ไม่ใช่สองชั้น** — จุดที่พลาดรอบแรกคือ
   บล็อก Group ของ WordPress พ่นกล่องซ้อนข้างในให้อีกหนึ่งชั้นเสมอ
   (`.wp-block-group__inner-container`) ซึ่งมองไม่เห็นจากโค้ด pattern
   ข้ามชั้นนี้ไปเมื่อไหร่ โซ่ขาดตรงกลาง แล้ว margin-top:auto ข้างล่างไม่ทำงานเลย
   โดยไม่มีอะไรเตือน — เห็นก็ต่อเมื่อไปอ่าน HTML ที่เว็บพ่นออกมาจริง */
.mo-postcard__body,
.mo-postcards .wp-block-group__inner-container,
.mo-postcards .wp-block-post-excerpt { display: flex; flex-direction: column; flex: 1; }

/* margin-top ต้องเป็น auto ไม่ใช่ตัวเลข — auto คือตัวที่ดันลงก้นการ์ด
   ระยะห่างจากคำอธิบายใช้ padding แทน ถ้าใช้ margin จะไปทับ auto แล้วไม่ดันอะไรเลย */
.mo-postcards .wp-block-post-excerpt__more-text { margin: auto 0 0; padding-top: var(--sp-2); }
.mo-postcards .wp-block-post-excerpt__more-link {
  font-size: var(--fs-small);
  color: var(--c-accent-text);
  text-decoration: none;
}
/* ลูกศรบอกว่ากดแล้วไปหน้าอื่น ไม่ใช่กางออกในที่เดิม — เหตุผลเดียวกับ .mo-postlist */
.mo-postcards .wp-block-post-excerpt__more-link::after {
  content: " →";
  display: inline-block;
  transition: transform var(--dur) var(--ease);
}
.mo-postcards .wp-block-post:hover .wp-block-post-excerpt__more-link::after { transform: translateX(.25rem); }

/* ปุ่ม "อ่านบทความทั้งหมด" อยู่ใต้ตะแกรง ต้องมีระยะห่างจากการ์ดแถวล่าง */
.mo-postcards + .mo-cta-row { margin-top: var(--sp-4); }

/* --- บล็อกผู้ตรวจทานเนื้อหา -----------------------------------------------
   สัญญาณ E-E-A-T ของเนื้อหาสุขภาพ — บอกว่าใครตรวจ มีใบประกอบวิชาชีพเลขอะไร
   และอัปเดตล่าสุดเมื่อไร ทั้ง Google และคนอ่านใช้สามอย่างนี้ตัดสินความน่าเชื่อถือ

   ทำเป็นแถบเส้นทองแดงด้านซ้าย ไม่ใช่การ์ดเต็มใบ เพราะไม่ควรแย่งความเด่น
   ไปจากหัวข้อคำถามที่พบบ่อยที่อยู่เหนือมัน — เป็นข้อมูลกำกับ ไม่ใช่เนื้อหาหลัก
-------------------------------------------------------------------------- */
.mo-reviewer {
  border-left: 2px solid var(--c-accent);
  padding: var(--sp-1) 0 var(--sp-1) var(--sp-3);
  margin-bottom: var(--sp-4);
}
.mo-reviewer > * { margin: 0; }
.mo-reviewer__label {
  font-size: var(--fs-micro);
  letter-spacing: var(--ls-eyebrow);
  color: var(--c-accent-text);
  font-weight: var(--fw-strong);
}
.mo-reviewer__name { font-family: var(--font-display); font-size: var(--fs-h3); margin-top: .15em; }
.mo-reviewer__meta { font-size: var(--fs-small); color: var(--c-ink-soft); margin-top: .25em; }

/* --- จุดที่เราต่าง (การ์ดขาวใบเดียว แถวคั่นเส้น) --------------------------------
   ถอดโครงมาจากดีไซน์อ้างอิงที่เจ้าของเลือก 25 ส.ค. 2569
   ต้นแบบเป็นรายการคอร์สที่จองได้ มีคอลัมน์รูป เวลา ราคา และปุ่มจอง
   ของเราเป็นจุดเด่น 6 ข้อ ไม่มีสามอย่างหลัง จึงเอามาเฉพาะโครง
   การ์ดขาวใบเดียว แถวคั่นเส้นบาง เลขกำกับ แล้วเอาไอคอนไปวางตรงช่องที่ต้นแบบเป็นรูป

   ต่างจากของเดิมตรงที่เดิมเป็นกล่องแยก 6 ใบ ซึ่งบนพื้น navy อ่านเป็นก้อนหนัก 6 ก้อน
   ใบเดียวคลุมทั้งหมดเบากว่า และทำให้ 6 ข้อดูเป็นชุดเดียวกันจริง ๆ

   รูปไอคอนเก็บเป็นตัวแปรตรงนี้ ดูเหตุผลที่ต้องอยู่ใน CSS ได้ที่คอมเมนต์เดิม
   สรุปสั้น ๆ: WordPress กรอง svg ออกจากเนื้อหาหน้าทุกครั้งที่บันทึก
--------------------------------------------------------------------------- */
.mo-diffs {
  --mo-icon-spine: 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.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d=%22M12 3v18%22/%3E%3Cpath d=%22M9 6.5h6M9 10.5h6M9 14.5h6M9 18h6%22/%3E%3C/svg%3E");
  --mo-icon-assess: 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.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx=%2211%22 cy=%2211%22 r=%226%22/%3E%3Cpath d=%22m19.5 19.5-4.2-4.2%22/%3E%3C/svg%3E");
  --mo-icon-align: 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.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d=%22M12 3v18%22/%3E%3Cpath d=%22M5 8.5h5M14 15.5h5%22/%3E%3Ccircle cx=%2212%22 cy=%228.5%22 r=%221.4%22/%3E%3Ccircle cx=%2212%22 cy=%2215.5%22 r=%221.4%22/%3E%3C/svg%3E");
  --mo-icon-person: 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.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx=%2212%22 cy=%228%22 r=%223.5%22/%3E%3Cpath d=%22M5.5 20c0-3.6 2.9-6.5 6.5-6.5s6.5 2.9 6.5 6.5%22/%3E%3C/svg%3E");
  --mo-icon-explain: 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.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d=%22M20 5H4v11h5l3.5 3.5V16H20V5z%22/%3E%3Cpath d=%22M8 9h8M8 12h5%22/%3E%3C/svg%3E");
  --mo-icon-followup: 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.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d=%22M20 12a8 8 0 1 1-2.4-5.7%22/%3E%3Cpath d=%22M20 4.5V9h-4.5%22/%3E%3C/svg%3E");
  list-style: none;
  margin: 0;
  background: var(--c-surface);
  border-radius: var(--radius-card);
  overflow: hidden;

  /* --- เปลี่ยนจากตารางแถวเป็นการ์ด 2 คอลัมน์ 27 ส.ค. 2569 (เจ้าของบอกว่าดูแน่น) ---
     ของเดิมเป็น 6 แถวเรียงลงมา แถวละ 3 ช่อง `13rem 3rem 1fr` มีเส้นคั่นทุกแถว
     เสียสามอย่างพร้อมกัน
     · ช่องหัวข้อ 13rem แคบเกินสำหรับหัวข้อไทย ตัดกลางคำ ("กระดูกสัน / หลัง")
     · เส้นคั่นทุกแถวทำให้ตาอ่านออกมาเป็น "ตารางข้อมูล" ไม่ใช่จุดขายของคลินิก
     · ไอคอนไปแทรกกลางระหว่างหัวข้อกับคำอธิบาย ซึ่งไม่ได้ช่วยอะไรเลย

     24rem คือความกว้างต่ำสุดที่คำอธิบายไทยยังจบใน 3 บรรทัด ต่ำกว่านั้นให้ยุบเป็น
     คอลัมน์เดียว ผลจริง: 2 คอลัมน์ตั้งแต่ราว 900px ขึ้นไป · แถวเดียวที่แคบกว่านั้น */
  display: grid;
  /* min() ครอบไว้ด้วยเหตุผลเดียวกับ .mo-split — 24rem (384px) กว้างกว่าจอมือถือ
     พอหักระยะขอบแล้ว ถ้าไม่ครอบ การ์ดจะล้นออกนอกจอ (แก้ 28 ส.ค. 2569) */
  grid-template-columns: repeat(auto-fit, minmax(min(24rem, 100%), 1fr));
  gap: var(--sp-4) var(--sp-5);
  padding: var(--sp-4);
}

.mo-diff {
  display: grid;
  gap: var(--sp-2);
  align-content: start;
}

/* ไอคอนขึ้นไปอยู่บนสุดของการ์ด สั่งด้วย order เพื่อไม่ต้องไปแก้ HTML ที่บันทึกไว้แล้ว
   ในฐานข้อมูล — ไอคอนมี aria-hidden อยู่แล้ว การสลับที่จึงไม่กระทบโปรแกรมอ่านหน้าจอ */
.mo-diff__icon { order: -1; }

/* เลขกำกับ — เป็นดัชนีให้กวาดตา ไม่ใช่ลำดับขั้นตอน จึงตัวเล็กและจางกว่าหัวข้อ
   (ส่วน "ขั้นตอน" ใช้เลขวงกลมใหญ่ เพราะอันนั้นเป็นลำดับเวลาจริง ๆ) */
.mo-diff__num {
  display: block;
  margin: 0 0 var(--sp-1);
  font-family: var(--font-display);
  font-size: var(--fs-small);
  color: var(--c-accent-text);
  font-variant-numeric: tabular-nums;
}

.mo-diff__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: var(--fw-display);
  font-size: var(--fs-h3);
  line-height: var(--lh-tight);
  color: var(--c-ink);
}

/* ไอคอนอยู่ในวงกลมพื้นครีม ไม่ใช่เส้นลอย ๆ บนพื้นขาว
   ของเดิมเป็นเส้นบางบนพื้นขาวล้วน น้ำหนักเบาจนแทบไม่มีตัวตนในหน้า
   วงกลมทำให้แต่ละการ์ดมีจุดเริ่มที่ตาจับได้ก่อนอ่านตัวหนังสือ
   ต้องใช้ ::before ซ้อนอีกชั้น เพราะ mask กินพื้นหลังของตัวเองไปด้วย
   ใส่สีที่ span แล้ววงกลมจะหายไปพร้อมกับ mask */
.mo-diff__icon {
  width: 3rem;
  height: 3rem;
  border-radius: 50%;
  background: var(--c-canvas);
  display: grid;
  place-items: center;
}
.mo-diff__icon::before {
  content: "";
  width: 1.5rem;
  height: 1.5rem;
  background: var(--c-accent);
  -webkit-mask: var(--mo-icon-img) center / contain no-repeat;
  mask: var(--mo-icon-img) center / contain no-repeat;
}

/* คำอธิบายลดลงหนึ่งขั้นเป็น --fs-small ให้เท่ากับการ์ดอื่นในเว็บ
   ของเดิมเป็น --fs-body เท่าเนื้อหาหลัก ทั้งบล็อกจึงอ่านออกมาหนักและเยอะ
   ทั้งที่มันเป็นข้อความประกอบหัวข้อ ไม่ใช่เนื้อหาหลักของหน้า */
.mo-diff__desc {
  margin: 0;
  font-size: var(--fs-small);
  line-height: var(--lh-body);
  color: var(--c-ink-soft);
}

/* จอแคบ: ตารางยุบเหลือคอลัมน์เดียวเองอยู่แล้วจาก auto-fit
   เหลือแค่ลดระยะขอบของกล่องลง ไม่งั้นขอบ 40px กินความกว้างจอไปมากเกินไป */
@media (max-width: 860px) {
  .mo-diffs { padding: var(--sp-3); gap: var(--sp-4); }
}

/* จับคู่รูปกับข้อตามลำดับที่ปรากฏในหน้า
   **สลับลำดับข้อในหน้าจอแก้ไขแล้วไอคอนไม่ตามไปด้วย ต้องมาแก้เลขตรงนี้** */
.mo-diff:nth-child(1) { --mo-icon-img: var(--mo-icon-spine); }
.mo-diff:nth-child(2) { --mo-icon-img: var(--mo-icon-assess); }
.mo-diff:nth-child(3) { --mo-icon-img: var(--mo-icon-align); }
.mo-diff:nth-child(4) { --mo-icon-img: var(--mo-icon-person); }
.mo-diff:nth-child(5) { --mo-icon-img: var(--mo-icon-explain); }
.mo-diff:nth-child(6) { --mo-icon-img: var(--mo-icon-followup); }

/* --- section พื้นมืดที่มีภาพอยู่ข้างหลัง ------------------------------------------
   .mo-section--night เตรียมทางไว้ให้แล้วตั้งแต่แรก — มี background-size: cover
   กับชั้นไล่สี navy ทับข้างบน (::before) ซึ่งมีไว้กดภาพให้มืดพอสำหรับตัวหนังสือขาว
   ที่ผ่านมาแค่ยังไม่เคยมีใครใส่ภาพเข้าไป จึงเห็นเป็นพื้น navy เรียบ

   ต้องแยกเป็นคลาสต่างหาก ไม่ใส่รวมใน --night เพราะหน้าแรกมี section พื้นมืดหลายอัน
   ถ้าใส่รวมจะได้ภาพเดียวกันหมดทุกอัน ดูซ้ำทันที

   ภาพคือ section-diffs.webp 1920x960 ภาพบรรยากาศในคลินิกแบบเบลอหนัก โทนกรมท่า
   เจ้าของส่งมาเอง (25 ส.ค. 2569) สัดส่วน 2:1 ตรงกับสัดส่วนของ section พอดี
   cover จึงแทบไม่ครอปทิ้ง

   เปลี่ยนภาพทีหลังแก้แค่บรรทัด --mo-section-img บรรทัดเดียว
--------------------------------------------------------------------------- */
.mo-section--photo {
  --mo-section-img: url("../images/section-diffs.webp");
  background-image: var(--mo-section-img);
  background-position: center;
  background-repeat: no-repeat;
}

/* ชั้นทับของ --night ตั้งไว้ที่ .86-.94 ซึ่งเผื่อไว้สำหรับภาพถ่ายที่อาจมีจุดสว่างจัด
   ภาพใบนี้ไม่ใช่แบบนั้น — เบลอหนักและจุดที่สว่างที่สุดทั้งใบยังเป็นเทาอมฟ้า #7f8490
   ทับหนาขนาดนั้นภาพจะหายไปเลย จ่ายน้ำหนักไฟล์ฟรี ๆ จึงผ่อนลงมาเฉพาะ section นี้

   ผ่อนแบบไม่เท่ากันทั้ง section เพราะตัวหนังสือไม่ได้อยู่ทั้ง section
   ใน pattern moveon/why-us มีตัวหนังสืออ่อนบนพื้นมืดแค่สองชิ้น คือ chip กับ h2
   ซึ่งอยู่บนสุดทั้งคู่ ที่เหลือข้างล่างเป็นการ์ด .mo-diffs พื้นขาวทึบ
   ภาพข้างหลังการ์ดจึงโผล่ได้เต็มที่โดยไม่กระทบการอ่านเลย

   ครึ่งบนจึงยังทับหนา .80-.76 (วัดกับภาพใบปัจจุบันแล้ว หัวข้อได้คอนทราสต์ 11.7:1
   ตัวหนังสืออ่อนใน .mo-head ได้ 8.1:1 ผ่าน AAA ทั้งคู่)
   แล้วเปิดออกเป็น .34-.26 ตั้งแต่ระดับที่การ์ดเริ่ม

   จุดเปลี่ยนวัดเป็น rem ไม่ใช่ % ตั้งใจ — % จะขยับตามความสูงของ section
   ซึ่งบนมือถือสูงกว่าเดสก์ท็อปเท่าตัวเพราะหัวข้อตัดบรรทัดเพิ่ม
   หน่วย rem ยึดกับความสูงของตัวหนังสือจริง จุดเปลี่ยนจึงอยู่ใต้หัวข้อเสมอทุกจอ

   เปลี่ยนเป็นภาพที่สว่างกว่านี้เมื่อไหร่ ต้องวัดคอนทราสต์ใหม่
   หรือถอยกลับไปใช้ค่าของ --night */
.mo-section--photo::before {
  background: linear-gradient(180deg,
    rgba(19,32,53,.80) 0,
    rgba(19,32,53,.76) 22rem,
    rgba(19,32,53,.34) 30rem,
    rgba(19,32,53,.26) 100%);
}

/* ==========================================================================
   สกิน v2 — ตาม Designv2.md

   **เป็นสกินซ้อน ไม่ได้แก้ของเดิม** ทุกอย่างในนี้ผูกกับคลาส `.mo-v2` ที่ body
   หน้าที่ไม่มีคลาสนี้ใช้ค่าเดิมทุกตัว ไม่กระทบกันเลย

   ทำได้เพราะทั้งธีมดึงค่าจาก custom property หมด ตั้งค่าใหม่ที่ระดับ body
   ค่าจึงไหลลงไปทุก component โดยไม่ต้องไล่เขียนทับทีละกฎ

   ตัวที่ตั้งใจ **ไม่** ทำตามสเปก มีข้อเดียว: น้ำหนักตัวอักษรเนื้อหา
   สเปกเขียนว่า Noto Sans Thai 300–400 แต่ไฟล์ฟอนต์ที่ self-host ไว้ประกาศช่วง
   400–600 น้ำหนัก 300 จึงไม่มีอยู่จริง เบราว์เซอร์จะสังเคราะห์ให้บางเอง
   ซึ่งกับตัวไทยจะได้เส้นแหว่ง ต้องโหลดไฟล์ช่วงกว้างกว่านี้ก่อนถึงจะทำได้จริง
   ========================================================================== */
/* --- ค่าของสกิน v2 ย้ายไปเป็นค่ากลางแล้ว (24 ก.ย. 2569) --------------------
   เดิมตรงนี้คือบล็อก `.mo-v2 { ... }` ที่ประกาศ custom property ทับ 13 ตัว
   ให้มีผลเฉพาะหน้าแรก — มุมโค้ง 4 ตัว · ตัวอักษร 3 ตัว · ความกว้าง 4 ตัว ·
   ระยะ section · ขนาดหัวข้อ 2 ตัว

   เจ้าของสั่งให้ทั้งเว็บใช้ดีไซน์ v2 จึงย้ายทั้ง 13 ค่าไปไว้ที่ `:root`
   ใน `tokens.css` แล้วลบบล็อกนี้ทิ้ง **ไม่ได้แค่ถอด .mo-v2 ออกแล้วปล่อยไว้ที่เดิม**
   เพราะค่าพวกนี้เป็น token ซึ่งตามกฎของโปรเจกต์ต้องอยู่ใน tokens.css ที่เดียว

   **ตอนนี้ไม่มีค่าไหนของ v2 ซ่อนอยู่ใน components.css อีกแล้ว**
   อยากย้อนหน้าตากลับ ให้แก้ที่ tokens.css จุดเดียว ค่าเก่าเขียนกำกับไว้ท้ายบรรทัด
---------------------------------------------------------------------------- */


/* พื้นเข้มที่สุด #0b1524 ใช้แยกชั้นจาก #132035 (สเปกข้อ 1)
   สเปกให้ใช้กับ footer และช่วงขั้นตอน — ใช้ token --c-brand-dark ที่มีอยู่แล้ว
   ไม่ได้เพิ่มสีใหม่เข้าพาเลตต์ */
/* **ถอด .mo-v2 ออกเมื่อ 24 ก.ย. 2569 ให้ใช้ทั้งเว็บ**
   (สีท้ายเว็บย้ายไปแก้ที่กฎเดิมในหมวด Footer แล้ว ไม่ได้เขียนทับซ้อนไว้ที่นี่)

   `.mo-section--deep` ตรวจแล้วมีใช้แค่หน้าแรกกับหน้าทดลอง (นับจากฐานข้อมูล
   ได้ 0 ครั้งในอีก 13 หน้า) ปลดออกมาจึงไม่กระทบหน้าไหน แต่ทำให้ช่วงพื้นเข้มสุด
   กลายเป็น component ที่หยิบไปใช้หน้าอื่นได้ ไม่ใช่ของเฉพาะหน้าแรก */
.mo-section--deep { background: var(--c-brand-dark); color: rgba(251,250,248,.85); }
.mo-section--deep :where(h2, h3) { color: var(--c-ink-invert); }
.mo-section--deep .mo-steps { --mo-step-line: var(--c-accent-light); }

/* ==========================================================================
   สกิน v2 — โครงหน้า (2 ก.ย. 2569)

   รอบแรกทำแค่ "เปลี่ยนผิว" (สี มุมโค้ง ระยะห่าง) แล้วเจ้าของบอกว่าดูเหมือนของเดิม
   ถูกต้องแล้ว เพราะ Designv2.md มีแต่ระบบดีไซน์ ไม่ได้บอกโครงแต่ละ section
   พอได้มอคอัพจริงมาถึงเห็นว่า **โครงต่างกันเกือบทุกช่วง** ไม่ใช่แค่ผิว

   ทุกคลาสในบล็อกนี้ขึ้นต้น .mo-v2- และใช้เฉพาะหน้า /home-v2/ เท่านั้น
   หน้าแรกจริงไม่ได้ใช้สักตัว
   ========================================================================== */

/* --- ฮีโร่: โทนสว่าง ภาพเต็มความกว้างจอ (แบบเดียวกับ .mo-hero--light ของ v1) ---
   เจ้าของสั่ง 2 ก.ย. 2569 ให้เลิกใช้พื้นกรมท่า เปลี่ยนเป็นโทนสว่างทั้งแถบ

   ภาพ hero-spine.webp ถ่ายมาบนพื้นสว่างอยู่แล้ว เอามาวางบนพื้นสว่างจึงกลืนกันพอดี
   ไม่มีรอยต่อของกรอบให้เห็น -- ตรงข้ามกับตอนเป็นพื้นกรมท่าซึ่งต้องใช้ม่านทึบทับ
   ถึงจะกลบพื้นสว่างของภาพได้

   ยึดภาพไว้ที่ขอบขวาเพราะตัวคนอยู่ขวา ส่วนที่ถูกตัดตอนจอแคบคือพื้นว่างทางซ้าย

   **section ถัดไปต้องเป็น --tint** ไม่งั้นสว่างชนสว่างแล้วบอกไม่ได้ว่า section จบตรงไหน
   (กฎเดียวกับที่ .mo-hero--light เขียนกำกับไว้) */
.mo-v2-hero {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  color: var(--c-ink);
  background-color: var(--c-surface);
  /* ม่านสองชั้นเป็นสีพื้น ไม่ใช่สีเข้ม -- ชั้นแรกไล่จากล่างขึ้นรองแถบตัวเลข
     ชั้นสองไล่จากซ้ายให้ตัวหนังสืออ่านออก ทั้งคู่จางไปหาภาพ ไม่ได้ทับให้มืด */
  /* ม่านสามชั้น ทุกชั้นเป็นสีพื้น ไม่ใช่สีเข้ม -- จางไปหาภาพ ไม่ได้ทับให้มืด
     1. จากบนลง รองแถบหัวเว็บ **เพิ่มเมื่อ 2 ก.ย. 2569 ตอนย้ายเมนูไปชิดขวา**
        เมนูเดิมอยู่กลางจอซึ่งเป็นพื้นเรียบ พอย้ายไปขวามันไปนั่งบนภาพ
        วัดแล้วตัวหนังสือเมนูเหลือ 4.57:1 ซึ่งผ่านเกณฑ์แบบเฉียด
        และจะพังทันทีถ้าวันหลังเปลี่ยนรูปฮีโร่เป็นใบที่มืดกว่านี้
     2. จากล่างขึ้น รองแถบตัวเลข (เหตุผลเดียวกัน วัดได้ 4.73:1 ก่อนใส่)
     3. จากซ้าย ให้ตัวหนังสือในฮีโร่อ่านออก */
  background-image:
    linear-gradient(to bottom, rgba(251, 250, 248, .88) 0, rgba(251, 250, 248, 0) 24%),
    linear-gradient(to top, rgba(251, 250, 248, .96) 0, rgba(251, 250, 248, 0) 34%),
    linear-gradient(100deg, rgba(251, 250, 248, .96) 30%, rgba(251, 250, 248, .10) 80%),
    url("../images/hero-spine.webp");
  background-repeat: no-repeat, no-repeat, no-repeat, no-repeat;
  background-position: center, center, center, right center;
  background-size: cover, cover, cover, cover;
}
/* วงแหวนบางสองวงมุมขวา เป็นของตกแต่งล้วน
   ใช้ทองแดงเข้มไม่ใช่ทองอ่อน เพราะพื้นเปลี่ยนเป็นสว่างแล้ว ทองอ่อนจะจางจนหายไป */
.mo-v2-hero::before,
.mo-v2-hero::after {
  content: ""; position: absolute; z-index: -1; border-radius: 50%;
  border: 1px solid rgba(122, 92, 54, .14);
}
.mo-v2-hero::before { top: -140px; right: -120px; width: 620px; height: 620px; }
.mo-v2-hero::after  { bottom: -260px; right: 180px; width: 520px; height: 520px; }

/* คุมความกว้างกล่องข้อความด้วย token ตัวเดียวกับ v1 จะได้ไม่มีเลขความกว้างสองชุด
   คุมเฉพาะจอ 861px ขึ้นไป ซึ่งเป็นช่วงที่ยังมีภาพอยู่ทางขวา */
@media (min-width: 861px) {
  .mo-v2-hero__text { max-width: var(--hero-text-width); }
}

/* จอแคบตัดภาพออก เหตุผลเดียวกับ .mo-hero--light ของ v1
   ภาพแนวนอน 2.33:1 ถูกขยายจนตัวคนหลุดออกนอกจอ เหลือแต่พื้นเทา
   และไม่ต้องโหลดไฟล์ทิ้งเปล่าบนเครื่องที่เน็ตช้าที่สุด
   **เลข 860 ต้องตรงกับ media ใน preload ที่ functions.php** แก้ที่หนึ่งต้องแก้อีกที่ */
@media (max-width: 860px) {
  .mo-v2-hero { background-image: none; }
}

/* รูปคนในช่วง "เกี่ยวกับเรา" -- เดิมใช้คลาสร่วมกับรูปฮีโร่
   พอฮีโร่เปลี่ยนไปใช้ภาพพื้นหลังแล้ว แยกออกมาเป็นคลาสของตัวเองจะได้ไม่พันกัน */
.mo-v2-portrait { min-height: clamp(18rem, 24vw, 24rem); }
.mo-v2-portrait img {
  width: 100%; height: 100%; object-fit: cover; display: block;
}

.mo-v2-kicker {
  display: flex; align-items: center; gap: .8em;
  font-size: var(--fs-micro); letter-spacing: var(--ls-eyebrow);
  /* ทองเข้ม ไม่ใช่ทองอ่อน -- ทองอ่อนมีไว้สำหรับพื้นเข้ม บนพื้นสว่างได้แค่ 2.3:1 */
  color: var(--c-accent-text); margin: 0 0 var(--sp-2);
}
.mo-v2-kicker::before {
  content: ""; width: 42px; height: 1px; background: var(--c-accent); flex: none;
}

/* แถบตัวเลข 4 ช่อง มีเส้นคั่นแนวตั้ง ไม่ใช่การ์ดแยกใบ */
/* แถบตัวเลขเปลี่ยนจาก "เส้นคั่นแนวตั้ง" เป็น "3 กล่องโปร่งแสง" (3 ก.ย. 2569)
   ของเดิมเป็นเส้นคาดยาวเต็มความกว้าง ซึ่งอ่านเป็นตารางมากกว่าเป็นจุดเด่นสามข้อ
   กล่องโปร่งแสงวางบนภาพได้โดยยังเห็นภาพลอดผ่าน แต่ตัวหนังสือยังอ่านออก

   **ตั้งพื้นเป็นสีครีมโปร่ง ไม่ใช่ขาวโปร่ง** เพราะพาเลตต์ไม่มีขาวล้วน
   และวางบนภาพที่อมเทา ขาวโปร่งจะเห็นเป็นแผ่นเทาซีด ไม่เข้ากับพื้นครีมของหน้า */
.mo-v2-stats {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(12rem, 100%), 1fr));
  gap: var(--sp-2);
  margin-top: var(--sp-4);
}
.mo-v2-stats > div {
  padding: var(--sp-3);
  /* .82 ไม่ใช่ .72 -- วัดที่ .72 แล้วป้ายเล็กสีทองเข้มได้ contrast 4.52:1
     ซึ่งผ่านเกณฑ์แบบเฉียดจนไม่เหลือที่ให้พลาด ถ้าเปลี่ยนรูปฮีโร่เป็นใบที่มืดกว่านี้จะตกทันที
     ที่ .82 ยังเห็นภาพลอดผ่านชัดเจน ไม่ได้กลายเป็นกล่องทึบ */
  background: rgba(251, 250, 248, .82);
  border: 1px solid rgba(227, 217, 203, .8);
  border-radius: var(--radius-card);
}
.mo-v2-stats b {
  display: block; font-size: var(--fs-micro); font-weight: 400;
  letter-spacing: .1em; color: var(--c-accent-text); margin-bottom: .35em;
}
.mo-v2-stats span {
  font-family: var(--font-display); font-size: var(--fs-h3);
  color: var(--c-ink); line-height: var(--lh-tight);
}

/* --- กล่องสรุปพื้นครีมมีเส้นทองคาดซ้าย (ใช้ในช่วงเช็กอาการ) --- */
.mo-v2-callout {
  background: var(--c-canvas); border-left: 2px solid var(--c-accent);
  padding: var(--sp-3);
}
.mo-v2-callout p { margin: 0 0 var(--sp-2); }

/* --- การ์ดเช็กอาการ 2 คอลัมน์ รูปอยู่บน เลขอยู่หน้าข้อความ --- */
.mo-v2-checks {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(min(13rem, 100%), 1fr));
  gap: var(--sp-2); list-style: none; padding: 0; margin: 0;
}
.mo-v2-checks li {
  background: var(--c-surface); border: 1px solid var(--c-line);
  padding: var(--sp-2); display: flex; flex-direction: column; gap: var(--sp-2);
}
.mo-v2-checks img {
  width: 100%; height: 7rem; object-fit: contain;
  background: var(--c-canvas); display: block;
}
.mo-v2-checks__row { display: flex; gap: .7em; align-items: flex-start; }
.mo-v2-checks b {
  font-family: var(--font-display); font-size: var(--fs-lead);
  color: var(--c-accent-text); font-weight: 400; line-height: 1.1; flex: none;
}
.mo-v2-checks span { font-size: var(--fs-small); line-height: var(--lh-tight); }

/* --- แถบบริการหลัก: กล่องเข้มเต็มความกว้าง ข้อความซ้าย รูปขวา --- */
.mo-v2-banner {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(min(22rem, 100%), 1fr));
  background: var(--c-brand); color: var(--c-ink-invert); margin-bottom: var(--sp-3);
}
.mo-v2-banner__text {
  padding: clamp(var(--sp-4), 4vw, var(--sp-5));
  display: flex; flex-direction: column;
  justify-content: center; gap: var(--sp-2);
  /* --- ลายวงแหวนในพื้นหลัง (2 ก.ย. 2569) ---------------------------------
     เจ้าของบอกว่าพื้นกรมท่าเรียบ ๆ ดูไม่มีอะไร
     ใช้วงแหวนบางซ้อนกันจากมุมล่างซ้าย ซึ่งเป็น **ลายเดิมที่ฮีโร่ใช้อยู่แล้ว**
     จึงเป็นการย้ำลายประจำหน้า ไม่ใช่เพิ่มของตกแต่งชิ้นใหม่ที่ไม่เกี่ยวกัน

     จงใจไม่ใส่แสงเรืองสีทองทับ เพราะปุ่มในกล่องนี้เป็นสีทอง
     แสงทองข้างหลังจะทำให้ขอบปุ่มละลายไปกับพื้น
     เป็นเส้นวงแหวนล้วนจึงไม่กินความชัดของปุ่ม */
  position: relative;
  overflow: hidden;
  background-image:
    repeating-radial-gradient(circle at 6% 94%,
      transparent 0 57px,
      rgba(196, 166, 127, .11) 57px 58px);
}
.mo-v2-banner__tag {
  align-self: flex-start; font-size: var(--fs-micro); letter-spacing: .2em;
  color: var(--c-brand-dark); background: var(--c-accent-light); padding: .4em .9em;
}
/* ตัวหนังสือใหญ่ขึ้นตามที่เจ้าของขอ -- เดิม h3 ได้ 22px ในกล่องสูง 784px
   ซึ่งเล็กเกินกว่าจะถือว่าเป็นบริการหลักของคลินิก ตอนนี้ใช้ขนาดเดียวกับหัวข้อ section */
.mo-v2-banner h3 {
  color: var(--c-ink-invert);
  margin: 0;
  font-size: var(--fs-h2);
  line-height: var(--lh-tight);
}
.mo-v2-banner p {
  margin: 0;
  color: rgba(251, 250, 248, .82);
  font-size: var(--fs-lead);
  max-width: 30rem;   /* คุมความยาวบรรทัด ไม่ใช่คุมความกว้างกล่อง */
}
/* max-height เป็นตัวคุมความสูงของทั้งแถบ -- รูปต้นฉบับเป็นแนวตั้ง พอกว้าง 588px
   ความสูงตามสัดส่วนจึงกลายเป็น 784px แล้วลากให้ฝั่งข้อความสูงตาม
   เหลือพื้นกรมท่าว่าง ๆ เกือบ 600px ซึ่งคือต้นเหตุที่กล่องนี้ดูโล่ง */
.mo-v2-banner img {
  width: 100%; height: 100%; object-fit: cover; display: block;
  min-height: 18rem;
  max-height: clamp(22rem, 34vw, 30rem);
}

/* --- การ์ดบริการ: แถบเลื่อนแนวนอน (แก้ 3 ก.ย. 2569) ---------------------
   ของเดิมเป็นตะแกรง `repeat(auto-fit, minmax(18rem, 1fr))` ซึ่งพังกับจำนวน 5 ใบ
   ที่กรอบ 1240px ได้ 4 คอลัมน์ ของ 5 ใบจึงเรียง 4+1 แล้วเหลือช่องว่างครีมโล่ง
   ท้ายแถวสองสามช่อง อ่านเป็น "วางพลาด" ไม่ใช่ดีไซน์
   (กับดักเดียวกับ .mo-v2-grid3 และ .mo-checklist--two มาแล้วสองรอบ)

   เปลี่ยนเป็นแถบเลื่อนแทน จำนวนใบเท่าไหร่ก็ไม่มีแถวที่สองให้โล่งอีก
   **ทำด้วย CSS ล้วน ไม่มี JS** ตามกฎห้ามพึ่งไลบรารี — ใช้ scroll-snap
   ซึ่งเลื่อนได้ทั้งนิ้วปัด ล้อเมาส์แนวนอน และแถบเลื่อน
   คนใช้คีย์บอร์ดกด Tab ไล่ลิงก์ในการ์ด เบราว์เซอร์จะเลื่อนให้เองทีละใบ

   ความกว้างการ์ดเป็น clamp ไม่ใช่ 1fr เพราะในกล่องที่ล้นได้ `1fr` จะเท่ากับ
   ความกว้างกล่องพอดี กลายเป็นการ์ดใบเดียวเต็มจอทุกขนาด
   ค่านี้ทำให้เห็นการ์ดใบถัดไปโผล่มาครึ่งใบเสมอ ซึ่งเป็นสัญญาณว่า "เลื่อนได้" */
.mo-v2-cards {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: clamp(15rem, 24vw, 20rem);
  gap: var(--sp-3); list-style: none; padding: 0; margin: 0;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  overscroll-behavior-x: contain;
  padding-bottom: var(--sp-2);   /* เว้นที่ให้แถบเลื่อน ไม่ให้ทับขอบการ์ด */
  scrollbar-width: thin;
  scrollbar-color: var(--c-accent-light) transparent;
}
.mo-v2-cards > li { scroll-snap-align: start; }

.mo-v2-cards::-webkit-scrollbar { height: 6px; }
.mo-v2-cards::-webkit-scrollbar-track { background: var(--c-line); border-radius: var(--radius-pill); }
.mo-v2-cards::-webkit-scrollbar-thumb { background: var(--c-accent-light); border-radius: var(--radius-pill); }

/* เครื่องที่ตั้งค่า "ลดการเคลื่อนไหว" ไม่ควรโดนหน้าเลื่อนเองตอนกด Tab */
@media (prefers-reduced-motion: reduce) {
  .mo-v2-cards { scroll-behavior: auto; }
}
.mo-v2-cards li {
  background: var(--c-surface); border: 1px solid var(--c-line);
  display: flex; flex-direction: column;
}
.mo-v2-cards li:hover { border-color: var(--c-accent); }
/* --- กรอบรูปการ์ดบริการ (แก้ 2 ก.ย. 2569) --------------------------------
   ของเดิมสั่งความสูงตายตัว 11rem ที่จอ 1440 การ์ดกว้าง 376px กรอบจึงเป็น
   แถบนอนอัตราส่วน 2.13 **แต่รูปต้นฉบับทั้ง 6 ใบเป็นแนวตั้ง 3:4 (800x1067)**
   object-fit: cover จึงตัดความสูงทิ้งไปราว 65% เหลือเห็นแค่แถบกลางภาพ
   คนดูเลยแยกไม่ออกว่าการ์ดไหนคือบริการอะไร

   เปลี่ยนมาใช้สัดส่วนแทนความสูงตายตัว และรูปโตตามความกว้างการ์ดเองทุกขนาดจอ
   **เปลี่ยนรูปชุดนี้เป็นแนวนอนเมื่อไหร่ ต้องกลับมาแก้สัดส่วนตรงนี้**

   *แก้ 3 ก.ย. 2569 — จาก 4:5 เป็น 1:1 (เจ้าของขอลองดู)*
   ต้นฉบับเป็น 3:4 จัตุรัสจึงตัดความสูงทิ้งราว 25% (4:5 ตัดราว 6%)
   ยังเหลือเห็นตัวแบบครบเพราะคนอยู่กลางภาพทั้ง 5 ใบ
   ผลข้างเคียงที่ตั้งใจ: การ์ดเตี้ยลง แถบเลื่อนจึงดูเป็นแถบเดียวกันมากขึ้น */
.mo-v2-cards img {
  width: 100%;
  aspect-ratio: 1 / 1;
  height: auto;
  object-fit: cover;
  display: block;
}
.mo-v2-cards__body {
  padding: var(--sp-3); display: flex; flex-direction: column;
  gap: .7em; flex: 1;
}
.mo-v2-cards h3 { margin: 0; font-size: var(--fs-h3); }
.mo-v2-cards p { margin: 0; font-size: var(--fs-small); color: var(--c-ink-soft); }
.mo-v2-cards__more {
  margin-top: auto; padding-top: .6em; font-size: var(--fs-small); color: var(--c-accent-text);
}

/* --- ตะแกรง 3 คอลัมน์ที่ใช้ "ช่องว่าง 1px" ทำเส้นตาราง (ช่วงจุดที่เราต่าง) ---
   เส้นตารางเกิดจากพื้นหลังของตะแกรงโผล่ผ่านร่อง 1px ไม่ได้วาดเส้นทีละใบ
   จึงไม่มีเส้นซ้อนกันสองชั้นตรงรอยต่อ */
/* 21rem ไม่ใช่ 17rem — ที่กรอบ 1240px ค่า 17rem ได้ 4 คอลัมน์ ของ 6 ข้อจึงเรียง 4+2
   แล้วเหลือช่องว่างสีครีมโล่ง ๆ ท้ายแถวสอง ซึ่งอ่านเป็น "วางพลาด" ไม่ใช่ดีไซน์
   (กับดักเดียวกับ .mo-checklist--two เมื่อ 1 ก.ย. 2569) 21rem บังคับให้ได้ 3+3 พอดี */
.mo-v2-grid3 {
  /* 19rem ไม่ใช่ 21rem -- ช่วงนี้ย้ายไปกรอบแคบ 1040px เมื่อ 3 ก.ย. 2569
     ที่ 21rem มันจะหล่นจาก 3 คอลัมน์เหลือ 2 แล้วของ 6 ข้อจะเรียงเป็น 2+2+2
     ซึ่งเสียโครงเดิมที่ตั้งใจให้เป็น 3+3 */
  display: grid; grid-template-columns: repeat(auto-fit, minmax(min(19rem, 100%), 1fr));
  gap: 1px; background: rgba(122, 92, 54, .26);
  list-style: none; padding: 0; margin: 0;
}
/* ช่องในตะแกรงต้องเป็น *สีเดียวกับพื้น section* เส้นตารางถึงจะเป็นเส้นบางเส้นเดียว
   ไม่ใช่กล่องหลายใบวางเรียงกัน -- ช่วงนี้ย้ายจากพื้นครีมมาเป็นพื้น paper
   เมื่อ 2 ก.ย. 2569 (ตอนสลับลำดับสีให้ช่วงเกี่ยวกับเราเป็นสว่างได้) จึงต้องเปลี่ยนตาม
   **ย้ายช่วงนี้ไปพื้นสีอื่นเมื่อไหร่ ต้องแก้บรรทัดนี้ด้วยทุกครั้ง** */
.mo-v2-grid3 li { background: var(--c-surface); padding: var(--sp-3); }
.mo-v2-grid3 b {
  display: block; font-family: var(--font-display); font-size: var(--fs-h2);
  font-weight: 400; color: var(--c-accent); line-height: 1; margin-bottom: var(--sp-2);
}
.mo-v2-grid3 h3 { margin: 0 0 .5em; font-size: var(--fs-h3); }
.mo-v2-grid3 p { margin: 0; font-size: var(--fs-small); color: var(--c-ink-soft); }

/* --- ขั้นตอน 4 คอลัมน์เรียงข้าง มีเส้นคาดหัวแทนวงกลมเลข --- */
.mo-v2-steps {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr));
  gap: var(--sp-3); list-style: none; padding: 0; margin: 0;
}
.mo-v2-steps li {
  border-top: 1px solid rgba(196, 166, 127, .4); padding-top: var(--sp-3);
}
.mo-v2-steps b {
  display: block; font-family: var(--font-display); font-size: var(--fs-micro);
  font-weight: 400; letter-spacing: .24em; color: var(--c-accent-light);
  margin-bottom: var(--sp-2);
}
.mo-v2-steps h3 { margin: 0 0 .5em; font-size: var(--fs-h3); color: var(--c-ink-invert); }
.mo-v2-steps p { margin: 0; font-size: var(--fs-small); color: rgba(251, 250, 248, .7); }

/* --- ทีม 3 ช่อง ---
   **28 ก.ย. 2569: min 16rem → 13rem** ที่จอ 768 ของเดิมได้ 2 คอลัมน์ การ์ด 3 ใบจึงเรียง 2+1
   คนที่ 3 อยู่แถวล่างคนเดียว (กับดัก auto-fit เลขคี่เดิม) · 13rem ให้ 3 ใบแถวเดียวที่ 768
   และยังเป็น 1 คอลัมน์ที่ 375 · เพิ่มคนที่ 4 เมื่อไหร่ต้องมาดูค่านี้ใหม่ */
.mo-v2-team {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(min(13rem, 100%), 1fr));
  gap: var(--sp-3); list-style: none; padding: 0; margin: 0;
}
.mo-v2-team li { background: var(--c-surface); border: 1px solid var(--c-line); }
/* สัดส่วนแทนความสูงตายตัว -- ไฟล์ต้นฉบับเป็น 800x1000 คือ 4:5 พอดี
   ของเดิมสั่ง height: 20rem ที่จอ 1440 การ์ดกว้าง 376px กรอบจึงเป็น 1.18
   ตัดภาพทิ้งไปราว 32% หัวกับไหล่เลยโดนเฉือน (บั๊กเดียวกับการ์ดบริการ)
   **หน้าแรกจริงกับหน้า about ไม่เจอปัญหานี้** เพราะ .mo-person ใช้ aspect-ratio อยู่แล้ว
   พลาดเฉพาะตอนเขียนคลาสของ v2 ขึ้นมาใหม่ */
.mo-v2-team img {
  width: 100%;
  aspect-ratio: 4 / 5;
  height: auto;
  object-fit: cover;
  display: block;
}
.mo-v2-team__body { padding: var(--sp-3); }
/* **28 ก.ย. 2569** — ตัวหนังสือในการ์ดไม่เคยถูกจัดรูปแบบ ชื่อ ตำแหน่ง และเลขใบประกอบวิชาชีพ
   จึงขนาดเท่ากันและห่างกันตามระยะย่อหน้าปกติ ชื่อไม่เด่นกว่าบรรทัดอื่นเลย (เห็นตอนทำหน้า /our-team/)
   → ใช้ขนาดชุดเดียวกับ .mo-person ของหน้าเกี่ยวกับเรา: ชื่อตัวหัวข้อ ที่เหลือตัวเล็กสีรอง */
.mo-v2-team__body p { margin: 0; font-size: var(--fs-small); color: var(--c-ink-soft); }
.mo-v2-team__body p:first-child {
  font-family: var(--font-display); font-size: var(--fs-h3);
  color: var(--c-ink); margin-bottom: var(--sp-1);
}
.mo-v2-team__body p:last-child { font-variant-numeric: tabular-nums; }
/* ความแรงเท่ากับกฎชื่อข้างบน (0-2-1) ชนะด้วยลำดับ — ป้ายรอชื่อต้องยังจางอยู่
   ไม่งั้นอ่านเป็นชื่อจริงคนหนึ่ง */
.mo-v2-team__body p.mo-pending { color: var(--c-ink-soft); }
/* ช่องเส้นประเลิกใช้แล้วเมื่อ 2 ก.ย. 2569 -- เจ้าของแจ้งว่ามีนักกายภาพบำบัด 3 คนจริง
   ใบที่สามจึงเป็นการ์ดปกติ ไม่ใช่ช่องรอ **เก็บกฎไว้เผื่อต้องใช้ช่องรอที่อื่น**
   ถ้าไม่มีใครหยิบไปใช้ภายในรอบหน้า ลบทิ้งได้ */
.mo-v2-team__wait {
  border: 1px dashed var(--c-accent-light); background: none;
  display: flex; flex-direction: column; justify-content: center;
  gap: var(--sp-3); padding: var(--sp-4);
}

/* --- ช่วงติดต่อ: อยู่ในกรอบ ไม่เต็มจอ ตารางซ้าย ฟอร์ม+แผนที่ขวา --- */
.mo-v2-contact {
  list-style: none; padding: 0; margin: 0;
  border-top: 1px solid rgba(196, 166, 127, .3);
}
.mo-v2-contact li {
  display: grid; grid-template-columns: minmax(min(9rem, 40%), 150px) 1fr; gap: var(--sp-2);
  padding: .9em 0; border-bottom: 1px solid rgba(196, 166, 127, .2);
}
.mo-v2-contact span { font-size: var(--fs-small); letter-spacing: .08em; color: var(--c-accent-light); }
.mo-v2-contact b,
.mo-v2-contact a { color: var(--c-ink-invert); font-weight: 400; }
.mo-v2-contact a { text-decoration: underline; text-underline-offset: .25em; }
/* กล่องฟอร์มเปลี่ยนจาก "พื้นเข้มโปร่ง" เป็น "การ์ดพื้นสว่าง" (3 ก.ย. 2569)
   ของเดิมเป็นกรอบจาง ๆ บนพื้นกรมท่า ซึ่งอ่านเป็นแบบฟอร์มราชการมากกว่าเป็นการ์ด
   และทำให้ต้องไปกลับสีตัวหนังสือของ Fluent Forms ทีละจุดเพื่อให้อ่านออก

   พอเป็นการ์ดสว่างบนแถบ navy มันเด่นขึ้นมาเองโดยไม่ต้องตกแต่งอะไรเพิ่ม
   **และสไตล์ฟอร์มทั้งชุดกลับไปทำงานตามที่ออกแบบไว้แต่แรก** ซึ่ง scope ไว้ที่
   .mo-formcard บนสมมติฐานว่าพื้นสว่างอยู่แล้ว -- ลบกฎกลับสีทิ้งได้ทั้งหมด */
.mo-v2-formbox {
  background: var(--c-surface);
  border: 1px solid var(--c-line);
  padding: clamp(var(--sp-3), 2.4vw, var(--sp-4));
  /* กล่องนี้ถูกยืดให้สูงเท่าคอลัมน์ซ้าย (ตาราง+ปุ่ม+แผนที่) ซึ่งสูงกว่าตัวฟอร์ม
     ถ้าไม่จัดกึ่งกลาง จะเหลือพื้นขาวว่างค้างท้ายการ์ดราวร้อยพิกเซล */
  display: flex;
  flex-direction: column;
  justify-content: center;
}
.mo-v2-formbox .mo-formcard { background: none; padding: 0; }

/* ตัวฟอร์มมีกรอบของตัวเองอยู่แล้ว พอมาอยู่ในการ์ดจะกลายเป็นกรอบสองชั้นซ้อนกัน */
.mo-v2-formbox .mo-formcard .frm-fluent-form {
  border: 0;
  border-radius: 0;
  padding: 0;
}

/* ช่องกรอกใช้พื้นครีม ไม่ใช่พื้นขาว -- บนการ์ดสีขาวนวล ช่องพื้นขาวจะจมหายไป
   เห็นแค่เส้นกรอบบาง ๆ ซึ่งบอกไม่ชัดว่าตรงไหนคือช่องให้พิมพ์ */
.mo-v2-formbox :where(input, textarea, select):not([type="checkbox"]):not([type="radio"]) {
  background: var(--c-canvas);
  padding: .85em 1em;
}
.mo-v2-formbox :where(input, textarea, select):focus-visible {
  outline: 2px solid var(--c-accent);
  outline-offset: 1px;
  background: var(--c-surface);
}

/* ป้ายชื่อช่องอ่านง่ายขึ้น ของเดิมเป็นตัวจิ๋วกางตัวอักษรกว้างแบบ eyebrow
   ซึ่งเหมาะกับหัวข้อกำกับ ไม่เหมาะกับป้ายที่คนต้องอ่านเพื่อกรอกให้ถูก */
.mo-v2-formbox .mo-formcard label {
  font-size: var(--fs-small);
  letter-spacing: 0;
  color: var(--c-ink);
}

/* ช่วงยินยอมแยกเป็นแผงของตัวเอง ให้อ่านออกว่าเป็นคนละเรื่องกับช่องกรอกข้างบน */
.mo-v2-formbox .ff-el-group:has(.ff-el-form-check) {
  background: var(--c-canvas);
  border-radius: var(--radius-sm);
  padding: var(--sp-2);
}

/* ปุ่มส่งเต็มความกว้างและสูงขึ้น -- ของเดิมเป็นปุ่มเล็กชิดซ้าย
   ดูเหมือนปุ่มรองทั้งที่เป็นปลายทางเดียวของทั้งฟอร์ม */
.mo-v2-formbox .ff-btn-submit {
  width: 100%;
  padding-block: .9em;
  font-size: var(--fs-body);
  border-radius: var(--radius-sm);
}
.mo-v2-map { margin-top: var(--sp-3); }
.mo-v2-map iframe {
  width: 100%; height: 16rem; border: 0; display: block;
  background: var(--c-brand-dark);
}

/* --- ปุ่มบนพื้นเข้มของสกิน v2 ---------------------------------------------
   ปุ่มหลักของธีมเป็นพื้นกรมท่า พอวางบน section พื้นกรมท่าจึงจมหายทั้งใบ
   (บั๊กเดียวกับที่เคยเจอในฮีโร่หน้าบริการเมื่อ 25 ส.ค. 2569 แต่คนละที่)
   มอคอัพใช้ปุ่มทองตัวหนังสือเข้มบนพื้นเข้ม จึงสลับให้ตรงกัน
   ผูกกับ .mo-v2 เพื่อไม่ให้กระทบแถบพื้นเข้มของหน้าอื่นที่ตั้งใจใช้ปุ่มโครงร่างอยู่แล้ว */
.mo-v2 .mo-section--night .mo-btn:not(.mo-btn--ghost),
.mo-v2 .mo-section--deep .mo-btn:not(.mo-btn--ghost) {
  background: var(--c-accent);
  color: var(--c-brand-dark);
}
.mo-v2 .mo-section--night .mo-btn:not(.mo-btn--ghost):hover,
.mo-v2 .mo-section--deep .mo-btn:not(.mo-btn--ghost):hover {
  background: var(--c-accent-light);
}
.mo-v2 .mo-section--night .mo-btn--ghost,
.mo-v2 .mo-section--deep .mo-btn--ghost {
  color: var(--c-ink-invert);
  box-shadow: inset 0 0 0 1.5px var(--c-accent-light);
}

/* --- เก็บงานสกิน v2 หลังเรนเดอร์ดูจริง (2 ก.ย. 2569) --------------------- */

/* แถบบริการหลักพื้น navy อยู่ใน section พื้นสว่าง กฎปุ่มทองข้างบนจึงไม่ครอบถึง
   ปุ่มในแถบเลยเป็น navy บนพื้น navy = เห็นแค่ตัวหนังสือ ไม่เห็นว่าเป็นปุ่ม */
.mo-v2 .mo-v2-banner .mo-btn {
  background: var(--c-accent);
  color: var(--c-brand-dark);
}
.mo-v2 .mo-v2-banner .mo-btn:hover { background: var(--c-accent-light); }

/* การ์ดบทความตั้งพื้นเป็น --c-canvas ไว้เพราะบนหน้าแรกมันวางบนแถบ navy
   มอคอัพย้ายช่วงนี้มาอยู่บนพื้นครีม ซึ่งเป็นสีเดียวกันเป๊ะ การ์ดจึงหายไปทั้งใบ */
.mo-v2 .mo-section--tint .mo-postcards .wp-block-post {
  background: var(--c-surface);
  border-color: var(--c-line);
}

/* กฎกลับสีตัวหนังสือในฟอร์มถูกลบเมื่อ 3 ก.ย. 2569
   ตอนที่กล่องฟอร์มเปลี่ยนเป็นการ์ดพื้นสว่าง สีเดิมของธีมจึงถูกต้องอยู่แล้ว */

/* --- ปรับรอบสาม 2 ก.ย. 2569 (เจ้าของบอกชอบ v2 แต่ขอปรับ 4 จุด) ---------- */

/* กล่องซ้อนของบล็อก Group ในการ์ดบทความหดเหลือ 566px แล้วถูกจัดกึ่งกลาง
   (วัดได้ margin ซ้ายขวาข้างละ 279.9px) พอมีบทความชิ้นเดียวการ์ดจึงกว้างเต็ม
   แต่ข้อความข้างในลอยอยู่กลางใบ ดูเหมือนวางพลาด
   เห็นเฉพาะตอนการ์ดกว้าง ๆ ใบเดียว พอมีบทความครบ 3 ชิ้นการ์ดจะแคบจนไม่ทันสังเกต
   -> สั่งให้กล่องซ้อนกว้างเต็มพ่อแม่ไปเลย เป็นบั๊กของหน้าแรกกับหน้าบริการด้วย */
.mo-postcards .wp-block-group__inner-container { width: 100%; }

/* ช่วงติดต่อ: ฝั่งซ้ายมีแค่ตารางข้อมูล 250px กับปุ่ม แต่ฝั่งขวามีฟอร์ม 487px
   ต่อด้วยแผนที่อีก 256px ท้ายคอลัมน์ซ้ายจึงว่าง 430px
   -> ย้ายแผนที่มาไว้ซ้าย แล้วให้ยืดเต็มพื้นที่ที่เหลือ สองฝั่งจบพร้อมกัน */
.mo-v2-visit .wp-block-column { display: flex; flex-direction: column; }
.mo-v2-visit .mo-v2-map { flex: 1; display: flex; }
.mo-v2-visit .mo-v2-map iframe { height: 100%; min-height: 14rem; }

/* ย้ายแผนที่มาซ้ายแล้วกลับกลายเป็นซ้ายยาวกว่าขวา 100px
   ให้สองคอลัมน์สูงเท่ากันแล้วปล่อยกล่องฟอร์มยืดเต็ม ทั้งสองฝั่งจะจบบรรทัดเดียวกัน */
.mo-v2-visit .wp-block-columns { align-items: stretch; }
.mo-v2-visit .mo-v2-formbox { flex: 1; }

/* หัวเว็บบนหน้าที่มีฮีโร่เป็น position:absolute ทับอยู่บนฮีโร่ ฮีโร่จึงต้องเผื่อ
   ระยะบนไว้เอง ของเดิม .mo-v2-hero ใช้ระยะ section ธรรมดาซึ่งพอเป็น 104px ก็รอด
   แต่พอลดเหลือ 54px ตาม สเปก โลโก้กับเมนูเลยทับบรรทัด kicker ทันที
   ใช้ค่าเดียวกับ .mo-hero ของธีม (สูงสุด 136px) จะได้ไม่ต้องมีเลขวิเศษสองชุด */
/* เพิ่มระยะบนอีกรอบ 2 ก.ย. 2569 ตอนขยายโลโก้ -- หัวเว็บสูงขึ้นจาก 92 เป็น 129px
   ค่าเดิมให้ระยะบน 136px เหลือช่องว่างใต้หัวเว็บแค่ 7px ซึ่งเบียดจนดูเหมือนชนกัน
   **โลโก้ใหญ่ขึ้นเมื่อไหร่ ต้องมาวัดค่านี้ใหม่ทุกครั้ง** สองค่านี้ผูกกันอยู่ */
.mo-v2-hero { padding-top: clamp(4rem, 2rem + 10vw, 12rem); }

/* **28 ก.ย. 2569 — บั๊กเดียวกับ .mo-hero / .mo-pagehero ข้างบน** ค่านี้เผื่อระยะให้
   หัวเว็บที่ลอยทับ (position: absolute) แต่จอมือถือหัวเว็บกลับมาอยู่ใน flow ปกติแล้ว
   (ดู @media (max-width: 768px) .mo-has-hero .site-header ก่อนหน้านี้ในไฟล์)
   ต้องเขียนไว้ตรงนี้ ต่อจากกฎบนเลย ไม่ใช่รวมกับสองตัวข้างบน เพราะกฎนี้มาทีหลัง
   ในไฟล์ ถ้าเขียนกฎมือถือไว้ก่อนบรรทัดนี้จะแพ้จากลำดับไฟล์ ทั้งที่ media query ตรงกัน */
@media (max-width: 768px) {
  .mo-v2-hero { padding-top: var(--section-y); }
}

/* ช่วงเช็กอาการเปลี่ยนเป็นพื้น cream เพื่อคั่นกับฮีโร่โทนสว่าง
   กล่องสรุปข้างในตั้งพื้นเป็น cream ไว้ตอน section ยังเป็นพื้น paper
   ตอนนี้เลยกลายเป็นสีเดียวกับพื้นแล้วหายไปทั้งกล่อง (บั๊กเดียวกับการ์ดบทความ) */
.mo-v2 .mo-section--tint .mo-v2-callout { background: var(--c-surface); }

/* --- ช่วงเกี่ยวกับเรา: พื้นสว่าง รูปมีแผ่นครีมรองหลัง (2 ก.ย. 2569) -------------
   เจ้าของสั่งเปลี่ยนจากพื้นกรมท่าเป็นโทนสว่าง และขอให้จัดให้ดูดีกว่าเดิม

   ของเดิมเป็นรูปสี่เหลี่ยมลอยอยู่บนพื้นเปล่า กับข้อความยาวเต็มคอลัมน์
   สามอย่างที่แก้: รูปมีแผ่นครีมเยื้องรองหลังให้มีความลึก · จัดสองคอลัมน์กึ่งกลางแนวตั้ง
   · คุมความยาวบรรทัดข้อความไม่ให้เกินระยะที่ตากวาดสบาย

   **สลับลำดับสีพื้นสามช่วงพร้อมกัน** ช่วงนี้เป็น paper แล้วชนกับช่วงบริการที่เป็น paper
   จึงย้ายบริการไปครีม แล้วย้ายจุดที่เราต่างมาเป็น paper แทน
   ตอนนี้ไล่เป็น สว่าง ครีม paper ครีม paper เข้มสุด paper ครีม paper กรมท่า */
.mo-v2-about .wp-block-columns {
  align-items: center;
  gap: clamp(var(--sp-4), 4vw, var(--sp-6));
}

/* แผ่นครีมเยื้องลงขวาอยู่ข้างหลังรูป ทำให้รูปไม่ลอยอยู่บนพื้นเปล่า
   ใช้ ::before ของกล่องรูป ไม่ต้องเพิ่ม div ในเนื้อหาหน้า (ซึ่งอยู่ในฐานข้อมูล) */
.mo-v2-about .mo-v2-portrait {
  position: relative;
  isolation: isolate;
  min-height: 0;          /* ล้างค่าจากกฎหลัก ความสูงมาจากสัดส่วนรูปแทน */
}
.mo-v2-about .mo-v2-portrait::before {
  content: "";
  position: absolute;
  z-index: -1;
  inset: var(--sp-3) calc(var(--sp-3) * -1) calc(var(--sp-3) * -1) var(--sp-3);
  background: var(--c-canvas);
}
.mo-v2-about .mo-v2-portrait img {
  aspect-ratio: 4 / 5;
  height: auto;
}
/* หน้าเกี่ยวกับเราวางช่วงนี้บนพื้นครีม (28 ก.ย. 2569) แผ่นครีมข้างหลังรูปจะกลืนหายกับพื้น
   → สลับเป็นแผ่นสว่าง หลักเดียวกับการ์ดที่วางบนพื้นครีมทั้งเว็บ */
.mo-section--tint.mo-v2-about .mo-v2-portrait::before { background: var(--c-surface); }
/* **align-items: center ของกฎข้างบนไม่เคยทำงาน** (วัด 28 ก.ย. 2569 ได้ค่า normal)
   CSS ของบล็อก Columns ในแกน WordPress ล็อก align-items ของ .wp-block-columns เป็น normal แบบบังคับ
   ข้อความจึงค้างอยู่บนสุด เหลือที่ว่างใต้ข้อความ (หน้าเกี่ยวกับเรา ~250px · หน้าแรก ~140px)
   → สั่งที่ตัวคอลัมน์ด้วย align-self แทน ซึ่งกฎของแกนไม่ได้ล็อกไว้ ไม่ต้องใช้ค่าบังคับ */
.mo-v2-about .wp-block-column { align-self: center; }

/* คุมความยาวบรรทัด ไม่ใช่ความกว้างคอลัมน์ -- คอลัมน์ยังกว้าง 58% เท่าเดิม
   แต่ตัวหนังสือหยุดที่ 34rem ซึ่งอยู่ในช่วงที่อ่านสบาย */
.mo-v2-about__text > .wp-block-group__inner-container > * { max-width: 34rem; }

/* --- หัวเว็บของสกิน v2 ย้ายไปเป็นกฎกลางแล้ว (23 ก.ย. 2569) ------------------
   เดิมตรงนี้มีกฎหัวเว็บสี่ชุดที่ผูกกับ .mo-v2 (เต็มความกว้างจอ · โลโก้ใหญ่ ·
   เมนูชิดขวา · ตัวอักษรเมนูใหญ่) ทดลองไว้เมื่อ 2 ก.ย. 2569 เพื่อไม่ให้กระทบหน้าอื่น

   เจ้าของสั่งให้ทุกหน้าเหมือนหน้าแรก จึงย้ายทั้งสี่ชุดไปรวมกับกฎหัวเว็บกลาง
   ในหมวด "Header / Footer / Single post" แล้วลบของที่นี่ทิ้ง
   **ไม่ได้แค่ถอด .mo-v2 ออกแล้วปล่อยไว้ที่เดิม** เพราะจะเหลือกฎสองชุดที่ชนกัน
   ตัวเดียวกันด้วยความแรงเท่ากัน แล้วต้องพึ่งลำดับบรรทัดอย่างเดียว ซึ่งพังง่าย
   เวลามีคนมาแทรกกฎใหม่ทีหลัง — **ตอนนี้กฎหัวเว็บอยู่ที่เดียวในไฟล์**
---------------------------------------------------------------------------- */

/* --- ปุ่มในสกิน v2 ชิดซ้ายให้ตรงแนวข้อความ (2 ก.ย. 2569) --------------------
   `.mo-cta-row` ตัวกลางสั่ง `justify-content: center` ไว้ ซึ่งถูกสำหรับ CTA
   ปิดท้ายหน้าที่จัดกึ่งกลางทั้งบล็อก แต่ดีไซน์ v2 ชิดซ้ายทั้งหน้า
   ปุ่มที่อยู่ใต้ข้อความจึงลอยเยื้องออกไปจากแนวตัวอักษร

   วัดก่อนแก้แล้วเยื้อง 4 จุด: ฮีโร่ 59px · เกี่ยวกับเรา 151px · ทีม 513px · ติดต่อ 79px
   (สองจุดที่เหลืออยู่ในคอลัมน์ขวาของหัวข้อแบบสองฝั่ง ซึ่งก็ควรชิดซ้ายของคอลัมน์ตัวเอง)

   **ไม่ได้แก้ที่กฎกลาง** เพราะหน้าแรกจริงกับหน้าบริการยังใช้ CTA กึ่งกลางอยู่
   (หน้าบริการมีข้อยกเว้นที่ตกลงกันไว้ตั้งแต่ 28 ส.ค. ว่า "Book an Assessment"
   เป็นบล็อกเดียวในหน้าที่จัดกึ่งกลางได้) */
.mo-v2 .mo-cta-row { justify-content: flex-start; }

/* --- ปุ่มในคอลัมน์ขวาของหัวข้อแบบสองฝั่ง (3 ก.ย. 2569) ----------------------
   ปุ่มใน v2 ชิดซ้ายเป็นค่าตั้งต้น ซึ่งถูกสำหรับปุ่มที่อยู่ใต้ข้อความ
   แต่ช่วง "ขั้นตอน" กับ "บทความ" วางหัวข้อไว้ซ้ายและปุ่มไว้ขวา
   ปุ่มจึงต้องชิดขวาจริง ๆ ไม่งั้นมันไปลอยกลาง ๆ ไม่ตรงกับขอบไหนเลย

   **แยกด้วยคลาสของตัวเอง ไม่ได้เดาจากตำแหน่งใน DOM** เพราะช่วงเกี่ยวกับเรา
   ก็มีปุ่มอยู่ในคอลัมน์เหมือนกัน แต่ต้องชิดซ้ายให้ตรงกับข้อความ
   เลือกด้วย "คอลัมน์สุดท้าย" เมื่อไหร่จะไปโดนช่วงนั้นด้วย */
.mo-v2 .mo-cta-row--end {
  justify-content: flex-end;
  margin-top: 0;          /* ล้างระยะบนของ CTA ปกติ ซึ่งมีไว้ถ่างจากย่อหน้าข้างบน */
}

/* จัดสองฝั่งให้อยู่กึ่งกลางแนวตั้งด้วย ปุ่มจะได้อยู่ระดับเดียวกับหัวข้อ ไม่ลอยอยู่บนสุด
   ใช้ :has() เลือกเฉพาะแถวคอลัมน์ที่มีปุ่มแบบชิดขวาอยู่ข้างใน
   (ธีมใช้ :has() อยู่แล้วที่กฎซ่อนชื่อเว็บเมื่อมีโลโก้) */
.mo-v2 .wp-block-columns:has(.mo-cta-row--end) { align-items: center; }

/* --- มุมโค้งของกล่องในสกิน v2 (3 ก.ย. 2569) ---------------------------------
   คลาส .mo-v2-* เขียนขึ้นตอนสเปกกำหนดมุม 2px ซึ่งแทบไม่ต่างจากเหลี่ยม
   จึงไม่ได้ใส่ border-radius ไว้เลยสักตัว พอเจ้าของขอให้มนขึ้น
   การแก้ token อย่างเดียวจึงไม่พอ ต้องมาผูกให้กล่องพวกนี้ใช้ token ด้วย

   **ตะแกรง .mo-v2-grid3 จงใจไม่ใส่** เส้นตารางของมันเกิดจากพื้นโผล่ผ่านร่อง 1px
   ใส่มุมโค้งเมื่อไหร่ ร่องจะขาดเป็นช่วง ๆ กลายเป็นกล่องหลายใบแทนที่จะเป็นตะแกรง */
.mo-v2-checks li,
.mo-v2-cards li,
.mo-v2-team li,
.mo-v2-banner,
.mo-v2-callout,
.mo-v2-formbox {
  border-radius: var(--radius-card);
  /* กันมุมรูปข้างในโผล่เป็นเหลี่ยมทับมุมมนของกล่อง */
  overflow: hidden;
}

.mo-v2-checks img,
.mo-v2-portrait img,
.mo-v2-map iframe {
  border-radius: var(--radius-img);
}

.mo-v2-banner__tag { border-radius: var(--radius-sm); }

/* --- ฮีโร่กินเต็มความกว้างจอเหมือนหัวเว็บ (3 ก.ย. 2569) ---------------------
   เจ้าของขอให้กล่องข้อความขยับไปทางซ้ายอีก
   ใช้ค่าระยะขอบ **ชุดเดียวกับหัวเว็บ** กล่องข้อความในฮีโร่จึงเริ่มตรงแนวโลโก้พอดี
   ซึ่งเป็นแนวเดียวที่มีอยู่บนจอตอนนั้น ไม่ได้ตั้งเลขใหม่ขึ้นมาลอย ๆ

   **เฉพาะฮีโร่เท่านั้น** section อื่นยังใช้กรอบ 1240px กลางจอเหมือนเดิม
   ถ้าปลดทั้งหน้าจะกลายเป็นเว็บไม่มีกรอบเนื้อหาเลย ซึ่งไม่ใช่สิ่งที่ขอ */
.mo-v2-hero > .wp-block-group__inner-container > .mo-wrap,
.mo-v2-hero .mo-wrap {
  max-width: none;
  padding-inline: clamp(var(--sp-4), 6vw, var(--sp-6));
}

/* --- ความกว้างของช่วงเนื้อหา สลับสามระดับ (3 ก.ย. 2569) --------------------
   เจ้าของบอกว่าทุกช่วงกว้างเท่ากันหมดแล้วดูน่าเบื่อ

   จังหวะที่ได้ (บนลงล่าง): เต็มจอ · 1240 · 1240 · กว้าง · แคบ ·
                            1240 · กว้าง · 1240 · แคบ · 1240
   **มีเหตุผลของแต่ละช่วง ไม่ใช่สลับให้ต่างเฉย ๆ**
   · บริการ กับ ทีม = การ์ดและรูป ได้ประโยชน์จากพื้นที่ จึงกว้าง
   · จุดที่เราต่าง กับ คำถามที่พบบ่อย = ตัวหนังสือล้วน อ่านสบายกว่าเมื่อบรรทัดสั้น จึงแคบ
   · ที่เหลือคงกรอบปกติไว้เป็นจังหวะพัก **ถ้าสลับทุกช่วงจะกลายเป็นอีกแบบของความน่าเบื่อ** */
.mo-v2-wrap--narrow { max-width: var(--wrap-v2-narrow); }
.mo-v2-wrap--wide   { max-width: var(--wrap-v2-wide); }

/* ==========================================================================
   หน้าบริการแบบ v2 — /service/scoliosis-treatment/ (24 ก.ย. 2569)

   หน้าบริการเดิมเป็นสกิน v1 ทั้งหน้า ขณะที่หัวเว็บ ท้ายเว็บ และหน้าแรกเป็น v2 ไปแล้ว
   เปิดสองหน้าต่อกันจึงดูเหมือนคนละเว็บ (ภาพอ้างอิง uploads/2026/08/main-design.png
   คือหน้าแรกสกิน v2) — ฮีโร่พื้นกรมท่าไม่มีรูป เนื้อหาชิดครึ่งซ้ายแล้วปล่อยครึ่งขวาว่าง
   และรายการอาการเป็นดอกจันเรียงบรรทัด ซึ่งหน้าแรกเลิกใช้ไปแล้ว

   ประกอบจาก component ของหน้าแรกเกือบทั้งหมด **ของใหม่จริงมีสามอย่าง**
   1. ฮีโร่ภาพเต็มจอที่รูปมาจากคลังสื่อ — หน้าตาเหมือนหน้าแรก แต่เปลี่ยนรูปเองได้
   2. กรอบรูปมีแผ่นรองเยื้อง — กลไกเดียวกับรูปช่วง "เกี่ยวกับเรา" หน้าแรก
      แต่ของเดิมผูกอยู่กับ .mo-v2-about ใช้ที่อื่นไม่ได้ จึงแยกเป็นคลาสกลาง
   3. modifier ให้ component ที่เดิมเขียนไว้สำหรับพื้นเดียว ใช้กับอีกพื้นได้
      (ตารางข้อมูลบนพื้นสว่าง · ขั้นตอนบนพื้นสว่าง · จำนวนคอลัมน์ที่ตายตัว)

   **ทุก modifier ที่คุมจำนวนคอลัมน์มีเหตุผลเดียวกัน** ตัวหลักใช้ auto-fit
   ซึ่งตัดสินจำนวนคอลัมน์จากความกว้างเฉย ๆ ไม่รู้ว่ามีกี่ใบ ของ 3 หรือ 4 ใบจึงเรียง
   3+1 หรือ 2+1 ได้ในบางความกว้าง = เหลือใบโดดท้ายแถว (กับดักที่เจอมาแล้วสามรอบ
   ดูคอมเมนต์ .mo-v2-grid3 กับ .mo-v2-cards) ที่นี่รู้จำนวนแน่นอน จึงสั่งตรง ๆ
   ========================================================================== */

/* --- 1. ฮีโร่ภาพเต็มจอ รูปมาจากคลังสื่อ -----------------------------------
   **เจ้าของสั่ง 24 ก.ย. 2569: ให้รูปแรกเป็นภาพเต็มความกว้างจอแบบหน้าแรก**
   (รอบแรกวางเป็นรูปกรอบในคอลัมน์ขวา — เจ้าของดูแล้วขอเปลี่ยน)

   ต่อยอดจาก .mo-v2-hero ทุกอย่าง (พื้น paper · วงแหวน · ระยะบนเผื่อหัวเว็บ ·
   กล่องข้อความ 53% · ข้อความเริ่มตรงแนวโลโก้) ต่างจากหน้าแรกเรื่องเดียว:
   **รูปเป็น <img> ในเนื้อหา ไม่ใช่ภาพพื้นหลังใน CSS**
   · เปลี่ยนรูปจากคลังสื่อได้โดยไม่แตะโค้ด (ของหน้าแรกต้องแก้ไฟล์ในธีม)
   · เบราว์เซอร์เจอรูปตั้งแต่อ่าน HTML เริ่มโหลดทันที ไม่ต้อง preload แยก
   วางรูปทับเต็มแถบด้วย position:absolute แล้วคลุมม่านสีพื้นสามชั้นชุดเดียวกับหน้าแรก

   **รูปตอนนี้เป็นแนวตั้ง 800×1067** ขยายเต็มจอจึงเห็นแค่แถบกลางราวครึ่งภาพ
   และนุ่มกว่าหน้าแรกเพราะถูกขยายเกือบสองเท่า — แจ้งเจ้าของแล้ว ตกลงใช้ไปก่อน
   → ได้รูปแนวนอนกว้าง 1920px ขึ้นไปเมื่อไหร่ อัปโหลดทับรูปชื่อย่อ
     service-scoliosis-treatment แล้วเขียนเนื้อหาหน้าใหม่จาก pattern
   → **เปลี่ยนรูปแล้วต้องปรับ object-position ข้างล่างให้ตรงตัวคนในรูปใหม่** */
.mo-v2-hero.mo-v2-hero--media { background-image: none; }
.mo-v2-hero--media .mo-v2-hero__text :where(h1, p) { max-width: var(--hero-measure); }

/* --- ฮีโร่หน้าติดต่อ: ข้อความซ้าย ตารางช่องทางติดต่อขวา (25 ก.ย. 2569) --------
   ไม่มีรูปคลินิกจริงให้ใช้ (PHOTO-LIST.md) จึงไม่ใช้ภาพพื้นหลังของหน้าแรก
   ซึ่งเป็นภาพกระดูกสันหลัง ไม่เกี่ยวกับหน้านี้ — ฝั่งขวาเป็นเบอร์ LINE เวลา ที่ตั้งแทน
   คนเข้าหน้าติดต่อมาหาสี่อย่างนี้ เห็นได้ตั้งแต่จอแรกโดยไม่ต้องเลื่อน
   วงแหวนตกแต่งกับพื้นสว่างยังมาจาก .mo-v2-hero เหมือนเดิม
   **functions.php ต้องรู้จักคลาสนี้ด้วย** (ไม่ preload ภาพหน้าแรก · เมนูตัวหนังสือเข้ม) */
.mo-v2-hero.mo-v2-hero--info { background-image: none; }
.mo-v2-hero--info .wp-block-columns { align-items: center; }
/* กล่องข้อความของฮีโร่ตัวหลักกว้างแค่ ~53% ของกรอบ พออยู่ในคอลัมน์ 58% จะเหลือ ~30%
   ให้เต็มคอลัมน์ แล้วคุมความยาวบรรทัดด้วย token ตัวเดียวกับฮีโร่หน้าบริการแทน */
.mo-v2-hero--info .mo-v2-hero__text { max-width: none; }
.mo-v2-hero--info .mo-v2-hero__text :where(h1, p) { max-width: var(--hero-measure); }

/* การ์ดเส้นบางที่มีปุ่มท้ายการ์ด — ข้อความแต่ละใบยาวไม่เท่ากัน
   ถ้าไม่ดันปุ่มลงก้น ปุ่มสามใบจะลอยคนละระดับ อ่านเป็นวางพลาด */
.mo-v2-grid3--act li { display: flex; flex-direction: column; }
.mo-v2-grid3--act li > p:last-child { margin-top: auto; padding-top: var(--sp-3); }

.mo-v2-hero__bg { margin: 0; }

/* ม่านสีพื้นหลังตัวหนังสือ — เพิ่มรอบหก ตอนเจ้าของสั่งขยับรูปซ้ายอีก 15%
   รูปเข้าไปอยู่ใต้ครึ่งขวาของย่อหน้า จอ 1440 ตัวหนังสือไปทับเก้าอี้กับแขนผู้รับบริการ
   ที่สีเข้ม อ่านไม่ออก — ใช้กลไกเดียวกับฮีโร่หน้าแรก (ม่านสีพื้นจากซ้าย จางไปหาภาพ)
   วางที่ ::before ของ .mo-wrap ซึ่งไม่ได้ตั้ง position จึงกางเต็มแถบฮีโร่
   z-index -1 = อยู่เหนือรูป (-2) แต่ใต้ตัวหนังสือ · pointer-events: none ไม่บังการคลิก */
@media (min-width: 861px) {
  .mo-v2-hero--media .mo-wrap::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    pointer-events: none;
    background: linear-gradient(90deg,
      color-mix(in srgb, var(--c-surface) 94%, transparent) 0,
      color-mix(in srgb, var(--c-surface) 86%, transparent) 42%,
      transparent 60%);
  }
}

/* --- ตำแหน่งรูปในฮีโร่ (รูปแนวนอน · 24 ก.ย. 2569) --------------------------------
   **ประวัติสั้น ๆ เผื่อต้องย้อน** — ทั้งหมดเจ้าของสั่งเองวันเดียวกัน ทีละรอบ
   1. รูปกรอบในคอลัมน์ขวา → 2. ภาพเต็มจอแบบ cover (รูปแนวตั้งถูกซูมจนเหลือแต่คนเดียว)
   → 3. "ต้องเห็นรูปครบ ห้ามซูม" → 4–6. ขยับซ้าย/ขยาย/ซูม 25% ทีละรอบ
   → 7. **เปลี่ยนรูปเป็น `Scoliosis Treatments-page.webp` (แนวนอน 7360×4912)**
   ตัวเลขรอบ 4–6 (ซูม 1.25 · กล่องเริ่ม 31% · ขอบขวา +15%) จูนไว้กับรูปแนวตั้ง
   ใช้กับรูปแนวนอนแล้วรูปเล็กลงครึ่งหนึ่ง จึงตั้งใหม่ทั้งชุดให้ได้หน้าตาที่เจ้าของเลือก:
   ข้อความซ้าย · รูปใหญ่ทางขวาเริ่มใกล้ข้อความ · เห็นครบทั้งใบ · ขอบจางกลืนพื้น
   → ไฟล์ที่เว็บใช้คือสำเนาย่อ `scoliosis-treatment-hero.webp` 1920px 112 KB ในคลังสื่อ
     (ต้นฉบับ 4.2 MB ไม่ได้แตะ) มือถือได้ไฟล์เล็กกว่านี้ผ่าน srcset

   กล่องรูป: ซ้ายเริ่ม 40% · ขวาหยุดที่ระยะขอบของฮีโร่ (ตรงแนวปุ่มนัดหมายบนเมนู)
   · บนเริ่มใต้หัวเว็บ (ค่าเดียวกับ padding-top ของ .mo-v2-hero) รูปจะไม่ไปอยู่หลังเมนู
   รูปจัดกลางกล่อง หดตามด้านที่ชนก่อน ไม่ครอป ไม่ซูม */

/* 861 = เลขเดียวกับที่หน้าแรกเลิกใช้ภาพพื้นหลัง ต่ำกว่านี้รูปลงมาอยู่ใต้ข้อความแทน */
@media (min-width: 861px) {
  .mo-v2-hero--media { min-height: var(--hero-media-min); }
  .mo-v2-hero__bg {
    position: absolute;
    top: clamp(4rem, 2rem + 10vw, 12rem);
    right: clamp(var(--sp-4), 6vw, var(--sp-6));
    bottom: var(--section-y);
    left: 40%;
    z-index: -2;   /* ใต้วงแหวนตกแต่ง (-1) ใต้ม่านหลังตัวหนังสือ (-1) และใต้ตัวหนังสือ */
    display: flex;
    justify-content: center;
    align-items: center;
  }
  /* ใช้ max-height/max-width คู่กัน ไม่ใช่ height:100% + object-fit
     กล่อง <img> จึงเท่ากับตัวรูปที่วาดจริงเสมอ mask ที่จางขอบจะอยู่ตรงขอบรูปจริง
     (ลอง object-fit: contain แล้ว กล่องใหญ่กว่ารูป จุดจางไปอยู่นอกรูป ขอบรูปเลยตัดตรง) */
  .mo-v2-hero__bg img {
    display: block;
    width: auto;
    height: auto;
    max-width: 100%;
    max-height: 100%;
    /* mask ใช้แค่ความทึบของสี ไม่ได้ทาสีจริง — ใช้ token ทึบตัวไหนก็ได้
       จางครบสี่ด้าน ซ้ายกว้างสุดเพื่อกลืนเข้าหาข้อความ ด้านอื่นแคบ พอให้ขอบหายโดยไม่กินเนื้อรูป */
    -webkit-mask-image:
      linear-gradient(to right, transparent 0, var(--c-ink) 18%, var(--c-ink) 94%, transparent 100%),
      linear-gradient(to top, transparent 0, var(--c-ink) 8%, var(--c-ink) 94%, transparent 100%);
    -webkit-mask-composite: source-in;
    mask-image:
      linear-gradient(to right, transparent 0, var(--c-ink) 18%, var(--c-ink) 94%, transparent 100%),
      linear-gradient(to top, transparent 0, var(--c-ink) 8%, var(--c-ink) 94%, transparent 100%);
    mask-composite: intersect;
  }

  /* รูปแนวตั้ง — ซูมเต็มกล่อง (เจ้าของสั่ง 25 ก.ย. 2569: "รูปเล็กไป ซูมเลย")
     ถ้าไม่ซูม รูปชนเพดานความสูงก่อน เหลือกว้าง ~400px ในกล่องที่กว้าง ~770px
     cover = ขยายจนเต็มกล่อง ยอมตัดขอบบน/ล่าง · กล่อง <img> เท่ากล่องรูปพอดี
     mask ที่จางขอบจึงยังอยู่ตรงขอบภาพจริง (ปัญหาเดิมของ contain ไม่เกิดกับ cover)
     จุดที่เก็บไว้ในกรอบ (--hero-focus) รูปแต่ละใบต่างกัน pattern ส่งมาทาง style ของ <figure>
     ไม่ส่ง = กลางรูป · หน้า shockwave 20% (หน้าจอเครื่องอยู่บน) · หน้า ultrasound 45% (เจลที่แขนอยู่กลาง)
     จูนที่จอ 1920 ซึ่งซูมมากสุด เห็นแค่ ~42% ของความสูงรูป ถ้าตรงนั้นไม่หลุด จอเล็กกว่าก็ไม่หลุด
     pattern ใส่คลาสนี้ให้เองจากสัดส่วนรูปในคลังสื่อ (ดู $moveon_svc_pending_page) */
  .mo-v2-hero--portrait .mo-v2-hero__bg img {
    width: 100%;
    height: 100%;
    max-width: none;
    max-height: none;
    object-fit: cover;
    object-position: var(--hero-focus, 50% 50%);
  }
}

/* จอแคบ: หน้าแรกตัดภาพทิ้งไปเลย แต่รูปนี้เป็นรูปจริงของบริการ ตัดทิ้งเสียของ
   วางต่อใต้ข้อความ **ครบทั้งใบตามสัดส่วนจริง** ไม่ครอป (เจ้าของสั่งให้เห็นครบ) */
@media (max-width: 860px) {
  .mo-v2-hero__bg { margin-top: var(--sp-4); }
  .mo-v2-hero__bg img {
    display: block;
    width: auto;
    max-width: 100%;
    max-height: var(--hero-media-img-max);
    height: auto;
    border-radius: var(--radius-img);
  }
}

/* แถบตัวเลขสามช่อง — แถวเดียวเมื่อกล่องข้อความกว้างพอ (1100px ขึ้นไป)
   ต่ำกว่านั้นกล่องข้อความ 53% เหลือไม่ถึง 500px สามช่องจะเหลือช่องละ ~140px
   ป้ายไทยตกบรรทัด (เรนเดอร์ดูที่ 900px แล้ว) ส่วน auto-fit ของตัวหลักจะได้ 2+1
   → เปลี่ยนเป็นแถวสั้น ป้ายซ้าย ค่าขวา ซึ่งยังช่วยมือถือด้วย (กล่องสามใบซ้อนกันสูง ~350px) */
@media (min-width: 1100px) {
  .mo-v2-hero--media .mo-v2-stats { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (max-width: 1099px) {
  .mo-v2-hero--media .mo-v2-stats { grid-template-columns: 1fr; gap: var(--sp-1); }
  .mo-v2-hero--media .mo-v2-stats > div {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: var(--sp-2);
    padding: var(--sp-2) var(--sp-3);
  }
  .mo-v2-hero--media .mo-v2-stats b { margin-bottom: 0; }
}

/* --- 2. กรอบรูปมีแผ่นรองเยื้อง -----------------------------------------------
   แผ่นเยื้องลงขวาอยู่หลังรูป ทำให้รูปไม่ลอยอยู่บนพื้นเปล่า (เหตุผลเดียวกับ .mo-v2-about)
   วาดด้วย ::before ไม่ต้องเพิ่ม div ในเนื้อหาหน้า ซึ่งอยู่ในฐานข้อมูล
   แผ่นยื่นออกนอกคอลัมน์ --sp-3 ซึ่งน้อยกว่าระยะขอบ .mo-wrap (--wrap-pad) เสมอ
   จึงไม่ดันให้หน้าเลื่อนซ้ายขวาได้ */
.mo-v2-figure {
  position: relative;
  isolation: isolate;
  margin: 0;
}
.mo-v2-figure::before {
  content: "";
  position: absolute;
  z-index: -1;
  inset: var(--sp-3) calc(var(--sp-3) * -1) calc(var(--sp-3) * -1) var(--sp-3);
  background: var(--c-canvas);
  border-radius: var(--radius-img);
}
.mo-v2-figure img {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 4 / 5;
  object-fit: cover;
  border-radius: var(--radius-img);
}

/* บนพื้นกรมท่า แผ่นครีมทึบจะกลายเป็นก้อนสว่างแย่งความเด่นจากตัวหนังสือ
   เปลี่ยนเป็นเส้นกรอบทองอ่อนบาง ๆ — ลายเส้นบางชุดเดียวกับวงแหวนในฮีโร่ */
.mo-section--night .mo-v2-figure::before {
  background: none;
  border: 1px solid color-mix(in srgb, var(--c-accent-light) 45%, transparent);
}

/* เลข 781 คือจุดที่บล็อก Columns ของ WordPress ยุบเป็นคอลัมน์เดียว
   รูปแนวตั้ง 4:5 เต็มความกว้างจอแท็บเล็ตวัดได้สูงราว 800px จึงใช้แนวนอน 4:3 แทน */
@media (max-width: 781px) {
  .mo-v2-figure img {
    aspect-ratio: 4 / 3;
    object-position: 50% 35%;
  }
}

/* --- 3. modifier ของ component เดิม ---------------------------------------- */

/* ตารางข้อมูลแบบมีเส้นคั่น — ตัวเดิม (.mo-v2-contact) ตั้งสีไว้สำหรับพื้นกรมท่าอย่างเดียว
   ความแรงเท่ากับกฎเดิม (0-1-1) และอยู่ถัดลงมา จึงชนะโดยไม่ต้องเพิ่มความแรง
   เส้นใช้ทองแดงโปร่ง ไม่ใช่ --c-line เพราะ --c-line บนพื้นครีมเหลือ 1.13:1 แทบหาย */
.mo-v2-contact--light { border-top-color: color-mix(in srgb, var(--c-accent) 40%, transparent); }
.mo-v2-contact--light li { border-bottom-color: color-mix(in srgb, var(--c-accent) 28%, transparent); }
.mo-v2-contact--light span { color: var(--c-accent-text); }

/* ค่าในตารางนี้เป็นประโยคยาว (ต่างจากตารางติดต่อที่เป็นเบอร์โทรสั้น ๆ)
   จอมือถือเหลือคอลัมน์ค่าราว 170px ประโยคเดียวตกเจ็ดบรรทัด → ป้ายไว้บน ค่าไว้ล่าง */
@media (max-width: 600px) {
  .mo-v2-contact--light li { grid-template-columns: 1fr; gap: .2em; }
}

/* ปุ่มที่ชิดขวาของหัวข้อแบบสองฝั่ง พอคอลัมน์ยุบซ้อนกัน (781px ลงมา)
   ปุ่มไปอยู่ใต้หัวข้อแต่ยังชิดขวา ลอยห่างจากแนวข้อความ — กลับมาชิดซ้ายตามแนวเดียวของหน้า
   (เป็นแบบเดียวกันบนหน้าแรกด้วย เพราะใช้ component ตัวเดียวกัน) */
@media (max-width: 781px) {
  .mo-v2 .mo-cta-row--end { justify-content: flex-start; }
}

/* ระยะใต้บล็อกผู้ตรวจทานมีไว้คั่นกับ FAQ ข้างล่าง พอมันเป็นของชิ้นสุดท้ายในคอลัมน์
   ระยะนั้นไปบวกกับช่องว่างระหว่างคอลัมน์ตอนซ้อนกันบนมือถือ = ห่างเกือบ 80px */
.wp-block-column > .mo-reviewer:last-child { margin-bottom: 0; }
.mo-v2-contact--light b,
.mo-v2-contact--light a { color: var(--c-ink); }

/* การ์ดอาการ 4 ใบ — 2×2 บนจอแคบ · 4 ใบแถวเดียวตั้งแต่ 900px
   รูปสูงขึ้นจากตัวหลัก เพราะการ์ดกว้างกว่าของหน้าแรก (4 ช่องเต็มกรอบ ไม่ใช่ 2 ช่องในครึ่งจอ) */
.mo-v2-checks--quad { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.mo-v2-checks--quad img { height: clamp(7rem, 11vw, 9.5rem); }
@media (min-width: 900px) {
  .mo-v2-checks--quad { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

/* ป้ายบอกกลุ่มภาษาไทย — เส้นนำทองแบบเดียวกับ kicker ในฮีโร่ แต่ไม่กางตัวอักษร
   kicker ตัวหลักกาง 0.28em ซึ่งเป็นค่าของป้ายอังกฤษ (Design.md ข้อบังคับเรื่องภาษาไทย:
   สระกับวรรณยุกต์ซ้อนบนล่าง พอดันให้ห่างจะดูหลุดจากกัน) ในฮีโร่ยังพอรับได้เพราะเป็นชื่อสถานที่สั้น ๆ
   แต่ป้ายกลุ่มเป็นประโยคที่ต้องอ่าน เรนเดอร์แล้วตัวอักษรกระจายจนอ่านสะดุด */
.mo-v2-kicker--label {
  font-size: var(--fs-small);
  letter-spacing: 0;
}

/* บรรทัดป้ายกลุ่มที่สองต้องห่างจากการ์ดข้างบนพอให้อ่านออกว่าเป็นกลุ่มใหม่ */
.mo-v2-checks + .mo-v2-kicker { margin-top: var(--sp-5); }

/* ตะแกรงเส้นบาง 3 ช่องแถวเดียว — ตัวหลัก auto-fit จะได้ 2+1 ที่จอแท็บเล็ต
   และช่องที่ว่างจะโชว์พื้นหลังของตะแกรง (ซึ่งคือสีเส้น) เป็นก้อนทึบทั้งช่อง */
.mo-v2-grid3--row { grid-template-columns: 1fr; }
@media (min-width: 900px) {
  .mo-v2-grid3--row { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
.mo-v2-grid3 + .mo-note { margin-top: var(--sp-3); }

/* ขั้นตอน 2×2 ในคอลัมน์ครึ่งจอ
   ช่วง 782–999px สองคอลัมน์ของหน้าเพิ่งวางข้างกัน คอลัมน์ข้อความเหลือราว 400px
   แบ่งสองช่องจะเหลือช่องละไม่ถึง 200px หัวข้อไทยตกบรรทัดทุกคำ จึงเรียงเดี่ยวไว้ก่อน */
.mo-v2-steps--pair { grid-template-columns: 1fr; }
@media (min-width: 600px) and (max-width: 781px), (min-width: 1000px) {
  .mo-v2-steps--pair { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* ขั้นตอน 4 ช่องเต็มกรอบ — 1 / 2×2 / 4 ไม่มีทาง 3+1 */
.mo-v2-steps--four { grid-template-columns: 1fr; }
@media (min-width: 600px) {
  .mo-v2-steps--four { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 1100px) {
  .mo-v2-steps--four { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

/* ขั้นตอนบนพื้นสว่าง — ตัวหลักตั้งสีไว้สำหรับพื้นเข้มสุด (.mo-section--deep) อย่างเดียว
   ทองอ่อนบนพื้นครีมได้แค่ราว 2:1 ป้าย STEP จึงต้องใช้ทองเข้มแทน */
.mo-v2-steps--light li { border-top-color: color-mix(in srgb, var(--c-accent) 45%, transparent); }
.mo-v2-steps--light b { color: var(--c-accent-text); }
.mo-v2-steps--light h3 { color: var(--c-ink); }
.mo-v2-steps--light p { color: var(--c-ink-soft); }

/* กล่องคำตอบมีหัวข้อของตัวเอง — ตัวหลักมีแต่ย่อหน้า */
.mo-v2-callout h3 {
  margin: 0 0 var(--sp-1);
  font-size: var(--fs-h3);
}

/* ลิงก์ไปบริการที่เกี่ยวข้อง บนพื้นกรมท่า
   ต้องตั้งสีลิงก์เอง ไม่งั้นได้สีลิงก์ของธีมแม่ซึ่งเป็นกรมท่า = มองไม่เห็นบนพื้นเดียวกัน */
.mo-v2-related {
  margin: var(--sp-4) 0 0;
  font-size: var(--fs-small);
  color: color-mix(in srgb, var(--c-ink-invert) 75%, transparent);
}
/* ชื่อบริการแต่ละอันห้ามตัดกลางชื่อ — เรนเดอร์จริงแล้วเบราว์เซอร์ตัด
   "การกระตุ้|นกล้ามเนื้อ" กลางคำ ชื่อยาวสุดราว 270px ยังพอดีจอ 375 */
.mo-v2-related a {
  color: var(--c-accent-light);
  text-underline-offset: .25em;
  white-space: nowrap;
}
.mo-v2-related a:hover { color: var(--c-ink-invert); }

/* คำที่ห้ามขาดกลางคำ — ใช้ในหัวเรื่องหน้าบริการ ({คำ} ใน $moveon_svc_pending_page)
   ตัวตัดคำไทยของ Chrome ตัด "กล้า|มเนื้อ" ผิดที่ ห่อเฉพาะคำนั้น ส่วนอื่นยังตัดบรรทัดได้ตามปกติ
   ไม่ใช้ word-break ตาม Design.md ข้อ 4 */
.mo-keep { white-space: nowrap; }

/* ==========================================================================
   หน้ารวมบทความ /blog/ + หน้าหมวด — 28 ก.ย. 2569
   markup อยู่ใน functions.php (moveon_blog_card และ hook generate_before_main_content)
   บทความเด่น 1 ใบ (รูปซ้าย ข้อความขวา) + ตะแกรง 3/2/1 คอลัมน์ + แถบหมวด + เลขหน้า
   ========================================================================== */

/* แถบหมวด — จอแคบเลื่อนซ้ายขวาในแถบของตัวเอง ไม่ตกหลายบรรทัดจนดันการ์ดลงไปไกล */
.mo-blogcats {
  display: flex; gap: var(--sp-1);
  margin: 0 0 var(--sp-4);
  overflow-x: auto; scrollbar-width: none;
  padding-bottom: 2px; /* กันกรอบไฮไลต์ตอนกด Tab ถูกตัดขอบล่าง */
}
.mo-blogcats::-webkit-scrollbar { display: none; }
.mo-blogcats a {
  flex: none; display: inline-flex; align-items: center; gap: var(--sp-1);
  padding: var(--sp-1) var(--sp-2); border: 1px solid var(--c-line); border-radius: var(--radius-sm);
  background: var(--c-surface); color: var(--c-ink);
  font-size: var(--fs-small); text-decoration: none; white-space: nowrap;
  transition: border-color var(--dur) var(--ease), background var(--dur) var(--ease);
}
.mo-blogcats a:hover { border-color: var(--c-accent); }
.mo-blogcats a[aria-current="page"] { background: var(--c-brand); border-color: var(--c-brand); color: var(--c-ink-invert); }
.mo-blogcats span { font-size: var(--fs-micro); color: var(--c-ink-soft); font-variant-numeric: tabular-nums; }
.mo-blogcats a[aria-current="page"] span { color: var(--c-accent-light); }

/* การ์ด — ทั้งใบกดได้จากลิงก์หัวข้อที่ยืดคลุม (::after) */
.mo-blogcard {
  position: relative; display: flex; flex-direction: column;
  background: var(--c-surface); border: 1px solid var(--c-line);
  border-radius: var(--radius-card); overflow: hidden;
  transition: border-color var(--dur) var(--ease), transform var(--dur) var(--ease);
}
.mo-blogcard:hover { border-color: var(--c-accent); transform: translateY(-2px); }
/* กรอบไฮไลต์ย้ายจากลิงก์เล็ก ๆ ในหัวข้อมาที่ทั้งการ์ด คนใช้คีย์บอร์ดจะเห็นว่าการ์ดไหนถูกเลือก */
.mo-blogcard:has(a:focus-visible) { outline: 2px solid var(--c-focus); outline-offset: 2px; }
.mo-blogcard__title a:focus-visible { outline: none; }

/* ภาพหน้าปกบทความเป็น 16:9 และมีหัวข้อพิมพ์อยู่ในภาพ — ครอปเป็นสัดส่วนเดิมจะไม่ตัดตัวหนังสือ */
.mo-blogcard__media { aspect-ratio: 16 / 9; background: var(--c-canvas); overflow: hidden; }
.mo-blogcard__media img { display: block; width: 100%; height: 100%; object-fit: cover; }
/* บทความ 3 ชิ้นไม่มีภาพหน้าปกจริง — ใช้แผ่นครีมมีโลโก้ตัวหนังสือ ไม่ปล่อยเป็นกล่องว่าง */
.mo-blogcard__noimg {
  display: grid; place-items: center; height: 100%;
  font-family: var(--font-display); font-size: var(--fs-h3);
  letter-spacing: var(--ls-eyebrow); color: var(--c-line);
}

.mo-blogcard__body { display: flex; flex-direction: column; flex: 1; padding: var(--sp-3); }
.mo-blogcard .mo-card__meta { margin: 0 0 var(--sp-1); }
.mo-blogcard__title { margin: 0; font-size: var(--fs-h3); line-height: var(--lh-tight); }
.mo-blogcard__title a { color: var(--c-ink); text-decoration: none; transition: color var(--dur) var(--ease); }
.mo-blogcard__title a::after { content: ""; position: absolute; inset: 0; }
.mo-blogcard:hover .mo-blogcard__title a { color: var(--c-accent-text); }
/* ตัดคำอธิบายที่ 3 บรรทัด การ์ดในแถวเดียวกันจะยาวใกล้เคียงกัน ตาไล่อ่านง่าย */
.mo-blogcard__excerpt {
  margin: var(--sp-1) 0 0; font-size: var(--fs-small); line-height: var(--lh-body); color: var(--c-ink-soft);
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; line-clamp: 3; overflow: hidden;
}
/* วันที่ดันไปก้นการ์ดเสมอ ทุกใบในแถวจึงจบระดับเดียวกัน */
.mo-blogcard__date {
  margin: auto 0 0; padding-top: var(--sp-2);
  font-size: var(--fs-micro); color: var(--c-ink-soft); font-variant-numeric: tabular-nums;
}

/* บทความเด่น — ใหญ่กว่าใบอื่นหนึ่งขั้น จอกว้างวางรูปซ้ายข้อความขวา */
.mo-blogcard--feature { margin-bottom: var(--sp-4); }
/* จอแคบบทความเด่นเรียงแบบการ์ดปกติ ขนาดหัวข้อเท่าใบอื่น — ตัว h2 บนจอ 375 กินถึง 4 บรรทัด */
@media (min-width: 861px) {
  .mo-blogcard--feature .mo-blogcard__title { font-size: var(--fs-h2); }
  .mo-blogcard--feature .mo-blogcard__excerpt { font-size: var(--fs-body); -webkit-line-clamp: 4; line-clamp: 4; }
  .mo-blogcard--feature { display: grid; grid-template-columns: 1.35fr 1fr; }
  .mo-blogcard--feature .mo-blogcard__media { aspect-ratio: auto; min-height: 100%; }
  .mo-blogcard--feature .mo-blogcard__body { justify-content: center; padding: var(--sp-4); }
  .mo-blogcard--feature .mo-blogcard__date { margin-top: 0; }
}

/* ตะแกรงระบุจำนวนคอลัมน์ตรง ๆ ไม่ใช้ auto-fit — 12 ใบต่อหน้าหาร 3 และ 2 ลงตัวพอดี
   auto-fit จะเลือกจำนวนคอลัมน์เองตามความกว้าง แล้วอาจได้ 4 ซึ่ง 12 ใบก็ลงตัว
   แต่หน้าสุดท้ายที่เหลือไม่ครบจะเหลือใบโดดได้ง่ายกว่า */
.mo-bloggrid { display: grid; grid-template-columns: 1fr; gap: var(--sp-3); }
@media (min-width: 640px) { .mo-bloggrid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 1000px) { .mo-bloggrid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }

/* เลขหน้า — paginate_links แบบ list · ตัว <ul> ก็ได้คลาส page-numbers ด้วย จึงต้องเลือก li > เท่านั้น */
.mo-pager { margin-top: var(--sp-5); }
.mo-pager ul { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--sp-1); list-style: none; margin: 0; padding: 0; }
.mo-pager li > .page-numbers {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: calc(var(--sp-4) + var(--sp-1)); min-height: calc(var(--sp-4) + var(--sp-1)); padding: 0 var(--sp-2);
  border: 1px solid var(--c-line); border-radius: var(--radius-sm);
  background: var(--c-surface); color: var(--c-ink); text-decoration: none;
  font-size: var(--fs-small); font-variant-numeric: tabular-nums;
}
.mo-pager li > a.page-numbers:hover { border-color: var(--c-accent); }
.mo-pager li > .page-numbers.current { background: var(--c-brand); border-color: var(--c-brand); color: var(--c-ink-invert); }
.mo-pager li > .page-numbers.dots { border-color: transparent; background: none; }
