@tremolo-ui/react 0.0.7 → 0.0.8

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 +674 -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 +3 -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 +657 -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 +3 -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 +241 -0
  94. package/package.json +2 -5
  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 +25 -0
  101. package/src/components/NumberInput/index.tsx +8 -41
  102. package/src/components/Piano/BlackKey.tsx +104 -98
  103. package/src/components/Piano/KeyLabel.tsx +18 -40
  104. package/src/components/Piano/WhiteKey.tsx +92 -87
  105. package/src/components/Piano/index.css +63 -0
  106. package/src/components/Piano/index.tsx +76 -59
  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
@@ -0,0 +1,305 @@
1
+ import clsx from 'clsx'
2
+ import React, {
3
+ ComponentPropsWithoutRef,
4
+ CSSProperties,
5
+ useCallback,
6
+ useRef,
7
+ } from 'react'
8
+
9
+ import {
10
+ clamp,
11
+ normalizeValue,
12
+ radian,
13
+ rawValue,
14
+ stepValue,
15
+ InputEventOption,
16
+ } from '@tremolo-ui/functions'
17
+
18
+ import { useEventListener } from '../../hooks/useEventListener'
19
+ import { useRefCallbackEvent } from '../../hooks/useRefCallbackEvent'
20
+ import { addNoSelect, removeNoSelect } from '../_util'
21
+ import { AnimationCanvas, DrawFunction } from '../AnimationCanvas'
22
+
23
+ export type AnimationKnobProps = {
24
+ // required
25
+ value: number
26
+ min: number
27
+ max: number
28
+
29
+ // optional
30
+ step?: number
31
+ skew?: number // | SkewFunction
32
+ /**
33
+ * value set when double-clicking
34
+ * @see enableDoubleClickDefault
35
+ */
36
+ defaultValue?: number
37
+
38
+ /**
39
+ * Value to be used as the starting point of the line when drawing.
40
+ * @default min
41
+ */
42
+ startValue?: number
43
+
44
+ /** Priority over width or height */
45
+ size?: number | `${number}%`
46
+
47
+ width?: number | `${number}%`
48
+ height?: number | `${number}%`
49
+
50
+ /** active line color */
51
+ activeColor?: string
52
+ /** inactive line color */
53
+ inactiveColor?: string
54
+ /** background color */
55
+ bg?: string
56
+ /** thumb color */
57
+ thumb?: string
58
+ lineWeight?: number
59
+ thumbWeight?: number
60
+
61
+ draw?: DrawFunction
62
+
63
+ /** Whether to apply `{use-select: none}` when dragging */
64
+ bodyNoSelect?: boolean
65
+ /**
66
+ * wheel control option
67
+ */
68
+ wheel?: InputEventOption | null
69
+ /**
70
+ * keyboard control option
71
+ */
72
+ keyboard?: InputEventOption | null
73
+ enableDoubleClickDefault?: boolean
74
+ style?: CSSProperties
75
+ onChange?: (value: number) => void
76
+ }
77
+
78
+ /**
79
+ * simple rotary Knob.
80
+ */
81
+ export function AnimationKnob({
82
+ value,
83
+ min,
84
+ max,
85
+ defaultValue = min,
86
+ startValue = min,
87
+ step = 1,
88
+ skew = 1,
89
+ size,
90
+ width = 50,
91
+ height = 50,
92
+ activeColor = '#7998ec',
93
+ inactiveColor = '#eee',
94
+ bg = '#ccc',
95
+ thumb = '#4e76e6',
96
+ lineWeight = 6,
97
+ thumbWeight = 4,
98
+ draw,
99
+ bodyNoSelect = true,
100
+ wheel = ['raw', 1],
101
+ keyboard = ['raw', 1],
102
+ enableDoubleClickDefault = true,
103
+ style,
104
+ className,
105
+ onChange,
106
+ ...props
107
+ }: AnimationKnobProps &
108
+ Omit<ComponentPropsWithoutRef<'div'>, keyof AnimationKnobProps>) {
109
+ // -- state and ref ---
110
+ // const [privateValue, setPrivateValue] = useState(value);
111
+ const dragOffsetY = useRef<number | undefined>(undefined)
112
+
113
+ // --- interpret props ---
114
+ // const percent = normalizeValue(value, min, max, skew)
115
+
116
+ const isRelativeSize =
117
+ typeof (size ?? width) == 'string' || typeof height == 'string'
118
+
119
+ const handleEvent = (
120
+ event:
121
+ | MouseEvent
122
+ | React.MouseEvent<HTMLDivElement, MouseEvent>
123
+ | TouchEvent,
124
+ ) => {
125
+ const isTouch = event instanceof TouchEvent
126
+ if (isTouch && event.cancelable) event.preventDefault()
127
+ if (dragOffsetY.current) {
128
+ if (bodyNoSelect) addNoSelect()
129
+ const screenY = isTouch ? event.touches[0].screenY : event.screenY
130
+ const delta = dragOffsetY.current - screenY
131
+ if (Math.abs(delta) < 1) return
132
+ dragOffsetY.current = screenY
133
+ const n = normalizeValue(value, min, max, skew)
134
+ const v = rawValue(n + delta / 100, min, max, skew)
135
+ const v2 = clamp(stepValue(v, step), min, max)
136
+ if (onChange) onChange(v2)
137
+ }
138
+ }
139
+
140
+ const handleKeyDown = useCallback(
141
+ (event: React.KeyboardEvent<HTMLDivElement>) => {
142
+ if (!keyboard || !onChange) return
143
+ const key = event.key
144
+ if (['ArrowRight', 'ArrowLeft', 'ArrowUp', 'ArrowDown'].includes(key)) {
145
+ event.preventDefault()
146
+ const x =
147
+ key == 'ArrowRight' || key == 'ArrowUp' ? keyboard[1] : -keyboard[1]
148
+ let v
149
+ if (keyboard[0] == 'normalized') {
150
+ const n = normalizeValue(value, min, max, skew)
151
+ v = rawValue(n + x, min, max, skew)
152
+ } else {
153
+ v = value + x
154
+ }
155
+ onChange(clamp(stepValue(v, step), min, max))
156
+ }
157
+ },
158
+ [value, min, max, step, skew, keyboard, onChange],
159
+ )
160
+
161
+ // --- hooks ---
162
+ const wheelRefCallback = useRefCallbackEvent(
163
+ 'wheel',
164
+ (event) => {
165
+ if (!wheel) return
166
+ event.preventDefault()
167
+ const x = event.deltaY > 0 ? -wheel[1] : wheel[1]
168
+ let v
169
+ if (wheel[0] == 'normalized') {
170
+ const n = normalizeValue(value, min, max, skew)
171
+ v = rawValue(n + x, min, max, skew)
172
+ } else {
173
+ v = value + x
174
+ }
175
+ if (onChange) onChange(clamp(stepValue(v, step), min, max))
176
+ },
177
+ { passive: false },
178
+ [wheel, value, min, max, skew, step, onChange],
179
+ )
180
+
181
+ const touchMoveRefCallback = useRefCallbackEvent(
182
+ 'touchmove',
183
+ handleEvent,
184
+ { passive: false },
185
+ [value, min, max, skew, step, onChange, bodyNoSelect],
186
+ )
187
+
188
+ useEventListener(window, 'mousemove', handleEvent)
189
+
190
+ useEventListener(window, 'pointerup', () => {
191
+ dragOffsetY.current = undefined
192
+ if (bodyNoSelect) removeNoSelect()
193
+ })
194
+
195
+ return (
196
+ <div
197
+ className={clsx('tremolo-animation-knob', className)}
198
+ ref={(div) => {
199
+ wheelRefCallback(div)
200
+ touchMoveRefCallback(div)
201
+ }}
202
+ role="slider"
203
+ tabIndex={0}
204
+ aria-valuenow={value}
205
+ aria-valuemax={max}
206
+ aria-valuemin={min}
207
+ style={{
208
+ display: 'inline-block',
209
+ width: size ?? width,
210
+ height: size ?? height,
211
+ cursor: 'pointer',
212
+ WebkitTapHighlightColor: 'transparent',
213
+ ...style,
214
+ }}
215
+ onPointerDown={(event) => {
216
+ dragOffsetY.current = event.screenY
217
+ handleEvent(event)
218
+ }}
219
+ onDoubleClick={() => {
220
+ if (enableDoubleClickDefault && onChange) {
221
+ onChange(defaultValue)
222
+ }
223
+ }}
224
+ onKeyDown={handleKeyDown}
225
+ onContextMenu={(e) => e.preventDefault()}
226
+ {...props}
227
+ >
228
+ <AnimationCanvas
229
+ {...(isRelativeSize
230
+ ? { relativeSize: true }
231
+ : {
232
+ width: size ?? width,
233
+ height: size ?? height,
234
+ })}
235
+ draw={
236
+ draw
237
+ ? draw
238
+ : (ctx, width, height) => {
239
+ const p = normalizeValue(value, min, max, skew)
240
+ const startP = normalizeValue(startValue, min, max, skew)
241
+ const w = width.current,
242
+ cx = w / 2
243
+ const h = height.current,
244
+ cy = h / 2
245
+ const r = Math.min(cx, cy)
246
+ if (r <= 0) return
247
+
248
+ // reset
249
+ ctx.clearRect(0, 0, w, h)
250
+ ctx.lineCap = 'butt'
251
+
252
+ // bg
253
+ ctx.beginPath()
254
+ ctx.fillStyle = bg
255
+ ctx.arc(cx, cy, r - 0.5, 0, 2 * Math.PI)
256
+ ctx.fill()
257
+
258
+ ctx.lineWidth = lineWeight
259
+
260
+ // inactive rotary
261
+ ctx.beginPath()
262
+ ctx.strokeStyle = inactiveColor
263
+ ctx.arc(
264
+ cx,
265
+ cy,
266
+ r - 0.5 - lineWeight / 2,
267
+ radian(135),
268
+ radian(45),
269
+ )
270
+ ctx.stroke()
271
+
272
+ // active rotary
273
+ ctx.beginPath()
274
+ ctx.strokeStyle = activeColor
275
+ ctx.arc(
276
+ cx,
277
+ cy,
278
+ r - 0.5 - lineWeight / 2,
279
+ radian(135 + 270 * startP),
280
+ radian(135 + 270 * p),
281
+ p < startP,
282
+ )
283
+ ctx.stroke()
284
+
285
+ // thumb
286
+ ctx.lineCap = 'round'
287
+ ctx.beginPath()
288
+ ctx.moveTo(cx, cy)
289
+ ctx.lineTo(
290
+ cx +
291
+ Math.cos(radian(135 + 270 * p)) *
292
+ (r - 0.5 - thumbWeight / 2),
293
+ cy +
294
+ Math.sin(radian(135 + 270 * p)) *
295
+ (r - 0.5 - thumbWeight / 2),
296
+ )
297
+ ctx.strokeStyle = thumb
298
+ ctx.lineWidth = thumbWeight
299
+ ctx.stroke()
300
+ }
301
+ }
302
+ />
303
+ </div>
304
+ )
305
+ }
@@ -0,0 +1,94 @@
1
+ import { ComponentPropsWithoutRef, ElementType, ReactNode, useRef } from 'react'
2
+
3
+ import { useEventListener } from '../../hooks/useEventListener'
4
+ import { useRefCallbackEvent } from '../../hooks/useRefCallbackEvent'
5
+
6
+ export interface DragObserverProps<T extends ElementType> {
7
+ /**
8
+ * React.ElementType
9
+ * @default div
10
+ */
11
+ as?: T
12
+
13
+ /**
14
+ * Threshold at which the onDrag event fires.
15
+ * Prevents onDrag events from firing, for example, when double-clicking.
16
+ */
17
+ threshold?: number
18
+
19
+ children?: ReactNode
20
+ onDrag: (x: number, y: number) => void
21
+ onDragStart?: () => void
22
+ onDragEnd?: () => void
23
+ }
24
+
25
+ export function DragObserver<T extends ElementType = 'div'>(
26
+ props: DragObserverProps<T> &
27
+ Omit<ComponentPropsWithoutRef<T>, keyof DragObserverProps<T>>,
28
+ ) {
29
+ const {
30
+ children,
31
+ onDrag,
32
+ onDragStart,
33
+ onDragEnd,
34
+ as: Component = 'div',
35
+ ...attributes
36
+ } = props
37
+
38
+ const dragOffsetX = useRef<number | undefined>(undefined)
39
+ const dragOffsetY = useRef<number | undefined>(undefined)
40
+
41
+ const handleEvent = (
42
+ event:
43
+ | MouseEvent
44
+ | React.MouseEvent<HTMLDivElement, MouseEvent>
45
+ | TouchEvent,
46
+ ) => {
47
+ const isTouch = event instanceof TouchEvent
48
+ if (isTouch && event.cancelable) event.preventDefault()
49
+ const screenX = isTouch ? event.touches[0].screenX : event.screenX
50
+ const screenY = isTouch ? event.touches[0].screenY : event.screenY
51
+ let deltaX = 0,
52
+ deltaY = 0
53
+ if (dragOffsetX.current) {
54
+ deltaX = screenX - dragOffsetX.current
55
+ dragOffsetX.current = screenX
56
+ }
57
+ if (dragOffsetY.current) {
58
+ deltaY = screenY - dragOffsetY.current
59
+ dragOffsetY.current = screenY
60
+ }
61
+ if (Math.abs(deltaX) < 1 && Math.abs(deltaY) < 1) return
62
+ if (onDrag) onDrag(deltaX, deltaY)
63
+ }
64
+
65
+ const touchMoveRefCallback = useRefCallbackEvent(
66
+ 'touchmove',
67
+ handleEvent,
68
+ { passive: false },
69
+ [onDrag],
70
+ )
71
+
72
+ useEventListener(window, 'mousemove', handleEvent)
73
+
74
+ useEventListener(window, 'pointerup', () => {
75
+ dragOffsetX.current = undefined
76
+ dragOffsetY.current = undefined
77
+ onDragEnd?.()
78
+ })
79
+
80
+ return (
81
+ <Component
82
+ ref={touchMoveRefCallback}
83
+ onPointerDown={(event) => {
84
+ dragOffsetX.current = event.screenX
85
+ dragOffsetY.current = event.screenY
86
+ handleEvent(event)
87
+ onDragStart?.()
88
+ }}
89
+ {...attributes}
90
+ >
91
+ {children}
92
+ </Component>
93
+ )
94
+ }
@@ -0,0 +1,48 @@
1
+ .tremolo-knob {
2
+ display: inline-block;
3
+ cursor: pointer;
4
+ overflow: visible;
5
+ outline: 0;
6
+
7
+ &:focus,
8
+ &:hover {
9
+ > .tremolo-knob-active-line {
10
+ color: #4e76e6;
11
+ }
12
+
13
+ > .tremolo-knob-inactive-line {
14
+ color: #ddd;
15
+ }
16
+
17
+ > .tremolo-knob-thumb {
18
+ color: #ccc;
19
+ }
20
+ }
21
+
22
+ &[aria-readonly='true'] {
23
+ cursor: not-allowed;
24
+ }
25
+
26
+ &[aria-disabled='true'] {
27
+ > .tremolo-knob-active-line {
28
+ color: #5d6478;
29
+ }
30
+ }
31
+ }
32
+
33
+ .tremolo-knob-active-line {
34
+ overflow: visible;
35
+ color: #7998ec;
36
+ }
37
+
38
+ .tremolo-knob-inactive-line {
39
+ color: #eee;
40
+ }
41
+
42
+ .tremolo-knob-thumb {
43
+ color: #d0d0d0;
44
+ }
45
+
46
+ .tremolo-knob-thumb-line {
47
+ color: #eee;
48
+ }