@zentauri-ui/zentauri-components 2.1.5 → 2.1.7

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 (149) hide show
  1. package/README.md +12 -8
  2. package/cli/cli.integration.test.ts +36 -0
  3. package/cli/index.mjs +91 -12
  4. package/cli/index.test.ts +180 -0
  5. package/cli/props.json +609 -14
  6. package/cli/registry.json +22 -0
  7. package/cli/rewrite-imports.mjs +29 -4
  8. package/cli/rewrite-imports.test.ts +35 -0
  9. package/dist/{chunk-RENXBUZY.js → chunk-5ELR6MIN.js} +6 -6
  10. package/dist/{chunk-RENXBUZY.js.map → chunk-5ELR6MIN.js.map} +1 -1
  11. package/dist/chunk-5FU57ZVQ.js +19 -0
  12. package/dist/{chunk-D2GISTDL.js.map → chunk-5FU57ZVQ.js.map} +1 -1
  13. package/dist/chunk-74SKXGTM.js +4 -0
  14. package/dist/chunk-74SKXGTM.js.map +1 -0
  15. package/dist/{chunk-WBZKMSXW.mjs → chunk-7UXPXCKV.mjs} +3 -3
  16. package/dist/{chunk-WBZKMSXW.mjs.map → chunk-7UXPXCKV.mjs.map} +1 -1
  17. package/dist/chunk-COCPCZMR.mjs +77 -0
  18. package/dist/chunk-COCPCZMR.mjs.map +1 -0
  19. package/dist/chunk-CYKSS5S5.mjs +128 -0
  20. package/dist/chunk-CYKSS5S5.mjs.map +1 -0
  21. package/dist/chunk-DBNGLT5U.mjs +221 -0
  22. package/dist/chunk-DBNGLT5U.mjs.map +1 -0
  23. package/dist/{chunk-BL6UVCV7.mjs → chunk-FUCW5GPE.mjs} +36 -11
  24. package/dist/chunk-FUCW5GPE.mjs.map +1 -0
  25. package/dist/chunk-G7FVHZRB.js +225 -0
  26. package/dist/chunk-G7FVHZRB.js.map +1 -0
  27. package/dist/chunk-HMDH4BQJ.js +123 -0
  28. package/dist/chunk-HMDH4BQJ.js.map +1 -0
  29. package/dist/chunk-I7EBE7BD.js +98 -0
  30. package/dist/chunk-I7EBE7BD.js.map +1 -0
  31. package/dist/{chunk-PAG5CTLN.mjs → chunk-KVSRUAXP.mjs} +3 -3
  32. package/dist/{chunk-PAG5CTLN.mjs.map → chunk-KVSRUAXP.mjs.map} +1 -1
  33. package/dist/chunk-LHBJD57K.mjs +143 -0
  34. package/dist/chunk-LHBJD57K.mjs.map +1 -0
  35. package/dist/chunk-OYAJG2BO.js +83 -0
  36. package/dist/chunk-OYAJG2BO.js.map +1 -0
  37. package/dist/chunk-PG7LQVU6.js +86 -0
  38. package/dist/chunk-PG7LQVU6.js.map +1 -0
  39. package/dist/chunk-PTU5ZAYX.js +145 -0
  40. package/dist/chunk-PTU5ZAYX.js.map +1 -0
  41. package/dist/chunk-QKO5DA4N.mjs +81 -0
  42. package/dist/chunk-QKO5DA4N.mjs.map +1 -0
  43. package/dist/chunk-T7PIKDUZ.js +130 -0
  44. package/dist/chunk-T7PIKDUZ.js.map +1 -0
  45. package/dist/chunk-TDK5TVJE.mjs +3 -0
  46. package/dist/chunk-TDK5TVJE.mjs.map +1 -0
  47. package/dist/{chunk-NZSZE36T.js → chunk-TJ2EWPER.js} +42 -10
  48. package/dist/chunk-TJ2EWPER.js.map +1 -0
  49. package/dist/chunk-VBNW2B4D.mjs +3 -0
  50. package/dist/chunk-VBNW2B4D.mjs.map +1 -0
  51. package/dist/chunk-W6DO36XD.mjs +96 -0
  52. package/dist/chunk-W6DO36XD.mjs.map +1 -0
  53. package/dist/chunk-XR3J46TZ.js +4 -0
  54. package/dist/chunk-XR3J46TZ.js.map +1 -0
  55. package/dist/chunk-ZOHCADDL.mjs +121 -0
  56. package/dist/chunk-ZOHCADDL.mjs.map +1 -0
  57. package/dist/design-system/audio-player.d.ts +61 -0
  58. package/dist/design-system/audio-player.d.ts.map +1 -0
  59. package/dist/design-system/data-table.d.ts +8 -0
  60. package/dist/design-system/data-table.d.ts.map +1 -0
  61. package/dist/design-system/facade.js +11 -10
  62. package/dist/design-system/facade.js.map +1 -1
  63. package/dist/design-system/facade.mjs +10 -9
  64. package/dist/design-system/facade.mjs.map +1 -1
  65. package/dist/design-system/index.d.ts +2 -0
  66. package/dist/design-system/index.d.ts.map +1 -1
  67. package/dist/hooks/useTableFilter.js +6 -116
  68. package/dist/hooks/useTableFilter.js.map +1 -1
  69. package/dist/hooks/useTableFilter.mjs +1 -118
  70. package/dist/hooks/useTableFilter.mjs.map +1 -1
  71. package/dist/hooks/useTableSort.js +6 -91
  72. package/dist/hooks/useTableSort.js.map +1 -1
  73. package/dist/hooks/useTableSort.mjs +1 -93
  74. package/dist/hooks/useTableSort.mjs.map +1 -1
  75. package/dist/hooks/useVirtualList.js +6 -76
  76. package/dist/hooks/useVirtualList.js.map +1 -1
  77. package/dist/hooks/useVirtualList.mjs +1 -78
  78. package/dist/hooks/useVirtualList.mjs.map +1 -1
  79. package/dist/ui/audio-player/audio-player-base.d.ts +20 -0
  80. package/dist/ui/audio-player/audio-player-base.d.ts.map +1 -0
  81. package/dist/ui/audio-player/audio-player.d.ts +6 -0
  82. package/dist/ui/audio-player/audio-player.d.ts.map +1 -0
  83. package/dist/ui/audio-player/index.d.ts +5 -0
  84. package/dist/ui/audio-player/index.d.ts.map +1 -0
  85. package/dist/ui/audio-player/types.d.ts +44 -0
  86. package/dist/ui/audio-player/types.d.ts.map +1 -0
  87. package/dist/ui/audio-player/variants.d.ts +12 -0
  88. package/dist/ui/audio-player/variants.d.ts.map +1 -0
  89. package/dist/ui/audio-player.js +556 -0
  90. package/dist/ui/audio-player.js.map +1 -0
  91. package/dist/ui/audio-player.mjs +545 -0
  92. package/dist/ui/audio-player.mjs.map +1 -0
  93. package/dist/ui/buttons/animated.js +13 -12
  94. package/dist/ui/buttons/animated.js.map +1 -1
  95. package/dist/ui/buttons/animated.mjs +11 -10
  96. package/dist/ui/buttons/animated.mjs.map +1 -1
  97. package/dist/ui/buttons.js +15 -13
  98. package/dist/ui/buttons.mjs +13 -11
  99. package/dist/ui/checkbox.js +7 -123
  100. package/dist/ui/checkbox.js.map +1 -1
  101. package/dist/ui/checkbox.mjs +2 -126
  102. package/dist/ui/checkbox.mjs.map +1 -1
  103. package/dist/ui/data-table/data-table-base.d.ts +6 -0
  104. package/dist/ui/data-table/data-table-base.d.ts.map +1 -0
  105. package/dist/ui/data-table/data-table.d.ts +6 -0
  106. package/dist/ui/data-table/data-table.d.ts.map +1 -0
  107. package/dist/ui/data-table/index.d.ts +4 -0
  108. package/dist/ui/data-table/index.d.ts.map +1 -0
  109. package/dist/ui/data-table/types.d.ts +92 -0
  110. package/dist/ui/data-table/types.d.ts.map +1 -0
  111. package/dist/ui/data-table/variants.d.ts +8 -0
  112. package/dist/ui/data-table/variants.d.ts.map +1 -0
  113. package/dist/ui/data-table.js +620 -0
  114. package/dist/ui/data-table.js.map +1 -0
  115. package/dist/ui/data-table.mjs +611 -0
  116. package/dist/ui/data-table.mjs.map +1 -0
  117. package/dist/ui/dynamic-stepper.js +23 -22
  118. package/dist/ui/dynamic-stepper.js.map +1 -1
  119. package/dist/ui/dynamic-stepper.mjs +12 -11
  120. package/dist/ui/dynamic-stepper.mjs.map +1 -1
  121. package/dist/ui/inputs.js +7 -138
  122. package/dist/ui/inputs.js.map +1 -1
  123. package/dist/ui/inputs.mjs +2 -141
  124. package/dist/ui/inputs.mjs.map +1 -1
  125. package/dist/ui/pagination.js +25 -225
  126. package/dist/ui/pagination.js.map +1 -1
  127. package/dist/ui/pagination.mjs +13 -227
  128. package/dist/ui/pagination.mjs.map +1 -1
  129. package/dist/ui/table.js +1 -0
  130. package/dist/ui/table.mjs +1 -0
  131. package/package.json +1 -1
  132. package/src/design-system/audio-player.ts +109 -0
  133. package/src/design-system/data-table.ts +20 -0
  134. package/src/design-system/index.ts +2 -0
  135. package/src/ui/audio-player/audio-player-base.tsx +557 -0
  136. package/src/ui/audio-player/audio-player.test.tsx +485 -0
  137. package/src/ui/audio-player/audio-player.tsx +8 -0
  138. package/src/ui/audio-player/index.ts +24 -0
  139. package/src/ui/audio-player/types.ts +57 -0
  140. package/src/ui/audio-player/variants.ts +43 -0
  141. package/src/ui/data-table/data-table-base.tsx +701 -0
  142. package/src/ui/data-table/data-table.test.tsx +389 -0
  143. package/src/ui/data-table/data-table.tsx +11 -0
  144. package/src/ui/data-table/index.ts +24 -0
  145. package/src/ui/data-table/types.ts +121 -0
  146. package/src/ui/data-table/variants.ts +21 -0
  147. package/dist/chunk-BL6UVCV7.mjs.map +0 -1
  148. package/dist/chunk-D2GISTDL.js +0 -19
  149. package/dist/chunk-NZSZE36T.js.map +0 -1
@@ -0,0 +1,556 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunkPG7LQVU6_js = require('../chunk-PG7LQVU6.js');
5
+ var chunkZS5756ZC_js = require('../chunk-ZS5756ZC.js');
6
+ require('../chunk-PZ5AY32C.js');
7
+ var react = require('react');
8
+ var classVarianceAuthority = require('class-variance-authority');
9
+ var jsxRuntime = require('react/jsx-runtime');
10
+
11
+ var audioPlayerVariants = classVarianceAuthority.cva(
12
+ [...chunkPG7LQVU6_js.zuiAudioPlayerBase, "flex flex-col"],
13
+ {
14
+ variants: {
15
+ appearance: chunkPG7LQVU6_js.zuiAudioPlayerAppearances,
16
+ size: chunkPG7LQVU6_js.zuiAudioPlayerSizes,
17
+ shape: chunkPG7LQVU6_js.zuiAudioPlayerShapes
18
+ },
19
+ defaultVariants: {
20
+ appearance: "default",
21
+ size: "md",
22
+ shape: "rounded"
23
+ }
24
+ }
25
+ );
26
+ var audioPlayerTrackVariants = classVarianceAuthority.cva([...chunkPG7LQVU6_js.zuiAudioPlayerTrackBase], {
27
+ variants: {
28
+ size: chunkPG7LQVU6_js.zuiAudioPlayerTrackSizes,
29
+ shape: chunkPG7LQVU6_js.zuiAudioPlayerShapes
30
+ },
31
+ defaultVariants: {
32
+ size: "md",
33
+ shape: "rounded"
34
+ }
35
+ });
36
+ var audioPlayerBarVariants = classVarianceAuthority.cva(chunkPG7LQVU6_js.zuiAudioPlayerBarBase);
37
+ var audioPlayerTimeVariants = classVarianceAuthority.cva(chunkPG7LQVU6_js.zuiAudioPlayerTimeBase);
38
+ var AudioPlayerContext = react.createContext(null);
39
+ function useAudioPlayer() {
40
+ const ctx = react.useContext(AudioPlayerContext);
41
+ if (!ctx) {
42
+ throw new Error("useAudioPlayer must be used within <AudioPlayer>");
43
+ }
44
+ return ctx;
45
+ }
46
+ function formatTime(seconds) {
47
+ if (!isFinite(seconds) || isNaN(seconds)) return "0:00";
48
+ const m = Math.floor(seconds / 60);
49
+ const s = Math.floor(seconds % 60);
50
+ return `${m}:${s.toString().padStart(2, "0")}`;
51
+ }
52
+ function AudioPlayerBase(props) {
53
+ const {
54
+ className,
55
+ appearance = "default",
56
+ size = "md",
57
+ shape = "rounded",
58
+ src,
59
+ children,
60
+ autoPlay = false,
61
+ loop = false,
62
+ onEnded,
63
+ onPlay,
64
+ onPause,
65
+ onTimeUpdate,
66
+ ref,
67
+ ...rest
68
+ } = props;
69
+ const audioRef = react.useRef(null);
70
+ const [isPlaying, setIsPlaying] = react.useState(false);
71
+ const [currentTime, setCurrentTime] = react.useState(0);
72
+ const [duration, setDuration] = react.useState(0);
73
+ const [volume, setVolumeState] = react.useState(1);
74
+ const [muted, setMuted] = react.useState(false);
75
+ const progress = duration > 0 ? currentTime / duration * 100 : 0;
76
+ const callbacksRef = react.useRef({ onEnded, onPlay, onPause, onTimeUpdate });
77
+ react.useEffect(() => {
78
+ callbacksRef.current = { onEnded, onPlay, onPause, onTimeUpdate };
79
+ });
80
+ react.useEffect(() => {
81
+ setIsPlaying(false);
82
+ setCurrentTime(0);
83
+ setDuration(0);
84
+ }, [src]);
85
+ react.useEffect(() => {
86
+ const audio = audioRef.current;
87
+ if (!audio) return;
88
+ const handleTimeUpdate = () => {
89
+ setCurrentTime(audio.currentTime);
90
+ callbacksRef.current.onTimeUpdate?.(audio.currentTime, audio.duration);
91
+ };
92
+ const handleDurationChange = () => {
93
+ if (isFinite(audio.duration)) setDuration(audio.duration);
94
+ };
95
+ const handlePlay = () => {
96
+ setIsPlaying(true);
97
+ callbacksRef.current.onPlay?.();
98
+ };
99
+ const handlePause = () => {
100
+ setIsPlaying(false);
101
+ callbacksRef.current.onPause?.();
102
+ };
103
+ const handleEnded = () => {
104
+ setIsPlaying(false);
105
+ callbacksRef.current.onEnded?.();
106
+ };
107
+ const handleVolumeChange = () => {
108
+ setVolumeState(audio.volume);
109
+ setMuted(audio.muted);
110
+ };
111
+ audio.addEventListener("timeupdate", handleTimeUpdate);
112
+ audio.addEventListener("durationchange", handleDurationChange);
113
+ audio.addEventListener("loadedmetadata", handleDurationChange);
114
+ audio.addEventListener("play", handlePlay);
115
+ audio.addEventListener("pause", handlePause);
116
+ audio.addEventListener("ended", handleEnded);
117
+ audio.addEventListener("volumechange", handleVolumeChange);
118
+ return () => {
119
+ audio.removeEventListener("timeupdate", handleTimeUpdate);
120
+ audio.removeEventListener("durationchange", handleDurationChange);
121
+ audio.removeEventListener("loadedmetadata", handleDurationChange);
122
+ audio.removeEventListener("play", handlePlay);
123
+ audio.removeEventListener("pause", handlePause);
124
+ audio.removeEventListener("ended", handleEnded);
125
+ audio.removeEventListener("volumechange", handleVolumeChange);
126
+ };
127
+ }, []);
128
+ const play = react.useCallback(() => {
129
+ audioRef.current?.play().catch(() => {
130
+ });
131
+ }, []);
132
+ const pause = react.useCallback(() => {
133
+ audioRef.current?.pause();
134
+ }, []);
135
+ const toggle = react.useCallback(() => {
136
+ const audio = audioRef.current;
137
+ if (!audio) return;
138
+ if (audio.paused) {
139
+ audio.play().catch(() => {
140
+ });
141
+ } else {
142
+ audio.pause();
143
+ }
144
+ }, []);
145
+ const reset = react.useCallback(() => {
146
+ const audio = audioRef.current;
147
+ if (!audio) return;
148
+ audio.pause();
149
+ audio.currentTime = 0;
150
+ setIsPlaying(false);
151
+ setCurrentTime(0);
152
+ }, []);
153
+ const seek = react.useCallback((seconds) => {
154
+ const audio = audioRef.current;
155
+ if (!audio || !isFinite(audio.duration) || audio.duration <= 0) return;
156
+ const nextTime = Math.max(0, Math.min(seconds, audio.duration));
157
+ audio.currentTime = nextTime;
158
+ setDuration(audio.duration);
159
+ setCurrentTime(nextTime);
160
+ }, []);
161
+ const seekByPercent = react.useCallback((percent) => {
162
+ const audio = audioRef.current;
163
+ if (!audio || !isFinite(percent) || !isFinite(audio.duration) || audio.duration <= 0) {
164
+ return;
165
+ }
166
+ const clamped = Math.max(0, Math.min(percent, 100));
167
+ const nextTime = clamped / 100 * audio.duration;
168
+ audio.currentTime = nextTime;
169
+ setDuration(audio.duration);
170
+ setCurrentTime(nextTime);
171
+ }, []);
172
+ const setVolume = react.useCallback((vol) => {
173
+ const audio = audioRef.current;
174
+ if (!audio || !isFinite(vol)) return;
175
+ const nextVolume = Math.max(0, Math.min(vol, 1));
176
+ audio.volume = nextVolume;
177
+ setVolumeState(nextVolume);
178
+ }, []);
179
+ const toggleMute = react.useCallback(() => {
180
+ const audio = audioRef.current;
181
+ if (!audio) return;
182
+ const nextMuted = !audio.muted;
183
+ audio.muted = nextMuted;
184
+ setMuted(nextMuted);
185
+ }, []);
186
+ const ctx = react.useMemo(
187
+ () => ({
188
+ isPlaying,
189
+ currentTime,
190
+ duration,
191
+ progress,
192
+ volume,
193
+ muted,
194
+ play,
195
+ pause,
196
+ toggle,
197
+ reset,
198
+ seek,
199
+ seekByPercent,
200
+ setVolume,
201
+ toggleMute,
202
+ size: size ?? "md",
203
+ shape: shape ?? "rounded",
204
+ appearance: appearance ?? "default"
205
+ }),
206
+ [
207
+ isPlaying,
208
+ currentTime,
209
+ duration,
210
+ progress,
211
+ volume,
212
+ muted,
213
+ play,
214
+ pause,
215
+ toggle,
216
+ reset,
217
+ seek,
218
+ seekByPercent,
219
+ setVolume,
220
+ toggleMute,
221
+ size,
222
+ shape,
223
+ appearance
224
+ ]
225
+ );
226
+ return /* @__PURE__ */ jsxRuntime.jsx(AudioPlayerContext.Provider, { value: ctx, children: /* @__PURE__ */ jsxRuntime.jsxs(
227
+ "div",
228
+ {
229
+ ref,
230
+ "data-slot": "audio-player",
231
+ className: chunkZS5756ZC_js.cn(
232
+ audioPlayerVariants({ appearance, size, shape }),
233
+ className
234
+ ),
235
+ ...rest,
236
+ children: [
237
+ /* @__PURE__ */ jsxRuntime.jsx(
238
+ "audio",
239
+ {
240
+ ref: audioRef,
241
+ src,
242
+ autoPlay,
243
+ loop,
244
+ preload: "metadata",
245
+ className: "hidden",
246
+ "aria-hidden": "true"
247
+ }
248
+ ),
249
+ children
250
+ ]
251
+ }
252
+ ) });
253
+ }
254
+ AudioPlayerBase.displayName = "AudioPlayer";
255
+ function AudioPlayerProgress({
256
+ className,
257
+ ref,
258
+ ...rest
259
+ }) {
260
+ const { progress, seekByPercent, size, shape } = useAudioPlayer();
261
+ const trackRef = react.useRef(null);
262
+ const draggingRef = react.useRef(false);
263
+ const getPercentFromEvent = react.useCallback((clientX) => {
264
+ const el = trackRef.current;
265
+ if (!el) return 0;
266
+ const { left, width } = el.getBoundingClientRect();
267
+ return Math.max(0, Math.min((clientX - left) / width * 100, 100));
268
+ }, []);
269
+ const handleClick = react.useCallback(
270
+ (e) => {
271
+ if (draggingRef.current) return;
272
+ seekByPercent(getPercentFromEvent(e.clientX));
273
+ },
274
+ [getPercentFromEvent, seekByPercent]
275
+ );
276
+ const handlePointerDown = react.useCallback(
277
+ (e) => {
278
+ draggingRef.current = true;
279
+ e.currentTarget.setPointerCapture?.(e.pointerId);
280
+ seekByPercent(getPercentFromEvent(e.clientX));
281
+ },
282
+ [getPercentFromEvent, seekByPercent]
283
+ );
284
+ const handlePointerMove = react.useCallback(
285
+ (e) => {
286
+ if (!draggingRef.current) return;
287
+ seekByPercent(getPercentFromEvent(e.clientX));
288
+ },
289
+ [getPercentFromEvent, seekByPercent]
290
+ );
291
+ const handlePointerUp = react.useCallback(() => {
292
+ draggingRef.current = false;
293
+ }, []);
294
+ const handleKeyDown = react.useCallback(
295
+ (e) => {
296
+ if (e.key === "ArrowRight" || e.key === "ArrowUp") {
297
+ e.preventDefault();
298
+ seekByPercent(Math.min(progress + 1, 100));
299
+ } else if (e.key === "ArrowLeft" || e.key === "ArrowDown") {
300
+ e.preventDefault();
301
+ seekByPercent(Math.max(progress - 1, 0));
302
+ } else if (e.key === "Home") {
303
+ e.preventDefault();
304
+ seekByPercent(0);
305
+ } else if (e.key === "End") {
306
+ e.preventDefault();
307
+ seekByPercent(100);
308
+ }
309
+ },
310
+ [progress, seekByPercent]
311
+ );
312
+ return /* @__PURE__ */ jsxRuntime.jsx(
313
+ "div",
314
+ {
315
+ ref: (node) => {
316
+ trackRef.current = node;
317
+ if (typeof ref === "function") ref(node);
318
+ else if (ref)
319
+ ref.current = node;
320
+ },
321
+ "data-slot": "audio-player-progress",
322
+ role: "slider",
323
+ "aria-label": "Audio progress",
324
+ "aria-valuenow": Math.round(progress),
325
+ "aria-valuemin": 0,
326
+ "aria-valuemax": 100,
327
+ tabIndex: 0,
328
+ className: chunkZS5756ZC_js.cn(
329
+ audioPlayerTrackVariants({ size, shape }),
330
+ "group",
331
+ className
332
+ ),
333
+ onClick: handleClick,
334
+ onPointerDown: handlePointerDown,
335
+ onPointerMove: handlePointerMove,
336
+ onPointerUp: handlePointerUp,
337
+ onPointerCancel: handlePointerUp,
338
+ onKeyDown: handleKeyDown,
339
+ ...rest,
340
+ children: /* @__PURE__ */ jsxRuntime.jsx(
341
+ "div",
342
+ {
343
+ "data-slot": "audio-player-bar",
344
+ className: chunkZS5756ZC_js.cn(
345
+ audioPlayerBarVariants(),
346
+ "rounded-[inherit] group-hover:opacity-90 transition-opacity"
347
+ ),
348
+ style: { transform: `scaleX(${progress / 100})` }
349
+ }
350
+ )
351
+ }
352
+ );
353
+ }
354
+ AudioPlayerProgress.displayName = "AudioPlayerProgress";
355
+ function AudioPlayerTime({
356
+ className,
357
+ format = formatTime
358
+ }) {
359
+ const { currentTime, duration } = useAudioPlayer();
360
+ return /* @__PURE__ */ jsxRuntime.jsxs(
361
+ "div",
362
+ {
363
+ "data-slot": "audio-player-time",
364
+ className: chunkZS5756ZC_js.cn(
365
+ audioPlayerTimeVariants(),
366
+ "flex items-center gap-1",
367
+ className
368
+ ),
369
+ children: [
370
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-label": "Current time", children: format(currentTime) }),
371
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", children: "/" }),
372
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-label": "Total duration", children: format(duration) })
373
+ ]
374
+ }
375
+ );
376
+ }
377
+ AudioPlayerTime.displayName = "AudioPlayerTime";
378
+ function AudioPlayerVolume({
379
+ className,
380
+ ref,
381
+ ...rest
382
+ }) {
383
+ const { volume, muted, setVolume, toggleMute } = useAudioPlayer();
384
+ const trackRef = react.useRef(null);
385
+ const draggingRef = react.useRef(false);
386
+ const getVolumeFromEvent = react.useCallback((clientX) => {
387
+ const el = trackRef.current;
388
+ if (!el) return 0;
389
+ const { left, width } = el.getBoundingClientRect();
390
+ return Math.max(0, Math.min((clientX - left) / width, 1));
391
+ }, []);
392
+ const handlePointerDown = react.useCallback(
393
+ (e) => {
394
+ draggingRef.current = true;
395
+ e.currentTarget.setPointerCapture?.(e.pointerId);
396
+ setVolume(getVolumeFromEvent(e.clientX));
397
+ },
398
+ [getVolumeFromEvent, setVolume]
399
+ );
400
+ const handlePointerMove = react.useCallback(
401
+ (e) => {
402
+ if (!draggingRef.current) return;
403
+ setVolume(getVolumeFromEvent(e.clientX));
404
+ },
405
+ [getVolumeFromEvent, setVolume]
406
+ );
407
+ const handlePointerUp = react.useCallback(() => {
408
+ draggingRef.current = false;
409
+ }, []);
410
+ const handleClick = react.useCallback(
411
+ (e) => {
412
+ if (draggingRef.current) return;
413
+ setVolume(getVolumeFromEvent(e.clientX));
414
+ },
415
+ [getVolumeFromEvent, setVolume]
416
+ );
417
+ const displayVolume = muted ? 0 : volume;
418
+ const handleKeyDown = react.useCallback(
419
+ (e) => {
420
+ if (e.key === "ArrowRight" || e.key === "ArrowUp") {
421
+ e.preventDefault();
422
+ setVolume(Math.min(volume + 0.05, 1));
423
+ } else if (e.key === "ArrowLeft" || e.key === "ArrowDown") {
424
+ e.preventDefault();
425
+ setVolume(Math.max(volume - 0.05, 0));
426
+ } else if (e.key === "Home") {
427
+ e.preventDefault();
428
+ setVolume(0);
429
+ } else if (e.key === "End") {
430
+ e.preventDefault();
431
+ setVolume(1);
432
+ }
433
+ },
434
+ [volume, setVolume]
435
+ );
436
+ return /* @__PURE__ */ jsxRuntime.jsxs(
437
+ "div",
438
+ {
439
+ "data-slot": "audio-player-volume",
440
+ className: chunkZS5756ZC_js.cn("flex items-center gap-2", className),
441
+ ...rest,
442
+ children: [
443
+ /* @__PURE__ */ jsxRuntime.jsx(
444
+ "button",
445
+ {
446
+ type: "button",
447
+ "aria-label": muted ? "Unmute" : "Mute",
448
+ onClick: toggleMute,
449
+ className: "shrink-0 rounded focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--audio-fill,#0f172a)]",
450
+ children: displayVolume === 0 ? /* @__PURE__ */ jsxRuntime.jsxs(
451
+ "svg",
452
+ {
453
+ className: "h-4 w-4",
454
+ viewBox: "0 0 24 24",
455
+ fill: "none",
456
+ stroke: "currentColor",
457
+ strokeWidth: 2,
458
+ strokeLinecap: "round",
459
+ strokeLinejoin: "round",
460
+ "aria-hidden": "true",
461
+ children: [
462
+ /* @__PURE__ */ jsxRuntime.jsx("polygon", { points: "11 5 6 9 2 9 2 15 6 15 11 19 11 5" }),
463
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "23", y1: "9", x2: "17", y2: "15" }),
464
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "17", y1: "9", x2: "23", y2: "15" })
465
+ ]
466
+ }
467
+ ) : displayVolume < 0.5 ? /* @__PURE__ */ jsxRuntime.jsxs(
468
+ "svg",
469
+ {
470
+ className: "h-4 w-4",
471
+ viewBox: "0 0 24 24",
472
+ fill: "none",
473
+ stroke: "currentColor",
474
+ strokeWidth: 2,
475
+ strokeLinecap: "round",
476
+ strokeLinejoin: "round",
477
+ "aria-hidden": "true",
478
+ children: [
479
+ /* @__PURE__ */ jsxRuntime.jsx("polygon", { points: "11 5 6 9 2 9 2 15 6 15 11 19 11 5" }),
480
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M15.54 8.46a5 5 0 0 1 0 7.07" })
481
+ ]
482
+ }
483
+ ) : /* @__PURE__ */ jsxRuntime.jsxs(
484
+ "svg",
485
+ {
486
+ className: "h-4 w-4",
487
+ viewBox: "0 0 24 24",
488
+ fill: "none",
489
+ stroke: "currentColor",
490
+ strokeWidth: 2,
491
+ strokeLinecap: "round",
492
+ strokeLinejoin: "round",
493
+ "aria-hidden": "true",
494
+ children: [
495
+ /* @__PURE__ */ jsxRuntime.jsx("polygon", { points: "11 5 6 9 2 9 2 15 6 15 11 19 11 5" }),
496
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19.07 4.93a10 10 0 0 1 0 14.14" }),
497
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M15.54 8.46a5 5 0 0 1 0 7.07" })
498
+ ]
499
+ }
500
+ )
501
+ }
502
+ ),
503
+ /* @__PURE__ */ jsxRuntime.jsx(
504
+ "div",
505
+ {
506
+ ref: (node) => {
507
+ trackRef.current = node;
508
+ if (typeof ref === "function") ref(node);
509
+ else if (ref)
510
+ ref.current = node;
511
+ },
512
+ role: "slider",
513
+ "aria-label": "Volume",
514
+ "aria-valuenow": Math.round(displayVolume * 100),
515
+ "aria-valuemin": 0,
516
+ "aria-valuemax": 100,
517
+ tabIndex: 0,
518
+ className: "relative h-1.5 w-20 cursor-pointer overflow-hidden rounded-full bg-[var(--zui-audio-player-track-bg,var(--zui-surface-muted,#0000001a))] dark:bg-[var(--zui-audio-player-track-bg-dark,var(--zui-surface-muted-dark,#ffffff1a))] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--audio-fill,#0f172a)]",
519
+ onClick: handleClick,
520
+ onPointerDown: handlePointerDown,
521
+ onPointerMove: handlePointerMove,
522
+ onPointerUp: handlePointerUp,
523
+ onPointerCancel: handlePointerUp,
524
+ onKeyDown: handleKeyDown,
525
+ children: /* @__PURE__ */ jsxRuntime.jsx(
526
+ "div",
527
+ {
528
+ "data-slot": "audio-player-volume-bar",
529
+ className: "h-full origin-left [background:var(--audio-fill)] rounded-[inherit]",
530
+ style: { transform: `scaleX(${displayVolume})` }
531
+ }
532
+ )
533
+ }
534
+ )
535
+ ]
536
+ }
537
+ );
538
+ }
539
+ AudioPlayerVolume.displayName = "AudioPlayerVolume";
540
+ var AudioPlayer = (props) => {
541
+ return /* @__PURE__ */ jsxRuntime.jsx(AudioPlayerBase, { ...props });
542
+ };
543
+ AudioPlayer.displayName = "AudioPlayer";
544
+
545
+ exports.AudioPlayer = AudioPlayer;
546
+ exports.AudioPlayerBase = AudioPlayerBase;
547
+ exports.AudioPlayerProgress = AudioPlayerProgress;
548
+ exports.AudioPlayerTime = AudioPlayerTime;
549
+ exports.AudioPlayerVolume = AudioPlayerVolume;
550
+ exports.audioPlayerBarVariants = audioPlayerBarVariants;
551
+ exports.audioPlayerTimeVariants = audioPlayerTimeVariants;
552
+ exports.audioPlayerTrackVariants = audioPlayerTrackVariants;
553
+ exports.audioPlayerVariants = audioPlayerVariants;
554
+ exports.useAudioPlayer = useAudioPlayer;
555
+ //# sourceMappingURL=audio-player.js.map
556
+ //# sourceMappingURL=audio-player.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ui/audio-player/variants.ts","../../src/ui/audio-player/audio-player-base.tsx","../../src/ui/audio-player/audio-player.tsx"],"names":["cva","zuiAudioPlayerBase","zuiAudioPlayerAppearances","zuiAudioPlayerSizes","zuiAudioPlayerShapes","zuiAudioPlayerTrackBase","zuiAudioPlayerTrackSizes","zuiAudioPlayerBarBase","zuiAudioPlayerTimeBase","createContext","useContext","useRef","useState","useEffect","useCallback","useMemo","jsx","jsxs","cn"],"mappings":"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","file":"audio-player.js","sourcesContent":["import { cva } from \"class-variance-authority\";\n\nimport {\n zuiAudioPlayerAppearances,\n zuiAudioPlayerBarBase,\n zuiAudioPlayerBase,\n zuiAudioPlayerShapes,\n zuiAudioPlayerSizes,\n zuiAudioPlayerTimeBase,\n zuiAudioPlayerTrackBase,\n zuiAudioPlayerTrackSizes,\n} from \"../../design-system/audio-player\";\n\nexport const audioPlayerVariants = cva(\n [...zuiAudioPlayerBase, \"flex flex-col\"],\n {\n variants: {\n appearance: zuiAudioPlayerAppearances,\n size: zuiAudioPlayerSizes,\n shape: zuiAudioPlayerShapes,\n },\n defaultVariants: {\n appearance: \"default\",\n size: \"md\",\n shape: \"rounded\",\n },\n },\n);\n\nexport const audioPlayerTrackVariants = cva([...zuiAudioPlayerTrackBase], {\n variants: {\n size: zuiAudioPlayerTrackSizes,\n shape: zuiAudioPlayerShapes,\n },\n defaultVariants: {\n size: \"md\",\n shape: \"rounded\",\n },\n});\n\nexport const audioPlayerBarVariants = cva(zuiAudioPlayerBarBase);\n\nexport const audioPlayerTimeVariants = cva(zuiAudioPlayerTimeBase);\n","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { KeyboardEvent, MouseEvent, PointerEvent } from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport type {\n AudioPlayerCtx,\n AudioPlayerProgressProps,\n AudioPlayerProps,\n AudioPlayerTimeProps,\n AudioPlayerVolumeProps,\n} from \"./types\";\nimport {\n audioPlayerBarVariants,\n audioPlayerTimeVariants,\n audioPlayerTrackVariants,\n audioPlayerVariants,\n} from \"./variants\";\n\nexport const AudioPlayerContext = createContext<AudioPlayerCtx | null>(null);\n\nexport function useAudioPlayer(): AudioPlayerCtx {\n const ctx = useContext(AudioPlayerContext);\n if (!ctx) {\n throw new Error(\"useAudioPlayer must be used within <AudioPlayer>\");\n }\n return ctx;\n}\n\nfunction formatTime(seconds: number): string {\n if (!isFinite(seconds) || isNaN(seconds)) return \"0:00\";\n const m = Math.floor(seconds / 60);\n const s = Math.floor(seconds % 60);\n return `${m}:${s.toString().padStart(2, \"0\")}`;\n}\n\nexport function AudioPlayerBase(props: AudioPlayerProps) {\n const {\n className,\n appearance = \"default\",\n size = \"md\",\n shape = \"rounded\",\n src,\n children,\n autoPlay = false,\n loop = false,\n onEnded,\n onPlay,\n onPause,\n onTimeUpdate,\n ref,\n ...rest\n } = props;\n\n const audioRef = useRef<HTMLAudioElement>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [volume, setVolumeState] = useState(1);\n const [muted, setMuted] = useState(false);\n\n const progress = duration > 0 ? (currentTime / duration) * 100 : 0;\n\n const callbacksRef = useRef({ onEnded, onPlay, onPause, onTimeUpdate });\n useEffect(() => {\n callbacksRef.current = { onEnded, onPlay, onPause, onTimeUpdate };\n });\n\n useEffect(() => {\n setIsPlaying(false);\n setCurrentTime(0);\n setDuration(0);\n }, [src]);\n\n useEffect(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n const handleTimeUpdate = () => {\n setCurrentTime(audio.currentTime);\n callbacksRef.current.onTimeUpdate?.(audio.currentTime, audio.duration);\n };\n const handleDurationChange = () => {\n if (isFinite(audio.duration)) setDuration(audio.duration);\n };\n const handlePlay = () => {\n setIsPlaying(true);\n callbacksRef.current.onPlay?.();\n };\n const handlePause = () => {\n setIsPlaying(false);\n callbacksRef.current.onPause?.();\n };\n const handleEnded = () => {\n setIsPlaying(false);\n callbacksRef.current.onEnded?.();\n };\n const handleVolumeChange = () => {\n setVolumeState(audio.volume);\n setMuted(audio.muted);\n };\n\n audio.addEventListener(\"timeupdate\", handleTimeUpdate);\n audio.addEventListener(\"durationchange\", handleDurationChange);\n audio.addEventListener(\"loadedmetadata\", handleDurationChange);\n audio.addEventListener(\"play\", handlePlay);\n audio.addEventListener(\"pause\", handlePause);\n audio.addEventListener(\"ended\", handleEnded);\n audio.addEventListener(\"volumechange\", handleVolumeChange);\n\n return () => {\n audio.removeEventListener(\"timeupdate\", handleTimeUpdate);\n audio.removeEventListener(\"durationchange\", handleDurationChange);\n audio.removeEventListener(\"loadedmetadata\", handleDurationChange);\n audio.removeEventListener(\"play\", handlePlay);\n audio.removeEventListener(\"pause\", handlePause);\n audio.removeEventListener(\"ended\", handleEnded);\n audio.removeEventListener(\"volumechange\", handleVolumeChange);\n };\n }, []);\n\n const play = useCallback(() => {\n audioRef.current?.play().catch(() => {});\n }, []);\n\n const pause = useCallback(() => {\n audioRef.current?.pause();\n }, []);\n\n const toggle = useCallback(() => {\n const audio = audioRef.current;\n if (!audio) return;\n if (audio.paused) {\n audio.play().catch(() => {});\n } else {\n audio.pause();\n }\n }, []);\n\n const reset = useCallback(() => {\n const audio = audioRef.current;\n if (!audio) return;\n audio.pause();\n audio.currentTime = 0;\n setIsPlaying(false);\n setCurrentTime(0);\n }, []);\n\n const seek = useCallback((seconds: number) => {\n const audio = audioRef.current;\n if (!audio || !isFinite(audio.duration) || audio.duration <= 0) return;\n const nextTime = Math.max(0, Math.min(seconds, audio.duration));\n audio.currentTime = nextTime;\n setDuration(audio.duration);\n setCurrentTime(nextTime);\n }, []);\n\n const seekByPercent = useCallback((percent: number) => {\n const audio = audioRef.current;\n if (\n !audio ||\n !isFinite(percent) ||\n !isFinite(audio.duration) ||\n audio.duration <= 0\n ) {\n return;\n }\n const clamped = Math.max(0, Math.min(percent, 100));\n const nextTime = (clamped / 100) * audio.duration;\n audio.currentTime = nextTime;\n setDuration(audio.duration);\n setCurrentTime(nextTime);\n }, []);\n\n const setVolume = useCallback((vol: number) => {\n const audio = audioRef.current;\n if (!audio || !isFinite(vol)) return;\n const nextVolume = Math.max(0, Math.min(vol, 1));\n audio.volume = nextVolume;\n setVolumeState(nextVolume);\n }, []);\n\n const toggleMute = useCallback(() => {\n const audio = audioRef.current;\n if (!audio) return;\n const nextMuted = !audio.muted;\n audio.muted = nextMuted;\n setMuted(nextMuted);\n }, []);\n\n const ctx = useMemo<AudioPlayerCtx>(\n () => ({\n isPlaying,\n currentTime,\n duration,\n progress,\n volume,\n muted,\n play,\n pause,\n toggle,\n reset,\n seek,\n seekByPercent,\n setVolume,\n toggleMute,\n size: size ?? \"md\",\n shape: shape ?? \"rounded\",\n appearance: appearance ?? \"default\",\n }),\n [\n isPlaying,\n currentTime,\n duration,\n progress,\n volume,\n muted,\n play,\n pause,\n toggle,\n reset,\n seek,\n seekByPercent,\n setVolume,\n toggleMute,\n size,\n shape,\n appearance,\n ],\n );\n\n return (\n <AudioPlayerContext.Provider value={ctx}>\n <div\n ref={ref}\n data-slot=\"audio-player\"\n className={cn(\n audioPlayerVariants({ appearance, size, shape }),\n className,\n )}\n {...rest}\n >\n <audio\n ref={audioRef}\n src={src}\n autoPlay={autoPlay}\n loop={loop}\n preload=\"metadata\"\n className=\"hidden\"\n aria-hidden=\"true\"\n />\n {children}\n </div>\n </AudioPlayerContext.Provider>\n );\n}\n\nAudioPlayerBase.displayName = \"AudioPlayer\";\n\nexport function AudioPlayerProgress({\n className,\n ref,\n ...rest\n}: AudioPlayerProgressProps) {\n const { progress, seekByPercent, size, shape } = useAudioPlayer();\n const trackRef = useRef<HTMLDivElement>(null);\n const draggingRef = useRef(false);\n\n const getPercentFromEvent = useCallback((clientX: number): number => {\n const el = trackRef.current;\n if (!el) return 0;\n const { left, width } = el.getBoundingClientRect();\n return Math.max(0, Math.min(((clientX - left) / width) * 100, 100));\n }, []);\n\n const handleClick = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n if (draggingRef.current) return;\n seekByPercent(getPercentFromEvent(e.clientX));\n },\n [getPercentFromEvent, seekByPercent],\n );\n\n const handlePointerDown = useCallback(\n (e: PointerEvent<HTMLDivElement>) => {\n draggingRef.current = true;\n e.currentTarget.setPointerCapture?.(e.pointerId);\n seekByPercent(getPercentFromEvent(e.clientX));\n },\n [getPercentFromEvent, seekByPercent],\n );\n\n const handlePointerMove = useCallback(\n (e: PointerEvent<HTMLDivElement>) => {\n if (!draggingRef.current) return;\n seekByPercent(getPercentFromEvent(e.clientX));\n },\n [getPercentFromEvent, seekByPercent],\n );\n\n const handlePointerUp = useCallback(() => {\n draggingRef.current = false;\n }, []);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"ArrowRight\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n seekByPercent(Math.min(progress + 1, 100));\n } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n seekByPercent(Math.max(progress - 1, 0));\n } else if (e.key === \"Home\") {\n e.preventDefault();\n seekByPercent(0);\n } else if (e.key === \"End\") {\n e.preventDefault();\n seekByPercent(100);\n }\n },\n [progress, seekByPercent],\n );\n\n return (\n <div\n ref={(node) => {\n (trackRef as React.MutableRefObject<HTMLDivElement | null>).current =\n node;\n if (typeof ref === \"function\") ref(node);\n else if (ref)\n (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }}\n data-slot=\"audio-player-progress\"\n role=\"slider\"\n aria-label=\"Audio progress\"\n aria-valuenow={Math.round(progress)}\n aria-valuemin={0}\n aria-valuemax={100}\n tabIndex={0}\n className={cn(\n audioPlayerTrackVariants({ size, shape }),\n \"group\",\n className,\n )}\n onClick={handleClick}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n <div\n data-slot=\"audio-player-bar\"\n className={cn(\n audioPlayerBarVariants(),\n \"rounded-[inherit] group-hover:opacity-90 transition-opacity\",\n )}\n style={{ transform: `scaleX(${progress / 100})` }}\n />\n </div>\n );\n}\n\nAudioPlayerProgress.displayName = \"AudioPlayerProgress\";\n\nexport function AudioPlayerTime({\n className,\n format = formatTime,\n}: AudioPlayerTimeProps) {\n const { currentTime, duration } = useAudioPlayer();\n return (\n <div\n data-slot=\"audio-player-time\"\n className={cn(\n audioPlayerTimeVariants(),\n \"flex items-center gap-1\",\n className,\n )}\n >\n <span aria-label=\"Current time\">{format(currentTime)}</span>\n <span aria-hidden=\"true\">/</span>\n <span aria-label=\"Total duration\">{format(duration)}</span>\n </div>\n );\n}\n\nAudioPlayerTime.displayName = \"AudioPlayerTime\";\n\nexport function AudioPlayerVolume({\n className,\n ref,\n ...rest\n}: AudioPlayerVolumeProps) {\n const { volume, muted, setVolume, toggleMute } = useAudioPlayer();\n const trackRef = useRef<HTMLDivElement>(null);\n const draggingRef = useRef(false);\n\n const getVolumeFromEvent = useCallback((clientX: number): number => {\n const el = trackRef.current;\n if (!el) return 0;\n const { left, width } = el.getBoundingClientRect();\n return Math.max(0, Math.min((clientX - left) / width, 1));\n }, []);\n\n const handlePointerDown = useCallback(\n (e: PointerEvent<HTMLDivElement>) => {\n draggingRef.current = true;\n e.currentTarget.setPointerCapture?.(e.pointerId);\n setVolume(getVolumeFromEvent(e.clientX));\n },\n [getVolumeFromEvent, setVolume],\n );\n\n const handlePointerMove = useCallback(\n (e: PointerEvent<HTMLDivElement>) => {\n if (!draggingRef.current) return;\n setVolume(getVolumeFromEvent(e.clientX));\n },\n [getVolumeFromEvent, setVolume],\n );\n\n const handlePointerUp = useCallback(() => {\n draggingRef.current = false;\n }, []);\n\n const handleClick = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n if (draggingRef.current) return;\n setVolume(getVolumeFromEvent(e.clientX));\n },\n [getVolumeFromEvent, setVolume],\n );\n\n const displayVolume = muted ? 0 : volume;\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"ArrowRight\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n setVolume(Math.min(volume + 0.05, 1));\n } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n setVolume(Math.max(volume - 0.05, 0));\n } else if (e.key === \"Home\") {\n e.preventDefault();\n setVolume(0);\n } else if (e.key === \"End\") {\n e.preventDefault();\n setVolume(1);\n }\n },\n [volume, setVolume],\n );\n\n return (\n <div\n data-slot=\"audio-player-volume\"\n className={cn(\"flex items-center gap-2\", className)}\n {...rest}\n >\n <button\n type=\"button\"\n aria-label={muted ? \"Unmute\" : \"Mute\"}\n onClick={toggleMute}\n className=\"shrink-0 rounded focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--audio-fill,#0f172a)]\"\n >\n {displayVolume === 0 ? (\n <svg\n className=\"h-4 w-4\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polygon points=\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\" />\n <line x1=\"23\" y1=\"9\" x2=\"17\" y2=\"15\" />\n <line x1=\"17\" y1=\"9\" x2=\"23\" y2=\"15\" />\n </svg>\n ) : displayVolume < 0.5 ? (\n <svg\n className=\"h-4 w-4\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polygon points=\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\" />\n <path d=\"M15.54 8.46a5 5 0 0 1 0 7.07\" />\n </svg>\n ) : (\n <svg\n className=\"h-4 w-4\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polygon points=\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\" />\n <path d=\"M19.07 4.93a10 10 0 0 1 0 14.14\" />\n <path d=\"M15.54 8.46a5 5 0 0 1 0 7.07\" />\n </svg>\n )}\n </button>\n <div\n ref={(node) => {\n (trackRef as React.MutableRefObject<HTMLDivElement | null>).current =\n node;\n if (typeof ref === \"function\") ref(node);\n else if (ref)\n (ref as React.MutableRefObject<HTMLDivElement | null>).current =\n node;\n }}\n role=\"slider\"\n aria-label=\"Volume\"\n aria-valuenow={Math.round(displayVolume * 100)}\n aria-valuemin={0}\n aria-valuemax={100}\n tabIndex={0}\n className=\"relative h-1.5 w-20 cursor-pointer overflow-hidden rounded-full bg-[var(--zui-audio-player-track-bg,var(--zui-surface-muted,#0000001a))] dark:bg-[var(--zui-audio-player-track-bg-dark,var(--zui-surface-muted-dark,#ffffff1a))] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--audio-fill,#0f172a)]\"\n onClick={handleClick}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n onKeyDown={handleKeyDown}\n >\n <div\n data-slot=\"audio-player-volume-bar\"\n className=\"h-full origin-left [background:var(--audio-fill)] rounded-[inherit]\"\n style={{ transform: `scaleX(${displayVolume})` }}\n />\n </div>\n </div>\n );\n}\n\nAudioPlayerVolume.displayName = \"AudioPlayerVolume\";\n","import { AudioPlayerBase } from \"./audio-player-base\";\nimport type { AudioPlayerProps } from \"./types\";\n\nexport const AudioPlayer = (props: AudioPlayerProps) => {\n return <AudioPlayerBase {...props} />;\n};\n\nAudioPlayer.displayName = \"AudioPlayer\";\n"]}