@tremolo-ui/react 0.0.11 → 0.1.0-alpha.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.
- package/dist/cjs/index.js +711 -395
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/components/AnimationCanvas/index.d.ts +2 -2
- package/dist/cjs/types/components/AnimationCanvas/index.d.ts.map +1 -1
- package/dist/cjs/types/components/AnimationKnob/index.d.ts +10 -3
- package/dist/cjs/types/components/AnimationKnob/index.d.ts.map +1 -1
- package/dist/cjs/types/components/Knob/index.d.ts +25 -3
- package/dist/cjs/types/components/Knob/index.d.ts.map +1 -1
- package/dist/cjs/types/components/NumberInput/DecrementStepper.d.ts +2 -0
- package/dist/cjs/types/components/NumberInput/DecrementStepper.d.ts.map +1 -1
- package/dist/cjs/types/components/NumberInput/IncrementStepper.d.ts +2 -0
- package/dist/cjs/types/components/NumberInput/IncrementStepper.d.ts.map +1 -1
- package/dist/cjs/types/components/NumberInput/InternalInput.d.ts +18 -0
- package/dist/cjs/types/components/NumberInput/InternalInput.d.ts.map +1 -0
- package/dist/cjs/types/components/NumberInput/Stepper.d.ts +2 -0
- package/dist/cjs/types/components/NumberInput/Stepper.d.ts.map +1 -1
- package/dist/cjs/types/components/NumberInput/context.d.ts +3 -2
- package/dist/cjs/types/components/NumberInput/context.d.ts.map +1 -1
- package/dist/cjs/types/components/NumberInput/index.d.ts +12 -3
- package/dist/cjs/types/components/NumberInput/index.d.ts.map +1 -1
- package/dist/cjs/types/components/Piano/KeyLabel.d.ts +1 -3
- package/dist/cjs/types/components/Piano/KeyLabel.d.ts.map +1 -1
- package/dist/cjs/types/components/Piano/context.d.ts +24 -0
- package/dist/cjs/types/components/Piano/context.d.ts.map +1 -0
- package/dist/cjs/types/components/Piano/index.d.ts +15 -12
- package/dist/cjs/types/components/Piano/index.d.ts.map +1 -1
- package/dist/cjs/types/components/Piano/key.d.ts +14 -19
- package/dist/cjs/types/components/Piano/key.d.ts.map +1 -1
- package/dist/cjs/types/components/Piano/keyboardShortcuts.d.ts +2 -2
- package/dist/cjs/types/components/Slider/Scale.d.ts +1 -3
- package/dist/cjs/types/components/Slider/Scale.d.ts.map +1 -1
- package/dist/cjs/types/components/Slider/Thumb.d.ts +1 -0
- package/dist/cjs/types/components/Slider/Thumb.d.ts.map +1 -1
- package/dist/cjs/types/components/Slider/Track.d.ts +2 -2
- package/dist/cjs/types/components/Slider/Track.d.ts.map +1 -1
- package/dist/cjs/types/components/Slider/index.d.ts +5 -1
- package/dist/cjs/types/components/Slider/index.d.ts.map +1 -1
- package/dist/cjs/types/components/WheelObserver/index.d.ts +3 -3
- package/dist/cjs/types/components/WheelObserver/index.d.ts.map +1 -1
- package/dist/cjs/types/components/XYPad/Area.d.ts +3 -3
- package/dist/cjs/types/components/XYPad/Area.d.ts.map +1 -1
- package/dist/cjs/types/components/XYPad/Thumb.d.ts +1 -0
- package/dist/cjs/types/components/XYPad/Thumb.d.ts.map +1 -1
- package/dist/cjs/types/components/XYPad/index.d.ts +6 -1
- package/dist/cjs/types/components/XYPad/index.d.ts.map +1 -1
- package/dist/cjs/types/hooks/useDrag.d.ts.map +1 -1
- package/dist/cjs/types/hooks/useDragWithElement.d.ts +16 -0
- package/dist/cjs/types/hooks/useDragWithElement.d.ts.map +1 -0
- package/dist/cjs/types/hooks/useInterval.d.ts +2 -0
- package/dist/cjs/types/hooks/useInterval.d.ts.map +1 -0
- package/dist/cjs/types/hooks/useLongPress.d.ts +2 -0
- package/dist/cjs/types/hooks/useLongPress.d.ts.map +1 -0
- package/dist/cjs/types/index.d.ts +5 -0
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/esm/index.js +706 -396
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/components/AnimationCanvas/index.d.ts +2 -2
- package/dist/esm/types/components/AnimationCanvas/index.d.ts.map +1 -1
- package/dist/esm/types/components/AnimationKnob/index.d.ts +10 -3
- package/dist/esm/types/components/AnimationKnob/index.d.ts.map +1 -1
- package/dist/esm/types/components/Knob/index.d.ts +25 -3
- package/dist/esm/types/components/Knob/index.d.ts.map +1 -1
- package/dist/esm/types/components/NumberInput/DecrementStepper.d.ts +2 -0
- package/dist/esm/types/components/NumberInput/DecrementStepper.d.ts.map +1 -1
- package/dist/esm/types/components/NumberInput/IncrementStepper.d.ts +2 -0
- package/dist/esm/types/components/NumberInput/IncrementStepper.d.ts.map +1 -1
- package/dist/esm/types/components/NumberInput/InternalInput.d.ts +18 -0
- package/dist/esm/types/components/NumberInput/InternalInput.d.ts.map +1 -0
- package/dist/esm/types/components/NumberInput/Stepper.d.ts +2 -0
- package/dist/esm/types/components/NumberInput/Stepper.d.ts.map +1 -1
- package/dist/esm/types/components/NumberInput/context.d.ts +3 -2
- package/dist/esm/types/components/NumberInput/context.d.ts.map +1 -1
- package/dist/esm/types/components/NumberInput/index.d.ts +12 -3
- package/dist/esm/types/components/NumberInput/index.d.ts.map +1 -1
- package/dist/esm/types/components/Piano/KeyLabel.d.ts +1 -3
- package/dist/esm/types/components/Piano/KeyLabel.d.ts.map +1 -1
- package/dist/esm/types/components/Piano/context.d.ts +24 -0
- package/dist/esm/types/components/Piano/context.d.ts.map +1 -0
- package/dist/esm/types/components/Piano/index.d.ts +15 -12
- package/dist/esm/types/components/Piano/index.d.ts.map +1 -1
- package/dist/esm/types/components/Piano/key.d.ts +14 -19
- package/dist/esm/types/components/Piano/key.d.ts.map +1 -1
- package/dist/esm/types/components/Piano/keyboardShortcuts.d.ts +2 -2
- package/dist/esm/types/components/Slider/Scale.d.ts +1 -3
- package/dist/esm/types/components/Slider/Scale.d.ts.map +1 -1
- package/dist/esm/types/components/Slider/Thumb.d.ts +1 -0
- package/dist/esm/types/components/Slider/Thumb.d.ts.map +1 -1
- package/dist/esm/types/components/Slider/Track.d.ts +2 -2
- package/dist/esm/types/components/Slider/Track.d.ts.map +1 -1
- package/dist/esm/types/components/Slider/index.d.ts +5 -1
- package/dist/esm/types/components/Slider/index.d.ts.map +1 -1
- package/dist/esm/types/components/WheelObserver/index.d.ts +3 -3
- package/dist/esm/types/components/WheelObserver/index.d.ts.map +1 -1
- package/dist/esm/types/components/XYPad/Area.d.ts +3 -3
- package/dist/esm/types/components/XYPad/Area.d.ts.map +1 -1
- package/dist/esm/types/components/XYPad/Thumb.d.ts +1 -0
- package/dist/esm/types/components/XYPad/Thumb.d.ts.map +1 -1
- package/dist/esm/types/components/XYPad/index.d.ts +6 -1
- package/dist/esm/types/components/XYPad/index.d.ts.map +1 -1
- package/dist/esm/types/hooks/useDrag.d.ts.map +1 -1
- package/dist/esm/types/hooks/useDragWithElement.d.ts +16 -0
- package/dist/esm/types/hooks/useDragWithElement.d.ts.map +1 -0
- package/dist/esm/types/hooks/useInterval.d.ts +2 -0
- package/dist/esm/types/hooks/useInterval.d.ts.map +1 -0
- package/dist/esm/types/hooks/useLongPress.d.ts +2 -0
- package/dist/esm/types/hooks/useLongPress.d.ts.map +1 -0
- package/dist/esm/types/index.d.ts +5 -0
- package/dist/esm/types/index.d.ts.map +1 -1
- package/dist/styles/index.css +117 -33
- package/package.json +3 -2
- package/src/components/AnimationCanvas/index.tsx +14 -6
- package/src/components/AnimationKnob/index.tsx +216 -187
- package/src/components/Knob/index.tsx +244 -171
- package/src/components/NumberInput/DecrementStepper.tsx +9 -2
- package/src/components/NumberInput/IncrementStepper.tsx +9 -2
- package/src/components/NumberInput/InternalInput.tsx +219 -0
- package/src/components/NumberInput/Stepper.tsx +2 -0
- package/src/components/NumberInput/context.tsx +20 -8
- package/src/components/NumberInput/index.css +76 -22
- package/src/components/NumberInput/index.tsx +94 -162
- package/src/components/Piano/KeyLabel.tsx +9 -5
- package/src/components/Piano/context.tsx +108 -0
- package/src/components/Piano/index.css +24 -6
- package/src/components/Piano/index.tsx +192 -122
- package/src/components/Piano/key.tsx +215 -0
- package/src/components/Piano/keyboardShortcuts.ts +2 -2
- package/src/components/Slider/Scale.tsx +1 -4
- package/src/components/Slider/Thumb.tsx +4 -0
- package/src/components/Slider/Track.tsx +5 -2
- package/src/components/Slider/index.css +5 -2
- package/src/components/Slider/index.tsx +84 -71
- package/src/components/WheelObserver/index.tsx +4 -2
- package/src/components/XYPad/Area.tsx +7 -6
- package/src/components/XYPad/Thumb.tsx +6 -0
- package/src/components/XYPad/index.css +12 -2
- package/src/components/XYPad/index.tsx +116 -90
- package/src/hooks/useDrag.ts +6 -7
- package/src/hooks/useDragWithElement.ts +76 -0
- package/src/hooks/useInterval.ts +27 -0
- package/src/hooks/useLongPress.ts +31 -0
- package/src/index.ts +6 -0
- package/src/styles/index.css +0 -1
- package/dist/cjs/types/components/Piano/BlackKey.d.ts +0 -5
- package/dist/cjs/types/components/Piano/BlackKey.d.ts.map +0 -1
- package/dist/cjs/types/components/Piano/WhiteKey.d.ts +0 -7
- package/dist/cjs/types/components/Piano/WhiteKey.d.ts.map +0 -1
- package/dist/esm/types/components/Piano/BlackKey.d.ts +0 -5
- package/dist/esm/types/components/Piano/BlackKey.d.ts.map +0 -1
- package/dist/esm/types/components/Piano/WhiteKey.d.ts +0 -7
- package/dist/esm/types/components/Piano/WhiteKey.d.ts.map +0 -1
- package/src/components/Piano/BlackKey.tsx +0 -118
- package/src/components/Piano/WhiteKey.tsx +0 -120
- package/src/components/Piano/key.ts +0 -46
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import clsx from 'clsx'
|
|
2
|
-
import { CSSProperties, ReactElement } from 'react'
|
|
2
|
+
import { ComponentPropsWithoutRef, CSSProperties, ReactElement } from 'react'
|
|
3
3
|
|
|
4
4
|
import { styleHelper, xor } from '@tremolo-ui/functions'
|
|
5
5
|
|
|
@@ -40,7 +40,9 @@ export function SliderTrack({
|
|
|
40
40
|
defaultStyle = true,
|
|
41
41
|
__thumb,
|
|
42
42
|
__percent = 0,
|
|
43
|
-
|
|
43
|
+
...props
|
|
44
|
+
}: SliderTrackProps &
|
|
45
|
+
Omit<ComponentPropsWithoutRef<'div'>, keyof SliderTrackProps>) {
|
|
44
46
|
const vertical = useSliderContext((s) => s.vertical)
|
|
45
47
|
const reverse = useSliderContext((s) => s.reverse)
|
|
46
48
|
const disabled = useSliderContext((s) => s.disabled)
|
|
@@ -70,6 +72,7 @@ export function SliderTrack({
|
|
|
70
72
|
...style,
|
|
71
73
|
}
|
|
72
74
|
}
|
|
75
|
+
{...props}
|
|
73
76
|
>
|
|
74
77
|
{children}
|
|
75
78
|
{__thumb}
|
|
@@ -16,7 +16,9 @@
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
.tremolo-slider-thumb {
|
|
19
|
-
|
|
19
|
+
--color: var(--tremolo-theme-color);
|
|
20
|
+
|
|
21
|
+
background: var(--color);
|
|
20
22
|
border-radius: 50%;
|
|
21
23
|
outline: none;
|
|
22
24
|
|
|
@@ -25,7 +27,8 @@
|
|
|
25
27
|
}
|
|
26
28
|
|
|
27
29
|
&[aria-readonly='false']:focus {
|
|
28
|
-
box-shadow: 0px 0px 0px 3px
|
|
30
|
+
box-shadow: 0px 0px 0px 3px
|
|
31
|
+
color-mix(in srgb, var(--color) 20%, transparent);
|
|
29
32
|
}
|
|
30
33
|
}
|
|
31
34
|
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
xor,
|
|
22
22
|
} from '@tremolo-ui/functions'
|
|
23
23
|
|
|
24
|
-
import {
|
|
24
|
+
import { useDragWithElement } from '../../hooks/useDragWithElement'
|
|
25
25
|
import { useRefCallbackEvent } from '../../hooks/useRefCallbackEvent'
|
|
26
26
|
import { addNoSelect, removeNoSelect } from '../_util'
|
|
27
27
|
|
|
@@ -63,12 +63,16 @@ export interface SliderProps {
|
|
|
63
63
|
className?: string
|
|
64
64
|
style?: CSSProperties
|
|
65
65
|
onChange?: (value: number) => void
|
|
66
|
+
onDragStart?: (value: number) => void
|
|
67
|
+
onDragEnd?: (value: number) => void
|
|
66
68
|
/** \<SliderThumb /> | \<SliderTrack /> */
|
|
67
69
|
children?: ReactElement | ReactElement[]
|
|
68
70
|
// ReactElement<typeof SliderThumb, typeof SliderTrack>[]
|
|
69
71
|
}
|
|
70
72
|
|
|
71
|
-
/**
|
|
73
|
+
/**
|
|
74
|
+
* @category Slider
|
|
75
|
+
*/
|
|
72
76
|
export interface SliderMethods {
|
|
73
77
|
focus: () => void
|
|
74
78
|
blur: () => void
|
|
@@ -91,15 +95,21 @@ export const Slider = forwardRef<SliderMethods, Props>(
|
|
|
91
95
|
skew = 1,
|
|
92
96
|
vertical = false,
|
|
93
97
|
reverse = false,
|
|
94
|
-
className,
|
|
95
|
-
style,
|
|
96
98
|
bodyNoSelect = true,
|
|
97
99
|
wheel = ['raw', 1],
|
|
98
100
|
keyboard = ['raw', 1],
|
|
99
101
|
disabled = false,
|
|
100
102
|
readonly = false,
|
|
101
103
|
onChange,
|
|
104
|
+
onDragStart,
|
|
105
|
+
onDragEnd,
|
|
106
|
+
className,
|
|
107
|
+
style,
|
|
102
108
|
children,
|
|
109
|
+
onFocus,
|
|
110
|
+
onBlur,
|
|
111
|
+
onPointerDown,
|
|
112
|
+
onKeyDown,
|
|
103
113
|
...props
|
|
104
114
|
}: Props,
|
|
105
115
|
ref,
|
|
@@ -107,7 +117,6 @@ export const Slider = forwardRef<SliderMethods, Props>(
|
|
|
107
117
|
// -- state and ref ---
|
|
108
118
|
const trackElementRef = useRef<HTMLDivElement>(null)
|
|
109
119
|
const thumbRef = useRef<SliderThumbMethods>(null)
|
|
110
|
-
const thumbDragged = useRef(false)
|
|
111
120
|
|
|
112
121
|
// --- interpret props ---
|
|
113
122
|
const p = toFixed(normalizeValue(value, min, max, skew) * 100)
|
|
@@ -145,34 +154,30 @@ export const Slider = forwardRef<SliderMethods, Props>(
|
|
|
145
154
|
}
|
|
146
155
|
|
|
147
156
|
// --- internal functions ---
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
: normalizeValue(mouseX, x1, x2)
|
|
173
|
-
const v = rawValue(displayReversed ? 1 - n : n, min, max, skew)
|
|
174
|
-
onChange(clamp(stepValue(v, step), min, max))
|
|
175
|
-
}
|
|
157
|
+
const onDrag = useCallback(
|
|
158
|
+
(nx: number, ny: number) => {
|
|
159
|
+
if (!onChange || readonly) return
|
|
160
|
+
const n = vertical ? ny : nx
|
|
161
|
+
const v = rawValue(displayReversed ? 1 - n : n, min, max, skew)
|
|
162
|
+
const v2 = clamp(stepValue(v, step), min, max)
|
|
163
|
+
onChange(v2)
|
|
164
|
+
},
|
|
165
|
+
[displayReversed, max, min, onChange, readonly, skew, step, vertical],
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
const updateValueByEvent = useCallback(
|
|
169
|
+
(eventType: InputEventOption[0], x: number) => {
|
|
170
|
+
let newValue
|
|
171
|
+
if (eventType == 'normalized') {
|
|
172
|
+
const n = normalizeValue(value, min, max, skew)
|
|
173
|
+
newValue = rawValue(n + x, min, max, skew)
|
|
174
|
+
} else {
|
|
175
|
+
newValue = value + x
|
|
176
|
+
}
|
|
177
|
+
return clamp(stepValue(newValue, step), min, max)
|
|
178
|
+
},
|
|
179
|
+
[max, min, skew, step, value],
|
|
180
|
+
)
|
|
176
181
|
|
|
177
182
|
const handleKeyDown = useCallback(
|
|
178
183
|
(event: React.KeyboardEvent<HTMLDivElement>) => {
|
|
@@ -183,26 +188,41 @@ export const Slider = forwardRef<SliderMethods, Props>(
|
|
|
183
188
|
let x =
|
|
184
189
|
key == 'ArrowRight' || key == 'ArrowUp' ? keyboard[1] : -keyboard[1]
|
|
185
190
|
if (reverse) x *= -1
|
|
186
|
-
|
|
187
|
-
if (keyboard[0] == 'normalized') {
|
|
188
|
-
const n = normalizeValue(value, min, max, skew)
|
|
189
|
-
v = rawValue(n + x, min, max, skew)
|
|
190
|
-
} else {
|
|
191
|
-
v = value + x
|
|
192
|
-
}
|
|
193
|
-
onChange(clamp(stepValue(v, step), min, max))
|
|
191
|
+
onChange(updateValueByEvent(keyboard[0], x))
|
|
194
192
|
}
|
|
195
193
|
},
|
|
196
|
-
[
|
|
194
|
+
[keyboard, onChange, readonly, reverse, updateValueByEvent],
|
|
197
195
|
)
|
|
198
196
|
|
|
199
197
|
// --- hooks ---
|
|
200
|
-
const touchMoveRefCallback =
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
198
|
+
const [touchMoveRefCallback, pointerDownHandler] =
|
|
199
|
+
useDragWithElement<HTMLDivElement>({
|
|
200
|
+
baseElementRef: trackElementRef,
|
|
201
|
+
onDrag: onDrag,
|
|
202
|
+
onDragStart: (nx, ny) => {
|
|
203
|
+
if (readonly) return
|
|
204
|
+
if (bodyNoSelect) addNoSelect()
|
|
205
|
+
thumbRef.current?.focus()
|
|
206
|
+
onDragStart?.(
|
|
207
|
+
clamp(
|
|
208
|
+
stepValue(rawValue(vertical ? ny : nx, min, max, skew), step),
|
|
209
|
+
min,
|
|
210
|
+
max,
|
|
211
|
+
),
|
|
212
|
+
)
|
|
213
|
+
},
|
|
214
|
+
onDragEnd: (nx, ny) => {
|
|
215
|
+
if (readonly) return
|
|
216
|
+
if (bodyNoSelect) removeNoSelect()
|
|
217
|
+
onDragEnd?.(
|
|
218
|
+
clamp(
|
|
219
|
+
stepValue(rawValue(vertical ? ny : nx, min, max, skew), step),
|
|
220
|
+
min,
|
|
221
|
+
max,
|
|
222
|
+
),
|
|
223
|
+
)
|
|
224
|
+
},
|
|
225
|
+
})
|
|
206
226
|
|
|
207
227
|
const wheelRefCallback = useRefCallbackEvent(
|
|
208
228
|
'wheel',
|
|
@@ -217,30 +237,14 @@ export const Slider = forwardRef<SliderMethods, Props>(
|
|
|
217
237
|
x = event.deltaY > 0 ? -wheel[1] : wheel[1]
|
|
218
238
|
}
|
|
219
239
|
if (vertical && reverse) x *= -1
|
|
220
|
-
|
|
221
|
-
if (wheel[0] == 'normalized') {
|
|
222
|
-
const n = normalizeValue(value, min, max, skew)
|
|
223
|
-
v = rawValue(n + x, min, max, skew)
|
|
224
|
-
} else {
|
|
225
|
-
v = value + x
|
|
226
|
-
}
|
|
227
|
-
onChange(clamp(stepValue(v, step), min, max))
|
|
240
|
+
onChange(updateValueByEvent(wheel[0], x))
|
|
228
241
|
},
|
|
229
242
|
{
|
|
230
243
|
passive: false,
|
|
231
244
|
},
|
|
232
|
-
[wheel,
|
|
245
|
+
[wheel, vertical, readonly, onChange, updateValueByEvent],
|
|
233
246
|
)
|
|
234
247
|
|
|
235
|
-
useEventListener(globalThis.window, 'mousemove', (event) => {
|
|
236
|
-
handleValue(event)
|
|
237
|
-
})
|
|
238
|
-
|
|
239
|
-
useEventListener(globalThis.window, 'mouseup', () => {
|
|
240
|
-
thumbDragged.current = false
|
|
241
|
-
if (bodyNoSelect) removeNoSelect()
|
|
242
|
-
})
|
|
243
|
-
|
|
244
248
|
useImperativeHandle(ref, () => {
|
|
245
249
|
return {
|
|
246
250
|
focus() {
|
|
@@ -282,12 +286,21 @@ export const Slider = forwardRef<SliderMethods, Props>(
|
|
|
282
286
|
...style,
|
|
283
287
|
}}
|
|
284
288
|
onPointerDown={(event) => {
|
|
285
|
-
|
|
286
|
-
|
|
289
|
+
pointerDownHandler(event)
|
|
290
|
+
onPointerDown?.(event)
|
|
291
|
+
}}
|
|
292
|
+
onKeyDown={(event) => {
|
|
293
|
+
handleKeyDown(event)
|
|
294
|
+
onKeyDown?.(event)
|
|
295
|
+
}}
|
|
296
|
+
onFocus={(event) => {
|
|
297
|
+
thumbRef.current?.focus()
|
|
298
|
+
onFocus?.(event)
|
|
299
|
+
}}
|
|
300
|
+
onBlur={(event) => {
|
|
301
|
+
thumbRef.current?.blur()
|
|
302
|
+
onBlur?.(event)
|
|
287
303
|
}}
|
|
288
|
-
onKeyDown={handleKeyDown}
|
|
289
|
-
onFocus={thumbRef.current?.focus}
|
|
290
|
-
onBlur={thumbRef.current?.blur}
|
|
291
304
|
{...props}
|
|
292
305
|
>
|
|
293
306
|
<div
|
|
@@ -14,7 +14,8 @@ import { useRefCallbackEvent } from '../../hooks/useRefCallbackEvent'
|
|
|
14
14
|
* </WheelObserver>
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
/** @category WheelObserver */
|
|
18
|
+
export interface WheelObserverProps<T extends ElementType> {
|
|
18
19
|
/**
|
|
19
20
|
* React.ElementType
|
|
20
21
|
* @default div
|
|
@@ -27,7 +28,8 @@ interface Props<T extends ElementType> {
|
|
|
27
28
|
|
|
28
29
|
/** @category WheelObserver */
|
|
29
30
|
export function WheelObserver<T extends ElementType = 'div'>(
|
|
30
|
-
props:
|
|
31
|
+
props: WheelObserverProps<T> &
|
|
32
|
+
Omit<ComponentPropsWithoutRef<T>, keyof WheelObserverProps<T>>,
|
|
31
33
|
) {
|
|
32
34
|
const { children, onWheel, as: Component = 'div', ...attributes } = props
|
|
33
35
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import clsx from 'clsx'
|
|
2
|
-
import { CSSProperties, ReactElement } from 'react'
|
|
2
|
+
import { ComponentPropsWithoutRef, CSSProperties, ReactElement } from 'react'
|
|
3
3
|
|
|
4
4
|
/** @category XYPad */
|
|
5
5
|
export interface AreaProps {
|
|
6
6
|
width?: number | string
|
|
7
7
|
height?: number | string
|
|
8
|
-
|
|
8
|
+
color?: string
|
|
9
9
|
className?: string
|
|
10
10
|
style?: CSSProperties
|
|
11
11
|
children?: ReactElement
|
|
@@ -18,22 +18,23 @@ export interface AreaProps {
|
|
|
18
18
|
export function XYPadArea({
|
|
19
19
|
width = 120,
|
|
20
20
|
height = 120,
|
|
21
|
-
|
|
21
|
+
color,
|
|
22
22
|
children,
|
|
23
23
|
className,
|
|
24
24
|
style,
|
|
25
25
|
__thumb,
|
|
26
|
-
|
|
26
|
+
...props
|
|
27
|
+
}: AreaProps & Omit<ComponentPropsWithoutRef<'div'>, keyof AreaProps>) {
|
|
27
28
|
return (
|
|
28
29
|
<div
|
|
29
30
|
className={clsx('tremolo-xy-pad-area', className)}
|
|
30
31
|
style={{
|
|
31
|
-
|
|
32
|
+
...{ '--color': color },
|
|
32
33
|
width: width,
|
|
33
34
|
height: height,
|
|
34
|
-
background: bg,
|
|
35
35
|
...style,
|
|
36
36
|
}}
|
|
37
|
+
{...props}
|
|
37
38
|
>
|
|
38
39
|
{children}
|
|
39
40
|
{__thumb}
|
|
@@ -14,6 +14,8 @@ export interface ThumbProps {
|
|
|
14
14
|
width?: number | string
|
|
15
15
|
height?: number | string
|
|
16
16
|
|
|
17
|
+
color?: string
|
|
18
|
+
|
|
17
19
|
wrapperClassName?: string
|
|
18
20
|
wrapperStyle?: CSSProperties
|
|
19
21
|
|
|
@@ -41,6 +43,7 @@ export const XYPadThumb = forwardRef<XYPadThumbMethods, Props>(
|
|
|
41
43
|
size,
|
|
42
44
|
width = 22,
|
|
43
45
|
height = 22,
|
|
46
|
+
color,
|
|
44
47
|
children,
|
|
45
48
|
wrapperClassName,
|
|
46
49
|
wrapperStyle,
|
|
@@ -48,6 +51,7 @@ export const XYPadThumb = forwardRef<XYPadThumbMethods, Props>(
|
|
|
48
51
|
style,
|
|
49
52
|
__disabled,
|
|
50
53
|
__css,
|
|
54
|
+
...props
|
|
51
55
|
}: Props,
|
|
52
56
|
ref,
|
|
53
57
|
) => {
|
|
@@ -71,6 +75,7 @@ export const XYPadThumb = forwardRef<XYPadThumbMethods, Props>(
|
|
|
71
75
|
...__css,
|
|
72
76
|
...wrapperStyle,
|
|
73
77
|
}}
|
|
78
|
+
{...props}
|
|
74
79
|
>
|
|
75
80
|
{children ? (
|
|
76
81
|
children
|
|
@@ -83,6 +88,7 @@ export const XYPadThumb = forwardRef<XYPadThumbMethods, Props>(
|
|
|
83
88
|
tabIndex={0}
|
|
84
89
|
aria-disabled={__disabled}
|
|
85
90
|
style={{
|
|
91
|
+
...{ '--color': color },
|
|
86
92
|
width: size ?? width,
|
|
87
93
|
height: size ?? height,
|
|
88
94
|
...style,
|
|
@@ -3,6 +3,13 @@
|
|
|
3
3
|
cursor: pointer;
|
|
4
4
|
}
|
|
5
5
|
|
|
6
|
+
.tremolo-xy-pad-area {
|
|
7
|
+
--color: #eee;
|
|
8
|
+
|
|
9
|
+
position: relative;
|
|
10
|
+
background-color: var(--color);
|
|
11
|
+
}
|
|
12
|
+
|
|
6
13
|
.tremolo-xy-pad-thumb-wrapper {
|
|
7
14
|
position: absolute;
|
|
8
15
|
translate: -50% -50%;
|
|
@@ -10,15 +17,18 @@
|
|
|
10
17
|
}
|
|
11
18
|
|
|
12
19
|
.tremolo-xy-pad-thumb {
|
|
20
|
+
--color: var(--tremolo-theme-color);
|
|
21
|
+
|
|
13
22
|
border-radius: 50%;
|
|
14
23
|
outline: none;
|
|
15
|
-
background-color:
|
|
24
|
+
background-color: var(--color);
|
|
16
25
|
|
|
17
26
|
&[aria-disabled='true'] {
|
|
18
27
|
background-color: #5d6478;
|
|
19
28
|
}
|
|
20
29
|
|
|
21
30
|
&:focus {
|
|
22
|
-
box-shadow: 0px 0px 0px 3px
|
|
31
|
+
box-shadow: 0px 0px 0px 3px
|
|
32
|
+
color-mix(in srgb, var(--color) 20%, transparent);
|
|
23
33
|
}
|
|
24
34
|
}
|