:root { --primary: #0066cc; --primary-focus: #0071e3; --primary-on-dark: #2997ff; --canvas: #ffffff; --parchment: #f5f5f7; --tile-dark: #272729; --tile-dark-2: #2a2a2c; --ink: #1d1d1f; --muted: #7a7a7a; --hairline: #e0e0e0; } * { box-sizing: border-box; } body { margin: 0; font-family: "SF Pro Text", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; color: var(--ink); background: var(--canvas); } a { color: inherit; text-decoration: none; } button, input, select, textarea { font: inherit; } button:focus, input:focus, select:focus, textarea:focus, dialog:focus { outline: none; } .global-nav { position: sticky; top: 0; z-index: 10; height: 44px; display: flex; align-items: center; justify-content: space-between; padding: 0 24px; background: #000; color: #fff; font-size: 12px; letter-spacing: -0.12px; } .brand { font-weight: 600; } .nav-links { display: flex; gap: 8px; color: #ccc; } .nav-links a { padding: 7px 12px; border-radius: 9999px; transition: background 0.12s ease, color 0.12s ease, transform 0.12s ease; } .nav-links a:hover { color: #fff; } .nav-links a:active { transform: scale(0.95); } .nav-links a.active { color: #fff; background: rgba(255, 255, 255, 0.22); box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.18); } .mqtt-status { display: inline-flex; align-items: center; gap: 6px; min-width: 112px; justify-content: flex-end; font-size: 12px; color: #ff453a; } .mqtt-status.connected { color: #30d158; } .mqtt-status.disconnected { color: #ff453a; } .mqtt-dot { width: 8px; height: 8px; border-radius: 9999px; background: currentColor; } .tile-light, .tile-parchment, .tile-dark { padding: 80px 24px; } .tile-light { background: var(--canvas); } .tile-parchment { background: var(--parchment); } .tile-dark { background: var(--tile-dark); color: #fff; } .compact { padding-top: 56px; padding-bottom: 56px; } .hero { text-align: center; } .hero h1 { margin: 8px auto 12px; max-width: 980px; font-family: "SF Pro Display", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; font-size: clamp(34px, 6vw, 56px); line-height: 1.07; letter-spacing: -0.28px; font-weight: 600; } .lead { max-width: 980px; margin: 0 auto; font-size: clamp(21px, 3vw, 28px); line-height: 1.25; letter-spacing: -0.2px; } .page-intro { padding-top: 40px; padding-bottom: 40px; } .page-intro h1 { font-size: clamp(28px, 4vw, 34px); line-height: 1.12; margin-bottom: 8px; } .page-intro .lead { font-size: 17px; line-height: 1.47; max-width: 720px; } .logs-intro { padding-top: 32px; padding-bottom: 24px; } .logs-section { padding-top: 24px; padding-bottom: 24px; } .eyebrow { margin: 0 0 8px; color: var(--muted); font-size: 14px; } .tile-dark .eyebrow, .tile-dark p { color: #ccc; } .hero-actions, .inline-actions, .inline-form { display: flex; justify-content: center; align-items: center; flex-wrap: wrap; gap: 12px; margin-top: 28px; } .compact-actions { margin-top: 20px; } .home-status { padding-bottom: 64px; } .status-note { margin: 36px auto 20px; color: var(--muted); font-size: 17px; line-height: 1.47; } .home-state-grid { margin-top: 0; text-align: left; } .button-primary, .button-secondary, .button-secondary-on-dark { min-height: 44px; border-radius: 9999px; padding: 11px 22px; border: 1px solid var(--primary); cursor: pointer; transition: transform 0.12s ease; } .button-primary { background: var(--primary); color: #fff; } .button-secondary { background: transparent; color: var(--primary); } .button-secondary-on-dark { background: transparent; color: var(--primary-on-dark); border-color: var(--primary-on-dark); } .button-primary:active, .button-secondary:active, .button-secondary-on-dark:active { transform: scale(0.95); } .button-primary:focus, .button-secondary:focus, .button-secondary-on-dark:focus { outline: none; } .button-primary:focus-visible, .button-secondary:focus-visible, .button-secondary-on-dark:focus-visible { outline: 2px solid var(--primary-focus); outline-offset: 2px; } .small { min-height: 36px; padding: 8px 15px; font-size: 14px; } .section-heading { max-width: 980px; margin: 0 auto 32px; text-align: center; } .section-heading h2 { margin: 0 0 8px; font-size: 40px; line-height: 1.1; letter-spacing: -0.28px; font-weight: 600; } .section-heading p { margin: 0; font-size: 17px; line-height: 1.47; } .dark-text { color: var(--ink); } .compact-heading { margin-bottom: 24px; } .compact-heading .button-primary { margin-top: 20px; } .state-grid, .card-grid, .plan-columns, .two-col { max-width: 1180px; margin: 0 auto; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 24px; } .plan-columns, .two-col { grid-template-columns: repeat(2, minmax(0, 1fr)); } .state-card, .utility-card { border-radius: 18px; padding: 24px; border: 1px solid var(--hairline); background: #fff; color: var(--ink); } .state-card { background: var(--tile-dark-2); border-color: rgba(255,255,255,0.12); color: #fff; } .home-state-grid .state-card { background: #fff; color: var(--ink); border-color: var(--hairline); } .home-state-grid .state-card p, .home-state-grid .state-card .eyebrow { color: var(--muted); } .state-value { margin: 4px 0 8px; font-size: 40px; line-height: 1.1; letter-spacing: -0.28px; } .state-on { color: #30d158; } .state-off { color: #ff453a; } .utility-card h2, .utility-card h3 { margin-top: 0; } .schedule-status { font-weight: 600; } .schedule-status-enabled { color: #30d158; } .schedule-status-disabled { color: #ff453a; } .schedule-disabled .schedule-content { color: var(--muted); text-decoration: line-through; } .holiday-import-grid { align-items: stretch; } .holiday-card { display: grid; grid-template-rows: auto 360px auto; gap: 18px; } .holiday-card > .holiday-textarea, .holiday-card > .holiday-form { min-height: 0; } .holiday-card-header { display: grid; align-content: start; gap: 0; } .holiday-card-header h2 { margin: 0; } .holiday-card-header p { margin: 0; font-size: 14px; line-height: 1.47; } .holiday-form { display: contents; } .holiday-textarea { height: 360px; min-height: 360px; } .holiday-action { justify-self: center; } .wide { max-width: 1180px; margin-left: auto; margin-right: auto; } .muted { color: var(--muted); } .timeline { display: grid; gap: 14px; } .timeline-item { display: grid; gap: 4px; padding-bottom: 14px; border-bottom: 1px solid var(--hairline); } .timeline-item:last-child { border-bottom: 0; padding-bottom: 0; } .timeline-item span { color: var(--muted); } .table-wrap { overflow-x: auto; } .table-card-header { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 16px; } .table-card-header h2 { margin: 0; } .log-table-card { overflow: hidden; } .table-scroll { position: relative; max-height: calc(100vh - 285px); overflow: auto; background: var(--canvas); } table { width: 100%; border-collapse: separate; border-spacing: 0; font-size: 14px; } th, td { padding: 12px 10px; border-bottom: 1px solid var(--hairline); text-align: left; vertical-align: top; } th { position: sticky; top: 0; z-index: 3; background: var(--canvas); box-shadow: inset 0 1px 0 var(--canvas), 0 1px 0 var(--hairline); font-weight: 600; } .form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; align-items: start; } label { display: grid; grid-template-rows: auto 44px auto; gap: 8px; font-size: 14px; color: var(--muted); } .field-hint { font-size: 12px; color: var(--muted); } input, select, textarea { width: 100%; height: 44px; border: 1px solid rgba(0,0,0,0.08); border-radius: 18px; padding: 12px 16px; background: #fff; color: var(--ink); } textarea { height: auto; resize: vertical; line-height: 1.45; font-family: ui-monospace, SFMono-Regular, Consolas, monospace; } .weekday-picker { grid-column: 1 / -1; display: flex; flex-wrap: wrap; gap: 12px 18px; } .weekday-picker[hidden] { display: none; } .weekday-picker label { display: flex; grid-template-rows: none; align-items: center; gap: 6px; } .weekday-picker input { width: auto; } .form-actions { grid-column: 1 / -1; display: flex; justify-content: center; margin-top: 4px; } .notice { position: fixed; top: 58px; left: 50%; z-index: 30; transform: translateX(-50%); width: min(520px, calc(100vw - 32px)); margin: 0; padding: 12px 18px; border-radius: 18px; background: #e8f2ff; color: var(--ink); text-align: center; border: 1px solid rgba(0, 102, 204, 0.16); animation: message-pop 3.2s ease forwards; } .notice-error { background: #fff0f0; border-color: rgba(255, 69, 58, 0.18); } @keyframes message-pop { 0% { opacity: 0; transform: translate(-50%, -8px); } 12% { opacity: 1; transform: translate(-50%, 0); } 78% { opacity: 1; transform: translate(-50%, 0); } 100% { opacity: 0; transform: translate(-50%, -8px); visibility: hidden; } } code { word-break: break-all; } .topic-preview p { line-height: 1.6; } .topic-preview { margin-top: 24px; } .modal { width: min(760px, calc(100vw - 32px)); border: 1px solid var(--hairline); border-radius: 18px; padding: 24px; color: var(--ink); background: rgba(245, 245, 247, 0.96); backdrop-filter: saturate(180%) blur(20px); } .modal::backdrop { background: rgba(0, 0, 0, 0.36); } .modal-header { display: flex; justify-content: space-between; align-items: flex-start; gap: 16px; margin-bottom: 24px; } .modal-header h2 { margin: 0; font-size: 34px; line-height: 1.12; letter-spacing: -0.28px; } .modal-close { width: 36px; height: 36px; border: 0; border-radius: 9999px; background: rgba(0, 0, 0, 0.06); color: var(--ink); cursor: pointer; font-size: 24px; line-height: 1; display: inline-flex; align-items: center; justify-content: center; transition: transform 0.12s ease, background 0.12s ease; } .modal-close:active { transform: scale(0.95); } .modal-close:hover { background: rgba(0, 0, 0, 0.1); } .modal-form { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px 18px; } .modal-form label { min-width: 0; } .modal-actions { grid-column: 1 / -1; display: flex; justify-content: flex-end; gap: 12px; margin-top: 8px; } @media (max-width: 833px) { .global-nav { padding: 0 16px; } .nav-links { gap: 6px; } .state-grid, .card-grid, .plan-columns, .two-col, .form-grid { grid-template-columns: 1fr; } .tile-light, .tile-parchment, .tile-dark { padding: 48px 16px; } .section-heading h2 { font-size: 34px; } } @media (max-width: 520px) { .nav-links { font-size: 11px; gap: 2px; } .nav-links a { padding: 7px 8px; } .mqtt-status { min-width: auto; font-size: 11px; } .mqtt-status span:last-child { display: none; } .brand { display: none; } .hero-actions, .inline-actions { align-items: stretch; } .hero-actions form, .inline-actions form, .hero-actions button, .inline-actions button { width: 100%; } }