From 482879ba0970799da1c558e9eca31406bc91e710 Mon Sep 17 00:00:00 2001 From: Warren Lo Date: Thu, 19 Mar 2026 01:12:00 +0800 Subject: [PATCH] Add styles.css --- web/styles.css | 357 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 357 insertions(+) create mode 100644 web/styles.css diff --git a/web/styles.css b/web/styles.css new file mode 100644 index 0000000..420c985 --- /dev/null +++ b/web/styles.css @@ -0,0 +1,357 @@ +:root { + --bg-primary: #1e1e1e; + --bg-secondary: #2d2d2d; + --bg-tertiary: #3d3d3d; + --text-primary: #ffffff; + --text-secondary: #aaaaaa; + --accent: #007acc; + --accent-hover: #0098ff; + --error: #f44747; + --success: #4ec9b0; + --warning: #dcdcaa; + --border: #404040; + + --font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + --font-mono: 'SF Mono', Monaco, 'Cascadia Code', monospace; + + --spacing-xs: 4px; + --spacing-sm: 8px; + --spacing-md: 16px; + --spacing-lg: 24px; + + --radius-sm: 4px; + --radius-md: 8px; +} + +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + font-family: var(--font-family); + background: var(--bg-primary); + color: var(--text-primary); + overflow: hidden; + user-select: none; +} + +#app { + display: flex; + flex-direction: column; + height: 100vh; + width: 100vw; +} + +.toolbar { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--spacing-sm) var(--spacing-md); + background: var(--bg-secondary); + border-bottom: 1px solid var(--border); + gap: var(--spacing-md); +} + +.toolbar-left, +.toolbar-center, +.toolbar-right { + display: flex; + align-items: center; + gap: var(--spacing-sm); +} + +.toolbar-center { + flex: 1; + justify-content: center; +} + +.viewport { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + background: #000; + overflow: hidden; + position: relative; +} + +.media-container { + position: relative; + transform-origin: center center; +} + +#video-canvas { + display: block; + max-width: 100%; + max-height: 100%; +} + +.subtitle-overlay { + position: absolute; + bottom: 60px; + left: 50%; + transform: translateX(-50%); + background: rgba(0, 0, 0, 0.75); + padding: var(--spacing-sm) var(--spacing-md); + border-radius: var(--radius-md); + max-width: 80%; + text-align: center; + opacity: 0; + transition: opacity 0.2s; +} + +.subtitle-overlay.visible { + opacity: 1; +} + +#subtitle-text { + font-size: 18px; + line-height: 1.4; + color: #fff; +} + +.progress-container { + position: relative; + padding: var(--spacing-sm) var(--spacing-md); + background: var(--bg-secondary); + border-top: 1px solid var(--border); +} + +.chunk-markers { + position: absolute; + top: var(--spacing-sm); + left: var(--spacing-md); + right: var(--spacing-md); + height: 8px; + pointer-events: none; +} + +.chunk-marker { + position: absolute; + width: 2px; + height: 8px; + background: var(--accent); + top: 0; +} + +.progress-bar { + width: 100%; + height: 8px; + cursor: pointer; + -webkit-appearance: none; + background: var(--bg-tertiary); + border-radius: var(--radius-sm); +} + +.progress-bar::-webkit-slider-thumb { + -webkit-appearance: none; + width: 16px; + height: 16px; + background: var(--accent); + border-radius: 50%; + cursor: pointer; +} + +.time-display { + display: flex; + gap: var(--spacing-xs); + margin-top: var(--spacing-xs); + font-family: var(--font-mono); + font-size: 12px; + color: var(--text-secondary); +} + +.controls { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--spacing-sm) var(--spacing-md); + background: var(--bg-secondary); + border-top: 1px solid var(--border); +} + +.controls-left, +.controls-center, +.controls-right { + display: flex; + align-items: center; + gap: var(--spacing-sm); +} + +.btn { + padding: var(--spacing-sm) var(--spacing-md); + background: var(--bg-tertiary); + border: 1px solid var(--border); + border-radius: var(--radius-sm); + color: var(--text-primary); + cursor: pointer; + font-size: 14px; + transition: background 0.15s, border-color 0.15s; +} + +.btn:hover { + background: var(--accent); + border-color: var(--accent); +} + +.btn:active { + background: var(--accent-hover); +} + +.btn-icon { + padding: var(--spacing-sm); + min-width: 36px; + text-align: center; +} + +.btn-toggle { + min-width: 32px; + font-weight: bold; +} + +.btn-toggle[data-active="true"] { + background: var(--accent); + border-color: var(--accent); +} + +.input { + padding: var(--spacing-sm) var(--spacing-md); + background: var(--bg-tertiary); + border: 1px solid var(--border); + border-radius: var(--radius-sm); + color: var(--text-primary); + font-size: 14px; + min-width: 200px; +} + +.input:focus { + outline: none; + border-color: var(--accent); +} + +.select { + padding: var(--spacing-sm); + background: var(--bg-tertiary); + border: 1px solid var(--border); + border-radius: var(--radius-sm); + color: var(--text-primary); + font-size: 14px; + cursor: pointer; +} + +.volume-control { + display: flex; + align-items: center; + gap: var(--spacing-xs); +} + +.volume-slider { + width: 80px; + height: 4px; + -webkit-appearance: none; + background: var(--bg-tertiary); + border-radius: var(--radius-sm); +} + +.volume-slider::-webkit-slider-thumb { + -webkit-appearance: none; + width: 12px; + height: 12px; + background: var(--text-primary); + border-radius: 50%; + cursor: pointer; +} + +.overlay-toggles { + display: flex; + gap: var(--spacing-xs); +} + +.status-bar { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--spacing-xs) var(--spacing-md); + background: var(--bg-tertiary); + font-size: 12px; + color: var(--text-secondary); +} + +.status-center { + font-family: var(--font-mono); +} + +.search-panel { + position: absolute; + top: 60px; + right: var(--spacing-md); + width: 400px; + background: var(--bg-secondary); + border: 1px solid var(--border); + border-radius: var(--radius-md); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); + z-index: 100; +} + +.search-header { + display: flex; + gap: var(--spacing-sm); + padding: var(--spacing-md); + border-bottom: 1px solid var(--border); +} + +.search-header .input { + flex: 1; + min-width: 0; +} + +.search-results { + max-height: 400px; + overflow-y: auto; +} + +.search-result { + padding: var(--spacing-sm) var(--spacing-md); + border-bottom: 1px solid var(--border); + cursor: pointer; +} + +.search-result:hover { + background: var(--bg-tertiary); +} + +.search-result-time { + font-family: var(--font-mono); + font-size: 12px; + color: var(--accent); +} + +.search-result-text { + font-size: 14px; + margin-top: var(--spacing-xs); +} + +.keyboard-hint { + position: fixed; + bottom: var(--spacing-md); + right: var(--spacing-md); + background: var(--bg-secondary); + border: 1px solid var(--border); + border-radius: var(--radius-md); + padding: var(--spacing-md); + font-size: 12px; + color: var(--text-secondary); + opacity: 0.7; +} + +.keyboard-hint kbd { + display: inline-block; + padding: 2px 6px; + background: var(--bg-tertiary); + border: 1px solid var(--border); + border-radius: var(--radius-sm); + font-family: var(--font-mono); + margin: 0 2px; +}