/* ============================================================================
   Craftian shared UI — the reusable design system used by omni.html, auto.html
   and the /tools/* pages (sync.html, …).

   Contains: theme tokens (light + dark), the page shell (background blobs,
   top bar, org switcher, account menu), and the common components every page
   reuses — tabs, filter pills, buttons, badges, cards, stat tiles, modals,
   form fields and the toast. Page-specific component CSS stays inline in each
   page's own <style> block.

   Load this BEFORE any page-level <style> so inline rules can still override.
   ========================================================================== */

/* ---------- THEME TOKENS ---------- */
:root{
  --lav:#c9c0ff;
  --lav-soft:#e9e5ff;
  --mint:#bdeede;
  --mint-soft:#e2f8f1;
  --peach:#ffd9c2;
  --peach-soft:#fff0e7;
  --ink:#4a4566;
  --ink-soft:#8b86a6;
  --ink-faint:#b3aecb;
  --card:#ffffff;
  --bg1:#f6f1ff;
  --bg2:#eafaf4;
  --bg3:#fff3ec;
  --ring:#a99cff;
  --shadow:24px 24px 60px rgba(150,135,220,.18);
  --shadow-sm:0 10px 30px rgba(150,135,220,.16);
  --r-xl:34px;
  --r-lg:26px;
  --r-md:18px;
  --r-pill:999px;
  --spring:cubic-bezier(.34,1.56,.64,1);
  --ease:cubic-bezier(.4,0,.2,1);
  /* themeable surface / border / text tokens (overridden by body.dark) */
  --page:#fbfaff;
  --surface:#ffffff;
  --surface-2:#faf8ff;
  --surface-3:#f6f1ff;
  --screen:#fdfcff;
  --border:#efeaff;
  --border-2:#f1edff;
  --track:#ece4ff;
  --brand-ink:#2a2a33;
  --accent-ink:#6d5fc7;
  --accent-ink2:#7d6fe8;
  --glass:rgba(255,255,255,.65);
  /* primary action color (buttons, active tab) — sunset */
  --primary:linear-gradient(135deg,#ff6f91,#ffab5e);
}
body.dark{
  color-scheme:dark;--page:#15131e;--bg1:#241d39;--bg2:#132019;--bg3:#241a24;
  --surface:#23202e;--card:#23202e;--surface-2:#1b1925;--surface-3:#2a2540;--screen:#201d2b;
  --border:#34304a;--border-2:#2c2840;--track:#2c2840;
  --ink:#eae9f6;--ink-soft:#a39ec0;--ink-faint:#6f6a88;
  --brand-ink:#f3f1fb;--accent-ink:#bcacff;--accent-ink2:#bcacff;--lav-soft:#322a4f;
  --glass:rgba(26,23,38,.62);--primary:linear-gradient(135deg,#ff5c7e,#ff9542);
  --shadow:24px 24px 60px rgba(0,0,0,.5);--shadow-sm:0 10px 30px rgba(0,0,0,.42);
}
body.dark .blob{opacity:.22}
body.dark .blob.b1{background:#3a2f6b}
body.dark .blob.b2{background:#1d3a30}
body.dark .blob.b3{background:#3a2030}
body.dark .blob.b4{background:#2a2540}
body.dark .modal-overlay{background:rgba(0,0,0,.55)}
body.dark .ctx-item.danger:hover{background:rgba(229,97,139,.16)}

/* ---------- RESET + PAGE SHELL ---------- */
*{box-sizing:border-box;margin:0;padding:0}
[hidden]{display:none!important}
.hidden{display:none!important}
html,body{height:100%}
body{
  font-family:'Nunito',system-ui,sans-serif;color:var(--ink);
  background:
    radial-gradient(900px 700px at 12% 8%, var(--bg1), transparent 60%),
    radial-gradient(900px 700px at 88% 18%, var(--bg2), transparent 60%),
    radial-gradient(1000px 800px at 70% 100%, var(--bg3), transparent 60%),
    var(--page);
  height:100dvh;overflow:hidden;-webkit-font-smoothing:antialiased;display:flex;flex-direction:column;
}
/* floating decorative blobs */
.blob{position:fixed;border-radius:50%;filter:blur(46px);opacity:.55;z-index:0;pointer-events:none;animation:float 9s ease-in-out infinite}
.blob.b1{width:280px;height:280px;background:var(--lav);top:8%;left:4%;animation-delay:0s}
.blob.b2{width:220px;height:220px;background:var(--mint);bottom:14%;left:10%;animation-delay:1.5s}
.blob.b3{width:320px;height:320px;background:var(--peach);top:12%;right:6%;animation-delay:.8s}
.blob.b4{width:180px;height:180px;background:var(--lav-soft);bottom:18%;right:12%;animation-delay:2.2s}
@keyframes float{0%,100%{transform:translateY(0) translateX(0)}50%{transform:translateY(-22px) translateX(10px)}}

/* ---------- TOP BAR (brand + org switcher + avatar) ---------- */
.topbar{position:relative;z-index:4;flex:none;border-bottom:1.5px solid var(--border);background:var(--glass);backdrop-filter:blur(14px)}
.topbar-inner{width:100%;max-width:960px;margin:0 auto;padding:13px clamp(16px,4vw,28px);display:flex;align-items:center;justify-content:space-between;gap:16px}
.brand{font-family:'Quicksand',sans-serif;font-weight:700;font-size:1.6rem;letter-spacing:.2px;line-height:1;color:var(--brand-ink);text-decoration:none}
.tb-left{display:flex;align-items:center;gap:13px;min-width:0}
.tb-div{width:1.5px;height:24px;background:var(--border-2);border-radius:2px;flex:none}
.proj-btn{display:inline-flex;align-items:center;gap:9px;min-width:0;font-family:'Nunito';font-weight:700;font-size:.92rem;color:var(--ink);background:var(--glass);border:1.5px solid var(--border);border-radius:12px;padding:8px 12px;cursor:pointer;transition:border-color .2s,background .2s,box-shadow .2s}
.proj-btn:hover{border-color:var(--lav);background:var(--surface);box-shadow:var(--shadow-sm)}
.proj-btn>span:nth-child(2){white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.proj-dot{width:11px;height:11px;border-radius:50%;background:var(--c);flex:none}
.proj-btn .chev{width:15px;height:15px;color:var(--ink-faint);flex:none;transition:transform .2s}
.proj-btn.open .chev{transform:rotate(180deg)}
.proj-menu{position:fixed;z-index:60;min-width:218px;background:var(--surface);border:1.5px solid var(--border);border-radius:14px;padding:6px;box-shadow:0 22px 54px -16px rgba(74,69,102,.42);font-family:'Nunito';animation:ctxin .14s ease both}
.proj-menu[hidden]{display:none}
.proj-menu .label{font-size:.66rem;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint);padding:7px 11px 5px}
.proj-item{display:flex;align-items:center;gap:10px;width:100%;text-align:left;border:none;background:none;cursor:pointer;font-family:'Nunito';font-weight:700;font-size:.87rem;color:var(--ink);padding:9px 11px;border-radius:9px;transition:background .15s}
.proj-item:hover{background:var(--surface-3)}
.proj-item .pd{width:11px;height:11px;border-radius:50%;background:var(--c);flex:none}
.proj-item .ck{margin-left:auto;width:16px;height:16px;color:var(--accent-ink2);flex:none}

/* user avatar + menu (top-right) */
.avatar-btn{border:none;background:none;cursor:pointer;padding:0;border-radius:50%;flex:none;transition:transform .2s var(--spring)}
.avatar-btn:hover{transform:scale(1.06)}
.avatar-btn:active{transform:scale(.95)}
.avatar{width:40px;height:40px;border-radius:50%;display:grid;place-items:center;color:#fff;font-family:'Quicksand',sans-serif;font-weight:700;font-size:.92rem;background:var(--primary);box-shadow:0 6px 14px -5px rgba(255,120,100,.5),inset 0 1px 0 rgba(255,255,255,.3)}
/* Anonymous/fallback person icon: constrain so it doesn't fill the whole circle */
.avatar svg{width:22px;height:22px}
.avatar-btn.open .avatar{box-shadow:0 0 0 3px rgba(169,156,255,.35)}

/* top-right cluster + refresh button (shared chrome: omni, inbox, …). Toggle
   the `spinning` class while a refresh is in-flight and set `disabled` so the
   icon rotates and the button can't be re-triggered mid-refresh. */
.tb-right{display:flex;align-items:center;gap:11px;flex:none}
.refresh-btn{width:40px;height:40px;border-radius:50%;border:1.5px solid var(--border);background:var(--surface);color:var(--ink-soft);cursor:pointer;display:grid;place-items:center;flex:none;transition:transform .2s var(--spring),background .15s,color .15s}
.refresh-btn:hover{transform:scale(1.06);background:var(--surface-3);color:var(--ink)}
.refresh-btn:active{transform:scale(.95)}
.refresh-btn:disabled{cursor:default}
.refresh-btn:disabled:hover{transform:none;background:var(--surface);color:var(--ink-soft)}
.refresh-btn svg{width:20px;height:20px}
.refresh-btn.spinning svg{animation:spin .7s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.user-menu{position:fixed;z-index:60;min-width:232px;background:var(--surface);border:1.5px solid var(--border);border-radius:14px;padding:6px;box-shadow:0 22px 54px -16px rgba(74,69,102,.42);font-family:'Nunito';animation:ctxin .14s ease both}
.user-menu[hidden]{display:none}
.user-head{display:flex;align-items:center;gap:11px;padding:9px 10px 11px}
.user-head .avatar{width:42px;height:42px;font-size:.95rem}
.user-head .un{font-weight:800;font-size:.9rem;color:var(--ink);line-height:1.2}
.user-head .ue{font-size:.78rem;color:var(--ink-soft);font-weight:600;margin-top:2px}
.user-menu:not(.loggedin) .logged-in-only{display:none}
.user-menu.loggedin .logged-out-only{display:none}
.user-menu:not(.ea) .ea-only{display:none}
@keyframes ctxin{from{opacity:0;transform:scale(.96) translateY(6px)}to{opacity:1;transform:none}}
.ctx-item{display:flex;align-items:center;gap:11px;width:100%;text-align:left;border:none;background:none;cursor:pointer;font-family:inherit;font-weight:700;font-size:.86rem;color:var(--ink);padding:9px 11px;border-radius:9px;transition:background .15s,color .15s;text-decoration:none}
.ctx-item:hover{background:var(--surface-3)}
.ctx-item svg{width:16px;height:16px;color:var(--ink-soft);flex:none}
.ctx-item.danger{color:#e5618b}
.ctx-item.danger svg{color:#e5618b}
.ctx-item.danger:hover{background:#ffeef4}
.ctx-sep{height:1.5px;background:var(--border-2);margin:5px 6px}

/* ---------- MAIN PAGE ---------- */
.page{flex:1;min-height:0;overflow-y:auto;width:100%;max-width:960px;margin:0 auto;padding:26px clamp(16px,4vw,28px) 48px;position:relative;z-index:1;scrollbar-width:thin;scrollbar-color:var(--lav) transparent}
.page::-webkit-scrollbar{width:8px}
.page::-webkit-scrollbar-thumb{background:var(--lav);border-radius:99px}
.page-head{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:8px}
.page-head h1{font-family:'Quicksand';font-weight:700;font-size:1.9rem;color:var(--ink);letter-spacing:-.01em}
.page-sub{color:var(--ink-soft);font-weight:600;font-size:.9rem;margin-bottom:22px}
.btn-primary{font-family:'Nunito';font-weight:800;font-size:.9rem;color:#fff;background:var(--primary);border:none;border-radius:14px;padding:11px 18px;cursor:pointer;box-shadow:0 8px 18px -7px rgba(255,120,100,.5);transition:filter .2s,transform .2s var(--spring);white-space:nowrap}
.btn-primary:hover{filter:brightness(1.05)}
.btn-primary:active{transform:scale(.97)}

/* empty / loading / error states */
.state{text-align:center;color:var(--ink-soft);font-weight:600;padding:64px 20px}
.state .em{line-height:1;margin-bottom:16px;display:flex;justify-content:center}
.state .em svg{width:44px;height:44px;color:var(--ink-faint);stroke-width:1.6}
.state h2{font-family:'Quicksand';font-weight:700;font-size:1.25rem;color:var(--ink);margin-bottom:8px}
.state p{font-size:.9rem;max-width:400px;margin:0 auto}

/* ---------- TABS ---------- */
.tabs{display:flex;gap:4px;margin-bottom:16px;border-bottom:1.5px solid var(--border-2);overflow-x:auto;scrollbar-width:none}
.tabs::-webkit-scrollbar{display:none}
.tab{flex:none;font-family:'Nunito';font-weight:800;font-size:.92rem;color:var(--ink-soft);background:none;border:none;border-bottom:2.5px solid transparent;cursor:pointer;padding:9px 14px;margin-bottom:-1.5px;white-space:nowrap;transition:color .15s,border-color .15s}
.tab:hover{color:var(--ink)}
.tab.active{color:var(--accent-ink);border-bottom-color:var(--accent-ink)}
.view-intro{color:var(--ink-soft);font-weight:600;font-size:.9rem;line-height:1.45;margin-bottom:18px}

/* ---------- ACTION BAR (filter pills + small buttons) ---------- */
.task-bar{display:flex;align-items:center;gap:10px;margin-bottom:14px;flex-wrap:wrap}
.task-bar>.right{margin-left:auto;display:flex;gap:10px}
.pills{display:inline-flex;gap:3px;background:var(--surface-2);border:1.5px solid var(--border-2);border-radius:999px;padding:3px;overflow-x:auto;scrollbar-width:none;max-width:100%}
.pills::-webkit-scrollbar{display:none}
.pill-btn{flex:none;font-family:'Nunito';font-weight:700;font-size:.8rem;color:var(--ink-soft);background:none;border:none;border-radius:999px;padding:6px 14px;cursor:pointer;white-space:nowrap;transition:background .15s,color .15s}
.pill-btn:hover{color:var(--ink)}
.pill-btn.active{background:var(--surface);color:var(--accent-ink);box-shadow:var(--shadow-sm)}
body.dark .pill-btn.active{background:var(--surface-3)}
.btn-sm{font-family:'Nunito';font-weight:700;font-size:.8rem;border-radius:10px;padding:7px 13px;cursor:pointer;border:1.5px solid var(--border);background:var(--surface);color:var(--ink-soft);transition:.15s;white-space:nowrap;text-decoration:none;display:inline-block}
.btn-sm:hover{border-color:var(--lav);color:var(--ink)}
.btn-sm:disabled{opacity:.45;cursor:not-allowed}
.btn-sm.go{color:var(--accent-ink);border-color:var(--lav)}
.btn-sm.go:hover{background:var(--lav-soft);color:var(--accent-ink)}
.btn-sm.danger{color:#e5618b;border-color:var(--border)}
.btn-sm.danger:hover{background:#ffeef4;border-color:#f3a8c4}

/* ---------- STATUS BADGES ---------- */
.badge{display:inline-flex;align-items:center;gap:6px;font-size:.7rem;font-weight:800;padding:3px 10px;border-radius:999px;white-space:nowrap}
.badge .bdot{width:7px;height:7px;border-radius:50%;background:currentColor;flex:none}
.badge.bg{color:#1f8f6b;background:rgba(63,196,160,.16)}     /* good */
.badge.bb{color:#3d7fd6;background:rgba(84,185,255,.16)}     /* busy */
.badge.bn{color:var(--ink-soft);background:var(--track)}     /* neutral */
.badge.bw{color:#b9842b;background:rgba(255,194,78,.18)}     /* warn */
.badge.br{color:#e5618b;background:rgba(229,97,139,.16)}     /* bad */
.badge.bb .bdot{animation:pulse 1.3s ease-in-out infinite}
@keyframes pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.45;transform:scale(.7)}}

/* ---------- CARD GRID ---------- */
.card-grid{display:grid;gap:14px;grid-template-columns:repeat(auto-fill,minmax(320px,1fr))}
.ecard{background:var(--card);border:1.5px solid var(--border-2);border-radius:var(--r-md);padding:16px 18px;box-shadow:var(--shadow-sm);display:flex;flex-direction:column;gap:11px;animation:rise .45s var(--spring) both}
@keyframes rise{from{opacity:0;transform:translateY(16px) scale(.98)}to{opacity:1;transform:none}}
.ecard .top{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
.ecard .nm{font-family:'Quicksand';font-weight:700;font-size:1.05rem;color:var(--ink);line-height:1.2;word-break:break-word}
.ecard .badges{display:flex;flex-wrap:wrap;gap:6px;justify-content:flex-end}
.ecard .meta{display:flex;flex-wrap:wrap;gap:5px 16px;font-size:.8rem;color:var(--ink-soft);font-weight:600}
.ecard .meta b{color:var(--ink);font-weight:800}
.ecard .acts{display:flex;gap:8px;flex-wrap:wrap;margin-top:2px}

/* ---------- STAT TILES ---------- */
.stat-grid{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));margin-bottom:8px}
.stat{background:var(--card);border:1.5px solid var(--border-2);border-radius:var(--r-md);padding:15px 17px;box-shadow:var(--shadow-sm)}
.stat .v{font-family:'Quicksand';font-weight:700;font-size:1.7rem;color:var(--ink);line-height:1}
.stat .v.good{color:#1f8f6b}.stat .v.bad{color:#e5618b}
.stat .l{font-size:.72rem;font-weight:800;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-faint);margin-top:7px}
.metric-section{margin-top:24px}
.metric-section h4{font-family:'Quicksand';font-weight:700;font-size:1.05rem;color:var(--ink);margin-bottom:12px}

/* ---------- MODALS ---------- */
.modal-overlay{position:fixed;inset:0;z-index:70;display:flex;align-items:center;justify-content:center;padding:24px;background:rgba(74,69,102,.3);backdrop-filter:blur(7px);animation:ovfade .2s ease both}
.modal-overlay[hidden]{display:none}
@keyframes ovfade{from{opacity:0}to{opacity:1}}
.modal-card{width:100%;max-width:400px;background:var(--screen);border:1.5px solid var(--border);border-radius:24px;padding:24px;box-shadow:0 40px 100px -30px rgba(74,69,102,.55);animation:toolrise .35s var(--spring) both}
.modal-card.wide{max-width:560px;max-height:88vh;overflow-y:auto}
@keyframes toolrise{from{opacity:0;transform:translateY(26px) scale(.97)}to{opacity:1;transform:none}}
.modal-title{font-family:'Quicksand';font-weight:700;font-size:1.25rem;color:var(--ink);line-height:1.2}
.modal-sub{font-size:.86rem;color:var(--ink-soft);font-weight:600;margin-top:4px}
.modal-err{font-size:.78rem;font-weight:700;color:#e5618b;margin-top:12px;display:none}
.modal-err.show{display:block}
.modal-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:20px}
.modal-btn{font-family:'Nunito';font-weight:800;font-size:.9rem;border-radius:13px;padding:11px 20px;cursor:pointer;border:1.5px solid transparent;transition:filter .2s,border-color .2s,color .2s,transform .2s var(--spring)}
.modal-btn.ghost{background:var(--surface);border-color:var(--border);color:var(--ink-soft)}
.modal-btn.ghost:hover{border-color:var(--lav);color:var(--ink)}
.modal-btn.primary{background:var(--primary);color:#fff;box-shadow:0 8px 18px -7px rgba(255,120,100,.5)}
.modal-btn.primary:hover{filter:brightness(1.05)}
.modal-btn.primary:active{transform:scale(.97)}
.modal-btn.primary:disabled{opacity:.45;cursor:not-allowed;filter:grayscale(.25);box-shadow:none}

/* ---------- FORM FIELDS ---------- */
.fld{margin-top:15px}
.fld>label{display:block;font-size:.7rem;font-weight:800;letter-spacing:.05em;text-transform:uppercase;color:var(--ink-faint);margin-bottom:6px}
.fld .req{color:#e5618b;margin-left:2px}
.fld .hint{font-size:.76rem;color:var(--ink-soft);font-weight:600;margin-top:6px}
.hint code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.82em;background:var(--surface-2);border:1px solid var(--border-2);border-radius:6px;padding:1px 5px}
.inp{font-family:'Nunito';font-weight:600;font-size:.95rem;color:var(--ink);background:var(--surface);border:1.5px solid var(--border);border-radius:12px;padding:10px 13px;outline:none;transition:border-color .2s,box-shadow .2s}
.inp:focus{border-color:var(--lav);box-shadow:0 0 0 4px rgba(169,156,255,.16)}
.inp:disabled{opacity:.5;cursor:not-allowed}
.inp.full{width:100%}
textarea.inp{resize:vertical;min-height:64px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.84rem}
select.inp{cursor:pointer}

/* ---------- LOGIN MODAL (shared account login popup) ---------- */
.login-card{max-width:392px;text-align:center}
.login-brand{display:flex;justify-content:center;margin-bottom:14px}
.login-brand-mark{width:56px;height:56px;border-radius:18px;display:grid;place-items:center;color:#fff;background:var(--primary);box-shadow:0 14px 28px -10px rgba(255,120,100,.6),inset 0 1px 0 rgba(255,255,255,.3)}
.login-brand-mark svg{width:28px;height:28px}
.login-title{text-align:center}
.login-sub{text-align:center;margin-bottom:22px}
.login-oauth-btn{width:100%;display:flex;align-items:center;justify-content:center;gap:10px;font-family:'Nunito';font-weight:800;font-size:.92rem;color:var(--ink);background:var(--surface);border:1.5px solid var(--border);border-radius:13px;padding:11px 16px;cursor:pointer;transition:border-color .2s,background .15s,transform .2s var(--spring),box-shadow .2s}
.login-oauth-btn:hover{border-color:var(--lav);background:var(--surface-3);transform:translateY(-1px);box-shadow:var(--shadow-sm)}
.login-oauth-btn:active{transform:scale(.98)}
.login-oauth-btn svg{flex:none}
.login-divider{display:flex;align-items:center;gap:12px;margin:18px 0;color:var(--ink-faint);font-size:.72rem;font-weight:800;text-transform:uppercase;letter-spacing:.08em}
.login-divider::before,.login-divider::after{content:"";flex:1;height:1.5px;background:var(--border)}
.login-fields{display:flex;flex-direction:column;gap:10px}
.login-actions{margin-top:18px;justify-content:stretch}
.login-actions .modal-btn{flex:1}
.modal-ok{font-size:.8rem;font-weight:700;color:#3fb796;margin-top:12px;line-height:1.4;display:none}
.modal-ok.show{display:block}
.login-links{display:flex;align-items:center;justify-content:center;gap:10px;margin-top:18px;font-size:.82rem;font-weight:700}
.login-links a{color:var(--accent-ink);text-decoration:none;transition:color .15s}
.login-links a:hover{color:var(--accent-ink2);text-decoration:underline}
.login-links-sep{color:var(--ink-faint)}
/* ---- per-mode visibility (data-mode on .login-card: login | register | forgot) ---- */
/* Mode-specific fields/links are hidden by default, then revealed for their mode. */
.login-card .lf-name,.login-card .lf-confirm{display:none}
.login-card[data-mode="register"] .lf-name,.login-card[data-mode="register"] .lf-confirm{display:block}
/* Forgot mode drops the OAuth button, the divider and the password field. */
.login-card[data-mode="forgot"] .lf-oauth,.login-card[data-mode="forgot"] .lf-divider,.login-card[data-mode="forgot"] .lf-pass{display:none}
/* Footer links: only the relevant ones per mode. */
.login-card .login-links a,.login-card .login-links .login-links-sep{display:none}
.login-card[data-mode="login"] .lf-to-forgot,.login-card[data-mode="login"] .lf-to-register,.login-card[data-mode="login"] .lf-sep-login{display:inline}
.login-card[data-mode="register"] .lf-to-login,.login-card[data-mode="forgot"] .lf-to-login{display:inline}

/* ---------- TOAST ---------- */
.toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%) translateY(120px);z-index:90;font-family:'Nunito';font-weight:800;font-size:.88rem;color:#fff;padding:12px 22px;border-radius:14px;box-shadow:0 16px 40px -12px rgba(0,0,0,.4);transition:transform .3s var(--spring),opacity .3s;opacity:0;pointer-events:none}
.toast.show{transform:translateX(-50%) translateY(0);opacity:1}
.toast.ok{background:linear-gradient(135deg,#3fb796,#37a0b0)}
.toast.err{background:linear-gradient(135deg,#e5618b,#e2606a)}
