/* SILK ROAD AI — shared theme for all four programs (TikTok, Shopee, Facebook, YouTube).
 *
 * Master copy: Google Drive "3) SILK ROAD MCN\SILK ROAD AI\shared\theme\silkroad.css".
 * Owner: the central chat. Programs copy it, they never edit their copy.
 *
 * Use in a program:
 *   1. copy this file to the program's static folder as  static/silkroad.css
 *   2. in <head>, before the program's own CSS:
 *        <link rel="preconnect" href="https://fonts.googleapis.com">
 *        <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
 *        <link href="https://fonts.googleapis.com/css2?family=Prompt:wght@500;600&family=IBM+Plex+Sans+Thai:wght@400;500;600&display=swap" rel="stylesheet">
 *        <link rel="stylesheet" href="/static/silkroad.css">
 *   3. build the header with .sr-topbar (see shared/theme/preview.html) and keep the
 *      <nav class="sr-hub"> switcher in it, right after the logo
 *   4. use the --sr-* variables for every colour, radius and shadow in the program's own CSS.
 *      Programs with their own variable names map them, e.g.  :root{--brand:var(--sr-blue)}
 *
 * What is in here:
 *   - tokens      :root --sr-*  (colour, type, spacing, radius, shadow)
 *   - base        page, headings, links, focus. Written with :where() so it has zero
 *                 specificity: any rule in the program's own CSS wins over it.
 *   - components  all start with .sr- so they never clash with a program's own classes:
 *                 .sr-wrap .sr-topbar .sr-logo .sr-nav .sr-btn .sr-card .sr-form .sr-input
 *                 .sr-table .sr-badge .sr-tabs .sr-notice .sr-stat .sr-empty .sr-modal
 *                 .sr-toast .sr-switch .sr-icon .sr-footer
 *
 * Look: flat colours. No gradients, glows, patterns, blur or emoji icons. Cards use a
 * border, not a shadow; only floating layers (popover, modal, toast, dock) get a shadow.
 * Mint is an accent (tab underline, buttons on dark, status dots), never text on white.
 */

/* ---------------------------------------------------------------- tokens */
:root{
  /* brand */
  --sr-blue:#0b2ef4;        --sr-blue-hover:#0822c4;  --sr-blue-soft:#eef1fe;  --sr-blue-line:#c7d0fd;
  --sr-mint:#00f2cf;        --sr-mint-hover:#00dcbc;  --sr-mint-soft:#e2fcf7;  --sr-mint-line:#9ff5e6;
  --sr-mint-ink:#03695a;    /* the readable mint for text on white or mint-soft */
  --sr-ink:#0a0f2c;         /* headings, main text, dark surfaces */

  /* neutrals */
  --sr-text:#0a0f2c;        --sr-text-2:#3a4160;      --sr-muted:#5b6479;
  --sr-line:#e3e7ef;        --sr-line-strong:#cfd5e1;
  --sr-bg:#f4f6fb;          --sr-bg-2:#eef1f7;        --sr-surface:#ffffff;

  /* status (text / soft background / border) */
  --sr-ok:#067647;    --sr-ok-soft:#ecfdf3;    --sr-ok-line:#abefc6;
  --sr-warn:#b54708;  --sr-warn-soft:#fffaeb;  --sr-warn-line:#fedf89;
  --sr-err:#b42318;   --sr-err-soft:#fef3f2;   --sr-err-line:#fecdca;
  --sr-live:#14b86e;  /* "running / connected" dot, same as the app switcher */

  /* platform colours: only for small "connect to X" buttons and badges, never page colour */
  --sr-tiktok:#0a0f2c; --sr-shopee:#ee4d2d; --sr-facebook:#1877f2; --sr-youtube:#e62117;

  /* type */
  --sr-font-head:"Prompt","IBM Plex Sans Thai",system-ui,sans-serif;
  --sr-font-body:"IBM Plex Sans Thai","Noto Sans Thai",system-ui,-apple-system,"Segoe UI",sans-serif;
  --sr-font-mono:ui-monospace,"Cascadia Code",Consolas,monospace;
  --sr-fs-xs:12px; --sr-fs-sm:13px; --sr-fs-md:14px; --sr-fs:15px; --sr-fs-lg:17px;
  --sr-fs-h3:16px; --sr-fs-h2:20px; --sr-fs-h1:26px; --sr-fs-stat:28px;

  /* spacing (4px steps) */
  --sr-s1:4px; --sr-s2:8px; --sr-s3:12px; --sr-s4:16px; --sr-s5:20px; --sr-s6:24px; --sr-s8:32px; --sr-s10:40px; --sr-s12:48px;

  /* shape */
  --sr-r-xs:4px;   /* badges */
  --sr-r-sm:6px;   /* buttons, inputs */
  --sr-r:8px;      /* cards, panels */
  --sr-r-lg:12px;  /* modals, dock, popovers */
  --sr-topbar-h:64px;
  --sr-wrap:1160px;
  --sr-shadow-float:0 16px 40px -12px rgba(10,15,44,.35);   /* floating layers only */
  --sr-overlay:rgba(10,15,44,.5);                            /* dimmed page behind a modal */
  --sr-focus:0 0 0 2px var(--sr-surface),0 0 0 4px var(--sr-blue);
}

/* ---------------------------------------------------------------- base (zero specificity) */
:where(*,*::before,*::after){box-sizing:border-box}
:where(html){-webkit-text-size-adjust:100%}
:where(body){margin:0;background:var(--sr-bg);color:var(--sr-text);font:400 var(--sr-fs)/1.6 var(--sr-font-body);-webkit-font-smoothing:antialiased}
/* headings inherit their colour (ink on the page, white on a blue/dark panel that sets color:#fff) */
:where(h1,h2,h3,h4){font-family:var(--sr-font-head);color:inherit;font-weight:600;line-height:1.3;margin:0 0 .5em}
:where(h1){font-size:var(--sr-fs-h1)} :where(h2){font-size:var(--sr-fs-h2)} :where(h3){font-size:var(--sr-fs-h3)}
:where(p){margin:0 0 1em}
:where(a){color:var(--sr-blue);text-decoration:none}
:where(a:hover){text-decoration:underline}
:where(button,input,select,textarea){font:inherit;color:inherit}
:where(:focus-visible){outline:2px solid var(--sr-blue);outline-offset:2px}
:where(code,kbd,pre){font-family:var(--sr-font-mono);font-size:.92em}
:where(::selection){background:var(--sr-mint);color:var(--sr-ink)}

/* ---------------------------------------------------------------- layout helpers */
.sr-wrap{max-width:var(--sr-wrap);margin:0 auto;padding:0 var(--sr-s5)}
.sr-main{padding:var(--sr-s8) 0 64px}
.sr-row{display:flex;gap:var(--sr-s3);align-items:center;flex-wrap:wrap}
.sr-grid{display:grid;gap:var(--sr-s4)}
.sr-grid.c2{grid-template-columns:repeat(2,minmax(0,1fr))}
.sr-grid.c3{grid-template-columns:repeat(3,minmax(0,1fr))}
.sr-grid.c4{grid-template-columns:repeat(4,minmax(0,1fr))}
.sr-muted{color:var(--sr-muted)}
.sr-small{font-size:var(--sr-fs-sm)}
.sr-num{font-variant-numeric:tabular-nums}
.sr-push{margin-left:auto}
@media (max-width:860px){.sr-grid.c2,.sr-grid.c3,.sr-grid.c4{grid-template-columns:1fr}}
@media (max-width:600px){.sr-wrap{padding:0 var(--sr-s4)}}

/* ---------------------------------------------------------------- header
   <header class="sr-topbar"><div class="sr-wrap">
     <a class="sr-logo" href="/"><img src="/static/brand/mark.png" alt="Silk Road">
       <span class="sr-logo-name">SILK ROAD AI<small>TikTok Affiliate</small></span></a>
     <nav class="sr-hub" data-current="tiktok"></nav>
     <nav class="sr-nav">…links, buttons…</nav>
   </div></header> */
.sr-topbar{position:sticky;top:0;z-index:30;background:var(--sr-surface);border-bottom:1px solid var(--sr-line)}
.sr-topbar>.sr-wrap{display:flex;align-items:stretch;gap:var(--sr-s3);min-height:var(--sr-topbar-h);flex-wrap:wrap}
.sr-topbar .sr-hub{margin-left:var(--sr-s4)}
@media (max-width:1200px){   /* the switcher drops to its own row (silkroad-hub.js); the logo row keeps its height */
  .sr-topbar>.sr-wrap{row-gap:0}
  .sr-topbar .sr-hub{margin-left:0}
  .sr-topbar .sr-logo{min-height:var(--sr-topbar-h)}
}
.sr-logo{display:flex;align-items:center;gap:var(--sr-s3);color:var(--sr-ink);text-decoration:none;align-self:center}
.sr-logo:hover{text-decoration:none}
.sr-logo img{height:34px;width:auto;display:block}
.sr-logo-name{font:600 15px/1.2 var(--sr-font-head);color:var(--sr-ink);padding-left:var(--sr-s3);border-left:1px solid var(--sr-line);white-space:nowrap}
.sr-logo-name small{display:block;font:400 var(--sr-fs-xs)/1.3 var(--sr-font-body);color:var(--sr-muted)}
.sr-nav{display:flex;align-items:center;gap:var(--sr-s1);margin-left:auto;align-self:center;flex-wrap:wrap}
.sr-nav>a,.sr-nav>button{height:36px;padding:0 var(--sr-s3);display:inline-flex;align-items:center;gap:var(--sr-s2);border:0;border-radius:var(--sr-r-sm);background:none;color:var(--sr-text-2);font-size:var(--sr-fs-md);font-weight:500;cursor:pointer;text-decoration:none}
.sr-nav>a:hover,.sr-nav>button:hover{background:var(--sr-bg);color:var(--sr-ink);text-decoration:none}
.sr-nav>a[aria-current="page"]{color:var(--sr-ink);font-weight:600}
.sr-members-only{font-size:var(--sr-fs-sm);color:var(--sr-muted)}
@media (max-width:720px){
  .sr-logo-name small{display:none}
  .sr-logo img{height:30px}
}

/* ---------------------------------------------------------------- buttons
   <button class="sr-btn primary">  · primary | mint | danger | ghost | facebook | youtube | tiktok | shopee
   sizes: .sm  · full width: .block  · icon only: .icon */
.sr-btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--sr-s2);height:38px;padding:0 var(--sr-s4);border:1px solid var(--sr-line-strong);border-radius:var(--sr-r-sm);background:var(--sr-surface);color:var(--sr-ink);font:500 var(--sr-fs-md)/1 var(--sr-font-body);white-space:nowrap;cursor:pointer;text-decoration:none;transition:background-color .15s,border-color .15s,color .15s}
.sr-btn:hover{background:var(--sr-bg);text-decoration:none}
.sr-btn:focus-visible{outline:0;box-shadow:var(--sr-focus)}
.sr-btn:disabled,.sr-btn[aria-disabled="true"]{opacity:.5;cursor:not-allowed}
.sr-btn.primary{background:var(--sr-blue);border-color:var(--sr-blue);color:#fff}
.sr-btn.primary:hover{background:var(--sr-blue-hover);border-color:var(--sr-blue-hover)}
.sr-btn.mint{background:var(--sr-mint);border-color:var(--sr-mint);color:var(--sr-ink);font-weight:600}
.sr-btn.mint:hover{background:var(--sr-mint-hover);border-color:var(--sr-mint-hover)}
.sr-btn.danger{color:var(--sr-err);border-color:var(--sr-err-line)}
.sr-btn.danger:hover{background:var(--sr-err-soft)}
.sr-btn.ghost{background:transparent;border-color:transparent;color:var(--sr-text-2)}
.sr-btn.ghost:hover{background:var(--sr-bg);color:var(--sr-ink)}
.sr-btn.facebook{background:var(--sr-facebook);border-color:var(--sr-facebook);color:#fff}
.sr-btn.youtube{background:var(--sr-youtube);border-color:var(--sr-youtube);color:#fff}
.sr-btn.tiktok{background:var(--sr-tiktok);border-color:var(--sr-tiktok);color:#fff}
.sr-btn.shopee{background:var(--sr-shopee);border-color:var(--sr-shopee);color:#fff}
.sr-btn.facebook:hover,.sr-btn.youtube:hover,.sr-btn.tiktok:hover,.sr-btn.shopee:hover{filter:brightness(.92)}
.sr-btn.sm{height:30px;padding:0 var(--sr-s3);font-size:var(--sr-fs-sm)}
.sr-btn.lg{height:46px;padding:0 var(--sr-s5);font-size:var(--sr-fs)}
.sr-btn.block{display:flex;width:100%}
.sr-btn.icon{width:38px;padding:0}
.sr-btn.icon.sm{width:30px}

/* ---------------------------------------------------------------- cards
   <section class="sr-card"><header class="sr-card-head"><h2>…</h2><a class="sr-btn sm">…</a></header>…</section> */
.sr-card{background:var(--sr-surface);border:1px solid var(--sr-line);border-radius:var(--sr-r);padding:var(--sr-s5)}
.sr-card+.sr-card{margin-top:var(--sr-s4)}
.sr-grid>.sr-card+.sr-card{margin-top:0}
.sr-card-head{display:flex;align-items:center;gap:var(--sr-s3);margin:0 0 var(--sr-s4)}
.sr-card-head h2,.sr-card-head h3{margin:0;font-size:var(--sr-fs-h3)}
.sr-card-head>:last-child:not(:first-child){margin-left:auto}
.sr-card.flush{padding:0;overflow:hidden}
.sr-card.flush>.sr-card-head{padding:var(--sr-s4) var(--sr-s5);margin:0;border-bottom:1px solid var(--sr-line)}
.sr-card.selected{border-color:var(--sr-blue);box-shadow:0 0 0 1px var(--sr-blue)}

/* ---------------------------------------------------------------- forms
   Put .sr-form on a <form> (or any wrapper) to style the fields inside it,
   or put .sr-input on a single input/select/textarea.
   <label class="sr-label" for="e">อีเมล</label><input class="sr-input" id="e">
   <p class="sr-hint">…</p>  · error: add .invalid to the input and use <p class="sr-hint err"> */
.sr-label,.sr-form label:not(.sr-check,.sr-switch){display:block;margin:var(--sr-s4) 0 var(--sr-s1);font-size:var(--sr-fs-md);font-weight:500;color:var(--sr-ink)}
.sr-input,
.sr-form :is(input[type=text],input[type=email],input[type=password],input[type=number],input[type=tel],input[type=url],input[type=search],input[type=date],input[type=time],select,textarea){
  width:100%;height:40px;padding:0 var(--sr-s3);border:1px solid var(--sr-line-strong);border-radius:var(--sr-r-sm);background:var(--sr-surface);color:var(--sr-ink);font:400 var(--sr-fs-md)/1.4 var(--sr-font-body);transition:border-color .15s}
textarea.sr-input,.sr-form textarea{height:auto;min-height:96px;padding:var(--sr-s2) var(--sr-s3);line-height:1.6;resize:vertical}
.sr-input::placeholder,.sr-form ::placeholder{color:var(--sr-muted);opacity:1}
.sr-input:hover,.sr-form :is(input,select,textarea):hover{border-color:var(--sr-muted)}
.sr-input:focus,.sr-form :is(input,select,textarea):focus{outline:1px solid var(--sr-blue);outline-offset:0;border-color:var(--sr-blue)}
.sr-input.invalid,.sr-form .invalid{border-color:var(--sr-err)}
.sr-input:disabled,.sr-form :is(input,select,textarea):disabled{background:var(--sr-bg);color:var(--sr-muted);cursor:not-allowed}
.sr-hint{margin:var(--sr-s1) 0 0;font-size:var(--sr-fs-sm);color:var(--sr-muted)}
.sr-hint.err{color:var(--sr-err)}
.sr-check{display:inline-flex;align-items:center;gap:var(--sr-s2);font-size:var(--sr-fs-md);color:var(--sr-text);cursor:pointer}
.sr-check input,.sr-form :is(input[type=checkbox],input[type=radio]){width:16px;height:16px;margin:0;accent-color:var(--sr-blue)}
.sr-form-actions{display:flex;gap:var(--sr-s2);margin-top:var(--sr-s5)}

/* switch: <label class="sr-switch"><input type="checkbox"><span></span> เปิดโพสต์อัตโนมัติ</label> */
.sr-switch{display:inline-flex;align-items:center;gap:var(--sr-s3);font-size:var(--sr-fs-md);cursor:pointer}
.sr-switch input{position:absolute;opacity:0;width:1px;height:1px}
.sr-switch span{position:relative;width:36px;height:20px;border-radius:20px;background:var(--sr-line-strong);flex:none;transition:background-color .15s}
.sr-switch span::after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:#fff;transition:transform .15s}
.sr-switch input:checked+span{background:var(--sr-blue)}
.sr-switch input:checked+span::after{transform:translateX(16px)}
.sr-switch input:focus-visible+span{box-shadow:var(--sr-focus)}

/* ---------------------------------------------------------------- tables
   <div class="sr-table-wrap"><table class="sr-table">…</table></div> */
.sr-table-wrap{overflow-x:auto}
.sr-table{width:100%;border-collapse:collapse;font-size:var(--sr-fs-md)}
.sr-table th,.sr-table td{padding:var(--sr-s3) var(--sr-s3);text-align:left;vertical-align:middle;border-bottom:1px solid var(--sr-line)}
.sr-table th{font-size:var(--sr-fs-xs);font-weight:500;color:var(--sr-muted);white-space:nowrap;background:var(--sr-surface)}
.sr-table tbody tr:hover{background:var(--sr-bg)}
.sr-table tr:last-child td{border-bottom:0}
.sr-table td.num,.sr-table th.num{text-align:right;font-variant-numeric:tabular-nums}
.sr-table .sr-thumb{width:44px;height:44px;border-radius:var(--sr-r-sm);object-fit:cover;border:1px solid var(--sr-line);background:var(--sr-bg);display:block}

/* ---------------------------------------------------------------- status badges
   <span class="sr-badge ok">โพสต์แล้ว</span>  · ok | warn | err | info | new | live
   add a dot in front: <span class="sr-badge ok dot">… */
.sr-badge{display:inline-flex;align-items:center;gap:6px;height:22px;padding:0 var(--sr-s2);border:1px solid var(--sr-line);border-radius:var(--sr-r-xs);background:var(--sr-bg);color:var(--sr-text-2);font:500 var(--sr-fs-xs)/1 var(--sr-font-body);white-space:nowrap}
.sr-badge.ok  {background:var(--sr-ok-soft);  border-color:var(--sr-ok-line);  color:var(--sr-ok)}
.sr-badge.warn{background:var(--sr-warn-soft);border-color:var(--sr-warn-line);color:var(--sr-warn)}
.sr-badge.err {background:var(--sr-err-soft); border-color:var(--sr-err-line); color:var(--sr-err)}
.sr-badge.info{background:var(--sr-blue-soft);border-color:var(--sr-blue-line);color:var(--sr-blue-hover)}
.sr-badge.new {background:var(--sr-mint-soft);border-color:var(--sr-mint-line);color:var(--sr-mint-ink)}
.sr-badge.dot::before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor;flex:none}
.sr-badge.live::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--sr-live);flex:none}

/* ---------------------------------------------------------------- tabs (inside a page)
   The program switcher (.sr-hub) marks the open program with a mint underline;
   tabs inside a page use blue, so the two levels never look the same.
   <nav class="sr-tabs"><button class="on" aria-selected="true">คิวโพสต์</button><button>ประวัติ</button></nav>
   segmented control: <div class="sr-seg"><button class="on">วันนี้</button><button>7 วัน</button></div> */
.sr-tabs{display:flex;gap:var(--sr-s1);border-bottom:1px solid var(--sr-line);margin-bottom:var(--sr-s5);overflow-x:auto;scrollbar-width:none}
.sr-tabs::-webkit-scrollbar{display:none}
.sr-tabs>a,.sr-tabs>button{position:relative;display:inline-flex;align-items:center;gap:var(--sr-s2);height:42px;padding:0 var(--sr-s3);border:0;background:none;color:var(--sr-muted);font:500 var(--sr-fs-md)/1 var(--sr-font-body);white-space:nowrap;cursor:pointer;text-decoration:none}
.sr-tabs>a:hover,.sr-tabs>button:hover{color:var(--sr-ink);text-decoration:none}
.sr-tabs>.on,.sr-tabs>[aria-selected="true"],.sr-tabs>[aria-current="page"]{color:var(--sr-ink);font-weight:600}
.sr-tabs>.on::after,.sr-tabs>[aria-selected="true"]::after,.sr-tabs>[aria-current="page"]::after{content:"";position:absolute;left:var(--sr-s2);right:var(--sr-s2);bottom:-1px;height:2px;background:var(--sr-blue)}
.sr-tabs .sr-count{font:500 var(--sr-fs-xs)/1 var(--sr-font-body);padding:3px 6px;border-radius:var(--sr-r-xs);background:var(--sr-bg-2);color:var(--sr-text-2)}
.sr-seg{display:inline-flex;gap:2px;padding:3px;border-radius:var(--sr-r);background:var(--sr-bg-2)}
.sr-seg>button{height:30px;padding:0 var(--sr-s3);border:0;border-radius:var(--sr-r-sm);background:none;color:var(--sr-text-2);font:500 var(--sr-fs-sm)/1 var(--sr-font-body);cursor:pointer}
.sr-seg>button.on,.sr-seg>button[aria-pressed="true"]{background:var(--sr-surface);color:var(--sr-ink);box-shadow:0 0 0 1px var(--sr-line)}

/* ---------------------------------------------------------------- notices
   <div class="sr-notice warn"><b>ยังไม่ได้เชื่อมเพจ</b> เชื่อมก่อนจึงจะโพสต์ได้</div>  · ok | warn | err | info */
.sr-notice{padding:var(--sr-s3) var(--sr-s4);margin:0 0 var(--sr-s4);border:1px solid var(--sr-line);border-left-width:3px;border-radius:var(--sr-r-sm);background:var(--sr-surface);font-size:var(--sr-fs-md);color:var(--sr-text)}
.sr-notice b{color:var(--sr-ink);font-weight:600}
.sr-notice.ok  {background:var(--sr-ok-soft);  border-color:var(--sr-ok-line);  border-left-color:var(--sr-ok)}
.sr-notice.warn{background:var(--sr-warn-soft);border-color:var(--sr-warn-line);border-left-color:var(--sr-warn)}
.sr-notice.err {background:var(--sr-err-soft); border-color:var(--sr-err-line); border-left-color:var(--sr-err)}
.sr-notice.info{background:var(--sr-blue-soft);border-color:var(--sr-blue-line);border-left-color:var(--sr-blue)}

/* ---------------------------------------------------------------- numbers on the dashboard
   <div class="sr-card sr-stat"><span class="sr-stat-label">คลิปวันนี้</span><b class="sr-stat-value">12</b><span class="sr-stat-note">จากโควตา 20</span></div> */
.sr-stat{display:flex;flex-direction:column;gap:2px}
.sr-stat-label{font-size:var(--sr-fs-sm);color:var(--sr-muted)}
.sr-stat-value{font:600 var(--sr-fs-stat)/1.2 var(--sr-font-head);color:var(--sr-ink);font-variant-numeric:tabular-nums}
.sr-stat-note{font-size:var(--sr-fs-sm);color:var(--sr-text-2)}
.sr-meter{height:6px;border-radius:6px;background:var(--sr-bg-2);overflow:hidden;margin-top:var(--sr-s2)}
.sr-meter>i{display:block;height:100%;background:var(--sr-blue)}
.sr-meter.full>i{background:var(--sr-warn)}

/* ---------------------------------------------------------------- empty state
   <div class="sr-empty"><svg class="sr-icon lg">…</svg><h3>ยังไม่มีคลิป</h3><p>…</p><button class="sr-btn primary">…</button></div> */
.sr-empty{display:flex;flex-direction:column;align-items:center;text-align:center;gap:var(--sr-s2);padding:var(--sr-s12) var(--sr-s5);color:var(--sr-muted)}
.sr-empty h3{margin:var(--sr-s2) 0 0;color:var(--sr-ink)}
.sr-empty p{margin:0 0 var(--sr-s3);max-width:420px}
.sr-empty .sr-icon{color:var(--sr-blue)}

/* ---------------------------------------------------------------- modal, toast, dock (floating layers)
   <div class="sr-modal-bg"><div class="sr-modal" role="dialog" aria-modal="true">
     <header class="sr-modal-head"><h2>…</h2><button class="sr-btn ghost icon sm" aria-label="ปิด">…</button></header>
     …<footer class="sr-modal-foot"><button class="sr-btn">ยกเลิก</button><button class="sr-btn primary">บันทึก</button></footer>
   </div></div> */
.sr-modal-bg{position:fixed;inset:0;z-index:60;display:grid;place-items:center;padding:var(--sr-s4);background:var(--sr-overlay)}
.sr-modal{width:min(560px,100%);max-height:calc(100vh - 32px);overflow:auto;background:var(--sr-surface);border-radius:var(--sr-r-lg);box-shadow:var(--sr-shadow-float);padding:var(--sr-s6)}
.sr-modal-head{display:flex;align-items:center;gap:var(--sr-s3);margin-bottom:var(--sr-s4)}
.sr-modal-head h2{margin:0;font-size:var(--sr-fs-h2)}
.sr-modal-head>button{margin-left:auto}
.sr-modal-foot{display:flex;justify-content:flex-end;gap:var(--sr-s2);margin-top:var(--sr-s6)}
.sr-toast{position:fixed;left:50%;bottom:var(--sr-s5);z-index:70;transform:translateX(-50%);max-width:min(480px,calc(100vw - 32px));padding:var(--sr-s3) var(--sr-s4);border-radius:var(--sr-r);background:var(--sr-ink);color:#fff;font-size:var(--sr-fs-md);box-shadow:var(--sr-shadow-float)}
.sr-toast.err{background:var(--sr-err)}
.sr-dock{position:fixed;left:50%;bottom:var(--sr-s5);z-index:40;transform:translateX(-50%);width:min(780px,calc(100% - 32px));display:flex;align-items:center;gap:var(--sr-s3);padding:var(--sr-s2) var(--sr-s2) var(--sr-s2) var(--sr-s4);border-radius:var(--sr-r-lg);background:var(--sr-ink);color:#fff;box-shadow:var(--sr-shadow-float)}
.sr-dock .sr-muted{color:rgba(255,255,255,.7)}
.sr-log{background:var(--sr-ink);color:#e6e9f2;font:12px/1.7 var(--sr-font-mono);padding:var(--sr-s3);border-radius:var(--sr-r-sm);max-height:320px;overflow:auto;white-space:pre-wrap}

/* ---------------------------------------------------------------- icons
   Single-stroke SVG, 24-unit viewBox, currentColor. Never emoji.
   <svg class="sr-icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14M12 5l7 7-7 7"/></svg> */
.sr-icon{width:16px;height:16px;flex:none;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;vertical-align:-3px}
.sr-icon.md{width:20px;height:20px}
.sr-icon.lg{width:32px;height:32px;stroke-width:1.5}
.sr-spin{animation:sr-spin .8s linear infinite}
@keyframes sr-spin{to{transform:rotate(360deg)}}

/* ---------------------------------------------------------------- footer
   <footer class="sr-footer"><div class="sr-wrap sr-row"><span>SILK ROAD MCN · GRANBLACKWELL GROUP</span><span class="sr-push">…links…</span></div></footer> */
.sr-footer{border-top:1px solid var(--sr-line);background:var(--sr-surface);padding:var(--sr-s5) 0;font-size:var(--sr-fs-sm);color:var(--sr-muted)}
.sr-footer a{color:var(--sr-text-2)}

@media (prefers-reduced-motion:reduce){
  .sr-btn,.sr-switch span,.sr-switch span::after,.sr-input{transition:none}
  .sr-spin{animation-duration:2s}
}
