Sprint 1 Day 1: Individual Quad Controls + Hero Section Redesign

Multi-Screen Individual Controls:
- Individual volume sliders with percentage display
- Independent play/pause buttons for each quadrant
- Progress bars with click-to-seek functionality
- Mute toggle buttons with visual feedback
- Individual shuffle/change video buttons
- Hover-to-show controls with smooth animations
- Mobile-responsive design

 Hero Section Overhaul:
- Professional typography with enhanced title/tagline
- Feature highlights showcasing key capabilities
- Modern status panel with XP, timer, and quick stats
- Gradient backgrounds with subtle animations
- Glassmorphism effects with backdrop blur
- Responsive grid layout for all screen sizes
- Visual hierarchy improvements

 Responsive Design:
- Mobile-optimized layouts for both features
- Proper scaling and touch-friendly controls
- Adaptive grid systems for different screen sizes
This commit is contained in:
dilgenfritz 2025-11-03 06:06:13 -06:00
parent 689574953a
commit fdc8de2c99
5 changed files with 1051 additions and 18 deletions

View File

@ -16,6 +16,13 @@ An adult edging challenge game with multiple specialized modes, progressive trai
## <20> Core Features
### 🎬 Professional Media Player System
- **Porn Cinema**: Full-featured video player with playlists, seeking, and theater mode
- **Multi-Screen Quad Player**: 4-video grid layout for intensive training sessions
- **Video Library Management**: Unified access to linked video directories
- **Focus Interruptions**: Video overlays during training scenarios
- **Player Statistics**: Watch time tracking, completion rates, and viewing analytics
### Progressive Endurance Training
- **Experience Levels**: Beginner → Intermediate → Advanced → Expert
- **Adaptive Timers**: 30 seconds to 10 minutes based on skill level
@ -36,6 +43,7 @@ An adult edging challenge game with multiple specialized modes, progressive trai
### Content Management
- **Custom Images**: Upload and categorize adult content (tasks vs consequences)
- **Video Integration**: Link external video directories for seamless playback
- **High-Quality Processing**: 1600x1200 resolution with smart compression
- **Storage Management**: 50 image limit with usage monitoring
- **Bulk Operations**: Select, enable/disable, and delete multiple images
@ -74,13 +82,21 @@ npm start
```
webGame/
├── index.html # Main interface
├── porn-cinema.html # Professional video player
├── player-stats.html # Statistics dashboard
├── user-profile.html # User profile and achievements
├── src/
│ ├── core/ # Game engine and mode management
│ ├── data/modes/ # Game mode data files
│ ├── features/ # Task system, webcam, audio
│ ├── features/
│ │ ├── media/ # Video players and cinema system
│ │ ├── stats/ # Player statistics tracking
│ │ ├── tasks/ # Interactive task management
│ │ └── ... # Audio, webcam, UI features
│ └── styles/ # CSS and themes
├── images/ # Image storage
├── audio/ # Background music
├── videos/ # Video file organization
└── package.json # Electron app config
```
@ -92,6 +108,15 @@ webGame/
## 📋 Recent Updates
### v3.0 - Professional Media System (October 31, 2025)
- ✅ **Complete Porn Cinema**: Professional video player with playlists, progress bars, and theater mode
- ✅ **Multi-Screen Quad Player**: 4-video grid layout for intensive training with minimize/restore functionality
- ✅ **BaseVideoPlayer Architecture**: Reusable video components across all game modes
- ✅ **Video Library Integration**: Seamless access to external video directories
- ✅ **Player Statistics & Profiles**: Watch time tracking, achievements, and user progression
- ✅ **Focus Video Interruptions**: Video overlays during training scenarios
- ✅ **Enhanced Training Integration**: Multi-screen mode button in interactive tasks
### v2.0 - Major Content Update
- ✅ Added 7 specialized game modes with rich content
- ✅ Implemented progressive endurance training system

View File

@ -39,24 +39,82 @@
<div class="game-container">
<!-- Game Header -->
<header class="game-header">
<h1>Gooner Training Academy</h1>
<p class="tagline">Master Your Dedication</p>
<!-- Overall XP Display (top-right corner) -->
<div class="overall-xp-display">
<span class="overall-xp-label">Total XP:</span>
<span id="overall-xp-header" class="overall-xp-value">0</span>
<header class="game-header hero-header">
<div class="hero-background"></div>
<div class="hero-content">
<div class="hero-title-section">
<h1 class="hero-title">
<span class="hero-title-main">Gooner Training Academy</span>
<span class="hero-title-accent">Professional Development</span>
</h1>
<p class="hero-tagline">
<span class="tagline-emphasis">Master Your Dedication</span>
<span class="tagline-subtitle">• Advanced Training System • v3.0</span>
</p>
<!-- Feature Highlights -->
<div class="hero-features">
<div class="hero-feature">
<span class="feature-icon">🎬</span>
<span class="feature-text">Multi-Screen Training</span>
</div>
<div class="hero-feature">
<span class="feature-icon">📊</span>
<span class="feature-text">Progress Analytics</span>
</div>
<div class="hero-feature">
<span class="feature-icon">🏆</span>
<span class="feature-text">Achievement System</span>
</div>
<div class="hero-feature">
<span class="feature-icon">🎵</span>
<span class="feature-text">Immersive Audio</span>
</div>
</div>
</div>
<!-- Status Panel -->
<div class="hero-status-panel">
<!-- Overall XP Display -->
<div class="status-card overall-xp-display">
<div class="status-label">Total XP</div>
<div class="status-value">
<span id="overall-xp-header" class="xp-number">0</span>
<span class="xp-suffix">XP</span>
</div>
<div class="status-bar">
<div class="status-progress" id="overall-xp-progress" style="width: 0%"></div>
</div>
</div>
<!-- Session Timer -->
<div class="status-card timer-compact">
<div class="status-label">Session Time</div>
<div class="status-value">
<span id="timer" class="timer-display">00:00</span>
</div>
<div class="timer-status-text" id="timer-status"></div>
</div>
<!-- Quick Stats -->
<div class="status-card quick-stats">
<div class="status-label">Quick Stats</div>
<div class="stats-grid">
<div class="stat-item">
<span class="stat-number" id="header-sessions">0</span>
<span class="stat-label">Sessions</span>
</div>
<div class="stat-item">
<span class="stat-number" id="header-streak">0</span>
<span class="stat-label">Streak</span>
</div>
</div>
</div>
</div>
</div>
<!-- Compact Timer (top-right corner) -->
<div class="timer-compact">
<span id="timer" class="timer">00:00</span>
<span id="timer-status" class="timer-status"></span>
</div>
<!-- Compact Music Controls (expandable) -->
<div class="music-controls-compact">
<!-- Compact Music Controls (repositioned) -->
<div class="music-controls-compact hero-music-controls">
<button id="music-toggle-compact" class="music-icon-btn" title="Music Controls">🎵</button>
<div class="music-panel-expanded">
<div class="music-row">

295
sprint1.md Normal file
View File

@ -0,0 +1,295 @@
# Sprint 1 - Polish & Performance Focus
**Duration**: 2 weeks (November 3-17, 2025)
**Goals**: Complete signature features, enhance UX, optimize performance
## 🎯 Sprint Objectives
### **Primary Goals**
1. **🎬 Complete Multi-Screen Quad Player** - Finish your signature feature
2. **🎨 Enhanced User Experience & Polish** - Professional feel and feedback
3. **📊 Statistics & Progress System Enhancement** - Better gamification
4. **🏠 Home Page Visual Overhaul** - Modern, attractive landing experience
5. **🎨 UI Graphics Integration** - Icons, illustrations, and visual design system
6. **🔧 Performance & Stability** - Optimize for large media libraries
### **Success Metrics**
- Multi-Screen Quad Player 100% feature complete
- Home page has modern, professional visual design
- UI graphics system implemented with consistent iconography
- Zero critical UX issues reported
- Statistics dashboard fully functional
- Video loading performance improved by 50%
---
## 🎬 **PRIORITY 1: Complete Multi-Screen Quad Player**
*Status: 80% complete → Target: 100% complete*
### **Week 1 Tasks**
#### **Individual Video Controls**
- [ ] **Volume Controls**: Add individual volume sliders for each quadrant
- [ ] **Play/Pause Per Video**: Individual control without affecting others
- [ ] **Seek Controls**: Mini progress bars or click-to-seek on each video
- [ ] **Mute Toggle**: Quick mute button for each quadrant
#### **Focus Mode Enhancement**
- [ ] **Click to Focus**: Click any quadrant to temporarily enlarge it (75% screen)
- [ ] **Focus Overlay**: Dim other videos when one is focused
- [ ] **Exit Focus**: Click background or ESC to return to quad view
- [ ] **Focus Indicator**: Visual border/highlight on focused video
### **Week 2 Tasks**
#### **Sync Options**
- [ ] **Master Play/Pause**: Button to pause/play all videos simultaneously
- [ ] **Master Volume**: Global volume slider affecting all videos
- [ ] **Sync Seek**: Option to seek all videos to same timestamp
- [ ] **Master Mute**: Mute/unmute all videos at once
#### **Custom Layouts**
- [ ] **Layout Selector**: 2x2, 1+3, 3x1, fullscreen single options
- [ ] **Drag & Drop**: Rearrange video positions within grid
- [ ] **Layout Memory**: Remember user's preferred layout
- [ ] **Mobile Layouts**: Responsive stacking for smaller screens
#### **Quality of Life**
- [ ] **Video Info**: Show filename/duration on hover
- [ ] **Quick Actions**: Right-click context menu per video
- [ ] **Keyboard Shortcuts**: Space for play/pause, number keys for focus
- [ ] **Auto-shuffle Timer**: Optional automatic video refresh every X minutes
---
## 🎨 **PRIORITY 2: Enhanced User Experience & Polish**
*Current: Basic functionality → Target: Professional polish*
### **Week 1 Tasks**
#### **Loading & Feedback Systems**
- [ ] **Loading States**: Spinners for video loading, image processing, game initialization
- [ ] **Progress Indicators**: Show completion percentage for long operations
- [ ] **Error Handling**: User-friendly error messages with retry options
- [ ] **Success Feedback**: Satisfying completion animations and sounds
#### **Notification System Enhancement**
- [ ] **Notification Types**: Success, warning, error, info with distinct styling
- [ ] **Auto-dismiss**: Smart timing based on message importance
- [ ] **Notification Queue**: Handle multiple notifications gracefully
- [ ] **Action Buttons**: "Retry", "Settings", "Dismiss" options in notifications
### **Week 2 Tasks**
#### **Visual Polish**
- [ ] **Smooth Transitions**: Fade/slide animations between screens
- [ ] **Hover Effects**: Consistent button and element interactions
- [ ] **Focus Indicators**: Clear visual feedback for keyboard navigation
- [ ] **Loading Skeletons**: Placeholder content while loading
#### **Interaction Improvements**
- [ ] **Confirmation Dialogs**: "Are you sure?" for destructive actions
- [ ] **Undo Actions**: Ability to undo recent changes (delete images, etc.)
- [ ] **Keyboard Navigation**: Tab through all interactive elements
- [ ] **Touch Gestures**: Swipe/pinch support for mobile users
#### **Error Prevention**
- [ ] **Input Validation**: Real-time feedback on form inputs
- [ ] **File Type Checking**: Clear warnings for unsupported files
- [ ] **Storage Warnings**: Alert when approaching storage limits
- [ ] **Browser Compatibility**: Graceful degradation for older browsers
---
## 📊 **PRIORITY 3: Statistics & Progress System Enhancement**
*Current: Basic tracking → Target: Comprehensive analytics*
### **Week 1 Tasks**
#### **Enhanced Statistics Dashboard**
- [ ] **Session Analytics**: Detailed breakdown of current session
- [ ] **Historical Trends**: Charts showing progress over time
- [ ] **Category Breakdown**: Stats per game mode, task type, etc.
- [ ] **Streak Tracking**: Consecutive days played, longest sessions
#### **Achievement System Expansion**
- [ ] **New Achievements**: 20+ achievements covering all game aspects
- [ ] **Achievement Notifications**: Celebratory popups when earned
- [ ] **Progress Tracking**: Show progress toward locked achievements
- [ ] **Achievement Gallery**: Display earned achievements with dates
### **Week 2 Tasks**
#### **Advanced Analytics**
- [ ] **Heatmaps**: Show activity patterns by time/day
- [ ] **Performance Metrics**: Task completion rates, improvement trends
- [ ] **Content Usage**: Most used images/videos/scenarios
- [ ] **Export Data**: Download statistics as CSV/JSON
#### **Gamification Enhancements**
- [ ] **XP Multipliers**: Bonus XP for streaks, achievements, perfect sessions
- [ ] **Leaderboards**: Personal best records and milestones
- [ ] **Challenges**: Daily/weekly challenges with XP rewards
- [ ] **Progress Badges**: Visual indicators of user level and status
---
## 🏠 **PRIORITY 4: Home Page Visual Overhaul**
*Current: Functional but basic → Target: Modern, engaging landing experience*
### **Week 1 Tasks**
#### **Hero Section Redesign**
- [ ] **Hero Header**: Large title with professional typography and gradient/shadow effects
- [ ] **Tagline Enhancement**: Make "Master Your Dedication" more prominent with styled text
- [ ] **Visual Hierarchy**: Clear sections with proper spacing and visual flow
- [ ] **Feature Highlights**: Quick overview of key features (Quad Player, Statistics, etc.)
#### **Navigation & Layout Improvements**
- [ ] **Button Grouping**: Reorganize main action buttons into logical categories
- [ ] **Primary/Secondary Actions**: Clear visual distinction between important vs. utility buttons
- [ ] **Quick Start Flow**: Streamlined path for new users vs. returning users
- [ ] **Visual Icons**: Add meaningful icons to all main action buttons
### **Week 2 Tasks**
#### **Game Mode Selection Enhancement**
- [ ] **Visual Cards**: Transform radio buttons into attractive game mode cards
- [ ] **Mode Previews**: Small illustrations or icons for each game mode
- [ ] **Progress Indicators**: Show completion stats for each mode
- [ ] **Recommended Mode**: Highlight suggested mode based on user history
#### **Statistics Dashboard Integration**
- [ ] **Quick Stats Widget**: Mini dashboard on home page showing key metrics
- [ ] **Progress Rings**: Circular progress indicators for XP, streaks, completion rates
- [ ] **Achievement Badges**: Display recent achievements prominently
- [ ] **Motivational Elements**: Dynamic messages based on current progress
#### **Options Panel Redesign**
- [ ] **Tabbed Interface**: Organize options into clear categories with tabs
- [ ] **Visual Settings Preview**: Live preview of theme changes and audio settings
- [ ] **Advanced Settings**: Collapsible sections for power users
- [ ] **Help Integration**: Quick tips and tooltips throughout
---
## 🎨 **PRIORITY 5: UI Graphics Integration**
*Current: Text-based interface → Target: Rich visual design with graphics*
### **Week 1 Tasks**
#### **Icon System Implementation**
- [ ] **Icon Library**: Choose/create consistent icon set (Material Design, Feather, or custom)
- [ ] **Button Icons**: Add meaningful icons to all major buttons and actions
- [ ] **Navigation Icons**: Visual indicators for different screens and modes
- [ ] **Status Icons**: Game state, loading, success/error indicators
#### **Visual Design System**
- [ ] **Color Palette**: Expand beyond current themes with semantic colors (success, warning, info)
- [ ] **Typography Scale**: Implement consistent font sizes and weights hierarchy
- [ ] **Spacing System**: Standardized padding/margin system (8px grid recommended)
- [ ] **Border Radius**: Consistent corner radius for modern card-based design
### **Week 2 Tasks**
#### **Illustrations & Graphics**
- [ ] **Game Mode Illustrations**: Custom graphics or icons for each game mode
- [ ] **Empty State Graphics**: Attractive placeholders when no content is available
- [ ] **Loading Animations**: Smooth, engaging loading states beyond simple spinners
- [ ] **Achievement Graphics**: Visual badges and celebration graphics
#### **Interactive Visual Elements**
- [ ] **Hover Effects**: Subtle animations and feedback on interactive elements
- [ ] **Progress Visualizations**: Animated progress bars, XP gains, streak counters
- [ ] **State Transitions**: Smooth animations between different app states
- [ ] **Micro-interactions**: Small delightful interactions (button presses, etc.)
#### **Graphics Assets Creation**
- [ ] **Logo Design**: Professional logo for "Gooner Training Academy"
- [ ] **Background Patterns**: Subtle background textures or patterns for visual interest
- [ ] **Card Graphics**: Background patterns or graphics for different card types
- [ ] **Game State Graphics**: Visual indicators for paused, playing, completed states
---
## 🔧 **PRIORITY 6: Performance & Stability**
*Current: Works with small libraries → Target: Handles large collections smoothly*
### **Week 1 Tasks**
#### **Video Performance Optimization**
- [ ] **Lazy Loading**: Only load videos when needed
- [ ] **Memory Management**: Properly dispose of video elements when done
- [ ] **Preloading Strategy**: Smart preloading of next videos in queue
- [ ] **Quality Adaptation**: Auto-reduce quality for multiple simultaneous videos
#### **File Handling Improvements**
- [ ] **Large File Support**: Handle 4K+ videos without browser crashes
- [ ] **Background Processing**: Process large files without blocking UI
- [ ] **Chunked Loading**: Stream large files in chunks
- [ ] **Cache Management**: Intelligent caching with size limits
### **Week 2 Tasks**
#### **UI Performance**
- [ ] **Virtual Scrolling**: Handle large image/video galleries efficiently
- [ ] **Debounced Operations**: Prevent excessive API calls during user input
- [ ] **Bundle Optimization**: Reduce initial JavaScript load size
- [ ] **CSS Optimization**: Remove unused styles, optimize animations
#### **Stability Enhancements**
- [ ] **Error Boundaries**: Graceful handling of component crashes
- [ ] **Memory Leak Prevention**: Regular cleanup of event listeners and timers
- [ ] **State Recovery**: Automatically recover from corrupted states
- [ ] **Performance Monitoring**: Built-in FPS and memory usage tracking
---
## 📅 **Sprint Timeline**
### **Week 1 (Nov 3-10)**
- **Mon-Tue**: Multi-Screen individual controls + Hero section redesign
- **Wed-Thu**: Loading states and error handling + Navigation improvements
- **Fri**: Statistics dashboard enhancements + Icon system implementation
- **Weekend**: Video performance optimization + Visual design system
### **Week 2 (Nov 10-17)**
- **Mon-Tue**: Multi-Screen sync options + Game mode cards and home page polish
- **Wed-Thu**: Visual polish and interactions + Illustrations and graphics integration
- **Fri**: Final performance optimizations and graphics polish
- **Weekend**: Sprint review and comprehensive testing
---
## 🧪 **Testing & Quality Assurance**
### **Daily Testing**
- [ ] Test all new features on desktop and mobile
- [ ] Verify performance with large media libraries (100+ videos)
- [ ] Check memory usage and cleanup
- [ ] Validate error handling scenarios
### **Sprint Review Criteria**
- [ ] All features work reliably with 200+ video library
- [ ] No memory leaks during extended sessions
- [ ] User feedback is immediate and helpful
- [ ] Statistics accurately track all user actions
- [ ] Mobile experience is smooth and responsive
---
## 🎉 **Sprint Success Definition**
**Sprint 1 will be considered successful when:**
1. ✅ Multi-Screen Quad Player has individual controls, focus mode, and sync options
2. ✅ Home page feels modern and professionally designed with clear visual hierarchy
3. ✅ UI has consistent graphics, icons, and visual design throughout
4. ✅ User experience feels polished with proper feedback and error handling
5. ✅ Statistics system provides comprehensive analytics and achievements
6. ✅ Performance is smooth with large media libraries (200+ videos)
7. ✅ Zero critical bugs or user experience issues
**Post-Sprint**: Ready for user testing and potential monetization planning!
---
*Sprint tracking: Update this document daily with completed tasks ✅*

View File

@ -169,7 +169,7 @@ class QuadVideoPlayer {
video.style.backgroundColor = '#000'; // Add black background for letterboxing
}
// Hide the header to save space
// Hide the original header to save space
const header = player.overlayElement.querySelector('.overlay-header');
if (header) {
header.style.display = 'none';
@ -181,6 +181,9 @@ class QuadVideoPlayer {
closeBtn.style.display = 'none';
}
// Create individual controls for this quadrant
this.createIndividualControls(player, index);
// Remove from body and add to quad slot
document.body.removeChild(player.overlayElement);
slot.appendChild(player.overlayElement);
@ -189,6 +192,178 @@ class QuadVideoPlayer {
player.playRandomVideo();
}
/**
* Create individual controls for each quadrant
*/
createIndividualControls(player, index) {
// Create controls container
const controlsContainer = document.createElement('div');
controlsContainer.className = 'quad-individual-controls';
controlsContainer.dataset.quadIndex = index;
controlsContainer.innerHTML = `
<div class="quad-control-row">
<button class="quad-control-btn play-pause-btn" title="Play/Pause">
<span class="play-icon"></span>
<span class="pause-icon" style="display: none;"></span>
</button>
<button class="quad-control-btn mute-btn" title="Mute/Unmute">
<span class="unmuted-icon">🔊</span>
<span class="muted-icon" style="display: none;">🔇</span>
</button>
<div class="quad-volume-control">
<input type="range" class="quad-volume-slider" min="0" max="100" value="70" title="Volume">
<span class="quad-volume-display">70%</span>
</div>
<button class="quad-control-btn shuffle-btn" title="Change Video">🔄</button>
</div>
<div class="quad-progress-row">
<div class="quad-progress-container">
<div class="quad-progress-bar">
<div class="quad-progress-filled"></div>
<div class="quad-progress-thumb"></div>
</div>
<div class="quad-time-display">
<span class="quad-current-time">0:00</span> / <span class="quad-total-time">0:00</span>
</div>
</div>
</div>
`;
// Insert controls into the overlay window
const overlayWindow = player.overlayElement.querySelector('.overlay-window');
if (overlayWindow) {
overlayWindow.appendChild(controlsContainer);
}
// Setup event listeners for individual controls
this.setupIndividualControlListeners(player, index, controlsContainer);
}
/**
* Setup event listeners for individual quadrant controls
*/
setupIndividualControlListeners(player, index, controlsContainer) {
const video = player.overlayElement.querySelector('video');
if (!video) return;
// Play/Pause button
const playPauseBtn = controlsContainer.querySelector('.play-pause-btn');
const playIcon = playPauseBtn.querySelector('.play-icon');
const pauseIcon = playPauseBtn.querySelector('.pause-icon');
playPauseBtn.addEventListener('click', () => {
if (video.paused) {
video.play();
playIcon.style.display = 'none';
pauseIcon.style.display = 'inline';
} else {
video.pause();
playIcon.style.display = 'inline';
pauseIcon.style.display = 'none';
}
});
// Update play/pause button based on video state
video.addEventListener('play', () => {
playIcon.style.display = 'none';
pauseIcon.style.display = 'inline';
});
video.addEventListener('pause', () => {
playIcon.style.display = 'inline';
pauseIcon.style.display = 'none';
});
// Volume control
const volumeSlider = controlsContainer.querySelector('.quad-volume-slider');
const volumeDisplay = controlsContainer.querySelector('.quad-volume-display');
volumeSlider.addEventListener('input', () => {
const volume = volumeSlider.value / 100;
video.volume = volume;
volumeDisplay.textContent = `${volumeSlider.value}%`;
// Update mute button state
const muteBtn = controlsContainer.querySelector('.mute-btn');
const unmutedIcon = muteBtn.querySelector('.unmuted-icon');
const mutedIcon = muteBtn.querySelector('.muted-icon');
if (volume === 0) {
unmutedIcon.style.display = 'none';
mutedIcon.style.display = 'inline';
} else {
unmutedIcon.style.display = 'inline';
mutedIcon.style.display = 'none';
}
});
// Mute button
const muteBtn = controlsContainer.querySelector('.mute-btn');
const unmutedIcon = muteBtn.querySelector('.unmuted-icon');
const mutedIcon = muteBtn.querySelector('.muted-icon');
let previousVolume = 0.7;
muteBtn.addEventListener('click', () => {
if (video.volume > 0) {
previousVolume = video.volume;
video.volume = 0;
volumeSlider.value = 0;
volumeDisplay.textContent = '0%';
unmutedIcon.style.display = 'none';
mutedIcon.style.display = 'inline';
} else {
video.volume = previousVolume;
volumeSlider.value = previousVolume * 100;
volumeDisplay.textContent = `${Math.round(previousVolume * 100)}%`;
unmutedIcon.style.display = 'inline';
mutedIcon.style.display = 'none';
}
});
// Shuffle/Change video button
const shuffleBtn = controlsContainer.querySelector('.shuffle-btn');
shuffleBtn.addEventListener('click', () => {
player.playRandomVideo();
});
// Progress bar functionality
const progressContainer = controlsContainer.querySelector('.quad-progress-container');
const progressBar = controlsContainer.querySelector('.quad-progress-bar');
const progressFilled = controlsContainer.querySelector('.quad-progress-filled');
const progressThumb = controlsContainer.querySelector('.quad-progress-thumb');
const currentTimeDisplay = controlsContainer.querySelector('.quad-current-time');
const totalTimeDisplay = controlsContainer.querySelector('.quad-total-time');
// Update progress bar
video.addEventListener('timeupdate', () => {
if (video.duration && video.duration > 0) {
const percentage = (video.currentTime / video.duration) * 100;
progressFilled.style.width = `${percentage}%`;
progressThumb.style.left = `${percentage}%`;
currentTimeDisplay.textContent = this.formatTime(video.currentTime);
totalTimeDisplay.textContent = this.formatTime(video.duration);
}
});
// Progress bar seeking
progressBar.addEventListener('click', (e) => {
if (video.duration) {
const rect = progressBar.getBoundingClientRect();
const clickX = e.clientX - rect.left;
const percentage = clickX / rect.width;
video.currentTime = percentage * video.duration;
}
});
// Initialize time displays
video.addEventListener('loadedmetadata', () => {
totalTimeDisplay.textContent = this.formatTime(video.duration);
currentTimeDisplay.textContent = this.formatTime(0);
});
}
/**
* Setup event listeners for quad controls
*/
@ -487,11 +662,186 @@ class QuadVideoPlayer {
gap: 8px;
}
}
/* Individual Controls Styling */
.quad-individual-controls {
position: absolute;
bottom: 0;
left: 0;
right: 0;
background: linear-gradient(to top, rgba(0,0,0,0.9) 0%, rgba(0,0,0,0.7) 50%, transparent 100%);
padding: 8px 12px;
opacity: 0;
transition: opacity 0.3s ease;
z-index: 10;
}
.quad-slot:hover .quad-individual-controls {
opacity: 1;
}
.quad-control-row {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 4px;
}
.quad-progress-row {
display: flex;
align-items: center;
gap: 8px;
}
.quad-control-btn {
background: rgba(255, 255, 255, 0.2);
border: none;
padding: 4px 8px;
border-radius: 4px;
color: white;
font-size: 12px;
cursor: pointer;
transition: all 0.2s ease;
min-width: 28px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
}
.quad-control-btn:hover {
background: rgba(255, 255, 255, 0.3);
transform: scale(1.05);
}
.quad-volume-control {
display: flex;
align-items: center;
gap: 4px;
flex: 1;
}
.quad-volume-slider {
flex: 1;
height: 4px;
background: rgba(255, 255, 255, 0.3);
border-radius: 2px;
outline: none;
cursor: pointer;
-webkit-appearance: none;
appearance: none;
}
.quad-volume-slider::-webkit-slider-thumb {
appearance: none;
width: 12px;
height: 12px;
border-radius: 50%;
background: #ff6b9d;
cursor: pointer;
border: 2px solid white;
box-shadow: 0 1px 3px rgba(0,0,0,0.3);
}
.quad-volume-slider::-moz-range-thumb {
width: 12px;
height: 12px;
border-radius: 50%;
background: #ff6b9d;
cursor: pointer;
border: 2px solid white;
box-shadow: 0 1px 3px rgba(0,0,0,0.3);
}
.quad-volume-display {
font-size: 10px;
color: white;
min-width: 30px;
text-align: right;
}
.quad-progress-container {
flex: 1;
display: flex;
flex-direction: column;
gap: 2px;
}
.quad-progress-bar {
position: relative;
height: 4px;
background: rgba(255, 255, 255, 0.3);
border-radius: 2px;
cursor: pointer;
overflow: visible;
}
.quad-progress-filled {
height: 100%;
background: #ff6b9d;
border-radius: 2px;
width: 0%;
transition: width 0.1s ease;
}
.quad-progress-thumb {
position: absolute;
top: 50%;
transform: translate(-50%, -50%);
width: 8px;
height: 8px;
background: white;
border-radius: 50%;
box-shadow: 0 1px 3px rgba(0,0,0,0.5);
left: 0%;
transition: left 0.1s ease;
}
.quad-time-display {
font-size: 9px;
color: rgba(255, 255, 255, 0.8);
text-align: center;
white-space: nowrap;
}
/* Hide controls on mobile to save space */
@media (max-width: 768px) {
.quad-individual-controls {
padding: 4px 6px;
}
.quad-control-btn {
padding: 2px 4px;
font-size: 10px;
min-width: 20px;
height: 20px;
}
.quad-volume-display {
font-size: 8px;
min-width: 25px;
}
.quad-time-display {
font-size: 8px;
}
}
`;
document.head.appendChild(styles);
}
/**
* Format time in MM:SS format
*/
formatTime(seconds) {
if (!seconds || isNaN(seconds)) return '0:00';
const minutes = Math.floor(seconds / 60);
const remainingSeconds = Math.floor(seconds % 60);
return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}`;
}
/**
* Cleanup resources
*/

View File

@ -134,6 +134,311 @@ body {
to { filter: drop-shadow(0 0 15px rgba(138, 43, 226, 0.9)); }
}
/* Enhanced Hero Section */
.hero-header {
background: linear-gradient(135deg,
var(--bg-primary) 0%,
var(--bg-secondary) 30%,
rgba(138, 43, 226, 0.1) 70%,
var(--bg-secondary) 100%);
padding: var(--space-xxl) var(--space-xl);
position: relative;
overflow: hidden;
min-height: 400px;
}
.hero-background {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background:
radial-gradient(circle at 20% 30%, rgba(138, 43, 226, 0.15) 0%, transparent 50%),
radial-gradient(circle at 80% 70%, rgba(218, 112, 214, 0.1) 0%, transparent 50%),
linear-gradient(45deg, transparent 30%, rgba(138, 43, 226, 0.05) 50%, transparent 70%);
animation: heroBackgroundShift 10s ease-in-out infinite alternate;
}
@keyframes heroBackgroundShift {
from { opacity: 0.7; transform: translateX(-2%); }
to { opacity: 1; transform: translateX(2%); }
}
.hero-content {
position: relative;
z-index: 2;
display: grid;
grid-template-columns: 2fr 1fr;
gap: var(--space-xxl);
align-items: start;
max-width: 1400px;
margin: 0 auto;
}
.hero-title-section {
text-align: left;
}
.hero-title {
font-family: 'Audiowide', cursive;
margin: 0 0 var(--space-lg) 0;
display: flex;
flex-direction: column;
gap: var(--space-sm);
}
.hero-title-main {
font-size: clamp(3rem, 8vw, 6rem);
color: var(--color-primary);
text-shadow:
0 0 30px rgba(138, 43, 226, 0.8),
0 4px 8px rgba(0, 0, 0, 0.5);
-webkit-text-stroke: 0.5px rgba(255, 255, 255, 0.3);
animation: titleGlow 3s ease-in-out infinite alternate;
line-height: 0.9;
}
.hero-title-accent {
font-size: clamp(1.2rem, 3vw, 2rem);
color: var(--color-secondary);
font-weight: 300;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
margin-left: var(--space-sm);
}
.hero-tagline {
margin: 0 0 var(--space-xl) 0;
display: flex;
flex-direction: column;
gap: var(--space-xs);
}
.tagline-emphasis {
font-size: clamp(1.5rem, 4vw, 2.5rem);
color: var(--text-primary);
font-weight: 600;
text-shadow: 0 2px 8px rgba(0, 0, 0, 0.7);
letter-spacing: 1px;
}
.tagline-subtitle {
font-size: var(--font-lg);
color: var(--text-secondary);
font-weight: 300;
opacity: 0.9;
font-style: italic;
}
.hero-features {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: var(--space-lg);
margin: var(--space-xl) 0;
}
.hero-feature {
display: flex;
align-items: center;
gap: var(--space-sm);
padding: var(--space-base);
background: rgba(255, 255, 255, 0.05);
border-radius: var(--border-radius);
border: 1px solid var(--border-color);
transition: all 0.3s ease;
backdrop-filter: blur(10px);
}
.hero-feature:hover {
background: rgba(138, 43, 226, 0.1);
border-color: var(--color-primary);
transform: translateY(-2px);
box-shadow: var(--glow-primary);
}
.feature-icon {
font-size: 1.5rem;
display: flex;
align-items: center;
justify-content: center;
min-width: 32px;
}
.feature-text {
font-size: var(--font-base);
color: var(--text-primary);
font-weight: 500;
}
.hero-status-panel {
display: flex;
flex-direction: column;
gap: var(--space-lg);
align-items: stretch;
}
.status-card {
background: rgba(255, 255, 255, 0.08);
border: 1px solid var(--border-color);
border-radius: var(--border-radius-lg);
padding: var(--space-lg);
text-align: center;
backdrop-filter: blur(15px);
transition: all 0.3s ease;
}
.status-card:hover {
background: rgba(255, 255, 255, 0.12);
border-color: var(--color-primary);
box-shadow: 0 4px 20px rgba(138, 43, 226, 0.3);
}
.status-label {
font-size: var(--font-sm);
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 1px;
margin-bottom: var(--space-sm);
font-weight: 600;
}
.status-value {
font-size: var(--font-xxl);
color: var(--text-primary);
font-weight: 700;
display: flex;
align-items: baseline;
justify-content: center;
gap: var(--space-xs);
margin-bottom: var(--space-sm);
}
.xp-number {
color: var(--color-primary);
text-shadow: 0 0 10px rgba(138, 43, 226, 0.5);
}
.xp-suffix {
font-size: var(--font-base);
color: var(--text-secondary);
font-weight: 400;
}
.timer-display {
font-family: 'Courier New', monospace;
color: var(--color-secondary);
text-shadow: 0 0 10px rgba(218, 112, 214, 0.5);
}
.status-bar {
height: 4px;
background: rgba(255, 255, 255, 0.2);
border-radius: 2px;
overflow: hidden;
margin-top: var(--space-sm);
}
.status-progress {
height: 100%;
background: linear-gradient(90deg, var(--color-primary), var(--color-secondary));
border-radius: 2px;
transition: width 0.5s ease;
box-shadow: 0 0 10px rgba(138, 43, 226, 0.5);
}
.timer-status-text {
font-size: var(--font-xs);
color: var(--text-tertiary);
margin-top: var(--space-sm);
}
.stats-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--space-base);
}
.stat-item {
display: flex;
flex-direction: column;
align-items: center;
gap: var(--space-xs);
}
.stat-number {
font-size: var(--font-xl);
color: var(--color-primary);
font-weight: 700;
text-shadow: 0 0 8px rgba(138, 43, 226, 0.4);
}
.stat-label {
font-size: var(--font-xs);
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
}
.hero-music-controls {
position: absolute;
top: var(--space-lg);
right: var(--space-lg);
z-index: 3;
}
/* Responsive Hero Design */
@media (max-width: 1024px) {
.hero-content {
grid-template-columns: 1fr;
gap: var(--space-xl);
text-align: center;
}
.hero-title-section {
text-align: center;
}
.hero-features {
grid-template-columns: repeat(2, 1fr);
}
.hero-status-panel {
flex-direction: row;
justify-content: center;
flex-wrap: wrap;
}
.status-card {
flex: 1;
min-width: 200px;
max-width: 300px;
}
}
@media (max-width: 768px) {
.hero-header {
padding: var(--space-xl) var(--space-lg);
min-height: 350px;
}
.hero-features {
grid-template-columns: 1fr;
gap: var(--space-base);
}
.hero-status-panel {
flex-direction: column;
}
.hero-music-controls {
position: relative;
top: auto;
right: auto;
margin-top: var(--space-lg);
align-self: center;
}
}
/* Main content area */
.game-content {
background: var(--bg-primary);