:root{color-scheme:dark;--bg:#000;--panel:#0d0d0f;--panel2:#1c1c1e;--line:#26262a;--ink:#f5f5f7;--mut:#8e8e93;--me:#2f6feb;--them:#26262a;--ok:#30d158;--warn:#e0a53a;--emerg:#e0443a;--sep:#2a2a2e}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}html,body{margin:0;height:100%}
body{font:17px/1.3 -apple-system,system-ui,"Segoe UI",Roboto,sans-serif;background:#000;color:var(--ink);-webkit-text-size-adjust:100%;overscroll-behavior:none}
button{font-family:inherit;font:inherit;color:inherit}
#app{position:relative;display:flex;flex-direction:column;height:100vh;height:100vh;max-width:560px;margin:0 auto;overflow:hidden}
@supports(height:100vh){#app{height:100vh}}
/* ---- screens (only .active is shown) ---- */
.screen{position:absolute;inset:0;display:none;flex-direction:column;background:#000}
.screen.active{display:flex}
/* The list screens leave room at the bottom for the shared tab bar (which floats above them). */
#scr-msgs.active,#scr-contacts.active{padding-bottom:calc(54px + env(safe-area-inset-bottom))}

/* big-title screen header (Messages / Contacts) */
header{flex:none;display:flex;align-items:center;gap:10px;padding:10px 14px;padding-top:calc(10px + env(safe-area-inset-top));background:var(--panel);border-bottom:1px solid var(--line)}
header.bigtitle{padding-top:calc(16px + env(safe-area-inset-top));border-bottom:0}
.bigtitle .brand{font-weight:800;font-size:32px;letter-spacing:-.5px;display:flex;align-items:center;gap:9px}
.sig{width:10px;height:10px;border-radius:50%;background:var(--warn);box-shadow:0 0 0 3px rgba(224,165,58,.15);flex:none}
.sig.live{background:var(--ok);box-shadow:0 0 0 3px rgba(48,209,88,.15)}
.net{margin-left:auto;font-size:12px;color:var(--mut)}
header .net{margin-left:auto}
.bigtitle .net{margin-left:12px;font-size:12px}
.iconbtn{background:var(--panel2);border:0;color:var(--ink);font-size:18px;cursor:pointer;width:34px;height:34px;border-radius:50%;line-height:1;display:flex;align-items:center;justify-content:center;flex:none}
.iconbtn:active{opacity:.6}

/* search */
.search{flex:none;padding:2px 12px 8px;background:var(--panel)}
.search input{width:100%;background:var(--panel2);border:0;border-radius:10px;color:var(--ink);font-size:16px;padding:8px 12px;outline:none}

/* ---- list (conversations + contacts) ---- */
.list{flex:1;overflow-y:auto;background:#000}
.rows{list-style:none;margin:0;padding:0}
.secttl{color:var(--mut);font-size:12px;text-transform:uppercase;letter-spacing:.04em;padding:16px 16px 6px;font-weight:600}
.row{position:relative;display:flex;align-items:center;gap:12px;padding:0;border-bottom:1px solid var(--sep);background:#000;cursor:pointer;overflow:hidden}
.row .front{padding:10px 14px}
.row .dot{width:10px;height:10px;border-radius:50%;background:var(--mut);flex:none;visibility:hidden}
.row.unread .dot{background:#fff;visibility:visible}
.av{width:48px;height:48px;border-radius:50%;background:var(--them);display:flex;align-items:center;justify-content:center;font-weight:600;font-size:19px;color:#dfe6ef;flex:none;position:relative}
.av.grp{background:linear-gradient(135deg,#3a4a63,#26303f)}
.av .grp-ic{position:absolute;right:-2px;bottom:-2px;width:20px;height:20px;border-radius:50%;background:#000;display:flex;align-items:center;justify-content:center;font-size:12px}
.rmain{flex:1;min-width:0}
.rtop{display:flex;align-items:baseline;gap:8px}
.rname{font-weight:600;font-size:17px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rtime{margin-left:auto;color:var(--mut);font-size:13px;flex:none}
.rtime.unread{color:#fff}
.rsnip{color:var(--mut);font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:2px}
.row.unread .rsnip{color:#c9c9cf}
.chev{color:#4a4a4e;font-size:20px;flex:none}
/* swipe-to-delete: a red action revealed under the sliding row; hidden until the front slides. */
.row .swipe-bg{position:absolute;top:0;bottom:0;right:0;width:88px;background:var(--emerg);color:#fff;display:flex;align-items:center;justify-content:flex-end;padding-right:20px;font-size:14px;opacity:0;transition:opacity .18s;z-index:0}
.row.open .swipe-bg,.row.swiping .swipe-bg{opacity:1}
.row .front{position:relative;z-index:1;display:flex;align-items:center;gap:12px;width:100%;background:#000;transition:transform .18s}
.empty{margin:auto;text-align:center;color:var(--mut);max-width:280px;padding:40px 20px}
.empty h2{color:var(--ink);font-size:22px;margin:0 0 6px;font-weight:700}

/* offline bar */
.offbar{display:none;gap:8px;align-items:center;background:#3a2f12;color:#ffe6a3;font-size:13px;padding:8px 14px;border-top:1px solid #5a4a12;flex:none}
.offbar.show{display:flex}

/* ---- bottom tab bar ---- */
.tabbar{position:absolute;left:0;right:0;bottom:0;z-index:8;display:flex;background:rgba(13,13,15,.94);border-top:1px solid var(--line);padding-bottom:env(safe-area-inset-bottom);backdrop-filter:blur(12px)}
#app:has(#scr-thread.active) > .tabbar{display:none}
.tabbar .tb{flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;padding:8px 0 6px;color:var(--mut);font-size:11px;cursor:pointer;border:0;background:none}
.tabbar .tb .ic{font-size:22px;line-height:1}
.tabbar .tb.on{color:#fff}

/* ---- thread (detail) ---- */
header.nav{padding-top:calc(8px + env(safe-area-inset-top));position:relative;justify-content:space-between}
header.nav .back{background:none;border:0;color:var(--me);font-size:17px;cursor:pointer;padding:6px 4px;display:flex;align-items:center;flex:none}
header.nav .who{position:absolute;left:50%;transform:translateX(-50%);display:flex;flex-direction:column;align-items:center;gap:2px;max-width:50%}
header.nav .who .av{width:34px;height:34px;font-size:14px}
header.nav .who .tname{font-size:12px;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
main#thread{flex:1;overflow-y:auto;padding:12px 12px 4px;display:flex;flex-direction:column}
.day{text-align:center;color:var(--mut);font-size:11px;font-weight:600;margin:14px 0 10px}
.day b{color:#c9c9cf;font-weight:700}
/* a message row: bubble + a hidden timestamp that slides in on drag */
.mrow{display:flex;align-items:center;gap:8px;margin:3px 0;max-width:100%}
.mrow.me{justify-content:flex-end}
.mrow .stamp{font-size:11px;color:var(--mut);white-space:nowrap;overflow:hidden;max-width:0;opacity:0;transition:max-width .18s,opacity .18s}
.mrow.reveal .stamp{max-width:96px;opacity:1}
.mrow.me .stamp{order:-1;margin-right:6px}
.mrow.them .stamp{order:1;margin-left:6px}
.bub{max-width:78%;padding:9px 14px;border-radius:19px;word-wrap:break-word;white-space:pre-wrap;transition:transform .18s}
.mrow.me .bub{background:var(--me);color:#fff;border-bottom-right-radius:6px}
.mrow.them .bub{background:var(--them);color:var(--ink);border-bottom-left-radius:6px}
.mrow.me.emerg .bub{background:var(--emerg)}
.mrow.reveal .bub{transform:translateX(-8px)}
.mrow.them.reveal .bub{transform:translateX(8px)}
/* tight grouping of consecutive same-sender bubbles (iMessage clusters) */
.mrow.gap-before{margin-top:10px}
/* status lives OUTSIDE/below the bubble, in a subtle font, with breathing room */
.mstatus{align-self:flex-end;color:var(--mut);font-size:11px;margin:2px 12px 8px;letter-spacing:.01em}
.mstatus.t-wait{color:#ffd98a}.mstatus.t-fwd{color:#9fc6ff}.mstatus.t-del{color:#8fdca4}

/* ---- composer ---- */
footer{flex:none;display:flex;gap:8px;align-items:flex-end;background:var(--panel);border-top:1px solid var(--line);padding:8px 10px;padding-bottom:calc(8px + env(safe-area-inset-bottom))}
footer textarea#b{flex:1}
#b{flex:1;resize:none;max-height:30vh;font:17px/1.3 -apple-system,system-ui;background:var(--panel2);color:var(--ink);border:1px solid var(--line);border-radius:19px;padding:10px 14px;outline:none}
#b:focus{border-color:#33507a}
#send{flex:none;width:44px;height:44px;border-radius:50%;border:0;background:var(--me);color:#fff;font-size:20px;cursor:pointer;display:flex;align-items:center;justify-content:center}
#send:active{transform:scale(.94)}
.plus{flex:none;width:36px;height:36px;border-radius:50%;border:1px solid var(--line);background:var(--panel2);color:var(--mut);font-size:22px;line-height:1;cursor:pointer}
.plus.on{background:var(--me);color:#fff;border-color:var(--me)}
.xtra{display:none;flex-wrap:wrap;gap:8px;background:var(--panel);border-top:1px solid var(--line);padding:10px 10px 2px}
.xtra.show{display:flex}
.chips{display:flex;flex-wrap:wrap;gap:6px;overflow-x:auto;width:100%}
.chip{flex:none;font-size:14px;background:var(--panel2);border:1px solid var(--line);border-radius:999px;padding:6px 12px;color:#cdd9e6;cursor:pointer}
.urg{display:flex;gap:6px;margin-bottom:8px;width:100%}
.urg .u{flex:1;text-align:center;font-size:14px;padding:7px;border:1px solid var(--line);border-radius:11px;background:var(--panel2);color:var(--mut);cursor:pointer}
.urg .u.on{background:var(--me);color:#fff;border-color:var(--me)}
.urg .u.on.emerg{background:var(--emerg);border-color:var(--emerg)}
.optline{font-size:12px;color:var(--mut);margin:6px 2px 0;display:flex;align-items:center;gap:6px;width:100%}

/* ---- bottom sheets (add contact / contact detail / mesh status) ---- */
.scrim{position:fixed;inset:0;background:rgba(0,0,0,.55);opacity:0;pointer-events:none;transition:opacity .2s;z-index:20}
.scrim.show{opacity:1;pointer-events:auto}
.sheet{position:fixed;left:0;right:0;bottom:0;margin:0 auto;max-width:560px;max-height:82vh;overflow:auto;background:var(--panel);border-top-left-radius:18px;border-top-right-radius:18px;border-top:1px solid var(--line);transform:translateY(100%);visibility:hidden;transition:transform .26s cubic-bezier(.2,.8,.2,1),visibility 0s .26s;z-index:21;padding-bottom:calc(12px + env(safe-area-inset-bottom))}
.sheet.show{transform:translateY(0);visibility:visible;transition:transform .26s cubic-bezier(.2,.8,.2,1),visibility 0s}
.grab{width:38px;height:4px;border-radius:2px;background:var(--line);margin:8px auto 0}
.shead{display:flex;align-items:center;justify-content:space-between;font-weight:700;font-size:17px;padding:10px 16px 4px}
.shead button{background:none;border:0;color:var(--mut);font-size:18px;cursor:pointer}
.sbody{padding:4px 16px 8px}
.crow{display:flex;justify-content:space-between;gap:12px;padding:9px 0;border-bottom:1px solid var(--sep);font-size:15px}
.ck{color:var(--mut)}
.stitle{color:var(--mut);font-size:11px;text-transform:uppercase;letter-spacing:.05em;margin:16px 0 4px}
.sPaths{display:flex;flex-direction:column;gap:4px}
.plink{display:flex;align-items:center;gap:8px;font-size:13px;padding:5px 0;border-bottom:1px solid var(--sep)}
.plink .dot{width:9px;height:9px;border-radius:50%}
.plink .up{background:var(--ok)}.plink .down{background:#e5533c}
.plink .via{color:var(--ink)}.plink .num{margin-left:auto;color:var(--mut);font-size:12px}
.mono{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px;word-break:break-all;color:#c9c9cf}
.hint{color:var(--mut);font-size:13px;margin:0 0 10px}
.fld{display:block;width:100%;background:var(--panel2);border:1px solid var(--line);border-radius:11px;color:var(--ink);font-size:16px;padding:11px 12px;margin-bottom:10px;outline:none;letter-spacing:.04em}
.fld:focus{border-color:#33507a}
.amsg{font-size:13px;min-height:18px;margin:2px 0 8px}
.amsg.ok{color:var(--ok)}.amsg.err{color:#ff8a7a}
#s_pair{background:var(--panel2);border:1px solid var(--line);border-radius:11px;padding:10px;font-size:13px}
.sbtn{background:var(--panel2);border:1px solid var(--line);color:var(--ink);border-radius:11px;padding:9px 16px;font-size:15px;cursor:pointer}
.sbtn.primary{background:var(--me);border-color:var(--me);color:#fff;font-weight:600;width:100%}
.sbtn.danger{background:transparent;border-color:#5a2a26;color:#ff8a7a}
.cacts{display:flex;gap:10px;margin-top:14px}
.cacts .sbtn{flex:1}
.cacts .sbtn.primary{width:auto}
.crow2{display:flex;align-items:center;gap:12px;padding:8px 0}
