:root { --font-body: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; --font-title: 'Roboto Mono', 'IBM Plex Mono', 'SFMono-Regular', Consolas, monospace; --bg: #0b0d10; --sidebar: #0f1216; --surface: #14181d; --surface-2: #191e24; --surface-3: #20262d; --border: #2b323a; --border-soft: #20262d; --text: #e5e8eb; --muted: #9aa3ad; --faint: #6e7781; --accent: #68b8aa; --blue: #3d8f84; --green: #47c99d; --red: #ef7181; --amber: #d7ad69; --focus: #7bc8bb; --shadow: 0 16px 42px #0007; --bg-glow-1: #4f8f8212; --bg-glow-2: #ffffff05; --sidebar-width: 220px; --radius: 7px; color-scheme: dark } :root[data-theme=light] { --bg: #f1f4f3; --sidebar: #f7f9f8; --surface: #ffffff; --surface-2: #f2f5f4; --surface-3: #e7ecea; --border: #d1d9d6; --border-soft: #e3e8e6; --text: #20282a; --muted: #626f72; --faint: #879194; --accent: #3f8f82; --blue: #347c72; --green: #278c6d; --red: #c24f5d; --amber: #96682d; --focus: #4f9c90; --shadow: 0 12px 34px #26332f12; --bg-glow-1: #79aa9f17; --bg-glow-2: #ffffffb8; color-scheme: light } :root[data-font=adwaita_mono] { --font-body: 'Adwaita Mono', 'Roboto Mono', 'IBM Plex Mono', 'SFMono-Regular', Consolas, monospace; --font-title: var(--font-body) } :root[data-font=hack] { --font-body: Hack, 'Roboto Mono', 'IBM Plex Mono', 'SFMono-Regular', Consolas, monospace; --font-title: var(--font-body) } * { box-sizing: border-box } html { min-height: 100%; background: var(--bg); scroll-behavior: smooth } body { margin: 0; font-family: var(--font-body); font-size: 13px; line-height: 1.5; color: var(--text); background: radial-gradient(ellipse at 85% -10%, var(--bg-glow-1), transparent 42%), radial-gradient(ellipse at 15% 110%, var(--bg-glow-2), transparent 38%), var(--bg) } button, input, textarea, select { font: inherit } button, a, input, select, textarea { -webkit-tap-highlight-color: transparent } button { cursor: pointer } a { color: var(--accent); text-decoration: none } a:hover { text-decoration: underline } button:disabled { cursor: not-allowed; opacity: .44 } button:focus-visible, a:focus-visible, input:focus-visible, select:focus-visible, textarea:focus-visible { outline: 2px solid var(--focus); outline-offset: 3px } ::selection { background: #68b8aa55 } h1, h2, h3, p { margin: 0 } h1 { font-family: var(--font-title); font-size: 24px; line-height: 1.3; letter-spacing: -.8px; font-weight: 600 } h2 { font-size: 13px; font-weight: 600 } h3 { font-size: 12px; font-weight: 600 } small { font-size: 11px; color: var(--muted) } hr { border: 0; border-top: 1px solid var(--border-soft); margin: 20px 0 } [hidden] { display: none !important } .icon { width: 18px; height: 18px; flex-shrink: 0; vertical-align: middle } .mono, code, pre { font-family: var(--font-title) } .muted { color: var(--muted) } .accent { color: var(--accent) } .success-text { color: var(--green) } .danger-text { color: var(--red) } .nowrap { white-space: nowrap } .break { overflow-wrap: anywhere } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0 } .skip-link { position: fixed; top: -70px; left: 10px; padding: 10px 16px; background: var(--blue); color: #fff; z-index: 1000 } .skip-link:focus { top: 8px } .boot { display: flex; gap: 14px; align-items: center; justify-content: center; min-height: 100vh; color: var(--accent) } .spinner { display: inline-block; width: 18px; height: 18px; border: 2px solid var(--border); border-top-color: var(--accent); border-radius: 50%; animation: spin .7s linear infinite; flex-shrink: 0 } @keyframes spin { to { transform: rotate(360deg) } } .layout { min-height: 100vh; padding-left: var(--sidebar-width); padding-top: 58px } .topbar { position: fixed; top: 0; left: 0; right: 0; height: 58px; display: flex; align-items: center; padding: 0 20px; gap: 14px; border-bottom: 1px solid var(--border); background: var(--sidebar); z-index: 30 } .brand { display: flex; gap: 11px; align-items: center; color: var(--text); font-weight: 600; letter-spacing: -.2px; white-space: nowrap; font-size: 14px } .brand:hover { text-decoration: none } .brand .icon { width: 25px; height: 25px; color: var(--accent) } .brand-sub { font-weight: 400; color: var(--muted); font-size: 11px } .topbar-spacer { flex: 1 } .topbar .language-select { height: 30px; width: auto; min-width: 66px; padding: 3px 20px 3px 7px; border-color: var(--border); background-color: var(--sidebar); color: var(--text); color-scheme: inherit; font-size: 11px } .topbar .language-select option { background-color: var(--sidebar); color: var(--text) } .user-chip { display: flex; gap: 7px; align-items: center; font-size: 12px; color: var(--muted) } .user-chip .icon { width: 15px; height: 15px } .topbar-divider { width: 1px; height: 20px; background: var(--border) } .topbar .icon-btn { border-color: transparent; background: transparent; width: 31px; height: 31px; color: var(--muted) } .topbar .icon-btn:hover { background: var(--surface-3); color: var(--text) } .sidebar { position: fixed; top: 58px; bottom: 0; left: 0; width: var(--sidebar-width); background: var(--sidebar); border-right: 1px solid var(--border); display: flex; flex-direction: column; z-index: 25; transition: width .18s ease, transform .18s ease } .nav-section { margin: 24px 20px 9px; color: var(--faint); font-family: var(--font-title); font-size: 9px; text-transform: uppercase; letter-spacing: 1.4px } .nav { display: flex; flex-direction: column; gap: 3px; padding: 0 10px } .nav a { display: flex; align-items: center; gap: 12px; color: var(--muted); padding: 10px 12px; border-radius: 5px; border: 1px solid transparent; font-size: 12px; min-height: 41px; position: relative } .nav a:hover { text-decoration: none; background: var(--surface-2); color: var(--text) } .nav a.active { background: linear-gradient(90deg, #4d9f9228, #4d9f920b); border-color: #4d9f9240; color: var(--text) } .nav a.active:before { content: ''; position: absolute; left: -11px; top: 7px; bottom: 7px; width: 3px; border-radius: 0 3px 3px 0; background: var(--blue) } .nav a.active .icon { color: var(--accent) } .nav .icon { width: 16px; height: 16px } .sidebar-footer { margin-top: auto; padding: 18px 20px; border-top: 1px solid var(--border-soft); font-size: 11px; color: var(--muted) } .sidebar-footer .version { font-family: var(--font-title); font-size: 10px; color: var(--faint) } .api-status { display: flex; align-items: center; gap: 8px; background: none; color: inherit; border: 0; padding: 0; font-size: 11px; text-align: left } .dot { width: 6px; height: 6px; display: inline-block; border-radius: 50%; background: currentColor; flex-shrink: 0 } .api-status .dot { color: var(--green) } .api-status.offline .dot { color: var(--red) } .api-status.pending .dot { color: var(--muted) } .layout.collapsed { --sidebar-width: 68px } .collapsed .nav-label, .collapsed .nav-section, .collapsed .sidebar-meta, .collapsed .api-status span:not(.dot) { display: none } .collapsed .nav { padding-top: 20px } .collapsed .nav a { padding: 11px 13px; justify-content: center } .collapsed .sidebar-footer { padding: 20px 30px } .mobile-overlay { display: none } .main { padding: 27px 28px 30px; max-width: 1700px; margin: 0 auto; min-width: 0 } .page-heading { display: flex; align-items: flex-start; justify-content: space-between; gap: 20px; margin-bottom: 24px } .page-heading p:not(.eyebrow) { font-size: 12px; color: var(--muted); margin-top: 6px } .eyebrow { color: var(--faint); font-size: 9px; font-family: var(--font-title); letter-spacing: 1.2px; text-transform: uppercase; margin-bottom: 7px } .actions { display: flex; gap: 8px; align-items: center; flex-wrap: wrap } .page-heading>.actions { padding-top: 4px; justify-content: flex-end } .btn { display: inline-flex; align-items: center; justify-content: center; gap: 7px; border: 1px solid var(--border); border-radius: 5px; background: var(--surface-2); color: var(--text); min-height: 32px; padding: 7px 11px; font-size: 11px; font-weight: 500; line-height: 1.3; white-space: nowrap; text-decoration: none; transition: background .12s, border-color .12s } .btn:hover:not(:disabled) { background: var(--surface-3); border-color: var(--faint); text-decoration: none } .btn.primary { background: linear-gradient(135deg, #3e9186, #32776e); border-color: #58a99d; color: #fff; box-shadow: 0 2px 10px #1b5e5528 } .btn.primary:hover:not(:disabled) { background: #499d91; border-color: #73bcb1 } .btn.danger { color: var(--red); border-color: #d94c654d; background: #da335110 } .btn.danger:hover:not(:disabled) { background: #da335128; border-color: var(--red) } .btn.ghost { background: transparent; border-color: transparent; color: var(--muted) } .btn .icon { width: 14px; height: 14px } .btn.icon-btn { padding: 6px; width: 31px; height: 31px; min-height: 31px; flex-shrink: 0 } .btn.icon-btn .icon { width: 15px; height: 15px } .btn.small { font-size: 10px; min-height: 27px; padding: 5px 8px } .reverse .icon { transform: rotate(180deg) } .is-busy { position: relative } .is-busy .icon { opacity: .3 } .is-busy:before { content: ''; width: 11px; height: 11px; display: inline-block; border: 1px solid currentColor; border-right-color: transparent; border-radius: 50%; animation: spin .7s linear infinite } .is-busy .icon { display: none } .link-btn { background: none; border: none; padding: 0; color: var(--accent); font-size: 11px } .cards-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 14px; margin-bottom: 20px } .metric { display: grid; grid-template-rows: auto 1fr; background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 14px 16px; min-height: 82px } .metric-icon { display: flex; align-items: center; justify-content: center; width: 37px; height: 37px; border-radius: 6px; border: 1px solid #4d9f9244; background: #4d9f9210; color: var(--accent); flex-shrink: 0 } .metric-icon .icon { width: 21px; height: 21px } .metric-label { color: var(--muted); font-size: 10px; margin: 0 0 7px } .metric-main { display: flex; align-items: flex-end; justify-content: space-between; gap: 14px; min-width: 0 } .metric-value { font-size: 22px; line-height: 1.15; font-family: var(--font-title); letter-spacing: -.7px; color: var(--text); min-width: 0 } .metric-value.small-value { font-size: 15px; line-height: 1.35; letter-spacing: -.3px } .metric-note { font-size: 10px; color: var(--faint); margin: 0 0 1px auto; text-align: right; line-height: 1.35; min-width: 0 } .metric-note .success-text, .metric-note .danger-text { margin-left: 8px; white-space: nowrap } .metric-note .success-text:first-child, .metric-note .danger-text:first-child { margin-left: 0 } .grid-2 { display: grid; grid-template-columns: 1.65fr 1fr; gap: 18px; align-items: start } .grid-equal { display: grid; grid-template-columns: 1fr 1fr; gap: 18px } .stack { display: flex; flex-direction: column; gap: 18px; min-width: 0 } .card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); min-width: 0; overflow: hidden } .card-header { display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 15px 18px; border-bottom: 1px solid var(--border-soft); min-height: 51px } .card-header h2 { font-size: 12px; color: var(--text) } .card-header .icon { color: var(--accent) } .card-body { padding: 18px } .card-foot { padding: 13px 18px; border-top: 1px solid var(--border-soft) } .table-wrap { overflow-x: auto; overscroll-behavior-x: contain } table { border-collapse: collapse; width: 100%; text-align: left; font-size: 11px } th { color: var(--muted); font-weight: 500; font-size: 10px; text-align: left; padding: 11px 14px; background: var(--surface-2); border-bottom: 1px solid var(--border); white-space: nowrap } td { padding: 12px 14px; border-bottom: 1px solid var(--border-soft); vertical-align: middle } tbody tr:last-child td { border-bottom: none } tbody tr:hover { background: #68b8aa0a } td strong { font-weight: 500 } td .subline { display: block; font-size: 10px; color: var(--faint); margin-top: 3px } td .filename { max-width: 260px; display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: var(--font-title); font-size: 10px } .row-actions { display: flex; gap: 4px; align-items: center; justify-content: flex-end } .row-actions .btn { width: 27px; height: 27px; min-height: 27px; background: transparent; border-color: transparent } .row-actions .btn:hover { border-color: var(--border); background: var(--surface-3) } .row-actions .btn .icon { width: 14px; height: 14px } .checkbox-cell { width: 35px; padding-right: 0 } .checkbox-cell input { margin: 0; width: 14px; height: 14px } .table-footer { display: flex; justify-content: space-between; align-items: center; padding: 12px 17px; border-top: 1px solid var(--border-soft); font-size: 10px; color: var(--muted) } .table-footer .btn { min-height: 25px; width: 25px; height: 25px; padding: 4px } .badge { display: inline-flex; align-items: center; gap: 6px; font-size: 10px; white-space: nowrap; color: var(--accent) } .badge.success { color: var(--green) } .badge.danger { color: var(--red) } .badge.warning { color: var(--amber) } .badge.muted { color: var(--muted) } .tag { display: inline-block; border: 1px solid var(--border); color: var(--muted); border-radius: 4px; padding: 2px 6px; font-family: var(--font-title); font-size: 9px } .tag.export { background: #68b8aa0a; color: var(--accent); border-color: #68b8aa33 } .tag.binary { background: #4f80ff0b; color: #a1baff; border-color: #658cf033 } .empty { padding: 42px 25px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; color: var(--muted); text-align: center; min-height: 150px } .empty>.icon { width: 34px; height: 34px; color: var(--faint) } .empty strong { font-size: 12px; font-weight: 500; color: var(--muted) } .empty p { font-size: 11px; max-width: 350px; color: var(--faint) } .loading { display: flex; justify-content: center; align-items: center; gap: 12px; min-height: 260px; color: var(--muted); font-size: 12px } .error-panel { padding: 35px; text-align: center; border: 1px solid #d94c654d; border-radius: 7px; background: #da335108; color: var(--red) } .error-panel p { margin: 10px 0 20px; white-space: pre-wrap } .error-panel .icon { width: 30px; height: 30px } .status-layout { display: flex; align-items: center; justify-content: center; padding: 23px 20px; gap: 35px } .donut { position: relative; width: 130px; height: 130px; flex-shrink: 0 } .donut svg { width: 100%; height: 100%; transform: rotate(-90deg) } .donut circle { fill: none; stroke-width: 12 } .donut .track { stroke: var(--surface-3) } .donut .segment-online { stroke: var(--green) } .donut .segment-offline { stroke: var(--red) } .donut .segment-unknown { stroke: var(--faint) } .donut-label { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; font-family: var(--font-title); font-size: 26px } .donut-label small { font-size: 9px; font-family: var(--font-body); color: var(--muted); margin-top: 3px } .legend { display: flex; flex-direction: column; gap: 14px; flex: 1; max-width: 150px } .legend-row { display: flex; justify-content: space-between; align-items: center; gap: 20px; font-size: 11px } .legend-row strong { font-family: var(--font-title); font-size: 12px } .quick-actions { display: flex; gap: 10px; flex-wrap: wrap; padding: 16px } .quick-actions .btn { flex: 1 } .bar-chart { display: flex; gap: 12px; align-items: end; height: 140px; padding: 0 5px } .bar-column { flex: 1; min-width: 0; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: end; gap: 7px } .bar-column .bar { width: 100%; max-width: 36px; background: linear-gradient(180deg, #21b8eb99, #0c72c455); border: 1px solid #29a4dc66; border-radius: 3px 3px 0 0; min-height: 2px } .bar-column small { font-family: var(--font-title); font-size: 9px } .bar-column b { font-family: var(--font-title); font-size: 10px; font-weight: 500; color: var(--accent) } .capacity-row { margin-bottom: 16px } .capacity-row:last-child { margin-bottom: 0 } .capacity-label { display: flex; justify-content: space-between; gap: 12px; font-size: 11px; color: var(--muted); margin-bottom: 8px } .capacity-label strong { font-size: 11px; color: var(--text); font-weight: 500; font-family: var(--font-title) } progress { display: block; width: 100%; height: 5px; border: 0; border-radius: 5px; background: var(--surface-3); appearance: none } progress::-webkit-progress-bar { background: var(--surface-3); border-radius: 5px } progress::-webkit-progress-value { background: var(--blue); border-radius: 5px } progress::-moz-progress-bar { background: var(--blue); border-radius: 5px } progress.success::-webkit-progress-value { background: var(--green) } progress.success::-moz-progress-bar { background: var(--green) } progress.warning::-webkit-progress-value { background: var(--amber) } progress.warning::-moz-progress-bar { background: var(--amber) } .activity-list { padding: 0 18px } .activity-item { padding: 13px 0; display: flex; gap: 12px; border-bottom: 1px solid var(--border-soft); align-items: start } .activity-item:last-child { border: 0 } .activity-item>.icon { color: var(--accent); width: 15px; height: 15px; margin-top: 2px } .activity-item p { font-size: 11px; overflow-wrap: anywhere } .activity-item small { display: block; color: var(--faint); font-size: 10px; margin-top: 4px } .notice { display: flex; gap: 10px; align-items: flex-start; padding: 12px 15px; border: 1px solid #2397cd44; background: #158dcc0a; border-radius: 5px; color: var(--muted); font-size: 11px; line-height: 1.6 } .notice .icon { width: 16px; height: 16px; color: var(--accent); margin-top: 1px; flex-shrink: 0 } .notice.warning { border-color: #c58a3d44; color: var(--amber); background: #e2992d08 } .filter-bar { display: flex; gap: 10px; align-items: end; flex-wrap: wrap; padding: 14px; margin-bottom: 18px; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface) } .filter-bar .field { flex: 1; min-width: 110px; margin: 0 } .filter-bar .field.search-field { flex: 2; min-width: 180px } .filter-bar .field>span { font-size: 9px; color: var(--faint) } .filter-bar input, .filter-bar select { height: 33px; font-size: 11px } .filter-bar .btn { height: 33px; min-height: 33px } .field { display: flex; flex-direction: column; gap: 7px; min-width: 0 } .field>span { font-size: 11px; color: var(--muted); font-weight: 400 } .field small { font-size: 10px; line-height: 1.5; overflow-wrap: anywhere } .required { color: var(--accent) } input, textarea, select { min-width: 0; width: 100%; border: 1px solid var(--border); border-radius: 5px; background: var(--bg); color: var(--text); padding: 9px 10px; font-size: 12px } input::placeholder, textarea::placeholder { color: var(--faint); opacity: 1 } input[type=checkbox] { width: 15px; height: 15px; accent-color: var(--blue); cursor: pointer } input[type=time] { min-height: 37px } textarea { resize: vertical; font-family: var(--font-title); font-size: 11px; line-height: 1.6 } select { cursor: pointer } .form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 18px } .form-grid>.wide { grid-column: 1/-1 } .form-error { color: var(--red); padding: 12px; background: #d63d5110; border: 1px solid #d63d5133; border-radius: 5px; margin: 0 0 16px; font-size: 12px; white-space: pre-wrap } .form-actions { display: flex; justify-content: flex-end; gap: 10px; padding-top: 20px; margin-top: 20px; border-top: 1px solid var(--border-soft) } .toggle-row { display: flex; align-items: center; position: relative; justify-content: space-between; gap: 16px; padding: 12px 0; border-bottom: 1px solid var(--border-soft) } .toggle-row:last-child { border-bottom: none } .toggle-row strong { font-size: 11px; font-weight: 500 } .toggle-row small { display: block; max-width: 420px; margin-top: 4px; font-size: 10px } .toggle-row input { position: absolute; right: 0; opacity: 0; width: 34px; height: 20px; z-index: 1 } .toggle-track { position: relative; width: 31px; height: 17px; background: var(--surface-3); border: 1px solid var(--border); border-radius: 20px; flex-shrink: 0 } .toggle-track:before { content: ''; position: absolute; top: 2px; left: 2px; width: 11px; height: 11px; border-radius: 50%; background: var(--muted); transition: transform .15s } .toggle-row input:checked+.toggle-track { background: var(--blue); border-color: var(--blue) } .toggle-row input:checked+.toggle-track:before { transform: translateX(13px); background: #fff } .toggle-row input:focus-visible+.toggle-track { outline: 2px solid var(--focus); outline-offset: 3px } .checkbox-label { display: flex; gap: 8px; align-items: center; color: var(--muted); font-size: 11px } .checkbox-label input { width: 14px; height: 14px; flex-shrink: 0 } .secret-field .checkbox-label { margin-top: 8px; font-size: 10px } .section-title { margin: 7px 0 18px; font-size: 12px; color: var(--accent); font-weight: 500 } .section-hint { font-size: 11px; color: var(--muted); margin: -9px 0 18px } .data-list { display: grid; grid-template-columns: minmax(100px, 1fr) minmax(100px, 1.4fr); gap: 13px 20px; font-size: 11px } .data-list dt { color: var(--muted); margin: 0 } .data-list dd { margin: 0; overflow-wrap: anywhere } .data-list .mono { font-size: 10px } .device-heading { display: flex; align-items: center; gap: 15px } .device-heading .metric-icon { height: 48px; width: 48px } .device-heading h1 { font-size: 23px } .device-heading p { font-size: 12px; color: var(--muted); margin: 6px 0 7px } .device-heading .badge { font-size: 10px } .tabs { display: flex; gap: 4px; overflow-x: auto; padding: 4px; border: 1px solid var(--border); border-radius: 6px; background: var(--surface); margin-bottom: 20px } .tab { border: 0; border-radius: 4px; background: transparent; color: var(--muted); padding: 9px 16px; font-size: 11px; white-space: nowrap; flex-shrink: 0 } .tab:hover { color: var(--text); background: var(--surface-2) } .tab.active { color: var(--accent); background: var(--surface-3) } .detail-grid { margin-bottom: 20px } .policy-card .card-body { padding-top: 6px; padding-bottom: 6px } .select-summary { font-size: 11px; color: var(--muted); margin-left: auto } .selected-row { background: #68b8aa0d } .settings-form>.card { margin-bottom: 18px } .scheduler-table td { padding: 13px 17px } .scheduler-table .next-runs { display: flex; flex-direction: column; gap: 3px; font-family: var(--font-title); font-size: 10px } .schedule-fields { display: grid; grid-template-columns: 1.4fr 1fr 1.2fr; gap: 13px } .schedule-fields>.wide { grid-column: 1/-1 } .schedule-cron-preview { font-size: 10px; color: var(--faint); margin-top: 10px; font-family: var(--font-title) } .settings-layout { display: grid; grid-template-columns: minmax(0, 1fr) 300px; gap: 20px; align-items: start } .settings-layout>.card { position: sticky; top: 80px } .preference-card .form-grid { grid-template-columns: 1fr } .settings-save { display: flex; justify-content: flex-end; gap: 9px; margin-top: 18px } .settings-save .btn { min-width: 140px } .mono-pre { white-space: pre; overflow: auto; background: var(--bg); padding: 17px; border: 1px solid var(--border); border-radius: 5px; font-size: 11px; line-height: 1.7; tab-size: 4; max-height: 65vh; margin: 0 } .secret-preview { max-height: 180px; font-size: 10px } .diff-controls { display: grid; grid-template-columns: 1fr 1.6fr 32px 1.6fr auto; gap: 10px; align-items: end; padding: 16px; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); margin-bottom: 18px } .diff-controls select { height: 35px; font-size: 11px } .diff-controls .field>span { font-size: 10px } .diff-controls .btn { height: 35px } .diff-toolbar { display: flex; align-items: center; gap: 15px; flex-wrap: wrap; padding: 12px 15px; border-bottom: 1px solid var(--border) } .diff-toolbar .tabs { margin: 0; padding: 2px; border: 0; background: var(--bg) } .diff-toolbar .tab { padding: 6px 10px; font-size: 10px } .diff-toolbar input[type=search] { width: 190px; font-size: 11px; padding: 7px 9px } .diff-stats { display: flex; gap: 16px; font-size: 10px; color: var(--muted); margin-left: auto } .diff-stats strong { font-family: var(--font-title); margin-left: 5px } .diff-stats .added { color: var(--green) } .diff-stats .removed { color: var(--red) } .diff-stats .modified { color: var(--amber) } .diff-split { display: grid; grid-template-columns: 1fr 1fr; min-width: 0 } .diff-pane { min-width: 0 } .diff-pane+.diff-pane { border-left: 1px solid var(--border) } .diff-title { padding: 11px 14px; background: var(--surface-2); border-bottom: 1px solid var(--border); font-family: var(--font-title); font-size: 10px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--muted) } .diff-scroll { overflow: auto; max-height: 590px; min-height: 120px; background: var(--bg); scrollbar-gutter: stable } .diff-lines { font-family: var(--font-title); font-size: 11px; line-height: 22px; min-width: max-content } .diff-line { display: flex; min-height: 22px; white-space: pre } .diff-line .line-no { display: inline-block; min-width: 43px; padding: 0 9px; color: var(--faint); text-align: right; user-select: none; border-right: 1px solid var(--border-soft); margin-right: 12px; background: #ffffff08; position: sticky; left: 0 } .diff-line .line-code { padding-right: 18px } .diff-line.added { background: #0fbd7e14; color: #67dfad } .diff-line.removed { background: #e0476917; color: #ff8f9f } .diff-line.modified { background: #d9952415; color: var(--amber) } :root[data-theme=light] .diff-line.added { color: #09694e } :root[data-theme=light] .diff-line.removed { color: #b22d43 } .diff-line.blank { background: repeating-linear-gradient(135deg, transparent, transparent 5px, #45617b08 5px, #45617b08 7px); color: var(--faint) } .diff-line.match { box-shadow: inset 3px 0 var(--accent); background: #68b8aa18 } .diff-line mark { background: #ffd84c66; color: var(--text); border-radius: 2px } .diff-unified { margin: 0; border: 0; border-radius: 0; max-height: 590px } .diff-footer { padding: 11px 15px; border-top: 1px solid var(--border-soft); display: flex; gap: 15px; align-items: center; flex-wrap: wrap; font-size: 10px; color: var(--faint) } .diff-footer>.actions { margin-left: auto } .dialog { border: 1px solid var(--border); border-radius: 9px; background: var(--surface); color: var(--text); padding: 0; width: min(590px, calc(100vw - 28px)); max-height: 89vh; box-shadow: 0 25px 100px #0008; overflow: auto } .dialog-wide { width: min(1100px, calc(100vw - 28px)) } .dialog::backdrop { background: #000000b8; backdrop-filter: blur(3px) } .dialog-header { position: sticky; top: 0; display: flex; justify-content: space-between; align-items: center; padding: 15px 20px; border-bottom: 1px solid var(--border); background: var(--surface); z-index: 2 } .dialog-header h2 { font-size: 14px } .dialog-header .btn { background: transparent; border-color: transparent } .dialog-body { padding: 22px } .dialog-actions { display: flex; justify-content: flex-end; gap: 9px; margin-top: 24px } .confirm-copy { font-size: 13px; line-height: 1.8; color: var(--muted) } .preview-meta { display: flex; gap: 15px; flex-wrap: wrap; font-size: 10px; color: var(--muted); margin-bottom: 15px } .preview-meta code { font-size: 9px; overflow-wrap: anywhere } .toasts { position: fixed; right: 22px; bottom: 23px; z-index: 120; display: flex; flex-direction: column; gap: 9px; max-width: min(430px, calc(100vw - 32px)); pointer-events: none } .toast { display: flex; align-items: flex-start; gap: 10px; padding: 13px 12px 13px 15px; background: var(--surface-2); border: 1px solid var(--border); border-left: 3px solid var(--green); border-radius: 6px; box-shadow: var(--shadow); font-size: 12px; pointer-events: auto; animation: appear .15s ease } .toast>.icon { color: var(--green); margin-top: 2px } .toast.danger { border-left-color: var(--red) } .toast.danger>.icon { color: var(--red) } .toast>span { flex: 1; white-space: pre-wrap; overflow-wrap: anywhere } .toast>.btn { width: 23px; height: 23px; min-height: 23px; padding: 3px; background: transparent; border: 0; color: var(--muted); margin-top: -3px } .toast>.btn .icon { width: 13px; height: 13px } @keyframes appear { from { transform: translateY(8px); opacity: 0 } to { transform: translateY(0); opacity: 1 } } html[data-page="auth"] body { background: var(--bg) } .auth-layout { min-height: 100vh; display: flex; flex-direction: column; background: var(--bg) } .auth-controls { display: flex; align-items: center; justify-content: center; gap: 12px; margin-bottom: 10px } .auth-controls select { height: 32px; font-size: 11px; padding: 5px 9px; width: 75px } .auth-layout .btn.primary { background: var(--blue); box-shadow: none } .auth-center { display: grid; grid-template-columns: 1fr 410px; gap: 100px; align-items: center; margin: auto; max-width: 1070px; width: 100%; padding: 50px 40px 90px } .auth-hero .eyebrow { color: var(--accent); font-size: 10px; margin-bottom: 20px } .auth-hero h1 { font-size: 42px; line-height: 1.3; letter-spacing: -1.5px; max-width: 520px } .auth-hero>p:not(.eyebrow) { font-size: 14px; color: var(--muted); line-height: 1.8; max-width: 400px; margin-top: 24px } .auth-card { background: var(--surface); border: 1px solid var(--border); border-radius: 10px; padding: 31px } .auth-card h2 { font-family: var(--font-title); font-size: 21px; margin-bottom: 8px; letter-spacing: -.5px } .auth-card>p { color: var(--muted); font-size: 12px; margin-bottom: 28px } .auth-card form { display: flex; flex-direction: column; gap: 19px } .auth-card .field { gap: 9px } .auth-card input { height: 41px } .auth-card form>.btn { height: 39px; font-size: 12px; margin-top: 5px } .auth-card .auth-link { display: block; text-align: center; font-size: 11px; margin-top: 22px } .auth-footer { text-align: center; font-size: 10px; color: var(--faint); font-family: var(--font-title); padding: 25px } .password-card { max-width: 680px } .password-hints { margin-top: 15px; display: flex; gap: 14px; flex-wrap: wrap; font-size: 10px; color: var(--muted) } .password-hints span { display: flex; gap: 5px; align-items: center } .password-hints .icon { width: 12px; height: 12px } @media(min-width:1600px) { .main { padding: 32px 36px } .cards-grid { gap: 18px } .metric { padding: 15px 18px } .grid-2 { gap: 22px } .metric-value { font-size: 24px } } @media(max-width:1250px) { .layout { --sidebar-width: 190px } .main { padding: 23px 20px } .metric { padding: 13px 14px } .metric-main { gap: 10px } .metric-icon { width: 31px; height: 31px } .metric-value { font-size: 19px } .metric-value.small-value { font-size: 13px } .status-layout { gap: 20px; padding: 22px 15px } .donut { width: 110px; height: 110px } .settings-layout { grid-template-columns: 1fr } .settings-layout>.card { position: static } .preference-card .form-grid { grid-template-columns: 1fr 1fr } .diff-controls { grid-template-columns: 1fr 1.5fr 30px 1.5fr } .diff-controls>.btn.primary { grid-column: 4; justify-self: end } .grid-2 { grid-template-columns: 1.45fr 1fr } .page-heading .actions { max-width: 52% } .auth-center { gap: 45px } } @media(max-width:1000px) { .cards-grid { grid-template-columns: 1fr 1fr } .grid-2 { grid-template-columns: 1fr } .grid-equal { grid-template-columns: 1fr 1fr } .status-layout { justify-content: start } .legend { max-width: none } .main { padding: 22px 18px } .page-heading { gap: 12px } .page-heading>.actions { max-width: none } .page-heading h1 { font-size: 21px } .device-heading h1 { font-size: 20px } .brand-sub { display: none } .auth-center { grid-template-columns: 1fr 370px; gap: 30px } .auth-hero h1 { font-size: 32px } .diff-stats { margin-left: 0 } .diff-controls { grid-template-columns: 1fr 1fr } .diff-controls>.btn:not(.primary) { grid-column: 1; justify-self: start } .diff-controls>.btn.primary { grid-column: 2 } .schedule-fields { grid-template-columns: 1fr 1fr } .schedule-fields .field:first-child { grid-column: 1/-1 } } @media(max-width:760px) { .layout, .layout.collapsed { --sidebar-width: 220px; padding-left: 0 } .topbar { height: 54px; padding: 0 12px; gap: 10px } .brand { font-size: 12px; gap: 7px } .brand .icon { width: 21px; height: 21px } .topbar .user-chip, .topbar-divider { display: none } .topbar .language-select { width: 44px; min-width: 44px; max-width: 44px; padding: 3px 5px; font-size: 10px } .topbar>.actions { gap: 2px; flex-wrap: nowrap; flex-shrink: 0 } .topbar .brand { flex: 1; min-width: 0 } .topbar .brand>span:not(.brand-sub) { overflow: hidden; text-overflow: ellipsis; white-space: nowrap } .topbar-spacer { display: none } .topbar>.icon-btn { width: 26px } .sidebar { top: 54px; transform: translateX(-100%); width: 220px } .layout.mobile-open .sidebar { transform: translateX(0) } .layout.mobile-open .mobile-overlay { position: fixed; display: block; inset: 54px 0 0 220px; background: #0008; z-index: 24 } .collapsed .nav-label, .collapsed .api-status span:not(.dot) { display: initial } .collapsed .sidebar-meta { display: flex } .collapsed .nav-section { display: block } .collapsed .nav { padding-top: 0 } .collapsed .nav a { justify-content: flex-start; padding: 10px 12px } .collapsed .sidebar-footer { padding: 18px 20px } .main { padding: 20px 13px } .page-heading { flex-direction: column; margin-bottom: 19px } .page-heading>.actions { justify-content: flex-start; padding: 0; gap: 7px } .page-heading h1 { font-size: 21px } .page-heading p:not(.eyebrow) { font-size: 11px } .cards-grid { gap: 9px; margin-bottom: 15px } .metric { padding: 12px 11px; min-height: 78px } .metric-main { align-items: flex-end; gap: 8px } .metric-icon { width: 27px; height: 27px } .metric-icon .icon { width: 16px; height: 16px } .metric-value { font-size: 20px } .metric-label { font-size: 9px } .metric-note { font-size: 9px; margin: 0 0 1px auto } .metric-value.small-value { font-size: 12px } .grid-equal { grid-template-columns: 1fr } .card-header { padding: 13px 14px } .card-body { padding: 15px } .grid-2, .stack, .grid-equal { gap: 14px } .filter-bar { gap: 9px; padding: 11px; margin-bottom: 14px } .filter-bar .field { min-width: 110px } .filter-bar .field.search-field { min-width: 100% } .filter-bar .field>span { font-size: 9px } .form-grid { grid-template-columns: 1fr; gap: 16px } .form-grid>.wide { grid-column: auto } .preference-card .form-grid { grid-template-columns: 1fr } .btn { font-size: 10px; padding: 7px 9px } .row-actions { gap: 1px } .auth-center { display: flex; flex-direction: column; gap: 32px; padding: 30px 20px } .auth-hero { text-align: center } .auth-hero h1 { font-size: 27px; max-width: 400px } .auth-hero>p:not(.eyebrow) { font-size: 12px; max-width: 320px; margin: 13px auto 0 } .auth-hero .eyebrow { font-size: 9px; margin-bottom: 12px } .auth-card { max-width: 410px; width: 100%; padding: 26px } .auth-footer { padding: 20px; font-size: 9px } .tabs { margin-bottom: 15px } .tab { padding: 9px 12px; font-size: 10px } .diff-controls { grid-template-columns: 1fr; padding: 12px; gap: 12px } .diff-controls>.btn.primary, .diff-controls>.btn:not(.primary) { grid-column: 1; justify-self: stretch } .diff-controls>.btn:not(.primary) { display: none } .diff-toolbar { gap: 10px; padding: 10px } .diff-toolbar input[type=search] { width: 100%; order: 3 } .diff-stats { width: 100%; gap: 14px; font-size: 9px; order: 4 } .diff-pane { min-width: 0 } .diff-lines { font-size: 10px; line-height: 20px } .diff-line { min-height: 20px } .diff-line .line-no { min-width: 30px; padding: 0 5px; margin-right: 7px } .diff-title { padding: 10px; font-size: 9px } .diff-scroll { max-height: 450px } .diff-toolbar .checkbox-label { font-size: 10px } .dialog-body { padding: 18px } .dialog-header { padding: 13px 17px } .dialog-header h2 { font-size: 13px } .dialog { max-height: 92vh } .schedule-fields { grid-template-columns: 1fr 1fr } .toasts { bottom: 15px; right: 15px } .data-list { gap: 11px 12px } .table-footer { padding: 12px } .table-footer .actions { gap: 6px } .select-summary { margin-left: 0; width: 100% } .settings-layout { gap: 14px } } @media(max-width:520px) { .cards-grid { grid-template-columns: 1fr } .metric { min-height: 74px } .metric-note { max-width: 58% } } @media(prefers-reduced-motion:reduce) { * { scroll-behavior: auto !important; animation-duration: .01ms !important; transition-duration: .01ms !important } } @media print { .sidebar, .topbar, .actions, .filter-bar, .toasts, .diff-controls, .skip-link { display: none !important } .layout { padding: 0 } .main { padding: 0 } .card { break-inside: avoid } body { background: #fff; color: #000 } .diff-scroll, .mono-pre { max-height: none; overflow: visible } } .dashboard-extra { margin-top: 18px } .mt-15 { margin-top: 15px } .mt-16 { margin-top: 16px } .mt-18 { margin-top: 18px } .mt-22 { margin-top: 22px } .mt-25 { margin-top: 25px } /* Plain automation settings and supported device actions. */ .credential-hint { font-size: 11px; color: var(--muted); line-height: 1.6; margin-top: 9px } .filter-bar #logs-cleanup { align-items: flex-end; flex-wrap: nowrap } .sidebar-meta { display: flex; align-items: center; gap: 7px; margin-top: 10px; white-space: nowrap } .api-docs-link { font-size: 10px; color: var(--muted) } .sidebar-meta-separator { font-size: 10px; color: var(--faint) } .collapsed .sidebar-meta { display: none } .automation-row { display: grid; grid-template-columns: minmax(170px, .7fr) minmax(0, 2fr); gap: 24px; align-items: start; padding: 20px 0; border-bottom: 1px solid var(--border-soft) } .automation-row:first-child { padding-top: 0 } .automation-caption h3 { font-size: 12px; font-weight: 500; line-height: 1.5 } .automation-note { font-size: 11px; color: var(--muted); line-height: 1.6; margin-top: 7px } .automation-row .schedule-cron-preview { line-height: 1.6; overflow-wrap: anywhere } .settings-main-column { min-width: 0 } .settings-main-column .password-card { max-width: none } .settings-main-column>.scheduler-status { margin-top: 18px } .section-heading { display: flex; align-items: center; justify-content: space-between; gap: 15px; margin-bottom: 16px } .section-heading h2 { font-size: 13px; font-weight: 500 } .scheduler-summary { font-size: 11px; gap: 20px; margin-bottom: 16px } .scheduler-status-row { display: grid; grid-template-columns: minmax(180px, 1.1fr) minmax(100px, .6fr) minmax(170px, 1fr); gap: 24px; padding: 14px 0; border-bottom: 1px solid var(--border-soft); font-size: 11px } .scheduler-status-row strong { font-weight: 500 } .scheduler-status-row small { display: block; line-height: 1.6; margin-top: 4px } .next-runs { display: flex; flex-direction: column; gap: 3px } .next-runs time { font-family: var(--font-title); font-size: 10px } @media(max-width:760px) { .automation-row { grid-template-columns: 1fr; gap: 13px; padding: 18px 0 } .scheduler-status-row { grid-template-columns: 1fr 1fr; gap: 12px } .scheduler-status-row>div:first-child { grid-column: 1/-1 } .scheduler-summary { gap: 10px } .collapsed .sidebar-meta { display: flex } } .diff-line { content-visibility: auto; contain-intrinsic-size: 22px } .smart-diff { margin-bottom: 16px } .smart-diff .card-header { align-items: flex-start } .smart-diff .card-header small { display: block; margin-top: 4px } .smart-summary { display: flex; gap: 14px; flex-wrap: wrap; justify-content: flex-end; font-size: 10px; color: var(--muted) } .smart-summary strong { font-family: var(--font-title); color: var(--text); margin-left: 4px } .smart-note { display: flex; gap: 9px; align-items: flex-start; padding: 10px 11px; margin-bottom: 12px; border: 1px solid var(--border-soft); border-radius: 6px; background: var(--surface-2); font-size: 10px; color: var(--muted) } .smart-note .icon { width: 14px; height: 14px; color: var(--accent); margin-top: 1px } .smart-section { border-top: 1px solid var(--border-soft) } .smart-section:first-of-type { border-top: 0 } .smart-section summary { display: flex; align-items: center; justify-content: space-between; gap: 14px; padding: 11px 2px; cursor: pointer; list-style: none } .smart-section summary::-webkit-details-marker { display: none } .smart-section summary:before { content: '›'; font-size: 16px; color: var(--faint); transition: transform .12s } .smart-section[open] summary:before { transform: rotate(90deg) } .smart-section summary>code { flex: 1; color: var(--text); font-size: 10px } .smart-counts { display: flex; gap: 8px; align-items: center; font-family: var(--font-title); font-size: 9px } .smart-counts .added { color: var(--green) } .smart-counts .removed { color: var(--red) } .smart-counts .modified { color: var(--amber) } .tag.danger { color: var(--red); border-color: #ef71814d; background: #ef71810d } .tag.warning { color: var(--amber); border-color: #d7ad694d; background: #d7ad690d } .smart-section ul { list-style: none; margin: 0; padding: 0 0 10px 24px } .smart-change { display: grid; grid-template-columns: 62px minmax(0, 1fr); gap: 9px; padding: 7px 0; border-top: 1px dashed var(--border-soft); font-size: 10px; overflow-wrap: anywhere } .smart-kind { font-family: var(--font-title); color: var(--muted) } .smart-change.added .smart-kind { color: var(--green) } .smart-change.removed .smart-kind { color: var(--red) } .smart-change.modified .smart-kind { color: var(--amber) } .smart-fields { display: flex; flex-wrap: wrap; gap: 5px 12px; margin-top: 5px; color: var(--muted) } .smart-fields code { color: var(--text) } .smart-empty { padding: 9px 0; color: var(--muted); font-size: 11px } .raw-diff { margin-top: 0 } .diff-prefix { display: inline-block; width: 19px; text-align: center; color: var(--muted); user-select: none } .diff-pager { display: flex; align-items: center; gap: 10px } .diff-pager>span { font-family: var(--font-title); font-size: 9px; color: var(--muted) } @media(max-width:760px) { .smart-diff .card-header { flex-direction: column } .smart-summary { justify-content: flex-start } .smart-section summary { align-items: flex-start } .smart-counts { flex-wrap: wrap; justify-content: flex-end } .smart-change { grid-template-columns: 1fr } .smart-section ul { padding-left: 10px } .diff-pager { width: 100%; justify-content: space-between } .diff-pager>span { text-align: center } } :root[data-theme=light] .tag.binary { background: #3f8f820a; color: #51736d; border-color: #3f8f8238 }