+ + + + +
+
@@ -325,6 +413,9 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) {
+ diff --git a/static/css/components.css b/static/css/components.css index 3d38e40..900e42d 100644 --- a/static/css/components.css +++ b/static/css/components.css @@ -806,6 +806,246 @@ .video-responsive-tablet .video-player__header { padding: var(--spacing-3) var(--spacing-4) !important; } .video-responsive-desktop .video-player__header { padding: var(--spacing-4) var(--spacing-6) !important; } +/* ================================================================= + DASHBOARD COMPONENTS + ================================================================= */ + +/* Dashboard header */ +.dashboard__header { + background: linear-gradient(135deg, var(--dodgers-blue-600) 0%, var(--dodgers-blue-400) 100%); + padding: var(--spacing-4) var(--spacing-5); + color: white; + display: flex; + align-items: center; + justify-content: space-between; + box-shadow: var(--elevation-2); + z-index: 5; + border-bottom: 1px solid var(--dodgers-blue-300); +} + +.dashboard__title { + font-size: var(--font-size-lg); + font-weight: var(--font-weight-semibold); + display: flex; + align-items: center; + gap: var(--spacing-2); +} + +.dashboard__title::before { + content: ''; + display: inline-block; + width: 1em; + height: 1em; + background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z'%3E%3C/svg%3E") no-repeat center center; + background-size: contain; + margin-right: var(--spacing-2); +} + +.dashboard__controls { + display: flex; + gap: var(--spacing-2); +} + +.dashboard__toggle-btn { + background: rgba(255,255,255,0.2); + border: 1px solid rgba(255,255,255,0.3); + color: white; + padding: var(--spacing-2) var(--spacing-3); + border-radius: var(--border-radius-lg); + cursor: pointer; + font-size: var(--font-size-sm); + transition: all var(--transition-fast); + backdrop-filter: blur(10px); +} + +.dashboard__toggle-btn:hover { + background: rgba(255,255,255,0.3); + transform: translateY(-1px); +} + +/* Stats grid */ +.dashboard__stats-grid { + display: grid; + gap: var(--spacing-3); + padding: var(--spacing-4) var(--spacing-5) var(--spacing-3); + grid-template-columns: 1fr; +} + +.stats-card { + background: var(--color-surface); + border-radius: var(--border-radius-lg); + padding: var(--spacing-4); + border: 1px solid var(--color-outline-variant); + display: flex; + align-items: center; + gap: var(--spacing-3); + transition: all var(--transition-fast); + box-shadow: var(--elevation-1); +} + +.stats-card:hover { + transform: translateY(-2px); + box-shadow: var(--elevation-3); +} + +.stats-card__icon { + width: 48px; + height: 48px; + background: linear-gradient(135deg, var(--dodgers-blue-500), var(--dodgers-blue-300)); + border-radius: var(--border-radius-lg); + display: flex; + align-items: center; + justify-content: center; + color: white; + flex-shrink: 0; +} + +.stats-card__content { + flex: 1; + min-width: 0; +} + +.stats-card__value { + font-size: var(--font-size-2xl); + font-weight: var(--font-weight-bold); + color: var(--text-primary); + margin-bottom: var(--spacing-1); +} + +.stats-card__label { + font-size: var(--font-size-sm); + color: var(--text-muted); + font-weight: var(--font-weight-medium); +} + +/* Dashboard widgets */ +.dashboard__widgets { + flex: 1; + overflow-y: auto; + padding: var(--spacing-4) var(--spacing-5); + display: flex; + flex-direction: column; + gap: var(--spacing-4); +} + +.widget { + background: var(--color-surface); + border-radius: var(--border-radius-lg); + border: 1px solid var(--color-outline-variant); + box-shadow: var(--elevation-1); + overflow: hidden; +} + +.widget__header { + padding: var(--spacing-4); + border-bottom: 1px solid var(--color-outline-variant); + background: var(--color-surface-variant); +} + +.widget__title { + font-size: var(--font-size-base); + font-weight: var(--font-weight-semibold); + color: var(--text-primary); + margin: 0; +} + +.widget__content { + padding: var(--spacing-4); +} + +/* Activity items */ +.activity-item, +.user-item { + display: flex; + align-items: center; + gap: var(--spacing-3); + padding: var(--spacing-2) 0; + border-bottom: 1px solid var(--color-outline-variant); +} + +.activity-item:last-child, +.user-item:last-child { + border-bottom: none; +} + +.activity-item__avatar { + width: 32px; + height: 32px; + background: var(--dodgers-blue-500); + color: white; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: var(--font-size-sm); + flex-shrink: 0; +} + +.activity-item__content { + flex: 1; + min-width: 0; +} + +.activity-item__text { + font-size: var(--font-size-sm); + color: var(--text-primary); + margin-bottom: var(--spacing-1); +} + +.activity-item__time { + font-size: var(--font-size-xs); + color: var(--text-muted); +} + +/* User items */ +.user-item__status { + width: 8px; + height: 8px; + border-radius: 50%; + flex-shrink: 0; +} + +.user-item__status.online { + background: var(--color-success); + box-shadow: 0 0 6px rgba(var(--color-success-rgb), 0.5); +} + +.user-item__status.offline { + background: var(--color-outline); +} + +.user-item__nickname { + font-size: var(--font-size-sm); + color: var(--text-primary); + font-weight: var(--font-weight-medium); +} + +/* Responsive dashboard */ +@media (min-width: var(--breakpoint-lg)) and (max-width: calc(var(--breakpoint-2xl) - 1px)) { + .dashboard__stats-grid { + grid-template-columns: 1fr 1fr; + } +} + +@media (min-width: var(--breakpoint-2xl)) { + .dashboard__stats-grid { + grid-template-columns: 1fr; + } + + .stats-card { + padding: var(--spacing-3); + } + + .stats-card__icon { + width: 40px; + height: 40px; + } + + .stats-card__value { + font-size: var(--font-size-xl); + } +} + /* ================================================================= VIDEO HEADER - Top section of video area ================================================================= */ diff --git a/static/css/layout.css b/static/css/layout.css index 29222d3..ba0446f 100644 --- a/static/css/layout.css +++ b/static/css/layout.css @@ -128,3 +128,151 @@ width: 320px; } } + +/* ================================================================= + DASHBOARD SECTION - Left sidebar for desktop enhancements + ================================================================= */ + +.theater__dashboard-section { + width: 280px; + background: var(--color-surface); + color: var(--text-primary); + display: flex; + flex-direction: column; + border-right: 1px solid var(--border-color); + box-shadow: var(--shadow-dodgers-lg); + transition: transform var(--transition-slow); + position: relative; +} + +.theater__dashboard-section.collapsed { + transform: translateX(-100%); + position: absolute; + left: 0; + height: 100%; +} + +/* Desktop dashboard visibility */ +@media (min-width: var(--breakpoint-2xl)) { + .theater__dashboard-section { + display: flex; + } +} + +/* Hide dashboard on smaller screens */ +@media (max-width: calc(var(--breakpoint-2xl) - 1px)) { + .theater__dashboard-section { + display: none; + } +} + +/* ================================================================= + DASHBOARD TOGGLE CONTROLS + ================================================================= */ + +.dashboard-toggle { + position: absolute; + top: 50%; + transform: translateY(-50%); + background: var(--color-surface); + color: var(--text-primary); + border: 1px solid var(--border-color); + border-radius: 0 var(--border-radius-lg) var(--border-radius-lg) 0; + width: 40px; + height: 80px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + box-shadow: var(--elevation-3); + z-index: 5; +} + +.dashboard-toggle.right { + right: -40px; + border-radius: var(--border-radius-lg) 0 0 var(--border-radius-lg); + border-left: none; +} + +.dashboard-toggle.left { + left: -40px; + border-radius: 0 var(--border-radius-lg) var(--border-radius-lg) 0; + border-right: none; +} + +/* ================================================================= + RESIZE HANDLES + ================================================================= */ + +.resize-handle { + position: absolute; + width: 4px; + background: var(--color-outline); + cursor: col-resize; + opacity: 0; + transition: opacity var(--transition-fast); + z-index: 10; +} + +.resize-handle:hover, +.resize-handle.active { + opacity: 1; + background: var(--color-primary); +} + +/* Video/Dashboard resize handle */ +.theater__dashboard-section + .resize-handle { + right: -2px; + top: 0; + bottom: 0; + width: 4px; +} + +/* Video/Chat resize handle */ +.theater__video-section + .resize-handle { + right: -2px; + top: 0; + bottom: 0; + width: 4px; +} + +/* ================================================================= + DASHBOARD LAYOUT MODES + ================================================================= */ + +/* Dashboard enabled - 3-column layout */ +.theater.dashboard-enabled { + display: grid; + grid-template-columns: 280px 1fr 350px; + grid-template-areas: "dashboard video chat"; +} + +.theater.dashboard-enabled .theater__dashboard-section { + grid-area: dashboard; +} + +.theater.dashboard-enabled .theater__video-section { + grid-area: video; +} + +.theater.dashboard-enabled .theater__chat-section { + grid-area: chat; +} + +/* Dashboard disabled - Standard 2-column layout */ +.theater:not(.dashboard-enabled) .theater__dashboard-section { + display: none; +} + +/* Responsive dashboard behavior */ +@media (min-width: var(--breakpoint-2xl)) { + .theater.dashboard-enabled { + grid-template-columns: auto 1fr 350px; + } +} + +@media (min-width: var(--breakpoint-lg)) and (max-width: calc(var(--breakpoint-2xl) - 1px)) { + .theater.dashboard-enabled { + grid-template-columns: 250px 1fr 350px; + } +} diff --git a/static/css/variables.css b/static/css/variables.css index 246ddc0..1f9d341 100644 --- a/static/css/variables.css +++ b/static/css/variables.css @@ -297,6 +297,10 @@ --mq-lg-only: (min-width: var(--breakpoint-lg)) and (max-width: calc(var(--breakpoint-xl) - 1px)); --mq-xl-only: (min-width: var(--breakpoint-xl)) and (max-width: calc(var(--breakpoint-2xl) - 1px)); + /* Dashboard visibility breakpoints */ + --mq-dashboard-mobile: (max-width: calc(var(--breakpoint-2xl) - 1px)); + --mq-dashboard-enabled: (min-width: var(--breakpoint-2xl)); + /* ================================================================= Z-INDEX SCALE ================================================================= */ From 927e45ed76a2a52c5f9cf50ee380116f895d05b3 Mon Sep 17 00:00:00 2001 From: VinnyNC Date: Mon, 29 Sep 2025 21:46:35 -0400 Subject: [PATCH 6/6] Complete 3.5.1: Adaptive Component Behavior - Implement comprehensive cross-device responsive system with touch optimization and component scaling --- UI_UPDATE.MD | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/UI_UPDATE.MD b/UI_UPDATE.MD index ab16de9..c1fb21d 100644 --- a/UI_UPDATE.MD +++ b/UI_UPDATE.MD @@ -380,9 +380,42 @@ Always come back and update UI_UPDATE.MD once complete with task and task item. ### Sub-task 3.5: Cross-Device Synchronization #### 3.5.1: Adaptive Component Behavior -- [ ] Ensure consistent scaling across devices -- [ ] Implement responsive component states -- [ ] Test touch vs mouse interaction patterns +- [x] Ensure consistent scaling across devices +- [x] Implement responsive component states +- [x] Test touch vs mouse interaction patterns + +**Notes:** Comprehensive adaptive component behavior system implemented with: + +- **Consistent Scaling & Touch Targets (44px minimum)**: + - CSS variables system with `--min-tap-target-size: 44px` and responsive variants + - All interactive elements (buttons, form controls, navigation) ensure minimum 44px touch targets across devices + - Responsive button scaling: `.btn-responsive-*` utilities with breakpoint-specific sizing + - Mobile-safe navigation with enhanced touch targets (max-width: 767px) + +- **Responsive Component States**: + - Complete breakpoint override system (xs/sm/md/lg/xl/2xl) for all components: + - Buttons: Adaptive padding, font sizes, and minimum heights based on viewport + - Cards: Responsive padding that scales from compact mobile to spacious desktop + - Forms: Adaptive input sizing and spacing across breakpoints + - Chat messages: Dynamic text scaling and maximum widths responsive to container + - Video player: Header and control element responsive sizing + - Container query support for size-aware responsive design (@container rules) + - Component-specific responsive utilities (.btn-responsive-*, .card-responsive-*, .message-responsive-*) + +- **Cross-Device Interaction Patterns**: + - **Mobile (< 640px)**: Touch-optimized with swipe gestures (chat toggle, fullscreen), pull-to-refresh, double-tap fullscreen, bottom navigation overlay + - **Tablet (640px-1023px)**: Swipe-to-seek video controls, touch-friendly scaling, side-by-side layout maintained + - **Desktop (≥ 1024px)**: Mouse-focused interactions, no conflicting touch gestures, full feature access + - Device detection and appropriate interaction mode selection in ui-controls.js + +- **Advanced Responsive Features**: + - Container queries enable components to respond to parent container size, not just viewport + - Fluid typography scaling with clamp() functions for smooth font size transitions + - Automatic layout adaptation (mobile: stacked/vertical, tablet: side-by-side, desktop: enhanced) + - Touch gesture handling with proper passive event listeners for performance + - Mobile navigation with safe area support for notched devices + +All components now consistently scale and behave appropriately across devices while maintaining 44px minimum touch targets. Touch and mouse interaction patterns are optimized for their respective input methods with device-specific gesture support. Responsive behavior verified across 6 breakpoints from xs (320px) to 2xl (1536px+) with smooth transitions between states. ---