:root,[data-theme=light]{color-scheme:light;--color-bg: #f1f5f9;--color-text: #0f172a;--color-text-muted: #64748b;--color-text-subtle: #475569;--color-surface: #fff;--color-surface-muted: #f8fafc;--color-surface-hover: #f1f5f9;--color-border: #cbd5e1;--color-border-light: #e2e8f0;--color-link: #2563eb;--color-link-hover-bg: #f1f5f9;--color-link-active-bg: #e0e7ff;--color-link-active-border: #a5b4fc;--color-link-active-text: #3730a3;--color-shadow: rgb(0 0 0 / 8%);--color-error-bg: #fef2f2;--color-error-border: #fecaca;--color-error-text: #b91c1c;--color-banner-bg: #fef3c7;--color-banner-border: #fcd34d;--color-banner-text: #92400e;--color-pill-ok-bg: #dcfce7;--color-pill-ok-text: #166534;--color-pill-warn-bg: #fef9c3;--color-pill-warn-text: #854d0e;--color-pill-muted-bg: #e2e8f0;--color-pill-muted-text: #475569;--color-pill-loading-bg: #e0e7ff;--color-pill-loading-text: #3730a3;--color-pill-error-bg: #fee2e2;--color-pill-error-text: #991b1b;--color-chart: #2563eb;--color-chart-grid: #e2e8f0;--color-chart-axis: #94a3b8;--color-chart-label: #64748b;--color-code-bg: #0f172a;--color-code-text: #e2e8f0;--color-spot-manual-outline: rgb(0 0 0 / 25%);--color-spot-badge-bg: rgb(0 0 0 / 35%);--color-btn-primary-bg: #2563eb;--color-btn-primary-border: #2563eb;--color-btn-primary-text: #fff;--color-btn-primary-hover: #1d4ed8;--color-btn-warn-bg: #fef3c7;--color-btn-warn-border: #fcd34d;--color-btn-warn-text: #92400e;--color-btn-warn-hover: #fde68a;--color-chip-active-bg: #e0e7ff;--color-chip-active-border: #a5b4fc;--color-chip-active-text: #3730a3;--color-mqtt-in: #16a34a;--color-mqtt-out: #d97706;--color-mqtt-direction: #334155;--color-mqtt-badge-status-bg: #dcfce7;--color-mqtt-badge-status-text: #166534;--color-mqtt-badge-summary-bg: #dbeafe;--color-mqtt-badge-summary-text: #1e40af;--color-mqtt-badge-control-bg: #fef3c7;--color-mqtt-badge-control-text: #92400e;--color-mqtt-badge-system-bg: #e2e8f0;--color-mqtt-badge-system-text: #475569}[data-theme=dark]{color-scheme:dark;--color-bg: #0f172a;--color-text: #f1f5f9;--color-text-muted: #94a3b8;--color-text-subtle: #cbd5e1;--color-surface: #1e293b;--color-surface-muted: #334155;--color-surface-hover: #475569;--color-border: #475569;--color-border-light: #334155;--color-link: #93c5fd;--color-link-hover-bg: #334155;--color-link-active-bg: #312e81;--color-link-active-border: #6366f1;--color-link-active-text: #e0e7ff;--color-shadow: rgb(0 0 0 / 35%);--color-error-bg: #450a0a;--color-error-border: #991b1b;--color-error-text: #fecaca;--color-banner-bg: #451a03;--color-banner-border: #92400e;--color-banner-text: #fde68a;--color-pill-ok-bg: #14532d;--color-pill-ok-text: #bbf7d0;--color-pill-warn-bg: #422006;--color-pill-warn-text: #fde68a;--color-pill-muted-bg: #334155;--color-pill-muted-text: #cbd5e1;--color-pill-loading-bg: #312e81;--color-pill-loading-text: #e0e7ff;--color-pill-error-bg: #450a0a;--color-pill-error-text: #fecaca;--color-chart: #60a5fa;--color-chart-grid: #334155;--color-chart-axis: #64748b;--color-chart-label: #94a3b8;--color-code-bg: #020617;--color-code-text: #e2e8f0;--color-spot-manual-outline: rgb(255 255 255 / 35%);--color-spot-badge-bg: rgb(0 0 0 / 45%);--color-btn-primary-bg: #2563eb;--color-btn-primary-border: #2563eb;--color-btn-primary-text: #fff;--color-btn-primary-hover: #1d4ed8;--color-btn-warn-bg: #422006;--color-btn-warn-border: #92400e;--color-btn-warn-text: #fde68a;--color-btn-warn-hover: #451a03;--color-chip-active-bg: #312e81;--color-chip-active-border: #6366f1;--color-chip-active-text: #e0e7ff;--color-mqtt-in: #4ade80;--color-mqtt-out: #fbbf24;--color-mqtt-direction: #e2e8f0;--color-mqtt-badge-status-bg: #14532d;--color-mqtt-badge-status-text: #bbf7d0;--color-mqtt-badge-summary-bg: #1e3a8a;--color-mqtt-badge-summary-text: #bfdbfe;--color-mqtt-badge-control-bg: #422006;--color-mqtt-badge-control-text: #fde68a;--color-mqtt-badge-system-bg: #334155;--color-mqtt-badge-system-text: #cbd5e1}:root{font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;line-height:1.5;color:var(--color-text);background:var(--color-bg)}*{box-sizing:border-box}body{margin:0}.app{max-width:960px;margin:0 auto;padding:1.5rem 1rem 3rem}.app__banner{padding:.75rem 1rem;border-radius:8px;margin-bottom:1rem;font-size:.9rem}.app__banner--truth{background:var(--color-banner-bg);border:1px solid var(--color-banner-border);color:var(--color-banner-text)}.app__header{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1.5rem}.app__header-actions{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem}.app__nav{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem}.app__nav-link{display:inline-block;padding:.35rem .75rem;border:1px solid var(--color-border);border-radius:6px;background:var(--color-surface);color:var(--color-link);font-size:.85rem;font-weight:600;text-decoration:none;white-space:nowrap}.app__nav-link:hover{background:var(--color-link-hover-bg);border-color:var(--color-chart-axis)}.app__nav-link--active{background:var(--color-link-active-bg);border-color:var(--color-link-active-border);color:var(--color-link-active-text)}.app__header h1{margin:0;font-size:1.75rem}.app__subtitle{margin:.25rem 0 0;color:var(--color-text-muted);font-size:.9rem}.app__error{background:var(--color-error-bg);border:1px solid var(--color-error-border);color:var(--color-error-text);padding:.75rem 1rem;border-radius:8px;margin-bottom:1rem}.app__hint{color:var(--color-text-muted);font-size:.9rem}.theme-toggle{display:inline-flex;align-items:center;gap:.4rem;font-size:.85rem;color:var(--color-text-muted)}.theme-toggle__label{font-weight:600}.theme-toggle__select{border:1px solid var(--color-border);border-radius:6px;background:var(--color-surface);color:var(--color-text);padding:.35rem .5rem;font-size:.85rem;font-family:inherit;cursor:pointer}.pill{display:inline-block;padding:.35rem .75rem;border-radius:999px;font-size:.8rem;font-weight:600}.pill--ok{background:var(--color-pill-ok-bg);color:var(--color-pill-ok-text)}.pill--warn{background:var(--color-pill-warn-bg);color:var(--color-pill-warn-text)}.pill--muted{background:var(--color-pill-muted-bg);color:var(--color-pill-muted-text)}.pill--loading{background:var(--color-pill-loading-bg);color:var(--color-pill-loading-text)}.pill--error{background:var(--color-pill-error-bg);color:var(--color-pill-error-text)}.summary{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem;margin-bottom:1.5rem}.summary__tile{background:var(--color-surface);border-radius:12px;padding:1rem;text-align:center;box-shadow:0 1px 3px var(--color-shadow)}.summary__tile--free .summary__value{color:#16a34a}.summary__tile--occupied .summary__value{color:#3b82f6}.summary__value{display:block;font-size:2rem;font-weight:700;line-height:1.2}.summary__label{font-size:.85rem;color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.04em}.summary__updated{grid-column:1 / -1;margin:0;font-size:.85rem;color:var(--color-text-muted);text-align:center}.spot-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(100px,1fr));gap:.75rem;margin-bottom:1.5rem}.spot-grid__empty{color:var(--color-text-muted);grid-column:1 / -1}.spot{position:relative;border:none;border-radius:10px;padding:.75rem;text-align:center;color:#fff;font-weight:600;cursor:pointer;font-family:inherit;width:100%}.spot:disabled{cursor:wait;opacity:.85}.spot:not(:disabled):hover{filter:brightness(1.08)}.spot:not(:disabled):active{filter:brightness(.95)}.spot--free{background:#22c55e}.spot--occupied{background:#3b82f6}.spot--truth{outline:2px dashed #b45309;outline-offset:2px}.spot--truth .spot__badge{background:var(--color-banner-bg);color:var(--color-banner-text)}.spot--manual{box-shadow:inset 0 0 0 2px #fff9;outline:2px dashed var(--color-spot-manual-outline);outline-offset:-6px}.spot__badge{position:absolute;top:4px;right:4px;padding:.1rem .35rem;border-radius:4px;background:var(--color-spot-badge-bg);font-size:.55rem;font-weight:700;letter-spacing:.04em;line-height:1.2;text-transform:uppercase}.spot__id{display:block;font-size:1.1rem}.spot__status{display:block;font-size:.75rem;opacity:.9;margin-top:.25rem}.spot__ago{display:block;font-size:.7rem;opacity:.85;margin-top:.35rem;font-weight:400}.sparkline{background:var(--color-surface);border-radius:12px;padding:1rem 1.25rem;box-shadow:0 1px 3px var(--color-shadow)}.sparkline__title{margin:0 0 .75rem;font-size:1rem}.sparkline__legend{display:flex;gap:1rem;margin-bottom:.5rem;font-size:.75rem;color:var(--color-text-muted)}.sparkline__legend-item{display:inline-flex;align-items:center;gap:.35rem}.sparkline__legend-swatch{display:inline-block;width:1.25rem;height:0;border-top:2px solid var(--color-chart)}.sparkline__legend-swatch--web{border-top-style:dashed}.sparkline__svg{display:block;width:100%;min-height:180px;height:auto;color:var(--color-chart)}.sparkline__axis{stroke:var(--color-chart-axis);stroke-width:1}.sparkline__grid{stroke:var(--color-chart-grid);stroke-width:1}.sparkline__tick{stroke:var(--color-chart-axis);stroke-width:1}.sparkline__axis-label{fill:var(--color-chart-label);font-size:11px}.sparkline__line--web{opacity:.85}.sparkline__empty,.sparkline__error{margin:0;font-size:.9rem;color:var(--color-text-muted)}.sparkline__error{color:var(--color-error-text)}.mqtt-console{background:var(--color-surface);border-radius:12px;padding:1rem 1.25rem;box-shadow:0 1px 3px var(--color-shadow);margin-top:1.5rem}.mqtt-console__header{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:.75rem;margin-bottom:.75rem}.mqtt-console__title{margin:0;font-size:1rem}.mqtt-console__meta{margin:.25rem 0 0;font-size:.8rem;color:var(--color-text-muted)}.mqtt-console__toolbar{display:flex;flex-wrap:wrap;gap:.5rem}.mqtt-console__btn{border:1px solid var(--color-border);background:var(--color-surface-muted);color:var(--color-text);border-radius:6px;padding:.35rem .65rem;font-size:.8rem;font-weight:600;font-family:inherit;cursor:pointer}.mqtt-console__btn:hover{background:var(--color-surface-hover)}.mqtt-console__btn--primary{background:var(--color-btn-primary-bg);border-color:var(--color-btn-primary-border);color:var(--color-btn-primary-text)}.mqtt-console__btn--primary:hover{background:var(--color-btn-primary-hover)}.mqtt-console__btn--warn{background:var(--color-btn-warn-bg);border-color:var(--color-btn-warn-border);color:var(--color-btn-warn-text)}.mqtt-console__btn--warn:hover{background:var(--color-btn-warn-hover)}.mqtt-console__filters{display:flex;flex-wrap:wrap;align-items:center;gap:.35rem;margin-bottom:.75rem}.mqtt-console__filter-label{font-size:.75rem;color:var(--color-text-muted);margin-right:.25rem}.mqtt-console__filter-label:not(:first-child){margin-left:.5rem}.mqtt-console__chip{border:1px solid var(--color-border-light);background:var(--color-surface);color:var(--color-text-subtle);border-radius:999px;padding:.2rem .55rem;font-size:.72rem;font-weight:600;font-family:inherit;cursor:pointer;text-transform:lowercase}.mqtt-console__chip--active{background:var(--color-chip-active-bg);border-color:var(--color-chip-active-border);color:var(--color-chip-active-text)}.mqtt-console__list{max-height:420px;overflow-y:auto;display:flex;flex-direction:column;gap:.5rem}.mqtt-console__empty{margin:0;font-size:.9rem;color:var(--color-text-muted)}.mqtt-row{border:1px solid var(--color-border-light);border-radius:8px;padding:.5rem .65rem;background:var(--color-surface-muted)}.mqtt-row--in{border-left:3px solid var(--color-mqtt-in)}.mqtt-row--out{border-left:3px solid var(--color-mqtt-out)}.mqtt-row--error{border-color:var(--color-error-border);background:var(--color-error-bg)}.mqtt-row__header{display:flex;flex-wrap:wrap;align-items:center;gap:.35rem .5rem;font-size:.75rem}.mqtt-row__direction{font-weight:700;color:var(--color-mqtt-direction)}.mqtt-row__topic{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--color-text-subtle);word-break:break-all}.mqtt-row__qos,.mqtt-row__time{color:var(--color-text-muted)}.mqtt-row__time{margin-left:auto}.mqtt-badge{display:inline-block;padding:.1rem .4rem;border-radius:4px;font-size:.65rem;font-weight:700;text-transform:uppercase;letter-spacing:.03em}.mqtt-badge--status{background:var(--color-mqtt-badge-status-bg);color:var(--color-mqtt-badge-status-text)}.mqtt-badge--summary{background:var(--color-mqtt-badge-summary-bg);color:var(--color-mqtt-badge-summary-text)}.mqtt-badge--control{background:var(--color-mqtt-badge-control-bg);color:var(--color-mqtt-badge-control-text)}.mqtt-badge--system{background:var(--color-mqtt-badge-system-bg);color:var(--color-mqtt-badge-system-text)}.mqtt-row__details{margin-top:.35rem}.mqtt-row__summary{cursor:pointer;font-size:.75rem;color:var(--color-text-muted)}.mqtt-row__payload{margin:.35rem 0 0;padding:.5rem;background:var(--color-code-bg);color:var(--color-code-text);border-radius:6px;font-size:.72rem;line-height:1.4;overflow-x:auto;white-space:pre-wrap;word-break:break-word}
