:root{--bg-primary: #ffffff;--bg-secondary: #f7f6f3;--bg-hover: #efede9;--text-primary: #37352f;--text-secondary: #787774;--border: #e9e9e7;--accent: #007aff;--accent-solid: #007aff;--accent-hover: #0067db;--accent-soft: #eaf3ff;--on-accent: #ffffff;--success: #448361;--success-soft: #eaf3ee;--danger: #e03e3e;--danger-soft: #fbecec;--warn: #b25e09;--warn-soft: #fbf0e5;--font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;--font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--sp-1: 4px;--sp-2: 8px;--sp-3: 12px;--sp-4: 16px;--sp-5: 24px;--sp-6: 32px;--sp-7: 48px;--radius-sm: 6px;--radius: 8px;--radius-lg: 12px;--shadow-hover: 0 1px 3px rgba(0, 0, 0, .08), 0 1px 2px rgba(0, 0, 0, .06);--ring: 0 0 0 2px var(--bg-primary), 0 0 0 4px var(--accent);--tap: 44px;--sidebar-w: 248px;--sidebar-w-collapsed: 68px;--content-max: 640px;color-scheme:light}@media (prefers-color-scheme: dark){:root{--bg-primary: #191919;--bg-secondary: #202020;--bg-hover: #2a2a2a;--text-primary: #e9e9e7;--text-secondary: #9b9a97;--border: #2f2f2f;--accent: #4c9fff;--accent-solid: #0a84ff;--accent-hover: #3b93f5;--accent-soft: #17293c;--on-accent: #ffffff;--success: #6bbb8c;--success-soft: #17251d;--danger: #eb5757;--danger-soft: #2a1717;--warn: #e2a13b;--warn-soft: #2a2110;color-scheme:dark}}*{box-sizing:border-box}html,body{margin:0;height:100%}body{background:var(--bg-primary);color:var(--text-primary);font:16px/1.55 var(--font-sans);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}#app{min-height:100%}.icon{flex:0 0 auto;display:block}.mono{font-family:var(--font-mono)}.muted{color:var(--text-secondary)}.center{text-align:center}.small{font-size:13px}.spacer{flex:1}.stack{display:flex;flex-direction:column;gap:var(--sp-4)}.hero-title{font-size:28px;line-height:1.25;font-weight:700;letter-spacing:-.02em;margin:0}.page-title{font-size:24px;line-height:1.3;font-weight:700;letter-spacing:-.02em;margin:0}.section-title{font-size:16px;font-weight:600;letter-spacing:-.01em;margin:0}.lead{color:var(--text-secondary);font-size:15px;margin:0}.app-shell{min-height:100%;display:grid;grid-template-columns:var(--sidebar-w) 1fr}.app-shell.is-collapsed{grid-template-columns:var(--sidebar-w-collapsed) 1fr}.sidebar{position:sticky;top:0;align-self:start;height:100vh;height:100dvh;display:flex;flex-direction:column;gap:var(--sp-2);padding:var(--sp-5) var(--sp-3) calc(var(--sp-4) + env(safe-area-inset-bottom)) var(--sp-3);padding-left:max(var(--sp-3),env(safe-area-inset-left));border-right:1px solid var(--border);background:var(--bg-secondary);overflow:hidden}.side-brand{padding:var(--sp-2) var(--sp-2) var(--sp-4)}.side-nav{display:flex;flex-direction:column;gap:2px}.side-link,.side-toggle{display:flex;align-items:center;gap:var(--sp-3);min-height:var(--tap);padding:var(--sp-2) var(--sp-3);border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text-secondary);font:inherit;font-size:14px;font-weight:500;text-align:left;cursor:pointer;white-space:nowrap;transition:background .12s ease,color .12s ease}.side-link:hover,.side-toggle:hover{background:var(--bg-hover);color:var(--text-primary)}.side-link.is-active{background:var(--accent-soft);color:var(--accent);font-weight:600}.is-collapsed .side-label,.is-collapsed .brand-name{display:none}.is-collapsed .side-brand{padding-left:0;padding-right:0;display:flex;justify-content:center}.content{min-width:0;padding:var(--sp-6) var(--sp-5) calc(var(--sp-7) + env(safe-area-inset-bottom));padding-right:max(var(--sp-5),env(safe-area-inset-right))}.content-inner{max-width:var(--content-max);margin:0 auto;display:flex;flex-direction:column;gap:var(--sp-5)}.tabbar{display:none}.brand{display:flex;align-items:center;gap:var(--sp-2)}.brand .logo{width:30px;height:30px;object-fit:contain}.brand-name{font-size:18px;font-weight:700;letter-spacing:-.02em}.page-header{display:flex;align-items:center;gap:var(--sp-2)}.back-btn{display:inline-flex;align-items:center;justify-content:center;width:var(--tap);height:var(--tap);margin-left:calc(var(--sp-2) * -1);border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text-secondary);cursor:pointer;transition:background .12s ease,color .12s ease}.back-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.card{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius);padding:var(--sp-4);display:flex;flex-direction:column;gap:var(--sp-4)}.empty-state{align-items:center;text-align:center;gap:var(--sp-3);color:var(--text-secondary);padding:var(--sp-6) var(--sp-4)}.empty-state .icon{color:var(--text-secondary);opacity:.6}.empty-state p{margin:0}.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--sp-2);min-height:var(--tap);padding:var(--sp-3) var(--sp-4);font:inherit;font-size:15px;font-weight:600;border:1px solid transparent;border-radius:var(--radius);cursor:pointer;transition:background .12s ease,border-color .12s ease,transform .04s ease,box-shadow .12s ease}.btn:active{transform:translateY(1px)}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-primary{background:var(--accent-solid);color:var(--on-accent)}.btn-primary:hover:not(:disabled){background:var(--accent-hover);box-shadow:var(--shadow-hover)}.btn-ghost{background:var(--bg-primary);color:var(--text-primary);border-color:var(--border)}.btn-ghost:hover:not(:disabled){background:var(--bg-hover)}.btn-danger{background:transparent;color:var(--danger);border-color:var(--danger)}.btn-danger:hover:not(:disabled){background:var(--danger-soft)}.btn-row{display:flex;flex-wrap:wrap;gap:var(--sp-2)}.btn-row .btn{flex:1;min-width:160px}.danger-zone{margin-top:var(--sp-2);padding-top:var(--sp-4);border-top:1px solid var(--border)}.danger-zone .btn{width:100%}textarea,input[type=text],input[type=email],input[type=tel],input[type=date]{font:inherit;font-size:15px;width:100%;min-height:var(--tap);background:var(--bg-primary);color:var(--text-primary);border:1px solid var(--border);border-radius:var(--radius-sm);padding:var(--sp-3);resize:vertical;transition:border-color .12s ease,box-shadow .12s ease}textarea:focus,input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}textarea::placeholder,input::placeholder{color:var(--text-secondary)}.row{display:flex;gap:var(--sp-3)}.row>*{flex:1}.form-field{display:flex;flex-direction:column;gap:var(--sp-2)}.field-label{color:var(--text-secondary);font-size:13px;font-weight:500}.field{display:flex;justify-content:space-between;gap:var(--sp-3);font-size:14px}.field-value{color:var(--text-primary);text-align:right}.checkbox{display:flex;align-items:flex-start;gap:var(--sp-3);font-size:14px}.checkbox input{width:auto;min-height:0;margin-top:3px;accent-color:var(--accent)}.id-box{background:var(--bg-primary);border:1px solid var(--border);border-radius:var(--radius-sm);padding:var(--sp-3);word-break:break-all;font-size:13px;line-height:1.5}.phrase{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--sp-2)}.word{display:flex;gap:var(--sp-2);align-items:baseline;background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);padding:var(--sp-2) var(--sp-3);font-size:14px}.word-n{color:var(--text-secondary);min-width:16px;text-align:right;font-size:12px;font-variant-numeric:tabular-nums}.word-t{font-weight:500}.notice{display:flex;gap:var(--sp-2);border-radius:var(--radius);padding:var(--sp-3) var(--sp-4);font-size:14px;line-height:1.5;border:1px solid transparent}.notice-warn{border-color:color-mix(in srgb,var(--warn) 35%,transparent);background:var(--warn-soft);color:var(--warn)}.notice-danger{border-color:color-mix(in srgb,var(--danger) 35%,transparent);background:var(--danger-soft);color:var(--danger)}.avatar{border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:700;flex:0 0 auto}.profile-head{display:flex;align-items:center;gap:var(--sp-3)}.profile-id{min-width:0}.profile-name{font-size:18px;font-weight:700;letter-spacing:-.01em}.friend-list{display:flex;flex-direction:column;gap:var(--sp-2)}.friend-row{display:flex;align-items:center;gap:var(--sp-3);text-align:left;width:100%;min-height:var(--tap);background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius);padding:var(--sp-3);color:var(--text-primary);font:inherit;cursor:pointer;transition:background .12s ease,box-shadow .12s ease}.friend-row:hover{background:var(--bg-hover);box-shadow:var(--shadow-hover)}.friend-meta{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}.friend-name{font-weight:600}.friend-status{display:flex;align-items:center;gap:var(--sp-2)}.friend-row>.icon{color:var(--text-secondary)}.status-dot{width:7px;height:7px;border-radius:50%;background:var(--text-secondary);flex:0 0 auto}.status-dot.status-on{background:var(--success)}.qr-card{align-self:center;background:#fff;padding:var(--sp-4);border:1px solid var(--border);border-radius:var(--radius)}.qr{display:block;width:220px;height:220px;max-width:100%;image-rendering:pixelated}.diag-body{display:flex;flex-direction:column;gap:var(--sp-5)}.pill-row{display:flex;flex-wrap:wrap;gap:var(--sp-2)}.pill{display:inline-flex;align-items:center;gap:var(--sp-2);padding:var(--sp-1) var(--sp-3);border-radius:999px;font-size:12px;font-weight:600;border:1px solid var(--border);color:var(--text-secondary);background:var(--bg-primary)}.pill:before{content:"";width:7px;height:7px;border-radius:50%;background:currentColor}.pill-ok{color:var(--success);border-color:color-mix(in srgb,var(--success) 30%,transparent);background:var(--success-soft)}.pill-bad{color:var(--danger);border-color:color-mix(in srgb,var(--danger) 30%,transparent);background:var(--danger-soft)}.pill-warn{color:var(--warn);border-color:color-mix(in srgb,var(--warn) 30%,transparent);background:var(--warn-soft)}.pill-idle{color:var(--text-secondary)}.stat-row{display:flex;gap:var(--sp-3)}.stat-tile{flex:1;background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius);padding:var(--sp-3) var(--sp-2);text-align:center}.stat-value{font-size:26px;font-weight:700;line-height:1.1;font-variant-numeric:tabular-nums}.stat-ok{color:var(--success)}.stat-warn{color:var(--warn)}.stat-idle{color:var(--text-primary)}.legend{display:flex;flex-wrap:wrap;gap:var(--sp-4);justify-content:center;margin-top:var(--sp-2)}.net-graph{display:block;margin:0 auto;max-width:340px}.ng-edge{stroke:var(--border)}.ng-edge-on{stroke:var(--success)}.ng-node{fill:var(--bg-primary);stroke:var(--border);stroke-width:2}.ng-node-on{fill:var(--success);stroke:var(--success)}.ng-ring{fill:none;stroke:var(--text-secondary);stroke-width:1.5;opacity:.6}.ng-ring-on{stroke:var(--success)}.ng-label{fill:var(--text-primary)}.ng-label-on{fill:#fff}.ng-me{fill:var(--accent-solid);stroke:var(--bg-secondary);stroke-width:3}.ng-me-label{fill:var(--on-accent)}.ng-badge{fill:var(--accent);stroke:var(--bg-secondary);stroke-width:1.5}.screen-centered{min-height:100%;display:flex;justify-content:center;align-items:flex-start;padding:var(--sp-6) var(--sp-4) calc(var(--sp-6) + env(safe-area-inset-bottom))}.centered-inner{width:100%;max-width:420px;display:flex;flex-direction:column;gap:var(--sp-4)}.screen-centered .card,.skeleton{gap:var(--sp-3)}.skel-line{height:14px;border-radius:var(--radius-sm);background:linear-gradient(90deg,var(--bg-hover) 25%,var(--border) 37%,var(--bg-hover) 63%);background-size:400% 100%;animation:skel-shimmer 1.4s ease infinite}.skel-line-short{width:55%}@keyframes skel-shimmer{0%{background-position:100% 0}to{background-position:0 0}}.toast{position:fixed;left:50%;bottom:calc(24px + env(safe-area-inset-bottom));transform:translate(-50%) translateY(8px);background:var(--text-primary);color:var(--bg-primary);padding:var(--sp-3) var(--sp-4);border-radius:999px;font-size:14px;font-weight:500;box-shadow:0 4px 16px #0000002e;opacity:0;transition:opacity .2s ease,transform .2s ease;pointer-events:none;z-index:60}.toast.show{opacity:1;transform:translate(-50%) translateY(0)}.scan-overlay{position:fixed;inset:0;background:#000;z-index:50;display:flex;align-items:center;justify-content:center}.scan-video{width:100%;height:100%;object-fit:cover}.scan-frame{position:absolute;width:240px;height:240px;border:3px solid rgba(255,255,255,.9);border-radius:20px}.scan-hint{position:absolute;bottom:120px;color:#fff;background:#00000080;padding:var(--sp-2) var(--sp-4);border-radius:999px;font-size:14px}.scan-cancel{position:absolute;bottom:calc(40px + env(safe-area-inset-bottom));color:#fff;border-color:#fff9;background:transparent}:focus-visible{outline:none;box-shadow:var(--ring);border-radius:var(--radius-sm)}.btn:focus-visible,.friend-row:focus-visible,.side-link:focus-visible,.tab:focus-visible{box-shadow:var(--ring)}input:focus-visible,textarea:focus-visible{box-shadow:0 0 0 3px var(--accent-soft)}@media (max-width: 767px){.app-shell,.app-shell.is-collapsed{display:block;grid-template-columns:none}.sidebar{display:none}.content{padding:var(--sp-5) var(--sp-4) calc(72px + env(safe-area-inset-bottom));padding-left:max(var(--sp-4),env(safe-area-inset-left));padding-right:max(var(--sp-4),env(safe-area-inset-right))}.content-inner{max-width:560px;gap:var(--sp-4)}.tabbar{position:fixed;left:0;right:0;bottom:0;display:flex;background:color-mix(in srgb,var(--bg-primary) 88%,transparent);border-top:1px solid var(--border);padding:var(--sp-1) var(--sp-2) calc(var(--sp-1) + env(safe-area-inset-bottom));padding-left:max(var(--sp-2),env(safe-area-inset-left));padding-right:max(var(--sp-2),env(safe-area-inset-right));backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);z-index:40}.tab{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;min-height:var(--tap);padding:var(--sp-2) var(--sp-1);background:transparent;border:none;border-radius:var(--radius-sm);color:var(--text-secondary);font:inherit;cursor:pointer}.tab-label{font-size:11px;font-weight:600}.tab.is-active{color:var(--accent)}.field{flex-direction:column;gap:2px}.field-value{text-align:left}.btn-row .btn{min-width:120px}.toast{bottom:calc(84px + env(safe-area-inset-bottom))}}@media (min-width: 1200px){:root{--content-max: 720px}.content{padding-top:var(--sp-7)}}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}.skel-line{animation:none;background:var(--bg-hover)}}
