Spaces:
Running
Running
| @layer theme, base, components, utilities; | |
| @import "tailwindcss/theme.css" layer(theme); | |
| @import "tailwindcss/utilities.css" layer(utilities); | |
| /* ββ Map design tokens β Tailwind v4 theme ββββββββββββββββββββββββββββ */ | |
| @theme { | |
| /* Colors β semantic */ | |
| --color-fg: #ebdbb2; | |
| --color-fg-muted: #a89984; | |
| --color-fg-subtle: #7c6f64; | |
| --color-fg-inverse: #1d2021; | |
| --color-bg: #1d2021; | |
| --color-bg-elev-1: rgba(50, 48, 47, 0.85); | |
| --color-bg-elev-2: rgba(0, 0, 0, 0.30); | |
| --color-bg-elev-3: rgba(0, 0, 0, 0.18); | |
| --color-border: rgba(255, 255, 255, 0.07); | |
| --color-border-strong: rgba(255, 255, 255, 0.15); | |
| --color-border-warm: rgba(243, 165, 182, 0.08); | |
| --color-brand: #d3869b; | |
| --color-brand-hover: #b16286; | |
| --color-brand-glow: rgba(211, 134, 155, 0.4); | |
| --color-accent: #fabd2f; | |
| --color-success: #8ec07c; | |
| --color-warn: #fe8019; | |
| --color-danger: #fb4934; | |
| --color-info: #83a598; | |
| --color-chrome-bg: #0f1011; | |
| --color-chrome-fg: #d5c4a1; | |
| /* Radius */ | |
| --radius-xs: 2px; | |
| --radius-sm: 3px; | |
| --radius-md: 4px; | |
| --radius-lg: 6px; | |
| --radius-xl: 10px; | |
| /* Fonts */ | |
| --font-sans: 'Inter Variable', 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; | |
| --font-mono: 'IBM Plex Mono', ui-monospace, 'SF Mono', Menlo, monospace; | |
| --font-serif: 'Source Serif 4 Variable', 'Source Serif 4', Georgia, serif; | |
| } | |
| /* Font imports removed β the chrome token system uses only system monospace | |
| (ui-monospace, SFMono-Regular, Menlo, Consolas). Fraunces / Nunito / Outfit | |
| / Inter are no longer referenced by any rule. */ | |
| :root { | |
| --primary: #d3869b; | |
| --primary-hover: #b16286; | |
| --accent: #fabd2f; | |
| --bg: #1d2021; | |
| --glass-bg: rgba(50, 48, 47, 0.85); | |
| --glass-border: rgba(235, 219, 178, 0.08); | |
| --glass-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.4); | |
| --blur: blur(16px) saturate(140%); | |
| --text-primary: #ebdbb2; | |
| --text-secondary: #a89984; | |
| --radius: 6px; | |
| --gap: 6px; | |
| --transition-fast: 0.12s ease; | |
| --transition-smooth: 0.2s cubic-bezier(0.4, 0, 0.2, 1); | |
| /* ββ Chrome tokens ββ | |
| Introduced with the LogsFooter status bar. Surfaces that want the | |
| same tight dark-chrome look reference these (Header topbar now, | |
| future: Sidebar edges, Settings tab bar, NavRail). Keeping values | |
| in one place means style tweaks flow everywhere in sync. */ | |
| --chrome-bg: #0f1011; | |
| --chrome-border: rgba(255, 255, 255, 0.08); | |
| --chrome-border-strong: rgba(255, 255, 255, 0.12); | |
| --chrome-fg: #d5c4a1; | |
| --chrome-fg-muted: #a89984; | |
| --chrome-fg-dim: #7c6f64; | |
| --chrome-accent: #f3a5b6; | |
| --chrome-accent-bg: rgba(243, 165, 182, 0.12); | |
| --chrome-accent-border: rgba(243, 165, 182, 0.35); | |
| --chrome-severity-err: #fb4934; | |
| --chrome-severity-warn: #fabd2f; | |
| --chrome-severity-ok: #8ec07c; | |
| --chrome-radius-pill: 3px; | |
| --chrome-hover-bg: rgba(255, 255, 255, 0.04); | |
| /* Chrome-label face is IBM Plex Mono now β defined in ui/tokens.css as | |
| --font-mono. Keep this alias so existing `var(--chrome-font-mono)` rules | |
| don't need to change; it just picks up the new face automatically. */ | |
| --chrome-font-mono: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace); | |
| --chrome-label-size: 11px; | |
| --chrome-label-track: 0.06em; | |
| --chrome-bar-h: 28px; | |
| --chrome-pill-h: 20px; | |
| --chrome-icon-btn: 22px; | |
| } | |
| /* βββ ANIMATIONS βββ */ | |
| @keyframes mesh { | |
| 0% { background-position: 0% 50%; } | |
| 50% { background-position: 100% 50%; } | |
| 100% { background-position: 0% 50%; } | |
| } | |
| @keyframes spin { to { transform: rotate(360deg); } } | |
| @keyframes pulse { 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(251,73,52,0.4); } 50% { opacity: 0.85; box-shadow: 0 0 12px 4px rgba(251,73,52,0.3); } } | |
| @keyframes fadeIn { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: translateY(0); } } | |
| @keyframes shimmer { | |
| 0% { background-position: -200% 0; } | |
| 100% { background-position: 200% 0; } | |
| } | |
| /* βββ FOUNDATION βββ */ | |
| *, *::before, *::after { box-sizing: border-box; } | |
| ::selection { | |
| background: color-mix(in srgb, var(--chrome-accent) 35%, transparent); | |
| color: #fff; | |
| } | |
| /* Root rendering β applies to everything unless overridden. */ | |
| html { | |
| font-optical-sizing: auto; | |
| text-rendering: optimizeLegibility; | |
| -webkit-font-smoothing: antialiased; | |
| -moz-osx-font-smoothing: grayscale; | |
| font-synthesis: none; | |
| /* Inter OT flags that nudge it toward SΓΆhne: | |
| cv11 β single-story `a` | |
| ss01 β alt digits (straight 4, balanced 6/9) | |
| ss03 β alt `l` with serif-foot (legibility win at 10β12 px) */ | |
| font-feature-settings: "cv11", "ss01", "ss03"; | |
| /* Make sure kerning is on β some WebKit builds leave it off by default. */ | |
| font-kerning: normal; | |
| } | |
| body { | |
| margin: 0; padding: 0; | |
| background-color: var(--chrome-bg); | |
| color: var(--chrome-fg); | |
| font-family: var(--font-sans); | |
| font-size: 13px; /* was 12px β +1 to give Inter room to breathe */ | |
| line-height: 1.5; | |
| overflow-x: hidden; | |
| min-height: 100vh; | |
| } | |
| /* Default headings β sans, tight leading. Overrides live per page. */ | |
| h1, h2, h3, h4 { | |
| font-family: var(--font-sans); | |
| margin: 0; | |
| letter-spacing: -0.005em; | |
| } | |
| /* Tabular numbers + slashed zero wherever columns of digits need to line up. | |
| Anything already on `--font-mono` inherits mono + these features. */ | |
| .segment-time, | |
| .segment-table code, | |
| .ui-table-toolbar__meta, | |
| .hq-stats, | |
| .dub-gen-overlay__stats, | |
| .dub-trans-overlay__stats, | |
| .logs-footer__count, | |
| [data-tabular] { | |
| font-variant-numeric: tabular-nums slashed-zero; | |
| } | |
| /* Mono rule of thumb β IBM Plex Mono ships with slashed zero in its `zero` | |
| OT feature, tabular by default. Make both explicit so a browser that | |
| ignores the feature-settings still gets it. */ | |
| code, | |
| kbd, | |
| pre, | |
| samp, | |
| [class*="chrome-font-mono"], | |
| [style*="chrome-font-mono"] { | |
| font-variant-numeric: tabular-nums slashed-zero; | |
| font-feature-settings: "zero", "ss02"; | |
| } | |
| #root { | |
| display: flex; | |
| justify-content: center; | |
| padding: 0; | |
| width: 100%; | |
| min-height: 100vh; | |
| height: 100vh; | |
| } | |
| /* βββ LAYOUT βββ */ | |
| .app-container { | |
| width: 100%; | |
| max-width: 100vw; | |
| display: grid; | |
| /* [rail 48px] [sidebar 180β220] [main 1fr] */ | |
| grid-template-columns: 48px minmax(180px, 220px) minmax(0, 4fr); | |
| grid-template-rows: auto 1fr; | |
| gap: 0px; | |
| /* Shrink the studio grid by the LogsFooter's current height so its | |
| sidebar + main column always stop exactly at the footer's top edge. | |
| The footer itself (position:fixed) writes `--logs-footer-height` on | |
| :root whenever it toggles collapsed/expanded or the user resizes. */ | |
| height: calc(100% - var(--logs-footer-height, 28px)); | |
| overflow: hidden; | |
| transition: grid-template-columns var(--transition-smooth); | |
| } | |
| .app-container.sidebar-collapsed { | |
| grid-template-columns: 48px 46px minmax(0, 4fr); | |
| } | |
| .app-container.sidebar-hidden { | |
| grid-template-columns: 48px minmax(0, 1fr); | |
| } | |
| .app-container.sidebar-hidden > .history-panel { | |
| display: none; | |
| } | |
| .app-container.sidebar-hidden > .main-content { | |
| grid-column: 2; /* rail col1, main col2 */ | |
| } | |
| /* Rail on right side */ | |
| .app-container.rail-right { | |
| grid-template-columns: minmax(180px, 220px) minmax(0, 4fr) 48px; | |
| } | |
| .app-container.rail-right.sidebar-collapsed { | |
| grid-template-columns: 46px minmax(0, 4fr) 48px; | |
| } | |
| .app-container.rail-right.sidebar-hidden { | |
| grid-template-columns: minmax(0, 1fr) 48px; | |
| } | |
| .app-container.rail-right > .nav-rail { grid-column: 3; } | |
| .app-container.rail-right > .history-panel { grid-column: 1; } | |
| .app-container.rail-right > .main-content { grid-column: 2; } | |
| .app-container.rail-right.sidebar-hidden > .main-content { grid-column: 1; } | |
| .app-container > .nav-rail { | |
| grid-column: 1; | |
| grid-row: 2; | |
| } | |
| .app-container > .history-panel { | |
| grid-column: 2; | |
| grid-row: 2; | |
| } | |
| .app-container > .main-content { | |
| display: flex; | |
| flex-direction: column; | |
| overflow-y: auto; | |
| min-height: 0; | |
| grid-column: 3; | |
| grid-row: 2; | |
| /* Flat chrome β the shared warm radial + paper grain wash was the | |
| root cause of the "too warm" feel across Clone / Design / Dub / | |
| Settings. Every tab now sits on the same neutral chrome bg. */ | |
| background: var(--chrome-bg); | |
| position: relative; | |
| } | |
| .app-container > .main-content::before { display: none; } | |
| .app-container > .main-content > * { position: relative; z-index: 1; } | |
| .app-container > div { min-width: 0; } | |
| /* β€1100: auto-collapse sidebar, keep nav + main */ | |
| @media (max-width: 1100px) { | |
| .app-container { grid-template-columns: 48px minmax(0, 1fr) ; } | |
| .app-container > .history-panel { display: none ; } | |
| .app-container > .main-content { grid-column: 2 ; } | |
| .app-container.rail-right { grid-template-columns: minmax(0, 1fr) 48px ; } | |
| .app-container.rail-right > .main-content { grid-column: 1 ; } | |
| } | |
| /* β€600: hide nav rail too, full-width main */ | |
| @media (max-width: 600px) { | |
| .app-container { grid-template-columns: minmax(0, 1fr) ; } | |
| .app-container > .nav-rail { display: none; } | |
| .app-container > .main-content { grid-column: 1 ; } | |
| } | |
| /* βββ PANELS β flat chrome βββ */ | |
| .glass-panel { | |
| background: var(--chrome-bg); | |
| backdrop-filter: none; | |
| -webkit-backdrop-filter: none; | |
| border: 1px solid var(--chrome-border); | |
| border-radius: 0; | |
| padding: 12px; | |
| position: relative; | |
| overflow: hidden; | |
| margin-bottom: 0; | |
| } | |
| .glass-panel::before { | |
| content: ""; | |
| position: absolute; | |
| top: 0; left: 0; right: 0; | |
| height: 1px; | |
| background: linear-gradient(90deg, rgba(255,255,255,0), rgba(255,255,255,0.08) 30%, rgba(255,255,255,0.12) 50%, rgba(255,255,255,0.08) 70%, rgba(255,255,255,0)); | |
| pointer-events: none; | |
| } | |
| /* βββ HEADER β warm + cute βββ */ | |
| .header-area { | |
| display: grid; | |
| grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); | |
| align-items: center; | |
| gap: 12px; | |
| margin-bottom: 0; | |
| flex-shrink: 0; | |
| /* Matches the LogsFooter's chrome: flat bg, hairline bottom border, | |
| no radial glow, no blur, no decorative SVG ribbon. The pulsing | |
| accent dot + italic logo still carry the brand. */ | |
| padding: 6px 16px 6px 64px; | |
| background: var(--chrome-bg); | |
| border-bottom: 1px solid var(--chrome-border); | |
| user-select: none; | |
| position: relative; | |
| z-index: 100; | |
| grid-column: 1 / -1; | |
| grid-row: 1; | |
| cursor: default; | |
| padding-right: 8px; | |
| } | |
| /* ββ Header columns ββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .hq-col-left { | |
| display: flex; align-items: center; gap: 14px; | |
| justify-self: start; min-width: 0; | |
| } | |
| .hq-col-left__spacer { min-width: 80px; flex-shrink: 0; } | |
| .hq-col-center { | |
| display: flex; align-items: center; gap: 8px; | |
| justify-self: center; | |
| pointer-events: none; | |
| white-space: nowrap; | |
| } | |
| .hq-col-right { | |
| display: flex; align-items: center; justify-content: flex-end; | |
| gap: 12px; justify-self: end; | |
| min-width: 0; overflow: visible; | |
| } | |
| /* Logo */ | |
| .hq-logo-mark { transform: none; } | |
| .hq-logo-word { | |
| font-size: 0.92rem; font-weight: 600; color: var(--chrome-fg); | |
| letter-spacing: 0.02em; | |
| font-family: var(--font-sans); | |
| font-style: normal; | |
| } | |
| .hq-logo-word__accent { color: var(--chrome-accent); } | |
| /* Breadcrumb chevron spacing + inline-icon spacing */ | |
| .hq-breadcrumb-sep { margin: 0 2px; } | |
| .hq-view-icon { margin-right: 4px; vertical-align: -1px; } | |
| /* Stats readout β informational, not a button. No outer pill/shell; | |
| the thin vertical dividers between groups do the visual grouping. */ | |
| .hq-stats { | |
| display: flex; | |
| gap: 10px; | |
| font-family: var(--chrome-font-mono); | |
| font-size: 10.5px; | |
| color: var(--chrome-fg-dim); | |
| background: transparent; | |
| height: var(--chrome-pill-h); | |
| padding: 0; | |
| border: none; | |
| white-space: nowrap; | |
| flex-shrink: 1; | |
| align-items: center; | |
| overflow: hidden; | |
| } | |
| .hq-stats__key { color: var(--chrome-fg-muted); font-weight: 600; } | |
| .hq-stats__key--gpu-active { color: var(--chrome-severity-ok); } | |
| .hq-stats__sep { | |
| border-left: 1px solid var(--chrome-border); | |
| padding-left: 6px; | |
| } | |
| .hq-stats__status-wrap { | |
| border-left: 1px solid var(--chrome-border); | |
| padding-left: 6px; | |
| display: flex; | |
| align-items: center; | |
| gap: 4px; | |
| } | |
| .hq-stats__status-badge { | |
| border: none ; | |
| background: transparent ; | |
| padding: 0 ; | |
| text-transform: none ; | |
| letter-spacing: 0 ; | |
| font-weight: 600 ; | |
| } | |
| .hq-flush-btn { margin-left: 2px; } | |
| .hq-reload-btn { flex-shrink: 0; } | |
| /* Flush dropdown β portalled to document.body, positioned dynamically via JS */ | |
| .hq-flush-dropdown { | |
| position: fixed; | |
| width: 260px; | |
| background: var(--color-bg-elev-1); | |
| border: 1px solid var(--color-border); | |
| border-radius: var(--radius-lg); | |
| box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5); | |
| z-index: 9999; | |
| padding: 4px 0; | |
| animation: flush-slide 0.12s ease-out; | |
| } | |
| @keyframes flush-slide { | |
| from { opacity: 0; transform: translateY(-4px); } | |
| to { opacity: 1; transform: translateY(0); } | |
| } | |
| .hq-flush-dropdown__header { | |
| font-size: 10px; | |
| font-weight: 600; | |
| color: var(--color-fg-subtle); | |
| text-transform: uppercase; | |
| letter-spacing: 0.5px; | |
| padding: 6px 12px 4px; | |
| } | |
| .hq-flush-dropdown__empty { | |
| padding: 12px; | |
| font-size: 11px; | |
| color: var(--color-fg-muted); | |
| text-align: center; | |
| } | |
| .hq-flush-dropdown__item { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| padding: 6px 12px; | |
| gap: 8px; | |
| } | |
| .hq-flush-dropdown__item:hover { background: rgba(255,255,255,0.03); } | |
| .hq-flush-dropdown__info { display: flex; flex-direction: column; gap: 1px; min-width: 0; } | |
| .hq-flush-dropdown__name { font-size: 12px; color: var(--color-fg); font-weight: 500; } | |
| .hq-flush-dropdown__meta { font-size: 10px; color: var(--color-fg-subtle); font-family: var(--font-mono); } | |
| .hq-flush-dropdown__unload { | |
| font-size: 10px; font-weight: 600; | |
| color: var(--color-brand); | |
| background: rgba(211,134,155,0.1); | |
| border: 1px solid rgba(211,134,155,0.2); | |
| border-radius: var(--radius-pill); | |
| padding: 2px 8px; cursor: pointer; | |
| flex-shrink: 0; | |
| } | |
| .hq-flush-dropdown__unload:hover { background: rgba(211,134,155,0.2); } | |
| .hq-flush-dropdown__divider { height: 1px; background: var(--color-border); margin: 4px 0; } | |
| .hq-flush-dropdown__action { | |
| display: flex; align-items: center; gap: 6px; | |
| width: 100%; padding: 6px 12px; | |
| font-size: 12px; color: var(--color-fg); | |
| background: none; border: none; cursor: pointer; | |
| text-align: left; | |
| } | |
| .hq-flush-dropdown__action:hover { background: rgba(255,255,255,0.04); } | |
| .hq-flush-dropdown__action--danger { color: #fb4934; } | |
| .hq-flush-dropdown__action--danger:hover { background: rgba(251,73,52,0.08); } | |
| /* Decorative wavy SVG ribbon was removed β the flat chrome gets its | |
| separation from the hairline `border-bottom` above, matching the | |
| LogsFooter's top edge. */ | |
| /* HQ breadcrumb β informational label, not a button. No pill shell. */ | |
| .hq-view-title { | |
| display: inline-flex; align-items: center; gap: 6px; | |
| height: var(--chrome-pill-h); | |
| padding: 0; | |
| background: transparent; | |
| border: none; | |
| font-family: var(--font-sans); | |
| } | |
| .hq-view-dot { | |
| width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; | |
| animation: hqPulse 2.4s ease-in-out infinite; | |
| } | |
| @keyframes hqPulse { | |
| 0%, 100% { transform: scale(1); opacity: 1; } | |
| 50% { transform: scale(1.15); opacity: 0.7; } | |
| } | |
| .hq-view-kicker { | |
| font-size: var(--chrome-label-size); | |
| font-weight: 600; | |
| letter-spacing: var(--chrome-label-track); | |
| text-transform: uppercase; | |
| color: var(--chrome-fg-muted); | |
| } | |
| .hq-view-label { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 4px; | |
| font-family: var(--font-sans); | |
| font-size: 0.72rem; | |
| font-weight: 600; | |
| letter-spacing: 0.02em; | |
| } | |
| .hq-view-project { | |
| font-family: var(--font-sans); | |
| font-size: 0.68rem; font-weight: 500; | |
| color: var(--chrome-fg-muted); | |
| max-width: 180px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; | |
| } | |
| .hq-wave { | |
| display: inline-flex; align-items: center; gap: 2px; height: 16px; | |
| padding: 0 6px; | |
| opacity: 0.35; | |
| transition: opacity 0.2s; | |
| } | |
| .hq-wave.is-active { opacity: 1; } | |
| /* Responsive header β hide low-priority elements as width tightens. | |
| Priority (least β most important): | |
| reload β wave β kicker+chevron β project name β stats pill β S/M/L picker | |
| β dot β logo wordmark. Label + icon always visible. | |
| */ | |
| /* β€1500: drop dev reload + kicker + first chevron */ | |
| @media (max-width: 1500px) { | |
| .hq-view-kicker { display: none; } | |
| .hq-view-title > svg.lucide-chevron-right:first-of-type { display: none; } | |
| .header-area button[title="Force Reload UI"] { display: none; } | |
| } | |
| /* β€1350: drop mini-waveform */ | |
| @media (max-width: 1350px) { | |
| .hq-wave { display: none; } | |
| } | |
| /* β€1200: drop active project name */ | |
| @media (max-width: 1200px) { | |
| .hq-view-project { display: none; } | |
| } | |
| /* β€1080: hide RAM/CPU text, keep VRAM + status + flush */ | |
| @media (max-width: 1080px) { | |
| .hq-stats > span:nth-child(1), | |
| .hq-stats > span:nth-child(2) { display: none; } | |
| } | |
| /* β€960: shrink breadcrumb, hide S/M/L scale picker */ | |
| @media (max-width: 960px) { | |
| .hq-view-title { padding: 4px 10px; gap: 5px; } | |
| .hq-view-label { font-size: 0.78rem; } | |
| .hq-scale { display: none; } | |
| } | |
| /* β€850: hide stats pill entirely */ | |
| @media (max-width: 850px) { | |
| .hq-stats { display: none ; } | |
| } | |
| /* β€820: drop pulsing dot + shrink logo */ | |
| @media (max-width: 820px) { | |
| .hq-view-dot { display: none; } | |
| } | |
| /* β€720: hide logo wordmark, keep icon only */ | |
| @media (max-width: 720px) { | |
| .header-area > div:nth-child(2) span { display: none; } | |
| } | |
| /* β€600: minimal header β just breadcrumb label */ | |
| @media (max-width: 600px) { | |
| .header-area { padding-left: 12px; padding-right: 4px; } | |
| .header-area > div:nth-child(2) { display: none; } | |
| .hq-view-title { padding: 3px 8px; } | |
| } | |
| /* Prevent clusters overlapping: clip content inside grid cells */ | |
| .header-area > div { min-width: 0; overflow: hidden; } | |
| .header-area > div:nth-child(2), | |
| .header-area > div:nth-child(3) { overflow: visible; } | |
| .hq-wave-bar { | |
| display: inline-block; width: 2.5px; border-radius: 2px; | |
| transition: opacity 0.2s; | |
| } | |
| .hq-wave-bar.active { | |
| animation: hqBounce 1.3s ease-in-out infinite; | |
| } | |
| @keyframes hqBounce { | |
| 0%, 100% { transform: scaleY(0.6); opacity: 0.75; } | |
| 50% { transform: scaleY(1.25); opacity: 1; } | |
| } | |
| .header-area h1 { | |
| font-size: 1.1rem; font-weight: 700; | |
| background: linear-gradient(135deg, #fff 0%, #a1a1aa 100%); | |
| -webkit-background-clip: text; -webkit-text-fill-color: transparent; | |
| letter-spacing: -0.01em; | |
| } | |
| .header-area p { margin: 0; color: var(--text-secondary); font-size: 0.7rem; } | |
| /* βββ TABS β migrated to ui/Tabs primitive; legacy .tabs/.tab removed. βββ */ | |
| /* βββ GRID SYSTEMS βββ */ | |
| .grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; } | |
| .grid-4 { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 6px; } | |
| /* Shared section-label style across workspace pages (Clone / Design / | |
| Dub) β rhymes with the status bar's "LOGS" label and the Sidebar | |
| section titles. Monospace + uppercase + tracked + muted so labels | |
| feel like chrome, leaving content rows to carry the colour. */ | |
| .label-row { | |
| display: flex; align-items: center; gap: 6px; margin-bottom: 4px; | |
| color: var(--chrome-fg-muted); | |
| font-family: var(--chrome-font-mono); | |
| font-size: var(--chrome-label-size); | |
| font-weight: 600; | |
| letter-spacing: var(--chrome-label-track); | |
| text-transform: uppercase; | |
| } | |
| .label-icon { color: var(--chrome-fg-muted); } | |
| /* βββ INPUTS βββ */ | |
| .input-base { | |
| width: 100%; | |
| background: var(--chrome-hover-bg); | |
| border: 1px solid var(--chrome-border); | |
| border-radius: var(--chrome-radius-pill); | |
| padding: 5px 8px; | |
| color: var(--chrome-fg); | |
| font-family: var(--font-sans); | |
| font-size: 0.78rem; | |
| transition: background var(--dur-fast), border-color var(--dur-fast); | |
| box-sizing: border-box; | |
| } | |
| .input-base:focus { | |
| outline: none; | |
| border-color: var(--chrome-border-strong); | |
| box-shadow: none; | |
| background: var(--chrome-bg); | |
| } | |
| .input-base::placeholder { color: var(--chrome-fg-dim); } | |
| textarea.input-base { min-height: 60px; resize: vertical; line-height: 1.5; } | |
| select.input-base { | |
| appearance: none; | |
| background-image: url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23a1a1aa%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E"); | |
| background-repeat: no-repeat; | |
| background-position: right 6px top 50%; | |
| background-size: 0.4rem auto; | |
| padding-right: 18px; | |
| cursor: pointer; | |
| } | |
| select.input-base:hover { | |
| border-color: rgba(255,255,255,0.12); | |
| } | |
| /* βββ CHECKBOX STYLING βββ */ | |
| input[type="checkbox"] { | |
| accent-color: var(--chrome-accent); | |
| width: 13px; height: 13px; | |
| border-radius: 3px; | |
| } | |
| /* βββ RANGE INPUTS βββ */ | |
| input[type="range"] { | |
| -webkit-appearance: none; width: 100%; height: 3px; | |
| background: rgba(255,255,255,0.08); border-radius: 2px; outline: none; margin-top: 3px; | |
| cursor: pointer; | |
| } | |
| input[type="range"]::-webkit-slider-thumb { | |
| -webkit-appearance: none; width: 10px; height: 10px; border-radius: 50%; | |
| background: var(--text-primary); cursor: pointer; | |
| box-shadow: 0 0 4px rgba(0,0,0,0.4); | |
| transition: transform var(--transition-fast); | |
| } | |
| input[type="range"]::-webkit-slider-thumb:hover { | |
| transform: scale(1.3); | |
| } | |
| input[type="range"]::-webkit-slider-thumb:active { | |
| transform: scale(1.1); | |
| background: var(--primary); | |
| } | |
| .val-bubble { | |
| font-size: 0.65rem; background: rgba(0,0,0,0.35); padding: 1px 5px; border-radius: 3px; | |
| border: 1px solid rgba(255,255,255,0.04); | |
| font-variant-numeric: tabular-nums; | |
| } | |
| /* βββ TAGS βββ */ | |
| .tags-container { display: flex; flex-wrap: wrap; gap: 3px; margin: 4px 0; } | |
| .tag-btn { | |
| background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.07); | |
| color: var(--text-secondary); padding: 2px 6px; border-radius: 3px; | |
| font-size: 0.65rem; cursor: pointer; transition: background var(--dur-fast), color var(--dur-fast), border-color var(--dur-fast); white-space: nowrap; | |
| font-family: var(--chrome-font-mono); | |
| } | |
| .tag-btn:hover { | |
| background: var(--chrome-hover-bg); color: var(--chrome-fg); | |
| border-color: var(--chrome-border-strong); | |
| transform: none; | |
| } | |
| .tag-btn:active { transform: none; } | |
| .file-drag { | |
| border: 1px dashed var(--chrome-border-strong); border-radius: var(--chrome-radius-pill); padding: 10px; | |
| text-align: center; cursor: pointer; display: flex; flex-direction: column; align-items: center; gap: 4px; | |
| background: transparent; | |
| transition: background var(--dur-fast), border-color var(--dur-fast); | |
| } | |
| .file-drag:hover, | |
| .file-drag.is-dragging { | |
| border-color: var(--chrome-accent); background: var(--chrome-accent-bg); | |
| box-shadow: none; | |
| } | |
| .file-drag p { margin: 0; font-size: 0.72rem; color: var(--chrome-fg-muted); } | |
| /* βββ PROGRESS β migrated to ui/Progress primitive. βββ */ | |
| /* βββ BUTTON βββ */ | |
| /* Flat chrome primary β accent = text + border, no gradient / shimmer. | |
| Matches the dub footer button family so the whole app reads as one | |
| chrome typography row. */ | |
| .btn-primary { | |
| width: 100%; | |
| background: var(--chrome-accent-bg); | |
| color: var(--chrome-accent); | |
| border: 1px solid var(--chrome-accent-border); | |
| padding: 6px 12px; | |
| border-radius: var(--chrome-radius-pill); | |
| font-size: 0.78rem; font-weight: 500; cursor: pointer; | |
| display: flex; justify-content: center; align-items: center; gap: 6px; | |
| margin-top: 6px; | |
| transition: background var(--dur-fast), border-color var(--dur-fast), color var(--dur-fast); | |
| font-family: var(--font-sans); | |
| letter-spacing: 0.02em; | |
| position: relative; | |
| overflow: hidden; | |
| box-shadow: none; | |
| } | |
| .btn-primary::before { display: none; } | |
| .btn-primary:hover:not(:disabled) { | |
| filter: none; | |
| background: color-mix(in srgb, var(--chrome-accent) 20%, transparent); | |
| box-shadow: none; | |
| transform: none; | |
| } | |
| .btn-primary:active:not(:disabled) { | |
| transform: none; | |
| filter: none; | |
| box-shadow: none; | |
| } | |
| .btn-primary:disabled { opacity: 0.4; cursor: not-allowed; filter: none; } | |
| .spinner { animation: spin 1s linear infinite; } | |
| /* βββ SIDEBAR / HISTORY βββ */ | |
| .history-panel { | |
| height: 100%; | |
| max-height: none; | |
| overflow-y: auto; | |
| box-sizing: border-box; | |
| border-right: 1px solid rgba(255,255,255,0.04); | |
| } | |
| .history-item { | |
| background: rgba(0,0,0,0.18); border: 1px solid rgba(255,255,255,0.04); | |
| border-radius: 5px; padding: 6px 8px; margin-bottom: 4px; | |
| transition: all var(--transition-smooth); | |
| animation: fadeIn 0.2s ease-out; | |
| } | |
| .history-item:hover { | |
| background: rgba(0,0,0,0.28); | |
| border-color: rgba(255,255,255,0.08); | |
| } | |
| /* .history-header / .history-badge / .history-time / .history-text migrated to Badge + Sidebar.css. */ | |
| .project-active { | |
| border-color: rgba(184,187,38,0.4) ; | |
| background: rgba(184,187,38,0.06) ; | |
| box-shadow: inset 0 0 0 1px rgba(184,187,38,0.12), 0 0 8px rgba(184,187,38,0.06); | |
| } | |
| /* βββ AUDIO PLAYER βββ */ | |
| audio { | |
| height: 28px; width: 100%; outline: none; border-radius: 4px; | |
| } | |
| audio::-webkit-media-controls-enclosure { | |
| background-color: rgba(40,38,37,0.95); | |
| border: 1px solid rgba(255,255,255,0.04); | |
| border-radius: 4px; | |
| } | |
| audio::-webkit-media-controls-play-button, | |
| audio::-webkit-media-controls-mute-button { | |
| background-color: rgba(255,255,255,0.06); border-radius: 50%; color: var(--chrome-accent); | |
| } | |
| audio::-webkit-media-controls-current-time-display, | |
| audio::-webkit-media-controls-time-remaining-display { color: var(--chrome-fg); font-size: 0.65rem; } | |
| /* βββ OVERRIDES / MODALS βββ */ | |
| .override-toggle { | |
| display: flex; align-items: center; justify-content: space-between; | |
| background: rgba(0,0,0,0.18); padding: 4px 8px; border-radius: 4px; | |
| font-size: 0.72rem; color: var(--text-primary); cursor: pointer; | |
| border: 1px solid rgba(255,255,255,0.04); margin-top: 6px; | |
| transition: all var(--transition-smooth); | |
| } | |
| .override-toggle:hover { background: rgba(0,0,0,0.3); border-color: rgba(255,255,255,0.08); } | |
| .override-content { | |
| background: rgba(0,0,0,0.1); border: 1px solid rgba(255,255,255,0.04); border-top: none; | |
| padding: 6px 8px; border-radius: 0 0 4px 4px; margin-bottom: 6px; | |
| } | |
| .preset-grid { | |
| display: grid; grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); gap: 4px; margin-bottom: 6px; | |
| } | |
| .preset-btn { | |
| background: rgba(94,106,210,0.06); border: 1px solid rgba(94,106,210,0.15); | |
| color: #c7d2fe; padding: 3px 6px; border-radius: 4px; font-size: 0.65rem; | |
| cursor: pointer; transition: all var(--transition-smooth); text-align: left; | |
| display: flex; align-items: center; gap: 3px; | |
| } | |
| .preset-btn:hover { | |
| background: rgba(94,106,210,0.15); border-color: #a78bfa; | |
| transform: translateY(-1px); | |
| box-shadow: 0 2px 6px rgba(94,106,210,0.15); | |
| } | |
| .preset-btn:active { transform: translateY(0); } | |
| /* βββ SEGMENT TABLE βββ */ | |
| .segment-table { | |
| /* No max-height cap β the list is virtualised via react-window and measures | |
| its own body container. Capping at 320 px left a huge gap below. */ | |
| border: 1px solid rgba(255,255,255,0.04); border-radius: 4px; margin-top: 4px; | |
| } | |
| .segment-header { | |
| display: flex; align-items: center; gap: 4px; | |
| padding: 3px 6px; background: rgba(0,0,0,0.35); | |
| font-size: 0.62rem; font-weight: 600; color: var(--text-secondary); | |
| position: sticky; top: 0; z-index: 1; | |
| border-bottom: 1px solid rgba(255,255,255,0.06); | |
| letter-spacing: 0.03em; | |
| text-transform: uppercase; | |
| } | |
| .segment-row { | |
| display: flex; align-items: center; gap: 3px; | |
| padding: 2px 4px; | |
| box-sizing: border-box; | |
| border-bottom: 1px solid rgba(255,255,255,0.02); | |
| transition: background var(--transition-fast); | |
| } | |
| .segment-row:hover { background: var(--chrome-hover-bg); } | |
| .segment-row.segment-active { | |
| background: var(--chrome-accent-bg); | |
| border-left: 2px solid var(--chrome-accent); | |
| box-shadow: none; | |
| animation: none; | |
| z-index: 10; | |
| position: relative; | |
| } | |
| .segment-row.segment-done { opacity: 0.5; } | |
| .segment-row.segment-selected { | |
| background: var(--chrome-accent-bg); | |
| box-shadow: inset 2px 0 0 var(--chrome-accent); | |
| } | |
| .segment-time { | |
| width: 48px; flex-shrink: 0; | |
| font-size: 0.62rem; font-family: var(--chrome-font-mono); color: var(--chrome-fg-muted); | |
| font-variant-numeric: tabular-nums; | |
| } | |
| .segment-input { | |
| flex: 1; | |
| padding: 2px 4px ; | |
| font-size: 0.7rem ; | |
| border-radius: 3px ; | |
| min-height: auto ; | |
| } | |
| .segment-del { | |
| width: 20px; height: 20px; flex-shrink: 0; | |
| background: none; border: 1px solid rgba(251,73,52,0.12); | |
| color: #fb4934; border-radius: 3px; cursor: pointer; | |
| display: flex; align-items: center; justify-content: center; | |
| transition: all var(--transition-smooth); | |
| opacity: 0.6; | |
| } | |
| .segment-del:hover { background: rgba(251,73,52,0.12); opacity: 1; } | |
| .segment-del:disabled { opacity: 0.2; cursor: not-allowed; } | |
| .profile-active { | |
| background: rgba(142,192,124,0.12) ; | |
| border-color: #8ec07c ; | |
| color: #8ec07c ; | |
| } | |
| .segment-play { | |
| width: 20px; height: 20px; flex-shrink: 0; | |
| background: transparent; border: 1px solid var(--chrome-border); | |
| color: var(--chrome-fg-muted); border-radius: var(--chrome-radius-pill); cursor: pointer; | |
| display: flex; align-items: center; justify-content: center; | |
| transition: background var(--dur-fast), color var(--dur-fast), border-color var(--dur-fast); | |
| } | |
| .segment-play:hover { background: var(--chrome-hover-bg); color: var(--chrome-fg); border-color: var(--chrome-border-strong); } | |
| /* βββ WAVEFORM TIMELINE βββ */ | |
| .waveform-timeline { margin-bottom: 6px; } | |
| .waveform-video-preview { | |
| margin-bottom: 4px; border-radius: var(--radius); | |
| overflow: hidden; border: 1px solid rgba(255,255,255,0.06); background: #1d2021; | |
| } | |
| .waveform-container { | |
| background: rgba(0,0,0,0.22); | |
| border: 1px solid rgba(255,255,255,0.05); | |
| border-radius: var(--radius); | |
| padding: 4px; | |
| overflow-x: auto; | |
| height: 80px ; | |
| position: relative; | |
| border-bottom: 1px solid rgba(255,255,255,0.04); | |
| } | |
| .waveform-container [data-id^="wavesurfer-region"] { | |
| border-radius: 3px ; | |
| } | |
| .waveform-controls { | |
| display: flex; align-items: center; justify-content: space-between; | |
| margin-top: 4px; gap: 4px; | |
| } | |
| .waveform-controls-left { display: flex; align-items: center; gap: 4px; } | |
| .waveform-controls-right { display: flex; align-items: center; gap: 4px; } | |
| .waveform-btn { | |
| width: 22px; height: 22px; | |
| display: flex; align-items: center; justify-content: center; | |
| background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.06); | |
| color: var(--text-secondary); border-radius: 4px; cursor: pointer; | |
| transition: all var(--transition-smooth); | |
| } | |
| .waveform-btn:hover { | |
| background: rgba(255,255,255,0.1); color: var(--text-primary); | |
| border-color: rgba(255,255,255,0.12); | |
| } | |
| .waveform-btn:disabled { opacity: 0.3; cursor: not-allowed; } | |
| .waveform-btn-play { | |
| background: var(--chrome-accent-bg); border-color: var(--chrome-accent-border); color: var(--chrome-accent); | |
| } | |
| .waveform-btn-play:hover { | |
| background: color-mix(in srgb, var(--chrome-accent) 22%, transparent); | |
| box-shadow: none; | |
| } | |
| .waveform-time { | |
| font-size: 0.62rem; font-family: var(--chrome-font-mono); color: var(--chrome-fg-muted); | |
| padding: 1px 5px; background: var(--chrome-hover-bg); border-radius: 3px; | |
| border: 1px solid var(--chrome-border); | |
| font-variant-numeric: tabular-nums; | |
| } | |
| .waveform-zoom-slider { | |
| width: 60px ; height: 2px ; margin-top: 0 ; | |
| } | |
| /* βββ MULTI-TRACK βββ */ | |
| .waveform-track-bg { | |
| position: absolute; left: 0; right: 0; height: 26px; | |
| background: rgba(255,255,255,0.015); | |
| border-bottom: 1px dashed rgba(255,255,255,0.04); | |
| pointer-events: none; z-index: 1; | |
| } | |
| .waveform-track-bg:nth-child(1) { top: 0px; } | |
| .waveform-track-bg:nth-child(2) { top: 26px; } | |
| .waveform-track-bg:nth-child(3) { top: 52px; } | |
| .waveform-container [data-id^="wavesurfer-region"] { | |
| top: 52px ; | |
| height: 26px ; | |
| border-radius: 3px ; | |
| border: 1px solid rgba(255,255,255,0.15) ; | |
| display: flex ; align-items: center ; | |
| padding: 0 3px ; color: white ; | |
| font-size: 0.58rem ; | |
| text-shadow: 0 1px 2px rgba(0,0,0,0.7); | |
| overflow: hidden; white-space: nowrap; | |
| } | |
| /* βββ SCROLLBAR βββ */ | |
| ::-webkit-scrollbar { width: 5px; height: 5px; } | |
| ::-webkit-scrollbar-track { background: transparent; } | |
| ::-webkit-scrollbar-thumb { | |
| background: rgba(255,255,255,0.08); border-radius: 3px; | |
| border: 1px solid transparent; | |
| } | |
| ::-webkit-scrollbar-thumb:hover { background: rgba(255,255,255,0.16); } | |
| ::-webkit-scrollbar-corner { background: transparent; } | |
| /* Firefox scrollbar */ | |
| * { | |
| scrollbar-width: thin; | |
| scrollbar-color: rgba(255,255,255,0.08) transparent; | |
| } | |
| /* βββ TOOLTIP HINT βββ */ | |
| [title] { position: relative; } | |
| /* βββ FOCUS VISIBLE (keyboard nav) βββ */ | |
| :focus-visible { | |
| outline: 2px solid color-mix(in srgb, var(--chrome-accent, #d3869b) 65%, transparent); | |
| outline-offset: 2px; | |
| box-shadow: 0 0 0 4px color-mix(in srgb, var(--chrome-accent, #d3869b) 15%, transparent); | |
| } | |
| button:focus:not(:focus-visible), | |
| a:focus:not(:focus-visible), | |
| input:focus:not(:focus-visible), | |
| select:focus:not(:focus-visible) { outline: none; box-shadow: none; } | |
| /* βββ LAUNCHPAD β chrome frame + restrained motion βββ */ | |
| .launchpad { | |
| flex: 1; display: flex; flex-direction: column; overflow-y: auto; | |
| background: var(--chrome-bg); | |
| position: relative; | |
| isolation: isolate; | |
| } | |
| /* Paper grain removed β chrome surfaces read flat, not textured. */ | |
| .launchpad::before { display: none; } | |
| /* ββ Aurora backdrop βββββββββββββββββββββββββββββββββββββββ | |
| Three soft blobs in the three card accent colors, drifting on | |
| independent long cycles. Behind everything at z:0. Blurred heavily | |
| so the motion reads as ambient light, not moving shapes. */ | |
| .lp-aurora { | |
| position: absolute; | |
| inset: 0; | |
| overflow: hidden; | |
| pointer-events: none; | |
| z-index: 0; | |
| opacity: 0.55; | |
| } | |
| .lp-aurora__blob { | |
| position: absolute; | |
| border-radius: 50%; | |
| filter: blur(90px); | |
| will-change: transform; | |
| } | |
| .lp-aurora__blob--pink { | |
| width: 420px; height: 420px; | |
| background: radial-gradient(circle, rgba(211,134,155,0.55), transparent 60%); | |
| top: -80px; left: -40px; | |
| animation: lpDrift1 22s ease-in-out infinite; | |
| } | |
| .lp-aurora__blob--green { | |
| width: 360px; height: 360px; | |
| background: radial-gradient(circle, rgba(142,192,124,0.40), transparent 60%); | |
| top: 40%; left: 55%; | |
| animation: lpDrift2 28s ease-in-out infinite; | |
| } | |
| .lp-aurora__blob--amber { | |
| width: 480px; height: 480px; | |
| background: radial-gradient(circle, rgba(254,128,25,0.32), transparent 60%); | |
| bottom: -120px; right: -80px; | |
| animation: lpDrift3 32s ease-in-out infinite; | |
| } | |
| @keyframes lpDrift1 { | |
| 0%, 100% { transform: translate(0, 0) scale(1); } | |
| 33% { transform: translate(120px, 60px) scale(1.15); } | |
| 66% { transform: translate(-40px, 100px) scale(0.9); } | |
| } | |
| @keyframes lpDrift2 { | |
| 0%, 100% { transform: translate(0, 0) scale(1); } | |
| 50% { transform: translate(-180px, -90px) scale(1.1); } | |
| } | |
| @keyframes lpDrift3 { | |
| 0%, 100% { transform: translate(0, 0) scale(1); } | |
| 40% { transform: translate(-100px, -60px) scale(1.05); } | |
| 75% { transform: translate(60px, -30px) scale(0.95); } | |
| } | |
| .lp-hero { | |
| padding: 42px 44px 24px; | |
| position: relative; z-index: 1; | |
| } | |
| .lp-kicker { | |
| font-family: var(--chrome-font-mono); | |
| font-size: var(--chrome-label-size); | |
| font-weight: 600; | |
| letter-spacing: var(--chrome-label-track); | |
| text-transform: uppercase; | |
| color: var(--chrome-fg-muted); | |
| } | |
| /* Hero H1 β Source Serif 4 at display size. Eternal halo glow sits behind | |
| the text (::before via the new lp-hero__halo span so we can z-layer | |
| without re-scoping the h1 itself); animated sweep underneath. */ | |
| .lp-hero__title { | |
| font-size: 2.75rem; font-weight: 400; margin: 0; | |
| color: var(--chrome-fg); | |
| font-family: var(--font-serif); | |
| letter-spacing: -0.02em; | |
| line-height: 1.04; | |
| display: inline-block; position: relative; | |
| font-optical-sizing: auto; | |
| /* Paint containing block for halo / sweep absolute children */ | |
| padding: 0 4px; | |
| } | |
| .lp-hero__title em { | |
| font-style: italic; font-weight: 400; | |
| color: var(--chrome-accent); | |
| /* Italic text sits a hair above serif baseline; nudge it back down. */ | |
| position: relative; | |
| } | |
| .lp-hero__halo { | |
| position: absolute; | |
| inset: -16px -24px; | |
| background: radial-gradient( | |
| ellipse at 50% 60%, | |
| color-mix(in srgb, var(--chrome-accent) 20%, transparent) 0%, | |
| transparent 65% | |
| ); | |
| filter: blur(16px); | |
| z-index: -1; | |
| pointer-events: none; | |
| animation: lpHeroHalo 6s ease-in-out infinite; | |
| } | |
| @keyframes lpHeroHalo { | |
| 0%, 100% { opacity: 0.55; transform: scale(1); } | |
| 50% { opacity: 0.95; transform: scale(1.06); } | |
| } | |
| .lp-hero__sweep { | |
| position: absolute; | |
| left: 0; right: 0; | |
| bottom: -6px; | |
| height: 2px; | |
| background: linear-gradient(90deg, | |
| transparent 0%, | |
| color-mix(in srgb, var(--chrome-accent) 70%, transparent) 30%, | |
| var(--chrome-accent) 50%, | |
| color-mix(in srgb, var(--chrome-accent) 70%, transparent) 70%, | |
| transparent 100% | |
| ); | |
| transform-origin: center; | |
| animation: lpHeroSweep 5.4s ease-in-out infinite; | |
| pointer-events: none; | |
| border-radius: 2px; | |
| } | |
| @keyframes lpHeroSweep { | |
| 0%, 100% { transform: scaleX(0.35); opacity: 0.35; } | |
| 50% { transform: scaleX(1); opacity: 0.85; } | |
| } | |
| /* Legacy squiggle span β hidden for back-compat if ever rendered. */ | |
| .lp-hero h1 .lp-underline { display: none; } | |
| .lp-hero p { | |
| margin: 14px 0 0; color: var(--chrome-fg-muted); font-size: 0.82rem; | |
| font-family: var(--font-sans); | |
| font-weight: 400; max-width: 560px; line-height: 1.6; | |
| } | |
| .lp-hero p .lp-pill { | |
| display: inline-block; padding: 1px 8px; | |
| border-radius: var(--chrome-radius-pill); | |
| background: var(--chrome-accent-bg); | |
| border: 1px solid var(--chrome-accent-border); | |
| color: var(--chrome-accent); | |
| font-family: var(--chrome-font-mono); | |
| font-weight: 500; font-size: 0.72rem; | |
| transform: none; | |
| margin: 0 2px; | |
| } | |
| /* Action cards β flat chrome frame, painted with: | |
| β’ an always-on breath ring (the "eternal glow") | |
| β’ a cursor-tracked spotlight that fires on hover | |
| `--card-hue` (inline style) drives everything β background tint, icon, | |
| accent border, glow color β so each card's personality flows from one | |
| hex value. `isolation: isolate` contains the pseudo-layer z-stack. */ | |
| .lp-actions { | |
| display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; | |
| padding: 4px 44px; position: relative; z-index: 1; | |
| } | |
| .lp-action-card { | |
| background: transparent; | |
| border: 1px solid var(--chrome-border); | |
| border-radius: var(--chrome-radius-pill); | |
| padding: 18px 18px 16px; | |
| cursor: pointer; | |
| transition: background var(--dur-fast), border-color var(--dur-fast), transform var(--dur-base); | |
| position: relative; overflow: visible; | |
| box-shadow: none; | |
| isolation: isolate; | |
| /* Native <button> reset */ | |
| font: inherit; color: inherit; text-align: left; width: 100%; | |
| } | |
| .lp-action-card:hover { | |
| transform: translateY(-1px); | |
| background: color-mix(in srgb, var(--card-hue, var(--chrome-accent)) 6%, transparent); | |
| border-color: color-mix(in srgb, var(--card-hue, var(--chrome-accent)) 40%, transparent); | |
| box-shadow: 0 12px 28px -14px color-mix(in srgb, var(--card-hue, var(--chrome-accent)) 40%, transparent); | |
| } | |
| .lp-action-card .card-icon { | |
| width: 34px; height: 34px; position: relative; z-index: 1; | |
| border-radius: var(--chrome-radius-pill); | |
| background: color-mix(in srgb, var(--card-hue, var(--chrome-accent)) 12%, transparent); | |
| border: 1px solid color-mix(in srgb, var(--card-hue, var(--chrome-accent)) 28%, transparent); | |
| display: flex; align-items: center; justify-content: center; | |
| margin-bottom: 10px; | |
| transition: transform var(--dur-base) var(--ease-out), box-shadow var(--dur-base) var(--ease-out); | |
| } | |
| .lp-action-card:hover .card-icon { | |
| transform: scale(1.05); | |
| box-shadow: 0 0 18px -2px color-mix(in srgb, var(--card-hue, var(--chrome-accent)) 45%, transparent); | |
| } | |
| .lp-action-card__emoji { | |
| display: inline-block; | |
| margin-left: 2px; | |
| /* Keep emoji out of the uppercase tracking of the h3 */ | |
| text-transform: none; | |
| letter-spacing: 0; | |
| } | |
| /* ββ Glow layer (spotlight + breath ring) ββββββββββββββββββββββββββ */ | |
| .lp-glow-layer { | |
| position: absolute; | |
| inset: 0; | |
| border-radius: inherit; | |
| overflow: hidden; | |
| pointer-events: none; | |
| z-index: 0; | |
| } | |
| /* Cursor spotlight β radial gradient whose center is set by --mx/--my | |
| from onMouseMove. Fades in only while the card is hovered. */ | |
| .lp-glow-layer::before { | |
| content: ""; | |
| position: absolute; | |
| inset: 0; | |
| background: radial-gradient( | |
| 260px circle at var(--mx, 50%) var(--my, 50%), | |
| color-mix(in srgb, var(--card-hue, var(--chrome-accent)) 28%, transparent) 0%, | |
| transparent 55% | |
| ); | |
| opacity: 0; | |
| transition: opacity 260ms ease; | |
| } | |
| .lp-action-card:hover .lp-glow-layer::before { opacity: 1; } | |
| /* Eternal breath ring β pulses forever, tied to the card's hue. Subtle | |
| enough that three of them running at staggered offsets read as "alive," | |
| not "strobing." */ | |
| .lp-glow-layer::after { | |
| content: ""; | |
| position: absolute; | |
| inset: 0; | |
| border-radius: inherit; | |
| border: 1px solid color-mix(in srgb, var(--card-hue, var(--chrome-accent)) 30%, transparent); | |
| opacity: 0.2; | |
| animation: lpBreath 5.2s ease-in-out infinite; | |
| box-shadow: 0 0 0 0 color-mix(in srgb, var(--card-hue, var(--chrome-accent)) 50%, transparent); | |
| } | |
| .lp-action-card:nth-child(1) .lp-glow-layer::after { animation-delay: 0s; } | |
| .lp-action-card:nth-child(2) .lp-glow-layer::after { animation-delay: -1.7s; } | |
| .lp-action-card:nth-child(3) .lp-glow-layer::after { animation-delay: -3.4s; } | |
| @keyframes lpBreath { | |
| 0%, 100% { opacity: 0.15; box-shadow: 0 0 0 0 transparent; } | |
| 50% { opacity: 0.55; box-shadow: 0 0 22px 0 color-mix(in srgb, var(--card-hue, var(--chrome-accent)) 20%, transparent); } | |
| } | |
| /* Count badge leans on card hue too instead of hardcoded rgba. */ | |
| .lp-action-card .card-count { | |
| border-color: color-mix(in srgb, var(--card-hue, var(--chrome-accent)) 50%, transparent) ; | |
| color: var(--card-hue, var(--chrome-accent)) ; | |
| background: color-mix(in srgb, var(--card-hue, var(--chrome-accent)) 10%, var(--chrome-bg)) ; | |
| } | |
| /* Respect reduced motion. */ | |
| @media (prefers-reduced-motion: reduce) { | |
| .lp-aurora__blob, | |
| .lp-hero__halo, | |
| .lp-hero__sweep, | |
| .lp-glow-layer::after, | |
| .lp-wave-bar { | |
| animation: none ; | |
| } | |
| } | |
| .lp-action-card h3 { | |
| font-family: var(--chrome-font-mono); | |
| font-size: 0.82rem; font-weight: 600; margin: 0 0 4px; | |
| color: var(--chrome-fg); | |
| letter-spacing: var(--chrome-label-track); | |
| text-transform: uppercase; | |
| position: relative; z-index: 1; | |
| } | |
| .lp-action-card .card-desc { | |
| font-family: var(--font-sans); | |
| font-size: 0.72rem; color: var(--chrome-fg-muted); margin: 0; line-height: 1.5; | |
| font-weight: 400; | |
| position: relative; z-index: 1; | |
| min-height: 3em; | |
| } | |
| .lp-action-card .card-count { | |
| font-family: var(--chrome-font-mono); | |
| font-size: var(--chrome-label-size); font-weight: 600; | |
| letter-spacing: var(--chrome-label-track); | |
| padding: 1px 7px; | |
| border-radius: var(--chrome-radius-pill); | |
| position: absolute; top: -8px; right: -6px; z-index: 2; | |
| transform: none; | |
| box-shadow: none; | |
| border: 1px solid var(--chrome-border-strong); | |
| background: var(--chrome-bg); | |
| } | |
| /* Sections β softer headings */ | |
| .lp-section { | |
| padding: 28px 44px 40px; position: relative; z-index: 1; | |
| } | |
| /* Section titles on the launchpad β same chrome label treatment as the | |
| sidebar / settings headings and the LOGS label in the footer. Drops | |
| the Fraunces serif heading style so the three section dividers | |
| ("Cloned Voices", "Designed Voices", "Dubbing Projects") rhyme with | |
| the rest of the app's labels. */ | |
| .lp-section-title { | |
| font-family: var(--chrome-font-mono); | |
| font-size: var(--chrome-label-size); | |
| font-weight: 600; | |
| text-transform: uppercase; | |
| letter-spacing: var(--chrome-label-track); | |
| color: var(--chrome-fg-muted); | |
| margin: 0 0 12px; | |
| display: flex; align-items: center; gap: 8px; | |
| } | |
| .lp-section-title::after { | |
| content: ""; flex: 1; height: 1px; | |
| background-image: radial-gradient(circle, rgba(255,255,255,0.12) 1px, transparent 1px); | |
| background-size: 6px 1px; | |
| } | |
| /* ββ Launchpad extracted layout classes ββββββββββββββββββββ */ | |
| .lp-hero__row { | |
| display: flex; justify-content: space-between; align-items: flex-start; | |
| gap: 24px; flex-wrap: wrap; | |
| } | |
| .lp-hero__col { max-width: 640px; } | |
| .lp-hero__kicker-row { | |
| display: flex; align-items: center; gap: 10px; margin-bottom: 12px; | |
| } | |
| .lp-hero__wave-group { | |
| display: flex; align-items: center; gap: 2px; height: 22px; | |
| } | |
| .lp-section__grid { | |
| display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); | |
| gap: 20px; | |
| } | |
| .lp-col { display: flex; flex-direction: column; gap: 8px; } | |
| .lp-proj-icon--clone { background: rgba(211,134,155,0.1); } | |
| .lp-proj-icon--design { background: rgba(142,192,124,0.1); } | |
| .lp-proj-icon--locked { background: rgba(184,187,38,0.1); } | |
| .lp-proj-icon--dub { background: rgba(254,128,25,0.1); overflow: hidden; } | |
| .lp-proj-meta--italic { font-style: italic; } | |
| .lp-locked-badge { | |
| font-family: var(--chrome-font-mono); | |
| font-size: var(--chrome-label-size); | |
| letter-spacing: var(--chrome-label-track); | |
| padding: 1px 7px; | |
| border-radius: var(--chrome-radius-pill); | |
| background: color-mix(in srgb, #b8bb26 10%, transparent); | |
| border: 1px solid color-mix(in srgb, #b8bb26 40%, transparent); | |
| color: #b8bb26; font-weight: 600; | |
| } | |
| .lp-empty { | |
| flex: 1; display: flex; align-items: center; justify-content: center; | |
| position: relative; z-index: 1; | |
| } | |
| .lp-empty__inner { text-align: center; max-width: 360px; } | |
| .lp-empty__bars { | |
| display: flex; justify-content: center; gap: 3px; | |
| margin-bottom: 16px; opacity: 0.3; | |
| } | |
| .lp-empty__hint { | |
| font-family: var(--chrome-font-mono); | |
| font-size: 0.8rem; color: var(--chrome-fg-muted); margin: 0; | |
| } | |
| .lp-dub-thumb { | |
| width: 100%; height: 100%; object-fit: cover; | |
| border-radius: inherit; display: block; | |
| } | |
| /* ββ Demo-profile callout ββββββββββββββββββββββββββββββββββ */ | |
| .lp-demo-callout { | |
| display: flex; align-items: center; gap: 10px; | |
| padding: 10px 18px; margin: 8px 44px 0; | |
| background: color-mix(in srgb, var(--chrome-accent) 8%, var(--chrome-bg)); | |
| border: 1px solid var(--chrome-accent-border); | |
| border-radius: var(--chrome-radius-pill); | |
| font-size: 0.76rem; color: var(--chrome-fg); | |
| position: relative; z-index: 1; | |
| animation: lpFadeUp 0.5s cubic-bezier(0.4,0,0.2,1) both; | |
| } | |
| .lp-demo-callout__icon { font-size: 1.1rem; } | |
| .lp-demo-callout__btn { | |
| margin-left: auto; padding: 4px 14px; | |
| font-family: var(--font-sans); font-size: 0.7rem; font-weight: 600; | |
| border-radius: var(--chrome-radius-pill); | |
| background: var(--chrome-accent-bg); | |
| border: 1px solid var(--chrome-accent-border); | |
| color: var(--chrome-accent); cursor: pointer; | |
| transition: background var(--dur-fast); | |
| } | |
| .lp-demo-callout__btn:hover { | |
| background: color-mix(in srgb, var(--chrome-accent) 22%, transparent); | |
| } | |
| /* ββ Personality picker strip ββββββββββββββββββββββββββββββ */ | |
| .personality-strip { | |
| display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 10px; | |
| } | |
| .personality-chip { | |
| display: inline-flex; align-items: center; gap: 5px; | |
| padding: 5px 12px; | |
| font-family: var(--font-sans); font-size: 0.72rem; font-weight: 500; | |
| border-radius: var(--chrome-radius-pill); | |
| background: transparent; | |
| border: 1px solid var(--chrome-border); | |
| color: var(--chrome-fg-muted); cursor: pointer; | |
| transition: background var(--dur-fast), border-color var(--dur-fast), color var(--dur-fast); | |
| } | |
| .personality-chip:hover { | |
| background: var(--chrome-hover-bg); | |
| border-color: var(--chrome-border-strong); | |
| color: var(--chrome-fg); | |
| } | |
| .personality-chip.active { | |
| background: var(--chrome-accent-bg); | |
| border-color: var(--chrome-accent-border); | |
| color: var(--chrome-accent); | |
| } | |
| .personality-chip__icon { font-size: 0.9rem; } | |
| .personality-label { | |
| font-family: var(--chrome-font-mono); | |
| font-size: var(--chrome-label-size); | |
| font-weight: 600; text-transform: uppercase; | |
| letter-spacing: var(--chrome-label-track); | |
| color: var(--chrome-fg-muted); | |
| margin-bottom: 6px; | |
| } | |
| /* Project rows β chrome-radius pills so the launchpad project list | |
| rhymes with the Projects page cards. Dropped the squircle corners, | |
| the translate-X hover, and the icon rotation/scale micro-animation | |
| β they read as playful overlay on a chrome frame; simple hover-tint | |
| fits the status-bar visual language instead. */ | |
| .lp-project-card { | |
| background: var(--chrome-bg); | |
| border: 1px solid var(--chrome-border); | |
| border-radius: var(--chrome-radius-pill); | |
| padding: 10px 14px; | |
| transition: background 0.15s, border-color 0.15s; | |
| display: flex; align-items: center; gap: 12px; | |
| } | |
| .lp-project-card:hover { | |
| background: var(--chrome-hover-bg); | |
| border-color: var(--chrome-border-strong); | |
| } | |
| .lp-project-card .proj-icon { | |
| width: 32px; height: 32px; | |
| border-radius: var(--chrome-radius-pill); | |
| display: flex; align-items: center; justify-content: center; flex-shrink: 0; | |
| } | |
| .lp-project-card .proj-info { flex: 1; min-width: 0; } | |
| .lp-project-card .proj-name { | |
| font-family: var(--font-sans); | |
| font-size: 0.78rem; font-weight: 600; color: var(--chrome-fg); | |
| letter-spacing: 0.01em; | |
| white-space: nowrap; overflow: hidden; text-overflow: ellipsis; | |
| } | |
| .lp-project-card .proj-meta { | |
| font-family: var(--chrome-font-mono); | |
| font-size: 0.62rem; color: var(--chrome-fg-dim); margin-top: 2px; font-weight: 400; | |
| white-space: nowrap; overflow: hidden; text-overflow: ellipsis; | |
| } | |
| .lp-project-card .proj-action { | |
| font-family: var(--font-sans); | |
| font-size: 0.7rem; font-weight: 500; padding: 4px 12px; | |
| border-radius: var(--chrome-radius-pill); | |
| background: transparent; | |
| border: 1px solid var(--chrome-border-strong); | |
| color: var(--chrome-fg-muted); cursor: pointer; | |
| transition: background var(--dur-fast), color var(--dur-fast), border-color var(--dur-fast); | |
| flex-shrink: 0; | |
| white-space: nowrap; | |
| letter-spacing: 0.02em; | |
| } | |
| .lp-project-card .proj-action:hover { | |
| background: var(--chrome-hover-bg); color: var(--chrome-fg); | |
| border-color: var(--chrome-fg-muted); | |
| transform: none; | |
| } | |
| /* Launchpad A/B Compare trigger β flat chrome accent button, no rotation. */ | |
| .lp-ab-compare { | |
| display: inline-flex; align-items: center; gap: 6px; | |
| padding: 6px 14px; | |
| font-family: var(--font-sans); | |
| font-size: 0.72rem; font-weight: 500; | |
| letter-spacing: 0.02em; | |
| color: var(--chrome-accent); | |
| background: var(--chrome-accent-bg); | |
| border: 1px solid var(--chrome-accent-border); | |
| border-radius: var(--chrome-radius-pill); | |
| cursor: pointer; flex-shrink: 0; | |
| transition: background var(--dur-fast), border-color var(--dur-fast); | |
| } | |
| .lp-ab-compare:hover { | |
| background: color-mix(in srgb, var(--chrome-accent) 22%, transparent); | |
| } | |
| /* Staggered fade-in */ | |
| @keyframes lpFadeUp { | |
| from { opacity: 0; transform: translateY(12px); } | |
| to { opacity: 1; transform: translateY(0); } | |
| } | |
| .lp-animate { animation: lpFadeUp 0.4s cubic-bezier(0.4,0,0.2,1) both; } | |
| .lp-animate:nth-child(1) { animation-delay: 0s; } | |
| .lp-animate:nth-child(2) { animation-delay: 0.06s; } | |
| .lp-animate:nth-child(3) { animation-delay: 0.12s; } | |
| /* Wave bars β each one reads its own --bar-h / --bar-dur / --bar-delay so | |
| the group breathes organically instead of marching in lockstep. Colour | |
| shifts between chrome fg + accent through the cycle so the visualiser | |
| feels like it's tuning into a real signal. */ | |
| @keyframes lpWaveBeat { | |
| 0%, 100% { | |
| transform: scaleY(0.45); | |
| background: var(--chrome-fg-muted); | |
| box-shadow: none; | |
| } | |
| 35% { | |
| transform: scaleY(1.15); | |
| background: var(--chrome-accent); | |
| box-shadow: 0 0 6px color-mix(in srgb, var(--chrome-accent) 55%, transparent); | |
| } | |
| 65% { | |
| transform: scaleY(0.8); | |
| background: color-mix(in srgb, var(--chrome-accent) 60%, var(--chrome-fg-muted)); | |
| box-shadow: none; | |
| } | |
| } | |
| .lp-wave-bar { | |
| display: inline-block; | |
| width: 3px; | |
| height: var(--bar-h, 12px); | |
| border-radius: 2px; | |
| background: var(--chrome-fg-muted); | |
| transform-origin: center; | |
| animation: lpWaveBeat var(--bar-dur, 2s) ease-in-out infinite; | |
| animation-delay: var(--bar-delay, 0s); | |
| } | |
| /* ββ Searchable combobox βββββββββββββββββββββββββββββββββββ */ | |
| .ss-wrap { position: relative; width: 100%; } | |
| .ss-trigger { | |
| display: flex; align-items: center; justify-content: space-between; | |
| gap: 6px; width: 100%; text-align: left; cursor: pointer; | |
| font-family: inherit; | |
| } | |
| .ss-trigger:disabled { cursor: not-allowed; opacity: 0.5; } | |
| .ss-trigger-label { | |
| flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; | |
| color: var(--text-primary); | |
| } | |
| .ss-chev { color: var(--text-secondary); flex-shrink: 0; } | |
| .ss-sm .ss-trigger { font-size: 0.65rem; padding: 4px 8px; } | |
| .ss-md .ss-trigger { font-size: 0.75rem; } | |
| .ss-pop { | |
| position: absolute; top: calc(100% + 4px); left: 0; right: 0; | |
| z-index: 1000; | |
| background: rgba(29, 32, 33, 0.98); | |
| border: 1px solid rgba(255,255,255,0.1); | |
| border-radius: 6px; | |
| box-shadow: 0 8px 24px rgba(0,0,0,0.5); | |
| backdrop-filter: blur(12px); | |
| overflow: hidden; | |
| min-width: 220px; | |
| max-width: min(360px, 90vw); | |
| } | |
| .ss-search { | |
| position: relative; | |
| padding: 6px; | |
| border-bottom: 1px solid rgba(255,255,255,0.06); | |
| display: flex; align-items: center; gap: 6px; | |
| } | |
| .ss-search-icon { | |
| position: absolute; left: 12px; top: 50%; transform: translateY(-50%); | |
| color: var(--text-secondary); pointer-events: none; | |
| } | |
| .ss-search-input { | |
| flex: 1; width: 100%; | |
| background: rgba(0,0,0,0.25); | |
| border: 1px solid rgba(255,255,255,0.08); | |
| border-radius: 4px; | |
| padding: 5px 8px 5px 24px; | |
| font-size: 0.72rem; color: var(--text-primary); | |
| outline: none; | |
| font-family: inherit; | |
| } | |
| .ss-search-input:focus { border-color: rgba(250, 189, 47, 0.4); } | |
| .ss-list { | |
| max-height: 280px; | |
| overflow-y: auto; | |
| padding: 2px 0; | |
| } | |
| .ss-list::-webkit-scrollbar { width: 6px; } | |
| .ss-list::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.1); border-radius: 3px; } | |
| .ss-group-label { | |
| padding: 4px 10px 2px; | |
| font-size: 0.55rem; | |
| text-transform: uppercase; | |
| letter-spacing: 0.06em; | |
| color: var(--text-secondary); | |
| opacity: 0.7; | |
| display: flex; align-items: center; gap: 4px; | |
| } | |
| .ss-option { | |
| display: flex; align-items: center; gap: 6px; | |
| padding: 5px 10px; | |
| font-size: 0.72rem; | |
| color: var(--text-primary); | |
| cursor: pointer; | |
| user-select: none; | |
| } | |
| .ss-option:hover, .ss-option.ss-hl { | |
| background: rgba(250, 189, 47, 0.12); | |
| color: var(--accent); | |
| } | |
| .ss-option.ss-sel { | |
| background: rgba(142, 192, 124, 0.1); | |
| color: #8ec07c; | |
| font-weight: 500; | |
| } | |
| .ss-option.ss-sel.ss-hl { | |
| background: rgba(250, 189, 47, 0.18); | |
| } | |
| .ss-option-label { | |
| flex: 1; | |
| overflow: hidden; text-overflow: ellipsis; white-space: nowrap; | |
| } | |
| .ss-kind-icon { color: var(--text-secondary); flex-shrink: 0; } | |
| .ss-check { color: #8ec07c; flex-shrink: 0; } | |
| .ss-empty, .ss-more { | |
| padding: 8px 10px; | |
| font-size: 0.65rem; | |
| color: var(--text-secondary); | |
| font-style: italic; | |
| text-align: center; | |
| } | |
| .ss-more { border-top: 1px solid rgba(255,255,255,0.04); } | |
| /* βββ PERSONALITY PASS β shared controls βββ */ | |
| /* Personality overrides for .btn-primary removed β the base rule above is | |
| now flat chrome, and the overrides added gradient / bounce back. */ | |
| .btn-primary { | |
| font-family: var(--font-sans); | |
| font-weight: 500; | |
| border-radius: var(--chrome-radius-pill) ; | |
| transition: background var(--dur-fast), border-color var(--dur-fast), color var(--dur-fast); | |
| } | |
| .btn-primary:hover:not(:disabled) { transform: none; } | |
| .btn-primary:active:not(:disabled) { transform: none; } | |
| /* Soft focus ring on inputs */ | |
| .input-base:focus { | |
| border-color: var(--chrome-border-strong); | |
| box-shadow: 0 0 0 3px rgba(243, 165, 182, 0.12), inset 0 1px 2px rgba(0,0,0,0.25); | |
| } | |
| /* Preset chips β flat chrome pills. No rotation, no gradient, no squircle. */ | |
| .preset-grid { | |
| display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); | |
| gap: 6px; | |
| } | |
| .preset-btn { | |
| font-family: var(--font-sans) ; | |
| font-weight: 500 ; font-size: 0.74rem ; | |
| letter-spacing: 0.02em ; | |
| padding: 6px 12px ; | |
| border-radius: var(--chrome-radius-pill) ; | |
| background: transparent ; | |
| border: 1px solid var(--chrome-border) ; | |
| color: var(--chrome-fg-muted) ; | |
| box-shadow: none; | |
| transition: background var(--dur-fast), border-color var(--dur-fast), color var(--dur-fast); | |
| cursor: pointer; | |
| display: inline-flex; align-items: center; gap: 5px; | |
| } | |
| .preset-btn:nth-child(3n+1), | |
| .preset-btn:nth-child(3n+2), | |
| .preset-btn:nth-child(3n+3) { transform: none; } | |
| .preset-btn:hover:not(:disabled) { | |
| transform: none; | |
| background: var(--chrome-hover-bg); | |
| color: var(--chrome-fg); | |
| border-color: var(--chrome-border-strong); | |
| box-shadow: none; | |
| } | |
| .preset-btn.profile-active { | |
| background: var(--chrome-accent-bg) ; | |
| border-color: var(--chrome-accent-border) ; | |
| color: var(--chrome-accent) ; | |
| transform: none; | |
| box-shadow: none; | |
| } | |
| /* Tag / special-token chips β flat chrome, mono, no rotation */ | |
| .tags-container { | |
| display: flex; flex-wrap: wrap; gap: 4px; | |
| } | |
| .tag-btn { | |
| transition: background var(--dur-fast), border-color var(--dur-fast), color var(--dur-fast); | |
| font-family: var(--chrome-font-mono) ; | |
| font-weight: 500 ; | |
| font-size: 0.66rem ; | |
| padding: 3px 9px ; | |
| border-radius: var(--chrome-radius-pill) ; | |
| background: transparent ; | |
| border: 1px solid var(--chrome-border) ; | |
| color: var(--chrome-fg-muted) ; | |
| cursor: pointer; | |
| } | |
| .tag-btn:hover { | |
| transform: none; | |
| background: var(--chrome-hover-bg) ; | |
| color: var(--chrome-fg) ; | |
| border-color: var(--chrome-border-strong) ; | |
| } | |
| /* Chip-group for voice design attributes */ | |
| .chip-group { | |
| display: flex; flex-wrap: wrap; gap: 4px; | |
| } | |
| .chip-group .chip { | |
| font-family: var(--font-sans); | |
| font-weight: 500; font-size: 0.68rem; | |
| padding: 3px 10px; | |
| border-radius: var(--chrome-radius-pill); | |
| background: transparent; | |
| border: 1px solid var(--chrome-border); | |
| color: var(--chrome-fg-muted); cursor: pointer; | |
| transition: background var(--dur-fast), color var(--dur-fast), border-color var(--dur-fast); | |
| white-space: nowrap; | |
| } | |
| .chip-group .chip:hover { | |
| transform: none; | |
| color: var(--chrome-fg); | |
| background: var(--chrome-hover-bg); | |
| border-color: var(--chrome-border-strong); | |
| } | |
| .chip-group .chip.active { | |
| background: var(--chrome-accent-bg); | |
| border-color: var(--chrome-accent-border); | |
| color: var(--chrome-accent); | |
| box-shadow: none; | |
| } | |
| /* Textarea β flat chrome surface for design/clone prompt box */ | |
| textarea.input-base { | |
| background: var(--chrome-bg); | |
| font-family: var(--font-sans); | |
| font-size: 0.82rem; line-height: 1.55; | |
| color: var(--chrome-fg); | |
| border: 1px solid var(--chrome-border); | |
| border-radius: var(--chrome-radius-pill); | |
| padding: 12px 14px; | |
| } | |
| textarea.input-base:focus { | |
| border-color: var(--chrome-border-strong); | |
| } | |
| textarea.input-base::placeholder { | |
| color: var(--chrome-fg-dim); | |
| font-style: normal; | |
| } | |
| /* βββ GLOBAL POLISH β dub, modals, dropdowns, segments βββ */ | |
| /* Segment table β chrome header, subtle chrome hover on rows */ | |
| .segment-table { | |
| background: var(--chrome-bg); | |
| border: 1px solid var(--chrome-border); | |
| overflow: hidden; | |
| } | |
| .segment-header { | |
| font-family: var(--chrome-font-mono) ; | |
| font-weight: 600 ; | |
| font-size: var(--chrome-label-size) ; | |
| text-transform: uppercase; | |
| letter-spacing: var(--chrome-label-track); | |
| color: var(--chrome-fg-muted) ; | |
| background: var(--chrome-bg) ; | |
| border-bottom: 1px solid var(--chrome-border) ; | |
| padding: 6px 8px ; | |
| } | |
| .segment-row { | |
| transition: background var(--dur-fast); | |
| } | |
| .segment-row:hover { | |
| background: var(--chrome-hover-bg) ; | |
| } | |
| .segment-row.segment-active { | |
| background: var(--chrome-accent-bg) ; | |
| box-shadow: inset 2px 0 0 var(--chrome-accent); | |
| } | |
| .segment-row.segment-done { | |
| background: color-mix(in srgb, var(--chrome-severity-ok) 5%, transparent) ; | |
| } | |
| /* Segment inner inputs β chrome focus */ | |
| .segment-input { | |
| font-family: var(--font-sans) ; | |
| background: transparent ; | |
| border: 1px solid transparent ; | |
| transition: border-color var(--dur-fast), background var(--dur-fast) ; | |
| } | |
| .segment-input:focus { | |
| border-color: var(--chrome-border-strong) ; | |
| background: var(--chrome-hover-bg) ; | |
| } | |
| .segment-play, .segment-del { | |
| border-radius: var(--chrome-radius-pill) ; | |
| transition: background var(--dur-fast), color var(--dur-fast) ; | |
| } | |
| .segment-play:hover, .segment-del:hover { | |
| transform: none; | |
| } | |
| /* Override toggle + content */ | |
| .override-content { | |
| background: var(--chrome-bg); | |
| border: 1px solid var(--chrome-border); | |
| border-radius: var(--chrome-radius-pill); | |
| padding: 12px 14px; | |
| margin-top: 4px; | |
| } | |
| /* Searchable select popup β flat chrome, no warm gradient, no wobbly radius */ | |
| .ss-popover, .ss-menu, .ss-dropdown { | |
| background: var(--chrome-bg) ; | |
| border: 1px solid var(--chrome-border-strong) ; | |
| border-radius: var(--chrome-radius-pill) ; | |
| box-shadow: 0 14px 32px -14px rgba(0,0,0,0.6) ; | |
| backdrop-filter: none; | |
| -webkit-backdrop-filter: none; | |
| } | |
| .ss-item { | |
| font-family: var(--font-sans) ; | |
| color: var(--chrome-fg-muted) ; | |
| } | |
| .ss-item:hover, .ss-item.active, .ss-highlighted { | |
| background: var(--chrome-hover-bg) ; | |
| color: var(--chrome-fg) ; | |
| } | |
| /* Transcript block */ | |
| .override-toggle + div { | |
| background: var(--chrome-bg) ; | |
| border-color: var(--chrome-border) ; | |
| border-radius: 0 0 var(--chrome-radius-pill) var(--chrome-radius-pill) ; | |
| } | |
| /* Loader / spinner color to peach */ | |
| .spinner { color: var(--chrome-accent) ; } | |
| /* Range inputs β chrome-accent thumb, no glow halo. */ | |
| input[type="range"]::-webkit-slider-thumb { | |
| -webkit-appearance: none; appearance: none; | |
| width: 12px; height: 12px; border-radius: 50%; | |
| background: var(--chrome-accent); | |
| border: 2px solid var(--chrome-bg); | |
| box-shadow: none; | |
| cursor: pointer; | |
| } | |
| input[type="range"]::-moz-range-thumb { | |
| width: 12px; height: 12px; border-radius: 50%; | |
| background: var(--chrome-accent); border: 2px solid var(--chrome-bg); cursor: pointer; | |
| } | |
| /* Modal overlay β neutral backdrop */ | |
| [style*="backdropFilter"][style*="rgba(0,0,0,0.8"], | |
| [style*="backdrop-filter"][style*="rgba(0,0,0,0.85"] { | |
| background: rgba(0, 0, 0, 0.7) ; | |
| } | |
| .glass-panel select.input-base { | |
| font-family: var(--font-sans); | |
| font-weight: 500; | |
| } | |
| /* AudioTrimmer modal interior glass panel β flat chrome */ | |
| .audio-trimmer, | |
| div[role="dialog"].audio-trimmer { | |
| background: var(--chrome-bg) ; | |
| border: 1px solid var(--chrome-border-strong) ; | |
| border-radius: var(--chrome-radius-pill) ; | |
| } | |
| /* Labels β chrome mono */ | |
| .label-row { | |
| font-family: var(--chrome-font-mono); | |
| font-weight: 500; | |
| color: var(--chrome-fg-muted); | |
| } | |
| .label-icon { color: var(--chrome-fg-muted) ; } | |
| /* Override toggle (Production Overrides) β flat chrome */ | |
| .override-toggle { | |
| font-family: var(--font-sans); | |
| font-weight: 500; | |
| border-radius: var(--chrome-radius-pill); | |
| } | |
| /* File drop zone β flat chrome, no squircle, no hover lift */ | |
| .file-drag { | |
| border-radius: var(--chrome-radius-pill) ; | |
| transition: border-color var(--dur-fast), background var(--dur-fast); | |
| } | |
| .file-drag:hover { | |
| transform: none; | |
| } | |
| .file-drag p { | |
| font-family: var(--font-sans); | |
| font-weight: 500; | |
| } | |
| /* Section tab buttons (sidebar) */ | |
| /* Sidebar item β compact card with hover-reveal actions */ | |
| .history-item { | |
| border-radius: var(--chrome-radius-pill) ; | |
| background: transparent ; | |
| border: 1px solid var(--chrome-border) ; | |
| padding: 6px 8px ; | |
| margin-bottom: 3px; | |
| position: relative; | |
| display: flex; flex-direction: column; gap: 2px; | |
| transition: background var(--dur-fast), border-color var(--dur-fast); | |
| } | |
| .history-item::before { | |
| content: ""; position: absolute; left: -1px; top: 10%; bottom: 10%; width: 2px; | |
| background: var(--row-accent, var(--chrome-accent)); | |
| opacity: 0; transition: opacity var(--dur-fast); | |
| } | |
| .history-item:hover { | |
| background: var(--chrome-hover-bg) ; | |
| border-color: var(--chrome-border-strong) ; | |
| } | |
| .history-item:hover::before { opacity: 1; } | |
| .history-item.project-active { | |
| background: color-mix(in srgb, #b8bb26 10%, transparent) ; | |
| border-color: color-mix(in srgb, #b8bb26 40%, transparent) ; | |
| } | |
| .history-item.project-active::before { | |
| opacity: 1; background: #b8bb26; | |
| } | |
| /* Header row: kind pill + time */ | |
| .history-row-head { | |
| display: flex; align-items: center; justify-content: space-between; | |
| gap: 8px; min-width: 0; | |
| } | |
| .history-kind { | |
| display: inline-flex; align-items: center; gap: 4px; | |
| font-family: var(--chrome-font-mono); | |
| font-size: var(--chrome-label-size); font-weight: 600; | |
| padding: 1px 7px; border-radius: var(--chrome-radius-pill); | |
| letter-spacing: var(--chrome-label-track); text-transform: uppercase; | |
| background: transparent; | |
| border: 1px solid var(--chrome-border); | |
| color: var(--chrome-fg-muted); | |
| flex-shrink: 0; | |
| } | |
| .history-meta { | |
| font-family: var(--chrome-font-mono); | |
| font-size: 0.6rem; color: var(--chrome-fg-dim); font-weight: 500; | |
| white-space: nowrap; | |
| } | |
| /* Primary name/title line */ | |
| .history-title { | |
| font-family: var(--font-sans); | |
| font-size: 0.78rem; font-weight: 600; | |
| color: var(--chrome-fg); line-height: 1.2; | |
| letter-spacing: 0.01em; | |
| white-space: nowrap; overflow: hidden; text-overflow: ellipsis; | |
| } | |
| .history-subtitle { | |
| font-family: var(--font-sans); | |
| font-size: 0.62rem; color: var(--chrome-fg-dim); font-weight: 500; | |
| white-space: nowrap; overflow: hidden; text-overflow: ellipsis; | |
| } | |
| /* Action row β visible on hover, always visible on focus-within */ | |
| .history-actions { | |
| display: flex; gap: 4px; margin-top: 2px; | |
| opacity: 0; max-height: 0; | |
| overflow: hidden; | |
| transition: opacity 0.2s, max-height 0.2s; | |
| } | |
| .history-item:hover .history-actions, | |
| .history-item:focus-within .history-actions { | |
| opacity: 1; max-height: 40px; | |
| } | |
| .history-action-btn { | |
| flex: 1; | |
| display: inline-flex; align-items: center; justify-content: center; gap: 4px; | |
| padding: 4px 8px; | |
| background: transparent; | |
| border: 1px solid var(--chrome-border); | |
| border-radius: var(--chrome-radius-pill); | |
| color: var(--chrome-fg-muted); | |
| font-family: var(--font-sans); | |
| font-size: 0.62rem; font-weight: 500; | |
| letter-spacing: 0.02em; | |
| cursor: pointer; | |
| transition: background var(--dur-fast), color var(--dur-fast), border-color var(--dur-fast); | |
| white-space: nowrap; | |
| } | |
| .history-action-btn:hover { | |
| background: var(--chrome-hover-bg); | |
| color: var(--chrome-fg); | |
| border-color: var(--chrome-border-strong); | |
| } | |
| .history-action-btn.danger:hover { | |
| background: color-mix(in srgb, var(--chrome-severity-err) 12%, transparent); | |
| color: var(--chrome-severity-err); | |
| border-color: color-mix(in srgb, var(--chrome-severity-err) 45%, transparent); | |
| } | |
| .history-action-btn.accent:hover { | |
| background: color-mix(in srgb, #b8bb26 12%, transparent); | |
| color: #b8bb26; | |
| border-color: color-mix(in srgb, #b8bb26 45%, transparent); | |
| } | |
| .history-action-icon { | |
| width: 26px; flex: 0 0 auto; padding: 4px 6px; | |
| } | |
| /* Wobbly glass panels β applied broadly except sidebar/history panel */ | |
| .glass-panel { | |
| border-radius: 14px 18px 12px 20px / 16px 12px 18px 14px; | |
| } | |
| .glass-panel.history-panel, | |
| .glass-panel[data-square="1"] { | |
| border-radius: 0; | |
| } | |
| /* Segment table β keep rectangular for virtualized rows */ | |
| .segment-table, | |
| .segment-row, | |
| .segment-header { | |
| border-radius: 0 ; | |
| } | |
| /* βββ SETTINGS PAGE βββ */ | |
| .settings-page { | |
| flex: 1; display: flex; flex-direction: column; overflow-y: auto; | |
| background: var(--chrome-bg); | |
| padding: 28px 40px 48px; | |
| font-family: var(--font-sans); | |
| } | |
| .settings-page h1 { | |
| font-family: var(--font-sans); | |
| font-weight: 600; font-size: 1.4rem; margin: 0 0 6px; | |
| color: var(--chrome-fg); letter-spacing: -0.01em; | |
| } | |
| .settings-page .settings-subtitle { | |
| color: var(--chrome-fg-muted); font-size: 0.78rem; margin-bottom: 24px; | |
| } | |
| /* Settings section β chrome-flat frame to match the rest of the app. | |
| Keeps the content-forward padding; drops the warm gradient + squircle | |
| corners + drop-shadow so it reads as a panel, not a jewel. */ | |
| .settings-section { | |
| background: var(--chrome-bg); | |
| border: 1px solid var(--chrome-border); | |
| border-radius: var(--chrome-radius-pill); | |
| padding: 14px 18px; margin-bottom: 12px; | |
| } | |
| /* Section heading β chrome label, same typographic rhythm as "LOGS" | |
| and sidebar section titles. */ | |
| .settings-section h2 { | |
| font-family: var(--chrome-font-mono); | |
| font-size: var(--chrome-label-size); | |
| font-weight: 600; | |
| color: var(--chrome-fg-muted); | |
| text-transform: uppercase; | |
| letter-spacing: var(--chrome-label-track); | |
| margin: 0 0 10px; display: flex; align-items: center; gap: 8px; | |
| } | |
| .settings-row { | |
| display: flex; justify-content: space-between; align-items: center; | |
| padding: 8px 0; border-bottom: 1px solid var(--chrome-border); | |
| font-family: var(--font-sans); | |
| font-size: 0.76rem; | |
| } | |
| .settings-row:last-child { border-bottom: none; } | |
| .settings-row .label { color: var(--chrome-fg); font-weight: 500; letter-spacing: 0.01em; } | |
| /* Informational readout, not a button β no pill shell. The monospace | |
| font alone signals "this is data"; bg/border would masquerade as | |
| interactive. */ | |
| .settings-row .value { | |
| color: var(--chrome-fg-muted); | |
| font-family: var(--chrome-font-mono); | |
| font-size: 0.76rem; | |
| background: transparent; | |
| border: none; | |
| padding: 0; | |
| } | |
| .settings-log { | |
| background: var(--chrome-bg); | |
| border: 1px solid var(--chrome-border); | |
| border-radius: var(--chrome-radius-pill); | |
| padding: 10px 12px; | |
| max-height: 280px; overflow: auto; | |
| font-family: var(--chrome-font-mono); | |
| font-size: 0.72rem; color: var(--chrome-fg-muted); | |
| white-space: pre-wrap; word-break: break-word; | |
| } | |
| /* βββ Settings β badge, tabs, subtabs migrated to ui/Badge + ui/Tabs + ui/Segmented βββ */ | |
| /* Studio panels β flat chrome surface. Radial warmth + paper grain removed | |
| so Clone / Design / Dub panes sit on the same neutral frame as the rest | |
| of the chrome-tokenized app. */ | |
| .studio-panel { | |
| background: var(--chrome-bg); | |
| border: 1px solid var(--chrome-border); | |
| border-radius: 0; | |
| padding: 14px 16px; | |
| position: relative; | |
| overflow: auto; | |
| display: flex; flex-direction: column; | |
| min-height: 0; | |
| } | |
| .studio-panel::before { display: none; } | |
| .studio-panel > * { position: relative; z-index: 1; } | |
| .studio-column { | |
| display: grid; grid-template-rows: minmax(0, 1fr) auto; | |
| gap: 6px; min-height: 0; | |
| } | |
| /* βββ NAV RAIL βββ */ | |
| /* Flattened to chrome: same dark bg + hairline border as the top/bottom | |
| bars so the three chrome edges (top, side, bottom) read as one frame. | |
| Active-view indicator (accent bar + coloured button) still carries the | |
| brand warmth; flipping-side tooltip labels are flattened too. */ | |
| .nav-rail { | |
| display: flex; flex-direction: column; align-items: center; | |
| padding: 8px 0; | |
| background: var(--chrome-bg); | |
| border-right: 1px solid var(--chrome-border); | |
| gap: 6px; | |
| user-select: none; | |
| } | |
| .nav-rail.rail-right { | |
| border-right: none; | |
| border-left: 1px solid var(--chrome-border); | |
| } | |
| .nav-rail .rail-top { display: flex; flex-direction: column; gap: 4px; flex: 1; align-items: center; } | |
| .nav-rail .rail-bottom { display: flex; flex-direction: column; gap: 4px; align-items: center; } | |
| .rail-btn { | |
| position: relative; | |
| width: 36px; height: 36px; | |
| display: inline-flex; align-items: center; justify-content: center; | |
| background: transparent; | |
| border: 1px solid transparent; | |
| border-radius: var(--chrome-radius-pill); | |
| color: var(--chrome-fg-dim); | |
| cursor: pointer; | |
| transition: background 0.14s, color 0.14s, border-color 0.14s; | |
| } | |
| .rail-btn:hover { | |
| color: var(--chrome-fg); | |
| background: var(--chrome-hover-bg); | |
| } | |
| .rail-btn.active { | |
| color: var(--rail-accent, var(--chrome-accent)); | |
| background: color-mix(in srgb, var(--rail-accent, var(--chrome-accent)) 12%, transparent); | |
| border-color: color-mix(in srgb, var(--rail-accent, var(--chrome-accent)) 35%, transparent); | |
| } | |
| .rail-btn.active::before { | |
| content: ""; position: absolute; left: -8px; top: 20%; bottom: 20%; width: 3px; | |
| background: var(--rail-accent, #f3a5b6); | |
| border-radius: 2px; | |
| box-shadow: 0 0 10px color-mix(in srgb, var(--rail-accent, #f3a5b6) 50%, transparent); | |
| } | |
| .nav-rail.rail-right .rail-btn.active::before { | |
| left: auto; right: -8px; | |
| } | |
| /* Hide text label (icons only) β but keep for a11y tooltip via title */ | |
| .nav-rail { z-index: 50; } | |
| .rail-btn .rail-label { | |
| position: absolute; left: 46px; top: 50%; transform: translate(-4px, -50%); | |
| padding: 3px 8px; | |
| background: var(--chrome-bg); | |
| border: 1px solid var(--chrome-border-strong); | |
| border-radius: var(--chrome-radius-pill); | |
| color: var(--chrome-fg); | |
| font-family: var(--font-sans); | |
| font-weight: 500; | |
| font-size: 11px; | |
| white-space: nowrap; pointer-events: none; | |
| opacity: 0; | |
| transition: opacity 0.15s, transform 0.15s; | |
| z-index: 10000; | |
| } | |
| .nav-rail.rail-right .rail-btn .rail-label { | |
| left: auto; right: 48px; | |
| transform: translate(4px, -50%); | |
| } | |
| .rail-btn:hover .rail-label { | |
| opacity: 1; | |
| transform: translate(0, -50%); | |
| } | |
| .rail-btn.rail-flip { | |
| margin-top: 6px; | |
| border-top: 1px solid var(--chrome-border); | |
| padding-top: 10px; | |
| border-radius: 0; | |
| height: 30px; | |
| color: var(--chrome-fg-dim); | |
| } | |
| .rail-btn.rail-flip:hover { | |
| color: var(--chrome-accent); | |
| background: transparent; | |
| transform: rotate(180deg); | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| RESPONSIVE β make every component adapt to viewport width | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| /* ββ DubTab + CloneDesignTab split grids β single column ββ */ | |
| @media (max-width: 1000px) { | |
| .dub-split-grid { | |
| grid-template-columns: 1fr ; | |
| grid-template-rows: auto 1fr ; | |
| } | |
| .clone-split-grid { | |
| grid-template-columns: 1fr ; | |
| } | |
| .clone-split-grid .studio-column:first-child { | |
| max-height: 45vh; | |
| } | |
| } | |
| /* ββ Grid utilities collapse ββ */ | |
| @media (max-width: 700px) { | |
| .grid-2 { grid-template-columns: 1fr ; } | |
| .grid-3 { grid-template-columns: 1fr 1fr ; } | |
| } | |
| @media (max-width: 500px) { | |
| .grid-3 { grid-template-columns: 1fr ; } | |
| .grid-4 { grid-template-columns: 1fr 1fr ; } | |
| } | |
| /* ββ Launchpad ββ */ | |
| @media (max-width: 900px) { | |
| .lp-hero { padding: 24px 20px 16px; } | |
| .lp-hero h1 { font-size: 1.8rem; } | |
| .lp-hero p { font-size: 0.85rem; } | |
| .lp-actions { padding: 0 20px 16px; gap: 12px; flex-wrap: wrap; } | |
| .lp-action-card { min-width: 0; flex: 1 1 200px; padding: 14px 12px; } | |
| .lp-action-card:nth-child(1), | |
| .lp-action-card:nth-child(2), | |
| .lp-action-card:nth-child(3) { transform: none; } | |
| .lp-section { padding: 0 20px 24px; } | |
| } | |
| @media (max-width: 640px) { | |
| .lp-hero h1 { font-size: 1.4rem; } | |
| .lp-hero p { font-size: 0.78rem; max-width: 100%; } | |
| .lp-actions { flex-direction: column; padding: 0 12px 12px; } | |
| .lp-action-card { min-height: auto; padding: 12px 10px; } | |
| .lp-action-card h3 { font-size: 0.88rem; } | |
| .lp-action-card .card-desc { font-size: 0.68rem; -webkit-line-clamp: 2; } | |
| .lp-action-card .card-icon { width: 28px; height: 28px; } | |
| .lp-section { padding: 0 12px 16px; } | |
| } | |
| /* ββ Studio panels β tighter on small screens ββ */ | |
| @media (max-width: 800px) { | |
| .studio-panel { padding: 10px 10px; } | |
| .studio-panel .label-row { font-size: 0.68rem; } | |
| } | |
| @media (max-width: 600px) { | |
| .studio-panel { padding: 8px 6px; } | |
| } | |
| /* ββ DubTab settings bar wrap ββ */ | |
| @media (max-width: 900px) { | |
| .dub-settings-bar { | |
| flex-direction: column ; | |
| gap: 6px ; | |
| } | |
| .dub-settings-bar > div { min-width: 0 ; width: 100%; } | |
| } | |
| /* ββ DubTab footer buttons β wrap on narrow ββ */ | |
| @media (max-width: 800px) { | |
| .dub-footer-btns { | |
| flex-wrap: wrap ; | |
| } | |
| .dub-footer-btns .btn-primary { | |
| min-width: 80px; | |
| flex: 1 1 calc(50% - 4px) ; | |
| } | |
| } | |
| @media (max-width: 500px) { | |
| .dub-footer-btns .btn-primary { | |
| flex: 1 1 100% ; | |
| } | |
| } | |
| /* ββ Segment table β tighter columns ββ */ | |
| @media (max-width: 800px) { | |
| .segment-time { width: 45px ; font-size: 0.58rem ; } | |
| .segment-row { padding: 2px 4px; } | |
| .segment-header { padding: 2px 4px; font-size: 0.58rem; } | |
| } | |
| /* ββ Waveform timeline β reduce height on small screens ββ */ | |
| @media (max-width: 800px) { | |
| .waveform-container { height: 60px ; } | |
| } | |
| /* ββ Tabs β scroll instead of squish on narrow ββ */ | |
| @media (max-width: 600px) { | |
| .tabs { overflow-x: auto; -webkit-overflow-scrolling: touch; } | |
| .tab { flex: 0 0 auto; padding: 5px 10px; font-size: 0.65rem; } | |
| } | |
| /* ββ Preset grid β 2 columns on narrow ββ */ | |
| @media (max-width: 700px) { | |
| .preset-grid { grid-template-columns: 1fr 1fr ; } | |
| } | |
| @media (max-width: 500px) { | |
| .preset-grid { grid-template-columns: 1fr ; } | |
| } | |
| /* ββ Chip groups β wrap gracefully ββ */ | |
| .chip-group { flex-wrap: wrap; } | |
| /* ββ Compare modal β stack on narrow ββ */ | |
| @media (max-width: 800px) { | |
| .compare-grid { | |
| grid-template-columns: 1fr ; | |
| } | |
| } | |
| /* ββ General: prevent horizontal overflow everywhere ββ */ | |
| @media (max-width: 600px) { | |
| body { font-size: 11px; } | |
| .btn-primary { font-size: 0.7rem; padding: 5px 8px; } | |
| .input-base { font-size: 0.7rem; } | |
| select.input-base { font-size: 0.7rem; } | |
| } | |
| /* βββ CAPTURE / DICTATION PILL HOST βββ */ | |
| /* Positions the CaptureWidget pill at top-center of the main window. | |
| Non-blocking β no dark backdrop, no modal trap. */ | |
| .capture-pill-host { | |
| position: fixed; | |
| top: 48px; | |
| left: 50%; | |
| transform: translateX(-50%); | |
| z-index: 9999; | |
| pointer-events: none; | |
| } | |
| .capture-pill-host > * { | |
| pointer-events: auto; | |
| } | |