wavesurf 1.2.0 → 1.2.2

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.
package/dist/index.js CHANGED
@@ -176,10 +176,7 @@ function AudioPlayerProvider({
176
176
  if (state.isPlaying) {
177
177
  pause();
178
178
  } else {
179
- const targetVolume = Math.max(state.volume, MIN_FADE_IN_VOLUME);
180
- if (configRef.current.fadeInEnabled) {
181
- audioRef.current.volume = 0;
182
- }
179
+ audioRef.current.volume = state.displayVolume;
183
180
  audioRef.current.play().then(() => {
184
181
  if (typeof window !== "undefined") {
185
182
  window.dispatchEvent(
@@ -188,13 +185,10 @@ function AudioPlayerProvider({
188
185
  })
189
186
  );
190
187
  }
191
- if (configRef.current.fadeInEnabled) {
192
- fadeInVolume(targetVolume);
193
- }
194
188
  }).catch(() => {
195
189
  });
196
190
  }
197
- }, [state.isPlaying, state.currentSong, state.volume, pause, fadeInVolume]);
191
+ }, [state.isPlaying, state.currentSong, state.displayVolume, pause]);
198
192
  const seek = react.useCallback((time) => {
199
193
  if (!audioRef.current) return;
200
194
  audioRef.current.currentTime = time;
@@ -663,6 +657,15 @@ function MiniPlayer({
663
657
  },
664
658
  [setVolume]
665
659
  );
660
+ const handleVolumeWheel = react.useCallback(
661
+ (e) => {
662
+ e.preventDefault();
663
+ const delta = e.deltaY > 0 ? -0.05 : 0.05;
664
+ const newVolume = Math.max(0, Math.min(1, displayVolume + delta));
665
+ setVolume(newVolume);
666
+ },
667
+ [displayVolume, setVolume]
668
+ );
666
669
  const handleClose = react.useCallback(() => {
667
670
  stop();
668
671
  onClose?.();
@@ -697,7 +700,7 @@ function MiniPlayer({
697
700
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "wsp-mini-time", children: formatTime(duration) })
698
701
  ] })
699
702
  ] }),
700
- shouldShowVolume && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "wsp-mini-volume", children: [
703
+ shouldShowVolume && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "wsp-mini-volume", onWheel: handleVolumeWheel, children: [
701
704
  /* @__PURE__ */ jsxRuntime.jsx(
702
705
  "button",
703
706
  {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context/AudioPlayerContext.tsx","../src/hooks/useLazyLoad.ts","../src/utils/formatTime.ts","../src/components/WaveformPlayer.tsx","../src/components/MiniPlayer.tsx","../src/components/ShareButtons.tsx"],"names":["createContext","useRef","useEffect","useState","useCallback","jsx","useContext","WaveSurfer","jsxs","DEFAULT_WAVEFORM_CONFIG"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\nimport {\n createContext,\n useContext,\n useRef,\n useState,\n useCallback,\n useEffect,\n ReactNode,\n} from 'react';\nimport type {\n Song,\n AudioPlayerState,\n AudioPlayerContextValue,\n AudioPlayerConfig,\n} from '../types';\n\n// Custom event for notifying WaveformPlayers when mini-player starts playing\nexport const MINI_PLAYER_PLAY_EVENT = 'wavesurfer-player-mini-play';\n\nconst AudioPlayerContext = createContext<AudioPlayerContextValue | null>(null);\n\nconst DEFAULT_CONFIG: Required<AudioPlayerConfig> = {\n fadeInEnabled: true,\n fadeInDuration: 3000,\n persistVolume: true,\n storageKey: 'audioPlayerVolume',\n defaultVolume: 1,\n onPlay: () => {},\n onPause: () => {},\n onEnd: () => {},\n onTimeUpdate: () => {},\n};\n\nconst FADE_STEPS = 30; // 30 steps for smooth fade\nconst MIN_FADE_IN_VOLUME = 0.1; // Minimum 10% volume on fade-in so users hear something\n\ninterface AudioPlayerProviderProps {\n children: ReactNode;\n config?: AudioPlayerConfig;\n}\n\nexport function AudioPlayerProvider({\n children,\n config: userConfig,\n}: AudioPlayerProviderProps) {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const fadeIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const configRef = useRef(config);\n\n // Keep config ref up to date\n useEffect(() => {\n configRef.current = config;\n }, [config]);\n\n const [state, setState] = useState<AudioPlayerState>({\n currentSong: null,\n isPlaying: false,\n currentTime: 0,\n duration: 0,\n volume: config.defaultVolume,\n displayVolume: config.defaultVolume,\n isFadingIn: false,\n });\n\n // Initialize audio element and load saved volume\n useEffect(() => {\n // Create audio element\n const audio = new Audio();\n audio.preload = 'metadata';\n audioRef.current = audio;\n\n // Load saved volume from localStorage if persistence is enabled\n if (config.persistVolume && typeof window !== 'undefined') {\n const savedVolume = localStorage.getItem(config.storageKey);\n if (savedVolume) {\n const vol = parseFloat(savedVolume);\n if (!isNaN(vol) && vol >= 0 && vol <= 1) {\n setState((s) => ({ ...s, volume: vol, displayVolume: vol }));\n audio.volume = vol;\n }\n }\n }\n\n // Audio event listeners\n const handleTimeUpdate = () => {\n setState((s) => ({ ...s, currentTime: audio.currentTime }));\n configRef.current.onTimeUpdate?.(audio.currentTime);\n };\n\n const handleLoadedMetadata = () => {\n setState((s) => ({ ...s, duration: audio.duration }));\n };\n\n const handleEnded = () => {\n setState((s) => ({ ...s, isPlaying: false, currentTime: 0 }));\n configRef.current.onEnd?.();\n };\n\n const handlePlay = () => {\n setState((s) => ({ ...s, isPlaying: true }));\n };\n\n const handlePause = () => {\n setState((s) => ({ ...s, isPlaying: false }));\n };\n\n audio.addEventListener('timeupdate', handleTimeUpdate);\n audio.addEventListener('loadedmetadata', handleLoadedMetadata);\n audio.addEventListener('ended', handleEnded);\n audio.addEventListener('play', handlePlay);\n audio.addEventListener('pause', handlePause);\n\n return () => {\n // Cleanup\n if (fadeIntervalRef.current) {\n clearInterval(fadeIntervalRef.current);\n }\n audio.removeEventListener('timeupdate', handleTimeUpdate);\n audio.removeEventListener('loadedmetadata', handleLoadedMetadata);\n audio.removeEventListener('ended', handleEnded);\n audio.removeEventListener('play', handlePlay);\n audio.removeEventListener('pause', handlePause);\n audio.pause();\n audio.src = '';\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Clear any existing fade interval\n const clearFade = useCallback(() => {\n if (fadeIntervalRef.current) {\n clearInterval(fadeIntervalRef.current);\n fadeIntervalRef.current = null;\n }\n }, []);\n\n // Fade in volume\n const fadeInVolume = useCallback(\n (targetVolume: number) => {\n if (!audioRef.current) return;\n\n clearFade();\n setState((s) => ({ ...s, isFadingIn: true, displayVolume: 0 }));\n\n const fadeStepDuration = configRef.current.fadeInDuration / FADE_STEPS;\n const volumeStep = targetVolume / FADE_STEPS;\n let currentStep = 0;\n\n fadeIntervalRef.current = setInterval(() => {\n currentStep++;\n const newVolume = Math.min(volumeStep * currentStep, targetVolume);\n if (audioRef.current) {\n audioRef.current.volume = newVolume;\n }\n // Update displayVolume so the slider follows the fade\n setState((s) => ({ ...s, displayVolume: newVolume }));\n\n if (currentStep >= FADE_STEPS) {\n clearFade();\n setState((s) => ({\n ...s,\n isFadingIn: false,\n displayVolume: targetVolume,\n }));\n }\n }, fadeStepDuration);\n },\n [clearFade]\n );\n\n // Play a song with optional fade-in\n const play = useCallback(\n async (song: Song) => {\n if (!audioRef.current) return;\n\n // Stop any current fade-in\n clearFade();\n\n // If it's a different song, load it\n if (state.currentSong?.id !== song.id) {\n audioRef.current.src = song.audioUrl;\n setState((s) => ({\n ...s,\n currentSong: song,\n currentTime: 0,\n duration: song.duration || 0,\n }));\n }\n\n // Determine target volume\n const targetVolume = Math.max(state.volume, MIN_FADE_IN_VOLUME);\n\n // Set initial volume based on fade setting\n if (configRef.current.fadeInEnabled) {\n audioRef.current.volume = 0;\n } else {\n audioRef.current.volume = targetVolume;\n }\n\n try {\n await audioRef.current.play();\n // Dispatch event to pause other players\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent(MINI_PLAYER_PLAY_EVENT, { detail: song.id })\n );\n }\n // Start fade-in if enabled\n if (configRef.current.fadeInEnabled) {\n fadeInVolume(targetVolume);\n }\n // Call onPlay callback\n configRef.current.onPlay?.(song);\n } catch {\n // Handle autoplay restrictions silently\n }\n },\n [state.currentSong?.id, state.volume, clearFade, fadeInVolume]\n );\n\n // Pause playback\n const pause = useCallback(() => {\n if (!audioRef.current) return;\n clearFade();\n audioRef.current.pause();\n configRef.current.onPause?.();\n }, [clearFade]);\n\n // Toggle play/pause\n const togglePlay = useCallback(() => {\n if (!audioRef.current || !state.currentSong) return;\n\n if (state.isPlaying) {\n pause();\n } else {\n // Resume with fade-in if enabled\n const targetVolume = Math.max(state.volume, MIN_FADE_IN_VOLUME);\n\n if (configRef.current.fadeInEnabled) {\n audioRef.current.volume = 0;\n }\n\n audioRef.current\n .play()\n .then(() => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent(MINI_PLAYER_PLAY_EVENT, {\n detail: state.currentSong?.id,\n })\n );\n }\n if (configRef.current.fadeInEnabled) {\n fadeInVolume(targetVolume);\n }\n })\n .catch(() => {\n // Handle autoplay restrictions silently\n });\n }\n }, [state.isPlaying, state.currentSong, state.volume, pause, fadeInVolume]);\n\n // Seek to position\n const seek = useCallback((time: number) => {\n if (!audioRef.current) return;\n audioRef.current.currentTime = time;\n setState((s) => ({ ...s, currentTime: time }));\n }, []);\n\n // Set volume and persist to localStorage\n const setVolume = useCallback(\n (volume: number) => {\n if (!audioRef.current) return;\n\n const clampedVolume = Math.max(0, Math.min(1, volume));\n\n // If user manually changes volume during fade, stop the fade\n if (fadeIntervalRef.current) {\n clearFade();\n setState((s) => ({ ...s, isFadingIn: false }));\n }\n\n audioRef.current.volume = clampedVolume;\n\n // Persist to localStorage if enabled\n if (configRef.current.persistVolume && typeof window !== 'undefined') {\n localStorage.setItem(\n configRef.current.storageKey,\n clampedVolume.toString()\n );\n }\n\n setState((s) => ({\n ...s,\n volume: clampedVolume,\n displayVolume: clampedVolume,\n }));\n },\n [clearFade]\n );\n\n // Stop playback and clear song\n const stop = useCallback(() => {\n if (!audioRef.current) return;\n clearFade();\n audioRef.current.pause();\n audioRef.current.currentTime = 0;\n audioRef.current.src = '';\n setState((s) => ({\n ...s,\n currentSong: null,\n isPlaying: false,\n currentTime: 0,\n duration: 0,\n isFadingIn: false,\n }));\n }, [clearFade]);\n\n const value: AudioPlayerContextValue = {\n ...state,\n play,\n pause,\n togglePlay,\n seek,\n setVolume,\n stop,\n };\n\n return (\n <AudioPlayerContext.Provider value={value}>\n {children}\n </AudioPlayerContext.Provider>\n );\n}\n\nexport function useAudioPlayer(): AudioPlayerContextValue {\n const context = useContext(AudioPlayerContext);\n if (!context) {\n throw new Error(\n 'useAudioPlayer must be used within an AudioPlayerProvider'\n );\n }\n return context;\n}\n","'use client';\n\nimport { useRef, useState, useEffect } from 'react';\nimport type { UseLazyLoadResult, UseLazyLoadOptions } from '../types';\n\n/**\n * Hook for lazy loading elements using IntersectionObserver.\n * Returns a ref to attach to the target element and a boolean indicating visibility.\n *\n * @param options - Configuration options for the IntersectionObserver\n * @returns Object containing ref and isVisible state\n *\n * @example\n * const { ref, isVisible } = useLazyLoad();\n *\n * return (\n * <div ref={ref}>\n * {isVisible && <ExpensiveComponent />}\n * </div>\n * );\n */\nexport function useLazyLoad(options?: UseLazyLoadOptions): UseLazyLoadResult {\n const {\n rootMargin = '100px',\n threshold = 0,\n forceVisible = false,\n } = options || {};\n\n const ref = useRef<HTMLDivElement>(null);\n const [isVisible, setIsVisible] = useState(forceVisible);\n\n useEffect(() => {\n if (forceVisible) {\n setIsVisible(true);\n return;\n }\n\n if (!ref.current) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setIsVisible(true);\n observer.disconnect(); // Only need to detect once\n }\n },\n { rootMargin, threshold }\n );\n\n observer.observe(ref.current);\n\n return () => observer.disconnect();\n }, [rootMargin, threshold, forceVisible]);\n\n return { ref, isVisible };\n}\n","/**\n * Formats seconds into a human-readable time string (M:SS or MM:SS).\n *\n * @param seconds - The number of seconds to format\n * @returns Formatted time string (e.g., \"3:45\" or \"12:05\")\n *\n * @example\n * formatTime(125) // \"2:05\"\n * formatTime(0) // \"0:00\"\n * formatTime(3600) // \"60:00\"\n */\nexport function formatTime(seconds: number): string {\n if (!seconds || isNaN(seconds) || seconds < 0) return '0:00';\n\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n}\n","'use client';\n\nimport { useEffect, useRef, useState, useCallback, useContext, createContext } from 'react';\nimport WaveSurfer from 'wavesurfer.js';\nimport { useAudioPlayer, MINI_PLAYER_PLAY_EVENT } from '../context/AudioPlayerContext';\nimport { useLazyLoad } from '../hooks/useLazyLoad';\nimport { formatTime } from '../utils/formatTime';\nimport type { WaveformPlayerProps, WaveformConfig, Song } from '../types';\n\nconst DEFAULT_WAVEFORM_CONFIG: Required<WaveformConfig> = {\n waveColor: '#666666',\n progressColor: '#D4AF37',\n cursorColor: '#D4AF37',\n barWidth: 2,\n barGap: 1,\n barRadius: 2,\n height: 60,\n normalize: true,\n};\n\n// Check if we're inside an AudioPlayerProvider\nconst AudioPlayerContext = createContext<unknown>(null);\n\nexport function WaveformPlayer({\n song,\n waveformConfig: userWaveformConfig,\n lazyLoad = true,\n showTime = true,\n className = '',\n renderHeader,\n renderControls,\n standalone = false,\n}: WaveformPlayerProps) {\n const waveformConfig = { ...DEFAULT_WAVEFORM_CONFIG, ...userWaveformConfig };\n const containerRef = useRef<HTMLDivElement>(null);\n const wavesurferRef = useRef<WaveSurfer | null>(null);\n const localAudioRef = useRef<HTMLAudioElement | null>(null);\n const [isReady, setIsReady] = useState(false);\n const [totalDuration, setTotalDuration] = useState(song.duration || 0);\n\n // Standalone mode state\n const [localIsPlaying, setLocalIsPlaying] = useState(false);\n const [localCurrentTime, setLocalCurrentTime] = useState(0);\n\n // Lazy loading\n const { ref: wrapperRef, isVisible } = useLazyLoad({\n forceVisible: !lazyLoad,\n });\n\n // Try to get audio player context (may not exist in standalone mode)\n let contextValue: ReturnType<typeof useAudioPlayer> | null = null;\n try {\n if (!standalone) {\n contextValue = useAudioPlayer();\n }\n } catch {\n // Context not available, use standalone mode\n }\n\n const useStandaloneMode = standalone || !contextValue;\n\n // Context values (only used when not in standalone mode)\n const contextPlay = contextValue?.play;\n const contextTogglePlay = contextValue?.togglePlay;\n const contextSeek = contextValue?.seek;\n const contextCurrentSong = contextValue?.currentSong;\n const contextIsPlaying = contextValue?.isPlaying ?? false;\n const contextCurrentTime = contextValue?.currentTime ?? 0;\n\n // Check if this song is the currently playing song (context mode)\n const isThisSongPlayingInContext = !useStandaloneMode && contextCurrentSong?.id === song.id;\n\n // Determine actual playing state and current time\n const isPlaying = useStandaloneMode ? localIsPlaying : (isThisSongPlayingInContext && contextIsPlaying);\n const currentTime = useStandaloneMode ? localCurrentTime : (isThisSongPlayingInContext ? contextCurrentTime : 0);\n\n // Initialize local audio element for standalone mode\n useEffect(() => {\n if (!useStandaloneMode) return;\n\n const audio = new Audio();\n audio.preload = 'metadata';\n localAudioRef.current = audio;\n\n const handleTimeUpdate = () => {\n setLocalCurrentTime(audio.currentTime);\n };\n\n const handleEnded = () => {\n setLocalIsPlaying(false);\n setLocalCurrentTime(0);\n };\n\n const handleLoadedMetadata = () => {\n setTotalDuration(audio.duration);\n };\n\n audio.addEventListener('timeupdate', handleTimeUpdate);\n audio.addEventListener('ended', handleEnded);\n audio.addEventListener('loadedmetadata', handleLoadedMetadata);\n\n return () => {\n audio.removeEventListener('timeupdate', handleTimeUpdate);\n audio.removeEventListener('ended', handleEnded);\n audio.removeEventListener('loadedmetadata', handleLoadedMetadata);\n audio.pause();\n audio.src = '';\n };\n }, [useStandaloneMode]);\n\n // Listen for other players starting (to pause this one in standalone mode)\n useEffect(() => {\n if (!useStandaloneMode) return;\n\n const handleOtherPlayerPlay = (event: CustomEvent<string>) => {\n // Another player started, pause this one\n if (event.detail !== song.id && localAudioRef.current) {\n localAudioRef.current.pause();\n setLocalIsPlaying(false);\n }\n };\n\n window.addEventListener(MINI_PLAYER_PLAY_EVENT, handleOtherPlayerPlay as EventListener);\n return () => {\n window.removeEventListener(MINI_PLAYER_PLAY_EVENT, handleOtherPlayerPlay as EventListener);\n };\n }, [useStandaloneMode, song.id]);\n\n // Sync waveform progress with playback\n useEffect(() => {\n if (!wavesurferRef.current) return;\n\n const relevantCurrentTime = useStandaloneMode ? localCurrentTime : contextCurrentTime;\n const shouldSync = useStandaloneMode ? localIsPlaying : isThisSongPlayingInContext;\n\n if (!shouldSync) return;\n\n const waveDuration = wavesurferRef.current.getDuration();\n if (waveDuration > 0 && relevantCurrentTime >= 0) {\n const progress = relevantCurrentTime / waveDuration;\n wavesurferRef.current.seekTo(Math.min(progress, 1));\n }\n }, [localCurrentTime, contextCurrentTime, useStandaloneMode, localIsPlaying, isThisSongPlayingInContext]);\n\n // Initialize WaveSurfer - waveform display only (audio plays through context or local audio)\n useEffect(() => {\n if (!containerRef.current || !isVisible) return;\n\n const hasPeaks = song.peaks && song.peaks.length > 0;\n\n // Create WaveSurfer for waveform display only (no audio playback)\n const wavesurfer = WaveSurfer.create({\n container: containerRef.current,\n waveColor: waveformConfig.waveColor,\n progressColor: waveformConfig.progressColor,\n cursorColor: waveformConfig.cursorColor,\n barWidth: waveformConfig.barWidth,\n barGap: waveformConfig.barGap,\n barRadius: waveformConfig.barRadius,\n height: waveformConfig.height,\n normalize: waveformConfig.normalize,\n interact: true,\n // Only load audio URL if we don't have peaks (needed to generate waveform)\n url: hasPeaks ? undefined : song.audioUrl,\n peaks: hasPeaks ? [song.peaks!] : undefined,\n duration: hasPeaks ? (song.duration || 0) : undefined,\n });\n\n // IMPORTANT: Mute WaveSurfer so it doesn't play audio (only visualizes)\n // Audio playback is handled separately through context or local audio element\n wavesurfer.setMuted(true);\n\n wavesurfer.on('ready', () => {\n setIsReady(true);\n setTotalDuration(wavesurfer.getDuration() || song.duration || 0);\n // Ensure it stays muted\n wavesurfer.setMuted(true);\n });\n\n // Handle waveform click for seeking\n wavesurfer.on('interaction', (newTime: number) => {\n if (useStandaloneMode) {\n if (localAudioRef.current) {\n localAudioRef.current.currentTime = newTime;\n setLocalCurrentTime(newTime);\n }\n } else if (isThisSongPlayingInContext && contextSeek) {\n contextSeek(newTime);\n }\n });\n\n wavesurfer.on('error', () => {\n // Silently handle errors\n });\n\n wavesurferRef.current = wavesurfer;\n\n // If we have peaks, mark as ready immediately\n if (hasPeaks) {\n setIsReady(true);\n setTotalDuration(song.duration || 0);\n }\n\n return () => {\n try {\n wavesurfer.destroy();\n } catch {\n // Ignore errors when component unmounts\n }\n };\n }, [\n song.audioUrl,\n song.peaks,\n song.duration,\n isVisible,\n useStandaloneMode,\n isThisSongPlayingInContext,\n contextSeek,\n waveformConfig.waveColor,\n waveformConfig.progressColor,\n waveformConfig.cursorColor,\n waveformConfig.barWidth,\n waveformConfig.barGap,\n waveformConfig.barRadius,\n waveformConfig.height,\n waveformConfig.normalize,\n ]);\n\n // Handle play button click\n const handlePlayClick = useCallback(() => {\n if (!song.id || !song.audioUrl) return;\n\n if (useStandaloneMode) {\n // Standalone mode - use local audio element\n if (!localAudioRef.current) return;\n\n if (localIsPlaying) {\n localAudioRef.current.pause();\n setLocalIsPlaying(false);\n } else {\n // Dispatch event so other standalone players pause\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent(MINI_PLAYER_PLAY_EVENT, { detail: song.id })\n );\n }\n\n // Load and play\n if (localAudioRef.current.src !== song.audioUrl) {\n localAudioRef.current.src = song.audioUrl;\n }\n localAudioRef.current.play().catch(() => {\n // Handle autoplay restrictions\n });\n setLocalIsPlaying(true);\n }\n } else {\n // Context mode - use global player\n if (isThisSongPlayingInContext) {\n contextTogglePlay?.();\n } else {\n contextPlay?.(song);\n }\n }\n }, [song, useStandaloneMode, localIsPlaying, isThisSongPlayingInContext, contextPlay, contextTogglePlay]);\n\n return (\n <div\n ref={wrapperRef}\n className={`wsp-player ${className}`}\n data-song-id={song.id}\n >\n {/* Custom header or default */}\n {renderHeader ? (\n renderHeader(song, isPlaying)\n ) : (\n <div className=\"wsp-player-header\">\n <h3 className=\"wsp-player-title\">{song.title}</h3>\n {song.artist && (\n <span className=\"wsp-player-artist\">{song.artist}</span>\n )}\n </div>\n )}\n\n {/* Player controls and waveform */}\n <div className=\"wsp-player-controls\">\n {/* Play/Pause button */}\n <button\n onClick={handlePlayClick}\n disabled={!isReady}\n className={`wsp-play-button ${isReady ? 'wsp-play-button--ready' : ''}`}\n aria-label={isPlaying ? 'Pause' : 'Play'}\n >\n {!isReady ? (\n <svg className=\"wsp-icon wsp-icon--spinner\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle\n className=\"wsp-spinner-track\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"wsp-spinner-head\"\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 ) : isPlaying ? (\n <svg className=\"wsp-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n <rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n </svg>\n ) : (\n <svg className=\"wsp-icon wsp-icon--play\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n )}\n </button>\n\n {/* Waveform container */}\n <div className=\"wsp-waveform-wrapper\">\n <div ref={containerRef} className=\"wsp-waveform\" />\n\n {/* Time display */}\n {showTime && (\n <div className=\"wsp-time-display\">\n <span className=\"wsp-time\">{formatTime(currentTime)}</span>\n <span className=\"wsp-time\">{formatTime(totalDuration)}</span>\n </div>\n )}\n </div>\n\n {/* Custom controls slot */}\n {renderControls && renderControls(song, isPlaying)}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useRef, useEffect, useState } from 'react';\nimport WaveSurfer from 'wavesurfer.js';\nimport { useAudioPlayer } from '../context/AudioPlayerContext';\nimport { formatTime } from '../utils/formatTime';\nimport type { MiniPlayerProps, WaveformConfig } from '../types';\n\nconst DEFAULT_WAVEFORM_CONFIG: Required<WaveformConfig> = {\n waveColor: '#666666',\n progressColor: '#D4AF37',\n cursorColor: 'transparent',\n barWidth: 2,\n barGap: 1,\n barRadius: 2,\n height: 40,\n normalize: true,\n};\n\nexport function MiniPlayer({\n position = 'bottom',\n showVolume = true,\n showClose = true,\n onClose,\n className = '',\n waveformConfig: userWaveformConfig,\n}: MiniPlayerProps) {\n const waveformConfig = { ...DEFAULT_WAVEFORM_CONFIG, ...userWaveformConfig };\n\n const {\n currentSong,\n isPlaying,\n currentTime,\n duration,\n displayVolume,\n togglePlay,\n seek,\n setVolume,\n stop,\n } = useAudioPlayer();\n\n const waveformRef = useRef<HTMLDivElement>(null);\n const wavesurferRef = useRef<WaveSurfer | null>(null);\n const [isMobile, setIsMobile] = useState(false);\n const [waveformReady, setWaveformReady] = useState(false);\n const lastSongIdRef = useRef<string | null>(null);\n\n // Detect mobile viewport\n useEffect(() => {\n const checkMobile = () => setIsMobile(window.innerWidth < 640);\n checkMobile();\n window.addEventListener('resize', checkMobile);\n return () => window.removeEventListener('resize', checkMobile);\n }, []);\n\n // Initialize/update WaveSurfer when song changes\n useEffect(() => {\n if (!waveformRef.current || !currentSong) return;\n\n // If same song, don't recreate\n if (lastSongIdRef.current === currentSong.id && wavesurferRef.current) {\n return;\n }\n\n // Destroy previous instance\n if (wavesurferRef.current) {\n wavesurferRef.current.destroy();\n wavesurferRef.current = null;\n }\n\n setWaveformReady(false);\n lastSongIdRef.current = currentSong.id;\n\n const hasPeaks = currentSong.peaks && currentSong.peaks.length > 0;\n\n // Create WaveSurfer - waveform only, no audio (audio plays through context)\n const wavesurfer = WaveSurfer.create({\n container: waveformRef.current,\n waveColor: waveformConfig.waveColor,\n progressColor: waveformConfig.progressColor,\n cursorColor: waveformConfig.cursorColor,\n barWidth: waveformConfig.barWidth,\n barGap: waveformConfig.barGap,\n barRadius: waveformConfig.barRadius,\n height: waveformConfig.height,\n normalize: waveformConfig.normalize,\n interact: true,\n // Use peaks if available, otherwise need audio URL to generate waveform\n url: hasPeaks ? undefined : currentSong.audioUrl,\n peaks: hasPeaks && currentSong.peaks ? [currentSong.peaks] : undefined,\n duration: hasPeaks ? (currentSong.duration || duration || 0) : undefined,\n });\n\n wavesurfer.on('ready', () => {\n setWaveformReady(true);\n });\n\n // Handle click on waveform to seek\n wavesurfer.on('interaction', (newTime: number) => {\n seek(newTime);\n });\n\n wavesurferRef.current = wavesurfer;\n\n // If we have peaks, mark ready immediately\n if (hasPeaks) {\n setWaveformReady(true);\n }\n\n return () => {\n // Don't destroy on every render, only when song actually changes\n };\n }, [\n currentSong?.id,\n currentSong?.audioUrl,\n currentSong?.peaks,\n currentSong?.duration,\n duration,\n seek,\n waveformConfig.waveColor,\n waveformConfig.progressColor,\n waveformConfig.cursorColor,\n waveformConfig.barWidth,\n waveformConfig.barGap,\n waveformConfig.barRadius,\n waveformConfig.height,\n waveformConfig.normalize,\n ]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (wavesurferRef.current) {\n wavesurferRef.current.destroy();\n wavesurferRef.current = null;\n }\n };\n }, []);\n\n // Sync waveform progress with audio context\n useEffect(() => {\n if (!wavesurferRef.current || !waveformReady) return;\n\n const waveDuration = wavesurferRef.current.getDuration();\n if (waveDuration > 0 && currentTime >= 0) {\n const progress = currentTime / waveDuration;\n wavesurferRef.current.seekTo(Math.min(progress, 1));\n }\n }, [currentTime, waveformReady]);\n\n // Handle volume change\n const handleVolumeChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setVolume(parseFloat(e.target.value));\n },\n [setVolume]\n );\n\n // Handle close button\n const handleClose = useCallback(() => {\n stop();\n onClose?.();\n }, [stop, onClose]);\n\n // Don't render if no song is loaded\n if (!currentSong) return null;\n\n // Determine if volume should be shown (respects both prop and mobile detection)\n const shouldShowVolume = showVolume && !isMobile;\n\n const positionClass = position === 'top' ? 'wsp-mini-player--top' : 'wsp-mini-player--bottom';\n\n return (\n <div className={`wsp-mini-player ${positionClass} ${className}`}>\n {/* Main controls */}\n <div className=\"wsp-mini-player-inner\">\n {/* Play/pause button - left */}\n <button\n onClick={togglePlay}\n className=\"wsp-mini-play-button\"\n aria-label={isPlaying ? 'Pause' : 'Play'}\n >\n {isPlaying ? (\n <svg className=\"wsp-mini-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n <rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n </svg>\n ) : (\n <svg className=\"wsp-mini-icon wsp-mini-icon--play\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n )}\n </button>\n\n {/* Song info and waveform - center */}\n <div className=\"wsp-mini-content\">\n {/* Song title */}\n <div className=\"wsp-mini-info\">\n <div className=\"wsp-mini-title\">{currentSong.title}</div>\n {currentSong.album && (\n <div className=\"wsp-mini-album\">• {currentSong.album}</div>\n )}\n </div>\n\n {/* Waveform */}\n <div className=\"wsp-mini-waveform-container\">\n <span className=\"wsp-mini-time\">{formatTime(currentTime)}</span>\n <div ref={waveformRef} className=\"wsp-mini-waveform\" />\n <span className=\"wsp-mini-time\">{formatTime(duration)}</span>\n </div>\n </div>\n\n {/* Volume slider - hidden on mobile */}\n {shouldShowVolume && (\n <div className=\"wsp-mini-volume\">\n <button\n onClick={() => setVolume(displayVolume > 0 ? 0 : 1)}\n className=\"wsp-mini-volume-button\"\n aria-label={displayVolume > 0 ? 'Mute' : 'Unmute'}\n >\n {displayVolume === 0 ? (\n <svg className=\"wsp-mini-volume-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M17 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2\"\n />\n </svg>\n ) : displayVolume < 0.5 ? (\n <svg className=\"wsp-mini-volume-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15.536 8.464a5 5 0 010 7.072M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z\"\n />\n </svg>\n ) : (\n <svg className=\"wsp-mini-volume-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z\"\n />\n </svg>\n )}\n </button>\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.01\"\n value={displayVolume}\n onChange={handleVolumeChange}\n className=\"wsp-mini-volume-slider\"\n aria-label=\"Volume\"\n />\n </div>\n )}\n\n {/* Close button */}\n {showClose && (\n <button\n onClick={handleClose}\n className=\"wsp-mini-close-button\"\n aria-label=\"Close player\"\n >\n <svg className=\"wsp-mini-close-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport type { ShareButtonsProps, SharePlatform } from '../types';\n\nconst PLATFORM_CONFIG: Record<\n SharePlatform,\n {\n name: string;\n color: string;\n getUrl: (url: string, text: string) => string;\n icon: JSX.Element;\n }\n> = {\n facebook: {\n name: 'Facebook',\n color: '#1877F2',\n getUrl: (url, text) =>\n `https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(url)}&quote=${encodeURIComponent(text)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z\" />\n </svg>\n ),\n },\n twitter: {\n name: 'Twitter/X',\n color: '#1DA1F2',\n getUrl: (url, text) =>\n `https://twitter.com/intent/tweet?text=${encodeURIComponent(text)}&url=${encodeURIComponent(url)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </svg>\n ),\n },\n whatsapp: {\n name: 'WhatsApp',\n color: '#25D366',\n getUrl: (url, text) =>\n `https://wa.me/?text=${encodeURIComponent(`${text} ${url}`)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z\" />\n </svg>\n ),\n },\n linkedin: {\n name: 'LinkedIn',\n color: '#0A66C2',\n getUrl: (url, text) =>\n `https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(url)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\" />\n </svg>\n ),\n },\n reddit: {\n name: 'Reddit',\n color: '#FF4500',\n getUrl: (url, text) =>\n `https://www.reddit.com/submit?url=${encodeURIComponent(url)}&title=${encodeURIComponent(text)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0zm5.01 4.744c.688 0 1.25.561 1.25 1.249a1.25 1.25 0 0 1-2.498.056l-2.597-.547-.8 3.747c1.824.07 3.48.632 4.674 1.488.308-.309.73-.491 1.207-.491.968 0 1.754.786 1.754 1.754 0 .716-.435 1.333-1.01 1.614a3.111 3.111 0 0 1 .042.52c0 2.694-3.13 4.87-7.004 4.87-3.874 0-7.004-2.176-7.004-4.87 0-.183.015-.366.043-.534A1.748 1.748 0 0 1 4.028 12c0-.968.786-1.754 1.754-1.754.463 0 .898.196 1.207.49 1.207-.883 2.878-1.43 4.744-1.487l.885-4.182a.342.342 0 0 1 .14-.197.35.35 0 0 1 .238-.042l2.906.617a1.214 1.214 0 0 1 1.108-.701zM9.25 12C8.561 12 8 12.562 8 13.25c0 .687.561 1.248 1.25 1.248.687 0 1.248-.561 1.248-1.249 0-.688-.561-1.249-1.249-1.249zm5.5 0c-.687 0-1.248.561-1.248 1.25 0 .687.561 1.248 1.249 1.248.688 0 1.249-.561 1.249-1.249 0-.687-.562-1.249-1.25-1.249zm-5.466 3.99a.327.327 0 0 0-.231.094.33.33 0 0 0 0 .463c.842.842 2.484.913 2.961.913.477 0 2.105-.056 2.961-.913a.361.361 0 0 0 .029-.463.33.33 0 0 0-.464 0c-.547.533-1.684.73-2.512.73-.828 0-1.979-.196-2.512-.73a.326.326 0 0 0-.232-.095z\" />\n </svg>\n ),\n },\n telegram: {\n name: 'Telegram',\n color: '#0088CC',\n getUrl: (url, text) =>\n `https://t.me/share/url?url=${encodeURIComponent(url)}&text=${encodeURIComponent(text)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z\" />\n </svg>\n ),\n },\n email: {\n name: 'Email',\n color: '#666666',\n getUrl: (url, text) =>\n `mailto:?subject=${encodeURIComponent(text)}&body=${encodeURIComponent(`${text}\\n\\n${url}`)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"\n />\n </svg>\n ),\n },\n copy: {\n name: 'Copy Link',\n color: '#666666',\n getUrl: () => '', // Not used for copy\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n ),\n },\n};\n\nconst DEFAULT_PLATFORMS: SharePlatform[] = [\n 'facebook',\n 'twitter',\n 'whatsapp',\n 'copy',\n];\n\nconst CheckIcon = () => (\n <svg\n className=\"wsp-share-icon wsp-share-icon--success\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n);\n\nexport function ShareButtons({\n url,\n text = '',\n platforms = DEFAULT_PLATFORMS,\n onShare,\n showLabels = false,\n className = '',\n}: ShareButtonsProps) {\n const [copied, setCopied] = useState(false);\n const [sharing, setSharing] = useState(false);\n\n const handleShare = useCallback(\n async (platform: SharePlatform) => {\n setSharing(true);\n\n if (platform === 'copy') {\n try {\n await navigator.clipboard.writeText(url);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n onShare?.(platform, url);\n } catch {\n // Clipboard may not be available\n }\n } else {\n const config = PLATFORM_CONFIG[platform];\n const shareUrl = config.getUrl(url, text);\n\n // Open share dialog\n if (platform === 'email') {\n window.location.href = shareUrl;\n } else {\n window.open(shareUrl, '_blank', 'width=600,height=400');\n }\n\n onShare?.(platform, url);\n }\n\n setSharing(false);\n },\n [url, text, onShare]\n );\n\n return (\n <div className={`wsp-share-buttons ${className}`}>\n {platforms.map((platform) => {\n const config = PLATFORM_CONFIG[platform];\n if (!config) return null;\n\n const isCopyButton = platform === 'copy';\n const showCheck = isCopyButton && copied;\n\n return (\n <button\n key={platform}\n onClick={() => handleShare(platform)}\n disabled={sharing}\n className=\"wsp-share-button\"\n style={{ '--wsp-share-hover-color': config.color } as React.CSSProperties}\n title={showCheck ? 'Copied!' : config.name}\n aria-label={`Share via ${config.name}`}\n >\n {showCheck ? <CheckIcon /> : config.icon}\n {showLabels && (\n <span className=\"wsp-share-label\">\n {showCheck ? 'Copied!' : config.name}\n </span>\n )}\n </button>\n );\n })}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/context/AudioPlayerContext.tsx","../src/hooks/useLazyLoad.ts","../src/utils/formatTime.ts","../src/components/WaveformPlayer.tsx","../src/components/MiniPlayer.tsx","../src/components/ShareButtons.tsx"],"names":["createContext","useRef","useEffect","useState","useCallback","jsx","useContext","WaveSurfer","jsxs","DEFAULT_WAVEFORM_CONFIG"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\nimport {\n createContext,\n useContext,\n useRef,\n useState,\n useCallback,\n useEffect,\n ReactNode,\n} from 'react';\nimport type {\n Song,\n AudioPlayerState,\n AudioPlayerContextValue,\n AudioPlayerConfig,\n} from '../types';\n\n// Custom event for notifying WaveformPlayers when mini-player starts playing\nexport const MINI_PLAYER_PLAY_EVENT = 'wavesurfer-player-mini-play';\n\nconst AudioPlayerContext = createContext<AudioPlayerContextValue | null>(null);\n\nconst DEFAULT_CONFIG: Required<AudioPlayerConfig> = {\n fadeInEnabled: true,\n fadeInDuration: 3000,\n persistVolume: true,\n storageKey: 'audioPlayerVolume',\n defaultVolume: 1,\n onPlay: () => {},\n onPause: () => {},\n onEnd: () => {},\n onTimeUpdate: () => {},\n};\n\nconst FADE_STEPS = 30; // 30 steps for smooth fade\nconst MIN_FADE_IN_VOLUME = 0.1; // Minimum 10% volume on fade-in so users hear something\n\ninterface AudioPlayerProviderProps {\n children: ReactNode;\n config?: AudioPlayerConfig;\n}\n\nexport function AudioPlayerProvider({\n children,\n config: userConfig,\n}: AudioPlayerProviderProps) {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const fadeIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const configRef = useRef(config);\n\n // Keep config ref up to date\n useEffect(() => {\n configRef.current = config;\n }, [config]);\n\n const [state, setState] = useState<AudioPlayerState>({\n currentSong: null,\n isPlaying: false,\n currentTime: 0,\n duration: 0,\n volume: config.defaultVolume,\n displayVolume: config.defaultVolume,\n isFadingIn: false,\n });\n\n // Initialize audio element and load saved volume\n useEffect(() => {\n // Create audio element\n const audio = new Audio();\n audio.preload = 'metadata';\n audioRef.current = audio;\n\n // Load saved volume from localStorage if persistence is enabled\n if (config.persistVolume && typeof window !== 'undefined') {\n const savedVolume = localStorage.getItem(config.storageKey);\n if (savedVolume) {\n const vol = parseFloat(savedVolume);\n if (!isNaN(vol) && vol >= 0 && vol <= 1) {\n setState((s) => ({ ...s, volume: vol, displayVolume: vol }));\n audio.volume = vol;\n }\n }\n }\n\n // Audio event listeners\n const handleTimeUpdate = () => {\n setState((s) => ({ ...s, currentTime: audio.currentTime }));\n configRef.current.onTimeUpdate?.(audio.currentTime);\n };\n\n const handleLoadedMetadata = () => {\n setState((s) => ({ ...s, duration: audio.duration }));\n };\n\n const handleEnded = () => {\n setState((s) => ({ ...s, isPlaying: false, currentTime: 0 }));\n configRef.current.onEnd?.();\n };\n\n const handlePlay = () => {\n setState((s) => ({ ...s, isPlaying: true }));\n };\n\n const handlePause = () => {\n setState((s) => ({ ...s, isPlaying: false }));\n };\n\n audio.addEventListener('timeupdate', handleTimeUpdate);\n audio.addEventListener('loadedmetadata', handleLoadedMetadata);\n audio.addEventListener('ended', handleEnded);\n audio.addEventListener('play', handlePlay);\n audio.addEventListener('pause', handlePause);\n\n return () => {\n // Cleanup\n if (fadeIntervalRef.current) {\n clearInterval(fadeIntervalRef.current);\n }\n audio.removeEventListener('timeupdate', handleTimeUpdate);\n audio.removeEventListener('loadedmetadata', handleLoadedMetadata);\n audio.removeEventListener('ended', handleEnded);\n audio.removeEventListener('play', handlePlay);\n audio.removeEventListener('pause', handlePause);\n audio.pause();\n audio.src = '';\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Clear any existing fade interval\n const clearFade = useCallback(() => {\n if (fadeIntervalRef.current) {\n clearInterval(fadeIntervalRef.current);\n fadeIntervalRef.current = null;\n }\n }, []);\n\n // Fade in volume\n const fadeInVolume = useCallback(\n (targetVolume: number) => {\n if (!audioRef.current) return;\n\n clearFade();\n setState((s) => ({ ...s, isFadingIn: true, displayVolume: 0 }));\n\n const fadeStepDuration = configRef.current.fadeInDuration / FADE_STEPS;\n const volumeStep = targetVolume / FADE_STEPS;\n let currentStep = 0;\n\n fadeIntervalRef.current = setInterval(() => {\n currentStep++;\n const newVolume = Math.min(volumeStep * currentStep, targetVolume);\n if (audioRef.current) {\n audioRef.current.volume = newVolume;\n }\n // Update displayVolume so the slider follows the fade\n setState((s) => ({ ...s, displayVolume: newVolume }));\n\n if (currentStep >= FADE_STEPS) {\n clearFade();\n setState((s) => ({\n ...s,\n isFadingIn: false,\n displayVolume: targetVolume,\n }));\n }\n }, fadeStepDuration);\n },\n [clearFade]\n );\n\n // Play a song with optional fade-in\n const play = useCallback(\n async (song: Song) => {\n if (!audioRef.current) return;\n\n // Stop any current fade-in\n clearFade();\n\n // If it's a different song, load it\n if (state.currentSong?.id !== song.id) {\n audioRef.current.src = song.audioUrl;\n setState((s) => ({\n ...s,\n currentSong: song,\n currentTime: 0,\n duration: song.duration || 0,\n }));\n }\n\n // Determine target volume\n const targetVolume = Math.max(state.volume, MIN_FADE_IN_VOLUME);\n\n // Set initial volume based on fade setting\n if (configRef.current.fadeInEnabled) {\n audioRef.current.volume = 0;\n } else {\n audioRef.current.volume = targetVolume;\n }\n\n try {\n await audioRef.current.play();\n // Dispatch event to pause other players\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent(MINI_PLAYER_PLAY_EVENT, { detail: song.id })\n );\n }\n // Start fade-in if enabled\n if (configRef.current.fadeInEnabled) {\n fadeInVolume(targetVolume);\n }\n // Call onPlay callback\n configRef.current.onPlay?.(song);\n } catch {\n // Handle autoplay restrictions silently\n }\n },\n [state.currentSong?.id, state.volume, clearFade, fadeInVolume]\n );\n\n // Pause playback\n const pause = useCallback(() => {\n if (!audioRef.current) return;\n clearFade();\n audioRef.current.pause();\n configRef.current.onPause?.();\n }, [clearFade]);\n\n // Toggle play/pause\n const togglePlay = useCallback(() => {\n if (!audioRef.current || !state.currentSong) return;\n\n if (state.isPlaying) {\n pause();\n } else {\n // Resume playback WITHOUT fade-in (fade-in only on new songs via play())\n // Use the current displayVolume to avoid volume jumps\n audioRef.current.volume = state.displayVolume;\n\n audioRef.current\n .play()\n .then(() => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent(MINI_PLAYER_PLAY_EVENT, {\n detail: state.currentSong?.id,\n })\n );\n }\n })\n .catch(() => {\n // Handle autoplay restrictions silently\n });\n }\n }, [state.isPlaying, state.currentSong, state.displayVolume, pause]);\n\n // Seek to position\n const seek = useCallback((time: number) => {\n if (!audioRef.current) return;\n audioRef.current.currentTime = time;\n setState((s) => ({ ...s, currentTime: time }));\n }, []);\n\n // Set volume and persist to localStorage\n const setVolume = useCallback(\n (volume: number) => {\n if (!audioRef.current) return;\n\n const clampedVolume = Math.max(0, Math.min(1, volume));\n\n // If user manually changes volume during fade, stop the fade\n if (fadeIntervalRef.current) {\n clearFade();\n setState((s) => ({ ...s, isFadingIn: false }));\n }\n\n audioRef.current.volume = clampedVolume;\n\n // Persist to localStorage if enabled\n if (configRef.current.persistVolume && typeof window !== 'undefined') {\n localStorage.setItem(\n configRef.current.storageKey,\n clampedVolume.toString()\n );\n }\n\n setState((s) => ({\n ...s,\n volume: clampedVolume,\n displayVolume: clampedVolume,\n }));\n },\n [clearFade]\n );\n\n // Stop playback and clear song\n const stop = useCallback(() => {\n if (!audioRef.current) return;\n clearFade();\n audioRef.current.pause();\n audioRef.current.currentTime = 0;\n audioRef.current.src = '';\n setState((s) => ({\n ...s,\n currentSong: null,\n isPlaying: false,\n currentTime: 0,\n duration: 0,\n isFadingIn: false,\n }));\n }, [clearFade]);\n\n const value: AudioPlayerContextValue = {\n ...state,\n play,\n pause,\n togglePlay,\n seek,\n setVolume,\n stop,\n };\n\n return (\n <AudioPlayerContext.Provider value={value}>\n {children}\n </AudioPlayerContext.Provider>\n );\n}\n\nexport function useAudioPlayer(): AudioPlayerContextValue {\n const context = useContext(AudioPlayerContext);\n if (!context) {\n throw new Error(\n 'useAudioPlayer must be used within an AudioPlayerProvider'\n );\n }\n return context;\n}\n","'use client';\n\nimport { useRef, useState, useEffect } from 'react';\nimport type { UseLazyLoadResult, UseLazyLoadOptions } from '../types';\n\n/**\n * Hook for lazy loading elements using IntersectionObserver.\n * Returns a ref to attach to the target element and a boolean indicating visibility.\n *\n * @param options - Configuration options for the IntersectionObserver\n * @returns Object containing ref and isVisible state\n *\n * @example\n * const { ref, isVisible } = useLazyLoad();\n *\n * return (\n * <div ref={ref}>\n * {isVisible && <ExpensiveComponent />}\n * </div>\n * );\n */\nexport function useLazyLoad(options?: UseLazyLoadOptions): UseLazyLoadResult {\n const {\n rootMargin = '100px',\n threshold = 0,\n forceVisible = false,\n } = options || {};\n\n const ref = useRef<HTMLDivElement>(null);\n const [isVisible, setIsVisible] = useState(forceVisible);\n\n useEffect(() => {\n if (forceVisible) {\n setIsVisible(true);\n return;\n }\n\n if (!ref.current) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setIsVisible(true);\n observer.disconnect(); // Only need to detect once\n }\n },\n { rootMargin, threshold }\n );\n\n observer.observe(ref.current);\n\n return () => observer.disconnect();\n }, [rootMargin, threshold, forceVisible]);\n\n return { ref, isVisible };\n}\n","/**\n * Formats seconds into a human-readable time string (M:SS or MM:SS).\n *\n * @param seconds - The number of seconds to format\n * @returns Formatted time string (e.g., \"3:45\" or \"12:05\")\n *\n * @example\n * formatTime(125) // \"2:05\"\n * formatTime(0) // \"0:00\"\n * formatTime(3600) // \"60:00\"\n */\nexport function formatTime(seconds: number): string {\n if (!seconds || isNaN(seconds) || seconds < 0) return '0:00';\n\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n}\n","'use client';\n\nimport { useEffect, useRef, useState, useCallback, useContext, createContext } from 'react';\nimport WaveSurfer from 'wavesurfer.js';\nimport { useAudioPlayer, MINI_PLAYER_PLAY_EVENT } from '../context/AudioPlayerContext';\nimport { useLazyLoad } from '../hooks/useLazyLoad';\nimport { formatTime } from '../utils/formatTime';\nimport type { WaveformPlayerProps, WaveformConfig, Song } from '../types';\n\nconst DEFAULT_WAVEFORM_CONFIG: Required<WaveformConfig> = {\n waveColor: '#666666',\n progressColor: '#D4AF37',\n cursorColor: '#D4AF37',\n barWidth: 2,\n barGap: 1,\n barRadius: 2,\n height: 60,\n normalize: true,\n};\n\n// Check if we're inside an AudioPlayerProvider\nconst AudioPlayerContext = createContext<unknown>(null);\n\nexport function WaveformPlayer({\n song,\n waveformConfig: userWaveformConfig,\n lazyLoad = true,\n showTime = true,\n className = '',\n renderHeader,\n renderControls,\n standalone = false,\n}: WaveformPlayerProps) {\n const waveformConfig = { ...DEFAULT_WAVEFORM_CONFIG, ...userWaveformConfig };\n const containerRef = useRef<HTMLDivElement>(null);\n const wavesurferRef = useRef<WaveSurfer | null>(null);\n const localAudioRef = useRef<HTMLAudioElement | null>(null);\n const [isReady, setIsReady] = useState(false);\n const [totalDuration, setTotalDuration] = useState(song.duration || 0);\n\n // Standalone mode state\n const [localIsPlaying, setLocalIsPlaying] = useState(false);\n const [localCurrentTime, setLocalCurrentTime] = useState(0);\n\n // Lazy loading\n const { ref: wrapperRef, isVisible } = useLazyLoad({\n forceVisible: !lazyLoad,\n });\n\n // Try to get audio player context (may not exist in standalone mode)\n let contextValue: ReturnType<typeof useAudioPlayer> | null = null;\n try {\n if (!standalone) {\n contextValue = useAudioPlayer();\n }\n } catch {\n // Context not available, use standalone mode\n }\n\n const useStandaloneMode = standalone || !contextValue;\n\n // Context values (only used when not in standalone mode)\n const contextPlay = contextValue?.play;\n const contextTogglePlay = contextValue?.togglePlay;\n const contextSeek = contextValue?.seek;\n const contextCurrentSong = contextValue?.currentSong;\n const contextIsPlaying = contextValue?.isPlaying ?? false;\n const contextCurrentTime = contextValue?.currentTime ?? 0;\n\n // Check if this song is the currently playing song (context mode)\n const isThisSongPlayingInContext = !useStandaloneMode && contextCurrentSong?.id === song.id;\n\n // Determine actual playing state and current time\n const isPlaying = useStandaloneMode ? localIsPlaying : (isThisSongPlayingInContext && contextIsPlaying);\n const currentTime = useStandaloneMode ? localCurrentTime : (isThisSongPlayingInContext ? contextCurrentTime : 0);\n\n // Initialize local audio element for standalone mode\n useEffect(() => {\n if (!useStandaloneMode) return;\n\n const audio = new Audio();\n audio.preload = 'metadata';\n localAudioRef.current = audio;\n\n const handleTimeUpdate = () => {\n setLocalCurrentTime(audio.currentTime);\n };\n\n const handleEnded = () => {\n setLocalIsPlaying(false);\n setLocalCurrentTime(0);\n };\n\n const handleLoadedMetadata = () => {\n setTotalDuration(audio.duration);\n };\n\n audio.addEventListener('timeupdate', handleTimeUpdate);\n audio.addEventListener('ended', handleEnded);\n audio.addEventListener('loadedmetadata', handleLoadedMetadata);\n\n return () => {\n audio.removeEventListener('timeupdate', handleTimeUpdate);\n audio.removeEventListener('ended', handleEnded);\n audio.removeEventListener('loadedmetadata', handleLoadedMetadata);\n audio.pause();\n audio.src = '';\n };\n }, [useStandaloneMode]);\n\n // Listen for other players starting (to pause this one in standalone mode)\n useEffect(() => {\n if (!useStandaloneMode) return;\n\n const handleOtherPlayerPlay = (event: CustomEvent<string>) => {\n // Another player started, pause this one\n if (event.detail !== song.id && localAudioRef.current) {\n localAudioRef.current.pause();\n setLocalIsPlaying(false);\n }\n };\n\n window.addEventListener(MINI_PLAYER_PLAY_EVENT, handleOtherPlayerPlay as EventListener);\n return () => {\n window.removeEventListener(MINI_PLAYER_PLAY_EVENT, handleOtherPlayerPlay as EventListener);\n };\n }, [useStandaloneMode, song.id]);\n\n // Sync waveform progress with playback\n useEffect(() => {\n if (!wavesurferRef.current) return;\n\n const relevantCurrentTime = useStandaloneMode ? localCurrentTime : contextCurrentTime;\n const shouldSync = useStandaloneMode ? localIsPlaying : isThisSongPlayingInContext;\n\n if (!shouldSync) return;\n\n const waveDuration = wavesurferRef.current.getDuration();\n if (waveDuration > 0 && relevantCurrentTime >= 0) {\n const progress = relevantCurrentTime / waveDuration;\n wavesurferRef.current.seekTo(Math.min(progress, 1));\n }\n }, [localCurrentTime, contextCurrentTime, useStandaloneMode, localIsPlaying, isThisSongPlayingInContext]);\n\n // Initialize WaveSurfer - waveform display only (audio plays through context or local audio)\n useEffect(() => {\n if (!containerRef.current || !isVisible) return;\n\n const hasPeaks = song.peaks && song.peaks.length > 0;\n\n // Create WaveSurfer for waveform display only (no audio playback)\n const wavesurfer = WaveSurfer.create({\n container: containerRef.current,\n waveColor: waveformConfig.waveColor,\n progressColor: waveformConfig.progressColor,\n cursorColor: waveformConfig.cursorColor,\n barWidth: waveformConfig.barWidth,\n barGap: waveformConfig.barGap,\n barRadius: waveformConfig.barRadius,\n height: waveformConfig.height,\n normalize: waveformConfig.normalize,\n interact: true,\n // Only load audio URL if we don't have peaks (needed to generate waveform)\n url: hasPeaks ? undefined : song.audioUrl,\n peaks: hasPeaks ? [song.peaks!] : undefined,\n duration: hasPeaks ? (song.duration || 0) : undefined,\n });\n\n // IMPORTANT: Mute WaveSurfer so it doesn't play audio (only visualizes)\n // Audio playback is handled separately through context or local audio element\n wavesurfer.setMuted(true);\n\n wavesurfer.on('ready', () => {\n setIsReady(true);\n setTotalDuration(wavesurfer.getDuration() || song.duration || 0);\n // Ensure it stays muted\n wavesurfer.setMuted(true);\n });\n\n // Handle waveform click for seeking\n wavesurfer.on('interaction', (newTime: number) => {\n if (useStandaloneMode) {\n if (localAudioRef.current) {\n localAudioRef.current.currentTime = newTime;\n setLocalCurrentTime(newTime);\n }\n } else if (isThisSongPlayingInContext && contextSeek) {\n contextSeek(newTime);\n }\n });\n\n wavesurfer.on('error', () => {\n // Silently handle errors\n });\n\n wavesurferRef.current = wavesurfer;\n\n // If we have peaks, mark as ready immediately\n if (hasPeaks) {\n setIsReady(true);\n setTotalDuration(song.duration || 0);\n }\n\n return () => {\n try {\n wavesurfer.destroy();\n } catch {\n // Ignore errors when component unmounts\n }\n };\n }, [\n song.audioUrl,\n song.peaks,\n song.duration,\n isVisible,\n useStandaloneMode,\n isThisSongPlayingInContext,\n contextSeek,\n waveformConfig.waveColor,\n waveformConfig.progressColor,\n waveformConfig.cursorColor,\n waveformConfig.barWidth,\n waveformConfig.barGap,\n waveformConfig.barRadius,\n waveformConfig.height,\n waveformConfig.normalize,\n ]);\n\n // Handle play button click\n const handlePlayClick = useCallback(() => {\n if (!song.id || !song.audioUrl) return;\n\n if (useStandaloneMode) {\n // Standalone mode - use local audio element\n if (!localAudioRef.current) return;\n\n if (localIsPlaying) {\n localAudioRef.current.pause();\n setLocalIsPlaying(false);\n } else {\n // Dispatch event so other standalone players pause\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent(MINI_PLAYER_PLAY_EVENT, { detail: song.id })\n );\n }\n\n // Load and play\n if (localAudioRef.current.src !== song.audioUrl) {\n localAudioRef.current.src = song.audioUrl;\n }\n localAudioRef.current.play().catch(() => {\n // Handle autoplay restrictions\n });\n setLocalIsPlaying(true);\n }\n } else {\n // Context mode - use global player\n if (isThisSongPlayingInContext) {\n contextTogglePlay?.();\n } else {\n contextPlay?.(song);\n }\n }\n }, [song, useStandaloneMode, localIsPlaying, isThisSongPlayingInContext, contextPlay, contextTogglePlay]);\n\n return (\n <div\n ref={wrapperRef}\n className={`wsp-player ${className}`}\n data-song-id={song.id}\n >\n {/* Custom header or default */}\n {renderHeader ? (\n renderHeader(song, isPlaying)\n ) : (\n <div className=\"wsp-player-header\">\n <h3 className=\"wsp-player-title\">{song.title}</h3>\n {song.artist && (\n <span className=\"wsp-player-artist\">{song.artist}</span>\n )}\n </div>\n )}\n\n {/* Player controls and waveform */}\n <div className=\"wsp-player-controls\">\n {/* Play/Pause button */}\n <button\n onClick={handlePlayClick}\n disabled={!isReady}\n className={`wsp-play-button ${isReady ? 'wsp-play-button--ready' : ''}`}\n aria-label={isPlaying ? 'Pause' : 'Play'}\n >\n {!isReady ? (\n <svg className=\"wsp-icon wsp-icon--spinner\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle\n className=\"wsp-spinner-track\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"wsp-spinner-head\"\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 ) : isPlaying ? (\n <svg className=\"wsp-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n <rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n </svg>\n ) : (\n <svg className=\"wsp-icon wsp-icon--play\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n )}\n </button>\n\n {/* Waveform container */}\n <div className=\"wsp-waveform-wrapper\">\n <div ref={containerRef} className=\"wsp-waveform\" />\n\n {/* Time display */}\n {showTime && (\n <div className=\"wsp-time-display\">\n <span className=\"wsp-time\">{formatTime(currentTime)}</span>\n <span className=\"wsp-time\">{formatTime(totalDuration)}</span>\n </div>\n )}\n </div>\n\n {/* Custom controls slot */}\n {renderControls && renderControls(song, isPlaying)}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useRef, useEffect, useState } from 'react';\nimport WaveSurfer from 'wavesurfer.js';\nimport { useAudioPlayer } from '../context/AudioPlayerContext';\nimport { formatTime } from '../utils/formatTime';\nimport type { MiniPlayerProps, WaveformConfig } from '../types';\n\nconst DEFAULT_WAVEFORM_CONFIG: Required<WaveformConfig> = {\n waveColor: '#666666',\n progressColor: '#D4AF37',\n cursorColor: 'transparent',\n barWidth: 2,\n barGap: 1,\n barRadius: 2,\n height: 40,\n normalize: true,\n};\n\nexport function MiniPlayer({\n position = 'bottom',\n showVolume = true,\n showClose = true,\n onClose,\n className = '',\n waveformConfig: userWaveformConfig,\n}: MiniPlayerProps) {\n const waveformConfig = { ...DEFAULT_WAVEFORM_CONFIG, ...userWaveformConfig };\n\n const {\n currentSong,\n isPlaying,\n currentTime,\n duration,\n displayVolume,\n togglePlay,\n seek,\n setVolume,\n stop,\n } = useAudioPlayer();\n\n const waveformRef = useRef<HTMLDivElement>(null);\n const wavesurferRef = useRef<WaveSurfer | null>(null);\n const [isMobile, setIsMobile] = useState(false);\n const [waveformReady, setWaveformReady] = useState(false);\n const lastSongIdRef = useRef<string | null>(null);\n\n // Detect mobile viewport\n useEffect(() => {\n const checkMobile = () => setIsMobile(window.innerWidth < 640);\n checkMobile();\n window.addEventListener('resize', checkMobile);\n return () => window.removeEventListener('resize', checkMobile);\n }, []);\n\n // Initialize/update WaveSurfer when song changes\n useEffect(() => {\n if (!waveformRef.current || !currentSong) return;\n\n // If same song, don't recreate\n if (lastSongIdRef.current === currentSong.id && wavesurferRef.current) {\n return;\n }\n\n // Destroy previous instance\n if (wavesurferRef.current) {\n wavesurferRef.current.destroy();\n wavesurferRef.current = null;\n }\n\n setWaveformReady(false);\n lastSongIdRef.current = currentSong.id;\n\n const hasPeaks = currentSong.peaks && currentSong.peaks.length > 0;\n\n // Create WaveSurfer - waveform only, no audio (audio plays through context)\n const wavesurfer = WaveSurfer.create({\n container: waveformRef.current,\n waveColor: waveformConfig.waveColor,\n progressColor: waveformConfig.progressColor,\n cursorColor: waveformConfig.cursorColor,\n barWidth: waveformConfig.barWidth,\n barGap: waveformConfig.barGap,\n barRadius: waveformConfig.barRadius,\n height: waveformConfig.height,\n normalize: waveformConfig.normalize,\n interact: true,\n // Use peaks if available, otherwise need audio URL to generate waveform\n url: hasPeaks ? undefined : currentSong.audioUrl,\n peaks: hasPeaks && currentSong.peaks ? [currentSong.peaks] : undefined,\n duration: hasPeaks ? (currentSong.duration || duration || 0) : undefined,\n });\n\n wavesurfer.on('ready', () => {\n setWaveformReady(true);\n });\n\n // Handle click on waveform to seek\n wavesurfer.on('interaction', (newTime: number) => {\n seek(newTime);\n });\n\n wavesurferRef.current = wavesurfer;\n\n // If we have peaks, mark ready immediately\n if (hasPeaks) {\n setWaveformReady(true);\n }\n\n return () => {\n // Don't destroy on every render, only when song actually changes\n };\n }, [\n currentSong?.id,\n currentSong?.audioUrl,\n currentSong?.peaks,\n currentSong?.duration,\n duration,\n seek,\n waveformConfig.waveColor,\n waveformConfig.progressColor,\n waveformConfig.cursorColor,\n waveformConfig.barWidth,\n waveformConfig.barGap,\n waveformConfig.barRadius,\n waveformConfig.height,\n waveformConfig.normalize,\n ]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (wavesurferRef.current) {\n wavesurferRef.current.destroy();\n wavesurferRef.current = null;\n }\n };\n }, []);\n\n // Sync waveform progress with audio context\n useEffect(() => {\n if (!wavesurferRef.current || !waveformReady) return;\n\n const waveDuration = wavesurferRef.current.getDuration();\n if (waveDuration > 0 && currentTime >= 0) {\n const progress = currentTime / waveDuration;\n wavesurferRef.current.seekTo(Math.min(progress, 1));\n }\n }, [currentTime, waveformReady]);\n\n // Handle volume change\n const handleVolumeChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setVolume(parseFloat(e.target.value));\n },\n [setVolume]\n );\n\n // Handle scroll wheel on volume control\n const handleVolumeWheel = useCallback(\n (e: React.WheelEvent) => {\n e.preventDefault();\n const delta = e.deltaY > 0 ? -0.05 : 0.05;\n const newVolume = Math.max(0, Math.min(1, displayVolume + delta));\n setVolume(newVolume);\n },\n [displayVolume, setVolume]\n );\n\n // Handle close button\n const handleClose = useCallback(() => {\n stop();\n onClose?.();\n }, [stop, onClose]);\n\n // Don't render if no song is loaded\n if (!currentSong) return null;\n\n // Determine if volume should be shown (respects both prop and mobile detection)\n const shouldShowVolume = showVolume && !isMobile;\n\n const positionClass = position === 'top' ? 'wsp-mini-player--top' : 'wsp-mini-player--bottom';\n\n return (\n <div className={`wsp-mini-player ${positionClass} ${className}`}>\n {/* Main controls */}\n <div className=\"wsp-mini-player-inner\">\n {/* Play/pause button - left */}\n <button\n onClick={togglePlay}\n className=\"wsp-mini-play-button\"\n aria-label={isPlaying ? 'Pause' : 'Play'}\n >\n {isPlaying ? (\n <svg className=\"wsp-mini-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n <rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n </svg>\n ) : (\n <svg className=\"wsp-mini-icon wsp-mini-icon--play\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n )}\n </button>\n\n {/* Song info and waveform - center */}\n <div className=\"wsp-mini-content\">\n {/* Song title */}\n <div className=\"wsp-mini-info\">\n <div className=\"wsp-mini-title\">{currentSong.title}</div>\n {currentSong.album && (\n <div className=\"wsp-mini-album\">• {currentSong.album}</div>\n )}\n </div>\n\n {/* Waveform */}\n <div className=\"wsp-mini-waveform-container\">\n <span className=\"wsp-mini-time\">{formatTime(currentTime)}</span>\n <div ref={waveformRef} className=\"wsp-mini-waveform\" />\n <span className=\"wsp-mini-time\">{formatTime(duration)}</span>\n </div>\n </div>\n\n {/* Volume slider - hidden on mobile */}\n {shouldShowVolume && (\n <div className=\"wsp-mini-volume\" onWheel={handleVolumeWheel}>\n <button\n onClick={() => setVolume(displayVolume > 0 ? 0 : 1)}\n className=\"wsp-mini-volume-button\"\n aria-label={displayVolume > 0 ? 'Mute' : 'Unmute'}\n >\n {displayVolume === 0 ? (\n <svg className=\"wsp-mini-volume-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M17 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2\"\n />\n </svg>\n ) : displayVolume < 0.5 ? (\n <svg className=\"wsp-mini-volume-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15.536 8.464a5 5 0 010 7.072M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z\"\n />\n </svg>\n ) : (\n <svg className=\"wsp-mini-volume-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z\"\n />\n </svg>\n )}\n </button>\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.01\"\n value={displayVolume}\n onChange={handleVolumeChange}\n className=\"wsp-mini-volume-slider\"\n aria-label=\"Volume\"\n />\n </div>\n )}\n\n {/* Close button */}\n {showClose && (\n <button\n onClick={handleClose}\n className=\"wsp-mini-close-button\"\n aria-label=\"Close player\"\n >\n <svg className=\"wsp-mini-close-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport type { ShareButtonsProps, SharePlatform } from '../types';\n\nconst PLATFORM_CONFIG: Record<\n SharePlatform,\n {\n name: string;\n color: string;\n getUrl: (url: string, text: string) => string;\n icon: JSX.Element;\n }\n> = {\n facebook: {\n name: 'Facebook',\n color: '#1877F2',\n getUrl: (url, text) =>\n `https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(url)}&quote=${encodeURIComponent(text)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z\" />\n </svg>\n ),\n },\n twitter: {\n name: 'Twitter/X',\n color: '#1DA1F2',\n getUrl: (url, text) =>\n `https://twitter.com/intent/tweet?text=${encodeURIComponent(text)}&url=${encodeURIComponent(url)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </svg>\n ),\n },\n whatsapp: {\n name: 'WhatsApp',\n color: '#25D366',\n getUrl: (url, text) =>\n `https://wa.me/?text=${encodeURIComponent(`${text} ${url}`)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z\" />\n </svg>\n ),\n },\n linkedin: {\n name: 'LinkedIn',\n color: '#0A66C2',\n getUrl: (url, text) =>\n `https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(url)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\" />\n </svg>\n ),\n },\n reddit: {\n name: 'Reddit',\n color: '#FF4500',\n getUrl: (url, text) =>\n `https://www.reddit.com/submit?url=${encodeURIComponent(url)}&title=${encodeURIComponent(text)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0zm5.01 4.744c.688 0 1.25.561 1.25 1.249a1.25 1.25 0 0 1-2.498.056l-2.597-.547-.8 3.747c1.824.07 3.48.632 4.674 1.488.308-.309.73-.491 1.207-.491.968 0 1.754.786 1.754 1.754 0 .716-.435 1.333-1.01 1.614a3.111 3.111 0 0 1 .042.52c0 2.694-3.13 4.87-7.004 4.87-3.874 0-7.004-2.176-7.004-4.87 0-.183.015-.366.043-.534A1.748 1.748 0 0 1 4.028 12c0-.968.786-1.754 1.754-1.754.463 0 .898.196 1.207.49 1.207-.883 2.878-1.43 4.744-1.487l.885-4.182a.342.342 0 0 1 .14-.197.35.35 0 0 1 .238-.042l2.906.617a1.214 1.214 0 0 1 1.108-.701zM9.25 12C8.561 12 8 12.562 8 13.25c0 .687.561 1.248 1.25 1.248.687 0 1.248-.561 1.248-1.249 0-.688-.561-1.249-1.249-1.249zm5.5 0c-.687 0-1.248.561-1.248 1.25 0 .687.561 1.248 1.249 1.248.688 0 1.249-.561 1.249-1.249 0-.687-.562-1.249-1.25-1.249zm-5.466 3.99a.327.327 0 0 0-.231.094.33.33 0 0 0 0 .463c.842.842 2.484.913 2.961.913.477 0 2.105-.056 2.961-.913a.361.361 0 0 0 .029-.463.33.33 0 0 0-.464 0c-.547.533-1.684.73-2.512.73-.828 0-1.979-.196-2.512-.73a.326.326 0 0 0-.232-.095z\" />\n </svg>\n ),\n },\n telegram: {\n name: 'Telegram',\n color: '#0088CC',\n getUrl: (url, text) =>\n `https://t.me/share/url?url=${encodeURIComponent(url)}&text=${encodeURIComponent(text)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z\" />\n </svg>\n ),\n },\n email: {\n name: 'Email',\n color: '#666666',\n getUrl: (url, text) =>\n `mailto:?subject=${encodeURIComponent(text)}&body=${encodeURIComponent(`${text}\\n\\n${url}`)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"\n />\n </svg>\n ),\n },\n copy: {\n name: 'Copy Link',\n color: '#666666',\n getUrl: () => '', // Not used for copy\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n ),\n },\n};\n\nconst DEFAULT_PLATFORMS: SharePlatform[] = [\n 'facebook',\n 'twitter',\n 'whatsapp',\n 'copy',\n];\n\nconst CheckIcon = () => (\n <svg\n className=\"wsp-share-icon wsp-share-icon--success\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n);\n\nexport function ShareButtons({\n url,\n text = '',\n platforms = DEFAULT_PLATFORMS,\n onShare,\n showLabels = false,\n className = '',\n}: ShareButtonsProps) {\n const [copied, setCopied] = useState(false);\n const [sharing, setSharing] = useState(false);\n\n const handleShare = useCallback(\n async (platform: SharePlatform) => {\n setSharing(true);\n\n if (platform === 'copy') {\n try {\n await navigator.clipboard.writeText(url);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n onShare?.(platform, url);\n } catch {\n // Clipboard may not be available\n }\n } else {\n const config = PLATFORM_CONFIG[platform];\n const shareUrl = config.getUrl(url, text);\n\n // Open share dialog\n if (platform === 'email') {\n window.location.href = shareUrl;\n } else {\n window.open(shareUrl, '_blank', 'width=600,height=400');\n }\n\n onShare?.(platform, url);\n }\n\n setSharing(false);\n },\n [url, text, onShare]\n );\n\n return (\n <div className={`wsp-share-buttons ${className}`}>\n {platforms.map((platform) => {\n const config = PLATFORM_CONFIG[platform];\n if (!config) return null;\n\n const isCopyButton = platform === 'copy';\n const showCheck = isCopyButton && copied;\n\n return (\n <button\n key={platform}\n onClick={() => handleShare(platform)}\n disabled={sharing}\n className=\"wsp-share-button\"\n style={{ '--wsp-share-hover-color': config.color } as React.CSSProperties}\n title={showCheck ? 'Copied!' : config.name}\n aria-label={`Share via ${config.name}`}\n >\n {showCheck ? <CheckIcon /> : config.icon}\n {showLabels && (\n <span className=\"wsp-share-label\">\n {showCheck ? 'Copied!' : config.name}\n </span>\n )}\n </button>\n );\n })}\n </div>\n );\n}\n"]}
package/dist/index.mjs CHANGED
@@ -170,10 +170,7 @@ function AudioPlayerProvider({
170
170
  if (state.isPlaying) {
171
171
  pause();
172
172
  } else {
173
- const targetVolume = Math.max(state.volume, MIN_FADE_IN_VOLUME);
174
- if (configRef.current.fadeInEnabled) {
175
- audioRef.current.volume = 0;
176
- }
173
+ audioRef.current.volume = state.displayVolume;
177
174
  audioRef.current.play().then(() => {
178
175
  if (typeof window !== "undefined") {
179
176
  window.dispatchEvent(
@@ -182,13 +179,10 @@ function AudioPlayerProvider({
182
179
  })
183
180
  );
184
181
  }
185
- if (configRef.current.fadeInEnabled) {
186
- fadeInVolume(targetVolume);
187
- }
188
182
  }).catch(() => {
189
183
  });
190
184
  }
191
- }, [state.isPlaying, state.currentSong, state.volume, pause, fadeInVolume]);
185
+ }, [state.isPlaying, state.currentSong, state.displayVolume, pause]);
192
186
  const seek = useCallback((time) => {
193
187
  if (!audioRef.current) return;
194
188
  audioRef.current.currentTime = time;
@@ -657,6 +651,15 @@ function MiniPlayer({
657
651
  },
658
652
  [setVolume]
659
653
  );
654
+ const handleVolumeWheel = useCallback(
655
+ (e) => {
656
+ e.preventDefault();
657
+ const delta = e.deltaY > 0 ? -0.05 : 0.05;
658
+ const newVolume = Math.max(0, Math.min(1, displayVolume + delta));
659
+ setVolume(newVolume);
660
+ },
661
+ [displayVolume, setVolume]
662
+ );
660
663
  const handleClose = useCallback(() => {
661
664
  stop();
662
665
  onClose?.();
@@ -691,7 +694,7 @@ function MiniPlayer({
691
694
  /* @__PURE__ */ jsx("span", { className: "wsp-mini-time", children: formatTime(duration) })
692
695
  ] })
693
696
  ] }),
694
- shouldShowVolume && /* @__PURE__ */ jsxs("div", { className: "wsp-mini-volume", children: [
697
+ shouldShowVolume && /* @__PURE__ */ jsxs("div", { className: "wsp-mini-volume", onWheel: handleVolumeWheel, children: [
695
698
  /* @__PURE__ */ jsx(
696
699
  "button",
697
700
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context/AudioPlayerContext.tsx","../src/hooks/useLazyLoad.ts","../src/utils/formatTime.ts","../src/components/WaveformPlayer.tsx","../src/components/MiniPlayer.tsx","../src/components/ShareButtons.tsx"],"names":["useRef","useState","useEffect","createContext","useCallback","jsx","DEFAULT_WAVEFORM_CONFIG","WaveSurfer","jsxs"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client';\n\nimport {\n createContext,\n useContext,\n useRef,\n useState,\n useCallback,\n useEffect,\n ReactNode,\n} from 'react';\nimport type {\n Song,\n AudioPlayerState,\n AudioPlayerContextValue,\n AudioPlayerConfig,\n} from '../types';\n\n// Custom event for notifying WaveformPlayers when mini-player starts playing\nexport const MINI_PLAYER_PLAY_EVENT = 'wavesurfer-player-mini-play';\n\nconst AudioPlayerContext = createContext<AudioPlayerContextValue | null>(null);\n\nconst DEFAULT_CONFIG: Required<AudioPlayerConfig> = {\n fadeInEnabled: true,\n fadeInDuration: 3000,\n persistVolume: true,\n storageKey: 'audioPlayerVolume',\n defaultVolume: 1,\n onPlay: () => {},\n onPause: () => {},\n onEnd: () => {},\n onTimeUpdate: () => {},\n};\n\nconst FADE_STEPS = 30; // 30 steps for smooth fade\nconst MIN_FADE_IN_VOLUME = 0.1; // Minimum 10% volume on fade-in so users hear something\n\ninterface AudioPlayerProviderProps {\n children: ReactNode;\n config?: AudioPlayerConfig;\n}\n\nexport function AudioPlayerProvider({\n children,\n config: userConfig,\n}: AudioPlayerProviderProps) {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const fadeIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const configRef = useRef(config);\n\n // Keep config ref up to date\n useEffect(() => {\n configRef.current = config;\n }, [config]);\n\n const [state, setState] = useState<AudioPlayerState>({\n currentSong: null,\n isPlaying: false,\n currentTime: 0,\n duration: 0,\n volume: config.defaultVolume,\n displayVolume: config.defaultVolume,\n isFadingIn: false,\n });\n\n // Initialize audio element and load saved volume\n useEffect(() => {\n // Create audio element\n const audio = new Audio();\n audio.preload = 'metadata';\n audioRef.current = audio;\n\n // Load saved volume from localStorage if persistence is enabled\n if (config.persistVolume && typeof window !== 'undefined') {\n const savedVolume = localStorage.getItem(config.storageKey);\n if (savedVolume) {\n const vol = parseFloat(savedVolume);\n if (!isNaN(vol) && vol >= 0 && vol <= 1) {\n setState((s) => ({ ...s, volume: vol, displayVolume: vol }));\n audio.volume = vol;\n }\n }\n }\n\n // Audio event listeners\n const handleTimeUpdate = () => {\n setState((s) => ({ ...s, currentTime: audio.currentTime }));\n configRef.current.onTimeUpdate?.(audio.currentTime);\n };\n\n const handleLoadedMetadata = () => {\n setState((s) => ({ ...s, duration: audio.duration }));\n };\n\n const handleEnded = () => {\n setState((s) => ({ ...s, isPlaying: false, currentTime: 0 }));\n configRef.current.onEnd?.();\n };\n\n const handlePlay = () => {\n setState((s) => ({ ...s, isPlaying: true }));\n };\n\n const handlePause = () => {\n setState((s) => ({ ...s, isPlaying: false }));\n };\n\n audio.addEventListener('timeupdate', handleTimeUpdate);\n audio.addEventListener('loadedmetadata', handleLoadedMetadata);\n audio.addEventListener('ended', handleEnded);\n audio.addEventListener('play', handlePlay);\n audio.addEventListener('pause', handlePause);\n\n return () => {\n // Cleanup\n if (fadeIntervalRef.current) {\n clearInterval(fadeIntervalRef.current);\n }\n audio.removeEventListener('timeupdate', handleTimeUpdate);\n audio.removeEventListener('loadedmetadata', handleLoadedMetadata);\n audio.removeEventListener('ended', handleEnded);\n audio.removeEventListener('play', handlePlay);\n audio.removeEventListener('pause', handlePause);\n audio.pause();\n audio.src = '';\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Clear any existing fade interval\n const clearFade = useCallback(() => {\n if (fadeIntervalRef.current) {\n clearInterval(fadeIntervalRef.current);\n fadeIntervalRef.current = null;\n }\n }, []);\n\n // Fade in volume\n const fadeInVolume = useCallback(\n (targetVolume: number) => {\n if (!audioRef.current) return;\n\n clearFade();\n setState((s) => ({ ...s, isFadingIn: true, displayVolume: 0 }));\n\n const fadeStepDuration = configRef.current.fadeInDuration / FADE_STEPS;\n const volumeStep = targetVolume / FADE_STEPS;\n let currentStep = 0;\n\n fadeIntervalRef.current = setInterval(() => {\n currentStep++;\n const newVolume = Math.min(volumeStep * currentStep, targetVolume);\n if (audioRef.current) {\n audioRef.current.volume = newVolume;\n }\n // Update displayVolume so the slider follows the fade\n setState((s) => ({ ...s, displayVolume: newVolume }));\n\n if (currentStep >= FADE_STEPS) {\n clearFade();\n setState((s) => ({\n ...s,\n isFadingIn: false,\n displayVolume: targetVolume,\n }));\n }\n }, fadeStepDuration);\n },\n [clearFade]\n );\n\n // Play a song with optional fade-in\n const play = useCallback(\n async (song: Song) => {\n if (!audioRef.current) return;\n\n // Stop any current fade-in\n clearFade();\n\n // If it's a different song, load it\n if (state.currentSong?.id !== song.id) {\n audioRef.current.src = song.audioUrl;\n setState((s) => ({\n ...s,\n currentSong: song,\n currentTime: 0,\n duration: song.duration || 0,\n }));\n }\n\n // Determine target volume\n const targetVolume = Math.max(state.volume, MIN_FADE_IN_VOLUME);\n\n // Set initial volume based on fade setting\n if (configRef.current.fadeInEnabled) {\n audioRef.current.volume = 0;\n } else {\n audioRef.current.volume = targetVolume;\n }\n\n try {\n await audioRef.current.play();\n // Dispatch event to pause other players\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent(MINI_PLAYER_PLAY_EVENT, { detail: song.id })\n );\n }\n // Start fade-in if enabled\n if (configRef.current.fadeInEnabled) {\n fadeInVolume(targetVolume);\n }\n // Call onPlay callback\n configRef.current.onPlay?.(song);\n } catch {\n // Handle autoplay restrictions silently\n }\n },\n [state.currentSong?.id, state.volume, clearFade, fadeInVolume]\n );\n\n // Pause playback\n const pause = useCallback(() => {\n if (!audioRef.current) return;\n clearFade();\n audioRef.current.pause();\n configRef.current.onPause?.();\n }, [clearFade]);\n\n // Toggle play/pause\n const togglePlay = useCallback(() => {\n if (!audioRef.current || !state.currentSong) return;\n\n if (state.isPlaying) {\n pause();\n } else {\n // Resume with fade-in if enabled\n const targetVolume = Math.max(state.volume, MIN_FADE_IN_VOLUME);\n\n if (configRef.current.fadeInEnabled) {\n audioRef.current.volume = 0;\n }\n\n audioRef.current\n .play()\n .then(() => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent(MINI_PLAYER_PLAY_EVENT, {\n detail: state.currentSong?.id,\n })\n );\n }\n if (configRef.current.fadeInEnabled) {\n fadeInVolume(targetVolume);\n }\n })\n .catch(() => {\n // Handle autoplay restrictions silently\n });\n }\n }, [state.isPlaying, state.currentSong, state.volume, pause, fadeInVolume]);\n\n // Seek to position\n const seek = useCallback((time: number) => {\n if (!audioRef.current) return;\n audioRef.current.currentTime = time;\n setState((s) => ({ ...s, currentTime: time }));\n }, []);\n\n // Set volume and persist to localStorage\n const setVolume = useCallback(\n (volume: number) => {\n if (!audioRef.current) return;\n\n const clampedVolume = Math.max(0, Math.min(1, volume));\n\n // If user manually changes volume during fade, stop the fade\n if (fadeIntervalRef.current) {\n clearFade();\n setState((s) => ({ ...s, isFadingIn: false }));\n }\n\n audioRef.current.volume = clampedVolume;\n\n // Persist to localStorage if enabled\n if (configRef.current.persistVolume && typeof window !== 'undefined') {\n localStorage.setItem(\n configRef.current.storageKey,\n clampedVolume.toString()\n );\n }\n\n setState((s) => ({\n ...s,\n volume: clampedVolume,\n displayVolume: clampedVolume,\n }));\n },\n [clearFade]\n );\n\n // Stop playback and clear song\n const stop = useCallback(() => {\n if (!audioRef.current) return;\n clearFade();\n audioRef.current.pause();\n audioRef.current.currentTime = 0;\n audioRef.current.src = '';\n setState((s) => ({\n ...s,\n currentSong: null,\n isPlaying: false,\n currentTime: 0,\n duration: 0,\n isFadingIn: false,\n }));\n }, [clearFade]);\n\n const value: AudioPlayerContextValue = {\n ...state,\n play,\n pause,\n togglePlay,\n seek,\n setVolume,\n stop,\n };\n\n return (\n <AudioPlayerContext.Provider value={value}>\n {children}\n </AudioPlayerContext.Provider>\n );\n}\n\nexport function useAudioPlayer(): AudioPlayerContextValue {\n const context = useContext(AudioPlayerContext);\n if (!context) {\n throw new Error(\n 'useAudioPlayer must be used within an AudioPlayerProvider'\n );\n }\n return context;\n}\n","'use client';\n\nimport { useRef, useState, useEffect } from 'react';\nimport type { UseLazyLoadResult, UseLazyLoadOptions } from '../types';\n\n/**\n * Hook for lazy loading elements using IntersectionObserver.\n * Returns a ref to attach to the target element and a boolean indicating visibility.\n *\n * @param options - Configuration options for the IntersectionObserver\n * @returns Object containing ref and isVisible state\n *\n * @example\n * const { ref, isVisible } = useLazyLoad();\n *\n * return (\n * <div ref={ref}>\n * {isVisible && <ExpensiveComponent />}\n * </div>\n * );\n */\nexport function useLazyLoad(options?: UseLazyLoadOptions): UseLazyLoadResult {\n const {\n rootMargin = '100px',\n threshold = 0,\n forceVisible = false,\n } = options || {};\n\n const ref = useRef<HTMLDivElement>(null);\n const [isVisible, setIsVisible] = useState(forceVisible);\n\n useEffect(() => {\n if (forceVisible) {\n setIsVisible(true);\n return;\n }\n\n if (!ref.current) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setIsVisible(true);\n observer.disconnect(); // Only need to detect once\n }\n },\n { rootMargin, threshold }\n );\n\n observer.observe(ref.current);\n\n return () => observer.disconnect();\n }, [rootMargin, threshold, forceVisible]);\n\n return { ref, isVisible };\n}\n","/**\n * Formats seconds into a human-readable time string (M:SS or MM:SS).\n *\n * @param seconds - The number of seconds to format\n * @returns Formatted time string (e.g., \"3:45\" or \"12:05\")\n *\n * @example\n * formatTime(125) // \"2:05\"\n * formatTime(0) // \"0:00\"\n * formatTime(3600) // \"60:00\"\n */\nexport function formatTime(seconds: number): string {\n if (!seconds || isNaN(seconds) || seconds < 0) return '0:00';\n\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n}\n","'use client';\n\nimport { useEffect, useRef, useState, useCallback, useContext, createContext } from 'react';\nimport WaveSurfer from 'wavesurfer.js';\nimport { useAudioPlayer, MINI_PLAYER_PLAY_EVENT } from '../context/AudioPlayerContext';\nimport { useLazyLoad } from '../hooks/useLazyLoad';\nimport { formatTime } from '../utils/formatTime';\nimport type { WaveformPlayerProps, WaveformConfig, Song } from '../types';\n\nconst DEFAULT_WAVEFORM_CONFIG: Required<WaveformConfig> = {\n waveColor: '#666666',\n progressColor: '#D4AF37',\n cursorColor: '#D4AF37',\n barWidth: 2,\n barGap: 1,\n barRadius: 2,\n height: 60,\n normalize: true,\n};\n\n// Check if we're inside an AudioPlayerProvider\nconst AudioPlayerContext = createContext<unknown>(null);\n\nexport function WaveformPlayer({\n song,\n waveformConfig: userWaveformConfig,\n lazyLoad = true,\n showTime = true,\n className = '',\n renderHeader,\n renderControls,\n standalone = false,\n}: WaveformPlayerProps) {\n const waveformConfig = { ...DEFAULT_WAVEFORM_CONFIG, ...userWaveformConfig };\n const containerRef = useRef<HTMLDivElement>(null);\n const wavesurferRef = useRef<WaveSurfer | null>(null);\n const localAudioRef = useRef<HTMLAudioElement | null>(null);\n const [isReady, setIsReady] = useState(false);\n const [totalDuration, setTotalDuration] = useState(song.duration || 0);\n\n // Standalone mode state\n const [localIsPlaying, setLocalIsPlaying] = useState(false);\n const [localCurrentTime, setLocalCurrentTime] = useState(0);\n\n // Lazy loading\n const { ref: wrapperRef, isVisible } = useLazyLoad({\n forceVisible: !lazyLoad,\n });\n\n // Try to get audio player context (may not exist in standalone mode)\n let contextValue: ReturnType<typeof useAudioPlayer> | null = null;\n try {\n if (!standalone) {\n contextValue = useAudioPlayer();\n }\n } catch {\n // Context not available, use standalone mode\n }\n\n const useStandaloneMode = standalone || !contextValue;\n\n // Context values (only used when not in standalone mode)\n const contextPlay = contextValue?.play;\n const contextTogglePlay = contextValue?.togglePlay;\n const contextSeek = contextValue?.seek;\n const contextCurrentSong = contextValue?.currentSong;\n const contextIsPlaying = contextValue?.isPlaying ?? false;\n const contextCurrentTime = contextValue?.currentTime ?? 0;\n\n // Check if this song is the currently playing song (context mode)\n const isThisSongPlayingInContext = !useStandaloneMode && contextCurrentSong?.id === song.id;\n\n // Determine actual playing state and current time\n const isPlaying = useStandaloneMode ? localIsPlaying : (isThisSongPlayingInContext && contextIsPlaying);\n const currentTime = useStandaloneMode ? localCurrentTime : (isThisSongPlayingInContext ? contextCurrentTime : 0);\n\n // Initialize local audio element for standalone mode\n useEffect(() => {\n if (!useStandaloneMode) return;\n\n const audio = new Audio();\n audio.preload = 'metadata';\n localAudioRef.current = audio;\n\n const handleTimeUpdate = () => {\n setLocalCurrentTime(audio.currentTime);\n };\n\n const handleEnded = () => {\n setLocalIsPlaying(false);\n setLocalCurrentTime(0);\n };\n\n const handleLoadedMetadata = () => {\n setTotalDuration(audio.duration);\n };\n\n audio.addEventListener('timeupdate', handleTimeUpdate);\n audio.addEventListener('ended', handleEnded);\n audio.addEventListener('loadedmetadata', handleLoadedMetadata);\n\n return () => {\n audio.removeEventListener('timeupdate', handleTimeUpdate);\n audio.removeEventListener('ended', handleEnded);\n audio.removeEventListener('loadedmetadata', handleLoadedMetadata);\n audio.pause();\n audio.src = '';\n };\n }, [useStandaloneMode]);\n\n // Listen for other players starting (to pause this one in standalone mode)\n useEffect(() => {\n if (!useStandaloneMode) return;\n\n const handleOtherPlayerPlay = (event: CustomEvent<string>) => {\n // Another player started, pause this one\n if (event.detail !== song.id && localAudioRef.current) {\n localAudioRef.current.pause();\n setLocalIsPlaying(false);\n }\n };\n\n window.addEventListener(MINI_PLAYER_PLAY_EVENT, handleOtherPlayerPlay as EventListener);\n return () => {\n window.removeEventListener(MINI_PLAYER_PLAY_EVENT, handleOtherPlayerPlay as EventListener);\n };\n }, [useStandaloneMode, song.id]);\n\n // Sync waveform progress with playback\n useEffect(() => {\n if (!wavesurferRef.current) return;\n\n const relevantCurrentTime = useStandaloneMode ? localCurrentTime : contextCurrentTime;\n const shouldSync = useStandaloneMode ? localIsPlaying : isThisSongPlayingInContext;\n\n if (!shouldSync) return;\n\n const waveDuration = wavesurferRef.current.getDuration();\n if (waveDuration > 0 && relevantCurrentTime >= 0) {\n const progress = relevantCurrentTime / waveDuration;\n wavesurferRef.current.seekTo(Math.min(progress, 1));\n }\n }, [localCurrentTime, contextCurrentTime, useStandaloneMode, localIsPlaying, isThisSongPlayingInContext]);\n\n // Initialize WaveSurfer - waveform display only (audio plays through context or local audio)\n useEffect(() => {\n if (!containerRef.current || !isVisible) return;\n\n const hasPeaks = song.peaks && song.peaks.length > 0;\n\n // Create WaveSurfer for waveform display only (no audio playback)\n const wavesurfer = WaveSurfer.create({\n container: containerRef.current,\n waveColor: waveformConfig.waveColor,\n progressColor: waveformConfig.progressColor,\n cursorColor: waveformConfig.cursorColor,\n barWidth: waveformConfig.barWidth,\n barGap: waveformConfig.barGap,\n barRadius: waveformConfig.barRadius,\n height: waveformConfig.height,\n normalize: waveformConfig.normalize,\n interact: true,\n // Only load audio URL if we don't have peaks (needed to generate waveform)\n url: hasPeaks ? undefined : song.audioUrl,\n peaks: hasPeaks ? [song.peaks!] : undefined,\n duration: hasPeaks ? (song.duration || 0) : undefined,\n });\n\n // IMPORTANT: Mute WaveSurfer so it doesn't play audio (only visualizes)\n // Audio playback is handled separately through context or local audio element\n wavesurfer.setMuted(true);\n\n wavesurfer.on('ready', () => {\n setIsReady(true);\n setTotalDuration(wavesurfer.getDuration() || song.duration || 0);\n // Ensure it stays muted\n wavesurfer.setMuted(true);\n });\n\n // Handle waveform click for seeking\n wavesurfer.on('interaction', (newTime: number) => {\n if (useStandaloneMode) {\n if (localAudioRef.current) {\n localAudioRef.current.currentTime = newTime;\n setLocalCurrentTime(newTime);\n }\n } else if (isThisSongPlayingInContext && contextSeek) {\n contextSeek(newTime);\n }\n });\n\n wavesurfer.on('error', () => {\n // Silently handle errors\n });\n\n wavesurferRef.current = wavesurfer;\n\n // If we have peaks, mark as ready immediately\n if (hasPeaks) {\n setIsReady(true);\n setTotalDuration(song.duration || 0);\n }\n\n return () => {\n try {\n wavesurfer.destroy();\n } catch {\n // Ignore errors when component unmounts\n }\n };\n }, [\n song.audioUrl,\n song.peaks,\n song.duration,\n isVisible,\n useStandaloneMode,\n isThisSongPlayingInContext,\n contextSeek,\n waveformConfig.waveColor,\n waveformConfig.progressColor,\n waveformConfig.cursorColor,\n waveformConfig.barWidth,\n waveformConfig.barGap,\n waveformConfig.barRadius,\n waveformConfig.height,\n waveformConfig.normalize,\n ]);\n\n // Handle play button click\n const handlePlayClick = useCallback(() => {\n if (!song.id || !song.audioUrl) return;\n\n if (useStandaloneMode) {\n // Standalone mode - use local audio element\n if (!localAudioRef.current) return;\n\n if (localIsPlaying) {\n localAudioRef.current.pause();\n setLocalIsPlaying(false);\n } else {\n // Dispatch event so other standalone players pause\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent(MINI_PLAYER_PLAY_EVENT, { detail: song.id })\n );\n }\n\n // Load and play\n if (localAudioRef.current.src !== song.audioUrl) {\n localAudioRef.current.src = song.audioUrl;\n }\n localAudioRef.current.play().catch(() => {\n // Handle autoplay restrictions\n });\n setLocalIsPlaying(true);\n }\n } else {\n // Context mode - use global player\n if (isThisSongPlayingInContext) {\n contextTogglePlay?.();\n } else {\n contextPlay?.(song);\n }\n }\n }, [song, useStandaloneMode, localIsPlaying, isThisSongPlayingInContext, contextPlay, contextTogglePlay]);\n\n return (\n <div\n ref={wrapperRef}\n className={`wsp-player ${className}`}\n data-song-id={song.id}\n >\n {/* Custom header or default */}\n {renderHeader ? (\n renderHeader(song, isPlaying)\n ) : (\n <div className=\"wsp-player-header\">\n <h3 className=\"wsp-player-title\">{song.title}</h3>\n {song.artist && (\n <span className=\"wsp-player-artist\">{song.artist}</span>\n )}\n </div>\n )}\n\n {/* Player controls and waveform */}\n <div className=\"wsp-player-controls\">\n {/* Play/Pause button */}\n <button\n onClick={handlePlayClick}\n disabled={!isReady}\n className={`wsp-play-button ${isReady ? 'wsp-play-button--ready' : ''}`}\n aria-label={isPlaying ? 'Pause' : 'Play'}\n >\n {!isReady ? (\n <svg className=\"wsp-icon wsp-icon--spinner\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle\n className=\"wsp-spinner-track\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"wsp-spinner-head\"\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 ) : isPlaying ? (\n <svg className=\"wsp-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n <rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n </svg>\n ) : (\n <svg className=\"wsp-icon wsp-icon--play\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n )}\n </button>\n\n {/* Waveform container */}\n <div className=\"wsp-waveform-wrapper\">\n <div ref={containerRef} className=\"wsp-waveform\" />\n\n {/* Time display */}\n {showTime && (\n <div className=\"wsp-time-display\">\n <span className=\"wsp-time\">{formatTime(currentTime)}</span>\n <span className=\"wsp-time\">{formatTime(totalDuration)}</span>\n </div>\n )}\n </div>\n\n {/* Custom controls slot */}\n {renderControls && renderControls(song, isPlaying)}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useRef, useEffect, useState } from 'react';\nimport WaveSurfer from 'wavesurfer.js';\nimport { useAudioPlayer } from '../context/AudioPlayerContext';\nimport { formatTime } from '../utils/formatTime';\nimport type { MiniPlayerProps, WaveformConfig } from '../types';\n\nconst DEFAULT_WAVEFORM_CONFIG: Required<WaveformConfig> = {\n waveColor: '#666666',\n progressColor: '#D4AF37',\n cursorColor: 'transparent',\n barWidth: 2,\n barGap: 1,\n barRadius: 2,\n height: 40,\n normalize: true,\n};\n\nexport function MiniPlayer({\n position = 'bottom',\n showVolume = true,\n showClose = true,\n onClose,\n className = '',\n waveformConfig: userWaveformConfig,\n}: MiniPlayerProps) {\n const waveformConfig = { ...DEFAULT_WAVEFORM_CONFIG, ...userWaveformConfig };\n\n const {\n currentSong,\n isPlaying,\n currentTime,\n duration,\n displayVolume,\n togglePlay,\n seek,\n setVolume,\n stop,\n } = useAudioPlayer();\n\n const waveformRef = useRef<HTMLDivElement>(null);\n const wavesurferRef = useRef<WaveSurfer | null>(null);\n const [isMobile, setIsMobile] = useState(false);\n const [waveformReady, setWaveformReady] = useState(false);\n const lastSongIdRef = useRef<string | null>(null);\n\n // Detect mobile viewport\n useEffect(() => {\n const checkMobile = () => setIsMobile(window.innerWidth < 640);\n checkMobile();\n window.addEventListener('resize', checkMobile);\n return () => window.removeEventListener('resize', checkMobile);\n }, []);\n\n // Initialize/update WaveSurfer when song changes\n useEffect(() => {\n if (!waveformRef.current || !currentSong) return;\n\n // If same song, don't recreate\n if (lastSongIdRef.current === currentSong.id && wavesurferRef.current) {\n return;\n }\n\n // Destroy previous instance\n if (wavesurferRef.current) {\n wavesurferRef.current.destroy();\n wavesurferRef.current = null;\n }\n\n setWaveformReady(false);\n lastSongIdRef.current = currentSong.id;\n\n const hasPeaks = currentSong.peaks && currentSong.peaks.length > 0;\n\n // Create WaveSurfer - waveform only, no audio (audio plays through context)\n const wavesurfer = WaveSurfer.create({\n container: waveformRef.current,\n waveColor: waveformConfig.waveColor,\n progressColor: waveformConfig.progressColor,\n cursorColor: waveformConfig.cursorColor,\n barWidth: waveformConfig.barWidth,\n barGap: waveformConfig.barGap,\n barRadius: waveformConfig.barRadius,\n height: waveformConfig.height,\n normalize: waveformConfig.normalize,\n interact: true,\n // Use peaks if available, otherwise need audio URL to generate waveform\n url: hasPeaks ? undefined : currentSong.audioUrl,\n peaks: hasPeaks && currentSong.peaks ? [currentSong.peaks] : undefined,\n duration: hasPeaks ? (currentSong.duration || duration || 0) : undefined,\n });\n\n wavesurfer.on('ready', () => {\n setWaveformReady(true);\n });\n\n // Handle click on waveform to seek\n wavesurfer.on('interaction', (newTime: number) => {\n seek(newTime);\n });\n\n wavesurferRef.current = wavesurfer;\n\n // If we have peaks, mark ready immediately\n if (hasPeaks) {\n setWaveformReady(true);\n }\n\n return () => {\n // Don't destroy on every render, only when song actually changes\n };\n }, [\n currentSong?.id,\n currentSong?.audioUrl,\n currentSong?.peaks,\n currentSong?.duration,\n duration,\n seek,\n waveformConfig.waveColor,\n waveformConfig.progressColor,\n waveformConfig.cursorColor,\n waveformConfig.barWidth,\n waveformConfig.barGap,\n waveformConfig.barRadius,\n waveformConfig.height,\n waveformConfig.normalize,\n ]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (wavesurferRef.current) {\n wavesurferRef.current.destroy();\n wavesurferRef.current = null;\n }\n };\n }, []);\n\n // Sync waveform progress with audio context\n useEffect(() => {\n if (!wavesurferRef.current || !waveformReady) return;\n\n const waveDuration = wavesurferRef.current.getDuration();\n if (waveDuration > 0 && currentTime >= 0) {\n const progress = currentTime / waveDuration;\n wavesurferRef.current.seekTo(Math.min(progress, 1));\n }\n }, [currentTime, waveformReady]);\n\n // Handle volume change\n const handleVolumeChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setVolume(parseFloat(e.target.value));\n },\n [setVolume]\n );\n\n // Handle close button\n const handleClose = useCallback(() => {\n stop();\n onClose?.();\n }, [stop, onClose]);\n\n // Don't render if no song is loaded\n if (!currentSong) return null;\n\n // Determine if volume should be shown (respects both prop and mobile detection)\n const shouldShowVolume = showVolume && !isMobile;\n\n const positionClass = position === 'top' ? 'wsp-mini-player--top' : 'wsp-mini-player--bottom';\n\n return (\n <div className={`wsp-mini-player ${positionClass} ${className}`}>\n {/* Main controls */}\n <div className=\"wsp-mini-player-inner\">\n {/* Play/pause button - left */}\n <button\n onClick={togglePlay}\n className=\"wsp-mini-play-button\"\n aria-label={isPlaying ? 'Pause' : 'Play'}\n >\n {isPlaying ? (\n <svg className=\"wsp-mini-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n <rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n </svg>\n ) : (\n <svg className=\"wsp-mini-icon wsp-mini-icon--play\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n )}\n </button>\n\n {/* Song info and waveform - center */}\n <div className=\"wsp-mini-content\">\n {/* Song title */}\n <div className=\"wsp-mini-info\">\n <div className=\"wsp-mini-title\">{currentSong.title}</div>\n {currentSong.album && (\n <div className=\"wsp-mini-album\">• {currentSong.album}</div>\n )}\n </div>\n\n {/* Waveform */}\n <div className=\"wsp-mini-waveform-container\">\n <span className=\"wsp-mini-time\">{formatTime(currentTime)}</span>\n <div ref={waveformRef} className=\"wsp-mini-waveform\" />\n <span className=\"wsp-mini-time\">{formatTime(duration)}</span>\n </div>\n </div>\n\n {/* Volume slider - hidden on mobile */}\n {shouldShowVolume && (\n <div className=\"wsp-mini-volume\">\n <button\n onClick={() => setVolume(displayVolume > 0 ? 0 : 1)}\n className=\"wsp-mini-volume-button\"\n aria-label={displayVolume > 0 ? 'Mute' : 'Unmute'}\n >\n {displayVolume === 0 ? (\n <svg className=\"wsp-mini-volume-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M17 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2\"\n />\n </svg>\n ) : displayVolume < 0.5 ? (\n <svg className=\"wsp-mini-volume-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15.536 8.464a5 5 0 010 7.072M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z\"\n />\n </svg>\n ) : (\n <svg className=\"wsp-mini-volume-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z\"\n />\n </svg>\n )}\n </button>\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.01\"\n value={displayVolume}\n onChange={handleVolumeChange}\n className=\"wsp-mini-volume-slider\"\n aria-label=\"Volume\"\n />\n </div>\n )}\n\n {/* Close button */}\n {showClose && (\n <button\n onClick={handleClose}\n className=\"wsp-mini-close-button\"\n aria-label=\"Close player\"\n >\n <svg className=\"wsp-mini-close-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport type { ShareButtonsProps, SharePlatform } from '../types';\n\nconst PLATFORM_CONFIG: Record<\n SharePlatform,\n {\n name: string;\n color: string;\n getUrl: (url: string, text: string) => string;\n icon: JSX.Element;\n }\n> = {\n facebook: {\n name: 'Facebook',\n color: '#1877F2',\n getUrl: (url, text) =>\n `https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(url)}&quote=${encodeURIComponent(text)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z\" />\n </svg>\n ),\n },\n twitter: {\n name: 'Twitter/X',\n color: '#1DA1F2',\n getUrl: (url, text) =>\n `https://twitter.com/intent/tweet?text=${encodeURIComponent(text)}&url=${encodeURIComponent(url)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </svg>\n ),\n },\n whatsapp: {\n name: 'WhatsApp',\n color: '#25D366',\n getUrl: (url, text) =>\n `https://wa.me/?text=${encodeURIComponent(`${text} ${url}`)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z\" />\n </svg>\n ),\n },\n linkedin: {\n name: 'LinkedIn',\n color: '#0A66C2',\n getUrl: (url, text) =>\n `https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(url)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\" />\n </svg>\n ),\n },\n reddit: {\n name: 'Reddit',\n color: '#FF4500',\n getUrl: (url, text) =>\n `https://www.reddit.com/submit?url=${encodeURIComponent(url)}&title=${encodeURIComponent(text)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0zm5.01 4.744c.688 0 1.25.561 1.25 1.249a1.25 1.25 0 0 1-2.498.056l-2.597-.547-.8 3.747c1.824.07 3.48.632 4.674 1.488.308-.309.73-.491 1.207-.491.968 0 1.754.786 1.754 1.754 0 .716-.435 1.333-1.01 1.614a3.111 3.111 0 0 1 .042.52c0 2.694-3.13 4.87-7.004 4.87-3.874 0-7.004-2.176-7.004-4.87 0-.183.015-.366.043-.534A1.748 1.748 0 0 1 4.028 12c0-.968.786-1.754 1.754-1.754.463 0 .898.196 1.207.49 1.207-.883 2.878-1.43 4.744-1.487l.885-4.182a.342.342 0 0 1 .14-.197.35.35 0 0 1 .238-.042l2.906.617a1.214 1.214 0 0 1 1.108-.701zM9.25 12C8.561 12 8 12.562 8 13.25c0 .687.561 1.248 1.25 1.248.687 0 1.248-.561 1.248-1.249 0-.688-.561-1.249-1.249-1.249zm5.5 0c-.687 0-1.248.561-1.248 1.25 0 .687.561 1.248 1.249 1.248.688 0 1.249-.561 1.249-1.249 0-.687-.562-1.249-1.25-1.249zm-5.466 3.99a.327.327 0 0 0-.231.094.33.33 0 0 0 0 .463c.842.842 2.484.913 2.961.913.477 0 2.105-.056 2.961-.913a.361.361 0 0 0 .029-.463.33.33 0 0 0-.464 0c-.547.533-1.684.73-2.512.73-.828 0-1.979-.196-2.512-.73a.326.326 0 0 0-.232-.095z\" />\n </svg>\n ),\n },\n telegram: {\n name: 'Telegram',\n color: '#0088CC',\n getUrl: (url, text) =>\n `https://t.me/share/url?url=${encodeURIComponent(url)}&text=${encodeURIComponent(text)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z\" />\n </svg>\n ),\n },\n email: {\n name: 'Email',\n color: '#666666',\n getUrl: (url, text) =>\n `mailto:?subject=${encodeURIComponent(text)}&body=${encodeURIComponent(`${text}\\n\\n${url}`)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"\n />\n </svg>\n ),\n },\n copy: {\n name: 'Copy Link',\n color: '#666666',\n getUrl: () => '', // Not used for copy\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n ),\n },\n};\n\nconst DEFAULT_PLATFORMS: SharePlatform[] = [\n 'facebook',\n 'twitter',\n 'whatsapp',\n 'copy',\n];\n\nconst CheckIcon = () => (\n <svg\n className=\"wsp-share-icon wsp-share-icon--success\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n);\n\nexport function ShareButtons({\n url,\n text = '',\n platforms = DEFAULT_PLATFORMS,\n onShare,\n showLabels = false,\n className = '',\n}: ShareButtonsProps) {\n const [copied, setCopied] = useState(false);\n const [sharing, setSharing] = useState(false);\n\n const handleShare = useCallback(\n async (platform: SharePlatform) => {\n setSharing(true);\n\n if (platform === 'copy') {\n try {\n await navigator.clipboard.writeText(url);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n onShare?.(platform, url);\n } catch {\n // Clipboard may not be available\n }\n } else {\n const config = PLATFORM_CONFIG[platform];\n const shareUrl = config.getUrl(url, text);\n\n // Open share dialog\n if (platform === 'email') {\n window.location.href = shareUrl;\n } else {\n window.open(shareUrl, '_blank', 'width=600,height=400');\n }\n\n onShare?.(platform, url);\n }\n\n setSharing(false);\n },\n [url, text, onShare]\n );\n\n return (\n <div className={`wsp-share-buttons ${className}`}>\n {platforms.map((platform) => {\n const config = PLATFORM_CONFIG[platform];\n if (!config) return null;\n\n const isCopyButton = platform === 'copy';\n const showCheck = isCopyButton && copied;\n\n return (\n <button\n key={platform}\n onClick={() => handleShare(platform)}\n disabled={sharing}\n className=\"wsp-share-button\"\n style={{ '--wsp-share-hover-color': config.color } as React.CSSProperties}\n title={showCheck ? 'Copied!' : config.name}\n aria-label={`Share via ${config.name}`}\n >\n {showCheck ? <CheckIcon /> : config.icon}\n {showLabels && (\n <span className=\"wsp-share-label\">\n {showCheck ? 'Copied!' : config.name}\n </span>\n )}\n </button>\n );\n })}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/context/AudioPlayerContext.tsx","../src/hooks/useLazyLoad.ts","../src/utils/formatTime.ts","../src/components/WaveformPlayer.tsx","../src/components/MiniPlayer.tsx","../src/components/ShareButtons.tsx"],"names":["useRef","useState","useEffect","createContext","useCallback","jsx","DEFAULT_WAVEFORM_CONFIG","WaveSurfer","jsxs"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client';\n\nimport {\n createContext,\n useContext,\n useRef,\n useState,\n useCallback,\n useEffect,\n ReactNode,\n} from 'react';\nimport type {\n Song,\n AudioPlayerState,\n AudioPlayerContextValue,\n AudioPlayerConfig,\n} from '../types';\n\n// Custom event for notifying WaveformPlayers when mini-player starts playing\nexport const MINI_PLAYER_PLAY_EVENT = 'wavesurfer-player-mini-play';\n\nconst AudioPlayerContext = createContext<AudioPlayerContextValue | null>(null);\n\nconst DEFAULT_CONFIG: Required<AudioPlayerConfig> = {\n fadeInEnabled: true,\n fadeInDuration: 3000,\n persistVolume: true,\n storageKey: 'audioPlayerVolume',\n defaultVolume: 1,\n onPlay: () => {},\n onPause: () => {},\n onEnd: () => {},\n onTimeUpdate: () => {},\n};\n\nconst FADE_STEPS = 30; // 30 steps for smooth fade\nconst MIN_FADE_IN_VOLUME = 0.1; // Minimum 10% volume on fade-in so users hear something\n\ninterface AudioPlayerProviderProps {\n children: ReactNode;\n config?: AudioPlayerConfig;\n}\n\nexport function AudioPlayerProvider({\n children,\n config: userConfig,\n}: AudioPlayerProviderProps) {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const fadeIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const configRef = useRef(config);\n\n // Keep config ref up to date\n useEffect(() => {\n configRef.current = config;\n }, [config]);\n\n const [state, setState] = useState<AudioPlayerState>({\n currentSong: null,\n isPlaying: false,\n currentTime: 0,\n duration: 0,\n volume: config.defaultVolume,\n displayVolume: config.defaultVolume,\n isFadingIn: false,\n });\n\n // Initialize audio element and load saved volume\n useEffect(() => {\n // Create audio element\n const audio = new Audio();\n audio.preload = 'metadata';\n audioRef.current = audio;\n\n // Load saved volume from localStorage if persistence is enabled\n if (config.persistVolume && typeof window !== 'undefined') {\n const savedVolume = localStorage.getItem(config.storageKey);\n if (savedVolume) {\n const vol = parseFloat(savedVolume);\n if (!isNaN(vol) && vol >= 0 && vol <= 1) {\n setState((s) => ({ ...s, volume: vol, displayVolume: vol }));\n audio.volume = vol;\n }\n }\n }\n\n // Audio event listeners\n const handleTimeUpdate = () => {\n setState((s) => ({ ...s, currentTime: audio.currentTime }));\n configRef.current.onTimeUpdate?.(audio.currentTime);\n };\n\n const handleLoadedMetadata = () => {\n setState((s) => ({ ...s, duration: audio.duration }));\n };\n\n const handleEnded = () => {\n setState((s) => ({ ...s, isPlaying: false, currentTime: 0 }));\n configRef.current.onEnd?.();\n };\n\n const handlePlay = () => {\n setState((s) => ({ ...s, isPlaying: true }));\n };\n\n const handlePause = () => {\n setState((s) => ({ ...s, isPlaying: false }));\n };\n\n audio.addEventListener('timeupdate', handleTimeUpdate);\n audio.addEventListener('loadedmetadata', handleLoadedMetadata);\n audio.addEventListener('ended', handleEnded);\n audio.addEventListener('play', handlePlay);\n audio.addEventListener('pause', handlePause);\n\n return () => {\n // Cleanup\n if (fadeIntervalRef.current) {\n clearInterval(fadeIntervalRef.current);\n }\n audio.removeEventListener('timeupdate', handleTimeUpdate);\n audio.removeEventListener('loadedmetadata', handleLoadedMetadata);\n audio.removeEventListener('ended', handleEnded);\n audio.removeEventListener('play', handlePlay);\n audio.removeEventListener('pause', handlePause);\n audio.pause();\n audio.src = '';\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Clear any existing fade interval\n const clearFade = useCallback(() => {\n if (fadeIntervalRef.current) {\n clearInterval(fadeIntervalRef.current);\n fadeIntervalRef.current = null;\n }\n }, []);\n\n // Fade in volume\n const fadeInVolume = useCallback(\n (targetVolume: number) => {\n if (!audioRef.current) return;\n\n clearFade();\n setState((s) => ({ ...s, isFadingIn: true, displayVolume: 0 }));\n\n const fadeStepDuration = configRef.current.fadeInDuration / FADE_STEPS;\n const volumeStep = targetVolume / FADE_STEPS;\n let currentStep = 0;\n\n fadeIntervalRef.current = setInterval(() => {\n currentStep++;\n const newVolume = Math.min(volumeStep * currentStep, targetVolume);\n if (audioRef.current) {\n audioRef.current.volume = newVolume;\n }\n // Update displayVolume so the slider follows the fade\n setState((s) => ({ ...s, displayVolume: newVolume }));\n\n if (currentStep >= FADE_STEPS) {\n clearFade();\n setState((s) => ({\n ...s,\n isFadingIn: false,\n displayVolume: targetVolume,\n }));\n }\n }, fadeStepDuration);\n },\n [clearFade]\n );\n\n // Play a song with optional fade-in\n const play = useCallback(\n async (song: Song) => {\n if (!audioRef.current) return;\n\n // Stop any current fade-in\n clearFade();\n\n // If it's a different song, load it\n if (state.currentSong?.id !== song.id) {\n audioRef.current.src = song.audioUrl;\n setState((s) => ({\n ...s,\n currentSong: song,\n currentTime: 0,\n duration: song.duration || 0,\n }));\n }\n\n // Determine target volume\n const targetVolume = Math.max(state.volume, MIN_FADE_IN_VOLUME);\n\n // Set initial volume based on fade setting\n if (configRef.current.fadeInEnabled) {\n audioRef.current.volume = 0;\n } else {\n audioRef.current.volume = targetVolume;\n }\n\n try {\n await audioRef.current.play();\n // Dispatch event to pause other players\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent(MINI_PLAYER_PLAY_EVENT, { detail: song.id })\n );\n }\n // Start fade-in if enabled\n if (configRef.current.fadeInEnabled) {\n fadeInVolume(targetVolume);\n }\n // Call onPlay callback\n configRef.current.onPlay?.(song);\n } catch {\n // Handle autoplay restrictions silently\n }\n },\n [state.currentSong?.id, state.volume, clearFade, fadeInVolume]\n );\n\n // Pause playback\n const pause = useCallback(() => {\n if (!audioRef.current) return;\n clearFade();\n audioRef.current.pause();\n configRef.current.onPause?.();\n }, [clearFade]);\n\n // Toggle play/pause\n const togglePlay = useCallback(() => {\n if (!audioRef.current || !state.currentSong) return;\n\n if (state.isPlaying) {\n pause();\n } else {\n // Resume playback WITHOUT fade-in (fade-in only on new songs via play())\n // Use the current displayVolume to avoid volume jumps\n audioRef.current.volume = state.displayVolume;\n\n audioRef.current\n .play()\n .then(() => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent(MINI_PLAYER_PLAY_EVENT, {\n detail: state.currentSong?.id,\n })\n );\n }\n })\n .catch(() => {\n // Handle autoplay restrictions silently\n });\n }\n }, [state.isPlaying, state.currentSong, state.displayVolume, pause]);\n\n // Seek to position\n const seek = useCallback((time: number) => {\n if (!audioRef.current) return;\n audioRef.current.currentTime = time;\n setState((s) => ({ ...s, currentTime: time }));\n }, []);\n\n // Set volume and persist to localStorage\n const setVolume = useCallback(\n (volume: number) => {\n if (!audioRef.current) return;\n\n const clampedVolume = Math.max(0, Math.min(1, volume));\n\n // If user manually changes volume during fade, stop the fade\n if (fadeIntervalRef.current) {\n clearFade();\n setState((s) => ({ ...s, isFadingIn: false }));\n }\n\n audioRef.current.volume = clampedVolume;\n\n // Persist to localStorage if enabled\n if (configRef.current.persistVolume && typeof window !== 'undefined') {\n localStorage.setItem(\n configRef.current.storageKey,\n clampedVolume.toString()\n );\n }\n\n setState((s) => ({\n ...s,\n volume: clampedVolume,\n displayVolume: clampedVolume,\n }));\n },\n [clearFade]\n );\n\n // Stop playback and clear song\n const stop = useCallback(() => {\n if (!audioRef.current) return;\n clearFade();\n audioRef.current.pause();\n audioRef.current.currentTime = 0;\n audioRef.current.src = '';\n setState((s) => ({\n ...s,\n currentSong: null,\n isPlaying: false,\n currentTime: 0,\n duration: 0,\n isFadingIn: false,\n }));\n }, [clearFade]);\n\n const value: AudioPlayerContextValue = {\n ...state,\n play,\n pause,\n togglePlay,\n seek,\n setVolume,\n stop,\n };\n\n return (\n <AudioPlayerContext.Provider value={value}>\n {children}\n </AudioPlayerContext.Provider>\n );\n}\n\nexport function useAudioPlayer(): AudioPlayerContextValue {\n const context = useContext(AudioPlayerContext);\n if (!context) {\n throw new Error(\n 'useAudioPlayer must be used within an AudioPlayerProvider'\n );\n }\n return context;\n}\n","'use client';\n\nimport { useRef, useState, useEffect } from 'react';\nimport type { UseLazyLoadResult, UseLazyLoadOptions } from '../types';\n\n/**\n * Hook for lazy loading elements using IntersectionObserver.\n * Returns a ref to attach to the target element and a boolean indicating visibility.\n *\n * @param options - Configuration options for the IntersectionObserver\n * @returns Object containing ref and isVisible state\n *\n * @example\n * const { ref, isVisible } = useLazyLoad();\n *\n * return (\n * <div ref={ref}>\n * {isVisible && <ExpensiveComponent />}\n * </div>\n * );\n */\nexport function useLazyLoad(options?: UseLazyLoadOptions): UseLazyLoadResult {\n const {\n rootMargin = '100px',\n threshold = 0,\n forceVisible = false,\n } = options || {};\n\n const ref = useRef<HTMLDivElement>(null);\n const [isVisible, setIsVisible] = useState(forceVisible);\n\n useEffect(() => {\n if (forceVisible) {\n setIsVisible(true);\n return;\n }\n\n if (!ref.current) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setIsVisible(true);\n observer.disconnect(); // Only need to detect once\n }\n },\n { rootMargin, threshold }\n );\n\n observer.observe(ref.current);\n\n return () => observer.disconnect();\n }, [rootMargin, threshold, forceVisible]);\n\n return { ref, isVisible };\n}\n","/**\n * Formats seconds into a human-readable time string (M:SS or MM:SS).\n *\n * @param seconds - The number of seconds to format\n * @returns Formatted time string (e.g., \"3:45\" or \"12:05\")\n *\n * @example\n * formatTime(125) // \"2:05\"\n * formatTime(0) // \"0:00\"\n * formatTime(3600) // \"60:00\"\n */\nexport function formatTime(seconds: number): string {\n if (!seconds || isNaN(seconds) || seconds < 0) return '0:00';\n\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n}\n","'use client';\n\nimport { useEffect, useRef, useState, useCallback, useContext, createContext } from 'react';\nimport WaveSurfer from 'wavesurfer.js';\nimport { useAudioPlayer, MINI_PLAYER_PLAY_EVENT } from '../context/AudioPlayerContext';\nimport { useLazyLoad } from '../hooks/useLazyLoad';\nimport { formatTime } from '../utils/formatTime';\nimport type { WaveformPlayerProps, WaveformConfig, Song } from '../types';\n\nconst DEFAULT_WAVEFORM_CONFIG: Required<WaveformConfig> = {\n waveColor: '#666666',\n progressColor: '#D4AF37',\n cursorColor: '#D4AF37',\n barWidth: 2,\n barGap: 1,\n barRadius: 2,\n height: 60,\n normalize: true,\n};\n\n// Check if we're inside an AudioPlayerProvider\nconst AudioPlayerContext = createContext<unknown>(null);\n\nexport function WaveformPlayer({\n song,\n waveformConfig: userWaveformConfig,\n lazyLoad = true,\n showTime = true,\n className = '',\n renderHeader,\n renderControls,\n standalone = false,\n}: WaveformPlayerProps) {\n const waveformConfig = { ...DEFAULT_WAVEFORM_CONFIG, ...userWaveformConfig };\n const containerRef = useRef<HTMLDivElement>(null);\n const wavesurferRef = useRef<WaveSurfer | null>(null);\n const localAudioRef = useRef<HTMLAudioElement | null>(null);\n const [isReady, setIsReady] = useState(false);\n const [totalDuration, setTotalDuration] = useState(song.duration || 0);\n\n // Standalone mode state\n const [localIsPlaying, setLocalIsPlaying] = useState(false);\n const [localCurrentTime, setLocalCurrentTime] = useState(0);\n\n // Lazy loading\n const { ref: wrapperRef, isVisible } = useLazyLoad({\n forceVisible: !lazyLoad,\n });\n\n // Try to get audio player context (may not exist in standalone mode)\n let contextValue: ReturnType<typeof useAudioPlayer> | null = null;\n try {\n if (!standalone) {\n contextValue = useAudioPlayer();\n }\n } catch {\n // Context not available, use standalone mode\n }\n\n const useStandaloneMode = standalone || !contextValue;\n\n // Context values (only used when not in standalone mode)\n const contextPlay = contextValue?.play;\n const contextTogglePlay = contextValue?.togglePlay;\n const contextSeek = contextValue?.seek;\n const contextCurrentSong = contextValue?.currentSong;\n const contextIsPlaying = contextValue?.isPlaying ?? false;\n const contextCurrentTime = contextValue?.currentTime ?? 0;\n\n // Check if this song is the currently playing song (context mode)\n const isThisSongPlayingInContext = !useStandaloneMode && contextCurrentSong?.id === song.id;\n\n // Determine actual playing state and current time\n const isPlaying = useStandaloneMode ? localIsPlaying : (isThisSongPlayingInContext && contextIsPlaying);\n const currentTime = useStandaloneMode ? localCurrentTime : (isThisSongPlayingInContext ? contextCurrentTime : 0);\n\n // Initialize local audio element for standalone mode\n useEffect(() => {\n if (!useStandaloneMode) return;\n\n const audio = new Audio();\n audio.preload = 'metadata';\n localAudioRef.current = audio;\n\n const handleTimeUpdate = () => {\n setLocalCurrentTime(audio.currentTime);\n };\n\n const handleEnded = () => {\n setLocalIsPlaying(false);\n setLocalCurrentTime(0);\n };\n\n const handleLoadedMetadata = () => {\n setTotalDuration(audio.duration);\n };\n\n audio.addEventListener('timeupdate', handleTimeUpdate);\n audio.addEventListener('ended', handleEnded);\n audio.addEventListener('loadedmetadata', handleLoadedMetadata);\n\n return () => {\n audio.removeEventListener('timeupdate', handleTimeUpdate);\n audio.removeEventListener('ended', handleEnded);\n audio.removeEventListener('loadedmetadata', handleLoadedMetadata);\n audio.pause();\n audio.src = '';\n };\n }, [useStandaloneMode]);\n\n // Listen for other players starting (to pause this one in standalone mode)\n useEffect(() => {\n if (!useStandaloneMode) return;\n\n const handleOtherPlayerPlay = (event: CustomEvent<string>) => {\n // Another player started, pause this one\n if (event.detail !== song.id && localAudioRef.current) {\n localAudioRef.current.pause();\n setLocalIsPlaying(false);\n }\n };\n\n window.addEventListener(MINI_PLAYER_PLAY_EVENT, handleOtherPlayerPlay as EventListener);\n return () => {\n window.removeEventListener(MINI_PLAYER_PLAY_EVENT, handleOtherPlayerPlay as EventListener);\n };\n }, [useStandaloneMode, song.id]);\n\n // Sync waveform progress with playback\n useEffect(() => {\n if (!wavesurferRef.current) return;\n\n const relevantCurrentTime = useStandaloneMode ? localCurrentTime : contextCurrentTime;\n const shouldSync = useStandaloneMode ? localIsPlaying : isThisSongPlayingInContext;\n\n if (!shouldSync) return;\n\n const waveDuration = wavesurferRef.current.getDuration();\n if (waveDuration > 0 && relevantCurrentTime >= 0) {\n const progress = relevantCurrentTime / waveDuration;\n wavesurferRef.current.seekTo(Math.min(progress, 1));\n }\n }, [localCurrentTime, contextCurrentTime, useStandaloneMode, localIsPlaying, isThisSongPlayingInContext]);\n\n // Initialize WaveSurfer - waveform display only (audio plays through context or local audio)\n useEffect(() => {\n if (!containerRef.current || !isVisible) return;\n\n const hasPeaks = song.peaks && song.peaks.length > 0;\n\n // Create WaveSurfer for waveform display only (no audio playback)\n const wavesurfer = WaveSurfer.create({\n container: containerRef.current,\n waveColor: waveformConfig.waveColor,\n progressColor: waveformConfig.progressColor,\n cursorColor: waveformConfig.cursorColor,\n barWidth: waveformConfig.barWidth,\n barGap: waveformConfig.barGap,\n barRadius: waveformConfig.barRadius,\n height: waveformConfig.height,\n normalize: waveformConfig.normalize,\n interact: true,\n // Only load audio URL if we don't have peaks (needed to generate waveform)\n url: hasPeaks ? undefined : song.audioUrl,\n peaks: hasPeaks ? [song.peaks!] : undefined,\n duration: hasPeaks ? (song.duration || 0) : undefined,\n });\n\n // IMPORTANT: Mute WaveSurfer so it doesn't play audio (only visualizes)\n // Audio playback is handled separately through context or local audio element\n wavesurfer.setMuted(true);\n\n wavesurfer.on('ready', () => {\n setIsReady(true);\n setTotalDuration(wavesurfer.getDuration() || song.duration || 0);\n // Ensure it stays muted\n wavesurfer.setMuted(true);\n });\n\n // Handle waveform click for seeking\n wavesurfer.on('interaction', (newTime: number) => {\n if (useStandaloneMode) {\n if (localAudioRef.current) {\n localAudioRef.current.currentTime = newTime;\n setLocalCurrentTime(newTime);\n }\n } else if (isThisSongPlayingInContext && contextSeek) {\n contextSeek(newTime);\n }\n });\n\n wavesurfer.on('error', () => {\n // Silently handle errors\n });\n\n wavesurferRef.current = wavesurfer;\n\n // If we have peaks, mark as ready immediately\n if (hasPeaks) {\n setIsReady(true);\n setTotalDuration(song.duration || 0);\n }\n\n return () => {\n try {\n wavesurfer.destroy();\n } catch {\n // Ignore errors when component unmounts\n }\n };\n }, [\n song.audioUrl,\n song.peaks,\n song.duration,\n isVisible,\n useStandaloneMode,\n isThisSongPlayingInContext,\n contextSeek,\n waveformConfig.waveColor,\n waveformConfig.progressColor,\n waveformConfig.cursorColor,\n waveformConfig.barWidth,\n waveformConfig.barGap,\n waveformConfig.barRadius,\n waveformConfig.height,\n waveformConfig.normalize,\n ]);\n\n // Handle play button click\n const handlePlayClick = useCallback(() => {\n if (!song.id || !song.audioUrl) return;\n\n if (useStandaloneMode) {\n // Standalone mode - use local audio element\n if (!localAudioRef.current) return;\n\n if (localIsPlaying) {\n localAudioRef.current.pause();\n setLocalIsPlaying(false);\n } else {\n // Dispatch event so other standalone players pause\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent(MINI_PLAYER_PLAY_EVENT, { detail: song.id })\n );\n }\n\n // Load and play\n if (localAudioRef.current.src !== song.audioUrl) {\n localAudioRef.current.src = song.audioUrl;\n }\n localAudioRef.current.play().catch(() => {\n // Handle autoplay restrictions\n });\n setLocalIsPlaying(true);\n }\n } else {\n // Context mode - use global player\n if (isThisSongPlayingInContext) {\n contextTogglePlay?.();\n } else {\n contextPlay?.(song);\n }\n }\n }, [song, useStandaloneMode, localIsPlaying, isThisSongPlayingInContext, contextPlay, contextTogglePlay]);\n\n return (\n <div\n ref={wrapperRef}\n className={`wsp-player ${className}`}\n data-song-id={song.id}\n >\n {/* Custom header or default */}\n {renderHeader ? (\n renderHeader(song, isPlaying)\n ) : (\n <div className=\"wsp-player-header\">\n <h3 className=\"wsp-player-title\">{song.title}</h3>\n {song.artist && (\n <span className=\"wsp-player-artist\">{song.artist}</span>\n )}\n </div>\n )}\n\n {/* Player controls and waveform */}\n <div className=\"wsp-player-controls\">\n {/* Play/Pause button */}\n <button\n onClick={handlePlayClick}\n disabled={!isReady}\n className={`wsp-play-button ${isReady ? 'wsp-play-button--ready' : ''}`}\n aria-label={isPlaying ? 'Pause' : 'Play'}\n >\n {!isReady ? (\n <svg className=\"wsp-icon wsp-icon--spinner\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle\n className=\"wsp-spinner-track\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"wsp-spinner-head\"\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 ) : isPlaying ? (\n <svg className=\"wsp-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n <rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n </svg>\n ) : (\n <svg className=\"wsp-icon wsp-icon--play\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n )}\n </button>\n\n {/* Waveform container */}\n <div className=\"wsp-waveform-wrapper\">\n <div ref={containerRef} className=\"wsp-waveform\" />\n\n {/* Time display */}\n {showTime && (\n <div className=\"wsp-time-display\">\n <span className=\"wsp-time\">{formatTime(currentTime)}</span>\n <span className=\"wsp-time\">{formatTime(totalDuration)}</span>\n </div>\n )}\n </div>\n\n {/* Custom controls slot */}\n {renderControls && renderControls(song, isPlaying)}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useRef, useEffect, useState } from 'react';\nimport WaveSurfer from 'wavesurfer.js';\nimport { useAudioPlayer } from '../context/AudioPlayerContext';\nimport { formatTime } from '../utils/formatTime';\nimport type { MiniPlayerProps, WaveformConfig } from '../types';\n\nconst DEFAULT_WAVEFORM_CONFIG: Required<WaveformConfig> = {\n waveColor: '#666666',\n progressColor: '#D4AF37',\n cursorColor: 'transparent',\n barWidth: 2,\n barGap: 1,\n barRadius: 2,\n height: 40,\n normalize: true,\n};\n\nexport function MiniPlayer({\n position = 'bottom',\n showVolume = true,\n showClose = true,\n onClose,\n className = '',\n waveformConfig: userWaveformConfig,\n}: MiniPlayerProps) {\n const waveformConfig = { ...DEFAULT_WAVEFORM_CONFIG, ...userWaveformConfig };\n\n const {\n currentSong,\n isPlaying,\n currentTime,\n duration,\n displayVolume,\n togglePlay,\n seek,\n setVolume,\n stop,\n } = useAudioPlayer();\n\n const waveformRef = useRef<HTMLDivElement>(null);\n const wavesurferRef = useRef<WaveSurfer | null>(null);\n const [isMobile, setIsMobile] = useState(false);\n const [waveformReady, setWaveformReady] = useState(false);\n const lastSongIdRef = useRef<string | null>(null);\n\n // Detect mobile viewport\n useEffect(() => {\n const checkMobile = () => setIsMobile(window.innerWidth < 640);\n checkMobile();\n window.addEventListener('resize', checkMobile);\n return () => window.removeEventListener('resize', checkMobile);\n }, []);\n\n // Initialize/update WaveSurfer when song changes\n useEffect(() => {\n if (!waveformRef.current || !currentSong) return;\n\n // If same song, don't recreate\n if (lastSongIdRef.current === currentSong.id && wavesurferRef.current) {\n return;\n }\n\n // Destroy previous instance\n if (wavesurferRef.current) {\n wavesurferRef.current.destroy();\n wavesurferRef.current = null;\n }\n\n setWaveformReady(false);\n lastSongIdRef.current = currentSong.id;\n\n const hasPeaks = currentSong.peaks && currentSong.peaks.length > 0;\n\n // Create WaveSurfer - waveform only, no audio (audio plays through context)\n const wavesurfer = WaveSurfer.create({\n container: waveformRef.current,\n waveColor: waveformConfig.waveColor,\n progressColor: waveformConfig.progressColor,\n cursorColor: waveformConfig.cursorColor,\n barWidth: waveformConfig.barWidth,\n barGap: waveformConfig.barGap,\n barRadius: waveformConfig.barRadius,\n height: waveformConfig.height,\n normalize: waveformConfig.normalize,\n interact: true,\n // Use peaks if available, otherwise need audio URL to generate waveform\n url: hasPeaks ? undefined : currentSong.audioUrl,\n peaks: hasPeaks && currentSong.peaks ? [currentSong.peaks] : undefined,\n duration: hasPeaks ? (currentSong.duration || duration || 0) : undefined,\n });\n\n wavesurfer.on('ready', () => {\n setWaveformReady(true);\n });\n\n // Handle click on waveform to seek\n wavesurfer.on('interaction', (newTime: number) => {\n seek(newTime);\n });\n\n wavesurferRef.current = wavesurfer;\n\n // If we have peaks, mark ready immediately\n if (hasPeaks) {\n setWaveformReady(true);\n }\n\n return () => {\n // Don't destroy on every render, only when song actually changes\n };\n }, [\n currentSong?.id,\n currentSong?.audioUrl,\n currentSong?.peaks,\n currentSong?.duration,\n duration,\n seek,\n waveformConfig.waveColor,\n waveformConfig.progressColor,\n waveformConfig.cursorColor,\n waveformConfig.barWidth,\n waveformConfig.barGap,\n waveformConfig.barRadius,\n waveformConfig.height,\n waveformConfig.normalize,\n ]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (wavesurferRef.current) {\n wavesurferRef.current.destroy();\n wavesurferRef.current = null;\n }\n };\n }, []);\n\n // Sync waveform progress with audio context\n useEffect(() => {\n if (!wavesurferRef.current || !waveformReady) return;\n\n const waveDuration = wavesurferRef.current.getDuration();\n if (waveDuration > 0 && currentTime >= 0) {\n const progress = currentTime / waveDuration;\n wavesurferRef.current.seekTo(Math.min(progress, 1));\n }\n }, [currentTime, waveformReady]);\n\n // Handle volume change\n const handleVolumeChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setVolume(parseFloat(e.target.value));\n },\n [setVolume]\n );\n\n // Handle scroll wheel on volume control\n const handleVolumeWheel = useCallback(\n (e: React.WheelEvent) => {\n e.preventDefault();\n const delta = e.deltaY > 0 ? -0.05 : 0.05;\n const newVolume = Math.max(0, Math.min(1, displayVolume + delta));\n setVolume(newVolume);\n },\n [displayVolume, setVolume]\n );\n\n // Handle close button\n const handleClose = useCallback(() => {\n stop();\n onClose?.();\n }, [stop, onClose]);\n\n // Don't render if no song is loaded\n if (!currentSong) return null;\n\n // Determine if volume should be shown (respects both prop and mobile detection)\n const shouldShowVolume = showVolume && !isMobile;\n\n const positionClass = position === 'top' ? 'wsp-mini-player--top' : 'wsp-mini-player--bottom';\n\n return (\n <div className={`wsp-mini-player ${positionClass} ${className}`}>\n {/* Main controls */}\n <div className=\"wsp-mini-player-inner\">\n {/* Play/pause button - left */}\n <button\n onClick={togglePlay}\n className=\"wsp-mini-play-button\"\n aria-label={isPlaying ? 'Pause' : 'Play'}\n >\n {isPlaying ? (\n <svg className=\"wsp-mini-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n <rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n </svg>\n ) : (\n <svg className=\"wsp-mini-icon wsp-mini-icon--play\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n )}\n </button>\n\n {/* Song info and waveform - center */}\n <div className=\"wsp-mini-content\">\n {/* Song title */}\n <div className=\"wsp-mini-info\">\n <div className=\"wsp-mini-title\">{currentSong.title}</div>\n {currentSong.album && (\n <div className=\"wsp-mini-album\">• {currentSong.album}</div>\n )}\n </div>\n\n {/* Waveform */}\n <div className=\"wsp-mini-waveform-container\">\n <span className=\"wsp-mini-time\">{formatTime(currentTime)}</span>\n <div ref={waveformRef} className=\"wsp-mini-waveform\" />\n <span className=\"wsp-mini-time\">{formatTime(duration)}</span>\n </div>\n </div>\n\n {/* Volume slider - hidden on mobile */}\n {shouldShowVolume && (\n <div className=\"wsp-mini-volume\" onWheel={handleVolumeWheel}>\n <button\n onClick={() => setVolume(displayVolume > 0 ? 0 : 1)}\n className=\"wsp-mini-volume-button\"\n aria-label={displayVolume > 0 ? 'Mute' : 'Unmute'}\n >\n {displayVolume === 0 ? (\n <svg className=\"wsp-mini-volume-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M17 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2\"\n />\n </svg>\n ) : displayVolume < 0.5 ? (\n <svg className=\"wsp-mini-volume-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15.536 8.464a5 5 0 010 7.072M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z\"\n />\n </svg>\n ) : (\n <svg className=\"wsp-mini-volume-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z\"\n />\n </svg>\n )}\n </button>\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.01\"\n value={displayVolume}\n onChange={handleVolumeChange}\n className=\"wsp-mini-volume-slider\"\n aria-label=\"Volume\"\n />\n </div>\n )}\n\n {/* Close button */}\n {showClose && (\n <button\n onClick={handleClose}\n className=\"wsp-mini-close-button\"\n aria-label=\"Close player\"\n >\n <svg className=\"wsp-mini-close-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport type { ShareButtonsProps, SharePlatform } from '../types';\n\nconst PLATFORM_CONFIG: Record<\n SharePlatform,\n {\n name: string;\n color: string;\n getUrl: (url: string, text: string) => string;\n icon: JSX.Element;\n }\n> = {\n facebook: {\n name: 'Facebook',\n color: '#1877F2',\n getUrl: (url, text) =>\n `https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(url)}&quote=${encodeURIComponent(text)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z\" />\n </svg>\n ),\n },\n twitter: {\n name: 'Twitter/X',\n color: '#1DA1F2',\n getUrl: (url, text) =>\n `https://twitter.com/intent/tweet?text=${encodeURIComponent(text)}&url=${encodeURIComponent(url)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </svg>\n ),\n },\n whatsapp: {\n name: 'WhatsApp',\n color: '#25D366',\n getUrl: (url, text) =>\n `https://wa.me/?text=${encodeURIComponent(`${text} ${url}`)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z\" />\n </svg>\n ),\n },\n linkedin: {\n name: 'LinkedIn',\n color: '#0A66C2',\n getUrl: (url, text) =>\n `https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(url)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\" />\n </svg>\n ),\n },\n reddit: {\n name: 'Reddit',\n color: '#FF4500',\n getUrl: (url, text) =>\n `https://www.reddit.com/submit?url=${encodeURIComponent(url)}&title=${encodeURIComponent(text)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0zm5.01 4.744c.688 0 1.25.561 1.25 1.249a1.25 1.25 0 0 1-2.498.056l-2.597-.547-.8 3.747c1.824.07 3.48.632 4.674 1.488.308-.309.73-.491 1.207-.491.968 0 1.754.786 1.754 1.754 0 .716-.435 1.333-1.01 1.614a3.111 3.111 0 0 1 .042.52c0 2.694-3.13 4.87-7.004 4.87-3.874 0-7.004-2.176-7.004-4.87 0-.183.015-.366.043-.534A1.748 1.748 0 0 1 4.028 12c0-.968.786-1.754 1.754-1.754.463 0 .898.196 1.207.49 1.207-.883 2.878-1.43 4.744-1.487l.885-4.182a.342.342 0 0 1 .14-.197.35.35 0 0 1 .238-.042l2.906.617a1.214 1.214 0 0 1 1.108-.701zM9.25 12C8.561 12 8 12.562 8 13.25c0 .687.561 1.248 1.25 1.248.687 0 1.248-.561 1.248-1.249 0-.688-.561-1.249-1.249-1.249zm5.5 0c-.687 0-1.248.561-1.248 1.25 0 .687.561 1.248 1.249 1.248.688 0 1.249-.561 1.249-1.249 0-.687-.562-1.249-1.25-1.249zm-5.466 3.99a.327.327 0 0 0-.231.094.33.33 0 0 0 0 .463c.842.842 2.484.913 2.961.913.477 0 2.105-.056 2.961-.913a.361.361 0 0 0 .029-.463.33.33 0 0 0-.464 0c-.547.533-1.684.73-2.512.73-.828 0-1.979-.196-2.512-.73a.326.326 0 0 0-.232-.095z\" />\n </svg>\n ),\n },\n telegram: {\n name: 'Telegram',\n color: '#0088CC',\n getUrl: (url, text) =>\n `https://t.me/share/url?url=${encodeURIComponent(url)}&text=${encodeURIComponent(text)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z\" />\n </svg>\n ),\n },\n email: {\n name: 'Email',\n color: '#666666',\n getUrl: (url, text) =>\n `mailto:?subject=${encodeURIComponent(text)}&body=${encodeURIComponent(`${text}\\n\\n${url}`)}`,\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"\n />\n </svg>\n ),\n },\n copy: {\n name: 'Copy Link',\n color: '#666666',\n getUrl: () => '', // Not used for copy\n icon: (\n <svg className=\"wsp-share-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n ),\n },\n};\n\nconst DEFAULT_PLATFORMS: SharePlatform[] = [\n 'facebook',\n 'twitter',\n 'whatsapp',\n 'copy',\n];\n\nconst CheckIcon = () => (\n <svg\n className=\"wsp-share-icon wsp-share-icon--success\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n);\n\nexport function ShareButtons({\n url,\n text = '',\n platforms = DEFAULT_PLATFORMS,\n onShare,\n showLabels = false,\n className = '',\n}: ShareButtonsProps) {\n const [copied, setCopied] = useState(false);\n const [sharing, setSharing] = useState(false);\n\n const handleShare = useCallback(\n async (platform: SharePlatform) => {\n setSharing(true);\n\n if (platform === 'copy') {\n try {\n await navigator.clipboard.writeText(url);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n onShare?.(platform, url);\n } catch {\n // Clipboard may not be available\n }\n } else {\n const config = PLATFORM_CONFIG[platform];\n const shareUrl = config.getUrl(url, text);\n\n // Open share dialog\n if (platform === 'email') {\n window.location.href = shareUrl;\n } else {\n window.open(shareUrl, '_blank', 'width=600,height=400');\n }\n\n onShare?.(platform, url);\n }\n\n setSharing(false);\n },\n [url, text, onShare]\n );\n\n return (\n <div className={`wsp-share-buttons ${className}`}>\n {platforms.map((platform) => {\n const config = PLATFORM_CONFIG[platform];\n if (!config) return null;\n\n const isCopyButton = platform === 'copy';\n const showCheck = isCopyButton && copied;\n\n return (\n <button\n key={platform}\n onClick={() => handleShare(platform)}\n disabled={sharing}\n className=\"wsp-share-button\"\n style={{ '--wsp-share-hover-color': config.color } as React.CSSProperties}\n title={showCheck ? 'Copied!' : config.name}\n aria-label={`Share via ${config.name}`}\n >\n {showCheck ? <CheckIcon /> : config.icon}\n {showLabels && (\n <span className=\"wsp-share-label\">\n {showCheck ? 'Copied!' : config.name}\n </span>\n )}\n </button>\n );\n })}\n </div>\n );\n}\n"]}
package/dist/styles.css CHANGED
@@ -45,6 +45,7 @@
45
45
  --wsp-mini-border-color: #D4AF37;
46
46
  --wsp-mini-border-width: 2px;
47
47
  --wsp-mini-shadow: 0 -4px 20px rgba(0, 0, 0, 0.5);
48
+ --wsp-volume-slider-width: 100px;
48
49
 
49
50
  /* Transitions */
50
51
  --wsp-transition: 150ms ease;
@@ -323,7 +324,7 @@
323
324
  display: flex;
324
325
  align-items: center;
325
326
  gap: 8px;
326
- width: 112px;
327
+ width: calc(var(--wsp-volume-slider-width) + 28px);
327
328
  }
328
329
 
329
330
  .wsp-mini-volume-button {
@@ -345,32 +346,41 @@
345
346
  }
346
347
 
347
348
  .wsp-mini-volume-slider {
348
- width: 64px;
349
- height: 4px;
349
+ width: var(--wsp-volume-slider-width);
350
+ height: 6px;
350
351
  background: var(--wsp-background-secondary);
351
- border-radius: 2px;
352
+ border-radius: 3px;
352
353
  appearance: none;
353
354
  cursor: pointer;
354
355
  }
355
356
 
356
357
  .wsp-mini-volume-slider::-webkit-slider-thumb {
357
358
  appearance: none;
358
- width: 12px;
359
- height: 12px;
359
+ width: 14px;
360
+ height: 14px;
360
361
  background: var(--wsp-button-bg);
361
362
  border-radius: 50%;
362
363
  cursor: pointer;
364
+ transition: transform var(--wsp-transition);
365
+ }
366
+
367
+ .wsp-mini-volume-slider::-webkit-slider-thumb:hover {
368
+ transform: scale(1.15);
363
369
  }
364
370
 
365
371
  .wsp-mini-volume-slider::-moz-range-thumb {
366
- width: 12px;
367
- height: 12px;
372
+ width: 14px;
373
+ height: 14px;
368
374
  background: var(--wsp-button-bg);
369
375
  border-radius: 50%;
370
376
  border: 0;
371
377
  cursor: pointer;
372
378
  }
373
379
 
380
+ .wsp-mini-volume-slider::-moz-range-thumb:hover {
381
+ transform: scale(1.15);
382
+ }
383
+
374
384
  /* Mini Close Button */
375
385
  .wsp-mini-close-button {
376
386
  width: 32px;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wavesurf",
3
- "version": "1.2.0",
3
+ "version": "1.2.2",
4
4
  "description": "A React audio player with WaveSurfer.js waveform visualization, global state management, and mini-player support",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",