414 lines
14 KiB
Markdown
414 lines
14 KiB
Markdown
# FastLED UI Layout Management System Design
|
||
|
||
## Overview
|
||
|
||
This document outlines the design for a comprehensive, responsive UI layout management system for the FastLED WebAssembly compiler interface. The system provides dynamic layout calculation, state management, and container coordination to ensure optimal UI presentation across different screen sizes and orientations.
|
||
|
||
## Architecture
|
||
|
||
### Core Components
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ UILayoutPlacementManager │
|
||
│ (Main Orchestrator) │
|
||
├─────────────────────────────────────────────────────────────────┤
|
||
│ • Coordinates all layout operations │
|
||
│ • Applies CSS styling and grid layouts │
|
||
│ • Handles layout mode transitions │
|
||
│ • Manages container visibility │
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
│
|
||
┌───────────────┼───────────────┐
|
||
│ │ │
|
||
▼ ▼ ▼
|
||
┌─────────────────────┐ ┌─────────────────┐ ┌─────────────────────┐
|
||
│ LayoutStateManager │ │ ResizeCoordinator│ │ ColumnValidator │
|
||
│ (State & Logic) │ │ (Event Handling) │ │ (Optimization) │
|
||
├─────────────────────┤ ├─────────────────┤ ├─────────────────────┤
|
||
│ • Viewport tracking │ │ • Resize events │ │ • Layout validation │
|
||
│ • Layout calculation│ │ • Debouncing │ │ • Performance check │
|
||
│ • State transitions │ │ • Event dispatch │ │ • Efficiency metrics│
|
||
│ • Container states │ │ • Coordination │ │ • Optimization hints│
|
||
└─────────────────────┘ └─────────────────┘ └─────────────────────┘
|
||
```
|
||
|
||
## Component Specifications
|
||
|
||
### 1. UILayoutPlacementManager
|
||
|
||
**Purpose**: Main orchestrator for all layout operations
|
||
**Location**: `src/platforms/wasm/compiler/modules/ui_layout_placement_manager.js`
|
||
|
||
**Key Responsibilities:**
|
||
- Apply layout styles to DOM elements
|
||
- Coordinate between state manager and UI components
|
||
- Handle layout mode transitions (mobile, tablet, desktop, ultrawide)
|
||
- Manage container visibility and grid configurations
|
||
|
||
**Public API:**
|
||
```javascript
|
||
class UILayoutPlacementManager {
|
||
constructor()
|
||
applyLayout()
|
||
forceLayoutUpdate()
|
||
validateAndOptimizeLayout()
|
||
getLayoutInfo()
|
||
updateContentMetrics(totalGroups, totalElements)
|
||
}
|
||
```
|
||
|
||
### 2. LayoutStateManager
|
||
|
||
**Purpose**: Unified state management for layout calculations
|
||
**Location**: `src/platforms/wasm/compiler/modules/layout_state_manager.js`
|
||
|
||
**Key Features:**
|
||
- Centralized layout state storage
|
||
- Viewport and breakpoint detection
|
||
- Canvas and UI column calculations
|
||
- Container state tracking
|
||
- Atomic state updates with change events
|
||
|
||
**State Schema:**
|
||
```javascript
|
||
{
|
||
mode: 'mobile' | 'tablet' | 'desktop' | 'ultrawide',
|
||
viewportWidth: number,
|
||
availableWidth: number,
|
||
canvasSize: number,
|
||
uiColumns: number,
|
||
uiColumnWidth: number,
|
||
uiTotalWidth: number,
|
||
canExpand: boolean,
|
||
container2Visible: boolean,
|
||
totalGroups: number,
|
||
totalElements: number
|
||
}
|
||
```
|
||
|
||
### 3. ResizeCoordinator
|
||
|
||
**Purpose**: Coordinated resize event handling
|
||
**Location**: `src/platforms/wasm/compiler/modules/resize_coordinator.js`
|
||
|
||
**Features:**
|
||
- Debounced resize event handling
|
||
- Cross-component resize coordination
|
||
- Performance-optimized event dispatch
|
||
- Race condition prevention
|
||
|
||
### 4. ColumnValidator
|
||
|
||
**Purpose**: Layout optimization and validation
|
||
**Location**: `src/platforms/wasm/compiler/modules/column_validator.js`
|
||
|
||
**Capabilities:**
|
||
- Layout efficiency analysis
|
||
- Column width optimization
|
||
- Content density validation
|
||
- Performance recommendations
|
||
|
||
## Layout Modes
|
||
|
||
### Mobile (≤ 768px)
|
||
- **Layout**: Single column (1×N grid)
|
||
- **Canvas**: Full width, centered
|
||
- **UI**: Stacked below canvas
|
||
- **Containers**: Only primary UI container visible
|
||
|
||
### Tablet (769px - 1199px)
|
||
- **Layout**: Two columns (2×N grid)
|
||
- **Canvas**: Left side, fixed width
|
||
- **UI**: Right side, flexible width
|
||
- **Containers**: Primary UI container only
|
||
|
||
### Desktop (1200px - 1599px)
|
||
- **Layout**: Two columns (2×N grid)
|
||
- **Canvas**: Left side, larger fixed width
|
||
- **UI**: Right side, flexible width
|
||
- **Containers**: Primary UI container only
|
||
|
||
### Ultrawide (≥ 1600px)
|
||
- **Layout**: Three columns (3×N grid)
|
||
- **Canvas**: Center, fixed width
|
||
- **UI**: Left and right sides, flexible widths
|
||
- **Containers**: Both primary and secondary UI containers
|
||
|
||
## Configuration
|
||
|
||
### Layout Constants
|
||
```javascript
|
||
{
|
||
minCanvasSize: 320,
|
||
maxCanvasSize: 800,
|
||
minUIColumnWidth: 280,
|
||
maxUIColumnWidth: 400,
|
||
horizontalGap: 40,
|
||
verticalGap: 20,
|
||
containerPadding: 40,
|
||
maxUIColumns: 3,
|
||
preferredUIColumnWidth: 320,
|
||
canvasExpansionRatio: 0.6,
|
||
minContentRatio: 0.4
|
||
}
|
||
```
|
||
|
||
### Breakpoints
|
||
```javascript
|
||
{
|
||
mobile: { max: 768 },
|
||
tablet: { min: 769, max: 1199 },
|
||
desktop: { min: 1200, max: 1599 },
|
||
ultrawide: { min: 1600 }
|
||
}
|
||
```
|
||
|
||
## Implementation Todos
|
||
|
||
### Phase 1: Core Infrastructure ✅
|
||
- [x] Create LayoutStateManager with unified state handling
|
||
- [x] Implement ResizeCoordinator for event management
|
||
- [x] Build ColumnValidator for layout optimization
|
||
- [x] Refactor UILayoutPlacementManager to use new components
|
||
|
||
### Phase 2: State Management ✅
|
||
- [x] Implement atomic state updates with change events
|
||
- [x] Add container state tracking and visibility management
|
||
- [x] Create viewport detection and breakpoint handling
|
||
- [x] Add content metrics tracking (groups, elements)
|
||
|
||
### Phase 3: Layout Calculation ✅
|
||
- [x] Implement responsive canvas sizing algorithms
|
||
- [x] Add dynamic UI column width calculation
|
||
- [x] Create layout mode transition logic
|
||
- [x] Add grid template generation for CSS
|
||
|
||
### Phase 4: Event Coordination ✅
|
||
- [x] Implement debounced resize handling
|
||
- [x] Add cross-component event coordination
|
||
- [x] Create performance-optimized event dispatch
|
||
- [x] Add race condition prevention
|
||
|
||
### Phase 5: Optimization & Validation ✅
|
||
- [x] Create layout efficiency analysis
|
||
- [x] Implement column width optimization
|
||
- [x] Add content density validation
|
||
- [x] Create performance monitoring and recommendations
|
||
|
||
### Phase 6: Integration & Polish ✅
|
||
- [x] Integrate with existing UI manager
|
||
- [x] Add backward compatibility for legacy APIs
|
||
- [x] Implement proper error handling and fallbacks
|
||
- [x] Add comprehensive logging and debugging support
|
||
|
||
### Phase 7: Testing & Documentation
|
||
- [ ] Create comprehensive unit tests for all components
|
||
- [ ] Add integration tests for layout scenarios
|
||
- [ ] Create visual regression tests for different screen sizes
|
||
- [ ] Add performance benchmarks and optimization tests
|
||
- [ ] Document API usage and configuration options
|
||
|
||
### Phase 8: Advanced Features
|
||
- [ ] Add animation support for layout transitions
|
||
- [ ] Implement custom breakpoint configuration
|
||
- [ ] Add layout templates and presets
|
||
- [ ] Create advanced grid layout options
|
||
- [ ] Add accessibility features and ARIA support
|
||
|
||
### Phase 9: Performance Optimization
|
||
- [ ] Implement layout caching for repeated calculations
|
||
- [ ] Add virtual scrolling for large UI element lists
|
||
- [ ] Optimize DOM manipulation and CSS application
|
||
- [ ] Add lazy loading for non-visible UI components
|
||
- [ ] Implement progressive enhancement for slower devices
|
||
|
||
### Phase 10: Extensibility
|
||
- [ ] Create plugin system for custom layout algorithms
|
||
- [ ] Add theme and styling customization APIs
|
||
- [ ] Implement layout export/import functionality
|
||
- [ ] Create developer tools for layout debugging
|
||
- [ ] Add real-time layout editing capabilities
|
||
|
||
## Benefits
|
||
|
||
### Performance
|
||
- **Debounced Events**: Prevents excessive layout recalculations
|
||
- **Atomic Updates**: Eliminates partial state inconsistencies
|
||
- **Efficient DOM**: Minimizes CSS recalculations and reflows
|
||
- **Optimized Calculations**: Smart caching and memoization
|
||
|
||
### Maintainability
|
||
- **Separation of Concerns**: Each component has a single responsibility
|
||
- **Unified State**: Single source of truth for layout information
|
||
- **Modular Design**: Components can be tested and modified independently
|
||
- **Clear APIs**: Well-defined interfaces between components
|
||
|
||
### User Experience
|
||
- **Responsive Design**: Seamless adaptation to any screen size
|
||
- **Smooth Transitions**: Coordinated layout changes without flicker
|
||
- **Optimal Layouts**: Intelligent space utilization across devices
|
||
- **Fast Rendering**: Performance-optimized for real-time applications
|
||
|
||
### Developer Experience
|
||
- **Type Safety**: Comprehensive JSDoc annotations for IDE support
|
||
- **Debugging Tools**: Built-in logging and state inspection
|
||
- **Extensible**: Easy to add new layout modes and features
|
||
- **Documentation**: Clear API documentation and usage examples
|
||
|
||
## JSON UI Persistent State
|
||
|
||
### State Management Architecture
|
||
The system now includes comprehensive JSON-based state persistence implemented in commit `86d9b7d5d`. This enables:
|
||
|
||
- **Persistent Layout State**: All layout configurations stored as JSON with atomic updates
|
||
- **UI Element State Tracking**: Complete state management for UI elements with change events
|
||
- **Recording/Playback System**: Full UI interaction recording and replay capabilities
|
||
- **Container State Management**: Visibility and configuration state for all UI containers
|
||
|
||
### Core State Components
|
||
|
||
#### LayoutStateManager
|
||
**Location**: `src/platforms/wasm/compiler/modules/layout_state_manager.js:487`
|
||
|
||
Provides centralized JSON state management with:
|
||
```javascript
|
||
{
|
||
mode: 'mobile' | 'tablet' | 'desktop' | 'ultrawide',
|
||
viewportWidth: number,
|
||
availableWidth: number,
|
||
canvasSize: number,
|
||
uiColumns: number,
|
||
uiColumnWidth: number,
|
||
uiTotalWidth: number,
|
||
canExpand: boolean,
|
||
container2Visible: boolean,
|
||
totalGroups: number,
|
||
totalElements: number,
|
||
containers: {
|
||
'ui-controls': { visible: boolean, columns: number, width: number },
|
||
'ui-controls-2': { visible: boolean, columns: number, width: number }
|
||
}
|
||
}
|
||
```
|
||
|
||
#### UIRecorder
|
||
**Location**: `src/platforms/wasm/compiler/modules/ui_recorder.js:517`
|
||
|
||
Records UI state changes as JSON events:
|
||
```javascript
|
||
{
|
||
recording: {
|
||
version: "1.0",
|
||
startTime: "ISO8601",
|
||
endTime: "ISO8601",
|
||
metadata: { recordingId: string, layoutMode: string, totalDuration: number }
|
||
},
|
||
events: [
|
||
{
|
||
timestamp: number,
|
||
type: 'add' | 'update' | 'remove',
|
||
elementId: string,
|
||
data: { elementType?: string, value?: any, previousValue?: any, elementConfig?: Object }
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
#### UIPlayback
|
||
**Location**: `src/platforms/wasm/compiler/modules/ui_playback.js:596`
|
||
|
||
Reconstructs UI from JSON state with:
|
||
- Event-by-event playback with timing control
|
||
- Speed control and pause/resume functionality
|
||
- Element state validation and restoration
|
||
- Progress tracking and timeline navigation
|
||
|
||
### UI Reconstruction Benefits
|
||
|
||
Instead of manipulating DOM objects directly, the JSON state system enables:
|
||
|
||
1. **State-Driven Reconstruction**: Rebuild entire UI from current JSON state
|
||
2. **Atomic Updates**: All changes applied atomically to prevent inconsistencies
|
||
3. **Time Travel**: Navigate to any point in UI history via recorded states
|
||
4. **State Validation**: Verify UI consistency against recorded state
|
||
5. **Reproducible Layouts**: Exact recreation of UI configurations
|
||
|
||
### Usage Pattern for Reconstruction
|
||
|
||
```javascript
|
||
// Get current UI state
|
||
const currentState = layoutManager.stateManager.getState();
|
||
|
||
// Reconstruct UI from state instead of DOM manipulation
|
||
function reconstructUI(state) {
|
||
// Clear existing UI
|
||
clearAllContainers();
|
||
|
||
// Rebuild from JSON state
|
||
applyLayoutFromState(state);
|
||
recreateElementsFromState(state);
|
||
restoreContainerVisibility(state);
|
||
}
|
||
|
||
// Apply state changes
|
||
layoutManager.stateManager.updateState(newStateData);
|
||
```
|
||
|
||
## Integration Points
|
||
|
||
### UI Manager Integration
|
||
```javascript
|
||
// In JsonUiManager constructor
|
||
this.layoutManager = new UILayoutPlacementManager();
|
||
|
||
// Listen for layout changes
|
||
this.layoutManager.stateManager.addStateChangeListener((changeEvent) => {
|
||
const { state } = changeEvent;
|
||
this.onLayoutChange(state.mode);
|
||
});
|
||
```
|
||
|
||
### Container Management
|
||
```javascript
|
||
// Check container visibility before placing elements
|
||
const container2State = this.layoutManager.stateManager.getContainerState('ui-controls-2');
|
||
if (container2State && container2State.visible) {
|
||
// Use multi-container layout
|
||
} else {
|
||
// Use single-container layout
|
||
}
|
||
```
|
||
|
||
### Content Updates
|
||
```javascript
|
||
// Update content metrics when UI elements change
|
||
this.layoutManager.updateContentMetrics(totalGroups, totalElements);
|
||
|
||
// Force layout recalculation when needed
|
||
this.layoutManager.forceLayoutUpdate();
|
||
```
|
||
|
||
## Future Enhancements
|
||
|
||
### Advanced Layout Modes
|
||
- **Split-screen**: Side-by-side canvas and code editor
|
||
- **Picture-in-picture**: Floating canvas with overlay UI
|
||
- **Full-screen**: Immersive canvas mode with minimal UI
|
||
- **Multi-monitor**: Extended layout across multiple displays
|
||
|
||
### Dynamic Content
|
||
- **Adaptive UI**: UI elements that resize based on content
|
||
- **Collapsible sections**: Expandable/collapsible UI groups
|
||
- **Floating panels**: Draggable and dockable UI components
|
||
- **Custom layouts**: User-defined layout configurations
|
||
|
||
### Accessibility
|
||
- **Screen reader support**: Proper ARIA labels and navigation
|
||
- **Keyboard navigation**: Full keyboard accessibility
|
||
- **High contrast**: Theme support for visual accessibility
|
||
- **Responsive text**: Scalable fonts and UI elements
|
||
|
||
---
|
||
|
||
*This design provides a robust foundation for responsive UI layout management in the FastLED WebAssembly compiler, ensuring optimal user experience across all device types and screen sizes.* |