@vessel-dsp/control-ui 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +74 -0
  3. package/dist/ControlSurface.d.ts +14 -0
  4. package/dist/ControlSurface.d.ts.map +1 -0
  5. package/dist/ControlSurface.js +81 -0
  6. package/dist/ControlSurface.js.map +1 -0
  7. package/dist/appearance.d.ts +3 -0
  8. package/dist/appearance.d.ts.map +1 -0
  9. package/dist/appearance.js +25 -0
  10. package/dist/appearance.js.map +1 -0
  11. package/dist/components/ControlFrame.d.ts +12 -0
  12. package/dist/components/ControlFrame.d.ts.map +1 -0
  13. package/dist/components/ControlFrame.js +6 -0
  14. package/dist/components/ControlFrame.js.map +1 -0
  15. package/dist/components/DetentedRotarySelect.d.ts +13 -0
  16. package/dist/components/DetentedRotarySelect.d.ts.map +1 -0
  17. package/dist/components/DetentedRotarySelect.js +13 -0
  18. package/dist/components/DetentedRotarySelect.js.map +1 -0
  19. package/dist/components/FootswitchButton.d.ts +15 -0
  20. package/dist/components/FootswitchButton.d.ts.map +1 -0
  21. package/dist/components/FootswitchButton.js +36 -0
  22. package/dist/components/FootswitchButton.js.map +1 -0
  23. package/dist/components/GraphicEqSlider.d.ts +13 -0
  24. package/dist/components/GraphicEqSlider.d.ts.map +1 -0
  25. package/dist/components/GraphicEqSlider.js +13 -0
  26. package/dist/components/GraphicEqSlider.js.map +1 -0
  27. package/dist/components/KnobControl.d.ts +13 -0
  28. package/dist/components/KnobControl.d.ts.map +1 -0
  29. package/dist/components/KnobControl.js +201 -0
  30. package/dist/components/KnobControl.js.map +1 -0
  31. package/dist/components/LedIndicator.d.ts +12 -0
  32. package/dist/components/LedIndicator.d.ts.map +1 -0
  33. package/dist/components/LedIndicator.js +11 -0
  34. package/dist/components/LedIndicator.js.map +1 -0
  35. package/dist/components/SwitchSelectControl.d.ts +13 -0
  36. package/dist/components/SwitchSelectControl.d.ts.map +1 -0
  37. package/dist/components/SwitchSelectControl.js +7 -0
  38. package/dist/components/SwitchSelectControl.js.map +1 -0
  39. package/dist/components/ToggleSwitchControl.d.ts +13 -0
  40. package/dist/components/ToggleSwitchControl.d.ts.map +1 -0
  41. package/dist/components/ToggleSwitchControl.js +13 -0
  42. package/dist/components/ToggleSwitchControl.js.map +1 -0
  43. package/dist/controls.d.ts +11 -0
  44. package/dist/controls.d.ts.map +1 -0
  45. package/dist/controls.js +115 -0
  46. package/dist/controls.js.map +1 -0
  47. package/dist/index.d.ts +29 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +16 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/render-plan.d.ts +16 -0
  52. package/dist/render-plan.d.ts.map +1 -0
  53. package/dist/render-plan.js +58 -0
  54. package/dist/render-plan.js.map +1 -0
  55. package/dist/state.d.ts +5 -0
  56. package/dist/state.d.ts.map +1 -0
  57. package/dist/state.js +33 -0
  58. package/dist/state.js.map +1 -0
  59. package/dist/styles.css +333 -0
  60. package/dist/theme.d.ts +14 -0
  61. package/dist/theme.d.ts.map +1 -0
  62. package/dist/theme.js +30 -0
  63. package/dist/theme.js.map +1 -0
  64. package/dist/types.d.ts +43 -0
  65. package/dist/types.d.ts.map +1 -0
  66. package/dist/types.js +2 -0
  67. package/dist/types.js.map +1 -0
  68. package/dist/useControlState.d.ts +13 -0
  69. package/dist/useControlState.d.ts.map +1 -0
  70. package/dist/useControlState.js +23 -0
  71. package/dist/useControlState.js.map +1 -0
  72. package/dist/utils.d.ts +4 -0
  73. package/dist/utils.d.ts.map +1 -0
  74. package/dist/utils.js +23 -0
  75. package/dist/utils.js.map +1 -0
  76. package/package.json +72 -0
package/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Joseph Cheng
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,74 @@
1
+ # @vessel-dsp/control-ui
2
+
3
+ React controls for rendering a VesselDSP `Panel` from `@vessel-dsp/core`.
4
+
5
+ `control-ui` is the optional browser layer. It does not parse `.vdsp`, run DSP,
6
+ own an audio runtime, render schematics, or import stompbox preview code.
7
+
8
+ ## Install
9
+
10
+ ```bash
11
+ npm install @vessel-dsp/core @vessel-dsp/control-ui react react-dom
12
+ ```
13
+
14
+ Import the default CSS when you want the bundled styling:
15
+
16
+ ```ts
17
+ import '@vessel-dsp/control-ui/styles.css';
18
+ ```
19
+
20
+ ## Controlled Surface
21
+
22
+ ```tsx
23
+ import {
24
+ ControlSurface,
25
+ ControlUiThemeProvider,
26
+ createControlUiState,
27
+ } from '@vessel-dsp/control-ui';
28
+ import { extractPanel, parseCircuitDocumentFile } from '@vessel-dsp/core';
29
+
30
+ const document = parseCircuitDocumentFile(vdspSource, { filename: 'pedal.vdsp' });
31
+ const panel = extractPanel(document);
32
+ const state = createControlUiState(panel);
33
+
34
+ export function PedalControls() {
35
+ return (
36
+ <ControlUiThemeProvider theme={{ accentColor: '#f59e0b' }}>
37
+ <ControlSurface
38
+ panel={panel}
39
+ state={state}
40
+ onMessage={(message) => {
41
+ audioRuntime.send(message);
42
+ }}
43
+ />
44
+ </ControlUiThemeProvider>
45
+ );
46
+ }
47
+ ```
48
+
49
+ The surface emits core `PanelMessage` objects. The host app owns transport,
50
+ namespacing, and audio-engine routing.
51
+
52
+ ## Styling
53
+
54
+ The package ships stable `vdsp-control-ui-*` class names and CSS variables.
55
+ Every component accepts `className` and `classNames` hooks, so apps can add
56
+ Tailwind or other utility classes without forking the controls:
57
+
58
+ ```tsx
59
+ <ControlSurface
60
+ panel={panel}
61
+ state={state}
62
+ className="grid-cols-4 gap-4"
63
+ classNames={{
64
+ control: 'shadow-sm',
65
+ knob: 'ring-1 ring-slate-300',
66
+ select: 'text-sm',
67
+ }}
68
+ />
69
+ ```
70
+
71
+ Use `ControlUiThemeProvider` to theme a subtree through CSS custom properties.
72
+ The provider maps a small theme object to variables such as
73
+ `--vdsp-control-ui-accent-color`, `--vdsp-control-ui-control-color`, and
74
+ `--vdsp-control-ui-focus-ring-color`.
@@ -0,0 +1,14 @@
1
+ import type { ControlState, Panel, PanelMessage } from '@vessel-dsp/core';
2
+ import type { ControlAppearanceMap, ControlSurfaceClassNames } from './types';
3
+ export type ControlSurfaceProps = Readonly<{
4
+ panel: Panel;
5
+ state: ControlState;
6
+ disabled?: boolean;
7
+ appearance?: ControlAppearanceMap | undefined;
8
+ className?: string | undefined;
9
+ classNames?: ControlSurfaceClassNames | undefined;
10
+ onMessage?: ((message: PanelMessage) => void) | undefined;
11
+ onStateChange?: ((state: ControlState, message: PanelMessage) => void) | undefined;
12
+ }>;
13
+ export declare function ControlSurface({ panel, state, disabled, appearance, className, classNames, onMessage, onStateChange, }: ControlSurfaceProps): import("react").JSX.Element;
14
+ //# sourceMappingURL=ControlSurface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlSurface.d.ts","sourceRoot":"","sources":["../src/ControlSurface.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAgB,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIxF,OAAO,KAAK,EAAE,oBAAoB,EAA0B,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAUtG,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACvC,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAC9C,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,CAAC,EAAE,wBAAwB,GAAG,SAAS,CAAC;IAClD,SAAS,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC1D,aAAa,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACtF,CAAC,CAAC;AAEH,wBAAgB,cAAc,CAAC,EAC3B,KAAK,EACL,KAAK,EACL,QAAgB,EAChB,UAAU,EACV,SAAS,EACT,UAAU,EACV,SAAS,EACT,aAAa,GAChB,EAAE,mBAAmB,+BA+BrB"}
@@ -0,0 +1,81 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { controlValueForId } from './controls.js';
3
+ import { createControlSurfaceRenderPlan } from './render-plan.js';
4
+ import { applyControlUiMessage, controlMessageForValue } from './state.js';
5
+ import { cx } from './utils.js';
6
+ import { DetentedRotarySelect } from './components/DetentedRotarySelect.js';
7
+ import { FootswitchButton } from './components/FootswitchButton.js';
8
+ import { GraphicEqSlider } from './components/GraphicEqSlider.js';
9
+ import { KnobControl } from './components/KnobControl.js';
10
+ import { LedIndicator } from './components/LedIndicator.js';
11
+ import { SwitchSelectControl } from './components/SwitchSelectControl.js';
12
+ import { ToggleSwitchControl } from './components/ToggleSwitchControl.js';
13
+ export function ControlSurface({ panel, state, disabled = false, appearance, className, classNames, onMessage, onStateChange, }) {
14
+ const plan = createControlSurfaceRenderPlan(panel, { appearance });
15
+ function emitControlValue(controlId, value) {
16
+ if (disabled) {
17
+ return;
18
+ }
19
+ const message = controlMessageForValue(panel, controlId, value);
20
+ onMessage?.(message);
21
+ if (onStateChange !== undefined) {
22
+ onStateChange(applyControlUiMessage(panel, state, message), message);
23
+ }
24
+ }
25
+ return (_jsx("div", { className: cx('vdsp-control-ui-surface', disabled && 'is-disabled', classNames?.root, className), "data-vdsp-control-surface": true, children: plan.map((item) => (_jsx("div", { className: cx('vdsp-control-ui-surface__item', classNames?.item), "data-vdsp-control-item": item.controlId, "data-vdsp-face-id": item.faceId, children: renderControlItem(item, state, disabled, classNames, emitControlValue) }, item.id))) }));
26
+ }
27
+ function renderControlItem(item, state, disabled, classNames, emitControlValue) {
28
+ const value = controlValueForId(state, item.controlId);
29
+ const frameClassNames = frameClassNamesFor(item, classNames);
30
+ if (item.control.kind === 'knob') {
31
+ if (item.appearance === 'detented-rotary-select') {
32
+ return (_jsx(DetentedRotarySelect, { control: item.control.control, position: value?.kind === 'knob' ? value.position : item.control.control.defaultPosition, disabled: disabled, label: item.label, classNames: frameClassNames, onPositionChange: (position) => emitControlValue(item.controlId, position) }));
33
+ }
34
+ return (_jsx(KnobControl, { control: item.control.control, position: value?.kind === 'knob' ? value.position : item.control.control.defaultPosition, disabled: disabled, label: item.label, classNames: frameClassNames, onPositionChange: (position) => emitControlValue(item.controlId, position) }));
35
+ }
36
+ if (item.control.kind === 'slider') {
37
+ return (_jsx(GraphicEqSlider, { control: item.control.control, position: value?.kind === 'slider' ? value.position : item.control.control.defaultPosition, disabled: disabled, label: item.label, classNames: frameClassNames, onPositionChange: (position) => emitControlValue(item.controlId, position) }));
38
+ }
39
+ if (item.control.kind === 'switch') {
40
+ const position = value?.kind === 'switch' ? value.position : item.control.control.defaultPosition;
41
+ if (item.appearance === 'footswitch') {
42
+ return (_jsx(FootswitchButton, { control: item.control.control, pressed: position > 0, disabled: disabled, label: item.label, classNames: frameClassNames, onPressedChange: (pressed) => emitControlValue(item.controlId, pressed ? 1 : 0) }));
43
+ }
44
+ if (item.appearance === 'toggle') {
45
+ return (_jsx(ToggleSwitchControl, { control: item.control.control, position: position, disabled: disabled, label: item.label, classNames: frameClassNames, onPositionChange: (nextPosition) => emitControlValue(item.controlId, nextPosition) }));
46
+ }
47
+ return (_jsx(SwitchSelectControl, { control: item.control.control, position: position, disabled: disabled, label: item.label, classNames: frameClassNames, onPositionChange: (nextPosition) => emitControlValue(item.controlId, nextPosition) }));
48
+ }
49
+ return (_jsx(LedIndicator, { control: item.control.control, value: value?.kind === 'led' ? value : { kind: 'led', on: false }, disabled: disabled, label: item.label, classNames: frameClassNames }));
50
+ }
51
+ function frameClassNamesFor(item, classNames) {
52
+ if (classNames === undefined) {
53
+ return undefined;
54
+ }
55
+ return {
56
+ frame: classNames.frame,
57
+ label: classNames.label,
58
+ readout: classNames.readout,
59
+ control: cx(classNames.control, controlSpecificClassName(item, classNames)),
60
+ };
61
+ }
62
+ function controlSpecificClassName(item, classNames) {
63
+ switch (item.appearance) {
64
+ case 'knob':
65
+ return classNames.knob;
66
+ case 'detented-rotary-select':
67
+ return classNames.select;
68
+ case 'footswitch':
69
+ return classNames.footswitch;
70
+ case 'toggle':
71
+ return classNames.toggle;
72
+ case 'graphic-eq-slider':
73
+ case 'slider':
74
+ return classNames.slider;
75
+ case 'led':
76
+ return classNames.led;
77
+ case 'hidden':
78
+ return undefined;
79
+ }
80
+ }
81
+ //# sourceMappingURL=ControlSurface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlSurface.js","sourceRoot":"","sources":["../src/ControlSurface.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ControlAppearance, ControlUiControlRef } from './types';
2
+ export declare function resolveControlAppearance(control: ControlUiControlRef, override?: ControlAppearance): ControlAppearance;
3
+ //# sourceMappingURL=appearance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance.d.ts","sourceRoot":"","sources":["../src/appearance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEtE,wBAAgB,wBAAwB,CACpC,OAAO,EAAE,mBAAmB,EAC5B,QAAQ,CAAC,EAAE,iBAAiB,GAC7B,iBAAiB,CA0BnB"}
@@ -0,0 +1,25 @@
1
+ export function resolveControlAppearance(control, override) {
2
+ if (override !== undefined) {
3
+ return override;
4
+ }
5
+ switch (control.kind) {
6
+ case 'knob':
7
+ return (control.control.steps?.length ?? 0) > 0 ? 'detented-rotary-select' : 'knob';
8
+ case 'slider':
9
+ return 'graphic-eq-slider';
10
+ case 'switch':
11
+ if (control.control.switchKind === '3pdt') {
12
+ return 'footswitch';
13
+ }
14
+ if (control.control.positions === 2 &&
15
+ (control.control.switchKind === 'spdt' ||
16
+ control.control.switchKind === 'spst' ||
17
+ control.control.switchKind === 'toggle')) {
18
+ return 'toggle';
19
+ }
20
+ return 'detented-rotary-select';
21
+ case 'led':
22
+ return 'led';
23
+ }
24
+ }
25
+ //# sourceMappingURL=appearance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance.js","sourceRoot":"","sources":["../src/appearance.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,wBAAwB,CACpC,OAA4B,EAC5B,QAA4B;IAE5B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,MAAM;YACP,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,MAAM,CAAC;QACxF,KAAK,QAAQ;YACT,OAAO,mBAAmB,CAAC;QAC/B,KAAK,QAAQ;YACT,IAAI,OAAO,CAAC,OAAO,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;gBACxC,OAAO,YAAY,CAAC;YACxB,CAAC;YACD,IACI,OAAO,CAAC,OAAO,CAAC,SAAS,KAAK,CAAC;gBAC/B,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,KAAK,MAAM;oBAClC,OAAO,CAAC,OAAO,CAAC,UAAU,KAAK,MAAM;oBACrC,OAAO,CAAC,OAAO,CAAC,UAAU,KAAK,QAAQ,CAAC,EAC9C,CAAC;gBACC,OAAO,QAAQ,CAAC;YACpB,CAAC;YACD,OAAO,wBAAwB,CAAC;QACpC,KAAK,KAAK;YACN,OAAO,KAAK,CAAC;IACrB,CAAC;AACL,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { ControlFrameClassNames } from '../types';
3
+ export type ControlFrameProps = Readonly<{
4
+ label?: ReactNode;
5
+ readout?: ReactNode;
6
+ disabled?: boolean;
7
+ className?: string | undefined;
8
+ classNames?: ControlFrameClassNames | undefined;
9
+ children?: ReactNode;
10
+ }>;
11
+ export declare function ControlFrame({ label, readout, disabled, className, classNames, children }: ControlFrameProps): import("react").JSX.Element;
12
+ //# sourceMappingURL=ControlFrame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlFrame.d.ts","sourceRoot":"","sources":["../../src/components/ControlFrame.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAGvD,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACrC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,EAAE,SAAS,CAAC;CACxB,CAAC,CAAC;AAEH,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAgB,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,iBAAiB,+BAYpH"}
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cx } from '../utils.js';
3
+ export function ControlFrame({ label, readout, disabled = false, className, classNames, children }) {
4
+ return (_jsxs("div", { className: cx('vdsp-control-ui-frame', disabled && 'is-disabled', classNames?.frame, className), children: [label === undefined ? null : (_jsx("span", { className: cx('vdsp-control-ui-label', classNames?.label), children: label })), children, readout === undefined ? null : (_jsx("span", { className: cx('vdsp-control-ui-readout', classNames?.readout), children: readout }))] }));
5
+ }
6
+ //# sourceMappingURL=ControlFrame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlFrame.js","sourceRoot":"","sources":["../../src/components/ControlFrame.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAW9B,MAAM,UAAU,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,GAAG,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAqB;IACjH,OAAO,CACH,eAAK,SAAS,EAAE,EAAE,CAAC,uBAAuB,EAAE,QAAQ,IAAI,aAAa,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,CAAC,aAC/F,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC1B,eAAM,SAAS,EAAE,EAAE,CAAC,uBAAuB,EAAE,UAAU,EAAE,KAAK,CAAC,YAAG,KAAK,GAAQ,CAClF,EACA,QAAQ,EACR,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC5B,eAAM,SAAS,EAAE,EAAE,CAAC,yBAAyB,EAAE,UAAU,EAAE,OAAO,CAAC,YAAG,OAAO,GAAQ,CACxF,IACC,CACT,CAAC;AACN,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Knob } from '@vessel-dsp/core';
2
+ import type { ControlFrameClassNames } from '../types';
3
+ export type DetentedRotarySelectProps = Readonly<{
4
+ control: Knob;
5
+ position: number;
6
+ disabled?: boolean;
7
+ label?: string;
8
+ className?: string | undefined;
9
+ classNames?: ControlFrameClassNames | undefined;
10
+ onPositionChange?: ((position: number) => void) | undefined;
11
+ }>;
12
+ export declare function DetentedRotarySelect({ control, position, disabled, label, className, classNames, onPositionChange, }: DetentedRotarySelectProps): import("react").JSX.Element;
13
+ //# sourceMappingURL=DetentedRotarySelect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DetentedRotarySelect.d.ts","sourceRoot":"","sources":["../../src/components/DetentedRotarySelect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAIvD,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC;IAC7C,OAAO,EAAE,IAAI,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAChD,gBAAgB,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC/D,CAAC,CAAC;AAEH,wBAAgB,oBAAoB,CAAC,EACjC,OAAO,EACP,QAAQ,EACR,QAAgB,EAChB,KAAoB,EACpB,SAAS,EACT,UAAU,EACV,gBAAgB,GACnB,EAAE,yBAAyB,+BAyB3B"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { nearestKnobStep } from '@vessel-dsp/core';
3
+ import { cx } from '../utils.js';
4
+ import { ControlFrame } from './ControlFrame.js';
5
+ export function DetentedRotarySelect({ control, position, disabled = false, label = control.name, className, classNames, onPositionChange, }) {
6
+ const steps = control.steps ?? [
7
+ { index: 0, position: 0, label: 'Position 1' },
8
+ { index: 1, position: 1, label: 'Position 2' },
9
+ ];
10
+ const selected = nearestKnobStep(steps, position)?.position ?? position;
11
+ return (_jsx(ControlFrame, { label: label, disabled: disabled, className: className, classNames: classNames, children: _jsx("select", { className: cx('vdsp-control-ui-control', 'vdsp-control-ui-select', classNames?.control), value: String(selected), "aria-label": control.name, disabled: disabled, "data-vdsp-control-id": control.id, onChange: (event) => onPositionChange?.(Number(event.currentTarget.value)), children: steps.map((step) => (_jsx("option", { value: String(step.position), children: step.label ?? `Position ${step.index + 1}` }, step.index))) }) }));
12
+ }
13
+ //# sourceMappingURL=DetentedRotarySelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DetentedRotarySelect.js","sourceRoot":"","sources":["../../src/components/DetentedRotarySelect.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAY9C,MAAM,UAAU,oBAAoB,CAAC,EACjC,OAAO,EACP,QAAQ,EACR,QAAQ,GAAG,KAAK,EAChB,KAAK,GAAG,OAAO,CAAC,IAAI,EACpB,SAAS,EACT,UAAU,EACV,gBAAgB,GACQ;IACxB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI;QAC3B,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE;QAC9C,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE;KACjD,CAAC;IACF,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,QAAQ,IAAI,QAAQ,CAAC;IAExE,OAAO,CACH,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,YACxF,iBACI,SAAS,EAAE,EAAE,CAAC,yBAAyB,EAAE,wBAAwB,EAAE,UAAU,EAAE,OAAO,CAAC,EACvF,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,gBACX,OAAO,CAAC,IAAI,EACxB,QAAQ,EAAE,QAAQ,0BACI,OAAO,CAAC,EAAE,EAChC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,YAEzE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACjB,iBAAyB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,YAChD,IAAI,CAAC,KAAK,IAAI,YAAY,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,IADlC,IAAI,CAAC,KAAK,CAEd,CACZ,CAAC,GACG,GACE,CAClB,CAAC;AACN,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { SwitchControl } from '@vessel-dsp/core';
2
+ import type { ControlFrameClassNames } from '../types';
3
+ export type FootswitchButtonProps = Readonly<{
4
+ control?: SwitchControl;
5
+ label?: string;
6
+ pressed: boolean;
7
+ disabled?: boolean;
8
+ className?: string | undefined;
9
+ classNames?: ControlFrameClassNames | undefined;
10
+ onPressedChange?: ((pressed: boolean) => void) | undefined;
11
+ onPress?: (() => void) | undefined;
12
+ onRelease?: (() => void) | undefined;
13
+ }>;
14
+ export declare function FootswitchButton({ control, label, pressed, disabled, className, classNames, onPressedChange, onPress, onRelease, }: FootswitchButtonProps): import("react").JSX.Element;
15
+ //# sourceMappingURL=FootswitchButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FootswitchButton.d.ts","sourceRoot":"","sources":["../../src/components/FootswitchButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAIvD,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IACzC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAChD,eAAe,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC3D,OAAO,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACnC,SAAS,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CACxC,CAAC,CAAC;AAEH,wBAAgB,gBAAgB,CAAC,EAC7B,OAAO,EACP,KAAqC,EACrC,OAAO,EACP,QAAgB,EAChB,SAAS,EACT,UAAU,EACV,eAAe,EACf,OAAO,EACP,SAAS,GACZ,EAAE,qBAAqB,+BA0DvB"}
@@ -0,0 +1,36 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { cx } from '../utils.js';
4
+ import { ControlFrame } from './ControlFrame.js';
5
+ export function FootswitchButton({ control, label = control?.name ?? 'Footswitch', pressed, disabled = false, className, classNames, onPressedChange, onPress, onRelease, }) {
6
+ const [isPressing, setIsPressing] = useState(false);
7
+ function handleClick() {
8
+ if (!disabled) {
9
+ onPressedChange?.(!pressed);
10
+ }
11
+ }
12
+ function handlePress() {
13
+ if (!disabled) {
14
+ setIsPressing(true);
15
+ onPress?.();
16
+ }
17
+ }
18
+ function handleRelease() {
19
+ if (!disabled) {
20
+ setIsPressing(false);
21
+ onRelease?.();
22
+ }
23
+ }
24
+ return (_jsx(ControlFrame, { label: label, disabled: disabled, className: className, classNames: classNames, children: _jsx("button", { type: "button", className: cx('vdsp-control-ui-control', 'vdsp-control-ui-footswitch', isPressing && 'is-pressing', classNames?.control), "aria-label": label, "aria-pressed": pressed, disabled: disabled, "data-vdsp-control-id": control?.id, onClick: handleClick, onPointerDown: handlePress, onPointerUp: handleRelease, onPointerCancel: handleRelease, onKeyDown: (event) => {
25
+ if (event.key === ' ' || event.key === 'Enter') {
26
+ event.preventDefault();
27
+ handlePress();
28
+ }
29
+ }, onKeyUp: (event) => {
30
+ if (event.key === ' ' || event.key === 'Enter') {
31
+ event.preventDefault();
32
+ handleRelease();
33
+ }
34
+ }, children: _jsx("span", { className: "vdsp-control-ui-footswitch__cap" }) }) }));
35
+ }
36
+ //# sourceMappingURL=FootswitchButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FootswitchButton.js","sourceRoot":"","sources":["../../src/components/FootswitchButton.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAc9C,MAAM,UAAU,gBAAgB,CAAC,EAC7B,OAAO,EACP,KAAK,GAAG,OAAO,EAAE,IAAI,IAAI,YAAY,EACrC,OAAO,EACP,QAAQ,GAAG,KAAK,EAChB,SAAS,EACT,UAAU,EACV,eAAe,EACf,OAAO,EACP,SAAS,GACW;IACpB,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpD,SAAS,WAAW;QAChB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;IACL,CAAC;IAED,SAAS,WAAW;QAChB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,aAAa,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO,EAAE,EAAE,CAAC;QAChB,CAAC;IACL,CAAC;IAED,SAAS,aAAa;QAClB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,SAAS,EAAE,EAAE,CAAC;QAClB,CAAC;IACL,CAAC;IAED,OAAO,CACH,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,YACxF,iBACI,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,EAAE,CACT,yBAAyB,EACzB,4BAA4B,EAC5B,UAAU,IAAI,aAAa,EAC3B,UAAU,EAAE,OAAO,CACtB,gBACW,KAAK,kBACH,OAAO,EACrB,QAAQ,EAAE,QAAQ,0BACI,OAAO,EAAE,EAAE,EACjC,OAAO,EAAE,WAAW,EACpB,aAAa,EAAE,WAAW,EAC1B,WAAW,EAAE,aAAa,EAC1B,eAAe,EAAE,aAAa,EAC9B,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;gBACjB,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;oBAC7C,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,WAAW,EAAE,CAAC;gBAClB,CAAC;YACL,CAAC,EACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACf,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;oBAC7C,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,aAAa,EAAE,CAAC;gBACpB,CAAC;YACL,CAAC,YAED,eAAM,SAAS,EAAC,iCAAiC,GAAG,GAC/C,GACE,CAClB,CAAC;AACN,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { SliderControl } from "@vessel-dsp/core";
2
+ import type { ControlFrameClassNames } from "../types";
3
+ export type GraphicEqSliderProps = Readonly<{
4
+ control: SliderControl;
5
+ position: number;
6
+ disabled?: boolean;
7
+ label?: string;
8
+ className?: string | undefined;
9
+ classNames?: ControlFrameClassNames | undefined;
10
+ onPositionChange?: ((position: number) => void) | undefined;
11
+ }>;
12
+ export declare function GraphicEqSlider({ control, position, disabled, label, className, classNames, onPositionChange, }: GraphicEqSliderProps): import("react").JSX.Element;
13
+ //# sourceMappingURL=GraphicEqSlider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphicEqSlider.d.ts","sourceRoot":"","sources":["../../src/components/GraphicEqSlider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAIvD,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC3C,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAChD,gBAAgB,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC5D,CAAC,CAAC;AAEH,wBAAgB,eAAe,CAAC,EAC/B,OAAO,EACP,QAAQ,EACR,QAAgB,EAChB,KAAoB,EACpB,SAAS,EACT,UAAU,EACV,gBAAgB,GAChB,EAAE,oBAAoB,+BAgDtB"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { formatControlValue } from "../controls.js";
3
+ import { cx } from "../utils.js";
4
+ import { ControlFrame } from "./ControlFrame.js";
5
+ export function GraphicEqSlider({ control, position, disabled = false, label = control.name, className, classNames, onPositionChange, }) {
6
+ const readout = formatControlValue({ kind: "slider", control }, { kind: "slider", position });
7
+ const sliderPosition = Math.round(position * 100);
8
+ const sliderStyle = {
9
+ "--vdsp-control-ui-slider-position": `${sliderPosition}%`,
10
+ };
11
+ return (_jsx(ControlFrame, { label: label, readout: readout, disabled: disabled, className: className, classNames: classNames, children: _jsx("div", { className: cx("vdsp-control-ui-slider-shell", control.orientation === "vertical" && "is-vertical"), "data-orientation": control.orientation, children: _jsx("input", { className: cx("vdsp-control-ui-control", "vdsp-control-ui-slider", classNames?.control), type: "range", min: 0, max: 100, step: 1, value: sliderPosition, style: sliderStyle, "aria-label": control.name, disabled: disabled, "data-vdsp-control-id": control.id, "data-orientation": control.orientation, onChange: (event) => onPositionChange?.(Number(event.currentTarget.value) / 100) }) }) }));
12
+ }
13
+ //# sourceMappingURL=GraphicEqSlider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphicEqSlider.js","sourceRoot":"","sources":["../../src/components/GraphicEqSlider.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAY9C,MAAM,UAAU,eAAe,CAAC,EAC/B,OAAO,EACP,QAAQ,EACR,QAAQ,GAAG,KAAK,EAChB,KAAK,GAAG,OAAO,CAAC,IAAI,EACpB,SAAS,EACT,UAAU,EACV,gBAAgB,GACM;IACtB,MAAM,OAAO,GAAG,kBAAkB,CACjC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAC3B,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAC5B,CAAC;IACF,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG;QACnB,mCAAmC,EAAE,GAAG,cAAc,GAAG;KACc,CAAC;IAEzE,OAAO,CACN,KAAC,YAAY,IACZ,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,YAEtB,cACC,SAAS,EAAE,EAAE,CACZ,8BAA8B,EAC9B,OAAO,CAAC,WAAW,KAAK,UAAU,IAAI,aAAa,CACnD,sBACiB,OAAO,CAAC,WAAW,YAErC,gBACC,SAAS,EAAE,EAAE,CACZ,yBAAyB,EACzB,wBAAwB,EACxB,UAAU,EAAE,OAAO,CACnB,EACD,IAAI,EAAC,OAAO,EACZ,GAAG,EAAE,CAAC,EACN,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,WAAW,gBACN,OAAO,CAAC,IAAI,EACxB,QAAQ,EAAE,QAAQ,0BACI,OAAO,CAAC,EAAE,sBACd,OAAO,CAAC,WAAW,EACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CACnB,gBAAgB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAE3D,GACG,GACQ,CACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Knob } from '@vessel-dsp/core';
2
+ import type { ControlFrameClassNames } from '../types';
3
+ export type KnobControlProps = Readonly<{
4
+ control: Knob;
5
+ position: number;
6
+ disabled?: boolean;
7
+ label?: string;
8
+ className?: string | undefined;
9
+ classNames?: ControlFrameClassNames | undefined;
10
+ onPositionChange?: ((position: number) => void) | undefined;
11
+ }>;
12
+ export declare function KnobControl({ control, position, disabled, label, className, classNames, onPositionChange, }: KnobControlProps): import("react").JSX.Element;
13
+ //# sourceMappingURL=KnobControl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KnobControl.d.ts","sourceRoot":"","sources":["../../src/components/KnobControl.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAG7C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAmBvD,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC;IACpC,OAAO,EAAE,IAAI,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAChD,gBAAgB,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC/D,CAAC,CAAC;AAEH,wBAAgB,WAAW,CAAC,EACxB,OAAO,EACP,QAAQ,EACR,QAAgB,EAChB,KAAoB,EACpB,SAAS,EACT,UAAU,EACV,gBAAgB,GACnB,EAAE,gBAAgB,+BA6LlB"}