- Add extra positive/negative prompt textareas to all 9 detail pages with session persistence - Add Endless generation button to all detail pages (continuous preview generation until stopped) - Default character selector to "Random Character" on all secondary detail pages - Fix queue clear endpoint (remove spurious auth check) - Refactor app.py into routes/ and services/ modules - Update CLAUDE.md with new architecture documentation - Various data file updates and cleanup Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
776 lines
34 KiB
Markdown
776 lines
34 KiB
Markdown
# GAZE Gallery Enhancement Plan
|
||
|
||
## Executive Summary
|
||
|
||
This plan outlines a comprehensive enhancement to the GAZE Image Gallery, transforming it from a basic grid-and-lightbox viewer into an immersive, multi-modal viewing experience. The enhancement introduces **three major feature categories**: Slideshow Modes, Image Wall Layouts, and Interactive Viewing Tools.
|
||
|
||
---
|
||
|
||
## Current State Analysis
|
||
|
||
### Existing Implementation
|
||
|
||
| Component | Current State | File Location |
|
||
|-----------|--------------|---------------|
|
||
| Grid View | Auto-fill grid, 160-210px cards, hover overlays | [`templates/gallery.html`](templates/gallery.html:88) |
|
||
| Lightbox | Bootstrap modal, arrow navigation, keyboard support | [`templates/layout.html`](templates/layout.html:123) |
|
||
| Filtering | Category, item, sort, pagination | [`templates/gallery.html`](templates/gallery.html:11) |
|
||
| Metadata | Prompt modal with LoRA chips, generation params | [`templates/gallery.html`](templates/gallery.html:194) |
|
||
|
||
### Design System Variables
|
||
|
||
```css
|
||
/* From static/style.css — these will guide our new components */
|
||
--bg-base: #07070f;
|
||
--bg-card: #0c0c1c;
|
||
--accent: #8b7eff;
|
||
--accent-glow: rgba(139, 126, 255, 0.14);
|
||
--border: #16163a;
|
||
--text: #e8e8f5;
|
||
--text-muted: #6a6a9a;
|
||
--radius: 12px;
|
||
--font-display: 'Space Grotesk';
|
||
--font-body: 'Inter';
|
||
```
|
||
|
||
---
|
||
|
||
## Architecture Overview
|
||
|
||
```mermaid
|
||
graph TB
|
||
subgraph Gallery Page
|
||
A[View Mode Selector] --> B[Grid View]
|
||
A --> C[Masonry View]
|
||
A --> D[Justified View]
|
||
A --> E[Collage View]
|
||
end
|
||
|
||
subgraph Viewer Modes
|
||
F[Cinema Slideshow]
|
||
G[Classic Slideshow]
|
||
H[Showcase Frame]
|
||
I[Comparison Mode]
|
||
J[Discovery Mode]
|
||
K[Ambient Screensaver]
|
||
end
|
||
|
||
subgraph Core Engine
|
||
L[GalleryController]
|
||
M[ImageLoader - lazy/preload]
|
||
N[TransitionEngine]
|
||
O[MetadataProvider]
|
||
end
|
||
|
||
B & C & D & E --> L
|
||
L --> F & G & H & I & J & K
|
||
L --> M
|
||
L --> N
|
||
L --> O
|
||
```
|
||
|
||
---
|
||
|
||
## Feature Specifications
|
||
|
||
### 1. View Mode Selector
|
||
|
||
A floating toolbar that allows switching between gallery layouts.
|
||
|
||
**UI Design:**
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ [≡ Grid] [◫ Masonry] [▬ Justified] [◱ Collage] │ [▶ Slideshow ▾] │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**Slideshow Dropdown:**
|
||
```
|
||
┌──────────────────┐
|
||
│ 🎬 Cinema │
|
||
│ ⏯ Classic │
|
||
│ 🖼 Showcase │
|
||
│ ⚡ Discovery │
|
||
│ 🌌 Ambient │
|
||
│ ⚖ Comparison │
|
||
└──────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
### 2. Image Wall Layouts
|
||
|
||
#### 2.1 Masonry Layout (Pinterest-style)
|
||
|
||
Variable height columns that create a waterfall effect.
|
||
|
||
```
|
||
┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐
|
||
│ │ │ │ │ │ │ │
|
||
│ 1 │ │ 2 │ │ │ │ 4 │
|
||
│ │ └──────┘ │ 3 │ │ │
|
||
└──────┘ ┌──────┐ │ │ └──────┘
|
||
┌──────┐ │ │ │ │ ┌──────┐
|
||
│ 5 │ │ 6 │ └──────┘ │ │
|
||
└──────┘ │ │ ┌──────┐ │ 8 │
|
||
┌──────┐ └──────┘ │ 7 │ │ │
|
||
│ 9 │ ┌──────┐ └──────┘ └──────┘
|
||
└──────┘ │ 10 │
|
||
└──────┘
|
||
```
|
||
|
||
**Technical Approach:**
|
||
- CSS columns or CSS Grid with `grid-auto-rows: 1px` and `span` calculation
|
||
- JavaScript to calculate optimal column count based on viewport
|
||
- Preserve natural aspect ratios of images
|
||
- Lazy loading with Intersection Observer
|
||
|
||
**CSS Variables:**
|
||
```css
|
||
--masonry-column-width: 280px;
|
||
--masonry-gap: 12px;
|
||
--masonry-min-columns: 2;
|
||
--masonry-max-columns: 6;
|
||
```
|
||
|
||
#### 2.2 Justified Layout (Google Photos-style)
|
||
|
||
Rows with perfect edge alignment, variable widths.
|
||
|
||
```
|
||
┌────────────┬──────────┬─────────────────┐
|
||
│ 1 │ 2 │ 3 │
|
||
└────────────┴──────────┴─────────────────┘
|
||
┌─────────────────┬────────────┬─────────┐
|
||
│ 4 │ 5 │ 6 │
|
||
└─────────────────┴────────────┴─────────┘
|
||
┌──────────┬─────────────────┬───────────┐
|
||
│ 7 │ 8 │ 9 │
|
||
└──────────┴─────────────────┴───────────┘
|
||
```
|
||
|
||
**Technical Approach:**
|
||
- Linear partition algorithm to distribute images across rows
|
||
- Target row height with flex-grow distribution
|
||
- Smart breakpoints based on aspect ratios
|
||
- Each row is a flex container
|
||
|
||
**Configuration:**
|
||
```javascript
|
||
{
|
||
targetRowHeight: 240,
|
||
minRowHeight: 180,
|
||
maxRowHeight: 320,
|
||
containerPadding: 16,
|
||
imageSpacing: 8
|
||
}
|
||
```
|
||
|
||
#### 2.3 Collage Layout (Magazine-style)
|
||
|
||
Creative mixed-size layout with featured images.
|
||
|
||
```
|
||
┌───────────────────┬─────────┐
|
||
│ │ 2 │
|
||
│ 1 ├─────────┤
|
||
│ FEATURED │ 3 │
|
||
│ ├─────────┤
|
||
├─────────┬─────────┤ 4 │
|
||
│ 5 │ 6 │ │
|
||
└─────────┴─────────┴─────────┘
|
||
```
|
||
|
||
**Technical Approach:**
|
||
- CSS Grid with named areas
|
||
- Template patterns that rotate/cycle
|
||
- Special "featured" designation based on:
|
||
- User favorites (if implemented)
|
||
- Most recent
|
||
- Random selection
|
||
- Subtle rotation transforms (-2° to +2°) on some tiles
|
||
- Optional overlap with z-index layering
|
||
|
||
**Template Patterns:**
|
||
```javascript
|
||
const collagePatterns = [
|
||
'hero-right', // Large left, stack right
|
||
'hero-left', // Stack left, large right
|
||
'hero-center', // Center featured, corners fill
|
||
'magazine', // Asymmetric editorial style
|
||
'scattered' // Random positions with overlap
|
||
];
|
||
```
|
||
|
||
---
|
||
|
||
### 3. Slideshow Modes
|
||
|
||
#### 3.1 Cinema Mode
|
||
|
||
Full-screen immersive experience with cinematic effects.
|
||
|
||
**Features:**
|
||
- **Ambient glow**: Extract dominant colors from image, project as soft backdrop glow
|
||
- **Ken Burns effect**: Subtle pan/zoom animation on images
|
||
- **Vignette overlay**: Soft dark edges for focus
|
||
- **Particle system**: Optional floating light particles/orbs
|
||
- **Audio reactive**: Optional ambient music visualization (future)
|
||
|
||
**Visual Design:**
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
||
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
||
│░░░░░░┌─────────────────────────────────────────────┐░░░░░░░░░░░░│
|
||
│░░░░░░│ │░░░░░░░░░░░░│
|
||
│░░░░░░│ [Image with Ken Burns] │░░░░░░░░░░░░│
|
||
│░░░░░░│ │░░░░░░░░░░░░│
|
||
│░░░░░░│ │░░░░░░░░░░░░│
|
||
│░░░░░░└─────────────────────────────────────────────┘░░░░░░░░░░░░│
|
||
│░░░░░░░░░░░░░░░░░░░ ● ● ● ○ ○ ○ ○ ○ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
||
│░░░░░░░░░░░░░░░░░░░░░ 4 / 24 ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
||
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
||
│░░░░ = Ambient glow from image colors ░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**Controls (appear on hover/touch):**
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ ⏮ ⏯ ⏭ │ ⏱ 5s ▾ │ 🔀 Shuffle │ ℹ Info │ ✕ │
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**Ken Burns Patterns:**
|
||
```javascript
|
||
const kenBurnsPatterns = [
|
||
{ start: 'scale(1) translate(0, 0)', end: 'scale(1.15) translate(-3%, -2%)' },
|
||
{ start: 'scale(1.1) translate(-5%, 0)', end: 'scale(1) translate(0, 0)' },
|
||
{ start: 'scale(1) translate(0, 5%)', end: 'scale(1.12) translate(2%, -3%)' },
|
||
// ... more patterns
|
||
];
|
||
```
|
||
|
||
**Ambient Glow Implementation:**
|
||
```javascript
|
||
// Use canvas to extract dominant colors
|
||
async function extractAmbientColors(imageSrc) {
|
||
const canvas = document.createElement('canvas');
|
||
const ctx = canvas.getContext('2d');
|
||
const img = await loadImage(imageSrc);
|
||
|
||
canvas.width = 50; // Downscale for performance
|
||
canvas.height = 50;
|
||
ctx.drawImage(img, 0, 0, 50, 50);
|
||
|
||
const imageData = ctx.getImageData(0, 0, 50, 50);
|
||
// Quantize colors and find dominant clusters
|
||
return dominantColors(imageData); // Returns [primary, secondary, accent]
|
||
}
|
||
```
|
||
|
||
#### 3.2 Classic Slideshow
|
||
|
||
Clean, professional presentation mode.
|
||
|
||
**Features:**
|
||
- Multiple transition types: fade, slide, zoom, cube
|
||
- Progress bar or dot indicators
|
||
- Timer controls (3s, 5s, 8s, 15s, manual)
|
||
- Loop toggle
|
||
- Random/sequential order
|
||
|
||
**UI:**
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ │
|
||
│ │
|
||
│ ┌───────────────┐ │
|
||
│ ◀ │ │ ▶ │
|
||
│ │ IMAGE │ │
|
||
│ │ │ │
|
||
│ └───────────────┘ │
|
||
│ │
|
||
│ ● ● ● ○ ○ ○ ○ │
|
||
│ ┌─────────────────────────────────────────────────────────────┐ │
|
||
│ │▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│ │
|
||
│ └─────────────────────────────────────────────────────────────┘ │
|
||
│ ⏮ ⏯ ⏭ 🔀 Shuffle ⏱ 5s ✕ │
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**Transitions CSS:**
|
||
```css
|
||
.slide-transition-fade { transition: opacity 0.8s ease; }
|
||
.slide-transition-slide { transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1); }
|
||
.slide-transition-zoom { transition: transform 0.7s ease, opacity 0.7s ease; }
|
||
.slide-transition-cube {
|
||
transform-style: preserve-3d;
|
||
perspective: 1000px;
|
||
transition: transform 0.8s ease;
|
||
}
|
||
```
|
||
|
||
#### 3.3 Showcase Frame Mode
|
||
|
||
Digital picture frame aesthetic with metadata.
|
||
|
||
**Features:**
|
||
- Image displayed with decorative frame/mat
|
||
- Metadata panel (character name, category, date)
|
||
- Ambient room simulation (optional)
|
||
- Clock widget (optional)
|
||
- Subtle animations
|
||
|
||
**Layout:**
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ │
|
||
│ ╔══════════════════════════════════════════════╗ │
|
||
│ ║ ┌──────────────────────────────────────────┐ ║ │
|
||
│ ║ │ │ ║ │
|
||
│ ║ │ │ ║ │
|
||
│ ║ │ IMAGE │ ║ │
|
||
│ ║ │ │ ║ │
|
||
│ ║ │ │ ║ │
|
||
│ ║ └──────────────────────────────────────────┘ ║ │
|
||
│ ╚══════════════════════════════════════════════╝ │
|
||
│ │
|
||
│ Character: Luna Eclipse │
|
||
│ Category: characters • Style: anime │
|
||
│ Created: March 8, 2026 │
|
||
│ 12:34 │
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**Frame Styles:**
|
||
```javascript
|
||
const frameStyles = [
|
||
'minimal', // Thin elegant border
|
||
'classic', // Traditional wooden frame look
|
||
'modern', // Thick black mat, thin metal frame
|
||
'gallery', // White mat, thin black frame
|
||
'floating', // Shadow box effect
|
||
'none' // No frame, edge-to-edge
|
||
];
|
||
```
|
||
|
||
#### 3.4 Discovery Mode (Random Shuffle)
|
||
|
||
Explore your collection with serendipity.
|
||
|
||
**Features:**
|
||
- Random image selection with no repeats until all shown
|
||
- "Like" button to save favorites (session-based)
|
||
- Quick category jump
|
||
- Surprise effects (occasional zoom, pan variations)
|
||
- Stats display ("You've discovered 47 of 234 images")
|
||
|
||
**Controls:**
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ ⚡ DISCOVERY MODE │
|
||
│ │
|
||
│ ┌───────────────────┐ │
|
||
│ │ │ │
|
||
│ │ IMAGE │ │
|
||
│ │ │ │
|
||
│ └───────────────────┘ │
|
||
│ │
|
||
│ ❤️ Like 🔀 Next Random ⏯ Auto │
|
||
│ │
|
||
│ Discovered: 47 / 234 ━━━━━━━░░░░░░░░░░░░ │
|
||
│ │
|
||
│ Quick jump: [Characters] [Actions] [Outfits] [Scenes] [All] │
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
#### 3.5 Ambient Screensaver Mode
|
||
|
||
Artistic background display with effects.
|
||
|
||
**Features:**
|
||
- Fullscreen with auto-hide UI
|
||
- Particle effects (floating light orbs, subtle sparkles)
|
||
- Slow crossfade transitions (10-30 seconds)
|
||
- Color-matched gradient backgrounds
|
||
- Clock overlay option
|
||
- Wake on mouse move
|
||
|
||
**Particle System:**
|
||
```javascript
|
||
const particleConfig = {
|
||
count: 50,
|
||
colors: ['#8b7eff', '#c084fc', '#60a5fa', '#ffffff'],
|
||
minSize: 2,
|
||
maxSize: 8,
|
||
speed: 0.3,
|
||
opacity: [0.1, 0.6],
|
||
blur: [0, 4],
|
||
drift: true // Slight random movement
|
||
};
|
||
```
|
||
|
||
**Visual Effect:**
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ · · · │
|
||
│ · · · │
|
||
│ · ┌─────────────────┐ · │
|
||
│ · │ │ · │
|
||
│ · │ IMAGE │ · · │
|
||
│ │ │ · │
|
||
│ · └─────────────────┘ · │
|
||
│ · · · · · │
|
||
│ · · · │
|
||
│ 12:34 │
|
||
│ · = floating light particles │
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
#### 3.6 Comparison Mode
|
||
|
||
Side-by-side or overlay comparison.
|
||
|
||
**Features:**
|
||
- Two image selection
|
||
- Slider overlay (before/after style)
|
||
- Side-by-side split
|
||
- Onion skin overlay (opacity blend)
|
||
- Difference highlight mode
|
||
- Zoom sync (both images zoom together)
|
||
|
||
**Layouts:**
|
||
```
|
||
SLIDER MODE: SPLIT MODE:
|
||
┌─────────────────────────────┐ ┌───────────┬───────────┐
|
||
│ │ │ │ │ │
|
||
│ IMAGE A │ IMAGE B │ │ IMAGE A │ IMAGE B │
|
||
│ │ │ │ │ │
|
||
│ ◄═══|═══► │ │ │ │
|
||
│ │ │ │ │ │
|
||
└─────────────────────────────┘ └───────────┴───────────┘
|
||
|
||
ONION SKIN: DIFFERENCE:
|
||
┌─────────────────────────────┐ ┌─────────────────────────────┐
|
||
│ │ │ │
|
||
│ IMAGE A + B BLENDED │ │ PIXEL DIFFERENCE VIEW │
|
||
│ │ │ (highlights changes) │
|
||
│ Opacity: ●━━━━━━━○ │ │ │
|
||
│ │ │ │
|
||
└─────────────────────────────┘ └─────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
### 4. Enhanced Lightbox Viewer
|
||
|
||
Upgrade the existing lightbox with professional features.
|
||
|
||
#### 4.1 Zoom & Pan Controls
|
||
|
||
**Features:**
|
||
- Mouse wheel zoom
|
||
- Double-click to fit/fill toggle
|
||
- Click-and-drag panning when zoomed
|
||
- Pinch-to-zoom on touch devices
|
||
- Zoom level indicator
|
||
- Reset button
|
||
|
||
**Implementation:**
|
||
```javascript
|
||
class ZoomPanController {
|
||
constructor(element) {
|
||
this.scale = 1;
|
||
this.translateX = 0;
|
||
this.translateY = 0;
|
||
this.minScale = 0.5;
|
||
this.maxScale = 5;
|
||
}
|
||
|
||
handleWheel(e) {
|
||
const delta = e.deltaY > 0 ? 0.9 : 1.1;
|
||
const newScale = Math.min(this.maxScale, Math.max(this.minScale, this.scale * delta));
|
||
// Zoom toward cursor position
|
||
this.zoomToPoint(newScale, e.clientX, e.clientY);
|
||
}
|
||
|
||
handleDrag(e) {
|
||
if (this.scale > 1) {
|
||
this.translateX += e.movementX;
|
||
this.translateY += e.movementY;
|
||
this.applyTransform();
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 4.2 Info Overlay Panel
|
||
|
||
Slide-out panel with image details.
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ ┌───────────┐│
|
||
│ │ℹ INFO ││
|
||
│ ├───────────┤│
|
||
│ ┌─────────────────────┐ │ ││
|
||
│ │ │ │ Luna ││
|
||
│ │ IMAGE │ │ Eclipse ││
|
||
│ │ │ │ ││
|
||
│ │ │ │ Category: ││
|
||
│ └─────────────────────┘ │ characters││
|
||
│ │ ││
|
||
│ │ Actions: ││
|
||
│ │ standing ││
|
||
│ │ ││
|
||
│ │ [Prompt] ││
|
||
│ │ [Generate]││
|
||
│ └───────────┘│
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
#### 4.3 Thumbnail Strip
|
||
|
||
Quick navigation with visual preview.
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ │
|
||
│ ┌─────────────────┐ │
|
||
│ │ │ │
|
||
│ │ MAIN │ │
|
||
│ │ IMAGE │ │
|
||
│ │ │ │
|
||
│ └─────────────────┘ │
|
||
│ │
|
||
│ ┌─────────────────────────────────────────────────────────────┐ │
|
||
│ │ ▢ ▢ ▢ [▣] ▢ ▢ ▢ ▢ ▢ ▢ ▢ ▢ ▢ ▢ ▢ ▢ ▢ ▢ ▢ ▢ ▢ ▢ ▢ ▢ ▢ ▢ ▢ ▢ │ │
|
||
│ └─────────────────────────────────────────────────────────────┘ │
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
### 5. Keyboard Shortcuts
|
||
|
||
| Key | Action |
|
||
|-----|--------|
|
||
| `←` / `→` | Previous / Next image |
|
||
| `↑` / `↓` | Zoom in / out |
|
||
| `Space` | Toggle slideshow play/pause |
|
||
| `F` | Toggle fullscreen |
|
||
| `I` | Toggle info panel |
|
||
| `G` | Open grid view |
|
||
| `M` | Toggle masonry view |
|
||
| `S` | Start slideshow |
|
||
| `C` | Enter comparison mode |
|
||
| `R` | Random image |
|
||
| `Esc` | Close viewer / exit fullscreen |
|
||
| `1-5` | Set slideshow speed preset |
|
||
| `+` / `-` | Zoom in / out |
|
||
| `0` | Reset zoom |
|
||
|
||
---
|
||
|
||
### 6. Mobile & Touch Optimization
|
||
|
||
**Gestures:**
|
||
- **Swipe left/right**: Navigate images
|
||
- **Swipe up**: Show info panel
|
||
- **Swipe down**: Close viewer
|
||
- **Pinch**: Zoom
|
||
- **Double-tap**: Toggle fit/fill
|
||
- **Long press**: Show context menu
|
||
|
||
**Responsive Breakpoints:**
|
||
```css
|
||
/* Mobile - single column, touch optimized */
|
||
@media (max-width: 576px) { }
|
||
|
||
/* Tablet - 2-3 columns */
|
||
@media (min-width: 577px) and (max-width: 991px) { }
|
||
|
||
/* Desktop - 4-6 columns */
|
||
@media (min-width: 992px) { }
|
||
|
||
/* Large displays - up to 8 columns */
|
||
@media (min-width: 1400px) { }
|
||
```
|
||
|
||
---
|
||
|
||
## File Structure
|
||
|
||
```
|
||
static/
|
||
├── style.css # Add gallery enhancement styles
|
||
├── js/
|
||
│ └── gallery/
|
||
│ ├── gallery-core.js # Main controller
|
||
│ ├── layout-masonry.js # Masonry layout engine
|
||
│ ├── layout-justified.js # Justified layout engine
|
||
│ ├── layout-collage.js # Collage layout engine
|
||
│ ├── slideshow-cinema.js # Cinema mode
|
||
│ ├── slideshow-classic.js # Classic slideshow
|
||
│ ├── slideshow-showcase.js # Showcase frame
|
||
│ ├── mode-discovery.js # Discovery mode
|
||
│ ├── mode-ambient.js # Ambient screensaver
|
||
│ ├── mode-comparison.js # Comparison mode
|
||
│ ├── viewer-zoom.js # Zoom/pan controller
|
||
│ ├── effects-particles.js # Particle system
|
||
│ ├── effects-ambient.js # Ambient color extraction
|
||
│ └── effects-kenburns.js # Ken Burns animations
|
||
│
|
||
templates/
|
||
├── gallery.html # Enhanced with view mode selector
|
||
└── partials/
|
||
└── gallery-viewer.html # New standalone viewer partial
|
||
```
|
||
|
||
---
|
||
|
||
## Implementation Phases
|
||
|
||
### Phase 1: Foundation
|
||
- [ ] Create gallery core controller class
|
||
- [ ] Implement view mode selector UI
|
||
- [ ] Add masonry layout with lazy loading
|
||
- [ ] Enhanced lightbox with zoom/pan
|
||
- [ ] Keyboard shortcut system
|
||
|
||
### Phase 2: Layouts
|
||
- [ ] Justified gallery layout
|
||
- [ ] Collage layout with templates
|
||
- [ ] Thumbnail strip navigation
|
||
- [ ] Mobile swipe gestures
|
||
|
||
### Phase 3: Slideshows
|
||
- [ ] Classic slideshow with transitions
|
||
- [ ] Cinema mode with ambient glow
|
||
- [ ] Ken Burns effect engine
|
||
- [ ] Showcase frame mode
|
||
|
||
### Phase 4: Advanced Features
|
||
- [ ] Discovery mode with favorites
|
||
- [ ] Comparison mode slider
|
||
- [ ] Ambient screensaver with particles
|
||
- [ ] Info panel with metadata
|
||
|
||
### Phase 5: Polish
|
||
- [ ] Performance optimization
|
||
- [ ] Accessibility improvements
|
||
- [ ] Settings persistence
|
||
- [ ] Documentation
|
||
|
||
---
|
||
|
||
## Technical Considerations
|
||
|
||
### Performance
|
||
- Use `IntersectionObserver` for lazy loading
|
||
- Preload next 2 images in slideshow
|
||
- Use `requestAnimationFrame` for animations
|
||
- Debounce resize handlers
|
||
- Use CSS transforms instead of layout properties
|
||
- Consider web workers for color extraction
|
||
|
||
### Browser Support
|
||
- Modern browsers (Chrome, Firefox, Safari, Edge)
|
||
- CSS Grid and Flexbox required
|
||
- Fullscreen API
|
||
- Intersection Observer API
|
||
- Web Animations API preferred
|
||
|
||
### Accessibility
|
||
- ARIA labels on all controls
|
||
- Focus management in modals
|
||
- Reduced motion preference respected
|
||
- Screen reader announcements for image changes
|
||
- Keyboard navigation throughout
|
||
|
||
---
|
||
|
||
## CSS Variables for Gallery Enhancement
|
||
|
||
```css
|
||
/* Gallery Enhancement Variables */
|
||
:root {
|
||
/* Layouts */
|
||
--gallery-gap: 8px;
|
||
--gallery-card-radius: 12px;
|
||
--gallery-masonry-width: 280px;
|
||
--gallery-justified-height: 240px;
|
||
|
||
/* Viewer */
|
||
--viewer-bg: rgba(0, 0, 0, 0.97);
|
||
--viewer-accent: var(--accent);
|
||
--viewer-transition: 0.3s ease;
|
||
|
||
/* Slideshow */
|
||
--slideshow-interval: 5000;
|
||
--kenburns-duration: 8000;
|
||
--transition-duration: 800;
|
||
|
||
/* Effects */
|
||
--ambient-blur: 100px;
|
||
--ambient-opacity: 0.3;
|
||
--particle-count: 50;
|
||
--vignette-opacity: 0.4;
|
||
|
||
/* Frames */
|
||
--frame-color-light: #f5f5f5;
|
||
--frame-color-dark: #1a1a2e;
|
||
--mat-width: 40px;
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Mockup: Cinema Mode
|
||
|
||
```
|
||
╔═══════════════════════════════════════════════════════════════════════╗
|
||
║▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓║
|
||
║▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓║
|
||
║▓▓▓▓▓░░░░░░ ░░░░░▓▓▓▓▓▓║
|
||
║▓▓░░░░░ ░░░░▓▓▓║
|
||
║▓░░░░ ╭─────────────────────────────╮ ░░░▓║
|
||
║░░░░ │ │ ░░║
|
||
║░░ │ │ ░║
|
||
║░ │ ★ IMAGE ★ │ ░║
|
||
║░ │ │ ░║
|
||
║░ │ │ ░║
|
||
║░░ │ │ ░░║
|
||
║░░░ ╰─────────────────────────────╯ ░░░║
|
||
║▓░░░░ ░░▓▓║
|
||
║▓▓░░░░░ • • • ○ ○ ░░░░▓▓▓║
|
||
║▓▓▓▓░░░░░░░ 4 / 24 ░░░░░▓▓▓▓▓▓║
|
||
║▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓▓▓▓▓║
|
||
║▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓║
|
||
╚═══════════════════════════════════════════════════════════════════════╝
|
||
|
||
Legend:
|
||
▓ = Darkest vignette
|
||
░ = Ambient glow (color-matched to image)
|
||
★ = Image with Ken Burns animation
|
||
• = Active indicator, ○ = Inactive
|
||
|
||
Controls appear on hover:
|
||
┌──────────────────────────────────────────────────────────────────────┐
|
||
│ ⏮ │ ⏸ │ ⏭ │ ⏱ 5s ▾ │ 🔀 Shuffle │ ℹ️ Info │ ✕ │
|
||
└──────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## Next Steps
|
||
|
||
1. **Review and approve** this plan
|
||
2. **Prioritize features** for MVP
|
||
3. **Begin Phase 1** implementation
|
||
4. **Iterate** based on feedback
|
||
|
||
Would you like me to proceed with implementation, or would you like to adjust any aspects of this plan?
|