@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.
Files changed (153) hide show
  1. package/dist/cjs/index.js +711 -395
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/types/components/AnimationCanvas/index.d.ts +2 -2
  4. package/dist/cjs/types/components/AnimationCanvas/index.d.ts.map +1 -1
  5. package/dist/cjs/types/components/AnimationKnob/index.d.ts +10 -3
  6. package/dist/cjs/types/components/AnimationKnob/index.d.ts.map +1 -1
  7. package/dist/cjs/types/components/Knob/index.d.ts +25 -3
  8. package/dist/cjs/types/components/Knob/index.d.ts.map +1 -1
  9. package/dist/cjs/types/components/NumberInput/DecrementStepper.d.ts +2 -0
  10. package/dist/cjs/types/components/NumberInput/DecrementStepper.d.ts.map +1 -1
  11. package/dist/cjs/types/components/NumberInput/IncrementStepper.d.ts +2 -0
  12. package/dist/cjs/types/components/NumberInput/IncrementStepper.d.ts.map +1 -1
  13. package/dist/cjs/types/components/NumberInput/InternalInput.d.ts +18 -0
  14. package/dist/cjs/types/components/NumberInput/InternalInput.d.ts.map +1 -0
  15. package/dist/cjs/types/components/NumberInput/Stepper.d.ts +2 -0
  16. package/dist/cjs/types/components/NumberInput/Stepper.d.ts.map +1 -1
  17. package/dist/cjs/types/components/NumberInput/context.d.ts +3 -2
  18. package/dist/cjs/types/components/NumberInput/context.d.ts.map +1 -1
  19. package/dist/cjs/types/components/NumberInput/index.d.ts +12 -3
  20. package/dist/cjs/types/components/NumberInput/index.d.ts.map +1 -1
  21. package/dist/cjs/types/components/Piano/KeyLabel.d.ts +1 -3
  22. package/dist/cjs/types/components/Piano/KeyLabel.d.ts.map +1 -1
  23. package/dist/cjs/types/components/Piano/context.d.ts +24 -0
  24. package/dist/cjs/types/components/Piano/context.d.ts.map +1 -0
  25. package/dist/cjs/types/components/Piano/index.d.ts +15 -12
  26. package/dist/cjs/types/components/Piano/index.d.ts.map +1 -1
  27. package/dist/cjs/types/components/Piano/key.d.ts +14 -19
  28. package/dist/cjs/types/components/Piano/key.d.ts.map +1 -1
  29. package/dist/cjs/types/components/Piano/keyboardShortcuts.d.ts +2 -2
  30. package/dist/cjs/types/components/Slider/Scale.d.ts +1 -3
  31. package/dist/cjs/types/components/Slider/Scale.d.ts.map +1 -1
  32. package/dist/cjs/types/components/Slider/Thumb.d.ts +1 -0
  33. package/dist/cjs/types/components/Slider/Thumb.d.ts.map +1 -1
  34. package/dist/cjs/types/components/Slider/Track.d.ts +2 -2
  35. package/dist/cjs/types/components/Slider/Track.d.ts.map +1 -1
  36. package/dist/cjs/types/components/Slider/index.d.ts +5 -1
  37. package/dist/cjs/types/components/Slider/index.d.ts.map +1 -1
  38. package/dist/cjs/types/components/WheelObserver/index.d.ts +3 -3
  39. package/dist/cjs/types/components/WheelObserver/index.d.ts.map +1 -1
  40. package/dist/cjs/types/components/XYPad/Area.d.ts +3 -3
  41. package/dist/cjs/types/components/XYPad/Area.d.ts.map +1 -1
  42. package/dist/cjs/types/components/XYPad/Thumb.d.ts +1 -0
  43. package/dist/cjs/types/components/XYPad/Thumb.d.ts.map +1 -1
  44. package/dist/cjs/types/components/XYPad/index.d.ts +6 -1
  45. package/dist/cjs/types/components/XYPad/index.d.ts.map +1 -1
  46. package/dist/cjs/types/hooks/useDrag.d.ts.map +1 -1
  47. package/dist/cjs/types/hooks/useDragWithElement.d.ts +16 -0
  48. package/dist/cjs/types/hooks/useDragWithElement.d.ts.map +1 -0
  49. package/dist/cjs/types/hooks/useInterval.d.ts +2 -0
  50. package/dist/cjs/types/hooks/useInterval.d.ts.map +1 -0
  51. package/dist/cjs/types/hooks/useLongPress.d.ts +2 -0
  52. package/dist/cjs/types/hooks/useLongPress.d.ts.map +1 -0
  53. package/dist/cjs/types/index.d.ts +5 -0
  54. package/dist/cjs/types/index.d.ts.map +1 -1
  55. package/dist/esm/index.js +706 -396
  56. package/dist/esm/index.js.map +1 -1
  57. package/dist/esm/types/components/AnimationCanvas/index.d.ts +2 -2
  58. package/dist/esm/types/components/AnimationCanvas/index.d.ts.map +1 -1
  59. package/dist/esm/types/components/AnimationKnob/index.d.ts +10 -3
  60. package/dist/esm/types/components/AnimationKnob/index.d.ts.map +1 -1
  61. package/dist/esm/types/components/Knob/index.d.ts +25 -3
  62. package/dist/esm/types/components/Knob/index.d.ts.map +1 -1
  63. package/dist/esm/types/components/NumberInput/DecrementStepper.d.ts +2 -0
  64. package/dist/esm/types/components/NumberInput/DecrementStepper.d.ts.map +1 -1
  65. package/dist/esm/types/components/NumberInput/IncrementStepper.d.ts +2 -0
  66. package/dist/esm/types/components/NumberInput/IncrementStepper.d.ts.map +1 -1
  67. package/dist/esm/types/components/NumberInput/InternalInput.d.ts +18 -0
  68. package/dist/esm/types/components/NumberInput/InternalInput.d.ts.map +1 -0
  69. package/dist/esm/types/components/NumberInput/Stepper.d.ts +2 -0
  70. package/dist/esm/types/components/NumberInput/Stepper.d.ts.map +1 -1
  71. package/dist/esm/types/components/NumberInput/context.d.ts +3 -2
  72. package/dist/esm/types/components/NumberInput/context.d.ts.map +1 -1
  73. package/dist/esm/types/components/NumberInput/index.d.ts +12 -3
  74. package/dist/esm/types/components/NumberInput/index.d.ts.map +1 -1
  75. package/dist/esm/types/components/Piano/KeyLabel.d.ts +1 -3
  76. package/dist/esm/types/components/Piano/KeyLabel.d.ts.map +1 -1
  77. package/dist/esm/types/components/Piano/context.d.ts +24 -0
  78. package/dist/esm/types/components/Piano/context.d.ts.map +1 -0
  79. package/dist/esm/types/components/Piano/index.d.ts +15 -12
  80. package/dist/esm/types/components/Piano/index.d.ts.map +1 -1
  81. package/dist/esm/types/components/Piano/key.d.ts +14 -19
  82. package/dist/esm/types/components/Piano/key.d.ts.map +1 -1
  83. package/dist/esm/types/components/Piano/keyboardShortcuts.d.ts +2 -2
  84. package/dist/esm/types/components/Slider/Scale.d.ts +1 -3
  85. package/dist/esm/types/components/Slider/Scale.d.ts.map +1 -1
  86. package/dist/esm/types/components/Slider/Thumb.d.ts +1 -0
  87. package/dist/esm/types/components/Slider/Thumb.d.ts.map +1 -1
  88. package/dist/esm/types/components/Slider/Track.d.ts +2 -2
  89. package/dist/esm/types/components/Slider/Track.d.ts.map +1 -1
  90. package/dist/esm/types/components/Slider/index.d.ts +5 -1
  91. package/dist/esm/types/components/Slider/index.d.ts.map +1 -1
  92. package/dist/esm/types/components/WheelObserver/index.d.ts +3 -3
  93. package/dist/esm/types/components/WheelObserver/index.d.ts.map +1 -1
  94. package/dist/esm/types/components/XYPad/Area.d.ts +3 -3
  95. package/dist/esm/types/components/XYPad/Area.d.ts.map +1 -1
  96. package/dist/esm/types/components/XYPad/Thumb.d.ts +1 -0
  97. package/dist/esm/types/components/XYPad/Thumb.d.ts.map +1 -1
  98. package/dist/esm/types/components/XYPad/index.d.ts +6 -1
  99. package/dist/esm/types/components/XYPad/index.d.ts.map +1 -1
  100. package/dist/esm/types/hooks/useDrag.d.ts.map +1 -1
  101. package/dist/esm/types/hooks/useDragWithElement.d.ts +16 -0
  102. package/dist/esm/types/hooks/useDragWithElement.d.ts.map +1 -0
  103. package/dist/esm/types/hooks/useInterval.d.ts +2 -0
  104. package/dist/esm/types/hooks/useInterval.d.ts.map +1 -0
  105. package/dist/esm/types/hooks/useLongPress.d.ts +2 -0
  106. package/dist/esm/types/hooks/useLongPress.d.ts.map +1 -0
  107. package/dist/esm/types/index.d.ts +5 -0
  108. package/dist/esm/types/index.d.ts.map +1 -1
  109. package/dist/styles/index.css +117 -33
  110. package/package.json +3 -2
  111. package/src/components/AnimationCanvas/index.tsx +14 -6
  112. package/src/components/AnimationKnob/index.tsx +216 -187
  113. package/src/components/Knob/index.tsx +244 -171
  114. package/src/components/NumberInput/DecrementStepper.tsx +9 -2
  115. package/src/components/NumberInput/IncrementStepper.tsx +9 -2
  116. package/src/components/NumberInput/InternalInput.tsx +219 -0
  117. package/src/components/NumberInput/Stepper.tsx +2 -0
  118. package/src/components/NumberInput/context.tsx +20 -8
  119. package/src/components/NumberInput/index.css +76 -22
  120. package/src/components/NumberInput/index.tsx +94 -162
  121. package/src/components/Piano/KeyLabel.tsx +9 -5
  122. package/src/components/Piano/context.tsx +108 -0
  123. package/src/components/Piano/index.css +24 -6
  124. package/src/components/Piano/index.tsx +192 -122
  125. package/src/components/Piano/key.tsx +215 -0
  126. package/src/components/Piano/keyboardShortcuts.ts +2 -2
  127. package/src/components/Slider/Scale.tsx +1 -4
  128. package/src/components/Slider/Thumb.tsx +4 -0
  129. package/src/components/Slider/Track.tsx +5 -2
  130. package/src/components/Slider/index.css +5 -2
  131. package/src/components/Slider/index.tsx +84 -71
  132. package/src/components/WheelObserver/index.tsx +4 -2
  133. package/src/components/XYPad/Area.tsx +7 -6
  134. package/src/components/XYPad/Thumb.tsx +6 -0
  135. package/src/components/XYPad/index.css +12 -2
  136. package/src/components/XYPad/index.tsx +116 -90
  137. package/src/hooks/useDrag.ts +6 -7
  138. package/src/hooks/useDragWithElement.ts +76 -0
  139. package/src/hooks/useInterval.ts +27 -0
  140. package/src/hooks/useLongPress.ts +31 -0
  141. package/src/index.ts +6 -0
  142. package/src/styles/index.css +0 -1
  143. package/dist/cjs/types/components/Piano/BlackKey.d.ts +0 -5
  144. package/dist/cjs/types/components/Piano/BlackKey.d.ts.map +0 -1
  145. package/dist/cjs/types/components/Piano/WhiteKey.d.ts +0 -7
  146. package/dist/cjs/types/components/Piano/WhiteKey.d.ts.map +0 -1
  147. package/dist/esm/types/components/Piano/BlackKey.d.ts +0 -5
  148. package/dist/esm/types/components/Piano/BlackKey.d.ts.map +0 -1
  149. package/dist/esm/types/components/Piano/WhiteKey.d.ts +0 -7
  150. package/dist/esm/types/components/Piano/WhiteKey.d.ts.map +0 -1
  151. package/src/components/Piano/BlackKey.tsx +0 -118
  152. package/src/components/Piano/WhiteKey.tsx +0 -120
  153. 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
- }: SliderTrackProps) {
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
- background: #4e76e6;
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 rgba(var(--tremolo-theme-color-rgb), 0.2);
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 { useEventListener } from '../../hooks/useEventListener'
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
- /** @category Slider */
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 handleValue = (
149
- event: MouseEvent | React.PointerEvent<HTMLDivElement> | TouchEvent,
150
- ) => {
151
- if (
152
- !trackElementRef.current ||
153
- !thumbDragged.current ||
154
- !onChange ||
155
- readonly
156
- ) {
157
- return
158
- }
159
- const isTouch = event instanceof TouchEvent
160
- if (isTouch && event.cancelable) event.preventDefault()
161
- if (bodyNoSelect) addNoSelect()
162
- const {
163
- left: x1,
164
- top: y1,
165
- right: x2,
166
- bottom: y2,
167
- } = trackElementRef.current.getBoundingClientRect()
168
- const mouseX = isTouch ? event.touches[0].clientX : event.clientX
169
- const mouseY = isTouch ? event.touches[0].clientY : event.clientY
170
- const n = vertical
171
- ? normalizeValue(mouseY, y1, y2)
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
- let v
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
- [value, min, max, step, skew, reverse, keyboard, onChange, readonly],
194
+ [keyboard, onChange, readonly, reverse, updateValueByEvent],
197
195
  )
198
196
 
199
197
  // --- hooks ---
200
- const touchMoveRefCallback = useRefCallbackEvent(
201
- 'touchmove',
202
- handleValue,
203
- { passive: false },
204
- [min, max, skew, step, vertical, reverse, onChange, readonly],
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
- let v
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, value, min, max, skew, step],
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
- thumbDragged.current = true
286
- handleValue(event)
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
- interface Props<T extends ElementType> {
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: Props<T> & Omit<ComponentPropsWithoutRef<T>, keyof Props<T>>,
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
- bg?: string
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
- bg = '#eee',
21
+ color,
22
22
  children,
23
23
  className,
24
24
  style,
25
25
  __thumb,
26
- }: AreaProps) {
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
- position: 'relative',
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: #4e76e6;
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 rgba(var(--tremolo-theme-color-rgb), 0.2);
31
+ box-shadow: 0px 0px 0px 3px
32
+ color-mix(in srgb, var(--color) 20%, transparent);
23
33
  }
24
34
  }