@mieweb/ui 0.11.0-dev.36 → 0.11.0-dev.37

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 (100) hide show
  1. package/agent/skills/mieweb-ui-catalog/SKILL.md +5 -3
  2. package/agent/skills/mieweb-ui-catalog/selection-guidance.md +6 -3
  3. package/dist/{chunk-TUYWCUKH.js → chunk-4LKAZW2W.js} +7 -3
  4. package/dist/chunk-4LKAZW2W.js.map +1 -0
  5. package/dist/{chunk-MNXIN4MS.js → chunk-5WA6IYZD.js} +60 -2
  6. package/dist/chunk-5WA6IYZD.js.map +1 -0
  7. package/dist/{chunk-DT3X3RBM.js → chunk-7U7SONM5.js} +3 -3
  8. package/dist/{chunk-DT3X3RBM.js.map → chunk-7U7SONM5.js.map} +1 -1
  9. package/dist/{chunk-OGFSFUIX.cjs → chunk-AHYDJN4H.cjs} +501 -120
  10. package/dist/chunk-AHYDJN4H.cjs.map +1 -0
  11. package/dist/{chunk-C4GEPUE7.js → chunk-CKECOCYJ.js} +2 -2
  12. package/dist/{chunk-C4GEPUE7.js.map → chunk-CKECOCYJ.js.map} +1 -1
  13. package/dist/{chunk-V5VPECJI.js → chunk-CRR7AE5D.js} +11 -7
  14. package/dist/chunk-CRR7AE5D.js.map +1 -0
  15. package/dist/chunk-D3FNZMOB.cjs +4 -0
  16. package/dist/{chunk-GLXTVCHN.cjs.map → chunk-D3FNZMOB.cjs.map} +1 -1
  17. package/dist/{chunk-ZK2R6UGF.cjs → chunk-DCV34MEF.cjs} +4 -4
  18. package/dist/{chunk-ZK2R6UGF.cjs.map → chunk-DCV34MEF.cjs.map} +1 -1
  19. package/dist/chunk-G4VQEQGW.js +3 -0
  20. package/dist/{chunk-RISZWWEQ.js.map → chunk-G4VQEQGW.js.map} +1 -1
  21. package/dist/{chunk-S3LTUSO5.cjs → chunk-GG3IK5TL.cjs} +7 -7
  22. package/dist/{chunk-S3LTUSO5.cjs.map → chunk-GG3IK5TL.cjs.map} +1 -1
  23. package/dist/{chunk-QHCAWDMG.cjs → chunk-HDZQLTBP.cjs} +7 -3
  24. package/dist/chunk-HDZQLTBP.cjs.map +1 -0
  25. package/dist/chunk-JCIQIR5V.js +546 -0
  26. package/dist/chunk-JCIQIR5V.js.map +1 -0
  27. package/dist/{chunk-AIO2GCTL.js → chunk-JUY2JLFL.js} +501 -120
  28. package/dist/chunk-JUY2JLFL.js.map +1 -0
  29. package/dist/{chunk-2S76TRBJ.cjs → chunk-JUYBJLPI.cjs} +4 -4
  30. package/dist/{chunk-2S76TRBJ.cjs.map → chunk-JUYBJLPI.cjs.map} +1 -1
  31. package/dist/{chunk-UDUYZDTA.js → chunk-JWMMWNTT.js} +3 -3
  32. package/dist/{chunk-UDUYZDTA.js.map → chunk-JWMMWNTT.js.map} +1 -1
  33. package/dist/{chunk-RM4CBS7Y.js → chunk-LQ22CY7X.js} +4 -4
  34. package/dist/{chunk-RM4CBS7Y.js.map → chunk-LQ22CY7X.js.map} +1 -1
  35. package/dist/{chunk-AKMTPCLC.cjs → chunk-LTCHD3K5.cjs} +2 -2
  36. package/dist/{chunk-AKMTPCLC.cjs.map → chunk-LTCHD3K5.cjs.map} +1 -1
  37. package/dist/{chunk-GDKOYVX3.cjs → chunk-NZUQL42A.cjs} +11 -7
  38. package/dist/chunk-NZUQL42A.cjs.map +1 -0
  39. package/dist/chunk-QAEAC7HO.cjs +4 -0
  40. package/dist/chunk-QAEAC7HO.cjs.map +1 -0
  41. package/dist/chunk-SCGXD334.js +3 -0
  42. package/dist/chunk-SCGXD334.js.map +1 -0
  43. package/dist/chunk-TZKBW4GA.cjs +578 -0
  44. package/dist/chunk-TZKBW4GA.cjs.map +1 -0
  45. package/dist/{chunk-47AOS5EC.cjs → chunk-XX6PNPF2.cjs} +60 -2
  46. package/dist/chunk-XX6PNPF2.cjs.map +1 -0
  47. package/dist/components/AudioPlayer/index.cjs +7 -6
  48. package/dist/components/AudioPlayer/index.js +2 -1
  49. package/dist/components/MediaEditor/index.cjs +10 -9
  50. package/dist/components/MediaEditor/index.js +5 -4
  51. package/dist/components/MediaFeed/index.cjs +8 -5
  52. package/dist/components/MediaFeed/index.d.cts +33 -0
  53. package/dist/components/MediaFeed/index.d.ts +33 -0
  54. package/dist/components/MediaFeed/index.js +7 -4
  55. package/dist/components/MediaPlayer/index.cjs +13 -6
  56. package/dist/components/MediaPlayer/index.d.cts +103 -5
  57. package/dist/components/MediaPlayer/index.d.ts +103 -5
  58. package/dist/components/MediaPlayer/index.js +6 -3
  59. package/dist/components/Slider/index.cjs +5 -5
  60. package/dist/components/Slider/index.d.cts +6 -0
  61. package/dist/components/Slider/index.d.ts +6 -0
  62. package/dist/components/Slider/index.js +1 -1
  63. package/dist/components/SliderCalculator/index.cjs +4 -4
  64. package/dist/components/SliderCalculator/index.js +2 -2
  65. package/dist/components/SuperChat/index.cjs +16 -14
  66. package/dist/components/SuperChat/index.cjs.map +1 -1
  67. package/dist/components/SuperChat/index.d.cts +2 -2
  68. package/dist/components/SuperChat/index.d.ts +2 -2
  69. package/dist/components/SuperChat/index.js +8 -6
  70. package/dist/components/SuperChat/index.js.map +1 -1
  71. package/dist/components/SuperChat/plugins/index.d.cts +2 -2
  72. package/dist/components/SuperChat/plugins/index.d.ts +2 -2
  73. package/dist/hooks/index.cjs +2 -2
  74. package/dist/hooks/index.js +1 -1
  75. package/dist/index.cjs +73 -68
  76. package/dist/index.cjs.map +1 -1
  77. package/dist/index.d.cts +187 -90
  78. package/dist/index.d.ts +187 -90
  79. package/dist/index.js +14 -13
  80. package/dist/index.js.map +1 -1
  81. package/dist/styles.css +1 -1
  82. package/dist/tailwind-preset.cjs +4 -4
  83. package/dist/tailwind-preset.js +1 -1
  84. package/dist/{types-DSWbrVkM.d.cts → types-BfVolads.d.cts} +33 -0
  85. package/dist/{types-DSWbrVkM.d.ts → types-BfVolads.d.ts} +33 -0
  86. package/package.json +1 -1
  87. package/dist/chunk-47AOS5EC.cjs.map +0 -1
  88. package/dist/chunk-AIO2GCTL.js.map +0 -1
  89. package/dist/chunk-ECKIFQSD.cjs +0 -183
  90. package/dist/chunk-ECKIFQSD.cjs.map +0 -1
  91. package/dist/chunk-GDKOYVX3.cjs.map +0 -1
  92. package/dist/chunk-GLXTVCHN.cjs +0 -4
  93. package/dist/chunk-MNXIN4MS.js.map +0 -1
  94. package/dist/chunk-OGFSFUIX.cjs.map +0 -1
  95. package/dist/chunk-QHCAWDMG.cjs.map +0 -1
  96. package/dist/chunk-R5P7NAJQ.js +0 -159
  97. package/dist/chunk-R5P7NAJQ.js.map +0 -1
  98. package/dist/chunk-RISZWWEQ.js +0 -3
  99. package/dist/chunk-TUYWCUKH.js.map +0 -1
  100. package/dist/chunk-V5VPECJI.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/MediaFeed/FeedMedia.tsx","../src/components/MediaFeed/MediaFeed.tsx"],"names":["jsx","React","isInPictureInPicture","PIP_EVENTS","jsxs","cn","MediaPlayer","Button","overlayButtonClass","playBadgeClass","Play","playBadgeIconClass","Pause","defaultMediaControlsLabels","React2","Avatar","usePrefersReducedMotion","exitPictureInPicture","Maximize2","Fragment","ChevronUp","ChevronDown","Modal","ModalHeader","ModalTitle","ModalClose"],"mappings":"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","file":"chunk-AHYDJN4H.cjs","sourcesContent":["import * as React from 'react';\nimport { Pause, Play } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\nimport { MediaPlayer, type MediaPlayerState } from '../MediaPlayer';\nimport {\n overlayButtonClass,\n playBadgeClass,\n playBadgeIconClass,\n} from '../MediaPlayer/overlayButton';\nimport {\n isInPictureInPicture,\n PIP_EVENTS,\n} from '../MediaPlayer/pictureInPicture';\nimport type { MediaFeedLabels, MediaFeedMedia } from './types';\n\ninterface FeedMediaProps {\n media: MediaFeedMedia;\n title: string;\n active: boolean;\n autoPlay: boolean;\n muted: boolean;\n loop: boolean;\n labels: MediaFeedLabels;\n onActivate: () => void;\n playbackPosition: { timeMs: number; playRequested?: boolean };\n playbackRequestId?: string | number;\n /** The feed's `overlay` layout: the player's overlay controls, no button row. */\n overlay: boolean;\n}\n\n/** Only ordinary web URLs become links; media resources may use other schemes. */\nfunction sourceHref(src: string): string | undefined {\n try {\n const url = new URL(src, 'https://localhost/');\n return ['http:', 'https:'].includes(url.protocol) ? src : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction SourceLink({ src, labels }: { src: string; labels: MediaFeedLabels }) {\n const href = sourceHref(src);\n return href ? (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary-700 dark:text-primary-300 focus-visible:ring-ring rounded underline underline-offset-4 focus-visible:ring-2 focus-visible:outline-none\"\n >\n {labels.openSource}\n </a>\n ) : null;\n}\n\nfunction NativeFeedMedia({\n media,\n title,\n active,\n autoPlay,\n muted,\n loop,\n labels,\n onActivate,\n playbackPosition,\n playbackRequestId,\n overlay,\n}: FeedMediaProps) {\n const mediaElementRef = React.useRef<\n HTMLVideoElement | HTMLAudioElement | null\n >(null);\n const [state, setState] = React.useState<MediaPlayerState>('idle');\n const [blocked, setBlocked] = React.useState(false);\n const [retryVersion, setRetryVersion] = React.useState(0);\n const wantsPlayback = React.useRef(playbackPosition.playRequested ?? false);\n const latestPlaybackRequest = React.useRef(playbackRequestId);\n latestPlaybackRequest.current = playbackRequestId;\n const handledPlaybackRequest = React.useRef<string | number | undefined>(\n undefined\n );\n const ownershipPause = React.useRef(false);\n const attemptId = React.useRef(0);\n const activeRef = React.useRef(active);\n const canSavePosition = React.useRef(false);\n // The pending attempt autoplay started: that start isn't the viewer asking\n // for playback. A newer attempt, or one that's called off, isn't it.\n const autoAttempt = React.useRef<number | null>(null);\n activeRef.current = active;\n\n const tryPlay = React.useCallback(async (automatic = false) => {\n const element = mediaElementRef.current;\n if (!element || !activeRef.current) return;\n const attempt = ++attemptId.current;\n setBlocked(false);\n autoAttempt.current = automatic ? attempt : null;\n try {\n // The native promise can reject when browser autoplay policy requires a\n // gesture. Playback state still comes from native events, never intent.\n await element.play();\n // A delayed request must not start a card that has since left the active\n // surface — unless the viewer floated it into picture in picture while it\n // was starting, which plays on as it does when the feed moves. A newer\n // request for the same active element can finish normally.\n if (\n (!activeRef.current || element !== mediaElementRef.current) &&\n !isInPictureInPicture(element)\n )\n element.pause();\n } catch (error) {\n if (!activeRef.current || attempt !== attemptId.current) return;\n if (error instanceof Error && error.name === 'AbortError') return;\n setBlocked(true);\n } finally {\n if (autoAttempt.current === attempt) autoAttempt.current = null;\n }\n }, []);\n\n // A clip floating in picture in picture plays on when its item stops being\n // the one on screen (the feed scrolls on, or its host hides it): the viewer\n // floated it to keep watching.\n const pauseForOwnership = React.useCallback(\n (element: HTMLMediaElement | null) => {\n if (isInPictureInPicture(element)) return;\n if (element && element === mediaElementRef.current && !element.paused)\n ownershipPause.current = true;\n element?.pause();\n },\n []\n );\n\n React.useEffect(() => {\n const element = mediaElementRef.current;\n const attempts = attemptId;\n const restorePosition = () => {\n if (!element || !activeRef.current) return;\n if (playbackPosition.timeMs > 0) {\n element.currentTime = playbackPosition.timeMs / 1000;\n }\n canSavePosition.current = true;\n };\n if (active && element) {\n // Another surface can clear shared manual intent while this inline copy\n // is paused (for example, the user pauses inside fullscreen).\n wantsPlayback.current = playbackPosition.playRequested ?? false;\n if (element.readyState >= 1) restorePosition();\n else element.addEventListener('loadedmetadata', restorePosition);\n }\n if (\n active &&\n (latestPlaybackRequest.current === undefined ||\n latestPlaybackRequest.current === handledPlaybackRequest.current) &&\n (autoPlay || wantsPlayback.current)\n ) {\n void tryPlay(!wantsPlayback.current);\n } else if (!active) {\n attemptId.current++;\n // Leave a full screen this clip's own player entered: an inactive item\n // has no controls to leave it with.\n const fullscreen = document.fullscreenElement;\n if (\n element &&\n fullscreen &&\n (fullscreen === element ||\n fullscreen === element.closest('[data-slot=\"media-player-box\"]'))\n )\n void document.exitFullscreen?.()?.catch(() => {});\n pauseForOwnership(element);\n setBlocked(false);\n }\n return () => {\n attempts.current++;\n element?.removeEventListener('loadedmetadata', restorePosition);\n if (element && canSavePosition.current)\n playbackPosition.timeMs = element.currentTime * 1000;\n pauseForOwnership(element);\n };\n }, [\n active,\n autoPlay,\n pauseForOwnership,\n playbackPosition,\n retryVersion,\n tryPlay,\n ]);\n\n // A clip left playing in picture in picture when its item stopped being the\n // one on screen comes back with no controls (only the active item has\n // them): pause it when its floating window closes.\n React.useEffect(() => {\n const element = mediaElementRef.current;\n if (!element) return;\n const landed = () => {\n if (!activeRef.current && !isInPictureInPicture(element)) element.pause();\n };\n for (const name of PIP_EVENTS) element.addEventListener(name, landed);\n return () => {\n for (const name of PIP_EVENTS) element.removeEventListener(name, landed);\n };\n }, [retryVersion]);\n\n React.useEffect(() => {\n if (\n !active ||\n playbackRequestId === undefined ||\n playbackRequestId === handledPlaybackRequest.current\n )\n return;\n handledPlaybackRequest.current = playbackRequestId;\n wantsPlayback.current = true;\n playbackPosition.playRequested = true;\n void tryPlay();\n }, [active, playbackRequestId, playbackPosition, tryPlay]);\n\n const togglePlayback = () => {\n if (state === 'playing') {\n wantsPlayback.current = false;\n playbackPosition.playRequested = false;\n mediaElementRef.current?.pause();\n } else {\n wantsPlayback.current = true;\n playbackPosition.playRequested = true;\n onActivate();\n if (active) void tryPlay();\n }\n };\n\n // In the overlay layout the clip fills the stage at its own shape, upright\n // or sideways, under the player's own controls.\n return (\n <div\n className={cn(\n 'flex h-full min-h-0 w-full flex-col items-center justify-center',\n overlay ? 'relative' : 'gap-3'\n )}\n >\n <MediaPlayer\n src={media.src}\n kind={media.kind === 'audio' ? 'audio' : 'video'}\n mediaElementRef={mediaElementRef}\n muted={muted}\n loop={loop}\n poster={media.poster}\n preload={active ? 'metadata' : 'none'}\n controls={active}\n controlsStyle={overlay ? 'overlay' : 'native'}\n aria-label={title}\n onStateChange={(next) => {\n setState(next);\n if (next === 'playing') {\n ownershipPause.current = false;\n // Started by the viewer (the player's own controls, a tap on the\n // picture, Play in the floating window), it resumes when they\n // come back to it. Autoplay's own start leaves that to autoPlay.\n // Either way the blocked-autoplay notice can go.\n setBlocked(false);\n if (\n (activeRef.current ||\n isInPictureInPicture(mediaElementRef.current)) &&\n autoAttempt.current !== attemptId.current\n ) {\n wantsPlayback.current = true;\n playbackPosition.playRequested = true;\n }\n }\n if (next === 'paused') {\n // A pause on the active item, or in the floating window, is the\n // viewer's: don't resume it later.\n if (\n (activeRef.current ||\n isInPictureInPicture(mediaElementRef.current)) &&\n !ownershipPause.current\n ) {\n wantsPlayback.current = false;\n playbackPosition.playRequested = false;\n }\n ownershipPause.current = false;\n }\n }}\n onTimeUpdate={(timeMs) => {\n if (canSavePosition.current) playbackPosition.timeMs = timeMs;\n }}\n onRetry={() => {\n ownershipPause.current = false;\n canSavePosition.current = false;\n setState('idle');\n setBlocked(false);\n setRetryVersion((version) => version + 1);\n }}\n labels={{\n error: labels.mediaError,\n retry: labels.retry,\n play: labels.play,\n pause: labels.pause,\n mute: labels.mute,\n unmute: labels.unmute,\n seek: labels.seek,\n fullscreen: labels.playerFullscreen,\n exitFullscreen: labels.exitPlayerFullscreen,\n pictureInPicture: labels.pictureInPicture,\n exitPictureInPicture: labels.exitPictureInPicture,\n time: labels.time,\n rate: labels.playerRate,\n speed: labels.playerSpeed,\n showCaptions: labels.showCaptions,\n hideCaptions: labels.hideCaptions,\n }}\n className=\"min-h-0 flex-1 [&_video]:h-full [&_video]:w-full\"\n />\n {overlay\n ? // An item that isn't the active one has no controls yet: its ▶\n // selects it and starts it.\n !active &&\n state !== 'error' &&\n state !== 'playing' && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={labels.play}\n title={labels.play}\n className={cn(\n overlayButtonClass,\n playBadgeClass,\n 'pointer-events-auto pointer-fine:h-14 pointer-fine:w-14'\n )}\n onClick={togglePlayback}\n >\n <Play className={playBadgeIconClass} aria-hidden=\"true\" />\n </Button>\n </div>\n )\n : state !== 'error' && (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n leftIcon={\n state === 'playing' ? (\n <Pause className=\"h-4 w-4\" aria-hidden=\"true\" />\n ) : (\n <Play className=\"h-4 w-4\" aria-hidden=\"true\" />\n )\n }\n onClick={togglePlayback}\n >\n {state === 'playing' ? labels.pause : labels.play}\n </Button>\n )}\n {blocked && state !== 'playing' && (\n <p\n role=\"status\"\n className={cn(\n 'm-0 text-center text-sm',\n overlay\n ? // Along the top, clear of the details and actions at the foot\n // and of a host's Back button in the top corner.\n 'pointer-events-none absolute inset-x-0 top-3 flex justify-center px-14'\n : 'text-muted-foreground'\n )}\n >\n {overlay ? (\n <span className=\"rounded bg-black/60 px-2 py-1 text-white\">\n {labels.blockedAutoplay}\n </span>\n ) : (\n labels.blockedAutoplay\n )}\n </p>\n )}\n {state === 'error' && <SourceLink src={media.src} labels={labels} />}\n </div>\n );\n}\n\nfunction ImageFeedMedia({ media, title, labels }: FeedMediaProps) {\n const [failed, setFailed] = React.useState(false);\n return failed ? (\n <div role=\"alert\" className=\"flex flex-col gap-3 p-6 text-center\">\n <p className=\"text-muted-foreground m-0\">{labels.mediaError}</p>\n <SourceLink src={media.src} labels={labels} />\n </div>\n ) : (\n <img\n src={media.src}\n alt={media.alt ?? title}\n loading=\"lazy\"\n className=\"h-full max-h-full w-full object-contain\"\n onError={() => setFailed(true)}\n />\n );\n}\n\nfunction youtubeId(src: string): string | null {\n const validId = /^[A-Za-z0-9_-]{11}$/;\n if (validId.test(src)) return src;\n try {\n const url = new URL(src);\n const host = url.hostname.toLowerCase();\n const parts = url.pathname.split('/').filter(Boolean);\n let id: string | null = null;\n if (host === 'youtu.be' || host === 'www.youtu.be') {\n id = parts[0] ?? null;\n } else if (\n [\n 'youtube.com',\n 'www.youtube.com',\n 'm.youtube.com',\n 'youtube-nocookie.com',\n 'www.youtube-nocookie.com',\n ].includes(host)\n ) {\n id =\n url.searchParams.get('v') ??\n (['embed', 'shorts', 'live'].includes(parts[0]) ? parts[1] : null);\n }\n return id && validId.test(id) ? id : null;\n } catch {\n return null;\n }\n}\n\nfunction YouTubeFeedMedia({\n media,\n title,\n active,\n autoPlay,\n muted,\n loop,\n labels,\n onActivate,\n playbackRequestId,\n}: FeedMediaProps) {\n const id = youtubeId(media.src);\n const [requestedPlayback, setRequestedPlayback] = React.useState(false);\n const handledPlaybackRequest = React.useRef<string | number | undefined>(\n undefined\n );\n const pendingPlayback =\n active &&\n playbackRequestId !== undefined &&\n playbackRequestId !== handledPlaybackRequest.current;\n React.useEffect(() => {\n if (!active) setRequestedPlayback(false);\n else if (\n playbackRequestId !== undefined &&\n playbackRequestId !== handledPlaybackRequest.current\n ) {\n handledPlaybackRequest.current = playbackRequestId;\n setRequestedPlayback(true);\n }\n }, [active, playbackRequestId]);\n const embedUrl = new URL(\n `https://www.youtube-nocookie.com/embed/${id ?? ''}`\n );\n for (const [key, value] of Object.entries({\n autoplay: autoPlay || requestedPlayback || pendingPlayback ? '1' : '0',\n mute: muted ? '1' : '0',\n controls: '1',\n playsinline: '1',\n rel: '0',\n loop: loop ? '1' : '0',\n ...(loop && id ? { playlist: id } : {}),\n }))\n embedUrl.searchParams.set(key, value);\n const [failed, setFailed] = React.useState(false);\n return (\n <div className=\"flex h-full min-h-0 w-full flex-col items-center gap-3\">\n {active && id && !failed ? (\n <iframe\n src={embedUrl.href}\n title={title}\n className=\"min-h-0 w-full flex-1 border-0\"\n allow=\"autoplay; encrypted-media; picture-in-picture; fullscreen\"\n referrerPolicy=\"strict-origin-when-cross-origin\"\n allowFullScreen\n onError={() => setFailed(true)}\n />\n ) : (\n <div className=\"flex min-h-0 w-full flex-1 flex-col items-center justify-center gap-4\">\n {media.poster && (\n <img\n src={media.poster}\n alt=\"\"\n loading=\"lazy\"\n className=\"min-h-0 max-w-full flex-1 object-contain\"\n />\n )}\n {id && !failed ? (\n <Button\n type=\"button\"\n variant=\"secondary\"\n leftIcon={<Play className=\"h-4 w-4\" aria-hidden=\"true\" />}\n onClick={() => {\n setRequestedPlayback(true);\n onActivate();\n }}\n >\n {labels.play}\n </Button>\n ) : (\n <p role=\"alert\" className=\"text-muted-foreground m-0\">\n {labels.mediaError}\n </p>\n )}\n </div>\n )}\n <p className=\"text-muted-foreground m-0 text-center text-sm\">\n {labels.youtubeNotice}\n </p>\n <SourceLink\n src={id ? `https://www.youtube.com/watch?v=${id}` : media.src}\n labels={labels}\n />\n </div>\n );\n}\n\n/** Native resources share UI transport; external embeds retain their controls. */\nexport function FeedMedia(props: FeedMediaProps) {\n if (props.media.kind === 'image') return <ImageFeedMedia {...props} />;\n if (props.media.kind === 'youtube') return <YouTubeFeedMedia {...props} />;\n return <NativeFeedMedia {...props} />;\n}\n","import * as React from 'react';\nimport { ChevronDown, ChevronUp, Maximize2 } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { usePrefersReducedMotion } from '../../hooks/usePrefersReducedMotion';\nimport { Avatar } from '../Avatar';\nimport { Button } from '../Button';\nimport { defaultMediaControlsLabels } from '../MediaPlayer/MediaControls';\nimport { overlayButtonClass } from '../MediaPlayer/overlayButton';\nimport {\n exitPictureInPicture,\n isInPictureInPicture,\n} from '../MediaPlayer/pictureInPicture';\nimport { Modal, ModalClose, ModalHeader, ModalTitle } from '../Modal';\nimport { FeedMedia } from './FeedMedia';\nimport type {\n MediaFeedAuthor,\n MediaFeedClassNames,\n MediaFeedLabels,\n MediaFeedProps,\n} from './types';\n\nconst defaultLabels: MediaFeedLabels = {\n feed: 'Media feed',\n loading: 'Loading media…',\n empty: 'No media to display.',\n error: 'Unable to load the media feed.',\n retry: 'Retry',\n fullscreen: 'Open fullscreen',\n close: 'Close fullscreen',\n previous: 'Previous item',\n next: 'Next item',\n play: 'Play',\n pause: 'Pause',\n // The player's own controls, in the overlay layout.\n mute: defaultMediaControlsLabels.mute,\n unmute: defaultMediaControlsLabels.unmute,\n seek: defaultMediaControlsLabels.seek,\n playerFullscreen: defaultMediaControlsLabels.fullscreen,\n exitPlayerFullscreen: defaultMediaControlsLabels.exitFullscreen,\n pictureInPicture: defaultMediaControlsLabels.pictureInPicture,\n exitPictureInPicture: defaultMediaControlsLabels.exitPictureInPicture,\n time: defaultMediaControlsLabels.time,\n playerRate: defaultMediaControlsLabels.rate,\n playerSpeed: defaultMediaControlsLabels.speed,\n showCaptions: defaultMediaControlsLabels.showCaptions,\n hideCaptions: defaultMediaControlsLabels.hideCaptions,\n showMore: 'Show more',\n showLess: 'Show less',\n blockedAutoplay: 'Playback did not start. Press Play to try again.',\n mediaError: 'This media is unavailable.',\n openSource: 'Open source',\n youtubeNotice: 'If embedded playback is unavailable, open the source.',\n item: (position, total) => `Media item ${position} of ${total}`,\n position: (position, total) => `${position} / ${total}`,\n};\n\n/**\n * The player's bar in the overlay layout: an even scrim, which the details'\n * gradient continues upward from its top edge, rather than its own gradient.\n */\nconst OVERLAY_BAR_SCRIM =\n '[&_[data-slot=media-controls-bar]]:bg-none [&_[data-slot=media-controls-bar]]:bg-black/55';\n\n/**\n * The height of the player's control bar in the item around `ref`, so the\n * details can sit just above it. The bar mounts with the active item and\n * wraps onto two rows in a narrow one, so it's watched for both.\n */\nfunction useControlsBarHeight(ref: React.RefObject<HTMLElement | null>) {\n const [height, setHeight] = React.useState(0);\n React.useLayoutEffect(() => {\n const item = ref.current?.closest('[data-slot=\"item\"]');\n if (!item) return;\n let bar: Element | null = null;\n const resize =\n typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(() =>\n setHeight(bar?.getBoundingClientRect().height ?? 0)\n );\n const attach = () => {\n const next = item.querySelector('[data-slot=\"media-controls-bar\"]');\n if (next === bar) return;\n if (bar) resize?.unobserve(bar);\n bar = next;\n if (bar) resize?.observe(bar);\n setHeight(bar?.getBoundingClientRect().height ?? 0);\n };\n attach();\n const mutations =\n typeof MutationObserver === 'undefined'\n ? null\n : new MutationObserver(attach);\n mutations?.observe(item, { childList: true, subtree: true });\n return () => {\n mutations?.disconnect();\n resize?.disconnect();\n };\n }, [ref]);\n return height;\n}\n\n/**\n * The `overlay` layout's details, placed as short-video apps place them\n * (TikTok, Instagram Reels): who posted it, its title and caption at the\n * bottom start, just above the player's bar, on a gradient rising from the\n * bottom; the host's actions in a column at the bottom end, beside them. The\n * top is left to the host (a Back button). Only its own controls take a tap;\n * the rest of a tap reaches the player beneath (play/pause). An untitled item\n * shows no title: the position counter already names it on screen, and the\n * item's `aria-label` names it for assistive tech.\n */\nfunction OverlayDetails({\n author,\n title,\n caption,\n actions,\n fullscreenButton,\n labels,\n classNames,\n}: {\n author?: MediaFeedAuthor;\n title?: string;\n caption?: React.ReactNode;\n actions?: React.ReactNode;\n fullscreenButton: React.ReactNode;\n labels: MediaFeedLabels;\n classNames: MediaFeedClassNames;\n}) {\n const rootRef = React.useRef<HTMLDivElement>(null);\n const barHeight = useControlsBarHeight(rootRef);\n // Only words that add something: not empty, not the title over again.\n const showCaption =\n caption != null &&\n caption !== '' &&\n !(typeof caption === 'string' && caption.trim() === (title ?? '').trim());\n const textId = React.useId();\n const titleRef = React.useRef<HTMLHeadingElement>(null);\n const captionRef = React.useRef<HTMLDivElement>(null);\n const [expanded, setExpanded] = React.useState(false);\n const [clipped, setClipped] = React.useState(false);\n // Is the one-line title or the two-line caption cut off? Measured again\n // whenever their boxes change (a phone turned, the window resized, fonts\n // arriving), since that decides whether Show more is needed.\n React.useLayoutEffect(() => {\n if (expanded) return;\n const titleEl = titleRef.current;\n const captionEl = captionRef.current;\n const measure = () =>\n setClipped(\n (!!titleEl && titleEl.scrollWidth > titleEl.clientWidth + 1) ||\n (!!captionEl && captionEl.scrollHeight > captionEl.clientHeight + 1)\n );\n measure();\n if (typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(measure);\n for (const el of [titleEl, captionEl]) if (el) observer.observe(el);\n return () => observer.disconnect();\n }, [title, caption, expanded]);\n return (\n <div\n ref={rootRef}\n data-slot=\"details\"\n data-expanded={expanded || undefined}\n // On the bar's top edge, not over it (that would dim its controls): its\n // gradient starts at the bar's own scrim (OVERLAY_BAR_SCRIM), so the\n // two read as one. Never taller than the item above the bar, so text\n // opened in full scrolls instead of running off the top.\n style={{ bottom: barHeight, maxHeight: `calc(100% - ${barHeight}px)` }}\n className={cn(\n 'pointer-events-none absolute inset-x-0 z-10 flex items-end justify-between gap-3 bg-gradient-to-t from-black/55 via-black/30 to-transparent ps-3 pe-2 pt-16 pb-3 text-white [text-shadow:0_1px_2px_rgb(0_0_0/0.6)]',\n // A darker scrim behind the full text, which can run over a bright frame.\n expanded && 'via-black/55',\n classNames.details\n )}\n >\n {/* A readable measure on a wide screen, as short-video apps keep.\n Opened in full, the column takes the details' height and scrolls\n (a long title on a landscape phone), its text still at the foot\n when it fits. */}\n <div\n id={textId}\n className={cn(\n 'flex max-w-xl min-w-0 flex-1 flex-col leading-5',\n expanded &&\n 'pointer-events-auto min-h-0 self-stretch overflow-y-auto overscroll-contain'\n )}\n >\n <div className=\"mt-auto\">\n {author && (\n <div\n data-slot=\"author\"\n className={cn(\n 'mb-1 flex min-w-0 items-center gap-2',\n classNames.author\n )}\n >\n <Avatar\n name={author.name}\n src={author.avatar}\n alt=\"\"\n size=\"sm\"\n className=\"shrink-0 ring-1 ring-white/70\"\n />\n {/* Host text can be in any language: each line takes its own\n direction, so it truncates at its own end, and is only as wide\n as its text, so it still sits at the page's start edge. */}\n <p\n dir=\"auto\"\n className=\"m-0 w-fit max-w-full truncate text-sm font-semibold\"\n >\n {author.name}\n </p>\n </div>\n )}\n {title && (\n <h3\n ref={titleRef}\n data-slot=\"title\"\n dir=\"auto\"\n className={cn(\n 'm-0 w-fit max-w-full text-sm font-semibold',\n expanded ? 'break-words' : 'truncate',\n classNames.title\n )}\n >\n {title}\n </h3>\n )}\n {showCaption && (\n // A div, not a p: a host caption can hold block content, and its\n // links stay tappable through the details layer.\n <div\n ref={captionRef}\n data-slot=\"caption\"\n dir=\"auto\"\n className={cn(\n 'pointer-events-auto m-0 w-fit max-w-full text-sm break-words text-white/90',\n !expanded && 'line-clamp-2',\n classNames.caption\n )}\n >\n {caption}\n </div>\n )}\n {(clipped || expanded) && (\n <button\n type=\"button\"\n data-slot=\"details-toggle\"\n aria-expanded={expanded}\n aria-controls={textId}\n onClick={() => setExpanded((open) => !open)}\n className=\"pointer-events-auto mt-0.5 rounded-sm text-sm font-semibold text-white/80 underline-offset-2 hover:underline focus-visible:outline-2 focus-visible:outline-white/70\"\n >\n {expanded ? labels.showLess : labels.showMore}\n </button>\n )}\n </div>\n </div>\n {(actions || fullscreenButton) && (\n // The action column, at the bottom end beside the text.\n <div className=\"pointer-events-auto flex shrink-0 flex-col items-center gap-3\">\n {actions && (\n <div\n data-slot=\"actions\"\n className={cn(\n 'flex flex-col items-center gap-3',\n classNames.actions\n )}\n >\n {actions}\n </div>\n )}\n {fullscreenButton}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * A vertical, caller-owned media collection with one active playback surface.\n * Native players share MediaPlayer; provider-specific players can use the\n * renderMedia slot. Records, engagement actions and navigation belong to the host.\n */\nfunction MediaFeedInner<T>(\n {\n items,\n getId,\n getMedia,\n getTitle,\n getCaption,\n getAuthor,\n renderActions,\n renderMedia,\n layout = 'stacked',\n allowFullscreen: allowFullscreenProp,\n activeItemId,\n defaultActiveItemId,\n onActiveItemChange,\n playbackRequest,\n loading = false,\n error,\n onRetry,\n autoPlay = true,\n muted = true,\n loop = true,\n labels: labelOverrides,\n classNames = {},\n className,\n ...rest\n }: MediaFeedProps<T>,\n forwardedRef: React.ForwardedRef<HTMLDivElement>\n) {\n const labels = { ...defaultLabels, ...labelOverrides };\n const overlay = layout === 'overlay';\n // The overlay already fills its space and the player has its own full\n // screen, so the viewer is opt-in there.\n const allowFullscreen = allowFullscreenProp ?? !overlay;\n const prefersReducedMotion = usePrefersReducedMotion();\n const allowAutoPlay = autoPlay && !prefersReducedMotion;\n const ids = items.map(getId);\n const idsKey = JSON.stringify(ids);\n const [internalActiveId, setInternalActiveId] = React.useState(\n () => defaultActiveItemId ?? ids[0]\n );\n const requestedId = activeItemId ?? internalActiveId;\n const activeId =\n requestedId !== undefined && ids.includes(requestedId)\n ? requestedId\n : ids[0];\n const activeIndex = activeId === undefined ? -1 : ids.indexOf(activeId);\n const [fullscreen, setFullscreen] = React.useState(false);\n const [retrying, setRetrying] = React.useState(false);\n const [retryFailed, setRetryFailed] = React.useState(false);\n const rootRef = React.useRef<HTMLDivElement | null>(null);\n const viewportRef = React.useRef<HTMLDivElement | null>(null);\n const cardRefs = React.useRef(new Map<string, HTMLElement>());\n const playbackPositions = React.useRef(\n new Map<string, { src: string; timeMs: number; playRequested?: boolean }>()\n );\n const consumedPlaybackRequests = React.useRef(\n new Map<string, string | number>()\n );\n const fullscreenTriggerRef = React.useRef<HTMLButtonElement | null>(null);\n const hasObserver = typeof IntersectionObserver !== 'undefined';\n // Hydration safety: the server cannot know whether the client supports\n // IntersectionObserver, so both environments start \"not visible\" and the\n // mount effects below establish real visibility (observer callbacks, or the\n // no-observer fallback). Offscreen autoplay therefore never starts early.\n const [visibleId, setVisibleId] = React.useState<string | null>(null);\n const visibleIdRef = React.useRef(visibleId);\n const [viewportVisible, setViewportVisible] = React.useState(false);\n const [pageVisible, setPageVisible] = React.useState(\n () =>\n typeof document === 'undefined' || document.visibilityState !== 'hidden'\n );\n const latest = React.useRef({\n items,\n ids,\n activeId,\n activeItemId,\n onActiveItemChange,\n fullscreen,\n });\n latest.current = {\n items,\n ids,\n activeId,\n activeItemId,\n onActiveItemChange,\n fullscreen,\n };\n\n const setRoot = React.useCallback(\n (node: HTMLDivElement | null) => {\n rootRef.current = node;\n if (typeof forwardedRef === 'function') forwardedRef(node);\n else if (forwardedRef) forwardedRef.current = node;\n },\n [forwardedRef]\n );\n\n const select = React.useCallback((id: string) => {\n const current = latest.current;\n const index = current.ids.indexOf(id);\n if (index < 0 || id === current.activeId) return;\n if (current.activeItemId === undefined) setInternalActiveId(id);\n current.onActiveItemChange?.(current.items[index]);\n }, []);\n\n // Visibility belongs to this feed, never a global keyboard/player singleton.\n // A separate viewport observer also pauses a feed scrolled off the host page.\n React.useEffect(() => {\n const root = rootRef.current;\n if (!root || typeof IntersectionObserver === 'undefined') {\n // No-observer fallback: assume the feed is on screen.\n setViewportVisible(true);\n return;\n }\n const observer = new IntersectionObserver(([entry]) => {\n setViewportVisible(entry.isIntersecting);\n });\n observer.observe(root);\n return () => observer.disconnect();\n }, []);\n\n React.useEffect(() => {\n const viewport = viewportRef.current;\n if (!viewport || typeof IntersectionObserver === 'undefined') return;\n const ratios = new Map<string, number>();\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n const id = (entry.target as HTMLElement).dataset.mediaId;\n if (id !== undefined)\n ratios.set(id, entry.isIntersecting ? entry.intersectionRatio : 0);\n }\n let bestId: string | null = null;\n let bestRatio = 0;\n for (const [id, ratio] of ratios) {\n if (ratio > bestRatio) {\n bestId = id;\n bestRatio = ratio;\n }\n }\n visibleIdRef.current = bestId;\n setVisibleId(bestId);\n if (bestId !== null && !latest.current.fullscreen) select(bestId);\n },\n { root: viewport, threshold: [0, 0.25, 0.5, 0.75, 1] }\n );\n cardRefs.current.forEach((card) => observer.observe(card));\n return () => observer.disconnect();\n }, [idsKey, loading, error, select]);\n\n React.useEffect(() => {\n const update = () => setPageVisible(document.visibilityState !== 'hidden');\n document.addEventListener('visibilitychange', update);\n return () => document.removeEventListener('visibilitychange', update);\n }, []);\n\n // Controlled selection and initial deep links scroll within the feed, without\n // moving the surrounding inbox/page. Observer selections are already visible.\n React.useEffect(() => {\n if (activeId === undefined) return;\n if (!hasObserver) {\n visibleIdRef.current = activeId;\n setVisibleId(activeId);\n }\n if (visibleIdRef.current === activeId && hasObserver) return;\n const card = cardRefs.current.get(activeId);\n if (card && viewportRef.current) {\n viewportRef.current.scrollTo?.({ top: card.offsetTop, behavior: 'auto' });\n }\n }, [activeId, idsKey, hasObserver, loading, error]);\n\n React.useEffect(() => {\n if (!items.length || !allowFullscreen) setFullscreen(false);\n }, [items.length, allowFullscreen]);\n\n // The gesture targets an already selected, visible surface. Consume it once\n // per feed so a later source/fullscreen remount cannot resurrect a paused clip.\n React.useEffect(() => {\n if (\n loading ||\n error ||\n activeIndex < 0 ||\n !playbackRequest ||\n playbackRequest.itemId !== activeId\n )\n return;\n if (\n !pageVisible ||\n (!fullscreen && (!viewportVisible || visibleId !== activeId))\n )\n return;\n consumedPlaybackRequests.current.set(\n playbackRequest.itemId,\n playbackRequest.requestId\n );\n }, [\n activeId,\n activeIndex,\n fullscreen,\n pageVisible,\n viewportVisible,\n visibleId,\n playbackRequest,\n loading,\n error,\n ]);\n\n React.useEffect(() => {\n const positions = playbackPositions.current;\n for (const id of positions.keys()) {\n if (!latest.current.ids.includes(id)) positions.delete(id);\n }\n }, [idsKey]);\n\n React.useEffect(() => {\n if (fullscreen || !fullscreenTriggerRef.current) return;\n if (fullscreenTriggerRef.current.isConnected)\n fullscreenTriggerRef.current.focus();\n else viewportRef.current?.focus();\n fullscreenTriggerRef.current = null;\n }, [fullscreen]);\n\n const navigate = (index: number, focus = false) => {\n const id = ids[Math.max(0, Math.min(index, ids.length - 1))];\n if (id === undefined) return;\n select(id);\n const card = cardRefs.current.get(id);\n if (card && viewportRef.current) {\n viewportRef.current.scrollTo?.({ top: card.offsetTop, behavior: 'auto' });\n if (focus) card.focus({ preventScroll: true });\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n // Never steal arrows/Space from a player, reaction button or chat composer.\n const target = event.target as HTMLElement;\n if (event.target !== event.currentTarget && target.dataset?.slot !== 'item')\n return;\n let next: number;\n switch (event.key) {\n case 'ArrowDown':\n case 'PageDown':\n next = activeIndex + 1;\n break;\n case 'ArrowUp':\n case 'PageUp':\n next = activeIndex - 1;\n break;\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = items.length - 1;\n break;\n default:\n return;\n }\n event.preventDefault();\n navigate(next, event.target !== event.currentTarget);\n };\n\n const retry = async () => {\n if (!onRetry || retrying) return;\n setRetrying(true);\n setRetryFailed(false);\n try {\n await onRetry();\n } catch {\n setRetryFailed(true);\n } finally {\n setRetrying(false);\n }\n };\n\n const renderCard = (item: T, index: number, immersive: boolean) => {\n const id = getId(item);\n const media = getMedia(item);\n let playbackPosition = playbackPositions.current.get(id);\n if (!playbackPosition || playbackPosition.src !== media.src) {\n playbackPosition = { src: media.src, timeMs: 0 };\n playbackPositions.current.set(id, playbackPosition);\n }\n const ownTitle = getTitle?.(item);\n const title = ownTitle || labels.item(index + 1, items.length);\n const author = getAuthor?.(item);\n const caption = getCaption?.(item);\n const active =\n !loading &&\n !error &&\n pageVisible &&\n (immersive\n ? fullscreen && id === activeId\n : !fullscreen &&\n viewportVisible &&\n id === activeId &&\n id === visibleId);\n const playbackRequestId =\n active &&\n playbackRequest?.itemId === id &&\n consumedPlaybackRequests.current.get(id) !== playbackRequest.requestId\n ? playbackRequest.requestId\n : undefined;\n const fullscreenButton = allowFullscreen && !immersive && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-label={labels.fullscreen}\n title={labels.fullscreen}\n className={\n overlay\n ? cn(overlayButtonClass, 'shrink-0 bg-transparent')\n : undefined\n }\n onClick={(event) => {\n fullscreenTriggerRef.current = event.currentTarget;\n const open = () => {\n select(id);\n setFullscreen(true);\n };\n // A clip floating in picture in picture comes back first, so it\n // stops with the inline feed instead of playing alongside the viewer.\n // If it's still floating after that (Safari can leave it there), it\n // pauses there instead.\n const video = event.currentTarget\n .closest('[data-slot=\"item\"]')\n ?.querySelector('video');\n if (isInPictureInPicture(video))\n void exitPictureInPicture(video).then(() => {\n if (isInPictureInPicture(video)) video?.pause();\n open();\n });\n else open();\n }}\n >\n <Maximize2 className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n );\n const mediaSlot = (\n <div\n data-slot=\"media\"\n className={cn(\n overlay\n ? // Black letterboxing around the clip, as on VideoCard.\n 'absolute inset-0 flex items-center justify-center bg-black'\n : 'bg-muted flex min-h-0 flex-1 items-center justify-center p-3',\n classNames.media\n )}\n >\n {renderMedia ? (\n renderMedia(media, {\n item,\n active,\n autoPlay: allowAutoPlay,\n muted,\n loop,\n playbackRequestId,\n })\n ) : (\n <FeedMedia\n key={`${id}:${media.kind}:${media.src}:${immersive}`}\n media={media}\n title={title}\n active={active}\n autoPlay={allowAutoPlay}\n muted={muted}\n loop={loop}\n labels={labels}\n onActivate={() => select(id)}\n playbackPosition={playbackPosition}\n playbackRequestId={playbackRequestId}\n overlay={overlay}\n />\n )}\n </div>\n );\n return (\n <article\n key={id}\n ref={\n immersive\n ? undefined\n : (node) => {\n if (node) cardRefs.current.set(id, node);\n else cardRefs.current.delete(id);\n }\n }\n data-slot=\"item\"\n data-media-id={id}\n data-active={active}\n aria-label={title}\n aria-posinset={index + 1}\n aria-setsize={items.length}\n tabIndex={id === activeId ? 0 : -1}\n className={cn(\n overlay\n ? cn(\n 'relative h-full min-h-0 w-full snap-start snap-always overflow-hidden bg-black focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-white/70',\n OVERLAY_BAR_SCRIM\n )\n : 'border-border bg-card text-card-foreground focus-visible:ring-ring flex min-h-0 w-full snap-start flex-col overflow-hidden border focus-visible:ring-2 focus-visible:outline-none focus-visible:ring-inset',\n overlay\n ? immersive\n ? 'flex-1'\n : 'shrink-0'\n : immersive\n ? 'h-full flex-1 border-0'\n : 'h-full shrink-0 rounded-xl',\n classNames.item\n )}\n >\n {overlay ? (\n <>\n {/* The details come first in the DOM so focus visits them before\n the player's bar, which sits under them on screen. */}\n <OverlayDetails\n author={author}\n title={ownTitle}\n caption={caption}\n actions={renderActions?.(item)}\n fullscreenButton={fullscreenButton}\n labels={labels}\n classNames={classNames}\n />\n {mediaSlot}\n </>\n ) : (\n <>\n {mediaSlot}\n <div\n data-slot=\"details\"\n className={cn(\n 'flex max-h-[40%] shrink-0 flex-col gap-2 overflow-y-auto p-4',\n classNames.details\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1\">\n {author && (\n <div\n data-slot=\"author\"\n className={cn(\n 'mb-2 flex items-center gap-2',\n classNames.author\n )}\n >\n <Avatar\n name={author.name}\n src={author.avatar}\n alt=\"\"\n size=\"sm\"\n />\n <span className=\"truncate text-sm font-medium\">\n {author.name}\n </span>\n </div>\n )}\n <h3\n data-slot=\"title\"\n className={cn(\n 'm-0 text-base font-semibold',\n classNames.title\n )}\n >\n {title}\n </h3>\n </div>\n {fullscreenButton}\n </div>\n {caption != null && (\n <div\n data-slot=\"caption\"\n className={cn(\n 'text-muted-foreground text-sm',\n classNames.caption\n )}\n >\n {caption}\n </div>\n )}\n {renderActions && (\n <div\n data-slot=\"actions\"\n className={cn(\n 'flex flex-wrap items-center gap-2',\n classNames.actions\n )}\n >\n {renderActions(item)}\n </div>\n )}\n </div>\n </>\n )}\n </article>\n );\n };\n\n const controls = overlay ? (\n // Over the middle of the feed's end edge, stacked the way the feed\n // scrolls, above the actions and the player's bar at the bottom. On a\n // short screen (a phone held sideways, as SuperChat reckons it) the middle\n // runs into the actions, so they move to the top end, clear of a host's\n // Back at the top start.\n <div\n data-slot=\"controls\"\n className={cn(\n 'pointer-events-none absolute end-2 top-1/2 z-10 flex -translate-y-1/2 flex-col items-center gap-1.5 [@media(max-height:30rem)]:top-2 [@media(max-height:30rem)]:translate-y-0',\n classNames.controls\n )}\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={labels.previous}\n title={labels.previous}\n className={cn(overlayButtonClass, 'pointer-events-auto')}\n disabled={activeIndex <= 0}\n onClick={() => navigate(activeIndex - 1)}\n >\n <ChevronUp className=\"h-5 w-5\" aria-hidden=\"true\" />\n </Button>\n <span\n role=\"status\"\n aria-live=\"polite\"\n className=\"rounded-full bg-black/45 px-1.5 py-0.5 text-xs whitespace-nowrap text-white tabular-nums backdrop-blur-sm\"\n >\n {/* Its own direction: \"2 / 3\" stays in order in an RTL page, and a\n translated \"2 من 3\" still reads right to left. */}\n <bdi>{labels.position(activeIndex + 1, items.length)}</bdi>\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={labels.next}\n title={labels.next}\n className={cn(overlayButtonClass, 'pointer-events-auto')}\n disabled={activeIndex >= items.length - 1}\n onClick={() => navigate(activeIndex + 1)}\n >\n <ChevronDown className=\"h-5 w-5\" aria-hidden=\"true\" />\n </Button>\n </div>\n ) : (\n <div\n data-slot=\"controls\"\n className={cn(\n 'flex shrink-0 items-center justify-between gap-3 py-2',\n classNames.controls\n )}\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-auto min-h-8 flex-1 py-2 [&_[data-slot=button-label]]:whitespace-normal\"\n disabled={activeIndex <= 0}\n onClick={() => navigate(activeIndex - 1)}\n leftIcon={<ChevronUp className=\"h-4 w-4\" aria-hidden=\"true\" />}\n >\n {labels.previous}\n </Button>\n <span\n role=\"status\"\n aria-live=\"polite\"\n className=\"text-muted-foreground shrink-0 text-sm whitespace-nowrap\"\n >\n {/* Its own direction: \"2 / 3\" stays in order in an RTL page, and a\n translated \"2 من 3\" still reads right to left. */}\n <bdi>{labels.position(activeIndex + 1, items.length)}</bdi>\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-auto min-h-8 flex-1 py-2 [&_[data-slot=button-label]]:whitespace-normal\"\n disabled={activeIndex >= items.length - 1}\n onClick={() => navigate(activeIndex + 1)}\n rightIcon={<ChevronDown className=\"h-4 w-4\" aria-hidden=\"true\" />}\n >\n {labels.next}\n </Button>\n </div>\n );\n\n return (\n <div\n ref={setRoot}\n data-slot=\"root\"\n data-component=\"media-feed\"\n data-layout={layout}\n // The overlay layout is a dark surface in every theme, as video players\n // are; scoping the dark theme keeps library and host content inside it\n // (actions, errors, Retry) on their dark-theme colours.\n data-theme={overlay ? 'dark' : undefined}\n className={cn(\n 'bg-background text-foreground flex h-[min(48rem,80dvh)] min-h-0 w-full flex-col',\n overlay && 'relative',\n classNames.root,\n className\n )}\n {...rest}\n >\n {loading || error || !items.length ? (\n <div\n data-slot=\"status\"\n role={error ? 'alert' : 'status'}\n aria-busy={loading || retrying}\n className={cn(\n 'flex min-h-0 flex-1 flex-col items-center justify-center gap-4 p-6 text-center',\n classNames.status\n )}\n >\n <p className=\"m-0\">\n {loading ? labels.loading : error || labels.empty}\n </p>\n {error && onRetry && (\n <Button\n type=\"button\"\n variant=\"outline\"\n isLoading={retrying}\n loadingText={labels.loading}\n onClick={() => {\n void retry();\n }}\n >\n {labels.retry}\n </Button>\n )}\n {retryFailed && (\n <p role=\"alert\" className=\"m-0\">\n {labels.error}\n </p>\n )}\n </div>\n ) : (\n <>\n {/* ARIA feeds are focusable composites with scoped item navigation. */}\n {/* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n <div\n ref={viewportRef}\n data-slot=\"viewport\"\n role=\"feed\"\n aria-label={labels.feed}\n aria-busy={false}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n className={cn(\n 'focus-visible:ring-ring relative flex min-h-0 flex-1 snap-y snap-mandatory flex-col overflow-y-auto overscroll-contain focus-visible:ring-2 focus-visible:outline-none',\n !overlay && 'gap-4',\n classNames.viewport\n )}\n >\n {items.map((item, index) => renderCard(item, index, false))}\n </div>\n {/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n {controls}\n </>\n )}\n <Modal\n open={\n allowFullscreen && fullscreen && !loading && !error && !!items.length\n }\n onOpenChange={setFullscreen}\n size=\"full\"\n className=\"h-dvh min-h-0 sm:h-[calc(100dvh-2rem)]\"\n >\n <ModalHeader>\n <ModalTitle>{labels.feed}</ModalTitle>\n <ModalClose aria-label={labels.close} />\n </ModalHeader>\n {/* Fullscreen keeps the same feed navigation; controls retain their keys. */}\n {/* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n <div\n data-slot=\"fullscreen\"\n data-component=\"media-feed\"\n data-layout={layout}\n // Set again here in case Modal ever portals its content out of the\n // feed's dark scope.\n data-theme={overlay ? 'dark' : undefined}\n role=\"feed\"\n aria-label={labels.feed}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n className={cn(\n 'flex min-h-0 flex-1 flex-col px-2 pb-2 sm:px-4',\n overlay && 'relative',\n classNames.fullscreen\n )}\n >\n {activeIndex >= 0 &&\n renderCard(items[activeIndex], activeIndex, true)}\n {controls}\n </div>\n {/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n </Modal>\n </div>\n );\n}\n\nexport const MediaFeed = React.forwardRef(MediaFeedInner) as <T>(\n props: MediaFeedProps<T> & React.RefAttributes<HTMLDivElement>\n) => React.ReactElement;\n\n(MediaFeed as React.NamedExoticComponent).displayName = 'MediaFeed';\n"]}
@@ -830,5 +830,5 @@ var AudioPlayer = React.forwardRef(
830
830
  AudioPlayer.displayName = "AudioPlayer";
831
831
 
832
832
  export { AudioPlayer, ProgressBar, audioPlayerVariants, formatTime, playButtonVariants };
833
- //# sourceMappingURL=chunk-C4GEPUE7.js.map
834
- //# sourceMappingURL=chunk-C4GEPUE7.js.map
833
+ //# sourceMappingURL=chunk-CKECOCYJ.js.map
834
+ //# sourceMappingURL=chunk-CKECOCYJ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/AudioPlayer/AudioPlayer.tsx"],"names":["AudioPlayer"],"mappings":"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","file":"chunk-C4GEPUE7.js","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { isRtl } from '../../hooks/useDirection';\n\n// ============================================================================\n// Types & Interfaces\n// ============================================================================\n\nexport type AudioPlayerState =\n | 'idle'\n | 'loading'\n | 'playing'\n | 'paused'\n | 'error';\n\n/** Ref handle for controlling AudioPlayer programmatically */\nexport interface AudioPlayerRef {\n /** The underlying container element */\n container: HTMLDivElement | null;\n /** Seek to a specific time in seconds */\n seekTo: (time: number) => void;\n /** Start playback */\n play: () => void;\n /** Pause playback */\n pause: () => void;\n /** Get current playback time in seconds */\n getCurrentTime: () => number;\n /** Get total duration in seconds */\n getDuration: () => number;\n}\n\nexport interface AudioPlayerProps extends VariantProps<\n typeof audioPlayerVariants\n> {\n /** Audio source URL */\n src: string;\n /** Title/label for the audio (used for accessibility and display) */\n title?: string;\n /** Callback when playback state changes */\n onStateChange?: (state: AudioPlayerState) => void;\n /** Callback when playback ends */\n onEnded?: () => void;\n /** Callback when an error occurs */\n onError?: (error: Error) => void;\n /** Callback when time updates during playback */\n onTimeUpdate?: (currentTime: number, duration: number) => void;\n /** Whether to show the time display */\n showTime?: boolean;\n /** Whether to show the duration (for inline variant) */\n showDuration?: boolean;\n /** Waveform color (for waveform variant) */\n waveColor?: string;\n /** Progress/played waveform color (for waveform variant) */\n progressColor?: string;\n /** Height of the waveform (for waveform variant) */\n waveformHeight?: number;\n /** Whether to show hover cursor on waveform for click-to-seek preview (for waveform variant) */\n showWaveformHoverCursor?: boolean;\n /** Color of the hover cursor line (for waveform variant) */\n waveformCursorColor?: string;\n /** Whether the player is disabled */\n disabled?: boolean;\n /** Additional class name */\n className?: string;\n /** Accessible label */\n 'aria-label'?: string;\n /** Playback speed options */\n playbackRates?: number[];\n /** Whether to show playback speed control */\n showPlaybackRate?: boolean;\n /** Whether to preload audio (set to false for lists with many items) */\n preload?: boolean;\n /** Fallback duration in seconds to display before audio metadata is loaded */\n fallbackDuration?: number;\n}\n\n// ============================================================================\n// Variants\n// ============================================================================\n\nconst audioPlayerVariants = cva('', {\n variants: {\n variant: {\n inline: 'inline-flex items-center gap-2',\n compact: [\n 'flex items-center gap-3 p-3',\n 'rounded-lg border border-border',\n 'bg-card text-card-foreground',\n ],\n waveform: [\n 'flex flex-col gap-3 p-4',\n 'rounded-xl border border-border',\n 'bg-card text-card-foreground',\n ],\n },\n size: {\n sm: '',\n md: '',\n lg: '',\n },\n },\n compoundVariants: [\n { variant: 'compact', size: 'sm', class: 'p-2 gap-2' },\n { variant: 'compact', size: 'lg', class: 'p-4 gap-4' },\n { variant: 'waveform', size: 'sm', class: 'p-3 gap-2' },\n { variant: 'waveform', size: 'lg', class: 'p-5 gap-4' },\n ],\n defaultVariants: {\n variant: 'compact',\n size: 'md',\n },\n});\n\nconst playButtonVariants = cva(\n [\n 'inline-flex items-center justify-center',\n 'rounded-full transition-all duration-200',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:pointer-events-none disabled:opacity-50',\n 'active:scale-95',\n ],\n {\n variants: {\n variant: {\n inline: [\n 'text-neutral-500 hover:text-neutral-700 hover:bg-neutral-100',\n 'dark:text-neutral-400 dark:hover:text-neutral-200 dark:hover:bg-neutral-800',\n ],\n compact: [\n 'bg-primary-800 text-white',\n 'hover:bg-primary-900',\n 'active:bg-primary-800',\n ],\n waveform: [\n 'bg-primary-800 text-white',\n 'hover:bg-primary-900',\n 'active:bg-primary-800',\n ],\n },\n size: {\n sm: 'h-7 w-7',\n md: 'h-9 w-9',\n lg: 'h-11 w-11',\n },\n },\n defaultVariants: {\n variant: 'compact',\n size: 'md',\n },\n }\n);\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nexport function formatTime(seconds: number): string {\n if (!isFinite(seconds) || isNaN(seconds)) return '0:00';\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n}\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nfunction PlayIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n );\n}\n\nfunction PauseIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\" />\n </svg>\n );\n}\n\nfunction SpinnerIcon({ className }: { className?: string }) {\n return (\n <svg\n className={cn('animate-spin', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Progress Bar Component (for compact variant)\n// ============================================================================\n\ninterface ProgressBarProps {\n currentTime: number;\n duration: number;\n onSeek: (time: number) => void;\n disabled?: boolean;\n}\n\nfunction ProgressBar({\n currentTime,\n duration,\n onSeek,\n disabled,\n}: ProgressBarProps) {\n const progressRef = React.useRef<HTMLDivElement>(null);\n const progress = duration > 0 ? (currentTime / duration) * 100 : 0;\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled || !progressRef.current || duration <= 0) return;\n const rect = progressRef.current.getBoundingClientRect();\n // Progress fills from the inline-start edge: left→right in LTR,\n // right→left in RTL.\n const x = isRtl(progressRef.current)\n ? rect.right - e.clientX\n : e.clientX - rect.left;\n const percentage = x / rect.width;\n onSeek(percentage * duration);\n };\n\n return (\n <div\n ref={progressRef}\n data-slot=\"audio-player-progress\"\n role=\"slider\"\n aria-label=\"Audio progress\"\n aria-valuemin={0}\n aria-valuemax={duration}\n aria-valuenow={currentTime}\n aria-valuetext={`${formatTime(currentTime)} of ${formatTime(duration)}`}\n tabIndex={disabled ? -1 : 0}\n className={cn(\n 'relative h-1.5 flex-1 cursor-pointer rounded-full bg-neutral-200 dark:bg-neutral-700',\n disabled && 'cursor-not-allowed opacity-50'\n )}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (disabled) return;\n const step = duration * 0.05; // 5% steps\n // Horizontal arrows follow the visual direction: in RTL the bar\n // fills right→left, so ArrowLeft seeks forward.\n const rtl = isRtl(e.currentTarget);\n if (e.key === 'ArrowRight' || e.key === 'ArrowLeft') {\n const forward = (e.key === 'ArrowRight') !== rtl;\n onSeek(\n forward\n ? Math.min(currentTime + step, duration)\n : Math.max(currentTime - step, 0)\n );\n }\n }}\n >\n <div\n className=\"bg-primary-800 absolute inset-y-0 start-0 rounded-full transition-all\"\n style={{ width: `${progress}%` }}\n />\n <div\n data-slot=\"audio-player-progress-thumb\"\n className=\"bg-primary-800 absolute top-1/2 h-3 w-3 -translate-y-1/2 rounded-full shadow-sm transition-all\"\n style={{ insetInlineStart: `calc(${progress}% - 6px)` }}\n />\n </div>\n );\n}\n\n// ============================================================================\n// Waveform Component (lazy-loaded WaveSurfer)\n// ============================================================================\n\n/** Methods exposed by Waveform via ref */\nexport interface WaveformMethods {\n seekTo: (time: number) => void;\n play: () => void;\n pause: () => void;\n getCurrentTime: () => number;\n getDuration: () => number;\n}\n\ninterface WaveformProps {\n src: string;\n isPlaying: boolean;\n playbackRate?: number;\n onReady: (duration: number) => void;\n onTimeUpdate: (time: number, duration: number) => void;\n onFinish: () => void;\n onSeek: (time: number) => void;\n waveColor?: string;\n progressColor?: string;\n height?: number;\n showHoverCursor?: boolean;\n onHoverTimeChange?: (time: number | null) => void;\n cursorColor?: string;\n /** Ref to expose waveform control methods */\n waveformRef?: React.MutableRefObject<WaveformMethods | null>;\n}\n\nfunction Waveform({\n src,\n isPlaying,\n playbackRate = 1,\n onReady,\n onTimeUpdate,\n onFinish,\n onSeek,\n waveColor,\n progressColor,\n height = 64,\n showHoverCursor = false,\n waveformRef,\n onHoverTimeChange,\n cursorColor = 'var(--color-red-500, rgb(239, 68, 68))',\n}: WaveformProps) {\n const containerRef = React.useRef<HTMLDivElement>(null);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wavesurferRef = React.useRef<any>(null);\n const [isLoaded, setIsLoaded] = React.useState(false);\n const [isHovering, setIsHovering] = React.useState(false);\n const [hoverPosition, setHoverPosition] = React.useState(0);\n\n // Expose methods via ref for external control\n React.useEffect(() => {\n if (waveformRef) {\n waveformRef.current = {\n seekTo: (time: number) => {\n if (wavesurferRef.current && isLoaded) {\n const duration = wavesurferRef.current.getDuration();\n if (duration > 0) {\n const clampedTime = Math.min(Math.max(time, 0), duration);\n const progress = clampedTime / duration;\n wavesurferRef.current.seekTo(progress);\n }\n }\n },\n play: () => {\n if (wavesurferRef.current && isLoaded) {\n wavesurferRef.current.play();\n }\n },\n pause: () => {\n if (wavesurferRef.current && isLoaded) {\n wavesurferRef.current.pause();\n }\n },\n getCurrentTime: () => {\n return wavesurferRef.current?.getCurrentTime?.() ?? 0;\n },\n getDuration: () => {\n return wavesurferRef.current?.getDuration?.() ?? 0;\n },\n };\n }\n return () => {\n if (waveformRef) {\n waveformRef.current = null;\n }\n };\n }, [waveformRef, isLoaded]);\n\n // Initialize WaveSurfer\n React.useEffect(() => {\n if (!containerRef.current) return;\n\n const initWaveSurfer = async () => {\n try {\n const WaveSurfer = (await import('wavesurfer.js')).default;\n\n if (wavesurferRef.current) {\n wavesurferRef.current.destroy();\n }\n\n wavesurferRef.current = WaveSurfer.create({\n container: containerRef.current!,\n waveColor: waveColor || '#d1d5db',\n progressColor: progressColor || 'var(--color-primary-600, #2563eb)',\n cursorColor: 'transparent',\n barWidth: 2,\n barGap: 2,\n barRadius: 2,\n height,\n normalize: true,\n interact: !showHoverCursor,\n });\n\n const emitTimeUpdate = () => {\n onTimeUpdate(\n wavesurferRef.current.getCurrentTime(),\n wavesurferRef.current.getDuration()\n );\n };\n\n wavesurferRef.current.on('ready', () => {\n setIsLoaded(true);\n const duration = wavesurferRef.current.getDuration();\n onReady(duration);\n onTimeUpdate(wavesurferRef.current.getCurrentTime(), duration);\n });\n\n wavesurferRef.current.on('timeupdate', emitTimeUpdate);\n wavesurferRef.current.on('audioprocess', emitTimeUpdate);\n\n wavesurferRef.current.on('seeking', () => {\n emitTimeUpdate();\n });\n\n if (!showHoverCursor) {\n wavesurferRef.current.on('interaction', () => {\n onSeek(wavesurferRef.current.getCurrentTime());\n });\n }\n\n wavesurferRef.current.on('finish', () => {\n onFinish();\n });\n\n wavesurferRef.current.load(src);\n } catch (error) {\n console.error('Failed to load WaveSurfer:', error);\n }\n };\n\n setIsLoaded(false);\n initWaveSurfer();\n\n return () => {\n if (wavesurferRef.current) {\n wavesurferRef.current.destroy();\n wavesurferRef.current = null;\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [src, showHoverCursor]);\n\n // Handle play/pause\n React.useEffect(() => {\n if (!wavesurferRef.current || !isLoaded) return;\n\n if (isPlaying) {\n wavesurferRef.current.play();\n } else {\n wavesurferRef.current.pause();\n }\n }, [isPlaying, isLoaded]);\n\n // Handle playback rate changes\n React.useEffect(() => {\n if (!wavesurferRef.current || !isLoaded) return;\n wavesurferRef.current.setPlaybackRate(playbackRate);\n }, [playbackRate, isLoaded]);\n\n // Hover cursor handlers\n const handleMouseMove = showHoverCursor\n ? (e: React.MouseEvent<HTMLDivElement>) => {\n if (!containerRef.current || !wavesurferRef.current || !isLoaded)\n return;\n const rect = containerRef.current.getBoundingClientRect();\n const x = Math.max(0, Math.min(e.clientX - rect.left, rect.width));\n const percentage = x / rect.width;\n const duration = wavesurferRef.current.getDuration();\n setHoverPosition(percentage * 100);\n onHoverTimeChange?.(percentage * duration);\n }\n : undefined;\n\n const handleMouseEnter = showHoverCursor\n ? () => setIsHovering(true)\n : undefined;\n\n const handleMouseLeave = showHoverCursor\n ? () => {\n setIsHovering(false);\n setHoverPosition(0);\n onHoverTimeChange?.(null);\n }\n : undefined;\n\n const handleClick = showHoverCursor\n ? (e: React.MouseEvent<HTMLDivElement>) => {\n if (!containerRef.current || !wavesurferRef.current || !isLoaded)\n return;\n const rect = containerRef.current.getBoundingClientRect();\n const x = Math.max(0, Math.min(e.clientX - rect.left, rect.width));\n const percentage = x / rect.width;\n const duration = wavesurferRef.current.getDuration();\n const time = duration * percentage;\n wavesurferRef.current.seekTo(percentage);\n onSeek(time);\n onTimeUpdate(time, duration);\n onHoverTimeChange?.(null);\n }\n : undefined;\n\n const handleKeyDown = showHoverCursor\n ? (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (!wavesurferRef.current || !isLoaded) return;\n const duration = wavesurferRef.current.getDuration();\n const currentTime = wavesurferRef.current.getCurrentTime();\n const step = duration * 0.05; // 5% steps\n\n if (e.key === 'ArrowRight') {\n e.preventDefault();\n const newTime = Math.min(currentTime + step, duration);\n wavesurferRef.current.seekTo(newTime / duration);\n onSeek(newTime);\n onTimeUpdate(newTime, duration);\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n const newTime = Math.max(currentTime - step, 0);\n wavesurferRef.current.seekTo(newTime / duration);\n onSeek(newTime);\n onTimeUpdate(newTime, duration);\n }\n }\n : undefined;\n\n return (\n <div\n ref={containerRef}\n data-slot=\"audio-player-waveform\"\n // WaveSurfer draws its canvas physically left→right regardless of\n // document direction, so the waveform is an LTR island — cursor math,\n // click/keyboard seeking, and the canvas all stay physical.\n dir=\"ltr\"\n role={showHoverCursor ? 'slider' : undefined}\n aria-label={showHoverCursor ? 'Audio progress' : undefined}\n aria-valuemin={showHoverCursor ? 0 : undefined}\n aria-valuemax={\n showHoverCursor\n ? (wavesurferRef.current?.getDuration() ?? 0)\n : undefined\n }\n aria-valuenow={\n showHoverCursor\n ? (wavesurferRef.current?.getCurrentTime() ?? 0)\n : undefined\n }\n tabIndex={showHoverCursor ? 0 : undefined}\n className={cn(\n 'relative w-full rounded-lg bg-neutral-100 dark:bg-neutral-800',\n showHoverCursor && 'cursor-pointer',\n !isLoaded && 'animate-pulse'\n )}\n style={{ height }}\n onMouseMove={handleMouseMove}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {/* Hover cursor line */}\n {showHoverCursor && isHovering && isLoaded && (\n <div\n className=\"pointer-events-none absolute top-0 bottom-0 z-10 w-0.5\"\n // rtl-ignore -- anchored to the WaveSurfer canvas, an LTR island\n style={{ left: `${hoverPosition}%`, backgroundColor: cursorColor }}\n />\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Main AudioPlayer Component\n// ============================================================================\n\n/**\n * A versatile audio player component with multiple display variants.\n *\n * @example\n * ```tsx\n * // Inline - minimal, just play button and duration\n * <AudioPlayer src=\"/audio.mp3\" variant=\"inline\" showDuration />\n *\n * // Compact - play button, progress bar, and time\n * <AudioPlayer src=\"/audio.mp3\" variant=\"compact\" showTime />\n *\n * // Waveform - full visualization with WaveSurfer\n * <AudioPlayer src=\"/audio.mp3\" variant=\"waveform\" showTime />\n *\n * // With ref for programmatic control\n * const playerRef = useRef<AudioPlayerRef>(null);\n * <AudioPlayer ref={playerRef} src=\"/audio.mp3\" variant=\"waveform\" />\n * // Then: playerRef.current?.seekTo(30); playerRef.current?.play();\n * ```\n */\nconst AudioPlayer = React.forwardRef<AudioPlayerRef, AudioPlayerProps>(\n function AudioPlayer(\n {\n src,\n title,\n variant = 'compact',\n size = 'md',\n onStateChange,\n onEnded,\n onError,\n onTimeUpdate,\n showTime = true,\n showDuration = true,\n waveColor,\n progressColor,\n waveformHeight = 64,\n showWaveformHoverCursor = true,\n waveformCursorColor,\n disabled = false,\n className,\n 'aria-label': ariaLabel,\n playbackRates = [0.5, 0.75, 1, 1.25, 1.5, 2],\n showPlaybackRate = false,\n /** Whether to preload audio (set to false for lists with many items) */\n preload = false,\n /** Fallback duration in seconds to display before audio is loaded */\n fallbackDuration,\n },\n ref\n ) {\n const [state, setState] = React.useState<AudioPlayerState>('idle');\n const [currentTime, setCurrentTime] = React.useState(0);\n const [duration, setDuration] = React.useState(0);\n const [playbackRate, setPlaybackRate] = React.useState(1);\n const [audioInitialized, setAudioInitialized] = React.useState(false);\n const [hoverTime, setHoverTime] = React.useState<number | null>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const audioRef = React.useRef<globalThis.HTMLAudioElement | null>(null);\n const waveformMethodsRef = React.useRef<WaveformMethods | null>(null);\n\n const isPlaying = state === 'playing';\n const isLoading = state === 'loading';\n const displayDuration = duration > 0 ? duration : (fallbackDuration ?? 0);\n\n // Update state helper\n const updateState = React.useCallback(\n (newState: AudioPlayerState) => {\n setState(newState);\n onStateChange?.(newState);\n },\n [onStateChange]\n );\n\n // Initialize audio element (for non-waveform variants)\n const initAudio = React.useCallback(() => {\n if (variant === 'waveform' || audioInitialized) return null;\n\n const audio = new globalThis.Audio(src);\n audioRef.current = audio;\n setAudioInitialized(true);\n\n audio.addEventListener('loadstart', () => updateState('loading'));\n audio.addEventListener('canplay', () => {\n updateState('idle');\n });\n audio.addEventListener('loadedmetadata', () => {\n setDuration(audio.duration);\n onTimeUpdate?.(audio.currentTime, audio.duration);\n });\n audio.addEventListener('timeupdate', () => {\n setCurrentTime(audio.currentTime);\n onTimeUpdate?.(audio.currentTime, audio.duration);\n });\n audio.addEventListener('ended', () => {\n updateState('idle');\n setCurrentTime(0);\n onEnded?.();\n });\n audio.addEventListener('error', () => {\n updateState('error');\n onError?.(new Error('Failed to load audio'));\n });\n\n return audio;\n }, [\n src,\n variant,\n audioInitialized,\n updateState,\n onTimeUpdate,\n onEnded,\n onError,\n ]);\n\n // Expose methods via ref for external control\n React.useImperativeHandle(\n ref,\n () => ({\n get container() {\n return containerRef.current;\n },\n seekTo: (time: number) => {\n if (variant === 'waveform') {\n waveformMethodsRef.current?.seekTo(time);\n } else {\n // Lazily initialize audio if not yet created\n if (!audioRef.current) {\n initAudio();\n }\n if (audioRef.current) {\n audioRef.current.currentTime = time;\n }\n }\n },\n play: () => {\n if (variant === 'waveform') {\n if (waveformMethodsRef.current) {\n waveformMethodsRef.current.play();\n updateState('playing');\n }\n } else {\n // Lazily initialize audio if not yet created\n if (!audioRef.current) {\n initAudio();\n }\n if (audioRef.current) {\n audioRef.current.play().catch((error) => {\n updateState('error');\n onError?.(error);\n });\n updateState('playing');\n }\n }\n },\n pause: () => {\n if (variant === 'waveform') {\n if (waveformMethodsRef.current) {\n waveformMethodsRef.current.pause();\n updateState('paused');\n }\n } else if (audioRef.current) {\n audioRef.current.pause();\n updateState('paused');\n }\n },\n getCurrentTime: () => {\n if (variant === 'waveform') {\n return waveformMethodsRef.current?.getCurrentTime() ?? 0;\n }\n return audioRef.current?.currentTime ?? 0;\n },\n getDuration: () => {\n if (variant === 'waveform') {\n return waveformMethodsRef.current?.getDuration() ?? 0;\n }\n const rawDuration = audioRef.current?.duration;\n return Number.isFinite(rawDuration) ? rawDuration! : 0;\n },\n }),\n [variant, initAudio, updateState, onError]\n );\n\n // Auto-initialize if preload is true\n React.useEffect(() => {\n if (preload && !audioInitialized && variant !== 'waveform') {\n initAudio();\n }\n }, [preload, audioInitialized, variant, initAudio]);\n\n // Cleanup on unmount\n React.useEffect(() => {\n return () => {\n if (audioRef.current) {\n audioRef.current.pause();\n audioRef.current.src = '';\n }\n };\n }, []);\n\n // Handle playback rate changes\n React.useEffect(() => {\n if (audioRef.current) {\n audioRef.current.playbackRate = playbackRate;\n }\n }, [playbackRate]);\n\n const handlePlay = React.useCallback(() => {\n if (disabled) return;\n\n // Waveform variant uses WaveSurfer for playback - just toggle state\n if (variant === 'waveform') {\n if (isLoading) return;\n updateState(isPlaying ? 'paused' : 'playing');\n return;\n }\n\n // Lazy initialize audio on first play\n if (!audioInitialized && !isLoading) {\n const audio = initAudio();\n if (audio) {\n updateState('loading');\n audio.addEventListener(\n 'canplay',\n () => {\n audio.play().catch((error) => {\n updateState('error');\n onError?.(error);\n });\n updateState('playing');\n },\n { once: true }\n );\n }\n return;\n }\n\n if (isLoading) return;\n\n if (isPlaying) {\n if (audioRef.current) {\n audioRef.current.pause();\n }\n updateState('paused');\n } else {\n if (audioRef.current) {\n audioRef.current.play().catch((error) => {\n updateState('error');\n onError?.(error);\n });\n updateState('playing');\n }\n }\n }, [\n disabled,\n variant,\n audioInitialized,\n isLoading,\n isPlaying,\n initAudio,\n updateState,\n onError,\n ]);\n\n const handleSeek = React.useCallback(\n (time: number) => {\n if (audioRef.current) {\n audioRef.current.currentTime = time;\n setCurrentTime(time);\n onTimeUpdate?.(time, audioRef.current.duration);\n }\n },\n [onTimeUpdate]\n );\n\n // Waveform callbacks\n const handleWaveformReady = React.useCallback(\n (dur: number) => {\n setDuration(dur);\n setState('idle');\n onTimeUpdate?.(currentTime, dur);\n },\n [currentTime, onTimeUpdate]\n );\n\n const handleWaveformTimeUpdate = React.useCallback(\n (time: number, dur: number) => {\n setCurrentTime(time);\n if (dur > 0) {\n setDuration(dur);\n }\n onTimeUpdate?.(time, dur);\n },\n [onTimeUpdate]\n );\n\n const handleWaveformFinish = React.useCallback(() => {\n updateState('idle');\n setCurrentTime(0);\n onEnded?.();\n }, [updateState, onEnded]);\n\n const handleWaveformSeek = React.useCallback((time: number) => {\n setCurrentTime(time);\n }, []);\n\n const handleHoverTimeChange = React.useCallback((time: number | null) => {\n setHoverTime(time);\n }, []);\n\n const iconSize =\n size === 'sm' ? 'h-3.5 w-3.5' : size === 'lg' ? 'h-5 w-5' : 'h-4 w-4';\n\n const getAriaLabel = () => {\n if (ariaLabel) return ariaLabel;\n if (title) return `${isPlaying ? 'Pause' : 'Play'} ${title}`;\n return isPlaying ? 'Pause audio' : 'Play audio';\n };\n\n const renderPlayButton = () => (\n <button\n type=\"button\"\n data-slot=\"audio-player-play-btn\"\n onClick={handlePlay}\n disabled={disabled || isLoading}\n className={cn(playButtonVariants({ variant, size }))}\n aria-label={getAriaLabel()}\n aria-pressed={isPlaying}\n >\n {isLoading ? (\n <SpinnerIcon className={iconSize} />\n ) : isPlaying ? (\n <PauseIcon className={iconSize} />\n ) : (\n <PlayIcon className={iconSize} />\n )}\n </button>\n );\n\n const renderTime = (useHoverTime = false) => {\n if (!showTime) return null;\n const displayTime =\n useHoverTime && hoverTime !== null ? hoverTime : currentTime;\n const isShowingHoverTime = useHoverTime && hoverTime !== null;\n return (\n <span\n data-slot=\"audio-player-time\"\n className={cn(\n 'font-mono text-xs tabular-nums',\n isShowingHoverTime\n ? 'text-primary-800 dark:text-primary-400'\n : 'text-neutral-600 dark:text-neutral-400'\n )}\n >\n {formatTime(displayTime)} / {formatTime(displayDuration)}\n </span>\n );\n };\n\n const renderPlaybackRateControl = () => {\n if (!showPlaybackRate) return null;\n return (\n <select\n data-slot=\"audio-player-rate\"\n value={playbackRate}\n onChange={(e) => setPlaybackRate(Number(e.target.value))}\n className=\"rounded border border-neutral-200 bg-transparent px-1 py-0.5 text-xs dark:border-neutral-700\"\n aria-label=\"Playback speed\"\n >\n {playbackRates.map((rate) => (\n <option key={rate} value={rate}>\n {rate}x\n </option>\n ))}\n </select>\n );\n };\n\n // ============================================================================\n // Inline Variant\n // ============================================================================\n if (variant === 'inline') {\n return (\n <div\n ref={containerRef}\n data-slot=\"audio-player\"\n data-variant=\"inline\"\n className={cn(audioPlayerVariants({ variant, size }), className)}\n >\n {renderPlayButton()}\n {title && (\n <span\n data-slot=\"audio-player-title\"\n className=\"text-sm font-medium text-neutral-700 dark:text-neutral-300\"\n >\n {title}\n </span>\n )}\n {showDuration && displayDuration > 0 && (\n <span\n data-slot=\"audio-player-duration\"\n className=\"font-mono text-xs text-neutral-500 tabular-nums dark:text-neutral-400\"\n >\n {isPlaying\n ? formatTime(currentTime)\n : formatTime(displayDuration)}\n </span>\n )}\n </div>\n );\n }\n\n // Compact Variant\n // ============================================================================\n if (variant === 'compact') {\n return (\n <div\n ref={containerRef}\n data-slot=\"audio-player\"\n data-variant=\"compact\"\n className={cn(audioPlayerVariants({ variant, size }), className)}\n >\n {renderPlayButton()}\n <ProgressBar\n currentTime={currentTime}\n duration={displayDuration}\n onSeek={handleSeek}\n disabled={disabled}\n />\n {renderTime()}\n {renderPlaybackRateControl()}\n </div>\n );\n }\n\n // ============================================================================\n // Waveform Variant\n // ============================================================================\n return (\n <div\n ref={containerRef}\n data-slot=\"audio-player\"\n data-variant=\"waveform\"\n className={cn(audioPlayerVariants({ variant, size }), className)}\n >\n {title && (\n <span\n data-slot=\"audio-player-title\"\n className=\"text-sm font-medium text-neutral-700 dark:text-neutral-300\"\n >\n {title}\n </span>\n )}\n <Waveform\n src={src}\n isPlaying={isPlaying}\n playbackRate={playbackRate}\n onReady={handleWaveformReady}\n onTimeUpdate={handleWaveformTimeUpdate}\n onFinish={handleWaveformFinish}\n onSeek={handleWaveformSeek}\n waveColor={waveColor}\n progressColor={progressColor}\n height={waveformHeight}\n showHoverCursor={showWaveformHoverCursor}\n onHoverTimeChange={handleHoverTimeChange}\n cursorColor={waveformCursorColor}\n waveformRef={waveformMethodsRef}\n />\n <div\n data-slot=\"audio-player-controls\"\n className=\"flex items-center gap-3\"\n >\n {renderPlayButton()}\n <div className=\"flex flex-1 items-center justify-between\">\n {renderTime(true)}\n {renderPlaybackRateControl()}\n </div>\n </div>\n </div>\n );\n }\n);\n\nAudioPlayer.displayName = 'AudioPlayer';\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { AudioPlayer, audioPlayerVariants, playButtonVariants, ProgressBar };\n"]}
1
+ {"version":3,"sources":["../src/components/AudioPlayer/AudioPlayer.tsx"],"names":["AudioPlayer"],"mappings":"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","file":"chunk-CKECOCYJ.js","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { isRtl } from '../../hooks/useDirection';\n\n// ============================================================================\n// Types & Interfaces\n// ============================================================================\n\nexport type AudioPlayerState =\n | 'idle'\n | 'loading'\n | 'playing'\n | 'paused'\n | 'error';\n\n/** Ref handle for controlling AudioPlayer programmatically */\nexport interface AudioPlayerRef {\n /** The underlying container element */\n container: HTMLDivElement | null;\n /** Seek to a specific time in seconds */\n seekTo: (time: number) => void;\n /** Start playback */\n play: () => void;\n /** Pause playback */\n pause: () => void;\n /** Get current playback time in seconds */\n getCurrentTime: () => number;\n /** Get total duration in seconds */\n getDuration: () => number;\n}\n\nexport interface AudioPlayerProps extends VariantProps<\n typeof audioPlayerVariants\n> {\n /** Audio source URL */\n src: string;\n /** Title/label for the audio (used for accessibility and display) */\n title?: string;\n /** Callback when playback state changes */\n onStateChange?: (state: AudioPlayerState) => void;\n /** Callback when playback ends */\n onEnded?: () => void;\n /** Callback when an error occurs */\n onError?: (error: Error) => void;\n /** Callback when time updates during playback */\n onTimeUpdate?: (currentTime: number, duration: number) => void;\n /** Whether to show the time display */\n showTime?: boolean;\n /** Whether to show the duration (for inline variant) */\n showDuration?: boolean;\n /** Waveform color (for waveform variant) */\n waveColor?: string;\n /** Progress/played waveform color (for waveform variant) */\n progressColor?: string;\n /** Height of the waveform (for waveform variant) */\n waveformHeight?: number;\n /** Whether to show hover cursor on waveform for click-to-seek preview (for waveform variant) */\n showWaveformHoverCursor?: boolean;\n /** Color of the hover cursor line (for waveform variant) */\n waveformCursorColor?: string;\n /** Whether the player is disabled */\n disabled?: boolean;\n /** Additional class name */\n className?: string;\n /** Accessible label */\n 'aria-label'?: string;\n /** Playback speed options */\n playbackRates?: number[];\n /** Whether to show playback speed control */\n showPlaybackRate?: boolean;\n /** Whether to preload audio (set to false for lists with many items) */\n preload?: boolean;\n /** Fallback duration in seconds to display before audio metadata is loaded */\n fallbackDuration?: number;\n}\n\n// ============================================================================\n// Variants\n// ============================================================================\n\nconst audioPlayerVariants = cva('', {\n variants: {\n variant: {\n inline: 'inline-flex items-center gap-2',\n compact: [\n 'flex items-center gap-3 p-3',\n 'rounded-lg border border-border',\n 'bg-card text-card-foreground',\n ],\n waveform: [\n 'flex flex-col gap-3 p-4',\n 'rounded-xl border border-border',\n 'bg-card text-card-foreground',\n ],\n },\n size: {\n sm: '',\n md: '',\n lg: '',\n },\n },\n compoundVariants: [\n { variant: 'compact', size: 'sm', class: 'p-2 gap-2' },\n { variant: 'compact', size: 'lg', class: 'p-4 gap-4' },\n { variant: 'waveform', size: 'sm', class: 'p-3 gap-2' },\n { variant: 'waveform', size: 'lg', class: 'p-5 gap-4' },\n ],\n defaultVariants: {\n variant: 'compact',\n size: 'md',\n },\n});\n\nconst playButtonVariants = cva(\n [\n 'inline-flex items-center justify-center',\n 'rounded-full transition-all duration-200',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:pointer-events-none disabled:opacity-50',\n 'active:scale-95',\n ],\n {\n variants: {\n variant: {\n inline: [\n 'text-neutral-500 hover:text-neutral-700 hover:bg-neutral-100',\n 'dark:text-neutral-400 dark:hover:text-neutral-200 dark:hover:bg-neutral-800',\n ],\n compact: [\n 'bg-primary-800 text-white',\n 'hover:bg-primary-900',\n 'active:bg-primary-800',\n ],\n waveform: [\n 'bg-primary-800 text-white',\n 'hover:bg-primary-900',\n 'active:bg-primary-800',\n ],\n },\n size: {\n sm: 'h-7 w-7',\n md: 'h-9 w-9',\n lg: 'h-11 w-11',\n },\n },\n defaultVariants: {\n variant: 'compact',\n size: 'md',\n },\n }\n);\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nexport function formatTime(seconds: number): string {\n if (!isFinite(seconds) || isNaN(seconds)) return '0:00';\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n}\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nfunction PlayIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n );\n}\n\nfunction PauseIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\" />\n </svg>\n );\n}\n\nfunction SpinnerIcon({ className }: { className?: string }) {\n return (\n <svg\n className={cn('animate-spin', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Progress Bar Component (for compact variant)\n// ============================================================================\n\ninterface ProgressBarProps {\n currentTime: number;\n duration: number;\n onSeek: (time: number) => void;\n disabled?: boolean;\n}\n\nfunction ProgressBar({\n currentTime,\n duration,\n onSeek,\n disabled,\n}: ProgressBarProps) {\n const progressRef = React.useRef<HTMLDivElement>(null);\n const progress = duration > 0 ? (currentTime / duration) * 100 : 0;\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled || !progressRef.current || duration <= 0) return;\n const rect = progressRef.current.getBoundingClientRect();\n // Progress fills from the inline-start edge: left→right in LTR,\n // right→left in RTL.\n const x = isRtl(progressRef.current)\n ? rect.right - e.clientX\n : e.clientX - rect.left;\n const percentage = x / rect.width;\n onSeek(percentage * duration);\n };\n\n return (\n <div\n ref={progressRef}\n data-slot=\"audio-player-progress\"\n role=\"slider\"\n aria-label=\"Audio progress\"\n aria-valuemin={0}\n aria-valuemax={duration}\n aria-valuenow={currentTime}\n aria-valuetext={`${formatTime(currentTime)} of ${formatTime(duration)}`}\n tabIndex={disabled ? -1 : 0}\n className={cn(\n 'relative h-1.5 flex-1 cursor-pointer rounded-full bg-neutral-200 dark:bg-neutral-700',\n disabled && 'cursor-not-allowed opacity-50'\n )}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (disabled) return;\n const step = duration * 0.05; // 5% steps\n // Horizontal arrows follow the visual direction: in RTL the bar\n // fills right→left, so ArrowLeft seeks forward.\n const rtl = isRtl(e.currentTarget);\n if (e.key === 'ArrowRight' || e.key === 'ArrowLeft') {\n const forward = (e.key === 'ArrowRight') !== rtl;\n onSeek(\n forward\n ? Math.min(currentTime + step, duration)\n : Math.max(currentTime - step, 0)\n );\n }\n }}\n >\n <div\n className=\"bg-primary-800 absolute inset-y-0 start-0 rounded-full transition-all\"\n style={{ width: `${progress}%` }}\n />\n <div\n data-slot=\"audio-player-progress-thumb\"\n className=\"bg-primary-800 absolute top-1/2 h-3 w-3 -translate-y-1/2 rounded-full shadow-sm transition-all\"\n style={{ insetInlineStart: `calc(${progress}% - 6px)` }}\n />\n </div>\n );\n}\n\n// ============================================================================\n// Waveform Component (lazy-loaded WaveSurfer)\n// ============================================================================\n\n/** Methods exposed by Waveform via ref */\nexport interface WaveformMethods {\n seekTo: (time: number) => void;\n play: () => void;\n pause: () => void;\n getCurrentTime: () => number;\n getDuration: () => number;\n}\n\ninterface WaveformProps {\n src: string;\n isPlaying: boolean;\n playbackRate?: number;\n onReady: (duration: number) => void;\n onTimeUpdate: (time: number, duration: number) => void;\n onFinish: () => void;\n onSeek: (time: number) => void;\n waveColor?: string;\n progressColor?: string;\n height?: number;\n showHoverCursor?: boolean;\n onHoverTimeChange?: (time: number | null) => void;\n cursorColor?: string;\n /** Ref to expose waveform control methods */\n waveformRef?: React.MutableRefObject<WaveformMethods | null>;\n}\n\nfunction Waveform({\n src,\n isPlaying,\n playbackRate = 1,\n onReady,\n onTimeUpdate,\n onFinish,\n onSeek,\n waveColor,\n progressColor,\n height = 64,\n showHoverCursor = false,\n waveformRef,\n onHoverTimeChange,\n cursorColor = 'var(--color-red-500, rgb(239, 68, 68))',\n}: WaveformProps) {\n const containerRef = React.useRef<HTMLDivElement>(null);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wavesurferRef = React.useRef<any>(null);\n const [isLoaded, setIsLoaded] = React.useState(false);\n const [isHovering, setIsHovering] = React.useState(false);\n const [hoverPosition, setHoverPosition] = React.useState(0);\n\n // Expose methods via ref for external control\n React.useEffect(() => {\n if (waveformRef) {\n waveformRef.current = {\n seekTo: (time: number) => {\n if (wavesurferRef.current && isLoaded) {\n const duration = wavesurferRef.current.getDuration();\n if (duration > 0) {\n const clampedTime = Math.min(Math.max(time, 0), duration);\n const progress = clampedTime / duration;\n wavesurferRef.current.seekTo(progress);\n }\n }\n },\n play: () => {\n if (wavesurferRef.current && isLoaded) {\n wavesurferRef.current.play();\n }\n },\n pause: () => {\n if (wavesurferRef.current && isLoaded) {\n wavesurferRef.current.pause();\n }\n },\n getCurrentTime: () => {\n return wavesurferRef.current?.getCurrentTime?.() ?? 0;\n },\n getDuration: () => {\n return wavesurferRef.current?.getDuration?.() ?? 0;\n },\n };\n }\n return () => {\n if (waveformRef) {\n waveformRef.current = null;\n }\n };\n }, [waveformRef, isLoaded]);\n\n // Initialize WaveSurfer\n React.useEffect(() => {\n if (!containerRef.current) return;\n\n const initWaveSurfer = async () => {\n try {\n const WaveSurfer = (await import('wavesurfer.js')).default;\n\n if (wavesurferRef.current) {\n wavesurferRef.current.destroy();\n }\n\n wavesurferRef.current = WaveSurfer.create({\n container: containerRef.current!,\n waveColor: waveColor || '#d1d5db',\n progressColor: progressColor || 'var(--color-primary-600, #2563eb)',\n cursorColor: 'transparent',\n barWidth: 2,\n barGap: 2,\n barRadius: 2,\n height,\n normalize: true,\n interact: !showHoverCursor,\n });\n\n const emitTimeUpdate = () => {\n onTimeUpdate(\n wavesurferRef.current.getCurrentTime(),\n wavesurferRef.current.getDuration()\n );\n };\n\n wavesurferRef.current.on('ready', () => {\n setIsLoaded(true);\n const duration = wavesurferRef.current.getDuration();\n onReady(duration);\n onTimeUpdate(wavesurferRef.current.getCurrentTime(), duration);\n });\n\n wavesurferRef.current.on('timeupdate', emitTimeUpdate);\n wavesurferRef.current.on('audioprocess', emitTimeUpdate);\n\n wavesurferRef.current.on('seeking', () => {\n emitTimeUpdate();\n });\n\n if (!showHoverCursor) {\n wavesurferRef.current.on('interaction', () => {\n onSeek(wavesurferRef.current.getCurrentTime());\n });\n }\n\n wavesurferRef.current.on('finish', () => {\n onFinish();\n });\n\n wavesurferRef.current.load(src);\n } catch (error) {\n console.error('Failed to load WaveSurfer:', error);\n }\n };\n\n setIsLoaded(false);\n initWaveSurfer();\n\n return () => {\n if (wavesurferRef.current) {\n wavesurferRef.current.destroy();\n wavesurferRef.current = null;\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [src, showHoverCursor]);\n\n // Handle play/pause\n React.useEffect(() => {\n if (!wavesurferRef.current || !isLoaded) return;\n\n if (isPlaying) {\n wavesurferRef.current.play();\n } else {\n wavesurferRef.current.pause();\n }\n }, [isPlaying, isLoaded]);\n\n // Handle playback rate changes\n React.useEffect(() => {\n if (!wavesurferRef.current || !isLoaded) return;\n wavesurferRef.current.setPlaybackRate(playbackRate);\n }, [playbackRate, isLoaded]);\n\n // Hover cursor handlers\n const handleMouseMove = showHoverCursor\n ? (e: React.MouseEvent<HTMLDivElement>) => {\n if (!containerRef.current || !wavesurferRef.current || !isLoaded)\n return;\n const rect = containerRef.current.getBoundingClientRect();\n const x = Math.max(0, Math.min(e.clientX - rect.left, rect.width));\n const percentage = x / rect.width;\n const duration = wavesurferRef.current.getDuration();\n setHoverPosition(percentage * 100);\n onHoverTimeChange?.(percentage * duration);\n }\n : undefined;\n\n const handleMouseEnter = showHoverCursor\n ? () => setIsHovering(true)\n : undefined;\n\n const handleMouseLeave = showHoverCursor\n ? () => {\n setIsHovering(false);\n setHoverPosition(0);\n onHoverTimeChange?.(null);\n }\n : undefined;\n\n const handleClick = showHoverCursor\n ? (e: React.MouseEvent<HTMLDivElement>) => {\n if (!containerRef.current || !wavesurferRef.current || !isLoaded)\n return;\n const rect = containerRef.current.getBoundingClientRect();\n const x = Math.max(0, Math.min(e.clientX - rect.left, rect.width));\n const percentage = x / rect.width;\n const duration = wavesurferRef.current.getDuration();\n const time = duration * percentage;\n wavesurferRef.current.seekTo(percentage);\n onSeek(time);\n onTimeUpdate(time, duration);\n onHoverTimeChange?.(null);\n }\n : undefined;\n\n const handleKeyDown = showHoverCursor\n ? (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (!wavesurferRef.current || !isLoaded) return;\n const duration = wavesurferRef.current.getDuration();\n const currentTime = wavesurferRef.current.getCurrentTime();\n const step = duration * 0.05; // 5% steps\n\n if (e.key === 'ArrowRight') {\n e.preventDefault();\n const newTime = Math.min(currentTime + step, duration);\n wavesurferRef.current.seekTo(newTime / duration);\n onSeek(newTime);\n onTimeUpdate(newTime, duration);\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n const newTime = Math.max(currentTime - step, 0);\n wavesurferRef.current.seekTo(newTime / duration);\n onSeek(newTime);\n onTimeUpdate(newTime, duration);\n }\n }\n : undefined;\n\n return (\n <div\n ref={containerRef}\n data-slot=\"audio-player-waveform\"\n // WaveSurfer draws its canvas physically left→right regardless of\n // document direction, so the waveform is an LTR island — cursor math,\n // click/keyboard seeking, and the canvas all stay physical.\n dir=\"ltr\"\n role={showHoverCursor ? 'slider' : undefined}\n aria-label={showHoverCursor ? 'Audio progress' : undefined}\n aria-valuemin={showHoverCursor ? 0 : undefined}\n aria-valuemax={\n showHoverCursor\n ? (wavesurferRef.current?.getDuration() ?? 0)\n : undefined\n }\n aria-valuenow={\n showHoverCursor\n ? (wavesurferRef.current?.getCurrentTime() ?? 0)\n : undefined\n }\n tabIndex={showHoverCursor ? 0 : undefined}\n className={cn(\n 'relative w-full rounded-lg bg-neutral-100 dark:bg-neutral-800',\n showHoverCursor && 'cursor-pointer',\n !isLoaded && 'animate-pulse'\n )}\n style={{ height }}\n onMouseMove={handleMouseMove}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {/* Hover cursor line */}\n {showHoverCursor && isHovering && isLoaded && (\n <div\n className=\"pointer-events-none absolute top-0 bottom-0 z-10 w-0.5\"\n // rtl-ignore -- anchored to the WaveSurfer canvas, an LTR island\n style={{ left: `${hoverPosition}%`, backgroundColor: cursorColor }}\n />\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Main AudioPlayer Component\n// ============================================================================\n\n/**\n * A versatile audio player component with multiple display variants.\n *\n * @example\n * ```tsx\n * // Inline - minimal, just play button and duration\n * <AudioPlayer src=\"/audio.mp3\" variant=\"inline\" showDuration />\n *\n * // Compact - play button, progress bar, and time\n * <AudioPlayer src=\"/audio.mp3\" variant=\"compact\" showTime />\n *\n * // Waveform - full visualization with WaveSurfer\n * <AudioPlayer src=\"/audio.mp3\" variant=\"waveform\" showTime />\n *\n * // With ref for programmatic control\n * const playerRef = useRef<AudioPlayerRef>(null);\n * <AudioPlayer ref={playerRef} src=\"/audio.mp3\" variant=\"waveform\" />\n * // Then: playerRef.current?.seekTo(30); playerRef.current?.play();\n * ```\n */\nconst AudioPlayer = React.forwardRef<AudioPlayerRef, AudioPlayerProps>(\n function AudioPlayer(\n {\n src,\n title,\n variant = 'compact',\n size = 'md',\n onStateChange,\n onEnded,\n onError,\n onTimeUpdate,\n showTime = true,\n showDuration = true,\n waveColor,\n progressColor,\n waveformHeight = 64,\n showWaveformHoverCursor = true,\n waveformCursorColor,\n disabled = false,\n className,\n 'aria-label': ariaLabel,\n playbackRates = [0.5, 0.75, 1, 1.25, 1.5, 2],\n showPlaybackRate = false,\n /** Whether to preload audio (set to false for lists with many items) */\n preload = false,\n /** Fallback duration in seconds to display before audio is loaded */\n fallbackDuration,\n },\n ref\n ) {\n const [state, setState] = React.useState<AudioPlayerState>('idle');\n const [currentTime, setCurrentTime] = React.useState(0);\n const [duration, setDuration] = React.useState(0);\n const [playbackRate, setPlaybackRate] = React.useState(1);\n const [audioInitialized, setAudioInitialized] = React.useState(false);\n const [hoverTime, setHoverTime] = React.useState<number | null>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const audioRef = React.useRef<globalThis.HTMLAudioElement | null>(null);\n const waveformMethodsRef = React.useRef<WaveformMethods | null>(null);\n\n const isPlaying = state === 'playing';\n const isLoading = state === 'loading';\n const displayDuration = duration > 0 ? duration : (fallbackDuration ?? 0);\n\n // Update state helper\n const updateState = React.useCallback(\n (newState: AudioPlayerState) => {\n setState(newState);\n onStateChange?.(newState);\n },\n [onStateChange]\n );\n\n // Initialize audio element (for non-waveform variants)\n const initAudio = React.useCallback(() => {\n if (variant === 'waveform' || audioInitialized) return null;\n\n const audio = new globalThis.Audio(src);\n audioRef.current = audio;\n setAudioInitialized(true);\n\n audio.addEventListener('loadstart', () => updateState('loading'));\n audio.addEventListener('canplay', () => {\n updateState('idle');\n });\n audio.addEventListener('loadedmetadata', () => {\n setDuration(audio.duration);\n onTimeUpdate?.(audio.currentTime, audio.duration);\n });\n audio.addEventListener('timeupdate', () => {\n setCurrentTime(audio.currentTime);\n onTimeUpdate?.(audio.currentTime, audio.duration);\n });\n audio.addEventListener('ended', () => {\n updateState('idle');\n setCurrentTime(0);\n onEnded?.();\n });\n audio.addEventListener('error', () => {\n updateState('error');\n onError?.(new Error('Failed to load audio'));\n });\n\n return audio;\n }, [\n src,\n variant,\n audioInitialized,\n updateState,\n onTimeUpdate,\n onEnded,\n onError,\n ]);\n\n // Expose methods via ref for external control\n React.useImperativeHandle(\n ref,\n () => ({\n get container() {\n return containerRef.current;\n },\n seekTo: (time: number) => {\n if (variant === 'waveform') {\n waveformMethodsRef.current?.seekTo(time);\n } else {\n // Lazily initialize audio if not yet created\n if (!audioRef.current) {\n initAudio();\n }\n if (audioRef.current) {\n audioRef.current.currentTime = time;\n }\n }\n },\n play: () => {\n if (variant === 'waveform') {\n if (waveformMethodsRef.current) {\n waveformMethodsRef.current.play();\n updateState('playing');\n }\n } else {\n // Lazily initialize audio if not yet created\n if (!audioRef.current) {\n initAudio();\n }\n if (audioRef.current) {\n audioRef.current.play().catch((error) => {\n updateState('error');\n onError?.(error);\n });\n updateState('playing');\n }\n }\n },\n pause: () => {\n if (variant === 'waveform') {\n if (waveformMethodsRef.current) {\n waveformMethodsRef.current.pause();\n updateState('paused');\n }\n } else if (audioRef.current) {\n audioRef.current.pause();\n updateState('paused');\n }\n },\n getCurrentTime: () => {\n if (variant === 'waveform') {\n return waveformMethodsRef.current?.getCurrentTime() ?? 0;\n }\n return audioRef.current?.currentTime ?? 0;\n },\n getDuration: () => {\n if (variant === 'waveform') {\n return waveformMethodsRef.current?.getDuration() ?? 0;\n }\n const rawDuration = audioRef.current?.duration;\n return Number.isFinite(rawDuration) ? rawDuration! : 0;\n },\n }),\n [variant, initAudio, updateState, onError]\n );\n\n // Auto-initialize if preload is true\n React.useEffect(() => {\n if (preload && !audioInitialized && variant !== 'waveform') {\n initAudio();\n }\n }, [preload, audioInitialized, variant, initAudio]);\n\n // Cleanup on unmount\n React.useEffect(() => {\n return () => {\n if (audioRef.current) {\n audioRef.current.pause();\n audioRef.current.src = '';\n }\n };\n }, []);\n\n // Handle playback rate changes\n React.useEffect(() => {\n if (audioRef.current) {\n audioRef.current.playbackRate = playbackRate;\n }\n }, [playbackRate]);\n\n const handlePlay = React.useCallback(() => {\n if (disabled) return;\n\n // Waveform variant uses WaveSurfer for playback - just toggle state\n if (variant === 'waveform') {\n if (isLoading) return;\n updateState(isPlaying ? 'paused' : 'playing');\n return;\n }\n\n // Lazy initialize audio on first play\n if (!audioInitialized && !isLoading) {\n const audio = initAudio();\n if (audio) {\n updateState('loading');\n audio.addEventListener(\n 'canplay',\n () => {\n audio.play().catch((error) => {\n updateState('error');\n onError?.(error);\n });\n updateState('playing');\n },\n { once: true }\n );\n }\n return;\n }\n\n if (isLoading) return;\n\n if (isPlaying) {\n if (audioRef.current) {\n audioRef.current.pause();\n }\n updateState('paused');\n } else {\n if (audioRef.current) {\n audioRef.current.play().catch((error) => {\n updateState('error');\n onError?.(error);\n });\n updateState('playing');\n }\n }\n }, [\n disabled,\n variant,\n audioInitialized,\n isLoading,\n isPlaying,\n initAudio,\n updateState,\n onError,\n ]);\n\n const handleSeek = React.useCallback(\n (time: number) => {\n if (audioRef.current) {\n audioRef.current.currentTime = time;\n setCurrentTime(time);\n onTimeUpdate?.(time, audioRef.current.duration);\n }\n },\n [onTimeUpdate]\n );\n\n // Waveform callbacks\n const handleWaveformReady = React.useCallback(\n (dur: number) => {\n setDuration(dur);\n setState('idle');\n onTimeUpdate?.(currentTime, dur);\n },\n [currentTime, onTimeUpdate]\n );\n\n const handleWaveformTimeUpdate = React.useCallback(\n (time: number, dur: number) => {\n setCurrentTime(time);\n if (dur > 0) {\n setDuration(dur);\n }\n onTimeUpdate?.(time, dur);\n },\n [onTimeUpdate]\n );\n\n const handleWaveformFinish = React.useCallback(() => {\n updateState('idle');\n setCurrentTime(0);\n onEnded?.();\n }, [updateState, onEnded]);\n\n const handleWaveformSeek = React.useCallback((time: number) => {\n setCurrentTime(time);\n }, []);\n\n const handleHoverTimeChange = React.useCallback((time: number | null) => {\n setHoverTime(time);\n }, []);\n\n const iconSize =\n size === 'sm' ? 'h-3.5 w-3.5' : size === 'lg' ? 'h-5 w-5' : 'h-4 w-4';\n\n const getAriaLabel = () => {\n if (ariaLabel) return ariaLabel;\n if (title) return `${isPlaying ? 'Pause' : 'Play'} ${title}`;\n return isPlaying ? 'Pause audio' : 'Play audio';\n };\n\n const renderPlayButton = () => (\n <button\n type=\"button\"\n data-slot=\"audio-player-play-btn\"\n onClick={handlePlay}\n disabled={disabled || isLoading}\n className={cn(playButtonVariants({ variant, size }))}\n aria-label={getAriaLabel()}\n aria-pressed={isPlaying}\n >\n {isLoading ? (\n <SpinnerIcon className={iconSize} />\n ) : isPlaying ? (\n <PauseIcon className={iconSize} />\n ) : (\n <PlayIcon className={iconSize} />\n )}\n </button>\n );\n\n const renderTime = (useHoverTime = false) => {\n if (!showTime) return null;\n const displayTime =\n useHoverTime && hoverTime !== null ? hoverTime : currentTime;\n const isShowingHoverTime = useHoverTime && hoverTime !== null;\n return (\n <span\n data-slot=\"audio-player-time\"\n className={cn(\n 'font-mono text-xs tabular-nums',\n isShowingHoverTime\n ? 'text-primary-800 dark:text-primary-400'\n : 'text-neutral-600 dark:text-neutral-400'\n )}\n >\n {formatTime(displayTime)} / {formatTime(displayDuration)}\n </span>\n );\n };\n\n const renderPlaybackRateControl = () => {\n if (!showPlaybackRate) return null;\n return (\n <select\n data-slot=\"audio-player-rate\"\n value={playbackRate}\n onChange={(e) => setPlaybackRate(Number(e.target.value))}\n className=\"rounded border border-neutral-200 bg-transparent px-1 py-0.5 text-xs dark:border-neutral-700\"\n aria-label=\"Playback speed\"\n >\n {playbackRates.map((rate) => (\n <option key={rate} value={rate}>\n {rate}x\n </option>\n ))}\n </select>\n );\n };\n\n // ============================================================================\n // Inline Variant\n // ============================================================================\n if (variant === 'inline') {\n return (\n <div\n ref={containerRef}\n data-slot=\"audio-player\"\n data-variant=\"inline\"\n className={cn(audioPlayerVariants({ variant, size }), className)}\n >\n {renderPlayButton()}\n {title && (\n <span\n data-slot=\"audio-player-title\"\n className=\"text-sm font-medium text-neutral-700 dark:text-neutral-300\"\n >\n {title}\n </span>\n )}\n {showDuration && displayDuration > 0 && (\n <span\n data-slot=\"audio-player-duration\"\n className=\"font-mono text-xs text-neutral-500 tabular-nums dark:text-neutral-400\"\n >\n {isPlaying\n ? formatTime(currentTime)\n : formatTime(displayDuration)}\n </span>\n )}\n </div>\n );\n }\n\n // Compact Variant\n // ============================================================================\n if (variant === 'compact') {\n return (\n <div\n ref={containerRef}\n data-slot=\"audio-player\"\n data-variant=\"compact\"\n className={cn(audioPlayerVariants({ variant, size }), className)}\n >\n {renderPlayButton()}\n <ProgressBar\n currentTime={currentTime}\n duration={displayDuration}\n onSeek={handleSeek}\n disabled={disabled}\n />\n {renderTime()}\n {renderPlaybackRateControl()}\n </div>\n );\n }\n\n // ============================================================================\n // Waveform Variant\n // ============================================================================\n return (\n <div\n ref={containerRef}\n data-slot=\"audio-player\"\n data-variant=\"waveform\"\n className={cn(audioPlayerVariants({ variant, size }), className)}\n >\n {title && (\n <span\n data-slot=\"audio-player-title\"\n className=\"text-sm font-medium text-neutral-700 dark:text-neutral-300\"\n >\n {title}\n </span>\n )}\n <Waveform\n src={src}\n isPlaying={isPlaying}\n playbackRate={playbackRate}\n onReady={handleWaveformReady}\n onTimeUpdate={handleWaveformTimeUpdate}\n onFinish={handleWaveformFinish}\n onSeek={handleWaveformSeek}\n waveColor={waveColor}\n progressColor={progressColor}\n height={waveformHeight}\n showHoverCursor={showWaveformHoverCursor}\n onHoverTimeChange={handleHoverTimeChange}\n cursorColor={waveformCursorColor}\n waveformRef={waveformMethodsRef}\n />\n <div\n data-slot=\"audio-player-controls\"\n className=\"flex items-center gap-3\"\n >\n {renderPlayButton()}\n <div className=\"flex flex-1 items-center justify-between\">\n {renderTime(true)}\n {renderPlaybackRateControl()}\n </div>\n </div>\n </div>\n );\n }\n);\n\nAudioPlayer.displayName = 'AudioPlayer';\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { AudioPlayer, audioPlayerVariants, playButtonVariants, ProgressBar };\n"]}
@@ -80,6 +80,7 @@ var Slider = React.forwardRef(
80
80
  min = 0,
81
81
  max = 100,
82
82
  step = 1,
83
+ keyboardStep,
83
84
  onValueChange,
84
85
  onValueCommit,
85
86
  disabled = false,
@@ -115,6 +116,8 @@ var Slider = React.forwardRef(
115
116
  const latestValueRef = React.useRef(clampedValue);
116
117
  latestValueRef.current = clampedValue;
117
118
  const safeStep = step > 0 ? step : 1;
119
+ const hasKeyboardStep = !!keyboardStep && keyboardStep > 0;
120
+ const keyStep = hasKeyboardStep ? keyboardStep : safeStep;
118
121
  const computeValueFromPointer = React.useCallback(
119
122
  (clientX) => {
120
123
  const track = trackRef.current;
@@ -185,14 +188,14 @@ var Slider = React.forwardRef(
185
188
  case "ArrowRight":
186
189
  case "ArrowLeft": {
187
190
  const increase = e.key === "ArrowRight" !== rtl;
188
- newValue = increase ? Math.min(clampedValue + safeStep, max) : Math.max(clampedValue - safeStep, min);
191
+ newValue = increase ? Math.min(clampedValue + keyStep, max) : Math.max(clampedValue - keyStep, min);
189
192
  break;
190
193
  }
191
194
  case "ArrowUp":
192
- newValue = Math.min(clampedValue + safeStep, max);
195
+ newValue = Math.min(clampedValue + keyStep, max);
193
196
  break;
194
197
  case "ArrowDown":
195
- newValue = Math.max(clampedValue - safeStep, min);
198
+ newValue = Math.max(clampedValue - keyStep, min);
196
199
  break;
197
200
  case "Home":
198
201
  newValue = min;
@@ -207,7 +210,7 @@ var Slider = React.forwardRef(
207
210
  setValue(newValue);
208
211
  onValueCommit?.(newValue);
209
212
  },
210
- [disabled, clampedValue, safeStep, min, max, setValue, onValueCommit]
213
+ [disabled, clampedValue, keyStep, min, max, setValue, onValueCommit]
211
214
  );
212
215
  const displayValue = formatValue ? formatValue(clampedValue) : String(clampedValue);
213
216
  return /* @__PURE__ */ jsxs(
@@ -281,6 +284,7 @@ var Slider = React.forwardRef(
281
284
  "aria-valuemin": min,
282
285
  "aria-valuemax": max,
283
286
  "aria-valuenow": clampedValue,
287
+ "aria-valuetext": formatValue ? formatValue(clampedValue) : void 0,
284
288
  "aria-label": ariaLabel,
285
289
  "aria-labelledby": ariaLabelledBy,
286
290
  "aria-describedby": ariaDescribedBy,
@@ -331,7 +335,7 @@ var Slider = React.forwardRef(
331
335
  name,
332
336
  min,
333
337
  max,
334
- step,
338
+ step: hasKeyboardStep ? "any" : step,
335
339
  value: clampedValue,
336
340
  onChange: handleChange,
337
341
  disabled
@@ -359,5 +363,5 @@ var Slider = React.forwardRef(
359
363
  Slider.displayName = "Slider";
360
364
 
361
365
  export { Slider, sliderRangeVariants, sliderThumbVariants, sliderTrackVariants };
362
- //# sourceMappingURL=chunk-V5VPECJI.js.map
363
- //# sourceMappingURL=chunk-V5VPECJI.js.map
366
+ //# sourceMappingURL=chunk-CRR7AE5D.js.map
367
+ //# sourceMappingURL=chunk-CRR7AE5D.js.map