/* Wild Dragon MAM Panel — Dragonflight Design System v1.3.0 * CEP-compatible: all oklch() converted to hex/rgba via OKLab→sRGB math. * Source of truth: services/web-ui/tailwind.config.js (hue 266, blue) * Do not hand-edit hex values — regenerate from tailwind.config.js if tokens change. */ :root { /* Background scale */ --bg-deep: #010203; --bg-base: #030407; --bg-panel: #090b11; --bg-surface: #11141a; --bg-raised: #1c1f27; --bg-hover: #252930; /* Accent */ --accent: #2144c2; --accent-hover: #325bda; --accent-bright: #4d77ea; --accent-subtle: rgba(58, 100, 228, 0.12); --accent-border: rgba(58, 100, 228, 0.36); /* Text */ --text-primary: #e9ebf1; --text-secondary: #a0a5ae; --text-tertiary: #71747c; --text-disabled: #404248; /* Borders */ --border-faint: #181b21; --border: #252930; --border-strong: #3e424c; /* Signals (primary) */ --signal-good: #35bb58; --signal-bad: #f53c41; --signal-warn: #e6b816; --signal-idle: #777a82; --signal-info: #1e9cf0; /* Signal backgrounds */ --signal-good-bg: rgba(53, 187, 88, 0.12); --signal-bad-bg: rgba(245, 60, 65, 0.12); --signal-warn-bg: rgba(230, 184, 22, 0.12); --signal-info-bg: rgba(30, 156, 240, 0.12); /* Signal hover variants */ --signal-good-hover: #46c865; --signal-bad-hover: #ff4c4d; --signal-warn-hover: #f3c530; /* Status aliases — backwards compat for main.js */ --status-green: var(--signal-good); --status-red: var(--signal-bad); --status-blue: var(--signal-info); --status-yellow: var(--signal-warn); --status-gray: var(--signal-idle); --status-green-bg: var(--signal-good-bg); --status-red-bg: var(--signal-bad-bg); --status-blue-bg: var(--signal-info-bg); --status-yellow-bg: var(--signal-warn-bg); /* Spacing */ --sp-1: 4px; --sp-2: 8px; --sp-3: 12px; --sp-4: 16px; --sp-5: 20px; --sp-6: 24px; --sp-8: 32px; --sp-12: 48px; --sp-16: 64px; /* Typography */ --font: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; --font-mono: 'JetBrains Mono', ui-monospace, 'SF Mono', 'Consolas', 'Liberation Mono', monospace; --text-xs: 11px; --text-sm: 13px; --text-base: 14px; --text-md: 16px; /* Radii */ --r-sm: 4px; --r-md: 6px; --r-lg: 8px; /* Transitions (legacy) */ --t-fast: 150ms ease-out; --t-normal: 250ms ease-out; /* Motion */ --ease-out-quart: cubic-bezier(0.25, 1, 0.5, 1); --ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1); --dur-fast: 120ms; --dur-normal: 180ms; --dur-slide: 240ms; /* Elevation + surface extras */ --shadow: 0 4px 12px rgba(0, 0, 0, 0.3); --thumb-black: #000000; --overlay: rgba(1, 2, 3, 0.65); /* Z-index layers */ --z-dropdown: 40; --z-overlay: 80; --z-panel: 90; --z-toast: 200; } * { margin: 0; padding: 0; box-sizing: border-box; } html, body { width: 100%; height: 100%; font-family: var(--font); background: var(--bg-base); color: var(--text-primary); font-size: 12px; -webkit-font-smoothing: antialiased; } ::-webkit-scrollbar { width: 6px; height: 6px; } ::-webkit-scrollbar-track { background: var(--bg-deep); } ::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 3px; } ::-webkit-scrollbar-thumb:hover { background: var(--accent); } /* ================================================================ PANEL CONTAINER ================================================================ */ #panel-container { display: flex; flex-direction: column; width: 100%; height: 100%; } /* ================================================================ CONNECTION BAR ================================================================ */ .connection-bar { background: var(--bg-panel); border-bottom: 1px solid var(--border); padding: var(--sp-3); flex-shrink: 0; } .connection-controls { display: flex; gap: var(--sp-2); align-items: center; } .connection-controls--stacked { display: flex; flex-direction: column; gap: var(--sp-2); } .server-input-row { display: flex; align-items: center; gap: var(--sp-2); } .server-url { flex: 1; min-width: 0; height: 32px; padding: 0 10px; background: var(--bg-deep); border: 1px solid var(--border); border-radius: var(--r-sm); color: var(--text-primary); font-size: var(--text-xs); font-family: var(--font-mono); outline: none; transition: border-color var(--dur-fast) var(--ease-out-quart), box-shadow var(--dur-fast) var(--ease-out-quart); } .server-url:focus-visible { border-color: var(--accent-border); box-shadow: 0 0 0 2px var(--accent-subtle); } .server-url::placeholder { color: var(--text-tertiary); } .connect-btn { flex-shrink: 0; } .status-indicator { width: 8px; height: 8px; border-radius: 50%; background: var(--signal-bad); flex-shrink: 0; transition: background var(--dur-fast) var(--ease-out-quart), box-shadow var(--dur-fast) var(--ease-out-quart); } .status-indicator.connected { background: var(--signal-good); box-shadow: 0 0 6px var(--signal-good); } .status-indicator.connecting { background: var(--signal-warn); animation: pulse 1.5s ease-in-out infinite; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } /* ================================================================ BUTTONS (design system — mirrors wd-btn) ================================================================ */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; padding: 0 12px; height: 32px; font: 500 13px/1 var(--font); border: 1px solid transparent; border-radius: 4px; transition: background-color var(--dur-fast) var(--ease-out-quart), border-color var(--dur-fast) var(--ease-out-quart), color var(--dur-fast) var(--ease-out-quart); white-space: nowrap; flex-shrink: 0; cursor: pointer; user-select: none; } .btn:focus-visible { outline: 2px solid var(--accent-subtle); outline-offset: 1px; } .btn:active:not(:disabled) { opacity: 0.85; transition: opacity 60ms; } .btn-sm { height: 28px; padding: 0 10px; font-size: 12px; } .btn-lg { height: 36px; padding: 0 14px; font-size: 13px; } .btn-icon { width: 28px; height: 28px; padding: 0; } .btn-primary { background: var(--accent); color: #f5f7fb; border-color: var(--accent); } .btn-primary:hover:not(:disabled) { background: var(--accent-hover); border-color: var(--accent-hover); } .btn-secondary { background: var(--bg-surface); color: var(--text-primary); border-color: var(--border); } .btn-secondary:hover:not(:disabled) { background: var(--bg-hover); border-color: var(--border-strong); } .btn-ghost { background: transparent; color: var(--text-secondary); border-color: transparent; } .btn-ghost:hover:not(:disabled) { background: var(--bg-hover); color: var(--text-primary); } .btn-danger { background: var(--signal-bad); color: #fbf6f6; border-color: var(--signal-bad); } .btn-danger:hover:not(:disabled) { background: var(--signal-bad-hover); border-color: var(--signal-bad-hover); } .btn:disabled { opacity: 0.4; cursor: not-allowed; pointer-events: none; } /* Legacy button compatibility */ button { cursor: pointer; font-family: var(--font); } button:disabled { opacity: 0.4; cursor: not-allowed; pointer-events: none; } button.secondary { background: var(--bg-surface); color: var(--text-primary); border: 1px solid var(--border); border-radius: 4px; padding: 0 10px; height: 32px; font: 500 13px/1 var(--font); display: inline-flex; align-items: center; justify-content: center; transition: background-color var(--dur-fast) var(--ease-out-quart), border-color var(--dur-fast) var(--ease-out-quart); } button.secondary:hover:not(:disabled) { background: var(--bg-hover); border-color: var(--border-strong); } /* ================================================================ SEARCH & FILTER ================================================================ */ .search-filter-area { background: var(--bg-panel); border-bottom: 1px solid var(--border); padding: var(--sp-3); flex-shrink: 0; } .search-bar { display: flex; gap: var(--sp-2); margin-bottom: var(--sp-2); } .search-input { flex: 1; height: 32px; padding: 0 10px; background: var(--bg-deep); border: 1px solid var(--border); border-radius: 4px; color: var(--text-primary); font: 400 13px/1 var(--font); outline: none; transition: border-color var(--dur-fast) var(--ease-out-quart); } .search-input:focus-visible { border-color: var(--accent-border); outline: 2px solid var(--accent-subtle); outline-offset: 1px; } .search-input::placeholder { color: var(--text-tertiary); } .filter-controls { display: flex; gap: var(--sp-2); } select { flex: 1; height: 32px; padding: 0 24px 0 10px; background: var(--bg-deep); border: 1px solid var(--border); border-radius: 4px; color: var(--text-primary); font: 400 13px/1 var(--font); appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24'%3E%3Cpath fill='%23667788' d='m7 10 5 5 5-5z'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 6px center; cursor: pointer; outline: none; transition: border-color var(--dur-fast) var(--ease-out-quart); } select:focus-visible { border-color: var(--accent-border); outline: 2px solid var(--accent-subtle); outline-offset: 1px; } select option { background: var(--bg-surface); color: var(--text-primary); } /* ================================================================ CHIP / BADGE (mirrors wd-badge) ================================================================ */ .chip { display: inline-flex; align-items: center; gap: 4px; padding: 0 6px; height: 18px; border-radius: 3px; font: 600 10px/1 var(--font); letter-spacing: 0.08em; text-transform: uppercase; background: var(--bg-surface); color: var(--text-tertiary); white-space: nowrap; } .chip-dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; flex-shrink: 0; } .chip--good { color: var(--signal-good); background: var(--signal-good-bg); } .chip--warn { color: var(--signal-warn); background: var(--signal-warn-bg); } .chip--bad { color: var(--signal-bad); background: var(--signal-bad-bg); } .chip--idle { color: var(--text-tertiary); background: var(--bg-surface); } .chip--rec { color: var(--accent); background: var(--accent-subtle); } .chip--info { color: var(--accent); background: var(--accent-subtle); } /* ================================================================ SEQUENCE INFO BAR ================================================================ */ .seq-info-bar { background: var(--bg-surface); border-bottom: 1px solid var(--border); padding: var(--sp-1) var(--sp-3); flex-shrink: 0; display: flex; align-items: center; gap: var(--sp-2); min-height: 28px; } .seq-info-bar.hidden { display: none; } .seq-info-label { flex-shrink: 0; } .seq-info-name { font: 500 11px/1 var(--font); color: var(--text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; } .seq-refresh-btn { flex-shrink: 0; font-size: 13px; line-height: 1; } /* ================================================================ TAB NAVIGATION ================================================================ */ .tab-nav { display: flex; background: var(--bg-panel); border-bottom: 1px solid var(--border); flex-shrink: 0; } .tab-btn { flex: 1; height: 36px; background: transparent; border: none; border-bottom: 2px solid transparent; color: var(--text-secondary); font: 600 11px/1 var(--font); letter-spacing: 0.02em; display: inline-flex; align-items: center; justify-content: center; gap: var(--sp-2); cursor: pointer; transition: background-color var(--dur-fast) var(--ease-out-quart), color var(--dur-fast) var(--ease-out-quart); } .tab-btn:hover { color: var(--text-primary); background: var(--bg-hover); } .tab-btn.active { color: var(--accent); border-bottom-color: var(--accent); background: var(--bg-surface); } .tab-btn .badge { background: var(--bg-raised); color: var(--text-secondary); font: normal 10px/1 var(--font); padding: 1px 6px; border-radius: 10px; } .tab-btn.active .badge { background: var(--accent-subtle); color: var(--accent); } /* ================================================================ MAIN CONTENT AREA ================================================================ */ .content-area { display: flex; flex: 1; gap: 0; min-height: 0; } .asset-grid-container { flex: 1; display: flex; flex-direction: column; min-width: 0; border-right: 1px solid var(--border); } /* ================================================================ ASSET GRID (mirrors wd-card-asset-grid) ================================================================ */ .asset-grid { flex: 1; overflow-y: auto; padding: var(--sp-3); display: grid; grid-template-columns: repeat(auto-fill, minmax(110px, 1fr)); gap: var(--sp-3); } .asset-card { background: var(--bg-panel); border: 1px solid var(--border-faint); border-radius: 6px; overflow: hidden; cursor: pointer; transition: border-color var(--dur-fast) var(--ease-out-quart); display: flex; flex-direction: column; } .asset-card:hover { border-color: var(--border); } .asset-card:hover .asset-thumbnail img { filter: brightness(1.04); } .asset-card.selected { border-color: var(--accent); background: var(--bg-raised); } .asset-thumbnail { width: 100%; aspect-ratio: 16 / 9; background: var(--thumb-black); display: flex; align-items: center; justify-content: center; font-size: 10px; color: var(--text-tertiary); overflow: hidden; flex-shrink: 0; } .asset-thumbnail img { width: 100%; height: 100%; object-fit: cover; display: block; transition: filter var(--dur-fast) var(--ease-out-quart); } .asset-info { padding: 8px; display: flex; flex-direction: column; gap: 3px; flex: 1; min-height: 0; } .asset-filename { font: 500 12px/1.3 var(--font); color: var(--text-primary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .asset-meta { display: flex; gap: var(--sp-1); font: 400 11px/1.3 var(--font-mono); color: var(--text-tertiary); font-variant-numeric: tabular-nums; } .asset-status-badge { display: inline-flex; align-items: center; height: 18px; padding: 0 6px; border-radius: 3px; font: 600 10px/1 var(--font); letter-spacing: 0.08em; text-transform: uppercase; width: fit-content; } .status-badge.ready { background: var(--signal-good-bg); color: var(--signal-good); } .status-badge.live, .status-badge.recording { background: var(--signal-bad-bg); color: var(--signal-bad); font-weight: bold; } .status-badge.ingesting, .status-badge.promoting, .status-badge.processing { background: var(--signal-info-bg); color: var(--signal-info); animation: pulse 1.5s ease-in-out infinite; } .status-badge.idle { background: var(--signal-warn-bg); color: var(--signal-warn); } .status-badge.error { background: var(--signal-bad-bg); color: var(--signal-bad); } /* ================================================================ EMPTY STATE ================================================================ */ .empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: var(--sp-12) var(--sp-8); text-align: center; gap: var(--sp-3); } .empty-state-icon { color: var(--text-tertiary); margin-bottom: var(--sp-2); } .empty-state-icon svg { width: 36px; height: 36px; } .empty-state-title { font: 600 13px/1.4 var(--font); color: var(--text-secondary); } .empty-state-body { font-size: var(--text-xs); color: var(--text-tertiary); max-width: 30ch; line-height: 1.6; } /* ================================================================ DETAILS PANEL ================================================================ */ .details-panel { width: 190px; background: var(--bg-panel); border-left: 1px solid var(--border); padding: var(--sp-3); display: flex; flex-direction: column; gap: var(--sp-3); overflow-y: auto; } .details-panel.hidden { display: none; } .details-header { margin-bottom: var(--sp-1); } .details-header-label { font: 600 11px/1 var(--font); text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-tertiary); } .details-section { display: flex; flex-direction: column; gap: 3px; } .details-label { font: 600 10px/1 var(--font); text-transform: uppercase; color: var(--text-tertiary); letter-spacing: 0.08em; } .details-value { font-size: var(--text-xs); color: var(--text-primary); word-break: break-word; } .tags-list { display: flex; flex-wrap: wrap; gap: var(--sp-1); } .tag { display: inline-block; background: var(--bg-surface); border: 1px solid var(--border-faint); color: var(--text-secondary); padding: 2px 6px; border-radius: 100px; font-size: 9px; font-family: var(--font-mono); } .divider { height: 1px; background: var(--border); border: none; } /* ================================================================ PROGRESS INDICATOR ================================================================ */ .progress-container { padding: var(--sp-2) var(--sp-3); background: var(--bg-panel); border-bottom: 1px solid var(--border); display: none; } .progress-container.visible { display: block; } .progress-label { font-size: var(--text-xs); margin-bottom: var(--sp-1); color: var(--text-secondary); font-family: var(--font-mono); font-variant-numeric: tabular-nums; } .progress-bar { width: 100%; height: 3px; background: var(--bg-hover); border-radius: 2px; overflow: hidden; } .progress-fill { height: 100%; background: var(--accent); width: 0%; transition: width var(--dur-slide) var(--ease-out-quart); } /* ================================================================ EXPORT PANEL (Push Timeline to MAM) ================================================================ */ .export-panel { background: var(--bg-panel); border-top: 1px solid var(--border); padding: var(--sp-3); flex-shrink: 0; } .export-panel.hidden { display: none; } .export-panel-title { font: 600 11px/1 var(--font); text-transform: uppercase; letter-spacing: 0.08em; color: var(--accent); margin-bottom: var(--sp-3); } .export-panel input[type="text"], .export-panel .input { width: 100%; height: 32px; padding: 0 10px; background: var(--bg-deep); border: 1px solid var(--border); border-radius: 4px; color: var(--text-primary); font: 400 13px/1 var(--font); margin-bottom: var(--sp-2); outline: none; transition: border-color var(--dur-fast) var(--ease-out-quart); } .export-panel input[type="text"]:focus-visible, .export-panel .input:focus-visible { border-color: var(--accent-border); outline: 2px solid var(--accent-subtle); outline-offset: 1px; } .export-panel select { width: 100%; margin-bottom: var(--sp-3); flex: none; } .export-clip-info { font-size: var(--text-xs); color: var(--text-secondary); margin-bottom: var(--sp-2); font-family: var(--font-mono); } .export-panel-actions { display: flex; gap: var(--sp-2); } .export-panel-actions .btn { flex: 1; } /* ================================================================ ADVANCED SECTION ================================================================ */ .advanced-section { background: var(--bg-panel); border-bottom: 1px solid var(--border); padding: var(--sp-2) var(--sp-3); flex-shrink: 0; } .advanced-section-title { font: 600 10px/1 var(--font); text-transform: uppercase; letter-spacing: 0.1em; color: var(--text-tertiary); margin-bottom: var(--sp-2); } .advanced-row { display: flex; gap: var(--sp-2); } .advanced-row .btn { flex: 1; } /* ================================================================ ACTION BAR ================================================================ */ .action-bar { background: var(--bg-deep); border-top: 1px solid var(--border); padding: var(--sp-2) var(--sp-3); flex-shrink: 0; display: flex; flex-direction: column; gap: var(--sp-2); } .action-row { display: flex; gap: var(--sp-2); } .action-row .btn { flex: 1; } /* ================================================================ SLIDE PANEL (mirrors wd-slide-panel) ================================================================ */ .slide-overlay { position: fixed; inset: 0; background: var(--overlay); z-index: var(--z-overlay); opacity: 0; pointer-events: none; transition: opacity var(--dur-slide) var(--ease-out-quart); } .slide-overlay.open { opacity: 1; pointer-events: all; } .slide-panel { position: fixed; top: 0; right: 0; bottom: 0; width: 460px; background: var(--bg-panel); border-left: 1px solid var(--border); z-index: var(--z-panel); display: flex; flex-direction: column; overflow: hidden; transform: translateX(100%); transition: transform var(--dur-slide) var(--ease-out-expo); } .slide-panel.open { transform: translateX(0); } .slide-panel-header { display: flex; align-items: center; justify-content: space-between; padding: 0 18px; height: 52px; border-bottom: 1px solid var(--border-faint); flex-shrink: 0; } .slide-panel-title { font: 600 14px/1 var(--font); letter-spacing: -0.005em; color: var(--text-primary); } .slide-panel-body { flex: 1; min-height: 0; overflow-y: auto; padding: 18px; display: flex; flex-direction: column; gap: 16px; } .slide-panel-footer { padding: 14px 18px; background: var(--bg-deep); border-top: 1px solid var(--border-faint); display: flex; justify-content: flex-end; gap: var(--sp-2); flex-shrink: 0; } /* ================================================================ PRESET CARDS (for FCP Conform) ================================================================ */ .preset-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-2); } .preset-card { padding: var(--sp-2) var(--sp-3); background: var(--bg-surface); border: 1px solid var(--border); border-radius: 6px; cursor: pointer; transition: border-color var(--dur-fast) var(--ease-out-quart), background var(--dur-fast) var(--ease-out-quart); } .preset-card:hover { border-color: var(--border-strong); background: var(--bg-raised); } .preset-card.selected { border-color: var(--accent); background: var(--accent-subtle); } .preset-card-title { font: 600 12px/1 var(--font); color: var(--text-primary); margin-bottom: 4px; } .preset-card-desc { font: 400 10px/1.4 var(--font-mono); color: var(--text-tertiary); } /* ================================================================ CLIP LIST (for Hi-Res Relink — mirrors wd-list-row) ================================================================ */ .clip-list-container { flex: 1; min-height: 0; overflow-y: auto; border: 1px solid var(--border); border-radius: 6px; background: var(--bg-base); } .clip-list { display: flex; flex-direction: column; } .clip-list-item { display: flex; align-items: center; gap: var(--sp-2); padding: var(--sp-2) var(--sp-3); border-bottom: 1px solid var(--border-faint); transition: background-color var(--dur-fast) var(--ease-out-quart); } .clip-list-item:last-child { border-bottom: none; } .clip-list-item:hover { background: var(--bg-hover); } .clip-list-item-checkbox { width: 14px; height: 14px; accent-color: var(--accent); flex-shrink: 0; cursor: pointer; } .clip-list-item-info { flex: 1; min-width: 0; } .clip-list-item-name { font: 500 12px/1 var(--font); color: var(--text-primary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .clip-list-item-meta { font: 400 11px/1.3 var(--font-mono); color: var(--text-tertiary); } .clip-list-item-status { flex-shrink: 0; font: 600 10px/1 var(--font); letter-spacing: 0.06em; text-transform: uppercase; } .clip-list-item-status.matched { color: var(--signal-good); } .clip-list-item-status.unmatched { color: var(--text-disabled); } /* ================================================================ RELINK SUMMARY ================================================================ */ .relink-summary { display: flex; flex-direction: column; align-items: center; gap: var(--sp-2); padding: var(--sp-4); text-align: center; } .relink-summary.hidden { display: none; } .relink-summary-icon { color: var(--signal-good); } .relink-summary-text { font: 500 13px/1 var(--font); color: var(--text-primary); } .relink-summary-detail { font-size: var(--text-xs); color: var(--text-secondary); font-family: var(--font-mono); } /* ================================================================ MESSAGE BANNERS ================================================================ */ .error-message { background: var(--signal-bad-bg); border: 1px solid rgba(245, 60, 65, 0.25); color: var(--signal-bad); padding: var(--sp-2) var(--sp-3); border-radius: 4px; font-size: var(--text-xs); line-height: 1.5; margin-bottom: var(--sp-2); } .success-message { background: var(--signal-good-bg); border: 1px solid rgba(53, 187, 88, 0.25); color: var(--signal-good); padding: var(--sp-2) var(--sp-3); border-radius: 4px; font-size: var(--text-xs); line-height: 1.5; margin-bottom: var(--sp-2); } .info-message { background: var(--accent-subtle); border: 1px solid var(--accent-border); color: var(--accent); padding: var(--sp-2) var(--sp-3); border-radius: 4px; font-size: var(--text-xs); line-height: 1.5; margin-bottom: var(--sp-2); } /* ================================================================ FORM GROUP (mirrors wd-form-group + wd-label) ================================================================ */ .form-group { display: flex; flex-direction: column; gap: var(--sp-1); } .form-label { font: 600 11px/1 var(--font); letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-tertiary); margin-bottom: 4px; } .form-hint { font: 400 11px/1.5 var(--font); color: var(--text-tertiary); } /* ================================================================ UTILITY ================================================================ */ .hidden { display: none !important; } .loading { opacity: 0.6; pointer-events: none; } .truncate { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .truncate-lines-2 { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } .spinner { display: inline-block; width: 12px; height: 12px; border: 2px solid var(--border); border-top-color: var(--accent); border-radius: 50%; animation: spin 0.8s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* ================================================================ RESPONSIVE ================================================================ */ @media (max-width: 500px) { .asset-grid { grid-template-columns: repeat(auto-fill, minmax(90px, 1fr)); gap: var(--sp-2); padding: var(--sp-2); } .details-panel { width: 140px; padding: var(--sp-2); } .slide-panel { width: 100%; } } /* ================================================================ CONNECTED BAR ================================================================ */ .connected-bar { background: var(--bg-panel); border-bottom: 1px solid var(--border); padding: 0 var(--sp-3); height: 36px; flex-shrink: 0; display: flex; align-items: center; justify-content: space-between; } .connected-bar-status { display: flex; align-items: center; gap: var(--sp-2); } .connected-host { font: 500 12px/1 var(--font-mono); color: var(--text-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 180px; } /* ================================================================ SKELETON SHIMMER ================================================================ */ @keyframes wd-shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } } .skeleton { background: linear-gradient( 90deg, var(--bg-surface) 0%, var(--bg-hover) 50%, var(--bg-surface) 100% ); background-size: 200% 100%; animation: wd-shimmer 1.8s ease-in-out infinite; border-radius: 3px; } /* ================================================================ REDUCED MOTION ================================================================ */ @media (prefers-reduced-motion: reduce) { .skeleton, .status-indicator.connecting { animation: none; } *, *::before, *::after { transition-duration: 0ms !important; animation-duration: 0ms !important; } }