@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.
- package/LICENSE.md +21 -0
- package/README.md +74 -0
- package/dist/ControlSurface.d.ts +14 -0
- package/dist/ControlSurface.d.ts.map +1 -0
- package/dist/ControlSurface.js +81 -0
- package/dist/ControlSurface.js.map +1 -0
- package/dist/appearance.d.ts +3 -0
- package/dist/appearance.d.ts.map +1 -0
- package/dist/appearance.js +25 -0
- package/dist/appearance.js.map +1 -0
- package/dist/components/ControlFrame.d.ts +12 -0
- package/dist/components/ControlFrame.d.ts.map +1 -0
- package/dist/components/ControlFrame.js +6 -0
- package/dist/components/ControlFrame.js.map +1 -0
- package/dist/components/DetentedRotarySelect.d.ts +13 -0
- package/dist/components/DetentedRotarySelect.d.ts.map +1 -0
- package/dist/components/DetentedRotarySelect.js +13 -0
- package/dist/components/DetentedRotarySelect.js.map +1 -0
- package/dist/components/FootswitchButton.d.ts +15 -0
- package/dist/components/FootswitchButton.d.ts.map +1 -0
- package/dist/components/FootswitchButton.js +36 -0
- package/dist/components/FootswitchButton.js.map +1 -0
- package/dist/components/GraphicEqSlider.d.ts +13 -0
- package/dist/components/GraphicEqSlider.d.ts.map +1 -0
- package/dist/components/GraphicEqSlider.js +13 -0
- package/dist/components/GraphicEqSlider.js.map +1 -0
- package/dist/components/KnobControl.d.ts +13 -0
- package/dist/components/KnobControl.d.ts.map +1 -0
- package/dist/components/KnobControl.js +201 -0
- package/dist/components/KnobControl.js.map +1 -0
- package/dist/components/LedIndicator.d.ts +12 -0
- package/dist/components/LedIndicator.d.ts.map +1 -0
- package/dist/components/LedIndicator.js +11 -0
- package/dist/components/LedIndicator.js.map +1 -0
- package/dist/components/SwitchSelectControl.d.ts +13 -0
- package/dist/components/SwitchSelectControl.d.ts.map +1 -0
- package/dist/components/SwitchSelectControl.js +7 -0
- package/dist/components/SwitchSelectControl.js.map +1 -0
- package/dist/components/ToggleSwitchControl.d.ts +13 -0
- package/dist/components/ToggleSwitchControl.d.ts.map +1 -0
- package/dist/components/ToggleSwitchControl.js +13 -0
- package/dist/components/ToggleSwitchControl.js.map +1 -0
- package/dist/controls.d.ts +11 -0
- package/dist/controls.d.ts.map +1 -0
- package/dist/controls.js +115 -0
- package/dist/controls.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/render-plan.d.ts +16 -0
- package/dist/render-plan.d.ts.map +1 -0
- package/dist/render-plan.js +58 -0
- package/dist/render-plan.js.map +1 -0
- package/dist/state.d.ts +5 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +33 -0
- package/dist/state.js.map +1 -0
- package/dist/styles.css +333 -0
- package/dist/theme.d.ts +14 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +30 -0
- package/dist/theme.js.map +1 -0
- package/dist/types.d.ts +43 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/useControlState.d.ts +13 -0
- package/dist/useControlState.d.ts.map +1 -0
- package/dist/useControlState.js +23 -0
- package/dist/useControlState.js.map +1 -0
- package/dist/utils.d.ts +4 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +23 -0
- package/dist/utils.js.map +1 -0
- 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 @@
|
|
|
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"}
|