@mieweb/ui 0.3.0-dev.73 → 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-GPBQCGKA.cjs → chunk-DT4CHRTJ.cjs} +382 -380
  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-JCHVLSXS.js → chunk-WORZLEUZ.js} +382 -380
  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-GPBQCGKA.cjs.map +0 -1
  132. package/dist/chunk-JCHVLSXS.js.map +0 -1
  133. package/dist/chunk-JE4AH2TZ.cjs.map +0 -1
  134. package/dist/chunk-MOULJE34.js.map +0 -1
  135. package/dist/chunk-PLIK3DN6.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
  )
@@ -404,324 +404,378 @@ function Waveform({
404
404
  }
405
405
  );
406
406
  }
407
- var AudioPlayer = React.forwardRef(function AudioPlayer2({
408
- src,
409
- title,
410
- variant = "compact",
411
- size = "md",
412
- onStateChange,
413
- onEnded,
414
- onError,
415
- onTimeUpdate,
416
- showTime = true,
417
- showDuration = true,
418
- waveColor,
419
- progressColor,
420
- waveformHeight = 64,
421
- showWaveformHoverCursor = true,
422
- waveformCursorColor,
423
- disabled = false,
424
- className,
425
- "aria-label": ariaLabel,
426
- playbackRates = [0.5, 0.75, 1, 1.25, 1.5, 2],
427
- showPlaybackRate = false,
428
- /** Whether to preload audio (set to false for lists with many items) */
429
- preload = false,
430
- /** Fallback duration in seconds to display before audio is loaded */
431
- fallbackDuration
432
- }, ref) {
433
- const [state, setState] = React.useState("idle");
434
- const [currentTime, setCurrentTime] = React.useState(0);
435
- const [duration, setDuration] = React.useState(0);
436
- const [playbackRate, setPlaybackRate] = React.useState(1);
437
- const [audioInitialized, setAudioInitialized] = React.useState(false);
438
- const [hoverTime, setHoverTime] = React.useState(null);
439
- const containerRef = React.useRef(null);
440
- const audioRef = React.useRef(null);
441
- const waveformMethodsRef = React.useRef(null);
442
- const isPlaying = state === "playing";
443
- const isLoading = state === "loading";
444
- const displayDuration = duration > 0 ? duration : fallbackDuration ?? 0;
445
- const updateState = React.useCallback(
446
- (newState) => {
447
- setState(newState);
448
- onStateChange?.(newState);
449
- },
450
- [onStateChange]
451
- );
452
- const initAudio = React.useCallback(() => {
453
- if (variant === "waveform" || audioInitialized) return null;
454
- const audio = new globalThis.Audio(src);
455
- audioRef.current = audio;
456
- setAudioInitialized(true);
457
- audio.addEventListener("loadstart", () => updateState("loading"));
458
- audio.addEventListener("canplay", () => {
459
- updateState("idle");
460
- });
461
- audio.addEventListener("loadedmetadata", () => {
462
- setDuration(audio.duration);
463
- onTimeUpdate?.(audio.currentTime, audio.duration);
464
- });
465
- audio.addEventListener("timeupdate", () => {
466
- setCurrentTime(audio.currentTime);
467
- onTimeUpdate?.(audio.currentTime, audio.duration);
468
- });
469
- audio.addEventListener("ended", () => {
470
- updateState("idle");
471
- setCurrentTime(0);
472
- onEnded?.();
473
- });
474
- audio.addEventListener("error", () => {
475
- updateState("error");
476
- onError?.(new Error("Failed to load audio"));
477
- });
478
- return audio;
479
- }, [
407
+ var AudioPlayer = React.forwardRef(
408
+ function AudioPlayer2({
480
409
  src,
481
- variant,
482
- audioInitialized,
483
- updateState,
484
- onTimeUpdate,
410
+ title,
411
+ variant = "compact",
412
+ size = "md",
413
+ onStateChange,
485
414
  onEnded,
486
- onError
487
- ]);
488
- React.useImperativeHandle(
489
- ref,
490
- () => ({
491
- get container() {
492
- 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);
493
450
  },
494
- seekTo: (time) => {
495
- if (variant === "waveform") {
496
- waveformMethodsRef.current?.seekTo(time);
497
- } else {
498
- if (!audioRef.current) {
499
- 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
+ }
500
505
  }
501
- if (audioRef.current) {
502
- 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
+ }
503
524
  }
504
- }
505
- },
506
- play: () => {
507
- if (variant === "waveform") {
508
- if (waveformMethodsRef.current) {
509
- waveformMethodsRef.current.play();
510
- 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");
511
535
  }
512
- } else {
513
- if (!audioRef.current) {
514
- initAudio();
536
+ },
537
+ getCurrentTime: () => {
538
+ if (variant === "waveform") {
539
+ return waveformMethodsRef.current?.getCurrentTime() ?? 0;
515
540
  }
516
- if (audioRef.current) {
517
- audioRef.current.play().catch((error) => {
518
- updateState("error");
519
- onError?.(error);
520
- });
521
- updateState("playing");
541
+ return audioRef.current?.currentTime ?? 0;
542
+ },
543
+ getDuration: () => {
544
+ if (variant === "waveform") {
545
+ return waveformMethodsRef.current?.getDuration() ?? 0;
522
546
  }
547
+ const rawDuration = audioRef.current?.duration;
548
+ return Number.isFinite(rawDuration) ? rawDuration : 0;
523
549
  }
524
- },
525
- pause: () => {
526
- if (variant === "waveform") {
527
- if (waveformMethodsRef.current) {
528
- waveformMethodsRef.current.pause();
529
- updateState("paused");
530
- }
531
- } 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) {
532
561
  audioRef.current.pause();
533
- updateState("paused");
534
- }
535
- },
536
- getCurrentTime: () => {
537
- if (variant === "waveform") {
538
- return waveformMethodsRef.current?.getCurrentTime() ?? 0;
562
+ audioRef.current.src = "";
539
563
  }
540
- return audioRef.current?.currentTime ?? 0;
541
- },
542
- getDuration: () => {
543
- if (variant === "waveform") {
544
- return waveformMethodsRef.current?.getDuration() ?? 0;
545
- }
546
- const rawDuration = audioRef.current?.duration;
547
- return Number.isFinite(rawDuration) ? rawDuration : 0;
548
- }
549
- }),
550
- [variant, initAudio, updateState, onError]
551
- );
552
- React.useEffect(() => {
553
- if (preload && !audioInitialized && variant !== "waveform") {
554
- initAudio();
555
- }
556
- }, [preload, audioInitialized, variant, initAudio]);
557
- React.useEffect(() => {
558
- return () => {
564
+ };
565
+ }, []);
566
+ React.useEffect(() => {
559
567
  if (audioRef.current) {
560
- audioRef.current.pause();
561
- audioRef.current.src = "";
562
- }
563
- };
564
- }, []);
565
- React.useEffect(() => {
566
- if (audioRef.current) {
567
- audioRef.current.playbackRate = playbackRate;
568
- }
569
- }, [playbackRate]);
570
- const handlePlay = React.useCallback(() => {
571
- if (disabled) return;
572
- if (variant === "waveform") {
573
- if (isLoading) return;
574
- updateState(isPlaying ? "paused" : "playing");
575
- return;
576
- }
577
- if (!audioInitialized && !isLoading) {
578
- const audio = initAudio();
579
- if (audio) {
580
- updateState("loading");
581
- audio.addEventListener(
582
- "canplay",
583
- () => {
584
- audio.play().catch((error) => {
585
- updateState("error");
586
- onError?.(error);
587
- });
588
- updateState("playing");
589
- },
590
- { once: true }
591
- );
568
+ audioRef.current.playbackRate = playbackRate;
592
569
  }
593
- return;
594
- }
595
- if (isLoading) return;
596
- if (isPlaying) {
597
- if (audioRef.current) {
598
- audioRef.current.pause();
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;
599
577
  }
600
- updateState("paused");
601
- } else {
602
- if (audioRef.current) {
603
- audioRef.current.play().catch((error) => {
604
- updateState("error");
605
- onError?.(error);
606
- });
607
- 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;
608
595
  }
609
- }
610
- }, [
611
- disabled,
612
- variant,
613
- audioInitialized,
614
- isLoading,
615
- isPlaying,
616
- initAudio,
617
- updateState,
618
- onError
619
- ]);
620
- const handleSeek = React.useCallback(
621
- (time) => {
622
- if (audioRef.current) {
623
- audioRef.current.currentTime = time;
624
- setCurrentTime(time);
625
- 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
+ }
626
610
  }
627
- },
628
- [onTimeUpdate]
629
- );
630
- const handleWaveformReady = React.useCallback(
631
- (dur) => {
632
- setDuration(dur);
633
- setState("idle");
634
- onTimeUpdate?.(currentTime, dur);
635
- },
636
- [currentTime, onTimeUpdate]
637
- );
638
- const handleWaveformTimeUpdate = React.useCallback(
639
- (time, dur) => {
640
- setCurrentTime(time);
641
- 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) => {
642
633
  setDuration(dur);
643
- }
644
- onTimeUpdate?.(time, dur);
645
- },
646
- [onTimeUpdate]
647
- );
648
- const handleWaveformFinish = React.useCallback(() => {
649
- updateState("idle");
650
- setCurrentTime(0);
651
- onEnded?.();
652
- }, [updateState, onEnded]);
653
- const handleWaveformSeek = React.useCallback((time) => {
654
- setCurrentTime(time);
655
- }, []);
656
- const handleHoverTimeChange = React.useCallback((time) => {
657
- setHoverTime(time);
658
- }, []);
659
- const iconSize = size === "sm" ? "h-3.5 w-3.5" : size === "lg" ? "h-5 w-5" : "h-4 w-4";
660
- const getAriaLabel = () => {
661
- if (ariaLabel) return ariaLabel;
662
- if (title) return `${isPlaying ? "Pause" : "Play"} ${title}`;
663
- return isPlaying ? "Pause audio" : "Play audio";
664
- };
665
- const renderPlayButton = () => /* @__PURE__ */ jsx(
666
- "button",
667
- {
668
- type: "button",
669
- "data-slot": "audio-player-play-btn",
670
- onClick: handlePlay,
671
- disabled: disabled || isLoading,
672
- className: cn(playButtonVariants({ variant, size })),
673
- "aria-label": getAriaLabel(),
674
- "aria-pressed": isPlaying,
675
- children: isLoading ? /* @__PURE__ */ jsx(SpinnerIcon, { className: iconSize }) : isPlaying ? /* @__PURE__ */ jsx(PauseIcon, { className: iconSize }) : /* @__PURE__ */ jsx(PlayIcon, { className: iconSize })
676
- }
677
- );
678
- const renderTime = (useHoverTime = false) => {
679
- if (!showTime) return null;
680
- const displayTime = useHoverTime && hoverTime !== null ? hoverTime : currentTime;
681
- const isShowingHoverTime = useHoverTime && hoverTime !== null;
682
- return /* @__PURE__ */ jsxs(
683
- "span",
684
- {
685
- "data-slot": "audio-player-time",
686
- className: cn(
687
- "font-mono text-xs tabular-nums",
688
- isShowingHoverTime ? "text-primary-600 dark:text-primary-400" : "text-neutral-500 dark:text-neutral-400"
689
- ),
690
- children: [
691
- formatTime(displayTime),
692
- " / ",
693
- formatTime(displayDuration)
694
- ]
695
- }
634
+ setState("idle");
635
+ onTimeUpdate?.(currentTime, dur);
636
+ },
637
+ [currentTime, onTimeUpdate]
696
638
  );
697
- };
698
- const renderPlaybackRateControl = () => {
699
- if (!showPlaybackRate) return null;
700
- return /* @__PURE__ */ jsx(
701
- "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",
702
668
  {
703
- "data-slot": "audio-player-rate",
704
- value: playbackRate,
705
- onChange: (e) => setPlaybackRate(Number(e.target.value)),
706
- className: "rounded border border-neutral-200 bg-transparent px-1 py-0.5 text-xs dark:border-neutral-700",
707
- "aria-label": "Playback speed",
708
- children: playbackRates.map((rate) => /* @__PURE__ */ jsxs("option", { value: rate, children: [
709
- rate,
710
- "x"
711
- ] }, 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 })
712
677
  }
713
678
  );
714
- };
715
- 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
+ }
716
771
  return /* @__PURE__ */ jsxs(
717
772
  "div",
718
773
  {
719
774
  ref: containerRef,
720
775
  "data-slot": "audio-player",
721
- "data-variant": "inline",
776
+ "data-variant": "waveform",
722
777
  className: cn(audioPlayerVariants({ variant, size }), className),
723
778
  children: [
724
- renderPlayButton(),
725
779
  title && /* @__PURE__ */ jsx(
726
780
  "span",
727
781
  {
@@ -730,98 +784,46 @@ var AudioPlayer = React.forwardRef(function AudioPlayer2({
730
784
  children: title
731
785
  }
732
786
  ),
733
- showDuration && displayDuration > 0 && /* @__PURE__ */ jsx(
734
- "span",
735
- {
736
- "data-slot": "audio-player-duration",
737
- className: "font-mono text-xs text-neutral-500 tabular-nums dark:text-neutral-400",
738
- children: isPlaying ? formatTime(currentTime) : formatTime(displayDuration)
739
- }
740
- )
741
- ]
742
- }
743
- );
744
- }
745
- if (variant === "compact") {
746
- return /* @__PURE__ */ jsxs(
747
- "div",
748
- {
749
- ref: containerRef,
750
- "data-slot": "audio-player",
751
- "data-variant": "compact",
752
- className: cn(audioPlayerVariants({ variant, size }), className),
753
- children: [
754
- renderPlayButton(),
755
787
  /* @__PURE__ */ jsx(
756
- ProgressBar,
788
+ Waveform,
757
789
  {
758
- currentTime,
759
- duration: displayDuration,
760
- onSeek: handleSeek,
761
- 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
762
804
  }
763
805
  ),
764
- renderTime(),
765
- 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
+ )
766
820
  ]
767
821
  }
768
822
  );
769
823
  }
770
- return /* @__PURE__ */ jsxs(
771
- "div",
772
- {
773
- ref: containerRef,
774
- "data-slot": "audio-player",
775
- "data-variant": "waveform",
776
- className: cn(audioPlayerVariants({ variant, size }), className),
777
- children: [
778
- title && /* @__PURE__ */ jsx(
779
- "span",
780
- {
781
- "data-slot": "audio-player-title",
782
- className: "text-sm font-medium text-neutral-700 dark:text-neutral-300",
783
- children: title
784
- }
785
- ),
786
- /* @__PURE__ */ jsx(
787
- Waveform,
788
- {
789
- src,
790
- isPlaying,
791
- playbackRate,
792
- onReady: handleWaveformReady,
793
- onTimeUpdate: handleWaveformTimeUpdate,
794
- onFinish: handleWaveformFinish,
795
- onSeek: handleWaveformSeek,
796
- waveColor,
797
- progressColor,
798
- height: waveformHeight,
799
- showHoverCursor: showWaveformHoverCursor,
800
- onHoverTimeChange: handleHoverTimeChange,
801
- cursorColor: waveformCursorColor,
802
- waveformRef: waveformMethodsRef
803
- }
804
- ),
805
- /* @__PURE__ */ jsxs(
806
- "div",
807
- {
808
- "data-slot": "audio-player-controls",
809
- className: "flex items-center gap-3",
810
- children: [
811
- renderPlayButton(),
812
- /* @__PURE__ */ jsxs("div", { className: "flex flex-1 items-center justify-between", children: [
813
- renderTime(true),
814
- renderPlaybackRateControl()
815
- ] })
816
- ]
817
- }
818
- )
819
- ]
820
- }
821
- );
822
- });
824
+ );
823
825
  AudioPlayer.displayName = "AudioPlayer";
824
826
 
825
827
  export { AudioPlayer, ProgressBar, audioPlayerVariants, formatTime, playButtonVariants };
826
- //# sourceMappingURL=chunk-JCHVLSXS.js.map
827
- //# sourceMappingURL=chunk-JCHVLSXS.js.map
828
+ //# sourceMappingURL=chunk-WORZLEUZ.js.map
829
+ //# sourceMappingURL=chunk-WORZLEUZ.js.map