@djangocfg/ui-tools 2.1.119 → 2.1.120

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/JsonTree-G2TPWQ4C.mjs +4 -0
  2. package/dist/{JsonTree-6RYAOPSS.mjs.map → JsonTree-G2TPWQ4C.mjs.map} +1 -1
  3. package/dist/JsonTree-TWXUBBIG.cjs +10 -0
  4. package/dist/{JsonTree-7OH6CIHT.cjs.map → JsonTree-TWXUBBIG.cjs.map} +1 -1
  5. package/dist/{Mermaid.client-PNXEC6YL.cjs → Mermaid.client-AF4WOQZR.cjs} +9 -11
  6. package/dist/Mermaid.client-AF4WOQZR.cjs.map +1 -0
  7. package/dist/{Mermaid.client-OKACITCW.mjs → Mermaid.client-W4QXJX7Q.mjs} +9 -11
  8. package/dist/Mermaid.client-W4QXJX7Q.mjs.map +1 -0
  9. package/dist/{PlaygroundLayout-SYMEAG3J.cjs → PlaygroundLayout-RZMJWH3Y.cjs} +25 -25
  10. package/dist/{PlaygroundLayout-SYMEAG3J.cjs.map → PlaygroundLayout-RZMJWH3Y.cjs.map} +1 -1
  11. package/dist/{PlaygroundLayout-UQRBU5RH.mjs → PlaygroundLayout-UQABCZ6K.mjs} +4 -4
  12. package/dist/{PlaygroundLayout-UQRBU5RH.mjs.map → PlaygroundLayout-UQABCZ6K.mjs.map} +1 -1
  13. package/dist/{chunk-UOMPPIED.mjs → chunk-4G4UGMOP.mjs} +3 -3
  14. package/dist/chunk-4G4UGMOP.mjs.map +1 -0
  15. package/dist/{chunk-47T5ECYV.cjs → chunk-CY3CQS26.cjs} +3 -3
  16. package/dist/chunk-CY3CQS26.cjs.map +1 -0
  17. package/dist/{chunk-5QT3QYFZ.cjs → chunk-EGYUND4E.cjs} +2 -2
  18. package/dist/chunk-EGYUND4E.cjs.map +1 -0
  19. package/dist/{chunk-DI3HUXHK.cjs → chunk-OYLQZT62.cjs} +2 -2
  20. package/dist/chunk-OYLQZT62.cjs.map +1 -0
  21. package/dist/{chunk-W6YHQI4F.mjs → chunk-OYYCGIBF.mjs} +2 -2
  22. package/dist/chunk-OYYCGIBF.mjs.map +1 -0
  23. package/dist/{chunk-G6PRZP5I.mjs → chunk-XZZ22EHP.mjs} +2 -2
  24. package/dist/chunk-XZZ22EHP.mjs.map +1 -0
  25. package/dist/{components-EASJYK45.mjs → components-4YSJ5ALL.mjs} +3 -3
  26. package/dist/{components-CJ2IB65O.cjs.map → components-4YSJ5ALL.mjs.map} +1 -1
  27. package/dist/{components-CJ2IB65O.cjs → components-BSTP3VLD.cjs} +7 -7
  28. package/dist/{components-EASJYK45.mjs.map → components-BSTP3VLD.cjs.map} +1 -1
  29. package/dist/index.cjs +27 -27
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.cts +1 -1
  32. package/dist/index.d.ts +1 -1
  33. package/dist/index.mjs +10 -10
  34. package/dist/index.mjs.map +1 -1
  35. package/package.json +9 -12
  36. package/src/tools/AudioPlayer/AudioPlayer.story.tsx +102 -0
  37. package/src/tools/Gallery/Gallery.story.tsx +231 -0
  38. package/src/tools/Gallery/components/compact/GalleryCompact.tsx +72 -7
  39. package/src/tools/Gallery/components/preview/GalleryCarousel.tsx +83 -1
  40. package/src/tools/JsonForm/JsonForm.story.tsx +134 -0
  41. package/src/tools/JsonTree/JsonTree.story.tsx +140 -0
  42. package/src/tools/JsonTree/index.tsx +1 -1
  43. package/src/tools/LottiePlayer/LottiePlayer.story.tsx +95 -0
  44. package/src/tools/Map/Map.story.tsx +300 -0
  45. package/src/tools/Mermaid/Mermaid.story.tsx +131 -0
  46. package/src/tools/Mermaid/hooks/useMermaidCleanup.ts +2 -5
  47. package/src/tools/Mermaid/hooks/useMermaidRenderer.ts +7 -1
  48. package/src/tools/Mermaid/hooks/useMermaidValidation.ts +4 -2
  49. package/src/tools/Mermaid/index.tsx +1 -1
  50. package/src/tools/PrettyCode/PrettyCode.story.tsx +116 -0
  51. package/src/tools/PrettyCode/index.tsx +1 -1
  52. package/src/tools/VideoPlayer/VideoPlayer.story.tsx +87 -0
  53. package/src/tools/VideoPlayer/utils/resolvers.ts +2 -2
  54. package/dist/JsonTree-6RYAOPSS.mjs +0 -4
  55. package/dist/JsonTree-7OH6CIHT.cjs +0 -10
  56. package/dist/Mermaid.client-OKACITCW.mjs.map +0 -1
  57. package/dist/Mermaid.client-PNXEC6YL.cjs.map +0 -1
  58. package/dist/chunk-47T5ECYV.cjs.map +0 -1
  59. package/dist/chunk-5QT3QYFZ.cjs.map +0 -1
  60. package/dist/chunk-DI3HUXHK.cjs.map +0 -1
  61. package/dist/chunk-G6PRZP5I.mjs.map +0 -1
  62. package/dist/chunk-UOMPPIED.mjs.map +0 -1
  63. package/dist/chunk-W6YHQI4F.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tools/VideoPlayer/utils/debug.ts","../src/tools/VideoPlayer/providers/VidstackProvider.tsx","../src/tools/VideoPlayer/hooks/useVideoPlayerSettings.ts","../src/tools/VideoPlayer/providers/NativeProvider.tsx","../src/tools/VideoPlayer/providers/StreamProvider.tsx","../src/tools/VideoPlayer/context/VideoPlayerContext.tsx","../src/tools/VideoPlayer/utils/resolvers.ts","../src/tools/VideoPlayer/utils/fileSource.ts","../src/tools/VideoPlayer/components/VideoPlayer.tsx","../src/tools/VideoPlayer/components/VideoControls.tsx","../src/tools/VideoPlayer/components/VideoErrorFallback.tsx"],"names":["createMediaLogger","__name","jsxs","jsx","forwardRef","useRef","useState","useVideoCache","useMemo","generateOgImageUrl","useEffect","useCallback","useImperativeHandle","cn","MediaPlayer","MediaProvider","Poster","DefaultVideoLayout","defaultLayoutIcons","useVideoPlayerSettings","Fragment","Preloader","AspectRatio","DefaultErrorFallback","useMediaCacheStore","generateContentKey","createContext","useContext","useMediaStore","useMediaRemote","Play","Pause","VolumeX","Volume2","Minimize","Maximize","FileVideo","Button","RefreshCw","DownloadButton"],"mappings":"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","file":"chunk-47T5ECYV.cjs","sourcesContent":["'use client';\n\n/**\n * VideoPlayer Debug Logger\n *\n * Uses universal logger with media-specific helpers.\n * Logs go to both console (dev) and zustand store (for Console panel).\n */\n\nimport { createMediaLogger } from '@djangocfg/ui-core/lib';\n\nexport const videoDebug = createMediaLogger('VideoPlayer');\n\nexport default videoDebug;\n","/**\n * VidstackProvider - Full-featured video player using Vidstack\n * Supports YouTube, Vimeo, HLS, DASH, and direct URLs\n */\n\n'use client';\n\n// Import Vidstack base styles\nimport '@vidstack/react/player/styles/base.css';\nimport '@vidstack/react/player/styles/default/theme.css';\nimport '@vidstack/react/player/styles/default/layouts/video.css';\n\nimport React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';\n\nimport { cn, generateOgImageUrl } from '@djangocfg/ui-core/lib';\nimport { MediaPlayer, MediaProvider, Poster } from '@vidstack/react';\nimport { defaultLayoutIcons, DefaultVideoLayout } from '@vidstack/react/player/layouts/default';\nimport { useVideoCache } from '../../../stores/mediaCache';\n\nimport type { MediaPlayerInstance, PlayerSrc } from '@vidstack/react';\nimport type { VidstackProviderProps, VideoPlayerRef, ErrorFallbackProps } from '../types';\nimport { videoDebug } from '../utils/debug';\n\n/**\n * Convert source to Vidstack-compatible format\n * Returns object with explicit type for HLS/DASH to ensure proper loader selection\n */\nfunction getVidstackSrc(source: VidstackProviderProps['source']): PlayerSrc {\n switch (source.type) {\n case 'youtube':\n return `youtube/${source.id}`;\n case 'vimeo':\n return `vimeo/${source.id}`;\n case 'hls':\n // Explicit type needed because URL may have query params that hide .m3u8 extension\n return { src: source.url, type: 'application/x-mpegurl' } as PlayerSrc;\n case 'dash':\n return { src: source.url, type: 'application/dash+xml' } as PlayerSrc;\n case 'url':\n return source.url;\n default:\n return '';\n }\n}\n\n/** Default error fallback UI */\nfunction DefaultErrorFallback({ error }: ErrorFallbackProps) {\n return (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center gap-4 text-white bg-black\">\n <svg\n className=\"w-16 h-16 text-muted-foreground\"\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=\"M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n <p className=\"text-lg\">{error || 'Video cannot be played'}</p>\n </div>\n );\n}\n\nexport const VidstackProvider = forwardRef<VideoPlayerRef, VidstackProviderProps>(\n (\n {\n source,\n aspectRatio = 16 / 9,\n autoPlay = false,\n muted = false,\n loop = false,\n playsInline = true,\n controls = true,\n className,\n showInfo = false,\n theme = 'default',\n errorFallback,\n onPlay,\n onPause,\n onEnded,\n onError,\n onLoadStart,\n onCanPlay,\n onTimeUpdate,\n },\n ref\n ) => {\n const playerRef = useRef<MediaPlayerInstance | null>(null);\n const [hasError, setHasError] = useState(false);\n const [errorMessage, setErrorMessage] = useState<string>('Video cannot be played');\n const lastSavedTimeRef = useRef<number>(0);\n const hasRestoredPositionRef = useRef(false);\n\n // Cache hooks\n const {\n getPosterUrl,\n cachePosterUrl,\n saveVideoPosition,\n getVideoPosition,\n } = useVideoCache();\n\n // Get source key for position caching\n const sourceKey = useMemo(() => {\n switch (source.type) {\n case 'youtube':\n return `youtube:${source.id}`;\n case 'vimeo':\n return `vimeo:${source.id}`;\n case 'hls':\n case 'dash':\n case 'url':\n return `url:${source.url}`;\n default:\n return null;\n }\n }, [source]);\n\n // Generate poster if not provided, with caching\n const posterUrl = useMemo(() => {\n if (source.poster) return source.poster;\n if (!source.title) return undefined;\n\n // Check cache first\n const cached = getPosterUrl(source.title);\n if (cached) return cached;\n\n // Generate and cache\n const url = generateOgImageUrl({ title: source.title });\n cachePosterUrl(source.title, url);\n return url;\n }, [source.poster, source.title, getPosterUrl, cachePosterUrl]);\n\n // Get Vidstack-compatible source URL\n const vidstackSrc = useMemo(() => getVidstackSrc(source), [source]);\n\n // Debug: Log video source\n useEffect(() => {\n const srcString = typeof vidstackSrc === 'string' ? vidstackSrc : (vidstackSrc as { src: string }).src;\n videoDebug.load(srcString, source.type);\n }, [vidstackSrc, source.type]);\n\n // Retry function\n const retry = useCallback(() => {\n setHasError(false);\n setErrorMessage('Video cannot be played');\n // Force reload by updating key would be needed, but for now just reset state\n const player = playerRef.current;\n if (player) {\n player.currentTime = 0;\n player.play();\n }\n }, []);\n\n // Expose player methods via ref\n useImperativeHandle(\n ref,\n () => {\n const player = playerRef.current;\n\n return {\n play: () => player?.play(),\n pause: () => player?.pause(),\n togglePlay: () => {\n if (player) {\n player.paused ? player.play() : player.pause();\n }\n },\n seekTo: (time: number) => {\n if (player) player.currentTime = time;\n },\n setVolume: (volume: number) => {\n if (player) player.volume = Math.max(0, Math.min(1, volume));\n },\n toggleMute: () => {\n if (player) player.muted = !player.muted;\n },\n enterFullscreen: () => player?.enterFullscreen(),\n exitFullscreen: () => player?.exitFullscreen(),\n get currentTime() {\n return player?.currentTime ?? 0;\n },\n get duration() {\n return player?.duration ?? 0;\n },\n get paused() {\n return player?.paused ?? true;\n },\n };\n },\n []\n );\n\n const handlePlay = () => onPlay?.();\n\n const handlePause = useCallback(() => {\n // Save position on pause\n const player = playerRef.current;\n if (sourceKey && player && player.currentTime > 0) {\n saveVideoPosition(sourceKey, player.currentTime);\n lastSavedTimeRef.current = player.currentTime;\n }\n onPause?.();\n }, [sourceKey, saveVideoPosition, onPause]);\n\n const handleEnded = () => onEnded?.();\n\n const handleError = (detail: unknown) => {\n const error = detail as { message?: string };\n const msg = error?.message || 'Video playback error';\n videoDebug.error('Vidstack error', { message: msg });\n setHasError(true);\n setErrorMessage(msg);\n onError?.(msg);\n };\n\n const handleLoadStart = () => onLoadStart?.();\n\n const handleCanPlay = useCallback(() => {\n const player = playerRef.current;\n if (player) {\n videoDebug.state('canplay', { duration: player.duration });\n // Log buffer state if media element is available\n const mediaEl = (player.provider as { media?: HTMLVideoElement } | null)?.media;\n if (mediaEl?.buffered) {\n videoDebug.buffer(mediaEl.buffered, player.duration);\n }\n }\n setHasError(false);\n\n // Restore position from cache (only once per source)\n if (sourceKey && player && !hasRestoredPositionRef.current) {\n const cachedPosition = getVideoPosition(sourceKey);\n if (cachedPosition && cachedPosition > 0) {\n const duration = player.duration;\n // Only restore if position is valid (not at the end)\n if (cachedPosition < duration - 1) {\n videoDebug.debug(`Restoring position: ${cachedPosition}s`);\n player.currentTime = cachedPosition;\n }\n }\n hasRestoredPositionRef.current = true;\n }\n\n onCanPlay?.();\n }, [sourceKey, getVideoPosition, onCanPlay]);\n\n const handleTimeUpdate = useCallback(() => {\n const player = playerRef.current;\n if (!player) return;\n\n // Save position every 5 seconds\n if (sourceKey && player.currentTime > 0) {\n const timeSinceLastSave = player.currentTime - lastSavedTimeRef.current;\n if (timeSinceLastSave >= 5 || timeSinceLastSave < 0) {\n saveVideoPosition(sourceKey, player.currentTime);\n lastSavedTimeRef.current = player.currentTime;\n }\n }\n\n onTimeUpdate?.(player.currentTime, player.duration);\n }, [sourceKey, saveVideoPosition, onTimeUpdate]);\n\n // Reset position restoration flag when source changes\n useEffect(() => {\n hasRestoredPositionRef.current = false;\n lastSavedTimeRef.current = 0;\n }, [sourceKey]);\n\n // Debug: Log player events\n useEffect(() => {\n const player = playerRef.current;\n if (!player) return;\n\n const handleSeeking = () => {\n videoDebug.event('seeking', { currentTime: player.currentTime });\n };\n\n const handleSeeked = () => {\n videoDebug.event('seeked', { currentTime: player.currentTime });\n const mediaEl = (player.provider as { media?: HTMLVideoElement } | null)?.media;\n if (mediaEl?.buffered) {\n videoDebug.buffer(mediaEl.buffered, player.duration);\n }\n };\n\n const handleWaiting = () => {\n videoDebug.warn('WAITING - buffering...');\n const mediaEl = (player.provider as { media?: HTMLVideoElement } | null)?.media;\n if (mediaEl?.buffered) {\n videoDebug.buffer(mediaEl.buffered, player.duration);\n }\n };\n\n const handleStalled = () => {\n videoDebug.warn('STALLED - network issue');\n const mediaEl = (player.provider as { media?: HTMLVideoElement } | null)?.media;\n if (mediaEl?.buffered) {\n videoDebug.buffer(mediaEl.buffered, player.duration);\n }\n };\n\n player.addEventListener('seeking', handleSeeking);\n player.addEventListener('seeked', handleSeeked);\n player.addEventListener('waiting', handleWaiting);\n player.addEventListener('stalled', handleStalled);\n\n return () => {\n player.removeEventListener('seeking', handleSeeking);\n player.removeEventListener('seeked', handleSeeked);\n player.removeEventListener('waiting', handleWaiting);\n player.removeEventListener('stalled', handleStalled);\n };\n }, [vidstackSrc]);\n\n // Determine layout mode\n const isFillMode = aspectRatio === 'fill';\n const computedAspectRatio = aspectRatio === 'auto' || aspectRatio === 'fill' ? undefined : aspectRatio;\n\n // Render error fallback\n const renderErrorFallback = () => {\n const fallbackProps: ErrorFallbackProps = { error: errorMessage, retry };\n\n if (typeof errorFallback === 'function') {\n return errorFallback(fallbackProps);\n }\n\n if (errorFallback) {\n return errorFallback;\n }\n\n return <DefaultErrorFallback {...fallbackProps} />;\n };\n\n // Container styles based on mode\n const containerStyles = isFillMode\n ? { width: '100%', height: '100%' }\n : { aspectRatio: computedAspectRatio };\n\n return (\n <div className={cn(isFillMode ? 'w-full h-full' : 'w-full', className)}>\n <div\n className={cn(\n 'relative w-full rounded-sm bg-black overflow-hidden',\n isFillMode && 'h-full',\n theme === 'minimal' && 'rounded-none',\n theme === 'modern' && 'rounded-xl shadow-2xl'\n )}\n style={containerStyles}\n >\n {hasError ? (\n renderErrorFallback()\n ) : (\n <MediaPlayer\n ref={playerRef}\n title={source.title || 'Video'}\n src={vidstackSrc}\n autoPlay={autoPlay}\n muted={muted}\n loop={loop}\n playsInline={playsInline}\n onPlay={handlePlay}\n onPause={handlePause}\n onEnded={handleEnded}\n onError={handleError}\n onLoadStart={handleLoadStart}\n onCanPlay={handleCanPlay}\n onTimeUpdate={handleTimeUpdate}\n className=\"w-full h-full\"\n >\n <MediaProvider />\n\n {posterUrl && (\n <Poster\n className=\"vds-poster\"\n src={posterUrl}\n alt={source.title || 'Video poster'}\n style={{ objectFit: 'cover' }}\n />\n )}\n\n {controls && <DefaultVideoLayout icons={defaultLayoutIcons} thumbnails={posterUrl} />}\n </MediaPlayer>\n )}\n </div>\n\n {showInfo && source.title && (\n <div className=\"mt-4 space-y-2\">\n <h3 className=\"text-xl font-semibold text-foreground\">{source.title}</h3>\n </div>\n )}\n </div>\n );\n }\n);\n\nVidstackProvider.displayName = 'VidstackProvider';\n","'use client';\n\n/**\n * useVideoPlayerSettings - Hook for persisted video player settings\n *\n * Provides volume and loop settings that persist in localStorage.\n * Use this hook in video player providers to apply saved settings.\n *\n * @example\n * const { settings, updateVolume, updateLoop } = useVideoPlayerSettings();\n *\n * // Apply to video element\n * videoRef.current.volume = settings.volume;\n * videoRef.current.loop = settings.isLooping;\n *\n * // Save when user changes\n * const handleVolumeChange = (vol: number) => {\n * videoRef.current.volume = vol;\n * updateVolume(vol);\n * };\n */\n\nimport { useCallback } from 'react';\nimport { useVideoPlayerSettings as useSettings } from '../../../stores/mediaCache';\n\nexport interface VideoPlayerSettingsReturn {\n /** Current settings */\n settings: {\n volume: number;\n isLooping: boolean;\n };\n /** Update volume (0-1) */\n updateVolume: (volume: number) => void;\n /** Update loop setting */\n updateLoop: (isLooping: boolean) => void;\n /** Update multiple settings at once */\n updateSettings: (settings: { volume?: number; isLooping?: boolean }) => void;\n}\n\nexport function useVideoPlayerSettings(): VideoPlayerSettingsReturn {\n const { settings, saveSettings } = useSettings();\n\n const updateVolume = useCallback(\n (volume: number) => {\n saveSettings({ volume: Math.max(0, Math.min(1, volume)) });\n },\n [saveSettings]\n );\n\n const updateLoop = useCallback(\n (isLooping: boolean) => {\n saveSettings({ isLooping });\n },\n [saveSettings]\n );\n\n const updateSettings = useCallback(\n (newSettings: { volume?: number; isLooping?: boolean }) => {\n saveSettings(newSettings);\n },\n [saveSettings]\n );\n\n return {\n settings,\n updateVolume,\n updateLoop,\n updateSettings,\n };\n}\n","/**\n * NativeProvider - Lightweight native HTML5 video player\n * For demo videos, background videos, autoplay loop muted scenarios\n */\n\n'use client';\n\nimport React, { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { Preloader, AspectRatio } from '@djangocfg/ui-core';\nimport { useVideoPlayerSettings } from '../hooks/useVideoPlayerSettings';\n\nimport type { NativeProviderProps, VideoPlayerRef } from '../types';\nimport { videoDebug } from '../utils/debug';\n\n/**\n * Get video URL from source\n */\nfunction getVideoUrl(source: NativeProviderProps['source']): string {\n switch (source.type) {\n case 'url':\n return source.url;\n case 'data-url':\n return source.data;\n default:\n return '';\n }\n}\n\nexport const NativeProvider = forwardRef<VideoPlayerRef, NativeProviderProps>(\n (\n {\n source,\n aspectRatio = 16 / 9,\n autoPlay = true,\n muted = true,\n loop = true,\n playsInline = true,\n preload = 'auto',\n controls = false,\n disableContextMenu = true,\n showPreloader = true,\n preloaderTimeout = 5000,\n className,\n videoClassName,\n onPlay,\n onPause,\n onEnded,\n onError,\n onLoadStart,\n onCanPlay,\n onTimeUpdate,\n },\n ref\n ) => {\n const [isLoading, setIsLoading] = useState(showPreloader);\n const videoRef = useRef<HTMLVideoElement>(null);\n\n // Persisted player settings\n const { settings: savedSettings, updateVolume } = useVideoPlayerSettings();\n\n const videoUrl = getVideoUrl(source);\n\n // Debug: Log video source\n useEffect(() => {\n videoDebug.load(videoUrl, source.type);\n }, [videoUrl, source.type]);\n\n // Expose video element methods via ref\n useImperativeHandle(\n ref,\n () => ({\n play: () => videoRef.current?.play(),\n pause: () => videoRef.current?.pause(),\n togglePlay: () => {\n const video = videoRef.current;\n if (video) {\n video.paused ? video.play() : video.pause();\n }\n },\n seekTo: (time: number) => {\n if (videoRef.current) videoRef.current.currentTime = time;\n },\n setVolume: (volume: number) => {\n if (videoRef.current) videoRef.current.volume = Math.max(0, Math.min(1, volume));\n },\n toggleMute: () => {\n if (videoRef.current) videoRef.current.muted = !videoRef.current.muted;\n },\n enterFullscreen: () => videoRef.current?.requestFullscreen(),\n exitFullscreen: () => document.exitFullscreen(),\n get currentTime() {\n return videoRef.current?.currentTime ?? 0;\n },\n get duration() {\n return videoRef.current?.duration ?? 0;\n },\n get paused() {\n return videoRef.current?.paused ?? true;\n },\n }),\n []\n );\n\n useEffect(() => {\n if (!showPreloader) return;\n\n const video = videoRef.current;\n if (!video) return;\n\n // Check if video is already loaded\n if (video.readyState >= 3) {\n setIsLoading(false);\n return;\n }\n\n const hideLoader = () => setIsLoading(false);\n\n video.addEventListener('canplay', hideLoader);\n video.addEventListener('loadeddata', hideLoader);\n video.addEventListener('playing', hideLoader);\n\n // Fallback: hide loader after timeout\n const timeout = setTimeout(hideLoader, preloaderTimeout);\n\n return () => {\n video.removeEventListener('canplay', hideLoader);\n video.removeEventListener('loadeddata', hideLoader);\n video.removeEventListener('playing', hideLoader);\n clearTimeout(timeout);\n };\n }, [showPreloader, preloaderTimeout]);\n\n // Debug: Log video events\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const handleLoadedMetadata = () => {\n videoDebug.state('loadedmetadata', { duration: video.duration });\n };\n\n const handleCanPlayDebug = () => {\n videoDebug.state('canplay', { duration: video.duration, buffered: video.buffered.length });\n videoDebug.buffer(video.buffered, video.duration);\n // Apply saved volume\n video.volume = savedSettings.volume;\n };\n\n const handleSeeking = () => {\n videoDebug.event('seeking', { currentTime: video.currentTime });\n };\n\n const handleSeeked = () => {\n videoDebug.event('seeked', { currentTime: video.currentTime });\n videoDebug.buffer(video.buffered, video.duration);\n };\n\n const handleWaiting = () => {\n videoDebug.warn('WAITING - buffering...');\n videoDebug.buffer(video.buffered, video.duration);\n };\n\n const handleStalled = () => {\n videoDebug.warn('STALLED - network issue');\n videoDebug.buffer(video.buffered, video.duration);\n };\n\n video.addEventListener('loadedmetadata', handleLoadedMetadata);\n video.addEventListener('canplay', handleCanPlayDebug);\n video.addEventListener('seeking', handleSeeking);\n video.addEventListener('seeked', handleSeeked);\n video.addEventListener('waiting', handleWaiting);\n video.addEventListener('stalled', handleStalled);\n\n return () => {\n video.removeEventListener('loadedmetadata', handleLoadedMetadata);\n video.removeEventListener('canplay', handleCanPlayDebug);\n video.removeEventListener('seeking', handleSeeking);\n video.removeEventListener('seeked', handleSeeked);\n video.removeEventListener('waiting', handleWaiting);\n video.removeEventListener('stalled', handleStalled);\n };\n }, [savedSettings.volume]);\n\n // Persist volume when user changes it via native controls\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const handleVolumeChange = () => {\n updateVolume(video.volume);\n };\n\n video.addEventListener('volumechange', handleVolumeChange);\n return () => video.removeEventListener('volumechange', handleVolumeChange);\n }, [updateVolume]);\n\n const handleContextMenu = (e: React.MouseEvent) => {\n if (disableContextMenu) {\n e.preventDefault();\n }\n };\n\n const handleError = (e: React.SyntheticEvent<HTMLVideoElement>) => {\n const video = e.currentTarget;\n const errorMsg = video.error?.message || 'Video playback error';\n videoDebug.error('Video error', { code: video.error?.code, message: errorMsg });\n setIsLoading(false);\n onError?.(errorMsg);\n };\n\n const handleTimeUpdate = () => {\n const video = videoRef.current;\n if (video && onTimeUpdate) {\n onTimeUpdate(video.currentTime, video.duration);\n }\n };\n\n // Determine if we should use AspectRatio wrapper or fill mode\n const isFillMode = aspectRatio === 'fill';\n const computedAspectRatio = aspectRatio === 'auto' || aspectRatio === 'fill' ? undefined : aspectRatio;\n\n // Video content\n const videoContent = (\n <>\n {/* Preloader */}\n {showPreloader && isLoading && (\n <div\n className={cn(\n 'absolute inset-0 flex items-center justify-center bg-muted/30 backdrop-blur-sm z-10'\n )}\n >\n <Preloader size=\"lg\" spinnerClassName=\"text-white\" />\n </div>\n )}\n\n {/* Video */}\n <video\n ref={videoRef}\n className={cn('w-full h-full object-cover', videoClassName)}\n src={videoUrl}\n autoPlay={autoPlay}\n muted={muted}\n loop={loop}\n playsInline={playsInline}\n preload={preload}\n controls={controls}\n poster={source.poster}\n onContextMenu={handleContextMenu}\n onLoadStart={onLoadStart}\n onCanPlay={onCanPlay}\n onPlay={onPlay}\n onPause={onPause}\n onPlaying={() => setIsLoading(false)}\n onEnded={onEnded}\n onError={handleError}\n onTimeUpdate={handleTimeUpdate}\n />\n </>\n );\n\n // Fill mode - no AspectRatio wrapper\n if (isFillMode) {\n return (\n <div className={cn('relative w-full h-full overflow-hidden', className)}>\n {videoContent}\n </div>\n );\n }\n\n // Normal mode with AspectRatio\n return (\n <div className={cn('relative overflow-hidden', className)}>\n <AspectRatio ratio={computedAspectRatio}>\n {videoContent}\n </AspectRatio>\n </div>\n );\n }\n);\n\nNativeProvider.displayName = 'NativeProvider';\n","/**\n * StreamProvider - HTTP Range streaming and Blob video player\n * Supports:\n * - HTTP Range requests with authorization (for large files)\n * - Blob/ArrayBuffer sources\n * - Data URL sources\n * - Fill parent container mode\n * - Custom error fallback\n */\n\n'use client';\n\nimport React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { Preloader, AspectRatio } from '@djangocfg/ui-core';\nimport { useMediaCacheStore, generateContentKey } from '../../../stores/mediaCache';\nimport { useVideoPlayerSettings } from '../hooks/useVideoPlayerSettings';\n\nimport type { StreamProviderProps, VideoPlayerRef, StreamSource, BlobSource, DataUrlSource, ErrorFallbackProps } from '../types';\nimport { videoDebug } from '../utils/debug';\n\n/** Default error fallback UI */\nfunction DefaultErrorFallback({ error }: ErrorFallbackProps) {\n return (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center gap-4 text-white\">\n <svg\n className=\"w-16 h-16 text-muted-foreground\"\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=\"M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n <p className=\"text-lg\">{error || 'Video cannot be previewed'}</p>\n </div>\n );\n}\n\nexport const StreamProvider = forwardRef<VideoPlayerRef, StreamProviderProps>(\n (\n {\n source,\n aspectRatio = 16 / 9,\n autoPlay = false,\n muted = false,\n loop = false,\n playsInline = true,\n preload = 'metadata',\n controls = true,\n disableContextMenu = false,\n showPreloader = true,\n preloaderTimeout = 10000,\n className,\n videoClassName,\n errorFallback,\n onPlay,\n onPause,\n onEnded,\n onError,\n onLoadStart,\n onCanPlay,\n onTimeUpdate,\n onBufferProgress,\n },\n ref\n ) => {\n const [videoUrl, setVideoUrl] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [hasError, setHasError] = useState(false);\n const [errorMessage, setErrorMessage] = useState<string>('Video cannot be previewed');\n const videoRef = useRef<HTMLVideoElement>(null);\n const contentKeyRef = useRef<string | null>(null);\n const lastSavedTimeRef = useRef<number>(0);\n\n // Get stable function references from store (not from hook to avoid re-renders)\n const getOrCreateBlobUrl = useMediaCacheStore.getState().getOrCreateBlobUrl;\n const releaseBlobUrl = useMediaCacheStore.getState().releaseBlobUrl;\n const getOrCreateStreamUrl = useMediaCacheStore.getState().getOrCreateStreamUrl;\n const saveVideoPosition = useMediaCacheStore.getState().saveVideoPosition;\n const getVideoPosition = useMediaCacheStore.getState().getVideoPosition;\n\n // Persisted player settings\n const { settings: savedSettings, updateVolume } = useVideoPlayerSettings();\n\n // Retry function for error fallback\n // Regenerates URL for stream sources to get fresh token/session\n const retry = useCallback(() => {\n setHasError(false);\n setIsLoading(true);\n\n // For stream sources, regenerate URL bypassing cache\n if (source.type === 'stream') {\n const streamSource = source as StreamSource;\n const freshUrl = streamSource.getStreamUrl(streamSource.sessionId, streamSource.path);\n setVideoUrl(freshUrl);\n return;\n }\n\n // For other sources, just reload\n const video = videoRef.current;\n if (video && videoUrl) {\n video.load();\n }\n }, [source, videoUrl]);\n\n // Expose video element methods via ref\n useImperativeHandle(\n ref,\n () => ({\n play: () => videoRef.current?.play(),\n pause: () => videoRef.current?.pause(),\n togglePlay: () => {\n const video = videoRef.current;\n if (video) {\n video.paused ? video.play() : video.pause();\n }\n },\n seekTo: (time: number) => {\n if (videoRef.current) videoRef.current.currentTime = time;\n },\n setVolume: (volume: number) => {\n if (videoRef.current) videoRef.current.volume = Math.max(0, Math.min(1, volume));\n },\n toggleMute: () => {\n if (videoRef.current) videoRef.current.muted = !videoRef.current.muted;\n },\n enterFullscreen: () => videoRef.current?.requestFullscreen(),\n exitFullscreen: () => document.exitFullscreen(),\n get currentTime() {\n return videoRef.current?.currentTime ?? 0;\n },\n get duration() {\n return videoRef.current?.duration ?? 0;\n },\n get paused() {\n return videoRef.current?.paused ?? true;\n },\n }),\n []\n );\n\n // Track unmount for cleanup\n const isMountedRef = useRef(true);\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n // Release blob URL only on actual unmount\n if (contentKeyRef.current) {\n useMediaCacheStore.getState().releaseBlobUrl(contentKeyRef.current);\n contentKeyRef.current = null;\n }\n };\n }, []);\n\n // Create video URL based on source type with caching\n useEffect(() => {\n // Release previous blob URL if source changed\n if (contentKeyRef.current) {\n const newKey = source.type === 'blob'\n ? generateContentKey((source as BlobSource).data)\n : null;\n if (newKey !== contentKeyRef.current) {\n releaseBlobUrl(contentKeyRef.current);\n contentKeyRef.current = null;\n }\n }\n\n setHasError(false);\n setIsLoading(true);\n\n switch (source.type) {\n case 'stream': {\n const streamSource = source as StreamSource;\n // Use cached stream URL\n const url = getOrCreateStreamUrl(\n streamSource.sessionId,\n streamSource.path,\n streamSource.getStreamUrl\n );\n videoDebug.load(url, 'stream');\n setVideoUrl(url);\n break;\n }\n\n case 'blob': {\n const blobSource = source as BlobSource;\n // Generate content key for caching\n const contentKey = generateContentKey(blobSource.data);\n contentKeyRef.current = contentKey;\n // Use cached blob URL\n const url = getOrCreateBlobUrl(\n contentKey,\n blobSource.data,\n blobSource.mimeType || 'video/mp4'\n );\n videoDebug.load(url, 'blob');\n setVideoUrl(url);\n break;\n }\n\n case 'data-url': {\n const dataUrlSource = source as DataUrlSource;\n videoDebug.load(dataUrlSource.data.slice(0, 50) + '...', 'data-url');\n setVideoUrl(dataUrlSource.data);\n break;\n }\n\n default:\n videoDebug.error('Invalid video source type', { type: (source as { type: string }).type });\n setVideoUrl(null);\n setHasError(true);\n setErrorMessage('Invalid video source');\n }\n\n // No cleanup here - cleanup happens in unmount effect above\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [source]);\n\n // Get source key for position caching\n const getSourceKey = useCallback(() => {\n switch (source.type) {\n case 'stream':\n return `stream:${(source as StreamSource).sessionId}:${(source as StreamSource).path}`;\n case 'blob':\n return contentKeyRef.current ? `blob:${contentKeyRef.current}` : null;\n case 'data-url':\n return `data:${(source as DataUrlSource).data.slice(0, 50)}`;\n default:\n return null;\n }\n }, [source]);\n\n // Restore cached playback position and settings when video is ready\n const handleCanPlay = useCallback(() => {\n const video = videoRef.current;\n if (video) {\n videoDebug.state('canplay', { duration: video.duration, buffered: video.buffered.length });\n videoDebug.buffer(video.buffered, video.duration);\n\n // Apply saved volume (user preference)\n video.volume = savedSettings.volume;\n }\n setIsLoading(false);\n\n // Restore position from cache\n const sourceKey = getSourceKey();\n if (sourceKey && video) {\n const cachedPosition = getVideoPosition(sourceKey);\n if (cachedPosition && cachedPosition > 0) {\n const duration = video.duration;\n // Only restore if position is valid (not at the end)\n if (cachedPosition < duration - 1) {\n videoDebug.debug(`Restoring position: ${cachedPosition}s`);\n video.currentTime = cachedPosition;\n }\n }\n }\n\n onCanPlay?.();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [getSourceKey, onCanPlay, savedSettings.volume]);\n\n // Save playback position periodically\n const handleTimeUpdate = useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n\n // Save position every 5 seconds\n const sourceKey = getSourceKey();\n if (sourceKey && video.currentTime > 0) {\n const timeSinceLastSave = video.currentTime - lastSavedTimeRef.current;\n if (timeSinceLastSave >= 5 || timeSinceLastSave < 0) {\n saveVideoPosition(sourceKey, video.currentTime);\n lastSavedTimeRef.current = video.currentTime;\n }\n }\n\n onTimeUpdate?.(video.currentTime, video.duration);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [getSourceKey, onTimeUpdate]);\n\n // Save position on pause\n const handlePause = useCallback(() => {\n const video = videoRef.current;\n const sourceKey = getSourceKey();\n if (sourceKey && video && video.currentTime > 0) {\n saveVideoPosition(sourceKey, video.currentTime);\n lastSavedTimeRef.current = video.currentTime;\n }\n onPause?.();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [getSourceKey, onPause]);\n\n // Handle buffer progress\n const handleProgress = useCallback(() => {\n const video = videoRef.current;\n if (!video || !onBufferProgress) return;\n\n // Get the buffered time ranges\n if (video.buffered.length > 0) {\n // Get the end of the last buffered range\n const bufferedEnd = video.buffered.end(video.buffered.length - 1);\n const duration = video.duration;\n\n if (duration > 0 && !isNaN(bufferedEnd)) {\n onBufferProgress(bufferedEnd, duration);\n }\n }\n }, [onBufferProgress]);\n\n // Preloader timeout\n useEffect(() => {\n if (!showPreloader || !isLoading) return;\n\n const timeout = setTimeout(() => {\n setIsLoading(false);\n }, preloaderTimeout);\n\n return () => clearTimeout(timeout);\n }, [showPreloader, isLoading, preloaderTimeout]);\n\n const handleContextMenu = (e: React.MouseEvent) => {\n if (disableContextMenu) {\n e.preventDefault();\n }\n };\n\n const handleLoadedData = () => {\n setIsLoading(false);\n };\n\n const handleError = () => {\n const video = videoRef.current;\n if (video) {\n videoDebug.error('Video error', { code: video.error?.code, message: video.error?.message });\n }\n setIsLoading(false);\n setHasError(true);\n setErrorMessage('Failed to load video');\n onError?.('Video playback error');\n };\n\n // Debug: Log video events\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const handleLoadedMetadata = () => {\n videoDebug.state('loadedmetadata', { duration: video.duration });\n };\n\n const handleSeeking = () => {\n videoDebug.event('seeking', { currentTime: video.currentTime });\n };\n\n const handleSeeked = () => {\n videoDebug.event('seeked', { currentTime: video.currentTime });\n videoDebug.buffer(video.buffered, video.duration);\n };\n\n const handleWaiting = () => {\n videoDebug.warn('WAITING - buffering...');\n videoDebug.buffer(video.buffered, video.duration);\n };\n\n const handleStalled = () => {\n videoDebug.warn('STALLED - network issue');\n videoDebug.buffer(video.buffered, video.duration);\n };\n\n video.addEventListener('loadedmetadata', handleLoadedMetadata);\n video.addEventListener('seeking', handleSeeking);\n video.addEventListener('seeked', handleSeeked);\n video.addEventListener('waiting', handleWaiting);\n video.addEventListener('stalled', handleStalled);\n\n return () => {\n video.removeEventListener('loadedmetadata', handleLoadedMetadata);\n video.removeEventListener('seeking', handleSeeking);\n video.removeEventListener('seeked', handleSeeked);\n video.removeEventListener('waiting', handleWaiting);\n video.removeEventListener('stalled', handleStalled);\n };\n }, [videoUrl]);\n\n // Persist volume when user changes it via native controls\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const handleVolumeChange = () => {\n updateVolume(video.volume);\n };\n\n video.addEventListener('volumechange', handleVolumeChange);\n return () => video.removeEventListener('volumechange', handleVolumeChange);\n }, [videoUrl, updateVolume]);\n\n // Determine if we should use AspectRatio wrapper or fill mode\n const isFillMode = aspectRatio === 'fill';\n const computedAspectRatio = aspectRatio === 'auto' || aspectRatio === 'fill' ? undefined : aspectRatio;\n\n // Render error fallback\n const renderErrorFallback = () => {\n const fallbackProps: ErrorFallbackProps = { error: errorMessage, retry };\n\n if (typeof errorFallback === 'function') {\n return errorFallback(fallbackProps);\n }\n\n if (errorFallback) {\n return errorFallback;\n }\n\n return <DefaultErrorFallback {...fallbackProps} />;\n };\n\n // Error state\n if (!videoUrl || hasError) {\n if (isFillMode) {\n return (\n <div className={cn('relative w-full h-full overflow-hidden bg-black', className)}>\n {renderErrorFallback()}\n </div>\n );\n }\n\n return (\n <div className={cn('relative overflow-hidden bg-black', className)}>\n <AspectRatio ratio={computedAspectRatio}>\n {renderErrorFallback()}\n </AspectRatio>\n </div>\n );\n }\n\n // Video content\n const videoContent = (\n <>\n {/* Loading indicator */}\n {showPreloader && isLoading && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/50 z-10\">\n <Preloader size=\"lg\" spinnerClassName=\"text-white\" />\n </div>\n )}\n\n {/* Video element */}\n <video\n ref={videoRef}\n src={videoUrl}\n className={cn(\n 'w-full h-full object-contain',\n isLoading && 'opacity-0',\n videoClassName\n )}\n autoPlay={autoPlay}\n muted={muted}\n loop={loop}\n playsInline={playsInline}\n preload={preload}\n controls={controls}\n crossOrigin=\"anonymous\"\n poster={source.poster}\n onContextMenu={handleContextMenu}\n onLoadStart={onLoadStart}\n onCanPlay={handleCanPlay}\n onLoadedData={handleLoadedData}\n onPlay={onPlay}\n onPause={handlePause}\n onEnded={onEnded}\n onError={handleError}\n onTimeUpdate={handleTimeUpdate}\n onProgress={handleProgress}\n />\n </>\n );\n\n // Fill mode - no AspectRatio wrapper\n if (isFillMode) {\n return (\n <div className={cn('relative w-full h-full overflow-hidden bg-black', className)}>\n {videoContent}\n </div>\n );\n }\n\n // Normal mode with AspectRatio\n return (\n <div className={cn('relative overflow-hidden bg-black', className)}>\n <AspectRatio ratio={computedAspectRatio}>\n {videoContent}\n </AspectRatio>\n </div>\n );\n }\n);\n\nStreamProvider.displayName = 'StreamProvider';\n","/**\n * VideoPlayerContext - Context for streaming configuration\n * Simplifies streaming API by providing getStreamUrl globally\n */\n\n'use client';\n\nimport React, { createContext, useContext, useMemo } from 'react';\n\nimport type { VideoPlayerContextValue, VideoPlayerProviderProps } from '../types';\n\n// =============================================================================\n// Context\n// =============================================================================\n\nconst VideoPlayerContext = createContext<VideoPlayerContextValue | null>(null);\n\n/**\n * Provider for VideoPlayer streaming configuration\n *\n * @example\n * // In your app layout or FileWorkspace\n * <VideoPlayerProvider\n * sessionId={sessionId}\n * getStreamUrl={terminalClient.terminal_media.streamStreamRetrieveUrl}\n * >\n * <VideoPlayer source={{ type: 'stream', path: '/video.mp4' }} />\n * </VideoPlayerProvider>\n */\nexport function VideoPlayerProvider({\n children,\n getStreamUrl,\n sessionId,\n}: VideoPlayerProviderProps) {\n const value = useMemo(\n () => ({ getStreamUrl, sessionId }),\n [getStreamUrl, sessionId]\n );\n\n return (\n <VideoPlayerContext.Provider value={value}>\n {children}\n </VideoPlayerContext.Provider>\n );\n}\n\n/**\n * Hook to access VideoPlayer context\n */\nexport function useVideoPlayerContext(): VideoPlayerContextValue | null {\n return useContext(VideoPlayerContext);\n}\n","/**\n * Video source and player mode resolvers\n */\n\nimport type { VideoSourceUnion, PlayerMode, SimpleStreamSource, StreamSource, VideoPlayerContextValue } from '../types';\n\n/**\n * Determine which provider to use based on source type\n */\nexport function resolvePlayerMode(\n source: VideoSourceUnion,\n mode: PlayerMode = 'auto'\n): 'vidstack' | 'native' | 'streaming' {\n if (mode !== 'auto') {\n return mode;\n }\n\n switch (source.type) {\n case 'youtube':\n case 'vimeo':\n case 'hls':\n case 'dash':\n return 'vidstack';\n\n case 'stream':\n case 'blob':\n return 'streaming';\n\n case 'data-url':\n case 'url':\n default:\n return 'native';\n }\n}\n\n/**\n * Check if source is a simplified stream source (without getStreamUrl)\n */\nexport function isSimpleStreamSource(\n source: VideoSourceUnion | SimpleStreamSource\n): source is SimpleStreamSource {\n return source.type === 'stream' && !('getStreamUrl' in source);\n}\n\n/**\n * Resolve simplified stream source to full stream source using context\n */\nexport function resolveStreamSource(\n source: SimpleStreamSource,\n context: VideoPlayerContextValue | null\n): StreamSource | null {\n if (!context?.getStreamUrl) {\n console.warn(\n 'VideoPlayer: Stream source requires getStreamUrl. ' +\n 'Either provide it in source or wrap with VideoPlayerProvider.'\n );\n return null;\n }\n\n const sessionId = source.sessionId || context.sessionId;\n if (!sessionId) {\n console.warn('VideoPlayer: Stream source requires sessionId.');\n return null;\n }\n\n return {\n type: 'stream',\n sessionId,\n path: source.path,\n getStreamUrl: context.getStreamUrl,\n mimeType: source.mimeType,\n title: source.title,\n poster: source.poster,\n };\n}\n","/**\n * File source resolution utilities\n */\n\nimport type { VideoSourceUnion, ResolveFileSourceOptions } from '../types';\n\n/**\n * Resolve file content to VideoSourceUnion\n * Useful for FileWorkspace/file manager integrations\n *\n * @example\n * const source = resolveFileSource({\n * content: file.content,\n * path: file.path,\n * mimeType: file.mimeType,\n * sessionId: sessionId,\n * loadMethod: file.loadMethod,\n * getStreamUrl: terminalClient.terminal_media.streamStreamRetrieveUrl\n * });\n *\n * <VideoPlayer source={source} />\n */\nexport function resolveFileSource(options: ResolveFileSourceOptions): VideoSourceUnion | null {\n const {\n content,\n path,\n mimeType,\n sessionId,\n loadMethod,\n getStreamUrl,\n title,\n poster,\n } = options;\n\n const contentSize = content\n ? typeof content === 'string'\n ? content.length\n : content.byteLength\n : 0;\n const hasContent = contentSize > 0;\n\n // Priority 1: HTTP Range streaming for large files\n if (loadMethod === 'http_stream' && !hasContent && sessionId && getStreamUrl) {\n return {\n type: 'stream',\n sessionId,\n path,\n getStreamUrl,\n mimeType,\n title,\n poster,\n };\n }\n\n // Priority 2: Data URL (base64 string)\n if (typeof content === 'string' && hasContent) {\n return {\n type: 'data-url',\n data: content,\n title,\n poster,\n };\n }\n\n // Priority 3: ArrayBuffer → Blob\n if (content instanceof ArrayBuffer && hasContent) {\n return {\n type: 'blob',\n data: content,\n mimeType: mimeType || 'video/mp4',\n title,\n poster,\n };\n }\n\n // No valid content\n return null;\n}\n","/**\n * VideoPlayer - Unified Video Player Component\n *\n * Supports multiple modes:\n * - vidstack: Full-featured player (YouTube, Vimeo, HLS, DASH)\n * - native: Lightweight HTML5 player\n * - streaming: HTTP Range streaming with auth / Blob sources\n *\n * @example\n * // YouTube video\n * <VideoPlayer source={{ type: 'youtube', id: 'dQw4w9WgXcQ' }} />\n *\n * @example\n * // HLS stream\n * <VideoPlayer source={{ type: 'hls', url: 'https://example.com/video.m3u8' }} />\n *\n * @example\n * // HTTP Range streaming with auth (full source)\n * <VideoPlayer\n * source={{\n * type: 'stream',\n * sessionId: 'abc123',\n * path: '/videos/movie.mp4',\n * getStreamUrl: (id, path) => `/api/stream/${id}?path=${path}&token=${token}`\n * }}\n * />\n *\n * @example\n * // HTTP Range streaming (simplified, using VideoPlayerProvider context)\n * <VideoPlayerProvider sessionId={sessionId} getStreamUrl={getStreamUrl}>\n * <VideoPlayer source={{ type: 'stream', path: '/videos/movie.mp4' }} />\n * </VideoPlayerProvider>\n *\n * @example\n * // Blob/ArrayBuffer\n * <VideoPlayer source={{ type: 'blob', data: arrayBuffer, mimeType: 'video/mp4' }} />\n */\n\n'use client';\n\nimport React, { forwardRef, useMemo } from 'react';\n\nimport { VidstackProvider, NativeProvider, StreamProvider } from '../providers';\nimport { useVideoPlayerContext } from '../context';\nimport { resolvePlayerMode, isSimpleStreamSource, resolveStreamSource } from '../utils';\n\nimport type { VideoPlayerProps, VideoPlayerRef, VideoSourceUnion, VidstackProviderProps, NativeProviderProps, StreamProviderProps, SimpleStreamSource } from '../types';\n\nexport const VideoPlayer = forwardRef<VideoPlayerRef, VideoPlayerProps & { source: VideoSourceUnion | SimpleStreamSource }>(\n (\n {\n source: rawSource,\n mode = 'auto',\n aspectRatio = 16 / 9,\n autoPlay = false,\n muted = false,\n loop = false,\n playsInline = true,\n controls = true,\n preload = 'metadata',\n theme = 'default',\n showInfo = false,\n className,\n videoClassName,\n disableContextMenu = false,\n showPreloader = true,\n preloaderTimeout = 5000,\n errorFallback,\n onPlay,\n onPause,\n onEnded,\n onError,\n onLoadStart,\n onCanPlay,\n onTimeUpdate,\n },\n ref\n ) => {\n // Get context for simplified stream sources\n const context = useVideoPlayerContext();\n\n // Resolve simplified stream source to full source using context\n const source = useMemo(() => {\n if (isSimpleStreamSource(rawSource)) {\n const resolved = resolveStreamSource(rawSource, context);\n if (!resolved) {\n // Return a special error source that will trigger error fallback\n return null;\n }\n return resolved;\n }\n return rawSource;\n }, [rawSource, context]);\n\n // Handle unresolved source\n if (!source) {\n // Render error state\n const errorMessage = 'Stream source requires VideoPlayerProvider with getStreamUrl and sessionId';\n\n if (typeof errorFallback === 'function') {\n return (\n <div className={className} style={{ aspectRatio: aspectRatio === 'fill' ? undefined : aspectRatio }}>\n {errorFallback({ error: errorMessage })}\n </div>\n );\n }\n\n if (errorFallback) {\n return (\n <div className={className} style={{ aspectRatio: aspectRatio === 'fill' ? undefined : aspectRatio }}>\n {errorFallback}\n </div>\n );\n }\n\n // Default error UI\n return (\n <div\n className={className}\n style={{\n aspectRatio: aspectRatio === 'fill' ? undefined : aspectRatio,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'black',\n color: 'white',\n }}\n >\n <p>{errorMessage}</p>\n </div>\n );\n }\n\n // Determine which provider to use\n const resolvedMode = resolvePlayerMode(source, mode);\n\n // Common props for all providers\n const commonProps = {\n aspectRatio,\n autoPlay,\n muted,\n loop,\n playsInline,\n controls,\n preload,\n className,\n onPlay,\n onPause,\n onEnded,\n onError,\n onLoadStart,\n onCanPlay,\n onTimeUpdate,\n };\n\n // Render appropriate provider\n switch (resolvedMode) {\n case 'vidstack':\n return (\n <VidstackProvider\n ref={ref}\n source={source as VidstackProviderProps['source']}\n theme={theme}\n showInfo={showInfo}\n errorFallback={errorFallback}\n {...commonProps}\n />\n );\n\n case 'streaming':\n return (\n <StreamProvider\n ref={ref}\n source={source as StreamProviderProps['source']}\n videoClassName={videoClassName}\n disableContextMenu={disableContextMenu}\n showPreloader={showPreloader}\n preloaderTimeout={preloaderTimeout}\n errorFallback={errorFallback}\n {...commonProps}\n />\n );\n\n case 'native':\n default:\n return (\n <NativeProvider\n ref={ref}\n source={source as NativeProviderProps['source']}\n videoClassName={videoClassName}\n disableContextMenu={disableContextMenu}\n showPreloader={showPreloader}\n preloaderTimeout={preloaderTimeout}\n {...commonProps}\n />\n );\n }\n }\n);\n\nVideoPlayer.displayName = 'VideoPlayer';\n","/**\n * Custom Video Controls for Vidstack Player\n */\n\n'use client';\n\nimport { Maximize, Minimize, Pause, Play, Volume2, VolumeX } from 'lucide-react';\nimport React from 'react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { useMediaRemote, useMediaStore } from '@vidstack/react';\n\nimport type { MediaPlayerInstance } from '@vidstack/react';\ninterface VideoControlsProps {\n player: React.RefObject<MediaPlayerInstance | null>;\n className?: string;\n}\n\nexport function VideoControls({ player, className }: VideoControlsProps) {\n const store = useMediaStore(player);\n const remote = useMediaRemote();\n\n const isPaused = store.paused;\n const isMuted = store.muted;\n const isFullscreen = store.fullscreen;\n const currentTime = store.currentTime;\n const duration = store.duration;\n const volume = store.volume;\n\n const formatTime = (seconds: number): string => {\n if (!seconds || seconds < 0) return '0:00';\n const minutes = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${minutes}:${secs.toString().padStart(2, '0')}`;\n };\n\n const handleProgressClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (!duration) return;\n const rect = e.currentTarget.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const percentage = clickX / rect.width;\n const newTime = percentage * duration;\n remote.seek(newTime);\n };\n\n const handleVolumeChange = (e: React.MouseEvent<HTMLDivElement>) => {\n const rect = e.currentTarget.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const percentage = Math.max(0, Math.min(1, clickX / rect.width));\n remote.changeVolume(percentage);\n if (percentage > 0 && isMuted) {\n remote.toggleMuted();\n }\n };\n\n const progress = duration > 0 ? (currentTime / duration) * 100 : 0;\n\n return (\n <div\n className={cn(\n \"absolute inset-0 flex flex-col justify-end transition-opacity duration-300\",\n \"bg-gradient-to-t from-black/80 via-black/20 to-transparent\",\n \"opacity-0 group-hover:opacity-100 focus-within:opacity-100\",\n \"pointer-events-none group-hover:pointer-events-auto\",\n className\n )}\n >\n {/* Progress Bar */}\n <div className=\"px-4 pb-2 pointer-events-auto\">\n <div\n className=\"h-1.5 bg-white/20 rounded-full cursor-pointer hover:h-2 transition-all group\"\n onClick={handleProgressClick}\n >\n <div\n className=\"h-full bg-primary rounded-full transition-all relative group-hover:bg-primary/90\"\n style={{ width: `${progress}%` }}\n >\n <div className=\"absolute right-0 top-1/2 -translate-y-1/2 w-3 h-3 bg-white rounded-full opacity-0 group-hover:opacity-100 transition-opacity\" />\n </div>\n </div>\n </div>\n\n {/* Control Bar */}\n <div className=\"flex items-center gap-4 px-4 pb-4 pointer-events-auto\">\n {/* Play/Pause */}\n <button\n onClick={() => remote.togglePaused()}\n className=\"text-white hover:text-primary transition-colors p-1.5 hover:bg-white/10 rounded-full\"\n >\n {isPaused ? <Play className=\"h-6 w-6\" /> : <Pause className=\"h-6 w-6\" />}\n </button>\n\n {/* Time */}\n <div className=\"text-white text-sm font-medium\">\n {formatTime(currentTime)} / {formatTime(duration)}\n </div>\n\n <div className=\"flex-1\" />\n\n {/* Volume Control */}\n <div className=\"flex items-center gap-2 group/volume\">\n <button\n onClick={() => remote.toggleMuted()}\n className=\"text-white hover:text-primary transition-colors p-1.5 hover:bg-white/10 rounded-full\"\n >\n {isMuted || volume === 0 ? (\n <VolumeX className=\"h-5 w-5\" />\n ) : (\n <Volume2 className=\"h-5 w-5\" />\n )}\n </button>\n\n <div\n className=\"w-0 group-hover/volume:w-20 transition-all overflow-hidden\"\n >\n <div\n className=\"h-1.5 bg-white/20 rounded-full cursor-pointer hover:h-2 transition-all\"\n onClick={handleVolumeChange}\n >\n <div\n className=\"h-full bg-white rounded-full transition-all\"\n style={{ width: `${volume * 100}%` }}\n />\n </div>\n </div>\n </div>\n\n {/* Fullscreen */}\n <button\n onClick={() => isFullscreen ? remote.exitFullscreen() : remote.enterFullscreen()}\n className=\"text-white hover:text-primary transition-colors p-1.5 hover:bg-white/10 rounded-full\"\n >\n {isFullscreen ? <Minimize className=\"h-5 w-5\" /> : <Maximize className=\"h-5 w-5\" />}\n </button>\n </div>\n </div>\n );\n}\n","/**\n * VideoErrorFallback - Pre-built error fallback with download button\n * For use with VideoPlayer errorFallback prop\n */\n\n'use client';\n\nimport React from 'react';\nimport { FileVideo, RefreshCw } from 'lucide-react';\n\nimport { cn, Button, DownloadButton } from '../../_shared';\n\nimport type { ErrorFallbackProps } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface VideoErrorFallbackProps extends ErrorFallbackProps {\n /** URL for download button (if provided, shows download button) */\n downloadUrl?: string;\n /** Filename for download */\n downloadFilename?: string;\n /** File size to display */\n fileSize?: string;\n /** Show retry button */\n showRetry?: boolean;\n /** Custom className */\n className?: string;\n /** Custom icon */\n icon?: React.ReactNode;\n /** Custom title (defaults to error message) */\n title?: string;\n /** Custom description */\n description?: string;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Pre-built error fallback component for VideoPlayer\n *\n * @example\n * // Basic usage\n * <VideoPlayer\n * source={source}\n * errorFallback={(props) => (\n * <VideoErrorFallback\n * {...props}\n * downloadUrl={getDownloadUrl()}\n * downloadFilename=\"video.mp4\"\n * />\n * )}\n * />\n *\n * @example\n * // With file size\n * <VideoErrorFallback\n * error=\"Failed to load video\"\n * downloadUrl=\"/api/download/video.mp4\"\n * fileSize=\"125 MB\"\n * showRetry\n * retry={() => reloadVideo()}\n * />\n */\nexport function VideoErrorFallback({\n error,\n retry,\n downloadUrl,\n downloadFilename,\n fileSize,\n showRetry = true,\n className,\n icon,\n title,\n description,\n}: VideoErrorFallbackProps) {\n const displayTitle = title || error || 'Video cannot be previewed';\n\n return (\n <div\n className={cn(\n 'absolute inset-0 flex flex-col items-center justify-center gap-4 bg-black/90 text-white p-6',\n className\n )}\n >\n {/* Icon */}\n {icon || <FileVideo className=\"w-16 h-16 text-muted-foreground\" />}\n\n {/* Title */}\n <p className=\"text-lg font-medium text-center\">{displayTitle}</p>\n\n {/* Description / File size */}\n {(description || fileSize) && (\n <p className=\"text-sm text-muted-foreground text-center\">\n {description || fileSize}\n </p>\n )}\n\n {/* Actions */}\n <div className=\"flex items-center gap-3 mt-2\">\n {/* Retry button */}\n {showRetry && retry && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={retry}\n className=\"gap-2\"\n >\n <RefreshCw className=\"w-4 h-4\" />\n Retry\n </Button>\n )}\n\n {/* Download button */}\n {downloadUrl && (\n <DownloadButton\n url={downloadUrl}\n filename={downloadFilename}\n variant=\"default\"\n size=\"sm\"\n >\n Download to view\n </DownloadButton>\n )}\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Factory for common use cases\n// ============================================================================\n\nexport interface CreateVideoErrorFallbackOptions {\n /** Function to get download URL from source */\n getDownloadUrl?: (source: unknown) => string | undefined;\n /** Function to get filename from source */\n getFilename?: (source: unknown) => string | undefined;\n /** Function to get file size from source */\n getFileSize?: (source: unknown) => string | undefined;\n /** Show retry button */\n showRetry?: boolean;\n}\n\n/**\n * Factory to create error fallback function for VideoPlayer\n *\n * @example\n * const errorFallback = createVideoErrorFallback({\n * getDownloadUrl: (source) => source.downloadUrl,\n * getFilename: (source) => source.filename,\n * showRetry: true,\n * });\n *\n * <VideoPlayer source={source} errorFallback={errorFallback} />\n */\nexport function createVideoErrorFallback(\n options: CreateVideoErrorFallbackOptions\n): (props: ErrorFallbackProps, source?: unknown) => React.ReactNode {\n return (props: ErrorFallbackProps, source?: unknown) => (\n <VideoErrorFallback\n {...props}\n downloadUrl={options.getDownloadUrl?.(source)}\n downloadFilename={options.getFilename?.(source)}\n fileSize={options.getFileSize?.(source)}\n showRetry={options.showRetry}\n />\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tools/JsonTree/index.tsx"],"names":["__name","useState","jsxs","jsx","Button","Fragment","ChevronUp","ChevronDown","CopyButton","Download","JSONTree"],"mappings":";;;;;;;;;AAyCA,IAAM,iBAAA,mBAAoBA,wBAAA,CAAA,CAAC,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,GAAS,EAAC,EAAG,aAAA,GAAgB,EAAC,EAAE,KAA8B;AAEtG,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,eAAyB,IAAI,CAAA;AAC/D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,CAAC,CAAA;AAG5C,EAAA,MAAM;AAAA,IACJ,kBAAA,GAAqB,CAAA;AAAA,IACrB,uBAAA,GAA0B,EAAA;AAAA,IAC1B,uBAAA,GAA0B,CAAA;AAAA,IAC1B,eAAA,GAAkB,GAAA;AAAA,IAClB,eAAA,GAAkB,EAAA;AAAA,IAClB,kBAAA,GAAqB,IAAA;AAAA,IACrB,kBAAA,GAAqB,IAAA;AAAA,IACrB,iBAAA,GAAoB,IAAA;AAAA,IACpB,SAAA,GAAY,EAAA;AAAA,IACZ,gBAAA,GAAmB;AAAA,GACrB,GAAI,MAAA;AAGJ,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB,MAAA,EAAQ,gBAAA;AAAA,IACR,MAAA,EAAQ,aAAA;AAAA;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA;AAAA,IACR,MAAA,EAAQ;AAAA;AAAA,GACV;AAGA,EAAA,MAAM,yBAAA,mBAA4BD,wBAAA,CAAA,CAAC,OAAA,EAAuC,QAAA,EAAmB,KAAA,KAAkB;AAE7G,IAAA,IAAI,SAAA,KAAc,MAAM,OAAO,IAAA;AAG/B,IAAA,IAAI,SAAA,KAAc,OAAO,OAAO,KAAA;AAIhC,IAAA,IAAI,KAAA,IAAS,oBAAoB,OAAO,IAAA;AAGxC,IAAA,IAAI,MAAM,OAAA,CAAQ,QAAQ,KAAK,QAAA,CAAS,MAAA,IAAU,yBAAyB,OAAO,IAAA;AAGlF,IAAA,IAAI,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACxE,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AACjC,MAAA,OAAO,KAAK,MAAA,IAAU,uBAAA;AAAA,IACxB;AAEA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,EArBkC,2BAAA,CAAA;AAwBlC,EAAA,MAAM,aAAA,GAAgB,kBAAA,GAClB,CAAC,QAAA,EAAkB,QAAA,KAAsB;AACvC,IAAA,IAAI,aAAa,OAAA,EAAS;AACxB,MAAA,MAAM,SAAS,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,SAAS,MAAA,GAAS,CAAA;AAC3D,MAAA,OAAO,MAAA,GAAS,CAAA,mBAAIE,eAAA,CAAC,MAAA,EAAA,EAAK,WAAU,+BAAA,EAAgC,QAAA,EAAA;AAAA,QAAA,GAAA;AAAA,QAAE,MAAA;AAAA,QAAO;AAAA,OAAA,EAAO,CAAA,GAAU,IAAA;AAAA,IAChG;AACA,IAAA,IAAI,aAAa,QAAA,EAAU;AACzB,MAAA,MAAM,IAAA,GAAO,YAAY,OAAO,QAAA,KAAa,WAAW,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,GAAI,EAAC;AACjF,MAAA,OAAO,KAAK,MAAA,GAAS,CAAA,mBAAIA,eAAA,CAAC,MAAA,EAAA,EAAK,WAAU,+BAAA,EAAgC,QAAA,EAAA;AAAA,QAAA,GAAA;AAAA,QAAE,IAAA,CAAK,MAAA;AAAA,QAAO;AAAA,OAAA,EAAM,CAAA,GAAU,IAAA;AAAA,IACzG;AACA,IAAA,OAAO,IAAA;AAAA,EACT,IACA,MAAM,IAAA;AAGV,EAAA,MAAM,gBAAA,6CAAoB,KAAA,KAAmB;AAE3C,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,SAAS,eAAA,EAAiB;AAC/D,MAAA,OAAO,KAAA,CAAM,SAAA,CAAU,CAAA,EAAG,eAAe,CAAA,GAAI,iBAAA;AAAA,IAC/C;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,EANyB,kBAAA,CAAA;AASzB,EAAA,MAAM,YAAA,6CAAgB,KAAA,KAAmB;AAEvC,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,KAAa,KAAA,CAAM,UAAA,CAAW,SAAS,CAAA,IAAK,KAAA,CAAM,UAAA,CAAW,UAAU,CAAA,CAAA,EAAI;AAC9F,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,EANqB,cAAA,CAAA;AASrB,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,MAAM,CAAC,CAAA;AAG/C,EAAA,MAAM,iCAAiBF,wBAAA,CAAA,MAAM;AAC3B,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,UAAU,CAAA,EAAG,EAAE,IAAA,EAAM,kBAAA,EAAoB,CAAA;AAChE,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,WAAA;AACb,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,IAAA,CAAA,CAAE,KAAA,EAAM;AACR,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,IAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,EACzB,CAAA,EAVuB,gBAAA,CAAA;AAYvB,EAAA,uBACEE,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,gEAAA,EAAmE,SAAS,CAAA,CAAA,EAExF,QAAA,EAAA;AAAA,IAAA,CAAA,KAAA,IAAS,kBAAA,IAAsB,sCAC/BC,cAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qDAAA,EACb,QAAA,kBAAAD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,oBACCC,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EAAyC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAAA,CAG7D,kBAAA,IAAsB,iBAAA,qBACtBD,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6BAAA,EAEZ,QAAA,EAAA;AAAA,QAAA,kBAAA,oBACCC,cAAA;AAAA,UAACC,iBAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,SAAA,KAAc,IAAA,GAAO,SAAA,GAAY,SAAA;AAAA,YAC1C,IAAA,EAAK,IAAA;AAAA,YACL,SAAS,MAAM;AACb,cAAA,MAAM,QAAA,GAAW,SAAA,KAAc,IAAA,GAAO,KAAA,GAAQ,IAAA;AAC9C,cAAA,YAAA,CAAa,QAAQ,CAAA;AACrB,cAAA,YAAA,CAAa,CAAA,IAAA,KAAQ,OAAO,CAAC,CAAA;AAAA,YAC/B,CAAA;AAAA,YACA,SAAA,EAAU,UAAA;AAAA,YAET,QAAA,EAAA,SAAA,KAAc,uBACbF,eAAA,CAAAG,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAAF,cAAA,CAACG,qBAAA,EAAA,EAAU,WAAU,SAAA,EAAU,CAAA;AAAA,8BAC/BH,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe,QAAA,EAAA,cAAA,EAAY;AAAA,aAAA,EAC7C,oBAEAD,eAAA,CAAAG,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAAF,cAAA,CAACI,uBAAA,EAAA,EAAY,WAAU,SAAA,EAAU,CAAA;AAAA,8BACjCJ,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe,QAAA,EAAA,YAAA,EAAU;AAAA,aAAA,EAC3C;AAAA;AAAA,SAEJ;AAAA,QAID,qCACCD,eAAA,CAAAG,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAF,cAAA;AAAA,YAACK,qBAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,UAAA;AAAA,cACP,OAAA,EAAQ,SAAA;AAAA,cACR,IAAA,EAAK,IAAA;AAAA,cACL,SAAA,EAAU,UAAA;AAAA,cACV,aAAA,EAAc,SAAA;AAAA,cACf,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACAN,eAAA;AAAA,YAACE,iBAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,SAAA;AAAA,cACR,IAAA,EAAK,IAAA;AAAA,cACL,OAAA,EAAS,cAAA;AAAA,cACT,SAAA,EAAU,UAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAD,cAAA,CAACM,oBAAA,EAAA,EAAS,WAAU,SAAA,EAAU,CAAA;AAAA,gCAC9BN,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,UAAA,EAAQ;AAAA;AAAA;AAAA;AAC1D,SAAA,EACF;AAAA,OAAA,EAEJ;AAAA,KAAA,EAEJ,CAAA,EACF,CAAA;AAAA,oBAIFA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,kBAAAA,cAAA;AAAA,MAACO,sBAAA;AAAA,MAAA;AAAA,QAEC,IAAA;AAAA,QACA,KAAA,EAAO,aAAA;AAAA,QACP,WAAA,EAAa,KAAA;AAAA,QACb,QAAA,EAAU,IAAA;AAAA,QACV,yBAAA;AAAA,QACA,aAAA;AAAA,QACA,gBAAA;AAAA,QACA,YAAA;AAAA,QACA,eAAA;AAAA,QACA,gBAAgB,CAAC,gBAAA;AAAA,QAChB,GAAG;AAAA,OAAA;AAAA,MAXC;AAAA,KAYP,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA,EAvM0B,mBAAA,CAAA;AAyM1B,IAAO,gBAAA,GAAQ","file":"chunk-5QT3QYFZ.cjs","sourcesContent":["'use client';\n\nimport { ChevronDown, ChevronUp, Download } from 'lucide-react';\nimport React, { useState } from 'react';\nimport { CommonExternalProps, JSONTree } from 'react-json-tree';\n\nimport { Button, CopyButton } from '@djangocfg/ui-core/components';\n\nexport type { Language } from 'prism-react-renderer';\n\nexport interface JsonTreeConfig {\n /** Maximum depth to expand automatically (default: 2) */\n maxAutoExpandDepth?: number;\n /** Maximum items in array to auto-expand (default: 10) */\n maxAutoExpandArrayItems?: number;\n /** Maximum object keys to auto-expand (default: 5) */\n maxAutoExpandObjectKeys?: number;\n /** Maximum string length before truncation (default: 200) */\n maxStringLength?: number;\n /** Collection limit for performance (default: 50) */\n collectionLimit?: number;\n /** Whether to show collection info (array length, object keys count) */\n showCollectionInfo?: boolean;\n /** Whether to show expand/collapse all buttons */\n showExpandControls?: boolean;\n /** Whether to show copy/download buttons */\n showActionButtons?: boolean;\n /** Custom CSS classes for the container */\n className?: string;\n /** Whether to preserve object key order (default: true) */\n preserveKeyOrder?: boolean;\n}\n\ninterface JsonTreeComponentProps {\n title?: string;\n data: unknown;\n config?: JsonTreeConfig;\n /** Override for react-json-tree props */\n jsonTreeProps?: Partial<CommonExternalProps>;\n}\n\nconst JsonTreeComponent = ({ title, data, config = {}, jsonTreeProps = {} }: JsonTreeComponentProps) => {\n // State for expand/collapse all\n const [expandAll, setExpandAll] = useState<boolean | null>(null);\n const [renderKey, setRenderKey] = useState(0);\n \n // Default configuration\n const {\n maxAutoExpandDepth = 2,\n maxAutoExpandArrayItems = 10,\n maxAutoExpandObjectKeys = 5,\n maxStringLength = 200,\n collectionLimit = 50,\n showCollectionInfo = true,\n showExpandControls = true,\n showActionButtons = true,\n className = '',\n preserveKeyOrder = true,\n } = config;\n \n // JSON Tree theme optimized for dark theme\n const jsonTreeTheme = {\n scheme: 'djangocfg-dark',\n base00: 'transparent', // Background\n base01: '#1a1a1a', // Lighter background\n base02: '#2a2a2a', // Selection background\n base03: '#6b7280', // Comments, invisibles\n base04: '#9ca3af', // Dark foreground\n base05: '#e5e7eb', // Default foreground\n base06: '#f3f4f6', // Light foreground\n base07: '#ffffff', // Lightest foreground\n base08: '#ef4444', // Red - for null, undefined\n base09: '#f97316', // Orange - for numbers\n base0A: '#eab308', // Yellow - for strings\n base0B: '#22c55e', // Green - for booleans (true)\n base0C: '#06b6d4', // Cyan - for dates, regex\n base0D: '#3b82f6', // Blue - for keys\n base0E: '#a855f7', // Purple - for functions\n base0F: '#f43f5e', // Pink - for deprecations\n };\n\n // Smart expansion logic\n const shouldExpandNodeInitially = (keyPath: readonly (string | number)[], nodeData: unknown, level: number) => {\n // If user explicitly clicked \"Expand All\", expand everything\n if (expandAll === true) return true;\n\n // If user explicitly clicked \"Collapse All\", collapse everything\n if (expandAll === false) return false;\n\n // Default auto-expansion (expandAll === null)\n // Always expand up to maxAutoExpandDepth\n if (level <= maxAutoExpandDepth) return true;\n\n // For arrays, expand if they have less than maxAutoExpandArrayItems\n if (Array.isArray(nodeData) && nodeData.length <= maxAutoExpandArrayItems) return true;\n\n // For objects, expand if they have less than maxAutoExpandObjectKeys\n if (nodeData && typeof nodeData === 'object' && !Array.isArray(nodeData)) {\n const keys = Object.keys(nodeData);\n return keys.length <= maxAutoExpandObjectKeys;\n }\n\n return false;\n };\n\n // Collection info display\n const getItemString = showCollectionInfo \n ? (nodeType: string, nodeData: unknown) => {\n if (nodeType === 'Array') {\n const length = Array.isArray(nodeData) ? nodeData.length : 0;\n return length > 0 ? <span className=\"text-muted-foreground text-sm\">({length} items)</span> : null;\n }\n if (nodeType === 'Object') {\n const keys = nodeData && typeof nodeData === 'object' ? Object.keys(nodeData) : [];\n return keys.length > 0 ? <span className=\"text-muted-foreground text-sm\">({keys.length} keys)</span> : null;\n }\n return null;\n }\n : () => null;\n\n // Value processing for better display\n const postprocessValue = (value: unknown) => {\n // Truncate very long strings\n if (typeof value === 'string' && value.length > maxStringLength) {\n return value.substring(0, maxStringLength) + '... (truncated)';\n }\n return value;\n };\n\n // Custom node detection for special formatting\n const isCustomNode = (value: unknown) => {\n // Mark URLs as custom nodes for special styling\n if (typeof value === 'string' && (value.startsWith('http://') || value.startsWith('https://'))) {\n return true;\n }\n return false;\n };\n\n // JSON string for copy/download\n const jsonString = JSON.stringify(data, null, 2);\n\n // Action handlers\n const handleDownload = () => {\n const blob = new Blob([jsonString], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'data.json';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n };\n\n return (\n <div className={`relative border border-border rounded-sm h-full overflow-hidden ${className}`}>\n {/* Header with title and controls */}\n {(title || showExpandControls || showActionButtons) && (\n <div className=\"p-4 border-b border-border bg-muted/50 rounded-t-sm\">\n <div className=\"flex items-center justify-between\">\n {title && (\n <h6 className=\"text-lg font-semibold text-foreground\">{title}</h6>\n )}\n \n {(showExpandControls || showActionButtons) && (\n <div className=\"flex items-center space-x-2\">\n {/* Expand/Collapse Controls */}\n {showExpandControls && (\n <Button\n variant={expandAll === true ? \"default\" : \"outline\"}\n size=\"sm\"\n onClick={() => {\n const newState = expandAll === true ? false : true;\n setExpandAll(newState);\n setRenderKey(prev => prev + 1);\n }}\n className=\"h-8 px-2\"\n >\n {expandAll === true ? (\n <>\n <ChevronUp className=\"h-3 w-3\" />\n <span className=\"ml-1 text-xs\">Collapse All</span>\n </>\n ) : (\n <>\n <ChevronDown className=\"h-3 w-3\" />\n <span className=\"ml-1 text-xs\">Expand All</span>\n </>\n )}\n </Button>\n )}\n \n {/* Action Buttons */}\n {showActionButtons && (\n <>\n <CopyButton\n value={jsonString}\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 px-2\"\n iconClassName=\"h-3 w-3\"\n >\n Copy\n </CopyButton>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleDownload}\n className=\"h-8 px-2\"\n >\n <Download className=\"h-3 w-3\" />\n <span className=\"ml-1 text-xs hidden sm:inline\">Download</span>\n </Button>\n </>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* JSON Tree Content */}\n <div className=\"h-full overflow-auto p-4\">\n <JSONTree\n key={renderKey} // Force re-render when expand/collapse state changes\n data={data}\n theme={jsonTreeTheme}\n invertTheme={false}\n hideRoot={true}\n shouldExpandNodeInitially={shouldExpandNodeInitially}\n getItemString={getItemString}\n postprocessValue={postprocessValue}\n isCustomNode={isCustomNode}\n collectionLimit={collectionLimit}\n sortObjectKeys={!preserveKeyOrder}\n {...jsonTreeProps}\n />\n </div>\n </div>\n );\n};\n\nexport default JsonTreeComponent; "]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tools/PrettyCode/index.tsx","../src/tools/OpenapiViewer/utils/apiKeyManager.ts","../src/tools/OpenapiViewer/utils/versionManager.ts","../src/tools/OpenapiViewer/constants.ts","../src/tools/OpenapiViewer/utils/formatters.ts","../src/tools/OpenapiViewer/context/PlaygroundContext.tsx"],"names":["lazy","__name","jsx","jsxs","Suspense","createContext","useContext","useState","React","useEffect","consola","useCallback"],"mappings":";;;;;;;;;;;;AAaA,IAAM,gBAAA,GAAmBA,WAAA,CAAK,MAAM,OAAO,kCAAqB,CAAC,CAAA;AAGjE,IAAM,eAAA,mBAAkBC,wBAAA,CAAA,sBACtBC,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oFAAA,EACb,QAAA,kBAAAA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EACb,QAAA,kBAAAC,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,kBAAAD,cAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2DAAA,EAA4D,CAAA;AAAA,kBAC3EA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,iBAAA,EAAe;AAAA,CAAA,EACjE,CAAA,EACF,GACF,CAAA,EARsB,iBAAA,CAAA;AAqBxB,IAAM,UAAA,6CAAyC,KAAA,KAAU;AACvD,EAAA,uBACEA,cAAA,CAACE,eAAA,EAAA,EAAS,QAAA,kBAAUF,cAAA,CAAC,eAAA,EAAA,EAAgB,GACnC,QAAA,kBAAAA,cAAA,CAAC,gBAAA,EAAA,EAAkB,GAAG,KAAA,EAAO,CAAA,EAC/B,CAAA;AAEJ,CAAA,EAN8C,YAAA,CAAA;AAQ9C,IAAO,kBAAA,GAAQ;;;ACsCR,SAAS,cAAA,CAAe,SAAmB,KAAA,EAA8B;AAC9E,EAAA,OAAO,QAAQ,IAAA,CAAK,CAAC,QAAQ,GAAA,CAAI,EAAA,KAAO,KAAK,CAAA,IAAK,IAAA;AACpD;AAFgBD,wBAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;;;ACpET,IAAM,YAAA,GAA6B;AAAA,EACxC;AAAA,IACE,EAAA,EAAI,IAAA;AAAA,IACJ,IAAA,EAAM,IAAA;AAAA,IACN,WAAA,EAAa,wBAAA;AAAA,IACb,SAAA,EAAW;AAAA;AAEf;AAKO,IAAM,qBAAA,6CAAyB,IAAA,KAAyB;AAE7D,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,wBAAwB,CAAA;AACxD,EAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,CAAC,CAAA,EAAG;AACnC,IAAA,OAAO,aAAa,CAAC,CAAA;AAAA,EACvB;AAGA,EAAA,OAAO,IAAA;AACT,CAAA,EATqC,uBAAA,CAAA;AAc9B,IAAM,mBAAA,mBAAsBA,wBAAA,CAAA,CAAC,QAAA,EAAuB,OAAA,KAA6B;AACtF,EAAA,MAAM,eAAA,GAAkB,qBAAA,CAAsB,QAAA,CAAS,IAAI,CAAA;AAC3D,EAAA,OAAO,eAAA,KAAoB,OAAA;AAC7B,CAAA,EAHmC,qBAAA,CAAA;AAQ5B,IAAM,wBAAA,mBAA2BA,wBAAA,CAAA,CAAC,SAAA,EAA0B,OAAA,KAAmC;AACpG,EAAA,OAAO,UAAU,MAAA,CAAO,CAAA,QAAA,KAAY,mBAAA,CAAoB,QAAA,EAAU,OAAO,CAAC,CAAA;AAC5E,CAAA,EAFwC,0BAAA,CAAA;AAQjC,IAAM,oBAAA,mBAAuBA,wBAAA,CAAA,CAAC,SAAA,EAA0B,gBAAA,KAA4C;AACzG,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAyB;AAGjD,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAA2B;AAExD,EAAA,SAAA,CAAU,QAAQ,CAAA,QAAA,KAAY;AAC5B,IAAA,MAAM,cAAA,GAAiB,qBAAA,CAAsB,QAAA,CAAS,IAAI,CAAA;AAC1D,IAAA,IAAI,CAAC,gBAAA,CAAiB,GAAA,CAAI,cAAc,CAAA,EAAG;AACzC,MAAA,gBAAA,CAAiB,GAAA,CAAI,cAAA,EAAgB,EAAE,CAAA;AAAA,IACzC;AACA,IAAA,gBAAA,CAAiB,GAAA,CAAI,cAAc,CAAA,CAAG,IAAA,CAAK,QAAQ,CAAA;AAAA,EACrD,CAAC,CAAA;AAGD,EAAA,gBAAA,CAAiB,OAAA,CAAQ,CAAC,aAAA,EAAe,cAAA,KAAmB;AAC1D,IAAA,IAAI,gBAAA,GAAuC,IAAA;AAG3C,IAAA,MAAM,kBAAkB,aAAA,CAAc,IAAA,CAAK,QAAM,mBAAA,CAAoB,EAAA,EAAI,gBAAgB,CAAC,CAAA;AAC1F,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,gBAAA,GAAmB,eAAA;AAAA,IACrB,CAAA,MAAA,IAAW,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG;AAEnC,MAAA,gBAAA,GAAmB,aAAA,CAAc,CAAC,CAAA,IAAK,IAAA;AAAA,IACzC;AAEA,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,WAAA,CAAY,GAAA,CAAI,gBAAgB,gBAAgB,CAAA;AAAA,IAClD;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,CAAA;AACxC,CAAA,EAjCoC,sBAAA;AAwC7B,IAAM,qBAAA,6CAAyB,IAAA,KAAyB;AAE7D,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,GAAG,CAAA;AACrC,CAAA,EAHqC,uBAAA,CAAA;AA8B9B,IAAM,cAAA,6CAAkB,SAAA,KAA8C;AAC3E,EAAA,OAAO,YAAA,CAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,SAAS,CAAA;AAClD,CAAA,EAF8B,gBAAA;AAOvB,IAAM,oCAAoBA,wBAAA,CAAA,MAAkB;AACjD,EAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,SAAS,CAAA;AACzD,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,OAAO,cAAA;AAAA,EACT;AAGA,EAAA,IAAI,YAAA,CAAa,MAAA,GAAS,CAAA,IAAK,YAAA,CAAa,CAAC,CAAA,EAAG;AAC9C,IAAA,OAAO,aAAa,CAAC,CAAA;AAAA,EACvB;AAGA,EAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAC3C,CAAA,EAbiC,mBAAA,CAAA;AAkB1B,IAAM,eAAA,6CAAmB,SAAA,KAAqD;AACnF,EAAA,MAAM,QAAgC,EAAC;AAEvC,EAAA,YAAA,CAAa,QAAQ,CAAA,OAAA,KAAW;AAC9B,IAAA,KAAA,CAAM,QAAQ,EAAE,CAAA,GAAI,yBAAyB,SAAA,EAAW,OAAA,CAAQ,EAAE,CAAA,CAAE,MAAA;AAAA,EACtE,CAAC,CAAA;AAED,EAAA,OAAO,KAAA;AACT,CAAA,EAR+B,iBAAA;;;ACvJxB,IAAM,kBAAA,GAAqB;AAAA,EAChC,GAAA,EAAK,SAAA;AAAA,EACL,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK,SAAA;AAAA,EACL,MAAA,EAAQ,OAAA;AAAA,EACR,KAAA,EAAO;AACT,CAAA;AAGO,IAAM,kBAAA,GAAqB;AAAA,EAChC,GAAA,EAAK,SAAA;AAAA,EACL,GAAA,EAAK,SAAA;AAAA,EACL,GAAA,EAAK,SAAA;AAAA,EACL,GAAA,EAAK;AACP,CAAA;;;ACZO,IAAM,cAAA,6CACX,MAAA,KAC4D;AAC5D,EAAA,OAAO,kBAAA,CAAmB,MAAA,CAAO,WAAA,EAAgD,CAAA,IAAK,SAAA;AACxF,CAAA,EAJ8B,gBAAA;AAMvB,IAAM,cAAA,6CACX,MAAA,KACgD;AAChD,EAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,GAAG,EAAE,QAAA,EAAS;AACrD,EAAA,OAAO,kBAAA,CAAmB,UAA6C,CAAA,IAAK,SAAA;AAC9E,CAAA,EAL8B,gBAAA;AAYvB,IAAM,WAAA,6CAAe,GAAA,KAAyB;AACnD,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,KAAA;AAC5C,EAAA,IAAI;AACF,IAAA,IAAA,CAAK,MAAM,GAAG,CAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA,EAR2B,aAAA;AAcpB,IAAM,mBAAA,6CAAuB,aAAA,KAAkD;AACpF,EAAA,IAAI,CAAC,aAAA,IAAiB,OAAO,aAAA,KAAkB,QAAA,EAAU;AACvD,IAAA,OAAO,EAAE,gBAAgB,kBAAA,EAAmB;AAAA,EAC9C;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA;AACvC,IAAA,OAAO,OAAO,WAAW,QAAA,IAAY,MAAA,KAAW,OAAO,MAAA,GAAS,EAAE,gBAAgB,kBAAA,EAAmB;AAAA,EACvG,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,gBAAgB,kBAAA,EAAmB;AAAA,EAC9C;AACF,CAAA,EAXmC,qBAAA;AAc5B,IAAM,uBAAA,mBAA0BA,wBAAA,CAAA,CACrC,GAAA,EACA,UAAA,KACW;AACX,EAAA,IAAI,cAAA,GAAiB,GAAA;AAErB,EAAA,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACnD,IAAA,IAAI,KAAA,IAAS,KAAA,CAAM,IAAA,EAAK,KAAM,EAAA,EAAI;AAEhC,MAAA,MAAM,QAAA,GAAW;AAAA,QACf,IAAI,MAAA,CAAO,CAAA,GAAA,EAAM,GAAG,OAAO,GAAG,CAAA;AAAA,QAC9B,IAAI,MAAA,CAAO,CAAA,GAAA,EAAM,GAAG,OAAO,IAAI;AAAA,OACjC;AAEA,MAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC5B,QAAA,cAAA,GAAiB,cAAA,CAAe,OAAA,CAAQ,OAAA,EAAS,kBAAA,CAAmB,KAAK,CAAC,CAAA;AAAA,MAC5E,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,cAAA;AACT,CAAA,EArBuC,yBAAA,CAAA;ACnCvC,IAAM,qCAAqBA,wBAAA,CAAA,OAAwB;AAAA;AAAA,EAEjD,WAAA,EAAa,WAAA;AAAA,EACb,KAAA,EAAO,CAAC,WAAA,EAAa,SAAA,EAAW,UAAU,CAAA;AAAA;AAAA,EAG1C,gBAAA,EAAkB,IAAA;AAAA,EAClB,gBAAA,EAAkB,KAAA;AAAA,EAClB,UAAA,EAAY,EAAA;AAAA,EACZ,eAAA,EAAiB,mBAAkB,CAAE,EAAA;AAAA;AAAA,EAGrC,UAAA,EAAY,EAAA;AAAA,EACZ,aAAA,EAAe,KAAA;AAAA,EACf,cAAA,EAAgB,4CAAA;AAAA,EAChB,WAAA,EAAa,EAAA;AAAA,EACb,cAAA,EAAgB,IAAA;AAAA,EAChB,cAAA,EAAgB,EAAA;AAAA,EAChB,YAAY,EAAC;AAAA;AAAA,EAGb,QAAA,EAAU,IAAA;AAAA,EACV,OAAA,EAAS,KAAA;AAAA;AAAA,EAGT,WAAA,EAAa;AACf,CAAA,CAAA,EA1B2B,oBAAA,CAAA;AA4B3B,IAAM,iBAAA,GAAoBI,qBAAiD,MAAS,CAAA;AAE7E,IAAM,uCAAuBJ,wBAAA,CAAA,MAAM;AACxC,EAAA,MAAM,OAAA,GAAUK,kBAAW,iBAAiB,CAAA;AAC5C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,+DAA+D,CAAA;AAAA,EACjF;AACA,EAAA,OAAO,OAAA;AACT,CAAA,EANoC,sBAAA;AAa7B,IAAM,kBAAA,mBAAwDL,wBAAA,CAAA,CAAC,EAAE,QAAA,EAAU,QAAO,KAAM;AAC7F,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAIM,eAAA,CAA0B,MAAM,oBAAoB,CAAA;AAK9E,EAAA,MAAM,UAAUC,uBAAAA,CAAM,OAAA,CAAQ,MAAM,EAAC,EAAG,EAAE,CAAA;AAC1C,EAAA,MAAM,gBAAA,GAAmB,KAAA;AAEzB,EAAA,MAAM,WAAA,6CAAe,OAAA,KAAsC;AACzD,IAAA,QAAA,CAAS,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,GAAG,SAAQ,CAAE,CAAA;AAAA,EAC9C,CAAA,EAFoB,aAAA,CAAA;AAKpB,EAAAC,gBAAA,CAAU,MAAM;AACd,IAAA,IAAyB,OAAA,CAAQ,SAAS,CAAA,IAAK,CAAC,MAAM,cAAA,EAAgB;AACpE,MAAA,WAAA,CAAY,EAAE,cAAA,EAAgB,OAAA,CAAQ,CAAC,CAAA,EAAG,EAAA,IAAM,MAAM,CAAA;AAAA,IACxD;AAAA,EACF,GAAG,CAAC,OAAA,EAAS,gBAAA,EAAkB,KAAA,CAAM,cAAc,CAAC,CAAA;AAGpD,EAAAA,gBAAA,CAAU,MAAM;AACd,IAAA,IAAI;AACF,MAAA,QAAA,CAAS,CAAA,IAAA,KAAQ;AACf,QAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,IAAA,CAAK,cAAc,CAAA;AACvD,QAAA,IAAI,UAAA,GAAa,KAAA;AAEjB,QAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,UAAA,MAAM,SAAS,OAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,KAAK,cAAc,CAAA;AAE7D,UAAA,IAAI,MAAA,EAAQ;AAEV,YAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,KAAM,MAAA,CAAO,EAAA,EAAI;AACtC,cAAA,OAAA,CAAQ,WAAW,IAAI,MAAA,CAAO,EAAA;AAC9B,cAAA,UAAA,GAAa,IAAA;AAAA,YACf;AAAA,UACF,CAAA,MAAO;AAEL,YAAA,OAAO,EAAE,GAAG,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAK;AAAA,UACzC;AAAA,QACF,CAAA,MAAO;AAEL,UAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,YAAA,OAAO,QAAQ,WAAW,CAAA;AAC1B,YAAA,UAAA,GAAa,IAAA;AAAA,UACf;AAAA,QACF;AAGA,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,MAAM,CAAC,CAAA;AACtD,UAAA,OAAO,EAAE,GAAG,IAAA,EAAM,cAAA,EAAgB,cAAA,EAAe;AAAA,QACnD;AAEA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAAC,wBAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAAA,IAChD;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,CAAM,cAAA,EAAgB,OAAO,CAAC,CAAA;AAGlC,EAAAD,gBAAA,CAAU,MAAM;AACd,IAAA,IAAI,KAAA,CAAM,gBAAA,IAAoB,KAAA,CAAM,UAAA,EAAY;AAE9C,MAAA,MAAM,aAAa,uBAAA,CAAwB,KAAA,CAAM,gBAAA,CAAiB,IAAA,EAAM,MAAM,UAAU,CAAA;AAGxF,MAAA,IAAI,UAAA,KAAe,MAAM,UAAA,EAAY;AACnC,QAAA,WAAA,CAAY,EAAE,UAAA,EAAY,UAAA,EAAY,CAAA;AAAA,MACxC;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,CAAM,UAAA,EAAY,MAAM,gBAAA,EAAkB,KAAA,CAAM,UAAU,CAAC,CAAA;AAG/D,EAAA,MAAM,cAAA,6CAAkB,IAAA,KAAyB;AAC/C,IAAA,WAAA,CAAY,EAAE,WAAA,EAAa,IAAA,EAAM,CAAA;AAAA,EACnC,CAAA,EAFuB,gBAAA,CAAA;AAIvB,EAAA,MAAM,+BAAeR,wBAAA,CAAA,MAAM;AACzB,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,MAAM,WAAW,CAAA;AAC1D,IAAA,IAAI,YAAA,GAAe,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACzC,MAAA,WAAA,CAAY,EAAE,WAAA,EAAa,KAAA,CAAM,MAAM,YAAA,GAAe,CAAC,GAAG,CAAA;AAAA,IAC5D;AAAA,EACF,CAAA,EALqB,cAAA,CAAA;AAOrB,EAAA,MAAM,mCAAmBA,wBAAA,CAAA,MAAM;AAC7B,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,MAAM,WAAW,CAAA;AAC1D,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA,WAAA,CAAY,EAAE,WAAA,EAAa,KAAA,CAAM,MAAM,YAAA,GAAe,CAAC,GAAG,CAAA;AAAA,IAC5D;AAAA,EACF,CAAA,EALyB,kBAAA,CAAA;AAQzB,EAAA,MAAM,mBAAA,6CAAuB,QAAA,KAAiC;AAC5D,IAAA,IAAI,QAAA,EAAU;AAGZ,MAAA,WAAA,CAAY;AAAA,QACV,gBAAA,EAAkB,QAAA;AAAA,QAClB,aAAA,EAAe,KAAA;AAAA,QACf,YAAY,QAAA,CAAS,IAAA;AAAA,QACrB,YAAY,EAAC;AAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,WAAA,CAAY,EAAE,gBAAA,EAAkB,QAAA,EAAU,CAAA;AAAA,IAC5C;AAAA,EACF,CAAA,EAd4B,qBAAA,CAAA;AAgB5B,EAAA,MAAM,mBAAA,6CAAuB,QAAA,KAAqB;AAChD,IAAA,WAAA,CAAY,EAAE,gBAAA,EAAkB,QAAA,EAAU,CAAA;AAAA,EAC5C,CAAA,EAF4B,qBAAA,CAAA;AAI5B,EAAA,MAAM,aAAA,6CAAiB,IAAA,KAAiB;AACtC,IAAA,WAAA,CAAY,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA;AAAA,EAClC,CAAA,EAFsB,eAAA,CAAA;AAItB,EAAA,MAAM,kBAAA,6CAAsB,OAAA,KAAoB;AAC9C,IAAA,WAAA,CAAY,EAAE,eAAA,EAAiB,OAAA,EAAS,CAAA;AAAA,EAC1C,CAAA,EAF2B,oBAAA,CAAA;AAK3B,EAAA,MAAM,aAAA,6CAAiB,GAAA,KAAgB;AACrC,IAAA,WAAA,CAAY,EAAE,UAAA,EAAY,GAAA,EAAK,CAAA;AAAA,EACjC,CAAA,EAFsB,eAAA,CAAA;AAItB,EAAA,MAAM,gBAAA,6CAAoB,MAAA,KAAmB;AAC3C,IAAA,WAAA,CAAY,EAAE,aAAA,EAAe,MAAA,EAAQ,CAAA;AAAA,EACvC,CAAA,EAFyB,kBAAA,CAAA;AAIzB,EAAA,MAAM,iBAAA,6CAAqB,OAAA,KAAoB;AAC7C,IAAA,WAAA,CAAY,EAAE,cAAA,EAAgB,OAAA,EAAS,CAAA;AAAA,EACzC,CAAA,EAF0B,mBAAA,CAAA;AAI1B,EAAA,MAAM,cAAA,6CAAkB,IAAA,KAAiB;AACvC,IAAA,WAAA,CAAY,EAAE,WAAA,EAAa,IAAA,EAAM,CAAA;AAAA,EACnC,CAAA,EAFuB,gBAAA,CAAA;AAIvB,EAAA,MAAM,iBAAA,6CAAqB,QAAA,KAA4B;AACrD,IAAA,WAAA,CAAY,EAAE,cAAA,EAAgB,QAAA,EAAU,CAAA;AAAA,EAC1C,CAAA,EAF0B,mBAAA,CAAA;AAI1B,EAAA,MAAM,iBAAA,6CAAqB,cAAA,KAA2B;AACpD,IAAA,WAAA,CAAY,EAAE,gBAAgB,CAAA;AAAA,EAChC,CAAA,EAF0B,mBAAA,CAAA;AAI1B,EAAA,MAAM,aAAA,6CAAiB,UAAA,KAAuC;AAC5D,IAAA,WAAA,CAAY,EAAE,YAAY,CAAA;AAAA,EAC5B,CAAA,EAFsB,eAAA,CAAA;AAKtB,EAAA,MAAM,WAAA,6CAAe,QAAA,KAAiC;AACpD,IAAA,WAAA,CAAY,EAAE,UAAU,CAAA;AAAA,EAC1B,CAAA,EAFoB,aAAA,CAAA;AAIpB,EAAA,MAAM,UAAA,6CAAc,OAAA,KAAqB;AACvC,IAAA,WAAA,CAAY,EAAE,SAAS,CAAA;AAAA,EACzB,CAAA,EAFmB,YAAA,CAAA;AAKnB,EAAA,MAAM,cAAA,6CAAkB,WAAA,KAAyB;AAC/C,IAAA,WAAA,CAAY,EAAE,aAAa,CAAA;AAAA,EAC7B,CAAA,EAFuB,gBAAA,CAAA;AAKvB,EAAA,MAAM,QAAA,GAAWU,mBAAY,MAAM;AACjC,IAAA,QAAA,CAAS,oBAAoB,CAAA;AAAA,EAC/B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAcA,mBAAY,YAAY;AAC1C,IAAA,IAAI,CAAC,MAAM,UAAA,EAAY;AACrB,MAAAD,wBAAA,CAAQ,MAAM,iBAAiB,CAAA;AAC/B,MAAA;AAAA,IACF;AAEA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,WAAA,CAAY,IAAI,CAAA;AAEhB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,KAAA,CAAM,cAAc,CAAA;AAGxD,MAAA,IAAI,WAAA,GAA6B,IAAA;AAEjC,MAAA,IAAI,MAAM,cAAA,EAAgB;AAExB,QAAA,WAAA,GAAc,KAAA,CAAM,cAAA;AAAA,MACtB,CAAA,MAAO;AAEL,QAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,UAAA,WAAA,GAAc,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,YAAY,CAAA;AAAA,QACxD;AAAA,MACF;AAEA,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,WAAW,CAAA,CAAA;AAAA,MAClD;AAEA,MAAA,MAAM,cAAA,GAA8B;AAAA,QAClC,QAAQ,KAAA,CAAM,aAAA;AAAA,QACd;AAAA,OACF;AAEA,MAAA,IAAI,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,aAAA,KAAkB,KAAA,EAAO;AACtD,QAAA,cAAA,CAAe,OAAO,KAAA,CAAM,WAAA;AAAA,MAC9B;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,KAAA,CAAM,YAAY,cAAc,CAAA;AAC7D,MAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA,EAAK;AAEzC,MAAA,IAAI,YAAA;AACJ,MAAA,IAAI;AACF,QAAA,YAAA,GAAe,IAAA,CAAK,MAAM,YAAY,CAAA;AAAA,MACxC,CAAA,CAAA,MAAQ;AACN,QAAA,YAAA,GAAe,YAAA;AAAA,MACjB;AAEA,MAAA,WAAA,CAAY;AAAA,QACV,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,YAAY,QAAA,CAAS,UAAA;AAAA,QACrB,SAAS,MAAA,CAAO,WAAA,CAAY,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA;AAAA,QACtD,IAAA,EAAM;AAAA,OACP,CAAA;AAED,MAAAA,wBAAA,CAAQ,QAAQ,CAAA,oBAAA,EAAuB,KAAA,CAAM,aAAa,CAAA,CAAA,EAAI,KAAA,CAAM,UAAU,CAAA,CAAE,CAAA;AAGhF,MAAA,WAAA,CAAY,EAAE,WAAA,EAAa,UAAA,EAAY,CAAA;AAAA,IACzC,SAAS,KAAA,EAAO;AACd,MAAAA,wBAAA,CAAQ,KAAA,CAAM,mBAAmB,KAAK,CAAA;AACtC,MAAA,WAAA,CAAY;AAAA,QACV,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OACjD,CAAA;AAAA,IACH,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,UAAA,EAAY,WAAW,CAAC,CAAA;AAEnC,EAAA,MAAM,YAAA,GAAsC;AAAA;AAAA,IAE1C,KAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA,EAAgB,gBAAA;AAAA;AAAA,IAGhB,cAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA;AAAA;AAAA,IAGA,mBAAA;AAAA,IACA,mBAAA;AAAA,IACA,aAAA;AAAA,IACA,kBAAA;AAAA;AAAA,IAGA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,iBAAA;AAAA,IACA,cAAA;AAAA,IACA,iBAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA;AAAA,IAGA,WAAA;AAAA,IACA,UAAA;AAAA;AAAA,IAGA,cAAA;AAAA;AAAA,IAGA,QAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBAAOR,cAAAA,CAAC,iBAAA,CAAkB,UAAlB,EAA2B,KAAA,EAAO,cAAe,QAAA,EAAS,CAAA;AACpE,CAAA,EAvRqE,oBAAA","file":"chunk-DI3HUXHK.cjs","sourcesContent":["/**\n * PrettyCode Component - Dynamic Import Wrapper\n *\n * Lazy loads the heavy Prism library (~500KB) only when needed.\n * This significantly reduces the initial bundle size.\n */\n\n'use client';\n\nimport React, { lazy, Suspense } from 'react';\nimport type { Language } from 'prism-react-renderer';\n\n// Lazy load the client component\nconst PrettyCodeClient = lazy(() => import('./PrettyCode.client'));\n\n// Loading fallback component\nconst LoadingFallback = () => (\n <div className=\"relative rounded-sm border border-border overflow-hidden bg-muted dark:bg-zinc-900\">\n <div className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"animate-pulse h-4 w-4 rounded-full bg-muted-foreground/20\"></div>\n <span className=\"text-xs text-muted-foreground\">Loading code...</span>\n </div>\n </div>\n </div>\n);\n\ninterface PrettyCodeProps {\n data: string | object;\n language: Language;\n className?: string;\n mode?: 'dark' | 'light';\n inline?: boolean;\n customBg?: string;\n isCompact?: boolean;\n}\n\nconst PrettyCode: React.FC<PrettyCodeProps> = (props) => {\n return (\n <Suspense fallback={<LoadingFallback />}>\n <PrettyCodeClient {...props} />\n </Suspense>\n );\n};\n\nexport default PrettyCode;\nexport type { Language };\n","/**\n * API Key Management Utility\n *\n * Provides centralized functions for managing API keys in headers and requests.\n * This utility can be used across different components that need to handle API keys.\n */\n\nimport type { ApiKey } from '../types';\n\nexport type { ApiKey };\n\nexport interface HeadersWithApiKey {\n [key: string]: string;\n}\n\n/**\n * Add API key to request headers\n * @param headers - Existing headers object\n * @param apiKey - API key object or string\n * @returns Headers with API key added\n */\nexport function addApiKeyToHeaders(headers: HeadersWithApiKey, apiKey: ApiKey | string | null): HeadersWithApiKey {\n if (!apiKey) {\n return headers;\n }\n\n const keyValue = typeof apiKey === 'string' ? apiKey : (apiKey.id || '');\n\n return {\n ...headers,\n 'X-API-Key': keyValue,\n };\n}\n\n/**\n * Remove API key from headers object\n * @param headers - Headers object\n * @returns Headers without API key\n */\nexport function removeApiKeyFromHeaders(headers: HeadersWithApiKey): HeadersWithApiKey {\n const { 'X-API-Key': removed, ...remainingHeaders } = headers;\n return remainingHeaders;\n}\n\n/**\n * Remove API key from headers JSON string\n * @param headersJson - JSON string of headers\n * @returns JSON string without API key\n */\nexport function removeApiKeyFromHeadersJson(headersJson: string): string {\n try {\n const headers = JSON.parse(headersJson);\n const updatedHeaders = removeApiKeyFromHeaders(headers);\n return JSON.stringify(updatedHeaders, null, 2);\n } catch (error) {\n console.error('Error parsing headers JSON:', error);\n return headersJson;\n }\n}\n\n/**\n * Update headers JSON string with API key\n * @param headersJson - JSON string of headers\n * @param apiKey - API key object or string\n * @returns Updated JSON string\n */\nexport function updateHeadersJsonWithApiKey(headersJson: string, apiKey: ApiKey | string | null): string {\n try {\n const headers = JSON.parse(headersJson);\n const updatedHeaders = addApiKeyToHeaders(headers, apiKey);\n return JSON.stringify(updatedHeaders, null, 2);\n } catch (error) {\n console.error('Error parsing headers JSON:', error);\n return headersJson;\n }\n}\n\n/**\n * Find API key by ID in a list of API keys\n * @param apiKeys - Array of API keys\n * @param keyId - ID of the API key to find\n * @returns API key object or null\n */\nexport function findApiKeyById(apiKeys: ApiKey[], keyId: string): ApiKey | null {\n return apiKeys.find((key) => key.id === keyId) || null;\n}\n\n/**\n * Validate API key format\n * @param apiKey - API key string to validate\n * @returns Whether the API key format is valid\n */\nexport function validateApiKeyFormat(apiKey: string): boolean {\n // Basic validation - adjust based on your API key format requirements\n return typeof apiKey === 'string' && apiKey.length > 0 && apiKey.trim() !== '';\n}\n\n/**\n * Create default headers with API key\n * @param apiKey - API key object or string\n * @returns Default headers with API key\n */\nexport function createDefaultHeaders(apiKey?: ApiKey | string): HeadersWithApiKey {\n const defaultHeaders: HeadersWithApiKey = {\n 'Content-Type': 'application/json',\n };\n\n if (apiKey) {\n return addApiKeyToHeaders(defaultHeaders, apiKey);\n }\n\n return defaultHeaders;\n}\n\n/**\n * Merge headers with API key\n * @param baseHeaders - Base headers object\n * @param additionalHeaders - Additional headers to merge\n * @param apiKey - API key to add\n * @returns Merged headers with API key\n */\nexport function mergeHeadersWithApiKey(baseHeaders: HeadersWithApiKey, additionalHeaders: HeadersWithApiKey, apiKey?: ApiKey | string): HeadersWithApiKey {\n const mergedHeaders = { ...baseHeaders, ...additionalHeaders };\n\n if (apiKey) {\n return addApiKeyToHeaders(mergedHeaders, apiKey);\n }\n\n return mergedHeaders;\n}\n\n/**\n * Log API key usage (for debugging/analytics)\n * @param apiKey - API key that was used\n * @param endpoint - Endpoint that was called\n * @param success - Whether the request was successful\n */\nexport function logApiKeyUsage(apiKey: ApiKey | string, endpoint: string, success: boolean): void {\n const keyValue = typeof apiKey === 'string' ? apiKey : (apiKey.id || '');\n const keyName = typeof apiKey === 'string' ? 'Unknown' : apiKey.name;\n\n console.log(`API Key Usage:`, {\n keyName,\n keyValue: keyValue.substring(0, 8) + '...',\n endpoint,\n success,\n timestamp: new Date().toISOString(),\n });\n}\n","/**\n * API Version Management Utilities\n * Handles version detection, filtering, and URL transformation\n */\n\nimport type { ApiEndpoint } from '../types';\n\nexport interface ApiVersion {\n id: string;\n name: string;\n description: string;\n isDefault: boolean;\n}\n\n// Available API versions\nexport const API_VERSIONS: ApiVersion[] = [\n {\n id: 'v1',\n name: 'v1',\n description: 'Current stable version',\n isDefault: true,\n },\n];\n\n/**\n * Detect version from endpoint path\n */\nexport const detectEndpointVersion = (path: string): string => {\n // Check for versioned paths like /api/vehicles_api/v1/...\n const versionMatch = path.match(/\\/api\\/[^/]+\\/(v\\d+)\\//);\n if (versionMatch && versionMatch[1]) {\n return versionMatch[1];\n }\n \n // If no version found, default to v1\n return 'v1';\n};\n\n/**\n * Check if endpoint belongs to specific version\n */\nexport const isEndpointInVersion = (endpoint: ApiEndpoint, version: string): boolean => {\n const endpointVersion = detectEndpointVersion(endpoint.path);\n return endpointVersion === version;\n};\n\n/**\n * Filter endpoints by version\n */\nexport const filterEndpointsByVersion = (endpoints: ApiEndpoint[], version: string): ApiEndpoint[] => {\n return endpoints.filter(endpoint => isEndpointInVersion(endpoint, version));\n};\n\n/**\n * Remove duplicate endpoints across versions\n * Keeps only the specified version, removes duplicates from other versions\n */\nexport const deduplicateEndpoints = (endpoints: ApiEndpoint[], preferredVersion: string): ApiEndpoint[] => {\n const endpointMap = new Map<string, ApiEndpoint>();\n \n // Group endpoints by normalized path (without version)\n const groupedEndpoints = new Map<string, ApiEndpoint[]>();\n \n endpoints.forEach(endpoint => {\n const normalizedPath = normalizeEndpointPath(endpoint.path);\n if (!groupedEndpoints.has(normalizedPath)) {\n groupedEndpoints.set(normalizedPath, []);\n }\n groupedEndpoints.get(normalizedPath)!.push(endpoint);\n });\n \n // For each group, pick the endpoint from preferred version\n groupedEndpoints.forEach((endpointGroup, normalizedPath) => {\n let selectedEndpoint: ApiEndpoint | null = null;\n \n // Try to find endpoint in preferred version\n const versionEndpoint = endpointGroup.find(ep => isEndpointInVersion(ep, preferredVersion));\n if (versionEndpoint) {\n selectedEndpoint = versionEndpoint;\n } else if (endpointGroup.length > 0) {\n // Fallback to first available endpoint\n selectedEndpoint = endpointGroup[0] || null;\n }\n \n if (selectedEndpoint) {\n endpointMap.set(normalizedPath, selectedEndpoint);\n }\n });\n \n return Array.from(endpointMap.values());\n};\n\n/**\n * Normalize endpoint path by removing version prefix\n * /api/vehicles_api/v1/vehicles/ -> /api/vehicles_api/vehicles/\n * /api/vehicles_api/vehicles/ -> /api/vehicles_api/vehicles/\n */\nexport const normalizeEndpointPath = (path: string): string => {\n // Remove version prefix like /v1/, /v2/, etc.\n return path.replace(/\\/v\\d+\\//, '/');\n};\n\n/**\n * Convert endpoint path to specific version\n */\nexport const convertEndpointToVersion = (endpoint: ApiEndpoint, targetVersion: string): ApiEndpoint => {\n const currentVersion = detectEndpointVersion(endpoint.path);\n \n // If already in target version, return as is\n if (currentVersion === targetVersion) {\n return endpoint;\n }\n \n let newPath = endpoint.path;\n \n // Replace version: /api/vehicles_api/v1/vehicles/ -> /api/vehicles_api/v2/vehicles/\n newPath = newPath.replace(/\\/v\\d+\\//, `/${targetVersion}/`);\n \n return {\n ...endpoint,\n path: newPath,\n };\n};\n\n/**\n * Get version info by ID\n */\nexport const getVersionById = (versionId: string): ApiVersion | undefined => {\n return API_VERSIONS.find(v => v.id === versionId);\n};\n\n/**\n * Get default version\n */\nexport const getDefaultVersion = (): ApiVersion => {\n const defaultVersion = API_VERSIONS.find(v => v.isDefault);\n if (defaultVersion) {\n return defaultVersion;\n }\n \n // Fallback to first version if no default is set\n if (API_VERSIONS.length > 0 && API_VERSIONS[0]) {\n return API_VERSIONS[0];\n }\n \n // This should never happen, but TypeScript requires it\n throw new Error('No API versions defined');\n};\n\n/**\n * Get version statistics from endpoints\n */\nexport const getVersionStats = (endpoints: ApiEndpoint[]): Record<string, number> => {\n const stats: Record<string, number> = {};\n \n API_VERSIONS.forEach(version => {\n stats[version.id] = filterEndpointsByVersion(endpoints, version.id).length;\n });\n \n return stats;\n};\n","// HTTP method colors mapping\nexport const HTTP_METHOD_COLORS = {\n GET: 'success',\n POST: 'primary',\n PUT: 'warning',\n DELETE: 'error',\n PATCH: 'default',\n} as const;\n\n// HTTP status code colors mapping\nexport const HTTP_STATUS_COLORS = {\n '2': 'success',\n '3': 'default',\n '4': 'warning',\n '5': 'error',\n} as const;\n\n// Default request headers\nexport const DEFAULT_HEADERS = {\n 'Content-Type': 'application/json',\n} as const;\n\n// Playground steps configuration\nexport const PLAYGROUND_STEPS = ['endpoints', 'request', 'response'] as const;\n\nexport const STEP_CONFIG = {\n endpoints: {\n title: 'API Endpoints',\n description: 'Browse and select API endpoints',\n },\n request: {\n title: 'Request Builder',\n description: 'Configure your API request',\n },\n response: {\n title: 'Response Viewer',\n description: 'View API response and details',\n },\n} as const;\n","import type { ApiKey } from '../types';\nimport { HTTP_METHOD_COLORS, HTTP_STATUS_COLORS } from '../constants';\n\nexport const getMethodColor = (\n method: string\n): 'success' | 'primary' | 'warning' | 'error' | 'default' => {\n return HTTP_METHOD_COLORS[method.toUpperCase() as keyof typeof HTTP_METHOD_COLORS] || 'default';\n};\n\nexport const getStatusColor = (\n status: number\n): 'success' | 'warning' | 'error' | 'default' => {\n const firstDigit = Math.floor(status / 100).toString();\n return HTTP_STATUS_COLORS[firstDigit as keyof typeof HTTP_STATUS_COLORS] || 'default';\n};\n\nexport const formatApiKeyDisplay = (apiKey: ApiKey): string => {\n const preview = apiKey.id.substring(0, 8);\n return `${apiKey.name} (${preview}...)`;\n};\n\nexport const isValidJson = (str: string): boolean => {\n if (!str || typeof str !== 'string') return false;\n try {\n JSON.parse(str);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const formatRequestHeaders = (headers: Record<string, string>): string => {\n return JSON.stringify(headers, null, 2);\n};\n\nexport const parseRequestHeaders = (headersString: string): Record<string, string> => {\n if (!headersString || typeof headersString !== 'string') {\n return { 'Content-Type': 'application/json' };\n }\n\n try {\n const parsed = JSON.parse(headersString);\n return typeof parsed === 'object' && parsed !== null ? parsed : { 'Content-Type': 'application/json' };\n } catch {\n return { 'Content-Type': 'application/json' };\n }\n};\n\n// Substitute URL parameters like {id}, {userId}, etc.\nexport const substituteUrlParameters = (\n url: string,\n parameters: Record<string, string>\n): string => {\n let substitutedUrl = url;\n\n Object.entries(parameters).forEach(([key, value]) => {\n if (value && value.trim() !== '') {\n // Replace both {key} and %7Bkey%7D patterns (URL encoded version)\n const patterns = [\n new RegExp(`\\\\{${key}\\\\}`, 'g'),\n new RegExp(`%7B${key}%7D`, 'gi'),\n ];\n\n patterns.forEach((pattern) => {\n substitutedUrl = substitutedUrl.replace(pattern, encodeURIComponent(value));\n });\n }\n });\n\n return substitutedUrl;\n};\n","'use client';\n\nimport consola from 'consola';\nimport React, {\n createContext, ReactNode, useCallback, useContext, useEffect, useState\n} from 'react';\n\nimport type {\n ApiEndpoint, ApiResponse, PlaygroundConfig, PlaygroundContextType, PlaygroundState,\n PlaygroundStep\n} from '../types';\nimport { parseRequestHeaders, substituteUrlParameters } from '../utils';\nimport { getDefaultVersion } from '../utils/versionManager';\n\nconst createInitialState = (): PlaygroundState => ({\n // Step management\n currentStep: 'endpoints',\n steps: ['endpoints', 'request', 'response'],\n\n // Endpoint selection\n selectedEndpoint: null,\n selectedCategory: 'All',\n searchTerm: '',\n selectedVersion: getDefaultVersion().id,\n\n // Request configuration\n requestUrl: '',\n requestMethod: 'GET',\n requestHeaders: '{\\n \"Content-Type\": \"application/json\"\\n}',\n requestBody: '',\n selectedApiKey: null,\n manualApiToken: '',\n parameters: {},\n\n // Response\n response: null,\n loading: false,\n\n // UI state\n sidebarOpen: false,\n});\n\nconst PlaygroundContext = createContext<PlaygroundContextType | undefined>(undefined);\n\nexport const usePlaygroundContext = () => {\n const context = useContext(PlaygroundContext);\n if (!context) {\n throw new Error('usePlaygroundContext must be used within a PlaygroundProvider');\n }\n return context;\n};\n\ninterface PlaygroundProviderProps {\n children: ReactNode;\n config: PlaygroundConfig;\n}\n\nexport const PlaygroundProvider: React.FC<PlaygroundProviderProps> = ({ children, config }) => {\n const [state, setState] = useState<PlaygroundState>(() => createInitialState());\n\n // TODO: Get API keys from CFG context - temporarily disabled\n // const { apiKeys: apiKeysResponse, isLoadingApiKeys } = useApiKeysContext();\n // const apiKeys = (apiKeysResponse && apiKeysResponse.results) ? apiKeysResponse.results : [];\n const apiKeys = React.useMemo(() => [], []);\n const isLoadingApiKeys = false;\n\n const updateState = (updates: Partial<PlaygroundState>) => {\n setState((prev) => ({ ...prev, ...updates }));\n };\n\n // Auto-select first API key when available\n useEffect(() => {\n if (!isLoadingApiKeys && apiKeys.length > 0 && !state.selectedApiKey) {\n updateState({ selectedApiKey: apiKeys[0]?.id || null });\n }\n }, [apiKeys, isLoadingApiKeys, state.selectedApiKey]);\n\n // Update headers when API key changes\n useEffect(() => {\n try {\n setState(prev => {\n const headers = parseRequestHeaders(prev.requestHeaders);\n let hasChanged = false;\n\n if (prev.selectedApiKey) {\n const apiKey = apiKeys.find(k => k.id === prev.selectedApiKey);\n\n if (apiKey) {\n // Add API key to headers only if it changed\n if (headers['X-API-Key'] !== apiKey.id) {\n headers['X-API-Key'] = apiKey.id;\n hasChanged = true;\n }\n } else {\n // Selected API key no longer exists, clear selection\n return { ...prev, selectedApiKey: null };\n }\n } else {\n // Remove API key from headers if no key is selected\n if (headers['X-API-Key']) {\n delete headers['X-API-Key'];\n hasChanged = true;\n }\n }\n\n // Only update if headers actually changed\n if (hasChanged) {\n const updatedHeaders = JSON.stringify(headers, null, 2);\n return { ...prev, requestHeaders: updatedHeaders };\n }\n\n return prev;\n });\n } catch (error) {\n consola.error('Error updating headers:', error);\n }\n }, [state.selectedApiKey, apiKeys]); // Removed state.requestHeaders dependency\n\n // Update URL when parameters change\n useEffect(() => {\n if (state.selectedEndpoint && state.parameters) {\n // Path is already a full URL from the endpoint\n const updatedUrl = substituteUrlParameters(state.selectedEndpoint.path, state.parameters);\n\n // Only update if URL actually changed to avoid infinite loop\n if (updatedUrl !== state.requestUrl) {\n updateState({ requestUrl: updatedUrl });\n }\n }\n }, [state.parameters, state.selectedEndpoint, state.requestUrl]);\n\n // Step management\n const setCurrentStep = (step: PlaygroundStep) => {\n updateState({ currentStep: step });\n };\n\n const goToNextStep = () => {\n const currentIndex = state.steps.indexOf(state.currentStep);\n if (currentIndex < state.steps.length - 1) {\n updateState({ currentStep: state.steps[currentIndex + 1] });\n }\n };\n\n const goToPreviousStep = () => {\n const currentIndex = state.steps.indexOf(state.currentStep);\n if (currentIndex > 0) {\n updateState({ currentStep: state.steps[currentIndex - 1] });\n }\n };\n\n // Endpoint management\n const setSelectedEndpoint = (endpoint: ApiEndpoint | null) => {\n if (endpoint) {\n // All endpoints are GET only\n // Path is already a full URL from the endpoint\n updateState({\n selectedEndpoint: endpoint,\n requestMethod: 'GET',\n requestUrl: endpoint.path,\n parameters: {}, // Reset parameters when endpoint changes\n currentStep: 'request'\n });\n } else {\n updateState({ selectedEndpoint: endpoint });\n }\n };\n\n const setSelectedCategory = (category: string) => {\n updateState({ selectedCategory: category });\n };\n\n const setSearchTerm = (term: string) => {\n updateState({ searchTerm: term });\n };\n\n const setSelectedVersion = (version: string) => {\n updateState({ selectedVersion: version });\n };\n\n // Request management\n const setRequestUrl = (url: string) => {\n updateState({ requestUrl: url });\n };\n\n const setRequestMethod = (method: string) => {\n updateState({ requestMethod: method });\n };\n\n const setRequestHeaders = (headers: string) => {\n updateState({ requestHeaders: headers });\n };\n\n const setRequestBody = (body: string) => {\n updateState({ requestBody: body });\n };\n\n const setSelectedApiKey = (apiKeyId: string | null) => {\n updateState({ selectedApiKey: apiKeyId });\n };\n\n const setManualApiToken = (manualApiToken: string) => {\n updateState({ manualApiToken });\n };\n\n const setParameters = (parameters: Record<string, string>) => {\n updateState({ parameters });\n };\n\n // Response management\n const setResponse = (response: ApiResponse | null) => {\n updateState({ response });\n };\n\n const setLoading = (loading: boolean) => {\n updateState({ loading });\n };\n\n // UI management\n const setSidebarOpen = (sidebarOpen: boolean) => {\n updateState({ sidebarOpen });\n };\n\n // Actions\n const clearAll = useCallback(() => {\n setState(createInitialState());\n }, []);\n\n const sendRequest = useCallback(async () => {\n if (!state.requestUrl) {\n consola.error('No URL provided');\n return;\n }\n\n setLoading(true);\n setResponse(null);\n\n try {\n const headers = parseRequestHeaders(state.requestHeaders);\n\n // Bearer token priority: manual token → JWT token from localStorage\n let bearerToken: string | null = null;\n\n if (state.manualApiToken) {\n // Use manual token if provided\n bearerToken = state.manualApiToken;\n } else {\n // Try to get JWT token from localStorage\n if (typeof window !== 'undefined') {\n bearerToken = window.localStorage.getItem('auth_token');\n }\n }\n\n if (bearerToken) {\n headers['Authorization'] = `Bearer ${bearerToken}`;\n }\n\n const requestOptions: RequestInit = {\n method: state.requestMethod,\n headers,\n };\n\n if (state.requestBody && state.requestMethod !== 'GET') {\n requestOptions.body = state.requestBody;\n }\n\n const response = await fetch(state.requestUrl, requestOptions);\n const responseText = await response.text();\n\n let responseData;\n try {\n responseData = JSON.parse(responseText);\n } catch {\n responseData = responseText;\n }\n\n setResponse({\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n data: responseData,\n });\n\n consola.success(`Request successful: ${state.requestMethod} ${state.requestUrl}`);\n\n // Auto-advance to response step\n updateState({ currentStep: 'response' });\n } catch (error) {\n consola.error('Request failed:', error);\n setResponse({\n error: error instanceof Error ? error.message : 'Request failed',\n });\n } finally {\n setLoading(false);\n }\n }, [state, setLoading, setResponse]);\n\n const contextValue: PlaygroundContextType = {\n // State\n state,\n config,\n apiKeys,\n apiKeysLoading: isLoadingApiKeys,\n\n // Step management\n setCurrentStep,\n goToNextStep,\n goToPreviousStep,\n\n // Endpoint management\n setSelectedEndpoint,\n setSelectedCategory,\n setSearchTerm,\n setSelectedVersion,\n\n // Request management\n setRequestUrl,\n setRequestMethod,\n setRequestHeaders,\n setRequestBody,\n setSelectedApiKey,\n setManualApiToken,\n setParameters,\n\n // Response management\n setResponse,\n setLoading,\n\n // UI management\n setSidebarOpen,\n\n // Actions\n clearAll,\n sendRequest,\n };\n\n return <PlaygroundContext.Provider value={contextValue}>{children}</PlaygroundContext.Provider>;\n}; "]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tools/PrettyCode/index.tsx","../src/tools/OpenapiViewer/utils/apiKeyManager.ts","../src/tools/OpenapiViewer/utils/versionManager.ts","../src/tools/OpenapiViewer/constants.ts","../src/tools/OpenapiViewer/utils/formatters.ts","../src/tools/OpenapiViewer/context/PlaygroundContext.tsx"],"names":["React","jsx"],"mappings":"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","file":"chunk-G6PRZP5I.mjs","sourcesContent":["/**\n * PrettyCode Component - Dynamic Import Wrapper\n *\n * Lazy loads the heavy Prism library (~500KB) only when needed.\n * This significantly reduces the initial bundle size.\n */\n\n'use client';\n\nimport React, { lazy, Suspense } from 'react';\nimport type { Language } from 'prism-react-renderer';\n\n// Lazy load the client component\nconst PrettyCodeClient = lazy(() => import('./PrettyCode.client'));\n\n// Loading fallback component\nconst LoadingFallback = () => (\n <div className=\"relative rounded-sm border border-border overflow-hidden bg-muted dark:bg-zinc-900\">\n <div className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"animate-pulse h-4 w-4 rounded-full bg-muted-foreground/20\"></div>\n <span className=\"text-xs text-muted-foreground\">Loading code...</span>\n </div>\n </div>\n </div>\n);\n\ninterface PrettyCodeProps {\n data: string | object;\n language: Language;\n className?: string;\n mode?: 'dark' | 'light';\n inline?: boolean;\n customBg?: string;\n isCompact?: boolean;\n}\n\nconst PrettyCode: React.FC<PrettyCodeProps> = (props) => {\n return (\n <Suspense fallback={<LoadingFallback />}>\n <PrettyCodeClient {...props} />\n </Suspense>\n );\n};\n\nexport default PrettyCode;\nexport type { Language };\n","/**\n * API Key Management Utility\n *\n * Provides centralized functions for managing API keys in headers and requests.\n * This utility can be used across different components that need to handle API keys.\n */\n\nimport type { ApiKey } from '../types';\n\nexport type { ApiKey };\n\nexport interface HeadersWithApiKey {\n [key: string]: string;\n}\n\n/**\n * Add API key to request headers\n * @param headers - Existing headers object\n * @param apiKey - API key object or string\n * @returns Headers with API key added\n */\nexport function addApiKeyToHeaders(headers: HeadersWithApiKey, apiKey: ApiKey | string | null): HeadersWithApiKey {\n if (!apiKey) {\n return headers;\n }\n\n const keyValue = typeof apiKey === 'string' ? apiKey : (apiKey.id || '');\n\n return {\n ...headers,\n 'X-API-Key': keyValue,\n };\n}\n\n/**\n * Remove API key from headers object\n * @param headers - Headers object\n * @returns Headers without API key\n */\nexport function removeApiKeyFromHeaders(headers: HeadersWithApiKey): HeadersWithApiKey {\n const { 'X-API-Key': removed, ...remainingHeaders } = headers;\n return remainingHeaders;\n}\n\n/**\n * Remove API key from headers JSON string\n * @param headersJson - JSON string of headers\n * @returns JSON string without API key\n */\nexport function removeApiKeyFromHeadersJson(headersJson: string): string {\n try {\n const headers = JSON.parse(headersJson);\n const updatedHeaders = removeApiKeyFromHeaders(headers);\n return JSON.stringify(updatedHeaders, null, 2);\n } catch (error) {\n console.error('Error parsing headers JSON:', error);\n return headersJson;\n }\n}\n\n/**\n * Update headers JSON string with API key\n * @param headersJson - JSON string of headers\n * @param apiKey - API key object or string\n * @returns Updated JSON string\n */\nexport function updateHeadersJsonWithApiKey(headersJson: string, apiKey: ApiKey | string | null): string {\n try {\n const headers = JSON.parse(headersJson);\n const updatedHeaders = addApiKeyToHeaders(headers, apiKey);\n return JSON.stringify(updatedHeaders, null, 2);\n } catch (error) {\n console.error('Error parsing headers JSON:', error);\n return headersJson;\n }\n}\n\n/**\n * Find API key by ID in a list of API keys\n * @param apiKeys - Array of API keys\n * @param keyId - ID of the API key to find\n * @returns API key object or null\n */\nexport function findApiKeyById(apiKeys: ApiKey[], keyId: string): ApiKey | null {\n return apiKeys.find((key) => key.id === keyId) || null;\n}\n\n/**\n * Validate API key format\n * @param apiKey - API key string to validate\n * @returns Whether the API key format is valid\n */\nexport function validateApiKeyFormat(apiKey: string): boolean {\n // Basic validation - adjust based on your API key format requirements\n return typeof apiKey === 'string' && apiKey.length > 0 && apiKey.trim() !== '';\n}\n\n/**\n * Create default headers with API key\n * @param apiKey - API key object or string\n * @returns Default headers with API key\n */\nexport function createDefaultHeaders(apiKey?: ApiKey | string): HeadersWithApiKey {\n const defaultHeaders: HeadersWithApiKey = {\n 'Content-Type': 'application/json',\n };\n\n if (apiKey) {\n return addApiKeyToHeaders(defaultHeaders, apiKey);\n }\n\n return defaultHeaders;\n}\n\n/**\n * Merge headers with API key\n * @param baseHeaders - Base headers object\n * @param additionalHeaders - Additional headers to merge\n * @param apiKey - API key to add\n * @returns Merged headers with API key\n */\nexport function mergeHeadersWithApiKey(baseHeaders: HeadersWithApiKey, additionalHeaders: HeadersWithApiKey, apiKey?: ApiKey | string): HeadersWithApiKey {\n const mergedHeaders = { ...baseHeaders, ...additionalHeaders };\n\n if (apiKey) {\n return addApiKeyToHeaders(mergedHeaders, apiKey);\n }\n\n return mergedHeaders;\n}\n\n/**\n * Log API key usage (for debugging/analytics)\n * @param apiKey - API key that was used\n * @param endpoint - Endpoint that was called\n * @param success - Whether the request was successful\n */\nexport function logApiKeyUsage(apiKey: ApiKey | string, endpoint: string, success: boolean): void {\n const keyValue = typeof apiKey === 'string' ? apiKey : (apiKey.id || '');\n const keyName = typeof apiKey === 'string' ? 'Unknown' : apiKey.name;\n\n console.log(`API Key Usage:`, {\n keyName,\n keyValue: keyValue.substring(0, 8) + '...',\n endpoint,\n success,\n timestamp: new Date().toISOString(),\n });\n}\n","/**\n * API Version Management Utilities\n * Handles version detection, filtering, and URL transformation\n */\n\nimport type { ApiEndpoint } from '../types';\n\nexport interface ApiVersion {\n id: string;\n name: string;\n description: string;\n isDefault: boolean;\n}\n\n// Available API versions\nexport const API_VERSIONS: ApiVersion[] = [\n {\n id: 'v1',\n name: 'v1',\n description: 'Current stable version',\n isDefault: true,\n },\n];\n\n/**\n * Detect version from endpoint path\n */\nexport const detectEndpointVersion = (path: string): string => {\n // Check for versioned paths like /api/vehicles_api/v1/...\n const versionMatch = path.match(/\\/api\\/[^/]+\\/(v\\d+)\\//);\n if (versionMatch && versionMatch[1]) {\n return versionMatch[1];\n }\n \n // If no version found, default to v1\n return 'v1';\n};\n\n/**\n * Check if endpoint belongs to specific version\n */\nexport const isEndpointInVersion = (endpoint: ApiEndpoint, version: string): boolean => {\n const endpointVersion = detectEndpointVersion(endpoint.path);\n return endpointVersion === version;\n};\n\n/**\n * Filter endpoints by version\n */\nexport const filterEndpointsByVersion = (endpoints: ApiEndpoint[], version: string): ApiEndpoint[] => {\n return endpoints.filter(endpoint => isEndpointInVersion(endpoint, version));\n};\n\n/**\n * Remove duplicate endpoints across versions\n * Keeps only the specified version, removes duplicates from other versions\n */\nexport const deduplicateEndpoints = (endpoints: ApiEndpoint[], preferredVersion: string): ApiEndpoint[] => {\n const endpointMap = new Map<string, ApiEndpoint>();\n \n // Group endpoints by normalized path (without version)\n const groupedEndpoints = new Map<string, ApiEndpoint[]>();\n \n endpoints.forEach(endpoint => {\n const normalizedPath = normalizeEndpointPath(endpoint.path);\n if (!groupedEndpoints.has(normalizedPath)) {\n groupedEndpoints.set(normalizedPath, []);\n }\n groupedEndpoints.get(normalizedPath)!.push(endpoint);\n });\n \n // For each group, pick the endpoint from preferred version\n groupedEndpoints.forEach((endpointGroup, normalizedPath) => {\n let selectedEndpoint: ApiEndpoint | null = null;\n \n // Try to find endpoint in preferred version\n const versionEndpoint = endpointGroup.find(ep => isEndpointInVersion(ep, preferredVersion));\n if (versionEndpoint) {\n selectedEndpoint = versionEndpoint;\n } else if (endpointGroup.length > 0) {\n // Fallback to first available endpoint\n selectedEndpoint = endpointGroup[0] || null;\n }\n \n if (selectedEndpoint) {\n endpointMap.set(normalizedPath, selectedEndpoint);\n }\n });\n \n return Array.from(endpointMap.values());\n};\n\n/**\n * Normalize endpoint path by removing version prefix\n * /api/vehicles_api/v1/vehicles/ -> /api/vehicles_api/vehicles/\n * /api/vehicles_api/vehicles/ -> /api/vehicles_api/vehicles/\n */\nexport const normalizeEndpointPath = (path: string): string => {\n // Remove version prefix like /v1/, /v2/, etc.\n return path.replace(/\\/v\\d+\\//, '/');\n};\n\n/**\n * Convert endpoint path to specific version\n */\nexport const convertEndpointToVersion = (endpoint: ApiEndpoint, targetVersion: string): ApiEndpoint => {\n const currentVersion = detectEndpointVersion(endpoint.path);\n \n // If already in target version, return as is\n if (currentVersion === targetVersion) {\n return endpoint;\n }\n \n let newPath = endpoint.path;\n \n // Replace version: /api/vehicles_api/v1/vehicles/ -> /api/vehicles_api/v2/vehicles/\n newPath = newPath.replace(/\\/v\\d+\\//, `/${targetVersion}/`);\n \n return {\n ...endpoint,\n path: newPath,\n };\n};\n\n/**\n * Get version info by ID\n */\nexport const getVersionById = (versionId: string): ApiVersion | undefined => {\n return API_VERSIONS.find(v => v.id === versionId);\n};\n\n/**\n * Get default version\n */\nexport const getDefaultVersion = (): ApiVersion => {\n const defaultVersion = API_VERSIONS.find(v => v.isDefault);\n if (defaultVersion) {\n return defaultVersion;\n }\n \n // Fallback to first version if no default is set\n if (API_VERSIONS.length > 0 && API_VERSIONS[0]) {\n return API_VERSIONS[0];\n }\n \n // This should never happen, but TypeScript requires it\n throw new Error('No API versions defined');\n};\n\n/**\n * Get version statistics from endpoints\n */\nexport const getVersionStats = (endpoints: ApiEndpoint[]): Record<string, number> => {\n const stats: Record<string, number> = {};\n \n API_VERSIONS.forEach(version => {\n stats[version.id] = filterEndpointsByVersion(endpoints, version.id).length;\n });\n \n return stats;\n};\n","// HTTP method colors mapping\nexport const HTTP_METHOD_COLORS = {\n GET: 'success',\n POST: 'primary',\n PUT: 'warning',\n DELETE: 'error',\n PATCH: 'default',\n} as const;\n\n// HTTP status code colors mapping\nexport const HTTP_STATUS_COLORS = {\n '2': 'success',\n '3': 'default',\n '4': 'warning',\n '5': 'error',\n} as const;\n\n// Default request headers\nexport const DEFAULT_HEADERS = {\n 'Content-Type': 'application/json',\n} as const;\n\n// Playground steps configuration\nexport const PLAYGROUND_STEPS = ['endpoints', 'request', 'response'] as const;\n\nexport const STEP_CONFIG = {\n endpoints: {\n title: 'API Endpoints',\n description: 'Browse and select API endpoints',\n },\n request: {\n title: 'Request Builder',\n description: 'Configure your API request',\n },\n response: {\n title: 'Response Viewer',\n description: 'View API response and details',\n },\n} as const;\n","import type { ApiKey } from '../types';\nimport { HTTP_METHOD_COLORS, HTTP_STATUS_COLORS } from '../constants';\n\nexport const getMethodColor = (\n method: string\n): 'success' | 'primary' | 'warning' | 'error' | 'default' => {\n return HTTP_METHOD_COLORS[method.toUpperCase() as keyof typeof HTTP_METHOD_COLORS] || 'default';\n};\n\nexport const getStatusColor = (\n status: number\n): 'success' | 'warning' | 'error' | 'default' => {\n const firstDigit = Math.floor(status / 100).toString();\n return HTTP_STATUS_COLORS[firstDigit as keyof typeof HTTP_STATUS_COLORS] || 'default';\n};\n\nexport const formatApiKeyDisplay = (apiKey: ApiKey): string => {\n const preview = apiKey.id.substring(0, 8);\n return `${apiKey.name} (${preview}...)`;\n};\n\nexport const isValidJson = (str: string): boolean => {\n if (!str || typeof str !== 'string') return false;\n try {\n JSON.parse(str);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const formatRequestHeaders = (headers: Record<string, string>): string => {\n return JSON.stringify(headers, null, 2);\n};\n\nexport const parseRequestHeaders = (headersString: string): Record<string, string> => {\n if (!headersString || typeof headersString !== 'string') {\n return { 'Content-Type': 'application/json' };\n }\n\n try {\n const parsed = JSON.parse(headersString);\n return typeof parsed === 'object' && parsed !== null ? parsed : { 'Content-Type': 'application/json' };\n } catch {\n return { 'Content-Type': 'application/json' };\n }\n};\n\n// Substitute URL parameters like {id}, {userId}, etc.\nexport const substituteUrlParameters = (\n url: string,\n parameters: Record<string, string>\n): string => {\n let substitutedUrl = url;\n\n Object.entries(parameters).forEach(([key, value]) => {\n if (value && value.trim() !== '') {\n // Replace both {key} and %7Bkey%7D patterns (URL encoded version)\n const patterns = [\n new RegExp(`\\\\{${key}\\\\}`, 'g'),\n new RegExp(`%7B${key}%7D`, 'gi'),\n ];\n\n patterns.forEach((pattern) => {\n substitutedUrl = substitutedUrl.replace(pattern, encodeURIComponent(value));\n });\n }\n });\n\n return substitutedUrl;\n};\n","'use client';\n\nimport consola from 'consola';\nimport React, {\n createContext, ReactNode, useCallback, useContext, useEffect, useState\n} from 'react';\n\nimport type {\n ApiEndpoint, ApiResponse, PlaygroundConfig, PlaygroundContextType, PlaygroundState,\n PlaygroundStep\n} from '../types';\nimport { parseRequestHeaders, substituteUrlParameters } from '../utils';\nimport { getDefaultVersion } from '../utils/versionManager';\n\nconst createInitialState = (): PlaygroundState => ({\n // Step management\n currentStep: 'endpoints',\n steps: ['endpoints', 'request', 'response'],\n\n // Endpoint selection\n selectedEndpoint: null,\n selectedCategory: 'All',\n searchTerm: '',\n selectedVersion: getDefaultVersion().id,\n\n // Request configuration\n requestUrl: '',\n requestMethod: 'GET',\n requestHeaders: '{\\n \"Content-Type\": \"application/json\"\\n}',\n requestBody: '',\n selectedApiKey: null,\n manualApiToken: '',\n parameters: {},\n\n // Response\n response: null,\n loading: false,\n\n // UI state\n sidebarOpen: false,\n});\n\nconst PlaygroundContext = createContext<PlaygroundContextType | undefined>(undefined);\n\nexport const usePlaygroundContext = () => {\n const context = useContext(PlaygroundContext);\n if (!context) {\n throw new Error('usePlaygroundContext must be used within a PlaygroundProvider');\n }\n return context;\n};\n\ninterface PlaygroundProviderProps {\n children: ReactNode;\n config: PlaygroundConfig;\n}\n\nexport const PlaygroundProvider: React.FC<PlaygroundProviderProps> = ({ children, config }) => {\n const [state, setState] = useState<PlaygroundState>(() => createInitialState());\n\n // TODO: Get API keys from CFG context - temporarily disabled\n // const { apiKeys: apiKeysResponse, isLoadingApiKeys } = useApiKeysContext();\n // const apiKeys = (apiKeysResponse && apiKeysResponse.results) ? apiKeysResponse.results : [];\n const apiKeys = React.useMemo(() => [], []);\n const isLoadingApiKeys = false;\n\n const updateState = (updates: Partial<PlaygroundState>) => {\n setState((prev) => ({ ...prev, ...updates }));\n };\n\n // Auto-select first API key when available\n useEffect(() => {\n if (!isLoadingApiKeys && apiKeys.length > 0 && !state.selectedApiKey) {\n updateState({ selectedApiKey: apiKeys[0]?.id || null });\n }\n }, [apiKeys, isLoadingApiKeys, state.selectedApiKey]);\n\n // Update headers when API key changes\n useEffect(() => {\n try {\n setState(prev => {\n const headers = parseRequestHeaders(prev.requestHeaders);\n let hasChanged = false;\n\n if (prev.selectedApiKey) {\n const apiKey = apiKeys.find(k => k.id === prev.selectedApiKey);\n\n if (apiKey) {\n // Add API key to headers only if it changed\n if (headers['X-API-Key'] !== apiKey.id) {\n headers['X-API-Key'] = apiKey.id;\n hasChanged = true;\n }\n } else {\n // Selected API key no longer exists, clear selection\n return { ...prev, selectedApiKey: null };\n }\n } else {\n // Remove API key from headers if no key is selected\n if (headers['X-API-Key']) {\n delete headers['X-API-Key'];\n hasChanged = true;\n }\n }\n\n // Only update if headers actually changed\n if (hasChanged) {\n const updatedHeaders = JSON.stringify(headers, null, 2);\n return { ...prev, requestHeaders: updatedHeaders };\n }\n\n return prev;\n });\n } catch (error) {\n consola.error('Error updating headers:', error);\n }\n }, [state.selectedApiKey, apiKeys]); // Removed state.requestHeaders dependency\n\n // Update URL when parameters change\n useEffect(() => {\n if (state.selectedEndpoint && state.parameters) {\n // Path is already a full URL from the endpoint\n const updatedUrl = substituteUrlParameters(state.selectedEndpoint.path, state.parameters);\n\n // Only update if URL actually changed to avoid infinite loop\n if (updatedUrl !== state.requestUrl) {\n updateState({ requestUrl: updatedUrl });\n }\n }\n }, [state.parameters, state.selectedEndpoint, state.requestUrl]);\n\n // Step management\n const setCurrentStep = (step: PlaygroundStep) => {\n updateState({ currentStep: step });\n };\n\n const goToNextStep = () => {\n const currentIndex = state.steps.indexOf(state.currentStep);\n if (currentIndex < state.steps.length - 1) {\n updateState({ currentStep: state.steps[currentIndex + 1] });\n }\n };\n\n const goToPreviousStep = () => {\n const currentIndex = state.steps.indexOf(state.currentStep);\n if (currentIndex > 0) {\n updateState({ currentStep: state.steps[currentIndex - 1] });\n }\n };\n\n // Endpoint management\n const setSelectedEndpoint = (endpoint: ApiEndpoint | null) => {\n if (endpoint) {\n // All endpoints are GET only\n // Path is already a full URL from the endpoint\n updateState({\n selectedEndpoint: endpoint,\n requestMethod: 'GET',\n requestUrl: endpoint.path,\n parameters: {}, // Reset parameters when endpoint changes\n currentStep: 'request'\n });\n } else {\n updateState({ selectedEndpoint: endpoint });\n }\n };\n\n const setSelectedCategory = (category: string) => {\n updateState({ selectedCategory: category });\n };\n\n const setSearchTerm = (term: string) => {\n updateState({ searchTerm: term });\n };\n\n const setSelectedVersion = (version: string) => {\n updateState({ selectedVersion: version });\n };\n\n // Request management\n const setRequestUrl = (url: string) => {\n updateState({ requestUrl: url });\n };\n\n const setRequestMethod = (method: string) => {\n updateState({ requestMethod: method });\n };\n\n const setRequestHeaders = (headers: string) => {\n updateState({ requestHeaders: headers });\n };\n\n const setRequestBody = (body: string) => {\n updateState({ requestBody: body });\n };\n\n const setSelectedApiKey = (apiKeyId: string | null) => {\n updateState({ selectedApiKey: apiKeyId });\n };\n\n const setManualApiToken = (manualApiToken: string) => {\n updateState({ manualApiToken });\n };\n\n const setParameters = (parameters: Record<string, string>) => {\n updateState({ parameters });\n };\n\n // Response management\n const setResponse = (response: ApiResponse | null) => {\n updateState({ response });\n };\n\n const setLoading = (loading: boolean) => {\n updateState({ loading });\n };\n\n // UI management\n const setSidebarOpen = (sidebarOpen: boolean) => {\n updateState({ sidebarOpen });\n };\n\n // Actions\n const clearAll = useCallback(() => {\n setState(createInitialState());\n }, []);\n\n const sendRequest = useCallback(async () => {\n if (!state.requestUrl) {\n consola.error('No URL provided');\n return;\n }\n\n setLoading(true);\n setResponse(null);\n\n try {\n const headers = parseRequestHeaders(state.requestHeaders);\n\n // Bearer token priority: manual token → JWT token from localStorage\n let bearerToken: string | null = null;\n\n if (state.manualApiToken) {\n // Use manual token if provided\n bearerToken = state.manualApiToken;\n } else {\n // Try to get JWT token from localStorage\n if (typeof window !== 'undefined') {\n bearerToken = window.localStorage.getItem('auth_token');\n }\n }\n\n if (bearerToken) {\n headers['Authorization'] = `Bearer ${bearerToken}`;\n }\n\n const requestOptions: RequestInit = {\n method: state.requestMethod,\n headers,\n };\n\n if (state.requestBody && state.requestMethod !== 'GET') {\n requestOptions.body = state.requestBody;\n }\n\n const response = await fetch(state.requestUrl, requestOptions);\n const responseText = await response.text();\n\n let responseData;\n try {\n responseData = JSON.parse(responseText);\n } catch {\n responseData = responseText;\n }\n\n setResponse({\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n data: responseData,\n });\n\n consola.success(`Request successful: ${state.requestMethod} ${state.requestUrl}`);\n\n // Auto-advance to response step\n updateState({ currentStep: 'response' });\n } catch (error) {\n consola.error('Request failed:', error);\n setResponse({\n error: error instanceof Error ? error.message : 'Request failed',\n });\n } finally {\n setLoading(false);\n }\n }, [state, setLoading, setResponse]);\n\n const contextValue: PlaygroundContextType = {\n // State\n state,\n config,\n apiKeys,\n apiKeysLoading: isLoadingApiKeys,\n\n // Step management\n setCurrentStep,\n goToNextStep,\n goToPreviousStep,\n\n // Endpoint management\n setSelectedEndpoint,\n setSelectedCategory,\n setSearchTerm,\n setSelectedVersion,\n\n // Request management\n setRequestUrl,\n setRequestMethod,\n setRequestHeaders,\n setRequestBody,\n setSelectedApiKey,\n setManualApiToken,\n setParameters,\n\n // Response management\n setResponse,\n setLoading,\n\n // UI management\n setSidebarOpen,\n\n // Actions\n clearAll,\n sendRequest,\n };\n\n return <PlaygroundContext.Provider value={contextValue}>{children}</PlaygroundContext.Provider>;\n}; "]}