zds-pickers 4.0.3 → 4.0.6

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 (101) hide show
  1. package/.editorconfig +19 -0
  2. package/.github/workflows/codeql-analysis.yml +67 -0
  3. package/.nvmrc +1 -0
  4. package/.prettierignore +0 -0
  5. package/.prettierrc +13 -0
  6. package/.storybook/main.ts +42 -0
  7. package/.storybook/manager.ts +12 -0
  8. package/.storybook/preview.tsx +26 -0
  9. package/.vscode/extensions.json +32 -0
  10. package/.vscode/javascript.code-snippets +229 -0
  11. package/.vscode/settings.json +358 -0
  12. package/biome.jsonc +158 -0
  13. package/dist/index.cjs.js +15 -32
  14. package/dist/index.es.js +4144 -10129
  15. package/dist/types/hooks/useComponentSize.d.ts +5 -0
  16. package/dist/types/hooks/useStateWithDynamicDefault.d.ts +2 -0
  17. package/dist/types/index.d.ts +266 -2
  18. package/dist/types/main.d.ts +19 -0
  19. package/dist/types/midi/ccValues.d.ts +3 -0
  20. package/dist/types/midi/export.d.ts +22 -0
  21. package/dist/types/other/DefaultTooltip.d.ts +10 -0
  22. package/dist/types/other/OctavePlayer.d.ts +20 -0
  23. package/dist/types/other/SVGText.d.ts +17 -0
  24. package/dist/types/other/SoundFontProvider.d.ts +17 -0
  25. package/dist/types/pickers/CCPicker.d.ts +7 -0
  26. package/dist/types/pickers/ChannelMappingPicker.d.ts +14 -0
  27. package/dist/types/pickers/ChannelPicker.d.ts +8 -0
  28. package/dist/types/pickers/Knob.d.ts +12 -0
  29. package/dist/types/pickers/KnobPicker.d.ts +27 -0
  30. package/dist/types/pickers/LatchPicker.d.ts +8 -0
  31. package/dist/types/pickers/MappingPicker.d.ts +11 -0
  32. package/dist/types/pickers/NotePicker.d.ts +20 -0
  33. package/dist/types/pickers/PianoPicker.d.ts +9 -0
  34. package/dist/types/pickers/PolarityPicker.d.ts +14 -0
  35. package/dist/types/pickers/ResponseCurve.d.ts +40 -0
  36. package/dist/types/pickers/ResponseCurvePicker.d.ts +15 -0
  37. package/dist/types/pickers/Select.d.ts +29 -0
  38. package/dist/types/pickers/StatusPicker.d.ts +12 -0
  39. package/dist/types/pickers/ValuePicker.d.ts +15 -0
  40. package/dist/types/pickers/knobSkin10.d.ts +14 -0
  41. package/dist/types/rotaryKnob/InternalInput.d.ts +18 -0
  42. package/dist/types/rotaryKnob/Types.d.ts +5 -0
  43. package/dist/types/rotaryKnob/helpers/DrawCircle.d.ts +18 -0
  44. package/dist/types/rotaryKnob/helpers/DrawLine.d.ts +15 -0
  45. package/dist/types/rotaryKnob/helpers/HelpersOverlay.d.ts +11 -0
  46. package/dist/types/rotaryKnob/helpers/KnobVisualHelpers.d.ts +30 -0
  47. package/dist/types/rotaryKnob/index.d.ts +49 -0
  48. package/dist/types/rotaryKnob/knobdefaultskin.d.ts +6 -0
  49. package/dist/types/rotaryKnob/utils.d.ts +49 -0
  50. package/dist/types/utils.d.ts +9 -0
  51. package/lib/@types/nebiru-react-rotary-knob.d.ts +20 -0
  52. package/lib/@types/react-svgmt.d.ts +74 -0
  53. package/lib/@types/zds-mappings.d.ts +55 -0
  54. package/lib/@types/zds-react-piano.d.ts +17 -0
  55. package/lib/hooks/useComponentSize.ts +52 -0
  56. package/lib/hooks/useStateWithDynamicDefault.ts +13 -0
  57. package/lib/main.ts +34 -0
  58. package/lib/midi/ccValues.ts +139 -0
  59. package/lib/midi/export.ts +54 -0
  60. package/lib/other/DefaultTooltip.ts +14 -0
  61. package/lib/other/OctavePlayer.tsx +141 -0
  62. package/lib/other/SVGText.tsx +221 -0
  63. package/lib/other/SoundFontProvider.tsx +130 -0
  64. package/lib/pickers/CCPicker.tsx +28 -0
  65. package/lib/pickers/ChannelMappingPicker.tsx +135 -0
  66. package/lib/pickers/ChannelPicker.tsx +76 -0
  67. package/lib/pickers/Knob.tsx +93 -0
  68. package/lib/pickers/KnobPicker.tsx +93 -0
  69. package/lib/pickers/LatchPicker.tsx +33 -0
  70. package/lib/pickers/MappingPicker.tsx +68 -0
  71. package/lib/pickers/NotePicker.tsx +95 -0
  72. package/lib/pickers/PianoPicker.tsx +77 -0
  73. package/lib/pickers/PolarityPicker.tsx +39 -0
  74. package/lib/pickers/ResponseCurve.tsx +304 -0
  75. package/lib/pickers/ResponseCurvePicker.tsx +74 -0
  76. package/lib/pickers/Select.tsx +248 -0
  77. package/lib/pickers/StatusPicker.tsx +28 -0
  78. package/lib/pickers/ValuePicker.tsx +67 -0
  79. package/lib/pickers/knobSkin10.tsx +94 -0
  80. package/lib/rotaryKnob/InternalInput.tsx +43 -0
  81. package/lib/rotaryKnob/Types.ts +6 -0
  82. package/lib/rotaryKnob/helpers/DrawCircle.tsx +41 -0
  83. package/lib/rotaryKnob/helpers/DrawLine.tsx +32 -0
  84. package/lib/rotaryKnob/helpers/HelpersOverlay.tsx +43 -0
  85. package/lib/rotaryKnob/helpers/KnobVisualHelpers.tsx +138 -0
  86. package/lib/rotaryKnob/index.tsx +417 -0
  87. package/lib/rotaryKnob/knobdefaultskin.ts +56 -0
  88. package/lib/rotaryKnob/utils.ts +112 -0
  89. package/lib/temp/acoustic_grand_piano-mp3.js +94 -0
  90. package/lib/utils.ts +41 -0
  91. package/package.json +3 -7
  92. package/stories/assets/sampleStyles.css +349 -0
  93. package/stories/assets/utils.js +7 -0
  94. package/stories/picker.stories.tsx +313 -0
  95. package/tsconfig.app.json +26 -0
  96. package/tsconfig.json +34 -0
  97. package/tsconfig.node.json +24 -0
  98. package/vite.config.ts +45 -0
  99. package/dist/index.cjs.js.map +0 -1
  100. package/dist/index.d.ts +0 -244
  101. package/dist/index.es.js.map +0 -1
@@ -0,0 +1,313 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ // biome-ignore lint/correctness/noUnusedImports: <explanation>
3
+ import React from 'react'
4
+ import type * as Soundfont from 'soundfont-player'
5
+ import { getMapping } from 'zds-mappings'
6
+ import { Statuses, statusOptions } from '../lib/midi/export'
7
+ import OctavePlayer from '../lib/other/OctavePlayer'
8
+ import CCPicker from '../lib/pickers/CCPicker'
9
+ import ChannelMappingPicker from '../lib/pickers/ChannelMappingPicker'
10
+ import ChannelPicker from '../lib/pickers/ChannelPicker'
11
+ import Knob from '../lib/pickers/Knob'
12
+ import KnobPicker from '../lib/pickers/KnobPicker'
13
+ import LatchPicker from '../lib/pickers/LatchPicker'
14
+ import MappingPicker from '../lib/pickers/MappingPicker'
15
+ import NotePicker from '../lib/pickers/NotePicker'
16
+ import PianoPicker from '../lib/pickers/PianoPicker'
17
+ import PolarityPicker from '../lib/pickers/PolarityPicker'
18
+ import ResponseCurve from '../lib/pickers/ResponseCurve'
19
+ import ResponseCurvePicker from '../lib/pickers/ResponseCurvePicker'
20
+ import StatusPicker from '../lib/pickers/StatusPicker'
21
+ import ValuePicker from '../lib/pickers/ValuePicker'
22
+
23
+ const meta: Meta = {
24
+ title: 'Pickers',
25
+ }
26
+
27
+ const gmMapping = getMapping('General MIDI')
28
+
29
+ const CCPickerStory: StoryObj<typeof CCPicker> = {
30
+ render: args => <CCPicker {...args} />,
31
+ args: {
32
+ disabled: false,
33
+ label: 'CC #',
34
+ shrinkLabel: false,
35
+ value: 7,
36
+ },
37
+ }
38
+
39
+ const ChannelPickerStory: StoryObj<typeof ChannelPicker> = {
40
+ render: args => <ChannelPicker {...args} />,
41
+ args: {
42
+ disabled: false,
43
+ label: 'Channel',
44
+ shrinkLabel: false,
45
+ value: 9,
46
+ },
47
+ }
48
+
49
+ const ChannelMappingPickerStory: StoryObj<typeof ChannelMappingPicker> = {
50
+ render: args => <ChannelMappingPicker {...args} />,
51
+ args: {
52
+ channels: [
53
+ '',
54
+ 'No Mapping',
55
+ '',
56
+ 'Alesis DM Pro',
57
+ '',
58
+ '',
59
+ '',
60
+ 'BFD3',
61
+ '',
62
+ '',
63
+ 'Roland TD-20',
64
+ 'Roland TD-30 Perc 1 (Latin)',
65
+ '',
66
+ '',
67
+ '',
68
+ '',
69
+ ].map((label, value) => ({ label, value })),
70
+ disabled: false,
71
+ label: 'Channel',
72
+ shrinkLabel: false,
73
+ value: 7,
74
+ },
75
+ }
76
+
77
+ const KnobStory: StoryObj<typeof Knob> = {
78
+ render: args => <Knob {...args} />,
79
+ args: {
80
+ disabled: false,
81
+ max: 127,
82
+ min: 0,
83
+ value: 45,
84
+ wheelEnabled: false,
85
+ },
86
+ }
87
+
88
+ const KnobPickerStory: StoryObj<typeof KnobPicker> = {
89
+ render: args => <KnobPicker {...args} />,
90
+ args: {
91
+ disabled: false,
92
+ includePicker: true,
93
+ label: 'Sensitivity',
94
+ max: 127,
95
+ min: 0,
96
+ shrinkLabel: false,
97
+ // size: 35,
98
+ value: 87,
99
+ wheelEnabled: false,
100
+ },
101
+ }
102
+
103
+ const LatchPickerStory: StoryObj<typeof LatchPicker> = {
104
+ render: args => <LatchPicker {...args} />,
105
+ args: {
106
+ disabled: false,
107
+ label: 'Mode',
108
+ shrinkLabel: false,
109
+ value: 0,
110
+ },
111
+ }
112
+
113
+ const MappingPickerStory: StoryObj<typeof MappingPicker> = {
114
+ render: args => <MappingPicker {...args} />,
115
+ args: {
116
+ allowClearing: true,
117
+ disabled: false,
118
+ label: 'Mapping',
119
+ preserveMenuWidth: false,
120
+ shrinkLabel: false,
121
+ value: 'EZDrummer',
122
+ },
123
+ }
124
+
125
+ const NotePickerStory1: StoryObj<typeof NotePicker> = {
126
+ render: args => <NotePicker {...args} />,
127
+ args: {
128
+ channel: 0,
129
+ disabled: false,
130
+ isMelodicMode: false,
131
+ label: 'Note #',
132
+ mapping: gmMapping,
133
+ shrinkLabel: false,
134
+ value: 38,
135
+ },
136
+ }
137
+
138
+ const NotePickerStory2: StoryObj<typeof NotePicker> = {
139
+ render: args => <NotePicker {...args} />,
140
+ args: {
141
+ channel: 0,
142
+ disabled: false,
143
+ isMelodicMode: false,
144
+ label: 'No mapping',
145
+ shrinkLabel: false,
146
+ value: 38,
147
+ },
148
+ }
149
+
150
+ const NotePickerStory3: StoryObj<typeof NotePicker> = {
151
+ render: args => <NotePicker {...args} />,
152
+ args: {
153
+ channel: 0,
154
+ disabled: false,
155
+ isMelodicMode: false,
156
+ label: 'Action button',
157
+ mapping: gmMapping,
158
+ // selectProps: {
159
+ // actionButton: (
160
+ // <button
161
+ // onClick={e => {
162
+ // window.alert('click')
163
+ // }}>
164
+ // ?
165
+ // </button>
166
+ // ),
167
+ // },
168
+ shrinkLabel: false,
169
+ value: 38,
170
+ },
171
+ }
172
+
173
+ const OctavePlayerStory: StoryObj<typeof OctavePlayer> = {
174
+ render: args => <OctavePlayer {...args} />,
175
+ args: {
176
+ instrumentName: {
177
+ control: { type: 'select' },
178
+ options: [undefined, 'acoustic_grand_piano'],
179
+ } as unknown as Soundfont.InstrumentName,
180
+ height: 100,
181
+ width: 200,
182
+ octave: 4,
183
+ },
184
+ }
185
+
186
+ // # NotePicker
187
+ // <Canvas withToolbar>
188
+ // <Story
189
+ // height={120}
190
+ // name="NotePicker"
191
+ // >
192
+ // <NotePicker
193
+ // channel={number('channel', 0, 'NotePicker')}
194
+ // disabled={boolean('disabled', false, 'NotePicker')}
195
+ // isMelodicMode={boolean('isMelodicMode', false, 'NotePicker')}
196
+ // label={text('label', 'Note #', 'NotePicker')}
197
+ // mapping={gmMapping}
198
+ // onChange={action('handleChange')}
199
+ // shrinkLabel={boolean('shrinkLabel', false, 'NotePicker')}
200
+ // value={number('value', 38, {}, 'NotePicker')}
201
+ // />
202
+ // <br />
203
+ // <NotePicker
204
+ // channel={number('channel', 0, 'NotePicker2')}
205
+ // disabled={boolean('disabled', false, 'NotePicker2')}
206
+ // isMelodicMode={boolean('isMelodicMode', false, 'NotePicker2')}
207
+ // label="No mapping"
208
+ // onChange={action('handleChange2')}
209
+ // shrinkLabel={boolean('shrinkLabel', false, 'NotePicker')}
210
+ // value={number('value', 38, {}, 'NotePicker2')}
211
+ // />
212
+ // <br />
213
+ // <NotePicker
214
+ // channel={number('channel', 0, 'NotePicker3')}
215
+ // disabled={boolean('disabled', false, 'NotePicker3')}
216
+ // isMelodicMode={boolean('isMelodicMode', false, 'NotePicker3')}
217
+ // label="Action button"
218
+ // mapping={gmMapping}
219
+ // onChange={action('handleChange3')}
220
+ // selectProps={{actionButton:<button onClick={e=>{
221
+ // console.log('click')
222
+ // }}>?</button>}}
223
+ // shrinkLabel={boolean('shrinkLabel', false, 'NotePicker')}
224
+ // value={number('value', 38, {}, 'NotePicker3')}
225
+ // />
226
+ // </Story>
227
+ // </Canvas>
228
+
229
+ const PianoPickerStory: StoryObj<typeof PianoPicker> = {
230
+ render: args => <PianoPicker {...args} />,
231
+ args: {
232
+ instrumentName: 'acoustic_grand_piano',
233
+ height: 100,
234
+ width: 1000,
235
+ },
236
+ }
237
+
238
+ const PolarityPickerStory: StoryObj<typeof PolarityPicker> = {
239
+ render: args => <PolarityPicker {...args} />,
240
+ args: {
241
+ disabled: false,
242
+ label: 'Polarity',
243
+ labelOff: 'Normally Off',
244
+ labelOn: 'Normally On',
245
+ shrinkLabel: false,
246
+ value: 0,
247
+ },
248
+ }
249
+
250
+ const ResponseCurveStory: StoryObj<typeof ResponseCurve> = {
251
+ render: args => <ResponseCurve {...args} />,
252
+ args: {
253
+ disabled: false,
254
+ inverted: false,
255
+ value: 0,
256
+ },
257
+ }
258
+
259
+ const ResponseCurvePickerStory: StoryObj<typeof ResponseCurvePicker> = {
260
+ render: args => <ResponseCurvePicker {...args} />,
261
+ args: {
262
+ disabled: false,
263
+ inverted: false,
264
+ label: 'Response',
265
+ shrinkLabel: false,
266
+ value: 0,
267
+ },
268
+ }
269
+
270
+ const StatusPickerStory: StoryObj<typeof StatusPicker> = {
271
+ render: args => <StatusPicker {...args} />,
272
+ args: {
273
+ disabled: false,
274
+ label: 'Status Msg',
275
+ shrinkLabel: false,
276
+ statuses: statusOptions,
277
+ value: Statuses.noteOn,
278
+ },
279
+ }
280
+
281
+ const ValuePickerStory: StoryObj<typeof ValuePicker> = {
282
+ render: args => <ValuePicker {...args} />,
283
+ args: {
284
+ disabled: false,
285
+ highToLow: false,
286
+ label: 'Value',
287
+ max: 127,
288
+ min: 0,
289
+ shrinkLabel: false,
290
+ },
291
+ }
292
+
293
+ export {
294
+ ChannelPickerStory as ChannelPicker,
295
+ ChannelMappingPickerStory as ChannelMappingPicker,
296
+ CCPickerStory as ContinuousChangePicker,
297
+ KnobStory as Knob,
298
+ KnobPickerStory as KnobPicker,
299
+ LatchPickerStory as LatchPicker,
300
+ MappingPickerStory as MappingPicker,
301
+ NotePickerStory1 as NotePickerSimple,
302
+ NotePickerStory2 as NotePickerNoMapping,
303
+ NotePickerStory3 as NotePickerActionButton,
304
+ OctavePlayerStory as OctavePlayer,
305
+ PianoPickerStory as PianoPicker,
306
+ PolarityPickerStory as PolarityPicker,
307
+ ResponseCurveStory as ResponseCurve,
308
+ ResponseCurvePickerStory as ResponseCurvePicker,
309
+ StatusPickerStory as StatusPicker,
310
+ ValuePickerStory as ValuePicker,
311
+ }
312
+
313
+ export default meta
@@ -0,0 +1,26 @@
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
4
+ "target": "ES2020",
5
+ "useDefineForClassFields": true,
6
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
7
+ "module": "ESNext",
8
+ "skipLibCheck": true,
9
+
10
+ /* Bundler mode */
11
+ "moduleResolution": "bundler",
12
+ "allowImportingTsExtensions": true,
13
+ "isolatedModules": true,
14
+ "moduleDetection": "force",
15
+ "noEmit": true,
16
+ "jsx": "react-jsx",
17
+
18
+ /* Linting */
19
+ "strict": true,
20
+ "noUnusedLocals": true,
21
+ "noUnusedParameters": true,
22
+ "noFallthroughCasesInSwitch": true,
23
+ "noUncheckedSideEffectImports": true
24
+ },
25
+ "include": ["src"]
26
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "compilerOptions": {
3
+ "baseUrl": ".",
4
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
5
+ "target": "ES2020",
6
+ "useDefineForClassFields": true,
7
+ "lib": ["ES2021", "DOM", "DOM.Iterable"],
8
+ "module": "ESNext",
9
+ "skipLibCheck": true,
10
+
11
+ /* output */
12
+ "declaration": true,
13
+ "declarationDir": "./dist/types",
14
+ "emitDeclarationOnly": false,
15
+ "outDir": "./dist",
16
+
17
+ /* Bundler mode */
18
+ "moduleResolution": "Bundler",
19
+ "isolatedModules": true,
20
+ "moduleDetection": "force",
21
+ "jsx": "react-jsx",
22
+
23
+ /* Linting */
24
+ "strict": true,
25
+ "noUnusedLocals": true,
26
+ "noUnusedParameters": true,
27
+ "noFallthroughCasesInSwitch": true,
28
+ "noUncheckedSideEffectImports": true,
29
+
30
+ "paths": {}
31
+ },
32
+ "include": ["lib"],
33
+ "exclude": ["node_modules", "**/*.spec.ts", "**/*.spec.tsx", "stories"]
34
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
4
+ "target": "ES2022",
5
+ "lib": ["ES2023"],
6
+ "module": "ESNext",
7
+ "skipLibCheck": true,
8
+
9
+ /* Bundler mode */
10
+ "moduleResolution": "bundler",
11
+ "allowImportingTsExtensions": true,
12
+ "isolatedModules": true,
13
+ "moduleDetection": "force",
14
+ "noEmit": true,
15
+
16
+ /* Linting */
17
+ "strict": true,
18
+ "noUnusedLocals": true,
19
+ "noUnusedParameters": true,
20
+ "noFallthroughCasesInSwitch": true,
21
+ "noUncheckedSideEffectImports": true
22
+ },
23
+ "include": ["vite.config.ts"]
24
+ }
package/vite.config.ts ADDED
@@ -0,0 +1,45 @@
1
+ import { resolve } from 'node:path'
2
+ import react from '@vitejs/plugin-react-swc'
3
+ import { defineConfig } from 'vite'
4
+ import dts from 'vite-plugin-dts'
5
+
6
+ export default defineConfig({
7
+ plugins: [
8
+ react(),
9
+ dts({
10
+ include: ['lib'],
11
+ rollupTypes: true,
12
+ entryRoot: 'lib',
13
+ outDir: 'dist/types',
14
+ }),
15
+ ],
16
+ build: {
17
+ lib: {
18
+ entry: resolve(__dirname, 'lib/main'),
19
+ name: 'zds-pickers',
20
+ formats: ['es', 'cjs'],
21
+ fileName: format => `index.${format}.js`,
22
+ },
23
+ sourcemap: false,
24
+ rollupOptions: {
25
+ external: [
26
+ 'react',
27
+ 'react-dom',
28
+ 'react/jsx-runtime',
29
+ 'react-select',
30
+ 'd3-drag',
31
+ 'd3-scale',
32
+ 'd3-selection',
33
+ ],
34
+ output: {
35
+ globals: {
36
+ react: 'React',
37
+ 'react-dom': 'ReactDOM',
38
+ 'react-select': 'ReactSelect',
39
+ },
40
+ preserveModules: false,
41
+ },
42
+ },
43
+ minify: true,
44
+ },
45
+ })