:root { color-scheme: dark; --bg: #090b10; --bg-elevated: #11141b; --surface: rgba(22, 25, 33, 0.92); --surface-strong: #1c2028; --surface-soft: rgba(32, 36, 46, 0.82); --surface-bright: #eef1f7; --text: #edf0f6; --text-muted: rgba(237, 240, 246, 0.62); --text-subtle: rgba(237, 240, 246, 0.42); --border: rgba(255, 255, 255, 0.08); --border-strong: rgba(255, 255, 255, 0.16); --accent: #67d6ff; --accent-2: #88f0c7; --warning: #ffcf6d; --danger: #ff7d7d; --shadow: 0 16px 48px rgba(0, 0, 0, 0.34); --radius-xl: 28px; --radius-lg: 22px; --radius-md: 18px; --radius-sm: 14px; --sidebar-width: 400px; --content-pad: 32px; --font-sans: "Manrope", "Segoe UI", sans-serif; --font-display: "Space Grotesk", "Manrope", sans-serif; } * { box-sizing: border-box; } html, body { height: 100%; } body { margin: 0; font-family: var(--font-sans); background: radial-gradient(circle at top left, rgba(77, 110, 138, 0.15), transparent 28%), radial-gradient(circle at bottom right, rgba(63, 168, 140, 0.12), transparent 24%), linear-gradient(180deg, #080a0f 0%, #0d1118 100%); color: var(--text); overflow: hidden; } body.is-embedded { overflow: auto; } button, input, select, textarea { font: inherit; } .app-shell { display: grid; grid-template-columns: var(--sidebar-width) 1fr; min-height: 100vh; height: 100vh; } .app-shell--embed { grid-template-columns: clamp(250px, 22vw, 320px) minmax(0, 1fr); height: auto; min-height: 100vh; } .sidebar { position: relative; padding: 24px 20px 20px 20px; background: linear-gradient(180deg, rgba(10, 12, 17, 0.98), rgba(12, 14, 20, 0.88)); border-right: 1px solid rgba(255, 255, 255, 0.05); display: flex; flex-direction: column; min-height: 0; overflow: hidden; } .app-shell--embed .sidebar { padding: 18px 16px 16px; border-right: 1px solid rgba(255, 255, 255, 0.05); } .sidebar::after { content: ""; position: absolute; inset: 0; pointer-events: none; background: linear-gradient(180deg, rgba(255,255,255,0.03), transparent 12%), linear-gradient(90deg, rgba(102, 214, 255, 0.04), transparent 24%); mix-blend-mode: screen; } .app-shell--embed .sidebar::after { display: none; } .clock-panel { padding: 12px 8px 12px 8px; } .app-shell--embed .clock-panel { padding: 0 0 8px; } .clock-panel__time { font-family: var(--font-display); font-size: clamp(56px, 6.4vw, 82px); line-height: 0.94; letter-spacing: -0.06em; font-weight: 700; } .clock-panel__date { margin-top: 8px; color: var(--text-muted); font-size: 18px; line-height: 1.1; white-space: nowrap; } .app-shell--embed .clock-panel__time { font-size: clamp(34px, 3.8vw, 56px); } .app-shell--embed .clock-panel__date { font-size: 14px; white-space: normal; } .rooms-panel { margin-top: 12px; display: flex; flex-direction: column; min-height: 0; flex: 1; } .app-shell--embed .rooms-panel { margin-top: 8px; } .panel-header, .content-header, .camera-modal__header, .camera-modal__footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; } .panel-header { margin-bottom: 10px; } .panel-header__label { font-size: 19px; font-weight: 700; letter-spacing: -0.02em; } .panel-header__sub { margin-top: 6px; color: var(--text-subtle); font-size: 14px; } #rooms-count:empty { display: none; } .content-header { justify-content: space-between; align-items: flex-start; } .content-header__back { display: none !important; flex: 0 0 auto; } .content-header > div { min-width: 0; } .content-header__actions { display: flex; align-items: center; gap: 10px; margin-left: 16px; flex-wrap: wrap; justify-content: flex-end; margin-left: auto; } .content-header__ghost-button { min-height: 40px; padding-inline: 12px; border-radius: 12px; } .content-header__ghost-button span { font-size: 13px; font-weight: 700; } .icon-button { appearance: none; border: 1px solid var(--border); background: rgba(255,255,255,0.03); color: var(--text); width: 40px; height: 40px; border-radius: 14px; display: inline-flex; align-items: center; justify-content: center; cursor: pointer; transition: transform 180ms ease, background 180ms ease, border-color 180ms ease; } .icon-button:hover { transform: translateY(-1px); background: rgba(255,255,255,0.08); border-color: var(--border-strong); } .icon-button.is-active { background: rgba(103, 214, 255, 0.14); border-color: rgba(103, 214, 255, 0.32); } .icon-button--ghost { width: 44px; height: 44px; border-radius: 16px; } .room-list { display: flex; flex-direction: column; gap: 14px; overflow-y: auto; min-height: 0; padding-right: 6px; padding-bottom: 6px; } .app-shell--embed .room-list { gap: 10px; overflow-y: auto; padding-right: 4px; padding-bottom: 4px; } .room-list__group { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; } .room-item { position: relative; display: flex; flex-direction: column; align-items: stretch; gap: 6px; padding: 8px; border: 1px solid var(--border); border-radius: var(--radius-lg); background: linear-gradient(180deg, rgba(28, 31, 39, 0.92), rgba(20, 23, 30, 0.92)); color: var(--text); cursor: pointer; text-align: left; min-height: 132px; box-shadow: inset 0 1px 0 rgba(255,255,255,0.03); transition: border-color 180ms ease, transform 180ms ease, background 180ms ease, box-shadow 180ms ease; } .app-shell--embed .room-item { min-height: 94px; padding: 7px 8px; } .app-shell--embed .room-item__icon { width: 42px; height: 42px; } .app-shell--embed .room-item__icon i { font-size: 32px; } .app-shell--embed .room-item__name { font-size: 14px; } .room-item.has-temp { padding-right: 0px; } .room-item.has-temp .room-item__body { padding-right: 0px; } .room-item:hover { transform: translateY(-1px); border-color: rgba(103, 214, 255, 0.24); } .room-item.is-selected { background: linear-gradient(180deg, rgba(103, 214, 255, 0.16), rgba(32, 35, 45, 0.98)); border-color: rgba(103, 214, 255, 0.3); box-shadow: 0 10px 30px rgba(0, 0, 0, 0.24), inset 0 1px 0 rgba(255,255,255,0.05); } .room-item.is-hidden-room { opacity: 0.72; } .room-item.is-main { min-height: 132px; } .room-item.is-battery-room { background: radial-gradient(circle at top right, rgba(255, 193, 7, 0.12), transparent 40%), linear-gradient(180deg, rgba(32, 28, 20, 0.94), rgba(21, 20, 18, 0.95)); border-color: rgba(255, 193, 7, 0.18); } .room-item.is-battery-room .room-item__icon { color: #ffc94d; --icon-node-img-filter: brightness(0) saturate(100%) invert(79%) sepia(41%) saturate(909%) hue-rotate(357deg) brightness(103%) contrast(101%); } .room-item.is-battery-room.is-selected { background: radial-gradient(circle at top right, rgba(255, 193, 7, 0.16), transparent 40%), linear-gradient(180deg, rgba(51, 43, 20, 0.96), rgba(24, 22, 18, 0.98)); border-color: rgba(255, 193, 7, 0.38); } .room-item__icon { width: 50px; height: 50px; border-radius: 13px; display: inline-flex; align-items: center; justify-content: center; font-size: 12px; background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.06); color: var(--accent); --icon-node-img-filter: brightness(0) saturate(100%) invert(72%) sepia(45%) saturate(1190%) hue-rotate(165deg) brightness(102%) contrast(101%); } .room-item__icon i { font-size: 40px; line-height: 1; } .room-item__icon .icon-node, .grid-card__icon .icon-node { width: 40px; height: 40px; display: inline-flex; align-items: center; justify-content: center; } .icon-node__img { width: 100%; height: 100%; object-fit: contain; display: block; filter: var(--icon-node-img-filter, none); } .icon-node__svg { width: 100%; height: 100%; display: block; fill: currentColor; } .room-item.is-selected .room-item__icon { background: rgba(255,255,255,0.9); color: #101318; --icon-node-img-filter: brightness(0) saturate(100%); } .room-item__name { font-size: 16px; font-weight: 700; line-height: 1.08; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; overflow-wrap: anywhere; } .room-item__body { min-width: 0; width: 100%; } .room-item__meta { margin-top: 5px; font-size: 12px; color: var(--text-muted); } .room-item__temp { position: absolute; top: 10px; right: 3px; padding: 3px 6px; border-radius: 999px; background: rgba(103, 214, 255, 0.12); color: var(--accent); border: 1px solid rgba(103, 214, 255, 0.22); font-size: 20px; font-weight: 700; line-height: 1; z-index: 1; pointer-events: none; white-space: nowrap; } .room-item__content { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; width: 100%; } .room-item__mini-actions { display: flex; align-items: center; gap: 6px; justify-content: flex-start; width: 100%; margin-top: 0; flex-wrap: wrap; } .room-item.is-editing .room-item__mini-actions { display: flex; } .mini-action { width: 30px; height: 30px; border-radius: 11px; border: 1px solid var(--border); background: rgba(255,255,255,0.05); color: var(--text); display: inline-flex; align-items: center; justify-content: center; cursor: pointer; } .mini-action--wide { width: 32px; height: 32px; } .room-list__divider { display: flex; align-items: center; gap: 10px; padding: 8px 2px 2px; color: var(--text-subtle); text-transform: uppercase; letter-spacing: 0.14em; font-size: 11px; grid-column: 1 / -1; } .room-list__divider::before, .room-list__divider::after { content: ""; height: 1px; background: rgba(255,255,255,0.08); flex: 1; } .room-list__divider-label { flex: 0 0 auto; } .content { position: relative; padding: var(--content-pad); overflow: auto; } .app-shell--embed .content { padding: 22px 16px 20px; } .content-top { display: none; margin-bottom: 16px; margin-top: -30px; } .app-shell--embed .content-top { margin-top: 0; } .content-top.is-main { display: block; } .content-header { min-height: 72px; margin-bottom: 16px; justify-content: flex-start; } .app-shell--embed .content-header { min-height: auto; margin-bottom: 12px; } .content-header.is-main .content-header__eyebrow, .content-header.is-main .content-header__meta { display: none; } .content-header.is-main .content-header__title { margin-top: 0; } .content-header__eyebrow { color: var(--text-muted); font-size: 13px; text-transform: uppercase; letter-spacing: 0.16em; } .content-header__title { margin: 6px 0 0; font-family: var(--font-display); font-size: clamp(30px, 3.4vw, 48px); line-height: 1.02; letter-spacing: -0.05em; } .app-shell--embed .content-header__title { font-size: clamp(24px, 2.5vw, 40px); } .content-header__meta { margin-top: 10px; color: var(--text-muted); font-size: 15px; } .dashboard-grid { position: relative; width: 100%; } .grid-surface { display: grid; gap: 18px; width: 100%; } .grid-card { position: relative; overflow: hidden; border-radius: var(--radius-xl); border: 1px solid var(--border); background: linear-gradient(180deg, rgba(29, 33, 41, 0.96), rgba(18, 20, 27, 0.94)); box-shadow: var(--shadow); min-height: 120px; } .grid-card.is-hidden { opacity: 0.52; border-style: dashed; filter: saturate(0.8); } .grid-card--ghost { background: transparent; border-color: transparent; box-shadow: none; min-height: 120px; } .grid-card--ghost .grid-card__inner { justify-content: space-between; gap: 10px; } .grid-card--ghost .grid-card__header { gap: 8px; } .grid-card--ghost .grid-card__icon { background: rgba(255,255,255,0.02); border-color: rgba(255,255,255,0.05); color: rgba(237, 240, 246, 0.42); } .grid-card--ghost .grid-card__title { font-size: 18px; } .grid-card--ghost .grid-card__subtitle { margin-top: 2px; font-size: 13px; } .grid-card--ghost .grid-card__footer--edit { margin-top: auto; } .grid-card--ghost.is-editing { background: radial-gradient(circle at top left, rgba(103, 214, 255, 0.08), transparent 35%), rgba(255, 255, 255, 0.01); border-color: rgba(103, 214, 255, 0.18); border-style: dashed; box-shadow: inset 0 1px 0 rgba(255,255,255,0.04); } .grid-card--ghost.is-editing .grid-card__title-line, .grid-card--ghost.is-editing .grid-card__subtitle { color: var(--text-muted); } .grid-card--ghost.is-editing .grid-card__icon { color: var(--accent); } .main-dashboard__cards .grid-card--door { transition: background 220ms ease, border-color 220ms ease, box-shadow 220ms ease, transform 220ms ease, filter 220ms ease; } .main-dashboard__cards .grid-card--door.is-active { background: radial-gradient(circle at top right, rgba(160, 221, 255, 0.16), transparent 42%), linear-gradient(180deg, rgba(44, 50, 61, 0.98), rgba(22, 26, 34, 0.98)); border-color: rgba(160, 221, 255, 0.3); box-shadow: 0 18px 36px rgba(0, 0, 0, 0.26), inset 0 1px 0 rgba(255,255,255,0.05); animation: door-card-pulse 3.2s ease-in-out infinite; } .main-dashboard__cards .grid-card--door.is-active::after { content: ""; position: absolute; inset: 0; pointer-events: none; background: radial-gradient(circle at 50% 0%, rgba(160, 221, 255, 0.14), transparent 58%); opacity: 0.35; animation: door-card-glow 3.2s ease-in-out infinite; } @keyframes door-card-pulse { 0%, 100% { transform: translateY(0); filter: brightness(1); } 50% { transform: translateY(-1px); filter: brightness(1.03); } } @keyframes door-card-glow { 0%, 100% { opacity: 0.24; } 50% { opacity: 0.48; } } .main-dashboard__cards .grid-card--door .grid-card__icon { transform-style: preserve-3d; } .main-dashboard__cards .grid-card--door.is-active .grid-card__icon > * { display: inline-flex; transform-origin: 50% 60%; animation: door-icon-swing 2.8s ease-in-out infinite; will-change: transform; } @keyframes door-icon-swing { 0%, 100% { transform: perspective(90px) rotateY(0deg) rotateZ(0deg) scale(1); } 22% { transform: perspective(90px) rotateY(-26deg) rotateZ(-2deg) scale(1.04); } 44% { transform: perspective(90px) rotateY(0deg) rotateZ(0deg) scale(1); } 68% { transform: perspective(90px) rotateY(22deg) rotateZ(2deg) scale(0.98); } 84% { transform: perspective(90px) rotateY(0deg) rotateZ(0deg) scale(1); } } .room-entities-section__grid .grid-card.is-active { background: linear-gradient(180deg, rgb(146 154 170 / 98%), rgb(44 47 53 / 96%)); border-color: rgba(160, 221, 255, 0.28); box-shadow: 0 16px 32px rgba(0, 0, 0, 0.28), inset 0 1px 0 rgba(255, 255, 255, 0.06); } .room-entities-section__grid .grid-card.is-active .grid-card__title, .room-entities-section__grid .grid-card.is-active .grid-card__title-line { color: var(--text); } .room-entities-section__grid .grid-card.is-active .grid-card__subtitle, .room-entities-section__grid .grid-card.is-active .grid-card__kind { color: rgba(255, 255, 255, 0.68); } .room-entities-section__grid .grid-card.is-active .grid-card__icon { background: rgba(255,255,255,0.08); border-color: rgba(160, 221, 255, 0.18); color: var(--accent); box-shadow: inset 0 1px 0 rgba(255,255,255,0.04); } .grid-card--weather { grid-column: 1 / span 3; } .grid-card--auto { grid-column: span 3; } .grid-card--entity { grid-column: span 3; } .grid-card--entity-wide { grid-column: span 3; } .grid-card--cover { grid-column: span 3; } .grid-card--climate { grid-column: span 3; } .grid-card--full { grid-column: 1 / -1; } .grid-card__inner { position: relative; display: flex; flex-direction: column; gap: 12px; height: 100%; padding: 14px; } .grid-card__top { display: flex; flex-direction: column; align-items: flex-start; justify-content: flex-start; gap: 12px; } .grid-card__icon { width: 42px; height: 42px; border-radius: 16px; display: inline-flex; align-items: center; justify-content: center; background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.06); color: var(--accent); font-size: 22px; flex: 0 0 auto; --icon-node-img-filter: brightness(0) saturate(100%) invert(72%) sepia(45%) saturate(1190%) hue-rotate(165deg) brightness(102%) contrast(101%); } .grid-card__icon--active { background: rgba(255,255,255,0.92); color: #0f1115; --icon-node-img-filter: brightness(0) saturate(100%); } .grid-card__title { font-size: 22px; font-weight: 700; line-height: 1.08; display: flex; flex-direction: column; gap: 2px; } .grid-card__title_weather{ font-size: 40px; font-weight: 700; line-height: 1.08; display: flex; flex-direction: column; gap: 2px; } .grid-card__title-line { display: block; } .grid-card__subtitle { margin-top: 6px; color: var(--text-muted); font-size: 20px; } .grid-card__kind { margin-top: 2px; color: var(--text-subtle); font-size: 11px; font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase; } .grid-card__header { display: flex; flex-direction: column; align-items: flex-start; gap: 10px; min-width: 0; flex: 1 1 auto; width: 100%; } .grid-card--tap { cursor: pointer; touch-action: manipulation; } .grid-card--tap:focus-visible, .room-item:focus-visible, .icon-button:focus-visible, .mushroom-button:focus-visible, .round-button:focus-visible, .mini-action:focus-visible { outline: 2px solid rgba(103, 214, 255, 0.6); outline-offset: 2px; } .room-item.is-dragging { opacity: 0.55; transform: scale(0.985); cursor: grabbing; } .room-item.is-editing { cursor: grab; user-select: none; } .grid-card__footer { display: grid; gap: 8px; margin-top: auto; } .grid-card__footer-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; } .grid-card__footer--edit { padding-top: 6px; } .grid-card__footer--edit .mushroom-button { width: 100%; min-height: 42px; padding: 8px 10px; border-radius: 12px; font-size: 12px; gap: 6px; } .grid-card__footer--edit .mushroom-button--wide { grid-column: 1 / -1; } .grid-card__footer--edit .mushroom-button--small { min-height: 42px; } .grid-card__layout-settings { display: grid; gap: 10px; margin-top: 2px; } .grid-card__layout-settings .mushroom-button { width: 100%; } .mushroom-button { min-height: 48px; padding: 10px 12px; border-radius: 14px; border: 1px solid var(--border); background: rgba(255,255,255,0.04); color: var(--text); cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: 10px; transition: transform 180ms ease, background 180ms ease, border-color 180ms ease, color 180ms ease; } .mushroom-button:hover { transform: translateY(-1px); border-color: rgba(103, 214, 255, 0.24); } .mushroom-button.is-on { background: var(--surface-bright); color: #101318; border-color: rgba(255,255,255,0.55); } .mushroom-button.is-disabled { opacity: 0.55; cursor: not-allowed; } .mushroom-button__icon { font-size: 20px; line-height: 1; } .mushroom-button__body { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; text-align: left; } .mushroom-button--square .mushroom-button__body { align-items: center; text-align: center; } .mushroom-button__title { font-size: 14px; font-weight: 700; } .mushroom-button__subtitle { color: inherit; opacity: 0.7; font-size: 12px; } .mushroom-button--small { min-height: 40px; padding: 8px 10px; border-radius: 12px; } .mushroom-button--wide { width: 100%; } .mushroom-button--square { width: 80px; min-height: 80px; padding: 10px 8px; flex-direction: column; gap: 6px; text-align: center; } .weather-card { display: flex; flex-direction: column; gap: 8px; width: 100%; } .weather-card--compact { height: 100%; justify-content: space-between; } .weather-card__rows { display: flex; flex-direction: column; gap: 8px; } .weather-card__row { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 10px 12px; border-radius: 14px; background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.06); } .weather-card__row-label { color: var(--text-muted); font-size: 12px; letter-spacing: 0.06em; text-transform: uppercase; } .weather-card__row-value { font-weight: 800; font-size: 22px; color: var(--text); } .stat-row { display: flex; justify-content: space-between; gap: 14px; padding: 12px 14px; border-radius: 16px; background: rgba(255,255,255,0.04); } .stat-row__label { color: var(--text-muted); } .stat-row__value { font-weight: 700; } .climate-card { display: flex; flex-direction: column; gap: 8px; height: 100%; } .climate-card__top { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; width: 100%; } .climate-card__meta { display: grid; justify-items: end; text-align: right; gap: 2px; flex: 0 0 auto; min-width: 72px; } .climate-card__meta-target { font-family: var(--font-display); font-size: clamp(24px, 2.8vw, 32px); line-height: 1; letter-spacing: -0.06em; } .climate-card__meta-current { color: var(--text-muted); font-size: 11px; line-height: 1.1; } .climate-card .grid-card__header { flex: 1 1 auto; } .climate-card__buttons { display: flex; gap: 10px; justify-content: center; } .round-button { width: 44px; height: 44px; border-radius: 999px; border: 1px solid var(--border); background: rgba(255,255,255,0.04); color: var(--text); display: inline-flex; align-items: center; justify-content: center; cursor: pointer; } .cover-card { display: flex; flex-direction: column; gap: 10px; } .cover-card__rail { display: grid; gap: 8px; } .cover-progress { width: 100%; height: 8px; border-radius: 999px; overflow: hidden; background: rgba(255,255,255,0.08); } .cover-progress__value { height: 100%; background: linear-gradient(90deg, #66d6ff, #88f0c7); border-radius: inherit; } .cover-card__buttons { display: flex; gap: 8px; flex-wrap: wrap; } .chip { display: inline-flex; align-items: center; gap: 8px; padding: 8px 12px; border-radius: 999px; background: rgba(255,255,255,0.05); color: var(--text-muted); font-size: 12px; } .loading-card { grid-column: 1 / -1; padding: 28px; border-radius: var(--radius-xl); background: rgba(255,255,255,0.04); border: 1px solid var(--border); color: var(--text-muted); } .modal-backdrop { position: fixed; inset: 0; display: none; align-items: center; justify-content: center; padding: 22px; background: rgba(4, 6, 10, 0.72); backdrop-filter: blur(12px); z-index: 40; } .modal-backdrop.is-open { display: flex; } body.is-mobile-ui #camera-modal { display: none !important; } .camera-modal { position: relative; width: calc(100vw - 24px); height: calc(100vh - 24px); max-width: 1600px; max-height: none; border-radius: 22px; border: 1px solid rgba(255,255,255,0.08); background: linear-gradient(180deg, rgba(18, 20, 27, 0.98), rgba(10, 12, 17, 0.98)); box-shadow: 0 24px 72px rgba(0, 0, 0, 0.5); overflow: hidden; display: flex; flex-direction: column; } .camera-modal__close { position: fixed; top: 18px; right: 18px; z-index: 9999; background: rgba(15, 18, 24, 0.88); border-color: rgba(255,255,255,0.12); box-shadow: 0 8px 22px rgba(0, 0, 0, 0.35); color: var(--text); backdrop-filter: blur(10px); pointer-events: auto; touch-action: manipulation; } .camera-modal__body { flex: 1 1 auto; min-height: 0; padding: 0; display: flex; flex-direction: column; gap: 0; } .camera-stage { position: relative; flex: 1 1 auto; min-height: 0; border-radius: 0; overflow: hidden; background: #0b0d11; border: 1px solid rgba(255,255,255,0.06); } .camera-stage__poster, .camera-stage iframe, .camera-stage video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; border: 0; background: #0b0d11; } .camera-stage__poster { z-index: 1; } .camera-stage iframe, .camera-stage video { z-index: 2; opacity: 0; transition: opacity 180ms ease; } .camera-stage iframe.is-ready, .camera-stage video.is-ready { opacity: 1; } .camera-stage__placeholder { position: absolute; inset: 0; display: none; place-items: center; text-align: center; padding: 24px; background: linear-gradient(180deg, rgba(13,16,22,0.08), rgba(13,16,22,0.38)); backdrop-filter: blur(2px); pointer-events: none; z-index: 3; } .camera-stage__placeholder.is-visible { display: grid; } .camera-stage__placeholder-icon { width: 86px; height: 86px; border-radius: 30px; display: grid; place-items: center; background: rgba(255,255,255,0.06); font-size: 40px; color: var(--accent); } .camera-stage__placeholder-title { margin-top: 16px; font-size: 22px; font-weight: 700; } .camera-stage__placeholder-subtitle { margin-top: 8px; color: var(--text-muted); max-width: 420px; } .camera-modal__footer { flex-direction: column; align-items: flex-start; justify-content: flex-start; gap: 8px; color: var(--text-muted); padding: 12px 18px 16px; min-height: 56px; } .camera-modal__countdown { font-weight: 700; color: var(--text); min-height: 1.2em; line-height: 1.2; display: block; white-space: nowrap; } .entity-modal { width: min(78vw, 1080px); max-height: 90vh; border-radius: 30px; border: 1px solid rgba(255,255,255,0.08); background: linear-gradient(180deg, rgba(20, 22, 29, 0.98), rgba(12, 14, 18, 0.98)); box-shadow: 0 24px 72px rgba(0, 0, 0, 0.5); overflow: hidden; display: flex; flex-direction: column; } .temperature-sensor-modal { width: min(62vw, 760px); max-height: 84vh; border-radius: 30px; border: 1px solid rgba(255,255,255,0.08); background: linear-gradient(180deg, rgba(20, 22, 29, 0.98), rgba(12, 14, 18, 0.98)); box-shadow: 0 24px 72px rgba(0, 0, 0, 0.5); overflow: hidden; display: flex; flex-direction: column; } .temperature-sensor-modal__header { padding: 18px 20px; border-bottom: 1px solid rgba(255,255,255,0.06); display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; } .temperature-sensor-modal__eyebrow { color: var(--text-subtle); text-transform: uppercase; letter-spacing: 0.16em; font-size: 12px; min-height: 14px; } .temperature-sensor-modal__title { margin-top: 5px; font-size: 18px; font-weight: 700; } .temperature-sensor-modal__body { padding: 18px; display: grid; gap: 14px; overflow: auto; } .temperature-sensor-modal__current { display: grid; gap: 8px; padding: 14px 16px; border-radius: 18px; border: 1px solid rgba(255,255,255,0.08); background: rgba(255,255,255,0.03); } .temperature-sensor-modal__current-label { color: var(--text-subtle); text-transform: uppercase; letter-spacing: 0.12em; font-size: 11px; } .temperature-sensor-modal__current-value { font-size: 16px; font-weight: 700; } .temperature-sensor-modal__empty { color: var(--text-muted); padding: 20px 0; } .temperature-sensor-modal__list { display: grid; gap: 10px; } .temperature-sensor-modal__option { width: 100%; border: 1px solid rgba(255,255,255,0.08); background: rgba(255,255,255,0.04); color: var(--text); border-radius: 18px; padding: 12px 14px; display: grid; grid-template-columns: 1fr auto; gap: 10px; align-items: center; cursor: pointer; text-align: left; transition: transform 180ms ease, background 180ms ease, border-color 180ms ease; } .temperature-sensor-modal__option:hover { transform: translateY(-1px); background: rgba(255,255,255,0.06); border-color: var(--border-strong); } .temperature-sensor-modal__option.is-active { background: rgba(103, 214, 255, 0.14); border-color: rgba(103, 214, 255, 0.28); } .temperature-sensor-modal__option-main { display: grid; gap: 4px; min-width: 0; } .temperature-sensor-modal__option-name { font-weight: 700; line-height: 1.15; } .temperature-sensor-modal__option-meta { color: var(--text-muted); font-size: 13px; line-height: 1.2; } .temperature-sensor-modal__option-value { color: var(--accent); font-weight: 800; white-space: nowrap; } .entity-modal__header { padding: 18px 20px; border-bottom: 1px solid rgba(255,255,255,0.06); display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; } .entity-modal__eyebrow { color: var(--text-subtle); text-transform: uppercase; letter-spacing: 0.16em; font-size: 12px; min-height: 14px; } .entity-modal__title { margin-top: 5px; font-size: 18px; font-weight: 700; } .entity-modal__body { padding: 18px; display: grid; gap: 18px; overflow: auto; } .entity-modal__fallback { color: var(--text-muted); padding: 20px 0; } .entity-modal__cover, .entity-modal__climate { display: grid; gap: 16px; } .entity-modal__cover { grid-template-columns: minmax(0, 1fr) 118px; align-items: stretch; } .entity-modal__rail { display: grid; gap: 14px; min-width: 0; } .entity-modal__rail--cover { grid-template-rows: auto minmax(0, 1fr) auto; justify-items: center; align-content: stretch; gap: 12px; } .entity-modal__cover-meta { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; } .entity-modal__cover-label, .entity-modal__current-label, .entity-modal__options-title { color: var(--text-muted); font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; } .entity-modal__cover-value, .entity-modal__current-value { font-size: 18px; font-weight: 800; color: var(--text); } .entity-modal__cover-track { position: relative; justify-self: center; width: 56px; min-height: 280px; border-radius: 999px; background: radial-gradient(circle at 50% 6%, rgba(255,255,255,0.10), transparent 28%), linear-gradient(180deg, rgba(18, 20, 27, 0.96), rgba(10, 12, 17, 0.98)); overflow: hidden; box-shadow: inset 0 1px 0 rgba(255,255,255,0.06), inset 0 -18px 28px rgba(0, 0, 0, 0.26); touch-action: none; user-select: none; cursor: ns-resize; } .entity-modal__cover-fill { position: absolute; left: 0; right: 0; bottom: 0; border-radius: inherit; background: linear-gradient(180deg, rgba(103, 214, 255, 0.96) 0%, rgba(126, 236, 220, 0.94) 58%, rgba(188, 255, 242, 0.96) 100%); box-shadow: 0 10px 26px rgba(103, 214, 255, 0.14), inset 0 1px 0 rgba(255,255,255,0.20); width: 100%; height: 0%; } .entity-modal__cover-handle { position: absolute; left: 50%; bottom: -10px; width: 36px; height: 20px; border-radius: 999px; border: 1px solid rgba(255,255,255,0.18); background: linear-gradient(180deg, rgba(255,255,255,0.98), rgba(228,236,244,0.9)); box-shadow: 0 10px 22px rgba(0, 0, 0, 0.26), inset 0 1px 0 rgba(255,255,255,0.7); transform: translateX(-50%); z-index: 2; pointer-events: none; } .entity-modal__actions--vertical { display: grid; grid-auto-rows: minmax(52px, auto); gap: 10px; align-content: center; justify-self: stretch; } .entity-modal__actions--vertical .mushroom-button--square { width: 100%; min-height: 72px; } .entity-modal__actions--vertical .mushroom-button__body { gap: 2px; } .entity-modal__actions--vertical .mushroom-button__icon { font-size: 18px; } .entity-modal__actions { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; } .entity-modal__actions .mushroom-button--square { width: 100%; min-height: 96px; } .entity-modal__actions .mushroom-button__title { line-height: 1.05; } .entity-modal__actions.entity-modal__actions--vertical { grid-template-columns: 1fr; grid-auto-rows: minmax(52px, auto); align-content: center; } .entity-modal__actions.entity-modal__actions--vertical .mushroom-button--square { min-height: 72px; } .entity-modal__climate-summary { display: grid; gap: 8px; justify-items: center; text-align: center; padding-top: 8px; } .entity-modal__target-row { display: flex; align-items: baseline; justify-content: center; gap: 12px; flex-wrap: wrap; } .entity-modal__target-state { color: var(--text-muted); font-size: 17px; font-weight: 700; } .entity-modal__target-temp { font-family: var(--font-display); font-size: clamp(44px, 6vw, 72px); line-height: 1; letter-spacing: -0.06em; } .entity-modal__target-temp span { font-size: 0.36em; vertical-align: top; } .entity-modal__temperature-controls { display: flex; justify-content: center; gap: 14px; } .entity-modal__round-button { width: 54px; height: 54px; } .entity-modal__modes { display: grid; gap: 12px; } .entity-modal__options-block { display: grid; gap: 8px; } .entity-modal__chips { display: flex; flex-wrap: wrap; gap: 8px; } .entity-chip { border: 1px solid rgba(255,255,255,0.08); background: rgba(255,255,255,0.04); color: var(--text); border-radius: 999px; padding: 8px 12px; min-height: 36px; cursor: pointer; text-align: center; line-height: 1.05; } .entity-chip.is-active { background: rgba(103, 214, 255, 0.16); border-color: rgba(103, 214, 255, 0.28); color: var(--text); } .confirm-modal { width: min(420px, calc(100vw - 36px)); border-radius: 28px; border: 1px solid rgba(255,255,255,0.08); background: linear-gradient(180deg, rgba(20, 23, 30, 0.98), rgba(12, 14, 18, 0.98)); box-shadow: 0 24px 72px rgba(0, 0, 0, 0.5); padding: 22px; } .confirm-modal__header { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; } .confirm-modal__eyebrow { color: var(--text-subtle); text-transform: uppercase; letter-spacing: 0.16em; font-size: 12px; } .confirm-modal__title { margin-top: 6px; font-size: 20px; font-weight: 800; line-height: 1.08; } .confirm-modal__body { margin-top: 14px; color: var(--text-muted); font-size: 15px; line-height: 1.4; } .confirm-modal__footer { display: flex; justify-content: flex-end; gap: 10px; margin-top: 20px; } .confirm-modal .mushroom-button { min-width: 100px; } .hidden { display: none !important; } .main-dashboard { display: grid; gap: 18px; grid-column: 1 / -1; width: 100%; } .main-dashboard__hero { display: grid; grid-template-columns: minmax(280px, 360px) minmax(0, 1fr); gap: 18px; align-items: stretch; } .main-dashboard__weather-slot { min-width: 0; display: flex; align-self: stretch; } .main-dashboard__weather-slot .grid-card--weather { width: 100%; max-width: none; grid-column: auto; height: 100%; min-height: 100%; } .main-dashboard__actions { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; align-items: start; min-width: 0; align-self: start; } .main-dashboard__hero-stack { display: grid; gap: 14px; min-width: 0; align-self: start; align-content: start; } .main-print-strip { width: 100%; min-height: 0; border: 0; background: transparent; box-shadow: none; } .main-print-strip__inner { display: grid; gap: 6px; padding: 0 2px 0; } .main-print-strip__header { display: flex; align-items: center; justify-content: flex-end; gap: 12px; min-height: 16px; } .main-print-strip__badge { flex: 0 0 auto; padding: 2px 8px; border-radius: 999px; background: rgba(103, 214, 255, 0.14); border: 1px solid rgba(103, 214, 255, 0.22); color: var(--accent); font-size: 11px; font-weight: 800; line-height: 1; } .main-print-strip__progress { height: 6px; border-radius: 999px; overflow: hidden; background: rgba(255,255,255,0.08); } .main-print-strip__progress-fill { width: 0%; height: 100%; border-radius: inherit; background: linear-gradient(90deg, #67d6ff, #88f0c7); } .main-print-strip__footer { display: flex; align-items: center; justify-content: flex-end; gap: 12px; min-height: 14px; } .main-print-strip__remaining { color: var(--text-muted); font-size: 12px; font-weight: 700; line-height: 1; white-space: nowrap; letter-spacing: 0.02em; } .main-quick-action { min-height: 0; padding: 12px 10px 11px; border-radius: 20px; border: 1px solid rgba(0, 0, 0, 0.04); background: var(--quick-action-bg, rgba(255, 255, 255, 0.08)); color: var(--quick-action-color, var(--text)); box-shadow: 0 10px 24px rgba(0, 0, 0, 0.14); display: flex; flex-direction: column; align-items: center; justify-content: flex-start; gap: 6px; text-align: center; cursor: pointer; transition: transform 180ms ease, box-shadow 180ms ease, filter 180ms ease; position: relative; overflow: hidden; } .main-quick-action:hover { transform: translateY(-1px); filter: saturate(1.03); } .main-quick-action.is-active { box-shadow: 0 16px 32px rgba(0, 0, 0, 0.22); } .main-quick-action__icon { width: 24px; height: 24px; display: inline-flex; align-items: center; justify-content: center; color: var(--quick-action-icon-color, currentColor); flex: 0 0 auto; } .main-quick-action__icon i { font-size: 20px; line-height: 1; } .main-quick-action__icon .icon-node, .main-quick-action__icon .icon-node__img, .main-quick-action__icon .icon-node__svg { width: 100%; height: 100%; } .main-quick-action__label { font-size: 13px; font-weight: 800; line-height: 1.1; letter-spacing: -0.01em; word-break: break-word; } .main-dashboard__hero-spacer { flex: 1 1 auto; min-height: 1px; border-radius: var(--radius-xl); } .main-boiler-card { min-height: 112px; border-color: rgba(255, 186, 92, 0.18); background: radial-gradient(circle at top right, rgba(255, 186, 92, 0.14), transparent 42%), linear-gradient(180deg, rgba(37, 31, 24, 0.98), rgba(19, 20, 27, 0.96)); } .main-boiler-card__inner { display: grid; gap: 6px; padding: 10px 12px 10px; } .main-boiler-card__header { display: flex; align-items: flex-start; justify-content: space-between; gap: 8px; } .main-boiler-card__text { display: grid; gap: 2px; } .main-boiler-card__eyebrow { color: rgba(255, 214, 160, 0.72); font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.14em; } .main-boiler-card__body { display: grid; grid-template-columns: minmax(86px, 96px) minmax(0, 1fr); gap: 8px; align-items: center; min-width: 0; } .main-boiler-card__value-column { display: flex; flex-direction: column; justify-content: center; gap: 2px; min-width: 0; } .main-boiler-card__range { flex: 0 0 auto; padding: 4px 8px; border-radius: 999px; background: rgba(255, 186, 92, 0.11); color: rgba(255, 214, 160, 0.9); font-size: 11px; font-weight: 700; } .main-boiler-card__value-row { display: flex; align-items: baseline; gap: 6px; } .main-boiler-card__value-label { color: rgba(255, 214, 160, 0.7); font-size: 11px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; } .main-boiler-card__value { color: var(--text); font-family: var(--font-display); font-size: clamp(22px, 2.4vw, 28px); line-height: 0.98; letter-spacing: -0.06em; } .main-boiler-card__unit { color: rgba(255, 255, 255, 0.72); font-size: 12px; font-weight: 700; transform: translateY(-2px); } .main-boiler-card__chart-wrap { position: relative; min-height: 60px; border-radius: 14px; overflow: hidden; background: linear-gradient(180deg, rgba(255, 186, 92, 0.04), rgba(255, 186, 92, 0.01)); } .main-boiler-card__chart { width: 100%; height: 100%; display: block; } .main-boiler-card__loading { position: absolute; left: 10px; bottom: 6px; color: rgba(255, 214, 160, 0.72); font-size: 12px; font-weight: 600; } .main-dashboard__cards { width: 100%; grid-template-columns: repeat(15, minmax(0, 1fr)); } .main-dashboard__cards .grid-card { grid-column: span 3; width: 100%; aspect-ratio: 1 / 1; min-height: 0; } .main-dashboard__cards .grid-card__inner { padding: 12px; } .main-dashboard__cards .grid-card--cover { justify-self: stretch; max-width: none; } .room-entities-section { display: grid; gap: 14px; width: 100%; grid-column: 1 / -1; } .room-entities-section + .room-entities-section { margin-top: 16px; } .room-entities-section__header { display: flex; align-items: flex-end; justify-content: space-between; gap: 12px; padding: 0 4px; } .room-entities-section__title { color: var(--text-subtle); font-size: 12px; font-weight: 800; letter-spacing: 0.14em; text-transform: uppercase; } .room-entities-section__meta { color: var(--text-subtle); font-size: 12px; } .room-entities-section--hidden { padding-top: 16px; border-top: 1px solid rgba(255,255,255,0.07); } .room-entities-section--hidden .room-entities-section__title { color: var(--warning); } .battery-room { display: grid; gap: 14px; } .battery-room__header { align-items: flex-start; } .battery-room__list { display: grid; gap: 12px; } .battery-room__empty { grid-column: 1 / -1; } .battery-card { min-height: 96px; border-radius: 24px; background: radial-gradient(circle at top right, rgba(255,255,255,0.04), transparent 34%), linear-gradient(180deg, rgba(27, 30, 37, 0.98), rgba(18, 20, 26, 0.98)); border: 1px solid var(--border); box-shadow: var(--shadow); } .battery-card--critical, .battery-card--empty { border-color: rgba(255, 125, 125, 0.3); } .battery-card--low { border-color: rgba(255, 191, 84, 0.28); } .battery-card--unavailable { border-color: rgba(237, 240, 246, 0.14); } .battery-card--unknown { border-color: rgba(103, 214, 255, 0.18); } .battery-card--ok { border-color: rgba(136, 240, 199, 0.14); } .battery-card__inner { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 14px; align-items: center; padding: 16px 18px; } .battery-card__main { display: flex; align-items: center; gap: 14px; min-width: 0; } .battery-card__icon { width: 46px; height: 46px; border-radius: 16px; display: inline-flex; align-items: center; justify-content: center; background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.05); color: #ffc94d; flex: 0 0 auto; } .battery-card--critical .battery-card__icon, .battery-card--empty .battery-card__icon { color: #ff7d7d; } .battery-card--low .battery-card__icon { color: #ffbf54; } .battery-card--unavailable .battery-card__icon { color: rgba(237, 240, 246, 0.52); } .battery-card--unknown .battery-card__icon { color: var(--accent); } .battery-card--ok .battery-card__icon { color: var(--accent-2); } .battery-card__text { min-width: 0; } .battery-card__title { font-size: 18px; font-weight: 800; line-height: 1.1; overflow-wrap: anywhere; } .battery-card__source { margin-top: 5px; color: var(--text-muted); font-size: 13px; } .battery-card__side { display: flex; flex-direction: column; align-items: flex-end; gap: 3px; justify-content: center; text-align: right; } .battery-card__percent { font-size: 26px; line-height: 1; font-weight: 800; color: var(--text); } .battery-card--critical .battery-card__percent, .battery-card--empty .battery-card__percent { color: #ff7d7d; } .battery-card--low .battery-card__percent { color: #ffbf54; } .battery-card--unavailable .battery-card__percent, .battery-card--unknown .battery-card__percent { color: var(--text-muted); } .battery-card--ok .battery-card__percent { color: var(--accent-2); } .battery-card__status { color: var(--text-subtle); font-size: 11px; font-weight: 800; text-transform: uppercase; letter-spacing: 0.12em; } .battery-card__footer { grid-column: 1 / -1; margin-top: -2px; padding-left: 60px; color: var(--text-muted); font-size: 13px; } .room-entities-section__grid { grid-template-columns: repeat(5, minmax(0, 1fr)); width: 100%; align-items: stretch; } .room-entities-section__grid .grid-card--entity, .room-entities-section__grid .grid-card--entity-wide, .room-entities-section__grid .grid-card--cover, .room-entities-section__grid .grid-card--climate, .room-entities-section__grid .grid-card--auto, .room-entities-section__grid .grid-card--ghost { grid-column: span 1; } .room-entities-section__grid--hidden .grid-card { opacity: 0.86; border-style: dashed; } .room-entities-section__grid--hidden .grid-card__footer--edit .mushroom-button { background: rgba(255,255,255,0.03); } .dashboard-grid > .grid-surface { grid-template-columns: repeat(15, minmax(0, 1fr)); width: 100%; } @media (max-width: 1200px) { .app-shell { grid-template-columns: 230px 1fr; } .main-dashboard__hero { grid-template-columns: minmax(260px, 320px) minmax(0, 1fr); } .main-boiler-card { min-height: 108px; } .main-quick-action { padding: 10px 10px 9px; border-radius: 18px; } .main-quick-action__label { font-size: 12px; } .grid-card--weather { grid-column: 1 / -1; } .grid-card--auto, .grid-card--entity, .grid-card--entity-wide, .grid-card--cover, .grid-card--climate { grid-column: span 3; } } @media (max-width: 920px) { body { overflow: hidden; } .app-shell { grid-template-columns: 1fr; height: 100dvh; min-height: 100dvh; } .app-shell.is-mobile { overflow: hidden; } .app-shell.is-mobile .sidebar, .app-shell.is-mobile .content { min-height: 0; height: 100%; } .app-shell.is-mobile .sidebar { overflow: auto; border-right: 0; border-bottom: 1px solid rgba(255,255,255,0.05); padding: 18px 16px calc(18px + env(safe-area-inset-bottom)); } .app-shell.is-mobile .content { overflow: auto; padding: 18px 16px calc(18px + env(safe-area-inset-bottom)); } .app-shell.is-mobile.mobile-view-spaces .content { display: none; } .app-shell.is-mobile.mobile-view-room .sidebar { display: none; } .app-shell.is-mobile .content-header { align-items: center; gap: 12px; min-height: 0; margin-bottom: 14px; } .app-shell.is-mobile .content-header__back { display: inline-flex !important; } .app-shell.is-mobile .content-header__title { margin-top: 0; font-size: clamp(26px, 7vw, 36px); } .app-shell.is-mobile .content-header__meta { font-size: 13px; } .app-shell.is-mobile .room-item.is-selected { background: linear-gradient(180deg, rgba(28, 31, 39, 0.92), rgba(20, 23, 30, 0.92)); border-color: var(--border); box-shadow: inset 0 1px 0 rgba(255,255,255,0.03); } .app-shell.is-mobile .room-item.is-selected .room-item__icon { background: rgba(255,255,255,0.04); color: var(--accent); --icon-node-img-filter: brightness(0) saturate(100%) invert(72%) sepia(45%) saturate(1190%) hue-rotate(165deg) brightness(102%) contrast(101%); } .app-shell.is-mobile .content-top { margin-top: -12px; } .main-dashboard__hero { grid-template-columns: 1fr; } .main-dashboard__hero-stack { gap: 12px; } .main-dashboard__actions { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; } .main-quick-action { min-height: 76px; } .grid-card--weather { grid-column: 1 / -1; } .main-dashboard__cards { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; } .main-dashboard__cards .grid-card { grid-column: span 1; } .room-entities-section__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; } .room-entities-section__grid .grid-card--entity, .room-entities-section__grid .grid-card--entity-wide, .room-entities-section__grid .grid-card--cover, .room-entities-section__grid .grid-card--climate, .room-entities-section__grid .grid-card--auto, .room-entities-section__grid .grid-card--ghost { grid-column: span 1; } .grid-card--ghost { display: none; } .main-quick-action { min-height: 72px; } .main-boiler-card { min-height: 106px; } .main-boiler-card__body { grid-template-columns: minmax(82px, 92px) minmax(0, 1fr); gap: 6px; } .camera-modal { width: calc(100vw - 16px); height: calc(100vh - 16px); border-radius: 18px; } .entity-modal { width: calc(100vw - 20px); max-height: calc(100dvh - 20px); border-radius: 24px; } .temperature-sensor-modal { width: calc(100vw - 20px); max-height: calc(100dvh - 20px); border-radius: 24px; } .entity-modal__body { padding: 16px; gap: 14px; } .entity-modal__cover { grid-template-columns: minmax(0, 1fr) 88px; gap: 12px; } .entity-modal__cover-track { width: 44px; min-height: 240px; border-radius: 999px; } .entity-modal__cover-handle { width: 30px; height: 18px; } .entity-modal__actions--vertical { grid-auto-rows: minmax(48px, auto); gap: 8px; } }