/* domerch — ส่วนเสริมนอกเหนือ Tailwind (CDN) */

body {
  font-feature-settings: "kern";
}

/* Design Studio: canvas mount ต้องมีความสูงคงที่ก่อน JS engine (Fabric.js/Konva.js) เข้ามาแทนที่ */
#design-canvas-mount {
  touch-action: none;
}

/* scrollbar บาง ๆ สำหรับ filter chip แถวแนวนอนในหน้า Catalog */
.chip-scroll::-webkit-scrollbar {
  height: 4px;
}
.chip-scroll::-webkit-scrollbar-thumb {
  background: rgba(29, 30, 10, 0.15);
  border-radius: 999px;
}

/* FAQ accordion: ซ่อนสามเหลี่ยมของ <summary> ให้ครบทุกเบราว์เซอร์
   `list-none` ของ Tailwind พอสำหรับ Chrome/Firefox แต่ Safari ยังวาดจาก pseudo-element ตัวนี้อยู่
   ผลคือมีลูกศรสองอันซ้อนกัน (ของเบราว์เซอร์ + ไอคอน chevron ของเรา) เฉพาะบน Safari/iOS */
summary::-webkit-details-marker {
  display: none;
}

/* ป๊อปอัพแจ้งเตือน (flash ใน base.html)
   ต้องเป็น keyframes เพราะกล่องพวกนี้ถูกเซิร์ฟเวอร์เรนเดอร์มาพร้อมหน้า ไม่ได้ถูก JS ใส่ทีหลัง
   — transition อย่างเดียวจะไม่มีสถานะ "ก่อนเข้า" ให้เริ่ม กล่องจะโผล่มาเฉยๆ ไม่มีจังหวะเข้า */
@keyframes toast-in {
  from { opacity: 0; transform: translateY(-0.5rem) scale(0.98); }
  to   { opacity: 1; transform: none; }
}
.toast {
  animation: toast-in 180ms ease-out both;
}
/* ขาออกกลับกัน ใช้ transition เพราะต้องเริ่มจากตำแหน่งที่กล่องอยู่ ณ ตอนที่ถูกกดปิด */
.toast[data-leaving] {
  animation: none;
  opacity: 0;
  transform: translateX(0.75rem);
  transition: opacity 160ms ease-in, transform 160ms ease-in;
}
/* เครื่องที่ตั้งค่าลดการเคลื่อนไหวไว้ ให้ขึ้นและหายทันที — ตัวจับเวลาฝั่ง JS ไม่ได้รอ
   transitionend กล่องจึงยังถูกลบตามเวลาเดิมทุกอย่าง แค่ไม่มีอนิเมชัน */
@media (prefers-reduced-motion: reduce) {
  .toast,
  .toast[data-leaving] { animation: none; transition: none; }
}

/* ตัวบอกสถานะ "กำลังโหลด" ของเกาะ React ทุกหน้า — คู่กับ frontend/src/lib/loading.tsx
   ที่นี่มีเฉพาะ @keyframes กับบรรทัด animation ที่อ้างถึงมัน ส่วนขนาด สี และเลย์เอาต์
   อยู่ในคอมโพเนนต์ตามปกติ — keyframes เป็นสิ่งที่ Tailwind utility เขียนไม่ได้จริงๆ
   จึงเป็นเคสของไฟล์นี้ ต้นฉบับของคอมโพเนนต์เรนเดอร์ <style> ไว้ข้างในตัวเอง ซึ่ง React 19
   จะยกขึ้น <head> ให้ต่อเมื่อมี prop `precedence` — ไม่มีแล้วทุก instance ที่ mount
   จะได้ keyframes ชุดเดิมซ้ำอีกก้อนใน DOM

   ตาเดินทางด้วย background-position ไม่ใช่ transform เพราะรูม่านตาเป็น background-image
   ของวงตาเอง ไม่ใช่ element ลูก — ขยับแล้วจึงถูกขอบวงตา crop ให้เองโดยไม่ต้องมี overflow */
@keyframes wandering-eyes-move {
  0%, 10%    { background-position: 0 0; }
  13%, 40%   { background-position: calc(var(--wandering-eyes-eye) * var(--wandering-eyes-travel) * -1) 0; }
  43%, 70%   { background-position: calc(var(--wandering-eyes-eye) * var(--wandering-eyes-travel)) 0; }
  73%, 90%   { background-position: 0 calc(var(--wandering-eyes-eye) * var(--wandering-eyes-travel)); }
  93%, 100%  { background-position: 0 0; }
}
/* กะพริบด้วยการหดความสูง ไม่ใช่ scaleY — วงตาถูกจัดกึ่งกลางด้วย flex ความสูงที่ลดลงจึงหุบ
   เข้าหากึ่งกลางทั้งสองด้าน และรูม่านตาที่เป็น background ถูก crop ตามไปเอง */
@keyframes wandering-eyes-blink {
  0%, 10%, 12%, 20%, 22%, 40%, 42%, 60%, 62%, 70%, 72%, 90%, 92%, 98%, 100% {
    height: var(--wandering-eyes-eye);
  }
  11%, 21%, 41%, 61%, 71%, 91%, 99% {
    height: calc(var(--wandering-eyes-eye) * var(--wandering-eyes-blink));
  }
}
/* ต้นฉบับตั้งไว้ 10s ซึ่งยาวกว่าเวลารอจริงของหน้าใน portal มาก — ทุกหน้ายิง /api/... ครั้งเดียว
   แล้วได้ทั้งหน้ามาในคำตอบเดียว กะพริบครั้งแรกอยู่ที่ 11% ของรอบ ที่ 10s คือรอไปแล้วเกินหนึ่งวินาที
   ซึ่งนานกว่าที่หน้าส่วนใหญ่ใช้โหลด ผลคือเห็นจุดสองจุดนิ่งๆ แล้วหายไป */
.wandering-eye {
  animation: wandering-eyes-move var(--wandering-eyes-duration, 3.2s) infinite,
             wandering-eyes-blink var(--wandering-eyes-duration, 3.2s) infinite;
}
/* ต้องอยู่ในไฟล์นี้ (โหลดหลัง tailwind.css) ไม่ใช่ `motion-reduce:animate-none` ฝั่ง utility
   — specificity เท่ากัน ตัวที่มาทีหลังชนะ ซึ่งคือบรรทัดข้างบนนี้ */
@media (prefers-reduced-motion: reduce) {
  .wandering-eye { animation: none; }
}
