@tremolo-ui/react 0.0.7 → 0.0.9

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 (133) hide show
  1. package/dist/cjs/index.js +675 -253
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/types/components/AnimationCanvas/index.d.ts +16 -9
  4. package/dist/cjs/types/components/AnimationCanvas/index.d.ts.map +1 -1
  5. package/dist/cjs/types/components/AnimationKnob/index.d.ts +53 -0
  6. package/dist/cjs/types/components/AnimationKnob/index.d.ts.map +1 -0
  7. package/dist/cjs/types/components/DragObserver/index.d.ts +19 -0
  8. package/dist/cjs/types/components/DragObserver/index.d.ts.map +1 -0
  9. package/dist/cjs/types/components/Knob/index.d.ts +26 -26
  10. package/dist/cjs/types/components/Knob/index.d.ts.map +1 -1
  11. package/dist/cjs/types/components/NumberInput/index.d.ts +2 -5
  12. package/dist/cjs/types/components/NumberInput/index.d.ts.map +1 -1
  13. package/dist/cjs/types/components/Piano/BlackKey.d.ts +3 -3
  14. package/dist/cjs/types/components/Piano/BlackKey.d.ts.map +1 -1
  15. package/dist/cjs/types/components/Piano/KeyLabel.d.ts +5 -8
  16. package/dist/cjs/types/components/Piano/KeyLabel.d.ts.map +1 -1
  17. package/dist/cjs/types/components/Piano/WhiteKey.d.ts +4 -3
  18. package/dist/cjs/types/components/Piano/WhiteKey.d.ts.map +1 -1
  19. package/dist/cjs/types/components/Piano/index.d.ts +3 -4
  20. package/dist/cjs/types/components/Piano/index.d.ts.map +1 -1
  21. package/dist/cjs/types/components/Piano/key.d.ts +4 -7
  22. package/dist/cjs/types/components/Piano/key.d.ts.map +1 -1
  23. package/dist/cjs/types/components/Piano/keyboardShortcuts.d.ts.map +1 -1
  24. package/dist/cjs/types/components/Slider/Scale.d.ts +11 -0
  25. package/dist/cjs/types/components/Slider/Scale.d.ts.map +1 -0
  26. package/dist/cjs/types/components/Slider/ScaleOption.d.ts +25 -0
  27. package/dist/cjs/types/components/Slider/ScaleOption.d.ts.map +1 -0
  28. package/dist/cjs/types/components/Slider/Thumb.d.ts +5 -13
  29. package/dist/cjs/types/components/Slider/Thumb.d.ts.map +1 -1
  30. package/dist/cjs/types/components/Slider/Track.d.ts +10 -21
  31. package/dist/cjs/types/components/Slider/Track.d.ts.map +1 -1
  32. package/dist/cjs/types/components/Slider/context.d.ts +21 -0
  33. package/dist/cjs/types/components/Slider/context.d.ts.map +1 -0
  34. package/dist/cjs/types/components/Slider/index.d.ts +18 -12
  35. package/dist/cjs/types/components/Slider/index.d.ts.map +1 -1
  36. package/dist/cjs/types/components/WheelObserver/index.d.ts +24 -0
  37. package/dist/cjs/types/components/WheelObserver/index.d.ts.map +1 -0
  38. package/dist/cjs/types/components/XYPad/Area.d.ts +13 -0
  39. package/dist/cjs/types/components/XYPad/Area.d.ts.map +1 -0
  40. package/dist/cjs/types/components/XYPad/Thumb.d.ts +19 -0
  41. package/dist/cjs/types/components/XYPad/Thumb.d.ts.map +1 -0
  42. package/dist/cjs/types/components/XYPad/index.d.ts +39 -0
  43. package/dist/cjs/types/components/XYPad/index.d.ts.map +1 -0
  44. package/dist/cjs/types/hooks/useCallbackRef.d.ts.map +1 -1
  45. package/dist/cjs/types/index.d.ts +10 -0
  46. package/dist/cjs/types/index.d.ts.map +1 -1
  47. package/dist/esm/index.js +658 -254
  48. package/dist/esm/index.js.map +1 -1
  49. package/dist/esm/types/components/AnimationCanvas/index.d.ts +16 -9
  50. package/dist/esm/types/components/AnimationCanvas/index.d.ts.map +1 -1
  51. package/dist/esm/types/components/AnimationKnob/index.d.ts +53 -0
  52. package/dist/esm/types/components/AnimationKnob/index.d.ts.map +1 -0
  53. package/dist/esm/types/components/DragObserver/index.d.ts +19 -0
  54. package/dist/esm/types/components/DragObserver/index.d.ts.map +1 -0
  55. package/dist/esm/types/components/Knob/index.d.ts +26 -26
  56. package/dist/esm/types/components/Knob/index.d.ts.map +1 -1
  57. package/dist/esm/types/components/NumberInput/index.d.ts +2 -5
  58. package/dist/esm/types/components/NumberInput/index.d.ts.map +1 -1
  59. package/dist/esm/types/components/Piano/BlackKey.d.ts +3 -3
  60. package/dist/esm/types/components/Piano/BlackKey.d.ts.map +1 -1
  61. package/dist/esm/types/components/Piano/KeyLabel.d.ts +5 -8
  62. package/dist/esm/types/components/Piano/KeyLabel.d.ts.map +1 -1
  63. package/dist/esm/types/components/Piano/WhiteKey.d.ts +4 -3
  64. package/dist/esm/types/components/Piano/WhiteKey.d.ts.map +1 -1
  65. package/dist/esm/types/components/Piano/index.d.ts +3 -4
  66. package/dist/esm/types/components/Piano/index.d.ts.map +1 -1
  67. package/dist/esm/types/components/Piano/key.d.ts +4 -7
  68. package/dist/esm/types/components/Piano/key.d.ts.map +1 -1
  69. package/dist/esm/types/components/Piano/keyboardShortcuts.d.ts.map +1 -1
  70. package/dist/esm/types/components/Slider/Scale.d.ts +11 -0
  71. package/dist/esm/types/components/Slider/Scale.d.ts.map +1 -0
  72. package/dist/esm/types/components/Slider/ScaleOption.d.ts +25 -0
  73. package/dist/esm/types/components/Slider/ScaleOption.d.ts.map +1 -0
  74. package/dist/esm/types/components/Slider/Thumb.d.ts +5 -13
  75. package/dist/esm/types/components/Slider/Thumb.d.ts.map +1 -1
  76. package/dist/esm/types/components/Slider/Track.d.ts +10 -21
  77. package/dist/esm/types/components/Slider/Track.d.ts.map +1 -1
  78. package/dist/esm/types/components/Slider/context.d.ts +21 -0
  79. package/dist/esm/types/components/Slider/context.d.ts.map +1 -0
  80. package/dist/esm/types/components/Slider/index.d.ts +18 -12
  81. package/dist/esm/types/components/Slider/index.d.ts.map +1 -1
  82. package/dist/esm/types/components/WheelObserver/index.d.ts +24 -0
  83. package/dist/esm/types/components/WheelObserver/index.d.ts.map +1 -0
  84. package/dist/esm/types/components/XYPad/Area.d.ts +13 -0
  85. package/dist/esm/types/components/XYPad/Area.d.ts.map +1 -0
  86. package/dist/esm/types/components/XYPad/Thumb.d.ts +19 -0
  87. package/dist/esm/types/components/XYPad/Thumb.d.ts.map +1 -0
  88. package/dist/esm/types/components/XYPad/index.d.ts +39 -0
  89. package/dist/esm/types/components/XYPad/index.d.ts.map +1 -0
  90. package/dist/esm/types/hooks/useCallbackRef.d.ts.map +1 -1
  91. package/dist/esm/types/index.d.ts +10 -0
  92. package/dist/esm/types/index.d.ts.map +1 -1
  93. package/dist/styles/index.css +242 -0
  94. package/package.json +5 -8
  95. package/src/components/AnimationCanvas/index.tsx +87 -57
  96. package/src/components/AnimationKnob/index.tsx +305 -0
  97. package/src/components/DragObserver/index.tsx +94 -0
  98. package/src/components/Knob/index.css +48 -0
  99. package/src/components/Knob/index.tsx +152 -165
  100. package/src/components/NumberInput/index.css +26 -0
  101. package/src/components/NumberInput/index.tsx +8 -41
  102. package/src/components/Piano/BlackKey.tsx +105 -98
  103. package/src/components/Piano/KeyLabel.tsx +18 -40
  104. package/src/components/Piano/WhiteKey.tsx +94 -87
  105. package/src/components/Piano/index.css +63 -0
  106. package/src/components/Piano/index.tsx +78 -61
  107. package/src/components/Piano/key.ts +4 -7
  108. package/src/components/Piano/keyboardShortcuts.ts +23 -4
  109. package/src/components/Slider/Scale.tsx +55 -0
  110. package/src/components/Slider/ScaleOption.tsx +103 -0
  111. package/src/components/Slider/Thumb.tsx +69 -76
  112. package/src/components/Slider/Track.tsx +37 -48
  113. package/src/components/Slider/context.tsx +66 -0
  114. package/src/components/Slider/index.css +76 -0
  115. package/src/components/Slider/index.tsx +256 -298
  116. package/src/components/WheelObserver/index.tsx +47 -0
  117. package/src/components/XYPad/Area.tsx +40 -0
  118. package/src/components/XYPad/Thumb.tsx +92 -0
  119. package/src/components/XYPad/index.css +24 -0
  120. package/src/components/XYPad/index.tsx +317 -0
  121. package/src/hooks/useCallbackRef.ts +1 -0
  122. package/src/hooks/useRefCallbackEvent.ts +1 -0
  123. package/src/index.ts +11 -0
  124. package/dist/cjs/types/components/Slider/type.d.ts +0 -7
  125. package/dist/cjs/types/components/Slider/type.d.ts.map +0 -1
  126. package/dist/cjs/types/system/pseudo.d.ts +0 -14
  127. package/dist/cjs/types/system/pseudo.d.ts.map +0 -1
  128. package/dist/esm/types/components/Slider/type.d.ts +0 -7
  129. package/dist/esm/types/components/Slider/type.d.ts.map +0 -1
  130. package/dist/esm/types/system/pseudo.d.ts +0 -14
  131. package/dist/esm/types/system/pseudo.d.ts.map +0 -1
  132. package/src/components/Slider/type.ts +0 -16
  133. package/src/system/pseudo.ts +0 -55
@@ -1,13 +1,30 @@
1
- import React, { createRef, ReactElement, ReactNode, RefObject, useEffect, useMemo, useRef, useState } from 'react'
2
- import { css, CSSObject } from '@emotion/react'
3
- import { isWhiteKey, NoteName, noteName, noteNames, parseNoteName } from '@tremolo-ui/functions'
1
+ import clsx from 'clsx'
2
+ import React, {
3
+ ComponentPropsWithoutRef,
4
+ createRef,
5
+ CSSProperties,
6
+ ReactElement,
7
+ ReactNode,
8
+ RefObject,
9
+ useEffect,
10
+ useRef,
11
+ useState,
12
+ } from 'react'
13
+
14
+ import {
15
+ isWhiteKey,
16
+ NoteName,
17
+ noteName,
18
+ noteNames,
19
+ parseNoteName,
20
+ } from '@tremolo-ui/functions'
4
21
 
5
22
  import { useEventListener } from '../../hooks/useEventListener'
6
23
 
7
- import { KeyMethods } from './key'
8
- import { WhiteKey } from './WhiteKey'
9
24
  import { BlackKey } from './BlackKey'
25
+ import { KeyMethods, KeyProps } from './key'
10
26
  import { KeyBoardShortcuts } from './keyboardShortcuts'
27
+ import { defaultWhiteKeyWidth, WhiteKey } from './WhiteKey'
11
28
 
12
29
  /**
13
30
  * Piano component
@@ -18,7 +35,7 @@ import { KeyBoardShortcuts } from './keyboardShortcuts'
18
35
 
19
36
  export interface PianoProps {
20
37
  // required
21
- noteRange: { first: number, last: number }
38
+ noteRange: { first: number; last: number }
22
39
 
23
40
  // optional
24
41
  height?: number | string
@@ -28,7 +45,7 @@ export interface PianoProps {
28
45
  keyboardShortcuts?: KeyBoardShortcuts
29
46
  fill?: boolean
30
47
 
31
- style?: CSSObject
48
+ style?: CSSProperties
32
49
 
33
50
  playNote?: (noteNumber: number) => void
34
51
  stopNote?: (noteNumber: number) => void
@@ -49,11 +66,13 @@ export function Piano({
49
66
  fill = false,
50
67
  height = fill ? '100%' : 160,
51
68
  style,
69
+ className,
52
70
  playNote,
53
71
  stopNote,
54
72
  label,
55
73
  children,
56
- }: PianoProps) {
74
+ ...props
75
+ }: PianoProps & Omit<ComponentPropsWithoutRef<'div'>, keyof PianoProps>) {
57
76
  // -- state and ref ---
58
77
  const [pressed, setPressed] = useState(false)
59
78
  const [whiteNoteWidth, setWhiteNoteWidth] = useState(-1)
@@ -66,19 +85,19 @@ export function Piano({
66
85
  // --- interpret props ---
67
86
  const noteRangeArray = Array.from(
68
87
  { length: noteRange.last - noteRange.first + 1 },
69
- (_, i) => i + noteRange.first
88
+ (_, i) => i + noteRange.first,
70
89
  )
71
90
  const whiteNoteCount = noteRangeArray.filter((v) => isWhiteKey(v)).length
72
91
 
73
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
74
- let whiteKeyProps: any, blackKeyProps: any
92
+ let whiteKeyProps: KeyProps = {},
93
+ blackKeyProps: KeyProps = {}
75
94
  if (children != undefined) {
76
95
  React.Children.forEach(children, (child) => {
77
96
  if (React.isValidElement(child)) {
78
97
  if (child.type == WhiteKey) {
79
- whiteKeyProps = child.props
98
+ whiteKeyProps = child.props as KeyProps
80
99
  } else if (child.type == BlackKey) {
81
- blackKeyProps = child.props
100
+ blackKeyProps = child.props as KeyProps
82
101
  } else {
83
102
  throw new Error('only <WhiteKey> or <BlackKey>')
84
103
  }
@@ -113,7 +132,8 @@ export function Piano({
113
132
  const firstNoteName = toNoteName(noteRange.first)
114
133
  const pos = pitchPositions[_noteName] - pitchPositions[firstNoteName]
115
134
  const octave = Math.floor((note - noteRange.first) / 12)
116
- const octaveOffset = noteNames.indexOf(firstNoteName) > noteNames.indexOf(_noteName) ? 1 : 0
135
+ const octaveOffset =
136
+ noteNames.indexOf(firstNoteName) > noteNames.indexOf(_noteName) ? 1 : 0
117
137
  const length = whiteNoteWidth + 3
118
138
  return pos * length + (octave + octaveOffset) * 7 * length
119
139
  }
@@ -129,9 +149,9 @@ export function Piano({
129
149
  })
130
150
  resizeObserver.observe(parent)
131
151
  } else {
132
- setWhiteNoteWidth(whiteKeyProps?.width || 40)
152
+ setWhiteNoteWidth(whiteKeyProps?.width || defaultWhiteKeyWidth)
133
153
  }
134
- }, [])
154
+ }, [fill, whiteKeyProps?.width, whiteNoteCount])
135
155
 
136
156
  useEventListener(window, 'keydown', (e) => {
137
157
  if (e.repeat) return
@@ -156,58 +176,55 @@ export function Piano({
156
176
  return (
157
177
  <div
158
178
  ref={pianoRef}
159
- className="tremolo-piano"
160
- css={css({
161
- display: 'inline-block',
162
- boxSizing: 'border-box',
163
- userSelect: 'none',
164
- width: fill ? '100%' : undefined,
179
+ className={clsx('tremolo-piano', className)}
180
+ style={{
181
+ width: fill ? '100%' : (whiteNoteWidth + 3) * whiteNoteCount,
165
182
  height: height,
166
- position: 'relative',
167
- ...style
168
- })}
169
- onPointerDown={() => {
183
+ ...style,
184
+ }}
185
+ onPointerDown={(e) => {
186
+ if (props.onPointerDown) props.onPointerDown(e)
170
187
  setPressed(true)
171
188
  }}
172
- onPointerUp={() => {
189
+ onPointerUp={(e) => {
190
+ if (props.onPointerUp) props.onPointerUp(e)
173
191
  setPressed(false)
174
192
  }}
193
+ {...props}
175
194
  >
176
195
  {noteRangeArray.map((note, index) => {
177
- return (
178
- isWhiteKey(note) ? (
179
- <WhiteKey
180
- key={note}
181
- ref={keyRefs.current[index]}
182
- __glissando={glissando && pressed}
183
- __position={notePosition(note)}
184
- __note={note}
185
- __disabled={note > midiMax}
186
- __index={index}
187
- __fill={fill}
188
- __width={whiteNoteWidth}
189
- __playNote={playNote}
190
- __stopNote={stopNote}
191
- __label={label}
192
- {...whiteKeyProps}
193
- />
194
- ) : (
195
- <BlackKey
196
- key={note}
197
- ref={keyRefs.current[index]}
198
- __glissando={glissando && pressed}
199
- __position={notePosition(note)}
200
- __note={note}
201
- __disabled={note > midiMax}
202
- __index={index}
203
- __fill={fill}
204
- __width={whiteNoteWidth * 0.65}
205
- __playNote={playNote}
206
- __stopNote={stopNote}
207
- __label={label}
208
- {...blackKeyProps}
209
- />
210
- )
196
+ return isWhiteKey(note) ? (
197
+ <WhiteKey
198
+ key={note}
199
+ ref={keyRefs.current[index]}
200
+ __glissando={glissando && pressed}
201
+ __position={notePosition(note)}
202
+ __note={note}
203
+ __disabled={note > midiMax}
204
+ __index={index}
205
+ __fill={fill}
206
+ __width={whiteNoteWidth}
207
+ __playNote={playNote}
208
+ __stopNote={stopNote}
209
+ __label={label}
210
+ {...whiteKeyProps}
211
+ />
212
+ ) : (
213
+ <BlackKey
214
+ key={note}
215
+ ref={keyRefs.current[index]}
216
+ __glissando={glissando && pressed}
217
+ __position={notePosition(note)}
218
+ __note={note}
219
+ __disabled={note > midiMax}
220
+ __index={index}
221
+ __fill={fill}
222
+ __width={whiteNoteWidth * 0.65}
223
+ __playNote={playNote}
224
+ __stopNote={stopNote}
225
+ __label={label}
226
+ {...blackKeyProps}
227
+ />
211
228
  )
212
229
  })}
213
230
  </div>
@@ -1,13 +1,10 @@
1
- import { CSSObject } from "@emotion/react"
2
- import { ReactElement, ReactNode } from "react"
1
+ import { CSSProperties, ReactElement, ReactNode } from 'react'
3
2
 
4
3
  export interface KeyProps {
5
4
  width?: number
6
- height?: number | string
5
+ height?: number | `${number}%`
7
6
 
8
- bg?: string
9
- activeBg?: string
10
- style?: CSSObject
7
+ style?: CSSProperties
11
8
 
12
9
  /**
13
10
  * \<KeyLabel />
@@ -33,7 +30,7 @@ export interface KeyProps {
33
30
  /** @internal */
34
31
  __stopNote?: (noteNumber: number) => void
35
32
  /** @internal */
36
- __label?: (note: number) => ReactNode
33
+ __label?: (note: number, index: number) => ReactNode
37
34
  }
38
35
 
39
36
  export interface KeyMethods {
@@ -1,12 +1,31 @@
1
1
  export type KeyBoardShortcuts = {
2
- keys: string[],
2
+ keys: string[]
3
+ // TODO
3
4
  flags?: {
4
5
  naturalOnly?: boolean
5
- },
6
+ }
6
7
  }
7
8
 
8
9
  export const Shortcuts = {
9
10
  HOME_ROW: {
10
- keys: ['a', 'w', 's', 'e', 'd', 'f', 't', 'g', 'y', 'h', 'u', 'j', 'k', 'o', 'l', 'p', ';']
11
- }
11
+ keys: [
12
+ 'a',
13
+ 'w',
14
+ 's',
15
+ 'e',
16
+ 'd',
17
+ 'f',
18
+ 't',
19
+ 'g',
20
+ 'y',
21
+ 'h',
22
+ 'u',
23
+ 'j',
24
+ 'k',
25
+ 'o',
26
+ 'l',
27
+ 'p',
28
+ ';',
29
+ ],
30
+ },
12
31
  }
@@ -0,0 +1,55 @@
1
+ import clsx from 'clsx'
2
+ import { ComponentPropsWithoutRef, ReactNode } from 'react'
3
+
4
+ import { xor } from '@tremolo-ui/functions'
5
+ import { generateOptionsList, ScaleOptions } from '@tremolo-ui/functions/Slider'
6
+
7
+ import { useMax, useMin, useReverse, useStep, useVertical } from './context'
8
+ import { ScaleOption } from './ScaleOption'
9
+
10
+ export interface ScaleProps {
11
+ gap?: number | string
12
+ options?: ScaleOptions
13
+ children?: ReactNode
14
+ }
15
+
16
+ type Props = ScaleProps &
17
+ Omit<ComponentPropsWithoutRef<'div'>, keyof ScaleProps>
18
+
19
+ export function Scale({
20
+ gap = 6,
21
+ options,
22
+ children,
23
+ className,
24
+ style,
25
+ ...props
26
+ }: Props) {
27
+ const min = useMin()
28
+ const max = useMax()
29
+ const step = useStep()
30
+ const vertical = useVertical()
31
+ const reverse = useReverse()
32
+
33
+ const optionsList = options
34
+ ? generateOptionsList(options, min, max, step)
35
+ : []
36
+ if (xor(vertical, reverse)) optionsList.reverse()
37
+
38
+ return (
39
+ <div
40
+ className={clsx('tremolo-slider-scale', className)}
41
+ style={{
42
+ marginLeft: vertical ? gap : undefined,
43
+ marginTop: !vertical ? gap : undefined,
44
+ ...style,
45
+ }}
46
+ {...props}
47
+ >
48
+ {options
49
+ ? optionsList.map(({ value, type }, index) => {
50
+ return <ScaleOption key={index} value={value} type={type} />
51
+ })
52
+ : children}
53
+ </div>
54
+ )
55
+ }
@@ -0,0 +1,103 @@
1
+ import clsx from 'clsx'
2
+ import { ComponentPropsWithoutRef, CSSProperties, useCallback } from 'react'
3
+
4
+ import { toFixed, xor, normalizeValue } from '@tremolo-ui/functions'
5
+ import { ScaleType } from '@tremolo-ui/functions/Slider'
6
+
7
+ import { useMax, useMin, useReverse, useSkew, useVertical } from './context'
8
+
9
+ export interface ScaleOptionProps {
10
+ // required
11
+ value: number
12
+
13
+ // optional
14
+ type?: ScaleType
15
+ /** Display text instead of value. */
16
+ label?: string
17
+ /** mark thickness */
18
+ thickness?: number | string
19
+ /** mark length */
20
+ length?: number | string
21
+ /** Gap between mark and label. */
22
+ gap?: number | string
23
+ labelWidth?: number | string
24
+ classes?: {
25
+ mark?: string
26
+ label?: string
27
+ }
28
+ styles?: {
29
+ mark?: CSSProperties
30
+ label?: CSSProperties
31
+ }
32
+ }
33
+
34
+ export function ScaleOption({
35
+ value,
36
+ type = 'mark-number',
37
+ label,
38
+ thickness = 1,
39
+ length = '0.5rem',
40
+ gap = 2,
41
+ labelWidth,
42
+ classes,
43
+ styles,
44
+ className,
45
+ style,
46
+ ...props
47
+ }: ScaleOptionProps &
48
+ Omit<ComponentPropsWithoutRef<'div'>, keyof ScaleOptionProps>) {
49
+ const min = useMin()
50
+ const max = useMax()
51
+ const skew = useSkew()
52
+ const vertical = useVertical()
53
+ const reverse = useReverse()
54
+
55
+ const calcPercent = useCallback(
56
+ (rawValue: number) => {
57
+ return toFixed(
58
+ xor(vertical, reverse)
59
+ ? 100 - normalizeValue(rawValue, min, max, skew) * 100
60
+ : normalizeValue(rawValue, min, max, skew) * 100,
61
+ )
62
+ },
63
+ [vertical, reverse, max, min, skew],
64
+ )
65
+
66
+ return (
67
+ <div
68
+ className={clsx('tremolo-slider-scale-option', className)}
69
+ style={{
70
+ left: !vertical ? `${calcPercent(value)}%` : undefined,
71
+ top: vertical ? `${calcPercent(value)}%` : undefined,
72
+ ...style,
73
+ }}
74
+ data-vertical={vertical}
75
+ {...props}
76
+ >
77
+ {type != 'number' && (
78
+ <div
79
+ className={clsx('tremolo-slider-scale-option-mark', classes?.mark)}
80
+ style={{
81
+ width: !vertical ? thickness : length,
82
+ height: vertical ? thickness : length,
83
+ marginBottom: !vertical ? gap : undefined,
84
+ marginRight: vertical ? gap : undefined,
85
+ ...styles?.mark,
86
+ }}
87
+ data-vertical={vertical}
88
+ ></div>
89
+ )}
90
+ {type != 'mark' && (
91
+ <div
92
+ className={clsx('tremolo-slider-scale-option-label', classes?.label)}
93
+ style={{
94
+ width: labelWidth,
95
+ ...styles?.label,
96
+ }}
97
+ >
98
+ {label || value}
99
+ </div>
100
+ )}
101
+ </div>
102
+ )
103
+ }
@@ -1,25 +1,25 @@
1
- import { CSSObject, css } from '@emotion/react'
2
- import { forwardRef, ReactNode, useImperativeHandle, useRef } from 'react'
3
1
  import clsx from 'clsx'
2
+ import {
3
+ CSSProperties,
4
+ forwardRef,
5
+ ReactNode,
6
+ useImperativeHandle,
7
+ useRef,
8
+ } from 'react'
4
9
 
5
- interface SliderThumbProps {
10
+ import { useDisabled, useVertical } from './context'
11
+
12
+ export interface SliderThumbProps {
6
13
  size?: number | string
7
14
  width?: number | string
8
15
  height?: number | string
9
- color?: string
10
- hoverColor?: string
11
- disabledColor?: string
12
- disabledHoverColor?: string
13
- zIndex?: number
14
16
 
15
17
  className?: string
16
- style?: CSSObject
18
+ style?: CSSProperties
17
19
  children?: ReactNode
18
20
 
19
21
  /** @internal */
20
- __disabled?: boolean
21
- /** @internal */
22
- __css?: CSSObject
22
+ __percent?: number
23
23
  }
24
24
 
25
25
  export interface SliderThumbMethods {
@@ -27,69 +27,62 @@ export interface SliderThumbMethods {
27
27
  blur: () => void
28
28
  }
29
29
 
30
- export const SliderThumb = forwardRef<SliderThumbMethods, SliderThumbProps>(({
31
- size,
32
- width = 22,
33
- height = 22,
34
- color = '#4e76e6',
35
- hoverColor = color,
36
- disabledColor = '#5d6478',
37
- disabledHoverColor = disabledColor,
38
- zIndex = 100,
39
- children,
40
- className,
41
- style,
42
- __disabled,
43
- __css,
44
- }: SliderThumbProps, ref) => {
45
- const wrapperRef = useRef<HTMLDivElement>(null)
30
+ export const defaultThumbSize = 22
31
+
32
+ export const SliderThumb = forwardRef<SliderThumbMethods, SliderThumbProps>(
33
+ (
34
+ {
35
+ size,
36
+ width = defaultThumbSize,
37
+ height = defaultThumbSize,
38
+ children,
39
+ className,
40
+ style,
41
+ __percent,
42
+ }: SliderThumbProps,
43
+ ref,
44
+ ) => {
45
+ const wrapperRef = useRef<HTMLDivElement>(null)
46
+ const vertical = useVertical()
47
+ const disabled = useDisabled()
46
48
 
47
- useImperativeHandle(ref, () => {
48
- return {
49
- focus() {
50
- wrapperRef.current?.focus()
51
- },
52
- blur() {
53
- wrapperRef.current?.blur()
54
- },
55
- }
56
- }, [])
49
+ useImperativeHandle(ref, () => {
50
+ return {
51
+ focus() {
52
+ wrapperRef.current?.focus()
53
+ },
54
+ blur() {
55
+ wrapperRef.current?.blur()
56
+ },
57
+ }
58
+ }, [])
57
59
 
58
- return (
59
- <div
60
- className="tremolo-slider-thumb-wrapper"
61
- css={css({
62
- position: 'absolute',
63
- translate: '-50% -50%',
64
- zIndex: zIndex,
65
- ...__css,
66
- })}
67
- >
68
- {children ? (
69
- children
70
- ) : (
71
- // default slider thumb
72
- <div
73
- ref={wrapperRef}
74
- className={clsx('tremolo-slider-thumb', className)}
75
- // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex
76
- tabIndex={0}
77
- css={css({
78
- background: __disabled ? disabledColor : color,
79
- width: size ?? width,
80
- height: size ?? height,
81
- borderRadius: '50%',
82
- outline: 'none',
83
- '&:hover': {
84
- background: __disabled ? disabledHoverColor : hoverColor
85
- },
86
- '&:focus': !__disabled && {
87
- boxShadow: '0px 0px 0px 3px rgba(var(--tremolo-theme-color-rgb), 0.2)',
88
- },
89
- ...style,
90
- })}
91
- ></div>
92
- )}
93
- </div>
94
- )
95
- })
60
+ return (
61
+ <div
62
+ className="tremolo-slider-thumb-wrapper"
63
+ style={{
64
+ top: vertical ? `${__percent}%` : '50%',
65
+ left: !vertical ? `${__percent}%` : '50%',
66
+ }}
67
+ >
68
+ {children ? (
69
+ children
70
+ ) : (
71
+ // default slider thumb
72
+ <div
73
+ ref={wrapperRef}
74
+ className={clsx('tremolo-slider-thumb', className)}
75
+ // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex
76
+ tabIndex={0}
77
+ aria-disabled={disabled}
78
+ style={{
79
+ width: size ?? width,
80
+ height: size ?? height,
81
+ ...style,
82
+ }}
83
+ ></div>
84
+ )}
85
+ </div>
86
+ )
87
+ },
88
+ )