@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
@@ -73,13 +73,13 @@ var playButtonVariants = classVarianceAuthority.cva(
73
73
  "dark:text-neutral-400 dark:hover:text-neutral-200 dark:hover:bg-neutral-800"
74
74
  ],
75
75
  compact: [
76
- "bg-primary-600 text-white",
77
- "hover:bg-primary-700",
76
+ "bg-primary-800 text-white",
77
+ "hover:bg-primary-900",
78
78
  "active:bg-primary-800"
79
79
  ],
80
80
  waveform: [
81
- "bg-primary-600 text-white",
82
- "hover:bg-primary-700",
81
+ "bg-primary-800 text-white",
82
+ "hover:bg-primary-900",
83
83
  "active:bg-primary-800"
84
84
  ]
85
85
  },
@@ -202,14 +202,14 @@ function ProgressBar({
202
202
  /* @__PURE__ */ jsxRuntime.jsx(
203
203
  "div",
204
204
  {
205
- className: "bg-primary-600 absolute inset-y-0 left-0 rounded-full transition-all",
205
+ className: "bg-primary-800 absolute inset-y-0 left-0 rounded-full transition-all",
206
206
  style: { width: `${progress}%` }
207
207
  }
208
208
  ),
209
209
  /* @__PURE__ */ jsxRuntime.jsx(
210
210
  "div",
211
211
  {
212
- className: "bg-primary-600 absolute top-1/2 h-3 w-3 -translate-y-1/2 rounded-full shadow-sm transition-all",
212
+ className: "bg-primary-800 absolute top-1/2 h-3 w-3 -translate-y-1/2 rounded-full shadow-sm transition-all",
213
213
  style: { left: `calc(${progress}% - 6px)` }
214
214
  }
215
215
  )
@@ -295,23 +295,22 @@ function Waveform({
295
295
  normalize: true,
296
296
  interact: !showHoverCursor
297
297
  });
298
+ const emitTimeUpdate = () => {
299
+ onTimeUpdate(
300
+ wavesurferRef.current.getCurrentTime(),
301
+ wavesurferRef.current.getDuration()
302
+ );
303
+ };
298
304
  wavesurferRef.current.on("ready", () => {
299
305
  setIsLoaded(true);
300
306
  const duration = wavesurferRef.current.getDuration();
301
307
  onReady(duration);
302
308
  onTimeUpdate(wavesurferRef.current.getCurrentTime(), duration);
303
309
  });
304
- wavesurferRef.current.on("audioprocess", () => {
305
- onTimeUpdate(
306
- wavesurferRef.current.getCurrentTime(),
307
- wavesurferRef.current.getDuration()
308
- );
309
- });
310
+ wavesurferRef.current.on("timeupdate", emitTimeUpdate);
311
+ wavesurferRef.current.on("audioprocess", emitTimeUpdate);
310
312
  wavesurferRef.current.on("seeking", () => {
311
- onTimeUpdate(
312
- wavesurferRef.current.getCurrentTime(),
313
- wavesurferRef.current.getDuration()
314
- );
313
+ emitTimeUpdate();
315
314
  });
316
315
  if (!showHoverCursor) {
317
316
  wavesurferRef.current.on("interaction", () => {
@@ -427,324 +426,378 @@ function Waveform({
427
426
  }
428
427
  );
429
428
  }
430
- var AudioPlayer = React__namespace.forwardRef(function AudioPlayer2({
431
- src,
432
- title,
433
- variant = "compact",
434
- size = "md",
435
- onStateChange,
436
- onEnded,
437
- onError,
438
- onTimeUpdate,
439
- showTime = true,
440
- showDuration = true,
441
- waveColor,
442
- progressColor,
443
- waveformHeight = 64,
444
- showWaveformHoverCursor = true,
445
- waveformCursorColor,
446
- disabled = false,
447
- className,
448
- "aria-label": ariaLabel,
449
- playbackRates = [0.5, 0.75, 1, 1.25, 1.5, 2],
450
- showPlaybackRate = false,
451
- /** Whether to preload audio (set to false for lists with many items) */
452
- preload = false,
453
- /** Fallback duration in seconds to display before audio is loaded */
454
- fallbackDuration
455
- }, ref) {
456
- const [state, setState] = React__namespace.useState("idle");
457
- const [currentTime, setCurrentTime] = React__namespace.useState(0);
458
- const [duration, setDuration] = React__namespace.useState(0);
459
- const [playbackRate, setPlaybackRate] = React__namespace.useState(1);
460
- const [audioInitialized, setAudioInitialized] = React__namespace.useState(false);
461
- const [hoverTime, setHoverTime] = React__namespace.useState(null);
462
- const containerRef = React__namespace.useRef(null);
463
- const audioRef = React__namespace.useRef(null);
464
- const waveformMethodsRef = React__namespace.useRef(null);
465
- const isPlaying = state === "playing";
466
- const isLoading = state === "loading";
467
- const displayDuration = duration > 0 ? duration : fallbackDuration ?? 0;
468
- const updateState = React__namespace.useCallback(
469
- (newState) => {
470
- setState(newState);
471
- onStateChange?.(newState);
472
- },
473
- [onStateChange]
474
- );
475
- const initAudio = React__namespace.useCallback(() => {
476
- if (variant === "waveform" || audioInitialized) return null;
477
- const audio = new globalThis.Audio(src);
478
- audioRef.current = audio;
479
- setAudioInitialized(true);
480
- audio.addEventListener("loadstart", () => updateState("loading"));
481
- audio.addEventListener("canplay", () => {
482
- updateState("idle");
483
- });
484
- audio.addEventListener("loadedmetadata", () => {
485
- setDuration(audio.duration);
486
- onTimeUpdate?.(audio.currentTime, audio.duration);
487
- });
488
- audio.addEventListener("timeupdate", () => {
489
- setCurrentTime(audio.currentTime);
490
- onTimeUpdate?.(audio.currentTime, audio.duration);
491
- });
492
- audio.addEventListener("ended", () => {
493
- updateState("idle");
494
- setCurrentTime(0);
495
- onEnded?.();
496
- });
497
- audio.addEventListener("error", () => {
498
- updateState("error");
499
- onError?.(new Error("Failed to load audio"));
500
- });
501
- return audio;
502
- }, [
429
+ var AudioPlayer = React__namespace.forwardRef(
430
+ function AudioPlayer2({
503
431
  src,
504
- variant,
505
- audioInitialized,
506
- updateState,
507
- onTimeUpdate,
432
+ title,
433
+ variant = "compact",
434
+ size = "md",
435
+ onStateChange,
508
436
  onEnded,
509
- onError
510
- ]);
511
- React__namespace.useImperativeHandle(
512
- ref,
513
- () => ({
514
- get container() {
515
- return containerRef.current;
437
+ onError,
438
+ onTimeUpdate,
439
+ showTime = true,
440
+ showDuration = true,
441
+ waveColor,
442
+ progressColor,
443
+ waveformHeight = 64,
444
+ showWaveformHoverCursor = true,
445
+ waveformCursorColor,
446
+ disabled = false,
447
+ className,
448
+ "aria-label": ariaLabel,
449
+ playbackRates = [0.5, 0.75, 1, 1.25, 1.5, 2],
450
+ showPlaybackRate = false,
451
+ /** Whether to preload audio (set to false for lists with many items) */
452
+ preload = false,
453
+ /** Fallback duration in seconds to display before audio is loaded */
454
+ fallbackDuration
455
+ }, ref) {
456
+ const [state, setState] = React__namespace.useState("idle");
457
+ const [currentTime, setCurrentTime] = React__namespace.useState(0);
458
+ const [duration, setDuration] = React__namespace.useState(0);
459
+ const [playbackRate, setPlaybackRate] = React__namespace.useState(1);
460
+ const [audioInitialized, setAudioInitialized] = React__namespace.useState(false);
461
+ const [hoverTime, setHoverTime] = React__namespace.useState(null);
462
+ const containerRef = React__namespace.useRef(null);
463
+ const audioRef = React__namespace.useRef(null);
464
+ const waveformMethodsRef = React__namespace.useRef(null);
465
+ const isPlaying = state === "playing";
466
+ const isLoading = state === "loading";
467
+ const displayDuration = duration > 0 ? duration : fallbackDuration ?? 0;
468
+ const updateState = React__namespace.useCallback(
469
+ (newState) => {
470
+ setState(newState);
471
+ onStateChange?.(newState);
516
472
  },
517
- seekTo: (time) => {
518
- if (variant === "waveform") {
519
- waveformMethodsRef.current?.seekTo(time);
520
- } else {
521
- if (!audioRef.current) {
522
- initAudio();
473
+ [onStateChange]
474
+ );
475
+ const initAudio = React__namespace.useCallback(() => {
476
+ if (variant === "waveform" || audioInitialized) return null;
477
+ const audio = new globalThis.Audio(src);
478
+ audioRef.current = audio;
479
+ setAudioInitialized(true);
480
+ audio.addEventListener("loadstart", () => updateState("loading"));
481
+ audio.addEventListener("canplay", () => {
482
+ updateState("idle");
483
+ });
484
+ audio.addEventListener("loadedmetadata", () => {
485
+ setDuration(audio.duration);
486
+ onTimeUpdate?.(audio.currentTime, audio.duration);
487
+ });
488
+ audio.addEventListener("timeupdate", () => {
489
+ setCurrentTime(audio.currentTime);
490
+ onTimeUpdate?.(audio.currentTime, audio.duration);
491
+ });
492
+ audio.addEventListener("ended", () => {
493
+ updateState("idle");
494
+ setCurrentTime(0);
495
+ onEnded?.();
496
+ });
497
+ audio.addEventListener("error", () => {
498
+ updateState("error");
499
+ onError?.(new Error("Failed to load audio"));
500
+ });
501
+ return audio;
502
+ }, [
503
+ src,
504
+ variant,
505
+ audioInitialized,
506
+ updateState,
507
+ onTimeUpdate,
508
+ onEnded,
509
+ onError
510
+ ]);
511
+ React__namespace.useImperativeHandle(
512
+ ref,
513
+ () => ({
514
+ get container() {
515
+ return containerRef.current;
516
+ },
517
+ seekTo: (time) => {
518
+ if (variant === "waveform") {
519
+ waveformMethodsRef.current?.seekTo(time);
520
+ } else {
521
+ if (!audioRef.current) {
522
+ initAudio();
523
+ }
524
+ if (audioRef.current) {
525
+ audioRef.current.currentTime = time;
526
+ }
523
527
  }
524
- if (audioRef.current) {
525
- audioRef.current.currentTime = time;
528
+ },
529
+ play: () => {
530
+ if (variant === "waveform") {
531
+ if (waveformMethodsRef.current) {
532
+ waveformMethodsRef.current.play();
533
+ updateState("playing");
534
+ }
535
+ } else {
536
+ if (!audioRef.current) {
537
+ initAudio();
538
+ }
539
+ if (audioRef.current) {
540
+ audioRef.current.play().catch((error) => {
541
+ updateState("error");
542
+ onError?.(error);
543
+ });
544
+ updateState("playing");
545
+ }
526
546
  }
527
- }
528
- },
529
- play: () => {
530
- if (variant === "waveform") {
531
- if (waveformMethodsRef.current) {
532
- waveformMethodsRef.current.play();
533
- updateState("playing");
547
+ },
548
+ pause: () => {
549
+ if (variant === "waveform") {
550
+ if (waveformMethodsRef.current) {
551
+ waveformMethodsRef.current.pause();
552
+ updateState("paused");
553
+ }
554
+ } else if (audioRef.current) {
555
+ audioRef.current.pause();
556
+ updateState("paused");
534
557
  }
535
- } else {
536
- if (!audioRef.current) {
537
- initAudio();
558
+ },
559
+ getCurrentTime: () => {
560
+ if (variant === "waveform") {
561
+ return waveformMethodsRef.current?.getCurrentTime() ?? 0;
538
562
  }
539
- if (audioRef.current) {
540
- audioRef.current.play().catch((error) => {
541
- updateState("error");
542
- onError?.(error);
543
- });
544
- updateState("playing");
563
+ return audioRef.current?.currentTime ?? 0;
564
+ },
565
+ getDuration: () => {
566
+ if (variant === "waveform") {
567
+ return waveformMethodsRef.current?.getDuration() ?? 0;
545
568
  }
569
+ const rawDuration = audioRef.current?.duration;
570
+ return Number.isFinite(rawDuration) ? rawDuration : 0;
546
571
  }
547
- },
548
- pause: () => {
549
- if (variant === "waveform") {
550
- if (waveformMethodsRef.current) {
551
- waveformMethodsRef.current.pause();
552
- updateState("paused");
553
- }
554
- } else if (audioRef.current) {
572
+ }),
573
+ [variant, initAudio, updateState, onError]
574
+ );
575
+ React__namespace.useEffect(() => {
576
+ if (preload && !audioInitialized && variant !== "waveform") {
577
+ initAudio();
578
+ }
579
+ }, [preload, audioInitialized, variant, initAudio]);
580
+ React__namespace.useEffect(() => {
581
+ return () => {
582
+ if (audioRef.current) {
555
583
  audioRef.current.pause();
556
- updateState("paused");
584
+ audioRef.current.src = "";
557
585
  }
558
- },
559
- getCurrentTime: () => {
560
- if (variant === "waveform") {
561
- return waveformMethodsRef.current?.getCurrentTime() ?? 0;
562
- }
563
- return audioRef.current?.currentTime ?? 0;
564
- },
565
- getDuration: () => {
566
- if (variant === "waveform") {
567
- return waveformMethodsRef.current?.getDuration() ?? 0;
568
- }
569
- const rawDuration = audioRef.current?.duration;
570
- return Number.isFinite(rawDuration) ? rawDuration : 0;
571
- }
572
- }),
573
- [variant, initAudio, updateState, onError]
574
- );
575
- React__namespace.useEffect(() => {
576
- if (preload && !audioInitialized && variant !== "waveform") {
577
- initAudio();
578
- }
579
- }, [preload, audioInitialized, variant, initAudio]);
580
- React__namespace.useEffect(() => {
581
- return () => {
586
+ };
587
+ }, []);
588
+ React__namespace.useEffect(() => {
582
589
  if (audioRef.current) {
583
- audioRef.current.pause();
584
- audioRef.current.src = "";
590
+ audioRef.current.playbackRate = playbackRate;
585
591
  }
586
- };
587
- }, []);
588
- React__namespace.useEffect(() => {
589
- if (audioRef.current) {
590
- audioRef.current.playbackRate = playbackRate;
591
- }
592
- }, [playbackRate]);
593
- const handlePlay = React__namespace.useCallback(() => {
594
- if (disabled) return;
595
- if (variant === "waveform") {
596
- if (isLoading) return;
597
- updateState(isPlaying ? "paused" : "playing");
598
- return;
599
- }
600
- if (!audioInitialized && !isLoading) {
601
- const audio = initAudio();
602
- if (audio) {
603
- updateState("loading");
604
- audio.addEventListener(
605
- "canplay",
606
- () => {
607
- audio.play().catch((error) => {
608
- updateState("error");
609
- onError?.(error);
610
- });
611
- updateState("playing");
612
- },
613
- { once: true }
614
- );
615
- }
616
- return;
617
- }
618
- if (isLoading) return;
619
- if (isPlaying) {
620
- if (audioRef.current) {
621
- audioRef.current.pause();
592
+ }, [playbackRate]);
593
+ const handlePlay = React__namespace.useCallback(() => {
594
+ if (disabled) return;
595
+ if (variant === "waveform") {
596
+ if (isLoading) return;
597
+ updateState(isPlaying ? "paused" : "playing");
598
+ return;
622
599
  }
623
- updateState("paused");
624
- } else {
625
- if (audioRef.current) {
626
- audioRef.current.play().catch((error) => {
627
- updateState("error");
628
- onError?.(error);
629
- });
630
- updateState("playing");
600
+ if (!audioInitialized && !isLoading) {
601
+ const audio = initAudio();
602
+ if (audio) {
603
+ updateState("loading");
604
+ audio.addEventListener(
605
+ "canplay",
606
+ () => {
607
+ audio.play().catch((error) => {
608
+ updateState("error");
609
+ onError?.(error);
610
+ });
611
+ updateState("playing");
612
+ },
613
+ { once: true }
614
+ );
615
+ }
616
+ return;
631
617
  }
632
- }
633
- }, [
634
- disabled,
635
- variant,
636
- audioInitialized,
637
- isLoading,
638
- isPlaying,
639
- initAudio,
640
- updateState,
641
- onError
642
- ]);
643
- const handleSeek = React__namespace.useCallback(
644
- (time) => {
645
- if (audioRef.current) {
646
- audioRef.current.currentTime = time;
647
- setCurrentTime(time);
648
- onTimeUpdate?.(time, audioRef.current.duration);
618
+ if (isLoading) return;
619
+ if (isPlaying) {
620
+ if (audioRef.current) {
621
+ audioRef.current.pause();
622
+ }
623
+ updateState("paused");
624
+ } else {
625
+ if (audioRef.current) {
626
+ audioRef.current.play().catch((error) => {
627
+ updateState("error");
628
+ onError?.(error);
629
+ });
630
+ updateState("playing");
631
+ }
649
632
  }
650
- },
651
- [onTimeUpdate]
652
- );
653
- const handleWaveformReady = React__namespace.useCallback(
654
- (dur) => {
655
- setDuration(dur);
656
- setState("idle");
657
- onTimeUpdate?.(currentTime, dur);
658
- },
659
- [currentTime, onTimeUpdate]
660
- );
661
- const handleWaveformTimeUpdate = React__namespace.useCallback(
662
- (time, dur) => {
663
- setCurrentTime(time);
664
- if (dur > 0) {
633
+ }, [
634
+ disabled,
635
+ variant,
636
+ audioInitialized,
637
+ isLoading,
638
+ isPlaying,
639
+ initAudio,
640
+ updateState,
641
+ onError
642
+ ]);
643
+ const handleSeek = React__namespace.useCallback(
644
+ (time) => {
645
+ if (audioRef.current) {
646
+ audioRef.current.currentTime = time;
647
+ setCurrentTime(time);
648
+ onTimeUpdate?.(time, audioRef.current.duration);
649
+ }
650
+ },
651
+ [onTimeUpdate]
652
+ );
653
+ const handleWaveformReady = React__namespace.useCallback(
654
+ (dur) => {
665
655
  setDuration(dur);
666
- }
667
- onTimeUpdate?.(time, dur);
668
- },
669
- [onTimeUpdate]
670
- );
671
- const handleWaveformFinish = React__namespace.useCallback(() => {
672
- updateState("idle");
673
- setCurrentTime(0);
674
- onEnded?.();
675
- }, [updateState, onEnded]);
676
- const handleWaveformSeek = React__namespace.useCallback((time) => {
677
- setCurrentTime(time);
678
- }, []);
679
- const handleHoverTimeChange = React__namespace.useCallback((time) => {
680
- setHoverTime(time);
681
- }, []);
682
- const iconSize = size === "sm" ? "h-3.5 w-3.5" : size === "lg" ? "h-5 w-5" : "h-4 w-4";
683
- const getAriaLabel = () => {
684
- if (ariaLabel) return ariaLabel;
685
- if (title) return `${isPlaying ? "Pause" : "Play"} ${title}`;
686
- return isPlaying ? "Pause audio" : "Play audio";
687
- };
688
- const renderPlayButton = () => /* @__PURE__ */ jsxRuntime.jsx(
689
- "button",
690
- {
691
- type: "button",
692
- "data-slot": "audio-player-play-btn",
693
- onClick: handlePlay,
694
- disabled: disabled || isLoading,
695
- className: chunkOR5DRJCW_cjs.cn(playButtonVariants({ variant, size })),
696
- "aria-label": getAriaLabel(),
697
- "aria-pressed": isPlaying,
698
- children: isLoading ? /* @__PURE__ */ jsxRuntime.jsx(SpinnerIcon, { className: iconSize }) : isPlaying ? /* @__PURE__ */ jsxRuntime.jsx(PauseIcon, { className: iconSize }) : /* @__PURE__ */ jsxRuntime.jsx(PlayIcon, { className: iconSize })
699
- }
700
- );
701
- const renderTime = (useHoverTime = false) => {
702
- if (!showTime) return null;
703
- const displayTime = useHoverTime && hoverTime !== null ? hoverTime : currentTime;
704
- const isShowingHoverTime = useHoverTime && hoverTime !== null;
705
- return /* @__PURE__ */ jsxRuntime.jsxs(
706
- "span",
707
- {
708
- "data-slot": "audio-player-time",
709
- className: chunkOR5DRJCW_cjs.cn(
710
- "font-mono text-xs tabular-nums",
711
- isShowingHoverTime ? "text-primary-600 dark:text-primary-400" : "text-neutral-500 dark:text-neutral-400"
712
- ),
713
- children: [
714
- formatTime(displayTime),
715
- " / ",
716
- formatTime(displayDuration)
717
- ]
718
- }
656
+ setState("idle");
657
+ onTimeUpdate?.(currentTime, dur);
658
+ },
659
+ [currentTime, onTimeUpdate]
719
660
  );
720
- };
721
- const renderPlaybackRateControl = () => {
722
- if (!showPlaybackRate) return null;
723
- return /* @__PURE__ */ jsxRuntime.jsx(
724
- "select",
661
+ const handleWaveformTimeUpdate = React__namespace.useCallback(
662
+ (time, dur) => {
663
+ setCurrentTime(time);
664
+ if (dur > 0) {
665
+ setDuration(dur);
666
+ }
667
+ onTimeUpdate?.(time, dur);
668
+ },
669
+ [onTimeUpdate]
670
+ );
671
+ const handleWaveformFinish = React__namespace.useCallback(() => {
672
+ updateState("idle");
673
+ setCurrentTime(0);
674
+ onEnded?.();
675
+ }, [updateState, onEnded]);
676
+ const handleWaveformSeek = React__namespace.useCallback((time) => {
677
+ setCurrentTime(time);
678
+ }, []);
679
+ const handleHoverTimeChange = React__namespace.useCallback((time) => {
680
+ setHoverTime(time);
681
+ }, []);
682
+ const iconSize = size === "sm" ? "h-3.5 w-3.5" : size === "lg" ? "h-5 w-5" : "h-4 w-4";
683
+ const getAriaLabel = () => {
684
+ if (ariaLabel) return ariaLabel;
685
+ if (title) return `${isPlaying ? "Pause" : "Play"} ${title}`;
686
+ return isPlaying ? "Pause audio" : "Play audio";
687
+ };
688
+ const renderPlayButton = () => /* @__PURE__ */ jsxRuntime.jsx(
689
+ "button",
725
690
  {
726
- "data-slot": "audio-player-rate",
727
- value: playbackRate,
728
- onChange: (e) => setPlaybackRate(Number(e.target.value)),
729
- className: "rounded border border-neutral-200 bg-transparent px-1 py-0.5 text-xs dark:border-neutral-700",
730
- "aria-label": "Playback speed",
731
- children: playbackRates.map((rate) => /* @__PURE__ */ jsxRuntime.jsxs("option", { value: rate, children: [
732
- rate,
733
- "x"
734
- ] }, rate))
691
+ type: "button",
692
+ "data-slot": "audio-player-play-btn",
693
+ onClick: handlePlay,
694
+ disabled: disabled || isLoading,
695
+ className: chunkOR5DRJCW_cjs.cn(playButtonVariants({ variant, size })),
696
+ "aria-label": getAriaLabel(),
697
+ "aria-pressed": isPlaying,
698
+ children: isLoading ? /* @__PURE__ */ jsxRuntime.jsx(SpinnerIcon, { className: iconSize }) : isPlaying ? /* @__PURE__ */ jsxRuntime.jsx(PauseIcon, { className: iconSize }) : /* @__PURE__ */ jsxRuntime.jsx(PlayIcon, { className: iconSize })
735
699
  }
736
700
  );
737
- };
738
- if (variant === "inline") {
701
+ const renderTime = (useHoverTime = false) => {
702
+ if (!showTime) return null;
703
+ const displayTime = useHoverTime && hoverTime !== null ? hoverTime : currentTime;
704
+ const isShowingHoverTime = useHoverTime && hoverTime !== null;
705
+ return /* @__PURE__ */ jsxRuntime.jsxs(
706
+ "span",
707
+ {
708
+ "data-slot": "audio-player-time",
709
+ className: chunkOR5DRJCW_cjs.cn(
710
+ "font-mono text-xs tabular-nums",
711
+ isShowingHoverTime ? "text-primary-800 dark:text-primary-400" : "text-muted-foreground"
712
+ ),
713
+ children: [
714
+ formatTime(displayTime),
715
+ " / ",
716
+ formatTime(displayDuration)
717
+ ]
718
+ }
719
+ );
720
+ };
721
+ const renderPlaybackRateControl = () => {
722
+ if (!showPlaybackRate) return null;
723
+ return /* @__PURE__ */ jsxRuntime.jsx(
724
+ "select",
725
+ {
726
+ "data-slot": "audio-player-rate",
727
+ value: playbackRate,
728
+ onChange: (e) => setPlaybackRate(Number(e.target.value)),
729
+ className: "rounded border border-neutral-200 bg-transparent px-1 py-0.5 text-xs dark:border-neutral-700",
730
+ "aria-label": "Playback speed",
731
+ children: playbackRates.map((rate) => /* @__PURE__ */ jsxRuntime.jsxs("option", { value: rate, children: [
732
+ rate,
733
+ "x"
734
+ ] }, rate))
735
+ }
736
+ );
737
+ };
738
+ if (variant === "inline") {
739
+ return /* @__PURE__ */ jsxRuntime.jsxs(
740
+ "div",
741
+ {
742
+ ref: containerRef,
743
+ "data-slot": "audio-player",
744
+ "data-variant": "inline",
745
+ className: chunkOR5DRJCW_cjs.cn(audioPlayerVariants({ variant, size }), className),
746
+ children: [
747
+ renderPlayButton(),
748
+ title && /* @__PURE__ */ jsxRuntime.jsx(
749
+ "span",
750
+ {
751
+ "data-slot": "audio-player-title",
752
+ className: "text-sm font-medium text-neutral-700 dark:text-neutral-300",
753
+ children: title
754
+ }
755
+ ),
756
+ showDuration && displayDuration > 0 && /* @__PURE__ */ jsxRuntime.jsx(
757
+ "span",
758
+ {
759
+ "data-slot": "audio-player-duration",
760
+ className: "font-mono text-xs text-neutral-500 tabular-nums dark:text-neutral-400",
761
+ children: isPlaying ? formatTime(currentTime) : formatTime(displayDuration)
762
+ }
763
+ )
764
+ ]
765
+ }
766
+ );
767
+ }
768
+ if (variant === "compact") {
769
+ return /* @__PURE__ */ jsxRuntime.jsxs(
770
+ "div",
771
+ {
772
+ ref: containerRef,
773
+ "data-slot": "audio-player",
774
+ "data-variant": "compact",
775
+ className: chunkOR5DRJCW_cjs.cn(audioPlayerVariants({ variant, size }), className),
776
+ children: [
777
+ renderPlayButton(),
778
+ /* @__PURE__ */ jsxRuntime.jsx(
779
+ ProgressBar,
780
+ {
781
+ currentTime,
782
+ duration: displayDuration,
783
+ onSeek: handleSeek,
784
+ disabled
785
+ }
786
+ ),
787
+ renderTime(),
788
+ renderPlaybackRateControl()
789
+ ]
790
+ }
791
+ );
792
+ }
739
793
  return /* @__PURE__ */ jsxRuntime.jsxs(
740
794
  "div",
741
795
  {
742
796
  ref: containerRef,
743
797
  "data-slot": "audio-player",
744
- "data-variant": "inline",
798
+ "data-variant": "waveform",
745
799
  className: chunkOR5DRJCW_cjs.cn(audioPlayerVariants({ variant, size }), className),
746
800
  children: [
747
- renderPlayButton(),
748
801
  title && /* @__PURE__ */ jsxRuntime.jsx(
749
802
  "span",
750
803
  {
@@ -753,96 +806,44 @@ var AudioPlayer = React__namespace.forwardRef(function AudioPlayer2({
753
806
  children: title
754
807
  }
755
808
  ),
756
- showDuration && displayDuration > 0 && /* @__PURE__ */ jsxRuntime.jsx(
757
- "span",
758
- {
759
- "data-slot": "audio-player-duration",
760
- className: "font-mono text-xs text-neutral-500 tabular-nums dark:text-neutral-400",
761
- children: isPlaying ? formatTime(currentTime) : formatTime(displayDuration)
762
- }
763
- )
764
- ]
765
- }
766
- );
767
- }
768
- if (variant === "compact") {
769
- return /* @__PURE__ */ jsxRuntime.jsxs(
770
- "div",
771
- {
772
- ref: containerRef,
773
- "data-slot": "audio-player",
774
- "data-variant": "compact",
775
- className: chunkOR5DRJCW_cjs.cn(audioPlayerVariants({ variant, size }), className),
776
- children: [
777
- renderPlayButton(),
778
809
  /* @__PURE__ */ jsxRuntime.jsx(
779
- ProgressBar,
810
+ Waveform,
780
811
  {
781
- currentTime,
782
- duration: displayDuration,
783
- onSeek: handleSeek,
784
- disabled
812
+ src,
813
+ isPlaying,
814
+ playbackRate,
815
+ onReady: handleWaveformReady,
816
+ onTimeUpdate: handleWaveformTimeUpdate,
817
+ onFinish: handleWaveformFinish,
818
+ onSeek: handleWaveformSeek,
819
+ waveColor,
820
+ progressColor,
821
+ height: waveformHeight,
822
+ showHoverCursor: showWaveformHoverCursor,
823
+ onHoverTimeChange: handleHoverTimeChange,
824
+ cursorColor: waveformCursorColor,
825
+ waveformRef: waveformMethodsRef
785
826
  }
786
827
  ),
787
- renderTime(),
788
- renderPlaybackRateControl()
828
+ /* @__PURE__ */ jsxRuntime.jsxs(
829
+ "div",
830
+ {
831
+ "data-slot": "audio-player-controls",
832
+ className: "flex items-center gap-3",
833
+ children: [
834
+ renderPlayButton(),
835
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 items-center justify-between", children: [
836
+ renderTime(true),
837
+ renderPlaybackRateControl()
838
+ ] })
839
+ ]
840
+ }
841
+ )
789
842
  ]
790
843
  }
791
844
  );
792
845
  }
793
- return /* @__PURE__ */ jsxRuntime.jsxs(
794
- "div",
795
- {
796
- ref: containerRef,
797
- "data-slot": "audio-player",
798
- "data-variant": "waveform",
799
- className: chunkOR5DRJCW_cjs.cn(audioPlayerVariants({ variant, size }), className),
800
- children: [
801
- title && /* @__PURE__ */ jsxRuntime.jsx(
802
- "span",
803
- {
804
- "data-slot": "audio-player-title",
805
- className: "text-sm font-medium text-neutral-700 dark:text-neutral-300",
806
- children: title
807
- }
808
- ),
809
- /* @__PURE__ */ jsxRuntime.jsx(
810
- Waveform,
811
- {
812
- src,
813
- isPlaying,
814
- playbackRate,
815
- onReady: handleWaveformReady,
816
- onTimeUpdate: handleWaveformTimeUpdate,
817
- onFinish: handleWaveformFinish,
818
- onSeek: handleWaveformSeek,
819
- waveColor,
820
- progressColor,
821
- height: waveformHeight,
822
- showHoverCursor: showWaveformHoverCursor,
823
- onHoverTimeChange: handleHoverTimeChange,
824
- cursorColor: waveformCursorColor,
825
- waveformRef: waveformMethodsRef
826
- }
827
- ),
828
- /* @__PURE__ */ jsxRuntime.jsxs(
829
- "div",
830
- {
831
- "data-slot": "audio-player-controls",
832
- className: "flex items-center gap-3",
833
- children: [
834
- renderPlayButton(),
835
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 items-center justify-between", children: [
836
- renderTime(true),
837
- renderPlaybackRateControl()
838
- ] })
839
- ]
840
- }
841
- )
842
- ]
843
- }
844
- );
845
- });
846
+ );
846
847
  AudioPlayer.displayName = "AudioPlayer";
847
848
 
848
849
  exports.AudioPlayer = AudioPlayer;
@@ -850,5 +851,5 @@ exports.ProgressBar = ProgressBar;
850
851
  exports.audioPlayerVariants = audioPlayerVariants;
851
852
  exports.formatTime = formatTime;
852
853
  exports.playButtonVariants = playButtonVariants;
853
- //# sourceMappingURL=chunk-PRTQVKDW.cjs.map
854
- //# sourceMappingURL=chunk-PRTQVKDW.cjs.map
854
+ //# sourceMappingURL=chunk-DT4CHRTJ.cjs.map
855
+ //# sourceMappingURL=chunk-DT4CHRTJ.cjs.map