@djangocfg/ui-tools 2.1.227 → 2.1.229
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/JsonSchemaForm-GZBFMEKR.cjs +13 -0
- package/dist/{JsonSchemaForm-65NLLK56.mjs.map → JsonSchemaForm-GZBFMEKR.cjs.map} +1 -1
- package/dist/JsonSchemaForm-ZTRWXMEF.mjs +4 -0
- package/dist/{JsonSchemaForm-PY6DH3HE.cjs.map → JsonSchemaForm-ZTRWXMEF.mjs.map} +1 -1
- package/dist/{PlaygroundLayout-UKZX5HGM.mjs → PlaygroundLayout-4TCSESTD.mjs} +3 -3
- package/dist/{PlaygroundLayout-UKZX5HGM.mjs.map → PlaygroundLayout-4TCSESTD.mjs.map} +1 -1
- package/dist/{PlaygroundLayout-5AHU5DI5.cjs → PlaygroundLayout-KE2ME6WH.cjs} +18 -18
- package/dist/{PlaygroundLayout-5AHU5DI5.cjs.map → PlaygroundLayout-KE2ME6WH.cjs.map} +1 -1
- package/dist/{PrettyCode.client-VH6C6OC5.cjs → PrettyCode.client-EMBU27DJ.cjs} +3 -3
- package/dist/PrettyCode.client-EMBU27DJ.cjs.map +1 -0
- package/dist/{PrettyCode.client-VNTMCHXR.mjs → PrettyCode.client-K45ON7DD.mjs} +4 -4
- package/dist/PrettyCode.client-K45ON7DD.mjs.map +1 -0
- package/dist/{chunk-BEURMR25.mjs → chunk-GGKGH5PM.mjs} +5 -5
- package/dist/chunk-GGKGH5PM.mjs.map +1 -0
- package/dist/{chunk-SQLEKTT2.mjs → chunk-HMHIVEMS.mjs} +4 -4
- package/dist/chunk-HMHIVEMS.mjs.map +1 -0
- package/dist/{chunk-IPRNIM7L.cjs → chunk-IHAY6FO6.cjs} +4 -4
- package/dist/chunk-IHAY6FO6.cjs.map +1 -0
- package/dist/{chunk-HEU2ECX6.cjs → chunk-N7EDSU3Z.cjs} +3 -3
- package/dist/{chunk-HEU2ECX6.cjs.map → chunk-N7EDSU3Z.cjs.map} +1 -1
- package/dist/{chunk-7IIRYG4S.mjs → chunk-TKB5BDPN.mjs} +4 -4
- package/dist/chunk-TKB5BDPN.mjs.map +1 -0
- package/dist/{chunk-J36VZHEZ.mjs → chunk-TSDCMPCW.mjs} +3 -3
- package/dist/{chunk-J36VZHEZ.mjs.map → chunk-TSDCMPCW.mjs.map} +1 -1
- package/dist/{chunk-PNZSJN6T.cjs → chunk-UYBYZXVD.cjs} +3 -3
- package/dist/chunk-UYBYZXVD.cjs.map +1 -0
- package/dist/{chunk-ZQX7KIC5.cjs → chunk-YZX6FH3H.cjs} +3 -3
- package/dist/chunk-YZX6FH3H.cjs.map +1 -0
- package/dist/{components-MPEPRVCT.mjs → components-5GVVL2Q6.mjs} +3 -3
- package/dist/{components-3DASJBTX.mjs.map → components-5GVVL2Q6.mjs.map} +1 -1
- package/dist/components-5UXYNAKR.cjs +22 -0
- package/dist/{components-4FGDYL7K.cjs.map → components-5UXYNAKR.cjs.map} +1 -1
- package/dist/components-CFXOEVPN.mjs +5 -0
- package/dist/{components-MPEPRVCT.mjs.map → components-CFXOEVPN.mjs.map} +1 -1
- package/dist/{components-4FGDYL7K.cjs → components-CPHOUQ5F.cjs} +12 -12
- package/dist/{components-NW2ZF6TG.cjs.map → components-CPHOUQ5F.cjs.map} +1 -1
- package/dist/index.cjs +78 -78
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +18 -18
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -6
- package/src/components/lazy-wrapper.tsx +5 -5
- package/src/tools/AudioPlayer/components/HybridAudioPlayer.tsx +2 -2
- package/src/tools/Gallery/components/Gallery.tsx +2 -2
- package/src/tools/Gallery/components/lightbox/GalleryLightbox.tsx +2 -2
- package/src/tools/Gallery/components/media/GalleryImage.tsx +2 -2
- package/src/tools/Gallery/components/media/GalleryVideo.tsx +2 -2
- package/src/tools/ImageViewer/components/ImageToolbar.tsx +2 -2
- package/src/tools/ImageViewer/components/ImageViewer.tsx +2 -2
- package/src/tools/JsonForm/widgets/ColorWidget.tsx +2 -2
- package/src/tools/PrettyCode/PrettyCode.client.tsx +2 -2
- package/dist/JsonSchemaForm-65NLLK56.mjs +0 -4
- package/dist/JsonSchemaForm-PY6DH3HE.cjs +0 -13
- package/dist/PrettyCode.client-VH6C6OC5.cjs.map +0 -1
- package/dist/PrettyCode.client-VNTMCHXR.mjs.map +0 -1
- package/dist/chunk-7IIRYG4S.mjs.map +0 -1
- package/dist/chunk-BEURMR25.mjs.map +0 -1
- package/dist/chunk-IPRNIM7L.cjs.map +0 -1
- package/dist/chunk-PNZSJN6T.cjs.map +0 -1
- package/dist/chunk-SQLEKTT2.mjs.map +0 -1
- package/dist/chunk-ZQX7KIC5.cjs.map +0 -1
- package/dist/components-3DASJBTX.mjs +0 -5
- package/dist/components-NW2ZF6TG.cjs +0 -22
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/PrettyCode/PrettyCode.client.tsx"],"names":["className"],"mappings":"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","file":"PrettyCode.client-K45ON7DD.mjs","sourcesContent":["'use client';\n\nimport { Highlight, Language, themes } from 'prism-react-renderer';\nimport React, { useMemo, useRef } from 'react';\n\nimport { useAppT } from '@djangocfg/i18n';\nimport { useResolvedTheme } from '@djangocfg/ui-core/hooks';\nimport { FloatingToolbar } from '../../components/FloatingToolbar';\nimport { CopyAction } from '../../components/FloatingToolbar/actions';\n\ninterface PrettyCodeProps {\n data: string | object;\n language: Language;\n className?: string;\n mode?: 'dark' | 'light';\n inline?: boolean;\n customBg?: string; // Custom background class\n isCompact?: boolean; // Compact mode for smaller font sizes\n scrollIsolation?: boolean; // Block scroll capture until user clicks (default: true)\n}\n\nconst PrettyCode = ({ data, language, className, mode, inline = false, customBg, isCompact = false, scrollIsolation }: PrettyCodeProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const t = useAppT();\n const detectedTheme = useResolvedTheme();\n\n const labels = useMemo(() => ({\n copyCode: t('tools.code.copyCode'),\n noContent: t('tools.code.noContent'),\n }), [t]);\n\n // Font size based on compact mode\n const fontSize = isCompact ? '0.75rem' : '0.875rem'; // 12px vs 14px\n\n // Use provided mode or fall back to detected theme\n const currentTheme = mode || detectedTheme;\n const isDarkMode = currentTheme === 'dark';\n\n // Select the Prism theme based on the current theme\n const prismTheme = isDarkMode ? themes.vsDark : themes.vsLight;\n\n // Convert form object to JSON string with proper formatting\n const contentJson = typeof data === 'string' ? data : JSON.stringify(data || {}, null, 2);\n \n // Handle empty content\n if (!contentJson || contentJson.trim() === '') {\n const emptyBgClass = customBg || (isDarkMode ? 'bg-zinc-900' : 'bg-white');\n const emptyBorderClass = isDarkMode ? 'border-zinc-700' : 'border-border';\n return (\n <div className={`relative h-full ${emptyBgClass} rounded-sm border ${emptyBorderClass} ${className || ''}`}>\n <div className=\"h-full overflow-auto p-4\">\n <p className=\"text-muted-foreground text-sm italic\">{labels.noContent}</p>\n </div>\n </div>\n );\n }\n\n // Get display name for language badge\n const getLanguageDisplayName = (lang: string): string => {\n switch (lang.toLowerCase()) {\n case 'bash':\n case 'shell':\n return 'Bash';\n case 'python':\n case 'py':\n return 'Python';\n case 'javascript':\n case 'js':\n return 'JavaScript';\n case 'typescript':\n case 'ts':\n return 'TypeScript';\n case 'json':\n return 'JSON';\n case 'yaml':\n case 'yml':\n return 'YAML';\n case 'html':\n return 'HTML';\n case 'css':\n return 'CSS';\n case 'sql':\n return 'SQL';\n case 'xml':\n return 'XML';\n case 'markdown':\n case 'md':\n return 'Markdown';\n case 'plaintext':\n case 'text':\n return 'Text';\n case 'mermaid':\n return 'Mermaid';\n default:\n return lang.charAt(0).toUpperCase() + lang.slice(1);\n }\n };\n\n // Normalize language for Prism - use only basic supported languages\n const normalizedLanguage = (() => {\n const lang = language.toLowerCase();\n \n // Try basic languages that are definitely supported\n switch (lang) {\n case 'javascript':\n case 'js':\n return 'javascript';\n case 'typescript':\n case 'ts':\n return 'typescript'; // Try TypeScript first\n case 'python':\n case 'py':\n return 'python';\n case 'json':\n return 'json';\n case 'css':\n return 'css';\n case 'html':\n return 'markup';\n case 'xml':\n return 'markup';\n case 'bash':\n case 'shell':\n return 'bash';\n case 'sql':\n return 'sql';\n case 'yaml':\n case 'yml':\n return 'yaml';\n case 'markdown':\n case 'md':\n return 'markdown';\n case 'mermaid':\n return 'text'; // Mermaid is handled separately in MarkdownMessage\n default:\n // For unknown languages, try to use the original name first\n // If it doesn't work, Prism will fallback to plain text\n return lang || 'text';\n }\n })();\n\n const displayLanguage = getLanguageDisplayName(language);\n\n if (inline) {\n const inlineBgClass = customBg || (isDarkMode ? 'bg-zinc-800' : 'bg-zinc-100');\n return (\n <Highlight theme={prismTheme} code={contentJson} language={normalizedLanguage as Language}>\n {({ className, style, tokens, getTokenProps }) => (\n <code\n className={`${className} ${inlineBgClass} px-2 py-1 rounded ${isCompact ? 'text-xs' : 'text-sm'} font-mono inline-block`}\n style={{\n ...style,\n fontSize,\n fontFamily: 'monospace',\n }}\n >\n {tokens.map((line) => (\n line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))\n ))}\n </code>\n )}\n </Highlight>\n );\n }\n\n // Different backgrounds for dark/light - light mode uses white for better contrast with vsLight theme\n const bgClass = customBg || (isDarkMode ? 'bg-zinc-900' : 'bg-white');\n const borderClass = isDarkMode ? 'border-zinc-700' : 'border-border';\n\n return (\n <div ref={containerRef} className={`relative h-full ${bgClass} rounded-lg border ${borderClass} ${className || ''}`}>\n <FloatingToolbar\n containerRef={containerRef}\n scrollIsolation={scrollIsolation}\n label={\n <span className=\"inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-muted/80 text-muted-foreground border border-border/50 backdrop-blur-sm\">\n {displayLanguage}\n </span>\n }\n >\n <CopyAction value={contentJson} title={labels.copyCode} />\n </FloatingToolbar>\n\n <div className=\"h-full overflow-auto\">\n <Highlight theme={prismTheme} code={contentJson} language={normalizedLanguage as Language}>\n {({ className, style, tokens, getLineProps, getTokenProps }) => {\n // Remove background from Prism theme - we use our own via CSS\n const { backgroundColor: _bg, ...restStyle } = style;\n return (\n <pre\n className={`${className} rounded-lg`}\n style={{\n ...restStyle,\n margin: 0,\n padding: '2.5rem 1rem 1rem 1rem',\n fontSize,\n lineHeight: isCompact ? 1.4 : 1.5,\n fontFamily: 'monospace',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n overflowWrap: 'break-word',\n }}\n >\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line })}>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))}\n </div>\n ))}\n </pre>\n )}}\n </Highlight>\n </div>\n </div>\n );\n};\n\nexport default PrettyCode; "]}
|
|
@@ -4,7 +4,7 @@ import { useMemo, useState, useEffect, useCallback, useRef } from 'react';
|
|
|
4
4
|
import { ZoomOut, ZoomIn, Maximize2, FlipHorizontal, FlipVertical, RotateCw, Expand, ImageIcon, AlertCircle, ChevronLeft, ChevronRight } from 'lucide-react';
|
|
5
5
|
import { useControls, TransformWrapper, TransformComponent } from 'react-zoom-pan-pinch';
|
|
6
6
|
import { Alert, AlertDescription, cn as cn$1, Dialog, DialogContent, DialogTitle } from '@djangocfg/ui-core';
|
|
7
|
-
import {
|
|
7
|
+
import { useAppT } from '@djangocfg/i18n';
|
|
8
8
|
import { useHotkey } from '@djangocfg/ui-core/hooks';
|
|
9
9
|
import { Button, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem } from '@djangocfg/ui-core/components';
|
|
10
10
|
import { createMediaLogger, cn } from '@djangocfg/ui-core/lib';
|
|
@@ -65,7 +65,7 @@ function ImageToolbar({
|
|
|
65
65
|
onZoomPreset,
|
|
66
66
|
onExpand
|
|
67
67
|
}) {
|
|
68
|
-
const t =
|
|
68
|
+
const t = useAppT();
|
|
69
69
|
const { zoomIn, zoomOut, resetTransform } = useControls();
|
|
70
70
|
const labels = useMemo(() => ({
|
|
71
71
|
zoomIn: t("tools.image.zoomIn"),
|
|
@@ -374,7 +374,7 @@ function ImageViewer({
|
|
|
374
374
|
initialIndex = 0,
|
|
375
375
|
inDialog = false
|
|
376
376
|
}) {
|
|
377
|
-
const t =
|
|
377
|
+
const t = useAppT();
|
|
378
378
|
const [currentIndex, setCurrentIndex] = useState(
|
|
379
379
|
() => Math.max(0, Math.min(initialIndex, images.length - 1))
|
|
380
380
|
);
|
|
@@ -603,5 +603,5 @@ function ImageViewer({
|
|
|
603
603
|
__name(ImageViewer, "ImageViewer");
|
|
604
604
|
|
|
605
605
|
export { ImageInfo, ImageToolbar, ImageViewer };
|
|
606
|
-
//# sourceMappingURL=chunk-
|
|
607
|
-
//# sourceMappingURL=chunk-
|
|
606
|
+
//# sourceMappingURL=chunk-GGKGH5PM.mjs.map
|
|
607
|
+
//# sourceMappingURL=chunk-GGKGH5PM.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/ImageViewer/utils/constants.ts","../src/tools/ImageViewer/utils/lqip.ts","../src/tools/ImageViewer/utils/debug.ts","../src/tools/ImageViewer/components/ImageToolbar.tsx","../src/tools/ImageViewer/components/ImageInfo.tsx","../src/tools/ImageViewer/hooks/useImageTransform.ts","../src/tools/ImageViewer/hooks/useImageLoading.ts","../src/tools/ImageViewer/components/ImageViewer.tsx"],"names":["jsxs","useState","useEffect","useMemo","contentKey","url","useAppT","useRef","useCallback","jsx","cn","Fragment"],"mappings":"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","file":"chunk-GGKGH5PM.mjs","sourcesContent":["/**\n * ImageViewer constants\n */\n\nimport type { ZoomPreset, ImageTransform } from '../types';\n\n// =============================================================================\n// SIZE LIMITS\n// =============================================================================\n\n/** Maximum image size before blocking (50MB) */\nexport const MAX_IMAGE_SIZE = 50 * 1024 * 1024;\n\n/** Image size threshold for warning (10MB) */\nexport const WARNING_IMAGE_SIZE = 10 * 1024 * 1024;\n\n/** Progressive loading threshold - use LQIP for images > 500KB */\nexport const PROGRESSIVE_LOADING_THRESHOLD = 500 * 1024;\n\n// =============================================================================\n// LQIP CONFIGURATION\n// =============================================================================\n\n/** Low-quality placeholder size (32x32) */\nexport const LQIP_SIZE = 32;\n\n/** LQIP JPEG quality */\nexport const LQIP_QUALITY = 0.5;\n\n// =============================================================================\n// ZOOM CONFIGURATION\n// =============================================================================\n\n/** Minimum zoom level */\nexport const MIN_ZOOM = 0.1;\n\n/** Maximum zoom level */\nexport const MAX_ZOOM = 8;\n\n/** Available zoom presets */\nexport const ZOOM_PRESETS: readonly ZoomPreset[] = [\n { label: 'Fit', value: 'fit' },\n { label: '25%', value: 0.25 },\n { label: '50%', value: 0.5 },\n { label: '100%', value: 1 },\n { label: '200%', value: 2 },\n { label: '400%', value: 4 },\n] as const;\n\n// =============================================================================\n// DEFAULT VALUES\n// =============================================================================\n\n/** Default transform state */\nexport const DEFAULT_TRANSFORM: ImageTransform = {\n rotation: 0,\n flipH: false,\n flipV: false,\n};\n","/**\n * LQIP (Low-Quality Image Placeholder) generator\n *\n * Creates a tiny blurred preview image for progressive loading.\n */\n\nimport { LQIP_QUALITY, LQIP_SIZE } from './constants';\n\n/**\n * Create a low-quality image placeholder from source URL\n *\n * @param imageSrc - Full quality image URL\n * @returns Data URL of tiny preview, or null on error\n */\nexport async function createLQIP(imageSrc: string): Promise<string | null> {\n try {\n // Load the full image\n const img = new Image();\n img.crossOrigin = 'anonymous';\n\n await new Promise<void>((resolve, reject) => {\n img.onload = () => resolve();\n img.onerror = () => reject(new Error('Failed to load image for LQIP'));\n img.src = imageSrc;\n });\n\n // Calculate aspect ratio preserving dimensions\n const aspect = img.naturalWidth / img.naturalHeight;\n const width = aspect >= 1 ? LQIP_SIZE : Math.round(LQIP_SIZE * aspect);\n const height = aspect >= 1 ? Math.round(LQIP_SIZE / aspect) : LQIP_SIZE;\n\n // Create canvas for downscaling\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n\n // Draw scaled down image\n ctx.drawImage(img, 0, 0, width, height);\n\n // Return as data URL (very small, ~1-2KB)\n return canvas.toDataURL('image/jpeg', LQIP_QUALITY);\n } catch {\n return null;\n }\n}\n","'use client';\n\n/**\n * ImageViewer 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 imageDebug = createMediaLogger('ImageViewer');\n\nexport default imageDebug;\n","'use client';\n\n/**\n * ImageToolbar - Floating toolbar for image controls\n */\n\nimport { useMemo } from 'react';\nimport { ZoomIn, ZoomOut, RotateCw, FlipHorizontal, FlipVertical, Maximize2, Expand } from 'lucide-react';\nimport { useControls } from 'react-zoom-pan-pinch';\nimport { Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@djangocfg/ui-core/components';\nimport { useAppT } from '@djangocfg/i18n';\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { ZOOM_PRESETS } from '../utils';\nimport type { ImageToolbarProps } from '../types';\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport function ImageToolbar({\n scale,\n transform,\n onRotate,\n onFlipH,\n onFlipV,\n onZoomPreset,\n onExpand,\n}: ImageToolbarProps) {\n const t = useAppT();\n const { zoomIn, zoomOut, resetTransform } = useControls();\n\n const labels = useMemo(() => ({\n zoomIn: t('tools.image.zoomIn'),\n zoomOut: t('tools.image.zoomOut'),\n fitToView: t('tools.image.fitToView'),\n flipHorizontal: t('tools.image.flipHorizontal'),\n flipVertical: t('tools.image.flipVertical'),\n rotate: t('tools.image.rotate'),\n fullscreen: t('tools.image.fullscreen'),\n }), [t]);\n\n const zoomLabel = useMemo(() => {\n const percent = Math.round(scale * 100);\n return `${percent}%`;\n }, [scale]);\n\n return (\n <div className=\"absolute bottom-4 left-1/2 -translate-x-1/2 z-10 flex items-center gap-0.5 bg-background/90 backdrop-blur-sm border rounded-lg p-1 shadow-lg\">\n {/* Zoom controls */}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={() => zoomOut()}\n title={labels.zoomOut}\n >\n <ZoomOut className=\"h-3.5 w-3.5\" />\n </Button>\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 px-2 min-w-[52px] font-mono text-xs\">\n {zoomLabel}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"center\" className=\"min-w-[80px]\">\n {ZOOM_PRESETS.map((preset) => (\n <DropdownMenuItem\n key={preset.label}\n onClick={() => onZoomPreset(preset.value)}\n className=\"text-xs justify-center\"\n >\n {preset.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={() => zoomIn()}\n title={labels.zoomIn}\n >\n <ZoomIn className=\"h-3.5 w-3.5\" />\n </Button>\n\n <div className=\"w-px h-4 bg-border mx-1\" />\n\n {/* Fit to view */}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={() => resetTransform()}\n title={labels.fitToView}\n >\n <Maximize2 className=\"h-3.5 w-3.5\" />\n </Button>\n\n <div className=\"w-px h-4 bg-border mx-1\" />\n\n {/* Transform controls */}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={cn('h-7 w-7', transform.flipH && 'bg-accent')}\n onClick={onFlipH}\n title={labels.flipHorizontal}\n >\n <FlipHorizontal className=\"h-3.5 w-3.5\" />\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={cn('h-7 w-7', transform.flipV && 'bg-accent')}\n onClick={onFlipV}\n title={labels.flipVertical}\n >\n <FlipVertical className=\"h-3.5 w-3.5\" />\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={onRotate}\n title={labels.rotate}\n >\n <RotateCw className=\"h-3.5 w-3.5\" />\n </Button>\n\n {transform.rotation !== 0 && (\n <span className=\"text-[10px] text-muted-foreground font-mono pl-1\">\n {transform.rotation}°\n </span>\n )}\n\n {onExpand && (\n <>\n <div className=\"w-px h-4 bg-border mx-1\" />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={onExpand}\n title={labels.fullscreen}\n >\n <Expand className=\"h-3.5 w-3.5\" />\n </Button>\n </>\n )}\n </div>\n );\n}\n","'use client';\n\n/**\n * ImageInfo - Displays image dimensions badge\n */\n\nimport { useEffect, useState } from 'react';\nimport { useImageCache } from '../../../stores/mediaCache';\nimport type { ImageInfoProps } from '../types';\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport function ImageInfo({ src }: ImageInfoProps) {\n const { getDimensions, cacheDimensions } = useImageCache();\n const [dimensions, setDimensions] = useState<{ w: number; h: number } | null>(null);\n\n useEffect(() => {\n // Check cache first\n const cached = getDimensions(src);\n if (cached) {\n setDimensions({ w: cached.width, h: cached.height });\n return;\n }\n\n // Load and cache dimensions\n const img = new Image();\n img.onload = () => {\n const dims = { w: img.naturalWidth, h: img.naturalHeight };\n setDimensions(dims);\n cacheDimensions(src, { width: dims.w, height: dims.h });\n };\n img.src = src;\n }, [src, getDimensions, cacheDimensions]);\n\n if (!dimensions) return null;\n\n return (\n <div className=\"absolute top-3 right-3 z-10 px-2 py-1 bg-background/80 backdrop-blur-sm border rounded text-[10px] text-muted-foreground font-mono\">\n {dimensions.w} × {dimensions.h}\n </div>\n );\n}\n","'use client';\n\n/**\n * useImageTransform - Manages image rotation and flip state\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { DEFAULT_TRANSFORM } from '../utils';\n\nimport type { ImageTransform } from '../types';\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface UseImageTransformOptions {\n /** Reset transform when this key changes */\n resetKey?: string;\n}\n\nexport interface UseImageTransformReturn {\n /** Current transform state */\n transform: ImageTransform;\n /** Rotate 90 degrees clockwise */\n rotate: () => void;\n /** Toggle horizontal flip */\n flipH: () => void;\n /** Toggle vertical flip */\n flipV: () => void;\n /** Reset all transforms */\n reset: () => void;\n /** CSS transform string for applying to image */\n transformStyle: string;\n}\n\n// =============================================================================\n// HOOK\n// =============================================================================\n\nexport function useImageTransform(\n options: UseImageTransformOptions = {}\n): UseImageTransformReturn {\n const { resetKey } = options;\n\n const [transform, setTransform] = useState<ImageTransform>(DEFAULT_TRANSFORM);\n\n // Reset transform when key changes\n useEffect(() => {\n setTransform(DEFAULT_TRANSFORM);\n }, [resetKey]);\n\n const rotate = useCallback(() => {\n setTransform((prev) => ({\n ...prev,\n rotation: (prev.rotation + 90) % 360,\n }));\n }, []);\n\n const flipH = useCallback(() => {\n setTransform((prev) => ({\n ...prev,\n flipH: !prev.flipH,\n }));\n }, []);\n\n const flipV = useCallback(() => {\n setTransform((prev) => ({\n ...prev,\n flipV: !prev.flipV,\n }));\n }, []);\n\n const reset = useCallback(() => {\n setTransform(DEFAULT_TRANSFORM);\n }, []);\n\n // Build CSS transform string\n const transformStyle = useMemo(() => {\n const transforms: string[] = [];\n\n if (transform.rotation !== 0) {\n transforms.push(`rotate(${transform.rotation}deg)`);\n }\n if (transform.flipH) {\n transforms.push('scaleX(-1)');\n }\n if (transform.flipV) {\n transforms.push('scaleY(-1)');\n }\n\n return transforms.join(' ') || 'none';\n }, [transform]);\n\n return {\n transform,\n rotate,\n flipH,\n flipV,\n reset,\n transformStyle,\n };\n}\n","'use client';\n\n/**\n * useImageLoading - Manages image loading state with LQIP\n */\n\nimport { useEffect, useRef, useState } from 'react';\n\nimport { generateContentKey, useMediaCacheStore } from '../../../stores/mediaCache';\nimport {\n createLQIP, imageDebug, MAX_IMAGE_SIZE, PROGRESSIVE_LOADING_THRESHOLD, WARNING_IMAGE_SIZE\n} from '../utils';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface UseImageLoadingOptions {\n /** Image content (ArrayBuffer or string) */\n content: string | ArrayBuffer;\n /** MIME type for blob creation */\n mimeType?: string;\n /**\n * Direct image URL (bypasses content→blob conversion).\n * When provided, content is ignored and URL is used directly.\n */\n src?: string;\n}\n\nexport interface UseImageLoadingReturn {\n /** Blob URL source for the image */\n src: string | null;\n /** Low-quality placeholder URL */\n lqip: string | null;\n /** Whether full image is loaded */\n isFullyLoaded: boolean;\n /** Whether to use progressive loading */\n useProgressiveLoading: boolean;\n /** Error message if any */\n error: string | null;\n /** Content key for caching */\n contentKey: string | null;\n /** Image size in bytes */\n size: number;\n /** Whether content exists */\n hasContent: boolean;\n}\n\n// =============================================================================\n// HOOK\n// =============================================================================\n\nexport function useImageLoading(options: UseImageLoadingOptions): UseImageLoadingReturn {\n const { content, mimeType, src: directSrc } = options;\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\n const [src, setSrc] = useState<string | null>(null);\n const [lqip, setLqip] = useState<string | null>(null);\n const [isFullyLoaded, setIsFullyLoaded] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const contentKeyRef = useRef<string | null>(null);\n const isMountedRef = useRef(true);\n\n // Calculate size and flags\n const size = content ? (typeof content === 'string' ? content.length : content.byteLength) : 0;\n // When directSrc is provided, we have content (the URL itself)\n const hasContent = directSrc ? true : size > 0;\n const useProgressiveLoading = directSrc ? false : size > PROGRESSIVE_LOADING_THRESHOLD;\n\n // Track unmount for cleanup\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 blob URL with caching and size validation\n useEffect(() => {\n // Reset error state\n setError(null);\n\n // Direct URL mode - use as-is without blob conversion\n if (directSrc) {\n imageDebug.load(directSrc, 'url');\n setSrc(directSrc);\n setIsFullyLoaded(true);\n return;\n }\n\n if (!hasContent) {\n setSrc(null);\n return;\n }\n\n // Size validation - reject oversized images\n if (size > MAX_IMAGE_SIZE) {\n const sizeMB = (size / 1024 / 1024).toFixed(1);\n const errorMsg = `Image too large: ${sizeMB}MB (maximum: 50MB)`;\n imageDebug.error(errorMsg, { size, sizeMB, maxSize: MAX_IMAGE_SIZE });\n setError(errorMsg);\n setSrc(null);\n return;\n }\n\n // Warn about large images\n if (size > WARNING_IMAGE_SIZE) {\n const sizeMB = (size / 1024 / 1024).toFixed(1);\n imageDebug.warn(`Large image: ${sizeMB}MB - may impact performance`);\n }\n\n // Handle string content (data URLs or binary strings)\n if (typeof content === 'string') {\n // Pass through data URLs directly\n if (content.startsWith('data:')) {\n imageDebug.load(content.slice(0, 50) + '...', 'data-url');\n setSrc(content);\n return;\n }\n\n // Convert binary string to ArrayBuffer and use Blob URL\n const encoder = new TextEncoder();\n const buffer = encoder.encode(content).buffer;\n const contentKey = generateContentKey(buffer);\n\n // Release previous blob URL if content changed\n if (contentKeyRef.current && contentKeyRef.current !== contentKey) {\n releaseBlobUrl(contentKeyRef.current);\n }\n\n contentKeyRef.current = contentKey;\n const url = getOrCreateBlobUrl(contentKey, buffer, mimeType || 'image/png');\n imageDebug.load(url, 'blob');\n imageDebug.state('loaded', { size, mimeType, contentKey });\n setSrc(url);\n return;\n }\n\n // Handle ArrayBuffer with cached blob URL\n const contentKey = generateContentKey(content);\n\n // Release previous blob URL if content changed\n if (contentKeyRef.current && contentKeyRef.current !== contentKey) {\n releaseBlobUrl(contentKeyRef.current);\n }\n\n contentKeyRef.current = contentKey;\n const url = getOrCreateBlobUrl(contentKey, content, mimeType || 'image/png');\n imageDebug.load(url, 'blob');\n imageDebug.state('loaded', { size, mimeType, contentKey });\n setSrc(url);\n\n // No cleanup here - cleanup happens in unmount effect above\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [content, mimeType, hasContent, size, directSrc]);\n\n // Create LQIP for progressive loading\n useEffect(() => {\n if (!src || !useProgressiveLoading) {\n setLqip(null);\n setIsFullyLoaded(true);\n return;\n }\n\n setIsFullyLoaded(false);\n imageDebug.state('progressive loading', { size });\n\n // Create low-quality placeholder\n createLQIP(src).then((placeholder) => {\n if (placeholder) {\n imageDebug.debug('LQIP created');\n setLqip(placeholder);\n }\n });\n\n // Pre-load full image\n const img = new Image();\n img.onload = () => {\n imageDebug.state('fully loaded');\n setIsFullyLoaded(true);\n };\n img.onerror = () => {\n imageDebug.error('Failed to load full image');\n };\n img.src = src;\n }, [src, useProgressiveLoading, size]);\n\n return {\n src,\n lqip,\n isFullyLoaded,\n useProgressiveLoading,\n error,\n contentKey: contentKeyRef.current,\n size,\n hasContent,\n };\n}\n","'use client';\n\n/**\n * ImageViewer - Image viewer with zoom, pan, rotate, flip, gallery navigation\n *\n * Features:\n * - Zoom with mouse wheel and presets\n * - Pan with drag\n * - Rotate 90°\n * - Flip horizontal/vertical\n * - Fullscreen dialog\n * - Keyboard shortcuts (+/-, 0, r, ←/→ for gallery)\n * - Gallery mode: pass images[] with multiple items\n */\n\nimport { useEffect, useState, useRef, useCallback, useMemo } from 'react';\nimport { ImageIcon, AlertCircle, ChevronLeft, ChevronRight } from 'lucide-react';\nimport { TransformWrapper, TransformComponent, useControls } from 'react-zoom-pan-pinch';\nimport { cn, Dialog, DialogContent, DialogTitle, Alert, AlertDescription } from '@djangocfg/ui-core';\nimport { useAppT } from '@djangocfg/i18n';\nimport { useHotkey } from '@djangocfg/ui-core/hooks';\n\nimport { ImageToolbar } from './ImageToolbar';\nimport { ImageInfo } from './ImageInfo';\nimport { useImageTransform, useImageLoading } from '../hooks';\nimport type { ImageViewerProps, ImageItem } from '../types';\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport function ImageViewer({\n images,\n initialIndex = 0,\n inDialog = false,\n}: ImageViewerProps) {\n const t = useAppT();\n\n const [currentIndex, setCurrentIndex] = useState(() =>\n Math.max(0, Math.min(initialIndex, images.length - 1))\n );\n\n // Reset index when initialIndex changes (e.g. opening different image)\n useEffect(() => {\n setCurrentIndex(Math.max(0, Math.min(initialIndex, images.length - 1)));\n }, [initialIndex, images.length]);\n\n const current = images[currentIndex];\n const hasMultiple = images.length > 1;\n\n const [scale, setScale] = useState(1);\n const [dialogOpen, setDialogOpen] = useState(false);\n const [loadError, setLoadError] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const controlsRef = useRef<ReturnType<typeof useControls> | null>(null);\n\n const labels = useMemo(() => ({\n noImage: t('tools.image.noImage'),\n failedToLoad: t('tools.image.failedToLoad'),\n loading: t('ui.form.loading'),\n }), [t]);\n\n const {\n src,\n lqip,\n isFullyLoaded,\n useProgressiveLoading,\n error,\n hasContent,\n } = useImageLoading({\n content: current?.content ?? '',\n mimeType: current?.file.mimeType,\n src: current?.src,\n });\n\n useEffect(() => { setLoadError(false); }, [src]);\n\n const { transform, rotate, flipH, flipV, transformStyle } = useImageTransform({\n resetKey: current?.file.path ?? '',\n });\n\n const handleZoomPreset = useCallback((value: number | 'fit') => {\n if (!controlsRef.current) return;\n if (value === 'fit') controlsRef.current.resetTransform();\n else controlsRef.current.setTransform(0, 0, value);\n }, []);\n\n const handleExpand = useCallback(() => setDialogOpen(true), []);\n\n const prev = useCallback(() =>\n setCurrentIndex((i) => (i - 1 + images.length) % images.length),\n [images.length]\n );\n\n const next = useCallback(() =>\n setCurrentIndex((i) => (i + 1) % images.length),\n [images.length]\n );\n\n // Keyboard: zoom/rotate (only when container focused)\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!containerRef.current?.contains(document.activeElement) &&\n document.activeElement !== containerRef.current) return;\n const controls = controlsRef.current;\n if (!controls) return;\n switch (e.key) {\n case '+': case '=': e.preventDefault(); controls.zoomIn(); break;\n case '-': e.preventDefault(); controls.zoomOut(); break;\n case '0': e.preventDefault(); controls.resetTransform(); break;\n case 'r': if (!e.metaKey && !e.ctrlKey) { e.preventDefault(); rotate(); } break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [rotate]);\n\n // Keyboard: gallery navigation (global when open)\n useHotkey('ArrowLeft', prev, { enabled: hasMultiple, preventDefault: true });\n useHotkey('ArrowRight', next, { enabled: hasMultiple, preventDefault: true });\n\n if (!current) {\n return (\n <div className=\"flex-1 flex flex-col items-center justify-center gap-2 bg-muted/30\">\n <ImageIcon className=\"w-12 h-12 text-muted-foreground/50\" />\n <p className=\"text-sm text-muted-foreground\">{labels.noImage}</p>\n </div>\n );\n }\n\n if (error || loadError) {\n return (\n <div className=\"flex-1 flex flex-col items-center justify-center gap-3 bg-muted/30 p-4\">\n <AlertCircle className=\"w-12 h-12 text-destructive/70\" />\n <Alert variant=\"destructive\" className=\"max-w-md\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertDescription>{error || labels.failedToLoad}</AlertDescription>\n </Alert>\n </div>\n );\n }\n\n if (!hasContent) {\n return (\n <div className=\"flex-1 flex flex-col items-center justify-center gap-2 bg-muted/30\">\n <ImageIcon className=\"w-12 h-12 text-muted-foreground/50\" />\n <p className=\"text-sm text-muted-foreground\">{labels.noImage}</p>\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n tabIndex={0}\n className={cn(\n 'flex-1 h-full relative overflow-hidden outline-none',\n 'bg-[length:16px_16px]',\n '[background-color:hsl(var(--muted)/0.2)]',\n '[background-image:linear-gradient(45deg,hsl(var(--muted)/0.4)_25%,transparent_25%),linear-gradient(-45deg,hsl(var(--muted)/0.4)_25%,transparent_25%),linear-gradient(45deg,transparent_75%,hsl(var(--muted)/0.4)_75%),linear-gradient(-45deg,transparent_75%,hsl(var(--muted)/0.4)_75%)]',\n '[background-position:0_0,0_8px,8px_-8px,-8px_0px]'\n )}\n >\n {src && <ImageInfo src={src} />}\n\n {useProgressiveLoading && !isFullyLoaded && (\n <div className=\"absolute top-3 left-3 z-10 px-2 py-1 bg-background/80 backdrop-blur-sm border rounded text-[10px] text-muted-foreground font-mono flex items-center gap-1.5\">\n <div className=\"w-2 h-2 bg-blue-500 rounded-full animate-pulse\" />\n {labels.loading}\n </div>\n )}\n\n <TransformWrapper\n initialScale={1}\n minScale={0.1}\n maxScale={8}\n centerOnInit\n centerZoomedOut\n onTransformed={(ref, state) => { setScale(state.scale); controlsRef.current = ref; }}\n onInit={(ref) => { controlsRef.current = ref; }}\n wheel={{ step: 0.1 }}\n doubleClick={{ mode: 'toggle', step: 2 }}\n panning={{ velocityDisabled: false }}\n >\n <ImageToolbar\n scale={scale}\n transform={transform}\n onRotate={rotate}\n onFlipH={flipH}\n onFlipV={flipV}\n onZoomPreset={handleZoomPreset}\n onExpand={!inDialog ? handleExpand : undefined}\n />\n\n <TransformComponent\n wrapperClass=\"!w-full !h-full cursor-grab active:cursor-grabbing\"\n contentClass=\"!w-full !h-full flex items-center justify-center\"\n >\n <div className=\"relative\">\n {useProgressiveLoading && lqip && !isFullyLoaded && (\n <img\n src={lqip}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"absolute inset-0 max-w-full max-h-full object-contain select-none\"\n style={{ transform: transformStyle, filter: 'blur(20px)', transition: 'opacity 0.3s ease-out', opacity: isFullyLoaded ? 0 : 1 }}\n draggable={false}\n />\n )}\n {src && (\n <img\n src={src}\n alt={current.file.name}\n className=\"max-w-full max-h-full object-contain select-none\"\n style={{\n transform: transformStyle,\n transition: useProgressiveLoading ? 'transform 0.15s ease-out, opacity 0.3s ease-out' : 'transform 0.15s ease-out',\n opacity: useProgressiveLoading && !isFullyLoaded ? 0 : 1,\n }}\n draggable={false}\n crossOrigin=\"anonymous\"\n onError={() => setLoadError(true)}\n />\n )}\n </div>\n </TransformComponent>\n </TransformWrapper>\n\n {/* Gallery navigation */}\n {hasMultiple && (\n <>\n <button\n type=\"button\"\n onClick={prev}\n className=\"absolute left-2 top-1/2 -translate-y-1/2 z-10 bg-black/50 hover:bg-black/70 text-white rounded-full p-1.5 transition-colors\"\n >\n <ChevronLeft className=\"h-5 w-5\" />\n </button>\n <button\n type=\"button\"\n onClick={next}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 z-10 bg-black/50 hover:bg-black/70 text-white rounded-full p-1.5 transition-colors\"\n >\n <ChevronRight className=\"h-5 w-5\" />\n </button>\n <div className=\"absolute bottom-2 left-1/2 -translate-x-1/2 z-10 bg-black/50 text-white text-xs px-2 py-0.5 rounded-full pointer-events-none\">\n {currentIndex + 1} / {images.length}\n </div>\n </>\n )}\n\n {/* Fullscreen dialog */}\n {!inDialog && (\n <Dialog open={dialogOpen} onOpenChange={setDialogOpen}>\n <DialogContent className=\"max-w-[95vw] max-h-[95vh] w-[95vw] h-[95vh] p-0 overflow-hidden [&>button]:hidden flex flex-col\">\n <DialogTitle className=\"sr-only\">{current.file.name}</DialogTitle>\n <div className=\"flex items-center justify-between px-4 py-2 border-b shrink-0\">\n <span className=\"text-sm font-medium truncate\">{current.file.name}</span>\n </div>\n <div className=\"flex-1 min-h-0\">\n <ImageViewer images={images} initialIndex={currentIndex} inDialog />\n </div>\n </DialogContent>\n </Dialog>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -2,7 +2,7 @@ import { cn as cn$1, Button, Slider, useLocalStorage } from './chunk-JWB2EWQO.mj
|
|
|
2
2
|
import { __name } from './chunk-CGILA3WO.mjs';
|
|
3
3
|
import { createContext, memo, useRef, useCallback, useEffect, useMemo, useId, useState, useContext } from 'react';
|
|
4
4
|
import { Loader2, RotateCcw, SkipBack, Pause, Play, SkipForward, VolumeX, Volume2, Repeat, Music } from 'lucide-react';
|
|
5
|
-
import {
|
|
5
|
+
import { useAppT } from '@djangocfg/i18n';
|
|
6
6
|
import { create } from 'zustand';
|
|
7
7
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
8
8
|
import { cn, createMediaLogger } from '@djangocfg/ui-core/lib';
|
|
@@ -721,7 +721,7 @@ var HybridAudioPlayer = memo(/* @__PURE__ */ __name(function HybridAudioPlayer2(
|
|
|
721
721
|
className,
|
|
722
722
|
style
|
|
723
723
|
}) {
|
|
724
|
-
const t =
|
|
724
|
+
const t = useAppT();
|
|
725
725
|
const { state, controls } = useHybridAudioContext();
|
|
726
726
|
const labels = useMemo(() => ({
|
|
727
727
|
restart: t("tools.audio.restart"),
|
|
@@ -1615,5 +1615,5 @@ function HybridCompactPlayerInner({ title, waveformMode, showTimer, buttonSize,
|
|
|
1615
1615
|
__name(HybridCompactPlayerInner, "HybridCompactPlayerInner");
|
|
1616
1616
|
|
|
1617
1617
|
export { AudioReactiveCover, COLOR_SCHEMES2 as COLOR_SCHEMES, COLOR_SCHEME_INFO, EFFECT_ANIMATIONS, GlowEffect, HybridAudioPlayer, HybridAudioProvider, HybridCompactPlayer, HybridSimplePlayer, HybridWaveform, INTENSITY_CONFIG, INTENSITY_INFO, MeshEffect, OrbsEffect, SpotlightEffect, VARIANT_INFO, VisualizationProvider, calculateGlowLayers, calculateMeshGradients, calculateOrbs, calculateSpotlight, formatTime, getColors, getEffectConfig, prepareEffectColors, useAudioBus, useAudioBusStore, useAudioVisualization, useHybridAudio, useHybridAudioAnalysis, useHybridAudioContext, useHybridAudioControls, useHybridAudioLevels, useHybridAudioState, useHybridWebAudio, useVisualization };
|
|
1618
|
-
//# sourceMappingURL=chunk-
|
|
1619
|
-
//# sourceMappingURL=chunk-
|
|
1618
|
+
//# sourceMappingURL=chunk-HMHIVEMS.mjs.map
|
|
1619
|
+
//# sourceMappingURL=chunk-HMHIVEMS.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/AudioPlayer/hooks/useAudioBus.ts","../src/tools/AudioPlayer/hooks/useHybridAudio.ts","../src/tools/AudioPlayer/hooks/useHybridAudioAnalysis.ts","../src/tools/AudioPlayer/hooks/useVisualization.tsx","../src/tools/AudioPlayer/context/HybridAudioProvider.tsx","../src/tools/AudioPlayer/components/HybridWaveform.tsx","../src/tools/AudioPlayer/utils/formatTime.ts","../src/tools/AudioPlayer/utils/debug.ts","../src/tools/AudioPlayer/components/HybridAudioPlayer.tsx","../src/tools/AudioPlayer/effects/index.ts","../src/tools/AudioPlayer/components/ReactiveCover/effects/GlowEffect.tsx","../src/tools/AudioPlayer/components/ReactiveCover/effects/OrbsEffect.tsx","../src/tools/AudioPlayer/components/ReactiveCover/effects/SpotlightEffect.tsx","../src/tools/AudioPlayer/components/ReactiveCover/effects/MeshEffect.tsx","../src/tools/AudioPlayer/components/ReactiveCover/AudioReactiveCover.tsx","../src/tools/AudioPlayer/components/HybridSimplePlayer.tsx","../src/tools/AudioPlayer/components/HybridCompactPlayer.tsx"],"names":["useRef","useCallback","useEffect","useState","createContext","useMemo","jsx","useContext","HybridWaveform","cn","memo","HybridAudioPlayer","COLOR_SCHEMES","jsxs","Fragment","Loader2","Pause","Play"],"mappings":"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","file":"chunk-HMHIVEMS.mjs","sourcesContent":["'use client';\n\n/**\n * useAudioBus — Global audio exclusivity via Zustand store.\n *\n * Ensures only one audio player plays at a time across the entire page.\n * No provider needed — singleton store, works anywhere in the tree.\n *\n * Also integrates with @djangocfg/ui-tools AudioPlayer automatically\n * (wired into useHybridAudio).\n *\n * @example\n * const { announce } = useAudioBus('my-player-id', () => pause());\n *\n * // When playback starts:\n * announce(); // all other players will pause\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport { create } from 'zustand';\n\n// =============================================================================\n// Store\n// =============================================================================\n\ninterface AudioBusStore {\n /** ID of the currently active (playing) player, null if none */\n activeId: string | null;\n setActiveId: (id: string | null) => void;\n}\n\nexport const useAudioBusStore = create<AudioBusStore>((set) => ({\n activeId: null,\n setActiveId: (id) => set({ activeId: id }),\n}));\n\n// =============================================================================\n// Hook\n// =============================================================================\n\nexport interface UseAudioBusReturn {\n /** Broadcast: this player is now playing — all others should stop */\n announce: () => void;\n /** Release: this player stopped (clears activeId if it was ours) */\n release: () => void;\n}\n\n/**\n * @param playerId Stable unique ID for this player instance\n * @param onStop Called when another player announces — should pause this player\n */\nexport function useAudioBus(playerId: string, onStop: () => void): UseAudioBusReturn {\n const onStopRef = useRef(onStop);\n onStopRef.current = onStop;\n\n const setActiveId = useAudioBusStore((s) => s.setActiveId);\n\n // Subscribe to store changes — if another player becomes active, stop this one\n useEffect(() => {\n return useAudioBusStore.subscribe((state) => {\n if (state.activeId !== null && state.activeId !== playerId) {\n onStopRef.current();\n }\n });\n }, [playerId]);\n\n const announce = useCallback(() => {\n setActiveId(playerId);\n }, [playerId, setActiveId]);\n\n const release = useCallback(() => {\n useAudioBusStore.setState((s) => s.activeId === playerId ? { activeId: null } : s);\n }, [playerId]);\n\n return { announce, release };\n}\n","'use client';\n\n/**\n * useHybridAudio - Hybrid audio hook combining HTML5 audio + Web Audio API\n *\n * Uses native HTML5 <audio> for playback (no crackling, native streaming)\n * and Web Audio API only for visualization (AnalyserNode).\n *\n * Audio routing:\n * source -> destination (single path for playback)\n * source -> analyser (parallel path for visualization only, no output)\n */\n\nimport { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { useAudioBus } from './useAudioBus';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface UseHybridAudioOptions {\n src: string;\n autoPlay?: boolean;\n initialVolume?: number;\n loop?: boolean;\n crossOrigin?: 'anonymous' | 'use-credentials';\n /** Set to true to opt out of global audio bus (player won't stop others and won't be stopped) */\n excludeFromBus?: boolean;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onTimeUpdate?: (time: number) => void;\n onError?: (error: Error) => void;\n onReady?: () => void;\n}\n\nexport interface HybridAudioState {\n isReady: boolean;\n isPlaying: boolean;\n currentTime: number;\n duration: number;\n volume: number;\n isMuted: boolean;\n isLooping: boolean;\n buffered: TimeRanges | null;\n error: Error | null;\n}\n\nexport interface HybridAudioControls {\n play: () => Promise<void>;\n pause: () => void;\n togglePlay: () => void;\n seek: (time: number) => void;\n seekTo: (progress: number) => void;\n skip: (seconds: number) => void;\n setVolume: (vol: number) => void;\n toggleMute: () => void;\n toggleLoop: () => void;\n setLoop: (enabled: boolean) => void;\n restart: () => void;\n}\n\nexport interface HybridWebAudioAPI {\n context: AudioContext | null;\n analyser: AnalyserNode | null;\n sourceNode: MediaElementAudioSourceNode | null;\n}\n\nexport interface UseHybridAudioReturn {\n audioRef: React.RefObject<HTMLAudioElement | null>;\n state: HybridAudioState;\n controls: HybridAudioControls;\n webAudio: HybridWebAudioAPI;\n}\n\n// =============================================================================\n// HOOK\n// =============================================================================\n\nexport function useHybridAudio(options: UseHybridAudioOptions): UseHybridAudioReturn {\n const {\n src,\n autoPlay = false,\n initialVolume = 1,\n loop = false,\n crossOrigin = 'anonymous',\n excludeFromBus = false,\n onPlay,\n onPause,\n onEnded,\n onTimeUpdate,\n onError,\n onReady,\n } = options;\n\n const playerId = useId();\n\n // Refs\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const audioContextRef = useRef<AudioContext | null>(null);\n const sourceNodeRef = useRef<MediaElementAudioSourceNode | null>(null);\n const analyserRef = useRef<AnalyserNode | null>(null);\n const connectedElementRef = useRef<HTMLMediaElement | null>(null);\n\n // State\n const [state, setState] = useState<HybridAudioState>({\n isReady: false,\n isPlaying: false,\n currentTime: 0,\n duration: 0,\n volume: initialVolume,\n isMuted: false,\n isLooping: loop,\n buffered: null,\n error: null,\n });\n\n // Initialize Web Audio for visualization (lazy, on first play)\n const initWebAudio = useCallback(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n // Already connected to this element\n if (connectedElementRef.current === audio && audioContextRef.current) {\n return;\n }\n\n try {\n // Create AudioContext if needed\n if (!audioContextRef.current) {\n const AudioContextClass =\n window.AudioContext ||\n (window as unknown as { webkitAudioContext: typeof AudioContext }).webkitAudioContext;\n audioContextRef.current = new AudioContextClass();\n }\n\n const ctx = audioContextRef.current;\n\n // Disconnect old source if any\n if (sourceNodeRef.current) {\n try {\n sourceNodeRef.current.disconnect();\n } catch {\n /* ignore */\n }\n }\n\n // Create source from audio element\n const source = ctx.createMediaElementSource(audio);\n sourceNodeRef.current = source;\n\n // Create analyser for visualization\n const analyser = ctx.createAnalyser();\n analyser.fftSize = 256;\n analyser.smoothingTimeConstant = 0.85;\n analyserRef.current = analyser;\n\n // Audio routing:\n // 1. source -> destination (for playback)\n // 2. source -> analyser (for visualization only - NO output!)\n source.connect(ctx.destination);\n source.connect(analyser);\n // NOTE: analyser does NOT connect to destination - prevents double audio!\n\n connectedElementRef.current = audio;\n } catch (error) {\n console.warn('[useHybridAudio] Web Audio init failed:', error);\n }\n }, []);\n\n // Audio bus — stop other players when this one plays\n const { announce: busAnnounce, release: busRelease } = useAudioBus(\n playerId,\n useCallback(() => {\n if (!excludeFromBus) audioRef.current?.pause();\n }, [excludeFromBus])\n );\n\n // Resume AudioContext on user interaction\n const resumeAudioContext = useCallback(async () => {\n const ctx = audioContextRef.current;\n if (ctx && ctx.state === 'suspended') {\n await ctx.resume();\n }\n }, []);\n\n // Controls\n const play = useCallback(async () => {\n const audio = audioRef.current;\n if (!audio) return;\n\n try {\n if (!excludeFromBus) busAnnounce();\n initWebAudio();\n await resumeAudioContext();\n await audio.play();\n } catch (error) {\n console.error('[useHybridAudio] Play failed:', error);\n onError?.(error as Error);\n }\n }, [excludeFromBus, busAnnounce, initWebAudio, resumeAudioContext, onError]);\n\n const pause = useCallback(() => {\n audioRef.current?.pause();\n }, []);\n\n const togglePlay = useCallback(() => {\n if (state.isPlaying) {\n pause();\n } else {\n play();\n }\n }, [state.isPlaying, play, pause]);\n\n const seek = useCallback(\n (time: number) => {\n const audio = audioRef.current;\n if (audio && isFinite(time)) {\n audio.currentTime = Math.max(0, Math.min(time, state.duration || audio.duration || 0));\n }\n },\n [state.duration]\n );\n\n const seekTo = useCallback(\n (progress: number) => {\n const duration = state.duration || audioRef.current?.duration || 0;\n seek(duration * Math.max(0, Math.min(1, progress)));\n },\n [state.duration, seek]\n );\n\n const skip = useCallback(\n (seconds: number) => {\n seek(state.currentTime + seconds);\n },\n [state.currentTime, seek]\n );\n\n const setVolume = useCallback((vol: number) => {\n const audio = audioRef.current;\n if (audio) {\n const clampedVol = Math.max(0, Math.min(1, vol));\n audio.volume = clampedVol;\n setState((prev) => ({ ...prev, volume: clampedVol }));\n }\n }, []);\n\n const toggleMute = useCallback(() => {\n const audio = audioRef.current;\n if (audio) {\n audio.muted = !audio.muted;\n setState((prev) => ({ ...prev, isMuted: audio.muted }));\n }\n }, []);\n\n const toggleLoop = useCallback(() => {\n const audio = audioRef.current;\n if (audio) {\n audio.loop = !audio.loop;\n setState((prev) => ({ ...prev, isLooping: audio.loop }));\n }\n }, []);\n\n const setLoop = useCallback((enabled: boolean) => {\n const audio = audioRef.current;\n if (audio) {\n audio.loop = enabled;\n setState((prev) => ({ ...prev, isLooping: enabled }));\n }\n }, []);\n\n const restart = useCallback(() => {\n seek(0);\n play();\n }, [seek, play]);\n\n const controls: HybridAudioControls = {\n play,\n pause,\n togglePlay,\n seek,\n seekTo,\n skip,\n setVolume,\n toggleMute,\n toggleLoop,\n setLoop,\n restart,\n };\n\n // Create audio element on mount\n useEffect(() => {\n const audio = document.createElement('audio');\n audio.preload = 'metadata';\n audio.crossOrigin = crossOrigin;\n audio.volume = initialVolume;\n audio.loop = loop;\n audioRef.current = audio;\n\n return () => {\n audio.pause();\n audio.src = '';\n busRelease();\n if (audioContextRef.current) {\n audioContextRef.current.close().catch(() => {});\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Event handlers\n useEffect(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n const handlers = {\n loadedmetadata: () => {\n setState((prev) => ({\n ...prev,\n duration: audio.duration,\n isReady: true,\n }));\n onReady?.();\n },\n canplay: () => {\n setState((prev) => ({ ...prev, isReady: true }));\n if (autoPlay) {\n play();\n }\n },\n play: () => {\n setState((prev) => ({ ...prev, isPlaying: true }));\n onPlay?.();\n },\n pause: () => {\n setState((prev) => ({ ...prev, isPlaying: false }));\n onPause?.();\n },\n ended: () => {\n setState((prev) => ({ ...prev, isPlaying: false }));\n onEnded?.();\n },\n timeupdate: () => {\n setState((prev) => ({ ...prev, currentTime: audio.currentTime }));\n onTimeUpdate?.(audio.currentTime);\n },\n progress: () => {\n setState((prev) => ({ ...prev, buffered: audio.buffered }));\n },\n error: () => {\n const error = new Error(audio.error?.message || 'Audio error');\n setState((prev) => ({ ...prev, error }));\n onError?.(error);\n },\n volumechange: () => {\n setState((prev) => ({\n ...prev,\n volume: audio.volume,\n isMuted: audio.muted,\n }));\n },\n };\n\n Object.entries(handlers).forEach(([event, handler]) => {\n audio.addEventListener(event, handler);\n });\n\n return () => {\n Object.entries(handlers).forEach(([event, handler]) => {\n audio.removeEventListener(event, handler);\n });\n };\n }, [autoPlay, onPlay, onPause, onEnded, onTimeUpdate, onError, onReady, play]);\n\n // Load new source\n useEffect(() => {\n const audio = audioRef.current;\n if (!audio || !src) return;\n\n setState((prev) => ({\n ...prev,\n isReady: false,\n currentTime: 0,\n duration: 0,\n error: null,\n }));\n\n audio.src = src;\n audio.load();\n }, [src]);\n\n return {\n audioRef,\n state,\n controls,\n webAudio: {\n context: audioContextRef.current,\n analyser: analyserRef.current,\n sourceNode: sourceNodeRef.current,\n },\n };\n}\n","'use client';\n\n/**\n * useHybridAudioAnalysis - Audio frequency analysis for hybrid player.\n *\n * Simplified version of useAudioAnalysis that works directly with AnalyserNode\n * instead of SharedWebAudioContext.\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type { AudioLevels } from '../effects';\n\nexport function useHybridAudioAnalysis(\n analyser: AnalyserNode | null,\n isPlaying: boolean\n): AudioLevels {\n const [levels, setLevels] = useState<AudioLevels>({ bass: 0, mid: 0, high: 0, overall: 0 });\n const animationRef = useRef<number | null>(null);\n const dataArrayRef = useRef<Uint8Array<ArrayBuffer> | null>(null);\n\n const cleanup = useCallback(() => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n animationRef.current = null;\n }\n }, []);\n\n // Initialize data array when analyser is available\n useEffect(() => {\n if (analyser && !dataArrayRef.current) {\n dataArrayRef.current = new Uint8Array(analyser.frequencyBinCount) as Uint8Array<ArrayBuffer>;\n }\n }, [analyser]);\n\n // Animation loop\n useEffect(() => {\n if (!isPlaying || !analyser || !dataArrayRef.current) {\n cleanup();\n // Smooth fade out when stopped\n setLevels((prev) => ({\n bass: prev.bass * 0.95 < 0.01 ? 0 : prev.bass * 0.95,\n mid: prev.mid * 0.95 < 0.01 ? 0 : prev.mid * 0.95,\n high: prev.high * 0.95 < 0.01 ? 0 : prev.high * 0.95,\n overall: prev.overall * 0.95 < 0.01 ? 0 : prev.overall * 0.95,\n }));\n return;\n }\n\n const dataArray = dataArrayRef.current;\n\n const animate = () => {\n analyser.getByteFrequencyData(dataArray);\n const binCount = dataArray.length;\n\n // Bass (0-15% of frequency range)\n const bassEnd = Math.floor(binCount * 0.15);\n let bassSum = 0;\n for (let i = 0; i < bassEnd; i++) bassSum += dataArray[i];\n const bass = bassSum / bassEnd / 255;\n\n // Mids (15-50% of frequency range)\n const midStart = bassEnd;\n const midEnd = Math.floor(binCount * 0.5);\n let midSum = 0;\n for (let i = midStart; i < midEnd; i++) midSum += dataArray[i];\n const mid = midSum / (midEnd - midStart) / 255;\n\n // Highs (50-100% of frequency range)\n const highStart = midEnd;\n let highSum = 0;\n for (let i = highStart; i < binCount; i++) highSum += dataArray[i];\n const high = highSum / (binCount - highStart) / 255;\n\n // Overall\n let totalSum = 0;\n for (let i = 0; i < binCount; i++) totalSum += dataArray[i];\n const overall = totalSum / binCount / 255;\n\n // Smooth with lerp for natural feel\n setLevels((prev) => ({\n bass: prev.bass * 0.7 + bass * 0.3,\n mid: prev.mid * 0.7 + mid * 0.3,\n high: prev.high * 0.7 + high * 0.3,\n overall: prev.overall * 0.7 + overall * 0.3,\n }));\n\n animationRef.current = requestAnimationFrame(animate);\n };\n\n animationRef.current = requestAnimationFrame(animate);\n return cleanup;\n }, [analyser, isPlaying, cleanup]);\n\n return levels;\n}\n","'use client';\n\n/**\n * useVisualization - Hook for managing audio visualization settings\n *\n * Persists settings in localStorage for user preferences\n * Uses React Context for shared state between components\n */\n\nimport { createContext, useContext, useCallback, useMemo, type ReactNode } from 'react';\nimport { useLocalStorage } from '../../_shared';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type VisualizationVariant = 'glow' | 'orbs' | 'spotlight' | 'mesh' | 'none';\nexport type VisualizationIntensity = 'subtle' | 'medium' | 'strong';\nexport type VisualizationColorScheme = 'primary' | 'vibrant' | 'cool' | 'warm';\n\nexport interface VisualizationSettings {\n /** Enable reactive cover animation */\n enabled: boolean;\n /** Visual effect variant */\n variant: VisualizationVariant;\n /** Effect intensity */\n intensity: VisualizationIntensity;\n /** Color scheme */\n colorScheme: VisualizationColorScheme;\n /** Playback volume (0-1) */\n volume: number;\n /** Loop playback */\n isLooping: boolean;\n}\n\nexport interface UseVisualizationReturn {\n /** Current settings */\n settings: VisualizationSettings;\n /** Toggle visualization on/off */\n toggle: () => void;\n /** Set specific setting */\n setSetting: <K extends keyof VisualizationSettings>(\n key: K,\n value: VisualizationSettings[K]\n ) => void;\n /** Cycle to next variant */\n nextVariant: () => void;\n /** Cycle to next intensity */\n nextIntensity: () => void;\n /** Cycle to next color scheme */\n nextColorScheme: () => void;\n /** Reset to defaults */\n reset: () => void;\n}\n\n// Backward compatibility alias\nexport type UseAudioVisualizationReturn = UseVisualizationReturn;\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst STORAGE_KEY = 'audio-player-settings';\n\nconst DEFAULT_SETTINGS: VisualizationSettings = {\n enabled: true,\n variant: 'spotlight',\n intensity: 'medium',\n colorScheme: 'primary',\n volume: 1,\n isLooping: false,\n};\n\nconst VARIANTS: VisualizationVariant[] = ['spotlight', 'glow', 'orbs', 'mesh', 'none'];\nconst INTENSITIES: VisualizationIntensity[] = ['subtle', 'medium', 'strong'];\nconst COLOR_SCHEMES: VisualizationColorScheme[] = ['primary', 'vibrant', 'cool', 'warm'];\n\n// =============================================================================\n// CONTEXT\n// =============================================================================\n\nconst VisualizationContext = createContext<UseVisualizationReturn | null>(null);\n\n// =============================================================================\n// PROVIDER\n// =============================================================================\n\nexport interface VisualizationProviderProps {\n children: ReactNode;\n}\n\nexport function VisualizationProvider({ children }: VisualizationProviderProps) {\n const value = useVisualizationState();\n return (\n <VisualizationContext.Provider value={value}>\n {children}\n </VisualizationContext.Provider>\n );\n}\n\n// =============================================================================\n// INTERNAL HOOK (creates the actual state)\n// =============================================================================\n\nfunction useVisualizationState(): UseVisualizationReturn {\n const [settings, setSettings] = useLocalStorage<VisualizationSettings>(\n STORAGE_KEY,\n DEFAULT_SETTINGS\n );\n\n const toggle = useCallback(() => {\n setSettings((prev) => ({ ...prev, enabled: !prev.enabled }));\n }, [setSettings]);\n\n const setSetting = useCallback(\n <K extends keyof VisualizationSettings>(\n key: K,\n value: VisualizationSettings[K]\n ) => {\n setSettings((prev) => ({ ...prev, [key]: value }));\n },\n [setSettings]\n );\n\n const nextVariant = useCallback(() => {\n setSettings((prev) => {\n const currentIndex = VARIANTS.indexOf(prev.variant);\n const nextIndex = (currentIndex + 1) % VARIANTS.length;\n return { ...prev, variant: VARIANTS[nextIndex] };\n });\n }, [setSettings]);\n\n const nextIntensity = useCallback(() => {\n setSettings((prev) => {\n const currentIndex = INTENSITIES.indexOf(prev.intensity);\n const nextIndex = (currentIndex + 1) % INTENSITIES.length;\n return { ...prev, intensity: INTENSITIES[nextIndex] };\n });\n }, [setSettings]);\n\n const nextColorScheme = useCallback(() => {\n setSettings((prev) => {\n const currentIndex = COLOR_SCHEMES.indexOf(prev.colorScheme);\n const nextIndex = (currentIndex + 1) % COLOR_SCHEMES.length;\n return { ...prev, colorScheme: COLOR_SCHEMES[nextIndex] };\n });\n }, [setSettings]);\n\n const reset = useCallback(() => {\n setSettings(DEFAULT_SETTINGS);\n }, [setSettings]);\n\n return useMemo(\n () => ({\n settings,\n toggle,\n setSetting,\n nextVariant,\n nextIntensity,\n nextColorScheme,\n reset,\n }),\n [settings, toggle, setSetting, nextVariant, nextIntensity, nextColorScheme, reset]\n );\n}\n\n// =============================================================================\n// HOOK (uses context when available)\n// =============================================================================\n\nexport function useVisualization(): UseVisualizationReturn {\n const context = useContext(VisualizationContext);\n\n // Always call the fallback hooks (React hooks rules require consistent calls)\n const fallbackState = useVisualizationState();\n\n // If inside a provider, use shared context; otherwise use fallback\n return context ?? fallbackState;\n}\n\n// Backward compatibility alias\nexport const useAudioVisualization = useVisualization;\n\n// =============================================================================\n// VARIANT INFO\n// =============================================================================\n\nexport const VARIANT_INFO: Record<VisualizationVariant, { label: string; icon: string }> = {\n spotlight: { label: 'Spotlight', icon: '💫' },\n glow: { label: 'Glow', icon: '✨' },\n orbs: { label: 'Orbs', icon: '🔮' },\n mesh: { label: 'Mesh', icon: '🌈' },\n none: { label: 'Off', icon: '⭕' },\n};\n\nexport const INTENSITY_INFO: Record<VisualizationIntensity, { label: string }> = {\n subtle: { label: 'Subtle' },\n medium: { label: 'Medium' },\n strong: { label: 'Strong' },\n};\n\nexport const COLOR_SCHEME_INFO: Record<VisualizationColorScheme, { label: string; preview: string }> = {\n primary: { label: 'Primary', preview: '🔵' },\n vibrant: { label: 'Vibrant', preview: '🌈' },\n cool: { label: 'Cool', preview: '💙' },\n warm: { label: 'Warm', preview: '🔥' },\n};\n","'use client';\n\n/**\n * HybridAudioProvider - Context provider for hybrid audio player.\n *\n * Provides audio state, controls, and analysis data to child components.\n * Uses native HTML5 audio for playback with Web Audio API for visualization only.\n */\n\nimport { createContext, useContext, useMemo, useEffect, useRef, type ReactNode } from 'react';\nimport {\n useHybridAudio,\n type UseHybridAudioOptions,\n type HybridAudioState,\n type HybridAudioControls,\n type HybridWebAudioAPI,\n} from '../hooks/useHybridAudio';\nimport { useHybridAudioAnalysis } from '../hooks/useHybridAudioAnalysis';\nimport { useVisualization } from '../hooks/useVisualization';\nimport type { AudioLevels } from '../effects';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface HybridAudioContextValue {\n // Audio state\n state: HybridAudioState;\n\n // Controls\n controls: HybridAudioControls;\n\n // Web Audio (for visualizations)\n webAudio: HybridWebAudioAPI;\n\n // Audio levels (for reactive effects)\n audioLevels: AudioLevels;\n\n // Audio element ref (for custom integrations)\n audioRef: React.RefObject<HTMLAudioElement | null>;\n}\n\n// =============================================================================\n// CONTEXT\n// =============================================================================\n\nconst HybridAudioContext = createContext<HybridAudioContextValue | null>(null);\n\n// =============================================================================\n// PROVIDER\n// =============================================================================\n\nexport interface HybridAudioProviderProps extends UseHybridAudioOptions {\n children: ReactNode;\n}\n\nexport function HybridAudioProvider({ children, ...options }: HybridAudioProviderProps) {\n // Load persisted settings (shared with visualization)\n const { settings: savedSettings, setSetting } = useVisualization();\n\n // Use saved settings as initial values\n const effectiveOptions = {\n ...options,\n initialVolume: savedSettings.volume,\n loop: savedSettings.isLooping,\n };\n\n const { audioRef, state, controls, webAudio } = useHybridAudio(effectiveOptions);\n\n // Track if we've applied initial settings\n const hasAppliedInitialSettings = useRef(false);\n\n // Apply saved settings after audio is ready (for hydration timing)\n useEffect(() => {\n if (!state.isReady || hasAppliedInitialSettings.current) return;\n hasAppliedInitialSettings.current = true;\n\n // Apply saved volume and loop settings\n controls.setVolume(savedSettings.volume);\n controls.setLoop(savedSettings.isLooping);\n }, [state.isReady, savedSettings, controls]);\n\n // Persist settings when they change\n useEffect(() => {\n if (!state.isReady) return;\n\n // Only save if values actually changed\n if (state.volume !== savedSettings.volume) {\n setSetting('volume', state.volume);\n }\n if (state.isLooping !== savedSettings.isLooping) {\n setSetting('isLooping', state.isLooping);\n }\n }, [state.isReady, state.volume, state.isLooping, savedSettings, setSetting]);\n\n // Audio analysis for reactive effects\n const audioLevels = useHybridAudioAnalysis(webAudio.analyser, state.isPlaying);\n\n const value = useMemo<HybridAudioContextValue>(\n () => ({\n state,\n controls,\n webAudio,\n audioLevels,\n audioRef,\n }),\n [state, controls, webAudio, audioLevels, audioRef]\n );\n\n return <HybridAudioContext.Provider value={value}>{children}</HybridAudioContext.Provider>;\n}\n\n// =============================================================================\n// HOOKS\n// =============================================================================\n\n/**\n * Access full hybrid audio context\n */\nexport function useHybridAudioContext(): HybridAudioContextValue {\n const context = useContext(HybridAudioContext);\n if (!context) {\n throw new Error('useHybridAudioContext must be used within HybridAudioProvider');\n }\n return context;\n}\n\n/**\n * Access audio state only (read-only)\n */\nexport function useHybridAudioState(): HybridAudioState {\n const { state } = useHybridAudioContext();\n return state;\n}\n\n/**\n * Access audio controls only (no state re-renders)\n */\nexport function useHybridAudioControls(): HybridAudioControls {\n const { controls } = useHybridAudioContext();\n return controls;\n}\n\n/**\n * Access audio levels for reactive effects\n */\nexport function useHybridAudioLevels(): AudioLevels {\n const { audioLevels } = useHybridAudioContext();\n return audioLevels;\n}\n\n/**\n * Access Web Audio API for custom visualizations\n */\nexport function useHybridWebAudio(): HybridWebAudioAPI {\n const { webAudio } = useHybridAudioContext();\n return webAudio;\n}\n","'use client';\n\n/**\n * HybridWaveform - Real-time frequency visualization for hybrid player.\n *\n * Two modes:\n * - 'frequency': Real-time frequency bars (default, requires playing audio)\n * - 'static': Static progress bar (for when no analyser is available)\n *\n * Features:\n * - Shows buffered regions\n * - Click to seek\n * - Responsive width\n */\n\nimport { useRef, useEffect, useCallback, memo } from 'react';\nimport { useHybridAudioContext } from '../context/HybridAudioProvider';\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { useThemeColor } from '@djangocfg/ui-core/styles/palette';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface HybridWaveformProps {\n /** Visualization mode */\n mode?: 'frequency' | 'static';\n /** Canvas height in pixels */\n height?: number;\n /** Bar width in pixels */\n barWidth?: number;\n /** Gap between bars in pixels */\n barGap?: number;\n /** Bar border radius */\n barRadius?: number;\n /** Color for played portion */\n progressColor?: string;\n /** Color for unplayed portion */\n waveColor?: string;\n /** Color for buffered regions indicator */\n bufferedColor?: string;\n /** Additional CSS class */\n className?: string;\n /** Callback when user seeks */\n onSeek?: (time: number) => void;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport const HybridWaveform = memo(function HybridWaveform({\n mode = 'frequency',\n height = 64,\n barWidth = 3,\n barGap = 2,\n barRadius = 2,\n progressColor,\n waveColor,\n bufferedColor,\n className,\n onSeek,\n}: HybridWaveformProps) {\n const themePrimary = useThemeColor('primary');\n const themePrimaryWave = useThemeColor('primary', 0.3);\n const themePrimaryBuffered = useThemeColor('primary', 0.15);\n const resolvedProgressColor = progressColor ?? themePrimary;\n const resolvedWaveColor = waveColor ?? themePrimaryWave;\n const resolvedBufferedColor = bufferedColor ?? themePrimaryBuffered;\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const animationRef = useRef<number | null>(null);\n const { state, controls, webAudio } = useHybridAudioContext();\n\n // Handle click to seek\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLCanvasElement>) => {\n const canvas = canvasRef.current;\n if (!canvas || !state.duration) return;\n\n const rect = canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const progress = x / rect.width;\n const time = state.duration * progress;\n\n controls.seek(time);\n onSeek?.(time);\n },\n [state.duration, controls, onSeek]\n );\n\n // Render frequency bars (real-time visualization)\n const renderFrequency = useCallback(() => {\n const canvas = canvasRef.current;\n const analyser = webAudio.analyser;\n if (!canvas) return;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const { width, height: canvasHeight } = canvas;\n const dpr = window.devicePixelRatio || 1;\n const displayWidth = width / dpr;\n\n // Get frequency data if analyser is available\n let dataArray: Uint8Array<ArrayBuffer> | null = null;\n if (analyser) {\n dataArray = new Uint8Array(analyser.frequencyBinCount) as Uint8Array<ArrayBuffer>;\n analyser.getByteFrequencyData(dataArray);\n }\n\n ctx.clearRect(0, 0, width, canvasHeight);\n\n // Draw buffered regions at bottom\n if (state.buffered && state.duration > 0) {\n ctx.fillStyle = resolvedBufferedColor;\n for (let i = 0; i < state.buffered.length; i++) {\n const start = (state.buffered.start(i) / state.duration) * width;\n const end = (state.buffered.end(i) / state.duration) * width;\n ctx.fillRect(start, canvasHeight - 3 * dpr, end - start, 3 * dpr);\n }\n }\n\n // Calculate bar count based on available width\n const barCount = Math.floor(displayWidth / (barWidth + barGap));\n const progress = state.duration > 0 ? state.currentTime / state.duration : 0;\n const progressX = width * progress;\n\n // Draw bars\n for (let i = 0; i < barCount; i++) {\n let barHeight: number;\n\n if (dataArray && state.isPlaying) {\n // Real-time frequency data\n const step = Math.floor(dataArray.length / barCount);\n const value = dataArray[i * step] / 255;\n barHeight = Math.max(4 * dpr, value * (canvasHeight - 6 * dpr) * 0.9);\n } else {\n // Static fallback - small bars\n barHeight = 8 * dpr;\n }\n\n const x = i * (barWidth + barGap) * dpr;\n const y = (canvasHeight - barHeight) / 2;\n\n ctx.fillStyle = x < progressX ? resolvedProgressColor : resolvedWaveColor;\n\n // Draw rounded rect\n const radius = barRadius * dpr;\n const rectWidth = barWidth * dpr;\n ctx.beginPath();\n ctx.roundRect(x, y, rectWidth, barHeight, radius);\n ctx.fill();\n }\n\n // Continue animation if playing\n if (state.isPlaying) {\n animationRef.current = requestAnimationFrame(renderFrequency);\n }\n }, [\n webAudio.analyser,\n state.buffered,\n state.duration,\n state.currentTime,\n state.isPlaying,\n barWidth,\n barGap,\n barRadius,\n resolvedProgressColor,\n resolvedWaveColor,\n resolvedBufferedColor,\n ]);\n\n // Render static progress bar\n const renderStatic = useCallback(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const { width, height: canvasHeight } = canvas;\n const dpr = window.devicePixelRatio || 1;\n\n ctx.clearRect(0, 0, width, canvasHeight);\n\n // Draw progress bar\n const progress = state.duration > 0 ? state.currentTime / state.duration : 0;\n const progressWidth = width * progress;\n\n // Background track\n ctx.fillStyle = resolvedWaveColor;\n ctx.fillRect(0, canvasHeight / 2 - 2 * dpr, width, 4 * dpr);\n\n // Buffered region (thin strip at bottom)\n if (state.buffered && state.duration > 0) {\n ctx.fillStyle = resolvedBufferedColor;\n for (let i = 0; i < state.buffered.length; i++) {\n const start = (state.buffered.start(i) / state.duration) * width;\n const end = (state.buffered.end(i) / state.duration) * width;\n ctx.fillRect(start, canvasHeight - 2 * dpr, end - start, 2 * dpr);\n }\n }\n\n // Progress\n ctx.fillStyle = resolvedProgressColor;\n ctx.fillRect(0, canvasHeight / 2 - 2 * dpr, progressWidth, 4 * dpr);\n\n // Handle\n if (progress > 0) {\n ctx.beginPath();\n ctx.arc(progressWidth, canvasHeight / 2, 6 * dpr, 0, Math.PI * 2);\n ctx.fill();\n }\n }, [state.buffered, state.duration, state.currentTime, resolvedProgressColor, resolvedWaveColor, resolvedBufferedColor]);\n\n // Resize canvas to match container\n useEffect(() => {\n const container = containerRef.current;\n const canvas = canvasRef.current;\n if (!container || !canvas) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (!entry) return;\n\n const dpr = window.devicePixelRatio || 1;\n const displayWidth = entry.contentRect.width;\n const displayHeight = height;\n\n canvas.width = displayWidth * dpr;\n canvas.height = displayHeight * dpr;\n canvas.style.width = `${displayWidth}px`;\n canvas.style.height = `${displayHeight}px`;\n\n // Re-render after resize\n if (mode === 'frequency') {\n renderFrequency();\n } else {\n renderStatic();\n }\n });\n\n resizeObserver.observe(container);\n return () => resizeObserver.disconnect();\n }, [height, mode, renderFrequency, renderStatic]);\n\n // Animation loop for frequency mode\n useEffect(() => {\n if (mode === 'frequency') {\n renderFrequency();\n }\n\n return () => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n }\n };\n }, [mode, renderFrequency]);\n\n // Re-render on time change for static mode\n useEffect(() => {\n if (mode === 'static') {\n renderStatic();\n }\n }, [mode, state.currentTime, renderStatic]);\n\n // Re-render frequency when playback state changes\n useEffect(() => {\n if (mode === 'frequency' && !state.isPlaying) {\n // One final render when stopped\n renderFrequency();\n }\n }, [mode, state.isPlaying, renderFrequency]);\n\n return (\n <div ref={containerRef} className={cn('w-full', className)}>\n <canvas\n ref={canvasRef}\n onClick={handleClick}\n className=\"cursor-pointer\"\n style={{ width: '100%', height }}\n />\n </div>\n );\n});\n","/**\n * formatTime - Format seconds to mm:ss string\n */\n\nexport function formatTime(seconds: number): string {\n if (!seconds || !isFinite(seconds) || seconds < 0) return '0:00';\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n}\n","'use client';\n\n/**\n * AudioPlayer 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 audioDebug = createMediaLogger('AudioPlayer');\n\nexport default audioDebug;\n","'use client';\n\n/**\n * HybridAudioPlayer - Audio playback controls with frequency visualization\n *\n * Uses HybridAudioContext for state management.\n * Native HTML5 audio for playback, Web Audio API for visualization only.\n *\n * Features:\n * - Real-time frequency visualization\n * - Playback controls (play, pause, skip, restart)\n * - Volume control with mute\n * - Loop toggle\n * - Keyboard shortcuts\n * - Timer display\n */\n\nimport { memo, useMemo } from 'react';\nimport {\n Play,\n Pause,\n RotateCcw,\n SkipBack,\n SkipForward,\n Volume2,\n VolumeX,\n Loader2,\n Repeat,\n} from 'lucide-react';\nimport { useAppT } from '@djangocfg/i18n';\nimport { Button, Slider, cn } from '../../_shared';\nimport { useHybridAudioContext } from '../context/HybridAudioProvider';\nimport { HybridWaveform } from './HybridWaveform';\nimport { formatTime } from '../utils';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface HybridAudioPlayerProps {\n /** Show playback controls */\n showControls?: boolean;\n /** Show frequency waveform */\n showWaveform?: boolean;\n /** Waveform visualization mode */\n waveformMode?: 'frequency' | 'static';\n /** Waveform height in pixels */\n waveformHeight?: number;\n /** Show time display */\n showTimer?: boolean;\n /** Show volume control */\n showVolume?: boolean;\n /** Show loop button */\n showLoop?: boolean;\n /** Additional CSS class */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport const HybridAudioPlayer = memo(function HybridAudioPlayer({\n showControls = true,\n showWaveform = true,\n waveformMode = 'frequency',\n waveformHeight = 64,\n showTimer = true,\n showVolume = true,\n showLoop = true,\n className,\n style,\n}: HybridAudioPlayerProps) {\n const t = useAppT();\n const { state, controls } = useHybridAudioContext();\n\n const labels = useMemo(() => ({\n restart: t('tools.audio.restart'),\n back: t('tools.audio.back'),\n forward: t('tools.audio.forward'),\n volume: t('tools.audio.volume'),\n }), [t]);\n\n const isLoading = !state.isReady;\n\n const handleVolumeChange = (value: number[]) => {\n controls.setVolume(value[0] / 100);\n };\n\n return (\n <div\n className={cn('flex flex-col gap-3 p-4 rounded-lg bg-card border', className)}\n style={style}\n >\n {/* Frequency Waveform */}\n {showWaveform && (\n <div className=\"relative\">\n <HybridWaveform\n mode={waveformMode}\n height={waveformHeight}\n className={cn(isLoading && 'opacity-50')}\n />\n {isLoading && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Loader2 className=\"h-6 w-6 animate-spin text-primary\" />\n </div>\n )}\n </div>\n )}\n\n {/* Timer */}\n {showTimer && (\n <div className=\"flex justify-between text-xs text-muted-foreground tabular-nums px-1\">\n <span>{formatTime(state.currentTime)}</span>\n <span>{formatTime(state.duration)}</span>\n </div>\n )}\n\n {/* Controls */}\n {showControls && (\n <div className=\"flex items-center justify-center gap-1\">\n {/* Restart */}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-9 w-9\"\n onClick={controls.restart}\n disabled={!state.isReady}\n title={labels.restart}\n >\n <RotateCcw className=\"h-4 w-4\" />\n </Button>\n\n {/* Skip back 5s */}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-9 w-9\"\n onClick={() => controls.skip(-5)}\n disabled={!state.isReady}\n title={labels.back}\n >\n <SkipBack className=\"h-4 w-4\" />\n </Button>\n\n {/* Play/Pause */}\n <Button\n variant=\"default\"\n size=\"icon\"\n className=\"h-12 w-12 rounded-full\"\n onClick={controls.togglePlay}\n disabled={!state.isReady && !isLoading}\n title={state.isPlaying ? 'Pause' : 'Play'}\n >\n {isLoading ? (\n <Loader2 className=\"h-5 w-5 animate-spin\" />\n ) : state.isPlaying ? (\n <Pause className=\"h-5 w-5\" />\n ) : (\n <Play className=\"h-5 w-5 ml-0.5\" />\n )}\n </Button>\n\n {/* Skip forward 5s */}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-9 w-9\"\n onClick={() => controls.skip(5)}\n disabled={!state.isReady}\n title={labels.forward}\n >\n <SkipForward className=\"h-4 w-4\" />\n </Button>\n\n {/* Volume */}\n {showVolume && (\n <>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-9 w-9\"\n onClick={controls.toggleMute}\n title={state.isMuted ? 'Unmute' : 'Mute'}\n >\n {state.isMuted || state.volume === 0 ? (\n <VolumeX className=\"h-4 w-4\" />\n ) : (\n <Volume2 className=\"h-4 w-4\" />\n )}\n </Button>\n\n <Slider\n value={[state.isMuted ? 0 : state.volume * 100]}\n max={100}\n step={1}\n onValueChange={handleVolumeChange}\n className=\"w-20\"\n aria-label={labels.volume}\n />\n </>\n )}\n\n {/* Loop/Repeat */}\n {showLoop && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={cn('h-9 w-9', state.isLooping && 'text-primary')}\n onClick={controls.toggleLoop}\n disabled={!state.isReady}\n title={state.isLooping ? 'Disable loop' : 'Enable loop'}\n >\n <Repeat className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n )}\n </div>\n );\n});\n\nexport default HybridAudioPlayer;\n","/**\n * Audio Reactive Effects - Common utilities and types\n *\n * Provides reusable effect calculations and configurations\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type EffectVariant = 'glow' | 'orbs' | 'spotlight' | 'mesh';\nexport type EffectIntensity = 'subtle' | 'medium' | 'strong';\nexport type EffectColorScheme = 'primary' | 'vibrant' | 'cool' | 'warm';\n\nexport interface AudioLevels {\n bass: number;\n mid: number;\n high: number;\n overall: number;\n}\n\nexport interface EffectConfig {\n opacity: number;\n scale: number;\n blur: string;\n}\n\nexport interface EffectColors {\n colors: string[];\n hueShift: number;\n}\n\nexport interface EffectLayer {\n inset: number;\n opacity: number;\n scale: number;\n background: string;\n blur: string;\n animation?: string;\n}\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nexport const INTENSITY_CONFIG: Record<EffectIntensity, EffectConfig> = {\n subtle: { opacity: 0.3, scale: 0.02, blur: 'blur-2xl' },\n medium: { opacity: 0.5, scale: 0.04, blur: 'blur-xl' },\n strong: { opacity: 0.7, scale: 0.06, blur: 'blur-lg' },\n};\n\nexport const COLOR_SCHEMES: Record<EffectColorScheme, string[]> = {\n primary: ['217 91% 60%'],\n vibrant: ['217 91% 60%', '142 76% 36%', '262 83% 58%', '25 95% 53%'],\n cool: ['217 91% 60%', '262 83% 58%', '199 89% 48%'],\n warm: ['25 95% 53%', '0 84% 60%', '38 92% 50%'],\n};\n\n// Default multi-color palette when single color provided\nconst DEFAULT_GLOW_COLORS = [\n '217 91% 60%', // Blue\n '262 83% 58%', // Purple\n '330 81% 60%', // Pink\n '25 95% 53%', // Orange\n];\n\n// =============================================================================\n// UTILITIES\n// =============================================================================\n\n/**\n * Get effect configuration from intensity setting\n */\nexport function getEffectConfig(intensity: EffectIntensity): EffectConfig {\n return INTENSITY_CONFIG[intensity];\n}\n\n/**\n * Get color array from color scheme\n */\nexport function getColors(colorScheme: EffectColorScheme): string[] {\n return COLOR_SCHEMES[colorScheme];\n}\n\n/**\n * Prepare colors with hue shift based on audio levels\n */\nexport function prepareEffectColors(\n colorScheme: EffectColorScheme,\n levels: AudioLevels\n): EffectColors {\n const baseColors = COLOR_SCHEMES[colorScheme];\n const colors = baseColors.length > 1 ? baseColors : DEFAULT_GLOW_COLORS;\n const hueShift = Math.floor(\n (levels.bass * 30) + (levels.mid * 20) + (levels.high * 10)\n );\n\n return { colors, hueShift };\n}\n\n/**\n * Calculate glow layer properties\n */\nexport function calculateGlowLayers(\n levels: AudioLevels,\n config: EffectConfig,\n colors: string[]\n): EffectLayer[] {\n const { bass, mid, high } = levels;\n\n return [\n // Layer 1: Bass glow - bottom\n {\n inset: 60 + bass * 90,\n opacity: 1,\n scale: 1 + bass * 0.5,\n background: `radial-gradient(ellipse 80% 60% at 50% 100%, hsl(${colors[0]} / ${0.4 + bass * 0.4}) 0%, transparent 70%)`,\n blur: 'blur-3xl',\n },\n // Layer 2: Mid glow - top\n {\n inset: 45 + mid * 75,\n opacity: 1,\n scale: 1 + mid * 0.4,\n background: `radial-gradient(ellipse 70% 50% at 50% 0%, hsl(${colors[1] || colors[0]} / ${0.3 + mid * 0.5}) 0%, transparent 70%)`,\n blur: 'blur-2xl',\n },\n // Layer 3: High glow - left\n {\n inset: 30 + high * 60,\n opacity: 1,\n scale: 1 + high * 0.3,\n background: `radial-gradient(ellipse 50% 80% at 0% 50%, hsl(${colors[2] || colors[0]} / ${0.3 + high * 0.4}) 0%, transparent 60%)`,\n blur: 'blur-2xl',\n },\n // Layer 4: High glow - right\n {\n inset: 30 + high * 60,\n opacity: 1,\n scale: 1 + high * 0.3,\n background: `radial-gradient(ellipse 50% 80% at 100% 50%, hsl(${colors[3] || colors[0]} / ${0.3 + high * 0.4}) 0%, transparent 60%)`,\n blur: 'blur-2xl',\n },\n // Layer 5: Center pulsing glow\n {\n inset: 24 + bass * 45,\n opacity: 1,\n scale: 1 + bass * 0.2,\n background: `radial-gradient(circle at 50% 50%, hsl(${colors[0]} / ${0.2 + bass * 0.3}) 0%, hsl(${colors[1] || colors[0]} / ${0.1 + mid * 0.2}) 40%, transparent 70%)`,\n blur: 'blur-xl',\n animation: 'glow-breathe 2s ease-in-out infinite',\n },\n ];\n}\n\n/**\n * Calculate orb positions and properties - highly reactive\n */\nexport function calculateOrbs(\n levels: AudioLevels,\n config: EffectConfig,\n colors: string[],\n baseSize: number = 50\n) {\n const { bass, mid, high, overall } = levels;\n const size = baseSize * 3;\n\n // Dynamic position offsets\n const bassMove = bass * 30;\n const midMove = mid * 25;\n const highMove = high * 20;\n\n return [\n // Bass orb - top left, big pulses\n {\n x: -40 + bassMove,\n y: -40 - bassMove * 0.5,\n size: size * (1 + bass * 1.2),\n color: colors[0],\n opacity: 0.5 + bass * 0.5,\n scale: 1 + bass * 0.6,\n },\n // Mid orb - top right\n {\n x: 130 - midMove * 0.5,\n y: -30 + midMove,\n size: size * (0.9 + mid * 1.0),\n color: colors[1] || colors[0],\n opacity: 0.5 + mid * 0.5,\n scale: 1 + mid * 0.5,\n },\n // High orb - bottom right\n {\n x: 140 + highMove * 0.3,\n y: 120 - highMove,\n size: size * (0.8 + high * 0.8),\n color: colors[2] || colors[0],\n opacity: 0.4 + high * 0.6,\n scale: 1 + high * 0.45,\n },\n // Mid orb 2 - bottom left\n {\n x: -30 - midMove * 0.4,\n y: 130 + midMove * 0.3,\n size: size * (0.9 + mid * 0.9),\n color: colors[3] || colors[0],\n opacity: 0.45 + mid * 0.55,\n scale: 1 + mid * 0.5,\n },\n // Center overall orb\n {\n x: 50,\n y: 50,\n size: size * (0.6 + overall * 1.5),\n color: colors[0],\n opacity: 0.3 + overall * 0.5,\n scale: 1 + overall * 0.7,\n },\n ];\n}\n\n/**\n * Calculate mesh gradient positions - dynamic and reactive\n */\nexport function calculateMeshGradients(\n levels: AudioLevels,\n config: EffectConfig,\n colors: string[]\n) {\n const { bass, mid, high, overall } = levels;\n\n // More aggressive offsets for visible movement\n const bassOffset = bass * 40;\n const midOffset = mid * 30;\n const highOffset = high * 25;\n\n return [\n // Large bass blob - top right, pulses hard\n {\n width: `${200 + bass * 150}%`,\n height: `${200 + bass * 150}%`,\n top: `${-80 + bassOffset}%`,\n right: `${-80 - bassOffset}%`,\n color: colors[0],\n opacity: 0.4 + bass * 0.6,\n scale: 1 + bass * 0.5,\n rotation: bass * 45,\n blur: 'blur-2xl',\n },\n // Mid blob - bottom left\n {\n width: `${180 + mid * 120}%`,\n height: `${180 + mid * 120}%`,\n bottom: `${-60 + midOffset}%`,\n left: `${-60 - midOffset}%`,\n color: colors[1] || colors[0],\n opacity: 0.4 + mid * 0.6,\n scale: 1 + mid * 0.4,\n rotation: -mid * 40,\n blur: 'blur-2xl',\n },\n // High blob - bottom right\n {\n width: `${140 + high * 100}%`,\n height: `${140 + high * 100}%`,\n top: `${70 - highOffset}%`,\n right: `${-50 + highOffset}%`,\n color: colors[2] || colors[0],\n opacity: 0.35 + high * 0.65,\n scale: 1 + high * 0.35,\n rotation: high * 35,\n blur: 'blur-xl',\n },\n // Extra bass reactive blob - top left\n {\n width: `${160 + bass * 140}%`,\n height: `${160 + bass * 140}%`,\n top: `${-60 - bassOffset * 0.8}%`,\n left: `${-60 + bassOffset * 0.8}%`,\n color: colors[3] || colors[1] || colors[0],\n opacity: 0.35 + bass * 0.65,\n scale: 1 + bass * 0.55,\n rotation: -bass * 50,\n blur: 'blur-2xl',\n },\n // Center glow - pulses with overall\n {\n width: `${80 + overall * 150}%`,\n height: `${80 + overall * 150}%`,\n top: '50%',\n left: '50%',\n color: colors[0],\n opacity: 0.3 + overall * 0.5,\n scale: 1 + overall * 0.4,\n rotation: 0,\n isCenter: true,\n blur: 'blur-3xl',\n },\n ];\n}\n\n/**\n * Calculate spotlight effect properties - highly reactive\n */\nexport function calculateSpotlight(\n levels: AudioLevels,\n config: EffectConfig,\n colors: string[],\n rotation: number\n) {\n const { bass, mid, high, overall } = levels;\n\n return {\n // Rotation speed increases with mid frequencies\n rotation: rotation + mid * 180,\n // Border expands with bass\n inset: 12 + bass * 30,\n // Color intensities react to different frequencies\n colors: colors.map((c, i) => ({\n color: c,\n opacity: i === 0\n ? 0.3 + bass * 0.7\n : i === 1\n ? 0.3 + mid * 0.7\n : 0.3 + high * 0.7,\n })),\n // Pulse glow - big and reactive\n pulseInset: 24 + bass * 50,\n pulseOpacity: 0.3 + bass * 0.7,\n pulseScale: 1 + bass * 0.4,\n // Extra glow ring\n ringOpacity: 0.2 + overall * 0.6,\n ringScale: 1 + overall * 0.3,\n };\n}\n\n/**\n * CSS for effect animations - can be injected once\n */\nexport const EFFECT_ANIMATIONS = `\n @keyframes spotlight-spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n @keyframes orb-float-1 {\n 0%, 100% { transform: translate(-50%, -50%) translateY(0); }\n 50% { transform: translate(-50%, -50%) translateY(-15px); }\n }\n\n @keyframes orb-float-2 {\n 0%, 100% { transform: translate(-50%, -50%) translateX(0); }\n 50% { transform: translate(-50%, -50%) translateX(15px); }\n }\n\n @keyframes orb-float-3 {\n 0%, 100% { transform: translate(-50%, -50%) translate(0, 0); }\n 33% { transform: translate(-50%, -50%) translate(10px, -10px); }\n 66% { transform: translate(-50%, -50%) translate(-10px, 10px); }\n }\n\n @keyframes orb-float-4 {\n 0%, 100% { transform: translate(-50%, -50%) translate(0, 0); }\n 50% { transform: translate(-50%, -50%) translate(-15px, -10px); }\n }\n\n @keyframes mesh-float-1 {\n 0%, 100% { transform: translate(0, 0) scale(1); }\n 25% { transform: translate(-5%, 10%) scale(1.05); }\n 50% { transform: translate(5%, 5%) scale(0.95); }\n 75% { transform: translate(-3%, -5%) scale(1.02); }\n }\n\n @keyframes mesh-float-2 {\n 0%, 100% { transform: translate(0, 0) scale(1); }\n 33% { transform: translate(8%, -8%) scale(1.08); }\n 66% { transform: translate(-6%, 6%) scale(0.92); }\n }\n\n @keyframes mesh-float-3 {\n 0%, 100% { transform: translate(0, 0) scale(1); }\n 50% { transform: translate(10%, 10%) scale(1.1); }\n }\n\n @keyframes mesh-float-4 {\n 0%, 100% { transform: translate(0, 0) scale(1) rotate(0deg); }\n 25% { transform: translate(10%, -5%) scale(1.1) rotate(5deg); }\n 50% { transform: translate(-5%, 10%) scale(0.95) rotate(-5deg); }\n 75% { transform: translate(-10%, -10%) scale(1.05) rotate(3deg); }\n }\n\n @keyframes mesh-pulse {\n 0%, 100% { transform: translate(-50%, -50%) scale(1); opacity: 0.3; }\n 50% { transform: translate(-50%, -50%) scale(1.2); opacity: 0.5; }\n }\n\n @keyframes glow-breathe {\n 0%, 100% { opacity: 0.6; transform: scale(1); }\n 50% { opacity: 1; transform: scale(1.05); }\n }\n\n @keyframes glow-rotate {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n @keyframes sparkle-move {\n 0% { opacity: 0; transform: scale(0.8); }\n 50% { opacity: 1; }\n 100% { opacity: 0; transform: scale(1.2); }\n }\n`;\n","'use client';\n\n/**\n * GlowEffect - Multi-layer glow effect with pulse rings\n */\n\nimport { cn } from '../../../../_shared';\nimport type { calculateGlowLayers } from '../../../effects';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface GlowEffectData {\n layers: ReturnType<typeof calculateGlowLayers>;\n hueShift: number;\n showPulseRings: boolean;\n showSparkle: boolean;\n}\n\ninterface GlowEffectProps {\n data: GlowEffectData;\n colors: string[];\n isPlaying: boolean;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport function GlowEffect({ data, colors, isPlaying }: GlowEffectProps) {\n const { layers, hueShift, showPulseRings, showSparkle } = data;\n\n return (\n <>\n {/* Main glow layers */}\n {layers.map((layer, i) => (\n <div\n key={i}\n className={cn('absolute rounded-2xl -z-10', layer.blur)}\n style={{\n inset: `-${layer.inset}px`,\n background: layer.background,\n opacity: isPlaying ? layer.opacity : 0,\n transform: i < 2 ? `scaleY(${layer.scale})` : `scale(${layer.scale})`,\n animation: isPlaying && layer.animation ? layer.animation : 'none',\n transition: 'opacity 0.3s',\n }}\n />\n ))}\n\n {/* Rotating color sweep */}\n <div\n className=\"absolute rounded-2xl blur-xl overflow-hidden -z-10\"\n style={{\n inset: '-75px',\n opacity: isPlaying ? 0.6 : 0,\n transition: 'opacity 0.5s',\n }}\n >\n <div\n className=\"absolute inset-0\"\n style={{\n background: `conic-gradient(\n from ${hueShift}deg at 50% 50%,\n hsl(${colors[0]} / 0.4) 0deg,\n hsl(${colors[1] || colors[0]} / 0.3) 90deg,\n hsl(${colors[2] || colors[0]} / 0.3) 180deg,\n hsl(${colors[3] || colors[0]} / 0.3) 270deg,\n hsl(${colors[0]} / 0.4) 360deg\n )`,\n animation: isPlaying ? 'glow-rotate 6s linear infinite' : 'none',\n }}\n />\n </div>\n\n {/* Pulse rings on bass hits */}\n {showPulseRings && (\n <>\n <div\n className=\"absolute -inset-6 rounded-xl border-2 animate-ping -z-10\"\n style={{\n borderColor: `hsl(${colors[0]} / 0.4)`,\n animationDuration: '1s',\n }}\n />\n <div\n className=\"absolute -inset-12 rounded-2xl border animate-ping -z-10\"\n style={{\n borderColor: `hsl(${colors[1] || colors[0]} / 0.3)`,\n animationDuration: '1.5s',\n animationDelay: '0.2s',\n }}\n />\n </>\n )}\n\n {/* Sparkle on high frequencies */}\n {showSparkle && (\n <div\n className=\"absolute -inset-18 rounded-3xl -z-10\"\n style={{\n background: `radial-gradient(circle at 50% 30%, hsl(${colors[2] || colors[0]} / 0.5) 0%, transparent 30%)`,\n animation: 'sparkle-move 0.5s ease-out',\n }}\n />\n )}\n </>\n );\n}\n","'use client';\n\n/**\n * OrbsEffect - Floating orb particles that react to audio\n */\n\nimport { cn } from '../../../../_shared';\nimport type { calculateOrbs } from '../../../effects';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\ninterface OrbsEffectProps {\n orbs: ReturnType<typeof calculateOrbs>;\n blur: string;\n isPlaying: boolean;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport function OrbsEffect({ orbs, blur, isPlaying }: OrbsEffectProps) {\n return (\n <>\n {orbs.map((orb, i) => (\n <div\n key={i}\n className={cn('absolute rounded-full -z-10', blur)}\n style={{\n width: orb.size,\n height: orb.size,\n left: `${orb.x}%`,\n top: `${orb.y}%`,\n background: `radial-gradient(circle at 30% 30%, hsl(${orb.color}) 0%, hsl(${orb.color} / 0.5) 40%, transparent 70%)`,\n opacity: isPlaying ? orb.opacity : 0,\n transform: `translate(-50%, -50%) scale(${orb.scale})`,\n transition: 'all 0.08s ease-out',\n }}\n />\n ))}\n </>\n );\n}\n","'use client';\n\n/**\n * SpotlightEffect - Rotating spotlight with conic gradients\n */\n\nimport { cn } from '../../../../_shared';\nimport type { calculateSpotlight } from '../../../effects';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\ninterface SpotlightEffectProps {\n data: ReturnType<typeof calculateSpotlight>;\n colors: string[];\n blur: string;\n isPlaying: boolean;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport function SpotlightEffect({ data, colors, blur, isPlaying }: SpotlightEffectProps) {\n const inset = 'inset' in data ? data.inset : 12;\n const pulseInset = 'pulseInset' in data ? data.pulseInset : 24;\n const ringOpacity = 'ringOpacity' in data ? data.ringOpacity : 0.3;\n const ringScale = 'ringScale' in data ? data.ringScale : 1;\n\n return (\n <>\n {/* Rotating conic gradient - reactive size */}\n <div\n className={cn('absolute rounded-xl -z-10', blur)}\n style={{\n inset: `-${inset}px`,\n background: `conic-gradient(\n from ${data.rotation}deg,\n hsl(${colors[0]} / ${data.colors[0]?.opacity || 0.5}),\n hsl(${colors[1] || colors[0]} / ${data.colors[1]?.opacity || 0.7}),\n hsl(${colors[2] || colors[0]} / ${data.colors[2]?.opacity || 0.5}),\n hsl(${colors[0]} / ${data.colors[1]?.opacity || 0.7}),\n hsl(${colors[0]} / ${data.colors[0]?.opacity || 0.5})\n )`,\n opacity: isPlaying ? 1 : 0,\n transition: 'all 0.08s ease-out',\n }}\n />\n\n {/* Inner border */}\n <div\n className=\"absolute -inset-1 rounded-lg bg-background -z-10\"\n style={{ opacity: isPlaying ? 1 : 0, transition: 'opacity 0.1s' }}\n />\n\n {/* Bass pulse glow - reactive size */}\n <div\n className={cn('absolute rounded-2xl -z-10', blur)}\n style={{\n inset: `-${pulseInset}px`,\n background: `radial-gradient(circle, hsl(${colors[0]} / 0.7) 0%, hsl(${colors[0]} / 0.3) 50%, transparent 70%)`,\n opacity: isPlaying ? data.pulseOpacity : 0,\n transform: `scale(${data.pulseScale})`,\n transition: 'all 0.08s ease-out',\n }}\n />\n\n {/* Outer ring glow */}\n <div\n className=\"absolute rounded-3xl -z-10 blur-2xl\"\n style={{\n inset: `-${pulseInset + 30}px`,\n background: `radial-gradient(circle, hsl(${colors[1] || colors[0]} / 0.4) 0%, transparent 60%)`,\n opacity: isPlaying ? ringOpacity : 0,\n transform: `scale(${ringScale})`,\n transition: 'all 0.08s ease-out',\n }}\n />\n </>\n );\n}\n","'use client';\n\n/**\n * MeshEffect - Mesh gradient blobs that react to audio\n */\n\nimport { cn } from '../../../../_shared';\nimport type { calculateMeshGradients } from '../../../effects';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\ninterface MeshEffectProps {\n gradients: ReturnType<typeof calculateMeshGradients>;\n blur: string;\n isPlaying: boolean;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport function MeshEffect({ gradients, isPlaying }: MeshEffectProps) {\n return (\n <>\n {gradients.map((g, i) => {\n const isCenter = 'isCenter' in g && g.isCenter;\n const scale = 'scale' in g ? g.scale : 1;\n const rotation = 'rotation' in g ? g.rotation : 0;\n const itemBlur = 'blur' in g ? g.blur : 'blur-2xl';\n\n return (\n <div\n key={i}\n className={cn('absolute rounded-full -z-10', itemBlur)}\n style={{\n width: g.width,\n height: g.height,\n top: 'top' in g ? g.top : undefined,\n bottom: 'bottom' in g ? g.bottom : undefined,\n left: 'left' in g ? g.left : undefined,\n right: 'right' in g ? g.right : undefined,\n background: isCenter\n ? `radial-gradient(circle, hsl(${g.color} / 0.6) 0%, hsl(${g.color} / 0.3) 30%, transparent 60%)`\n : `radial-gradient(circle, hsl(${g.color}) 0%, hsl(${g.color} / 0.5) 30%, transparent 65%)`,\n opacity: isPlaying ? g.opacity : 0,\n transform: isCenter\n ? `translate(-50%, -50%) scale(${scale})`\n : `scale(${scale}) rotate(${rotation}deg)`,\n transition: 'all 0.08s ease-out',\n }}\n />\n );\n })}\n </>\n );\n}\n","'use client';\n\n/**\n * AudioReactiveCover - Album art with audio-reactive animations\n *\n * Uses effects utilities for clean data preparation before render.\n * Click on cover to switch between effect variants.\n *\n * Must be used within HybridAudioProvider context.\n */\n\nimport { type ReactNode } from 'react';\nimport { cn } from '../../../_shared';\nimport { useHybridAudioLevels, useHybridAudioState } from '../../context/HybridAudioProvider';\nimport {\n type EffectVariant,\n type EffectIntensity,\n type EffectColorScheme,\n getEffectConfig,\n prepareEffectColors,\n calculateGlowLayers,\n calculateOrbs,\n calculateMeshGradients,\n calculateSpotlight,\n EFFECT_ANIMATIONS,\n} from '../../effects';\nimport { GlowEffect, OrbsEffect, SpotlightEffect, MeshEffect, type GlowEffectData } from './effects';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface AudioReactiveCoverProps {\n children: ReactNode;\n /** 'sm' | 'md' | 'lg' = fixed sizes; 'full' = stretch to container width (aspect-square) */\n size?: 'sm' | 'md' | 'lg' | 'full';\n variant?: EffectVariant;\n intensity?: EffectIntensity;\n colorScheme?: EffectColorScheme;\n onClick?: () => void;\n className?: string;\n}\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst SIZES = {\n sm: { container: 'w-32 h-32', orbBase: 40 },\n md: { container: 'w-40 h-40', orbBase: 50 },\n lg: { container: 'w-48 h-48', orbBase: 60 },\n full: { container: 'w-full sm:max-w-xs aspect-square mx-auto', orbBase: 60 },\n};\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport function AudioReactiveCover({\n children,\n size = 'lg',\n variant = 'spotlight',\n intensity = 'medium',\n colorScheme = 'primary',\n onClick,\n className,\n}: AudioReactiveCoverProps) {\n // Get audio state from HybridAudioProvider context\n const { isPlaying } = useHybridAudioState();\n const levels = useHybridAudioLevels();\n\n // =========================================================================\n // PREPARE DATA BEFORE RENDER\n // =========================================================================\n\n const sizeConfig = SIZES[size];\n const effectConfig = getEffectConfig(intensity);\n const { colors, hueShift } = prepareEffectColors(colorScheme, levels);\n\n // Calculate scale based on overall level\n const containerScale = 1 + levels.overall * effectConfig.scale;\n\n // Prepare effect-specific data - NO memoization for real-time reactivity\n const glowData: GlowEffectData | null = variant === 'glow' ? {\n layers: calculateGlowLayers(levels, effectConfig, colors),\n hueShift,\n showPulseRings: levels.bass > 0.5,\n showSparkle: levels.high > 0.4,\n } : null;\n\n const orbsData = variant === 'orbs'\n ? calculateOrbs(levels, effectConfig, colors, sizeConfig.orbBase)\n : null;\n\n const meshData = variant === 'mesh'\n ? calculateMeshGradients(levels, effectConfig, colors)\n : null;\n\n const spotlightData = variant === 'spotlight'\n ? calculateSpotlight(levels, effectConfig, colors, levels.mid * 360)\n : null;\n\n // =========================================================================\n // RENDER\n // =========================================================================\n\n return (\n <div\n className={cn('relative', sizeConfig.container, className)}\n style={{\n transform: `scale(${containerScale})`,\n transition: 'transform 0.1s ease-out',\n }}\n >\n {/* Effect layers container - under cover, non-interactive */}\n <div className=\"absolute inset-0 z-0 pointer-events-none overflow-visible\">\n {glowData && (\n <GlowEffect data={glowData} colors={colors} isPlaying={isPlaying} />\n )}\n\n {orbsData && (\n <OrbsEffect orbs={orbsData} blur={effectConfig.blur} isPlaying={isPlaying} />\n )}\n\n {spotlightData && (\n <SpotlightEffect data={spotlightData} colors={colors} blur={effectConfig.blur} isPlaying={isPlaying} />\n )}\n\n {meshData && (\n <MeshEffect gradients={meshData} blur={effectConfig.blur} isPlaying={isPlaying} />\n )}\n </div>\n\n {/* Content (cover art) */}\n <div\n className=\"relative w-full h-full rounded-lg overflow-hidden shadow-2xl z-10 bg-background cursor-pointer\"\n onClick={onClick}\n role={onClick ? 'button' : undefined}\n tabIndex={onClick ? 0 : undefined}\n onKeyDown={onClick ? (e) => e.key === 'Enter' && onClick() : undefined}\n >\n {children}\n </div>\n\n {/* Inject animations once */}\n <style dangerouslySetInnerHTML={{ __html: EFFECT_ANIMATIONS }} />\n </div>\n );\n}\n\nexport default AudioReactiveCover;\n","'use client';\n\n/**\n * HybridSimplePlayer - Easy-to-use hybrid audio player wrapper\n *\n * Combines HybridAudioProvider + HybridAudioPlayer + optional reactive cover\n * in a single component with sensible defaults.\n *\n * Uses native HTML5 audio for playback (no crackling) with Web Audio API\n * for visualization only.\n *\n * @example\n * // Minimal usage\n * <HybridSimplePlayer src=\"https://example.com/audio.mp3\" />\n *\n * @example\n * // With cover art and reactive effects\n * <HybridSimplePlayer\n * src={audioUrl}\n * title=\"Track Title\"\n * artist=\"Artist Name\"\n * coverArt=\"/path/to/cover.jpg\"\n * reactiveCover\n * variant=\"spotlight\"\n * />\n */\n\nimport { type ReactNode } from 'react';\nimport { Music } from 'lucide-react';\nimport { cn } from '@djangocfg/ui-core';\n\nimport { HybridAudioProvider } from '../context/HybridAudioProvider';\nimport { HybridAudioPlayer } from './HybridAudioPlayer';\nimport { AudioReactiveCover } from './ReactiveCover';\nimport { VisualizationProvider, useVisualization } from '../hooks';\nimport type { EffectIntensity, EffectColorScheme } from '../effects';\nimport type { VisualizationVariant } from '../hooks';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface HybridSimplePlayerProps {\n /** Audio source URL */\n src: string;\n\n /** Track title */\n title?: string;\n\n /** Artist name */\n artist?: string;\n\n /** Cover art URL or ReactNode */\n coverArt?: string | ReactNode;\n\n /** Cover art size */\n coverSize?: 'sm' | 'md' | 'lg';\n\n /** Show frequency waveform */\n showWaveform?: boolean;\n\n /** Waveform visualization mode */\n waveformMode?: 'frequency' | 'static';\n\n /** Waveform height in pixels */\n waveformHeight?: number;\n\n /** Show timer */\n showTimer?: boolean;\n\n /** Show volume control */\n showVolume?: boolean;\n\n /** Show loop/repeat button */\n showLoop?: boolean;\n\n /** Enable audio-reactive cover effects */\n reactiveCover?: boolean;\n\n /** Reactive effect variant */\n variant?: VisualizationVariant;\n\n /** Reactive effect intensity */\n intensity?: EffectIntensity;\n\n /** Reactive effect color scheme */\n colorScheme?: EffectColorScheme;\n\n /** Auto-play on load */\n autoPlay?: boolean;\n\n /** Loop playback */\n loop?: boolean;\n\n /** Initial volume (0-1) */\n initialVolume?: number;\n\n /** Layout direction */\n layout?: 'vertical' | 'horizontal';\n\n /** Additional class name */\n className?: string;\n\n /** Callbacks */\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onError?: (error: Error) => void;\n}\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst COVER_SIZES = {\n sm: 'w-24 h-24',\n md: 'w-32 h-32',\n lg: 'w-48 h-48',\n};\n\n// In horizontal layout cover stays fixed-size; in vertical it fills the full width\nconst COVER_SIZE_FOR_LAYOUT = (coverSize: 'sm' | 'md' | 'lg', isHorizontal: boolean) =>\n isHorizontal ? coverSize : 'full';\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport function HybridSimplePlayer(props: HybridSimplePlayerProps) {\n return (\n <VisualizationProvider>\n <HybridSimplePlayerContent {...props} />\n </VisualizationProvider>\n );\n}\n\nfunction HybridSimplePlayerContent({\n src,\n title,\n artist,\n coverArt,\n coverSize = 'md',\n showWaveform = true,\n waveformMode = 'frequency',\n waveformHeight = 64,\n showTimer = true,\n showVolume = true,\n showLoop = true,\n reactiveCover = true,\n variant,\n intensity,\n colorScheme,\n autoPlay = false,\n loop = false,\n initialVolume = 1,\n layout = 'vertical',\n className,\n onPlay,\n onPause,\n onEnded,\n onError,\n}: HybridSimplePlayerProps) {\n const { settings: vizSettings, nextVariant } = useVisualization();\n\n // Determine effective variant (from props or localStorage settings)\n const effectiveVariant =\n variant ?? (vizSettings.variant !== 'none' ? vizSettings.variant : 'spotlight');\n const effectiveIntensity = intensity ?? vizSettings.intensity;\n const effectiveColorScheme = colorScheme ?? vizSettings.colorScheme;\n\n // Show reactive cover if enabled and variant is not 'none'\n const showReactiveCover = reactiveCover && effectiveVariant !== 'none';\n\n // Render cover art content\n const renderCoverContent = () => {\n if (typeof coverArt === 'string') {\n return (\n <img src={coverArt} alt={title || 'Album cover'} className=\"w-full h-full object-cover\" />\n );\n }\n\n if (coverArt) {\n return coverArt;\n }\n\n // Default placeholder\n return (\n <div className=\"w-full h-full bg-muted/30 flex items-center justify-center\">\n <Music className=\"w-1/3 h-1/3 text-muted-foreground/50\" />\n </div>\n );\n };\n\n const isHorizontal = layout === 'horizontal';\n\n return (\n <HybridAudioProvider\n src={src}\n autoPlay={autoPlay}\n loop={loop}\n initialVolume={initialVolume}\n onPlay={onPlay}\n onPause={onPause}\n onEnded={onEnded}\n onError={onError}\n >\n <div\n className={cn(\n 'flex gap-4',\n isHorizontal ? 'flex-row items-center' : 'flex-col items-center',\n className\n )}\n >\n {/* Cover Art */}\n {(coverArt || reactiveCover) && (\n <div className={cn('flex flex-col items-center gap-2', isHorizontal ? 'shrink-0' : 'w-full')}>\n {showReactiveCover ? (\n <AudioReactiveCover\n size={COVER_SIZE_FOR_LAYOUT(coverSize, isHorizontal)}\n variant={effectiveVariant as 'glow' | 'orbs' | 'spotlight' | 'mesh'}\n intensity={effectiveIntensity}\n colorScheme={effectiveColorScheme}\n onClick={nextVariant}\n >\n <div className={cn('rounded-lg overflow-hidden', isHorizontal ? COVER_SIZES[coverSize] : 'w-full h-full')}>\n {renderCoverContent()}\n </div>\n </AudioReactiveCover>\n ) : (\n <div\n className={cn(\n 'rounded-lg overflow-hidden shadow-lg cursor-pointer',\n isHorizontal ? COVER_SIZES[coverSize] : 'w-full sm:max-w-xs aspect-square mx-auto'\n )}\n onClick={nextVariant}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => e.key === 'Enter' && nextVariant()}\n >\n {renderCoverContent()}\n </div>\n )}\n\n {/* Effect indicator */}\n {reactiveCover && (\n <span className=\"text-[10px] uppercase tracking-wider text-muted-foreground/50 select-none\">\n {vizSettings.variant === 'none' ? 'off' : vizSettings.variant}\n </span>\n )}\n </div>\n )}\n\n {/* Track Info + Player */}\n <div\n className={cn('flex flex-col gap-3', isHorizontal ? 'flex-1 min-w-0' : 'w-full')}\n >\n {/* Track Info */}\n {(title || artist) && (\n <div className={cn('text-center', isHorizontal && 'text-left')}>\n {title && (\n <h3 className=\"text-base font-medium text-foreground truncate\">{title}</h3>\n )}\n {artist && <p className=\"text-sm text-muted-foreground truncate\">{artist}</p>}\n </div>\n )}\n\n {/* Audio Player */}\n <HybridAudioPlayer\n showControls\n showWaveform={showWaveform}\n waveformMode={waveformMode}\n waveformHeight={waveformHeight}\n showTimer={showTimer}\n showVolume={showVolume}\n showLoop={showLoop}\n className=\"border-0 bg-transparent\"\n />\n </div>\n </div>\n </HybridAudioProvider>\n );\n}\n\nexport default HybridSimplePlayer;\n","'use client';\n\n/**\n * HybridCompactPlayer - Single-row audio player\n *\n * Designed for tight spaces: play/pause + waveform + timer.\n * No cover art, no volume slider, no skip buttons.\n *\n * @example\n * <HybridCompactPlayer src=\"https://example.com/audio.mp3\" title=\"Rain & Thunder\" />\n *\n * @example\n * // Lazy-loaded (preferred in app)\n * <LazyHybridCompactPlayer src={url} autoPlay />\n */\n\nimport { type ReactNode } from 'react';\nimport { Play, Pause, Loader2 } from 'lucide-react';\nimport { cn } from '@djangocfg/ui-core';\nimport { Button } from '../../_shared';\n\nimport { HybridAudioProvider } from '../context/HybridAudioProvider';\nimport { HybridWaveform } from './HybridWaveform';\nimport { useHybridAudioContext } from '../context/HybridAudioProvider';\nimport { formatTime } from '../utils';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface HybridCompactPlayerProps {\n /** Audio source URL */\n src: string;\n /** Track title (shown as tooltip / aria-label) */\n title?: string;\n /** Auto-play on load */\n autoPlay?: boolean;\n /** Loop playback */\n loop?: boolean;\n /** Initial volume (0-1) */\n initialVolume?: number;\n /** Waveform visualization mode */\n waveformMode?: 'frequency' | 'static';\n /** Show timer */\n showTimer?: boolean;\n /** Button size — 'sm' (h-6 w-6) | 'md' (h-8 w-8, default) */\n buttonSize?: 'sm' | 'md';\n /** Additional class name */\n className?: string;\n /** Callbacks */\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onError?: (error: Error) => void;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport function HybridCompactPlayer({\n src,\n title,\n autoPlay = false,\n loop = false,\n initialVolume = 1,\n waveformMode = 'frequency',\n showTimer = true,\n buttonSize = 'md',\n className,\n onPlay,\n onPause,\n onEnded,\n onError,\n}: HybridCompactPlayerProps): ReactNode {\n return (\n <HybridAudioProvider\n src={src}\n autoPlay={autoPlay}\n loop={loop}\n initialVolume={initialVolume}\n onPlay={onPlay}\n onPause={onPause}\n onEnded={onEnded}\n onError={onError}\n >\n <HybridCompactPlayerInner\n title={title}\n waveformMode={waveformMode}\n showTimer={showTimer}\n buttonSize={buttonSize}\n className={className}\n />\n </HybridAudioProvider>\n );\n}\n\n// =============================================================================\n// INNER (needs context)\n// =============================================================================\n\nconst BUTTON_SIZE = {\n sm: 'h-6 w-6',\n md: 'h-8 w-8',\n} as const;\n\ninterface InnerProps {\n title?: string;\n waveformMode: 'frequency' | 'static';\n showTimer: boolean;\n buttonSize: 'sm' | 'md';\n className?: string;\n}\n\nfunction HybridCompactPlayerInner({ title, waveformMode, showTimer, buttonSize, className }: InnerProps) {\n const { state, controls } = useHybridAudioContext();\n const isLoading = !state.isReady;\n\n return (\n <div className={cn('flex items-center gap-2 w-full', className)}>\n {/* Play / Pause */}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={cn(BUTTON_SIZE[buttonSize], 'flex-shrink-0')}\n onClick={controls.togglePlay}\n disabled={!state.isReady && !isLoading}\n title={title ?? (state.isPlaying ? 'Pause' : 'Play')}\n aria-label={state.isPlaying ? 'Pause' : 'Play'}\n >\n {isLoading ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : state.isPlaying ? (\n <Pause className=\"h-3.5 w-3.5\" />\n ) : (\n <Play className=\"h-3.5 w-3.5 ml-0.5\" />\n )}\n </Button>\n\n {/* Waveform */}\n <div className=\"flex-1 min-w-0\">\n <HybridWaveform\n mode={waveformMode}\n height={32}\n barWidth={2}\n barGap={1}\n className={cn(isLoading && 'opacity-40')}\n />\n </div>\n\n {/* Timer */}\n {showTimer && (\n <span className=\"text-[11px] text-muted-foreground tabular-nums flex-shrink-0\">\n {formatTime(state.currentTime)}\n <span className=\"text-muted-foreground/50\"> / </span>\n {formatTime(state.duration)}\n </span>\n )}\n </div>\n );\n}\n\nexport default HybridCompactPlayer;\n"]}
|
|
@@ -67,7 +67,7 @@ function ImageToolbar({
|
|
|
67
67
|
onZoomPreset,
|
|
68
68
|
onExpand
|
|
69
69
|
}) {
|
|
70
|
-
const t = i18n.
|
|
70
|
+
const t = i18n.useAppT();
|
|
71
71
|
const { zoomIn, zoomOut, resetTransform } = reactZoomPanPinch.useControls();
|
|
72
72
|
const labels = react.useMemo(() => ({
|
|
73
73
|
zoomIn: t("tools.image.zoomIn"),
|
|
@@ -376,7 +376,7 @@ function ImageViewer({
|
|
|
376
376
|
initialIndex = 0,
|
|
377
377
|
inDialog = false
|
|
378
378
|
}) {
|
|
379
|
-
const t = i18n.
|
|
379
|
+
const t = i18n.useAppT();
|
|
380
380
|
const [currentIndex, setCurrentIndex] = react.useState(
|
|
381
381
|
() => Math.max(0, Math.min(initialIndex, images.length - 1))
|
|
382
382
|
);
|
|
@@ -607,5 +607,5 @@ chunkWGEGR3DF_cjs.__name(ImageViewer, "ImageViewer");
|
|
|
607
607
|
exports.ImageInfo = ImageInfo;
|
|
608
608
|
exports.ImageToolbar = ImageToolbar;
|
|
609
609
|
exports.ImageViewer = ImageViewer;
|
|
610
|
-
//# sourceMappingURL=chunk-
|
|
611
|
-
//# sourceMappingURL=chunk-
|
|
610
|
+
//# sourceMappingURL=chunk-IHAY6FO6.cjs.map
|
|
611
|
+
//# sourceMappingURL=chunk-IHAY6FO6.cjs.map
|