@tremolo-ui/react 0.0.10 → 0.0.12

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 (137) hide show
  1. package/dist/cjs/index.js +435 -203
  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 +13 -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/BlackKey.d.ts.map +1 -1
  22. package/dist/cjs/types/components/Piano/WhiteKey.d.ts.map +1 -1
  23. package/dist/cjs/types/components/Piano/index.d.ts +7 -4
  24. package/dist/cjs/types/components/Piano/index.d.ts.map +1 -1
  25. package/dist/cjs/types/components/Piano/key.d.ts +4 -0
  26. package/dist/cjs/types/components/Piano/key.d.ts.map +1 -1
  27. package/dist/cjs/types/components/Piano/keyboardShortcuts.d.ts +2 -2
  28. package/dist/cjs/types/components/Slider/Scale.d.ts +1 -3
  29. package/dist/cjs/types/components/Slider/Scale.d.ts.map +1 -1
  30. package/dist/cjs/types/components/Slider/Thumb.d.ts +1 -0
  31. package/dist/cjs/types/components/Slider/Thumb.d.ts.map +1 -1
  32. package/dist/cjs/types/components/Slider/Track.d.ts +2 -4
  33. package/dist/cjs/types/components/Slider/Track.d.ts.map +1 -1
  34. package/dist/cjs/types/components/Slider/context.d.ts +2 -10
  35. package/dist/cjs/types/components/Slider/context.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/useAnimationFrame.d.ts.map +1 -1
  47. package/dist/cjs/types/hooks/useInterval.d.ts +2 -0
  48. package/dist/cjs/types/hooks/useInterval.d.ts.map +1 -0
  49. package/dist/cjs/types/hooks/useLongPress.d.ts +2 -0
  50. package/dist/cjs/types/hooks/useLongPress.d.ts.map +1 -0
  51. package/dist/cjs/types/index.d.ts +5 -0
  52. package/dist/cjs/types/index.d.ts.map +1 -1
  53. package/dist/esm/index.js +431 -204
  54. package/dist/esm/index.js.map +1 -1
  55. package/dist/esm/types/components/AnimationCanvas/index.d.ts +2 -2
  56. package/dist/esm/types/components/AnimationCanvas/index.d.ts.map +1 -1
  57. package/dist/esm/types/components/AnimationKnob/index.d.ts +10 -3
  58. package/dist/esm/types/components/AnimationKnob/index.d.ts.map +1 -1
  59. package/dist/esm/types/components/Knob/index.d.ts +13 -3
  60. package/dist/esm/types/components/Knob/index.d.ts.map +1 -1
  61. package/dist/esm/types/components/NumberInput/DecrementStepper.d.ts +2 -0
  62. package/dist/esm/types/components/NumberInput/DecrementStepper.d.ts.map +1 -1
  63. package/dist/esm/types/components/NumberInput/IncrementStepper.d.ts +2 -0
  64. package/dist/esm/types/components/NumberInput/IncrementStepper.d.ts.map +1 -1
  65. package/dist/esm/types/components/NumberInput/InternalInput.d.ts +18 -0
  66. package/dist/esm/types/components/NumberInput/InternalInput.d.ts.map +1 -0
  67. package/dist/esm/types/components/NumberInput/Stepper.d.ts +2 -0
  68. package/dist/esm/types/components/NumberInput/Stepper.d.ts.map +1 -1
  69. package/dist/esm/types/components/NumberInput/context.d.ts +3 -2
  70. package/dist/esm/types/components/NumberInput/context.d.ts.map +1 -1
  71. package/dist/esm/types/components/NumberInput/index.d.ts +12 -3
  72. package/dist/esm/types/components/NumberInput/index.d.ts.map +1 -1
  73. package/dist/esm/types/components/Piano/BlackKey.d.ts.map +1 -1
  74. package/dist/esm/types/components/Piano/WhiteKey.d.ts.map +1 -1
  75. package/dist/esm/types/components/Piano/index.d.ts +7 -4
  76. package/dist/esm/types/components/Piano/index.d.ts.map +1 -1
  77. package/dist/esm/types/components/Piano/key.d.ts +4 -0
  78. package/dist/esm/types/components/Piano/key.d.ts.map +1 -1
  79. package/dist/esm/types/components/Piano/keyboardShortcuts.d.ts +2 -2
  80. package/dist/esm/types/components/Slider/Scale.d.ts +1 -3
  81. package/dist/esm/types/components/Slider/Scale.d.ts.map +1 -1
  82. package/dist/esm/types/components/Slider/Thumb.d.ts +1 -0
  83. package/dist/esm/types/components/Slider/Thumb.d.ts.map +1 -1
  84. package/dist/esm/types/components/Slider/Track.d.ts +2 -4
  85. package/dist/esm/types/components/Slider/Track.d.ts.map +1 -1
  86. package/dist/esm/types/components/Slider/context.d.ts +2 -10
  87. package/dist/esm/types/components/Slider/context.d.ts.map +1 -1
  88. package/dist/esm/types/components/Slider/index.d.ts +5 -1
  89. package/dist/esm/types/components/Slider/index.d.ts.map +1 -1
  90. package/dist/esm/types/components/WheelObserver/index.d.ts +3 -3
  91. package/dist/esm/types/components/WheelObserver/index.d.ts.map +1 -1
  92. package/dist/esm/types/components/XYPad/Area.d.ts +3 -3
  93. package/dist/esm/types/components/XYPad/Area.d.ts.map +1 -1
  94. package/dist/esm/types/components/XYPad/Thumb.d.ts +1 -0
  95. package/dist/esm/types/components/XYPad/Thumb.d.ts.map +1 -1
  96. package/dist/esm/types/components/XYPad/index.d.ts +6 -1
  97. package/dist/esm/types/components/XYPad/index.d.ts.map +1 -1
  98. package/dist/esm/types/hooks/useAnimationFrame.d.ts.map +1 -1
  99. package/dist/esm/types/hooks/useInterval.d.ts +2 -0
  100. package/dist/esm/types/hooks/useInterval.d.ts.map +1 -0
  101. package/dist/esm/types/hooks/useLongPress.d.ts +2 -0
  102. package/dist/esm/types/hooks/useLongPress.d.ts.map +1 -0
  103. package/dist/esm/types/index.d.ts +5 -0
  104. package/dist/esm/types/index.d.ts.map +1 -1
  105. package/dist/styles/index.css +115 -33
  106. package/package.json +41 -40
  107. package/src/components/AnimationCanvas/index.tsx +15 -7
  108. package/src/components/AnimationKnob/index.tsx +216 -187
  109. package/src/components/Knob/index.tsx +230 -171
  110. package/src/components/NumberInput/DecrementStepper.tsx +9 -2
  111. package/src/components/NumberInput/IncrementStepper.tsx +9 -2
  112. package/src/components/NumberInput/InternalInput.tsx +219 -0
  113. package/src/components/NumberInput/Stepper.tsx +2 -0
  114. package/src/components/NumberInput/context.tsx +21 -9
  115. package/src/components/NumberInput/index.css +76 -22
  116. package/src/components/NumberInput/index.tsx +94 -162
  117. package/src/components/Piano/BlackKey.tsx +14 -0
  118. package/src/components/Piano/WhiteKey.tsx +14 -0
  119. package/src/components/Piano/index.css +22 -6
  120. package/src/components/Piano/index.tsx +20 -22
  121. package/src/components/Piano/key.ts +5 -0
  122. package/src/components/Piano/keyboardShortcuts.ts +2 -2
  123. package/src/components/Slider/Scale.tsx +1 -4
  124. package/src/components/Slider/Thumb.tsx +6 -0
  125. package/src/components/Slider/Track.tsx +5 -4
  126. package/src/components/Slider/context.tsx +5 -20
  127. package/src/components/Slider/index.css +5 -2
  128. package/src/components/Slider/index.tsx +52 -26
  129. package/src/components/WheelObserver/index.tsx +4 -2
  130. package/src/components/XYPad/Area.tsx +7 -6
  131. package/src/components/XYPad/Thumb.tsx +6 -0
  132. package/src/components/XYPad/index.css +12 -2
  133. package/src/components/XYPad/index.tsx +57 -41
  134. package/src/hooks/useInterval.ts +27 -0
  135. package/src/hooks/useLongPress.ts +31 -0
  136. package/src/index.ts +6 -0
  137. package/src/styles/index.css +0 -1
@@ -1,6 +1,5 @@
1
1
  :root {
2
2
  --tremolo-theme-color: #4e76e6;
3
- --tremolo-theme-color-rgb: 78, 118, 230;
4
3
  }
5
4
 
6
5
  .tremolo-no-select {
@@ -57,42 +56,80 @@
57
56
  }
58
57
 
59
58
  .tremolo-number-input-wrapper {
60
- --tremolo-number-input-border-radius: 4px;
61
- --tremolo-number-input-stepper-width: 20px;
59
+ --border-radius: 4px;
60
+ --stepper-width: 20px;
61
+ --active-color: var(--tremolo-theme-color);
62
62
 
63
63
  display: inline-flex;
64
64
  flex-direction: row;
65
65
  position: relative;
66
-
67
- border-style: solid;
68
- border-width: 1px;
69
- border-color: #bbb;
70
- border-radius: var(--tremolo-number-input-border-radius);
71
-
72
66
  width: 140px;
73
67
  height: min-content;
74
-
75
- &:hover {
76
- border-color: var(--tremolo-theme-color);
77
- }
68
+ border-style: solid;
69
+ border-color: #c1c1c1;
70
+ border-width: 0px;
71
+ outline: none;
72
+ transition: all 0.1s;
78
73
 
79
74
  &:not(:focus-within):has(> .tremolo-number-input[data-error='true']) {
80
75
  border-color: #f34343;
81
76
  }
82
77
 
83
- &:focus-within {
84
- border-color: var(--tremolo-theme-color);
85
- box-shadow: 0px 0px 0px 2px rgba(var(--tremolo-theme-color-rgb), 0.1);
78
+ &[data-variant='outline'] {
79
+ border-width: 1px;
80
+ border-radius: var(--border-radius);
81
+
82
+ &:hover {
83
+ border-color: #909090;
84
+ }
85
+
86
+ &:focus-within {
87
+ border-color: var(--active-color);
88
+ box-shadow: 0px 0px 0px 2px
89
+ color-mix(in srgb, var(--active-color) 10%, transparent);
90
+ }
91
+ }
92
+
93
+ &[data-variant='filled'] {
94
+ border-width: 1px;
95
+ border-radius: var(--border-radius);
96
+ border-color: transparent;
97
+ background-color: #edf2f7;
98
+
99
+ &:hover {
100
+ background-color: #e4e9ee;
101
+ }
102
+
103
+ &:focus-within {
104
+ background-color: inherit;
105
+ border-color: var(--active-color);
106
+ box-shadow: 0px 0px 0px 2px
107
+ color-mix(in srgb, var(--active-color) 10%, transparent);
108
+ }
109
+ }
110
+
111
+ &[data-variant='flushed'] {
112
+ border-bottom-width: 1px;
113
+
114
+ &:hover {
115
+ border-color: #909090;
116
+ }
117
+
118
+ &:focus-within {
119
+ border-color: var(--active-color);
120
+ box-shadow: 0px 2px 0px 0px
121
+ color-mix(in srgb, var(--active-color) 10%, transparent);
122
+ }
86
123
  }
87
124
 
88
125
  &[data-stepper='false'] {
89
- --tremolo-number-input-stepper-width: 0px;
126
+ --stepper-width: 0px;
90
127
  }
91
128
  }
92
129
 
93
130
  .tremolo-number-input {
94
131
  display: block;
95
- width: calc(100% - 20px - var(--tremolo-number-input-stepper-width));
132
+ width: calc(100% - 20px - var(--stepper-width));
96
133
  background-color: inherit;
97
134
  font: inherit;
98
135
  padding: 6px 10px;
@@ -100,7 +137,11 @@
100
137
  margin: 0;
101
138
  border: none;
102
139
  outline: none;
103
- appearance: textfield;
140
+ appearance: none;
141
+
142
+ &[aria-readonly='true'] {
143
+ cursor: not-allowed;
144
+ }
104
145
  }
105
146
 
106
147
  .tremolo-number-input-stepper {
@@ -110,7 +151,7 @@
110
151
  position: absolute;
111
152
  top: 0;
112
153
  right: 0;
113
- width: var(--tremolo-number-input-stepper-width);
154
+ width: var(--stepper-width);
114
155
  transition: all 0.1s linear;
115
156
 
116
157
  &[data-dynamic='true'] {
@@ -119,7 +160,11 @@
119
160
  }
120
161
  }
121
162
 
122
- .tremolo-number-input-wrapper:hover .tremolo-number-input-stepper {
163
+ :is(
164
+ .tremolo-number-input-wrapper:hover,
165
+ .tremolo-number-input-wrapper:focus-within
166
+ )
167
+ .tremolo-number-input-stepper {
123
168
  opacity: 1;
124
169
  transform: translateX(0);
125
170
  }
@@ -136,7 +181,7 @@
136
181
  max-height: 50%;
137
182
  user-select: none;
138
183
  cursor: pointer;
139
- border-top-right-radius: var(--tremolo-number-input-border-radius);
184
+ border-top-right-radius: var(--border-radius);
140
185
 
141
186
  &[aria-disabled='false']:active {
142
187
  background-color: #3443560e;
@@ -145,6 +190,10 @@
145
190
  &[aria-disabled='true'] {
146
191
  cursor: not-allowed;
147
192
  }
193
+
194
+ &[aria-readonly='true'] {
195
+ cursor: not-allowed;
196
+ }
148
197
  }
149
198
 
150
199
  .tremolo-number-input-decrement-stepper {
@@ -160,7 +209,7 @@
160
209
  max-height: 50%;
161
210
  user-select: none;
162
211
  cursor: pointer;
163
- border-bottom-right-radius: var(--tremolo-number-input-border-radius);
212
+ border-bottom-right-radius: var(--border-radius);
164
213
 
165
214
  &[aria-disabled='false']:active {
166
215
  background-color: #3443560e;
@@ -169,26 +218,38 @@
169
218
  &[aria-disabled='true'] {
170
219
  cursor: not-allowed;
171
220
  }
221
+
222
+ &[aria-readonly='true'] {
223
+ cursor: not-allowed;
224
+ }
172
225
  }
173
226
 
174
227
  .tremolo-piano {
175
228
  display: inline-block;
176
229
  box-sizing: border-box;
177
230
  user-select: none;
231
+ touch-action: none;
178
232
  position: relative;
179
233
  }
180
234
 
181
235
  .tremolo-piano-white-key {
236
+ --bg: white;
237
+ --color: black;
238
+ --active-bg: #ccc;
239
+ --active-color: black;
240
+
182
241
  position: absolute;
183
- background-color: white;
184
- color: black;
242
+ background-color: var(--bg);
243
+ -webkit-tap-highlight-color: transparent;
244
+ color: var(--color);
185
245
  border: 1px solid #555;
186
246
  border-radius: 0px 0px 8px 8px;
187
247
  cursor: pointer;
188
248
  z-index: 1;
189
249
 
190
250
  &[data-active='true'] {
191
- background-color: #ccc;
251
+ background-color: var(--active-bg);
252
+ color: var(--active-color);
192
253
  }
193
254
 
194
255
  &[aria-disabled='true'] {
@@ -197,16 +258,23 @@
197
258
  }
198
259
 
199
260
  .tremolo-piano-black-key {
261
+ --color: white;
262
+ --bg: #333;
263
+ --active-color: white;
264
+ --active-bg: #666;
265
+
200
266
  position: absolute;
201
- background-color: #333;
202
- color: white;
267
+ background-color: var(--bg);
268
+ -webkit-tap-highlight-color: transparent;
269
+ color: var(--color);
203
270
  border: 1px solid #555;
204
271
  border-radius: 0px 0px 8px 8px;
205
272
  cursor: pointer;
206
273
  z-index: 2;
207
274
 
208
275
  &[data-active='true'] {
209
- background-color: #666;
276
+ background-color: var(--active-bg);
277
+ color: var(--active-color);
210
278
  }
211
279
 
212
280
  &[aria-disabled='true'] {
@@ -222,6 +290,7 @@
222
290
  }
223
291
 
224
292
  .tremolo-piano-key-label {
293
+ box-sizing: content-box;
225
294
  display: flex;
226
295
  justify-content: center;
227
296
  align-items: center;
@@ -253,7 +322,9 @@
253
322
  }
254
323
 
255
324
  .tremolo-slider-thumb {
256
- background: #4e76e6;
325
+ --color: var(--tremolo-theme-color);
326
+
327
+ background: var(--color);
257
328
  border-radius: 50%;
258
329
  outline: none;
259
330
 
@@ -262,7 +333,8 @@
262
333
  }
263
334
 
264
335
  &[aria-readonly='false']:focus {
265
- box-shadow: 0px 0px 0px 3px rgba(var(--tremolo-theme-color-rgb), 0.2);
336
+ box-shadow: 0px 0px 0px 3px
337
+ color-mix(in srgb, var(--color) 20%, transparent);
266
338
  }
267
339
  }
268
340
 
@@ -325,6 +397,13 @@
325
397
  cursor: pointer;
326
398
  }
327
399
 
400
+ .tremolo-xy-pad-area {
401
+ --color: #eee;
402
+
403
+ position: relative;
404
+ background-color: var(--color);
405
+ }
406
+
328
407
  .tremolo-xy-pad-thumb-wrapper {
329
408
  position: absolute;
330
409
  translate: -50% -50%;
@@ -332,15 +411,18 @@
332
411
  }
333
412
 
334
413
  .tremolo-xy-pad-thumb {
414
+ --color: var(--tremolo-theme-color);
415
+
335
416
  border-radius: 50%;
336
417
  outline: none;
337
- background-color: #4e76e6;
418
+ background-color: var(--color);
338
419
 
339
420
  &[aria-disabled='true'] {
340
421
  background-color: #5d6478;
341
422
  }
342
423
 
343
424
  &:focus {
344
- box-shadow: 0px 0px 0px 3px rgba(var(--tremolo-theme-color-rgb), 0.2);
425
+ box-shadow: 0px 0px 0px 3px
426
+ color-mix(in srgb, var(--color) 20%, transparent);
345
427
  }
346
428
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tremolo-ui/react",
3
- "version": "0.0.10",
3
+ "version": "0.0.12",
4
4
  "description": "React component library for audio app",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -8,28 +8,43 @@
8
8
  "types": "dist/cjs/types/index.d.ts",
9
9
  "scripts": {
10
10
  "sb": "storybook dev -p 6006",
11
+ "typecheck": "tsc",
11
12
  "build:sb": "storybook build",
12
13
  "serve": "http-server ./storybook-static",
13
14
  "lint": "eslint --fix --ext .ts,.tsx .",
14
15
  "format": "prettier --write .",
15
16
  "test": "echo 'No test yet.'",
16
- "build:package": "rollup -c",
17
+ "build:package": "tsc && rollup -c",
17
18
  "clean": "npm run clean:build && npm run clean:sb",
18
19
  "clean:build": "rimraf ./dist .rollup.cache",
19
20
  "clean:sb": "rimraf ./storybook-static"
20
21
  },
21
- "exports": {
22
- ".": {
23
- "require": {
24
- "types": "./dist/cjs/types/index.d.ts",
25
- "default": "./dist/cjs/index.js"
26
- },
27
- "import": {
28
- "types": "./dist/esm/types/index.d.ts",
29
- "default": "./dist/esm/index.js"
30
- }
31
- },
32
- "./styles/index.css": "./dist/styles/index.css"
22
+ "devDependencies": {
23
+ "@storybook/addon-essentials": "^8.6.7",
24
+ "@storybook/addon-interactions": "^8.6.7",
25
+ "@storybook/addon-links": "^8.6.7",
26
+ "@storybook/blocks": "^8.6.7",
27
+ "@storybook/react": "^8.6.7",
28
+ "@storybook/react-vite": "^8.6.7",
29
+ "@storybook/test": "^8.6.7",
30
+ "@testing-library/react": "^16.0.1",
31
+ "@types/react": "^19.0.10",
32
+ "@types/react-dom": "^19.0.4",
33
+ "jest-environment-jsdom": "^29.7.0",
34
+ "jotai": "^2.12.1",
35
+ "react": "19.x",
36
+ "react-dom": "19.x",
37
+ "storybook": "^8.6.7",
38
+ "tone": "^15.0.4"
39
+ },
40
+ "peerDependencies": {
41
+ "react": "^18 ||^19",
42
+ "react-dom": "^18 || ^19"
43
+ },
44
+ "dependencies": {
45
+ "@tremolo-ui/functions": "0.0.12",
46
+ "clsx": "^2.1.1",
47
+ "zustand": "^5.0.3"
33
48
  },
34
49
  "files": [
35
50
  "dist",
@@ -56,31 +71,17 @@
56
71
  "components",
57
72
  "web-audio"
58
73
  ],
59
- "devDependencies": {
60
- "@storybook/addon-essentials": "^8.3.3",
61
- "@storybook/addon-interactions": "^8.3.3",
62
- "@storybook/addon-links": "^8.3.3",
63
- "@storybook/blocks": "^8.3.3",
64
- "@storybook/react": "^8.3.3",
65
- "@storybook/react-vite": "^8.3.3",
66
- "@storybook/test": "^8.3.3",
67
- "@testing-library/react": "^16.0.1",
68
- "jest-environment-jsdom": "^29.7.0",
69
- "jotai": "^2.12.1",
70
- "react": "^18.3.1",
71
- "react-component-benchmark": "^2.0.0",
72
- "react-dom": "^18.3.1",
73
- "storybook": "^8.3.3",
74
- "tone": "^15.0.4"
75
- },
76
- "peerDependencies": {
77
- "@tremolo-ui/functions": "0.0.10",
78
- "react": "18.x || 19.x",
79
- "react-dom": "18.x || 19.x"
80
- },
81
- "dependencies": {
82
- "@tremolo-ui/functions": "file:../functions",
83
- "clsx": "^2.1.1",
84
- "zustand": "^5.0.3"
74
+ "exports": {
75
+ ".": {
76
+ "require": {
77
+ "types": "./dist/cjs/types/index.d.ts",
78
+ "default": "./dist/cjs/index.js"
79
+ },
80
+ "import": {
81
+ "types": "./dist/esm/types/index.d.ts",
82
+ "default": "./dist/esm/index.js"
83
+ }
84
+ },
85
+ "./styles/index.css": "./dist/styles/index.css"
85
86
  }
86
87
  }
@@ -1,8 +1,8 @@
1
1
  import clsx from 'clsx'
2
2
  import {
3
3
  ComponentPropsWithoutRef,
4
- MutableRefObject,
5
4
  ReactElement,
5
+ RefObject,
6
6
  useCallback,
7
7
  useEffect,
8
8
  useRef,
@@ -29,8 +29,8 @@ export type DrawFunction = (
29
29
  // TODO: saving scale and translate
30
30
  // context: Omit<CanvasRenderingContext2D, 'save' | 'restore' | 'scale'>,
31
31
  context: CanvasRenderingContext2D,
32
- width: MutableRefObject<number>,
33
- height: MutableRefObject<number>,
32
+ width: RefObject<number>,
33
+ height: RefObject<number>,
34
34
  count: number,
35
35
  ) => void
36
36
 
@@ -84,6 +84,7 @@ export function AnimationCanvas({
84
84
  init,
85
85
  draw,
86
86
  className,
87
+ onContextMenu = (event) => event.preventDefault(),
87
88
  ...props
88
89
  }: AnimationCanvasProps &
89
90
  Omit<
@@ -92,15 +93,15 @@ export function AnimationCanvas({
92
93
  >): ReactElement {
93
94
  const canvasRef = useRef<HTMLCanvasElement>(null)
94
95
  const memoCanvasRef = useRef<HTMLCanvasElement>(null)
95
- const reqIdRef = useRef<number>()
96
+ const reqIdRef = useRef(-1)
96
97
  const widthRef = useRef(0)
97
98
  const heightRef = useRef(0)
98
99
 
99
100
  const loop = useCallback(
100
101
  (
101
102
  context: CanvasRenderingContext2D,
102
- width: MutableRefObject<number>,
103
- height: MutableRefObject<number>,
103
+ width: RefObject<number>,
104
+ height: RefObject<number>,
104
105
  count: number,
105
106
  ) => {
106
107
  reqIdRef.current = requestAnimationFrame(() =>
@@ -154,7 +155,13 @@ export function AnimationCanvas({
154
155
  ;(context[prop] as DrawingStateValue) = contextMemo[prop]
155
156
  }
156
157
 
157
- if (reduceFlickering && memoContext) {
158
+ if (
159
+ reduceFlickering &&
160
+ memoContext &&
161
+ memoCanvas &&
162
+ memoCanvas.width > 0 &&
163
+ memoCanvas.height > 0
164
+ ) {
158
165
  context.drawImage(memoContext.canvas, 0, 0)
159
166
  }
160
167
  }
@@ -194,6 +201,7 @@ export function AnimationCanvas({
194
201
  width={relativeSize ? 0 : width}
195
202
  height={relativeSize ? 0 : height}
196
203
  ref={canvasRef}
204
+ onContextMenu={onContextMenu}
197
205
  {...props}
198
206
  ></canvas>
199
207
  {relativeSize && reduceFlickering && (