72520d56e6
Major CSS refactor for video player components: improves subtitle styling and cross-browser positioning, restructures ControlsLayer and VideoElement styles for clarity and responsiveness, and updates custom properties for better subtitle/controls separation. Adds a local settings file for permissions.
152 lines
3.5 KiB
CSS
152 lines
3.5 KiB
CSS
/* ============================================
|
|
VIDEO PLAYER - CSS Custom Properties
|
|
============================================ */
|
|
|
|
:root {
|
|
/* ==================== COLORS ==================== */
|
|
|
|
/* Primary Theme - Red */
|
|
--player-primary: #ef4444;
|
|
--player-primary-hover: #dc2626;
|
|
--player-primary-active: #b91c1c;
|
|
--player-primary-light: rgba(239, 68, 68, 0.2);
|
|
|
|
/* Background Colors */
|
|
--player-bg: #000000;
|
|
--player-bg-controls: rgba(0, 0, 0, 0.85);
|
|
--player-bg-overlay: rgba(0, 0, 0, 0.6);
|
|
--player-bg-menu: rgba(20, 20, 20, 0.95);
|
|
|
|
/* Text Colors */
|
|
--player-text: #ffffff;
|
|
--player-text-secondary: #d1d5db;
|
|
--player-text-muted: #9ca3af;
|
|
|
|
/* Border & Divider */
|
|
--player-border: #374151;
|
|
--player-divider: rgba(255, 255, 255, 0.1);
|
|
|
|
/* Progress Bar */
|
|
--player-buffered: rgba(239, 68, 68, 0.3);
|
|
--player-progress-bg: rgba(255, 255, 255, 0.3);
|
|
|
|
/* ==================== SUBTITLES ==================== */
|
|
|
|
/* Subtitle Appearance */
|
|
--player-subtitle-color: #f9fafb;
|
|
--player-subtitle-bg: rgba(15, 15, 18, 0.78);
|
|
--player-subtitle-shadow: 0 12px 28px rgba(0, 0, 0, 0.55);
|
|
--player-subtitle-max-width: 88%;
|
|
|
|
/* Subtitle Positioning
|
|
CRITICAL: This value MUST be larger than the controls bar height
|
|
to prevent subtitles from overlapping with controls.
|
|
|
|
Controls height calculation:
|
|
- Progress bar: ~20px
|
|
- Progress margin-bottom: 14px (--player-spacing-md)
|
|
- Controls padding-top: 28px (--player-spacing-xl)
|
|
- Controls padding-bottom: 20px (--player-spacing-lg)
|
|
- Controls row (buttons): ~36-40px
|
|
- Total: ~118-122px
|
|
|
|
We use 132px minimum (122px + 10px safety margin)
|
|
*/
|
|
--player-subtitle-bottom-offset: clamp(132px, 13vh, 180px);
|
|
|
|
/* ==================== SHADOWS ==================== */
|
|
|
|
--player-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
|
|
--player-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
|
|
--player-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
|
|
|
|
/* ==================== TRANSITIONS ==================== */
|
|
|
|
--player-transition-fast: 150ms;
|
|
--player-transition-normal: 250ms;
|
|
--player-transition-slow: 400ms;
|
|
|
|
/* ==================== Z-INDEX LAYERS ==================== */
|
|
|
|
--player-z-video: 1;
|
|
--player-z-subtitle: 10;
|
|
--player-z-controls: 20;
|
|
--player-z-menu: 30;
|
|
--player-z-loading: 40;
|
|
|
|
/* ==================== SPACING ==================== */
|
|
|
|
--player-spacing-xs: 6px;
|
|
--player-spacing-sm: 10px;
|
|
--player-spacing-md: 14px;
|
|
--player-spacing-lg: 20px;
|
|
--player-spacing-xl: 28px;
|
|
|
|
/* ==================== BORDER RADIUS ==================== */
|
|
|
|
--player-radius-sm: 4px;
|
|
--player-radius-md: 6px;
|
|
--player-radius-lg: 8px;
|
|
--player-radius-full: 9999px;
|
|
|
|
/* ==================== ICON SIZES ==================== */
|
|
|
|
--player-icon-sm: 20px;
|
|
--player-icon-md: 28px;
|
|
--player-icon-lg: 36px;
|
|
--player-icon-xl: 56px;
|
|
}
|
|
|
|
/* ============================================
|
|
ANIMATIONS
|
|
============================================ */
|
|
|
|
@keyframes spin {
|
|
from {
|
|
transform: rotate(0deg);
|
|
}
|
|
to {
|
|
transform: rotate(360deg);
|
|
}
|
|
}
|
|
|
|
@keyframes fadeIn {
|
|
from {
|
|
opacity: 0;
|
|
}
|
|
to {
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
@keyframes fadeOut {
|
|
from {
|
|
opacity: 1;
|
|
}
|
|
to {
|
|
opacity: 0;
|
|
}
|
|
}
|
|
|
|
@keyframes slideUp {
|
|
from {
|
|
transform: translateY(20px);
|
|
opacity: 0;
|
|
}
|
|
to {
|
|
transform: translateY(0);
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
@keyframes slideDown {
|
|
from {
|
|
transform: translateY(-20px);
|
|
opacity: 0;
|
|
}
|
|
to {
|
|
transform: translateY(0);
|
|
opacity: 1;
|
|
}
|
|
}
|