@tremolo-ui/react 0.4.0 → 0.5.0

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 (62) hide show
  1. package/dist/index.cjs +1125 -1437
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.css +58 -93
  4. package/dist/index.d.cts +561 -243
  5. package/dist/index.d.cts.map +1 -1
  6. package/dist/index.d.ts +561 -243
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +1125 -1438
  9. package/dist/index.js.map +1 -1
  10. package/package.json +9 -10
  11. package/src/components/AnimationCanvas/index.tsx +84 -155
  12. package/src/components/Knob/ActiveLine.tsx +6 -6
  13. package/src/components/Knob/InactiveLine.tsx +9 -11
  14. package/src/components/Knob/SVGRoot.tsx +9 -18
  15. package/src/components/Knob/context.tsx +57 -89
  16. package/src/components/Knob/index.css +6 -2
  17. package/src/components/Knob/index.tsx +90 -61
  18. package/src/components/NumberInput/DecrementStepper.tsx +17 -50
  19. package/src/components/NumberInput/IncrementStepper.tsx +17 -50
  20. package/src/components/NumberInput/InputField.tsx +123 -0
  21. package/src/components/NumberInput/Stepper.tsx +90 -12
  22. package/src/components/NumberInput/context.tsx +74 -146
  23. package/src/components/NumberInput/index.css +38 -102
  24. package/src/components/NumberInput/index.tsx +252 -98
  25. package/src/components/NumberInput/stepperButton.tsx +90 -0
  26. package/src/components/Piano/index.tsx +272 -288
  27. package/src/components/Piano/keyboardShortcuts.ts +34 -4
  28. package/src/components/PointsEditor/Background.tsx +8 -2
  29. package/src/components/PointsEditor/Container.tsx +19 -9
  30. package/src/components/PointsEditor/Point.tsx +104 -24
  31. package/src/components/PointsEditor/context.tsx +28 -74
  32. package/src/components/PointsEditor/index.css +5 -0
  33. package/src/components/PointsEditor/index.tsx +77 -43
  34. package/src/components/Slider/{Scale.tsx → Marks.tsx} +8 -8
  35. package/src/components/Slider/{ScaleOption.tsx → MarksOption.tsx} +16 -18
  36. package/src/components/Slider/Thumb.tsx +55 -68
  37. package/src/components/Slider/Track.tsx +15 -15
  38. package/src/components/Slider/context.tsx +36 -51
  39. package/src/components/Slider/index.css +18 -5
  40. package/src/components/Slider/index.tsx +127 -146
  41. package/src/components/Slider/type.ts +4 -4
  42. package/src/components/XYPad/Area.tsx +16 -7
  43. package/src/components/XYPad/Thumb.tsx +62 -74
  44. package/src/components/XYPad/context.tsx +46 -0
  45. package/src/components/XYPad/index.css +12 -0
  46. package/src/components/XYPad/index.tsx +190 -230
  47. package/src/hooks/useDrag.ts +1 -1
  48. package/src/hooks/useDragValue.ts +149 -0
  49. package/src/hooks/useEventListener.ts +1 -1
  50. package/src/hooks/useWheel.ts +29 -9
  51. package/src/index.ts +15 -9
  52. package/src/components/AnimationCanvas/canvas.ts +0 -46
  53. package/src/components/NumberInput/InternalInput.tsx +0 -216
  54. package/src/components/NumberInput/type.ts +0 -58
  55. package/src/components/Piano/KeyLabel.tsx +0 -51
  56. package/src/components/Piano/context.tsx +0 -73
  57. package/src/components/Piano/key.tsx +0 -205
  58. package/src/components/_util/type.ts +0 -1
  59. package/src/hooks/useDragWithElement.ts +0 -100
  60. package/src/hooks/usePianoDrag.ts +0 -75
  61. package/src/hooks/useRefCallbackEvent.ts +0 -34
  62. /package/src/hooks/{useCallbackRef.ts → _internal/useCallbackRef.ts} +0 -0
package/dist/index.css CHANGED
@@ -18,10 +18,12 @@
18
18
  cursor: none;
19
19
  }
20
20
  .tremolo-knob {
21
+ --knob-size: 50px;
22
+ width: var(--knob-size);
23
+ height: var(--knob-size);
21
24
  cursor: grab;
22
25
  outline: 0;
23
26
  display: inline-block;
24
- overflow: visible;
25
27
 
26
28
  &[aria-readonly="true"] {
27
29
  cursor: not-allowed;
@@ -34,7 +36,6 @@
34
36
 
35
37
  .tremolo-knob-active-line {
36
38
  color: oklch(69.2% .17548 266.373);
37
- overflow: visible;
38
39
 
39
40
  :where(.tremolo-knob:focus, .tremolo-knob:hover) & {
40
41
  color: oklch(59.5% .17548 266.373);
@@ -94,14 +95,14 @@
94
95
  color: oklch(84.2% 0 0);
95
96
  }
96
97
  }
97
- .tremolo-number-input-wrapper {
98
+ .tremolo-number-input {
98
99
  --border-radius: 4px;
99
100
  --stepper-width: 20px;
101
+ --stepper-icon-size: 12px;
100
102
  --active-color: oklch(59.5% .17548 266.373);
101
103
  --border-color: oklch(81% 0 0);
102
- border-style: solid;
103
- border-color: var(--border-color);
104
- border-width: 0;
104
+ border: 1px solid var(--border-color);
105
+ border-radius: var(--border-radius);
105
106
  outline: none;
106
107
  flex-direction: row;
107
108
  width: 140px;
@@ -110,64 +111,26 @@
110
111
  display: inline-flex;
111
112
  position: relative;
112
113
 
113
- &:not(:focus-within):has( > .tremolo-number-input[data-error="true"]) {
114
- border-color: oklch(64.245% .21266 25.499);
115
- }
116
-
117
- &[data-variant="outline"] {
118
- border-radius: var(--border-radius);
119
- border-width: 1px;
120
-
121
- &:hover {
122
- --border-color: oklch(65.335% 0 0);
123
- }
124
-
125
- &:focus-within {
126
- --border-color: var(--active-color);
127
- box-shadow: 0px 0px 0px 2px
128
- color-mix(in srgb, var(--active-color) 10%, transparent);
129
- }
114
+ &:hover {
115
+ --border-color: oklch(65.335% 0 0);
130
116
  }
131
117
 
132
- &[data-variant="filled"] {
133
- --bg: oklch(95.88% 0 0);
134
- border-radius: var(--border-radius);
135
- background-color: var(--bg);
136
- border-width: 1px;
137
- border-color: #0000;
138
-
139
- &:hover {
140
- --bg: oklch(93.166% 0 0);
141
- }
142
-
143
- &:focus-within {
144
- background-color: inherit;
145
- --border-color: var(--active-color);
146
- box-shadow: 0px 0px 0px 2px
147
- color-mix(in srgb, var(--active-color) 10%, transparent);
148
- }
118
+ &:focus-within {
119
+ --border-color: var(--active-color);
120
+ box-shadow: 0px 0px 0px 2px
121
+ color-mix(in srgb, var(--active-color) 10%, transparent);
149
122
  }
150
123
 
151
- &[data-variant="flushed"] {
152
- border-bottom-width: 1px;
153
-
154
- &:hover {
155
- --border-color: oklch(65.335% 0 0);
156
- }
157
-
158
- &:focus-within {
159
- --border-color: var(--active-color);
160
- box-shadow: 0px 2px 0px 0px
161
- color-mix(in srgb, var(--active-color) 10%, transparent);
162
- }
124
+ &:not(:focus-within):has(.tremolo-number-input-field[data-out-of-range="true"]) {
125
+ border-color: oklch(64.245% .21266 25.499);
163
126
  }
164
127
 
165
- &[data-stepper="false"] {
128
+ &:not(:has(.tremolo-number-input-stepper)) {
166
129
  --stepper-width: 0px;
167
130
  }
168
131
  }
169
132
 
170
- .tremolo-number-input {
133
+ .tremolo-number-input-field {
171
134
  color: inherit;
172
135
  width: calc(100% - 20px - var(--stepper-width));
173
136
  background-color: inherit;
@@ -187,28 +150,29 @@
187
150
  .tremolo-number-input-stepper {
188
151
  height: 100%;
189
152
  width: var(--stepper-width);
153
+ opacity: 0;
190
154
  flex-direction: column;
191
155
  transition: all .1s linear;
192
156
  display: flex;
193
157
  position: absolute;
194
158
  top: 0;
195
159
  right: 0;
196
-
197
- &[data-dynamic="true"] {
198
- opacity: 0;
199
- transform: translateX(40%);
200
- }
160
+ transform: translateX(40%);
201
161
  }
202
162
 
203
- :is(.tremolo-number-input-wrapper:hover, .tremolo-number-input-wrapper:focus-within) .tremolo-number-input-stepper {
163
+ :is(.tremolo-number-input:hover, .tremolo-number-input:focus-within) .tremolo-number-input-stepper {
204
164
  opacity: 1;
205
165
  transform: translateX(0);
206
166
  }
207
167
 
208
- .tremolo-number-input-increment-stepper {
168
+ .tremolo-number-input-stepper-icon {
169
+ width: var(--stepper-icon-size);
170
+ height: var(--stepper-icon-size);
171
+ }
172
+
173
+ :is(.tremolo-number-input-increment-stepper, .tremolo-number-input-decrement-stepper) {
209
174
  user-select: none;
210
175
  cursor: pointer;
211
- border-top-right-radius: var(--border-radius);
212
176
  border-inline-start: 1px solid oklch(84.522% 0 0);
213
177
  flex: 1;
214
178
  justify-content: center;
@@ -226,39 +190,18 @@
226
190
  }
227
191
  }
228
192
 
193
+ .tremolo-number-input-increment-stepper {
194
+ border-top-right-radius: var(--border-radius);
195
+ }
196
+
229
197
  .tremolo-number-input-decrement-stepper {
230
- border-inline-start: 1px solid oklch(84.522% 0 0);
231
- user-select: none;
232
- cursor: pointer;
233
198
  border-bottom-right-radius: var(--border-radius);
234
199
  border-top: 1px solid oklch(84.522% 0 0);
235
- flex: 1;
236
- justify-content: center;
237
- align-items: center;
238
- max-height: 50%;
239
- font-size: .75rem;
240
- display: flex;
241
-
242
- &[aria-disabled="false"]:active {
243
- background-color: oklch(37.798% .03812 254.612 / .055);
244
- }
245
-
246
- &[aria-disabled="true"], &[aria-readonly="true"] {
247
- cursor: not-allowed;
248
- }
249
200
  }
250
201
 
251
202
  :where(.dark, [data-theme="dark"]) {
252
- & .tremolo-number-input-wrapper {
203
+ & .tremolo-number-input {
253
204
  --border-color: oklch(52% 0 0);
254
-
255
- &[data-variant="filled"] {
256
- --bg: oklch(43.5% 0 0);
257
-
258
- &:hover {
259
- --bg: oklch(46.6% 0 0);
260
- }
261
- }
262
205
  }
263
206
  }
264
207
  .tremolo-piano {
@@ -377,12 +320,23 @@
377
320
  &[data-dragging="true"] {
378
321
  cursor: inherit;
379
322
  }
323
+
324
+ &[aria-readonly="true"] {
325
+ cursor: default;
326
+ }
380
327
  }
381
328
  .tremolo-slider {
329
+ --thumb-size: 22px;
330
+ margin: calc(var(--thumb-size) / 2);
382
331
  cursor: pointer;
383
332
  -webkit-tap-highlight-color: transparent;
384
333
  outline: 0;
385
- display: inline-block;
334
+ flex-direction: column;
335
+ display: inline-flex;
336
+
337
+ &[data-vertical="true"] {
338
+ flex-direction: row;
339
+ }
386
340
 
387
341
  &[aria-readonly="true"] {
388
342
  cursor: not-allowed;
@@ -397,6 +351,8 @@
397
351
 
398
352
  .tremolo-slider-thumb {
399
353
  --color: oklch(59.5% .17548 266.373);
354
+ width: var(--thumb-size);
355
+ height: var(--thumb-size);
400
356
  background: var(--color);
401
357
  border-radius: 50%;
402
358
  outline: none;
@@ -435,12 +391,12 @@
435
391
  }
436
392
  }
437
393
 
438
- .tremolo-slider-scale {
394
+ .tremolo-slider-marks {
439
395
  display: block;
440
396
  position: relative;
441
397
  }
442
398
 
443
- .tremolo-slider-scale-option {
399
+ .tremolo-slider-marks-option {
444
400
  color: oklch(25.197% .00003 271.152);
445
401
  z-index: 10;
446
402
  flex-direction: column;
@@ -456,11 +412,11 @@
456
412
  }
457
413
  }
458
414
 
459
- .tremolo-slider-scale-option-mark {
415
+ .tremolo-slider-marks-option-mark {
460
416
  background-color: currentColor;
461
417
  }
462
418
 
463
- .tremolo-slider-scale-option-label {
419
+ .tremolo-slider-marks-option-label {
464
420
  text-align: right;
465
421
  }
466
422
 
@@ -489,8 +445,15 @@
489
445
  }
490
446
  }
491
447
  .tremolo-xy-pad {
448
+ --thumb-size: 22px;
449
+ margin: calc(var(--thumb-size) / 2);
492
450
  cursor: pointer;
451
+ -webkit-tap-highlight-color: transparent;
493
452
  display: inline-block;
453
+
454
+ &[aria-readonly="true"] {
455
+ cursor: not-allowed;
456
+ }
494
457
  }
495
458
 
496
459
  .tremolo-xy-pad-area {
@@ -507,6 +470,8 @@
507
470
 
508
471
  .tremolo-xy-pad-thumb {
509
472
  --color: oklch(59.5% .17548 266.373);
473
+ width: var(--thumb-size);
474
+ height: var(--thumb-size);
510
475
  background-color: var(--color);
511
476
  border-radius: 50%;
512
477
  outline: none;