@react-youtube-jukebox/core 0.1.0
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/README.md +110 -0
- package/dist/index.css +1345 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.js +649 -0
- package/dist/index.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/shared.ts","../src/lib/youtube.ts","../src/hooks/useJukeboxPlayer.ts","../src/components/JukeboxExpandedPlayer.tsx","../src/components/Jukebox.tsx"],"names":["jsxs","jsx","useState"],"mappings":"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","file":"index.js","sourcesContent":["import type { CSSProperties, ReactNode } from \"react\";\n\nexport type JukeboxTrack = {\n videoId: string;\n title: string;\n artist?: string;\n};\n\nexport type JukeboxPosition =\n | \"bottom-right\"\n | \"bottom-left\"\n | \"top-right\"\n | \"top-left\";\n\nexport type JukeboxTheme = \"glass\" | \"simple\" | \"sunset\" | \"ride\";\nexport type JukeboxChrome = \"classic\" | \"wallet\" | \"ride\";\n\nexport type JukeboxOffset = number | { x: number; y: number };\n\nexport type JukeboxProps = {\n tracks: JukeboxTrack[];\n autoplay?: boolean;\n position?: JukeboxPosition;\n theme?: JukeboxTheme;\n chrome?: JukeboxChrome;\n offset?: JukeboxOffset;\n portal?: boolean;\n className?: string;\n renderExpandedContent?: (\n props: JukeboxExpandedRenderProps,\n ) => ReactNode;\n};\n\nexport type JukeboxPlayerState = {\n currentIndex: number;\n isMuted: boolean;\n isPlaying: boolean;\n playerMountRef: (node: HTMLDivElement | null) => void;\n volume: number;\n setVolume: (nextVolume: number) => void;\n toggleMute: () => void;\n togglePlay: () => void;\n playNext: () => void;\n playPrev: () => void;\n};\n\nexport type JukeboxExpandedRenderProps = JukeboxPlayerState & {\n currentTrack: JukeboxTrack;\n isExpanded: boolean;\n nextTrack: JukeboxTrack | undefined;\n totalTracks: number;\n};\n\nexport const DEFAULT_POSITION: JukeboxPosition = \"bottom-right\";\nexport const DEFAULT_THEME: JukeboxTheme = \"glass\";\nexport const DEFAULT_CHROME: JukeboxChrome = \"classic\";\nexport const DEFAULT_OFFSET_PX = 20;\nexport const DEFAULT_VOLUME = 100;\nexport const LEVEL_BAR_HEIGHTS = [12, 18, 14] as const;\nexport const LEVEL_BAR_REST_HEIGHT = 8;\nexport const LEVEL_BAR_ANIMATION_DELAY_MS = 120;\n\nexport function getNextTrackIndex(\n index: number,\n step: number,\n totalTracks: number,\n) {\n if (totalTracks <= 0) {\n return 0;\n }\n\n return (index + step + totalTracks) % totalTracks;\n}\n\nexport function clampVolume(value: number) {\n return Math.min(Math.max(Math.round(value), 0), 100);\n}\n\nexport function normalizeOffset(offset: JukeboxOffset | undefined) {\n if (typeof offset === \"number\") {\n return { x: offset, y: offset };\n }\n\n if (offset) {\n return { x: offset.x, y: offset.y };\n }\n\n return { x: DEFAULT_OFFSET_PX, y: DEFAULT_OFFSET_PX };\n}\n\nexport function getPositionStyle(\n position: JukeboxPosition,\n offset: JukeboxOffset | undefined,\n isPortal: boolean,\n): CSSProperties {\n const normalizedOffset = normalizeOffset(offset);\n const style: CSSProperties = {\n position: isPortal ? \"fixed\" : \"absolute\",\n };\n\n if (position.includes(\"top\")) {\n style.top = normalizedOffset.y;\n } else {\n style.bottom = normalizedOffset.y;\n }\n\n if (position.includes(\"left\")) {\n style.left = normalizedOffset.x;\n } else {\n style.right = normalizedOffset.x;\n }\n\n return style;\n}\n","export const PLAYER_STATE_ENDED = 0;\nexport const PLAYER_STATE_PLAYING = 1;\nexport const PLAYER_STATE_PAUSED = 2;\n\nexport type YouTubePlayerStateEvent = {\n data: number;\n};\n\nexport type YouTubePlayer = {\n cueVideoById(videoId: string): void;\n destroy(): void;\n loadVideoById(videoId: string): void;\n mute(): void;\n pauseVideo(): void;\n playVideo(): void;\n setVolume(volume: number): void;\n unMute(): void;\n};\n\nexport type YouTubePlayerOptions = {\n events: {\n onError: () => void;\n onReady: () => void;\n onStateChange: (event: YouTubePlayerStateEvent) => void;\n };\n height: string;\n playerVars: {\n controls: 0 | 1;\n origin?: string;\n playsinline: 0 | 1;\n rel: 0 | 1;\n };\n videoId: string;\n width: string;\n};\n\nexport type YouTubeNamespace = {\n Player: new (\n element: HTMLDivElement,\n options: YouTubePlayerOptions,\n ) => YouTubePlayer;\n};\n\ndeclare global {\n interface Window {\n YT?: YouTubeNamespace;\n onYouTubeIframeAPIReady?: () => void;\n }\n}\n\nlet youtubeIframeApiPromise: Promise<YouTubeNamespace> | null = null;\n\nexport function canControlPlayer(\n player: YouTubePlayer | null,\n): player is YouTubePlayer {\n return (\n player !== null &&\n typeof player.pauseVideo === \"function\" &&\n typeof player.playVideo === \"function\"\n );\n}\n\nexport function loadYouTubeIframeApi() {\n if (typeof window === \"undefined\") {\n return Promise.reject(new Error(\"YouTube iframe API requires a browser.\"));\n }\n\n if (window.YT?.Player) {\n return Promise.resolve(window.YT);\n }\n\n if (youtubeIframeApiPromise) {\n return youtubeIframeApiPromise;\n }\n\n youtubeIframeApiPromise = new Promise<YouTubeNamespace>((resolve, reject) => {\n const resetPromise = () => {\n youtubeIframeApiPromise = null;\n };\n const existingScript = document.querySelector<HTMLScriptElement>(\n 'script[src=\"https://www.youtube.com/iframe_api\"]',\n );\n\n const script = existingScript ?? document.createElement(\"script\");\n\n if (!existingScript) {\n script.src = \"https://www.youtube.com/iframe_api\";\n script.async = true;\n document.head.append(script);\n }\n\n const handleError = () => {\n resetPromise();\n reject(new Error(\"Failed to load the YouTube iframe API.\"));\n };\n\n script.addEventListener(\"error\", handleError, { once: true });\n\n const previousReadyHandler = window.onYouTubeIframeAPIReady;\n\n window.onYouTubeIframeAPIReady = () => {\n previousReadyHandler?.();\n script.removeEventListener(\"error\", handleError);\n\n if (!window.YT?.Player) {\n resetPromise();\n reject(new Error(\"YouTube iframe API loaded without a player.\"));\n return;\n }\n\n resolve(window.YT);\n };\n });\n\n return youtubeIframeApiPromise;\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport {\n clampVolume,\n DEFAULT_VOLUME,\n getNextTrackIndex,\n type JukeboxPlayerState,\n type JukeboxTrack,\n} from \"../lib/shared\";\nimport {\n canControlPlayer,\n loadYouTubeIframeApi,\n PLAYER_STATE_ENDED,\n PLAYER_STATE_PAUSED,\n PLAYER_STATE_PLAYING,\n type YouTubePlayer,\n} from \"../lib/youtube\";\n\ntype UseJukeboxPlayerOptions = {\n autoplay: boolean;\n tracks: JukeboxTrack[];\n};\n\nexport function useJukeboxPlayer({\n autoplay,\n tracks,\n}: UseJukeboxPlayerOptions): JukeboxPlayerState {\n const playerRef = useRef<YouTubePlayer | null>(null);\n const currentIndexRef = useRef(0);\n const isPlayingRef = useRef(false);\n const mutedPreferenceRef = useRef(true);\n const shouldResumePlaybackRef = useRef(autoplay);\n const tracksRef = useRef(tracks);\n const volumeRef = useRef(DEFAULT_VOLUME);\n const [playerMountNode, setPlayerMountNode] = useState<HTMLDivElement | null>(\n null,\n );\n const [currentIndex, setCurrentIndex] = useState(0);\n const [isReady, setIsReady] = useState(false);\n const [isPlaying, setIsPlaying] = useState(false);\n const [isMuted, setIsMuted] = useState(true);\n const [volume, setVolumeState] = useState(DEFAULT_VOLUME);\n\n const trackCount = tracks.length;\n const hasTracks = trackCount > 0;\n const hasMultipleTracks = trackCount > 1;\n const safeCurrentIndex = hasTracks ? Math.min(currentIndex, trackCount - 1) : 0;\n const currentTrack = tracks[safeCurrentIndex];\n const currentVideoId = currentTrack?.videoId;\n\n const moveTrack = useCallback(\n (step: number) => {\n if (!hasMultipleTracks) {\n return;\n }\n\n shouldResumePlaybackRef.current = isPlayingRef.current;\n setCurrentIndex((index) => getNextTrackIndex(index, step, trackCount));\n },\n [hasMultipleTracks, trackCount],\n );\n\n const pausePlayback = useCallback(() => {\n const player = playerRef.current;\n\n shouldResumePlaybackRef.current = false;\n\n if (!canControlPlayer(player)) {\n setIsPlaying(false);\n return;\n }\n\n player.pauseVideo();\n setIsPlaying(false);\n }, []);\n\n useEffect(() => {\n currentIndexRef.current = safeCurrentIndex;\n }, [safeCurrentIndex]);\n\n useEffect(() => {\n tracksRef.current = tracks;\n }, [tracks]);\n\n useEffect(() => {\n isPlayingRef.current = isPlaying;\n }, [isPlaying]);\n\n useEffect(() => {\n volumeRef.current = volume;\n }, [volume]);\n\n useEffect(() => {\n if (!isReady && !isPlayingRef.current) {\n shouldResumePlaybackRef.current = autoplay;\n }\n }, [autoplay, isReady]);\n\n useEffect(() => {\n if (!playerMountNode || !hasTracks) {\n return;\n }\n\n let isCancelled = false;\n\n void loadYouTubeIframeApi()\n .then((YT) => {\n if (isCancelled) {\n return;\n }\n\n playerRef.current = new YT.Player(playerMountNode, {\n width: \"100%\",\n height: \"100%\",\n videoId: tracksRef.current[currentIndexRef.current]?.videoId ?? \"\",\n playerVars: {\n controls: 1,\n origin: window.location.origin,\n playsinline: 1,\n rel: 0,\n },\n events: {\n onReady: () => {\n const player = playerRef.current;\n\n if (!player) {\n return;\n }\n\n player.setVolume(volumeRef.current);\n\n if (mutedPreferenceRef.current) {\n player.mute();\n } else {\n player.unMute();\n }\n\n setIsMuted(mutedPreferenceRef.current);\n setIsReady(true);\n },\n onStateChange: (event) => {\n if (event.data === PLAYER_STATE_ENDED) {\n const nextTrackCount = tracksRef.current.length;\n\n if (nextTrackCount <= 1) {\n shouldResumePlaybackRef.current = false;\n setIsPlaying(false);\n return;\n }\n\n shouldResumePlaybackRef.current = true;\n setCurrentIndex((index) =>\n getNextTrackIndex(index, 1, nextTrackCount),\n );\n return;\n }\n\n if (event.data === PLAYER_STATE_PLAYING) {\n setIsPlaying(true);\n return;\n }\n\n if (event.data === PLAYER_STATE_PAUSED) {\n setIsPlaying(false);\n }\n },\n onError: () => {\n shouldResumePlaybackRef.current = false;\n setIsPlaying(false);\n },\n },\n });\n })\n .catch(() => {\n setIsReady(false);\n setIsPlaying(false);\n });\n\n return () => {\n isCancelled = true;\n setIsReady(false);\n setIsPlaying(false);\n playerRef.current?.destroy();\n playerRef.current = null;\n };\n }, [hasTracks, playerMountNode]);\n\n useEffect(() => {\n const player = playerRef.current;\n\n if (!isReady || !player || !currentVideoId) {\n return;\n }\n\n if (shouldResumePlaybackRef.current) {\n player.loadVideoById(currentVideoId);\n return;\n }\n\n player.cueVideoById(currentVideoId);\n }, [currentVideoId, isReady]);\n\n return {\n playerMountRef: setPlayerMountNode,\n currentIndex: safeCurrentIndex,\n isMuted,\n isPlaying,\n volume,\n setVolume: useCallback((nextVolume: number) => {\n const clampedVolume = clampVolume(nextVolume);\n const player = playerRef.current;\n\n setVolumeState(clampedVolume);\n volumeRef.current = clampedVolume;\n\n if (clampedVolume === 0) {\n mutedPreferenceRef.current = true;\n setIsMuted(true);\n } else {\n mutedPreferenceRef.current = false;\n setIsMuted(false);\n }\n\n if (!player) {\n return;\n }\n\n player.setVolume(clampedVolume);\n\n if (clampedVolume === 0) {\n player.mute();\n return;\n }\n\n player.unMute();\n }, []),\n toggleMute: useCallback(() => {\n const player = playerRef.current;\n const nextMuted = !mutedPreferenceRef.current;\n\n mutedPreferenceRef.current = nextMuted;\n setIsMuted(nextMuted);\n\n if (!player) {\n return;\n }\n\n if (nextMuted) {\n player.mute();\n return;\n }\n\n player.unMute();\n }, []),\n togglePlay: useCallback(() => {\n const player = playerRef.current;\n\n if (!canControlPlayer(player) || !isReady || !hasTracks) {\n return;\n }\n\n if (isPlayingRef.current) {\n pausePlayback();\n return;\n }\n\n shouldResumePlaybackRef.current = true;\n player.playVideo();\n }, [hasTracks, isReady, pausePlayback]),\n playNext: useCallback(() => {\n moveTrack(1);\n }, [moveTrack]),\n playPrev: useCallback(() => {\n moveTrack(-1);\n }, [moveTrack]),\n };\n}\n","import type { ChangeEvent } from \"react\";\n\nimport type { JukeboxExpandedRenderProps } from \"../lib/shared\";\n\ntype JukeboxExpandedPlayerProps = JukeboxExpandedRenderProps;\n\nfunction SpeakerIcon({ isMuted }: { isMuted: boolean }) {\n if (isMuted) {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M7.06 3.22a.75.75 0 0 1 1.19.61v8.34a.75.75 0 0 1-1.19.61L4.26 10.5H2.75A.75.75 0 0 1 2 9.75v-3.5c0-.41.34-.75.75-.75h1.51l2.8-2.28Z\" />\n <path d=\"M10.28 5.22a.75.75 0 0 1 1.06 0L12 5.88l.66-.66a.75.75 0 1 1 1.06 1.06l-.66.66.66.66a.75.75 0 1 1-1.06 1.06L12 7.94l-.66.66a.75.75 0 0 1-1.06-1.06l.66-.66-.66-.66a.75.75 0 0 1 0-1.06Z\" />\n </svg>\n );\n }\n\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M7.06 3.22a.75.75 0 0 1 1.19.61v8.34a.75.75 0 0 1-1.19.61L4.26 10.5H2.75A.75.75 0 0 1 2 9.75v-3.5c0-.41.34-.75.75-.75h1.51l2.8-2.28Z\" />\n <path d=\"M10.5 5.02a.75.75 0 0 1 1.06 0 3.86 3.86 0 0 1 0 5.46.75.75 0 1 1-1.06-1.06 2.36 2.36 0 0 0 0-3.34.75.75 0 0 1 0-1.06Z\" />\n </svg>\n );\n}\n\nexport function JukeboxExpandedPlayer({\n currentIndex,\n currentTrack,\n isMuted,\n isPlaying,\n nextTrack,\n playerMountRef,\n totalTracks,\n volume,\n playNext,\n playPrev,\n togglePlay,\n toggleMute,\n setVolume,\n}: JukeboxExpandedPlayerProps) {\n const hasMultipleTracks = totalTracks > 1;\n const hasNextTrack = nextTrack !== undefined;\n\n const handleVolumeInput = (event: ChangeEvent<HTMLInputElement>) => {\n setVolume(Number(event.target.value));\n };\n\n return (\n <>\n <div className=\"rj-expanded__shell\">\n <div className=\"rj-expanded__screen-frame\">\n <div className=\"rj-expanded__screen\">\n <div ref={playerMountRef} className=\"rj-expanded__player\" />\n </div>\n </div>\n\n <div className=\"rj-expanded__meta\">\n <div className=\"rj-expanded__titles\">\n <div className=\"rj-expanded__title\">{currentTrack.title}</div>\n <div className=\"rj-expanded__artist\">\n {currentTrack.artist ?? \"Unknown artist\"}\n </div>\n </div>\n\n <div className=\"rj-expanded__controls\">\n <div className=\"rj-expanded__transport\">\n <button\n type=\"button\"\n onClick={playPrev}\n disabled={!hasMultipleTracks}\n className=\"rj-chip-button\">\n ◀\n </button>\n <button\n type=\"button\"\n onClick={togglePlay}\n className=\"rj-chip-button rj-chip-button--primary\">\n {isPlaying ? \"Pause\" : \"Play\"}\n </button>\n <button\n type=\"button\"\n onClick={playNext}\n disabled={!hasMultipleTracks}\n className=\"rj-chip-button\">\n ▶\n </button>\n </div>\n\n <div className=\"rj-expanded__utility\">\n <button\n type=\"button\"\n onClick={toggleMute}\n aria-label={isMuted ? \"Unmute\" : \"Mute\"}\n className=\"rj-icon-button\">\n <span className=\"rj-icon-button__icon\">\n <SpeakerIcon isMuted={isMuted} />\n </span>\n </button>\n <input\n type=\"range\"\n min={0}\n max={100}\n step={1}\n value={volume}\n onChange={handleVolumeInput}\n aria-label=\"Volume\"\n className=\"rj-volume\"\n />\n {hasMultipleTracks ? (\n <span className=\"rj-expanded__counter\">\n {currentIndex + 1} / {totalTracks}\n </span>\n ) : null}\n </div>\n </div>\n </div>\n </div>\n\n {hasNextTrack ? (\n <div className=\"rj-next-track\">\n <span className=\"rj-next-track__label\">Next</span>\n <button\n type=\"button\"\n onClick={playNext}\n disabled={!hasMultipleTracks}\n className=\"rj-next-track__button\">\n {nextTrack.title}\n </button>\n </div>\n ) : null}\n </>\n );\n}\n","import {\n useState,\n useSyncExternalStore,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport clsx from \"clsx\";\n\nimport { useJukeboxPlayer } from \"../hooks/useJukeboxPlayer\";\nimport {\n DEFAULT_CHROME,\n DEFAULT_POSITION,\n DEFAULT_THEME,\n getNextTrackIndex,\n getPositionStyle,\n LEVEL_BAR_ANIMATION_DELAY_MS,\n LEVEL_BAR_HEIGHTS,\n LEVEL_BAR_REST_HEIGHT,\n type JukeboxExpandedRenderProps,\n type JukeboxProps,\n type JukeboxTrack,\n} from \"../lib/shared\";\nimport { JukeboxExpandedPlayer } from \"./JukeboxExpandedPlayer\";\nimport \"../styles/jukebox.css\";\n\nfunction subscribeToClientRender() {\n return () => undefined;\n}\n\nfunction getClientRenderSnapshot() {\n return true;\n}\n\nfunction getServerRenderSnapshot() {\n return false;\n}\n\nfunction VolumeIcon({ isMuted }: { isMuted: boolean }) {\n if (isMuted) {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M7.06 3.22a.75.75 0 0 1 1.19.61v8.34a.75.75 0 0 1-1.19.61L4.26 10.5H2.75A.75.75 0 0 1 2 9.75v-3.5c0-.41.34-.75.75-.75h1.51l2.8-2.28Z\" />\n <path d=\"M10.28 5.22a.75.75 0 0 1 1.06 0L12 5.88l.66-.66a.75.75 0 1 1 1.06 1.06l-.66.66.66.66a.75.75 0 1 1-1.06 1.06L12 7.94l-.66.66a.75.75 0 0 1-1.06-1.06l.66-.66-.66-.66a.75.75 0 0 1 0-1.06Z\" />\n </svg>\n );\n }\n\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M7.06 3.22a.75.75 0 0 1 1.19.61v8.34a.75.75 0 0 1-1.19.61L4.26 10.5H2.75A.75.75 0 0 1 2 9.75v-3.5c0-.41.34-.75.75-.75h1.51l2.8-2.28Z\" />\n <path d=\"M10.5 5.02a.75.75 0 0 1 1.06 0 3.86 3.86 0 0 1 0 5.46.75.75 0 1 1-1.06-1.06 2.36 2.36 0 0 0 0-3.34.75.75 0 0 1 0-1.06Z\" />\n <path d=\"M11.9 3.62a.75.75 0 0 1 1.06 0 5.84 5.84 0 0 1 0 8.76.75.75 0 1 1-1.06-1.06 4.34 4.34 0 0 0 0-6.64.75.75 0 0 1 0-1.06Z\" />\n </svg>\n );\n}\n\nfunction ChevronIcon({ isExpanded }: { isExpanded: boolean }) {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n className={clsx(\"rj-chevron__icon\", {\n \"rj-chevron__icon--expanded\": isExpanded,\n })}>\n <path\n d=\"M4 6.5 8 10l4-3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction TrackSummary({\n currentTrack,\n isExpanded,\n isPlaying,\n onToggleExpanded,\n}: {\n currentTrack: JukeboxTrack | undefined;\n isExpanded: boolean;\n isPlaying: boolean;\n onToggleExpanded: () => void;\n}) {\n if (!currentTrack) {\n return (\n <div className=\"rj-track-summary rj-track-summary--empty\">\n <div className=\"rj-track-summary__copy\">\n <div className=\"rj-track-summary__title\">No tracks</div>\n <div className=\"rj-track-summary__artist\">\n Pass at least one YouTube video to start playback.\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={onToggleExpanded}\n aria-expanded={isExpanded}\n className=\"rj-track-summary\">\n <div className=\"rj-level-meter\">\n {LEVEL_BAR_HEIGHTS.map((height, index) => {\n const animationDelayMs = index * LEVEL_BAR_ANIMATION_DELAY_MS;\n\n return (\n <div\n key={`${height}-${index}`}\n aria-hidden=\"true\"\n className={clsx(\"rj-level-bar\", {\n \"rj-level-bar--playing\": isPlaying,\n })}\n style={\n {\n minHeight: `${LEVEL_BAR_REST_HEIGHT}px`,\n height: `${isPlaying ? height : LEVEL_BAR_REST_HEIGHT}px`,\n animationDelay: `${animationDelayMs}ms`,\n } satisfies CSSProperties\n }\n />\n );\n })}\n </div>\n <div className=\"rj-track-summary__copy\">\n <div className=\"rj-track-summary__title\">{currentTrack.title}</div>\n <div className=\"rj-track-summary__artist\">\n {currentTrack.artist ?? \"Unknown artist\"}\n </div>\n </div>\n <span className=\"rj-chevron\">\n <ChevronIcon isExpanded={isExpanded} />\n </span>\n </button>\n );\n}\n\nfunction ExpandedPanel({\n children,\n isExpanded,\n}: {\n children: ReactNode;\n isExpanded: boolean;\n}) {\n return (\n <div\n aria-hidden={!isExpanded}\n className={clsx(\"rj-expanded\", {\n \"rj-expanded--hidden\": !isExpanded,\n })}>\n {children}\n </div>\n );\n}\n\nexport function Jukebox({\n tracks,\n autoplay = true,\n position = DEFAULT_POSITION,\n theme = DEFAULT_THEME,\n chrome = DEFAULT_CHROME,\n offset,\n portal = true,\n className,\n renderExpandedContent,\n}: JukeboxProps) {\n const [isExpanded, setIsExpanded] = useState(false);\n const isMounted = useSyncExternalStore(\n subscribeToClientRender,\n getClientRenderSnapshot,\n getServerRenderSnapshot,\n );\n const {\n playerMountRef,\n currentIndex,\n isMuted,\n isPlaying,\n volume,\n setVolume,\n toggleMute,\n togglePlay,\n playNext,\n playPrev,\n } = useJukeboxPlayer({ autoplay, tracks });\n\n const currentTrack = tracks[currentIndex];\n const nextTrack =\n tracks.length > 1\n ? tracks[getNextTrackIndex(currentIndex, 1, tracks.length)]\n : undefined;\n const effectiveIsExpanded = currentTrack ? isExpanded : false;\n const expandedRenderProps: JukeboxExpandedRenderProps | undefined =\n currentTrack\n ? {\n currentIndex,\n currentTrack,\n isExpanded: effectiveIsExpanded,\n isMuted,\n isPlaying,\n nextTrack,\n playerMountRef,\n totalTracks: tracks.length,\n volume,\n setVolume,\n toggleMute,\n togglePlay,\n playNext,\n playPrev,\n }\n : undefined;\n\n const handleToggleExpanded = () => {\n if (!currentTrack) {\n return;\n }\n\n setIsExpanded((expanded) => !expanded);\n };\n\n const content = (\n <div\n className={clsx(\n \"rj-root\",\n {\n \"rj-root--expanded\": effectiveIsExpanded,\n \"rj-root--portal\": portal,\n \"rj-root--inline\": !portal,\n },\n className,\n )}\n data-position={position}\n data-theme={theme}\n data-chrome={chrome}\n style={getPositionStyle(position, offset, portal)}>\n {expandedRenderProps ? (\n <ExpandedPanel isExpanded={effectiveIsExpanded}>\n {renderExpandedContent ? (\n renderExpandedContent(expandedRenderProps)\n ) : (\n <JukeboxExpandedPlayer {...expandedRenderProps} />\n )}\n </ExpandedPanel>\n ) : null}\n\n <div className=\"rj-dock\">\n <div className=\"rj-dock__inner\">\n <TrackSummary\n currentTrack={currentTrack}\n isExpanded={effectiveIsExpanded}\n isPlaying={isPlaying}\n onToggleExpanded={handleToggleExpanded}\n />\n\n <button\n type=\"button\"\n onClick={toggleMute}\n disabled={!currentTrack}\n aria-label={isMuted ? \"Unmute\" : \"Mute\"}\n className=\"rj-icon-button\">\n <span className=\"rj-icon-button__icon\">\n <VolumeIcon isMuted={isMuted} />\n </span>\n </button>\n </div>\n </div>\n </div>\n );\n\n if (!portal) {\n return content;\n }\n\n if (!isMounted) {\n return null;\n }\n\n return createPortal(content, document.body);\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@react-youtube-jukebox/core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Floating YouTube jukebox component for React applications.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"react",
|
|
8
|
+
"youtube",
|
|
9
|
+
"jukebox",
|
|
10
|
+
"player",
|
|
11
|
+
"audio"
|
|
12
|
+
],
|
|
13
|
+
"homepage": "https://github.com/madisonrubylee/react-youtube-jukebox/tree/main/packages/react-youtube-jukebox#readme",
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/madisonrubylee/react-youtube-jukebox/issues"
|
|
16
|
+
},
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/madisonrubylee/react-youtube-jukebox.git",
|
|
20
|
+
"directory": "packages/react-youtube-jukebox"
|
|
21
|
+
},
|
|
22
|
+
"type": "module",
|
|
23
|
+
"sideEffects": [
|
|
24
|
+
"*.css",
|
|
25
|
+
"**/*.css"
|
|
26
|
+
],
|
|
27
|
+
"files": [
|
|
28
|
+
"dist",
|
|
29
|
+
"README.md"
|
|
30
|
+
],
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsup",
|
|
33
|
+
"typecheck": "tsc --project tsconfig.json --noEmit",
|
|
34
|
+
"lint": "eslint src",
|
|
35
|
+
"test": "vitest run",
|
|
36
|
+
"pack:check": "npm pack --dry-run --cache /tmp/react-youtube-jukebox-npm-cache"
|
|
37
|
+
},
|
|
38
|
+
"exports": {
|
|
39
|
+
".": {
|
|
40
|
+
"types": "./dist/index.d.ts",
|
|
41
|
+
"import": "./dist/index.js"
|
|
42
|
+
},
|
|
43
|
+
"./styles.css": {
|
|
44
|
+
"default": "./dist/index.css"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"main": "./dist/index.js",
|
|
48
|
+
"module": "./dist/index.js",
|
|
49
|
+
"types": "./dist/index.d.ts",
|
|
50
|
+
"publishConfig": {
|
|
51
|
+
"access": "public"
|
|
52
|
+
},
|
|
53
|
+
"peerDependencies": {
|
|
54
|
+
"react": "^18.3.0 || ^19.0.0",
|
|
55
|
+
"react-dom": "^18.3.0 || ^19.0.0"
|
|
56
|
+
},
|
|
57
|
+
"dependencies": {
|
|
58
|
+
"clsx": "^2.1.1"
|
|
59
|
+
}
|
|
60
|
+
}
|