# DAW UI LAYOUT & PANEL SYSTEM ARCHITECTURE This document details the interface layout solution (UI Layout Architecture), HTML/CSS structure, and interaction algorithms (Resizing, Scrolling) for a Hybrid DAW system, supporting responsive flexible scaling across Panels and the bottom dock strip. --- ## 1. Overall Layout Diagram (Grid Structure) The application interface is structured around 3 main axes following an App Shell model (`Viewport Locked 100vh`): ```text ┌──────────────────────────────────────────────────────────────────────────────────┐ │ Top Navigation & Transport Toolbar (Fixed Top Bar) │ ├───────────────────────────────────────────────────────────┬──────────────────────┤ │ │ RIGHT COLUMN │ │ MAIN WORKSPACE │ (RIGHT SIDEBAR) │ │ ┌───────────────────────┬───────────────────────────────┐ │ ┌──────────────────┐ │ │ │ Track Control Panels │ Timeline / Audio Viewport │ │ │ Media Explorer │ │ │ │ (Track List) │ (Beat Grid & Waveforms) │ │ │ (Dynamic Height) │ │ │ │ │ │ │ ├──────────────────┤ │ │ │ │ │ │ │ AI Panel │ │ │ │ │ │ │ │ (Dynamic Height) │ │ │ └───────────────────────┴───────────────────────────────┘ │ └──────────────────┘ │ ├───────────────────────────────────────────────────────────┴──────────────────────┤ │ BOTTOM DOCK PANEL STRIP - Horizontal Scroll (Overflow-X Auto) │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ Export Panel │ │ DSP Tools │ │ Panel 03 │ │ Panel 04... │ ──────► │ │ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ │ ├──────────────────────────────────────────────────────────────────────────────────┤ │ Status Bar (Fixed Bottom Status) │ └──────────────────────────────────────────────────────────────────────────────────┘ ``` --- ## 2. Layout Region Details ### A. Main Workspace (Center Region) * **Function:** Contains the track list (Track Controls), timeline ruler (Timeline Ruler), and audio/MIDI display areas (Audio Waveform & Piano Roll Clip Grid). * **Behavior:** Auto-expands (`flex-grow: 1`) to fill the remaining screen space after subtracting the width of the Right Sidebar and the height of the Bottom Panel. ### B. Bottom Panel Dock Strip (Bottom Row) * **Technical Specifications:** * **Flexible Horizontal Scroll:** The container has a fixed height (e.g., `220px`), using `overflow-x: auto` and `display: flex`. * **Sub-Panels:** Houses a list of independent Card/Tile tools (Export Panel, Python DSP Tools Panel, Selection Panel, FX Panel, etc.). * **No Shrinking (`flex-shrink: 0`):** Each Sub-Panel is configured with `flex-shrink: 0` and a minimum width (`min-width: 280px - 350px`). When the combined width of all panels exceeds the screen width, a horizontal scrollbar appears automatically. ### C. Right Resizable Sidebar (Multi-Panel Right Column) * **Technical Specifications:** * **Width Resizing:** The entire right column can be resized by dragging its left border (Border Left Drag Handle) to expand or collapse the visible space of the Main Workspace. * **Vertical Stacking:** Houses stacked child panels (e.g., Media Explorer, AI Panel, Inspector, etc.). * **Independent Height Resizing:** Horizontal splitters (Horizontal Splitter / Resizer Handle) sit between stacked child panels, allowing users to drag up/down to adjust height ratios between panels. --- ## 3. HTML & CSS Framework Implementation ### HTML Core Structure ```html
...
...
...
...
``` ### CSS System Architecture ```css :root { --right-sidebar-width: 320px; --bottom-strip-height: 220px; --top-bar-height: 80px; --status-bar-height: 25px; --panel-border-color: #2a2a2a; } /* Fullscreen Fixed App Shell */ .daw-app-shell { display: flex; flex-direction: column; width: 100vw; height: 100vh; overflow: hidden; background-color: #121212; color: #e0e0e0; } /* Middle Section holding Main Workspace and Right Sidebar */ .daw-body-container { display: flex; flex: 1; height: calc(100vh - var(--top-bar-height) - var(--bottom-strip-height) - var(--status-bar-height)); position: relative; overflow: hidden; } /* Auto-expanding Main Workspace */ .daw-main-workspace { flex: 1; display: flex; overflow: hidden; } /* Right Sidebar with Width controlled via CSS Variable */ .daw-right-sidebar { width: var(--right-sidebar-width); min-width: 200px; max-width: 600px; display: flex; flex-direction: column; background-color: #1a1a1a; border-left: 1px solid var(--panel-border-color); } /* Vertically stacked child Panels in Right Sidebar */ .sidebar-panel { display: flex; flex-direction: column; overflow: hidden; background: #1e1e1e; border-bottom: 1px solid var(--panel-border-color); } #panel-media-explorer { height: 50%; /* Default 50/50 split */ min-height: 100px; } #panel-ai { flex: 1; /* Fills remaining height */ min-height: 100px; } /* BOTTOM ROW: Enables Horizontal Scrolling */ .daw-bottom-strip { height: var(--bottom-strip-height); display: flex; flex-direction: row; align-items: center; gap: 10px; padding: 8px; overflow-x: auto; /* Enables horizontal scroll when panels overflow */ overflow-y: hidden; background-color: #161616; border-top: 1px solid var(--panel-border-color); white-space: nowrap; } /* Optimized custom horizontal scrollbar for DAW styling */ .daw-bottom-strip::-webkit-scrollbar { height: 8px; } .daw-bottom-strip::-webkit-scrollbar-thumb { background: #3a3a3a; border-radius: 4px; } .daw-bottom-strip::-webkit-scrollbar-thumb:hover { background: #00ffcc; } /* Sub-panels inside the bottom strip */ .bottom-panel { flex: 0 0 auto; /* Prevents shrinking, locks content dimensions */ width: 320px; height: 100%; background-color: #222; border: 1px solid #333; border-radius: 6px; box-sizing: border-box; } /* RESIZER HANDLES */ .resizer-col-handle { width: 5px; cursor: ew-resize; /* Horizontal resize cursor */ background: transparent; transition: background 0.2s; z-index: 10; } .resizer-col-handle:hover, .resizer-col-handle:active { background: #00ffcc; } .resizer-row-handle { height: 5px; cursor: ns-resize; /* Vertical resize cursor */ background: transparent; transition: background 0.2s; z-index: 10; } .resizer-row-handle:hover, .resizer-row-handle:active { background: #00ffcc; } ``` --- ## 4. Interaction Algorithms (JS Resizing Logic) To handle smooth resizing without stuttering or dropped events when dragging over `iframe` or `canvas` elements, the algorithms rely on `pointerdown`, `pointermove`, and `pointerup` events. ### A. Right Sidebar Width Resizing Algorithm (Horizontal Resizer) ```javascript const colResizer = document.getElementById('col-resizer'); const rightSidebar = document.getElementById('right-sidebar'); colResizer.addEventListener('pointerdown', (e) => { e.preventDefault(); colResizer.setPointerCapture(e.pointerId); const startX = e.clientX; const startWidth = rightSidebar.getBoundingClientRect().width; const onPointerMove = (moveEvent) => { // Delta calculation: dragging left increases width, dragging right decreases width const deltaX = startX - moveEvent.clientX; const newWidth = Math.max(200, Math.min(600, startWidth + deltaX)); document.documentElement.style.setProperty('--right-sidebar-width', `${newWidth}px`); }; const onPointerUp = (upEvent) => { colResizer.releasePointerCapture(upEvent.pointerId); colResizer.removeEventListener('pointermove', onPointerMove); colResizer.removeEventListener('pointerup', onPointerUp); }; colResizer.addEventListener('pointermove', onPointerMove); colResizer.addEventListener('pointerup', onPointerUp); }); ``` ### B. Right Sidebar Panel Height Resizing Algorithm (Vertical Resizer) ```javascript const rowResizer = document.getElementById('row-resizer-1'); const topPanel = document.getElementById('panel-media-explorer'); rowResizer.addEventListener('pointerdown', (e) => { e.preventDefault(); rowResizer.setPointerCapture(e.pointerId); const startY = e.clientY; const startHeight = topPanel.getBoundingClientRect().height; const onPointerMove = (moveEvent) => { const deltaY = moveEvent.clientY - startY; const newHeight = Math.max(100, startHeight + deltaY); topPanel.style.height = `${newHeight}px`; topPanel.style.flex = 'none'; // Switch from flex ratio to fixed px during drag }; const onPointerUp = (upEvent) => { rowResizer.releasePointerCapture(upEvent.pointerId); rowResizer.removeEventListener('pointermove', onPointerMove); rowResizer.removeEventListener('pointerup', onPointerUp); }; colResizer.addEventListener('pointermove', onPointerMove); colResizer.addEventListener('pointerup', onPointerUp); }); ``` --- ## 5. Summary of Solution Advantages * **Native Horizontal Scrolling:** The bottom Dock area flexibly accommodates an unlimited number of Panels. Users can scroll horizontally (`Shift + Mouse Wheel`) or use a trackpad to browse panels easily. * **Smooth & Accurate Resizing:** Utilizing Pointer Capture ensures drag interactions do not drop or break even when the cursor moves rapidly beyond the Resizer handle's bounds. * **Standardized CSS Variables:** Enables easy persistence of layout states (`Width`/`Height`) to the browser's `localStorage`, restoring the user's custom layout configuration on app reload.