:root { color-scheme: dark; --bg: #0d1015; --surface: #171c24; --surface-raised: #1d2430; --surface-strong: #252f3d; --text: #f4f7fb; --muted: #aab5c5; --border: #364356; --accent: #35c2a0; --accent-strong: #72e0c5; --accent-ink: #061511; --danger: #ff7777; --danger-bg: #3a2027; --focus: #8ddcff; --radius: 14px; --shadow: 0 20px 60px rgb(0 0 0 / 38%); } * { box-sizing: border-box; } [hidden] { display: none !important; } html { min-width: 0; background: var(--bg); scrollbar-gutter: stable; } body { min-height: 100vh; min-height: 100dvh; margin: 0; background: var(--bg); color: var(--text); font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; line-height: 1.45; } body.drawer-open, body.color-picker-open { overflow: hidden; } button, input, select, textarea { font: inherit; } button, input, select, textarea, summary { -webkit-tap-highlight-color: transparent; } button { min-height: 48px; border: 1px solid var(--border); border-radius: 10px; background: var(--surface-strong); color: var(--text); cursor: pointer; padding: 10px 14px; touch-action: manipulation; } button:hover { border-color: var(--accent); } button:active { transform: translateY(1px); } button:disabled { cursor: not-allowed; opacity: 0.6; } button[aria-disabled="true"], input[aria-disabled="true"] + .switch-track, input[aria-disabled="true"] ~ .switch-state { cursor: not-allowed; opacity: 0.6; } button[data-control-state="busy"]:disabled, input[data-control-state="busy"]:disabled + .switch-track { cursor: progress; } .sr-only { position: absolute !important; width: 1px !important; height: 1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; clip-path: inset(50%) !important; } .control-unavailable-tooltip, .control-feedback-toast { z-index: 1200; max-width: min(30rem, calc(100vw - 24px)); border: 1px solid rgb(80 220 190 / 72%); border-radius: 10px; background: #172129; color: var(--text); box-shadow: 0 12px 30px rgb(0 0 0 / 38%); padding: 10px 12px; font-size: 0.92rem; line-height: 1.45; } .control-unavailable-tooltip { position: fixed; pointer-events: none; } .control-feedback-toast { position: fixed; right: max(12px, env(safe-area-inset-right)); bottom: max(12px, env(safe-area-inset-bottom)); left: max(12px, env(safe-area-inset-left)); width: fit-content; margin-inline: auto; } button:focus-visible, input:focus-visible, select:focus-visible, textarea:focus-visible, summary:focus-visible { outline: 3px solid var(--focus); outline-offset: 2px; } h1, h2, h3, p, dl, dd { margin: 0; } h1 { font-size: clamp(1.05rem, 4vw, 1.35rem); } h2 { font-size: clamp(1.5rem, 7vw, 2rem); line-height: 1.15; } h3 { font-size: 1.05rem; } .app-shell { min-height: 100vh; min-height: 100dvh; } .drawer { position: fixed; z-index: 30; inset: 0 auto 0 0; display: flex; width: min(84vw, 20rem); flex-direction: column; overflow-y: auto; border-right: 1px solid var(--border); background: #121720; box-shadow: var(--shadow); padding: calc(18px + env(safe-area-inset-top)) 16px calc(18px + env(safe-area-inset-bottom)); transform: translateX(-105%); transition: transform 180ms ease; } .drawer-toggle { position: fixed; z-index: 40; top: calc(12px + env(safe-area-inset-top)); left: calc(12px + env(safe-area-inset-left)); display: grid; width: 48px; min-width: 48px; height: 48px; min-height: 48px; place-items: center; padding: 11px; box-shadow: 0 6px 20px rgb(0 0 0 / 28%); } .drawer-toggle svg { width: 24px; height: 24px; fill: none; stroke: currentcolor; stroke-linecap: round; stroke-width: 2; } .drawer-toggle-close-icon, .drawer-toggle[aria-expanded="true"] .drawer-toggle-menu-icon { display: none; } .drawer-toggle[aria-expanded="true"] .drawer-toggle-close-icon { display: block; } .drawer.open { transform: translateX(0); } .drawer-header, .topbar, .board-heading, .workspace-heading, .panel-heading, .primary-actions, .board-actions, .text-element-actions { display: flex; align-items: center; justify-content: space-between; gap: 12px; } .drawer-header { min-height: 48px; padding-left: 60px; } .brand { margin-top: 3px; font-size: 1.05rem; font-weight: 720; } .eyebrow { color: var(--accent-strong); font-size: 0.75rem; font-weight: 750; letter-spacing: 0.08em; text-transform: uppercase; } .compact-button { min-height: 44px; padding-inline: 12px; } .workspace-nav { display: grid; gap: 8px; margin-top: 16px; } .workspace-order-editor { display: grid; gap: 8px; margin-top: 14px; padding-inline: 10px; } .workspace-order-toggle { width: 100%; min-height: 40px; padding-block: 7px; font-size: 0.82rem; } .workspace-order-feedback { margin: 0; color: var(--muted); font-size: 0.78rem; } .workspace-order-feedback[data-state="error"] { color: var(--danger); } .workspace-order-feedback[data-state="success"] { color: var(--accent-strong); } .nav-item-row { display: grid; grid-template-columns: minmax(0, 1fr); gap: 8px; } .workspace-nav.is-order-editing .nav-item-row { grid-template-columns: minmax(0, 1fr) auto; } .nav-order-actions { display: grid; grid-template-columns: repeat(2, minmax(48px, auto)); gap: 6px; } .nav-order-action { min-height: 48px; padding-inline: 10px; font-size: 0.82rem; } .nav-item { width: 100%; min-height: 52px; border-color: transparent; background: transparent; text-align: left; } .nav-item[aria-current="page"] { border-color: rgb(53 194 160 / 45%); background: rgb(53 194 160 / 14%); color: var(--accent-strong); } .nav-item[aria-disabled="true"] { cursor: default; } .drawer-note { margin-top: auto; padding: 24px 10px 0; color: var(--muted); font-size: 0.78rem; } .drawer-backdrop { position: fixed; z-index: 20; inset: 0; width: 100%; min-height: 100%; border: 0; border-radius: 0; background: rgb(0 0 0 / 62%); padding: 0; } .topbar { position: sticky; z-index: 10; top: 0; min-height: 76px; justify-content: space-between; flex-wrap: wrap; border-bottom: 1px solid var(--border); background: rgb(13 16 21 / 92%); padding: calc(10px + env(safe-area-inset-top)) max(14px, env(safe-area-inset-right)) 10px calc(74px + env(safe-area-inset-left)); backdrop-filter: blur(14px); } .topbar-copy { min-width: 0; } .topbar-statuses { display: flex; flex: 0 1 auto; min-width: 0; max-width: 100%; flex-wrap: wrap; align-items: stretch; justify-content: flex-end; gap: 8px; } .current-content-indicator { display: flex; flex: 1 1 13rem; min-width: 0; min-height: 44px; align-items: center; justify-content: center; overflow-wrap: anywhere; border: 1px solid rgb(114 224 197 / 38%); border-radius: 10px; background: rgb(114 224 197 / 8%); padding: 8px 12px; color: var(--accent-strong); font-size: 0.82rem; font-weight: 700; text-align: center; cursor: pointer; } .current-content-indicator:hover, .current-content-indicator:focus-visible { border-color: var(--accent); background: rgb(114 224 197 / 14%); } .resource-indicator { display: flex; flex: 0 1 auto; align-items: center; justify-content: center; min-height: 44px; border: 1px solid var(--border); border-radius: 10px; background: var(--surface); color: var(--text); padding: 8px 10px; font-size: 0.78rem; font-variant-numeric: tabular-nums; font-weight: 650; white-space: nowrap; } .resource-indicator[data-status="starting"] { color: var(--muted); } .resource-indicator[data-status="error"] { border-color: rgb(255 119 119 / 50%); background: rgb(255 119 119 / 8%); color: var(--danger); } .low-voltage-warning { display: flex; flex: 0 1 auto; min-width: 16rem; align-items: center; justify-content: center; border: 1px solid rgb(255 190 92 / 58%); border-radius: 10px; background: rgb(255 190 92 / 12%); color: #ffd27f; padding: 8px 12px; font-size: 0.82rem; font-weight: 760; line-height: 1.3; overflow-wrap: anywhere; text-align: center; } .low-voltage-warning[data-mode="critical"] { border-color: rgb(255 119 119 / 62%); background: rgb(255 119 119 / 12%); color: var(--danger); } .resource-details-dialog { width: min(calc(100% - 28px), 36rem); } .current-display-dialog { width: min(calc(100% - 28px), 34rem); } .current-display-dialog-body { display: grid; gap: 16px; padding: 20px; } .current-display-dialog-heading { display: flex; min-width: 0; align-items: flex-start; justify-content: space-between; gap: 12px; } .current-display-dialog-heading h2, .current-display-dialog-heading p { margin: 0; } .current-display-dialog-heading p { margin-top: 4px; overflow-wrap: anywhere; } .current-display-preview-surface { display: grid; width: min(100%, 20rem); aspect-ratio: 1; place-items: center; justify-self: center; overflow: hidden; border: 1px solid var(--border); border-radius: 14px; background: #000; color: var(--muted); padding: 0; } .current-display-preview-surface img { width: 100%; height: 100%; object-fit: contain; image-rendering: pixelated; } .current-display-preview-surface span { padding: 16px; } .current-display-playback-controls { display: grid; gap: 12px; border-top: 1px solid var(--border); padding-top: 16px; } .current-display-playback-controls[hidden] { display: none; } .current-display-progress-heading { display: flex; align-items: center; justify-content: space-between; gap: 12px; } .current-display-progress-heading output { font-variant-numeric: tabular-nums; white-space: nowrap; } #current-display-progress { width: 100%; accent-color: var(--accent); } .current-display-playback-actions { display: grid; grid-template-columns: minmax(7rem, auto) minmax(0, 1fr); gap: 10px; } .current-display-speed-controls { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; } .current-display-speed-controls button[aria-pressed="true"] { border-color: var(--accent); background: rgb(114 224 197 / 14%); color: var(--accent-strong); } .resource-details-message { border: 1px solid var(--border); border-radius: 10px; background: var(--bg); color: var(--muted); padding: 10px 12px; } .resource-details-section { display: grid; gap: 12px; border-top: 1px solid var(--border); padding-top: 14px; } .resource-details-section h3 { margin: 0; } .resource-details-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; margin: 0; } .resource-details-grid > div { min-width: 0; border: 1px solid var(--border); border-radius: 10px; background: var(--bg); padding: 10px 12px; } .resource-details-grid dt { color: var(--muted); font-size: 0.75rem; } .resource-details-grid dd { overflow-wrap: anywhere; margin: 4px 0 0; font-variant-numeric: tabular-nums; font-weight: 720; } .resource-core-list { display: grid; gap: 8px; } .resource-core-row { display: grid; grid-template-columns: 3.5rem minmax(0, 1fr) 3.2rem; align-items: center; gap: 8px; font-size: 0.78rem; font-variant-numeric: tabular-nums; } .resource-core-row progress { width: 100%; height: 10px; accent-color: var(--accent); } .resource-core-row output { text-align: right; } .resource-dialog-actions { grid-template-columns: minmax(0, 1fr); } .voltage-indicator { flex: 0 0 auto; min-width: 12rem; border: 1px solid rgb(53 194 160 / 38%); border-radius: 12px; background: rgb(53 194 160 / 10%); color: var(--accent-strong); padding: 10px 14px; font-size: 1.05rem; font-weight: 720; text-align: center; } .voltage-indicator[data-status="starting"] { border-color: var(--border); background: var(--surface); color: var(--muted); } .voltage-indicator[data-status="disconnected"], .voltage-indicator[data-status="error"] { border-color: rgb(255 119 119 / 50%); background: rgb(255 119 119 / 8%); color: var(--danger); } .last-message { max-width: 70vw; overflow: hidden; margin-top: 2px; color: var(--muted); font-size: 0.78rem; text-overflow: ellipsis; white-space: nowrap; } .last-message.message-error { color: var(--danger); } .sync-notice { display: flex; width: min(100% - 20px, 72rem); align-items: center; justify-content: space-between; gap: 14px; margin: 12px auto 0; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface-raised); padding: 14px; } .sync-notice-warning { border-color: rgb(255 190 92 / 65%); background: #332919; } .sync-notice p { margin-top: 4px; color: var(--muted); } .sync-notice-actions { display: flex; flex: 0 0 auto; gap: 8px; } @media (max-width: 42rem) { .sync-notice { align-items: stretch; flex-direction: column; } .sync-notice-actions { display: grid; } } .board-shell { width: 100%; padding: 18px max(10px, env(safe-area-inset-right)) 4px max(10px, env(safe-area-inset-left)); } .board-heading, .board-status, .board-actions { width: min(100%, max(16rem, calc(100dvh - 10rem))); margin-inline: auto; } .board-heading { margin-bottom: 10px; } .board-heading h2 { margin-top: 2px; font-size: clamp(1.15rem, 4vw, 1.55rem); } .board-heading-context { display: flex; min-width: 0; align-items: center; justify-content: flex-end; } .animation-edit-notice { display: inline-flex; min-width: 0; max-width: min(28rem, 58vw); align-items: center; gap: 8px; border: 1px solid rgb(63 211 172 / 55%); border-radius: 999px; background: rgb(63 211 172 / 10%); padding: 6px 10px; } .animation-edit-notice[hidden] { display: none; } .animation-edit-notice strong { min-width: 0; color: var(--text); font-size: 0.82rem; overflow-wrap: anywhere; } .animation-edit-notice > span:last-child { align-self: center; color: var(--accent-strong); font-size: 0.8rem; font-weight: 700; } .animation-edit-notice[data-state="dirty"] { border-color: rgb(255 190 92 / 65%); background: rgb(255 190 92 / 11%); } .animation-edit-notice[data-state="dirty"] > span:last-child { color: #ffbe5c; } .animation-preview-shell { width: min(100%, 25rem); margin-inline: auto; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; } .animation-preview-shell[hidden] { display: none; } .animation-preview-card { min-width: 0; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); padding: 12px; text-align: center; } .animation-preview-card h3 { margin-top: 2px; font-size: 1rem; } .animation-small-preview { position: relative; display: grid; width: min(100%, 160px); aspect-ratio: 1; place-items: center; overflow: hidden; margin: 10px auto 0; border: 1px solid var(--border); border-radius: 8px; background: #000; color: var(--muted); font-size: 0.75rem; isolation: isolate; } .animation-small-preview img, .animation-small-preview canvas { display: block; width: 100%; height: 100%; object-fit: contain; image-rendering: pixelated; image-rendering: crisp-edges; } .animation-small-preview > span { max-width: 9rem; padding: 10px; } .animation-preview-status { min-height: 2.5em; margin-top: 8px; color: var(--muted); font-size: 0.75rem; } .board-stage { position: relative; width: min(100%, max(16rem, calc(100dvh - 10rem))); aspect-ratio: 1; overflow: hidden; margin-inline: auto; border: 1px solid var(--border); border-radius: 8px; background: #000; box-shadow: 0 18px 50px rgb(0 0 0 / 26%); isolation: isolate; } .board-stage canvas { position: absolute; inset: 0; display: block; width: 100%; height: 100%; } #scene-canvas { z-index: 1; image-rendering: pixelated; image-rendering: crisp-edges; } #scene-overlay { z-index: 2; user-select: none; } #scene-overlay[data-interaction="text"], #scene-overlay[data-canvas-editing="true"] { touch-action: none; } #scene-overlay[data-interaction="pixels"]:not([data-canvas-editing="true"]) { pointer-events: none; touch-action: auto; } .pixel-grid { position: absolute; z-index: 3; inset: 0; pointer-events: none; background-image: linear-gradient(to right, rgb(255 255 255 / 28%) 1px, transparent 1px), linear-gradient(to bottom, rgb(255 255 255 / 28%) 1px, transparent 1px); background-size: calc(100% / 64) calc(100% / 64); mix-blend-mode: difference; } .pixel-grid[hidden] { display: none; } #scene-overlay[data-interaction="readonly"] { pointer-events: none; } body.canvas-edit-active { overflow: hidden; overscroll-behavior: none; } body.canvas-edit-active #board-shell { position: fixed; z-index: 1000; inset: 0; overflow: hidden; width: 100%; height: 100dvh; background: #05080d; padding: 0; } body.canvas-edit-active #standard-board-shell { position: relative; display: grid; width: 100%; height: 100%; place-items: center; overflow: hidden; } body.canvas-edit-active .board-heading, body.canvas-edit-active .board-status, body.canvas-edit-active .board-actions { display: none; } body.canvas-edit-active .board-stage { width: min(calc(100vw - 24px), calc(100dvh - 24px)); max-width: none; margin: 0; transform: translate3d(var(--canvas-view-x, 0), var(--canvas-view-y, 0), 0) scale(var(--canvas-view-scale, 1)); transform-origin: center; will-change: transform; } body.canvas-edit-active[data-canvas-editor-mode="move"] .board-stage { cursor: grab; } body.canvas-edit-active[data-canvas-editor-mode="move"] .board-stage:active { cursor: grabbing; } .canvas-edit-assistive { position: absolute; z-index: 1010; top: 0; left: 0; width: 0; height: 0; transform: translate3d(var(--assistive-x, 36px), var(--assistive-y, 50dvh), 0); touch-action: none; } .canvas-edit-assistive[hidden], .canvas-assistive-menu[hidden] { display: none; } .canvas-assistive-toggle { position: absolute; top: -28px; left: -28px; display: grid; width: 56px; min-width: 56px; min-height: 56px; place-items: center; border: 1px solid rgb(255 255 255 / 58%); border-radius: 50%; background: rgb(35 43 54 / 82%); padding: 0; box-shadow: 0 8px 24px rgb(0 0 0 / 48%); backdrop-filter: blur(12px); cursor: grab; } .canvas-assistive-toggle:active { cursor: grabbing; } .canvas-assistive-toggle span { width: 30px; height: 30px; border: 2px solid rgb(255 255 255 / 90%); border-radius: 50%; box-shadow: inset 0 0 0 5px rgb(255 255 255 / 20%); } .canvas-assistive-menu { position: absolute; top: -28px; left: 38px; display: grid; width: min(14rem, calc(100vw - 88px)); gap: 8px; border: 1px solid rgb(255 255 255 / 22%); border-radius: 16px; background: rgb(16 23 33 / 96%); padding: 12px; box-shadow: 0 16px 40px rgb(0 0 0 / 55%); } .canvas-edit-assistive[data-menu-horizontal="left"] .canvas-assistive-menu { right: 38px; left: auto; } .canvas-edit-assistive[data-menu-vertical="up"] .canvas-assistive-menu { top: auto; bottom: -28px; } .canvas-assistive-menu p { color: var(--muted); font-size: 0.78rem; line-height: 1.45; } .canvas-assistive-menu button { min-height: 48px; text-align: left; } .canvas-assistive-menu button[aria-disabled="true"] { opacity: 0.48; } .board-status { min-height: 1.4rem; margin-top: 8px; color: var(--muted); font-size: 0.78rem; } .board-status[data-state="error"] { color: var(--danger); } .board-status[data-state="pending"] { color: var(--accent-strong); } .board-actions { align-items: stretch; margin-top: 10px; } .board-actions > * { flex: 1 1 0; } .board-shell-monitor .board-stage { width: min(100%, 160px); } .board-shell-monitor .board-heading, .board-shell-monitor .board-status { width: min(100%, 24rem); } .board-shell-monitor .board-actions, .board-shell-monitor #scene-overlay { display: none; } .board-shell-device-monitor .board-heading { justify-content: center; text-align: center; } .board-shell-device-monitor .board-heading-context { display: none; } .workspace-root { width: min(100%, 62rem); margin: 0 auto; padding: 20px max(14px, env(safe-area-inset-right)) calc(36px + env(safe-area-inset-bottom)) max(14px, env(safe-area-inset-left)); } .workspace { display: grid; gap: 14px; } .device-refresh-row { display: flex; justify-content: center; } .device-refresh-row > button { min-width: min(100%, 12rem); } .workspace-heading { min-height: 58px; } .workspace-heading-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; } .workspace-intro, .subtle, .hint, dt, .orientation-label { color: var(--muted); } .workspace-intro { margin-top: -4px; } .orientation-label, .status-badge { flex: 0 0 auto; border: 1px solid var(--border); border-radius: 999px; background: var(--surface); padding: 5px 9px; font-size: 0.75rem; } .status-badge { flex: 0 1 auto; max-width: 100%; border-color: rgb(53 194 160 / 38%); color: var(--accent-strong); overflow-wrap: anywhere; text-align: right; } .panel { min-width: 0; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); padding: 16px; } .panel > h3 + * { margin-top: 14px; } .status-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; margin-top: 14px; } .status-grid div { min-width: 0; border-radius: 10px; background: var(--surface-raised); padding: 11px; } .status-grid-compact { grid-template-columns: repeat(2, minmax(0, 1fr)); } dt { font-size: 0.72rem; } dd { margin-top: 4px; overflow-wrap: anywhere; font-weight: 650; } .driver-details { margin-top: 12px; color: var(--muted); font-size: 0.8rem; } .driver-details summary { min-height: 44px; cursor: pointer; padding-block: 11px; } .driver-details p { overflow-wrap: anywhere; border-radius: 8px; background: var(--bg); padding: 10px; font-family: ui-monospace, "Cascadia Mono", monospace; } .error-text { margin-top: 10px; color: var(--danger); overflow-wrap: anywhere; } .template-storage { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; } .device-storage-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .display-test-controls { display: grid; gap: 10px; margin-top: 16px; border-top: 1px solid var(--border); padding-top: 16px; } .display-test-controls > .settings-feedback { min-height: 0; } .display-test-controls > .danger-button { width: min(100%, 18rem); justify-self: center; } .template-storage div { display: grid; gap: 4px; min-width: 0; border-radius: 10px; background: var(--surface-raised); padding: 11px; } .template-storage span, .template-card-size { color: var(--muted); font-size: 0.76rem; } .content-type-badge { justify-self: start; display: inline-flex; padding: 0.2rem 0.55rem; border-radius: 999px; background: rgba(114, 224, 197, 0.14); color: var(--accent-strong, #72e0c5); font-size: 0.75rem; font-weight: 700; } .content-type-animation { background: rgba(255, 166, 92, 0.16); color: #ffb475; } .animation-toolbar { display: flex; flex-wrap: wrap; gap: 0.75rem; align-items: center; } .animation-folder-list { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 15rem), 1fr)); gap: 0.75rem; margin-top: 0.75rem; } .animation-existing { min-width: 0; } .animation-folder-card.active { outline: 2px solid var(--accent-strong, #72e0c5); } .animation-folder-card { min-width: 0; overflow: hidden; } .animation-folder-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .animation-folder-card h3, .animation-folder-card p { margin: 0 0 0.65rem; } #animation-frames input[type="number"] { width: 100%; min-width: 0; } .animation-frame-card { display: flex; flex-direction: column; } .animation-batch-toolbar { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px; margin: 0 0 12px; padding: 10px; border: 1px solid var(--border); border-radius: 10px; background: rgb(255 255 255 / 3%); } .animation-batch-toolbar p { margin: 0; color: var(--muted); font-size: 0.78rem; } .animation-frame-pagination { display: flex; align-items: center; justify-content: center; gap: 0.75rem; margin-top: 1rem; } .animation-frame-pagination[hidden] { display: none; } .animation-frame-pagination p { margin: 0; min-width: 10rem; text-align: center; } .animation-batch-actions { display: flex; flex-wrap: wrap; gap: 8px; } .animation-frame-card.selected { outline: 2px solid #6ea8ff; outline-offset: -2px; } .animation-frame-position-row { display: flex; min-height: 28px; align-items: center; justify-content: space-between; gap: 10px; color: var(--muted); font-size: 0.72rem; } .animation-frame-position-current { color: #72e0c5; font-weight: 800; } .animation-frame-position-total { color: #ffb475; font-weight: 800; } .animation-frame-select { width: 22px; height: 22px; margin: 0; accent-color: #6ea8ff; } .animation-frame-card.editing { outline: 2px solid var(--accent-strong, #72e0c5); outline-offset: -2px; } .animation-frame-name { margin: 0; min-height: 2.5em; } .animation-frame-editing-badge { align-self: flex-start; margin-top: 6px; border-radius: 999px; background: rgb(63 211 172 / 16%); color: var(--accent-strong); padding: 3px 7px; font-size: 0.72rem; font-weight: 700; } .animation-frame-editing-badge[hidden] { display: none; } .animation-frame-rename { align-self: stretch; margin-top: 7px; } .animation-duration-field { display: grid; gap: 5px; margin-top: 10px; color: var(--muted); font-size: 0.78rem; } .animation-duration-heading, .animation-duration-controls { display: flex; align-items: center; justify-content: space-between; gap: 8px; } .animation-duration-heading button { min-height: 32px; padding: 5px 8px; font-size: 0.72rem; } .animation-duration-controls input { flex: 1 1 auto; } .animation-duration-unit { flex: 0 0 auto; min-width: 4.4rem; min-height: 42px; padding-inline: 9px; } .animation-duration-field input[aria-invalid="true"] { border-color: var(--danger); } .animation-duration-error { color: var(--danger); font-size: 0.72rem; line-height: 1.35; } .animation-duration-error[hidden] { display: none; } .animation-frame-image-box { flex: 0 0 auto; margin-top: 10px; } .animation-frame-edit { width: 100%; margin-top: 9px; } .animation-frame-secondary-actions { grid-template-columns: repeat(2, minmax(0, 1fr)); } .template-storage strong { overflow-wrap: anywhere; } .template-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; } .template-card { min-width: 0; overflow: hidden; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); padding: 10px; } .sortable-card { cursor: grab; } .sortable-card.is-dragging { cursor: grabbing; opacity: 0.58; } .library-sortable-card.library-drop-target { outline: 2px solid var(--accent-strong, #72e0c5); outline-offset: -2px; } .library-demo-fixed { cursor: default; } .template-card.template-default-content { border-color: var(--accent-strong); box-shadow: inset 0 0 0 1px var(--accent-strong); } .template-default-badge { display: inline-flex; width: fit-content; margin-top: 8px; border-radius: 999px; background: var(--accent-strong); padding: 3px 8px; color: #07100e; font-size: 0.72rem; font-weight: 800; } .template-card-default-actions { grid-template-columns: minmax(0, 1fr); } .template-image-box { position: relative; display: grid; width: 100%; aspect-ratio: 1; place-items: center; overflow: hidden; border-radius: 10px; background: linear-gradient(45deg, #222a36 25%, transparent 25%, transparent 75%, #222a36 75%), linear-gradient(45deg, #222a36 25%, #151a22 25%, #151a22 75%, #222a36 75%); background-position: 0 0, 8px 8px; background-size: 16px 16px; } .template-image-box.template-image-error::after { content: "缩略图加载失败"; padding: 12px; color: var(--danger); font-size: 0.75rem; text-align: center; } .template-image-box.template-image-empty::after { content: "空动图"; padding: 12px; color: var(--muted); font-size: 0.75rem; text-align: center; } .template-image { width: 100%; height: 100%; object-fit: contain; image-rendering: pixelated; } .template-card-name { margin-top: 10px; overflow-wrap: anywhere; font-size: 0.96rem; line-height: 1.3; } .template-card-size { margin-top: 4px; } .template-card-actions { display: grid; gap: 7px; margin-top: 9px; } .template-card-content-actions, .template-card-order-actions { grid-template-columns: repeat(2, minmax(0, 1fr)); } .template-card-order-actions { margin-top: 7px; } .template-card-actions button { min-width: 0; padding-inline: 6px; font-size: 0.8rem; } .template-card-actions .demo-restricted-action[aria-disabled="true"] { border-color: #000; background: #050505; color: #9aa1ab; opacity: 1; } .template-card-delete-action { grid-column: 1 / -1; } .template-empty { grid-column: 1 / -1; color: var(--muted); text-align: center; } .template-dialog { width: min(calc(100% - 28px), 26rem); border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); color: var(--text); padding: 0; box-shadow: var(--shadow); } .template-dialog::backdrop { background: rgb(0 0 0 / 70%); } .template-dialog form { display: grid; gap: 16px; padding: 20px; } .template-dialog-heading { display: flex; min-width: 0; align-items: baseline; justify-content: space-between; gap: 12px; } .template-dialog-heading p { max-width: 14rem; color: #ffbe5c; font-size: 0.78rem; text-align: right; } .template-dialog label { display: grid; gap: 7px; } .template-dialog input, .template-dialog select { min-height: 48px; width: 100%; border: 1px solid var(--border); border-radius: 10px; background: var(--bg); color: var(--text); padding: 10px 12px; } .animation-position-dialog option:disabled { background: #050505; color: #fff; } .template-dialog-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; } @media (max-width: 28rem) { .template-storage { grid-template-columns: 1fr; } .animation-preview-shell { width: min(100%, 186px); grid-template-columns: 1fr; } .template-dialog-heading { align-items: flex-start; flex-direction: column; gap: 6px; } .template-dialog-heading p { text-align: left; } } @media (max-width: 36rem) { .board-heading { align-items: flex-start; flex-direction: column; } .board-heading-context, .animation-edit-notice { width: 100%; max-width: none; } .animation-edit-notice { justify-content: space-between; border-radius: 12px; } } @media (min-width: 46rem) { .template-grid { grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr)); } } .choice-grid, .orientation-grid, .refresh-rate-grid, .form-grid, .canvas-toolbar, .segmented { display: grid; gap: 8px; } .choice-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .color-choices { grid-template-columns: repeat(3, minmax(0, 1fr)); } .choice-grid button.active, .segmented button.active, .orientation-grid button.active, .refresh-rate-grid button.active { border-color: var(--accent); background: var(--accent); color: var(--accent-ink); font-weight: 750; } label { display: grid; gap: 7px; color: var(--muted); font-size: 0.82rem; } input, select, textarea { width: 100%; min-height: 48px; border: 1px solid var(--border); border-radius: 10px; background: #0c1118; color: var(--text); padding: 10px 12px; } textarea { min-height: 76px; resize: vertical; } .color-field { display: grid; align-items: center; grid-template-columns: 1fr auto; margin-top: 12px; } .color-trigger { display: inline-grid; width: auto; min-width: 9.5rem; grid-template-columns: 34px 1fr; align-items: center; gap: 9px; padding: 6px 10px; } .color-trigger-swatch { width: 34px; height: 34px; border: 2px solid rgb(255 255 255 / 65%); border-radius: 8px; box-shadow: inset 0 0 0 1px rgb(0 0 0 / 45%); } .color-trigger-value { font-family: ui-monospace, "Cascadia Mono", monospace; font-size: 0.86rem; } .hint { margin-top: 10px; font-size: 0.78rem; } .primary-actions { align-items: stretch; margin-top: 16px; } .primary-actions > * { flex: 1 1 0; } .primary-button { border-color: var(--accent); background: var(--accent); color: var(--accent-ink); font-weight: 780; } .secondary-button { background: transparent; } .danger-button { border-color: rgb(255 119 119 / 55%); background: var(--danger-bg); color: #ffd7d7; } .full-width { width: 100%; margin-top: 12px; } .preview-panel { text-align: center; } .preview-panel .panel-heading { text-align: left; } .matrix-preview { display: block; width: 100%; aspect-ratio: 1; border: 1px solid var(--border); border-radius: 10px; background: #000; image-rendering: pixelated; image-rendering: crisp-edges; } .compact-preview { max-width: 22rem; margin: 14px auto 0; } .canvas-preview { max-width: 42rem; margin: 14px auto 0; border-radius: 6px; touch-action: none; user-select: none; } .canvas-toolbar { grid-template-columns: minmax(0, 1fr); } .canvas-toolbar .color-field { margin-top: 0; } .segmented { grid-column: 1 / -1; grid-template-columns: repeat(2, minmax(0, 1fr)); } .canvas-tools { grid-template-columns: repeat(3, minmax(0, 1fr)); } .brush-size-control { grid-column: 1 / -1; border: 1px solid var(--border); border-radius: 12px; background: #101721; padding: 12px; } .brush-size-heading, .brush-size-row, .brush-size-presets { display: flex; align-items: center; gap: 10px; } .brush-size-heading { justify-content: space-between; margin-bottom: 8px; } .brush-size-heading output { color: var(--accent-strong); font-weight: 750; } .brush-size-row input { flex: 1; min-height: 48px; padding: 0; accent-color: var(--accent); } .brush-size-preview { display: block; flex: 0 0 auto; max-width: 32px; max-height: 32px; border-radius: 50%; background: var(--text); box-shadow: 0 0 0 1px var(--border); } .brush-size-presets { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); margin-top: 8px; } .pixel-edit-toggle { width: 100%; min-height: 48px; margin-top: 12px; } .pixel-edit-toggle[aria-pressed="true"] { border-color: var(--accent); background: rgb(53 194 160 / 16%); color: var(--accent-strong); } .pixel-edit-status { margin: 10px 0 0; color: var(--accent-strong); font-size: 0.8rem; line-height: 1.45; } .pixel-edit-status[hidden] { display: none; } .brush-size-preview[data-shape="square"] { border-radius: 2px; } .color-picker-overlay { position: fixed; z-index: 100; inset: 0; display: flex; align-items: flex-end; justify-content: center; background: rgb(2 6 11 / 76%); padding-top: max(12px, env(safe-area-inset-top)); } .color-picker-panel { width: 100%; max-height: calc(100dvh - 12px); overflow-y: auto; overscroll-behavior: contain; border: 1px solid var(--border); border-radius: 20px 20px 0 0; background: var(--surface); box-shadow: var(--shadow); padding: 18px max(16px, env(safe-area-inset-right)) max(18px, env(safe-area-inset-bottom)) max(16px, env(safe-area-inset-left)); } .color-picker-header, .color-collection-heading, .color-picker-actions, .color-comparison { display: flex; align-items: center; justify-content: space-between; gap: 10px; } .color-picker-header { margin-bottom: 14px; } .color-comparison > div { display: grid; flex: 1; grid-template-columns: 1fr 52px; align-items: center; gap: 8px; color: var(--muted); font-size: 0.82rem; } .color-comparison i { display: block; height: 48px; border: 2px solid rgb(255 255 255 / 65%); border-radius: 10px; box-shadow: inset 0 0 0 1px rgb(0 0 0 / 50%); } .color-mode-tabs { display: grid; margin: 14px 0; } .color-sv-field { position: relative; width: 100%; min-height: 190px; border: 1px solid rgb(255 255 255 / 35%); border-radius: 12px; cursor: crosshair; touch-action: none; } .color-linear-track { position: relative; height: 48px; border: 1px solid rgb(255 255 255 / 35%); border-radius: 12px; cursor: pointer; touch-action: none; } .color-hue-track { margin-top: 12px; background: linear-gradient(to right, #f00, #ff0, #0f0, #0ff, #00f, #f0f, #f00); } .color-track-handle { position: absolute; top: 50%; width: 26px; height: 26px; border: 3px solid #fff; border-radius: 50%; box-shadow: 0 1px 5px rgb(0 0 0 / 80%); pointer-events: none; transform: translate(-50%, -50%); } .color-number-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; margin-top: 12px; } .color-number-grid label, .color-hex-field { display: grid; grid-template-columns: auto 1fr; align-items: center; gap: 8px; } .color-number-grid input { min-width: 0; } .rgb-channel { display: grid; grid-template-columns: 20px minmax(0, 1fr) 72px; align-items: center; gap: 8px; margin-bottom: 10px; } .rgb-channel input { min-width: 0; padding-inline: 7px; text-align: center; } .color-hex-field { margin-top: 12px; } .color-hex-field input { font-family: ui-monospace, "Cascadia Mono", monospace; text-transform: uppercase; } .color-collection { margin-top: 16px; } .color-collection-heading > div { display: flex; gap: 6px; } .color-swatch-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(48px, 1fr)); gap: 8px; min-height: 48px; margin-top: 9px; color: var(--muted); font-size: 0.82rem; } .color-swatch, .palette-swatch { position: relative; width: 100%; min-width: 48px; height: 48px; } .palette-swatch { display: block; } .color-swatch { border: 2px solid rgb(255 255 255 / 58%); padding: 0; box-shadow: inset 0 0 0 1px rgb(0 0 0 / 52%); } .palette-remove { position: absolute; top: 0; right: 0; width: 48px; min-width: 48px; min-height: 48px; border-color: #fff; border-radius: 10px; background: rgb(58 32 39 / 88%); color: var(--danger); line-height: 1; padding: 0; } .color-picker-actions { position: sticky; bottom: calc(-1 * max(18px, env(safe-area-inset-bottom))); margin: 18px -4px 0; background: linear-gradient(to top, var(--surface) 75%, transparent); padding: 14px 4px max(4px, env(safe-area-inset-bottom)); } .color-picker-actions > * { flex: 1; } .color-picker-readonly .color-sv-field, .color-picker-readonly .color-linear-track, .color-picker-readonly input { cursor: default; } .color-picker-readonly .color-track-handle { pointer-events: none; } .canvas-actions { margin-top: 12px; } .text-layout, .device-layout { display: grid; gap: 14px; } .text-form { display: grid; gap: 12px; } .text-form fieldset { display: grid; min-width: 0; gap: 12px; margin: 0; border: 0; padding: 0; } .text-form fieldset:disabled { opacity: 0.62; } .font-field { position: relative; display: grid; min-width: 0; gap: 7px; } .font-control-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 8px; align-items: start; } .font-combobox-shell { position: relative; min-width: 0; } .font-combobox-shell::after { content: "⌄"; position: absolute; top: 24px; right: 13px; z-index: 1; color: var(--muted); pointer-events: none; transform: translateY(-50%); } #text-font { padding-right: 34px; text-overflow: ellipsis; } #text-font.font-reference-missing { border-color: rgb(255 186 92 / 70%); color: #ffd59a; } #import-font { min-height: 48px; white-space: nowrap; } .font-options { position: absolute; top: calc(100% + 6px); right: 0; left: 0; z-index: 45; max-height: min(22rem, 55vh); overflow-y: auto; border: 1px solid var(--border); border-radius: 10px; background: #111923; box-shadow: 0 16px 34px rgb(0 0 0 / 45%); padding: 6px; } .font-option-group { position: sticky; top: -6px; z-index: 1; background: #111923; color: var(--muted); padding: 8px 10px 5px; font-size: 0.72rem; font-weight: 750; } .font-option { display: flex; min-height: 44px; align-items: center; justify-content: space-between; gap: 10px; border-radius: 8px; color: var(--text); cursor: pointer; padding: 8px 10px; } .font-option span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .font-option small { flex: 0 0 auto; color: var(--muted); } .font-option:hover, .font-option.active { background: rgb(53 194 160 / 16%); color: var(--accent-strong); } .font-option[aria-selected="true"] { box-shadow: inset 3px 0 0 var(--accent); } .font-options-empty { color: var(--muted); padding: 14px 10px; text-align: center; } .font-feedback { margin: 0; border-radius: 8px; background: rgb(53 194 160 / 9%); color: var(--accent-strong); padding: 8px 10px; font-size: 0.8rem; } .font-feedback[data-state="error"] { background: rgb(255 119 119 / 9%); color: var(--danger); } .text-element-actions { flex-wrap: wrap; align-items: stretch; margin-top: 14px; } .text-element-actions > * { flex: 1 1 9rem; } .text-element-list { display: grid; grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr)); gap: 8px; margin-top: 12px; } .text-element-list:empty::before { content: "还没有文字元素"; grid-column: 1 / -1; border: 1px dashed var(--border); border-radius: 10px; color: var(--muted); padding: 14px; text-align: center; } .text-element-item { overflow: hidden; text-align: left; text-overflow: ellipsis; white-space: nowrap; } .text-element-item.active { border-color: var(--accent); background: rgb(53 194 160 / 14%); color: var(--accent-strong); } .form-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .form-grid .color-field { grid-column: 1 / -1; margin-top: 0; } .setting-card { display: grid; gap: 16px; } .ota-version-details, .ota-version-details div { margin: 0; } .ota-version-details div, .ota-progress-heading, .ota-actions { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; } .ota-version-details dt { color: var(--muted); } .ota-version-details dd { margin: 0; font-variant-numeric: tabular-nums; } .ota-version-details { display: grid; gap: 8px; } .ota-power-warning { color: var(--text); } .ota-progress-group { display: grid; gap: 8px; } .ota-progress-group progress { width: 100%; height: 14px; accent-color: var(--accent); } .ota-failure-log-actions { display: flex; gap: 10px; flex-wrap: wrap; } .ota-failure-log-actions[hidden] { display: none; } .ota-failure-log-dialog { width: min(calc(100% - 28px), 64rem); max-width: 64rem; max-height: 88vh; } .ota-failure-log-dialog-body { display: grid; gap: 14px; min-width: 0; } .ota-failure-log-dialog pre { box-sizing: border-box; width: 100%; max-height: 60vh; margin: 0; padding: 14px; overflow: auto; border: 1px solid var(--border); border-radius: 10px; background: #0b1018; color: #e8edf5; font: 0.82rem/1.5 ui-monospace, SFMono-Regular, Consolas, "Liberation Mono", monospace; white-space: pre-wrap; overflow-wrap: anywhere; user-select: text; } .wifi-fields, .wifi-manual-fields { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; } .wifi-dhcp-row, .wifi-fields > .number-unit-field, .wifi-active-status { grid-column: 1 / -1; } .wifi-dhcp-row { display: flex; flex-wrap: wrap; min-width: 0; align-items: center; justify-content: space-between; gap: 16px; border: 1px solid var(--border); border-radius: 10px; background: var(--bg); padding: 12px; } .wifi-field-modified { border-color: #ffd166; box-shadow: 0 0 0 3px rgb(255 209 102 / 18%); } .wifi-modified-note { margin: 0; color: #ffd166; font-size: 0.78rem; font-weight: 750; } .wifi-dhcp-row .wifi-modified-note { flex: 1 0 100%; } .wifi-manual-fields { grid-column: 1 / -1; } .wifi-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; } .wifi-action-ready { border-color: var(--accent); background: var(--accent); color: var(--accent-ink); font-weight: 780; } .wifi-prompt-delay-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: end; gap: 10px; } .wifi-prompt-delay-row > button { min-width: 72px; } .number-unit-field { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 10px; } .number-unit-field span { color: var(--text); font-weight: 700; } .preview-refresh-warning { color: #ffcc66; font-size: 0.84rem; } .voltage-details { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; margin: 0; } .voltage-details > div { min-width: 0; border: 1px solid var(--border); border-radius: 10px; background: var(--bg); padding: 10px 12px; } .voltage-details dt { color: var(--muted); font-size: 0.82rem; } .voltage-details dd { margin: 4px 0 0; overflow-wrap: anywhere; font-weight: 700; } .voltage-actions, .voltage-calibration-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; } .voltage-calibration-actions { grid-template-columns: repeat(3, minmax(0, 1fr)); } .voltage-calibration-dialog { width: min(calc(100% - 28px), 34rem); } .voltage-calibration-dialog .voltage-details { grid-template-columns: repeat(2, minmax(0, 1fr)); } .low-voltage-protection-setting { display: flex; min-width: 0; align-items: center; justify-content: space-between; gap: 16px; border-top: 1px solid var(--border); padding-top: 16px; } .low-voltage-protection-copy { min-width: 0; } .low-voltage-protection-copy .hint { margin-top: 4px; } .switch-control { position: relative; display: inline-flex; flex: 0 0 auto; min-height: 48px; align-items: center; gap: 10px; border-radius: 12px; cursor: pointer; padding: 6px; user-select: none; } .switch-control input { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; } .switch-track { position: relative; width: 48px; height: 28px; flex: 0 0 auto; border: 1px solid var(--border); border-radius: 999px; background: var(--surface-strong); transition: background 150ms ease, border-color 150ms ease; } .switch-track::after { position: absolute; top: 3px; left: 3px; width: 20px; height: 20px; border-radius: 50%; background: var(--muted); content: ""; transition: background 150ms ease, transform 150ms ease; } .switch-control input:checked + .switch-track { border-color: var(--accent); background: rgb(53 194 160 / 28%); } .switch-control input:checked + .switch-track::after { background: var(--accent-strong); transform: translateX(20px); } .switch-control input:focus-visible + .switch-track { outline: 3px solid var(--focus); outline-offset: 2px; } .switch-control input:disabled + .switch-track, .switch-control input:disabled ~ .switch-state { opacity: 0.6; } .switch-state { min-width: 3.5rem; color: var(--text); font-weight: 720; text-align: center; } .low-voltage-protection-feedback, .brightness-protection-status { border: 1px solid rgb(255 190 92 / 48%); border-radius: 10px; background: rgb(255 190 92 / 9%); color: #ffd27f; padding: 10px 12px; overflow-wrap: anywhere; } .low-voltage-protection-feedback[data-state="success"] { border-color: rgb(53 194 160 / 45%); background: rgb(53 194 160 / 9%); color: var(--accent-strong); } .low-voltage-protection-feedback[data-state="error"], .brightness-protection-status[data-mode="critical"] { border-color: rgb(255 119 119 / 50%); background: rgb(255 119 119 / 9%); color: var(--danger); } .brightness-protection-status { margin-top: 10px; font-size: 0.86rem; } @media (max-width: 30rem) { .topbar-copy, .topbar-statuses, .current-content-indicator, .low-voltage-warning, .voltage-indicator { width: 100%; } .current-display-dialog-body { padding: 14px; } .current-display-playback-actions { grid-template-columns: 1fr; } .current-display-progress-heading { align-items: flex-start; flex-direction: column; gap: 4px; } .topbar-statuses { display: flex; } .workspace-heading { align-items: flex-start; flex-direction: column; } .workspace-heading-actions, .workspace-heading-actions > button { width: 100%; } .resource-indicator { flex: 1 1 calc(50% - 4px); min-width: 0; justify-content: center; font-size: 0.72rem; } .low-voltage-warning, .voltage-indicator { min-width: 0; } .voltage-details, .voltage-actions, .voltage-calibration-dialog .voltage-details, .voltage-calibration-actions { grid-template-columns: 1fr; } .wifi-fields, .wifi-manual-fields, .wifi-actions { grid-template-columns: 1fr; } .font-control-row { grid-template-columns: minmax(0, 1fr) auto; } #import-font { padding-inline: 10px; } .wifi-dhcp-row { align-items: stretch; flex-direction: column; } .low-voltage-protection-setting { align-items: stretch; flex-direction: column; } .switch-control { width: 100%; justify-content: space-between; } .resource-details-grid { grid-template-columns: 1fr; } } .orientation-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .refresh-rate-grid { grid-template-columns: repeat(auto-fit, minmax(76px, 1fr)); } .brightness-output { color: var(--accent-strong); font-size: 1.25rem; font-weight: 800; } .brightness-slider { min-height: 48px; padding-inline: 0; accent-color: var(--accent); } .settings-feedback { min-height: 48px; border: 1px solid var(--border); border-radius: 10px; background: var(--surface); color: var(--muted); padding: 13px 14px; } .settings-feedback[data-state="success"] { border-color: rgb(53 194 160 / 45%); color: var(--accent-strong); } .settings-feedback[data-state="error"] { border-color: rgb(255 119 119 / 50%); color: var(--danger); } .frp-status-details { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; margin: 14px 0 0; } .frp-status-details > div { border: 1px solid var(--border); border-radius: 10px; background: #0c1118; padding: 10px 12px; } .frp-status-details dt { color: var(--muted); font-size: 0.75rem; } .frp-status-details dd { margin: 4px 0 0; overflow-wrap: anywhere; } .frp-actions, .frp-config-secondary-actions { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; margin-top: 14px; } .frp-config-dialog { width: min(760px, calc(100% - 24px)); } .frp-config-dialog-body, .network-diagnostics-dialog-body { display: grid; gap: 12px; padding: 20px; } .frp-config-dialog textarea { min-height: 42vh; font-family: ui-monospace, "Cascadia Mono", "Noto Sans Mono", monospace; line-height: 1.5; tab-size: 2; } .network-diagnostics-dialog { width: min(560px, calc(100% - 24px)); } #network-diagnostics-summary[data-state="success"], #network-diagnostics-checks li[data-state="success"] { color: var(--accent-strong); } #network-diagnostics-summary[data-state="error"], #network-diagnostics-checks li[data-state="error"] { color: #ffb3b3; } #network-diagnostics-checks li[data-state="warning"] { color: #ffd58a; } @media (max-width: 560px) { .frp-actions, .frp-config-secondary-actions, .frp-status-details { grid-template-columns: 1fr; } } noscript { display: block; padding: 24px; color: var(--danger); } .media-upload-panel, .media-job-card { display: grid; gap: 14px; } .media-upload-panel progress { width: 100%; } .media-upload-panel .media-source-field { grid-column: 1 / -1; } .media-job-list { display: grid; gap: 16px; } .media-job-card { border: 1px solid var(--border); border-radius: 14px; background: var(--surface); padding: 16px; } .media-job-heading, .media-preview-tabs, .media-job-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px; } .media-job-heading h3, .media-job-heading p { margin: 0; } .media-crop-stage { position: relative; width: min(100%, 28rem); aspect-ratio: 1; overflow: hidden; border: 1px solid var(--border); border-radius: 12px; background-color: #000; touch-action: none; } .media-crop-source { position: absolute; inset: 0; } .media-crop-source img { width: 100%; height: 100%; object-fit: contain; display: block; pointer-events: none; user-select: none; } .media-crop-stage[data-fit="crop"] .media-crop-source img, .media-crop-stage[data-fit="contain"] .media-crop-source img { object-fit: fill; } .media-crop-stage[data-fit="stretch"] .media-crop-source img { object-fit: fill; } .media-settings-grid { display: grid; gap: 12px; grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr)); } .media-settings-grid label { display: grid; gap: 6px; } .media-preview-tabs { justify-content: flex-start; } .media-preview-tabs button[aria-pressed="true"] { border-color: var(--accent); } @media (min-width: 40rem) { .workspace-root { padding: 26px 24px 48px; } .device-storage-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); } .panel { padding: 20px; } .choice-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } .canvas-toolbar { grid-template-columns: repeat(2, minmax(0, 1fr)); } .orientation-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); } .color-picker-overlay { align-items: center; padding: 24px; } .color-picker-panel { width: min(36rem, 100%); max-height: calc(100dvh - 48px); border-radius: 20px; padding: 22px; } } @media (min-width: 60rem) { .topbar { padding-right: 28px; padding-left: calc(82px + env(safe-area-inset-left)); } .last-message { max-width: 60vw; } } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { scroll-behavior: auto !important; transition-duration: 0.01ms !important; } }