:root{--bg0:#15171a;--bg1:#15171a;--panel:#ffffff0e;--panel2:#ffffff16;--border:#ffffff1f;--border-subtle:#ffffff14;--border-card-h:#ffffff14;--text:#ffffffeb;--muted:#ffffffa3;--muted2:#ffffff75;--btn-bg:#ffffff0d;--btn-bg-hover:#ffffff14;--btn-border-hover:#ffffff2e;--btn-border-focus:#ffffff38;--pill-bg:#ffffff0a;--card-h-bg:#ffffff08;--action-bg:#ffffff0d;--action-bg-hover:#ffffff13;--action-border-hover:#ffffff2e;--action-border-focus:#ffffff38;--a-ic-bg:#ffffff0f;--a-ic-border:#ffffff1a;--header-bg:#15171a9e;--header-shadow:0 10px 28px #00000052;--input-bg:#ffffff0b;--input-border:#ffffff1c;--input-focus-border:#ffffff38;--table-border:#ffffff14;--table-hover:#ffffff08;--move-bg:#ffffff0d;--dot-default:#fff3;--tech-logo-filter:grayscale(100%) invert(1) opacity(.25);--tech-logo-filter-hover:grayscale(60%) invert(1) opacity(.4);--shadow:0 10px 28px #0000006b;--shadow2:0 18px 44px #0000007a;--r:14px;--r2:12px;--gap:14px;--accent:#7aa8ff;--accent2:#9b7aff;--ok:#1fd38a;--warn:#fc6;--bad:#ff6b6b;--focus:#7aa8ff6b}[data-theme=light]{--bg0:#f4f6f7;--bg1:#e8ebed;--panel:#ffffffbf;--panel2:#ffffffe6;--border:#0000001a;--border-subtle:#00000012;--border-card-h:#00000012;--text:#000000e0;--muted:#0000008a;--muted2:#00000061;--btn-bg:#0000000d;--btn-bg-hover:#00000014;--btn-border-hover:#00000026;--btn-border-focus:#0003;--pill-bg:#0000000a;--card-h-bg:#fff9;--action-bg:#fff9;--action-bg-hover:#ffffffe6;--action-border-hover:#00000026;--action-border-focus:#0003;--a-ic-bg:#0000000d;--a-ic-border:#00000014;--header-bg:#f0f2f5d9;--header-shadow:0 4px 16px #00000014;--input-bg:#ffffffb3;--input-border:#0000001f;--input-focus-border:#00000040;--table-border:#00000012;--table-hover:#00000005;--move-bg:#fff9;--dot-default:#00000026;--tech-logo-filter:grayscale(100%) opacity(.25);--tech-logo-filter-hover:grayscale(60%) opacity(.4);--shadow:0 4px 16px #0000001a;--shadow2:0 8px 24px #0000001f;--accent:#2563eb;--accent2:#7c3aed;--ok:#059669;--warn:#d97706;--bad:#dc2626;--focus:#2563eb4d}*{box-sizing:border-box}html,body{margin:0}body{color:var(--text);background:var(--bg0);font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,Apple Color Emoji,Segoe UI Emoji}a{color:var(--accent);font-weight:500;text-decoration:none}a:hover{color:#9bbfff}.btn{border-radius:var(--r2);border:1px solid var(--border);background:var(--btn-bg);color:var(--text);cursor:pointer;-webkit-user-select:none;user-select:none;touch-action:manipulation;outline:none;justify-content:center;align-items:center;gap:8px;min-height:44px;padding:10px 12px;font-family:inherit;font-size:13px;font-weight:750;transition:transform 80ms,background .12s,border-color .12s;display:inline-flex}.btn:hover{background:var(--btn-bg-hover);border-color:var(--btn-border-hover)}.btn:active{transform:translateY(1px)}.btn:focus-visible{box-shadow:0 0 0 3px var(--focus);border-color:var(--btn-border-focus)}.btn.primary{background:linear-gradient(135deg,#7aa8fff2,#9b7affeb);border-color:#ffffff2e;box-shadow:0 12px 28px #7aa8ff29}.pill{border:1px solid var(--border);background:var(--pill-bg);color:var(--muted);white-space:nowrap;border-radius:999px;align-items:center;gap:10px;padding:8px 10px;font-size:12px;display:flex}.pill strong{color:var(--text);font-weight:750}.card{background:var(--panel);border:1px solid var(--border);border-radius:var(--r);box-shadow:var(--shadow2);flex-direction:column;min-height:0;display:flex;overflow:hidden}.card-h{border-bottom:1px solid var(--border-card-h);background:var(--card-h-bg);justify-content:space-between;align-items:flex-end;gap:10px;padding:12px 14px;display:flex}.card-h h2{letter-spacing:.2px;margin:0;font-size:13px}.card-h p{color:var(--muted);margin:3px 0 0;font-size:12px;font-weight:600}.card-b{min-height:0;padding:12px 14px}.login-wrap{background:var(--bg0);min-height:100dvh;padding:max(16px, env(safe-area-inset-top)) max(16px, env(safe-area-inset-right)) max(140px, env(safe-area-inset-bottom)) max(16px, env(safe-area-inset-left));justify-content:center;align-items:center;display:flex;position:relative}.login-theme-btn{position:absolute;top:16px;right:16px}.login-powered-by{bottom:max(20px, env(safe-area-inset-bottom));justify-content:center;display:flex;position:absolute;left:0;right:0}.login-card{flex-direction:column;align-items:center;gap:clamp(1rem,4vw,1.5rem);width:min(400px,100% - 2rem);display:flex}.login-logo{width:min(320px,80vw);height:auto}.login-form{flex-direction:column;gap:1rem;width:100%;display:flex}.login-form label{text-align:left;color:var(--muted);flex-direction:column;gap:4px;font-size:13px;font-weight:600;display:flex}.login-form input{border-radius:var(--r2);border:1px solid var(--border);background:var(--input-bg);color:var(--text);outline:none;width:100%;min-height:44px;padding:10px 12px;font-family:inherit;font-size:max(1rem,16px);transition:border-color .12s,box-shadow .12s}.login-form input:focus{border-color:var(--input-focus-border);box-shadow:0 0 0 3px var(--focus)}.login-form input::placeholder{color:var(--muted2)}.login-form .btn{width:100%;margin-top:4px}.login-error{color:var(--bad);margin:0;font-size:13px;font-weight:600}.login-footer{flex-direction:column;align-items:center;gap:12px;display:flex}.api-health{color:var(--muted2);align-items:center;gap:6px;font-size:12px;display:flex}.health-dot{border-radius:50%;flex-shrink:0;width:8px;height:8px;display:inline-block}.health-dot.online{background:var(--ok)}.health-dot.offline{background:var(--bad)}.health-dot.degraded{background:var(--warn)}.health-dot.checking{background:var(--muted2);animation:1.2s ease-in-out infinite pulse}@keyframes pulse{0%,to{opacity:1}50%{opacity:.3}}.powered-by{color:var(--muted2);letter-spacing:.05em;text-transform:uppercase;flex-direction:column;align-items:center;gap:6px;font-size:11px;display:flex}.powered-by-logos{align-items:center;gap:1rem;display:flex}.tech-logo{width:auto;height:68px;filter:var(--tech-logo-filter);transition:filter .2s}.tech-logo:hover{filter:var(--tech-logo-filter-hover)}.app-shell{background:var(--bg0);grid-template-rows:auto 1fr;min-height:100dvh;display:grid}.app-header{z-index:100;padding:10px max(16px, env(safe-area-inset-right)) 10px max(16px, env(safe-area-inset-left));padding-top:max(10px, env(safe-area-inset-top));border-bottom:1px solid var(--border-subtle);background:var(--bg0);box-shadow:var(--header-shadow);align-items:center;gap:12px;display:flex;position:sticky;top:0}.brand{align-items:center;gap:10px;min-width:220px;display:flex}.brand-icon{object-fit:cover;border-radius:12px;width:36px;height:36px}.brand-text{flex-direction:column;line-height:1.15;display:flex}.brand h1{letter-spacing:.2px;margin:0;font-size:14px}.brand span{color:var(--muted);font-size:12px;font-weight:600}.hdr-mid{flex:1;align-items:center;gap:10px;display:flex}.search{border-radius:var(--r2);background:var(--input-bg);border:1px solid var(--input-border);flex:1;align-items:center;gap:10px;min-width:180px;padding:10px 12px;display:flex}.search input{width:100%;color:var(--text);background:0 0;border:0;outline:0;font-family:inherit;font-size:14px}.dash-main{padding:var(--gap) max(16px, env(safe-area-inset-right)) max(16px, env(safe-area-inset-left));padding-bottom:calc(env(safe-area-inset-bottom,0px) + 24px)}.dash{gap:var(--gap);grid-template-rows:auto;grid-template-columns:1.2fr 1fr;max-width:1180px;margin:0 auto;display:grid}.card-actions .card-b{flex-direction:column;flex:1;display:flex}.actions{flex:1;grid-template-columns:repeat(3,1fr);grid-auto-rows:1fr;gap:12px;display:grid}.action{border-radius:var(--r);border:1px solid var(--border);background:var(--action-bg);cursor:pointer;color:var(--text);outline:none;flex-direction:column;gap:10px;height:100%;padding:14px;text-decoration:none;transition:background .12s,border-color .12s,transform 80ms;display:flex}.action:visited,.action:hover,.action:active{color:var(--text);text-decoration:none}.action:focus-visible{box-shadow:0 0 0 3px var(--focus);border-color:var(--action-border-focus)}.action:hover{background:var(--action-bg-hover);border-color:var(--action-border-hover)}.action:active{transform:translateY(1px)}.action .meta{color:var(--muted);align-items:center;gap:8px;font-size:12px;font-weight:650;display:flex}.action strong{letter-spacing:.2px;font-size:14px}.action span{color:var(--muted);font-size:12px;line-height:1.35}.dot{background:var(--dot-default);border-radius:99px;width:10px;height:10px}.dot.ok{background:#1fd38ae6}.dot.bad{background:#ff6b6beb}.dot.warn{background:#ffcc66f2}.dot.acc{background:#7aa8ffeb}.dot.acc2{background:#9b7affeb}.alerts{flex-direction:column;gap:10px;display:flex}.alert{border-radius:var(--r);border:1px solid var(--border);background:var(--action-bg);align-items:flex-start;gap:10px;padding:12px;display:flex}.a-ic{background:var(--a-ic-bg);border:1px solid var(--a-ic-border);border-radius:12px;flex:none;justify-content:center;align-items:center;width:34px;height:34px;display:flex}.alert h4{margin:0;font-size:13px}.alert p{color:var(--muted);margin:4px 0 0;font-size:12px;line-height:1.35}.table-wrap{border-radius:var(--r2);height:100%;overflow:auto}table{border-collapse:collapse;width:100%;font-size:13px}th,td{border-bottom:1px solid var(--table-border);text-align:left;padding:9px 10px}th{color:var(--muted);text-transform:uppercase;letter-spacing:.25px;font-size:12px}tr:hover td{background:var(--table-hover)}.num{font-variant-numeric:tabular-nums;text-align:right}.rowhead{flex-direction:column;gap:2px;display:flex}.code{color:var(--muted2);font-size:12px}.group-row td{font-weight:500}.group-row:hover td{background:var(--action-bg-hover)}.sub-row td{background:var(--panel);border-bottom-color:var(--border-subtle);color:var(--muted);padding-top:5px;padding-bottom:5px}.sub-row:hover td{background:var(--panel2)}.moves{flex-direction:column;gap:10px;height:100%;display:flex}.move-list{flex-direction:column;gap:8px;min-height:0;display:flex;overflow:auto}.move{border-radius:var(--r2);border:1px solid var(--border);background:var(--move-bg);grid-template-columns:64px 1fr 86px;align-items:center;gap:10px;padding:10px;display:grid}.time{color:var(--muted);font-size:12px;font-weight:750}.what{flex-direction:column;gap:2px;min-width:0;display:flex}.what strong{white-space:nowrap;text-overflow:ellipsis;font-size:13px;overflow:hidden}.what span{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:12px;overflow:hidden}.delta{font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap;font-weight:850}.pos{color:#1fd38af2}.neg{color:#ff6b6bf2}.pill-sm{letter-spacing:.2px;white-space:nowrap;border:1px solid #0000;border-radius:999px;padding:2px 8px;font-size:11px;font-weight:700;display:inline-block}.pill-sm.brewing{color:#f93;background:#ff993326;border-color:#ff99334d}.pill-sm.queued{color:var(--accent2);background:#9b7aff1f;border-color:#9b7aff40}.pill-sm.fermenting{color:var(--accent);background:#7aa8ff1f;border-color:#7aa8ff40}.pill-sm.ready{color:var(--ok);background:#1fd38a1f;border-color:#1fd38a40}.pill-sm.empty-tag{background:var(--panel);border-color:var(--border);color:var(--muted2)}.batch-list{flex-direction:column;gap:10px;display:flex}.batch{border-radius:var(--r2);border:1px solid var(--border);background:var(--action-bg);flex-direction:column;gap:6px;padding:12px;display:flex}.batch-head{justify-content:space-between;align-items:center;gap:8px;display:flex}.batch-head strong{font-size:13px}.batch-detail{color:var(--muted);flex-direction:column;gap:2px;font-size:12px;line-height:1.35;display:flex}.tanks{grid-template-columns:repeat(2,1fr);gap:10px;display:grid}.tank{border-radius:var(--r2);border:1px solid var(--border);background:var(--action-bg);flex-direction:column;gap:8px;padding:12px;display:flex}.tank-head{justify-content:space-between;align-items:center;gap:8px;display:flex}.tank-head strong{font-size:14px}.tank-vol{color:var(--muted);font-size:12px;font-weight:600}.tank-bar{background:var(--panel2);border-radius:3px;height:6px;overflow:hidden}.tank-fill{background:var(--muted2);border-radius:3px;height:100%;transition:width .4s}.tank-fill.fill-fermenting{background:var(--accent)}.tank-fill.fill-ready{background:var(--ok)}.tank-info{color:var(--muted);font-size:12px;line-height:1.3}.dialog-overlay{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:1000;background:#0000008c;justify-content:center;align-items:center;padding:16px;display:flex;position:fixed;inset:0}.dialog{background:var(--bg0);border:1px solid var(--border);border-radius:var(--r);box-shadow:var(--shadow2);flex-direction:column;width:min(520px,100%);max-height:90vh;display:flex;overflow:hidden}.dialog.dialog-lg{width:min(680px,100%)}.dialog-header{border-bottom:1px solid var(--border-card-h);background:var(--card-h-bg);flex-shrink:0;justify-content:space-between;align-items:center;padding:14px 16px;display:flex}.dialog-header h2{letter-spacing:.2px;margin:0;font-size:14px}.dialog-close{min-height:unset;color:var(--muted);background:0 0;border-color:#0000;padding:6px 8px;font-size:13px}.dialog-close:hover{background:var(--btn-bg-hover);border-color:var(--border);color:var(--text)}.dialog-body{overscroll-behavior:contain;scrollbar-gutter:stable;flex-direction:column;gap:12px;padding:16px;display:flex;overflow-y:auto}.dialog-tabs{border-bottom:1px solid var(--border-subtle);gap:4px;padding-bottom:8px;display:flex}.dialog-tab{border-radius:var(--r2);color:var(--muted);cursor:pointer;min-height:unset;background:0 0;border:1px solid #0000;padding:6px 12px;font-family:inherit;font-size:13px;font-weight:650;transition:background .1s,color .1s,border-color .1s}.dialog-tab:hover{background:var(--btn-bg-hover);color:var(--text)}.dialog-tab.active{background:var(--btn-bg-hover);border-color:var(--border);color:var(--text)}.dialog-form{flex-direction:column;gap:12px;display:flex}.dialog-form label{color:var(--muted);flex-direction:column;gap:4px;font-size:13px;font-weight:600;display:flex}.dialog-form input,.dialog-form select{border-radius:var(--r2);border:1px solid var(--input-border);background:var(--input-bg);color:var(--text);outline:none;width:100%;min-height:42px;padding:9px 11px;font-family:inherit;font-size:max(1rem,16px);transition:border-color .12s,box-shadow .12s}.dialog-form input:focus,.dialog-form select:focus{border-color:var(--input-focus-border);box-shadow:0 0 0 3px var(--focus)}.dialog-form select{cursor:pointer;appearance:auto}.dialog-hint{color:var(--muted);margin:0;font-size:13px}.dialog-hint strong{color:var(--text)}.dialog-ok{color:var(--ok);margin:0;font-size:13px;font-weight:600}.dialog-err{color:var(--bad);margin:0;font-size:13px;font-weight:600}.dialog-actions{justify-content:flex-end;gap:8px;padding-top:4px;display:flex}.editing-row td{padding:10px 8px}.inline-edit-form{flex-direction:column;gap:10px;display:flex}.inline-edit-form label{color:var(--muted);flex-direction:column;gap:4px;font-size:13px;font-weight:600;display:flex}.inline-edit-form input,.inline-edit-form select{border-radius:var(--r2);border:1px solid var(--input-border);background:var(--input-bg);color:var(--text);outline:none;width:100%;min-height:38px;padding:8px 10px;font-family:inherit;font-size:13px;transition:border-color .12s,box-shadow .12s}.inline-edit-form input:focus,.inline-edit-form select:focus{border-color:var(--input-focus-border);box-shadow:0 0 0 3px var(--focus)}.inline-edit-form .checkbox-label{flex-direction:row;align-items:center;gap:8px}.inline-edit-form .checkbox-label input{width:auto;min-height:unset;cursor:pointer}.add-user-form{background:var(--panel);border:1px solid var(--border);border-radius:var(--r2);padding:14px}.users-section-label{color:var(--muted2);text-transform:uppercase;letter-spacing:.3px;border-top:1px solid var(--border-subtle);padding-top:4px;font-size:11px;font-weight:700}.field-hint{color:var(--muted2);font-size:11px;font-weight:500}.role-badge{border:1px solid var(--border);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:650;display:inline-block}.role-badge.role-admin{color:var(--accent);background:#7aa8ff26;border-color:#7aa8ff4d}.role-badge.role-user{background:var(--panel);color:var(--muted)}.status-active{color:var(--ok);font-size:13px;font-weight:650}.status-inactive{color:var(--bad);font-size:13px;font-weight:650}.pill-btn{cursor:pointer;background:var(--pill-bg);border:1px solid var(--border);transition:background .12s,border-color .12s}.pill-btn:hover{background:var(--btn-bg-hover);border-color:var(--btn-border-hover)}.pill-btn:focus-visible{box-shadow:0 0 0 3px var(--focus);border-color:var(--btn-border-focus);outline:none}.loading-wrap{background:var(--bg0);min-height:100dvh;color:var(--muted);justify-content:center;align-items:center;font-size:14px;display:flex}.hamburger{display:none}.mobile-drawer-overlay{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);z-index:900;background:#00000073;position:fixed;inset:0}.drawer-open .app-shell{height:100dvh;padding-bottom:env(safe-area-inset-bottom,0px);overflow:hidden}.drawer-open .dash-main{min-height:0;overflow-y:auto}.mobile-drawer{background:var(--bg0);border-left:1px solid var(--border);width:min(280px,80vw);box-shadow:var(--shadow2);z-index:901;padding:max(16px, env(safe-area-inset-top)) 16px max(16px, env(safe-area-inset-bottom)) 16px;flex-direction:column;gap:8px;display:flex;position:fixed;top:0;bottom:0;right:0;overflow-y:auto}.mobile-drawer .btn{justify-content:flex-start;width:100%}.mobile-drawer-header .btn{width:auto}.mobile-drawer-header{border-bottom:1px solid var(--border-subtle);justify-content:space-between;align-items:center;margin-bottom:4px;padding-bottom:8px;display:flex}.mobile-drawer-header h3{margin:0;font-size:14px}@media (width<=980px){.dash{grid-template-rows:auto;grid-template-columns:1fr}.actions{grid-template-columns:repeat(2,1fr)}}@media (width<=720px){.brand{min-width:auto}.pill{display:none}.app-header{padding:max(8px, env(safe-area-inset-top)) max(12px, env(safe-area-inset-right)) 8px max(12px, env(safe-area-inset-left));gap:8px}.hdr-desktop{display:none}.hamburger{flex-shrink:0;display:inline-flex}.search{min-width:0}.dash-main{padding:var(--gap) max(10px, env(safe-area-inset-right)) max(10px, env(safe-area-inset-left));padding-bottom:calc(env(safe-area-inset-bottom,0px) + 20px)}.table-wrap{-webkit-overflow-scrolling:touch}table{font-size:12px}th,td{white-space:nowrap;padding:7px 6px}.card-h{flex-wrap:wrap}.dialog-overlay{align-items:flex-end;padding:0}.dialog{border-radius:var(--r) var(--r) 0 0;width:100%;max-height:92vh}.dialog.dialog-lg{width:100%}.dialog-body{padding:12px;padding-bottom:max(12px, env(safe-area-inset-bottom))}.dialog-form label{font-size:12px}.dialog-actions{flex-direction:column}.dialog-actions .btn{width:100%}}@media (width<=520px){.actions{grid-template-columns:repeat(2,1fr)}.action{gap:6px;padding:10px}.action strong{font-size:13px}.action span{font-size:11px}.tanks{grid-template-columns:1fr}.hide-mobile{display:none}.search{min-width:0}.brand-text{display:none}}
