@charset "utf-8";
/* ============================================================
   Cake KMS — Design System
   สกัดจาก cake-kms-mockup.html แล้วแปลง prototype chrome
   (#protobar / #stage.device-*) เป็น media query จริง
   โทเคนสีถูก override ได้จากหน้าตั้งค่า (inject ที่ <html style>)
   ============================================================ */

:root{
  /* Color — พื้นขาว ตัวอักษรดำ ปุ่มชมพูแบรนด์ */
  --blush:#FBCCCC;          /* สีปุ่ม / สีแบรนด์ */
  --blush-deep:#F7B4B4;     /* ขอบปุ่ม, สถานะกด */
  --canvas:#FFFFFF;         /* พื้นหลังหน้า ขาว */
  --surface:#FFFFFF;
  --surface-alt:#FDEFEF;    /* หัวตาราง / แถวสลับ */
  --ink:#000000;            /* ข้อความหลัก ดำ */
  --ink-muted:#3D3D3D;      /* ข้อความรอง เข้มพอให้อ่านชัด */
  --line:#E0D4D4;
  --accent:#C0355F;         /* ลิงก์ + focus ring */
  --accent-soft:#FDE4EA;
  --hover-bg:#000000;       /* hover ปุ่ม: พื้นดำ */
  --hover-ink:#FFFFFF;      /* hover ปุ่ม: อักษรขาว */
  --success:#1F6F52;        /* สีสำเร็จ — อยู่ในชุดที่หน้าตั้งค่า inject ได้ */
  --success-soft:#E2F1EB;   /* พื้นอ่อนของสถานะสำเร็จ */
  --warn:#8A6100;
  --danger:#A3271C;
  --shadow:0 1px 6px rgba(0,0,0,.06);
  --shadow-lg:0 10px 28px rgba(0,0,0,.13);
  --radius:20px;
  --radius-sm:14px;
  --pill:999px;
  --font-display:"LINE Seed Sans TH","Sarabun",sans-serif;
  --font-body:"Sarabun","LINE Seed Sans TH",sans-serif;
  --font-brand:"LINE Seed Sans TH","Sarabun",sans-serif;
  --font-mono:"IBM Plex Mono","Sarabun",monospace;
  --fs:16px;
  --sidebar:252px;
}
*{box-sizing:border-box;margin:0;padding:0}
html{-webkit-text-size-adjust:100%}
body{font-family:var(--font-body);font-size:var(--fs);font-weight:500;color:var(--ink);background:var(--canvas);line-height:1.6;-webkit-font-smoothing:antialiased}
button,input,select,textarea{font:inherit;color:inherit}
button{cursor:pointer;background:none;border:none}
a{color:var(--accent);font-weight:600;text-decoration:underline;text-underline-offset:2px}
:focus-visible{outline:3px solid var(--accent);outline-offset:2px;border-radius:6px}
.mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums}
i.fa-solid,i.fa-regular{font-style:normal;line-height:1}
.thumb i{font-size:17px;color:var(--ink)}
.card .media > i{font-size:38px;color:#B98A93}
.nav-item .ic i,.botnav .ic i{font-size:15px}
h1,h2,h3,h4{font-family:var(--font-display);font-weight:700;letter-spacing:0;line-height:1.3;color:var(--ink)}
b,strong{font-weight:700}
.stamp,.helper,.meta,.crumb,.sub{color:var(--ink-muted)}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
.skip{position:absolute;left:-9999px;top:0;z-index:900;background:var(--ink);color:#fff;padding:10px 18px;border-radius:0 0 var(--radius-sm) 0;font-weight:700}
.skip:focus{left:0}

/* ---------- Login ---------- */
#login{min-height:100vh;display:grid;place-items:center;padding:24px;background:
  radial-gradient(900px 460px at 12% -8%, var(--blush), transparent 62%),
  radial-gradient(700px 400px at 92% 108%, var(--accent-soft), transparent 60%), var(--canvas)}
.login-card{width:100%;max-width:390px;background:var(--surface);border:1px solid var(--line);border-radius:28px;padding:32px 28px;box-shadow:var(--shadow-lg)}
.brandmark{display:flex;align-items:center;gap:10px;margin-bottom:22px}
.brandmark .dot{width:42px;height:42px;border-radius:var(--pill);background:var(--blush);color:var(--ink);display:grid;place-items:center;font-size:19px;font-weight:700;flex:none;overflow:hidden}
.brandmark .dot img{width:100%;height:100%;object-fit:cover}
.brandmark b{font-family:var(--font-brand);font-weight:700;font-size:20px;display:block;line-height:1.2}
.brandmark span{font-size:12px;color:var(--ink-muted)}

/* โลโก้แบบตัวอักษร (wordmark) — ใช้แทนไอคอน+ชื่อ+สโลแกนทั้งชุด
   ⚠ ต้องเป็น object-fit:contain ห้ามใช้ cover
     cover จะครอบตัดตัวอักษรที่หัวและท้ายคำจนอ่านไม่ออก ซึ่งกับโลโก้คือความเสียหาย
   ⚠ กำหนดความสูงสูงสุดไว้ ไม่งั้นไฟล์สูงๆ จะดันเมนูตกจอ */
.brandmark.haslogo{display:block;margin-bottom:20px;padding:2px 6px}
.brandlogo{display:block;width:100%;max-width:190px;max-height:64px;
  object-fit:contain;object-position:left center}
/* หน้าล็อกอินวางโลโก้ไว้กลางการ์ด ไม่ใช่ชิดซ้ายเหมือนเมนูข้าง */
.brandmark.haslogo.mid{text-align:center}
.brandmark.haslogo.mid .brandlogo{margin:0 auto;max-width:230px;max-height:78px;object-position:center}
/* ชื่อเต็มใต้โลโก้ในหน้าล็อกอิน
   ⚠ ต้องมี .brandmark.haslogo นำหน้า ไม่งั้นแพ้ .brandmark span ที่ประกาศไว้ก่อน
   ตัวเล็กและสีจาง เพราะหน้าที่คือบอกว่านี่ระบบอะไร ไม่ใช่มาแย่งสายตาจากโลโก้ */
.brandmark.haslogo .brandsub{display:block;margin-top:10px;font-size:12.5px;
  line-height:1.45;letter-spacing:.02em;color:var(--ink-muted);text-wrap:balance}

/* ช่องตั้งโลโก้ในหน้าตั้งค่า
   ⚠ ต้องใช้คลาส .imgfield และ [data-preview] ร่วมด้วยเสมอ
     JS ตัวช่วยเลือกรูป (app.js) มองหาชื่อพวกนี้ ถ้าตั้งชื่อเองล้วนๆ จะได้ TypeError
     แล้วกรอบดูตัวอย่างไม่ขึ้น — ผู้ใช้ไม่รู้ว่าเลือกไฟล์ติดหรือยัง (เคยพลาดมาแล้ว) */
.logofield{margin-top:4px}
.logoprev{flex:none;width:190px;min-height:74px;border:1.5px dashed var(--line);
  border-radius:var(--radius-sm);background:var(--surface-alt);
  display:grid;place-items:center;padding:10px;overflow:hidden}
/* โลโก้ต้องเห็นเต็มภาพ ห้าม cover เพราะจะครอบตัดตัวอักษร */
.logoprev img{max-width:100%;max-height:56px;object-fit:contain;display:block}
.logoprev.none span{font-size:12px;color:var(--ink-muted);display:flex;align-items:center;gap:6px}
.field{margin-bottom:14px}
.field label{display:block;font-size:13.5px;font-weight:600;color:var(--ink);margin-bottom:5px}
.inp{width:100%;padding:10px 16px;border:1.5px solid #CFC2C2;border-radius:18px;background:var(--surface);font-size:16px;font-weight:500;color:var(--ink)}
.inp:focus{border-color:var(--accent);outline:none;box-shadow:0 0 0 4px var(--accent-soft)}
/* ช่องรหัสผ่านที่มีปุ่มลูกตา — <div class="inp-eye"><input class="inp" type="password"><button class="inp-eye-btn" data-eye>…</button></div> */
.inp-eye{position:relative}
.inp-eye .inp{padding-right:48px}
.inp-eye-btn{position:absolute;right:7px;top:50%;transform:translateY(-50%);width:34px;height:34px;border:0;border-radius:50%;
  background:transparent;color:var(--ink-muted);cursor:pointer;display:grid;place-items:center;font-size:15px;line-height:1}
.inp-eye-btn:hover{color:var(--hover-ink);background:var(--hover-bg)}
.inp-eye-btn:focus-visible{outline:none;color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.inp-eye-btn[aria-pressed="true"]{color:var(--accent)}
input.inp,select.inp{border-radius:var(--pill)}
textarea.inp{border-radius:var(--radius-sm);line-height:1.6}
.alert{border-radius:var(--radius-sm);padding:10px 13px;font-size:13.5px;font-weight:600;margin-bottom:14px}
.alert-err{background:#F8DFDB;border:1px solid #E0AFA8;color:var(--danger)}
.alert-ok{background:var(--success-soft);border:1px solid var(--success);color:var(--success)}

/* ---------- Buttons ---------- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;padding:9px 17px;border-radius:var(--pill);border:1px solid transparent;font-weight:700;font-size:14px;min-height:40px;text-decoration:none}
.btn-primary{background:var(--blush);color:var(--ink);border-color:var(--blush-deep)}
.btn-primary:hover{background:var(--hover-bg);color:var(--hover-ink);border-color:var(--hover-bg)}
.btn-ghost{border-color:#CFC2C2;background:var(--surface);color:var(--ink)}
.btn-ghost:hover{background:var(--hover-bg);color:var(--hover-ink);border-color:var(--hover-bg)}
.btn-danger{border-color:#D8B4AF;background:var(--surface);color:var(--danger)}
.btn-danger:hover{background:var(--danger);color:#fff;border-color:var(--danger)}
.btn-block{width:100%}
.btn-sm{padding:5px 13px;min-height:32px;font-size:13px}
.btn:disabled{opacity:.45;cursor:not-allowed}
.hint{font-size:12px;color:var(--ink-muted);margin-top:14px;padding-top:14px;border-top:1px dashed var(--line)}

/* ---------- Shell ---------- */
.shell{display:grid;grid-template-columns:var(--sidebar) 1fr;min-height:100vh}
aside{background:var(--surface);border-right:1px solid var(--line);padding:16px 12px 30px;position:sticky;top:0;height:100vh;overflow:auto}
.nav-group{margin-bottom:16px}
.nav-group>p{font-family:var(--font-display);font-size:14px;font-weight:700;letter-spacing:.02em;color:#000;padding:0 12px 6px;margin-bottom:7px;border-bottom:1px dashed #000}
.nav-item{display:flex;align-items:center;gap:9px;width:100%;padding:8px 13px;border-radius:var(--pill);font-size:14px;color:var(--ink);text-align:left;font-weight:600;text-decoration:none}
.nav-item:hover{background:var(--hover-bg);color:var(--hover-ink)}
.nav-item.on{background:var(--blush);color:var(--ink);font-weight:700}
.nav-item.on:hover{background:var(--hover-bg);color:var(--hover-ink)}
.nav-item .ic{width:19px;text-align:center;font-size:15px;flex:none}
main{min-width:0;display:flex;flex-direction:column}
.topbar{position:sticky;top:0;z-index:60;background:color-mix(in srgb,var(--canvas) 88%,transparent);backdrop-filter:blur(8px);border-bottom:1px solid var(--line);padding:10px 20px;display:flex;align-items:center;gap:12px}
.searchbtn{flex:1 1 0;min-width:0;max-width:460px;display:flex;align-items:center;gap:8px;padding:9px 15px;
  border:1.5px solid #CFC2C2;background:var(--surface);border-radius:999px;color:var(--ink-muted);
  font-size:14.5px;font-weight:500;text-align:left;white-space:nowrap;overflow:hidden}
.searchbtn > i{flex:none}
.searchbtn .txt{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.searchbtn .txt .short{display:none}
.searchbtn:hover{border-color:var(--ink);color:var(--ink)}
.searchbtn kbd{flex:none;font-family:var(--font-mono);font-size:11px;border:1px solid var(--line);
  border-radius:999px;padding:1px 7px;background:var(--surface-alt);white-space:nowrap}
.topbar .btn{flex:none;white-space:nowrap}
.topbar .sp{flex:1}
.iconbtn{width:40px;height:40px;border-radius:var(--pill);border:1.5px solid #CFC2C2;background:var(--surface);display:grid;place-items:center;font-size:14px;color:var(--ink);flex:none}
.iconbtn:hover{background:var(--hover-bg);color:var(--hover-ink);border-color:var(--hover-bg)}
.avatar{width:34px;height:34px;border-radius:50%;background:var(--blush);color:var(--ink);display:grid;place-items:center;font-size:13px;font-weight:700;flex:none;border:1px solid var(--blush-deep)}
/* รูป Avatar จริง (users.avatar_key) — avatar_html() ใส่ .has-img ให้ · รูปเต็มวงกลม ตัดขอบตามทรง ไม่ยืดสัดส่วน */
.avatar.has-img,.cavatar.has-img{overflow:hidden;padding:0;background:var(--surface-alt)}
.avatar.has-img img,.cavatar.has-img img{width:100%;height:100%;object-fit:cover;display:block;border-radius:inherit}
.avatar.big{width:120px;height:120px;font-size:38px;border-width:2px}
.usermenu{position:relative;flex:none}
/* แจ้งเตือนสาขาใหม่ (26 ก.ย. 2569) — กระดิ่งในแถบบน · ตัวเลขในเมนู · ป้ายบนสาขา · แถบแจ้งบนหน้ารายการ
   ใช้สี accent ของธีม ไม่ใช่สีแดงแจ้งอันตราย — เป็นข่าวให้รับทราบ ไม่ใช่ข้อผิดพลาด */
.notibell{position:relative;text-decoration:none}
.notibell .count{position:absolute;top:-5px;right:-5px;min-width:18px;height:18px;padding:0 5px;border-radius:999px;
  background:var(--accent);color:var(--surface);font-size:10.5px;font-weight:800;display:grid;place-items:center;
  border:2px solid var(--surface);line-height:1}
.navcount{margin-left:auto;font-size:10.5px;font-weight:800;padding:2px 8px;border-radius:999px;
  background:var(--accent);color:var(--surface);white-space:nowrap}
.newbadge{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;font-weight:700;
  padding:2px 3px 2px 9px;border-radius:999px;background:var(--blush);color:var(--ink);
  border:1px solid var(--blush-deep);margin:2px 0 4px}
.newbadge form{display:inline-flex;margin:0}
.newbadge button{width:20px;height:20px;border-radius:999px;border:0;background:transparent;color:var(--ink-muted);
  display:grid;place-items:center;cursor:pointer;font-size:10px;padding:0}
.newbadge button:hover{background:var(--hover-bg);color:var(--hover-ink)}
.newbadge button:focus-visible{outline:2px solid var(--accent);outline-offset:1px}
/* ปุ่มการ์ดภาษาอังกฤษที่ยังมีช่องเป็นภาษาไทย — จุดเล็กมุมปุ่มบอกว่ายังแปลไม่ครบ (รายละเอียดใน title) */
.copyicon.partial{position:relative}
.copyicon.partial::after{content:"";position:absolute;top:3px;right:3px;width:7px;height:7px;border-radius:50%;
  background:var(--accent);border:1.5px solid var(--surface)}
.usermenu>button{display:flex;align-items:center;gap:8px;border-radius:var(--pill);padding:2px 4px}
.usermenu .who{text-align:left;line-height:1.25;max-width:150px}
.usermenu .who b{display:block;font-size:13px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.usermenu .who span{display:block;font-size:11px;color:var(--ink-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.usermenu .drop{position:absolute;right:0;top:calc(100% + 8px);min-width:210px;background:var(--surface);border:1.5px solid var(--line);border-radius:var(--radius-sm);box-shadow:var(--shadow-lg);padding:6px;display:none;z-index:120}
.usermenu.open .drop{display:block}
.usermenu .drop a,.usermenu .drop button{display:flex;align-items:center;gap:9px;width:100%;text-align:left;padding:8px 12px;border-radius:var(--pill);font-size:13.5px;font-weight:600;color:var(--ink);text-decoration:none}
.usermenu .drop a:hover,.usermenu .drop button:hover{background:var(--hover-bg);color:var(--hover-ink)}
.page{padding:20px;flex:1}
.page-head{display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap;margin-bottom:16px}
.page-head h1{font-size:24px;font-weight:700}
.page-head p{font-size:13.5px;color:var(--ink-muted);margin-top:2px}
.page-head .sp{flex:1}
.crumb{font-size:12px;color:var(--ink-muted);margin-bottom:3px}

/* ---------- Bottom nav + drawer (มือถือ) ---------- */
.botnav{display:none}
.botnav button,.botnav a{display:flex;flex-direction:column;align-items:center;gap:2px;font-size:10.5px;color:var(--ink-muted);padding:5px 2px;min-height:48px;border-radius:16px;text-decoration:none;font-weight:600}
.botnav .ic{font-size:17px}
.botnav .on{color:var(--ink);background:var(--blush);font-weight:700}
.drawer{position:fixed;inset:0;z-index:320;display:none}
.drawer.on{display:block}
.drawer .scrim{position:absolute;inset:0;background:rgba(24,21,18,.42)}
.drawer .sheet{position:absolute;inset:0 0 0 auto;width:min(300px,86vw);background:var(--surface);border-left:1px solid var(--line);
  padding:14px 12px 30px;overflow:auto;box-shadow:var(--shadow-lg)}
.drawer .sheet .hd{display:flex;align-items:center;gap:10px;margin-bottom:12px}
.drawer .sheet .hd .sp{flex:1}

/* ---------- Cards / panels ---------- */
.panel{background:var(--surface);border:1.5px solid var(--line);border-radius:var(--radius);overflow:hidden;box-shadow:var(--shadow);margin-bottom:12px}
/* หัวกรอบมีพื้นสี (26 ก.ย. 2569 ตามลูกค้า) — เดิมพื้นขาวเหมือนเนื้อหา แยกไม่ออกว่าหัวข้อจบตรงไหน กรอบไหนเป็นกรอบไหน
   ใช้สีเดียวกับหัวตาราง (--surface-alt) ทั้งระบบจึงมีภาษาเดียว: พื้นชมพูอ่อน = หัวข้อ · พื้นขาว = เนื้อหา
   ⚠ ของที่วางในหัวกรอบซึ่งเดิมใช้ --surface-alt เป็นพื้น จะกลืนหายไป — ให้ใช้ --surface แทน (ดูป้าย b-arch ด้านล่าง) */
.panel-head{padding:12px 14px;border-bottom:1.5px solid var(--line);display:flex;align-items:center;gap:10px;background:var(--surface-alt)}
.panel-head > .fa-solid:first-child{color:var(--accent)}
.panel-head h3{font-size:16px;font-weight:700}
.panel-head .badge.b-arch{background:var(--surface);border:1px solid var(--line)}
.panel-head .sp{flex:1}
.panel-body{padding:14px}

/* ---------- FilterBar ---------- */
.filterbar{background:var(--surface);border:1.5px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:10px 12px;margin-bottom:12px;display:flex;flex-direction:column;gap:10px}
/* สองแถว (26 ก.ย. 2569): บน = ค้นหา + การเรียง + สลับมุมมอง · ล่าง = ตัวกรอง
   ⚠ แถวล่างมีเส้นคั่นบางๆ ให้เห็นว่าเป็นกลุ่มเดียวกัน — เดิมไหลปนกันจนแยกไม่ออกว่าอะไรคือตัวกรอง */
.fb-row{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.fb-filters{border-top:1px dashed var(--line);padding-top:10px}
/* ช่องค้นหาคือตัวควบคุมหลักของแถบนี้ ต้องได้พื้นที่มากที่สุด
   ⚠ flex-basis 320px ไม่ใช่แค่ min-width — บอกให้มันเริ่มจากกว้างแล้วค่อยยอมหด
   ⚠ min-width ต้องมี 100% ใน min() ด้วย ไม่งั้นบนจอแคบช่องจะดันแถบจนล้นออกนอกจอ */
.filterbar .grow{flex:1 1 320px;min-width:min(100%, 260px)}
.fb-row > label{max-width:100%}
.fb-row .sel{max-width:100%}
/* ตัวเลือกแคมเปญยาว (ชื่อ · ช่วงวันที่ · จำนวน) — ไม่จำกัดแล้ว select กว้างตามตัวเลือกที่ยาวที่สุด ดันตัวกรองอื่นตกบรรทัด */
.fb-filters .sel{max-width:320px}   /* 320 (11 ต.ค. 2569) — "การวางขาย: กำลังวางขาย + รอเปิดขาย" ต้องไม่ถูกตัด */
/* ตัวกรองที่เลือกค่าอยู่ ต้องดูออกจากตัวที่ยังเป็น "ทั้งหมด" โดยไม่ต้องอ่านทีละตัว */
.sel.is-set,.fb-datebtn.is-set{border-color:var(--accent);background:var(--accent-soft)}
.fb-lbl{font-size:13px;font-weight:700;color:var(--ink-muted);white-space:nowrap;display:inline-flex;align-items:center;gap:5px}

/* ปุ่มเลือกทีละข้อ (type seg) */
.fb-seg{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap;max-width:100%}
.fb-seg label{position:relative;cursor:pointer}
.fb-seg input{position:absolute;opacity:0;width:1px;height:1px;pointer-events:none}
.fb-seg label span{display:inline-flex;align-items:center;min-height:34px;padding:5px 13px;border:1.5px solid #CFC2C2;
  border-radius:var(--pill);font-size:13.5px;font-weight:600;background:var(--surface);white-space:nowrap}
.fb-seg label:hover span{border-color:var(--ink)}
.fb-seg input:checked + span{background:var(--blush);border-color:var(--blush-deep);font-weight:700}
.fb-seg input:focus-visible + span{outline:2px solid var(--accent);outline-offset:2px}

/* ปฏิทินช่วงวันที่ — ปุ่ม + กล่องกาง */
.fb-date{position:relative;max-width:100%}
.fb-datebtn{display:inline-flex;align-items:center;gap:8px;min-height:36px;max-width:100%;padding:6px 14px;border:1.5px solid #CFC2C2;
  border-radius:var(--pill);background:var(--surface);font-size:14px;font-weight:600;color:var(--ink);cursor:pointer;text-align:left}
.fb-datebtn:hover{border-color:var(--ink)}
.fb-datebtn b{font-weight:700}
.fb-datebtn .caret{font-size:11px;transition:transform .15s}
.fb-datebtn[aria-expanded="true"] .caret{transform:rotate(180deg)}
.fb-pop{position:absolute;top:calc(100% + 6px);left:0;z-index:40;width:min(360px, calc(100vw - 24px));
  background:var(--surface);border:1.5px solid var(--line);border-radius:var(--radius-sm);box-shadow:var(--shadow-lg);padding:12px 14px 14px}
.fb-pop-h{font-size:12px;font-weight:700;color:var(--ink-muted);margin:0 0 6px;letter-spacing:.02em}
.fb-pop-h + .fb-custom{margin-bottom:2px}
.fb-presets{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin-bottom:12px}
.fb-presets button{display:flex;flex-direction:column;align-items:flex-start;gap:1px;padding:7px 11px;border:1.5px solid var(--line);
  border-radius:12px;background:var(--surface);cursor:pointer;text-align:left;color:var(--ink)}
.fb-presets button b{font-size:13.5px}
.fb-presets button small{font-size:11.5px;color:var(--ink-muted);font-variant-numeric:tabular-nums}
.fb-presets button:hover{border-color:var(--ink)}
.fb-presets button.on{background:var(--blush);border-color:var(--blush-deep)}
.fb-custom{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.fb-custom label{display:flex;flex-direction:column;gap:3px;min-width:0}
.fb-custom label span{font-size:12.5px;font-weight:600}
.fb-custom .inp{font-size:14px;padding:7px 10px;min-width:0}
.fb-pop-note{margin:6px 0 10px}
.fb-pop-hint{margin:8px 0 0;font-size:12.5px;font-weight:600;background:var(--accent-soft);border-radius:10px;padding:6px 10px;display:flex;gap:6px;align-items:baseline}
.fb-pop-actions{display:flex;align-items:center;gap:8px;border-top:1px solid var(--line);padding-top:10px}

/* chip ตัวกรองที่ใช้อยู่ — อยู่นอกฟอร์ม (ดู filterbar.php) */
.fb-chips{display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin:-4px 2px 12px}
.fb-clear{font-size:12.5px;font-weight:700;color:var(--accent);text-decoration:none;display:inline-flex;align-items:center;gap:4px;margin-left:4px}
.fb-clear:hover{text-decoration:underline}
@media (max-width:640px){
  .fb-filters > label,.fb-filters .sel,.fb-date,.fb-datebtn{width:100%;max-width:none}
  .fb-seg .fb-lbl{width:100%}
}
/* กำลังค้นหาสด — วงหมุนเล็กๆ ในช่องพิมพ์ ไม่ปิดกั้นการพิมพ์ต่อ */
.filterbar .grow{position:relative}
.filterbar.searching .grow::after{content:"";position:absolute;right:11px;top:50%;width:14px;height:14px;
  margin-top:-7px;border:2px solid var(--line);border-top-color:var(--accent);border-radius:50%;
  animation:spin .7s linear infinite;pointer-events:none}
.filterbar.searching .grow .inp{padding-right:34px}
.sel{padding:7px 15px;border:1.5px solid #CFC2C2;border-radius:var(--pill);background:var(--surface);font-size:14px;font-weight:600;color:var(--ink);min-height:36px}
.sel:hover{border-color:var(--ink)}
.seg{display:flex;border:1px solid var(--line);border-radius:var(--pill);overflow:hidden;flex:none}
.seg button,.seg a{padding:6px 13px;font-size:13.5px;font-weight:600;color:var(--ink);min-height:36px;display:inline-flex;align-items:center;gap:6px;text-decoration:none}
.seg button:hover,.seg a:hover{background:var(--hover-bg);color:var(--hover-ink)}
.seg .on{background:var(--blush);color:var(--ink);font-weight:700}
.seg .on:hover{background:var(--hover-bg);color:var(--hover-ink)}
.chips{display:flex;gap:6px;flex-wrap:wrap;width:100%}
.chip{display:inline-flex;align-items:center;gap:5px;background:var(--blush);color:var(--ink);font-weight:600;border-radius:999px;padding:3px 11px;font-size:12.5px;text-decoration:none}
.chip a,.chip button{color:inherit;font-size:13px;line-height:1;text-decoration:none}

/* ---------- Table ---------- */
.tablewrap{overflow:auto;border:1.5px solid var(--line);border-radius:var(--radius);background:var(--surface);box-shadow:var(--shadow)}
table{border-collapse:collapse;width:100%;font-size:14px;white-space:nowrap}
th{text-align:left;font-family:var(--font-display);font-weight:700;font-size:13px;color:var(--ink);padding:12px 14px;border-bottom:1.5px solid var(--line);background:var(--surface-alt);position:sticky;top:0}
th.sortable{padding:0;white-space:nowrap}
th.sortable a{display:block;padding:12px 14px;color:var(--ink);font-weight:700;text-decoration:none;user-select:none}
th.sortable a:hover{background:var(--blush)}
th.sortable .sarrow{margin-left:6px;font-size:11px;opacity:.35}
/* คอลัมน์ที่กำลังเรียงอยู่ (26 ก.ย. 2569 ตามลูกค้า) — เดิมทาพื้นชมพูเข้มทั้งช่อง ดูเหมือนหัวตารางคนละสี
   ตอนนี้พื้นเท่าหัวอื่น บอกด้วยลูกศรสีแบรนด์ + เส้นใต้ ซึ่งพอให้รู้ว่าเรียงตามคอลัมน์ไหน */
th.sortable.act a{box-shadow:inset 0 -2.5px 0 var(--accent)}
th.sortable.act .sarrow{opacity:1;color:var(--accent)}
td{padding:10px 12px;border-bottom:1px solid var(--line);vertical-align:middle}
tbody tr:last-child td{border-bottom:none}
tbody tr:hover{background:var(--surface-alt)}
.thumb{width:40px;height:40px;border-radius:14px;display:grid;place-items:center;font-size:19px;background:linear-gradient(135deg,var(--accent-soft),var(--surface-alt));flex:none;overflow:hidden}
img.thumb{object-fit:cover;display:block}
.cellname b{display:block;font-weight:700;font-size:14.5px}
.cellname span{display:block;font-size:12.5px;color:var(--ink-muted)}
.rowacts{display:flex;gap:6px}
.rowarchive{display:contents}   /* ฟอร์มเก็บเข้าคลัง — ไม่ให้กล่องฟอร์มดันปุ่มออกจากแถว */
/* ตารางสาขา (26 ก.ย. 2569) — พื้นที่ · ชำระเงิน · ปุ่มท้ายแถว */
.tarea{display:flex;flex-direction:column;gap:2px;white-space:nowrap;font-size:13.5px}
.tarea b{font-weight:700;display:inline-flex;align-items:center;gap:6px}
.tarea b .fa-solid{color:var(--accent);font-size:12.5px}
.tarea span{color:var(--ink-muted);font-size:12.5px;padding-left:20px;font-variant-numeric:tabular-nums}
.paystack{display:flex;flex-direction:column;align-items:flex-start;gap:6px;min-width:118px}
.paystack .paychip{padding:3px 11px;font-size:12.5px;background:var(--surface)}
.paystack .paychip .fa-solid{width:14px;text-align:center;color:var(--ink-muted)}
/* ปุ่มท้ายแถว: ตาราง 3 ช่องเท่ากัน — แถวบน คัดลอก 3 แบบ · แถวล่าง แก้ไข (กว้าง 2 ช่อง มีข้อความ) + ลบ ชิดขอบขวา
   ⚠ ปุ่มลบอยู่มุมล่างขวาเสมอ ห่างจากปุ่มคัดลอกที่กดบ่อยที่สุด ลดโอกาสกดพลาด */
.bracts{display:grid;grid-template-columns:repeat(3,36px);gap:6px;justify-content:end}
.bracts .rowacts{display:contents}
.bracts .copyicon.wide{grid-column:span 2;width:auto;display:inline-flex;align-items:center;justify-content:center;gap:6px;
  font-size:12.5px;font-weight:700;text-decoration:none}
.bracts .copyicon.wide:only-child,.bracts .rowacts > .copyicon.wide:last-child{grid-column:span 3}

/* ---------- ตารางโปรโมชั่น ----------
   ปัญหาเดิม: ข้อความดิบจากชีตยาวหลายย่อหน้า ตัดบรรทัดอิสระในคอลัมน์แคบ
   แถวเดียวสูงเกิน 150px มองเห็นได้ทีละ 2 แถว ตารางจึงใช้กวาดสายตาหาของไม่ได้เลย
   ทางแก้: ทุกช่องจำกัดไม่เกิน 2 บรรทัด ข้อความเต็มอยู่ใน title (tooltip) และหน้ารายละเอียด */
.promotable td{vertical-align:top;white-space:normal;padding:11px 12px}
.promotable .pcell{display:flex;flex-direction:column;gap:3px;min-width:0}

.promotable .pseq{width:52px;font-family:var(--font-mono);font-size:12px;
  color:var(--ink-muted);padding-top:14px}

/* ป้ายแคมเปญเหนือชื่อ — บอกว่าโปรฯ นี้อยู่ในชุดไหน โดยไม่แย่งน้ำหนักจากชื่อ */
.promotable .peyebrow{display:flex;align-items:center;gap:6px;font-size:12px;font-weight:600;
  color:var(--ink-muted);line-height:1.35;text-decoration:none;margin-bottom:4px}
.promotable .peyebrow .fa-solid{color:var(--accent);font-size:11px}
a.peyebrow:hover{color:var(--accent);text-decoration:underline}
/* ชื่อโปรฯ ใช้ Sarabun ตัวหนาแบบเดียวกับช่องอื่นในตาราง (27 ก.ย. 2569 ตามลูกค้า — ฟอนต์หัวข้ออ่านยากเมื่อชื่อยาวสองบรรทัด) */
.promotable .ptitle{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  font-family:var(--font-body);font-weight:700;font-size:15px;line-height:1.45;
  color:var(--ink);text-decoration:none;overflow-wrap:anywhere}
.promotable .ptitle:hover{color:var(--accent);text-decoration:underline}
.promotable .pmeta{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:1px}
.promotable .pcode{display:inline-block;background:var(--surface-alt);border:1px solid var(--line);
  border-radius:8px;padding:1px 7px;font-size:11.5px;color:var(--ink-muted);
  max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

.promotable .pdate{font-family:var(--font-display);font-weight:700;font-size:13px;line-height:1.4}
/* แปลงวันที่จากข้อความไม่ได้ = โชว์ข้อความดิบ ต้องดูต่างจากวันที่ที่ระบบเข้าใจแล้ว */
.promotable .pdate.raw{font-weight:500;color:var(--ink-muted);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.promotable .pnote,.promotable .pch{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  overflow:hidden;font-size:12px;line-height:1.45;color:var(--ink-muted);overflow-wrap:anywhere}
/* ป้ายเล็กใต้ช่วงเวลา: วันที่ชุดนี้ยืมมาจากแคมเปญ ไม่ใช่ของกิจกรรมเอง (23 ก.ย. 2569)
   ต้องเบากว่าตัววันที่ชัดเจน — เป็นที่มาของข้อมูล ไม่ใช่ข้อมูลที่ CS ต้องอ่านออกเสียงให้ลูกค้า */
.promotable .pfrom{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:600;color:var(--ink-muted)}
.promotable .pfrom i{font-size:10px}
.promotable .pdash{color:var(--ink-muted)}
.promotable .ppick{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;
  color:var(--ink-muted);line-height:1.3;flex-wrap:wrap;overflow-wrap:anywhere}
.promotable .ptype{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* แถวที่หมดอายุแล้วยังต้องอ่านออกชัดเจน — เปลี่ยนแค่สีเป็นเทา คงตัวหนาไว้ (27 ก.ย. 2569: ตัวบางอ่านยาก ลูกค้าขอให้อ่านง่าย)
   (opacity ทั้งแถวทำให้ contrast ตกจนอ่านยาก) */
.promotable tr.is-expired .ptitle{color:var(--ink-muted)}

/* ---------- แท็บหมวดหมู่ ---------- */
/* แถบชิปหมวด/จังหวัด

   ⚠ เดิมใช้ overflow-x:auto ให้เลื่อนแนวนอน — เลิกใช้แล้วเพราะวัดได้ว่าใช้จริงไม่ได้
     บน macOS แถบเลื่อนเป็นแบบซ่อนตัวเอง กินพื้นที่ 0px จึงไม่มีอะไรบอกผู้ใช้เลยว่ามีของอยู่ทางขวา
     และเมาส์ธรรมดาเลื่อนแนวนอนไม่ได้ถ้าไม่กด Shift ค้าง ซึ่งคนส่วนใหญ่ไม่รู้
     วัดจริง: หน้าโปรโมชั่นซ่อนไป 6 จาก 11 ชิป · หน้าสาขาซ่อนไป 4 จาก 10

   ⚠ ตอนนี้ตัดขึ้นบรรทัดใหม่แทน ทุกชิปเห็นได้โดยไม่ต้องคลิกอะไรเลย
     แล้วจำกัดความสูงไว้ 2 แถวเพื่อไม่ให้กินพื้นที่หน้าจอตอนจังหวัดเยอะขึ้น
     ส่วนที่เกินซ่อนไว้ใต้ปุ่ม "อีก N รายการ" ซึ่ง JS เป็นคนใส่ให้ (app.js ส่วนที่ 13)

   ⚠ ถ้า JS ไม่ทำงาน จะไม่มีการจำกัดความสูง = เห็นครบทุกชิป แค่แถบสูงขึ้น
     ห้ามใส่ max-height ไว้ใน CSS ตรงนี้ ไม่งั้นตอน JS พังจะกลายเป็นชิปหายถาวร */
.cattabs{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:12px;padding:2px 2px 4px;position:relative}
/* คลิปเฉพาะตอน JS วัดแล้วว่าเกิน 2 แถวจริง — JS เป็นคนใส่ทั้งคลาสและ max-height
   ⚠ ไม่ใส่เงาจางที่ขอบล่าง เพราะ JS ตัดตรงรอยต่อแถวพอดี ไม่มีชิปโผล่ครึ่งตัวให้ต้องบอกใบ้
     เงาจะไปทับชิปแถวสองที่สมบูรณ์อยู่แล้วให้ดูมัวเปล่าๆ · ปุ่มบอกจำนวนชัดกว่าอยู่แล้ว */
.cattabs.clipped{overflow:hidden}

/* ปุ่มขยาย/ย่อ — เป็นชิปสีอ่อน ไม่ใช่เส้นประ
   ⚠ เส้นประสื่อว่า "ช่องว่างรอเติมของ" ซึ่งคนละความหมายกับ "กดเพื่อดูเพิ่ม"
   ⚠ ห้ามทำหน้าตาเหมือน .cattab เป๊ะ เพราะมันไม่ใช่ตัวกรอง กดแล้วผลลัพธ์ไม่เปลี่ยน */
.cattoggle{display:inline-flex;align-items:center;gap:8px;margin:-4px 0 14px;padding:8px 16px;min-height:38px;
  border:0;background:var(--surface-alt);border-radius:var(--pill);
  font-size:13.5px;font-weight:700;color:var(--ink-muted);cursor:pointer;
  transition:background .12s,color .12s}
.cattoggle:hover{background:var(--hover-bg);color:var(--hover-ink)}
.cattoggle:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.cattoggle i{font-size:11px;transition:transform .18s}
.cattabs.open + .cattoggle i{transform:rotate(180deg)}
@media (prefers-reduced-motion:reduce){.cattoggle,.cattoggle i{transition:none}}

.cattab{display:inline-flex;align-items:center;gap:8px;flex:none;padding:8px 16px;min-height:42px;
  border:1.5px solid #CFC2C2;background:var(--surface);border-radius:var(--pill);
  font-size:14.5px;font-weight:600;color:var(--ink);white-space:nowrap;text-decoration:none}
.cattab:hover{background:var(--hover-bg);color:var(--hover-ink);border-color:var(--hover-bg)}
.cattab .n{font-family:var(--font-mono);font-size:12.5px;font-weight:600;background:var(--surface-alt);
  color:var(--ink-muted);border-radius:var(--pill);padding:1px 9px}
.cattab:hover .n{background:rgba(255,255,255,.22);color:#fff}
.cattab.on{background:var(--blush);border-color:var(--blush-deep);font-weight:700}
.cattab.on .n{background:var(--surface);color:var(--ink)}
.cattab.on:hover{background:var(--hover-bg);color:var(--hover-ink);border-color:var(--hover-bg)}
.cattab.zero{opacity:.5}
/* แถบหมวดย่อยใต้แท็บหมวด (11 ต.ค. 2569) — เล็กกว่า .cattab หนึ่งขั้น ให้อ่านเป็นตัวเลือกชั้นที่สองของหมวดที่เลือก */
.subtabs{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:-4px 0 14px;padding:8px 10px;
  border-radius:16px;background:var(--surface-alt);border:1px dashed var(--line)}
.subtabslbl{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;font-weight:700;color:var(--ink-muted);margin-right:2px}
.subtabslbl .fa-solid{font-size:11px}
.subtab{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;min-height:32px;border:1.5px solid #CFC2C2;
  background:var(--surface);border-radius:var(--pill);font-size:13.5px;font-weight:600;color:var(--ink);white-space:nowrap;text-decoration:none}
.subtab .n{font-family:var(--font-mono);font-size:11.5px;font-weight:600;background:var(--surface-alt);color:var(--ink-muted);
  border-radius:var(--pill);padding:0 7px}
.subtab:hover{background:var(--hover-bg);color:var(--hover-ink);border-color:var(--hover-bg)}
.subtab:hover .n{background:rgba(255,255,255,.22);color:#fff}
.subtab.on{background:var(--blush);border-color:var(--blush-deep);font-weight:700}
.subtab.on .n{background:var(--surface);color:var(--ink)}
.subtab.zero{opacity:.5}
.subtab.is-none{border-style:dashed}
.subtab:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
/* ช่อง "จังหวัดอื่น" ในแถวชิปจังหวัด — ทรงเดียวกับชิป (สูง 42 · ขอบมน) ให้อ่านเป็นตัวเลือกกลุ่มเดียวกัน */
.provmore{flex:0 1 300px;min-width:min(100%,240px)}
.provmore .combo-input{min-height:42px;padding-top:8px;padding-bottom:8px;font-size:14.5px;font-weight:600;
  border-radius:var(--pill);border-color:#CFC2C2}
.provmore .combo.has-value .combo-input{background:var(--blush);border-color:var(--blush-deep)}
.sortpick{display:flex;align-items:center;gap:6px;flex:none}
.sortpick>span{font-size:13px;font-weight:600;color:var(--ink-muted);white-space:nowrap}
.dirbtn{border:1.5px solid #CFC2C2;background:var(--surface);border-radius:var(--pill);width:36px;height:36px;display:grid;place-items:center;font-size:13px;color:var(--ink);text-decoration:none}
.dirbtn:hover{background:var(--hover-bg);color:var(--hover-ink);border-color:var(--hover-bg)}

/* ---------- Carousel รูปสินค้า ---------- */
.carousel{position:relative;overflow:hidden;background:var(--surface-alt);display:block}
.carousel .track{position:absolute;inset:0;display:flex;transition:transform .32s cubic-bezier(.4,0,.2,1)}
.carousel .track>div{flex:0 0 100%;position:relative;height:100%}
.carousel .track img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
.carousel .nav{position:absolute;top:50%;margin-top:-14px;width:28px;height:28px;border-radius:var(--pill);
  background:rgba(255,255,255,.92);border:1px solid rgba(0,0,0,.07);box-shadow:0 1px 4px rgba(0,0,0,.14);
  display:grid;place-items:center;padding:0;min-height:0;color:var(--ink);
  opacity:0;transition:opacity .16s ease,background .16s ease,color .16s ease;z-index:2}
.carousel .nav i{font-size:11px;line-height:1}
.carousel:hover .nav,.carousel:focus-within .nav{opacity:1}
.carousel .nav:hover{background:var(--ink);color:#fff;border-color:var(--ink)}
.carousel .nav.prev{left:7px} .carousel .nav.next{right:7px}
.carousel .dots{position:absolute;bottom:7px;left:0;right:0;display:flex;justify-content:center;gap:4px;z-index:2}
.carousel .dots button{width:5px;height:5px;border-radius:var(--pill);background:rgba(255,255,255,.7);
  box-shadow:0 0 2px rgba(0,0,0,.35);padding:0;min-height:0;transition:width .2s ease,background .2s ease}
.carousel .dots button.on{background:#fff;width:14px}
.carousel .count{position:absolute;top:7px;right:7px;z-index:2;background:rgba(255,255,255,.9);
  border:1px solid rgba(0,0,0,.06);border-radius:var(--pill);padding:1px 7px;
  font-family:var(--font-mono);font-size:10.5px;font-weight:600;letter-spacing:0;line-height:1.5}
/* จอสัมผัสไม่มี hover — แสดงลูกศรตลอด แต่จางลงเพื่อไม่บังรูป */
@media (hover:none){.carousel .nav{opacity:.85}}
/* carousel ใหญ่ในหน้ารายละเอียด ปุ่มโตขึ้นตามสัดส่วนภาพ */
.detail .carousel .nav{width:34px;height:34px;margin-top:-17px}
.detail .carousel .nav i{font-size:13px}
.detail .carousel .count{font-size:11.5px;padding:2px 9px;top:9px;right:9px}
.detail .carousel .dots{bottom:9px}
.detail .carousel .dots button{width:6px;height:6px}
.detail .carousel .dots button.on{width:17px}
.thumbstrip{display:flex;gap:7px;overflow-x:auto;margin-top:9px;padding-bottom:4px}
.thumbstrip button{flex:none;width:64px;aspect-ratio:1;border-radius:14px;overflow:hidden;border:2px solid transparent;background:var(--surface-alt);padding:0;position:relative}
.thumbstrip button img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.thumbstrip button.on{border-color:var(--ink)}
/* รูปไส้สินค้าในกรอบรูปสินค้า (28 ก.ย. 2569) — เป็นรูปสุดท้าย แสดงเต็มใบ · ป้าย "ไส้สินค้า" มุมซ้ายบน
   ⚠ .slidelink ห่อ <img> จึงต้องวางรูปเองอีกชั้น (.media > img ใช้กับรูปที่อยู่ในลิงก์ไม่ได้) */
.slidelink{position:absolute;inset:0;display:block;cursor:zoom-in}
.slidelink img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
.media.is-contain,.carousel .track>.is-contain{background:linear-gradient(180deg,var(--surface-alt),var(--accent-soft))}
.media.is-contain img,.carousel .track>.is-contain img{object-fit:contain}
.slidebadge{position:absolute;top:9px;left:9px;z-index:2;display:inline-flex;align-items:center;gap:5px;pointer-events:none;
  background:var(--ink);color:#fff;font-size:12px;font-weight:700;padding:3px 10px 3px 9px;border-radius:var(--pill);box-shadow:0 1px 4px rgba(0,0,0,.18)}
.slidebadge i{font-size:11px}
/* รูปย่อของไส้: ติดขอบขวาของแถบเสมอ (sticky) — รูปสินค้าเยอะจนเลื่อนแถบก็ยังเห็นไส้
   พื้นขาวทางซ้าย (box-shadow) บังรูปสินค้าที่เลื่อนลอดใต้ · ป้าย "ไส้" ติดล่าง */
.thumbstrip button.is-fill{position:sticky;right:0;z-index:1;margin-left:6px;overflow:visible;
  box-shadow:-10px 0 0 var(--surface),-14px 0 10px -4px rgba(0,0,0,.08)}
.thumbstrip button.is-fill img{border-radius:12px;object-position:center 40%}
.thumbtag{position:absolute;left:50%;bottom:-2px;transform:translateX(-50%);background:var(--ink);color:#fff;
  font-size:10.5px;font-weight:700;line-height:1;padding:3px 8px;border-radius:var(--pill);white-space:nowrap}
.fillnav{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:9px}
.fillgo{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);background:var(--surface);color:var(--ink);
  border-radius:var(--pill);padding:6px 13px;min-height:36px;font-size:13px;font-weight:600}
.fillgo:hover{background:var(--hover-bg);color:var(--hover-ink);border-color:var(--hover-bg)}
.fillgo.on{background:var(--surface-alt);border-color:var(--ink)}
.fillgo.is-static,.fillgo.is-static:hover{background:none;border-color:transparent;color:var(--ink-muted);padding-left:2px}
.fillnav .copychip.fillcopy{width:auto;min-height:36px;padding:6px 14px;font-size:13px}
.fillhint{margin:9px 0 0}

/* ---------- การ์ดแคตตาล็อก (หน้านำเสนอสินค้า) ---------- */
/* ⚠ ขนาดตัวอักษรในการ์ดผูกกับ "ความกว้างของการ์ด" ไม่ใช่ความกว้างจอ
   เพราะการ์ดใบเดียวกันกว้าง ~250px ตอน 4 คอลัมน์ แต่กว้าง ~460px ตอนคอลัมน์เดียว
   ถ้าใช้ px ตายตัวจะใหญ่เกินตอนแคบและเล็กเกินตอนกว้าง — คุมด้วย --cfs ตัวเดียวแล้วคูณต่อ
   ⚠ ต้องมีค่า --cfs แบบ px ไว้ก่อนเสมอ เผื่อเบราว์เซอร์เก่าที่ไม่รู้จัก container query
   ⚠ ห้ามตั้งชื่อว่า --fs เพราะซ้ำกับโทเคนขนาดตัวอักษรหลักของทั้งระบบ */
/* สีกรอบหยักปรับได้จากหน้าตั้งค่า (--card-frame) ค่าหลังคอมมาคือค่าที่ใช้เมื่อยังไม่เคยตั้ง */
.ccard{--pink:var(--card-frame,#F9CEDD);--d:24px;min-width:0;--cfs:14px}
@supports (container-type:inline-size){
  .ccard{container-type:inline-size;--cfs:clamp(13px,3.4cqi,15px)}
}
/* flex:1 ทำให้กรอบหยักยืดเต็มความสูงของการ์ดเสมอ ไม่ว่ารายการขนาดจะสั้นยาวต่างกัน */
.ccard .sc{background:var(--pink);padding:14px;display:flex;flex-direction:column;flex:1;height:100%;min-width:0;
  -webkit-mask:
    radial-gradient(closest-side,#000 98%,#0000) 0 0/var(--d) var(--d) round,
    linear-gradient(#000 0 0) 50%/calc(100% - var(--d)) calc(100% - var(--d)) no-repeat;
  mask:
    radial-gradient(closest-side,#000 98%,#0000) 0 0/var(--d) var(--d) round,
    linear-gradient(#000 0 0) 50%/calc(100% - var(--d)) calc(100% - var(--d)) no-repeat;}
.ccard .cinner{display:flex;flex-direction:column;flex:1;background:none;border-radius:0;overflow:visible}
.ccard .cmedia{position:relative;overflow:hidden;aspect-ratio:1;background:var(--pink);border-radius:0}
.ccard .cmedia img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
/* สิ้นสุดการวางขาย (28 ก.ย. 2569) — กรอบหยักเทา · รูปซีด · แถบเทาเข้มพาดกลางรูป
   ⚠ แถบวางใน <a> ที่ห่อ carousel (ไม่ใช่ใน .sc) ตำแหน่งกลางรูปจึงไม่คลาดเมื่อการ์ดสูงไม่เท่ากัน */
.ccard.is-ended{--pink:#DCD9D9}
.ccard.is-ended .cinner > a{position:relative}
.ccard.is-ended .cmedia img{filter:grayscale(.85);opacity:.8}
.ccard.is-ended .cnames span{color:#5E5A5A}
.endband{position:absolute;left:0;right:0;top:50%;transform:translateY(-50%);z-index:3;pointer-events:none;
  display:flex;align-items:center;justify-content:center;gap:8px;padding:9px 12px;
  background:rgba(70,66,66,.78);color:#fff;font-weight:800;font-size:15px;letter-spacing:.03em}
.ccard .cinfo{background:none;padding:12px 2px 2px;flex:1;display:flex;flex-direction:column}
.ccard .chead{display:flex;align-items:center;gap:10px;padding-bottom:10px}
.ccard .ccode{--cd:15px;background:#fff;padding:9px 20px;display:inline-block;flex:none;
  font-family:var(--font-display);font-weight:700;font-size:calc(var(--cfs) * .95);
  letter-spacing:.02em;white-space:nowrap;line-height:1;
  -webkit-mask:
    radial-gradient(closest-side,#000 98%,#0000) 0 0/var(--cd) var(--cd) round,
    linear-gradient(#000 0 0) 50%/calc(100% - var(--cd)) calc(100% - var(--cd)) no-repeat;
  mask:
    radial-gradient(closest-side,#000 98%,#0000) 0 0/var(--cd) var(--cd) round,
    linear-gradient(#000 0 0) 50%/calc(100% - var(--cd)) calc(100% - var(--cd)) no-repeat;}
.ccard .cname{margin-left:auto;font-family:var(--font-display);font-weight:700;font-size:calc(var(--cfs) * 1.2);
  text-align:right;line-height:1.25;min-width:0;overflow-wrap:anywhere}
.ccard .cnames{border-top:2px solid #fff;padding:9px 0 10px;line-height:1.35;min-width:0}
.ccard .cnames b{display:block;font-family:var(--font-display);font-weight:700;font-size:var(--cfs);overflow-wrap:anywhere}
.ccard .cnames span{display:block;font-size:calc(var(--cfs) * .9);font-weight:500;color:#5B4A44;overflow-wrap:anywhere}
.ccard .cprice{border-top:2px solid #fff;margin:0;padding:0;list-style:none}
.ccard .cprice li{display:flex;align-items:baseline;gap:8px;padding:6px 0;border-top:1.5px solid #fff}
.ccard .cprice li:first-child{border-top:none}
/* ⚠ ห้าม nowrap ที่ช่องซ้าย — ชื่อขนาดบวกขนาดถาดยาวกว่าการ์ดเสมอ แล้วจะทะลุกรอบหยักออกไป */
.ccard .cprice .s{flex:1;min-width:0;font-family:var(--font-display);font-weight:700;
  font-size:calc(var(--cfs) * .92);line-height:1.35;overflow-wrap:anywhere}
.ccard .cprice .s i{font-style:normal;font-weight:400;font-size:calc(var(--cfs) * .8);margin-left:5px;
  font-family:var(--font-body);color:#5B4A44}
.ccard .cprice .p{flex:none;font-family:var(--font-display);font-weight:700;
  font-size:calc(var(--cfs) * 1.05);white-space:nowrap}
.ccard .cprice .p.wait{font-family:var(--font-body);font-weight:600;font-size:calc(var(--cfs) * .8);color:#9A6A00}
.ccard .cfoot{border-top:1.5px solid #fff;padding-top:8px;margin-top:10px;font-weight:600;
  font-size:calc(var(--cfs) * .85);line-height:1.4}
.ccard .cbar{display:flex;flex-wrap:wrap;gap:6px;padding-top:12px;margin-top:auto}  /* wrap: ปุ่มรูปฟอนต์/ไส้/เก็บรักษา (10 ต.ค. 2569) ทำให้เกินแถวเดียวได้ */
.ccard .carousel{border-radius:0}

/* ---------- บล็อกขนาด & ราคา ---------- */
.prices{margin-top:10px}
.prices .cap{display:flex;align-items:center;gap:5px;font-family:var(--font-display);font-size:10.5px;
  font-weight:700;letter-spacing:.05em;color:var(--ink-muted);margin-bottom:6px}
.prices .cap i{font-size:9.5px}
.pset{display:flex;flex-wrap:wrap;gap:6px;align-items:stretch}
.pp{display:inline-flex;flex-direction:column;justify-content:center;gap:1px;line-height:1.2;
  background:var(--surface-alt);border-radius:14px;padding:6px 13px}
.pp.hasprice{background:var(--blush)}
.pp b{font-weight:700;font-size:11.5px;color:var(--ink-muted);white-space:nowrap}
.pp .pv{font-family:var(--font-mono);font-weight:700;font-size:15px;white-space:nowrap;color:var(--ink)}
.pp .pv.wait{font-family:var(--font-body);font-weight:600;font-size:11.5px;color:#7A4E00}
.pp small{font-size:10px;color:var(--ink-muted);white-space:nowrap}
.pp .gb{font-family:var(--font-mono);font-size:10px;color:var(--ink-muted);white-space:nowrap}
.prices .more{align-self:center;font-size:11.5px;color:var(--ink-muted);font-weight:600}
/* ขนาด & ราคาแบบตารางเล็กบนการ์ดข้อมูลสินค้า (28 ก.ย. 2569) — components/pricetable.php
   ⚠ ทับสไตล์ th/td ของตารางหน้าจอ (sticky · padding ใหญ่ · nowrap) ให้ครบ */
.ptab{margin-top:10px;border:1px solid var(--line);border-radius:12px;overflow:hidden;background:var(--surface)}
.ptab table{width:100%;font-size:13px;white-space:normal;font-variant-numeric:tabular-nums}
.ptab th{position:static;padding:6px 10px;font-size:11px;font-weight:700;letter-spacing:.03em;color:var(--ink-muted);
  background:var(--surface-alt);border-bottom:1px solid var(--line);text-align:left}
.ptab td{padding:7px 10px;border-bottom:1px dashed var(--line);vertical-align:baseline}
.ptab tbody tr:last-child td{border-bottom:none}
.ptab .num{text-align:right;white-space:nowrap}
.ptab .sz b{font-weight:700;color:var(--ink)}
.ptab .sz small{font-size:11.5px;color:var(--ink-muted);white-space:nowrap}
.ptab .pr{font-family:var(--font-mono);font-weight:700;font-size:14.5px;color:var(--ink)}
.ptab .gp{font-family:var(--font-mono);font-size:12.5px;color:var(--ink-muted)}
.ptab .wait{display:inline-block;font-size:11px;font-weight:600;color:#7A4E00;background:#FBEFD5;border-radius:var(--pill);padding:1px 8px}
.ptab .dash{color:var(--ink-muted)}
/* ช่วงวางขายบนการ์ดข้อมูลสินค้า (28 ก.ย. 2569) — Product::sellShort */
.cardfacts{display:flex;align-items:center;gap:8px;margin-top:10px;flex-wrap:wrap}
.sellchip{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;font-weight:600;padding:3px 10px;border-radius:var(--pill);
  background:var(--surface-alt);color:var(--ink);border:1px solid var(--line);white-space:nowrap;font-variant-numeric:tabular-nums}
.sellchip i{font-size:11px;color:var(--ink-muted)}
.sellchip.is-upcoming{background:#E8F0FB;border-color:#C6D7EF;color:#1F4E8C}
.sellchip.is-upcoming i{color:#1F4E8C}
.sellchip.is-ended{background:#E2DFDF;border-color:#CBC6C6;color:#4A4545}
.ptab-more{padding:5px 10px;font-size:11.5px;font-weight:600;color:var(--ink-muted);border-top:1px solid var(--line);background:var(--surface-alt)}
.card.is-ended .ptab{background:#F7F5F5}
.paychip{display:inline-flex;align-items:center;gap:5px;background:var(--surface-alt);border:1px solid var(--line);
  border-radius:var(--pill);padding:2px 10px;font-size:12px;font-weight:600;white-space:nowrap}
/* ชิปติดต่อ/เดลิเวอรีบนการ์ดสาขา
   ⚠ เป็นได้ทั้ง <a> (คนที่ไม่มีสิทธิ์คัดลอก) และ <button> (คนที่มีสิทธิ์) ต้องหน้าตาเหมือนกันเป๊ะ
     ปุ่มมีค่าเริ่มต้นของเบราว์เซอร์ที่ต้องล้าง — font ไม่สืบทอด และ Safari ใส่ขอบ/พื้นของตัวเอง */
.dlv{display:inline-flex;align-items:center;gap:6px;border:1.5px solid #CFC2C2;background:var(--surface);
  border-radius:var(--pill);padding:5px 12px;font-size:12.5px;font-weight:600;color:var(--ink);min-height:32px;
  text-decoration:none;font-family:inherit;line-height:1.4;cursor:pointer;-webkit-appearance:none;appearance:none}
.dlv:hover{background:var(--hover-bg);color:var(--hover-ink);border-color:var(--hover-bg)}
.dlv:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
/* ตอนคัดลอกสำเร็จ stamp() จะเปลี่ยนข้อความใน .lb เป็น "คัดลอกแล้ว" พร้อมใส่คลาส done
   ⚠ .done ต้องอยู่หลัง :hover และเขียนคู่กับ .done:hover ไม่งั้นสีถูก hover ทับ
     ซึ่งเห็นชัดมากเพราะเมาส์ยังค้างอยู่บนชิปที่เพิ่งกด (กฎเดียวกับ .copychip / .copyicon)
   ⚠ ใช้เฉพาะสีจากชุดที่หน้าตั้งค่ากำหนดเท่านั้น (--blush --blush-deep --canvas --surface
     --surface-alt --ink --ink-muted --accent --hover-bg --hover-ink --card-frame
     --success --success-soft) ห้ามใช้สีตายตัวอื่น เพราะพวกนั้นไม่เปลี่ยนตามธีมที่ผู้ใช้ตั้ง
     พอเปลี่ยนธีมจะกลายเป็นสีหลุดที่ตีกับทั้งหน้า
   ⚠ พื้นและตัวอักษรใช้ชุดเดียวกับ .copychip.done / .copyicon.done ของระบบ
     แต่ขอบใช้ --accent แทน --blush-deep เพราะชิปนี้เล็กกว่ามาก ต้องการเส้นที่เห็นชัด
     วัดจริง: --accent บนพื้นขาว 5.36:1 · บนพื้น --blush 3.73:1 ผ่านเกณฑ์ WCAG 1.4.11 (3:1)
     ส่วน --blush-deep ที่ .copychip ใช้ ได้แค่ 1.73:1 บนพื้นขาว ไม่ผ่าน
   ⚠ ตัวอักษรต้องเป็น --ink ไม่ใช่ --accent — --accent บนพื้น --blush ได้ 3.73:1
     ซึ่งไม่ผ่านเกณฑ์ตัวอักษร 4.5:1 ส่วน --ink ได้ 14.61:1
   สิ่งที่ทำให้เห็นชัดจริงๆ คือข้อความที่เปลี่ยนเป็น "คัดลอกแล้ว" ไม่ใช่สี สีเป็นตัวช่วยเสริม */
.dlv.done,.dlv.done:hover{background:var(--blush);border-color:var(--accent);color:var(--ink);
  font-weight:700;transform:scale(1.04)}
/* ⚠ ล็อกความกว้างขั้นต่ำเท่าคำว่า "คัดลอกแล้ว"
   ไม่งั้นชิปสั้นอย่าง "Grab" (75px) จะโตขึ้นตอนเปลี่ยนข้อความ
   แล้วดันชิปที่เหลือตกบรรทัดใหม่กระตุกไปมา 1.4 วินาที
   วัดจริงตอนขึ้นว่า "คัดลอกแล้ว" ได้ 108px จึงเผื่อเป็น 112px */
.dlv{min-width:112px;justify-content:center;
  transition:transform .18s ease,background .18s ease,border-color .18s ease,color .18s ease}
.dlv .ic{flex:none}
.dlv .lb{white-space:nowrap}
@media (prefers-reduced-motion:reduce){.dlv{transition:none}.dlv.done{transform:none}}
/* "ไม่มีเบอร์ / ไม่มีเดลิเวอรี" บนการ์ดสาขา (26 ก.ย. 2569) — ขนาดและทรงเดียวกับชิปข้างๆ ให้แถวเรียบ
   เดิมเป็นป้าย .todo สีเหลือง ตัวเล็กกว่าและเตี้ยกว่าชิป แถวดูเบี้ยว และสีเหลืองอ่านเหมือน "ต้องแก้ข้อมูล"
   ทั้งที่สาขาไม่มีจริง — จึงใช้ขอบประ + ตัวอักษรจาง = "ไม่มีบริการนี้" · ไม่ใช่ปุ่ม กดไม่ได้ ไม่มี hover */
.dlv.none,.dlv.none:hover{border-style:dashed;border-color:var(--line);background:var(--surface-alt);
  color:var(--ink-muted);font-weight:600;cursor:default}
.dlv.none .ic{opacity:.55}
.brloc{white-space:pre-line;font-size:13px;color:var(--ink-muted);line-height:1.5}
/* เวลาเปิดหน้าร้าน + เวลารับออเดอร์เดลิเวอรี (26 ก.ย. 2569) — ตารางเล็กสองคอลัมน์ ชื่อช่องทางชิดซ้าย เวลาตรงแนวกัน
   ⚠ เวลาใช้ tabular-nums ให้ตัวเลขทุกแถวตรงคอลัมน์ CS กวาดตาเทียบได้ทันที */
.brhours{border:1px solid var(--line);border-radius:12px;padding:6px 10px;background:var(--surface);font-size:13px;margin:2px 0}
.brhours dl{display:grid;grid-template-columns:auto 1fr;column-gap:10px;margin:0}
.brhours .hr{display:contents}
.brhours dt,.brhours dd{padding:4px 0;border-top:1px dashed var(--line);margin:0}
.brhours .hr:first-child dt,.brhours .hr:first-child dd{border-top:0}
.brhours dt{font-weight:700;white-space:nowrap;color:var(--ink)}
.brhours dt .fa-solid{width:15px;text-align:center;color:var(--accent)}
.brhours dd{color:var(--ink);line-height:1.45;display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px}
.brhours .tm{font-weight:700;font-variant-numeric:tabular-nums;white-space:nowrap}
.hstate{display:inline-flex;align-items:center;gap:4px;font-size:11.5px;font-weight:700;border-radius:999px;padding:1px 8px;white-space:nowrap}
.hstate::before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor}
.hstate.s-open{background:var(--success-soft);color:var(--success)}
.hstate.s-soon{background:#FBEFD5;color:var(--warn)}
.hstate.s-closed{background:#EFEAEA;color:#5A5050}
/* ในตาราง: ตารางสาขามีหลายคอลัมน์ เบราว์เซอร์บีบคอลัมน์นี้จนเวลาตัดบรรทัด — กันความกว้างไว้ (ตารางเลื่อนแนวนอนเองได้) */
td .brhours{min-width:305px}
.brhours .hnote{margin:4px 0 2px;padding-top:5px;border-top:1px dashed var(--line);font-size:12.5px;color:var(--ink-muted)}
/* หน้าแก้ไขสาขา — แถวละช่องทาง */
.dlvedit{display:flex;flex-direction:column;gap:10px}
.dlvrow{display:flex;flex-wrap:wrap;align-items:flex-end;gap:8px 10px;border:1px solid var(--line);border-radius:14px;padding:8px 12px 12px;margin:0;min-width:0}
.dlvrow legend{font-weight:700;padding:0 4px;display:inline-flex;gap:6px;align-items:center}
.dlvrow legend .fa-solid{color:var(--accent)}
.dlvrow label{display:flex;flex-direction:column;gap:3px;font-size:12.5px;font-weight:600}
.dlvrow .inp{width:140px;font-variant-numeric:tabular-nums}
.dlvrow .dash{padding-bottom:10px}
.todo{display:inline-block;background:#FBEFD5;color:#7A4E00;font-weight:600;border-radius:999px;padding:1px 9px;font-size:11.5px;white-space:nowrap}
.fillbar{display:flex;align-items:center;gap:7px;min-width:96px}
.fillbar i{flex:1;height:7px;border-radius:999px;background:#EFE7E7;overflow:hidden;display:block}
.fillbar i b{display:block;height:100%;border-radius:999px;background:var(--ink)}
.fillbar span{font-family:var(--font-mono);font-size:11.5px;color:var(--ink-muted);font-weight:600}

/* ---------- Card grid ---------- */
/* ⚠ ต้องเป็น minmax(0,1fr) ไม่ใช่ 1fr เฉยๆ
   เพราะ 1fr มีความกว้างขั้นต่ำเป็น auto = min-content
   เนื้อหาที่ห้ามตัดบรรทัด (รหัสสินค้า ป้ายขนาด ราคา) จะดันคอลัมน์ให้กว้างเกิน
   ทำให้การ์ดในแถวเดียวกันกว้างไม่เท่ากันและกรอบรูปเบี้ยวตามไปด้วย */
.grid{display:grid;gap:14px;grid-template-columns:repeat(4,minmax(0,1fr))}
.grid.grid3{grid-template-columns:repeat(3,minmax(0,1fr))}
@media (max-width:1200px){.grid{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media (max-width:900px){.grid,.grid.grid3{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:520px){.grid,.grid.grid3{grid-template-columns:minmax(0,1fr)}}
.card{background:var(--surface);border:1.5px solid var(--line);border-radius:var(--radius);overflow:hidden;display:flex;flex-direction:column;box-shadow:var(--shadow);transition:transform .18s ease,box-shadow .18s ease}
.card:hover{transform:translateY(-2px);box-shadow:var(--shadow-lg)}
.card.ccard{background:none;border:none;box-shadow:none;padding:0;border-radius:0;overflow:visible}
.card.ccard:hover{box-shadow:none;transform:translateY(-2px)}
/* ⚠ .media เป็นคอมโพเนนต์กลาง ห้ามผูกกับ .card เท่านั้น
   carousel ถูกใช้ทั้งในการ์ดและในกล่อง .panel (หน้ารายละเอียดสินค้า)
   ถ้ากำหนดสไตล์ไว้แค่ .card .media รูปที่อยู่นอกการ์ดจะไม่ถูกครอบเลย
   → <img> ไหลตามขนาดไฟล์จริง (เช่น 1181px) ดัน grid ทั้งหน้าจนล้นจอ
   aspect-ratio ที่ตั้งไว้ที่กรอบก็ไม่มีผล เพราะเนื้อหาข้างในเป็นตัวกำหนดความสูงแทน */
.media{position:relative;overflow:hidden;display:grid;place-items:center;
  background:linear-gradient(135deg,var(--accent-soft),var(--surface-alt));font-size:40px;color:#B98A93}
.media > img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
.card .media{aspect-ratio:4/3}
.card .body{padding:11px 12px;flex:1;display:flex;flex-direction:column;gap:5px}
.card .body h4{font-size:14.5px}
.card .body h4 a{color:var(--ink);text-decoration:none}
.card .body h4 a:hover{text-decoration:underline}
.card .body .meta{font-size:12px;color:var(--ink-muted)}
/* การ์ดสาขา: บรรทัดรหัส (อ้างอิงภายใน · จาง) แยกจากบรรทัดพื้นที่ (ใช้ตอบลูกค้า · เข้ม) */
.brmeta{display:flex;flex-direction:column;gap:5px;align-items:flex-start}
.brcode{font-size:11.5px;letter-spacing:.02em}
.brarea{display:inline-flex;flex-wrap:wrap;align-items:center;gap:4px 7px;font-size:13px;color:var(--ink);
  background:var(--surface-alt);border-radius:10px;padding:3px 10px 3px 8px;max-width:100%}
.brarea > .fa-solid{color:var(--accent);font-size:12px}
.brarea b{font-weight:700}
.brarea .dist::before{content:"·";margin-right:6px;color:var(--ink-muted)}
.brarea .pc{font-variant-numeric:tabular-nums;font-weight:600;color:var(--ink-muted);border-left:1px solid var(--line);padding-left:7px}
.card .foot{padding:8px 12px;border-top:1px solid var(--line);display:flex;align-items:center;gap:6px}
.card .foot .sp{flex:1}
/* สาขาปิดใช้งาน (26 ก.ย. 2569) — แถบแดงจางพาดกลางรูป · พื้นเนื้อหาเทาจาง · รูปจางลงเล็กน้อย
   ⚠ แถบวางใน .cardmedia (ห่อ carousel) — ห้ามวางตรงใน .card ไม่งั้นตำแหน่งกลางรูปคลาดเมื่อรูปสูงไม่เท่ากัน */
.cardmedia{position:relative}
.closedband{position:absolute;left:0;right:0;top:50%;transform:translateY(-50%);z-index:2;pointer-events:none;
  display:flex;align-items:center;justify-content:center;gap:8px;padding:9px 12px;
  background:rgba(214,69,65,.6);color:#fff;font-weight:800;font-size:15px;letter-spacing:.04em;text-shadow:0 1px 3px rgba(120,20,20,.55);
  box-shadow:0 2px 10px rgba(0,0,0,.12)}
.card.is-closed{background:#F2F0F0;border-color:#E3DEDE}
.card.is-closed .cardmedia img{filter:grayscale(.55);opacity:.85}
.card.is-closed .brhours,.card.is-closed .brarea{background:#F7F5F5}
.card.is-closed .foot{background:#F2F0F0}
tr.is-closed td{background:#F5F3F3}
/* การ์ดข้อมูลสินค้าที่สิ้นสุดการวางขาย (28 ก.ย. 2569) — พื้นเทาอ่อน · แถบแดงจางกว่าแถบสาขาปิด · รูปซีดเล็กน้อย
   ⚠ แยกจาก .is-closed ของสาขา (หน้าสาขาปิดงานแล้ว ห้ามผูกกัน) */
.card.is-ended{background:#F1EFEF;border-color:#E0DBDB}
.card.is-ended .foot{background:#F1EFEF}
.card.is-ended .cardmedia img{filter:grayscale(.4);opacity:.9}
.card.is-ended .pset .pp,.card.is-ended .badge.b-arch{background:#E8E5E5}
.soldband{position:absolute;left:0;right:0;top:50%;transform:translateY(-50%);z-index:2;pointer-events:none;
  display:flex;align-items:center;justify-content:center;gap:8px;padding:8px 12px;
  background:rgba(226,112,108,.45);color:#fff;font-weight:800;font-size:15px;letter-spacing:.04em;
  text-shadow:0 1px 3px rgba(130,30,30,.55)}

/* ---------- Badges & stamps ---------- */
.badge{display:inline-flex;align-items:center;gap:4px;font-size:12px;padding:3px 10px;border-radius:999px;font-weight:700;white-space:nowrap}
.b-pub{background:var(--success-soft);color:var(--success)}
.b-draft{background:#FBEFD5;color:#7A4E00}
.b-pend{background:#EFE4EA;color:#5E4453}
.b-arch{background:#EFEAEA;color:#3D3D3D}
.b-ended{background:#E2DFDF;color:#4A4545;border:1px solid #CBC6C6}   /* สิ้นสุดการวางขาย (28 ก.ย. 2569) */
.b-exp{background:#F8DFDB;color:var(--danger)}
.stamp{font-size:12px;color:var(--ink-muted)}
.stamp b{font-weight:500;color:var(--ink)}

/* ---------- Copy rail ---------- */
.rail{display:flex;flex-direction:column;gap:7px}
.copychip{display:flex;align-items:center;gap:8px;width:100%;text-align:left;border:1px solid var(--line);background:var(--surface);border-radius:var(--pill);padding:9px 15px;font-size:13.5px;min-height:44px;font-weight:600;transition:transform .18s ease,background .18s ease,border-color .18s ease}
.copychip:hover{background:var(--hover-bg);color:var(--hover-ink);border-color:var(--hover-bg)}
.copychip:hover .sub{color:rgba(255,255,255,.8)}
.copychip .ic{width:18px;text-align:center;flex:none}
.copychip .lb{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.copychip .sub{margin-left:auto;font-size:11.5px;color:var(--ink-muted);font-family:var(--font-mono);flex:none}
/* .done ต้องอยู่หลัง :hover ไม่งั้นสีตอนคัดลอกสำเร็จจะถูก hover ทับ */
.copychip.done,.copychip.done:hover{background:var(--blush);border-color:var(--blush-deep);color:var(--ink);transform:scale(1.06)}
.copychip.done .sub,.copychip.done:hover .sub{color:var(--ink-muted)}
.copyicon{border:1px solid var(--line);border-radius:var(--pill);width:36px;height:36px;display:grid;place-items:center;font-size:14px;background:var(--surface);color:var(--ink);transition:transform .18s ease,background .18s}
.copyicon:hover{background:var(--hover-bg);color:var(--hover-ink);border-color:var(--hover-bg)}
.copyicon.done,.copyicon.done:hover{background:var(--blush);color:var(--ink);border-color:var(--blush-deep);transform:scale(1.06)}

/* กำลังโหลดไฟล์รูปมาใส่คลิปบอร์ด — ต้องเห็นว่าระบบทำงานอยู่ ไม่ใช่กดแล้วเงียบ */
.busy{position:relative;pointer-events:none;opacity:.75}
.busy::after{content:"";position:absolute;inset:auto 8px auto auto;top:50%;width:14px;height:14px;margin-top:-7px;
  border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:spin .7s linear infinite}
.copyicon.busy::after{inset:0;top:0;margin:0;width:100%;height:100%;border:none;
  background:radial-gradient(circle at center,currentColor 2px,transparent 2.5px);opacity:.5}
@keyframes spin{to{transform:rotate(360deg)}}

/* ---------- กล่องรูปชุด (คัดลอกหลายรูป) ---------- */
.setbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:10px}
.setgrid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}
.setcell{position:relative;aspect-ratio:1;border-radius:14px;overflow:hidden;background:var(--surface-alt);
  border:2px solid transparent;cursor:pointer}
.setcell>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.setcell.on{border-color:var(--blush-deep)}
.setcell:not(.on)>img{opacity:.42;filter:grayscale(.6)}
.setcell .setpick{position:absolute;left:6px;top:6px;width:26px;height:26px;border-radius:50%;display:grid;place-items:center;
  border:1px solid var(--line);background:var(--surface);color:transparent;font-size:11px}
.setcell.on .setpick{background:var(--blush-deep);border-color:var(--blush-deep);color:#fff}
.setcell .copyicon{position:absolute;right:6px;bottom:6px;width:32px;height:32px}
.setqueue{display:flex;gap:12px;align-items:flex-start;margin-top:12px;padding:12px;border:1px solid var(--line);
  border-radius:var(--radius);background:var(--surface-alt)}
/* ⚠ ต้องมีบรรทัดนี้ ไม่งั้น display:flex ด้านบนจะชนะ [hidden] แล้วคิวโผล่ตั้งแต่เปิดกล่อง */
.setqueue[hidden]{display:none}
.setqueue-thumb{width:84px;height:84px;flex:none;border-radius:12px;overflow:hidden;background:var(--surface)}
.setqueue-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.setqueue-body{min-width:0;flex:1}
@media (max-width:520px){
  .setgrid{grid-template-columns:repeat(2,minmax(0,1fr))}
}

/* ---------- Pagination ---------- */
.pager{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:11px 2px;font-size:13px;color:var(--ink-muted)}
.pager .sp{flex:1}
.pgbtn{border:1px solid var(--line);background:var(--surface);border-radius:var(--pill);min-width:36px;height:36px;padding:0 9px;font-size:13px;font-weight:600;color:var(--ink);display:inline-flex;align-items:center;justify-content:center;text-decoration:none}
.pgbtn:hover:not(:disabled):not(.dis){background:var(--hover-bg);color:var(--hover-ink);border-color:var(--hover-bg)}
.pgbtn.on{background:var(--blush);color:var(--ink);border-color:var(--blush-deep);font-weight:700}
.pgbtn:disabled,.pgbtn.dis{opacity:.4;cursor:not-allowed;pointer-events:none}

/* ---------- Dashboard ---------- */
.hero-search{background:linear-gradient(160deg,var(--blush),var(--surface) 70%);border:1px solid var(--line);border-radius:28px;box-shadow:var(--shadow);padding:26px 22px;text-align:center;margin-bottom:16px}
.hero-search h2{font-size:19px;margin-bottom:4px}
.hero-search p{font-size:13px;color:var(--ink-muted);margin-bottom:14px}
.hsearch{position:relative;max-width:560px;margin:0 auto;text-align:left}
.hsearch > i{position:absolute;left:19px;top:16px;font-size:15px;pointer-events:none;color:var(--ink)}
.hinput{width:100%;padding:13px 46px 13px 46px;border:2px solid var(--ink);border-radius:var(--pill);
  background:var(--surface);font-size:16px;font-weight:600;color:var(--ink);outline:none}
.hinput::placeholder{color:var(--ink-muted);font-weight:500}
.hinput:focus{box-shadow:0 0 0 4px var(--blush)}
.hclear{position:absolute;right:11px;top:9px;width:32px;height:32px;border-radius:var(--pill);
  display:none;place-items:center;font-size:12px;color:var(--ink)}
.hclear.on{display:grid}
.hclear:hover{background:var(--hover-bg);color:var(--hover-ink)}
.hres{position:absolute;left:0;right:0;top:calc(100% + 9px);background:var(--surface);
  border:1.5px solid var(--line);border-radius:20px;box-shadow:var(--shadow-lg);
  max-height:392px;overflow-y:auto;z-index:120;display:none;text-align:left}
.hres.on{display:block}
/* ผลเก่าจางลงระหว่างรอผลของคำใหม่ (ค้นหาด่วน · 28 ก.ย. 2569) — รู้ว่ากำลังค้น ไม่ใช่ค้าง */
.loading > a[role="option"]{opacity:.5;transition:opacity .15s}
.hres .hint{padding:14px 18px;font-size:13px;color:var(--ink-muted);font-weight:600;margin:0;border:none}
.hres .cnt{padding:9px 18px 4px;font-size:11.5px;color:var(--ink-muted);font-weight:700;
  border-top:1px solid var(--line);background:var(--surface-alt)}
.hres .cnt:first-child{border-top:none}
.hres a{display:flex;align-items:center;gap:10px;padding:9px 18px;font-size:14px;font-weight:600;color:var(--ink);text-decoration:none}
.hres a:hover,.hres a.cur{background:var(--blush)}
.hres mark{background:var(--blush);color:inherit;border-radius:2px;padding:0 1px;font-weight:700}
.hres a.cur mark{background:#fff}
.hres .sub{font-size:12px;color:var(--ink-muted);margin-left:auto;font-family:var(--font-mono);flex:none}
/* ---------- ทางลัดในแดชบอร์ด ----------
   · Fitts's Law — ทั้งกรอบเป็นเป้ากด ไม่ใช่แค่ตัวหนังสือ กดพลาดยาก
   · Hick's Law — แบ่งเป็นกลุ่มย่อยที่มีหัวข้อกำกับ ไม่เทกองรวดเดียว
   · Recognition over recall — ไอคอน + ชื่อ + คำอธิบายสั้น อยู่ด้วยกันเสมอ
   ------------------------------------------------------------------ */
.quicknav{margin-bottom:18px}
.qhead{display:flex;align-items:center;gap:9px;margin-bottom:10px}
.qhead h2{font-size:16px;font-weight:700}
.qhead > i{color:var(--ink-muted)}
.qhead .sp{flex:1}
.qgroup{font-size:12px;font-weight:700;color:var(--ink-muted);margin:14px 2px 7px;
  letter-spacing:.3px}
.qgroup:first-of-type{margin-top:0}

.qgrid{display:grid;gap:10px;grid-template-columns:repeat(auto-fill,minmax(232px,1fr))}

/* ⚠ ทั้งกรอบต้องเป็น <a> ไม่ใช่ <div> ที่มีลิงก์ข้างใน
   เป้ากดจะได้เต็มกรอบจริง และคีย์บอร์ดกับโปรแกรมอ่านหน้าจอเห็นเป็นลิงก์เดียว */
.qtile{display:flex;align-items:flex-start;gap:11px;text-decoration:none;
  background:var(--surface);border:1.5px solid var(--line);border-radius:var(--radius-sm);
  padding:13px 14px;box-shadow:var(--shadow);min-height:64px;
  transition:border-color .15s ease,transform .15s ease,box-shadow .15s ease;
  /* ค่าเริ่มต้นเผื่อกลุ่มไหนยังไม่ได้ตั้ง tone ใน nav.php */
  --tone-bg:var(--blush); --tone-ink:var(--accent)}
.qtile:hover{border-color:var(--tone-ink);transform:translateY(-2px);box-shadow:var(--shadow-lg)}
.qtile:focus-visible{outline:3px solid var(--tone-ink);outline-offset:2px}

/* สีประจำกลุ่ม — มาจาก 'tone' ใน config/nav.php
   ⚠ ทุกคู่วัดคอนทราสต์แล้ว: ไอคอนบนพื้นโทน 5.1–7.2:1 · ไอคอนขาวบนพื้นเข้ม (ตอน hover) 6.7–9.9:1
     เกินเกณฑ์ 3:1 ของ WCAG 1.4.11 ทุกคู่ — เพิ่มโทนใหม่ต้องวัดก่อน ห้ามเลือกด้วยตาเปล่า
   ⚠ สีเป็นแค่ตัวช่วยจำ ไม่ใช่ตัวบอกความหมายลำพัง (WCAG 1.4.1)
     ทุกกลุ่มมีหัวข้อข้อความกำกับอยู่แล้ว คนตาบอดสีจึงใช้งานได้ครบเหมือนกัน */
.qtile.t-rose,.dgroup .t-rose  {--tone-bg:#FBD9E2; --tone-ink:#A82A52}
.qtile.t-amber,.dgroup .t-amber {--tone-bg:#FAE6C4; --tone-ink:#7E5206}
.qtile.t-teal,.dgroup .t-teal  {--tone-bg:#CDE8E3; --tone-ink:#0F5C51}
.qtile.t-violet,.dgroup .t-violet{--tone-bg:#E1D9F5; --tone-ink:#4E3396}
.qtile.t-blue,.dgroup .t-blue  {--tone-bg:#D2E2F7; --tone-ink:#194B83}
.qtile.t-slate,.dgroup .t-slate {--tone-bg:#DEDBE1; --tone-ink:#45414D}
.qtile.t-green,.dgroup .t-green {--tone-bg:#D5EACF; --tone-ink:#27632F}

.qicon{flex:none;width:38px;height:38px;border-radius:12px;display:grid;place-items:center;
  background:var(--tone-bg);color:var(--tone-ink);font-size:15px;
  transition:background .15s ease,color .15s ease}
.qtile:hover .qicon{background:var(--tone-ink);color:#fff}

.qtext{min-width:0;display:flex;flex-direction:column;gap:2px}
.qtext b{font-size:14px;font-weight:700;color:var(--ink);line-height:1.45}
.qtext > span{font-size:11.5px;color:var(--ink-muted);line-height:1.6}
.qtile:hover .qtext b{color:var(--tone-ink)}

/* จอเล็กบีบเหลือสองคอลัมน์ แต่ยังต้องกดโดนง่าย จึงลดคำอธิบายทิ้งแทนที่จะย่อกรอบ */
@media (max-width:560px){
  .qgrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
  .qtile{flex-direction:column;gap:8px;padding:12px;min-height:0}
  .qtext > span{display:none}
  .qtext b{font-size:13px}
}
@media (prefers-reduced-motion:reduce){
  .qtile{transition:none}
  .qtile:hover{transform:none}
}

.stats{display:grid;gap:10px;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));margin-bottom:16px}
.stat{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:14px 16px;box-shadow:var(--shadow)}
.stat .n{font-family:var(--font-mono);font-size:26px;font-weight:600;line-height:1.15}
.stat .l{font-size:13px;color:var(--ink-muted);margin-top:2px;font-weight:600}
.stat.warn .n{color:var(--warn)} .stat.dg .n{color:var(--danger)}
.cols2{display:grid;gap:12px;grid-template-columns:1fr 1fr;align-items:start}
.cols2.stack{grid-template-columns:1fr}
.linklist{display:flex;flex-direction:column}
.linklist a,.linklist button{display:flex;align-items:center;gap:9px;padding:9px 14px;border-bottom:1px solid var(--line);text-align:left;font-size:13.5px;font-weight:600;color:var(--ink);text-decoration:none}
.linklist a:last-child,.linklist button:last-child{border-bottom:none}
.linklist a:hover,.linklist button:hover{background:var(--blush)}
.linklist .sp{flex:1}

/* ---------- Detail ---------- */
.detail{display:grid;gap:16px;grid-template-columns:1fr 288px;align-items:start}
/* ⚠ ลูกของ grid มีขนาดต่ำสุดเท่า min-content โดยปริยาย — ถ้าลูกตัวไหนยุบไม่ได้
   คอลัมน์จะบานออกเกินความกว้างที่มี แล้วทั้งหน้าจะเลื่อนแนวนอน */
.detail > *{min-width:0}
.gallery{display:grid;gap:8px;grid-template-columns:repeat(4,1fr)}
.gallery div{position:relative;overflow:hidden;aspect-ratio:1;border-radius:18px;background:linear-gradient(135deg,var(--accent-soft),var(--surface-alt));display:grid;place-items:center;font-size:26px}
.gallery div:first-child{grid-column:span 2;grid-row:span 2;font-size:52px}
.gallery img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
.speclist{display:grid;grid-template-columns:150px 1fr;font-size:13.5px}
.speclist dt{padding:9px 0;color:var(--ink-muted);font-weight:600;border-bottom:1px solid var(--line)}
.speclist dd{padding:8px 0;border-bottom:1px solid var(--line);word-break:break-word}
/* ข้อความกำหนดเอง ห้ามตัดบรรทัด — เก็บดิบและเลื่อนแนวนอนแทน */
.pre{white-space:pre;overflow-x:auto;font-size:13px;background:var(--surface-alt);border-radius:16px;padding:10px;border:1px solid var(--line);font-family:var(--font-body)}

/* ---------- หน้ารายละเอียดสินค้า ---------- */
/* รูปเป็นภาพประกอบ ไม่ใช่พระเอกของหน้า — ตรึงกว้าง 300px ทรงจัตุรัส
   ข้อมูลที่ทีมขายต้องใช้ตอบลูกค้าจึงขึ้นมาอยู่ระดับสายตาเดียวกับรูป ไม่ถูกดันลงไปใต้จอ */
.phero{display:grid;grid-template-columns:300px minmax(0,1fr);gap:20px;align-items:start}
.pshot{min-width:0}
.pshot .media{border-radius:20px}
.pfacts{display:flex;flex-direction:column;gap:14px;min-width:0}
/* รูปการเก็บรักษา (28 ก.ย. 2569) — ฟอร์มแก้ไข (.keepbox) และหน้ารายละเอียด (.keepshow ใช้ช่องรูปของ .svcimgs) */
/* เมนูเลือกขนาดก่อนคัดลอกการ์ดสินค้า (28 ก.ย. 2569) — app.js openSizePick · position:fixed วางใต้ปุ่ม */
.sizepick{position:fixed;z-index:120;min-width:220px;max-width:300px;background:var(--surface);border:1px solid var(--line);border-radius:14px;
  box-shadow:0 10px 30px rgba(40,20,25,.18);padding:6px;display:flex;flex-direction:column;gap:2px}
.sizepick-h{font-size:12px;font-weight:700;color:var(--ink-muted);padding:6px 10px 4px}
.sizepick button{display:flex;align-items:baseline;gap:10px;width:100%;text-align:left;border:0;background:none;border-radius:10px;padding:8px 10px;min-height:38px;font-size:14px;color:var(--ink);cursor:pointer}
.sizepick button .s{flex:1;font-weight:700}
.sizepick button .p{font-family:var(--font-mono);font-size:13px;color:var(--ink-muted);white-space:nowrap}
.sizepick button.all{border-bottom:1px dashed var(--line);border-radius:10px 10px 0 0}
.sizepick button:hover,.sizepick button:focus-visible{background:var(--blush);outline:none}
.keepbox{margin-top:10px;border:1px dashed var(--line);border-radius:12px;padding:12px;display:flex;flex-direction:column;gap:10px;background:var(--surface-alt)}
.keephead{display:flex;flex-wrap:wrap;gap:4px 10px;align-items:baseline}
.keepgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:10px}
.keepimg{position:relative;border-radius:10px;overflow:hidden;border:1px solid var(--line);background:var(--surface)}
.keepimg img{display:block;width:100%;aspect-ratio:1414/2000;object-fit:cover;object-position:top}
.keepimg .keepdel{position:absolute;right:6px;top:6px;width:30px;height:30px;font-size:12px;color:var(--danger);background:rgba(255,255,255,.94)}
.keepimg .keepsrc{position:absolute;left:6px;bottom:6px;font-size:10.5px;font-weight:600;background:rgba(255,255,255,.92);border-radius:var(--pill);padding:1px 7px}
.keepacts{display:flex;gap:8px;flex-wrap:wrap}
.keepshow{margin-top:12px;display:flex;flex-direction:column;gap:10px}
.keepshow .copychip.keepall{width:auto;align-self:flex-start;min-height:36px;padding:6px 14px;font-size:13px}
.keepshow .svcimgs{grid-template-columns:repeat(auto-fill,minmax(150px,200px))}
/* ตารางขนาด & ราคาข้างรูป (28 ก.ย. 2569) — ทับสไตล์ th/td ของตารางหน้าจอ (sticky · padding ใหญ่) */
.pdtab{border:1px solid var(--line);border-radius:14px;overflow:auto;background:var(--surface);margin-top:4px}
.pdtab table{width:100%;font-size:14px;font-variant-numeric:tabular-nums}
.pdtab th{position:static;padding:8px 12px;font-size:12px;letter-spacing:.02em;color:var(--ink-muted);background:var(--surface-alt);border-bottom:1px solid var(--line)}
.pdtab td{padding:9px 12px;border-bottom:1px dashed var(--line)}
.pdtab tbody tr:last-child td{border-bottom:none}
.pdtab .num{text-align:right}
.pdtab .sz b{font-weight:700}
.pdtab .sz small{font-size:12px;color:var(--ink-muted)}
.pdtab .pr{font-weight:700;font-size:15.5px}
.pdtab .gp{color:var(--ink-muted)}
.plabel{font-size:11.5px;font-weight:700;color:var(--ink-muted);margin-bottom:4px}
.pchips{display:flex;flex-wrap:wrap;gap:7px}
.pchip{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;border-radius:var(--pill);
  border:1px solid var(--line);background:var(--surface-alt);font-size:12.5px;line-height:1.4}
.pchip b{font-weight:700}
.pricebig{font-family:var(--font-display);font-weight:700;font-size:27px;line-height:1.2}
.pricebig .unit{font-size:15px;font-weight:500;color:var(--ink-muted)}
.pfact{display:flex;gap:10px;font-size:13.5px;line-height:1.6;min-width:0}
.pfact .k{flex:none;width:96px;color:var(--ink-muted);font-weight:600}
.pfact .v{min-width:0;overflow-wrap:anywhere}
/* ค่าที่ยังไม่กรอก — จางแต่ยังเห็นว่ามีช่องนี้อยู่ ไม่ต้องตะโกนด้วยสีส้มทุกช่อง */
.dash{color:var(--ink-muted)}
.warnbox{display:flex;gap:10px;padding:11px 14px;border-radius:16px;
  background:#FBEFD5;color:#7A4E00;font-size:13px;line-height:1.65}
/* ปุ่มคัดลอกข้างหัวข้อ / หัวกล่อง ในหน้ารายละเอียดสินค้า (28 ก.ย. 2569) */
.ptext-h{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:2px}
.ptext-h .plabel{margin:0}
.copyicon.sm{width:30px;height:30px;font-size:12px;flex:none}
.panel-head .copychip.copyall{width:auto;min-height:34px;padding:5px 14px;font-size:13px}
.ptext + .ptext{margin-top:14px;padding-top:14px;border-top:1px solid var(--line)}
.ptext .rawtext{font-size:14px}
/* สรุปสิ่งที่ยังขาดเป็นชิป กวาดตาได้เร็วกว่าประโยคยาวคั่นด้วยจุด */
.misslist .hd{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:9px}
.misslist .chips{display:flex;flex-wrap:wrap;gap:6px}
.misslist .chip{background:rgba(255,255,255,.72);border:1px solid var(--blush-deep);
  border-radius:var(--pill);padding:2px 10px;font-size:12px}
@media (max-width:900px){
  .phero{grid-template-columns:1fr;gap:16px}
  .pshot{max-width:320px}
}
.mobilerail{display:none}

/* ---------- Tabs ---------- */
.tabs{display:flex;gap:2px;overflow-x:auto;border-bottom:1px solid var(--line);margin-bottom:14px}
.tabs button,.tabs a{padding:10px 15px;font-size:14px;font-weight:600;color:var(--ink-muted);border-bottom:3px solid transparent;white-space:nowrap;text-decoration:none;background:none}
.tabs button:hover,.tabs a:hover{color:var(--ink)}
.tabs .on{color:var(--ink);border-bottom-color:var(--ink);font-weight:700}
.formgrid{display:grid;gap:12px;grid-template-columns:1fr 1fr}
.formgrid .full{grid-column:1/-1}
.req{color:var(--danger)}
.helper{font-size:11.5px;color:var(--ink-muted);margin-top:3px}
.repeat-row{display:flex;gap:8px;align-items:center;margin-bottom:8px}
.repeat-row .inp{flex:1}
.repeat-row .w-pct{width:110px;flex:none}

/* ---------- ช่องอัปโหลดรูปเดี่ยว ---------- */
.imgfield{display:flex;gap:14px;align-items:flex-start;flex-wrap:wrap}
.imgfield-preview{flex:none;width:180px;aspect-ratio:16/10;border-radius:var(--radius-sm);overflow:hidden;
  background:var(--surface-alt);border:1.5px solid var(--line);display:grid;place-items:center;position:relative}
.imgfield-preview img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.imgfield-empty{display:flex;flex-direction:column;align-items:center;gap:5px;color:var(--ink-muted);font-size:12px;font-weight:600}
.imgfield-empty i{font-size:26px}
.imgfield-actions{flex:1;min-width:200px;display:flex;flex-direction:column;gap:8px;align-items:flex-start}
.imgfield-remove{display:inline-flex;align-items:center;gap:7px;font-size:13px;font-weight:600;color:var(--danger)}
.imgfield-actions .helper{margin:0}
/* หน้าโปรไฟล์: ตัวอย่างรูป Avatar เป็นวงกลมขนาดเดียวกับที่เก็บจริงย่อส่วน */
.avatarprev{flex:none;width:120px;height:120px;border-radius:50%;overflow:hidden;background:var(--surface-alt);
  border:1.5px solid var(--line);display:grid;place-items:center}
.avatarprev img{width:100%;height:100%;object-fit:cover;display:block}
.avatarprev.none{border-style:dashed}
.avatarprev.sm{width:56px;height:56px}
/* กล่องที่เด้งลงมาจากปุ่มในแถวตาราง (ตั้งรหัสผ่านใหม่ · รูปโปรไฟล์) */
.rowdrop{position:absolute;right:0;top:42px;z-index:30;background:var(--surface);border:1.5px solid var(--line);
  border-radius:var(--radius-sm);box-shadow:var(--shadow-lg);padding:12px;width:250px;max-width:calc(100vw - 32px)}
.avatarfield .rowacts{flex-wrap:wrap}
/* คู่ป้าย-ค่า อ่านอย่างเดียว (หน้าโปรไฟล์) */
.kv{display:grid;grid-template-columns:max-content 1fr;gap:8px 18px;margin:0;font-size:14px}
.kv dt{color:var(--ink-muted);font-weight:600}
.kv dd{margin:0;color:var(--ink)}
@media (max-width:520px){.kv{grid-template-columns:1fr;gap:2px}.kv dd{margin-bottom:8px}}

/* ---------- ตัวแก้ไขข้อความ (จำกัดปุ่มตามสเปกเฟส 6) ---------- */
.editor{border:1.5px solid #CFC2C2;border-radius:var(--radius-sm);background:var(--surface);overflow:hidden}
.editor:focus-within{border-color:var(--accent);box-shadow:0 0 0 4px var(--accent-soft)}
.editor-bar{display:flex;gap:3px;flex-wrap:wrap;align-items:center;padding:7px 9px;
  border-bottom:1px solid var(--line);background:var(--surface-alt)}
.editor-bar button{min-width:32px;height:32px;padding:0 8px;border-radius:var(--pill);
  font-size:13px;font-weight:700;color:var(--ink);display:inline-flex;align-items:center;justify-content:center}
.editor-bar button:hover{background:var(--hover-bg);color:var(--hover-ink)}
.editor-bar button.on{background:var(--blush)}
.editor-sep{width:1px;height:20px;background:var(--line);margin:0 4px}
.editor-area{padding:12px 14px;min-height:190px;outline:none;font-size:14.5px;line-height:1.75}
.editor-area:empty::before{content:"พิมพ์เนื้อหาที่นี่…";color:var(--ink-muted)}
.editor-area h2{font-size:19px;margin:14px 0 6px}
.editor-area h3{font-size:16px;margin:12px 0 5px}
.editor-area h2:first-child,.editor-area h3:first-child,.editor-area p:first-child{margin-top:0}
.editor-area p{margin:0 0 9px}
.editor-area ul,.editor-area ol{margin:0 0 9px;padding-left:22px}
.editor-area li{margin-bottom:3px}
.editor-area a{color:var(--accent)}
.editor-area table{width:auto;min-width:60%;border-collapse:collapse;margin:10px 0;white-space:normal}
.editor-area th,.editor-area td{border:1px solid var(--line);padding:6px 10px;font-size:14px}
.editor-area th{background:var(--surface-alt);font-weight:700}
/* เนื้อหาที่บันทึกแล้ว แสดงผลด้วยกฎชุดเดียวกับตอนแก้ไข เพื่อไม่ให้หน้าตาต่างกัน */
.richtext{font-size:14px;line-height:1.75}
.richtext h2{font-size:18px;margin:14px 0 6px}
.richtext h3{font-size:15.5px;margin:12px 0 5px}
.richtext p{margin:0 0 9px}
.richtext ul,.richtext ol{margin:0 0 9px;padding-left:22px}
.richtext table{border-collapse:collapse;margin:10px 0;white-space:normal}
.richtext th,.richtext td{border:1px solid var(--line);padding:6px 10px}
.richtext th{background:var(--surface-alt)}

/* ---------- Search palette ---------- */
.overlay{position:fixed;inset:0;background:rgba(24,21,18,.42);z-index:300;display:grid;place-items:start center;padding:80px 16px}
.overlay[hidden]{display:none}
.palette{width:100%;max-width:600px;background:var(--surface);border:1px solid var(--line);border-radius:26px;overflow:hidden;box-shadow:0 24px 60px rgba(0,0,0,.25)}
.palette>input{width:100%;border:none;border-bottom:1px solid var(--line);padding:15px 18px;font-size:16px;outline:none;background:var(--surface);font-weight:600}
.presults{max-height:390px;overflow:auto}
.presults .g{font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-muted);padding:9px 16px 4px;font-weight:700}
.presults a{display:flex;align-items:center;gap:10px;width:100%;text-align:left;padding:9px 16px;font-size:14px;font-weight:600;color:var(--ink);text-decoration:none}
.presults a:hover,.presults a.cur{background:var(--blush);color:var(--ink)}
.presults mark{background:var(--blush);color:inherit;border-radius:2px;padding:0 1px;font-weight:700}
.presults a.cur mark{background:#fff}
.presults .sub{font-size:12px;color:var(--ink-muted);margin-left:auto;flex:none}
.pfoot{border-top:1px solid var(--line);padding:8px 16px;font-size:11.5px;color:var(--ink-muted);display:flex;gap:14px;flex-wrap:wrap}
.pfoot kbd{font-family:var(--font-mono);border:1px solid var(--line);border-radius:6px;padding:0 5px;background:var(--surface-alt)}

/* ---------- โปรโมชั่น ----------
   ⚠ ข้อความจากตารางการตลาดจัดบรรทัดมาแล้ว ต้องแสดงตามนั้นทุกตัว
     ใช้ pre-wrap ไม่ใช่ nl2br เพื่อคงทั้งบรรทัดว่างและช่องว่างต้นบรรทัด */
.rawtext{white-space:pre-wrap;word-break:break-word;line-height:1.75;font-size:14.5px;margin:0}

/* รูปโปรโมชั่นในหน้ารายละเอียด — เป็นรูปย่อในคอลัมน์ข้าง ไม่ใช่ภาพเปิดหน้า
   ⚠ ต้องเป็น contain ไม่ใช่ cover — โปสเตอร์มีตัวหนังสืออยู่ในรูป ครอบตัดแล้วเงื่อนไขหาย */
.promothumbs{display:flex;gap:8px;flex-wrap:wrap}
.promothumbs a{width:76px;height:76px;border-radius:14px;overflow:hidden;border:1px solid var(--line);
  background:var(--surface-alt);display:block;flex:none}
.promothumbs a:hover{border-color:var(--accent)}
.promothumbs img{width:100%;height:100%;object-fit:contain;display:block}

/* ---------- ขั้นตอนการปฏิบัติงานของโปรโมชั่น: ตัวแก้ไข + หน้าแสดงผล (26 ก.ย. 2569) ----------
   รูปในเนื้อหาต้องไม่ล้นกรอบ และแยกจากข้อความชัด — มักเป็นภาพหน้าจอ POS ที่ต้องอ่านปุ่มได้ */
.steps-area{min-height:220px}
.steps-area img,.steps-body img{display:block;max-width:100%;height:auto;border-radius:10px;border:1px solid var(--line);margin:6px 0}
.steps-body{font-size:14.5px;line-height:1.7;color:var(--ink);overflow-wrap:anywhere}
.steps-body > :first-child{margin-top:0}
.steps-body p{margin:0 0 4px}
.steps-body h3{font-size:15px;margin:14px 0 6px}
.steps-body ul,.steps-body ol{margin:4px 0 8px;padding-left:22px}
.steps-body table{border-collapse:collapse;margin:8px 0;max-width:100%;display:block;overflow-x:auto}
.steps-body th,.steps-body td{border:1px solid var(--line);padding:5px 9px;text-align:left}
.editor-bar button.busy{opacity:.55;pointer-events:none}
/* ---------- ตัวแก้ไขกลาง: สีข้อความ · ปรับขนาดรูป (26 ก.ย. 2569) ---------- */
.editor-colors{position:relative;display:inline-flex}
.editor-colors [data-color-toggle]{position:relative}
.editor-colors .swatchbar{position:absolute;left:9px;right:9px;bottom:5px;height:3px;border-radius:2px;
  background:var(--last, var(--ink))}
.editor-pop{position:absolute;top:38px;left:0;z-index:40;display:grid;grid-template-columns:repeat(3,30px);gap:6px;
  padding:9px;background:var(--surface);border:1.5px solid var(--line);border-radius:var(--radius-sm);box-shadow:var(--shadow-lg)}
.editor-pop[hidden]{display:none}
.editor-bar .editor-pop .swatch{min-width:0;width:30px;height:30px;padding:0;border-radius:50%;
  background:var(--sw);border:2px solid var(--surface);box-shadow:0 0 0 1px var(--line)}
.editor-bar .editor-pop .swatch:hover{box-shadow:0 0 0 2px var(--ink)}
.editor-bar .editor-pop .swatch:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.editor-bar .editor-pop .swatch.reset{background:var(--surface);color:var(--ink-muted);font-size:12px;display:grid;place-items:center}
.editor-imgbar{display:flex;align-items:center;gap:6px;flex-wrap:wrap;padding:7px 9px;
  border-bottom:1px solid var(--line);background:var(--surface-alt);font-size:12.5px}
.editor-imgbar .lbl{font-weight:700;color:var(--ink-muted);margin-right:2px}
.editor-imgbar button{height:28px;padding:0 10px;border-radius:var(--pill);border:1px solid var(--line);
  background:var(--surface);font-size:12px;font-weight:700;color:var(--ink);cursor:pointer}
.editor-imgbar button:hover{background:var(--hover-bg);color:var(--hover-ink)}
.editor-imgbar button.danger{color:var(--danger)}
.editor-imgbar input[type=range]{width:120px;accent-color:var(--accent)}
.editor-imgbar output{min-width:38px;font-variant-numeric:tabular-nums;font-weight:700}
.editor-area img{display:block;max-width:100%;height:auto;border-radius:10px;border:1px solid var(--line);margin:6px 0;cursor:pointer}
.editor-area img.is-sel{outline:3px solid var(--accent);outline-offset:2px}

/* ---------- คูปอง (26 ก.ย. 2569) ----------
   ใหญ่กว่ารูปโปรโมชั่นโดยตั้งใจ — ตัวหนังสือบนคูปอง (รหัส · เงื่อนไข · วันหมดอายุ) ต้องอ่านออกก่อนกดส่ง
   กรอบเส้นประ = ภาษาภาพของ "คูปองตัดได้" ให้แยกจากโปสเตอร์โปรโมชั่นได้ทันที
   ⚠ ใช้เฉพาะตัวแปรสีของธีม (กติกา 13 สี) */
/* หน้ารายละเอียด: ใบละแถวเต็มคอลัมน์ข้าง — ลองสองใบต่อแถวแล้ว รูปเหลือ ~130px อ่านตัวหนังสือบนคูปองไม่ออก
   และปุ่ม "คัดลอกใบที่ N" ตัดสองบรรทัด (ตรวจด้วยภาพจริง 26 ก.ย.) */
.coupongrid{display:grid;gap:10px;grid-template-columns:minmax(0,1fr)}
.coupongrid.edit{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}
.coupon{margin:0;position:relative;display:flex;flex-direction:column;gap:6px;padding:8px;
  border:1.5px dashed var(--blush-deep);border-radius:var(--radius-sm);background:var(--surface)}
.coupon > a,.coupon > img{display:block;border-radius:10px;overflow:hidden;background:var(--surface-alt);aspect-ratio:4/3}
.coupon img{width:100%;height:100%;object-fit:contain;display:block}
.coupon > a:hover{outline:2px solid var(--accent);outline-offset:1px}
.coupon > a:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.coupon figcaption{font-size:12px;font-weight:600;color:var(--ink-muted);text-align:center}
.coupondel{position:absolute;right:12px;top:12px;z-index:2}

/* ป้ายคูปองในหน้ารายการ — เป็นลิงก์ตรงไปกรอบคูปอง */
.b-coupon{background:var(--blush);color:var(--ink);border:1px dashed var(--blush-deep);text-decoration:none}
a.b-coupon:hover{background:var(--hover-bg);color:var(--hover-ink)}
.promotable .pcoupon{display:inline-flex;align-items:center;gap:4px;font-size:11.5px;font-weight:700;
  color:var(--ink);background:var(--blush);border:1px dashed var(--blush-deep);border-radius:8px;
  padding:1px 7px;text-decoration:none;white-space:nowrap}
.promotable .pcoupon:hover{background:var(--hover-bg);color:var(--hover-ink)}

/* การ์ดในหน้ารายการก็ไม่ครอบตัดด้วยเหตุผลเดียวกัน — กรอบยังสูงเท่ากันทุกใบ */
.promoshot{background:var(--surface-alt)}
.card .promoshot > img,
.promoshot.carousel .track img{object-fit:contain}
.card .sum{font-size:13px;color:var(--ink-muted);line-height:1.55;margin:2px 0 0}
.promoex{margin:0;padding-left:18px;font-size:13.5px;line-height:1.7}
.promoex li{margin-bottom:2px}

/* ช่องข้อมูลบนการ์ดประเภทโปรโมชั่น — รายละเอียด / เงื่อนไข / ตัวอย่าง
   ป้ายกำกับต้องเล็กกว่าเนื้อหาชัดเจน ไม่งั้นการ์ดอ่านเหมือนรายการหัวข้อล้วน */
.typefield{margin-top:9px;min-width:0}
.typefield .lb{display:flex;align-items:center;gap:6px;margin:0 0 3px;
  font-size:12px;font-weight:700;color:var(--ink-muted)}
.typefield .rawtext{font-size:13.5px;line-height:1.7}
.typefield>.todo{font-size:11.5px}

/* ---------- หมวดหมู่สินค้า ---------- */
.catform{display:flex;gap:12px;align-items:flex-end;flex-wrap:wrap}
.catform .field{margin:0;flex:1;min-width:180px}
.iconpick{display:flex;gap:5px;flex-wrap:wrap;max-width:330px}
.iconpick button{width:34px;height:34px;border-radius:12px;border:1px solid var(--line);background:var(--surface);
  display:grid;place-items:center;font-size:14px;color:var(--ink)}
.iconpick button:hover{background:var(--hover-bg);color:var(--hover-ink);border-color:var(--hover-bg)}
.iconpick button.on{background:var(--blush);border-color:var(--blush-deep);color:var(--ink)}
@media (max-width:640px){
  .catform{flex-direction:column;align-items:stretch}
  .catform .field{max-width:none!important}
}

/* ---------- แถบบันทึกท้ายฟอร์ม ----------
   ⚠ บนมือถือต้องเกาะ "เหนือ" แถบเมนูล่าง (ซึ่งเป็น sticky bottom:0 เหมือนกันแต่ z สูงกว่า)
     ถ้าใช้ bottom:0 เฉยๆ ปุ่มบันทึกจะถูกเมนูล่างทับจนกดไม่ได้เลย */
.savebar{position:sticky;bottom:0;z-index:20}
@media (max-width:900px){
  .savebar{bottom:calc(69px + env(safe-area-inset-bottom))}
}

/* ---------- Dialog (ยืนยันการลบ) ---------- */
dialog.dlg{border:1.5px solid var(--line);border-radius:var(--radius);padding:0;box-shadow:var(--shadow-lg);width:min(430px,calc(100vw - 32px));background:var(--surface);color:var(--ink)}
/* ⚠ กล่องรูปชุดบนมือถือสูงเกินจอได้ — ถ้าไม่คุมความสูง ปุ่มคัดลอกจะหลุดออกนอกจอ
   จึงให้หัวและท้ายอยู่กับที่ แล้วให้เนื้อในเลื่อนแทน */
/* margin:auto จำเป็น เพราะ reset ของระบบตั้ง margin:0 ทับค่าที่เบราว์เซอร์ใช้จัดกล่องให้อยู่กลางจอ */
dialog.dlg[open]{display:flex;flex-direction:column;max-height:calc(100dvh - 32px);margin:auto}
dialog.dlg::backdrop{background:rgba(24,21,18,.45)}
dialog.dlg .dlg-hd{padding:14px 16px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:9px;font-family:var(--font-display);font-weight:700;flex:none}
dialog.dlg .dlg-bd{padding:16px;overflow:auto;min-height:0}
dialog.dlg .dlg-ft{padding:12px 16px;border-top:1px solid var(--line);display:flex;gap:8px;justify-content:flex-end;flex-wrap:wrap}

/* ---------- Misc ---------- */
.empty{text-align:center;padding:44px 20px;color:var(--ink-muted);font-weight:600}
.empty .big{font-size:38px;margin-bottom:8px}
.skel{background:linear-gradient(90deg,var(--surface-alt) 25%,#F6EAEA 37%,var(--surface-alt) 63%);
  background-size:400% 100%;animation:shimmer 1.3s ease infinite;border-radius:var(--radius-sm);height:14px}
@keyframes shimmer{0%{background-position:100% 0}100%{background-position:0 0}}
.toast{position:fixed;left:50%;transform:translateX(-50%);bottom:26px;box-shadow:var(--shadow-lg);background:var(--ink);color:#fff;padding:9px 16px;border-radius:999px;font-size:13.5px;z-index:500;opacity:0;pointer-events:none;transition:opacity .2s,transform .2s}
.toast.on{opacity:1;transform:translateX(-50%) translateY(-4px)}
/* ปุ่ม/ลิงก์ที่กดแล้วกำลังรอ server (data-busy ใน app.js) — กดซ้ำไม่ได้ ไอคอนเป็นวงหมุน */
.is-busy{pointer-events:none;opacity:.72;cursor:progress}
.swatch{display:flex;align-items:center;gap:9px;padding:8px 0;border-bottom:1px solid var(--line);font-size:13.5px}
.swatch input[type=color]{width:44px;height:32px;border:1px solid var(--line);border-radius:var(--pill);background:none;padding:2px;flex:none}
.swatch .sp{flex:1;min-width:0;font-weight:600;margin:0;cursor:pointer}
.swatch .hexbox{width:104px;flex:none;padding:5px 12px;min-height:32px;font-size:13px;text-transform:uppercase}
.swatch .hexbox.bad{border-color:var(--danger);background:#FDF3F1}
@media (max-width:520px){
  .swatch{flex-wrap:wrap}
  .swatch .sp{flex:1 0 100%;order:-1}
}
.diff{display:grid;grid-template-columns:1fr 1fr;gap:10px;font-size:12.5px}
.diff>div{border:1px solid var(--line);border-radius:16px;padding:10px}
.diff .del{background:#F9E7E3} .diff .add{background:var(--success-soft)}
.diff dl{display:grid;grid-template-columns:auto 1fr;gap:2px 10px}
.diff dt{color:var(--ink-muted);font-weight:600}
.diff dd{word-break:break-word}
.tree{font-size:13.5px;line-height:1.9}
.tree ul{list-style:none;padding-left:19px;border-left:1px dashed var(--line);margin-left:5px}
.tree li::before{content:"└ ";color:var(--line)}
.tree .rt{font-family:var(--font-mono);font-size:12px;color:var(--ink-muted);margin-left:6px}
.rolegrid{overflow:auto}
.rolegrid td{text-align:center}
.rolegrid td:first-child,.rolegrid th:first-child{text-align:left;white-space:normal;min-width:190px}
.yes{color:var(--success);font-weight:700} .no{color:#C9BDBD}
/* หน้ารายละเอียดสินค้าที่สิ้นสุดการวางขาย — กล่องเทาบนสุด ให้ CS เห็นก่อนตอบลูกค้า */
.sellend{display:flex;align-items:center;gap:12px;background:#E9E7E7;border:1px solid #CBC6C6;color:#3F3B3B;
  border-radius:var(--radius);padding:12px 15px;margin-bottom:14px}
.sellend > i{font-size:20px;color:#6E6868}
.sellend b{display:block;font-size:15px}
.sellend span{font-size:13px;color:#5E5A5A}
.pchip.is-ended{background:#E2DFDF;border-color:#CBC6C6;color:#4A4545;font-weight:700}
.sellcell{display:inline-flex;flex-direction:column;align-items:flex-start;gap:3px}
.sellcell small{font-size:11.5px;color:var(--ink-muted)}
.note{background:var(--blush);border:1px solid var(--blush-deep);color:var(--ink);border-radius:var(--radius);padding:11px 13px;font-size:13px;margin-bottom:14px}
/* แถบแหล่งข้อมูลบนสุดของหน้า (11 ต.ค. 2569 ตามลูกค้า) — ซิงก์/นำเข้า แยกจากปุ่มเครื่องมือหัวหน้า
   ใช้ร่วม: ข้อมูลสินค้า (Google Sheet) · ตารางสายส่ง (Google Sheet) · สาขา (web-order)
   ปกติ = พื้นชมพูอ่อน · .is-on = กำลังดูชุดที่กรองจากแถบนี้ (เขียว) · .is-alert = มีเรื่องต้องจัดการ (เหลือง) */
.srcstrip{display:flex;flex-wrap:wrap;align-items:center;gap:8px 10px;margin:0 0 16px;padding:8px 10px 8px 14px;border-radius:12px;
  background:var(--surface-alt);border:1px solid var(--blush);font-size:13px;color:var(--ink-muted)}
.srcstrip form{margin:0}
.srcstrip-txt{flex:1;min-width:220px}
.srcstrip-txt b{color:var(--ink)}
.srcstrip-ok{color:#1E6B3A;font-weight:600;white-space:nowrap}
.srcstrip-err{color:#A12828;font-weight:600;white-space:nowrap}
.srcstrip.is-on{background:#E7F6EC;border-color:#BFE3CB;color:#1E6B3A;font-size:13.5px}
.srcstrip.is-on .srcstrip-txt b{color:#14532B}
.srcstrip.is-alert{background:#FFF3D6;border-color:#F1D9A0;color:#8A5A00;font-size:13.5px}
.srcstrip.is-alert .srcstrip-txt b{color:#6B4500}

/* ---------- ทดสอบวาง (Paste Lab) ---------- */
.plab{position:fixed;right:18px;bottom:18px;width:370px;max-width:calc(100vw - 24px);z-index:350;
  background:var(--surface);border:1.5px solid var(--line);border-radius:20px;box-shadow:var(--shadow-lg);
  overflow:hidden;display:none}
.plab.on{display:block}
.plab-hd{display:flex;align-items:center;gap:9px;padding:10px 14px;background:var(--blush);
  border-bottom:1px solid var(--blush-deep);font-family:var(--font-display);font-weight:700;font-size:14.5px}
.plab-hd .sp{flex:1}
.plab-hd button{width:28px;height:28px;border-radius:var(--pill);display:grid;place-items:center;font-size:12px;color:var(--ink)}
.plab-hd button:hover{background:var(--hover-bg);color:var(--hover-ink)}
.plab-bd{padding:12px 14px;max-height:56vh;overflow:auto}
.plab.min .plab-bd,.plab.min .plab-ft{display:none}
.plab-drop{border:1.5px dashed #CFC2C2;border-radius:16px;min-height:88px;padding:10px 12px;font-size:14px;
  outline:none;line-height:1.6;word-break:break-word}
.plab-drop:focus{border-style:solid;border-color:var(--ink)}
.plab-drop:empty::before{content:attr(data-ph);color:var(--ink-muted);font-weight:500;white-space:pre-line}
.plab-drop img{max-width:100%;border-radius:12px;margin:5px 0;display:block}
.plab-lb{font-size:11.5px;font-weight:700;letter-spacing:.03em;color:var(--ink-muted);
  font-family:var(--font-display);margin:12px 0 5px;display:flex;align-items:center;gap:6px}
.chatbg{background:#EFEAE6;border-radius:16px;padding:11px;display:flex;flex-direction:column;gap:6px;align-items:flex-end}
.bubble{background:#fff;border:1px solid rgba(0,0,0,.05);border-radius:16px 16px 4px 16px;padding:9px 12px;
  font-size:14px;white-space:pre-wrap;word-break:break-word;max-width:92%;box-shadow:0 1px 2px rgba(0,0,0,.06)}
.bubble img{max-width:100%;border-radius:10px;display:block;margin:4px 0}
.bubble.empty{color:var(--ink-muted);background:transparent;border:1px dashed #CFC2C2;box-shadow:none;padding:9px 12px}
.plab-stats{display:flex;gap:6px;flex-wrap:wrap;margin-top:9px}
.plab-stats span{background:var(--surface-alt);border-radius:var(--pill);padding:2px 10px;font-size:12px;font-weight:600}
.plab-stats span b{font-family:var(--font-mono)}
.plab-warn{margin-top:9px;background:#FBEFD5;border:1px solid #E7D28E;border-radius:14px;padding:8px 11px;font-size:12.5px;font-weight:600;color:#7A4E00}
.plab-ft{display:flex;gap:7px;padding:10px 14px;border-top:1px solid var(--line);flex-wrap:wrap}

/* ============================================================
   Responsive — Desktop 1440 / iPad 820 / Mobile 390 / ต่ำสุด 360
   ============================================================ */
/* จอแคบ: ซ่อนป้ายปุ่ม เหลือไอคอน แล้วซ่อน kbd เป็นลำดับถัดไป */
@media (max-width:1080px){.topbar .btn .lbl{display:none}}
@media (max-width:820px){.searchbtn kbd{display:none}}
@media (max-width:900px){
  .shell{grid-template-columns:1fr}
  aside{display:none}
  .detail{grid-template-columns:1fr}
  .cols2{grid-template-columns:1fr}
  .page{padding:14px 12px 92px}
  .botnav{display:grid;position:sticky;bottom:0;z-index:55;grid-template-columns:repeat(5,1fr);
    background:var(--surface);border-top:1px solid var(--line);
    padding:6px 4px calc(6px + env(safe-area-inset-bottom))}
  .formgrid{grid-template-columns:1fr}
  .gallery{grid-template-columns:repeat(3,1fr)}
  .diff{grid-template-columns:1fr}
  /* CopyRail กลายเป็นแถบล่างติดหน้าจอ */
  .rail.desk{display:none}
  /* ⚠ ต้องเกาะ "เหนือ" แถบเมนูล่าง ไม่ใช่ bottom:0 เพราะ .botnav ก็ sticky bottom:0 (z สูงกว่า)
     ถ้าตั้งเป็น 0 แถบคัดลอกจะถูกเมนูล่างทับจนกดไม่ได้เลยบนมือถือ */
  .mobilerail{display:flex;position:sticky;bottom:calc(69px + env(safe-area-inset-bottom));gap:6px;
    overflow-x:auto;background:var(--surface);border-top:1px solid var(--line);
    border-bottom:1px solid var(--line);padding:8px 10px;margin:0 -12px -92px;z-index:50}
  .mobilerail .copychip{width:auto;flex:none}
}
@media (max-width:640px){
  .topbar{padding:9px 12px;gap:8px}
  .cattab{padding:7px 13px;font-size:13.5px;min-height:40px}
  .sortpick>span{display:none}
  .speclist{grid-template-columns:118px 1fr;font-size:13px}
  .usermenu .who{display:none}
  .page-head h1{font-size:20px}
}
@media (max-width:560px){.searchbtn .txt .full{display:none}.searchbtn .txt .short{display:inline}}
@media (max-width:520px){
  .plab{right:10px;left:10px;bottom:10px;width:auto}
  .gallery{grid-template-columns:repeat(2,1fr)}
}
@media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}

/* ---------- ผังระบบ (/sitemap) ----------
   หน้าอธิบายระบบสำหรับผู้บริหาร — เน้นอ่านง่ายและพิมพ์ออกกระดาษได้
   ทุกน้ำหนักตัวอักษรไม่เกิน 700 ตามข้อกำหนดของงาน */
.smhero{background:var(--surface-alt)}
.smlead{margin:0 0 16px;max-width:80ch;font-size:16.5px;line-height:1.8}
.smlead b{font-weight:700}
.smvalue{display:grid;grid-template-columns:repeat(auto-fit,minmax(228px,1fr));gap:12px}
.smv{display:flex;gap:11px;align-items:flex-start;min-width:0;
  padding:12px 14px;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface)}
.smv .ic{flex:none;width:32px;height:32px;border-radius:11px;display:grid;place-items:center;
  background:var(--accent-soft);color:var(--accent);font-size:15px}
.smv b{display:block;font-weight:700;font-size:14.5px;margin-bottom:3px}
.smv span{display:block;font-size:13.5px;line-height:1.65;color:var(--ink-muted)}

.smflow{list-style:none;margin:0;padding:0;
  display:grid;grid-template-columns:repeat(auto-fit,minmax(215px,1fr));gap:14px}
.smflow li{position:relative;min-width:0;padding:18px 15px 15px;
  border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-alt)}
.smflow .step{position:absolute;top:-11px;left:15px;width:26px;height:26px;border-radius:var(--pill);
  background:var(--accent);color:#fff;font-size:13px;font-weight:700;display:grid;place-items:center}
.smflow .ic{display:block;margin:4px 0 9px;font-size:19px;color:var(--accent)}
.smflow b{display:block;font-weight:700;font-size:15px;margin-bottom:5px}
.smflow p{margin:0;font-size:13.5px;line-height:1.7;color:var(--ink-muted)}

.smgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(282px,1fr));gap:12px}
.smitem{display:flex;flex-direction:column;gap:8px;min-width:0;padding:13px 14px;
  border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface)}
.smitem .hd{display:flex;align-items:center;gap:10px;min-width:0;color:inherit;text-decoration:none}
.smitem .hd .ic{flex:none;width:31px;height:31px;border-radius:11px;display:grid;place-items:center;
  background:var(--accent-soft);color:var(--accent);font-size:14px}
.smitem .hd b{min-width:0;font-weight:700;font-size:15px;overflow-wrap:anywhere}
.smitem .hd .go{margin-left:auto;flex:none;color:var(--accent);opacity:0;transition:opacity .15s}
a.hd:hover b{color:var(--accent)}
a.hd:hover .go{opacity:1}
.smitem .what{margin:0;font-size:13.5px;line-height:1.7;color:var(--ink-muted)}
.smitem .mrow{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin-top:auto;padding-top:2px}
.smitem .who{display:inline-flex;align-items:center;gap:5px;min-width:0;font-size:12.5px;color:var(--ink-muted)}
.smme td{background:var(--accent-soft)}

.smchips{display:flex;flex-wrap:wrap;gap:8px}
.smchip{display:inline-flex;align-items:center;gap:7px;padding:7px 13px;font-size:13.5px;
  border:1px solid var(--line);border-radius:var(--pill);background:var(--surface);
  color:inherit;text-decoration:none}
.smchip:hover{background:var(--hover-bg);color:var(--hover-ink);border-color:var(--hover-bg)}

/* ---------- รวมคำถามตอบ (FAQ) ----------
   แถวหนึ่ง = หนึ่งคำถาม กวาดตาลงมาทีเดียวเจอ ไม่ต้องกางทุกข้อเพื่อดูว่าใช่ไหม
   ปุ่มคัดลอกอยู่ในแถวเลย เพราะงานจริงคือ "เจอ → คัดลอก → วางในแชต" ไม่ใช่ "เจอ → อ่าน" */
.faqbar{display:flex;flex-wrap:wrap;align-items:center;gap:10px 14px;margin:0 0 12px}
.faqcats{display:flex;flex-wrap:wrap;gap:7px}
.faqcat{display:inline-flex;align-items:center;gap:7px;padding:6px 13px;font-size:13.5px;font-weight:600;
  border:1px solid var(--line);border-radius:var(--pill);background:var(--surface);color:inherit;text-decoration:none}
.faqcat span{font-size:12px;font-weight:700;color:var(--ink-muted);font-family:var(--font-mono)}
.faqcat:hover{background:var(--hover-bg);color:var(--hover-ink);border-color:var(--hover-bg)}
.faqcat:hover span{color:rgba(255,255,255,.8)}
.faqcat.on{background:var(--blush);border-color:var(--blush-deep)}
.faqcat.on span{color:var(--ink)}
/* ข้อความสำเร็จรูป (layout reply · 28 ก.ย. 2569) — ชิปขั้นตอนใช้ .faqcat · การ์ดข้อความกดที่ข้อความ = คัดลอก */
.qrno{display:inline-grid;place-items:center;min-width:20px;height:20px;padding:0 5px;border-radius:var(--pill);background:var(--ink);color:#fff;
  font-size:11.5px;font-weight:700;font-family:var(--font-mono)}
.faqcat .qrno{min-width:18px;height:18px;font-size:10.5px}
/* hover = พื้นดำ (11 ต.ค. 2569 ลูกค้าแจ้ง) — วงเลขขั้นตอนกลับเป็นพื้นขาว · ตัวเลขจำนวนของแท็บที่เลือกอยู่ต้องสว่างด้วย ไม่งั้นดำกลืนพื้น */
.faqcat:hover .qrno{background:#fff;color:var(--ink)}
.faqcat.on:hover span{color:rgba(255,255,255,.8)}
.qrgroup{margin-top:18px}
.qrhead{display:flex;align-items:center;gap:9px;font-size:16px;margin:0 0 10px}
.qrhead span{font-size:12.5px;font-weight:600;color:var(--ink-muted)}
.qrgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:12px}
.qrcard{background:var(--surface);border:1.5px solid var(--line);border-radius:var(--radius);padding:12px;display:flex;flex-direction:column;gap:8px;box-shadow:var(--shadow);min-width:0}
.qrtop{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.qrtop b{font-family:var(--font-display);font-size:14.5px}
.qrtext{display:flex;flex-direction:column;gap:8px;width:100%;text-align:left;background:var(--surface-alt);border:1px solid var(--line);border-radius:12px;
  padding:10px 12px;font-size:14px;line-height:1.7;color:var(--ink);flex:1}
.qrtext .t{white-space:pre-wrap;word-break:break-word}
/* ข้อความสำเร็จรูปแบบ HTML (12 ต.ค. 2569 · ตัวแก้ไข + ลิงก์) — ย่อหน้าละบรรทัดเหมือนข้อความล้วนเดิม ไม่มีช่องไฟ <p> */
.qrtext .qrhtml{white-space:normal}
.qrhtml p{margin:0}
.qrhtml ul,.qrhtml ol{margin:0;padding-left:20px}
.qrhtml a{color:var(--accent);text-decoration:underline;overflow-wrap:anywhere}
.qrimgs{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px}
.qrimg{position:relative;display:block;aspect-ratio:1;border-radius:10px;overflow:hidden;border:1px solid var(--line);background:var(--surface-alt)}
.qrimg img{width:100%;height:100%;object-fit:cover;display:block}
.qrimg .more{position:absolute;inset:0;display:grid;place-items:center;background:rgba(0,0,0,.45);color:#fff;font-weight:700}
.qrfoot{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.qrdate{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--ink-muted);font-variant-numeric:tabular-nums}
.qrfoot .copychip.qrcopy{width:auto;min-height:36px;padding:6px 14px;font-size:13px}
/* หมวดหมู่ที่จัดการได้ (ฟอร์ม + หน้าจัดการ · 28 ก.ย. 2569) */
.catpick{display:flex;gap:8px;align-items:center}
.catpick select{flex:1;min-width:0}
.catadd{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.catadd .inp{flex:1;min-width:220px}
.catlist{list-style:none;margin:14px 0 0;padding:0;border:1px solid var(--line);border-radius:12px;overflow:hidden}
.catlist li{display:flex;align-items:center;gap:10px;padding:9px 12px;border-top:1px solid var(--line)}
.catlist li:first-child{border-top:none}
.catlist .nm{font-weight:700;flex:1;min-width:0}
.catlist .ct{font-size:12.5px;color:var(--ink-muted);white-space:nowrap}
.catlist .acts{display:flex;gap:4px}
.catlist .acts form{margin:0}
.catlist .copyicon:disabled{opacity:.35;cursor:not-allowed}
.catlist .catdel:not(:disabled){color:var(--danger)}
/* ⚠ ห้ามใช้ flex กับบรรทัดนี้ — <b> จะกลายเป็น flex item แล้วตัวเลขจะหลุดไปคนละบรรทัดกับข้อความบนจอแคบ */
.faqcount{margin:0;font-size:13px;line-height:1.7;color:var(--ink-muted)}
.faqcount b{color:var(--ink)}
.faqcount > i{margin-right:5px}

/* แถบบอกว่า "ค้นไม่เจอทั้งคำ ระบบถอยไปหาแบบนี้ให้" — ขึ้นเฉพาะตอนที่ถอยจริงเท่านั้น */
.faqfallback{display:flex;gap:9px;align-items:flex-start;margin:0 0 12px;padding:10px 14px;
  border:1px solid var(--line);border-left:4px solid var(--warn);border-radius:var(--radius-sm);
  background:var(--surface-alt);font-size:13px;line-height:1.8;color:var(--ink)}
.faqfallback.srnote{margin:8px 10px;font-size:13px}   /* ในกล่องผลค้นหาด่วน (Ctrl K / ช่องบนสุด) */
.faqfallback > i{color:var(--warn);margin-top:4px;flex:none}
.faqfallback .ft{display:inline-block;background:var(--blush);border-radius:var(--pill);
  padding:1px 10px;font-weight:700;margin:0 3px}

.faqlist{display:flex;flex-direction:column}
.faqrow{border-bottom:1px solid var(--line)}
.faqrow:last-child{border-bottom:none}
.faqrow > summary{display:flex;align-items:center;gap:11px;padding:12px 14px;cursor:pointer;list-style:none}
.faqrow > summary::-webkit-details-marker{display:none}
.faqrow > summary:hover{background:var(--surface-alt)}
.faqrow[open] > summary{background:var(--surface-alt)}
.faqrow > summary:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}

.faqrow .qic{flex:none;width:22px;text-align:center;color:var(--accent)}
.faqrow .qmain{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
.faqrow .qmain b{font-size:14.5px;font-weight:700;line-height:1.5}
/* คำตอบย่อจำกัด 2 บรรทัด ทุกแถวจะได้สูงเท่ากันและกวาดตาลงมาเป็นจังหวะเดียว */
.faqrow .qpeek{font-size:13px;color:var(--ink-muted);line-height:1.6;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
/* กางแล้วคำตอบเต็มอยู่ข้างล่างแล้ว ไม่ต้องโชว์ตัวย่อซ้ำ */
.faqrow[open] .qpeek{display:none}

.faqrow .qcat{flex:none;font-size:12px;font-weight:600;color:var(--ink-muted);
  border:1px solid var(--line);border-radius:var(--pill);padding:3px 10px;white-space:nowrap}
.faqrow .qcaret{flex:none;width:18px;text-align:center;color:var(--ink-muted);transition:transform .18s ease}
.faqrow[open] .qcaret{transform:rotate(180deg)}

.faqrow .qcopy{flex:none;display:inline-flex;align-items:center;gap:7px;white-space:nowrap;
  border:1px solid var(--blush-deep);background:var(--blush);border-radius:var(--pill);
  padding:7px 14px;min-height:38px;font-size:13px;font-weight:700;
  transition:transform .18s ease,background .18s ease,border-color .18s ease}
.faqrow .qcopy:hover{background:var(--hover-bg);color:var(--hover-ink);border-color:var(--hover-bg)}
.faqrow .qcopy.done,.faqrow .qcopy.done:hover{background:var(--success-soft);border-color:var(--success);color:var(--ink);transform:scale(1.04)}
.faqrow .qcopy.busy{opacity:.6;pointer-events:none}

.faqa{padding:2px 14px 14px 47px}
.faqtext{font-size:14px;line-height:1.8;white-space:normal}
.faqtext a{color:var(--accent)}

/* ---------- เอกสาร (layout doc) — เกี่ยวกับการบริการ (28 ก.ย. 2569) ----------
   หนึ่งรายการ = หนึ่งกล่อง อ่าน/คัดลอกได้เลย · รูปซ้าย (ทั้งใบ ไม่ครอป) เนื้อหาขวา · จอแคบเรียงบนลงล่าง */
.svclist{display:flex;flex-direction:column;gap:16px}
.svcdoc{margin:0}
.svchead{flex-wrap:wrap;row-gap:10px;align-items:center}
.svcic{width:38px;height:38px;border-radius:12px;display:grid;place-items:center;flex:none;background:var(--blush);color:var(--ink);font-size:16px}
.svctitle{min-width:0}
.svctitle h3{font-family:'Sarabun',var(--font-body);font-weight:700;font-size:17px;line-height:1.35;margin:0}
.svctitle p{margin:2px 0 0;font-size:13px;color:var(--ink-muted)}
.svccopy{display:flex;gap:8px;flex-wrap:wrap}
.svccopy .copychip{width:auto;min-height:38px;padding:7px 15px}
.svccopy .copychip .sub{margin-left:4px}
.svcbody{display:grid;gap:18px}
.svcbody.has-both{grid-template-columns:minmax(0,5fr) minmax(0,6fr);align-items:start}
.svcimgs{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:12px}
.svcimgs.is-one{grid-template-columns:minmax(0,420px)}
.svcbody:not(.has-both) .svcimgs{grid-template-columns:repeat(auto-fill,minmax(220px,300px))}
.svcimg{margin:0;display:flex;flex-direction:column;gap:6px}
.svcimg a{display:block;border-radius:12px;overflow:hidden;border:1px solid var(--line);background:var(--surface-alt);cursor:zoom-in}
.svcimg img{display:block;width:100%;height:auto}
.svcimg figcaption{display:flex;align-items:center;gap:8px}
.svcimg figcaption .n{font-size:12.5px;color:var(--ink-muted);font-weight:600}
.svcimg figcaption .copyicon{margin-left:auto;width:32px;height:32px;font-size:13px}
.svctext{min-width:0}
/* ตารางขนาดเค้กเป็นรูป — หน้าขนาดสินค้า (28 ก.ย. 2569) */
.szacts{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.szacts .copychip{width:auto;min-height:36px;padding:6px 14px;font-size:13px}
.szbody{display:grid;grid-template-columns:minmax(0,240px) minmax(0,1fr);gap:20px;align-items:start}
.szprev{display:grid;place-items:center;min-height:140px;border:1px solid var(--line);border-radius:12px;overflow:hidden;background:var(--surface-alt);cursor:zoom-in}
.szprev img{display:block;width:100%;height:auto}
.szhelp{font-size:13.5px;line-height:1.7;color:var(--ink)}
.szhelp p{margin:0 0 6px}
.szhelp ul{margin:0;padding-left:20px;color:var(--ink-muted)}
@media (max-width:640px){.szbody{grid-template-columns:minmax(0,1fr)}.szprev{max-width:300px}}
/* มากกว่า 2 รูป = carousel (28 ก.ย. 2569) — กรอบ 4/5 รูปเต็มใบ · รูปย่อเห็นหัวรูป (หัวข้อขั้นตอนอยู่บนสุด) + เลขรูป */
.svcgal{display:flex;flex-direction:column;gap:0;min-width:0}
.svcgal .carousel{border-radius:14px;border:1px solid var(--line)}
.svcgal .carousel .nav{opacity:.9;width:34px;height:34px;margin-top:-17px}
.svcthumbs button{width:58px}
.svcthumbs button img{object-position:center top}
.thumbno{position:absolute;right:3px;bottom:3px;z-index:1;min-width:18px;height:18px;padding:0 5px;border-radius:var(--pill);
  background:rgba(40,36,36,.78);color:#fff;font-size:10.5px;font-weight:700;line-height:18px;text-align:center}
.svcthumbs button.on .thumbno{background:var(--ink)}
.svcgal .copychip.svccur{width:auto;align-self:flex-start;min-height:36px;padding:6px 14px;font-size:13px;margin-top:4px}
.svcfoot{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:10px 18px;border-top:1px solid var(--line)}
@media (max-width:760px){
  .svcbody.has-both{grid-template-columns:minmax(0,1fr)}
  .svccopy{width:100%}
  .svcimgs,.svcbody:not(.has-both) .svcimgs{grid-template-columns:repeat(2,minmax(0,1fr))}
  .svcimgs.is-one{grid-template-columns:minmax(0,1fr)}
  .svcgal .copychip.svccur{align-self:stretch}
}
.faqimglink{position:relative;display:inline-block;max-width:720px;width:100%;margin-top:10px;text-decoration:none}
.faqimg{display:block;width:100%;height:auto;border:1px solid var(--line);border-radius:var(--radius-sm)}
.faqimglink .zoom{position:absolute;right:10px;bottom:10px;display:inline-flex;align-items:center;gap:6px;
  background:rgba(0,0,0,.72);color:#fff;font-size:12.5px;font-weight:600;padding:5px 11px;border-radius:var(--pill);
  opacity:0;transition:opacity .18s ease}
.faqimglink:hover .zoom,.faqimglink:focus-visible .zoom{opacity:1}
.faqacts{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:12px}

.faqrow mark{background:var(--blush);color:inherit;border-radius:3px;padding:0 2px;font-weight:700}

@media (max-width:720px){
  /* จอแคบ: ตัดป้ายคำและหมวดออก เหลือไอคอนคัดลอกที่ยังกดง่ายด้วยนิ้ว */
  .faqrow .qcopy .lb,.faqrow .qcat{display:none}
  .faqrow .qcopy{padding:9px 12px;min-width:44px;justify-content:center}
  .faqa{padding-left:14px}
}

/* ผู้บริหารมักขอเป็นกระดาษหรือ PDF — ตัดเมนูและปุ่มออกให้เหลือแต่เนื้อหา */
@media print{
  aside,.topbar,.botnav,.skip,.toast,.plab,.page-head .btn{display:none!important}
  .shell{display:block}
  .page{padding:0}
  .panel{box-shadow:none;break-inside:avoid}
  .smitem,.smv,.smflow li,.stat{break-inside:avoid}
  .smitem .hd .go{display:none}
}

/* ============================================================
   E-Learning
   ============================================================ */

/* ---------- การ์ดวิดีโอในหน้ารายการ ---------- */
/* ---------- E-Learning: ตารางวิดีโอ (อ้างอิงหน้ารายการของ YouTube) ----------
   ลำดับที่ลอกมา: ปกกินพื้นที่หลัก → ชื่อสองบรรทัด → คนอัปโหลด/หมวด → ยอด/เวลา
   ที่ตั้งใจไม่ลอก: ยอดวิวแบบย่อ ("4.5 แสน") — ของเราหลักสิบ ย่อแล้วเสียความแม่นยำ
   ⚠ ห้ามใส่กรอบ/เงาให้ .ycard — ที่ YouTube ปกคือขอบเขตของการ์ด การใส่กรอบซ้อน
     ทำให้ระยะห่างระหว่างใบดูแน่นและปกเล็กลงโดยไม่ได้อะไรกลับมา */
.vgrid{display:grid;gap:26px 16px;grid-template-columns:repeat(auto-fill,minmax(288px,1fr))}
@media (max-width:560px){.vgrid{grid-template-columns:minmax(0,1fr);gap:20px}}
.ycard{display:flex;flex-direction:column;min-width:0}

/* --- ปก --- */
.ythumb{position:relative;display:block;aspect-ratio:16/9;background:#171012;
  border-radius:14px;overflow:hidden;text-decoration:none}
.ythumb img,.ythumb .vposter{position:absolute;inset:0;width:100%;height:100%;
  object-fit:cover;display:block;transition:transform .35s ease}
/* วิดีโอที่ใช้แทนรูปปกต้องไม่รับคลิก ไม่งั้นกดที่ปกแล้วไปโดนตัวเล่นแทนที่จะเข้าหน้าวิดีโอ */
.ythumb .vposter{pointer-events:none;background:#000}
.ythumb .ph{position:absolute;inset:0;display:grid;place-items:center;font-size:34px;color:#C99AA3}
.ycard:hover .ythumb img,.ycard:hover .ythumb .vposter{transform:scale(1.045)}

/* ปุ่มเล่นขึ้นตอนชี้เท่านั้น — YouTube ไม่แปะปุ่มค้างไว้บนปก
   ปกที่โล่งทำให้ภาพจริงอ่านออกตั้งแต่ยังไม่ชี้ ซึ่งคือเหตุผลที่มีปกตั้งแต่แรก */
.yhover{position:absolute;inset:0;display:grid;place-items:center;
  background:rgba(23,16,18,.40);opacity:0;transition:opacity .18s ease}
.yhover > i{width:54px;height:54px;border-radius:var(--pill);background:rgba(0,0,0,.62);
  color:#fff;font-size:18px;display:grid;place-items:center;padding-left:3px}
.ycard:hover .yhover,.ythumb:focus-visible .yhover{opacity:1}

.yflags{position:absolute;left:8px;top:8px;display:flex;flex-direction:column;
  align-items:flex-start;gap:5px;max-width:calc(100% - 16px)}
.yflag{display:inline-flex;align-items:center;gap:5px;background:rgba(23,16,18,.84);
  color:#fff;font-size:11px;font-weight:700;padding:3px 8px;border-radius:6px;line-height:1.55}
.yflag.warn{background:#7E1B14;color:#FFE4E0}

.ydur{position:absolute;right:8px;bottom:8px;background:rgba(23,16,18,.86);color:#fff;
  font-size:12px;font-weight:700;padding:2px 7px;border-radius:6px;line-height:1.6}

/* แถบใต้ปก = ดูจบแล้ว (ที่ YouTube คือแถบความคืบหน้า)
   ของเราเก็บแค่ "จบ/ยังไม่จบ" จึงมีสองสถานะคือเต็มแถบหรือไม่มีเลย
   ⚠ ห้ามให้แถบนี้เป็นตัวบอกเพียงลำพัง ต้องมีป้าย "คุณดูจบแล้ว" กำกับเสมอ
     สีอย่างเดียวสื่อความหมายไม่ได้ (WCAG 1.4.1) */
.yseen{position:absolute;left:0;right:0;bottom:0;height:4px;background:var(--accent)}

/* --- ข้อมูลใต้ปก --- */
.ymeta{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:11px;
  margin-top:11px;align-items:start}
.ymeta > .avatar{margin-top:2px}
.ytext{min-width:0;display:flex;flex-direction:column;gap:2px}
.ytitle{font-size:15.5px;font-weight:700;line-height:1.45;margin:0}
.ytitle a{color:var(--ink);text-decoration:none;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.ytitle a:hover{color:var(--accent)}
.yline{margin:0;font-size:12.5px;color:var(--ink-muted);line-height:1.75;
  display:flex;flex-wrap:wrap;align-items:center;gap:2px 6px}
.yline b{color:var(--ink);font-weight:700}
.yline .dot{opacity:.5}
.ycat{display:inline-flex;align-items:center;gap:4px;background:var(--surface-alt);
  border:1px solid var(--line);color:var(--ink);font-size:11.5px;font-weight:700;
  padding:0 8px;border-radius:var(--pill);text-decoration:none;line-height:1.85}
.ycat:hover{background:var(--blush);border-color:var(--blush-deep)}
.ysnip{margin:3px 0 0;font-size:12.5px;line-height:1.65;color:var(--ink-muted);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.yextra{margin:5px 0 0;font-size:11.5px;color:var(--ink-muted);line-height:1.7;
  display:flex;flex-wrap:wrap;align-items:center;gap:4px 10px}
.yextra .badge{font-size:11px;padding:2px 8px}

/* ⋮ — โผล่ตอนชี้การ์ดหรือตอนโฟกัสด้วยคีย์บอร์ด */
.ykebab{position:relative;flex:none}
.ykebab > button{width:32px;height:32px;border-radius:var(--pill);display:grid;place-items:center;
  color:var(--ink-muted);font-size:15px;opacity:0;transition:opacity .15s ease}
.ycard:hover .ykebab > button,.ykebab > button:focus-visible,.ykebab.open > button{opacity:1}
.ykebab > button:hover{background:var(--hover-bg);color:var(--hover-ink)}
/* จอสัมผัสไม่มีสถานะ "ชี้" — ถ้าซ่อนไว้ก็ไม่มีทางเปิดเมนูได้เลย */
@media (hover:none){.ykebab > button{opacity:1}}
.ykebab .drop{position:absolute;right:0;top:calc(100% + 6px);min-width:190px;
  background:var(--surface);border:1.5px solid var(--line);border-radius:var(--radius-sm);
  box-shadow:var(--shadow-lg);padding:6px;display:none;z-index:120}
.ykebab.open .drop{display:block}
.ykebab .drop a,.ykebab .drop button{display:flex;align-items:center;gap:9px;width:100%;
  text-align:left;padding:8px 12px;border-radius:var(--pill);font-size:13px;font-weight:600;
  color:var(--ink);text-decoration:none}
.ykebab .drop a:hover,.ykebab .drop button:hover{background:var(--hover-bg);color:var(--hover-ink)}
.ykebab .drop .danger{color:var(--danger)}

/* --- ปกเล็กในมุมมองตาราง --- */
.vthumb{position:relative;display:block;aspect-ratio:16/9;background:var(--surface-alt);
  overflow:hidden;text-decoration:none}
.vthumb img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
.vthumb .vposter{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  display:block;pointer-events:none;background:#000}
.vthumb .ph{position:absolute;inset:0;display:grid;place-items:center;font-size:38px;color:#B98A93}
.vthumb.sm{width:88px;aspect-ratio:16/9;border-radius:8px}
.vthumb.sm .ph{font-size:18px}

@media (prefers-reduced-motion:reduce){
  .ythumb img,.ythumb .vposter,.yhover,.ykebab > button{transition:none}
  .ycard:hover .ythumb img,.ycard:hover .ythumb .vposter{transform:none}
}

/* ---------- ข่าวประกาศ ----------
   อ้างอิงงานวิจัยการอ่านข่าวภายในองค์กร:
   · คอลัมน์อ่าน 50–75 ตัวอักษรต่อบรรทัด ยาวกว่านี้ตาหาบรรทัดถัดไปไม่เจอ
   · ตัวอักษรอย่างน้อย 16px และระยะบรรทัดกว้าง — ภาษาไทยมีสระบนล่างต้องการที่มากกว่าอังกฤษ
   · ที่ว่างรอบข้อความคือส่วนหนึ่งของการอ่าน ไม่ใช่พื้นที่เหลือ
   ------------------------------------------------------------------ */

/* --- หน้ารายการ: กระดานข่าว --- */
.nlist{background:var(--surface);border:1.5px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);overflow:hidden}
.npost{display:flex;gap:16px;align-items:flex-start;padding:16px 18px;
  border-top:1px solid var(--line);transition:background .15s ease}
.nlist > .npost:first-child{border-top:0}
.npost:hover{background:var(--surface-alt)}

/* ⚠⚠ รูปต้องอยู่ "ขวา" ของข้อความ ห้ามย้ายกลับไปซ้าย
   รายการนี้ปนกันระหว่างประกาศที่มีรูปกับไม่มีรูป
   ถ้ารูปอยู่ซ้าย หัวข้อของแถวที่มีรูปจะเยื้องเข้ามา ส่วนแถวที่ไม่มีรูปจะชิดขอบ
   ขอบซ้ายของข้อความเลยขยับไปมาทุกแถว สายตาต้องหาจุดเริ่มใหม่ตลอด
   (research เรียกอาการนี้ว่า alternating layout — ทำให้กวาดสายตาสะดุด)
   วางไว้ขวาแล้วข้อความทุกแถวเริ่มที่ x เดียวกันเสมอ ไม่ว่าจะมีรูปหรือไม่

   ⚠ กรอบรูปอยู่ในเงื่อนไข ไม่ใช่คอลัมน์ตายตัวของ grid
   ประกาศที่ไม่มีรูปต้องไม่เหลือช่องว่างค้างไว้ — flex จึงเหมาะกว่า grid ตรงนี้ */
.nthumb{flex:none;order:2;width:124px;aspect-ratio:3/2;border-radius:10px;overflow:hidden;
  background:var(--surface-alt);display:block}
.nthumb img{width:100%;height:100%;object-fit:cover;display:block}

.nbody{flex:1;order:1;min-width:0;display:flex;flex-direction:column;gap:4px}
.nmeta{margin:0;font-size:12.5px;color:var(--ink-muted);display:flex;flex-wrap:wrap;
  align-items:center;gap:6px 10px;line-height:1.7}
.nmeta time{display:inline-flex;align-items:center;gap:5px}
.ntitle{margin:0;font-size:17px;font-weight:700;line-height:1.5}
.ntitle a{color:var(--ink);text-decoration:none}
.ntitle a:hover{color:var(--accent);text-decoration:underline;text-underline-offset:3px}
.nlead{margin:2px 0 0;font-size:13.5px;line-height:1.75;color:var(--ink-muted);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.nfoot{margin:6px 0 0;font-size:12.5px;color:var(--ink-muted);display:flex;flex-wrap:wrap;
  align-items:center;gap:4px 14px;line-height:1.7}
.nfoot a{color:var(--ink-muted);font-weight:600;text-decoration:none}
.nfoot a:hover{color:var(--accent);text-decoration:underline}
.nfoot .nedit{margin-left:auto}

/* ป้าย "ใหม่" — นับจากวันที่ประกาศ ไม่ใช่ "ฉันอ่านแล้วหรือยัง" (ระบบไม่ได้เก็บว่าใครอ่านอะไร) */
.nnew{background:var(--accent);color:#fff;font-size:11px;font-weight:700;
  padding:1px 9px;border-radius:var(--pill);line-height:1.8;letter-spacing:.3px}

/* หมุดเล็กในแถวปกติ — ใช้ตอนค้นหาเจอของที่ปักหมุดไว้ ซึ่งไม่ได้อยู่ในส่วนหมุดแล้ว */
.npin{color:var(--accent);font-size:11px}

/* --- ส่วนที่ปักหมุด --- */
.npinned{margin-bottom:4px}
.npinned .nlist{border-color:var(--blush-deep);background:var(--accent-soft)}
.npinned .npost{border-top-color:var(--blush-deep)}
.npinned .npost:hover{background:#FCD8E1}
/* แถบหมุดด้านซ้าย — เป็นตัวบอกซ้ำจากหัวข้อ "ปักหมุดไว้" ไม่ได้สื่อความหมายลำพัง */
.npinned .npost{border-left:3px solid var(--accent)}

/* แถวเด่น (ของที่ปักหมุด) — ใหญ่ขึ้นพอให้ต่างจากแถวปกติ แต่ไม่ถึงกับเป็นการ์ดคนละแบบ */
.npost.big{padding:18px}
.npost.big .ntitle{font-size:19px}
.npost.big .nlead{-webkit-line-clamp:3}
.npost.big .nthumb{width:150px}

/* --- หัวข้อคั่นกลุ่ม --- */
.nsplit{display:flex;align-items:center;gap:9px;margin:22px 2px 10px;
  font-size:13px;font-weight:700;color:var(--ink-muted)}
.nsplit b{background:var(--surface-alt);border:1px solid var(--line);
  border-radius:var(--pill);padding:0 9px;font-size:12px;line-height:1.9}
.nsplit::after{content:"";flex:1;height:1px;background:var(--line)}
.nsplit.pin{color:var(--accent);margin-top:4px}
.nsplit.pin b{background:var(--accent);border-color:var(--accent);color:#fff}
.nsplit.pin::after{background:var(--blush-deep)}

/* --- ช่องติ๊กปักหมุดในฟอร์ม --- */
.pinbox{display:flex;align-items:flex-start;gap:11px;cursor:pointer;margin-top:4px;
  border:1.5px solid var(--line);border-radius:var(--radius-sm);padding:12px 14px;
  background:var(--surface);transition:border-color .15s ease,background .15s ease}
.pinbox:hover{border-color:var(--blush-deep)}
.pinbox:has(input:checked){border-color:var(--accent);background:var(--accent-soft)}
.pinbox:focus-within{outline:3px solid var(--accent);outline-offset:2px}
.pinbox input{margin-top:3px;flex:none;width:18px;height:18px;accent-color:var(--accent)}
.pinmark{flex:none;width:32px;height:32px;border-radius:var(--pill);display:grid;place-items:center;
  background:var(--surface-alt);color:var(--ink-muted);font-size:14px}
.pinbox:has(input:checked) .pinmark{background:var(--accent);color:#fff}
.pintext{min-width:0;display:flex;flex-direction:column;gap:3px}
.pintext b{font-size:14px}
.pintext > span{font-size:12px;color:var(--ink-muted);line-height:1.7}

/* ประกาศที่สิ้นสุดแล้ว — ลดน้ำหนักสายตา แต่ห้ามจางจนอ่านไม่ออก
   ⚠ ห้ามใช้ opacity กับทั้งแถว เพราะจะลากค่าคอนทราสต์ของตัวอักษรลงไปด้วย
     ลดเฉพาะรูป แล้วเปลี่ยน "สี" ของหัวข้อแทน คอนทราสต์จึงยังคุมได้ */
.npost.done .nthumb{opacity:.55}
.npost.done .ntitle a{color:var(--ink-muted);font-weight:600}


/* --- หน้าอ่าน --- */
.nended{max-width:44rem;margin:0 auto 16px;display:flex;align-items:flex-start;gap:10px;
  background:var(--surface-alt);border:1.5px solid var(--line);border-left:4px solid var(--ink-muted);
  border-radius:var(--radius-sm);padding:11px 14px;font-size:13.5px;line-height:1.7;color:var(--ink)}
.nended.draft{border-left-color:var(--accent);background:var(--accent-soft)}

.nread{max-width:44rem;margin:0 auto;background:var(--surface);
  border:1.5px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);
  padding:26px 28px 22px}
.nread.done{background:var(--surface-alt)}
.nread-head{display:flex;flex-direction:column;gap:10px}
.nread-date{margin:0;font-size:13px;color:var(--ink-muted);display:flex;flex-wrap:wrap;
  align-items:center;gap:8px}
.nread-date b{color:var(--ink)}
.nread h1{font-size:27px;line-height:1.45;font-weight:700;margin:0;text-wrap:balance}
.nread-by{margin:2px 0 0;display:flex;align-items:center;gap:10px;font-size:13px;color:var(--ink-muted)}
.nread-by b{display:block;color:var(--ink);font-size:13.5px}

.nread-img{margin:20px 0 0}
.nread-img img{width:100%;height:auto;display:block;border-radius:var(--radius-sm)}

/* เนื้อข่าว — ที่นี่คือจุดเดียวในระบบที่คนต้องอ่านยาวๆ จริงๆ จึงตั้งขนาดใหญ่กว่าที่อื่น */
.nread-body{margin-top:20px;font-size:16.5px;line-height:2}
.nread-body > *:first-child{margin-top:0}
.nread-body h2{font-size:20px;line-height:1.5;margin:26px 0 8px}
.nread-body h3{font-size:17.5px;line-height:1.5;margin:22px 0 6px}
.nread-body p{margin:0 0 14px}
.nread-body ul,.nread-body ol{margin:0 0 14px;padding-left:26px}
.nread-body li{margin-bottom:6px}
.nread-body a{color:var(--accent)}
.nread-body blockquote{margin:0 0 14px;padding:2px 0 2px 16px;
  border-left:3px solid var(--blush-deep);color:var(--ink-muted)}
.nread-body hr{border:0;border-top:1px solid var(--line);margin:22px 0}
/* ตารางในข่าวต้องเลื่อนในกรอบตัวเอง ห้ามดันหน้าให้เลื่อนข้าง */
.nread-body table{border-collapse:collapse;margin:0 0 14px;font-size:15px;
  white-space:normal;display:block;overflow-x:auto;max-width:100%}
.nread-body th,.nread-body td{border:1px solid var(--line);padding:8px 12px;text-align:left}
.nread-body th{background:var(--surface-alt);font-weight:700}

.nread-foot{margin-top:22px;padding-top:14px;border-top:1px solid var(--line);
  display:flex;flex-wrap:wrap;gap:6px 16px;font-size:12px;color:var(--ink-muted)}

/* กล่องความเห็นต้องกว้างเท่าคอลัมน์อ่าน ไม่งั้นสายตาต้องรีเซ็ตตำแหน่งใหม่ */
.nread-talk{max-width:44rem;margin:16px auto 0}

@media (max-width:640px){
  .npost{padding:14px;gap:11px}
  .nthumb{width:96px}
  .ntitle{font-size:15.5px}
  .nfoot .nedit{margin-left:0}
  .nread{padding:20px 16px 18px;border-radius:var(--radius-sm)}
  .nread h1{font-size:22px}
  .nread-body{font-size:16px;line-height:1.95}
}

/* --- ตัวเลือกสถานะในฟอร์ม --- */
.statuspick{display:flex;flex-direction:column;gap:7px;margin-top:4px}
.statusopt{display:flex;flex-direction:column;gap:2px;cursor:pointer;
  border:1.5px solid var(--line);border-radius:var(--radius-sm);padding:9px 12px;
  background:var(--surface);transition:border-color .15s ease,background .15s ease}
.statusopt:hover{border-color:var(--blush-deep)}
/* .on มาจาก PHP ตอนโหลดหน้า ส่วน :has() ทำให้ไฮไลต์ขยับตามตอนคลิกโดยไม่ต้องใช้ JS */
.statusopt.on,.statusopt:has(input:checked){border-color:var(--accent);background:var(--accent-soft)}
.statusopt:not(:has(input:checked)){border-color:var(--line);background:var(--surface)}
.statusopt:focus-within{outline:3px solid var(--accent);outline-offset:2px}
/* ซ่อน radio จริงแต่ยังโฟกัสได้ — ห้ามใช้ display:none เพราะคีย์บอร์ดจะเข้าไม่ถึง */
.statusopt input{position:absolute;opacity:0;width:0;height:0}
.statustop{display:flex;align-items:center;gap:8px}
.statusnote{font-size:12px;color:var(--ink-muted);line-height:1.6}

/* ---------- หน้าดูวิดีโอ ---------- */
.vlayout{display:grid;gap:16px;align-items:start}
@media (min-width:1080px){.vlayout{grid-template-columns:minmax(0,1fr) 340px}}
.vlayout > *{min-width:0}

.vstage{border-radius:var(--radius);overflow:hidden;background:#000;box-shadow:var(--shadow)}
.vplayer,.vframe{display:block;width:100%;aspect-ratio:16/9;border:0;background:#000}
/* ข้อความสำรองตอนเบราว์เซอร์เล่นไม่ได้ อยู่บนพื้นดำ ต้องกำหนดสีเอง ไม่งั้นดำบนดำ */
.vplayer{color:#F3E4E6}
.vframe iframe{width:100%;height:100%;border:0;display:block}
.vmissing{display:grid;place-items:center;gap:10px;color:#E8B7B7;background:var(--surface-alt);
  align-content:center;font-size:15px}
.vmissing i{font-size:34px}

/* แถบสถานะการดู — เต็มแถบเมื่อดูจบแล้ว */
.vprogress{margin-top:12px}
.vpbar{height:6px;border-radius:var(--pill);background:var(--surface-alt);overflow:hidden}
.vpbar > i{display:block;height:100%;background:var(--accent);border-radius:var(--pill);
  transition:width .35s ease}
.vpmsg{margin:8px 0 0;font-size:13.5px;color:var(--ink-muted);display:flex;align-items:center;gap:7px}
.vpmsg.done{color:var(--success);font-weight:600}

.vdesc{font-size:15px;line-height:1.8;white-space:normal}

/* ---------- คอลัมน์ขวา ---------- */
.vbig{display:flex;align-items:baseline;gap:9px;margin-bottom:10px}
.vbig b{font-size:34px;line-height:1;letter-spacing:-.02em}
.vbig span{font-size:13.5px;color:var(--ink-muted)}

.vmeta{display:grid;grid-template-columns:auto 1fr;gap:8px 14px;margin-top:16px;font-size:14px}
.vmeta dt{color:var(--ink-muted);white-space:nowrap}
.vmeta dd{margin:0;min-width:0;overflow-wrap:anywhere}

.wrow{display:flex;align-items:center;gap:10px;padding:10px 16px;border-bottom:1px solid var(--line)}
.wrow:last-child{border-bottom:none}
.wname{display:flex;flex-direction:column;line-height:1.35;min-width:0}
.wname b{font-size:13.5px}
.wname span{font-size:12px;color:var(--ink-muted)}
.wtime{font-size:12px;color:var(--ink-muted);white-space:nowrap}

/* ---------- คอมเมนต์ ---------- */
.cavatar{width:36px;height:36px;border-radius:var(--pill);background:var(--blush);color:var(--ink);
  display:grid;place-items:center;font-weight:700;font-size:13px;flex:none}
.cavatar.sm{width:28px;height:28px;font-size:11px}

.cform{display:flex;gap:10px;align-items:flex-start;padding-bottom:16px;border-bottom:1px solid var(--line)}
.cform .grow{flex:1;min-width:0}
.cform textarea{resize:vertical;min-height:44px}
.creplyform{border-bottom:none;padding:12px 0 0;margin-left:0}
/* ⚠ ต้องมีบรรทัดนี้ ไม่งั้น display:flex ด้านบนชนะ [hidden] แล้วฟอร์มตอบกลับโผล่ค้างทุกอัน
   ตั้งแต่เปิดหน้า ทั้งที่ JS ตั้ง hidden ไว้ถูกแล้ว (กับดักเดียวกับ .setqueue[hidden]) */
.cform[hidden]{display:none}

.citem{display:flex;gap:10px;align-items:flex-start;padding:16px 0;border-bottom:1px solid var(--line)}
.citem:last-child{border-bottom:none}
.cbody{flex:1;min-width:0}
.chead{display:flex;gap:9px;align-items:baseline;flex-wrap:wrap;margin-bottom:3px;font-size:13.5px}
.chead b{font-size:14px}
.crole{font-size:11.5px;background:var(--surface-alt);border-radius:var(--pill);padding:1px 9px;color:var(--ink-muted)}
.ctime{font-size:12px;color:var(--ink-muted)}
.ctext{font-size:14.5px;line-height:1.75;overflow-wrap:anywhere}

.cacts{display:flex;gap:14px;align-items:center;margin-top:7px}
.cacts form{display:inline}
.clink{font-size:12.5px;font-weight:600;color:var(--ink-muted);display:inline-flex;align-items:center;gap:5px}
.clink:hover{color:var(--accent);text-decoration:underline}
.clink.danger:hover{color:var(--danger)}

.creply{padding:14px 0 0;border-bottom:none;margin-top:6px;
  border-left:2px solid var(--line);padding-left:14px}

/* ---------- ช่องรูปปกในฟอร์ม ---------- */
.posterrow{display:flex;gap:16px;align-items:flex-start;flex-wrap:wrap}
.posterbox{width:220px;aspect-ratio:16/9;flex:none;border-radius:var(--radius-sm);
  overflow:hidden;background:var(--surface-alt);border:1px solid var(--line);
  display:grid;place-items:center}
.posterbox img{width:100%;height:100%;object-fit:cover;display:block}
.posterbox .ph{font-size:30px;color:#B98A93}
.postertxt{flex:1;min-width:240px}

/* ---------- ฟอร์มอัปโหลด ---------- */
.row2{display:grid;gap:0 16px}
@media (min-width:620px){.row2{grid-template-columns:1fr 1fr}}
.row2 > *{min-width:0}

/* ปุ่มเลือกแหล่งวิดีโอ — ใช้ radio จริงเพื่อให้ใช้คีย์บอร์ดได้ */
.srcpick{margin-bottom:16px}
.srcpick label{display:inline-flex;align-items:center;gap:7px;padding:9px 16px;cursor:pointer;
  font-weight:600;font-size:14px}
.srcpick input{position:absolute;opacity:0;width:1px;height:1px}
.srcpick label.on{background:var(--blush);color:var(--ink)}
.srcpick label:has(input:focus-visible){outline:3px solid var(--accent);outline-offset:-3px}

.note-ok{background:var(--success-soft);border-radius:var(--radius-sm);padding:13px 16px;
  font-size:14px;line-height:1.7;margin-top:4px}
.note-ok > i{color:var(--success);margin-right:6px}

.checks-sm{list-style:none;display:flex;flex-direction:column;gap:9px;font-size:14px;line-height:1.65}
.checks-sm li{position:relative;padding-left:20px}
.checks-sm li::before{content:"";position:absolute;left:0;top:.6em;width:8px;height:8px;
  border-radius:2px;background:var(--blush)}

/* แถวที่กำลังเลือกอยู่ในหน้ารายงาน */
tr.rowon > td{background:var(--accent-soft)}

/* ---------- สถานะการอัปโหลดวิดีโอ ---------- */
.upstate[hidden]{display:none}

.uploading,.updone,.upfail{
  border-radius:var(--radius-sm);padding:16px 18px;
  display:flex;flex-direction:column;gap:12px;
}
.uploading{background:var(--accent-soft)}
.updone{background:var(--success-soft)}
.upfail{background:#F8DFDB}

.uphead{display:flex;align-items:flex-start;gap:12px}
.uphead > div{display:flex;flex-direction:column;gap:2px;min-width:0}
.uphead b{font-size:15px;line-height:1.4}
.upname{font-size:13px;color:var(--ink-muted);overflow-wrap:anywhere}

.upspin,.upok,.uperr{
  width:34px;height:34px;border-radius:var(--pill);display:grid;place-items:center;
  font-size:15px;flex:none;
}
.upspin{background:var(--accent);color:#fff;animation:upfloat 1.4s ease-in-out infinite}
.upok{background:var(--success);color:#fff;font-size:17px}
.uperr{background:var(--danger);color:#fff}
@keyframes upfloat{0%,100%{transform:translateY(2px)}50%{transform:translateY(-3px)}}
@media (prefers-reduced-motion:reduce){.upspin{animation:none}}

/* แถบบอกเปอร์เซ็นต์จริง ไม่ใช่วงกลมหมุน — ไฟล์ใหญ่ใช้เวลาเกิน 10 วินาที
   คนดูต้องประเมินได้ว่าควรนั่งรอหรือไปทำอย่างอื่นก่อน */
/* 20px หนา = "ข้อความขนาดใหญ่" ตามเกณฑ์คอนทราสต์ ใช้สี accent บนพื้น accent-soft ได้
   ⚠ ถ้าย่อให้เล็กกว่านี้ต้องเปลี่ยนสีด้วย ไม่งั้นคอนทราสต์ตก */
.uppct{font-size:20px;font-weight:700;color:var(--accent);flex:none;line-height:1.2}
.upbar{height:10px;border-radius:var(--pill);background:#fff;overflow:hidden;
  box-shadow:inset 0 0 0 1px var(--line)}
.upbar > i{display:block;height:100%;background:var(--accent);border-radius:var(--pill);
  transition:width .2s linear}
.upmeta{display:flex;gap:10px;font-size:12.5px;color:var(--ink-muted);
  font-variant-numeric:tabular-nums}
.uploading .btn{align-self:flex-start}

/* ---------- แถวปุ่มบันทึกใต้ช่องเลือกไฟล์ ---------- */
.formfoot{
  display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  padding:16px 20px;border-top:1px solid var(--line);background:var(--surface-alt);
}
.savehint{font-size:13px;color:var(--ink-muted);display:inline-flex;align-items:center;gap:6px}
.formfoot .btn-primary{min-width:170px}

/* (.layoutnote เดิมของแถบตัวกรองเลิกใช้ 28 ก.ย. 2569 — ทุกช่องค้นหาใช้ .faqfallback ผ่าน components/searchnote) */

/* ============================================================
   ลูกศรของ dropdown

   ⚠ ลูกศรที่เบราว์เซอร์วาดเองจะชิดขอบขวาเสมอ ซึ่งพอกรอบเป็นทรงแคปซูล (radius 999px)
     ลูกศรจะไปเบียดอยู่ตรงส่วนโค้ง ดูไม่ได้สัดส่วน — ต้องปิดของเบราว์เซอร์แล้ววาดเอง

   ⚠ วาดด้วย gradient ไม่ใช่รูป SVG เพราะ currentColor ทำให้สีลูกศรตามสีตัวอักษรของธีม
     ซึ่งผู้ใช้ตั้งเองได้ในหน้าตั้งค่า ถ้าฝังสีไว้ในรูป เปลี่ยนธีมแล้วลูกศรจะสีเพี้ยน
   ⚠ <select> ใส่ ::after ไม่ได้ จึงต้องวาดลงบนพื้นหลังของตัวมันเอง
   ============================================================ */
select.inp, select.sel{
  -webkit-appearance:none; -moz-appearance:none; appearance:none;
  background-image:
    linear-gradient(45deg,  transparent 50%, currentColor 50%),
    linear-gradient(135deg, currentColor 50%, transparent 50%);
  background-size:6px 6px, 6px 6px;
  background-repeat:no-repeat;
}
/* ระยะจากขอบ = รัศมีโค้งพอประมาณ ให้ลูกศรอยู่ในส่วนตรงของแคปซูล ไม่ใช่บนส่วนโค้ง */
select.inp{background-position:right 22px center, right 16px center;padding-right:46px}
select.sel{background-position:right 20px center, right 14px center;padding-right:42px}
/* IE/Edge เก่าเติมลูกศรของตัวเองซ้อนมาอีกอัน */
select.inp::-ms-expand, select.sel::-ms-expand{display:none}

/* ============================================================
   Combobox — <select> ที่พิมพ์ค้นหาได้ (assets/js/app.js ส่วนที่ 12)
   ⚠ .combo-native คือ <select> ตัวจริงที่ยังส่งค่าให้ฟอร์ม ห้าม display:none
     เพราะเบราว์เซอร์บางตัวไม่ยอม focus ช่องที่ display:none ตอน validation ล้มเหลว
   ============================================================ */
.combo{position:relative}
.combo-native{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none;left:12px;bottom:0}
.combo-input{cursor:text;padding-right:46px;
  background-image:
    linear-gradient(45deg,  transparent 50%, currentColor 50%),
    linear-gradient(135deg, currentColor 50%, transparent 50%);
  background-size:6px 6px, 6px 6px;
  background-position:right 22px center, right 16px center;
  background-repeat:no-repeat}
.combo.on .combo-input{border-color:var(--accent);box-shadow:0 0 0 4px var(--accent-soft)}

.combo-list{display:none;position:absolute;z-index:40;left:0;right:0;top:calc(100% + 6px);
  max-height:290px;overflow-y:auto;padding:6px;
  background:var(--surface);border:1.5px solid var(--line);border-radius:18px;box-shadow:var(--shadow-lg)}
.combo.on .combo-list{display:block}

.combo-group{position:sticky;top:-6px;padding:8px 12px 4px;background:var(--surface);
  font-size:11.5px;font-weight:700;letter-spacing:.03em;color:var(--ink-muted)}
.combo-opt{padding:9px 12px;border-radius:12px;font-size:15px;cursor:pointer;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* ⚠ .cur คือแถวที่ปุ่มลูกศรชี้อยู่ · .on คือค่าที่เลือกไว้แล้ว — คนละเรื่องกัน ห้ามยุบรวม */
.combo-opt.cur{background:var(--hover-bg);color:var(--hover-ink)}
.combo-opt.on{font-weight:700;color:var(--accent)}
.combo-opt.on.cur{color:var(--hover-ink)}
.combo-empty{padding:14px 12px;font-size:14px;color:var(--ink-muted);text-align:center}

/* แถบเลือกเขต — โผล่ใต้ชิปจังหวัดเมื่อจังหวัดนั้นมีเขต (ตอนนี้คือกรุงเทพฯ)
   ⚠ ความกว้างตายตัวไม่ได้ เพราะชื่อเขตยาวไม่เท่ากัน (สาทร กับ ป้อมปราบศัตรูพ่าย)
     ใช้ min-width แล้วให้ยืดตามเนื้อหาแทน */
.distpick{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:-4px 0 14px}
.distpick label{display:inline-flex;align-items:center;gap:7px;
  font-size:13.5px;font-weight:600;color:var(--ink-muted);white-space:nowrap}
.distpick .combo,.distpick > select{min-width:240px;max-width:340px}
.distpick .inp{padding-top:7px;padding-bottom:7px;font-size:14.5px;min-height:38px}
@media (max-width:600px){
  .distpick{gap:7px}
  .distpick .combo,.distpick > select{min-width:0;flex:1 1 100%;max-width:none}
}

/* ---------- ส่งออกรูปรวมสาขา (/branches/export · 26 ก.ย. 2569) ----------
   ซ้าย = ตั้งค่า + เลือกสาขา (เลื่อนตามได้) · ขวา = ตัวอย่างรูป (ติดจอขณะเลื่อนฝั่งซ้าย ให้เห็นผลทันทีที่เปลี่ยนค่า) */
.posterpage{display:grid;grid-template-columns:minmax(320px,400px) 1fr;gap:14px;align-items:start}
.posterprev{position:sticky;top:76px}
.posterprev .panel-head{flex-wrap:wrap}
.posterfit{margin:0;padding:7px 14px;font-size:13px;font-weight:600;background:#FBEFD5;color:#7A4E00;border-bottom:1px solid var(--line)}

/* ⚠ ห้ามทำ .posterstage เป็น flex — flex item ถูกยืด (align-items:stretch) ให้สูงเท่ากล่อง
     canvas จึงโดนบีบแนวตั้งจนตัวหนังสือแบน (บั๊กที่ลูกค้าเจอ 26 ก.ย. 2569) · ใช้ block + margin auto แทน
     และล็อก height:auto + aspect-ratio จากขนาดจริงของ canvas (JS ตั้ง --ar) ให้สัดส่วนถูกเสมอ */
.posterstage{background:var(--surface-alt);max-height:calc(100vh - 170px);overflow:auto;display:block}
.posterpages canvas + canvas{margin-top:22px}
.posterstage canvas{display:block;margin:0 auto;width:100%;max-width:760px;height:auto;aspect-ratio:var(--ar,auto);
  box-shadow:0 4px 18px rgba(0,0,0,.12);border-radius:6px;background:#fff}
.pfield{border:0;padding:0;margin:0 0 16px;display:flex;flex-direction:column;gap:8px;min-width:0}
.pfield legend{font-weight:700;font-size:13.5px;margin-bottom:6px}
.pfield > label{display:flex;flex-direction:column;gap:3px;font-size:12.5px;font-weight:600}
/* สามส่วนของการตั้งค่า — หัวข้อมีไอคอน คั่นด้วยเส้นประ ให้เห็นว่าแต่ละกลุ่มคุมส่วนไหนของรูป */
.psec{padding-bottom:14px;border-bottom:1px dashed var(--line)}
.psec:last-child{border-bottom:0;padding-bottom:0;margin-bottom:0}
.psec legend{display:inline-flex;align-items:center;gap:7px;font-size:14.5px}
.psec legend .fa-solid{color:var(--accent)}
.pwrap{flex-wrap:wrap}
.pchecks{display:flex;flex-direction:column;gap:6px}
/* ⚠ กับดักเดียวกับ .setqueue[hidden] — display:flex ชนะ [hidden] รายการหมวดในหน้าส่งออกไฟล์รวมเลยโผล่ทั้งที่เลือก "ทั้งหมด" (พบ 10 ต.ค. 2569) */
.pchecks[hidden]{display:none}
.psub{display:flex;flex-direction:column;gap:5px}
.psub[hidden]{display:none}   /* ⚠ display:flex ชนะ [hidden] — ลำดับในหมวดย่อยซ่อนตามวิธีเรียง (11 ต.ค. 2569) */
.psublbl{font-size:12.5px;font-weight:600}
.prange{gap:4px !important}
.prange > span{display:flex;justify-content:space-between;align-items:baseline}
.prange output{font-variant-numeric:tabular-nums;font-weight:700;color:var(--accent)}
.prange input[type="range"]{width:100%;accent-color:var(--accent)}
.pgrid2{display:grid;grid-template-columns:1fr 1fr;gap:8px}
/* สีของรูปรวมสาขา — ช่องสีเป็นวงกลมพร้อมป้าย · ชุดสีมีตัวอย่างสี่ช่อง (หัว/พื้น/ไอคอน/ชื่อ) */
.pcolors{display:grid;grid-template-columns:repeat(auto-fill,minmax(104px,1fr));gap:6px 8px}
.pcolor{display:flex;align-items:center;gap:7px;font-size:12.5px;font-weight:600;cursor:pointer;min-width:0}
.pcolor input[type="color"]{flex:none;width:30px;height:30px;padding:0;border:1.5px solid var(--line);border-radius:50%;background:none;cursor:pointer}
.pcolor input[type="color"]::-webkit-color-swatch-wrapper{padding:2px}
.pcolor input[type="color"]::-webkit-color-swatch{border:0;border-radius:50%}
.pcolor input[type="color"]::-moz-color-swatch{border:0;border-radius:50%}
.ppresets{display:flex;flex-wrap:wrap;gap:6px}
.ppreset{display:inline-flex;align-items:center;gap:7px;padding:5px 11px 5px 6px;border:1.5px solid var(--line);border-radius:var(--pill);
  background:var(--surface);font:inherit;font-size:12.5px;font-weight:600;cursor:pointer;color:var(--ink)}
.ppreset:hover{border-color:var(--ink)}
.ppreset .sw{width:24px;height:24px;border-radius:50%;flex:none;border:1px solid rgba(0,0,0,.12);
  background:conic-gradient(var(--a) 0 25%,var(--b) 0 50%,var(--c) 0 75%,var(--d) 0)}
.pcontrast{margin:2px 0 0;font-size:12px;font-weight:600;color:#7A4E00;background:#FBEFD5;border-radius:8px;padding:4px 8px}
.pgrid2 label{display:flex;flex-direction:column;gap:3px;font-size:12.5px;font-weight:600;min-width:0}
.pfield .inp,.pgrid2 .inp{font-size:14px;padding:7px 12px}
.pcheck{display:flex !important;flex-direction:row !important;align-items:center;gap:8px;font-size:14px !important;font-weight:500 !important;cursor:pointer}
.pcheck input{width:17px;height:17px;accent-color:var(--accent)}
.pcheck.is-fixed{color:var(--ink-muted);cursor:default}
.pmode{margin-bottom:8px}
.picklist{border:1px solid var(--line);border-radius:14px;max-height:420px;overflow:auto;margin-top:8px}
.pickbar{position:sticky;top:0;z-index:1;background:var(--surface);display:flex;gap:6px;flex-wrap:wrap;padding:8px;border-bottom:1px solid var(--line)}
.pickbar .inp{flex:1 1 160px;font-size:14px;padding:6px 12px;min-width:0}
.pickgroup{padding:6px 10px 8px;border-bottom:1px dashed var(--line)}
.pickgroup:last-child{border-bottom:0}
.pickhead,.pickitem{display:flex;align-items:center;gap:8px;padding:3px 2px;cursor:pointer;font-size:13.5px}
.pickhead{font-size:13px}
.pickitem{padding-left:22px}
.pickitem .badge{font-size:10.5px;padding:1px 7px}
.pickhead input,.pickitem input{width:16px;height:16px;accent-color:var(--accent);flex:none}
.pickitem:hover{background:var(--surface-alt);border-radius:8px}
@media (max-width:980px){
  .posterpage{grid-template-columns:1fr}
  .posterprev{position:static}
  .posterstage{max-height:none}
}


/* ---------- การ์ดโปรโมชั่น (26 ก.ย. 2569 ตามลูกค้า) ----------
   โซน: แคมเปญ·ประเภท → ชื่อ → กล่องวันที่ (เด่นสุด · สีตามสถานะ) → รายละเอียดย่อ ≤ 3 ข้อ → ชิป */
.pbody{gap:9px}
.peyes{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.pcamp{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:700;color:var(--accent);
  background:var(--accent-soft);border-radius:var(--pill);padding:3px 10px;text-decoration:none;max-width:100%;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pcamp:hover{background:var(--hover-bg);color:var(--hover-ink)}
.ptype{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:600;color:var(--ink-muted);
  border:1px solid var(--line);border-radius:var(--pill);padding:2px 10px;white-space:nowrap}
/* ชื่อในหน้ารายละเอียด: Sarabun ตัวหนาแบบเดียวกับตาราง/การ์ด (27 ก.ย. 2569) — ขนาดตาม .page-head h1 เดิม */
.page-head h1.ptitle-h{font-family:var(--font-body);font-weight:700;line-height:1.4}
/* ชื่อบนการ์ด: Sarabun ตัวหนาแบบเดียวกับตาราง (27 ก.ย. 2569 ตามลูกค้า) — ต้องระบุเอง เพราะ h4 ใช้ฟอนต์หัวข้อ */
.ptitle2{font-family:var(--font-body);font-weight:700;font-size:16px;line-height:1.45;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.ptitle2 a{color:var(--ink);text-decoration:none}
.ptitle2 a:hover{text-decoration:underline}
/* กล่องวันที่ — เส้นซ้ายและพื้นบอกสถานะ: ใช้อยู่ = เขียว · ใกล้หมด/ยังไม่เริ่ม = เหลือง · หมดอายุ = เทาแดง */
.pwhen{border-radius:12px;padding:8px 11px;background:var(--surface-alt);border-left:4px solid var(--line)}
.pwhen.t-on{background:var(--success-soft);border-left-color:var(--success)}
.pwhen.t-soon{background:#FBF3E1;border-left-color:#C98B12}
.pwhen.t-exp{background:#F4F1F1;border-left-color:#B9A9A9}
.pwhen-date{display:block;font-size:16.5px;font-weight:800;line-height:1.35;font-variant-numeric:tabular-nums;color:var(--ink);letter-spacing:-.01em}
.pwhen-date .fa-solid{color:var(--ink-muted);font-size:.85em;margin-right:3px}
.pwhen-date.raw{font-size:14px;font-weight:700}
.pwhen.t-exp .pwhen-date{color:var(--ink-muted)}
.pwhen-sub{display:flex;flex-wrap:wrap;align-items:center;gap:4px 10px;margin-top:5px;font-size:12px;color:var(--ink-muted)}
.pwhen-sub .n{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}
.pbrief{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:3px;font-size:13.5px;line-height:1.5;color:var(--ink)}
.pbrief li{position:relative;padding-left:14px}
.pbrief li::before{content:"";position:absolute;left:3px;top:.62em;width:5px;height:5px;border-radius:50%;background:var(--accent)}
.pbrief li.more{padding-left:0;font-size:12.5px}
.pbrief li.more::before{display:none}
.pbrief li.more a{color:var(--accent);font-weight:600}
.pchips{display:flex;gap:6px;flex-wrap:wrap}
/* ชิปท้ายการ์ด: หน้าตาเดิม แค่ข้อความยาว (ค่าจากชีต) ตัด … ไม่ล้นขอบการ์ด (27 ก.ย. 2569)
   · margin-top เว้นจาก "+ อีก N ข้อ" ที่มีขีดเส้นใต้ ไม่ให้ดูซ้อนกัน */
.pbody .pchips{margin-top:4px;min-width:0}
.pbody .pchips>*{max-width:100%;min-width:0}
.pbody .pchips .paychip .t{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pbody .pchips .paychip .fa-solid{flex:none}
.pview{flex:1;min-width:0;white-space:nowrap}


/* ---------- แดชบอร์ดแบบวิดเจ็ต (27 ก.ย. 2569 · ปรับหน้าตารอบ 2) ----------
   กล่อง = .panel แบบเดียวกับทั้งระบบ (หัวชมพู · เนื้อหาขาว) · ข้างในเป็นแถว (.drow) หรือการ์ดสินค้า (.dprod)
   แถว: ส่วนนำ (รูปย่อ/ไอคอน) · ชื่อ + ข้อมูลรอง · ปุ่มคัดลอกชิดขวา — ปุ่มขนาดเท่ากันทุกกล่อง */
.dashtools{display:flex;justify-content:flex-end;margin:-6px 0 10px}
.dwidget{margin-bottom:18px}
.dwidget .panel-head h3{font-size:16px}
.dmore{font-size:13px;font-weight:700;color:var(--accent);text-decoration:none;display:inline-flex;align-items:center;gap:5px;white-space:nowrap}
.dmore:hover{text-decoration:underline}
.dempty{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:18px 16px;color:var(--ink-muted);font-size:14px;margin:0}
.dempty[hidden]{display:none}   /* ⚠ display:flex ชนะ [hidden] — ข้อความ "ยังไม่มีกล่อง" ในหน้าจัดแดชบอร์ดค้างขึ้นทั้งที่มีกล่อง (แก้ 11 ต.ค. 2569) */
/* แถว */
.drows{display:grid;grid-template-columns:minmax(0,1fr)}
.drows.cols2{grid-template-columns:repeat(2,minmax(0,1fr))}
.drow{display:flex;align-items:center;gap:12px;padding:11px 14px;border-top:1px solid var(--line);min-width:0;color:var(--ink);text-decoration:none}
.drows > .drow:first-child,.drows.cols2 > .drow:nth-child(2){border-top:0}
.drows.cols2 > .drow:nth-child(odd){border-right:1px solid var(--line)}
.drow:hover{background:#FFFAFB}
.drow-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
.drow-title{font-weight:700;font-size:14.5px;line-height:1.4;color:var(--ink);text-decoration:none;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
a.drow-title:hover{text-decoration:underline}
/* ชื่อโปรโมชั่นบนแดชบอร์ด: Sarabun ตัวหนา 15px แบบเดียวกับตาราง/การ์ด/หน้ารายละเอียด (27 ก.ย. 2569) — ระบุเอง ไม่พึ่งการสืบทอด */
.drow.dp .drow-title{font-family:var(--font-body);font-weight:700;font-size:15px;line-height:1.45}
.drow-sub{display:flex;flex-wrap:wrap;align-items:center;gap:3px 12px;font-size:12.5px;color:var(--ink-muted);min-width:0}
.drow-sub .fa-solid{font-size:11px;margin-right:2px}
.drow-sub .dclip{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}
.drow-acts{display:flex;gap:6px;flex:none}
.drow-acts .copyicon{width:34px;height:34px}
.dlead{flex:none;width:38px;height:38px;border-radius:12px;display:grid;place-items:center;background:var(--surface-alt);color:var(--ink-muted);text-decoration:none}
.dlead.pin{background:var(--accent-soft);color:var(--accent)}
a.dlead.map{background:#E3F0EC;color:#1F6F52}
a.dlead.map:hover{background:#1F6F52;color:#fff}
.dprov{font-weight:700;color:var(--ink)}
/* โปรโมชั่น — รูปย่อ 76px เห็นครบทั้งใบ (contain บนพื้นอ่อน) */
.dthumb{flex:none;width:76px;height:76px;border-radius:12px;overflow:hidden;background:var(--surface-alt);border:1px solid var(--line);
  display:grid;place-items:center;color:var(--accent);font-size:22px;text-decoration:none}
.dthumb img{width:100%;height:100%;object-fit:contain;display:block;background:#fff}
.dmeta{display:flex;flex-wrap:wrap;gap:5px}
.dmeta .pcamp{font-size:11.5px;padding:1px 8px}
.dtype{display:inline-flex;align-items:center;gap:4px;font-size:11.5px;font-weight:600;color:var(--ink-muted);white-space:nowrap}
.ddate{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px;font-size:13px;color:var(--ink-muted)}
.ddate b{color:var(--ink);font-variant-numeric:tabular-nums}
.ddate .badge{font-size:11px;padding:1px 8px}
/* สินค้า — การ์ดมีกรอบ (รอบ 2 · 27 ก.ย. 2569): รูป + ป้ายหมวด → รหัส → ชื่อไทย → ชื่ออังกฤษ → ปุ่มคัดลอกการ์ด
   ⚠ ชื่อไทยไม่เกิน 2 บรรทัด · อังกฤษ 1 บรรทัด · ส่วนเนื้อหา flex:1 ดันปุ่มคัดลอกลงล่าง — ปุ่มตรงแนวกันทุกใบในแถว
     (ไม่จองความสูง 2 บรรทัดให้ชื่อ — ชื่อบรรทัดเดียวจะมีช่องว่างคั่นชื่ออังกฤษ) */
.dprods{display:grid;grid-template-columns:repeat(auto-fill,minmax(186px,1fr));gap:14px;padding:14px}
.dprod{display:flex;flex-direction:column;gap:8px;min-width:0;padding:8px 8px 10px;background:var(--surface);
  border:1.5px solid var(--line);border-radius:18px;box-shadow:var(--shadow);transition:transform .18s ease,border-color .18s ease,box-shadow .18s ease}
.dprod:hover{transform:translateY(-2px);border-color:var(--blush-deep);box-shadow:var(--shadow-lg)}
.dprod-img{position:relative;display:block;aspect-ratio:1;border-radius:13px;overflow:hidden;background:var(--surface-alt)}
.dprod-img img{width:100%;height:100%;object-fit:cover;display:block}
.dprod-img .ph{position:absolute;inset:0;display:grid;place-items:center;color:var(--accent);font-size:30px}
.dprod-cat{position:absolute;left:7px;top:7px;display:inline-flex;align-items:center;gap:5px;max-width:calc(100% - 14px);
  background:rgba(255,255,255,.92);color:var(--ink);font-size:11.5px;font-weight:700;border-radius:var(--pill);padding:3px 9px;
  box-shadow:0 1px 4px rgba(0,0,0,.12);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dprod-cat .fa-solid{color:var(--accent)}
.dprod-body{display:flex;flex-direction:column;gap:2px;padding:0 4px;min-width:0;flex:1}
.dprod-code{align-self:flex-start;font-size:11.5px;font-weight:700;color:var(--accent);background:var(--accent-soft);border-radius:7px;padding:1px 7px;margin-bottom:3px}
.dprod-name{font-weight:700;font-size:14.5px;line-height:1.35;color:var(--ink);text-decoration:none;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.dprod-name:hover{text-decoration:underline}
.dprod-en{font-size:12.5px;color:var(--ink-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dprod-copy.copychip{min-height:36px;padding:6px 12px;font-size:12.5px;justify-content:center;background:var(--surface-alt);border-color:var(--line)}
.dprod-copy.copychip:hover{background:var(--hover-bg);color:var(--hover-ink);border-color:var(--hover-bg)}
/* ⚠ ต้องเขียนสถานะ "คัดลอกแล้ว" ซ้ำ — กฎข้างบนเฉพาะเจาะจงเท่า .copychip.done และมาทีหลัง จะทับสีตอนคัดลอกเสร็จ */
.dprod-copy.copychip.done,.dprod-copy.copychip.done:hover{background:var(--blush);border-color:var(--blush-deep);color:var(--ink)}
.dcell.w-half .dprods{grid-template-columns:repeat(auto-fill,minmax(160px,1fr))}
@media (prefers-reduced-motion:reduce){.dprod{transition:none}.dprod:hover{transform:none}}
/* หน้าจัดแดชบอร์ด */
.dlaylist{display:flex;flex-direction:column}
.dlay-head{flex-wrap:wrap}
.dlay-head > .fa-solid{color:var(--accent)}
.dlay-type{font-size:12px;font-weight:700;color:var(--ink-muted);background:var(--surface);border:1px solid var(--line);border-radius:var(--pill);padding:2px 9px;white-space:nowrap}
.dlay-title{flex:1 1 220px;min-width:0;font-size:15px;font-weight:700;padding:6px 12px}
.dlay-on{display:inline-flex;align-items:center;gap:6px;font-size:13px;font-weight:700;cursor:pointer;white-space:nowrap}
.dlay-on input{width:17px;height:17px;accent-color:var(--accent)}
.dlay-btns{display:inline-flex;gap:6px}
.dlay-btns .copyicon:disabled{opacity:.35;cursor:default}
.dlay.is-off{opacity:.62}
.dlay.is-off .panel-head{background:#F2F0F0}
.dlay-body{display:flex;flex-direction:column;gap:12px}
.dgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:10px}
.dfield{display:flex;flex-direction:column;gap:4px;font-size:12.5px;font-weight:600;min-width:0}
.dfield .inp{font-size:14px;padding:7px 12px}
.dpick{border:1px solid var(--line);border-radius:14px;overflow:hidden}
.dpick > .inp{border:0;border-bottom:1px solid var(--line);border-radius:0;font-size:14px}
.dpick-list{max-height:260px;overflow:auto;padding:6px 8px}
.dpick-list .pickitem{padding-left:4px;gap:8px}
.dpick-list .pickitem span:not(.badge){flex:1;min-width:0}

/* ตาราง 2 คอลัมน์ของแดชบอร์ด (27 ก.ย. 2569) — กล่องเต็มจอกินสองคอลัมน์ · ครึ่งจอวางคู่ซ้าย–ขวา · จอแคบเต็มจอทุกกล่อง
   ⚠ align-items:stretch ให้กล่องคู่ซ้าย–ขวาสูงเท่ากัน (ขอบล่างตรงกัน ดูเป็นแดชบอร์ด ไม่ใช่รายการต่อกันเฉยๆ) */
.dashgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 18px;align-items:stretch}
.dcell{grid-column:1 / -1;min-width:0;display:flex;flex-direction:column}
.dcell > .dwidget{flex:1}
.dcell.w-half{grid-column:auto}
@media (max-width:900px){.dcell.w-half{grid-column:1 / -1}}
@media (max-width:900px){.drows.cols2{grid-template-columns:minmax(0,1fr)}
  .drows.cols2 > .drow:nth-child(odd){border-right:0}
  .drows.cols2 > .drow:nth-child(2){border-top:1px solid var(--line)}}
/* กล่องกลุ่มเมนู */
.dgroup .dlead.qicon{background:var(--tone-bg);color:var(--tone-ink)}
.dgroup a.drow:hover .qicon{background:var(--tone-ink);color:#fff}
.dcount{font-size:12px;font-weight:700;color:var(--ink);background:var(--surface-alt);border-radius:var(--pill);padding:2px 9px;white-space:nowrap;font-variant-numeric:tabular-nums}
.dcount.zero{color:var(--ink-muted);font-weight:600}
.dgroup .dgo{color:var(--ink-muted);font-size:12px}
.dgroup b.drow-title{display:block}
.dgroup span.drow-sub{display:block}
/* หน้าจัดแดชบอร์ด: ตัวเลือกขนาด + ผังย่อ */
.dlay-width{display:inline-flex}
.dlay-width label span{padding:4px 11px;min-height:30px;font-size:12.5px}
.dmap{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;padding:10px;border:1.5px dashed var(--line);border-radius:var(--radius-sm);
  background:var(--surface);margin-bottom:12px}
.dmap .search{grid-column:1 / -1;font-size:12px;color:var(--ink-muted);border-radius:10px;padding:6px 10px;background:var(--surface-alt);
  display:flex;align-items:center;gap:6px}
.dmap .blk{grid-column:1 / -1;display:flex;align-items:center;gap:6px;min-width:0;padding:8px 10px;border-radius:10px;
  background:var(--accent-soft);color:var(--ink);font-size:12.5px;font-weight:700;cursor:pointer;border:1.5px solid transparent}
.dmap .blk.half{grid-column:auto}
.dmap .blk.off{background:#F2F0F0;color:var(--ink-muted);text-decoration:line-through;font-weight:600}
.dmap .blk:hover{border-color:var(--accent)}
.dmap .blk span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dmap .blk small{margin-left:auto;font-weight:600;color:var(--ink-muted);white-space:nowrap}

/* คลังโปรโมชั่น (27 ก.ย. 2569) — ใช้แถวแบบแดชบอร์ด (.drow) · ปุ่มมีข้อความ เพราะสองปุ่มนี้ผลต่างกันมาก (กู้คืน vs ลบถาวร) */
.archacts{align-items:center}
.archacts form{display:contents}
.archacts .btn{white-space:nowrap}
.archacts .archdel{color:var(--danger);border-color:#E7B9B3}
.archacts .archdel:hover{background:var(--danger);color:#fff;border-color:var(--danger)}
@media (max-width:640px){.archacts{flex-direction:column;align-items:stretch}}


/* ---------- ตารางสายส่ง /delivery-routes (27 ก.ย. 2569) ----------
   ⚠ คลาสในส่วนนี้ต้องขึ้นต้นด้วย dl/dlv หรืออยู่ใต้ .dlvgrid เท่านั้น — เคยใช้ .dcell ซ้ำกับช่องกล่องของแดชบอร์ด และ .dlvedit ซ้ำกับฟอร์มแก้สาขา
     กฎ width:178px ทับ แดชบอร์ดบีบเหลือคอลัมน์แคบบน staging (27 ก.ย. 2569)
   แถวละหนึ่งสาย สีพื้นแยกสาย (--dl-bg พื้น · --dl-bar แถบซ้าย มาจาก Delivery::COLORS ต่อแถว)
   หน้าดู: เลื่อนแนวนอนได้ ช่องสายติดซ้าย · หน้าแก้: ไม่เลื่อน ช่องจุดส่งขึ้นบรรทัดใหม่ (combobox ไม่ถูกตัด) */
.dlvbar-row{display:flex;flex-wrap:wrap;align-items:center;gap:8px 10px}
.dlvver .sel{min-width:260px;max-width:100%}
.dlvfind{display:flex;align-items:center;gap:8px;min-width:0;flex:0 1 260px;color:var(--ink-muted)}
.dlvfind .inp{min-width:0}
.dlvscroll{overflow-x:auto;border:1.5px solid var(--line);border-radius:var(--radius);background:var(--surface);box-shadow:var(--shadow)}
.dlvgrid{border-collapse:separate;border-spacing:0;width:100%;font-size:13px}
.dlvgrid thead th{position:static;background:var(--surface-alt);font-size:12px;color:var(--ink-muted);
  white-space:nowrap;padding:8px 10px;text-align:center}
.dlvgrid thead th.dh-route{text-align:left}
.dlvgrid tbody tr{background:var(--dl-bg,var(--surface))}
.dlvgrid tbody th,.dlvgrid tbody td{border-top:1px solid rgba(0,0,0,.07);vertical-align:top}
.dlvgrid .dh-route{position:sticky;left:0;z-index:2;background:var(--dl-bg,var(--surface-alt));min-width:150px;
  padding:9px 12px 9px 14px;box-shadow:inset 5px 0 0 var(--dl-bar,var(--line)),1px 0 0 rgba(0,0,0,.08);text-align:left}
.dlvgrid thead .dh-route{background:var(--surface-alt);box-shadow:1px 0 0 rgba(0,0,0,.08);z-index:3}
.dlvgrid .dh-route b{display:block;font-size:15px;font-weight:800;color:var(--ink)}
.dlvgrid .dh-route .dep,.dlvgrid .dh-route .who{display:flex;align-items:center;gap:5px;font-size:12px;font-weight:600;color:var(--ink);white-space:nowrap}
.dlvgrid .dh-route .who{font-weight:500;color:var(--ink-muted)}
.dlvgrid .dh-route .fa-solid{width:13px;text-align:center;color:var(--dl-bar,var(--ink-muted))}
.dstop{min-width:140px;width:160px;max-width:180px;padding:8px 10px;text-align:center;white-space:normal;border-left:1px dashed rgba(0,0,0,.09)}
/* เวลากับชื่อสาขาต้องแยกกันชัด (27 ก.ย. 2569 ตามลูกค้า — เดิมหนาพอกันจนกลืน กวาดตาหาเวลาไม่ได้)
   เวลา = ตัวหนาเข้ม ไม่มีพื้นหลัง (ลูกค้าลองแบบป้ายพื้นขาวแล้วไม่ชอบ) · เส้นประบางคั่น · ชื่อสาขา = ตัวปกติ สีรอง */
.dstop .t{display:block;padding-bottom:4px;border-bottom:1px dashed rgba(0,0,0,.28);
  font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:15px;font-weight:800;line-height:1.4;color:#111}
.dstop .b{display:block;margin-top:5px;font-size:12px;line-height:1.35;color:#3d3a3b;text-decoration:none;font-weight:500}
.dstop .b:hover{color:var(--accent);text-decoration:underline}
.dstop .n{display:block;margin-top:3px;font-size:11px;color:var(--ink-muted)}
.dstop.is-off .b{color:var(--ink-muted);text-decoration:line-through}
.dstop.empty{background:transparent}
/* หาสาขา: ช่องที่ตรงเด่นขึ้น ช่องอื่นจางลง */
.dlvgrid.is-finding .dstop:not(.is-hit){opacity:.35}
.dstop.is-hit{box-shadow:inset 0 0 0 2.5px var(--accent);background:var(--surface)}
.dlvfoot{display:flex;align-items:center;gap:10px;flex-wrap:wrap;justify-content:space-between;margin-top:10px}

/* หน้าแก้ */
.dlvmeta{display:flex;flex-wrap:wrap;gap:12px}
.dlvmeta .field{margin:0}
.dlvgridwrap{border:1.5px solid var(--line);border-radius:var(--radius);background:var(--surface);box-shadow:var(--shadow)}
.dlvgridwrap .dlvgrid tbody tr:first-child th,.dlvgridwrap .dlvgrid tbody tr:first-child td{border-top:0}
.dlvgrid.is-edit .dh-route{position:static;width:190px;min-width:190px}
/* ⚠ th ต้องเป็น table-cell (flex ทำให้ตารางพัง) — เว้นระยะด้วย margin แทน gap */
.dh-edit > *{margin-bottom:6px}
.dh-edit > :last-child{margin-bottom:0}
.dlvgrid.is-edit th.dh-edit{white-space:normal;vertical-align:top}
.dh-edit > .inp,.dh-edit > .sel{display:block;width:100%;padding:6px 10px;font-size:13px}
.dh-edit .dr-top .inp,.dh-edit .dr-dep .inp{padding:6px 10px;font-size:13px}
.dr-top{display:flex;align-items:center;gap:6px}
.dr-pre{font-weight:800;font-size:15px}
.dr-top .dcode{width:64px;flex:none;font-weight:800;font-size:15px;text-transform:uppercase}
.dr-dep{display:flex;align-items:center;gap:6px;font-size:12.5px;font-weight:600;white-space:nowrap}
.dr-dep .dtime{flex:1}
.dstops{padding:8px}
.dstop-list{display:flex;flex-wrap:wrap;gap:8px;align-items:stretch}
.dlcell{width:178px;display:flex;flex-direction:column;gap:5px;padding:7px;border-radius:12px;
  background:var(--surface);border:1.5px solid rgba(0,0,0,.1)}
.dlcell.is-bad{border-color:var(--danger);box-shadow:0 0 0 3px rgba(200,72,60,.15)}
.dlcell .inp,.dlcell .sel{padding:5px 9px;font-size:13px}
.dlcell .combo-input{padding-right:34px;background-position:right 16px center,right 10px center}
.dlcell .combo-list{min-width:240px}
.dlcell-top{display:flex;align-items:center;gap:5px}
.dlcell-top .dtime{flex:1;min-width:0}
.dnum{flex:none;min-width:20px;height:20px;border-radius:999px;background:var(--dl-bar,var(--ink-muted));color:#fff;
  font-size:11px;font-weight:800;display:grid;place-items:center}
.dnote{font-size:12px}
.dx{flex:none;width:28px;height:28px;border-radius:999px;border:1px solid var(--line);background:var(--surface);
  color:var(--ink-muted);cursor:pointer;display:grid;place-items:center}
.dx:hover{color:var(--danger);border-color:var(--danger)}
.dadd{width:120px;min-height:96px;border-radius:12px;border:1.5px dashed rgba(0,0,0,.22);background:transparent;
  color:var(--ink);font-weight:700;cursor:pointer}
.dadd:hover{background:var(--surface);border-color:var(--accent);color:var(--accent)}
@media (max-width:760px){
  .dlvgrid.is-edit,.dlvgrid.is-edit tbody,.dlvgrid.is-edit tr,.dlvgrid.is-edit th.dh-edit,.dlvgrid.is-edit td{display:block;width:auto}
  .dlvgrid.is-edit .dh-route{width:auto;min-width:0}
  .dlcell{width:100%}
  .dadd{width:100%;min-height:44px}
}

/* พิมพ์ / PDF — ตารางทั้งฉบับพอดีหน้า A4 แนวนอน (หน้าจอใช้กล่องเลื่อน ตอนพิมพ์ต้องกางออกทั้งหมด) */
.dlvprint-title{display:none}
@media print{
  .dlvbar,.dlvfoot,[data-dlv-none],.alert{display:none!important}
  body:has(.dlvprint-title) .page-head{display:none!important}   /* หัวกระดาษของหน้านี้คือ .dlvprint-title แล้ว */
  .dlvprint-title{display:flex;flex-wrap:wrap;align-items:baseline;gap:2px 12px;margin:0 0 6px}
  .dlvprint-title b{font-size:13px;font-weight:800}
  .dlvprint-at{margin-left:auto;font-size:10px;font-weight:600}
  .dlvprint-note{flex-basis:100%;font-size:9px;color:#555}
  /* ⚠ คอลัมน์จุดส่งกว้างเท่ากันทุกช่อง (table-layout:fixed — ความกว้างมาจากแถวหัว: ช่องสาย 11% ที่เหลือแบ่งเท่ากัน)
       ชื่อสาขายาวตัดขึ้นบรรทัดใหม่ในช่อง · เส้นกรอบทุกช่องชัด รวมขอบขวาสุด (เดิมตารางกว้างเกินหน้า ขอบขวาถูกตัดหาย) — 27 ก.ย. 2569 ตามลูกค้า */
  /* padding ขวา/ล่าง 1pt — เส้นกรอบนอกแบบ collapse ครึ่งหนึ่งอยู่นอกตาราง ถ้าชิดขอบหน้าพอดีจะถูกตัดหาย */
  .dlvscroll{overflow:visible;border:0;box-shadow:none;border-radius:0;background:transparent;padding:0 1.5pt 1.5pt 0}
  .dlvgrid{width:100%;table-layout:fixed;border-collapse:collapse;border:1pt solid #555;font-size:8px}
  .dlvgrid,.dlvgrid *{-webkit-print-color-adjust:exact;print-color-adjust:exact}
  .dlvgrid th,.dlvgrid td{border:.75pt solid #777!important}
  .dlvgrid thead th{padding:3px;font-size:8px;color:#333}
  .dlvgrid thead .dh-route{width:11%}
  .dlvgrid .dh-route{position:static;min-width:0;width:auto;padding:3px 4px 3px 6px;box-shadow:none;
    border-left:3pt solid var(--dl-bar,#777)!important;white-space:normal}
  .dlvgrid .dh-route b{font-size:10px}
  .dlvgrid .dh-route .dep,.dlvgrid .dh-route .who{font-size:7.5px;white-space:normal}
  .dstop{min-width:0;width:auto;max-width:none;padding:3px 3px;overflow-wrap:anywhere;word-break:normal}
  .dstop .t{font-size:10px;padding-bottom:2px;border-bottom:.5pt dashed #888}
  .dstop .b{font-size:7.5px;line-height:1.3;margin-top:3px;text-decoration:none;color:#333}
  .dstop .n{font-size:7px}
  .dlvgrid tbody tr{break-inside:avoid}
}

/* สายส่งในกล่องเวลาของหน้าสาขา — ข้อมูลภายใน ป้ายกุญแจ (ไม่อยู่ในข้อความคัดลอก) */
.brhours .hr.dl dt .fa-solid{color:var(--ink-muted)}
.brhours .dlroute{display:inline-flex;align-items:center;gap:4px;font-weight:700;color:var(--ink);text-decoration:none}
.brhours .dlroute:hover{color:var(--accent);text-decoration:underline}
.brhours .dlin{display:inline-flex;align-items:center;gap:3px;font-size:10.5px;font-weight:700;color:var(--ink-muted);
  border:1px solid var(--line);border-radius:999px;padding:0 6px;margin-left:4px}
/* เดือนนี้ + เดือนหน้า (11 ต.ค. 2569) — เดือนละบรรทัด ป้ายเดือนกว้างเท่ากันให้สายตรงกัน */
.brhours .dlmonths{display:grid;grid-template-columns:auto 1fr;gap:4px 6px;align-items:baseline}
.brhours .dlmonth{display:contents}
.brhours .dlrts{display:flex;flex-direction:column;gap:1px;min-width:0}
.brhours .dlmon{justify-self:start;white-space:nowrap;text-align:center;font-size:11px;font-weight:700;border-radius:6px;padding:1px 6px;
  background:var(--accent-soft);color:var(--accent)}
.brhours .dlmonth.is-next .dlmon{background:var(--surface-alt);color:var(--ink-muted);border:1px dashed var(--line)}
.brhours .dlmonth.is-next .dlrts{color:var(--ink-muted)}
.brhours .dlmonth.is-next .dlroute{color:var(--ink-muted)}


/* ---------- รูปไส้สินค้า (28 ก.ย. 2569) — คลาสขึ้นต้น fill* ทั้งหมด (ตรวจแล้วไม่ชนของเดิม) ---------- */
.fillbox{display:flex;gap:16px;align-items:flex-start;flex-wrap:wrap;padding:12px;border:1.5px dashed var(--line);border-radius:16px;background:var(--surface-alt);margin-top:14px}
.fillshot{width:150px;flex:none;aspect-ratio:2481/3509;border-radius:10px;overflow:hidden;background:var(--surface);border:1px solid var(--line);display:grid;place-items:center}
.fillshot img{width:100%;height:100%;object-fit:cover;display:block}
.fillnone{font-size:12px;color:var(--ink-muted);text-align:center;line-height:1.6}
.fillnone .fa-solid{font-size:24px;opacity:.5}
.fillinfo{flex:1;min-width:240px}
.fillinfo h4{display:flex;align-items:center;gap:6px;font-size:15px}
.fillacts{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.fillacts form{margin:0}
/* หน้าเลือกจากโฟลเดอร์ */
.fillgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px}
.fillpick{margin:0;display:flex;flex-direction:column;gap:4px;min-width:0}
.fillpick button{position:relative;padding:0;border:2px solid var(--line);border-radius:12px;overflow:hidden;background:var(--surface);cursor:pointer;aspect-ratio:2481/3509}
.fillpick button:hover:not(:disabled){border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.fillpick button:disabled{cursor:default}
.fillpick img{width:100%;height:100%;object-fit:cover;display:block}
.fillpick.is-cur button{border-color:var(--success)}
.fillpick.is-hint button{border-color:var(--accent)}
.fillbadge{position:absolute;left:6px;top:6px}
.fillfile{font-size:11px;color:var(--ink-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* หน้ารวม */
.fillcols{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;align-items:start}
@media (max-width:900px){.fillcols{grid-template-columns:minmax(0,1fr)}}
.fillrow{display:flex;gap:8px;align-items:center}
.fillrow .inp{flex:1;min-width:0}
.fillrule ol{margin:0;padding-left:20px;display:flex;flex-direction:column;gap:7px;font-size:13.5px;line-height:1.55}
.fillsum{display:flex;flex-wrap:wrap;gap:6px}
.filltable{width:100%;margin-top:10px;font-size:13px}
.filltable td,.filltable th{padding:6px 8px}
.fillstat{display:grid;grid-template-columns:repeat(auto-fill,minmax(118px,1fr));gap:10px}
.fillstat-i{display:flex;flex-direction:column;gap:3px;text-decoration:none;color:var(--ink);font-size:12px;min-width:0}
.fillstat-i .th{aspect-ratio:2481/3509;border-radius:10px;overflow:hidden;border:1.5px solid var(--line);background:var(--surface-alt);display:grid;place-items:center;color:var(--ink-muted)}
.fillstat-i .th img{width:100%;height:100%;object-fit:cover}
.fillstat-i.is-none .th{border-style:dashed}
.fillstat-i:hover .th{border-color:var(--accent)}
.fillstat-i .nm{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink-muted)}
/* หน้ารายละเอียดสินค้า */
.fillview{display:block;max-width:440px;margin:0 auto;border-radius:12px;overflow:hidden;border:1px solid var(--line)}
.fillview img{width:100%;display:block}

/* ไฟล์รวมสินค้า — ปุ่มสลับชนิดไฟล์ในหัวหน้า (ลิงก์ ไม่ใช่ radio) · หน้าตาเดียวกับ .fb-seg (28 ก.ย. 2569) */
.mpkind{display:inline-flex;align-items:center;gap:6px;min-height:34px;padding:5px 13px;border:1.5px solid #CFC2C2;border-radius:999px;
  background:var(--surface);color:var(--ink);font-size:13.5px;font-weight:600;text-decoration:none}
.mpkind:hover{border-color:var(--ink)}
.mpkind.on{background:var(--blush);border-color:var(--blush-deep);font-weight:700}

/* หมวดย่อยของสินค้า /categories/{id}/subcategories (8 ต.ค. 2569) */
.subno{display:inline-grid;place-items:center;width:28px;height:28px;border-radius:50%;background:var(--blush);font-weight:800;font-variant-numeric:tabular-nums}
.subrename{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.subrename .inp{flex:1;min-width:160px;max-width:360px}
.subacts{display:flex;gap:6px;justify-content:flex-end}
.subacts form{margin:0}
.suborder{display:grid;gap:12px}
.suborder-g{display:grid;gap:6px}
.suborder-i{display:flex;flex-wrap:wrap;gap:6px}
.suborder .chip{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-variant-numeric:tabular-nums}
.suborder .chip.is-off{opacity:.4;text-decoration:line-through}
.catsub{display:inline-flex;gap:5px;align-items:baseline;margin-top:4px;font-size:12.5px;font-weight:600}

/* รูปฟอนต์ (10 ต.ค. 2569) — ใช้กล่องเดียวกับรูปการเก็บรักษา (.keepbox) แต่รูปเป็นจัตุรัส · หน้ารายละเอียดใช้ carousel เดิม */
.fontbox{margin:16px 0 14px}
.fontbox .keepimg img{aspect-ratio:1/1;object-fit:contain;background:#fff}
.fontbox .keepimg form{margin:0}
.thumbstrip .thumbtag.is-font{background:var(--accent);color:#fff}
.fillstat.is-square .fillstat-i .th{aspect-ratio:1/1}
/* การ์ดรายการ/นำเสนอที่มีรูปเดียวเป็นรูปฟอนต์/ไส้ (10 ต.ค. 2569) — .media.is-contain ด้านบนไม่ครอบ .cmedia */
.cmedia.is-contain{background:linear-gradient(180deg,var(--surface-alt),var(--accent-soft))}
.cmedia.is-contain img{object-fit:contain}

/* รอเปิดขาย (10 ต.ค. 2569) — สินค้าที่เพิ่มไว้ล่วงหน้า วันที่วางขายยังไม่ถึง · สีฟ้าชุดเดียวกับ .sellchip.is-upcoming
   ป้ายบนรูปอยู่มุมซ้ายล่าง (มุมซ้ายบนเป็นป้ายฟอนต์/ไส้ของ carousel · ขวาบนเป็นตัวนับรูป) */
.b-wait{background:#E8F0FB;color:#1F4E8C;border:1px solid #C6D7EF}
.waitband{position:absolute;left:10px;bottom:10px;z-index:3;pointer-events:none;display:inline-flex;align-items:center;gap:6px;
  padding:5px 11px;border-radius:var(--pill);background:#1F4E8C;color:#fff;font-weight:700;font-size:12.5px;
  box-shadow:0 2px 8px rgba(20,40,80,.25)}
.waitband i{font-size:11px}
.ccard .cinner > a{position:relative}
.pchip.is-wait{background:#E8F0FB;border-color:#C6D7EF;color:#1F4E8C;font-weight:700}
.sellend.is-wait{background:#E8F0FB;border-color:#C6D7EF;color:#1F4E8C}
.sellend.is-wait > i,.sellend.is-wait span{color:#1F4E8C}

/* รูปในไฟล์รวมสินค้า (10 ต.ค. 2569) — แถบบอกสถานะเหนือแกลเลอรีหน้าแก้ไข (รูปที่เลือกมีป้าย "ไฟล์รวม" มุมขวาล่าง) */
.exportpick{display:flex;align-items:center;gap:8px 10px;flex-wrap:wrap;margin-top:16px;padding:9px 12px;border-radius:10px;
  background:var(--surface-alt);border:1px solid var(--line);font-size:13.5px}
.exportpick > i{color:var(--ink-muted)}
.exportpick form{margin:0 0 0 auto}
/* แถบปุ่มบนรูปในแท็บรูปภาพ (10 ต.ค. 2569) — ใช้รูปนี้ในไฟล์รวม / ป้ายไฟล์รวม · ตั้งเป็นไส้ · ลบ */
/* ⚠ .gallery div (ช่องรูป) ครอบทุก div ข้างใน — ล้าง aspect-ratio/พื้น/มุมโค้ง/ขนาดตัวอักษรของช่องรูปออก ไม่งั้นแถบนี้กลายเป็นช่องรูปซ้อน */
.gallery .gtools{position:absolute;top:6px;right:6px;left:6px;z-index:2;display:flex;flex-direction:row-reverse;flex-wrap:wrap;gap:6px;align-items:center;
  pointer-events:none;aspect-ratio:auto;overflow:visible;border-radius:0;background:none;font-size:13px;place-items:initial}
.gallery .gtools > *{pointer-events:auto}
.gallery .gtools form{margin:0}
.gallery .gtools .copyicon{background:rgba(255,255,255,.94)}
.gexport{display:inline-flex;align-items:center;gap:5px;min-height:34px;padding:5px 12px;border-radius:var(--pill);border:1px solid var(--line);
  background:rgba(255,255,255,.94);color:var(--ink);font:inherit;font-size:12.5px;font-weight:700;white-space:nowrap;cursor:pointer}
.gexport:hover{background:var(--hover-bg);color:var(--hover-ink);border-color:var(--hover-bg)}
.gexport.is-on{background:#E8F0FB;border-color:#C6D7EF;color:#1F4E8C;cursor:default}

/* tooltip ของปุ่มไอคอน [data-tip] (10 ต.ค. 2569 — app.js tips) */
.ktip{position:fixed;z-index:9999;max-width:240px;padding:6px 10px;border-radius:8px;background:var(--ink);color:var(--surface);
  font-size:12.5px;font-weight:600;line-height:1.35;pointer-events:none;box-shadow:0 4px 14px rgba(0,0,0,.18)}

/* หน้าส่งออกไฟล์รวม: ตัวกรองช่วงวันที่วางขาย + หมวดย่อย (10 ต.ค. 2569) */
.pfilters{display:flex;flex-direction:column;gap:12px;margin:4px 0 8px;padding-top:10px;border-top:1px dashed var(--line)}
.pfilters[hidden]{display:none}
.pdates{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.pdates .inp{flex:1;min-width:140px;max-width:200px}
.pdpresets{display:flex;gap:6px;flex-wrap:wrap}
.psubgrp{display:flex;flex-direction:column;gap:4px}
.psublist{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}
.psubrow{display:flex;align-items:center;gap:6px;padding:4px 6px 4px 10px;border:1px solid var(--line);border-radius:10px;background:var(--surface)}
.psubrow .copyicon{width:30px;height:30px;font-size:12px}
.psubrow:first-child [data-sub-move="-1"],.psubrow:last-child [data-sub-move="1"]{opacity:.35;pointer-events:none}

/* หน้าส่งออกรูปรวมสาขา: ตัวกรองจังหวัด (10 ต.ค. 2569) · ⚠ .psub เป็น flex — ต้องมี [hidden] เอง */
.pprov[hidden]{display:none}
.pprovlist{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:4px 12px}

/* ---------- เมนูรวม /menu-files (11 ต.ค. 2569) — คลาสขึ้นต้น xf* ทั้งหมด ---------- */
.xfkind{display:inline-grid;place-items:center;width:22px;height:22px;border-radius:6px;font-size:11px;vertical-align:-3px;background:var(--accent-soft);color:var(--accent)}
.xfkind.k-font{background:#E6F0FB;color:#2C5E9E}
.xfkind.k-filling{background:#FBF0DD;color:#9A6212}
.xfav{width:28px;height:28px;font-size:11px}
/* ตาราง (11 ต.ค. 2569 ตามลูกค้า) — รูปย่อคอลัมน์แรก hover ขยาย · วันที่สร้างชัด */
.xftable td{vertical-align:middle}
.xfmeta .xfkind{font-style:normal;width:18px;height:18px;font-size:9.5px;vertical-align:-4px;margin-right:2px}
.cellname .xfmeta{margin-top:3px}
.xfmini{position:relative;display:grid;place-items:center;width:84px;height:62px;border-radius:8px;background:var(--surface-alt);
  border:1px solid var(--line);overflow:hidden;color:var(--ink-muted);font-size:20px;cursor:zoom-in}
.xfmini img{width:100%;height:100%;object-fit:contain;display:block}
.xfmini:focus-visible{outline:3px solid var(--accent);outline-offset:2px}
.xfminin{position:absolute;right:3px;bottom:3px;font-size:10px;font-weight:700;line-height:1;padding:2px 5px;border-radius:999px;
  background:var(--ink);color:#fff}
.xfdate{display:flex;flex-direction:column;gap:2px;line-height:1.35;white-space:nowrap}
.xfdate b{font-size:14.5px;color:var(--ink)}
.xfdate > span:not(.xfago){font-size:12.5px;color:var(--ink-muted);font-variant-numeric:tabular-nums}
.xfago{align-self:flex-start;font-size:11px;font-weight:700;border-radius:999px;padding:1px 8px;background:var(--surface-alt);color:var(--ink-muted)}
.xfago.is-today{background:#E7F6EC;color:#1E6B3A}
.xfby{display:flex;align-items:center;gap:8px;font-size:13px;line-height:1.35;white-space:nowrap}
.xfby b{color:var(--ink)}
.xfsize{color:var(--ink-muted)}
.xfacts{display:flex;gap:6px;align-items:center;justify-content:flex-end;white-space:nowrap}
.xfzoom{position:fixed;z-index:300;pointer-events:none;padding:6px;background:var(--surface);border:1px solid var(--line);
  border-radius:12px;box-shadow:var(--shadow-lg)}
.xfzoom img{display:block;max-width:min(560px,72vw);max-height:72vh;width:auto;height:auto;border-radius:8px;background:var(--surface-alt)}
.xfzoom[hidden]{display:none}
/* หน้าไฟล์: วันที่สร้าง + ผู้สร้าง */
.xfwho{display:flex;flex-wrap:wrap;align-items:center;gap:12px 32px;margin:0 0 16px;padding:12px 16px;border:1px solid var(--line);
  border-radius:12px;background:var(--surface)}
.xfwhen{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 10px}
.xfwhen b{font-size:18px;color:var(--ink)}
.xfwhen > span:not(.xfago):not(.xflab){color:var(--ink-muted);font-variant-numeric:tabular-nums}
.xflab{display:block;width:100%;font-size:11px;font-weight:700;letter-spacing:.04em;color:var(--ink-muted)}
.xfwho .xfby span{display:flex;flex-direction:column}
.xfdel{margin:0}
.xfgo{display:flex;flex-wrap:wrap;gap:6px;justify-content:center;margin-top:14px}
.xfsheets{display:grid;gap:18px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));align-items:start}
.xfsheets.is-wide{grid-template-columns:repeat(auto-fill,minmax(420px,1fr))}
.xfsheet{margin:0;background:var(--surface);border:1.5px solid var(--line);border-radius:var(--radius);overflow:hidden;box-shadow:var(--shadow)}
.xfsheet img{display:block;width:100%;height:auto;background:var(--surface-alt)}
.xfsheet figcaption{display:flex;align-items:center;gap:8px;justify-content:space-between;padding:8px 12px;border-top:1px solid var(--line);font-size:12.5px;color:var(--ink-muted)}
@media (max-width:560px){.xfsheets,.xfsheets.is-wide{grid-template-columns:1fr}}
/* กล่อง "บันทึกลงเมนูรวม" ในหน้าส่งออกไฟล์รวม (11 ต.ค. 2569) */
.xfsave{margin-bottom:14px;border-color:var(--accent)}
.xfsave .panel-head .fa-solid{color:var(--accent)}
.xfsaverow{display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap}
.xfname{flex:1;min-width:220px;display:flex;flex-direction:column;gap:4px;font-size:13px;font-weight:700;color:var(--ink)}
.xfname .inp{width:100%}
.xfsavemsg{margin:10px 0 0;padding:8px 12px;border-radius:10px;font-size:13px;display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px;
  background:var(--surface-alt);color:var(--ink)}
.xfsavemsg[hidden]{display:none}
.xfsavemsg.is-ok{background:#E7F6EC;color:#1E6B3A}
.xfsavemsg.is-err{background:#FDECEC;color:#A12828}
.xfsavemsg small{color:var(--ink-muted)}
.xfsavemsg .spin{width:14px;height:14px;border-radius:50%;border:2px solid var(--line);border-top-color:var(--accent);animation:xfspin .8s linear infinite;flex:none}
@keyframes xfspin{to{transform:rotate(360deg)}}
@media (prefers-reduced-motion:reduce){.xfsavemsg .spin{animation:none}}
.xflast{margin:10px 0 0;display:flex;flex-wrap:wrap;gap:4px;align-items:center}
.xfrename{display:flex;gap:6px;align-items:center;flex-wrap:wrap;margin:0 0 16px}
.xfrename .inp{flex:1;min-width:220px;max-width:460px}
.xfsub{display:block;font-size:11.5px;font-weight:600;color:var(--ink-muted);margin-top:2px}

/* ---------- ตารางสายส่ง: นำเข้าจาก Google Sheet (11 ต.ค. 2569) — คลาสขึ้นต้น dl* ตามกติกาหน้าสายส่ง ---------- */
.dlsync{margin-bottom:14px}
.dlsyncstate{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;font-size:14px}
.dlspill{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border-radius:999px;font-size:13px;font-weight:700}
.dlspill.is-ok{background:#E7F6EC;color:#1E6B3A}
.dlspill.is-warn{background:#FFF3D6;color:#8A5A00}
.dlspill.is-err{background:#FDECEC;color:#A12828}
.dlsyncmeta{display:flex;flex-wrap:wrap;gap:6px 28px;margin:12px 0 0;font-size:13px}
.dlsyncmeta dt{font-size:11.5px;font-weight:700;color:var(--ink-muted)}
.dlsyncmeta dd{margin:2px 0 0}
.dlsecs{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:12px 0 0}
.dlsec{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border:1.5px solid #CFC2C2;border-radius:999px;font-size:13px;font-weight:600;color:var(--ink);text-decoration:none;background:var(--surface)}
.dlsec small{font-size:11px;color:var(--ink-muted)}
.dlsec.is-new,.dlsec.is-changed{border-color:#E9C46A;background:#FFF8E6}
.dlsec.on{background:var(--blush);border-color:var(--blush-deep)}
.dlsyncerr{margin:10px 0 0;padding:8px 12px;border-radius:10px;background:#FDECEC;color:#A12828;font-size:13px}
.dldiff{margin:0 0 12px;padding-left:20px;display:flex;flex-direction:column;gap:3px;font-size:13.5px;max-height:360px;overflow:auto}
.dldiff li.is-unknown{color:#A12828;font-weight:700}
.dlapply{display:flex;flex-wrap:wrap;gap:8px 12px;align-items:center;margin:0}
.dlaliasbox > summary{cursor:pointer;list-style:none}
.dlaliasbox > summary::-webkit-details-marker{display:none}
.dlaliasbox > summary::after{content:"\25BE";margin-left:auto;color:var(--ink-muted)}
.dlaliasbox[open] > summary::after{content:"\25B4"}
.dlalias td{vertical-align:middle}
.dlalias .sel{min-width:260px;max-width:100%}
.dlalias tr.is-unknown td{background:#FFF7F7}
.dltag{display:inline-block;margin-left:6px;font-size:11px;font-weight:700;padding:1px 8px;border-radius:999px;background:var(--surface-alt);color:var(--ink-muted)}
.dltag.is-unknown{background:#FDECEC;color:#A12828}
.dlsheetwrap{display:flex;flex-direction:column;gap:12px}
.dlsheethead{display:flex;flex-wrap:wrap;gap:4px 14px;align-items:baseline;font-size:13px;color:var(--ink-muted)}
.dlsheethead b{font-size:14.5px;color:var(--ink)}
.dlsheetstops{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0 0;padding:0;list-style:none}
.dlsheetstops li{display:flex;flex-direction:column;gap:1px;padding:6px 10px;border:1px solid var(--line);border-radius:10px;background:var(--surface);font-size:12px;min-width:120px}
.dlsheetstops .t{font-weight:700;font-variant-numeric:tabular-nums}
.dlsheetstops .n{color:var(--ink-muted)}
.dlsheetstops b{font-size:12.5px}
.dlsheetstops em,.dlsheetstops small{font-style:normal;font-size:11px;color:var(--ink-muted)}
.dlsheetstops li.is-skip{opacity:.55;border-style:dashed}
.dlsheetstops li.is-unknown{border-color:#E5A3A3;background:#FFF7F7}
.dlsheetstops li.is-unknown em{color:#A12828;font-weight:700}
.dlurl{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.dlurl .inp{flex:1;min-width:260px}

/* ---------- วิดีโอในเกี่ยวกับการบริการ (11 ต.ค. 2569) — คลาสขึ้นต้น svcv* (.av* ชนกับ .avatar) ---------- */
.svcvid{margin:0 0 14px;border:1px solid var(--line);border-radius:12px;overflow:hidden;background:#000}
.svcvid video,.svcvitem video{display:block;width:100%;max-height:70vh;background:#000}
.svcvid figcaption{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:6px 10px;padding:8px 12px;
  background:var(--surface);font-size:13px;color:var(--ink-muted)}
.svcvid figcaption .n{display:inline-flex;align-items:center;gap:6px;min-width:0;overflow-wrap:anywhere}
.svcvup{display:flex;flex-wrap:wrap;align-items:center;gap:10px}
.svcvprog{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;flex:1;min-width:260px}
.svcvprog[hidden]{display:none}
.svcvbar{flex:1;min-width:160px;height:10px;border-radius:999px;background:var(--surface-alt);overflow:hidden}
.svcvbar > i{display:block;height:100%;width:0;background:var(--accent);border-radius:999px;transition:width .2s}
.svcvprog span{font-size:12.5px;color:var(--ink-muted);font-variant-numeric:tabular-nums}
.svcvmsg{flex-basis:100%;margin:0;padding:8px 12px;border-radius:10px;font-size:13px;background:#FDECEC;color:#A12828}
.svcvmsg[hidden]{display:none}
.svcvlist{display:grid;gap:14px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));margin-top:14px}
.svcvitem{border:1px solid var(--line);border-radius:12px;overflow:hidden;background:var(--surface)}
.svcvitem video{max-height:240px}
.svcvmeta{display:flex;align-items:center;gap:8px;padding:8px 10px;font-size:13px}
.svcvmeta b{overflow-wrap:anywhere}
.svcvmeta small{color:var(--ink-muted);white-space:nowrap}
.svcvmeta form{margin:0}
@media (prefers-reduced-motion:reduce){.svcvbar > i{transition:none}}


/* ---------- แดชบอร์ด: กล่องข้อความสำเร็จรูป (11 ต.ค. 2569) — คลาสขึ้นต้น dqr* ---------- */
/* คอลัมน์ตามที่ตั้ง (--dqr-cols 2–6) เป็นค่าสูงสุด — การ์ดแคบกว่า 160px ลดคอลัมน์เอง (กล่องครึ่งจอ · จอแคบ) */
.dqrwrap{padding:12px;display:flex;flex-direction:column;gap:10px}
.dqrgrid{display:grid;gap:10px;
  grid-template-columns:repeat(auto-fill,minmax(max(160px,calc((100% - (var(--dqr-cols,2) - 1) * 10px) / var(--dqr-cols,2))),1fr))}
.dqrhead{display:flex;align-items:center;gap:8px;margin:6px 0 0;font-size:15px}
.dqrtabs{margin:0 0 2px}
.dqrtabs .faqcat{cursor:pointer;font-family:inherit;color:var(--ink)}
.dqrtabs .faqcat:hover{color:var(--hover-ink)}   /* ⚠ กฎบรรทัดบนแรงกว่า .faqcat:hover — ต้องคืนสีตอน hover เอง ไม่งั้นตัวอักษรดำบนพื้นดำ */
.dqrhead[hidden],.dqrgrid[hidden],.dqrcard[hidden]{display:none}   /* ⚠ flex/grid ชนะ [hidden] */
.dqrhead:first-child{margin-top:0}
.dqrhead span{font-size:12.5px;font-weight:600;color:var(--ink-muted)}
.dqrcard{display:flex;flex-direction:column;gap:6px;padding:10px 12px;border:1px solid var(--line);border-radius:12px;background:var(--surface);min-width:0}
.dqrtop{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--ink-muted)}
.dqrcat{display:inline-flex;align-items:center;gap:6px;font-weight:700}
.dqrtitle{font-size:14.5px;font-weight:700;color:var(--ink);text-decoration:none}
.dqrtitle:hover{text-decoration:underline}
.dqrtext{font-size:13.5px;line-height:1.55;color:var(--ink);background:var(--surface-alt);border-radius:10px;padding:8px 10px}
.dqrtext > span{white-space:pre-line;overflow-wrap:anywhere;display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}
.dqrfoot{display:flex;justify-content:flex-end;gap:6px;margin-top:auto}
.dqrimgs{display:flex;gap:4px;align-items:center}
.dqrimgs img{width:44px;height:44px;object-fit:cover;border-radius:8px;border:1px solid var(--line)}
.dqrimgs span{font-size:12px;color:var(--ink-muted);padding-left:2px}
/* ปุ่มคัดลอก (ปรับ 11 ต.ค. 2569 ลูกค้าขอให้สมมาตร) — สูง 34 · ระยะซ้ายขวาเท่ากัน · ไอคอน + คำอยู่กึ่งกลาง (เดิมสูง 44 ชิดซ้ายแบบปุ่มเต็มแถว) */
.dqrfoot .copychip{width:auto;min-height:34px;padding:5px 14px;gap:6px;justify-content:center;font-size:13px}
.dqrfoot .copychip .ic{width:auto}

/* ---------- ซิงก์สินค้าจาก Google Sheet (11 ต.ค. 2569) — คลาสขึ้นต้น pss* ---------- */
.pssbar{margin-bottom:14px}
.psstab{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;margin:0}
.pssmsg{margin:10px 0 0;padding:8px 12px;border-radius:10px;font-size:13px}
.pssmsg.is-err{background:#FDECEC;color:#A12828}
.psssum{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 14px;position:sticky;top:60px;z-index:5;
  padding:10px 12px;border:1px solid var(--line);border-radius:14px;background:var(--surface);box-shadow:var(--shadow)}
.pssprog{flex-basis:100%;display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px;font-size:13px}
.pssprog[hidden]{display:none}
.pssprog.is-ok span{color:#1E6B3A;font-weight:700}
.pssprog > [data-pss-spin]{color:var(--accent);font-size:16px}
.pssprog.is-ok > [data-pss-spin]{color:#2E9D5B}
.pssprog.is-err > [data-pss-spin]{color:#A12828}
.pssprog.is-err span{color:#A12828;font-weight:700}
.pssbar2{flex:1;min-width:200px;height:10px;border-radius:999px;background:var(--surface-alt);overflow:hidden}
.pssbar2 > i{display:block;height:100%;width:0;background:var(--accent);border-radius:999px;transition:width .3s}
.pssprog.is-ok .pssbar2 > i{background:#2E9D5B}
@media (prefers-reduced-motion:reduce){.pssbar2 > i{transition:none}}
.psschip{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border-radius:999px;font-size:13px;background:var(--surface-alt);color:var(--ink)}
.psschip b{font-variant-numeric:tabular-nums}
.psschip.is-up{background:#E6F0FB;color:#2C5E9E}
.psschip.is-new{background:#E7F6EC;color:#1E6B3A}
.psschip.is-skip{background:#FFF3D6;color:#8A5A00}
.pssnum{min-width:22px;padding:0 7px;border-radius:999px;background:#E7F6EC;color:#1E6B3A;font-size:12px;font-weight:700;
  font-variant-numeric:tabular-nums;line-height:20px;text-align:center}
.pssnav:hover .pssnum{background:#fff;color:var(--ink)}
.pssrows{display:flex;flex-direction:column;gap:6px}
.pssrow{border:1px solid var(--line);border-radius:10px;background:var(--surface)}
.pssrow > summary{display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px;padding:8px 12px;cursor:pointer;list-style:none;font-size:13.5px}
.pssrow > summary::-webkit-details-marker{display:none}
.pssrow[open] > summary{border-bottom:1px dashed var(--line)}
.pssname{font-weight:600}
.pssfields{flex-basis:100%;font-size:12px;color:var(--ink-muted);padding-left:26px}
.psstag{font-size:11px;font-weight:700;padding:1px 8px;border-radius:999px;background:var(--surface-alt);color:var(--ink-muted)}
.psstag.is-warn{background:#FFF3D6;color:#8A5A00}
.pssdiff{width:100%;border-collapse:collapse;font-size:12.5px;table-layout:fixed}
.pssdiff th{width:140px;text-align:left;vertical-align:top;padding:6px 12px;color:var(--ink-muted);font-weight:700}
.pssdiff td{vertical-align:top;padding:6px 12px;border-top:1px solid var(--line);overflow-wrap:anywhere;white-space:normal}   /* ⚠ td ทั้งระบบเป็น nowrap — ข้อความยาวต้องตัดบรรทัด */
.pssdiff td.o{color:var(--ink-muted);text-decoration:line-through;text-decoration-color:rgba(161,40,40,.4)}
.pssdiff td.n{color:var(--ink);background:#F3FAF5}
.pssdiff tr.src td{font-size:11.5px;color:var(--ink-muted);background:none;text-decoration:none}
.pssnew td{vertical-align:top}
.pssimg{display:block;width:120px;height:120px;object-fit:cover;border-radius:10px;border:1px solid var(--line);background:var(--surface-alt)}
.pssimg.is-sm{width:56px;height:56px;border-radius:8px}
.psslist{margin:0;padding-left:20px;font-size:13px;display:flex;flex-direction:column;gap:2px}
.pssurl{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.pssurl .inp{flex:1;min-width:260px}

