2.2 KiB
Architecture
Waveform Analysis uses a hybrid architecture. Vue Composition API remains the orchestration boundary, while classes are reserved for domain objects with lifecycle or algorithm-selection invariants.
Boundaries
useWaveformChartControlleris the facade for the chart. It composes composables and exposes the existing reactive controller surface; it owns no independent copy of component props.useWaveformViewportkeeps refs, computed values, pointer events, DOM capture, D3 coordinates, and emitted events.ViewportInteractionStateMachineis its domain collaborator: it has no Vue or DOM dependency and accepts only legalbegin,move,finish,cancel, andresettransitions. Its state is abox/pandiscriminated union, withnullrepresenting idle.RenderablePointSelectionStrategydefines the replaceable rendering algorithm boundary.CompletePointSelectionStrategypreserves the complete visible source range andPeakPreservingPointSelectionStrategypreserves first/minimum/maximum/last points per bucket.resolveRenderablePointSelectionStrategyresolves and reuses the strategy from rendering options. The existingselectRenderablePointsfunction remains the compatibility facade used by rendering.normalizeWaveformDataandnormalizeWaveformSeriesare functional adapters from public data shapes to the internal series model.buildTrackLayoutsremains a functional builder because layout construction is a stateless calculation, not a long-lived object.
Vue Integration
The state-machine instance is stored in shallowRef(markRaw(...)). Vue receives defensive state
snapshots through a shallow ref, while SVG overlay elements remain in the composable as DOM
resources. Presentation mode, annotation editing, scales, domains, ticks, formatting, and other
stateless calculations stay in their existing computed/composable or function boundaries.
Constraints
Do not create classes solely to wrap Composition API refs, props, lifecycle hooks, D3 selections, or pure mathematical helpers. Do not add inheritance trees, global event buses, service locators, or duplicate prop state. A new class must own a real invariant or replaceable algorithm and must be used by a production path with isolated tests.