Files
code-sinth/docs/roadmap.md
Jose Luis Montañes 3c1b1d4aff track 1: foundation polish — splitter, custom scrollbars, micro-states
Adds docs/roadmap.md outlining the 4-track plan (foundation, surface
aesthetics, organizable panel, theming) and ships the first track.

- Resizable splitter between editor and control surface (drag the seam,
  double-click to reset). Width persists in localStorage.
- Custom scrollbars (WebKit pseudo-elements + Firefox scrollbar-color)
  applied globally so CodeMirror's .cm-scroller, the right pane and the
  piano roll all match the dark theme.
- Header separators between transport / gain / info groups.
- Smooth transitions on buttons, range thumbs and surface borders.
- :focus-visible rings using accent-glow color token.
- Pulse animation on the live status dot.
- New design-system tokens for layout (--right-w, --splitter-w),
  timing (--t-fast/base/slow), and panel hierarchy (--panel-hi,
  --gutter-hi, --divider, --fg-mute, --accent-glow).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 17:42:53 +02:00

113 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# roadmap — code-sinth MVP → product
The MVP works end-to-end: parser, audio engine (Python + JS/AudioWorklet),
hot-reload, inline waveforms, knobs, faders, step sequencer, piano roll.
Now we polish the web app into something that looks and feels like an
instrument, not a developer demo.
## Vision
A single static web page where:
- The patch language is the source of truth for **what's connected**.
- The control surface (right pane) is the source of truth for **how you play it**:
positions, layout, color, scrubbing.
- Everything you change in either place persists across reloads (patch in
whatever editor you use; surface state in `localStorage` indexed by patch).
- The aesthetic sits between Reaktor 6, Teenage Engineering OP-1, and a
modern terminal — dark base, phosphor accents, no skeuomorphism.
## Tracks
Four tracks. Each is independently shippable; the order below reflects
"unblocks the most other work first".
### Track 1 — Foundation polish · status: in progress
Concrete bricks the rest of the work sits on.
- [ ] **Resizable splitter** between editor and control surface. Drag the
vertical seam to rebalance widths. `localStorage` persistence.
Min widths so neither pane collapses.
- [ ] **Custom scrollbars** (WebKit `::-webkit-scrollbar` + Firefox
`scrollbar-color`) — thin, dark, accent on hover. Applied globally
so CodeMirror's `.cm-scroller`, the right pane, the piano roll
and step seq overflow inherit the same style.
- [ ] **Focus / hover micro-states**. Buttons, inputs, controls all get
consistent `transition` timings and `:focus-visible` rings.
- [ ] **Header polish**. The top bar gets a proper visual hierarchy,
grouped controls (transport, gain, status) instead of a flex blob.
Done when: dragging the seam feels natural, scrollbars match the rest
of the dark theme everywhere, no default-browser styling leaks through.
### Track 2 — Surface aesthetics
Rebuild each surface to feel premium. For each, deliver 23 visual
variants in a sandbox before committing.
- [ ] **Knob**: dimensional dial with gradient + accent ring, micro-anim
on change, label in small caps, value display below.
- [ ] **Fader**: gradient track, slimmer cap, optional scale marks.
- [ ] **Step sequencer**: cells with subtle inner glow when on, more
prominent beat dividers, animated playhead trail.
- [ ] **Piano roll**: more realistic key strip (white keys with border,
black keys inset), cells with rounded corners, beat dividers every
4 columns more visible, octave C row marked.
- [ ] **Wave widgets** (inline): grid lines optional, peak indicator,
smoother line drawing (anti-aliased Bezier).
Reference: Ableton Live's macros, Bitwig modulators, Reaktor 6 Blocks,
Teenage Engineering's hardware.
### Track 3 — Organizable surface panel
Each surface becomes a **card** the user can rearrange and customize.
This is the largest track — needs careful state design.
- [ ] **Card chrome**: header with node name, drag handle, color
override picker, compact/expanded toggle.
- [ ] **Drag-drop reorder** within the right pane. Probable approach:
CSS Grid with grid-auto-flow + a Sortable-style implementation
(we won't pull in a library — ~150 lines hand-rolled).
- [ ] **Per-card accent color** override. Defaults to the global
`--accent`; user can pick per-surface.
- [ ] **Per-card size** (compact knob row vs full panel) where it makes
sense.
- [ ] **Persistence**: layout state in `localStorage`, keyed by a hash
of the patch text + node name so each patch remembers its layout.
- [ ] **Reset layout** button.
Decision deferred: should the layout be expressible in the patch
language as `@layout` directives? Pro: shareable, reproducible.
Con: muddies the language. Default answer for now: no, layout is
UI-only state. Add export/import to a JSON blob if shareability
matters later.
### Track 4 — Theming
The current single-file approach already uses CSS custom properties.
Make it a real theme system.
- [ ] Theme tokens consolidated and named coherently
(`--surface-1`, `--surface-2`, `--accent-primary`, `--accent-mute`).
- [ ] 3 packaged themes: **phosphor** (current), **monochrome**, **warm**.
- [ ] Theme picker in the header. Persists in `localStorage`.
- [ ] Per-card override (Track 3) layered on top.
## Out of scope (for now)
- MIDI input. Web MIDI works but not on Safari and the UX needs design.
- Mobile / touch optimization. Worth a pass later but not in this round.
- A landing / docs page. After the app itself feels finished.
- Patch-language enhancements (string literals, named voices in poly,
modulation matrices). Engine-track work, separate roadmap.
## Working agreement
- One track at a time, but tracks are paralleliable when ergonomic.
- Each track ends with a screenshot review before merging the changes
into the main `web/index.html`.
- For visually-driven changes, propose 23 variants and pick before
committing.