@mieweb/ui 0.3.0-dev.72 → 0.3.0-dev.74

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 (135) hide show
  1. package/dist/ag-grid.cjs +31 -21
  2. package/dist/ag-grid.cjs.map +1 -1
  3. package/dist/ag-grid.js +31 -21
  4. package/dist/ag-grid.js.map +1 -1
  5. package/dist/brands/bluehive.css +5 -5
  6. package/dist/brands/mieweb.css +5 -5
  7. package/dist/brands/ozwell.css +5 -5
  8. package/dist/brands/webchart.css +5 -5
  9. package/dist/{chunk-N2YMRZ7P.cjs → chunk-2EPJ5SMX.cjs} +5 -5
  10. package/dist/{chunk-N2YMRZ7P.cjs.map → chunk-2EPJ5SMX.cjs.map} +1 -1
  11. package/dist/{chunk-QDGZBDBI.cjs → chunk-2LF7PSSX.cjs} +3 -3
  12. package/dist/{chunk-QDGZBDBI.cjs.map → chunk-2LF7PSSX.cjs.map} +1 -1
  13. package/dist/{chunk-O43QBXRX.js → chunk-43GBCUSQ.js} +3 -3
  14. package/dist/{chunk-O43QBXRX.js.map → chunk-43GBCUSQ.js.map} +1 -1
  15. package/dist/{chunk-MOULJE34.js → chunk-4DMZAVB2.js} +6 -6
  16. package/dist/chunk-4DMZAVB2.js.map +1 -0
  17. package/dist/{chunk-OJ64Q3A5.js → chunk-5PUEQH2L.js} +3 -3
  18. package/dist/{chunk-OJ64Q3A5.js.map → chunk-5PUEQH2L.js.map} +1 -1
  19. package/dist/{chunk-VKTQQOUH.js → chunk-5U7IIMKH.js} +4 -4
  20. package/dist/{chunk-VKTQQOUH.js.map → chunk-5U7IIMKH.js.map} +1 -1
  21. package/dist/{chunk-TSZRR2ZK.cjs → chunk-67QT2WYS.cjs} +3 -3
  22. package/dist/{chunk-TSZRR2ZK.cjs.map → chunk-67QT2WYS.cjs.map} +1 -1
  23. package/dist/{chunk-LXHPW2ZF.cjs → chunk-7BARESXI.cjs} +3 -3
  24. package/dist/{chunk-LXHPW2ZF.cjs.map → chunk-7BARESXI.cjs.map} +1 -1
  25. package/dist/{chunk-BBQZNIB4.js → chunk-AL6ASCL6.js} +9 -9
  26. package/dist/{chunk-BBQZNIB4.js.map → chunk-AL6ASCL6.js.map} +1 -1
  27. package/dist/{chunk-AUXHRAID.cjs → chunk-CHMMHFOW.cjs} +9 -9
  28. package/dist/{chunk-AUXHRAID.cjs.map → chunk-CHMMHFOW.cjs.map} +1 -1
  29. package/dist/{chunk-JDI45GEY.js → chunk-CWDQ7OPJ.js} +3 -3
  30. package/dist/{chunk-JDI45GEY.js.map → chunk-CWDQ7OPJ.js.map} +1 -1
  31. package/dist/{chunk-Z4HZ35KX.cjs → chunk-DEZ7XSTG.cjs} +3 -3
  32. package/dist/{chunk-Z4HZ35KX.cjs.map → chunk-DEZ7XSTG.cjs.map} +1 -1
  33. package/dist/{chunk-PRTQVKDW.cjs → chunk-DT4CHRTJ.cjs} +391 -390
  34. package/dist/chunk-DT4CHRTJ.cjs.map +1 -0
  35. package/dist/{chunk-QMQE4PDD.cjs → chunk-E3GBBYAO.cjs} +6 -6
  36. package/dist/{chunk-QMQE4PDD.cjs.map → chunk-E3GBBYAO.cjs.map} +1 -1
  37. package/dist/{chunk-IMNLYVXJ.cjs → chunk-EUUQVDXX.cjs} +6 -6
  38. package/dist/{chunk-IMNLYVXJ.cjs.map → chunk-EUUQVDXX.cjs.map} +1 -1
  39. package/dist/{chunk-TF5OZDFU.js → chunk-FMGX2AM2.js} +6 -6
  40. package/dist/{chunk-TF5OZDFU.js.map → chunk-FMGX2AM2.js.map} +1 -1
  41. package/dist/{chunk-5NSURWMM.js → chunk-FYEK4RZ3.js} +4 -4
  42. package/dist/{chunk-5NSURWMM.js.map → chunk-FYEK4RZ3.js.map} +1 -1
  43. package/dist/{chunk-DLLVXNAQ.js → chunk-G7P5X2F4.js} +5 -5
  44. package/dist/{chunk-DLLVXNAQ.js.map → chunk-G7P5X2F4.js.map} +1 -1
  45. package/dist/{chunk-QEAIFTUL.cjs → chunk-HT3SXDFF.cjs} +5 -5
  46. package/dist/{chunk-QEAIFTUL.cjs.map → chunk-HT3SXDFF.cjs.map} +1 -1
  47. package/dist/{chunk-DCDXOT3A.js → chunk-IEVAVY43.js} +3 -3
  48. package/dist/{chunk-DCDXOT3A.js.map → chunk-IEVAVY43.js.map} +1 -1
  49. package/dist/{chunk-EMMQPDOY.cjs → chunk-KLLGX5O3.cjs} +4 -4
  50. package/dist/{chunk-EMMQPDOY.cjs.map → chunk-KLLGX5O3.cjs.map} +1 -1
  51. package/dist/{chunk-ND75VHB7.cjs → chunk-MIGLLTTD.cjs} +4 -4
  52. package/dist/{chunk-ND75VHB7.cjs.map → chunk-MIGLLTTD.cjs.map} +1 -1
  53. package/dist/{chunk-3DM6LMZG.js → chunk-MUYTGWGE.js} +4 -3
  54. package/dist/chunk-MUYTGWGE.js.map +1 -0
  55. package/dist/{chunk-VQW36LLX.cjs → chunk-NVHAQOHH.cjs} +3 -3
  56. package/dist/{chunk-VQW36LLX.cjs.map → chunk-NVHAQOHH.cjs.map} +1 -1
  57. package/dist/{chunk-4ASPCSWT.js → chunk-PU6ZC4GI.js} +3 -3
  58. package/dist/{chunk-4ASPCSWT.js.map → chunk-PU6ZC4GI.js.map} +1 -1
  59. package/dist/{chunk-JE4AH2TZ.cjs → chunk-Q2EWNXIB.cjs} +6 -6
  60. package/dist/chunk-Q2EWNXIB.cjs.map +1 -0
  61. package/dist/{chunk-PLIK3DN6.cjs → chunk-QASIWBXU.cjs} +4 -3
  62. package/dist/chunk-QASIWBXU.cjs.map +1 -0
  63. package/dist/{chunk-V2O636JO.js → chunk-QBFNONJD.js} +5 -5
  64. package/dist/{chunk-V2O636JO.js.map → chunk-QBFNONJD.js.map} +1 -1
  65. package/dist/{chunk-YR365F2H.cjs → chunk-QG7CJH4O.cjs} +3 -3
  66. package/dist/{chunk-YR365F2H.cjs.map → chunk-QG7CJH4O.cjs.map} +1 -1
  67. package/dist/{chunk-ZGSPFVGL.cjs → chunk-QNTUYH6G.cjs} +4 -4
  68. package/dist/{chunk-ZGSPFVGL.cjs.map → chunk-QNTUYH6G.cjs.map} +1 -1
  69. package/dist/{chunk-YN3ZIUYC.js → chunk-TRZXK57D.js} +6 -6
  70. package/dist/{chunk-YN3ZIUYC.js.map → chunk-TRZXK57D.js.map} +1 -1
  71. package/dist/{chunk-NDHW3ZRF.js → chunk-VCO2IZOG.js} +3 -3
  72. package/dist/{chunk-NDHW3ZRF.js.map → chunk-VCO2IZOG.js.map} +1 -1
  73. package/dist/{chunk-7XWPUWSL.js → chunk-WFS6R2F5.js} +3 -3
  74. package/dist/{chunk-7XWPUWSL.js.map → chunk-WFS6R2F5.js.map} +1 -1
  75. package/dist/{chunk-LAR4H7ZG.js → chunk-WORZLEUZ.js} +391 -390
  76. package/dist/chunk-WORZLEUZ.js.map +1 -0
  77. package/dist/{chunk-RCMF6KZA.js → chunk-YTZPVEIO.js} +3 -3
  78. package/dist/{chunk-RCMF6KZA.js.map → chunk-YTZPVEIO.js.map} +1 -1
  79. package/dist/{chunk-6EN6ZIW3.js → chunk-YY23MK3V.js} +4 -4
  80. package/dist/{chunk-6EN6ZIW3.js.map → chunk-YY23MK3V.js.map} +1 -1
  81. package/dist/{chunk-QXJMKJJV.cjs → chunk-ZKFVGYBK.cjs} +3 -3
  82. package/dist/{chunk-QXJMKJJV.cjs.map → chunk-ZKFVGYBK.cjs.map} +1 -1
  83. package/dist/{chunk-Z2ABQA5Z.cjs → chunk-ZRI6OXQD.cjs} +3 -3
  84. package/dist/{chunk-Z2ABQA5Z.cjs.map → chunk-ZRI6OXQD.cjs.map} +1 -1
  85. package/dist/components/AudioPlayer/index.cjs +6 -6
  86. package/dist/components/AudioPlayer/index.js +1 -1
  87. package/dist/components/AudioRecorder/index.cjs +6 -6
  88. package/dist/components/AudioRecorder/index.js +1 -1
  89. package/dist/components/Card/index.cjs +15 -15
  90. package/dist/components/Card/index.js +1 -1
  91. package/dist/components/Checkbox/index.cjs +4 -4
  92. package/dist/components/Checkbox/index.js +1 -1
  93. package/dist/components/CountryCodeDropdown/index.cjs +4 -4
  94. package/dist/components/CountryCodeDropdown/index.js +1 -1
  95. package/dist/components/DateInput/index.cjs +2 -2
  96. package/dist/components/DateInput/index.js +1 -1
  97. package/dist/components/Dropdown/index.cjs +7 -7
  98. package/dist/components/Dropdown/index.js +1 -1
  99. package/dist/components/Pagination/index.cjs +4 -4
  100. package/dist/components/Pagination/index.js +1 -1
  101. package/dist/components/PhoneInput/index.cjs +3 -3
  102. package/dist/components/PhoneInput/index.js +1 -1
  103. package/dist/components/Progress/index.cjs +6 -6
  104. package/dist/components/Progress/index.js +1 -1
  105. package/dist/components/QuickAction/index.cjs +6 -6
  106. package/dist/components/QuickAction/index.js +1 -1
  107. package/dist/components/Radio/index.cjs +4 -4
  108. package/dist/components/Radio/index.js +1 -1
  109. package/dist/components/SchedulePicker/index.cjs +10 -10
  110. package/dist/components/SchedulePicker/index.js +1 -1
  111. package/dist/components/Select/index.cjs +3 -3
  112. package/dist/components/Select/index.js +1 -1
  113. package/dist/components/Slider/index.cjs +5 -5
  114. package/dist/components/Slider/index.js +1 -1
  115. package/dist/components/Spinner/index.cjs +5 -5
  116. package/dist/components/Spinner/index.js +1 -1
  117. package/dist/components/Switch/index.cjs +4 -4
  118. package/dist/components/Switch/index.js +1 -1
  119. package/dist/components/Tabs/index.cjs +7 -7
  120. package/dist/components/Tabs/index.js +1 -1
  121. package/dist/components/Text/index.cjs +4 -4
  122. package/dist/components/Text/index.js +1 -1
  123. package/dist/index.cjs +737 -766
  124. package/dist/index.cjs.map +1 -1
  125. package/dist/index.js +453 -482
  126. package/dist/index.js.map +1 -1
  127. package/dist/styles/init.css +24 -11
  128. package/dist/styles.css +1 -1
  129. package/package.json +1 -1
  130. package/dist/chunk-3DM6LMZG.js.map +0 -1
  131. package/dist/chunk-JE4AH2TZ.cjs.map +0 -1
  132. package/dist/chunk-LAR4H7ZG.js.map +0 -1
  133. package/dist/chunk-MOULJE34.js.map +0 -1
  134. package/dist/chunk-PLIK3DN6.cjs.map +0 -1
  135. package/dist/chunk-PRTQVKDW.cjs.map +0 -1
@@ -51,13 +51,13 @@ var playButtonVariants = cva(
51
51
  "dark:text-neutral-400 dark:hover:text-neutral-200 dark:hover:bg-neutral-800"
52
52
  ],
53
53
  compact: [
54
- "bg-primary-600 text-white",
55
- "hover:bg-primary-700",
54
+ "bg-primary-800 text-white",
55
+ "hover:bg-primary-900",
56
56
  "active:bg-primary-800"
57
57
  ],
58
58
  waveform: [
59
- "bg-primary-600 text-white",
60
- "hover:bg-primary-700",
59
+ "bg-primary-800 text-white",
60
+ "hover:bg-primary-900",
61
61
  "active:bg-primary-800"
62
62
  ]
63
63
  },
@@ -180,14 +180,14 @@ function ProgressBar({
180
180
  /* @__PURE__ */ jsx(
181
181
  "div",
182
182
  {
183
- className: "bg-primary-600 absolute inset-y-0 left-0 rounded-full transition-all",
183
+ className: "bg-primary-800 absolute inset-y-0 left-0 rounded-full transition-all",
184
184
  style: { width: `${progress}%` }
185
185
  }
186
186
  ),
187
187
  /* @__PURE__ */ jsx(
188
188
  "div",
189
189
  {
190
- className: "bg-primary-600 absolute top-1/2 h-3 w-3 -translate-y-1/2 rounded-full shadow-sm transition-all",
190
+ className: "bg-primary-800 absolute top-1/2 h-3 w-3 -translate-y-1/2 rounded-full shadow-sm transition-all",
191
191
  style: { left: `calc(${progress}% - 6px)` }
192
192
  }
193
193
  )
@@ -273,23 +273,22 @@ function Waveform({
273
273
  normalize: true,
274
274
  interact: !showHoverCursor
275
275
  });
276
+ const emitTimeUpdate = () => {
277
+ onTimeUpdate(
278
+ wavesurferRef.current.getCurrentTime(),
279
+ wavesurferRef.current.getDuration()
280
+ );
281
+ };
276
282
  wavesurferRef.current.on("ready", () => {
277
283
  setIsLoaded(true);
278
284
  const duration = wavesurferRef.current.getDuration();
279
285
  onReady(duration);
280
286
  onTimeUpdate(wavesurferRef.current.getCurrentTime(), duration);
281
287
  });
282
- wavesurferRef.current.on("audioprocess", () => {
283
- onTimeUpdate(
284
- wavesurferRef.current.getCurrentTime(),
285
- wavesurferRef.current.getDuration()
286
- );
287
- });
288
+ wavesurferRef.current.on("timeupdate", emitTimeUpdate);
289
+ wavesurferRef.current.on("audioprocess", emitTimeUpdate);
288
290
  wavesurferRef.current.on("seeking", () => {
289
- onTimeUpdate(
290
- wavesurferRef.current.getCurrentTime(),
291
- wavesurferRef.current.getDuration()
292
- );
291
+ emitTimeUpdate();
293
292
  });
294
293
  if (!showHoverCursor) {
295
294
  wavesurferRef.current.on("interaction", () => {
@@ -405,324 +404,378 @@ function Waveform({
405
404
  }
406
405
  );
407
406
  }
408
- var AudioPlayer = React.forwardRef(function AudioPlayer2({
409
- src,
410
- title,
411
- variant = "compact",
412
- size = "md",
413
- onStateChange,
414
- onEnded,
415
- onError,
416
- onTimeUpdate,
417
- showTime = true,
418
- showDuration = true,
419
- waveColor,
420
- progressColor,
421
- waveformHeight = 64,
422
- showWaveformHoverCursor = true,
423
- waveformCursorColor,
424
- disabled = false,
425
- className,
426
- "aria-label": ariaLabel,
427
- playbackRates = [0.5, 0.75, 1, 1.25, 1.5, 2],
428
- showPlaybackRate = false,
429
- /** Whether to preload audio (set to false for lists with many items) */
430
- preload = false,
431
- /** Fallback duration in seconds to display before audio is loaded */
432
- fallbackDuration
433
- }, ref) {
434
- const [state, setState] = React.useState("idle");
435
- const [currentTime, setCurrentTime] = React.useState(0);
436
- const [duration, setDuration] = React.useState(0);
437
- const [playbackRate, setPlaybackRate] = React.useState(1);
438
- const [audioInitialized, setAudioInitialized] = React.useState(false);
439
- const [hoverTime, setHoverTime] = React.useState(null);
440
- const containerRef = React.useRef(null);
441
- const audioRef = React.useRef(null);
442
- const waveformMethodsRef = React.useRef(null);
443
- const isPlaying = state === "playing";
444
- const isLoading = state === "loading";
445
- const displayDuration = duration > 0 ? duration : fallbackDuration ?? 0;
446
- const updateState = React.useCallback(
447
- (newState) => {
448
- setState(newState);
449
- onStateChange?.(newState);
450
- },
451
- [onStateChange]
452
- );
453
- const initAudio = React.useCallback(() => {
454
- if (variant === "waveform" || audioInitialized) return null;
455
- const audio = new globalThis.Audio(src);
456
- audioRef.current = audio;
457
- setAudioInitialized(true);
458
- audio.addEventListener("loadstart", () => updateState("loading"));
459
- audio.addEventListener("canplay", () => {
460
- updateState("idle");
461
- });
462
- audio.addEventListener("loadedmetadata", () => {
463
- setDuration(audio.duration);
464
- onTimeUpdate?.(audio.currentTime, audio.duration);
465
- });
466
- audio.addEventListener("timeupdate", () => {
467
- setCurrentTime(audio.currentTime);
468
- onTimeUpdate?.(audio.currentTime, audio.duration);
469
- });
470
- audio.addEventListener("ended", () => {
471
- updateState("idle");
472
- setCurrentTime(0);
473
- onEnded?.();
474
- });
475
- audio.addEventListener("error", () => {
476
- updateState("error");
477
- onError?.(new Error("Failed to load audio"));
478
- });
479
- return audio;
480
- }, [
407
+ var AudioPlayer = React.forwardRef(
408
+ function AudioPlayer2({
481
409
  src,
482
- variant,
483
- audioInitialized,
484
- updateState,
485
- onTimeUpdate,
410
+ title,
411
+ variant = "compact",
412
+ size = "md",
413
+ onStateChange,
486
414
  onEnded,
487
- onError
488
- ]);
489
- React.useImperativeHandle(
490
- ref,
491
- () => ({
492
- get container() {
493
- return containerRef.current;
415
+ onError,
416
+ onTimeUpdate,
417
+ showTime = true,
418
+ showDuration = true,
419
+ waveColor,
420
+ progressColor,
421
+ waveformHeight = 64,
422
+ showWaveformHoverCursor = true,
423
+ waveformCursorColor,
424
+ disabled = false,
425
+ className,
426
+ "aria-label": ariaLabel,
427
+ playbackRates = [0.5, 0.75, 1, 1.25, 1.5, 2],
428
+ showPlaybackRate = false,
429
+ /** Whether to preload audio (set to false for lists with many items) */
430
+ preload = false,
431
+ /** Fallback duration in seconds to display before audio is loaded */
432
+ fallbackDuration
433
+ }, ref) {
434
+ const [state, setState] = React.useState("idle");
435
+ const [currentTime, setCurrentTime] = React.useState(0);
436
+ const [duration, setDuration] = React.useState(0);
437
+ const [playbackRate, setPlaybackRate] = React.useState(1);
438
+ const [audioInitialized, setAudioInitialized] = React.useState(false);
439
+ const [hoverTime, setHoverTime] = React.useState(null);
440
+ const containerRef = React.useRef(null);
441
+ const audioRef = React.useRef(null);
442
+ const waveformMethodsRef = React.useRef(null);
443
+ const isPlaying = state === "playing";
444
+ const isLoading = state === "loading";
445
+ const displayDuration = duration > 0 ? duration : fallbackDuration ?? 0;
446
+ const updateState = React.useCallback(
447
+ (newState) => {
448
+ setState(newState);
449
+ onStateChange?.(newState);
494
450
  },
495
- seekTo: (time) => {
496
- if (variant === "waveform") {
497
- waveformMethodsRef.current?.seekTo(time);
498
- } else {
499
- if (!audioRef.current) {
500
- initAudio();
451
+ [onStateChange]
452
+ );
453
+ const initAudio = React.useCallback(() => {
454
+ if (variant === "waveform" || audioInitialized) return null;
455
+ const audio = new globalThis.Audio(src);
456
+ audioRef.current = audio;
457
+ setAudioInitialized(true);
458
+ audio.addEventListener("loadstart", () => updateState("loading"));
459
+ audio.addEventListener("canplay", () => {
460
+ updateState("idle");
461
+ });
462
+ audio.addEventListener("loadedmetadata", () => {
463
+ setDuration(audio.duration);
464
+ onTimeUpdate?.(audio.currentTime, audio.duration);
465
+ });
466
+ audio.addEventListener("timeupdate", () => {
467
+ setCurrentTime(audio.currentTime);
468
+ onTimeUpdate?.(audio.currentTime, audio.duration);
469
+ });
470
+ audio.addEventListener("ended", () => {
471
+ updateState("idle");
472
+ setCurrentTime(0);
473
+ onEnded?.();
474
+ });
475
+ audio.addEventListener("error", () => {
476
+ updateState("error");
477
+ onError?.(new Error("Failed to load audio"));
478
+ });
479
+ return audio;
480
+ }, [
481
+ src,
482
+ variant,
483
+ audioInitialized,
484
+ updateState,
485
+ onTimeUpdate,
486
+ onEnded,
487
+ onError
488
+ ]);
489
+ React.useImperativeHandle(
490
+ ref,
491
+ () => ({
492
+ get container() {
493
+ return containerRef.current;
494
+ },
495
+ seekTo: (time) => {
496
+ if (variant === "waveform") {
497
+ waveformMethodsRef.current?.seekTo(time);
498
+ } else {
499
+ if (!audioRef.current) {
500
+ initAudio();
501
+ }
502
+ if (audioRef.current) {
503
+ audioRef.current.currentTime = time;
504
+ }
501
505
  }
502
- if (audioRef.current) {
503
- audioRef.current.currentTime = time;
506
+ },
507
+ play: () => {
508
+ if (variant === "waveform") {
509
+ if (waveformMethodsRef.current) {
510
+ waveformMethodsRef.current.play();
511
+ updateState("playing");
512
+ }
513
+ } else {
514
+ if (!audioRef.current) {
515
+ initAudio();
516
+ }
517
+ if (audioRef.current) {
518
+ audioRef.current.play().catch((error) => {
519
+ updateState("error");
520
+ onError?.(error);
521
+ });
522
+ updateState("playing");
523
+ }
504
524
  }
505
- }
506
- },
507
- play: () => {
508
- if (variant === "waveform") {
509
- if (waveformMethodsRef.current) {
510
- waveformMethodsRef.current.play();
511
- updateState("playing");
525
+ },
526
+ pause: () => {
527
+ if (variant === "waveform") {
528
+ if (waveformMethodsRef.current) {
529
+ waveformMethodsRef.current.pause();
530
+ updateState("paused");
531
+ }
532
+ } else if (audioRef.current) {
533
+ audioRef.current.pause();
534
+ updateState("paused");
512
535
  }
513
- } else {
514
- if (!audioRef.current) {
515
- initAudio();
536
+ },
537
+ getCurrentTime: () => {
538
+ if (variant === "waveform") {
539
+ return waveformMethodsRef.current?.getCurrentTime() ?? 0;
516
540
  }
517
- if (audioRef.current) {
518
- audioRef.current.play().catch((error) => {
519
- updateState("error");
520
- onError?.(error);
521
- });
522
- updateState("playing");
541
+ return audioRef.current?.currentTime ?? 0;
542
+ },
543
+ getDuration: () => {
544
+ if (variant === "waveform") {
545
+ return waveformMethodsRef.current?.getDuration() ?? 0;
523
546
  }
547
+ const rawDuration = audioRef.current?.duration;
548
+ return Number.isFinite(rawDuration) ? rawDuration : 0;
524
549
  }
525
- },
526
- pause: () => {
527
- if (variant === "waveform") {
528
- if (waveformMethodsRef.current) {
529
- waveformMethodsRef.current.pause();
530
- updateState("paused");
531
- }
532
- } else if (audioRef.current) {
550
+ }),
551
+ [variant, initAudio, updateState, onError]
552
+ );
553
+ React.useEffect(() => {
554
+ if (preload && !audioInitialized && variant !== "waveform") {
555
+ initAudio();
556
+ }
557
+ }, [preload, audioInitialized, variant, initAudio]);
558
+ React.useEffect(() => {
559
+ return () => {
560
+ if (audioRef.current) {
533
561
  audioRef.current.pause();
534
- updateState("paused");
535
- }
536
- },
537
- getCurrentTime: () => {
538
- if (variant === "waveform") {
539
- return waveformMethodsRef.current?.getCurrentTime() ?? 0;
540
- }
541
- return audioRef.current?.currentTime ?? 0;
542
- },
543
- getDuration: () => {
544
- if (variant === "waveform") {
545
- return waveformMethodsRef.current?.getDuration() ?? 0;
562
+ audioRef.current.src = "";
546
563
  }
547
- const rawDuration = audioRef.current?.duration;
548
- return Number.isFinite(rawDuration) ? rawDuration : 0;
549
- }
550
- }),
551
- [variant, initAudio, updateState, onError]
552
- );
553
- React.useEffect(() => {
554
- if (preload && !audioInitialized && variant !== "waveform") {
555
- initAudio();
556
- }
557
- }, [preload, audioInitialized, variant, initAudio]);
558
- React.useEffect(() => {
559
- return () => {
564
+ };
565
+ }, []);
566
+ React.useEffect(() => {
560
567
  if (audioRef.current) {
561
- audioRef.current.pause();
562
- audioRef.current.src = "";
568
+ audioRef.current.playbackRate = playbackRate;
563
569
  }
564
- };
565
- }, []);
566
- React.useEffect(() => {
567
- if (audioRef.current) {
568
- audioRef.current.playbackRate = playbackRate;
569
- }
570
- }, [playbackRate]);
571
- const handlePlay = React.useCallback(() => {
572
- if (disabled) return;
573
- if (variant === "waveform") {
574
- if (isLoading) return;
575
- updateState(isPlaying ? "paused" : "playing");
576
- return;
577
- }
578
- if (!audioInitialized && !isLoading) {
579
- const audio = initAudio();
580
- if (audio) {
581
- updateState("loading");
582
- audio.addEventListener(
583
- "canplay",
584
- () => {
585
- audio.play().catch((error) => {
586
- updateState("error");
587
- onError?.(error);
588
- });
589
- updateState("playing");
590
- },
591
- { once: true }
592
- );
570
+ }, [playbackRate]);
571
+ const handlePlay = React.useCallback(() => {
572
+ if (disabled) return;
573
+ if (variant === "waveform") {
574
+ if (isLoading) return;
575
+ updateState(isPlaying ? "paused" : "playing");
576
+ return;
593
577
  }
594
- return;
595
- }
596
- if (isLoading) return;
597
- if (isPlaying) {
598
- if (audioRef.current) {
599
- audioRef.current.pause();
600
- }
601
- updateState("paused");
602
- } else {
603
- if (audioRef.current) {
604
- audioRef.current.play().catch((error) => {
605
- updateState("error");
606
- onError?.(error);
607
- });
608
- updateState("playing");
578
+ if (!audioInitialized && !isLoading) {
579
+ const audio = initAudio();
580
+ if (audio) {
581
+ updateState("loading");
582
+ audio.addEventListener(
583
+ "canplay",
584
+ () => {
585
+ audio.play().catch((error) => {
586
+ updateState("error");
587
+ onError?.(error);
588
+ });
589
+ updateState("playing");
590
+ },
591
+ { once: true }
592
+ );
593
+ }
594
+ return;
609
595
  }
610
- }
611
- }, [
612
- disabled,
613
- variant,
614
- audioInitialized,
615
- isLoading,
616
- isPlaying,
617
- initAudio,
618
- updateState,
619
- onError
620
- ]);
621
- const handleSeek = React.useCallback(
622
- (time) => {
623
- if (audioRef.current) {
624
- audioRef.current.currentTime = time;
625
- setCurrentTime(time);
626
- onTimeUpdate?.(time, audioRef.current.duration);
596
+ if (isLoading) return;
597
+ if (isPlaying) {
598
+ if (audioRef.current) {
599
+ audioRef.current.pause();
600
+ }
601
+ updateState("paused");
602
+ } else {
603
+ if (audioRef.current) {
604
+ audioRef.current.play().catch((error) => {
605
+ updateState("error");
606
+ onError?.(error);
607
+ });
608
+ updateState("playing");
609
+ }
627
610
  }
628
- },
629
- [onTimeUpdate]
630
- );
631
- const handleWaveformReady = React.useCallback(
632
- (dur) => {
633
- setDuration(dur);
634
- setState("idle");
635
- onTimeUpdate?.(currentTime, dur);
636
- },
637
- [currentTime, onTimeUpdate]
638
- );
639
- const handleWaveformTimeUpdate = React.useCallback(
640
- (time, dur) => {
641
- setCurrentTime(time);
642
- if (dur > 0) {
611
+ }, [
612
+ disabled,
613
+ variant,
614
+ audioInitialized,
615
+ isLoading,
616
+ isPlaying,
617
+ initAudio,
618
+ updateState,
619
+ onError
620
+ ]);
621
+ const handleSeek = React.useCallback(
622
+ (time) => {
623
+ if (audioRef.current) {
624
+ audioRef.current.currentTime = time;
625
+ setCurrentTime(time);
626
+ onTimeUpdate?.(time, audioRef.current.duration);
627
+ }
628
+ },
629
+ [onTimeUpdate]
630
+ );
631
+ const handleWaveformReady = React.useCallback(
632
+ (dur) => {
643
633
  setDuration(dur);
644
- }
645
- onTimeUpdate?.(time, dur);
646
- },
647
- [onTimeUpdate]
648
- );
649
- const handleWaveformFinish = React.useCallback(() => {
650
- updateState("idle");
651
- setCurrentTime(0);
652
- onEnded?.();
653
- }, [updateState, onEnded]);
654
- const handleWaveformSeek = React.useCallback((time) => {
655
- setCurrentTime(time);
656
- }, []);
657
- const handleHoverTimeChange = React.useCallback((time) => {
658
- setHoverTime(time);
659
- }, []);
660
- const iconSize = size === "sm" ? "h-3.5 w-3.5" : size === "lg" ? "h-5 w-5" : "h-4 w-4";
661
- const getAriaLabel = () => {
662
- if (ariaLabel) return ariaLabel;
663
- if (title) return `${isPlaying ? "Pause" : "Play"} ${title}`;
664
- return isPlaying ? "Pause audio" : "Play audio";
665
- };
666
- const renderPlayButton = () => /* @__PURE__ */ jsx(
667
- "button",
668
- {
669
- type: "button",
670
- "data-slot": "audio-player-play-btn",
671
- onClick: handlePlay,
672
- disabled: disabled || isLoading,
673
- className: cn(playButtonVariants({ variant, size })),
674
- "aria-label": getAriaLabel(),
675
- "aria-pressed": isPlaying,
676
- children: isLoading ? /* @__PURE__ */ jsx(SpinnerIcon, { className: iconSize }) : isPlaying ? /* @__PURE__ */ jsx(PauseIcon, { className: iconSize }) : /* @__PURE__ */ jsx(PlayIcon, { className: iconSize })
677
- }
678
- );
679
- const renderTime = (useHoverTime = false) => {
680
- if (!showTime) return null;
681
- const displayTime = useHoverTime && hoverTime !== null ? hoverTime : currentTime;
682
- const isShowingHoverTime = useHoverTime && hoverTime !== null;
683
- return /* @__PURE__ */ jsxs(
684
- "span",
685
- {
686
- "data-slot": "audio-player-time",
687
- className: cn(
688
- "font-mono text-xs tabular-nums",
689
- isShowingHoverTime ? "text-primary-600 dark:text-primary-400" : "text-neutral-500 dark:text-neutral-400"
690
- ),
691
- children: [
692
- formatTime(displayTime),
693
- " / ",
694
- formatTime(displayDuration)
695
- ]
696
- }
634
+ setState("idle");
635
+ onTimeUpdate?.(currentTime, dur);
636
+ },
637
+ [currentTime, onTimeUpdate]
697
638
  );
698
- };
699
- const renderPlaybackRateControl = () => {
700
- if (!showPlaybackRate) return null;
701
- return /* @__PURE__ */ jsx(
702
- "select",
639
+ const handleWaveformTimeUpdate = React.useCallback(
640
+ (time, dur) => {
641
+ setCurrentTime(time);
642
+ if (dur > 0) {
643
+ setDuration(dur);
644
+ }
645
+ onTimeUpdate?.(time, dur);
646
+ },
647
+ [onTimeUpdate]
648
+ );
649
+ const handleWaveformFinish = React.useCallback(() => {
650
+ updateState("idle");
651
+ setCurrentTime(0);
652
+ onEnded?.();
653
+ }, [updateState, onEnded]);
654
+ const handleWaveformSeek = React.useCallback((time) => {
655
+ setCurrentTime(time);
656
+ }, []);
657
+ const handleHoverTimeChange = React.useCallback((time) => {
658
+ setHoverTime(time);
659
+ }, []);
660
+ const iconSize = size === "sm" ? "h-3.5 w-3.5" : size === "lg" ? "h-5 w-5" : "h-4 w-4";
661
+ const getAriaLabel = () => {
662
+ if (ariaLabel) return ariaLabel;
663
+ if (title) return `${isPlaying ? "Pause" : "Play"} ${title}`;
664
+ return isPlaying ? "Pause audio" : "Play audio";
665
+ };
666
+ const renderPlayButton = () => /* @__PURE__ */ jsx(
667
+ "button",
703
668
  {
704
- "data-slot": "audio-player-rate",
705
- value: playbackRate,
706
- onChange: (e) => setPlaybackRate(Number(e.target.value)),
707
- className: "rounded border border-neutral-200 bg-transparent px-1 py-0.5 text-xs dark:border-neutral-700",
708
- "aria-label": "Playback speed",
709
- children: playbackRates.map((rate) => /* @__PURE__ */ jsxs("option", { value: rate, children: [
710
- rate,
711
- "x"
712
- ] }, rate))
669
+ type: "button",
670
+ "data-slot": "audio-player-play-btn",
671
+ onClick: handlePlay,
672
+ disabled: disabled || isLoading,
673
+ className: cn(playButtonVariants({ variant, size })),
674
+ "aria-label": getAriaLabel(),
675
+ "aria-pressed": isPlaying,
676
+ children: isLoading ? /* @__PURE__ */ jsx(SpinnerIcon, { className: iconSize }) : isPlaying ? /* @__PURE__ */ jsx(PauseIcon, { className: iconSize }) : /* @__PURE__ */ jsx(PlayIcon, { className: iconSize })
713
677
  }
714
678
  );
715
- };
716
- if (variant === "inline") {
679
+ const renderTime = (useHoverTime = false) => {
680
+ if (!showTime) return null;
681
+ const displayTime = useHoverTime && hoverTime !== null ? hoverTime : currentTime;
682
+ const isShowingHoverTime = useHoverTime && hoverTime !== null;
683
+ return /* @__PURE__ */ jsxs(
684
+ "span",
685
+ {
686
+ "data-slot": "audio-player-time",
687
+ className: cn(
688
+ "font-mono text-xs tabular-nums",
689
+ isShowingHoverTime ? "text-primary-800 dark:text-primary-400" : "text-muted-foreground"
690
+ ),
691
+ children: [
692
+ formatTime(displayTime),
693
+ " / ",
694
+ formatTime(displayDuration)
695
+ ]
696
+ }
697
+ );
698
+ };
699
+ const renderPlaybackRateControl = () => {
700
+ if (!showPlaybackRate) return null;
701
+ return /* @__PURE__ */ jsx(
702
+ "select",
703
+ {
704
+ "data-slot": "audio-player-rate",
705
+ value: playbackRate,
706
+ onChange: (e) => setPlaybackRate(Number(e.target.value)),
707
+ className: "rounded border border-neutral-200 bg-transparent px-1 py-0.5 text-xs dark:border-neutral-700",
708
+ "aria-label": "Playback speed",
709
+ children: playbackRates.map((rate) => /* @__PURE__ */ jsxs("option", { value: rate, children: [
710
+ rate,
711
+ "x"
712
+ ] }, rate))
713
+ }
714
+ );
715
+ };
716
+ if (variant === "inline") {
717
+ return /* @__PURE__ */ jsxs(
718
+ "div",
719
+ {
720
+ ref: containerRef,
721
+ "data-slot": "audio-player",
722
+ "data-variant": "inline",
723
+ className: cn(audioPlayerVariants({ variant, size }), className),
724
+ children: [
725
+ renderPlayButton(),
726
+ title && /* @__PURE__ */ jsx(
727
+ "span",
728
+ {
729
+ "data-slot": "audio-player-title",
730
+ className: "text-sm font-medium text-neutral-700 dark:text-neutral-300",
731
+ children: title
732
+ }
733
+ ),
734
+ showDuration && displayDuration > 0 && /* @__PURE__ */ jsx(
735
+ "span",
736
+ {
737
+ "data-slot": "audio-player-duration",
738
+ className: "font-mono text-xs text-neutral-500 tabular-nums dark:text-neutral-400",
739
+ children: isPlaying ? formatTime(currentTime) : formatTime(displayDuration)
740
+ }
741
+ )
742
+ ]
743
+ }
744
+ );
745
+ }
746
+ if (variant === "compact") {
747
+ return /* @__PURE__ */ jsxs(
748
+ "div",
749
+ {
750
+ ref: containerRef,
751
+ "data-slot": "audio-player",
752
+ "data-variant": "compact",
753
+ className: cn(audioPlayerVariants({ variant, size }), className),
754
+ children: [
755
+ renderPlayButton(),
756
+ /* @__PURE__ */ jsx(
757
+ ProgressBar,
758
+ {
759
+ currentTime,
760
+ duration: displayDuration,
761
+ onSeek: handleSeek,
762
+ disabled
763
+ }
764
+ ),
765
+ renderTime(),
766
+ renderPlaybackRateControl()
767
+ ]
768
+ }
769
+ );
770
+ }
717
771
  return /* @__PURE__ */ jsxs(
718
772
  "div",
719
773
  {
720
774
  ref: containerRef,
721
775
  "data-slot": "audio-player",
722
- "data-variant": "inline",
776
+ "data-variant": "waveform",
723
777
  className: cn(audioPlayerVariants({ variant, size }), className),
724
778
  children: [
725
- renderPlayButton(),
726
779
  title && /* @__PURE__ */ jsx(
727
780
  "span",
728
781
  {
@@ -731,98 +784,46 @@ var AudioPlayer = React.forwardRef(function AudioPlayer2({
731
784
  children: title
732
785
  }
733
786
  ),
734
- showDuration && displayDuration > 0 && /* @__PURE__ */ jsx(
735
- "span",
736
- {
737
- "data-slot": "audio-player-duration",
738
- className: "font-mono text-xs text-neutral-500 tabular-nums dark:text-neutral-400",
739
- children: isPlaying ? formatTime(currentTime) : formatTime(displayDuration)
740
- }
741
- )
742
- ]
743
- }
744
- );
745
- }
746
- if (variant === "compact") {
747
- return /* @__PURE__ */ jsxs(
748
- "div",
749
- {
750
- ref: containerRef,
751
- "data-slot": "audio-player",
752
- "data-variant": "compact",
753
- className: cn(audioPlayerVariants({ variant, size }), className),
754
- children: [
755
- renderPlayButton(),
756
787
  /* @__PURE__ */ jsx(
757
- ProgressBar,
788
+ Waveform,
758
789
  {
759
- currentTime,
760
- duration: displayDuration,
761
- onSeek: handleSeek,
762
- disabled
790
+ src,
791
+ isPlaying,
792
+ playbackRate,
793
+ onReady: handleWaveformReady,
794
+ onTimeUpdate: handleWaveformTimeUpdate,
795
+ onFinish: handleWaveformFinish,
796
+ onSeek: handleWaveformSeek,
797
+ waveColor,
798
+ progressColor,
799
+ height: waveformHeight,
800
+ showHoverCursor: showWaveformHoverCursor,
801
+ onHoverTimeChange: handleHoverTimeChange,
802
+ cursorColor: waveformCursorColor,
803
+ waveformRef: waveformMethodsRef
763
804
  }
764
805
  ),
765
- renderTime(),
766
- renderPlaybackRateControl()
806
+ /* @__PURE__ */ jsxs(
807
+ "div",
808
+ {
809
+ "data-slot": "audio-player-controls",
810
+ className: "flex items-center gap-3",
811
+ children: [
812
+ renderPlayButton(),
813
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-1 items-center justify-between", children: [
814
+ renderTime(true),
815
+ renderPlaybackRateControl()
816
+ ] })
817
+ ]
818
+ }
819
+ )
767
820
  ]
768
821
  }
769
822
  );
770
823
  }
771
- return /* @__PURE__ */ jsxs(
772
- "div",
773
- {
774
- ref: containerRef,
775
- "data-slot": "audio-player",
776
- "data-variant": "waveform",
777
- className: cn(audioPlayerVariants({ variant, size }), className),
778
- children: [
779
- title && /* @__PURE__ */ jsx(
780
- "span",
781
- {
782
- "data-slot": "audio-player-title",
783
- className: "text-sm font-medium text-neutral-700 dark:text-neutral-300",
784
- children: title
785
- }
786
- ),
787
- /* @__PURE__ */ jsx(
788
- Waveform,
789
- {
790
- src,
791
- isPlaying,
792
- playbackRate,
793
- onReady: handleWaveformReady,
794
- onTimeUpdate: handleWaveformTimeUpdate,
795
- onFinish: handleWaveformFinish,
796
- onSeek: handleWaveformSeek,
797
- waveColor,
798
- progressColor,
799
- height: waveformHeight,
800
- showHoverCursor: showWaveformHoverCursor,
801
- onHoverTimeChange: handleHoverTimeChange,
802
- cursorColor: waveformCursorColor,
803
- waveformRef: waveformMethodsRef
804
- }
805
- ),
806
- /* @__PURE__ */ jsxs(
807
- "div",
808
- {
809
- "data-slot": "audio-player-controls",
810
- className: "flex items-center gap-3",
811
- children: [
812
- renderPlayButton(),
813
- /* @__PURE__ */ jsxs("div", { className: "flex flex-1 items-center justify-between", children: [
814
- renderTime(true),
815
- renderPlaybackRateControl()
816
- ] })
817
- ]
818
- }
819
- )
820
- ]
821
- }
822
- );
823
- });
824
+ );
824
825
  AudioPlayer.displayName = "AudioPlayer";
825
826
 
826
827
  export { AudioPlayer, ProgressBar, audioPlayerVariants, formatTime, playButtonVariants };
827
- //# sourceMappingURL=chunk-LAR4H7ZG.js.map
828
- //# sourceMappingURL=chunk-LAR4H7ZG.js.map
828
+ //# sourceMappingURL=chunk-WORZLEUZ.js.map
829
+ //# sourceMappingURL=chunk-WORZLEUZ.js.map