:root {
    --ink: #1e293b;
    --muted: #64748b;
    --accent: #4f46e5;
    --accent-deep: #312e81;
    --hot: #e11d48;
    --line: rgba(79, 70, 229, 0.14);
    --shadow: 0 10px 24px rgba(49, 46, 129, 0.1);
}
body {
    margin: 0;
    font: 16px/1.45 "Segoe UI", sans-serif;
    color: var(--ink);
    background-color: #eef2ff;
    background-image:
        radial-gradient(920px 440px at -8% -18%, #c4b5fd 0%, transparent 58%),
        radial-gradient(820px 400px at 108% -12%, #67e8f9 0%, transparent 54%),
        radial-gradient(680px 360px at 92% 108%, #fda4af 0%, transparent 50%);
    background-repeat: no-repeat;
    background-attachment: fixed;
}
h1 {
    font-size: 1.4rem;
    margin: 0.2rem 0 0.8rem;
    background: linear-gradient(90deg, var(--accent-deep), var(--accent) 55%, #0891b2);
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
}
h2 { font-size: 1.05rem; margin: 0 0 0.4rem; }
a { color: var(--accent); }
.top {
    position: relative;
    display: flex;
    flex-wrap: wrap;
    gap: 0.65rem 0.85rem;
    align-items: center;
    padding: 0.6rem 1.1rem;
    background: linear-gradient(105deg, #1e1b4b 0%, var(--accent) 48%, #0891b2 100%);
    box-shadow: 0 8px 28px rgba(49, 46, 129, 0.38);
}
.top::before {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    top: 0;
    height: 46%;
    background: linear-gradient(180deg, rgba(255, 255, 255, 0.28), transparent);
    pointer-events: none;
}
.top a, .nav, .who { position: relative; }
.top a { color: #fff; text-decoration: none; }
.brand { font-weight: 700; }
.nav { display: inline-flex; gap: 0.15rem; padding: 0.2rem; background: rgba(255, 255, 255, 0.16); border-radius: 999px; }
.nav a { padding: 0.28rem 0.75rem; border-radius: 999px; color: rgba(255, 255, 255, 0.84); }
.nav a:hover { color: #fff; background: rgba(255, 255, 255, 0.16); }
.nav a[aria-current="page"], .nav a[aria-current="page"]:hover { background: #fff; color: var(--accent-deep); font-weight: 600; }
.who { margin-left: auto; color: #e0e7ff; font-size: 0.92rem; }
.logout { border: 1px solid rgba(255, 255, 255, 0.55); border-radius: 999px; padding: 0.22rem 0.72rem; }
.logout:hover { background: rgba(255, 255, 255, 0.16); }
.top a[download] { background: #fff; color: var(--accent-deep); font-weight: 600; border-radius: 999px; padding: 0.22rem 0.72rem; }
.top a[download]:hover { background: #e0e7ff; }
main { max-width: 880px; margin: 0 auto; padding: 1rem; }
main.wide { max-width: 1100px; }
.cards { display: grid; gap: 0.75rem; }
.card, .tile, .panel, .login { background: #fff; border: 1px solid var(--line); box-shadow: var(--shadow); }
.card {
    position: relative;
    display: block;
    overflow: hidden;
    border-radius: 12px;
    padding: 0.9rem 1rem 0.9rem 1.15rem;
    text-decoration: none;
    color: inherit;
    transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.card::before { content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 5px; background: linear-gradient(var(--stripe, #818cf8), color-mix(in srgb, var(--stripe, #818cf8) 45%, #fff)); }
.card:hover { transform: translateY(-2px); box-shadow: 0 14px 30px rgba(79, 70, 229, 0.18); }
.card p { margin: 0.2rem 0; }
.card-top { display: flex; align-items: center; gap: 0.85rem; margin: 0 0 0.35rem; }
.card-top h2, .card-top p { margin: 0; }
.mark { width: 40px; height: 53px; flex: none; display: block; }
.device-head { display: flex; align-items: center; gap: 0.85rem; }
.device-head h1 { margin-top: 0; }
.device-head .mark { width: 48px; height: 64px; margin: 0 0 0.8rem; }
.muted { color: var(--muted); }
.live { color: #059669; font-weight: 700; }
.down { color: var(--hot); font-weight: 700; }
.tiles { display: flex; flex-wrap: wrap; gap: 0.6rem; margin: 0.8rem 0; }
.tile { border-radius: 12px; padding: 0.55rem 0.75rem; min-width: 7rem; border-top: 3px solid var(--accent); }
.tile b, .tile span { display: block; }
.tile b { font-size: 1.25rem; font-weight: 600; }
.panel { border-radius: 12px; padding: 0.85rem 1rem; margin: 0.8rem 0; }
.light { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 0.65rem 1rem; }
.pair { display: inline-flex; gap: 0.15rem; padding: 0.15rem; background: #eef2ff; border-radius: 999px; }
.pair button { background: transparent; color: var(--accent); box-shadow: none; border-radius: 999px; padding: 0.28rem 0.85rem; }
.pair button[aria-pressed="true"] { background: linear-gradient(180deg, #818cf8, var(--accent)); color: #fff; box-shadow: 0 4px 10px rgba(79, 70, 229, 0.28); }
.panel.light label { flex: 1 1 9rem; flex-direction: column; align-items: stretch; gap: 0.1rem; margin: 0; font-size: 0.85rem; }
.light label b { color: var(--ink); font-weight: 600; }
.light input[type="range"] { width: 100%; margin: 0; padding: 0; accent-color: #ca8a04; }
.light .warm input { direction: rtl; }
.light[aria-busy="true"] { opacity: 0.55; }
.light .error { flex-basis: 100%; margin: 0; }
.panel[data-kind] { border-top: 3px solid var(--accent); }
.tile[data-kind="temperature"], .panel[data-kind="temperature"] { border-top-color: #f97316; }
.tile[data-kind="humidity"], .panel[data-kind="humidity"] { border-top-color: #0891b2; }
.tile[data-kind="watts"], .panel[data-kind="watts"] { border-top-color: #7c3aed; }
.tile[data-kind="battery"], .panel[data-kind="battery"] { border-top-color: #16a34a; }
.tile[data-kind="occupancy"], .panel[data-kind="occupancy"] { border-top-color: #db2777; }
.tile[data-kind="state"], .panel[data-kind="state"],
.tile[data-kind="onoff"], .panel[data-kind="onoff"] { border-top-color: #ca8a04; }
.ranges, .pick-actions { display: inline-flex; gap: 0.15rem; padding: 0.2rem; background: #fff; border: 1px solid #c7d2fe; border-radius: 999px; box-shadow: 0 4px 12px rgba(49, 46, 129, 0.08); }
.ranges button, .pick-actions button { padding: 0.25rem 0.7rem; border-radius: 999px; background: transparent; color: var(--accent); box-shadow: none; }
.ranges button:hover, .pick-actions button:hover { background: #eef2ff; filter: none; }
.ranges button.on, .ranges button.on:hover { background: linear-gradient(180deg, #818cf8, var(--accent)); color: #fff; box-shadow: 0 4px 10px rgba(79, 70, 229, 0.32); }
.line, form.line { display: flex; gap: 0.5rem; flex-wrap: wrap; align-items: center; }
.rule { display: flex; flex-wrap: wrap; align-items: center; gap: 0.45rem 0.75rem; }
.rule p { margin: 0; flex: 1 1 16rem; }
.rule form { margin: 0; }
#rule-form { display: flex; flex-direction: column; gap: 0.7rem; }
#rule-form > p { margin: 0; }
#rule-form .rule-head,
#clock-fields:not([hidden]),
#reading-fields:not([hidden]) { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 0.55rem 0.75rem; }
#rule-form .rule-head > label:first-child,
#clock-fields > label,
#reading-fields > label { flex-direction: column; align-items: flex-start; gap: 0.15rem; margin: 0; color: var(--muted); font-size: 0.78rem; font-weight: 600; }
#rule-form .rule-head > label:first-child { flex: 1 1 16rem; }
#rule-form .rule-head > label:first-child input { width: 100%; }
#rule-form .rule-head > label:last-child { gap: 0.4rem; padding-bottom: 0.4rem; }
#reading-fields > label:nth-child(-n+2) { flex: 1 1 8rem; }
#reading-fields select[name=watch],
#reading-fields select[name=watch_kind] { width: 100%; min-width: 8rem; }
#reading-fields select[name=op] { min-width: 5.5rem; }
#reading-fields #threshold-slot input,
#reading-fields #threshold-slot select,
#reading-fields input[name=hold_sec] { width: 5.5rem; }
#rule-form .action-row { width: 100%; }
#rule-form .action-row select[name="action_node[]"] { flex: 1 1 9rem; }
#rule-form .action-value:has(input[type="range"]) { display: flex; align-items: center; gap: 0.45rem; flex: 2 1 12rem; min-width: 9rem; }
#rule-form .action-value input[type="range"] { flex: 1; width: auto; min-width: 6rem; margin: 0; padding: 0; accent-color: #ca8a04; }
#rule-form .action-value.warm input { direction: rtl; }
#rule-form .action-value b { min-width: 3.6rem; font-size: 0.92rem; font-weight: 600; }
#rule-form input:not([type="checkbox"]):not([type="radio"]),
#rule-form select { color: var(--ink); font-size: 1rem; font-weight: 400; }
.chips label input:focus { outline: none; }
label { display: flex; flex-direction: column; gap: 0.2rem; margin: 0.45rem 0; }
.panel label, .line label { flex-direction: row; align-items: center; margin: 0; }
.tabbar { display: inline-flex; gap: 0.15rem; padding: 0.2rem; margin: 0 0 0.85rem; background: rgba(255, 255, 255, 0.72); border-radius: 12px; box-shadow: var(--shadow); }
.tabbar a { display: inline-flex; align-items: center; gap: 0.4rem; padding: 0.32rem 0.7rem 0.32rem 0.85rem; border-radius: 9px; color: var(--accent); text-decoration: none; }
.tabbar a:hover { background: rgba(255, 255, 255, 0.7); }
.tabbar a.on, .tabbar a.on:hover { background: linear-gradient(180deg, #818cf8, var(--accent)); color: #fff; box-shadow: 0 6px 14px rgba(79, 70, 229, 0.32); }
.tabbar span { min-width: 1.15rem; padding: 0 0.35rem; border-radius: 999px; background: #e0e7ff; color: var(--accent-deep); font-size: 0.75rem; line-height: 1.25rem; text-align: center; }
.tabbar a.on span { background: rgba(255, 255, 255, 0.28); color: #fff; }
.manage input:not([type="checkbox"]):not([type="radio"]):not([type="range"]), .manage select, .manage textarea { border: 1px solid #c7d2fe; border-radius: 8px; background: #fff; box-sizing: border-box; }
.manage input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):focus, .manage select:focus, .manage textarea:focus { outline: 2px solid var(--accent); border-color: var(--accent); }
.manage button, .chips label, .tabbar a { cursor: pointer; }
.people { padding: 0.25rem 1rem 0.4rem; }
.add-row { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; }
.add-row input { width: 12rem; }
.user-row { display: grid; grid-template-columns: 9rem minmax(8rem, 1fr) auto auto auto; grid-template-areas: "name pass save chips del"; align-items: center; gap: 0.45rem 0.65rem; padding: 0.55rem 0; }
.people .user-row + .user-row { border-top: 1px solid #e0e7ff; }
.user-row .name { grid-area: name; padding-left: 0.55rem; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.user-row .user { grid-area: name; width: 100%; min-width: 0; }
.user-row .pass { grid-area: pass; width: 100%; min-width: 0; }
.user-row .save { grid-area: save; }
.user-row .del { grid-area: del; }
.user-row .chips { grid-area: chips; }
.manage p { margin: 0.6rem 0 0.1rem; }
.chips { display: flex; flex-wrap: wrap; gap: 0.35rem; align-items: center; }
.chips label { display: inline-flex; flex-direction: row; align-items: center; gap: 0.3rem; margin: 0; padding: 0.16rem 0.6rem 0.16rem 0.38rem; border: 1px solid #c7d2fe; border-radius: 999px; background: #f5f7ff; }
.chips label:hover { border-color: var(--accent); }
.chips label:focus-within { outline: 2px solid var(--accent); outline-offset: 1px; }
.chips label:has(input:checked) { background: #e0e7ff; border-color: var(--accent); color: var(--accent-deep); }
.chips label:has(input:disabled) { opacity: 0.72; }
.chips label:has(input:disabled):hover { border-color: #c7d2fe; }
.chips label input { margin: 0; accent-color: var(--accent); }
#device-picks { gap: 0.5rem; }
#device-picks label { position: relative; gap: 0.45rem; padding: 0.4rem 0.85rem 0.4rem 0.55rem; border: 1px solid #c7d2fe; border-radius: 999px; background: #fff; color: #64748b; font-weight: 600; }
#device-picks label::before { content: ""; width: 0.85rem; height: 0.85rem; border-radius: 50%; background: var(--swatch, var(--accent)); box-shadow: 0 0 0 2px #fff, 0 0 8px var(--swatch, var(--accent)); flex: none; }
#device-picks input { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; }
#device-picks label:hover { border-color: var(--swatch, var(--accent)); color: var(--ink); }
#device-picks label:has(input:checked) { background: color-mix(in srgb, var(--swatch, var(--accent)) 22%, #fff); border-color: var(--swatch, var(--accent)); color: var(--ink); box-shadow: 0 6px 14px color-mix(in srgb, var(--swatch, var(--accent)) 32%, transparent); }
button.danger.ghost { background: transparent; color: var(--hot); box-shadow: none; }
button.danger.ghost:hover { background: #ffe4e6; filter: none; }
.access { display: flex; flex-wrap: wrap; gap: 0.4rem; margin-top: 0.7rem; }
.access label { gap: 0.4rem; margin: 0; padding: 0.22rem 0.4rem 0.22rem 0.65rem; background: #eef2ff; border-radius: 8px; }
input, select, textarea, button { font: inherit; }
input, select, textarea { padding: 0.35rem 0.5rem; }
input:focus, select:focus { outline: 2px solid var(--accent); border-color: var(--accent); }
button { background: linear-gradient(180deg, #818cf8, var(--accent)); color: #fff; border: 0; border-radius: 8px; padding: 0.4rem 0.75rem; box-shadow: 0 6px 14px rgba(79, 70, 229, 0.32); cursor: pointer; }
button:hover { filter: brightness(1.08); }
button.danger { background: linear-gradient(180deg, #fb7185, var(--hot)); box-shadow: 0 6px 14px rgba(225, 29, 72, 0.28); }
.error { color: var(--hot); }
.log { display: grid; grid-template-columns: 4.5rem minmax(6rem, 10rem) minmax(0, 1fr) auto; gap: 0.15rem 0.75rem; align-items: baseline; padding: 0.4rem 0; }
.people .log + .log { border-top: 1px solid #e0e7ff; }
.log time, .log .src, .log b span { color: var(--muted); font-weight: 400; }
.login { max-width: 22rem; margin: 8vh auto; padding: 1.2rem 1.3rem; border-radius: 14px; }
.login label { display: flex; }
dl { display: grid; grid-template-columns: 7rem 1fr; gap: 0.25rem 0.6rem; margin: 0; }
dt { color: var(--muted); }
dd { margin: 0; }
ul { margin: 0.3rem 0 0; padding-left: 1.1rem; }
.mesh { background: linear-gradient(180deg, #f8fafc, #eef2ff); border: 1px solid var(--line); border-radius: 12px; }
.mesh svg { display: block; width: 100%; height: auto; }
@media (max-width: 640px) {
    .tiles { display: grid; grid-template-columns: 1fr 1fr; }
    .who { display: none; }
    .logout { margin-left: auto; }
}
@media (max-width: 760px) {
    .user-row { grid-template-columns: minmax(0, 1fr) auto; grid-template-areas: "name del" "pass save" "chips chips"; }
    .add-row input { width: 100%; }
}
