/* ============================================================
   motion-kit.css — a11y-safe motion presets (drop-in)
   ------------------------------------------------------------
   ปรัชญา: "ใส่เต็มที่ + มีเวอร์ชันเซฟให้คนที่ขอ" (progressive enhancement)
     • คนทั่วไป (data-motion="full")    -> เห็น animation เต็ม
     • คนกด Reduce motion ในเครื่อง    -> data-motion="reduced" (set อัตโนมัติจาก
                                           matchMedia ใน motion-kit.js)
   reduce ≠ ศูนย์ : คง opacity / สี / scale เบาๆ ที่ช่วยความเข้าใจ
                    ตัดเฉพาะ movement (translate/parallax/หมุน) ที่ทำคนเวียนหัว
                    (ตาม Emil Kowalski: "reduced motion = fewer & gentler, not zero")

   stack (decision #83/#84):
     • micro-interaction (hover/press/focus) = CSS ล้วน (ไฟล์นี้) — layer 1
     • scroll-reveal / count-up / progress / SVG draw = Motion(motion.dev)
       ขับผ่าน motion-kit.js — แต่ "หน้าตา" ยังวิ่งด้วย CSS transition (off-main-thread)

   cascade contract:
     • element ถูกซ่อน "เฉพาะ" ตอน <html> มี .mk-js (เพิ่มโดย inline script)
       -> ถ้าปิด JS ทั้งหมด คลาสไม่ถูกเพิ่ม -> เนื้อหาโชว์ปกติ (graceful)
     • performance: animate แค่ transform / opacity / clip-path / filter (GPU)
   ============================================================ */

:root {
  /* ---- timing ---- */
  --mk-dur-micro: 160ms;     /* hover / press feedback         */
  --mk-dur-enter: 600ms;     /* scroll-reveal entrances        */
  --mk-dur-exit:  220ms;     /* exits = เร็วกว่า enter เสมอ      */

  /* ---- easing (Emil's strong curves — built-in CSS easings อ่อนไป) ---- */
  --mk-ease-out:    cubic-bezier(0.23, 1, 0.32, 1);     /* enter/exit, สแน็ป  */
  --mk-ease-in-out: cubic-bezier(0.77, 0, 0.175, 1);    /* move/morph         */
  --mk-ease-soft:   cubic-bezier(0.22, 0.61, 0.36, 1);  /* clinical, นุ่มกว่า  */
  --mk-ease-back:   cubic-bezier(0.34, 1.56, 0.64, 1);  /* overshoot เบาๆ     */

  /* ---- distance (calm = 16px, ไม่ใช่ 100px แบบ AOS) ---- */
  --mk-rise: 16px;
}

/* ============================================================
   1) SCROLL-REVEAL ENTRANCES — data-mk="fade|fade-up|scale-in|blur-in|clip|mask"
   ============================================================ */

/* hidden state เปิดเฉพาะตอน JS พร้อม (กัน flash + graceful no-JS) */
html.mk-js [data-mk] {
  opacity: 0;
  transition-property: opacity, transform, filter, clip-path;
  transition-duration: var(--mk-enter, var(--mk-dur-enter));
  transition-timing-function: var(--mk-ease-out);
  transition-delay: var(--mk-delay, 0ms);
  will-change: opacity, transform;
}

/* revealed (เพิ่ม .mk-in โดย motion-kit.js เมื่อ element เข้า viewport) */
html.mk-js [data-mk].mk-in {
  opacity: 1;
  transform: none;
  filter: none;
  clip-path: inset(0 0 0 0);
}

/* replay: motion-kit.js สลับ .mk-replaying บน <html> ชั่วขณะ เพื่อ reset แบบ
   กระโดดทันที (ไม่ทวีนถอยหลังให้ดูวูบ) แล้วค่อยปล่อย transition เล่น enter เต็ม */
html.mk-js.mk-replaying [data-mk],
html.mk-js.mk-replaying [data-mk="mask"] .mk-mask__in,
html.mk-js.mk-replaying .mk-progress__bar,
html.mk-js.mk-replaying [data-mk-draw] path,
html.mk-js.mk-replaying [data-mk-draw] line,
html.mk-js.mk-replaying [data-mk-draw] polyline,
html.mk-js.mk-replaying [data-mk-draw] circle,
html.mk-js.mk-replaying [data-mk-draw] rect { transition-duration: 0s !important; }

/* ---- start states ของแต่ละแบบ ---- */
html.mk-js [data-mk="fade-up"]   { transform: translate3d(0, var(--mk-rise), 0); }
html.mk-js [data-mk="fade-down"] { transform: translate3d(0, calc(var(--mk-rise) * -1), 0); }
html.mk-js [data-mk="fade-left"] { transform: translate3d(calc(var(--mk-rise) * -1), 0, 0); }
html.mk-js [data-mk="fade-right"]{ transform: translate3d(var(--mk-rise), 0, 0); }
html.mk-js [data-mk="scale-in"]  { transform: scale(0.96); }       /* ไม่เริ่มจาก 0 (Emil) */
html.mk-js [data-mk="blur-in"]   { transform: translate3d(0, 8px, 0); filter: blur(10px); }
html.mk-js [data-mk="clip"]      { clip-path: inset(0 0 100% 0); } /* เผยจากล่างขึ้นบน      */
/* "fade" เฉยๆ = opacity อย่างเดียว ไม่ต้องมี transform */
/* "mask" จัดการแยกในส่วน text-mask ด้านล่าง */

/* scale-in ใช้ overshoot curve ให้รู้สึกมีชีวิต */
html.mk-js [data-mk="scale-in"] { transition-timing-function: var(--mk-ease-back); }

/* ============================================================
   2) STAGGER — data-mk-stagger บน parent -> ลูก [data-mk] เหลื่อมเวลา
   (delay จริงเซ็ตเป็น inline --mk-delay โดย motion-kit.js; ค่านี้คือ fallback)
   ============================================================ */
html.mk-js [data-mk-stagger] > [data-mk]:nth-child(1) { --mk-delay: 0ms; }
html.mk-js [data-mk-stagger] > [data-mk]:nth-child(2) { --mk-delay: 60ms; }
html.mk-js [data-mk-stagger] > [data-mk]:nth-child(3) { --mk-delay: 120ms; }
html.mk-js [data-mk-stagger] > [data-mk]:nth-child(4) { --mk-delay: 180ms; }
html.mk-js [data-mk-stagger] > [data-mk]:nth-child(5) { --mk-delay: 240ms; }
html.mk-js [data-mk-stagger] > [data-mk]:nth-child(6) { --mk-delay: 300ms; }

/* ============================================================
   3) TEXT MASK REVEAL — data-mk="mask"
   หัวข้อเลื่อนขึ้นจากใต้ "หน้ากาก" (overflow hidden). markup:
     <span data-mk="mask"><span class="mk-mask__in">ข้อความ</span></span>
   ============================================================ */
html.mk-js [data-mk="mask"] {
  display: inline-block;
  overflow: hidden;
  opacity: 1;               /* ตัว mask ไม่ fade — ลูกข้างในเลื่อนแทน */
  vertical-align: top;
  line-height: 1.05;        /* กันตัวอักษรหางยาว (ฤ ฎ) โดนตัด ปรับตามฟอนต์ */
  padding-bottom: 0.08em;
}
html.mk-js [data-mk="mask"] .mk-mask__in {
  display: inline-block;
  transform: translate3d(0, 105%, 0);
  transition: transform var(--mk-enter, 720ms) var(--mk-ease-out) var(--mk-delay, 0ms);
  will-change: transform;
}
html.mk-js [data-mk="mask"].mk-in .mk-mask__in { transform: none; }

/* ============================================================
   4) SVG PATH DRAW — data-mk-draw บน <svg>
   เส้นวาดตัวเองด้วย stroke-dashoffset (เซ็ต dash โดย motion-kit.js)
   ============================================================ */
html.mk-js [data-mk-draw] path,
html.mk-js [data-mk-draw] line,
html.mk-js [data-mk-draw] polyline,
html.mk-js [data-mk-draw] circle,
html.mk-js [data-mk-draw] rect {
  transition: stroke-dashoffset var(--mk-draw-dur, 1400ms) var(--mk-ease-in-out) var(--mk-delay, 0ms);
}

/* ============================================================
   5) PROGRESS BAR — data-mk-progress="N"
   markup: <div class="mk-progress" data-mk-progress="72"><i class="mk-progress__bar"></i></div>
   ============================================================ */
.mk-progress {
  position: relative;
  height: 10px;
  border-radius: 999px;
  background: var(--mk-track, rgba(0, 0, 0, .08));
  overflow: hidden;
}
.mk-progress__bar {
  display: block;
  height: 100%;
  width: 0%;                /* width จริงเซ็ตโดย JS เมื่อเข้า viewport */
  border-radius: inherit;
  background: var(--mk-accent, currentColor);
  transition: width var(--mk-progress-dur, 900ms) var(--mk-ease-out);
}

/* ============================================================
   6) COUNT-UP — data-mk-count="42" (เลขนับขึ้นใน JS; ไม่มี CSS พิเศษ)
   ใช้ font tabular-nums กันเลขกระตุก
   ============================================================ */
[data-mk-count] { font-variant-numeric: tabular-nums; }

/* ============================================================
   7) MICRO-INTERACTIONS — CSS ล้วน (layer 1)
   hover gate ด้วย (hover:hover) กัน touch ค้าง hover; press ทำงานทุกอุปกรณ์
   ============================================================ */

/* --- ปุ่ม: lift ตอน hover, ยุบตอนกด (Emil: ปุ่มต้องรู้สึก "ฟัง" เรา) --- */
.mk-btn {
  transition: transform var(--mk-dur-micro) var(--mk-ease-out),
              box-shadow var(--mk-dur-micro) var(--mk-ease-out),
              background-color var(--mk-dur-micro) var(--mk-ease-out);
  will-change: transform;
}
@media (hover: hover) and (pointer: fine) {
  .mk-btn:hover { transform: translateY(-2px); }
}
.mk-btn:active { transform: scale(0.97); }   /* feedback ทันที 100-160ms */

/* --- การ์ด: ยกตัว + เงาลึกขึ้นตอน hover --- */
.mk-card {
  transition: transform 200ms var(--mk-ease-out),
              box-shadow 200ms var(--mk-ease-out);
  will-change: transform;
}
@media (hover: hover) and (pointer: fine) {
  .mk-card:hover {
    transform: translateY(-4px);
    box-shadow: 0 18px 40px -18px rgba(0, 0, 0, .35);
  }
}

/* --- ลิงก์: ขีดเส้นใต้ค่อยๆ ลากจากซ้าย --- */
.mk-link {
  background-image: linear-gradient(currentColor, currentColor);
  background-position: 0 100%;
  background-repeat: no-repeat;
  background-size: 0% 1.5px;
  transition: background-size 220ms var(--mk-ease-out);
  text-decoration: none;
}
@media (hover: hover) and (pointer: fine) {
  .mk-link:hover { background-size: 100% 1.5px; }
}
.mk-link:focus-visible { background-size: 100% 1.5px; outline: none; }

/* --- ปุ่มไอคอน: ไอคอนเด้ง/ขยับตอน hover --- */
.mk-icon-btn i,
.mk-icon-btn svg {
  display: inline-block;
  transition: transform 200ms var(--mk-ease-back);
  will-change: transform;
}
@media (hover: hover) and (pointer: fine) {
  .mk-icon-btn:hover i,
  .mk-icon-btn:hover svg { transform: translateX(3px); }
}
.mk-icon-btn:active i,
.mk-icon-btn:active svg { transform: scale(0.9); }

/* ============================================================
   8) REDUCED MOTION — data-motion="reduced"
   set อัตโนมัติจาก matchMedia (motion-kit.js) หรือ override ด้วยมือ (.set)
   หลักการ: เผยทันที + คง opacity/สี + ตัด movement
   ============================================================ */
html.mk-js[data-motion="reduced"] [data-mk] {
  /* คง fade ไว้ (ช่วยความเข้าใจ) แต่ลบ movement/blur/clip ออกหมด */
  transform: none !important;
  filter: none !important;
  clip-path: inset(0 0 0 0) !important;
  transition-property: opacity !important;
  transition-duration: 240ms !important;
}
html.mk-js[data-motion="reduced"] [data-mk="mask"] .mk-mask__in {
  transform: none !important;
  transition: none !important;
}
/* count-up / progress / draw : motion-kit.js จะ "ตั้งค่าสุดท้ายทันที" ไม่ทวีน */
html.mk-js[data-motion="reduced"] .mk-progress__bar { transition: none !important; }
html.mk-js[data-motion="reduced"] [data-mk-draw] path,
html.mk-js[data-motion="reduced"] [data-mk-draw] line,
html.mk-js[data-motion="reduced"] [data-mk-draw] polyline,
html.mk-js[data-motion="reduced"] [data-mk-draw] circle,
html.mk-js[data-motion="reduced"] [data-mk-draw] rect { transition: none !important; }

/* micro: ตัด movement แต่คงสัญญาณด้วย "สี/เงา" (ยังรู้ว่า interactive) */
html.mk-js[data-motion="reduced"] .mk-btn,
html.mk-js[data-motion="reduced"] .mk-card,
html.mk-js[data-motion="reduced"] .mk-icon-btn i,
html.mk-js[data-motion="reduced"] .mk-icon-btn svg {
  transition-property: box-shadow, background-color, color !important;
}
html.mk-js[data-motion="reduced"] .mk-btn:hover,
html.mk-js[data-motion="reduced"] .mk-card:hover,
html.mk-js[data-motion="reduced"] .mk-icon-btn:hover i,
html.mk-js[data-motion="reduced"] .mk-icon-btn:hover svg { transform: none !important; }
html.mk-js[data-motion="reduced"] .mk-btn:active { transform: none !important; }
html.mk-js[data-motion="reduced"] .mk-link { transition: none !important; }

/* ============================================================
   EXPANSION (2026-06-03) — เพิ่มเติม: rotate-in / text / ripple / switch
   / tilt / spotlight / radial ring / marquee / scroll-progress
   ทุกตัวมี reduced-motion override ในบล็อกนี้
   ============================================================ */

/* rotate-in reveal (ตัว reduced ถูกครอบด้วย rule [data-mk] รวมอยู่แล้ว) */
html.mk-js [data-mk="rotate-in"] { transform: rotate(-5deg) scale(0.94); }

/* word-by-word text reveal: motion-kit.js แตกเป็น .mk-word (มี data-mk="fade-up") */
.mk-word { display: inline-block; white-space: pre; }

/* ripple (Material) — JS spawn .mk-ripple__wave ตอน pointerdown */
.mk-ripple { position: relative; overflow: hidden; }
.mk-ripple__wave { position: absolute; border-radius: 50%; transform: scale(0);
  pointer-events: none; background: currentColor; opacity: .3;
  animation: mk-ripple 600ms var(--mk-ease-out) forwards; }
@keyframes mk-ripple { to { transform: scale(2.4); opacity: 0; } }

/* toggle switch (CSS ล้วน) */
.mk-switch { display: inline-flex; align-items: center; gap: 10px; cursor: pointer; user-select: none; }
.mk-switch input { position: absolute; width: 1px; height: 1px; opacity: 0; }
.mk-switch .mk-track { position: relative; width: 46px; height: 26px; border-radius: 999px;
  background: var(--mk-track, rgba(0,0,0,.18)); transition: background-color var(--mk-dur-micro) var(--mk-ease-out); }
.mk-switch .mk-thumb { position: absolute; top: 3px; left: 3px; width: 20px; height: 20px; border-radius: 50%;
  background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,.3); transition: transform var(--mk-dur-micro) var(--mk-ease-back); }
.mk-switch input:checked + .mk-track { background: var(--mk-accent, currentColor); }
.mk-switch input:checked + .mk-track .mk-thumb { transform: translateX(20px); }
.mk-switch input:focus-visible + .mk-track { outline: 2px solid var(--mk-accent, #000); outline-offset: 2px; }

/* 3D tilt (JS เซ็ต --mk-rx/--mk-ry) */
[data-mk-tilt] { transform: perspective(700px) rotateX(var(--mk-rx, 0deg)) rotateY(var(--mk-ry, 0deg));
  transition: transform 130ms ease-out; transform-style: preserve-3d; will-change: transform; }

/* spotlight glow follow (JS เซ็ต --mk-mx/--mk-my %) */
.mk-spotlight { position: relative; }
.mk-spotlight::before { content: ""; position: absolute; inset: 0; pointer-events: none; border-radius: inherit;
  background: radial-gradient(180px circle at var(--mk-mx, 50%) var(--mk-my, 50%),
    color-mix(in srgb, var(--mk-accent, #b4530a) 26%, transparent), transparent 62%);
  opacity: 0; transition: opacity .25s ease; }
.mk-spotlight:hover::before { opacity: 1; }

/* radial ring progress (SVG) — JS เซ็ต stroke-dashoffset + นับเลข */
.mk-ring__track { fill: none; stroke: var(--mk-track, rgba(0,0,0,.1)); }
.mk-ring__bar { fill: none; stroke: var(--mk-accent, currentColor); stroke-linecap: round;
  transform: rotate(-90deg); transform-origin: 50% 50%;
  transition: stroke-dashoffset var(--mk-ring-dur, 1100ms) var(--mk-ease-out); }

/* marquee ticker (JS ทำสำเนาเนื้อหา 2 เท่า) */
.mk-marquee { overflow: hidden; white-space: nowrap;
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
  mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent); }
.mk-marquee__track { display: inline-block; will-change: transform;
  animation: mk-marquee var(--mk-marquee-dur, 22s) linear infinite; }
.mk-marquee:hover .mk-marquee__track { animation-play-state: paused; }
@keyframes mk-marquee { from { transform: translateX(0); } to { transform: translateX(-50%); } }

/* scroll-progress bar (page-level) — JS เซ็ต --mk-scroll (0–1) */
.mk-scrollbar { position: fixed; top: 0; left: 0; height: 3px; width: 100%; z-index: 100;
  transform-origin: 0 50%; transform: scaleX(var(--mk-scroll, 0));
  background: var(--mk-accent, currentColor); }

/* ---- reduced-motion overrides สำหรับ expansion ---- */
html.mk-js[data-motion="reduced"] .mk-ripple__wave { display: none !important; animation: none !important; }
html.mk-js[data-motion="reduced"] [data-mk-tilt] { transform: none !important; transition: none !important; }
html.mk-js[data-motion="reduced"] .mk-switch .mk-thumb { transition: none !important; }
html.mk-js[data-motion="reduced"] .mk-ring__bar { transition: none !important; }
html.mk-js[data-motion="reduced"] .mk-marquee__track { animation: none !important; transform: none !important; }
html.mk-js[data-motion="reduced"] .mk-spotlight::before { transition: none !important; }

/* ============================================================
   9) NO-JS SAFETY NET — ถ้า JS ปิดทั้งหมด ไม่มี data-motion attribute
   reduce-motion user ต้องไม่โดน animation วิ่ง -> บังคับโชว์เต็ม/นิ่ง
   (active เฉพาะตอน attribute ของเรายัง "ไม่ถูกเซ็ต" -> ไม่ขวาง toggle ใน lab)
   ============================================================ */
@media (prefers-reduced-motion: reduce) {
  html:not([data-motion]) [data-mk],
  html:not([data-motion]) .mk-mask__in,
  html:not([data-motion]) .mk-progress__bar {
    opacity: 1 !important;
    transform: none !important;
    filter: none !important;
    clip-path: none !important;
    transition: none !important;
  }
  html:not([data-motion]) .mk-marquee__track { animation: none !important; }
}
