:root{--bg:#0a0f14;--bg-elevated:#111820;--bg-panel:#151d27;--bg-panel-2:#1a2430;--line:#94a3b824;--line-strong:#94a3b847;--text:#e8eef6;--text-soft:#c5d0de;--muted:#8b9bb0;--accent:#1d9e75;--accent-soft:#1d9e7524;--accent-strong:#24c48f;--gold:#c9a227;--gold-soft:#c9a22724;--danger:#e25b5b;--danger-soft:#e25b5b24;--ok:#2eb87a;--ok-soft:#2eb87a24;--warn:#e0a21a;--warn-soft:#e0a21a29;--info:#3b82f6;--info-soft:#3b82f624;--chart-1:#1d9e75;--chart-2:#3b82f6;--chart-3:#c9a227;--chart-4:#a78bfa;--chart-5:#f472b6;--font-display:"Manrope", "Segoe UI", sans-serif;--font-body:"IBM Plex Sans", "Segoe UI", sans-serif;--radius:12px;--radius-sm:8px;--shadow:0 10px 40px #00000059;--sidebar-w:248px}*{box-sizing:border-box}html,body,#root{min-height:100%}body{font-family:var(--font-body);color:var(--text);-webkit-font-smoothing:antialiased;background:radial-gradient(900px 420px at 0 -5%,#1d9e751f,#0000 55%),radial-gradient(700px 380px at 100% 0,#3b82f614,#0000 50%),linear-gradient(#0a0f14 0%,#0d131a 100%);margin:0}a{color:inherit;text-decoration:none}button,input,select,textarea{font:inherit}.app-shell{grid-template-columns:var(--sidebar-w) 1fr;min-height:100vh;display:grid}.sidebar{border-right:1px solid var(--line);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);background:#080c12eb;flex-direction:column;gap:.25rem;height:100vh;padding:1.35rem 1rem;display:flex;position:sticky;top:0}.brand{font-family:var(--font-display);letter-spacing:-.03em;margin-bottom:.15rem;padding:0 .5rem;font-size:1.2rem;font-weight:700}.brand span{color:var(--accent-strong)}.brand-sub{color:var(--muted);letter-spacing:.04em;text-transform:uppercase;margin:0 0 1.35rem;padding:0 .5rem;font-size:.78rem;font-weight:600}.nav{flex-direction:column;flex:1;gap:.25rem;display:flex}.nav a{border-radius:var(--radius-sm);color:var(--muted);align-items:center;gap:.7rem;padding:.72rem .85rem;font-size:.92rem;font-weight:600;transition:background .15s,color .15s;display:flex}.nav a .nav-icon{opacity:.75;flex-shrink:0;width:18px;height:18px}.nav a.active,.nav a:hover{background:var(--accent-soft);color:var(--text)}.nav a.active .nav-icon,.nav a:hover .nav-icon{opacity:1;color:var(--accent-strong)}.main{min-width:0;padding:1.15rem 1.5rem 2rem}.topbar{border:1px solid var(--line);border-radius:var(--radius);background:#111820b3;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:1rem;margin-bottom:1.35rem;padding:.85rem 1rem;display:flex}.topbar-user{flex-direction:column;gap:.1rem;display:flex}.topbar-user strong{font-family:var(--font-display);font-size:.98rem}.topbar select{border-radius:var(--radius-sm);border:1px solid var(--line);background:var(--bg-elevated);min-height:42px;color:var(--text);padding:.45rem .75rem}.panel{border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);background:linear-gradient(#1a2430f2,#111820fa);padding:1.15rem 1.25rem}.panel-header{justify-content:space-between;align-items:flex-start;gap:1rem;margin-bottom:1rem;display:flex}.panel-header h2{margin:0;font-size:1.05rem}.panel-header .muted{margin:.2rem 0 0;font-size:.82rem}h1,h2{font-family:var(--font-display);letter-spacing:-.03em;margin:0 0 .75rem}h1{font-size:1.65rem;font-weight:700}h2{font-size:1.05rem;font-weight:700}.page-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:.85rem;margin-bottom:.25rem;display:flex}.page-header p{margin:.2rem 0 0}.muted{color:var(--muted)}.grid-stats{grid-template-columns:repeat(auto-fit,minmax(168px,1fr));gap:.85rem;display:grid}.grid-2{grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:.75rem 1rem;display:grid}.grid-dash{grid-template-columns:repeat(12,1fr);gap:1rem;display:grid}.dash-span-4{grid-column:span 4}.dash-span-6{grid-column:span 6}.dash-span-8{grid-column:span 8}.dash-span-12{grid-column:span 12}.kpi{border-radius:var(--radius);border:1px solid var(--line);box-shadow:var(--shadow);background:linear-gradient(160deg,#1a2430fa,#0f161efa);min-height:108px;padding:1.05rem 1.1rem;position:relative;overflow:hidden}.kpi:before{content:"";background:var(--accent);width:3px;position:absolute;inset:0 auto 0 0}.kpi.tone-warn:before{background:var(--warn)}.kpi.tone-danger:before{background:var(--danger)}.kpi.tone-info:before{background:var(--info)}.kpi.tone-gold:before{background:var(--gold)}.kpi .label{color:var(--muted);letter-spacing:.03em;text-transform:uppercase;font-size:.78rem;font-weight:600}.kpi .value{font-family:var(--font-display);letter-spacing:-.03em;margin-top:.35rem;font-size:1.85rem;font-weight:700;line-height:1.1}.kpi .hint{color:var(--muted);margin-top:.4rem;font-size:.78rem}.stat{border-radius:var(--radius-sm);border:1px solid var(--line);background:#ffffff06;padding:1rem}.stat .label{color:var(--muted);font-size:.85rem}.stat .value{font-family:var(--font-display);margin-top:.25rem;font-size:1.8rem;font-weight:700}.chart-box{width:100%;height:280px;min-height:240px}.chart-box.sm{height:240px}.btn{border-radius:var(--radius-sm);color:#04150f;cursor:pointer;background:linear-gradient(#24c48f,#1d9e75);border:none;justify-content:center;align-items:center;gap:.4rem;min-height:44px;padding:.65rem 1.05rem;font-weight:700;transition:filter .15s,transform .1s;display:inline-flex}.btn:hover:not(:disabled){filter:brightness(1.06)}.btn:disabled{opacity:.55;cursor:not-allowed}.btn.secondary{color:var(--text);border:1px solid var(--line-strong);background:0 0}.btn.danger{background:var(--danger);color:#fff}.btn.block{width:100%}.field{flex-direction:column;gap:.4rem;margin-bottom:.9rem;display:flex}.field label{color:var(--muted);font-size:.86rem;font-weight:600}.field input,.field select,.field textarea{border-radius:var(--radius-sm);border:1px solid var(--line);min-height:44px;color:var(--text);background:#00000047;padding:.7rem .85rem}.field input:focus,.field select:focus,.field textarea:focus{box-shadow:0 0 0 3px var(--accent-soft);border-color:#1d9e758c;outline:none}.scan-input{letter-spacing:.02em;font-size:1.2rem!important}.alert{border-radius:var(--radius-sm);border:1px solid;margin-bottom:1rem;padding:.85rem 1rem}.alert.error{background:var(--danger-soft);color:#ffc9c4;border-color:#e25b5b66}.alert.ok{background:var(--ok-soft);color:#c8f0d8;border-color:#2eb87a59}.alert.warn{background:var(--warn-soft);color:#ffe4a3;border-color:#e0a21a66}.table{border-collapse:collapse;width:100%}.table th,.table td{text-align:left;border-bottom:1px solid var(--line);padding:.75rem .55rem;font-size:.9rem}.table th{color:var(--muted);text-transform:uppercase;letter-spacing:.04em;font-size:.78rem;font-weight:600}.table tbody tr:hover td{background:#ffffff05}.badge{text-transform:uppercase;letter-spacing:.04em;background:var(--accent-soft);color:#b7efce;border-radius:999px;padding:.22rem .55rem;font-size:.7rem;font-weight:700;display:inline-block}.badge-open{background:var(--accent-soft);color:#b7efce}.badge-partial{background:var(--warn-soft);color:#ffe4a3;border:1px solid #e0a21a73}.badge-completed{color:#9bb0c4;background:#8b9bb029}.sor-section-row td{font-weight:700;font-family:var(--font-display);letter-spacing:-.02em;color:var(--muted);background:#ffffff08;border-bottom-color:var(--line-strong)!important;padding-top:.95rem!important}.sor-section-partial td{color:#ffe4a3;background:var(--warn-soft)}.sor-section-completed td{color:#9bb0c4}.sor-row-partial td{background:#e0a21a0f}.sor-row-partial:hover td{background:#e0a21a1f}.sor-link{color:#b8f0d4;text-underline-offset:3px;font-weight:700;text-decoration:underline}.sor-link:hover{color:#ffe4a3}.login-page{background:radial-gradient(700px 400px at 20% 10%,#1d9e7533,#0000 60%),radial-gradient(600px 360px at 90% 80%,#3b82f61f,#0000 55%),linear-gradient(160deg,#070b10,#0e1620 55%,#0a1218);place-items:center;min-height:100vh;padding:1.5rem;display:grid}.login-card{width:min(420px,100%);animation:.45s rise}.login-card h1{font-size:1.75rem}@keyframes rise{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.stack{flex-direction:column;gap:1rem;display:flex}.row{flex-wrap:wrap;align-items:center;gap:.75rem;display:flex}.skeleton{border-radius:var(--radius-sm);background:linear-gradient(90deg,#ffffff0a,#ffffff14,#ffffff0a) 0 0/200% 100%;height:1rem;animation:1.2s linear infinite shimmer}@keyframes shimmer{to{background-position:-200% 0}}.floor-map-upload{border-top:1px solid var(--line);margin:1.25rem 0 1rem;padding-top:1rem}.floor-map-upload h2{margin:0 0 .35rem;font-size:1.05rem}.floor-map-legend{flex-wrap:wrap;align-items:center;gap:1rem;display:flex}.floor-legend-item{align-items:center;gap:.45rem;font-size:.92rem;display:inline-flex}.floor-swatch{border:1px solid #ffffff1f;border-radius:4px;width:14px;height:14px;display:inline-block}.floor-swatch.free{background:#1f6f54}.floor-swatch.used{background:#c9851a}.floor-swatch.damage{background:#b33a3a}.floor-map-panel{overflow-x:auto}.floor-map-grid{gap:.45rem;min-width:min(100%,520px);display:grid}.floor-cell{appearance:none;text-align:left;color:#f4f7f5;cursor:pointer;border:1px solid #ffffff1a;border-radius:10px;flex-direction:column;justify-content:space-between;min-height:64px;padding:.45rem .5rem;transition:transform .12s,box-shadow .12s;display:flex}.floor-cell:hover{transform:translateY(-1px);box-shadow:0 6px 16px #00000040}.floor-cell.selected{outline:2px solid var(--accent,#2dd4a8);outline-offset:1px}.floor-cell.empty{pointer-events:none;background:0 0;border-style:dashed;border-color:#ffffff0f}.floor-cell.free{background:linear-gradient(160deg,#1a5c46,#144836)}.floor-cell.used{background:linear-gradient(160deg,#a56c14,#7a4f0f)}.floor-cell.damage{background:linear-gradient(160deg,#9a3030,#6e2020)}.floor-cell-code{word-break:break-all;font-size:.78rem;font-weight:650;line-height:1.2}.floor-cell-meta{opacity:.85;text-transform:uppercase;letter-spacing:.03em;font-size:.7rem}.badge.floor-status-free{color:#8fe0bf;background:#2da06e38}.badge.floor-status-used{color:#f0c57a;background:#c9851a38}.badge.floor-status-damage{color:#f0a0a0;background:#b33a3a40}@media (width<=1100px){.dash-span-4,.dash-span-6,.dash-span-8{grid-column:span 12}}@media (width<=900px){.app-shell{grid-template-columns:1fr}.sidebar{border-right:none;border-bottom:1px solid var(--line);height:auto;position:relative}.nav{flex-flow:wrap}}
