14 KiB
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:
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:
{
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
{
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
{
mobile: { max: 768 },
tablet: { min: 769, max: 1199 },
desktop: { min: 1200, max: 1599 },
ultrawide: { min: 1600 }
}
Implementation Todos
Phase 1: Core Infrastructure ✅
- Create LayoutStateManager with unified state handling
- Implement ResizeCoordinator for event management
- Build ColumnValidator for layout optimization
- Refactor UILayoutPlacementManager to use new components
Phase 2: State Management ✅
- Implement atomic state updates with change events
- Add container state tracking and visibility management
- Create viewport detection and breakpoint handling
- Add content metrics tracking (groups, elements)
Phase 3: Layout Calculation ✅
- Implement responsive canvas sizing algorithms
- Add dynamic UI column width calculation
- Create layout mode transition logic
- Add grid template generation for CSS
Phase 4: Event Coordination ✅
- Implement debounced resize handling
- Add cross-component event coordination
- Create performance-optimized event dispatch
- Add race condition prevention
Phase 5: Optimization & Validation ✅
- Create layout efficiency analysis
- Implement column width optimization
- Add content density validation
- Create performance monitoring and recommendations
Phase 6: Integration & Polish ✅
- Integrate with existing UI manager
- Add backward compatibility for legacy APIs
- Implement proper error handling and fallbacks
- 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:
{
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:
{
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:
- State-Driven Reconstruction: Rebuild entire UI from current JSON state
- Atomic Updates: All changes applied atomically to prevent inconsistencies
- Time Travel: Navigate to any point in UI history via recorded states
- State Validation: Verify UI consistency against recorded state
- Reproducible Layouts: Exact recreation of UI configurations
Usage Pattern for Reconstruction
// 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
// 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
// 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
// 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.