Zustand Slices (react_ui/src/data/slices/)
Each Zustand store is defined as a slice — a function that returns state + actions for one domain. Slices are composed into full stores in store.ts.
Files
| Slice | Store ID | Persisted To | Purpose |
|---|---|---|---|
transport.ts | transport:state | daw.state.json | BPM, key signature, scale, loop state, playback position. Git-tracked. |
mixer.ts | mixer:state | daw.mixer.json | Track list, volumes, pans, mutes, solos, sends, plugins, notes, sections. Git-tracked — changes trigger commits. |
chat.ts | chat:state | daw.ai.json | AI chat messages, threads, right panel visibility, active model. Git-tracked. |
lyria.ts | ai:lyria | daw.ai.json | AI music generation config per track (temperature, density, brightness, prompts). Git-tracked. |
collab.ts | — | — | Collaboration state: connected users, room info, invite codes, cursor positions. Not persisted. |
inlineGenerate.ts | — | — | Inline AI generation state: drag region, generation progress, results. Tracks Option+click-drag audio/MIDI generation. |
customEditors.ts | — | — | Custom editor panel state: which stock plugin UI is active, editor panel visibility. |
scriptFxEditors.ts | — | — | ScriptFX editor state: open editors, script content, compilation status. |
index.ts | — | — | Barrel exports. |
Slice Pattern
Each slice follows this pattern:store.ts:
Design Principles
- One slice per domain — Don’t mix mixer state with transport state. Each slice owns one file and one
StateCreator. - Actions inside the slice — State actions (setters, computed updates) live in the slice, not in components.
- Integer rounding for mixer —
setVolume()andsetPan()round to integers. This is critical for echo prevention — float precision diffs would cause infinite commit loops. - Partial merge for engine updates — When the engine pushes state via events, use
setState((prev) => ({ ...prev, ...partial }))to avoid overwriting fields the engine side doesn’t know about. partializefor persistence — Use thepartializeoption to exclude transient fields (likeinitialized) from persistence. Only persist what should survive a reload.