@djangocfg/ui-tools 2.1.110 → 2.1.111

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/README.md +242 -49
  2. package/dist/JsonSchemaForm-65NLLK56.mjs +4 -0
  3. package/dist/JsonSchemaForm-65NLLK56.mjs.map +1 -0
  4. package/dist/JsonSchemaForm-PY6DH3HE.cjs +13 -0
  5. package/dist/JsonSchemaForm-PY6DH3HE.cjs.map +1 -0
  6. package/dist/JsonTree-6RYAOPSS.mjs +4 -0
  7. package/dist/JsonTree-6RYAOPSS.mjs.map +1 -0
  8. package/dist/JsonTree-7OH6CIHT.cjs +10 -0
  9. package/dist/JsonTree-7OH6CIHT.cjs.map +1 -0
  10. package/dist/MapContainer-GXQLP5WY.mjs +214 -0
  11. package/dist/MapContainer-GXQLP5WY.mjs.map +1 -0
  12. package/dist/MapContainer-RYG4HPH4.cjs +221 -0
  13. package/dist/MapContainer-RYG4HPH4.cjs.map +1 -0
  14. package/dist/{Mermaid.client-4OCKJ6QD.mjs → Mermaid.client-OKACITCW.mjs} +16 -7
  15. package/dist/Mermaid.client-OKACITCW.mjs.map +1 -0
  16. package/dist/{Mermaid.client-ZP6OE46Z.cjs → Mermaid.client-PNXEC6YL.cjs} +16 -7
  17. package/dist/Mermaid.client-PNXEC6YL.cjs.map +1 -0
  18. package/dist/{PlaygroundLayout-XXVBU4WZ.cjs → PlaygroundLayout-SYMEAG3J.cjs} +25 -24
  19. package/dist/PlaygroundLayout-SYMEAG3J.cjs.map +1 -0
  20. package/dist/{PlaygroundLayout-LMQTVXSP.mjs → PlaygroundLayout-UQRBU5RH.mjs} +4 -3
  21. package/dist/PlaygroundLayout-UQRBU5RH.mjs.map +1 -0
  22. package/dist/{PrettyCode.client-2CLSV2VD.cjs → PrettyCode.client-DANYYQYO.cjs} +11 -4
  23. package/dist/PrettyCode.client-DANYYQYO.cjs.map +1 -0
  24. package/dist/{PrettyCode.client-Y2BVON7R.mjs → PrettyCode.client-RS5ZTNBT.mjs} +11 -4
  25. package/dist/PrettyCode.client-RS5ZTNBT.mjs.map +1 -0
  26. package/dist/chunk-2DSR7V2L.mjs +561 -0
  27. package/dist/chunk-2DSR7V2L.mjs.map +1 -0
  28. package/dist/chunk-47T5ECYV.cjs +1357 -0
  29. package/dist/chunk-47T5ECYV.cjs.map +1 -0
  30. package/dist/chunk-5QT3QYFZ.cjs +189 -0
  31. package/dist/chunk-5QT3QYFZ.cjs.map +1 -0
  32. package/dist/chunk-7IIRYG4S.mjs +1057 -0
  33. package/dist/chunk-7IIRYG4S.mjs.map +1 -0
  34. package/dist/{chunk-FB5QBSI3.cjs → chunk-DI3HUXHK.cjs} +15 -195
  35. package/dist/chunk-DI3HUXHK.cjs.map +1 -0
  36. package/dist/chunk-EVGWYASL.cjs +1528 -0
  37. package/dist/chunk-EVGWYASL.cjs.map +1 -0
  38. package/dist/chunk-F2N7P5XU.cjs +30 -0
  39. package/dist/chunk-F2N7P5XU.cjs.map +1 -0
  40. package/dist/{chunk-L6UHASYQ.mjs → chunk-G6PRZP5I.mjs} +7 -186
  41. package/dist/chunk-G6PRZP5I.mjs.map +1 -0
  42. package/dist/chunk-JWB2EWQO.mjs +5 -0
  43. package/dist/chunk-JWB2EWQO.mjs.map +1 -0
  44. package/dist/chunk-LTJX2JXE.mjs +338 -0
  45. package/dist/chunk-LTJX2JXE.mjs.map +1 -0
  46. package/dist/chunk-OVNC4KW6.mjs +1494 -0
  47. package/dist/chunk-OVNC4KW6.mjs.map +1 -0
  48. package/dist/chunk-PNZSJN6T.cjs +1086 -0
  49. package/dist/chunk-PNZSJN6T.cjs.map +1 -0
  50. package/dist/chunk-TEFRA7GW.cjs +565 -0
  51. package/dist/chunk-TEFRA7GW.cjs.map +1 -0
  52. package/dist/chunk-UOMPPIED.mjs +1343 -0
  53. package/dist/chunk-UOMPPIED.mjs.map +1 -0
  54. package/dist/chunk-W6YHQI4F.mjs +187 -0
  55. package/dist/chunk-W6YHQI4F.mjs.map +1 -0
  56. package/dist/chunk-XTBRWVIV.cjs +346 -0
  57. package/dist/chunk-XTBRWVIV.cjs.map +1 -0
  58. package/dist/components-C7ZL7OMY.mjs +5 -0
  59. package/dist/components-C7ZL7OMY.mjs.map +1 -0
  60. package/dist/components-CJ2IB65O.cjs +27 -0
  61. package/dist/components-CJ2IB65O.cjs.map +1 -0
  62. package/dist/components-EASJYK45.mjs +6 -0
  63. package/dist/components-EASJYK45.mjs.map +1 -0
  64. package/dist/components-LDRFDV4A.cjs +22 -0
  65. package/dist/components-LDRFDV4A.cjs.map +1 -0
  66. package/dist/components-VZKUTDJK.mjs +5 -0
  67. package/dist/components-VZKUTDJK.mjs.map +1 -0
  68. package/dist/components-Y64GTIMQ.cjs +42 -0
  69. package/dist/components-Y64GTIMQ.cjs.map +1 -0
  70. package/dist/index.cjs +701 -4813
  71. package/dist/index.cjs.map +1 -1
  72. package/dist/index.d.cts +1274 -1026
  73. package/dist/index.d.ts +1274 -1026
  74. package/dist/index.mjs +358 -4730
  75. package/dist/index.mjs.map +1 -1
  76. package/package.json +27 -4
  77. package/src/components/index.ts +17 -0
  78. package/src/components/lazy-wrapper.tsx +281 -0
  79. package/src/index.ts +92 -7
  80. package/src/tools/AudioPlayer/components/HybridAudioPlayer.tsx +14 -5
  81. package/src/tools/AudioPlayer/lazy.tsx +85 -0
  82. package/src/tools/Gallery/components/Gallery.tsx +182 -0
  83. package/src/tools/Gallery/components/GalleryCarousel.tsx +251 -0
  84. package/src/tools/Gallery/components/GalleryCompact.tsx +173 -0
  85. package/src/tools/Gallery/components/GalleryGrid.tsx +493 -0
  86. package/src/tools/Gallery/components/GalleryImage.tsx +66 -0
  87. package/src/tools/Gallery/components/GalleryLightbox.tsx +331 -0
  88. package/src/tools/Gallery/components/GalleryMedia.tsx +66 -0
  89. package/src/tools/Gallery/components/GalleryThumbnails.tsx +173 -0
  90. package/src/tools/Gallery/components/GalleryThumbnailsVirtual.tsx +138 -0
  91. package/src/tools/Gallery/components/GalleryVideo.tsx +222 -0
  92. package/src/tools/Gallery/components/index.ts +13 -0
  93. package/src/tools/Gallery/hooks/index.ts +23 -0
  94. package/src/tools/Gallery/hooks/useGallery.ts +137 -0
  95. package/src/tools/Gallery/hooks/useImageDimensions.ts +223 -0
  96. package/src/tools/Gallery/hooks/usePinchZoom.ts +234 -0
  97. package/src/tools/Gallery/hooks/usePreloadImages.ts +71 -0
  98. package/src/tools/Gallery/hooks/useSwipe.ts +86 -0
  99. package/src/tools/Gallery/hooks/useVirtualList.ts +129 -0
  100. package/src/tools/Gallery/hooks/useZoom.ts +316 -0
  101. package/src/tools/Gallery/index.ts +66 -0
  102. package/src/tools/Gallery/types.ts +183 -0
  103. package/src/tools/Gallery/utils/imageAnalysis.ts +52 -0
  104. package/src/tools/Gallery/utils/index.ts +11 -0
  105. package/src/tools/ImageViewer/components/ImageToolbar.tsx +20 -8
  106. package/src/tools/ImageViewer/components/ImageViewer.tsx +12 -4
  107. package/src/tools/ImageViewer/lazy.tsx +37 -0
  108. package/src/tools/JsonForm/lazy.tsx +43 -0
  109. package/src/tools/JsonForm/widgets/ColorWidget.tsx +4 -1
  110. package/src/tools/JsonTree/lazy.tsx +45 -0
  111. package/src/tools/LottiePlayer/lazy.tsx +57 -0
  112. package/src/tools/Map/components/CustomOverlay.tsx +54 -0
  113. package/src/tools/Map/components/DrawControl.tsx +36 -0
  114. package/src/tools/Map/components/GeocoderControl.tsx +70 -0
  115. package/src/tools/Map/components/LayerSwitcher.tsx +225 -0
  116. package/src/tools/Map/components/MapCluster.tsx +273 -0
  117. package/src/tools/Map/components/MapContainer.tsx +191 -0
  118. package/src/tools/Map/components/MapControls.tsx +44 -0
  119. package/src/tools/Map/components/MapLegend.tsx +161 -0
  120. package/src/tools/Map/components/MapMarker.tsx +102 -0
  121. package/src/tools/Map/components/MapPopup.tsx +46 -0
  122. package/src/tools/Map/components/MapSource.tsx +30 -0
  123. package/src/tools/Map/components/index.ts +20 -0
  124. package/src/tools/Map/context/MapContext.tsx +89 -0
  125. package/src/tools/Map/context/index.ts +2 -0
  126. package/src/tools/Map/hooks/index.ts +9 -0
  127. package/src/tools/Map/hooks/useMap.ts +11 -0
  128. package/src/tools/Map/hooks/useMapControl.ts +99 -0
  129. package/src/tools/Map/hooks/useMapEvents.ts +147 -0
  130. package/src/tools/Map/hooks/useMapLayers.ts +83 -0
  131. package/src/tools/Map/hooks/useMapViewport.ts +62 -0
  132. package/src/tools/Map/hooks/useMarkers.ts +85 -0
  133. package/src/tools/Map/index.ts +116 -0
  134. package/src/tools/Map/layers/cluster.ts +94 -0
  135. package/src/tools/Map/layers/index.ts +15 -0
  136. package/src/tools/Map/layers/line.ts +93 -0
  137. package/src/tools/Map/layers/point.ts +61 -0
  138. package/src/tools/Map/layers/polygon.ts +73 -0
  139. package/src/tools/Map/lazy.tsx +56 -0
  140. package/src/tools/Map/styles/index.ts +15 -0
  141. package/src/tools/Map/types.ts +259 -0
  142. package/src/tools/Map/utils/geo.ts +88 -0
  143. package/src/tools/Map/utils/index.ts +16 -0
  144. package/src/tools/Map/utils/transform.ts +107 -0
  145. package/src/tools/Mermaid/Mermaid.client.tsx +12 -4
  146. package/src/tools/Mermaid/components/MermaidFullscreenModal.tsx +6 -2
  147. package/src/tools/Mermaid/lazy.tsx +46 -0
  148. package/src/tools/OpenapiViewer/lazy.tsx +72 -0
  149. package/src/tools/PrettyCode/PrettyCode.client.tsx +10 -3
  150. package/src/tools/PrettyCode/lazy.tsx +64 -0
  151. package/src/tools/VideoPlayer/lazy.tsx +63 -0
  152. package/dist/Mermaid.client-4OCKJ6QD.mjs.map +0 -1
  153. package/dist/Mermaid.client-ZP6OE46Z.cjs.map +0 -1
  154. package/dist/PlaygroundLayout-LMQTVXSP.mjs.map +0 -1
  155. package/dist/PlaygroundLayout-XXVBU4WZ.cjs.map +0 -1
  156. package/dist/PrettyCode.client-2CLSV2VD.cjs.map +0 -1
  157. package/dist/PrettyCode.client-Y2BVON7R.mjs.map +0 -1
  158. package/dist/chunk-FB5QBSI3.cjs.map +0 -1
  159. package/dist/chunk-L6UHASYQ.mjs.map +0 -1
package/dist/index.d.ts CHANGED
@@ -1,233 +1,350 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { CommonExternalProps } from 'react-json-tree';
3
2
  import * as React$1 from 'react';
4
- import React__default, { ReactNode } from 'react';
3
+ import React__default, { ReactNode, ComponentType } from 'react';
4
+ import { ViewState } from 'react-map-gl/maplibre';
5
5
  import { Language } from 'prism-react-renderer';
6
6
  export { Language } from 'prism-react-renderer';
7
7
  import { RJSFSchema, UiSchema, WidgetProps, FieldTemplateProps, ObjectFieldTemplateProps, ArrayFieldTemplateProps, ArrayFieldItemTemplateProps, ErrorListProps } from '@rjsf/utils';
8
8
  import { FormProps, IChangeEvent } from '@rjsf/core';
9
+ import { CommonExternalProps } from 'react-json-tree';
9
10
  import { MediaPlayerInstance } from '@vidstack/react';
10
11
  import * as zustand_middleware from 'zustand/middleware';
11
12
  import * as zustand from 'zustand';
12
13
 
13
- interface JsonTreeConfig {
14
- /** Maximum depth to expand automatically (default: 2) */
15
- maxAutoExpandDepth?: number;
16
- /** Maximum items in array to auto-expand (default: 10) */
17
- maxAutoExpandArrayItems?: number;
18
- /** Maximum object keys to auto-expand (default: 5) */
19
- maxAutoExpandObjectKeys?: number;
20
- /** Maximum string length before truncation (default: 200) */
21
- maxStringLength?: number;
22
- /** Collection limit for performance (default: 50) */
23
- collectionLimit?: number;
24
- /** Whether to show collection info (array length, object keys count) */
25
- showCollectionInfo?: boolean;
26
- /** Whether to show expand/collapse all buttons */
27
- showExpandControls?: boolean;
28
- /** Whether to show copy/download buttons */
29
- showActionButtons?: boolean;
30
- /** Custom CSS classes for the container */
14
+ interface LoadingFallbackProps {
15
+ /** Minimum height of the loading container */
16
+ minHeight?: string | number;
17
+ /** Show loading text */
18
+ showText?: boolean;
19
+ /** Custom loading text */
20
+ text?: string;
21
+ /** Additional CSS classes */
31
22
  className?: string;
32
- /** Whether to preserve object key order (default: true) */
33
- preserveKeyOrder?: boolean;
34
23
  }
35
- interface JsonTreeComponentProps {
24
+ /**
25
+ * Spinner - Simple spinning loader
26
+ */
27
+ declare function Spinner({ className }: {
28
+ className?: string;
29
+ }): react_jsx_runtime.JSX.Element;
30
+ /**
31
+ * LoadingFallback - Default loading state for lazy components
32
+ */
33
+ declare function LoadingFallback({ minHeight, showText, text, className, }: LoadingFallbackProps): react_jsx_runtime.JSX.Element;
34
+ /**
35
+ * CardLoadingFallback - Loading state styled as a card
36
+ */
37
+ declare function CardLoadingFallback({ title, description, minHeight, className, }: {
36
38
  title?: string;
37
- data: unknown;
38
- config?: JsonTreeConfig;
39
- /** Override for react-json-tree props */
40
- jsonTreeProps?: Partial<CommonExternalProps>;
41
- }
42
- declare const JsonTreeComponent: ({ title, data, config, jsonTreeProps }: JsonTreeComponentProps) => react_jsx_runtime.JSX.Element;
43
-
39
+ description?: string;
40
+ minHeight?: string | number;
41
+ className?: string;
42
+ }): react_jsx_runtime.JSX.Element;
44
43
  /**
45
- * Mermaid Component - Dynamic Import Wrapper
46
- *
47
- * Lazy loads the heavy Mermaid library (~800KB) only when needed.
48
- * This significantly reduces the initial bundle size.
44
+ * MapLoadingFallback - Loading state for map components
49
45
  */
50
-
51
- interface MermaidProps {
52
- chart: string;
46
+ declare function MapLoadingFallback({ minHeight, className, }: {
47
+ minHeight?: string | number;
48
+ className?: string;
49
+ }): react_jsx_runtime.JSX.Element;
50
+ interface LazyWrapperProps {
51
+ children: ReactNode;
52
+ /** Custom fallback component */
53
+ fallback?: ReactNode;
54
+ /** Use card-style fallback */
55
+ card?: boolean;
56
+ /** Card title (when card=true) */
57
+ cardTitle?: string;
58
+ /** Card description (when card=true) */
59
+ cardDescription?: string;
60
+ /** Minimum height for fallback */
61
+ minHeight?: string | number;
62
+ /** Additional CSS classes for fallback */
53
63
  className?: string;
54
- isCompact?: boolean;
55
64
  }
56
- declare const Mermaid: React__default.FC<MermaidProps>;
57
-
58
65
  /**
59
- * PrettyCode Component - Dynamic Import Wrapper
66
+ * LazyWrapper - Suspense wrapper with configurable fallbacks
60
67
  *
61
- * Lazy loads the heavy Prism library (~500KB) only when needed.
62
- * This significantly reduces the initial bundle size.
68
+ * @example
69
+ * // Basic usage
70
+ * <LazyWrapper>
71
+ * <LazyComponent />
72
+ * </LazyWrapper>
73
+ *
74
+ * @example
75
+ * // Card style fallback
76
+ * <LazyWrapper card cardTitle="Diagram" minHeight={300}>
77
+ * <Mermaid chart={...} />
78
+ * </LazyWrapper>
79
+ *
80
+ * @example
81
+ * // Custom fallback
82
+ * <LazyWrapper fallback={<MyCustomLoader />}>
83
+ * <HeavyComponent />
84
+ * </LazyWrapper>
63
85
  */
64
-
65
- interface PrettyCodeProps {
66
- data: string | object;
67
- language: Language;
68
- className?: string;
69
- mode?: 'dark' | 'light';
70
- inline?: boolean;
71
- customBg?: string;
72
- isCompact?: boolean;
86
+ declare function LazyWrapper({ children, fallback, card, cardTitle, cardDescription, minHeight, className, }: LazyWrapperProps): react_jsx_runtime.JSX.Element;
87
+ interface CreateLazyComponentOptions<P> {
88
+ /** Loading fallback component */
89
+ fallback?: ReactNode | ((props: P) => ReactNode);
90
+ /** Display name for the component */
91
+ displayName?: string;
73
92
  }
74
- declare const PrettyCode: React__default.FC<PrettyCodeProps>;
75
-
76
93
  /**
77
- * LottiePlayer Types
94
+ * createLazyComponent - Factory for creating lazy-loaded components
78
95
  *
79
- * Type definitions for the Lottie animation player component
96
+ * @example
97
+ * const LazyMermaid = createLazyComponent(
98
+ * () => import('./Mermaid.client'),
99
+ * {
100
+ * displayName: 'Mermaid',
101
+ * fallback: <CardLoadingFallback title="Diagram" />,
102
+ * }
103
+ * );
80
104
  */
81
- type LottieSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full';
82
- type LottieSpeed = 0.5 | 1 | 1.5 | 2;
83
- type LottieDirection = 1 | -1;
84
- interface LottiePlayerProps {
85
- /**
86
- * Animation data (JSON object) or URL to load from
87
- */
88
- src: string | object;
89
- /**
90
- * Size preset for the player
91
- * @default 'md'
92
- */
93
- size?: LottieSize;
94
- /**
95
- * Custom width (overrides size preset)
96
- */
97
- width?: number | string;
98
- /**
99
- * Custom height (overrides size preset)
100
- */
101
- height?: number | string;
102
- /**
103
- * Autoplay animation
104
- * @default true
105
- */
106
- autoplay?: boolean;
107
- /**
108
- * Loop animation
109
- * @default true
110
- */
111
- loop?: boolean | number;
112
- /**
113
- * Playback speed
114
- * @default 1
115
- */
116
- speed?: LottieSpeed;
117
- /**
118
- * Direction (1 = forward, -1 = reverse)
119
- * @default 1
120
- */
121
- direction?: LottieDirection;
105
+ declare function createLazyComponent<P extends object>(loader: () => Promise<{
106
+ default: ComponentType<P>;
107
+ }>, options?: CreateLazyComponentOptions<P>): ComponentType<P>;
108
+
109
+ interface MarkdownMessageProps {
110
+ /** Markdown content to render */
111
+ content: string;
112
+ /** Additional CSS classes */
113
+ className?: string;
114
+ /** Whether the message is from the user (affects styling) */
115
+ isUser?: boolean;
116
+ /** Use compact size (text-xs instead of text-sm) */
117
+ isCompact?: boolean;
122
118
  /**
123
- * Show playback controls
119
+ * Enable collapsible "Read more..." functionality
120
+ * When enabled, long content will be truncated with a toggle button
124
121
  * @default false
125
122
  */
126
- controls?: boolean;
123
+ collapsible?: boolean;
127
124
  /**
128
- * Background color
125
+ * Maximum character length before showing "Read more..."
126
+ * Only applies when collapsible is true
127
+ * If both maxLength and maxLines are set, the stricter limit applies
129
128
  */
130
- background?: string;
129
+ maxLength?: number;
131
130
  /**
132
- * CSS class name
131
+ * Maximum number of lines before showing "Read more..."
132
+ * Only applies when collapsible is true
133
+ * If both maxLength and maxLines are set, the stricter limit applies
133
134
  */
134
- className?: string;
135
+ maxLines?: number;
135
136
  /**
136
- * Show loading state
137
- * @default true
137
+ * Custom "Read more" button text
138
+ * @default "Read more..."
138
139
  */
139
- showLoading?: boolean;
140
+ readMoreLabel?: string;
140
141
  /**
141
- * Callback when animation completes
142
+ * Custom "Show less" button text
143
+ * @default "Show less"
142
144
  */
143
- onComplete?: () => void;
145
+ showLessLabel?: string;
144
146
  /**
145
- * Callback when animation loads
147
+ * Start expanded (only applies when collapsible is true)
148
+ * @default false
146
149
  */
147
- onLoad?: () => void;
150
+ defaultExpanded?: boolean;
148
151
  /**
149
- * Callback on error
152
+ * Callback when collapsed state changes
150
153
  */
151
- onError?: (error: Error) => void;
154
+ onCollapseChange?: (isCollapsed: boolean) => void;
152
155
  }
153
-
154
156
  /**
155
- * useLottie Hook
157
+ * MarkdownMessage - Renders markdown content with syntax highlighting and GFM support
156
158
  *
157
- * Hook for loading and managing Lottie animation data
159
+ * Features:
160
+ * - GitHub Flavored Markdown (GFM) support
161
+ * - Syntax highlighted code blocks with copy button
162
+ * - Mermaid diagram rendering
163
+ * - Tables, lists, blockquotes
164
+ * - User/assistant styling modes
165
+ * - Plain text optimization (skips ReactMarkdown for simple text)
166
+ * - Collapsible "Read more..." for long messages
167
+ *
168
+ * @example
169
+ * ```tsx
170
+ * <MarkdownMessage content="# Hello\n\nThis is **bold** text." />
171
+ *
172
+ * // User message styling
173
+ * <MarkdownMessage content="Some content" isUser />
174
+ *
175
+ * // Collapsible long content (for chat apps)
176
+ * <MarkdownMessage
177
+ * content={longText}
178
+ * collapsible
179
+ * maxLength={300}
180
+ * maxLines={5}
181
+ * />
182
+ * ```
158
183
  */
159
- interface UseLottieOptions {
160
- /**
161
- * Animation data (JSON object) or URL to load from
162
- */
163
- src: string | object;
164
- /**
165
- * Enable caching of loaded animations
166
- * @default true
167
- */
168
- cache?: boolean;
169
- }
170
- interface UseLottieReturn {
171
- /**
172
- * Loaded animation data
173
- */
174
- animationData: object | null;
184
+ declare const MarkdownMessage: React__default.FC<MarkdownMessageProps>;
185
+
186
+ interface UseCollapsibleContentOptions {
175
187
  /**
176
- * Loading state
188
+ * Maximum character length before collapsing
189
+ * If both maxLength and maxLines are set, the stricter limit applies
177
190
  */
178
- isLoading: boolean;
191
+ maxLength?: number;
179
192
  /**
180
- * Error state
193
+ * Maximum number of lines before collapsing
194
+ * If both maxLength and maxLines are set, the stricter limit applies
181
195
  */
182
- error: Error | null;
196
+ maxLines?: number;
183
197
  /**
184
- * Retry loading the animation
198
+ * Start in expanded state (default: false - starts collapsed)
185
199
  */
186
- retry: () => void;
200
+ defaultExpanded?: boolean;
201
+ }
202
+ interface UseCollapsibleContentResult {
203
+ /** Whether content is currently collapsed */
204
+ isCollapsed: boolean;
205
+ /** Toggle between collapsed/expanded state */
206
+ toggleCollapsed: () => void;
207
+ /** Set collapsed state directly */
208
+ setCollapsed: (collapsed: boolean) => void;
209
+ /** Content to display (truncated if collapsed, full if expanded) */
210
+ displayContent: string;
211
+ /** Whether the content exceeds limits and should be collapsible */
212
+ shouldCollapse: boolean;
213
+ /** Original content length */
214
+ originalLength: number;
215
+ /** Original line count */
216
+ originalLineCount: number;
187
217
  }
188
218
  /**
189
- * Hook for loading Lottie animations from URLs or objects
190
- *
191
- * Features:
192
- * - Loads animations from URLs or accepts animation objects directly
193
- * - Caching support to prevent re-fetching the same animation
194
- * - Error handling with retry capability
195
- * - Loading states
219
+ * Hook for managing collapsible content with "Read more..." functionality
196
220
  *
197
- * Usage:
221
+ * @example
198
222
  * ```tsx
199
- * const { animationData, isLoading, error, retry } = useLottie({
200
- * src: 'https://example.com/animation.json'
201
- * });
202
- *
203
- * if (isLoading) return <div>Loading...</div>;
204
- * if (error) return <div>Error: {error.message} <button onClick={retry}>Retry</button></div>;
205
- * if (!animationData) return null;
223
+ * const { isCollapsed, toggleCollapsed, displayContent, shouldCollapse } = useCollapsibleContent(
224
+ * longText,
225
+ * { maxLength: 300, maxLines: 5 }
226
+ * );
206
227
  *
207
- * return <LottiePlayer animationData={animationData} />;
228
+ * return (
229
+ * <div>
230
+ * <Markdown content={displayContent} />
231
+ * {shouldCollapse && (
232
+ * <button onClick={toggleCollapsed}>
233
+ * {isCollapsed ? 'Read more...' : 'Show less'}
234
+ * </button>
235
+ * )}
236
+ * </div>
237
+ * );
208
238
  * ```
209
239
  */
210
- declare function useLottie(options: UseLottieOptions): UseLottieReturn;
240
+ declare function useCollapsibleContent(content: string, options?: UseCollapsibleContentOptions): UseCollapsibleContentResult;
241
+
242
+ interface MarkerData {
243
+ id: string;
244
+ longitude: number;
245
+ latitude: number;
246
+ data?: Record<string, unknown>;
247
+ }
248
+ interface MapViewport extends Partial<ViewState> {
249
+ longitude: number;
250
+ latitude: number;
251
+ zoom: number;
252
+ bearing?: number;
253
+ pitch?: number;
254
+ transitionDuration?: number;
255
+ }
256
+ type MapStyleKey = 'light' | 'dark' | 'streets' | 'satellite';
257
+
258
+ interface MapContainerProps {
259
+ children?: ReactNode;
260
+ initialViewport?: Partial<MapViewport>;
261
+ mapStyle?: MapStyleKey | string;
262
+ interactiveLayerIds?: string[];
263
+ className?: string;
264
+ style?: React.CSSProperties;
265
+ cursor?: string;
266
+ attributionControl?: boolean;
267
+ reuseMaps?: boolean;
268
+ /** URL to open in external maps app (shows "Open in Maps" button if provided) */
269
+ openInMapsUrl?: string;
270
+ /** Label for the open in maps button */
271
+ openInMapsLabel?: string;
272
+ /** Auto-reset to initial viewport after N ms of inactivity (0 = disabled) */
273
+ autoResetDelay?: number;
274
+ /** Show reset button */
275
+ showResetButton?: boolean;
276
+ }
211
277
 
212
278
  /**
213
- * LottiePlayer component wrapper with dynamic import
279
+ * LazyMapContainer - Lazy-loaded map container
214
280
  *
215
- * This component automatically handles code splitting and lazy loading
216
- * of the Lottie player to optimize bundle size.
281
+ * Automatically shows loading state while MapLibre GL loads (~800KB)
282
+ */
283
+ declare const LazyMapContainer: React$1.ComponentType<MapContainerProps>;
284
+ /**
285
+ * LazyMapView - Lazy-loaded map view (alias for MapContainer)
286
+ */
287
+ declare const LazyMapView: React$1.ComponentType<Omit<MapContainerProps, "initialViewport">>;
288
+
289
+ interface MermaidProps$1 {
290
+ chart: string;
291
+ className?: string;
292
+ isCompact?: boolean;
293
+ }
294
+ /**
295
+ * LazyMermaid - Lazy-loaded Mermaid diagram renderer
217
296
  *
218
- * Usage:
219
- * ```tsx
220
- * import { LottiePlayer } from '@djangocfg/ui-core/tools';
297
+ * Automatically shows loading state while Mermaid loads (~800KB)
298
+ */
299
+ declare const LazyMermaid: React$1.ComponentType<MermaidProps$1>;
300
+
301
+ interface PrettyCodeProps$1 {
302
+ data: string | object;
303
+ language: Language;
304
+ className?: string;
305
+ mode?: 'dark' | 'light';
306
+ inline?: boolean;
307
+ customBg?: string;
308
+ isCompact?: boolean;
309
+ }
310
+
311
+ /**
312
+ * LazyPrettyCode - Lazy-loaded code syntax highlighter
221
313
  *
222
- * <LottiePlayer
223
- * src="https://example.com/animation.json"
224
- * size="md"
225
- * autoplay
226
- * loop
227
- * />
228
- * ```
314
+ * Automatically shows loading state while Prism loads (~500KB)
229
315
  */
230
- declare function LottiePlayer(props: LottiePlayerProps): react_jsx_runtime.JSX.Element;
316
+ declare const LazyPrettyCode: React$1.ComponentType<PrettyCodeProps$1>;
317
+
318
+ interface SchemaSource {
319
+ id: string;
320
+ name: string;
321
+ url: string;
322
+ }
323
+ interface PlaygroundConfig {
324
+ schemas: SchemaSource[];
325
+ defaultSchemaId?: string;
326
+ }
327
+
328
+ /**
329
+ * Lazy-loaded OpenapiViewer Component
330
+ *
331
+ * Heavy OpenAPI viewer (~400KB) is loaded only when component is rendered.
332
+ * Use this for automatic code-splitting with Suspense fallback.
333
+ *
334
+ * For direct imports without lazy loading, use:
335
+ * import OpenapiViewer from '@djangocfg/ui-tools/openapi'
336
+ */
337
+
338
+ interface PlaygroundProps$1 {
339
+ config: PlaygroundConfig;
340
+ }
341
+
342
+ /**
343
+ * LazyOpenapiViewer - Lazy-loaded OpenAPI schema viewer & playground
344
+ *
345
+ * Automatically shows loading state while OpenAPI components load (~400KB)
346
+ */
347
+ declare const LazyOpenapiViewer: React$1.FC<PlaygroundProps$1>;
231
348
 
232
349
  /**
233
350
  * JSON Schema Form props interface
@@ -262,228 +379,500 @@ interface JsonSchemaFormProps<T = any> extends Partial<FormProps<T>> {
262
379
  }
263
380
 
264
381
  /**
265
- * JSON Schema Form Component
266
- *
267
- * A fully-featured form generator that creates forms from JSON Schema.
268
- * Built on top of react-jsonschema-form with custom widgets and templates
269
- * using @djangocfg/ui components.
270
- *
271
- * @example
272
- * ```tsx
273
- * const schema = {
274
- * type: 'object',
275
- * required: ['name'],
276
- * properties: {
277
- * name: { type: 'string', title: 'Name' },
278
- * age: { type: 'number', title: 'Age' },
279
- * active: { type: 'boolean', title: 'Active' }
280
- * }
281
- * };
382
+ * LazyJsonSchemaForm - Lazy-loaded JSON Schema form generator
282
383
  *
283
- * <JsonSchemaForm
284
- * schema={schema}
285
- * onSubmit={(data) => console.log(data.formData)}
286
- * />
287
- * ```
384
+ * Automatically shows loading state while RJSF loads (~300KB)
288
385
  */
289
- declare function JsonSchemaForm<T = any>(props: JsonSchemaFormProps<T>): react_jsx_runtime.JSX.Element;
386
+ declare const LazyJsonSchemaForm: React$1.ComponentType<JsonSchemaFormProps<any>>;
290
387
 
291
388
  /**
292
- * Text input widget for JSON Schema Form
293
- * Handles string fields with optional textarea for multiline
389
+ * LottiePlayer Types
390
+ *
391
+ * Type definitions for the Lottie animation player component
294
392
  */
295
- declare function TextWidget(props: WidgetProps): react_jsx_runtime.JSX.Element;
393
+ type LottieSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full';
394
+ type LottieSpeed = 0.5 | 1 | 1.5 | 2;
395
+ type LottieDirection = 1 | -1;
396
+ interface LottiePlayerProps {
397
+ /**
398
+ * Animation data (JSON object) or URL to load from
399
+ */
400
+ src: string | object;
401
+ /**
402
+ * Size preset for the player
403
+ * @default 'md'
404
+ */
405
+ size?: LottieSize;
406
+ /**
407
+ * Custom width (overrides size preset)
408
+ */
409
+ width?: number | string;
410
+ /**
411
+ * Custom height (overrides size preset)
412
+ */
413
+ height?: number | string;
414
+ /**
415
+ * Autoplay animation
416
+ * @default true
417
+ */
418
+ autoplay?: boolean;
419
+ /**
420
+ * Loop animation
421
+ * @default true
422
+ */
423
+ loop?: boolean | number;
424
+ /**
425
+ * Playback speed
426
+ * @default 1
427
+ */
428
+ speed?: LottieSpeed;
429
+ /**
430
+ * Direction (1 = forward, -1 = reverse)
431
+ * @default 1
432
+ */
433
+ direction?: LottieDirection;
434
+ /**
435
+ * Show playback controls
436
+ * @default false
437
+ */
438
+ controls?: boolean;
439
+ /**
440
+ * Background color
441
+ */
442
+ background?: string;
443
+ /**
444
+ * CSS class name
445
+ */
446
+ className?: string;
447
+ /**
448
+ * Show loading state
449
+ * @default true
450
+ */
451
+ showLoading?: boolean;
452
+ /**
453
+ * Callback when animation completes
454
+ */
455
+ onComplete?: () => void;
456
+ /**
457
+ * Callback when animation loads
458
+ */
459
+ onLoad?: () => void;
460
+ /**
461
+ * Callback on error
462
+ */
463
+ onError?: (error: Error) => void;
464
+ }
296
465
 
297
466
  /**
298
- * Number input widget for JSON Schema Form
299
- * Handles integer and number fields
467
+ * LazyLottiePlayer - Lazy-loaded Lottie animation player
468
+ *
469
+ * Automatically shows loading state while Lottie loads (~200KB)
300
470
  */
301
- declare function NumberWidget(props: WidgetProps): react_jsx_runtime.JSX.Element;
471
+ declare const LazyLottiePlayer: React$1.ComponentType<LottiePlayerProps>;
472
+
473
+ interface HybridAudioPlayerProps {
474
+ /** Show playback controls */
475
+ showControls?: boolean;
476
+ /** Show frequency waveform */
477
+ showWaveform?: boolean;
478
+ /** Waveform visualization mode */
479
+ waveformMode?: 'frequency' | 'static';
480
+ /** Waveform height in pixels */
481
+ waveformHeight?: number;
482
+ /** Show time display */
483
+ showTimer?: boolean;
484
+ /** Show volume control */
485
+ showVolume?: boolean;
486
+ /** Show loop button */
487
+ showLoop?: boolean;
488
+ /** Additional CSS class */
489
+ className?: string;
490
+ /** Inline styles */
491
+ style?: React.CSSProperties;
492
+ }
493
+ declare const HybridAudioPlayer: React$1.NamedExoticComponent<HybridAudioPlayerProps>;
302
494
 
303
495
  /**
304
- * Checkbox widget for JSON Schema Form
305
- * Handles boolean fields
496
+ * Audio Reactive Effects - Common utilities and types
497
+ *
498
+ * Provides reusable effect calculations and configurations
306
499
  */
307
- declare function CheckboxWidget(props: WidgetProps): react_jsx_runtime.JSX.Element;
308
-
500
+ type EffectVariant = 'glow' | 'orbs' | 'spotlight' | 'mesh';
501
+ type EffectIntensity = 'subtle' | 'medium' | 'strong';
502
+ type EffectColorScheme = 'primary' | 'vibrant' | 'cool' | 'warm';
503
+ interface AudioLevels {
504
+ bass: number;
505
+ mid: number;
506
+ high: number;
507
+ overall: number;
508
+ }
509
+ interface EffectConfig$1 {
510
+ opacity: number;
511
+ scale: number;
512
+ blur: string;
513
+ }
514
+ interface EffectColors {
515
+ colors: string[];
516
+ hueShift: number;
517
+ }
518
+ interface EffectLayer {
519
+ inset: number;
520
+ opacity: number;
521
+ scale: number;
522
+ background: string;
523
+ blur: string;
524
+ animation?: string;
525
+ }
526
+ declare const INTENSITY_CONFIG: Record<EffectIntensity, EffectConfig$1>;
527
+ declare const COLOR_SCHEMES: Record<EffectColorScheme, string[]>;
309
528
  /**
310
- * Select dropdown widget for JSON Schema Form
311
- * Handles enum fields
529
+ * Get effect configuration from intensity setting
312
530
  */
313
- declare function SelectWidget(props: WidgetProps): react_jsx_runtime.JSX.Element;
314
-
531
+ declare function getEffectConfig(intensity: EffectIntensity): EffectConfig$1;
315
532
  /**
316
- * Switch toggle widget for JSON Schema Form
317
- * Alternative boolean input
533
+ * Get color array from color scheme
318
534
  */
319
- declare function SwitchWidget(props: WidgetProps): react_jsx_runtime.JSX.Element;
320
-
535
+ declare function getColors(colorScheme: EffectColorScheme): string[];
321
536
  /**
322
- * Color input widget for JSON Schema Form
323
- * Supports HSL format (h s% l%) and HEX format
324
- * Click on color box to open native color picker directly
325
- */
326
- declare function ColorWidget(props: WidgetProps): react_jsx_runtime.JSX.Element;
327
-
328
- /**
329
- * Slider widget for JSON Schema Form
330
- *
331
- * Supports:
332
- * - number/integer types
333
- * - min/max from schema
334
- * - step from schema or options
335
- * - unit suffix (e.g., "rem", "px", "%")
336
- * - optional text input for precise values
337
- *
338
- * Usage in uiSchema:
339
- * ```json
340
- * {
341
- * "radius": {
342
- * "ui:widget": "slider",
343
- * "ui:options": {
344
- * "unit": "rem",
345
- * "showInput": true,
346
- * "step": 0.125
347
- * }
348
- * }
349
- * }
350
- * ```
351
- */
352
- declare function SliderWidget(props: WidgetProps): react_jsx_runtime.JSX.Element;
353
-
354
- /**
355
- * Field template for JSON Schema Form
356
- * Controls the layout and styling of individual form fields
357
- */
358
- declare function FieldTemplate(props: FieldTemplateProps): react_jsx_runtime.JSX.Element;
359
-
360
- /**
361
- * Object field template for JSON Schema Form
362
- *
363
- * Supports:
364
- * - Collapsible groups via ui:collapsible option
365
- * - Grid layout via ui:grid option
366
- * - Custom styling via ui:className
367
- *
368
- * Usage in uiSchema:
369
- * ```json
370
- * {
371
- * "colors": {
372
- * "ui:collapsible": true,
373
- * "ui:collapsed": false,
374
- * "ui:grid": 2
375
- * }
376
- * }
377
- * ```
378
- */
379
- declare function ObjectFieldTemplate(props: ObjectFieldTemplateProps): react_jsx_runtime.JSX.Element;
380
-
381
- /**
382
- * Array field template for JSON Schema Form
383
- * Renders array items with add/remove controls
384
- *
385
- * NOTE: In RJSF v6, `items` is an array of ReactElement (already rendered),
386
- * NOT an array of objects with {children, hasRemove, etc.}.
387
- * The actual rendering of each item (including remove buttons) is handled
388
- * by ArrayFieldItemTemplate.
389
- */
390
- declare function ArrayFieldTemplate(props: ArrayFieldTemplateProps): react_jsx_runtime.JSX.Element;
391
-
392
- /**
393
- * Array field item template for JSON Schema Form
394
- * Renders individual array items with proper styling and action buttons
395
- *
396
- * In RJSF v6, this template is responsible for rendering each item in an array,
397
- * including the item content (children) and the action buttons (remove, move up/down, copy).
398
- */
399
- declare function ArrayFieldItemTemplate(props: ArrayFieldItemTemplateProps): react_jsx_runtime.JSX.Element;
400
-
401
- /**
402
- * Error list template for JSON Schema Form
403
- * Displays validation errors at the top of the form
404
- */
405
- declare function ErrorListTemplate(props: ErrorListProps): react_jsx_runtime.JSX.Element;
406
-
407
- /**
408
- * Base input template for JSON Schema Form
409
- *
410
- * This template is CRITICAL for rendering primitive types (string, number)
411
- * inside arrays. Without it, array items with primitive types will render
412
- * as empty containers.
413
- *
414
- * RJSF uses this template for:
415
- * - Array items with primitive types (e.g., array of strings)
416
- * - Fields without explicit widget mapping
417
- * - All text-based widgets internally
418
- *
419
- * @see https://rjsf-team.github.io/react-jsonschema-form/docs/advanced-customization/custom-templates/#baseinputtemplate
420
- */
421
- declare function BaseInputTemplate(props: WidgetProps): react_jsx_runtime.JSX.Element;
422
-
423
- /**
424
- * Utility functions for JSON Schema Form
425
- */
426
- /**
427
- * Safely validates and normalizes JSON Schema
428
- * Ensures schema is valid before rendering
429
- */
430
- declare function validateSchema(schema: any): RJSFSchema | null;
431
- /**
432
- * Safely normalizes form data
433
- * Removes undefined values and ensures data structure matches schema
434
- */
435
- declare function normalizeFormData<T = any>(formData: any, schema: RJSFSchema): T;
436
- /**
437
- * Merges schema defaults with form data
537
+ * Prepare colors with hue shift based on audio levels
438
538
  */
439
- declare function mergeDefaults(formData: any, schema: RJSFSchema): any;
539
+ declare function prepareEffectColors(colorScheme: EffectColorScheme, levels: AudioLevels): EffectColors;
440
540
  /**
441
- * Safely parses JSON string with error handling
541
+ * Calculate glow layer properties
442
542
  */
443
- declare function safeJsonParse<T = any>(jsonString: string, fallback: T): T;
543
+ declare function calculateGlowLayers(levels: AudioLevels, config: EffectConfig$1, colors: string[]): EffectLayer[];
444
544
  /**
445
- * Safely stringifies object to JSON
545
+ * Calculate orb positions and properties - highly reactive
446
546
  */
447
- declare function safeJsonStringify(obj: any, pretty?: boolean): string;
547
+ declare function calculateOrbs(levels: AudioLevels, config: EffectConfig$1, colors: string[], baseSize?: number): {
548
+ x: number;
549
+ y: number;
550
+ size: number;
551
+ color: string;
552
+ opacity: number;
553
+ scale: number;
554
+ }[];
448
555
  /**
449
- * Checks if schema has required fields
556
+ * Calculate mesh gradient positions - dynamic and reactive
450
557
  */
451
- declare function hasRequiredFields(schema: RJSFSchema): boolean;
558
+ declare function calculateMeshGradients(levels: AudioLevels, config: EffectConfig$1, colors: string[]): ({
559
+ width: string;
560
+ height: string;
561
+ top: string;
562
+ right: string;
563
+ color: string;
564
+ opacity: number;
565
+ scale: number;
566
+ rotation: number;
567
+ blur: string;
568
+ bottom?: undefined;
569
+ left?: undefined;
570
+ isCenter?: undefined;
571
+ } | {
572
+ width: string;
573
+ height: string;
574
+ bottom: string;
575
+ left: string;
576
+ color: string;
577
+ opacity: number;
578
+ scale: number;
579
+ rotation: number;
580
+ blur: string;
581
+ top?: undefined;
582
+ right?: undefined;
583
+ isCenter?: undefined;
584
+ } | {
585
+ width: string;
586
+ height: string;
587
+ top: string;
588
+ left: string;
589
+ color: string;
590
+ opacity: number;
591
+ scale: number;
592
+ rotation: number;
593
+ blur: string;
594
+ right?: undefined;
595
+ bottom?: undefined;
596
+ isCenter?: undefined;
597
+ } | {
598
+ width: string;
599
+ height: string;
600
+ top: string;
601
+ left: string;
602
+ color: string;
603
+ opacity: number;
604
+ scale: number;
605
+ rotation: number;
606
+ isCenter: boolean;
607
+ blur: string;
608
+ right?: undefined;
609
+ bottom?: undefined;
610
+ })[];
452
611
  /**
453
- * Gets all required field paths from schema
612
+ * Calculate spotlight effect properties - highly reactive
454
613
  */
455
- declare function getRequiredFields(schema: RJSFSchema, prefix?: string): string[];
614
+ declare function calculateSpotlight(levels: AudioLevels, config: EffectConfig$1, colors: string[], rotation: number): {
615
+ rotation: number;
616
+ inset: number;
617
+ colors: {
618
+ color: string;
619
+ opacity: number;
620
+ }[];
621
+ pulseInset: number;
622
+ pulseOpacity: number;
623
+ pulseScale: number;
624
+ ringOpacity: number;
625
+ ringScale: number;
626
+ };
456
627
  /**
457
- * Validates form data against required fields
628
+ * CSS for effect animations - can be injected once
458
629
  */
459
- declare function validateRequiredFields(formData: any, schema: RJSFSchema): {
460
- valid: boolean;
461
- missing: string[];
462
- };
630
+ declare 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";
463
631
 
464
- interface SchemaSource {
465
- id: string;
466
- name: string;
467
- url: string;
468
- }
469
- interface PlaygroundConfig {
470
- schemas: SchemaSource[];
471
- defaultSchemaId?: string;
632
+ interface UseHybridAudioOptions {
633
+ src: string;
634
+ autoPlay?: boolean;
635
+ initialVolume?: number;
636
+ loop?: boolean;
637
+ crossOrigin?: 'anonymous' | 'use-credentials';
638
+ onPlay?: () => void;
639
+ onPause?: () => void;
640
+ onEnded?: () => void;
641
+ onTimeUpdate?: (time: number) => void;
642
+ onError?: (error: Error) => void;
643
+ onReady?: () => void;
472
644
  }
473
-
474
- interface PlaygroundProps {
475
- config: PlaygroundConfig;
645
+ interface HybridAudioState {
646
+ isReady: boolean;
647
+ isPlaying: boolean;
648
+ currentTime: number;
649
+ duration: number;
650
+ volume: number;
651
+ isMuted: boolean;
652
+ isLooping: boolean;
653
+ buffered: TimeRanges | null;
654
+ error: Error | null;
476
655
  }
477
- declare const Playground: React__default.FC<PlaygroundProps>;
478
-
479
- /**
480
- * Video source type definitions
481
- */
482
- /** Simple URL source (mp4, webm, etc.) */
483
- interface UrlSource {
484
- type: 'url';
485
- url: string;
486
- title?: string;
656
+ interface HybridAudioControls {
657
+ play: () => Promise<void>;
658
+ pause: () => void;
659
+ togglePlay: () => void;
660
+ seek: (time: number) => void;
661
+ seekTo: (progress: number) => void;
662
+ skip: (seconds: number) => void;
663
+ setVolume: (vol: number) => void;
664
+ toggleMute: () => void;
665
+ toggleLoop: () => void;
666
+ setLoop: (enabled: boolean) => void;
667
+ restart: () => void;
668
+ }
669
+ interface HybridWebAudioAPI {
670
+ context: AudioContext | null;
671
+ analyser: AnalyserNode | null;
672
+ sourceNode: MediaElementAudioSourceNode | null;
673
+ }
674
+ interface UseHybridAudioReturn {
675
+ audioRef: React.RefObject<HTMLAudioElement | null>;
676
+ state: HybridAudioState;
677
+ controls: HybridAudioControls;
678
+ webAudio: HybridWebAudioAPI;
679
+ }
680
+ declare function useHybridAudio(options: UseHybridAudioOptions): UseHybridAudioReturn;
681
+
682
+ declare function useHybridAudioAnalysis(analyser: AnalyserNode | null, isPlaying: boolean): AudioLevels;
683
+
684
+ type VisualizationVariant = 'glow' | 'orbs' | 'spotlight' | 'mesh' | 'none';
685
+ type VisualizationIntensity = 'subtle' | 'medium' | 'strong';
686
+ type VisualizationColorScheme = 'primary' | 'vibrant' | 'cool' | 'warm';
687
+ interface VisualizationSettings {
688
+ /** Enable reactive cover animation */
689
+ enabled: boolean;
690
+ /** Visual effect variant */
691
+ variant: VisualizationVariant;
692
+ /** Effect intensity */
693
+ intensity: VisualizationIntensity;
694
+ /** Color scheme */
695
+ colorScheme: VisualizationColorScheme;
696
+ /** Playback volume (0-1) */
697
+ volume: number;
698
+ /** Loop playback */
699
+ isLooping: boolean;
700
+ }
701
+ interface UseVisualizationReturn {
702
+ /** Current settings */
703
+ settings: VisualizationSettings;
704
+ /** Toggle visualization on/off */
705
+ toggle: () => void;
706
+ /** Set specific setting */
707
+ setSetting: <K extends keyof VisualizationSettings>(key: K, value: VisualizationSettings[K]) => void;
708
+ /** Cycle to next variant */
709
+ nextVariant: () => void;
710
+ /** Cycle to next intensity */
711
+ nextIntensity: () => void;
712
+ /** Cycle to next color scheme */
713
+ nextColorScheme: () => void;
714
+ /** Reset to defaults */
715
+ reset: () => void;
716
+ }
717
+ type UseAudioVisualizationReturn = UseVisualizationReturn;
718
+ interface VisualizationProviderProps {
719
+ children: ReactNode;
720
+ }
721
+ declare function VisualizationProvider({ children }: VisualizationProviderProps): react_jsx_runtime.JSX.Element;
722
+ declare function useVisualization(): UseVisualizationReturn;
723
+ declare const useAudioVisualization: typeof useVisualization;
724
+ declare const VARIANT_INFO: Record<VisualizationVariant, {
725
+ label: string;
726
+ icon: string;
727
+ }>;
728
+ declare const INTENSITY_INFO: Record<VisualizationIntensity, {
729
+ label: string;
730
+ }>;
731
+ declare const COLOR_SCHEME_INFO: Record<VisualizationColorScheme, {
732
+ label: string;
733
+ preview: string;
734
+ }>;
735
+
736
+ interface HybridSimplePlayerProps {
737
+ /** Audio source URL */
738
+ src: string;
739
+ /** Track title */
740
+ title?: string;
741
+ /** Artist name */
742
+ artist?: string;
743
+ /** Cover art URL or ReactNode */
744
+ coverArt?: string | ReactNode;
745
+ /** Cover art size */
746
+ coverSize?: 'sm' | 'md' | 'lg';
747
+ /** Show frequency waveform */
748
+ showWaveform?: boolean;
749
+ /** Waveform visualization mode */
750
+ waveformMode?: 'frequency' | 'static';
751
+ /** Waveform height in pixels */
752
+ waveformHeight?: number;
753
+ /** Show timer */
754
+ showTimer?: boolean;
755
+ /** Show volume control */
756
+ showVolume?: boolean;
757
+ /** Show loop/repeat button */
758
+ showLoop?: boolean;
759
+ /** Enable audio-reactive cover effects */
760
+ reactiveCover?: boolean;
761
+ /** Reactive effect variant */
762
+ variant?: VisualizationVariant;
763
+ /** Reactive effect intensity */
764
+ intensity?: EffectIntensity;
765
+ /** Reactive effect color scheme */
766
+ colorScheme?: EffectColorScheme;
767
+ /** Auto-play on load */
768
+ autoPlay?: boolean;
769
+ /** Loop playback */
770
+ loop?: boolean;
771
+ /** Initial volume (0-1) */
772
+ initialVolume?: number;
773
+ /** Layout direction */
774
+ layout?: 'vertical' | 'horizontal';
775
+ /** Additional class name */
776
+ className?: string;
777
+ /** Callbacks */
778
+ onPlay?: () => void;
779
+ onPause?: () => void;
780
+ onEnded?: () => void;
781
+ onError?: (error: Error) => void;
782
+ }
783
+ declare function HybridSimplePlayer(props: HybridSimplePlayerProps): react_jsx_runtime.JSX.Element;
784
+
785
+ interface HybridWaveformProps {
786
+ /** Visualization mode */
787
+ mode?: 'frequency' | 'static';
788
+ /** Canvas height in pixels */
789
+ height?: number;
790
+ /** Bar width in pixels */
791
+ barWidth?: number;
792
+ /** Gap between bars in pixels */
793
+ barGap?: number;
794
+ /** Bar border radius */
795
+ barRadius?: number;
796
+ /** Color for played portion */
797
+ progressColor?: string;
798
+ /** Color for unplayed portion */
799
+ waveColor?: string;
800
+ /** Color for buffered regions indicator */
801
+ bufferedColor?: string;
802
+ /** Additional CSS class */
803
+ className?: string;
804
+ /** Callback when user seeks */
805
+ onSeek?: (time: number) => void;
806
+ }
807
+ declare const HybridWaveform: React$1.NamedExoticComponent<HybridWaveformProps>;
808
+
809
+ interface AudioReactiveCoverProps {
810
+ children: ReactNode;
811
+ size?: 'sm' | 'md' | 'lg';
812
+ variant?: EffectVariant;
813
+ intensity?: EffectIntensity;
814
+ colorScheme?: EffectColorScheme;
815
+ onClick?: () => void;
816
+ className?: string;
817
+ }
818
+ declare function AudioReactiveCover({ children, size, variant, intensity, colorScheme, onClick, className, }: AudioReactiveCoverProps): react_jsx_runtime.JSX.Element;
819
+
820
+ interface GlowEffectData {
821
+ layers: ReturnType<typeof calculateGlowLayers>;
822
+ hueShift: number;
823
+ showPulseRings: boolean;
824
+ showSparkle: boolean;
825
+ }
826
+ interface GlowEffectProps {
827
+ data: GlowEffectData;
828
+ colors: string[];
829
+ isPlaying: boolean;
830
+ }
831
+ declare function GlowEffect({ data, colors, isPlaying }: GlowEffectProps): react_jsx_runtime.JSX.Element;
832
+
833
+ interface OrbsEffectProps {
834
+ orbs: ReturnType<typeof calculateOrbs>;
835
+ blur: string;
836
+ isPlaying: boolean;
837
+ }
838
+ declare function OrbsEffect({ orbs, blur, isPlaying }: OrbsEffectProps): react_jsx_runtime.JSX.Element;
839
+
840
+ interface SpotlightEffectProps {
841
+ data: ReturnType<typeof calculateSpotlight>;
842
+ colors: string[];
843
+ blur: string;
844
+ isPlaying: boolean;
845
+ }
846
+ declare function SpotlightEffect({ data, colors, blur, isPlaying }: SpotlightEffectProps): react_jsx_runtime.JSX.Element;
847
+
848
+ interface MeshEffectProps {
849
+ gradients: ReturnType<typeof calculateMeshGradients>;
850
+ blur: string;
851
+ isPlaying: boolean;
852
+ }
853
+ declare function MeshEffect({ gradients, isPlaying }: MeshEffectProps): react_jsx_runtime.JSX.Element;
854
+
855
+ /**
856
+ * LazyHybridAudioPlayer - Lazy-loaded full-featured audio player
857
+ *
858
+ * Automatically shows loading state while WaveSurfer loads (~200KB)
859
+ */
860
+ declare const LazyHybridAudioPlayer: React$1.ComponentType<HybridAudioPlayerProps>;
861
+ /**
862
+ * LazyHybridSimplePlayer - Lazy-loaded simple audio player
863
+ *
864
+ * Automatically shows loading state while WaveSurfer loads (~200KB)
865
+ */
866
+ declare const LazyHybridSimplePlayer: React$1.ComponentType<HybridSimplePlayerProps>;
867
+
868
+ /**
869
+ * Video source type definitions
870
+ */
871
+ /** Simple URL source (mp4, webm, etc.) */
872
+ interface UrlSource {
873
+ type: 'url';
874
+ url: string;
875
+ title?: string;
487
876
  poster?: string;
488
877
  }
489
878
  /** YouTube embed source */
@@ -722,586 +1111,604 @@ interface SimpleStreamSource {
722
1111
  }
723
1112
 
724
1113
  /**
725
- * VideoPlayer - Unified Video Player Component
726
- *
727
- * Supports multiple modes:
728
- * - vidstack: Full-featured player (YouTube, Vimeo, HLS, DASH)
729
- * - native: Lightweight HTML5 player
730
- * - streaming: HTTP Range streaming with auth / Blob sources
731
- *
732
- * @example
733
- * // YouTube video
734
- * <VideoPlayer source={{ type: 'youtube', id: 'dQw4w9WgXcQ' }} />
1114
+ * LazyVideoPlayer - Lazy-loaded professional video player
735
1115
  *
736
- * @example
737
- * // HLS stream
738
- * <VideoPlayer source={{ type: 'hls', url: 'https://example.com/video.m3u8' }} />
739
- *
740
- * @example
741
- * // HTTP Range streaming with auth (full source)
742
- * <VideoPlayer
743
- * source={{
744
- * type: 'stream',
745
- * sessionId: 'abc123',
746
- * path: '/videos/movie.mp4',
747
- * getStreamUrl: (id, path) => `/api/stream/${id}?path=${path}&token=${token}`
748
- * }}
749
- * />
750
- *
751
- * @example
752
- * // HTTP Range streaming (simplified, using VideoPlayerProvider context)
753
- * <VideoPlayerProvider sessionId={sessionId} getStreamUrl={getStreamUrl}>
754
- * <VideoPlayer source={{ type: 'stream', path: '/videos/movie.mp4' }} />
755
- * </VideoPlayerProvider>
756
- *
757
- * @example
758
- * // Blob/ArrayBuffer
759
- * <VideoPlayer source={{ type: 'blob', data: arrayBuffer, mimeType: 'video/mp4' }} />
1116
+ * Automatically shows loading state while Vidstack loads (~150KB)
760
1117
  */
1118
+ declare const LazyVideoPlayer: React$1.ComponentType<VideoPlayerProps>;
761
1119
 
762
- declare const VideoPlayer: React__default.ForwardRefExoticComponent<VideoPlayerProps & {
763
- source: VideoSourceUnion | SimpleStreamSource;
764
- } & React__default.RefAttributes<VideoPlayerRef>>;
765
-
766
- interface VideoControlsProps {
767
- player: React__default.RefObject<MediaPlayerInstance | null>;
768
- className?: string;
769
- }
770
- declare function VideoControls({ player, className }: VideoControlsProps): react_jsx_runtime.JSX.Element;
771
-
772
- interface VideoErrorFallbackProps extends ErrorFallbackProps {
773
- /** URL for download button (if provided, shows download button) */
774
- downloadUrl?: string;
775
- /** Filename for download */
776
- downloadFilename?: string;
777
- /** File size to display */
778
- fileSize?: string;
779
- /** Show retry button */
780
- showRetry?: boolean;
781
- /** Custom className */
1120
+ interface JsonTreeConfig {
1121
+ /** Maximum depth to expand automatically (default: 2) */
1122
+ maxAutoExpandDepth?: number;
1123
+ /** Maximum items in array to auto-expand (default: 10) */
1124
+ maxAutoExpandArrayItems?: number;
1125
+ /** Maximum object keys to auto-expand (default: 5) */
1126
+ maxAutoExpandObjectKeys?: number;
1127
+ /** Maximum string length before truncation (default: 200) */
1128
+ maxStringLength?: number;
1129
+ /** Collection limit for performance (default: 50) */
1130
+ collectionLimit?: number;
1131
+ /** Whether to show collection info (array length, object keys count) */
1132
+ showCollectionInfo?: boolean;
1133
+ /** Whether to show expand/collapse all buttons */
1134
+ showExpandControls?: boolean;
1135
+ /** Whether to show copy/download buttons */
1136
+ showActionButtons?: boolean;
1137
+ /** Custom CSS classes for the container */
782
1138
  className?: string;
783
- /** Custom icon */
784
- icon?: React__default.ReactNode;
785
- /** Custom title (defaults to error message) */
1139
+ /** Whether to preserve object key order (default: true) */
1140
+ preserveKeyOrder?: boolean;
1141
+ }
1142
+ interface JsonTreeComponentProps {
786
1143
  title?: string;
787
- /** Custom description */
788
- description?: string;
1144
+ data: unknown;
1145
+ config?: JsonTreeConfig;
1146
+ /** Override for react-json-tree props */
1147
+ jsonTreeProps?: Partial<CommonExternalProps>;
789
1148
  }
790
- /**
791
- * Pre-built error fallback component for VideoPlayer
792
- *
793
- * @example
794
- * // Basic usage
795
- * <VideoPlayer
796
- * source={source}
797
- * errorFallback={(props) => (
798
- * <VideoErrorFallback
799
- * {...props}
800
- * downloadUrl={getDownloadUrl()}
801
- * downloadFilename="video.mp4"
802
- * />
803
- * )}
804
- * />
805
- *
806
- * @example
807
- * // With file size
808
- * <VideoErrorFallback
809
- * error="Failed to load video"
810
- * downloadUrl="/api/download/video.mp4"
811
- * fileSize="125 MB"
812
- * showRetry
813
- * retry={() => reloadVideo()}
814
- * />
815
- */
816
- declare function VideoErrorFallback({ error, retry, downloadUrl, downloadFilename, fileSize, showRetry, className, icon, title, description, }: VideoErrorFallbackProps): react_jsx_runtime.JSX.Element;
817
- interface CreateVideoErrorFallbackOptions {
818
- /** Function to get download URL from source */
819
- getDownloadUrl?: (source: unknown) => string | undefined;
820
- /** Function to get filename from source */
821
- getFilename?: (source: unknown) => string | undefined;
822
- /** Function to get file size from source */
823
- getFileSize?: (source: unknown) => string | undefined;
824
- /** Show retry button */
825
- showRetry?: boolean;
1149
+ declare const JsonTreeComponent: ({ title, data, config, jsonTreeProps }: JsonTreeComponentProps) => react_jsx_runtime.JSX.Element;
1150
+
1151
+ interface JsonTreeProps {
1152
+ title?: string;
1153
+ data: unknown;
1154
+ config?: JsonTreeConfig;
1155
+ jsonTreeProps?: Partial<CommonExternalProps>;
826
1156
  }
1157
+
827
1158
  /**
828
- * Factory to create error fallback function for VideoPlayer
829
- *
830
- * @example
831
- * const errorFallback = createVideoErrorFallback({
832
- * getDownloadUrl: (source) => source.downloadUrl,
833
- * getFilename: (source) => source.filename,
834
- * showRetry: true,
835
- * });
1159
+ * LazyJsonTree - Lazy-loaded JSON visualization tree
836
1160
  *
837
- * <VideoPlayer source={source} errorFallback={errorFallback} />
1161
+ * Automatically shows loading state while JsonTree loads (~100KB)
838
1162
  */
839
- declare function createVideoErrorFallback(options: CreateVideoErrorFallbackOptions): (props: ErrorFallbackProps, source?: unknown) => React__default.ReactNode;
1163
+ declare const LazyJsonTree: React$1.ComponentType<JsonTreeProps>;
840
1164
 
841
1165
  /**
842
- * VidstackProvider - Full-featured video player using Vidstack
843
- * Supports YouTube, Vimeo, HLS, DASH, and direct URLs
1166
+ * ImageViewer type definitions
844
1167
  */
845
-
846
- declare const VidstackProvider: React__default.ForwardRefExoticComponent<VidstackProviderProps & React__default.RefAttributes<VideoPlayerRef>>;
1168
+ interface ImageFile {
1169
+ /** Display name for the image */
1170
+ name: string;
1171
+ /** File path used for change detection and caching */
1172
+ path: string;
1173
+ /** Optional MIME type */
1174
+ mimeType?: string;
1175
+ }
1176
+ interface ImageViewerProps {
1177
+ /** File info (name, path, mimeType) */
1178
+ file: ImageFile;
1179
+ /** Image content as string (data URL or base64) or ArrayBuffer */
1180
+ content: string | ArrayBuffer;
1181
+ /**
1182
+ * Direct image URL for HTTP streaming.
1183
+ * When provided, bypasses content→blob conversion and uses URL directly.
1184
+ * Useful for large files loaded via HTTP Range requests.
1185
+ */
1186
+ src?: string;
1187
+ /** Hide expand button when already in dialog */
1188
+ inDialog?: boolean;
1189
+ }
847
1190
 
848
1191
  /**
849
- * NativeProvider - Lightweight native HTML5 video player
850
- * For demo videos, background videos, autoplay loop muted scenarios
1192
+ * LazyImageViewer - Lazy-loaded image viewer with zoom/pan/rotate
1193
+ *
1194
+ * Automatically shows loading state while ImageViewer loads (~50KB)
851
1195
  */
852
-
853
- declare const NativeProvider: React__default.ForwardRefExoticComponent<NativeProviderProps & React__default.RefAttributes<VideoPlayerRef>>;
1196
+ declare const LazyImageViewer: React$1.ComponentType<ImageViewerProps>;
854
1197
 
855
1198
  /**
856
- * StreamProvider - HTTP Range streaming and Blob video player
857
- * Supports:
858
- * - HTTP Range requests with authorization (for large files)
859
- * - Blob/ArrayBuffer sources
860
- * - Data URL sources
861
- * - Fill parent container mode
862
- * - Custom error fallback
1199
+ * Mermaid Component - Dynamic Import Wrapper
1200
+ *
1201
+ * Lazy loads the heavy Mermaid library (~800KB) only when needed.
1202
+ * This significantly reduces the initial bundle size.
863
1203
  */
864
1204
 
865
- declare const StreamProvider: React__default.ForwardRefExoticComponent<StreamProviderProps & React__default.RefAttributes<VideoPlayerRef>>;
1205
+ interface MermaidProps {
1206
+ chart: string;
1207
+ className?: string;
1208
+ isCompact?: boolean;
1209
+ }
1210
+ declare const Mermaid: React__default.FC<MermaidProps>;
866
1211
 
867
1212
  /**
868
- * Provider for VideoPlayer streaming configuration
1213
+ * PrettyCode Component - Dynamic Import Wrapper
869
1214
  *
870
- * @example
871
- * // In your app layout or FileWorkspace
872
- * <VideoPlayerProvider
873
- * sessionId={sessionId}
874
- * getStreamUrl={terminalClient.terminal_media.streamStreamRetrieveUrl}
875
- * >
876
- * <VideoPlayer source={{ type: 'stream', path: '/video.mp4' }} />
877
- * </VideoPlayerProvider>
878
- */
879
- declare function VideoPlayerProvider({ children, getStreamUrl, sessionId, }: VideoPlayerProviderProps): react_jsx_runtime.JSX.Element;
880
- /**
881
- * Hook to access VideoPlayer context
1215
+ * Lazy loads the heavy Prism library (~500KB) only when needed.
1216
+ * This significantly reduces the initial bundle size.
882
1217
  */
883
- declare function useVideoPlayerContext(): VideoPlayerContextValue | null;
884
1218
 
885
- /**
886
- * Video source and player mode resolvers
887
- */
1219
+ interface PrettyCodeProps {
1220
+ data: string | object;
1221
+ language: Language;
1222
+ className?: string;
1223
+ mode?: 'dark' | 'light';
1224
+ inline?: boolean;
1225
+ customBg?: string;
1226
+ isCompact?: boolean;
1227
+ }
1228
+ declare const PrettyCode: React__default.FC<PrettyCodeProps>;
888
1229
 
889
1230
  /**
890
- * Determine which provider to use based on source type
891
- */
892
- declare function resolvePlayerMode(source: VideoSourceUnion, mode?: PlayerMode): 'vidstack' | 'native' | 'streaming';
893
- /**
894
- * Check if source is a simplified stream source (without getStreamUrl)
1231
+ * useLottie Hook
1232
+ *
1233
+ * Hook for loading and managing Lottie animation data
895
1234
  */
896
- declare function isSimpleStreamSource(source: VideoSourceUnion | SimpleStreamSource): source is SimpleStreamSource;
1235
+ interface UseLottieOptions {
1236
+ /**
1237
+ * Animation data (JSON object) or URL to load from
1238
+ */
1239
+ src: string | object;
1240
+ /**
1241
+ * Enable caching of loaded animations
1242
+ * @default true
1243
+ */
1244
+ cache?: boolean;
1245
+ }
1246
+ interface UseLottieReturn {
1247
+ /**
1248
+ * Loaded animation data
1249
+ */
1250
+ animationData: object | null;
1251
+ /**
1252
+ * Loading state
1253
+ */
1254
+ isLoading: boolean;
1255
+ /**
1256
+ * Error state
1257
+ */
1258
+ error: Error | null;
1259
+ /**
1260
+ * Retry loading the animation
1261
+ */
1262
+ retry: () => void;
1263
+ }
897
1264
  /**
898
- * Resolve simplified stream source to full stream source using context
1265
+ * Hook for loading Lottie animations from URLs or objects
1266
+ *
1267
+ * Features:
1268
+ * - Loads animations from URLs or accepts animation objects directly
1269
+ * - Caching support to prevent re-fetching the same animation
1270
+ * - Error handling with retry capability
1271
+ * - Loading states
1272
+ *
1273
+ * Usage:
1274
+ * ```tsx
1275
+ * const { animationData, isLoading, error, retry } = useLottie({
1276
+ * src: 'https://example.com/animation.json'
1277
+ * });
1278
+ *
1279
+ * if (isLoading) return <div>Loading...</div>;
1280
+ * if (error) return <div>Error: {error.message} <button onClick={retry}>Retry</button></div>;
1281
+ * if (!animationData) return null;
1282
+ *
1283
+ * return <LottiePlayer animationData={animationData} />;
1284
+ * ```
899
1285
  */
900
- declare function resolveStreamSource(source: SimpleStreamSource, context: VideoPlayerContextValue | null): StreamSource | null;
1286
+ declare function useLottie(options: UseLottieOptions): UseLottieReturn;
901
1287
 
902
1288
  /**
903
- * File source resolution utilities
1289
+ * LottiePlayer component wrapper with dynamic import
1290
+ *
1291
+ * This component automatically handles code splitting and lazy loading
1292
+ * of the Lottie player to optimize bundle size.
1293
+ *
1294
+ * Usage:
1295
+ * ```tsx
1296
+ * import { LottiePlayer } from '@djangocfg/ui-core/tools';
1297
+ *
1298
+ * <LottiePlayer
1299
+ * src="https://example.com/animation.json"
1300
+ * size="md"
1301
+ * autoplay
1302
+ * loop
1303
+ * />
1304
+ * ```
904
1305
  */
1306
+ declare function LottiePlayer(props: LottiePlayerProps): react_jsx_runtime.JSX.Element;
905
1307
 
906
1308
  /**
907
- * Resolve file content to VideoSourceUnion
908
- * Useful for FileWorkspace/file manager integrations
1309
+ * JSON Schema Form Component
1310
+ *
1311
+ * A fully-featured form generator that creates forms from JSON Schema.
1312
+ * Built on top of react-jsonschema-form with custom widgets and templates
1313
+ * using @djangocfg/ui components.
909
1314
  *
910
1315
  * @example
911
- * const source = resolveFileSource({
912
- * content: file.content,
913
- * path: file.path,
914
- * mimeType: file.mimeType,
915
- * sessionId: sessionId,
916
- * loadMethod: file.loadMethod,
917
- * getStreamUrl: terminalClient.terminal_media.streamStreamRetrieveUrl
918
- * });
1316
+ * ```tsx
1317
+ * const schema = {
1318
+ * type: 'object',
1319
+ * required: ['name'],
1320
+ * properties: {
1321
+ * name: { type: 'string', title: 'Name' },
1322
+ * age: { type: 'number', title: 'Age' },
1323
+ * active: { type: 'boolean', title: 'Active' }
1324
+ * }
1325
+ * };
919
1326
  *
920
- * <VideoPlayer source={source} />
1327
+ * <JsonSchemaForm
1328
+ * schema={schema}
1329
+ * onSubmit={(data) => console.log(data.formData)}
1330
+ * />
1331
+ * ```
921
1332
  */
922
- declare function resolveFileSource(options: ResolveFileSourceOptions): VideoSourceUnion | null;
1333
+ declare function JsonSchemaForm<T = any>(props: JsonSchemaFormProps<T>): react_jsx_runtime.JSX.Element;
923
1334
 
924
- interface HybridAudioPlayerProps {
925
- /** Show playback controls */
926
- showControls?: boolean;
927
- /** Show frequency waveform */
928
- showWaveform?: boolean;
929
- /** Waveform visualization mode */
930
- waveformMode?: 'frequency' | 'static';
931
- /** Waveform height in pixels */
932
- waveformHeight?: number;
933
- /** Show time display */
934
- showTimer?: boolean;
935
- /** Show volume control */
936
- showVolume?: boolean;
937
- /** Show loop button */
938
- showLoop?: boolean;
939
- /** Additional CSS class */
940
- className?: string;
941
- /** Inline styles */
942
- style?: React.CSSProperties;
943
- }
944
- declare const HybridAudioPlayer: React$1.NamedExoticComponent<HybridAudioPlayerProps>;
1335
+ /**
1336
+ * Text input widget for JSON Schema Form
1337
+ * Handles string fields with optional textarea for multiline
1338
+ */
1339
+ declare function TextWidget(props: WidgetProps): react_jsx_runtime.JSX.Element;
945
1340
 
946
1341
  /**
947
- * Audio Reactive Effects - Common utilities and types
948
- *
949
- * Provides reusable effect calculations and configurations
1342
+ * Number input widget for JSON Schema Form
1343
+ * Handles integer and number fields
950
1344
  */
951
- type EffectVariant = 'glow' | 'orbs' | 'spotlight' | 'mesh';
952
- type EffectIntensity = 'subtle' | 'medium' | 'strong';
953
- type EffectColorScheme = 'primary' | 'vibrant' | 'cool' | 'warm';
954
- interface AudioLevels {
955
- bass: number;
956
- mid: number;
957
- high: number;
958
- overall: number;
959
- }
960
- interface EffectConfig$1 {
961
- opacity: number;
962
- scale: number;
963
- blur: string;
964
- }
965
- interface EffectColors {
966
- colors: string[];
967
- hueShift: number;
968
- }
969
- interface EffectLayer {
970
- inset: number;
971
- opacity: number;
972
- scale: number;
973
- background: string;
974
- blur: string;
975
- animation?: string;
976
- }
977
- declare const INTENSITY_CONFIG: Record<EffectIntensity, EffectConfig$1>;
978
- declare const COLOR_SCHEMES: Record<EffectColorScheme, string[]>;
1345
+ declare function NumberWidget(props: WidgetProps): react_jsx_runtime.JSX.Element;
1346
+
979
1347
  /**
980
- * Get effect configuration from intensity setting
1348
+ * Checkbox widget for JSON Schema Form
1349
+ * Handles boolean fields
981
1350
  */
982
- declare function getEffectConfig(intensity: EffectIntensity): EffectConfig$1;
1351
+ declare function CheckboxWidget(props: WidgetProps): react_jsx_runtime.JSX.Element;
1352
+
983
1353
  /**
984
- * Get color array from color scheme
1354
+ * Select dropdown widget for JSON Schema Form
1355
+ * Handles enum fields
985
1356
  */
986
- declare function getColors(colorScheme: EffectColorScheme): string[];
1357
+ declare function SelectWidget(props: WidgetProps): react_jsx_runtime.JSX.Element;
1358
+
987
1359
  /**
988
- * Prepare colors with hue shift based on audio levels
1360
+ * Switch toggle widget for JSON Schema Form
1361
+ * Alternative boolean input
989
1362
  */
990
- declare function prepareEffectColors(colorScheme: EffectColorScheme, levels: AudioLevels): EffectColors;
1363
+ declare function SwitchWidget(props: WidgetProps): react_jsx_runtime.JSX.Element;
1364
+
991
1365
  /**
992
- * Calculate glow layer properties
1366
+ * Color input widget for JSON Schema Form
1367
+ * Supports HSL format (h s% l%) and HEX format
1368
+ * Click on color box to open native color picker directly
993
1369
  */
994
- declare function calculateGlowLayers(levels: AudioLevels, config: EffectConfig$1, colors: string[]): EffectLayer[];
1370
+ declare function ColorWidget(props: WidgetProps): react_jsx_runtime.JSX.Element;
1371
+
995
1372
  /**
996
- * Calculate orb positions and properties - highly reactive
1373
+ * Slider widget for JSON Schema Form
1374
+ *
1375
+ * Supports:
1376
+ * - number/integer types
1377
+ * - min/max from schema
1378
+ * - step from schema or options
1379
+ * - unit suffix (e.g., "rem", "px", "%")
1380
+ * - optional text input for precise values
1381
+ *
1382
+ * Usage in uiSchema:
1383
+ * ```json
1384
+ * {
1385
+ * "radius": {
1386
+ * "ui:widget": "slider",
1387
+ * "ui:options": {
1388
+ * "unit": "rem",
1389
+ * "showInput": true,
1390
+ * "step": 0.125
1391
+ * }
1392
+ * }
1393
+ * }
1394
+ * ```
997
1395
  */
998
- declare function calculateOrbs(levels: AudioLevels, config: EffectConfig$1, colors: string[], baseSize?: number): {
999
- x: number;
1000
- y: number;
1001
- size: number;
1002
- color: string;
1003
- opacity: number;
1004
- scale: number;
1005
- }[];
1396
+ declare function SliderWidget(props: WidgetProps): react_jsx_runtime.JSX.Element;
1397
+
1006
1398
  /**
1007
- * Calculate mesh gradient positions - dynamic and reactive
1399
+ * Field template for JSON Schema Form
1400
+ * Controls the layout and styling of individual form fields
1008
1401
  */
1009
- declare function calculateMeshGradients(levels: AudioLevels, config: EffectConfig$1, colors: string[]): ({
1010
- width: string;
1011
- height: string;
1012
- top: string;
1013
- right: string;
1014
- color: string;
1015
- opacity: number;
1016
- scale: number;
1017
- rotation: number;
1018
- blur: string;
1019
- bottom?: undefined;
1020
- left?: undefined;
1021
- isCenter?: undefined;
1022
- } | {
1023
- width: string;
1024
- height: string;
1025
- bottom: string;
1026
- left: string;
1027
- color: string;
1028
- opacity: number;
1029
- scale: number;
1030
- rotation: number;
1031
- blur: string;
1032
- top?: undefined;
1033
- right?: undefined;
1034
- isCenter?: undefined;
1035
- } | {
1036
- width: string;
1037
- height: string;
1038
- top: string;
1039
- left: string;
1040
- color: string;
1041
- opacity: number;
1042
- scale: number;
1043
- rotation: number;
1044
- blur: string;
1045
- right?: undefined;
1046
- bottom?: undefined;
1047
- isCenter?: undefined;
1048
- } | {
1049
- width: string;
1050
- height: string;
1051
- top: string;
1052
- left: string;
1053
- color: string;
1054
- opacity: number;
1055
- scale: number;
1056
- rotation: number;
1057
- isCenter: boolean;
1058
- blur: string;
1059
- right?: undefined;
1060
- bottom?: undefined;
1061
- })[];
1402
+ declare function FieldTemplate(props: FieldTemplateProps): react_jsx_runtime.JSX.Element;
1403
+
1062
1404
  /**
1063
- * Calculate spotlight effect properties - highly reactive
1405
+ * Object field template for JSON Schema Form
1406
+ *
1407
+ * Supports:
1408
+ * - Collapsible groups via ui:collapsible option
1409
+ * - Grid layout via ui:grid option
1410
+ * - Custom styling via ui:className
1411
+ *
1412
+ * Usage in uiSchema:
1413
+ * ```json
1414
+ * {
1415
+ * "colors": {
1416
+ * "ui:collapsible": true,
1417
+ * "ui:collapsed": false,
1418
+ * "ui:grid": 2
1419
+ * }
1420
+ * }
1421
+ * ```
1064
1422
  */
1065
- declare function calculateSpotlight(levels: AudioLevels, config: EffectConfig$1, colors: string[], rotation: number): {
1066
- rotation: number;
1067
- inset: number;
1068
- colors: {
1069
- color: string;
1070
- opacity: number;
1071
- }[];
1072
- pulseInset: number;
1073
- pulseOpacity: number;
1074
- pulseScale: number;
1075
- ringOpacity: number;
1076
- ringScale: number;
1077
- };
1423
+ declare function ObjectFieldTemplate(props: ObjectFieldTemplateProps): react_jsx_runtime.JSX.Element;
1424
+
1078
1425
  /**
1079
- * CSS for effect animations - can be injected once
1426
+ * Array field template for JSON Schema Form
1427
+ * Renders array items with add/remove controls
1428
+ *
1429
+ * NOTE: In RJSF v6, `items` is an array of ReactElement (already rendered),
1430
+ * NOT an array of objects with {children, hasRemove, etc.}.
1431
+ * The actual rendering of each item (including remove buttons) is handled
1432
+ * by ArrayFieldItemTemplate.
1080
1433
  */
1081
- declare 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";
1434
+ declare function ArrayFieldTemplate(props: ArrayFieldTemplateProps): react_jsx_runtime.JSX.Element;
1082
1435
 
1083
- interface UseHybridAudioOptions {
1084
- src: string;
1085
- autoPlay?: boolean;
1086
- initialVolume?: number;
1087
- loop?: boolean;
1088
- crossOrigin?: 'anonymous' | 'use-credentials';
1089
- onPlay?: () => void;
1090
- onPause?: () => void;
1091
- onEnded?: () => void;
1092
- onTimeUpdate?: (time: number) => void;
1093
- onError?: (error: Error) => void;
1094
- onReady?: () => void;
1095
- }
1096
- interface HybridAudioState {
1097
- isReady: boolean;
1098
- isPlaying: boolean;
1099
- currentTime: number;
1100
- duration: number;
1101
- volume: number;
1102
- isMuted: boolean;
1103
- isLooping: boolean;
1104
- buffered: TimeRanges | null;
1105
- error: Error | null;
1106
- }
1107
- interface HybridAudioControls {
1108
- play: () => Promise<void>;
1109
- pause: () => void;
1110
- togglePlay: () => void;
1111
- seek: (time: number) => void;
1112
- seekTo: (progress: number) => void;
1113
- skip: (seconds: number) => void;
1114
- setVolume: (vol: number) => void;
1115
- toggleMute: () => void;
1116
- toggleLoop: () => void;
1117
- setLoop: (enabled: boolean) => void;
1118
- restart: () => void;
1119
- }
1120
- interface HybridWebAudioAPI {
1121
- context: AudioContext | null;
1122
- analyser: AnalyserNode | null;
1123
- sourceNode: MediaElementAudioSourceNode | null;
1124
- }
1125
- interface UseHybridAudioReturn {
1126
- audioRef: React.RefObject<HTMLAudioElement | null>;
1127
- state: HybridAudioState;
1128
- controls: HybridAudioControls;
1129
- webAudio: HybridWebAudioAPI;
1130
- }
1131
- declare function useHybridAudio(options: UseHybridAudioOptions): UseHybridAudioReturn;
1436
+ /**
1437
+ * Array field item template for JSON Schema Form
1438
+ * Renders individual array items with proper styling and action buttons
1439
+ *
1440
+ * In RJSF v6, this template is responsible for rendering each item in an array,
1441
+ * including the item content (children) and the action buttons (remove, move up/down, copy).
1442
+ */
1443
+ declare function ArrayFieldItemTemplate(props: ArrayFieldItemTemplateProps): react_jsx_runtime.JSX.Element;
1132
1444
 
1133
- declare function useHybridAudioAnalysis(analyser: AnalyserNode | null, isPlaying: boolean): AudioLevels;
1445
+ /**
1446
+ * Error list template for JSON Schema Form
1447
+ * Displays validation errors at the top of the form
1448
+ */
1449
+ declare function ErrorListTemplate(props: ErrorListProps): react_jsx_runtime.JSX.Element;
1134
1450
 
1135
- type VisualizationVariant = 'glow' | 'orbs' | 'spotlight' | 'mesh' | 'none';
1136
- type VisualizationIntensity = 'subtle' | 'medium' | 'strong';
1137
- type VisualizationColorScheme = 'primary' | 'vibrant' | 'cool' | 'warm';
1138
- interface VisualizationSettings {
1139
- /** Enable reactive cover animation */
1140
- enabled: boolean;
1141
- /** Visual effect variant */
1142
- variant: VisualizationVariant;
1143
- /** Effect intensity */
1144
- intensity: VisualizationIntensity;
1145
- /** Color scheme */
1146
- colorScheme: VisualizationColorScheme;
1147
- /** Playback volume (0-1) */
1148
- volume: number;
1149
- /** Loop playback */
1150
- isLooping: boolean;
1151
- }
1152
- interface UseVisualizationReturn {
1153
- /** Current settings */
1154
- settings: VisualizationSettings;
1155
- /** Toggle visualization on/off */
1156
- toggle: () => void;
1157
- /** Set specific setting */
1158
- setSetting: <K extends keyof VisualizationSettings>(key: K, value: VisualizationSettings[K]) => void;
1159
- /** Cycle to next variant */
1160
- nextVariant: () => void;
1161
- /** Cycle to next intensity */
1162
- nextIntensity: () => void;
1163
- /** Cycle to next color scheme */
1164
- nextColorScheme: () => void;
1165
- /** Reset to defaults */
1166
- reset: () => void;
1167
- }
1168
- type UseAudioVisualizationReturn = UseVisualizationReturn;
1169
- interface VisualizationProviderProps {
1170
- children: ReactNode;
1451
+ /**
1452
+ * Base input template for JSON Schema Form
1453
+ *
1454
+ * This template is CRITICAL for rendering primitive types (string, number)
1455
+ * inside arrays. Without it, array items with primitive types will render
1456
+ * as empty containers.
1457
+ *
1458
+ * RJSF uses this template for:
1459
+ * - Array items with primitive types (e.g., array of strings)
1460
+ * - Fields without explicit widget mapping
1461
+ * - All text-based widgets internally
1462
+ *
1463
+ * @see https://rjsf-team.github.io/react-jsonschema-form/docs/advanced-customization/custom-templates/#baseinputtemplate
1464
+ */
1465
+ declare function BaseInputTemplate(props: WidgetProps): react_jsx_runtime.JSX.Element;
1466
+
1467
+ /**
1468
+ * Utility functions for JSON Schema Form
1469
+ */
1470
+ /**
1471
+ * Safely validates and normalizes JSON Schema
1472
+ * Ensures schema is valid before rendering
1473
+ */
1474
+ declare function validateSchema(schema: any): RJSFSchema | null;
1475
+ /**
1476
+ * Safely normalizes form data
1477
+ * Removes undefined values and ensures data structure matches schema
1478
+ */
1479
+ declare function normalizeFormData<T = any>(formData: any, schema: RJSFSchema): T;
1480
+ /**
1481
+ * Merges schema defaults with form data
1482
+ */
1483
+ declare function mergeDefaults(formData: any, schema: RJSFSchema): any;
1484
+ /**
1485
+ * Safely parses JSON string with error handling
1486
+ */
1487
+ declare function safeJsonParse<T = any>(jsonString: string, fallback: T): T;
1488
+ /**
1489
+ * Safely stringifies object to JSON
1490
+ */
1491
+ declare function safeJsonStringify(obj: any, pretty?: boolean): string;
1492
+ /**
1493
+ * Checks if schema has required fields
1494
+ */
1495
+ declare function hasRequiredFields(schema: RJSFSchema): boolean;
1496
+ /**
1497
+ * Gets all required field paths from schema
1498
+ */
1499
+ declare function getRequiredFields(schema: RJSFSchema, prefix?: string): string[];
1500
+ /**
1501
+ * Validates form data against required fields
1502
+ */
1503
+ declare function validateRequiredFields(formData: any, schema: RJSFSchema): {
1504
+ valid: boolean;
1505
+ missing: string[];
1506
+ };
1507
+
1508
+ interface PlaygroundProps {
1509
+ config: PlaygroundConfig;
1171
1510
  }
1172
- declare function VisualizationProvider({ children }: VisualizationProviderProps): react_jsx_runtime.JSX.Element;
1173
- declare function useVisualization(): UseVisualizationReturn;
1174
- declare const useAudioVisualization: typeof useVisualization;
1175
- declare const VARIANT_INFO: Record<VisualizationVariant, {
1176
- label: string;
1177
- icon: string;
1178
- }>;
1179
- declare const INTENSITY_INFO: Record<VisualizationIntensity, {
1180
- label: string;
1181
- }>;
1182
- declare const COLOR_SCHEME_INFO: Record<VisualizationColorScheme, {
1183
- label: string;
1184
- preview: string;
1185
- }>;
1511
+ declare const Playground: React__default.FC<PlaygroundProps>;
1186
1512
 
1187
- interface HybridSimplePlayerProps {
1188
- /** Audio source URL */
1189
- src: string;
1190
- /** Track title */
1191
- title?: string;
1192
- /** Artist name */
1193
- artist?: string;
1194
- /** Cover art URL or ReactNode */
1195
- coverArt?: string | ReactNode;
1196
- /** Cover art size */
1197
- coverSize?: 'sm' | 'md' | 'lg';
1198
- /** Show frequency waveform */
1199
- showWaveform?: boolean;
1200
- /** Waveform visualization mode */
1201
- waveformMode?: 'frequency' | 'static';
1202
- /** Waveform height in pixels */
1203
- waveformHeight?: number;
1204
- /** Show timer */
1205
- showTimer?: boolean;
1206
- /** Show volume control */
1207
- showVolume?: boolean;
1208
- /** Show loop/repeat button */
1209
- showLoop?: boolean;
1210
- /** Enable audio-reactive cover effects */
1211
- reactiveCover?: boolean;
1212
- /** Reactive effect variant */
1213
- variant?: VisualizationVariant;
1214
- /** Reactive effect intensity */
1215
- intensity?: EffectIntensity;
1216
- /** Reactive effect color scheme */
1217
- colorScheme?: EffectColorScheme;
1218
- /** Auto-play on load */
1219
- autoPlay?: boolean;
1220
- /** Loop playback */
1221
- loop?: boolean;
1222
- /** Initial volume (0-1) */
1223
- initialVolume?: number;
1224
- /** Layout direction */
1225
- layout?: 'vertical' | 'horizontal';
1226
- /** Additional class name */
1513
+ /**
1514
+ * VideoPlayer - Unified Video Player Component
1515
+ *
1516
+ * Supports multiple modes:
1517
+ * - vidstack: Full-featured player (YouTube, Vimeo, HLS, DASH)
1518
+ * - native: Lightweight HTML5 player
1519
+ * - streaming: HTTP Range streaming with auth / Blob sources
1520
+ *
1521
+ * @example
1522
+ * // YouTube video
1523
+ * <VideoPlayer source={{ type: 'youtube', id: 'dQw4w9WgXcQ' }} />
1524
+ *
1525
+ * @example
1526
+ * // HLS stream
1527
+ * <VideoPlayer source={{ type: 'hls', url: 'https://example.com/video.m3u8' }} />
1528
+ *
1529
+ * @example
1530
+ * // HTTP Range streaming with auth (full source)
1531
+ * <VideoPlayer
1532
+ * source={{
1533
+ * type: 'stream',
1534
+ * sessionId: 'abc123',
1535
+ * path: '/videos/movie.mp4',
1536
+ * getStreamUrl: (id, path) => `/api/stream/${id}?path=${path}&token=${token}`
1537
+ * }}
1538
+ * />
1539
+ *
1540
+ * @example
1541
+ * // HTTP Range streaming (simplified, using VideoPlayerProvider context)
1542
+ * <VideoPlayerProvider sessionId={sessionId} getStreamUrl={getStreamUrl}>
1543
+ * <VideoPlayer source={{ type: 'stream', path: '/videos/movie.mp4' }} />
1544
+ * </VideoPlayerProvider>
1545
+ *
1546
+ * @example
1547
+ * // Blob/ArrayBuffer
1548
+ * <VideoPlayer source={{ type: 'blob', data: arrayBuffer, mimeType: 'video/mp4' }} />
1549
+ */
1550
+
1551
+ declare const VideoPlayer: React__default.ForwardRefExoticComponent<VideoPlayerProps & {
1552
+ source: VideoSourceUnion | SimpleStreamSource;
1553
+ } & React__default.RefAttributes<VideoPlayerRef>>;
1554
+
1555
+ interface VideoControlsProps {
1556
+ player: React__default.RefObject<MediaPlayerInstance | null>;
1227
1557
  className?: string;
1228
- /** Callbacks */
1229
- onPlay?: () => void;
1230
- onPause?: () => void;
1231
- onEnded?: () => void;
1232
- onError?: (error: Error) => void;
1233
1558
  }
1234
- declare function HybridSimplePlayer(props: HybridSimplePlayerProps): react_jsx_runtime.JSX.Element;
1559
+ declare function VideoControls({ player, className }: VideoControlsProps): react_jsx_runtime.JSX.Element;
1235
1560
 
1236
- interface HybridWaveformProps {
1237
- /** Visualization mode */
1238
- mode?: 'frequency' | 'static';
1239
- /** Canvas height in pixels */
1240
- height?: number;
1241
- /** Bar width in pixels */
1242
- barWidth?: number;
1243
- /** Gap between bars in pixels */
1244
- barGap?: number;
1245
- /** Bar border radius */
1246
- barRadius?: number;
1247
- /** Color for played portion */
1248
- progressColor?: string;
1249
- /** Color for unplayed portion */
1250
- waveColor?: string;
1251
- /** Color for buffered regions indicator */
1252
- bufferedColor?: string;
1253
- /** Additional CSS class */
1561
+ interface VideoErrorFallbackProps extends ErrorFallbackProps {
1562
+ /** URL for download button (if provided, shows download button) */
1563
+ downloadUrl?: string;
1564
+ /** Filename for download */
1565
+ downloadFilename?: string;
1566
+ /** File size to display */
1567
+ fileSize?: string;
1568
+ /** Show retry button */
1569
+ showRetry?: boolean;
1570
+ /** Custom className */
1254
1571
  className?: string;
1255
- /** Callback when user seeks */
1256
- onSeek?: (time: number) => void;
1572
+ /** Custom icon */
1573
+ icon?: React__default.ReactNode;
1574
+ /** Custom title (defaults to error message) */
1575
+ title?: string;
1576
+ /** Custom description */
1577
+ description?: string;
1257
1578
  }
1258
- declare const HybridWaveform: React$1.NamedExoticComponent<HybridWaveformProps>;
1579
+ /**
1580
+ * Pre-built error fallback component for VideoPlayer
1581
+ *
1582
+ * @example
1583
+ * // Basic usage
1584
+ * <VideoPlayer
1585
+ * source={source}
1586
+ * errorFallback={(props) => (
1587
+ * <VideoErrorFallback
1588
+ * {...props}
1589
+ * downloadUrl={getDownloadUrl()}
1590
+ * downloadFilename="video.mp4"
1591
+ * />
1592
+ * )}
1593
+ * />
1594
+ *
1595
+ * @example
1596
+ * // With file size
1597
+ * <VideoErrorFallback
1598
+ * error="Failed to load video"
1599
+ * downloadUrl="/api/download/video.mp4"
1600
+ * fileSize="125 MB"
1601
+ * showRetry
1602
+ * retry={() => reloadVideo()}
1603
+ * />
1604
+ */
1605
+ declare function VideoErrorFallback({ error, retry, downloadUrl, downloadFilename, fileSize, showRetry, className, icon, title, description, }: VideoErrorFallbackProps): react_jsx_runtime.JSX.Element;
1606
+ interface CreateVideoErrorFallbackOptions {
1607
+ /** Function to get download URL from source */
1608
+ getDownloadUrl?: (source: unknown) => string | undefined;
1609
+ /** Function to get filename from source */
1610
+ getFilename?: (source: unknown) => string | undefined;
1611
+ /** Function to get file size from source */
1612
+ getFileSize?: (source: unknown) => string | undefined;
1613
+ /** Show retry button */
1614
+ showRetry?: boolean;
1615
+ }
1616
+ /**
1617
+ * Factory to create error fallback function for VideoPlayer
1618
+ *
1619
+ * @example
1620
+ * const errorFallback = createVideoErrorFallback({
1621
+ * getDownloadUrl: (source) => source.downloadUrl,
1622
+ * getFilename: (source) => source.filename,
1623
+ * showRetry: true,
1624
+ * });
1625
+ *
1626
+ * <VideoPlayer source={source} errorFallback={errorFallback} />
1627
+ */
1628
+ declare function createVideoErrorFallback(options: CreateVideoErrorFallbackOptions): (props: ErrorFallbackProps, source?: unknown) => React__default.ReactNode;
1629
+
1630
+ /**
1631
+ * VidstackProvider - Full-featured video player using Vidstack
1632
+ * Supports YouTube, Vimeo, HLS, DASH, and direct URLs
1633
+ */
1634
+
1635
+ declare const VidstackProvider: React__default.ForwardRefExoticComponent<VidstackProviderProps & React__default.RefAttributes<VideoPlayerRef>>;
1636
+
1637
+ /**
1638
+ * NativeProvider - Lightweight native HTML5 video player
1639
+ * For demo videos, background videos, autoplay loop muted scenarios
1640
+ */
1641
+
1642
+ declare const NativeProvider: React__default.ForwardRefExoticComponent<NativeProviderProps & React__default.RefAttributes<VideoPlayerRef>>;
1643
+
1644
+ /**
1645
+ * StreamProvider - HTTP Range streaming and Blob video player
1646
+ * Supports:
1647
+ * - HTTP Range requests with authorization (for large files)
1648
+ * - Blob/ArrayBuffer sources
1649
+ * - Data URL sources
1650
+ * - Fill parent container mode
1651
+ * - Custom error fallback
1652
+ */
1259
1653
 
1260
- interface AudioReactiveCoverProps {
1261
- children: ReactNode;
1262
- size?: 'sm' | 'md' | 'lg';
1263
- variant?: EffectVariant;
1264
- intensity?: EffectIntensity;
1265
- colorScheme?: EffectColorScheme;
1266
- onClick?: () => void;
1267
- className?: string;
1268
- }
1269
- declare function AudioReactiveCover({ children, size, variant, intensity, colorScheme, onClick, className, }: AudioReactiveCoverProps): react_jsx_runtime.JSX.Element;
1654
+ declare const StreamProvider: React__default.ForwardRefExoticComponent<StreamProviderProps & React__default.RefAttributes<VideoPlayerRef>>;
1270
1655
 
1271
- interface GlowEffectData {
1272
- layers: ReturnType<typeof calculateGlowLayers>;
1273
- hueShift: number;
1274
- showPulseRings: boolean;
1275
- showSparkle: boolean;
1276
- }
1277
- interface GlowEffectProps {
1278
- data: GlowEffectData;
1279
- colors: string[];
1280
- isPlaying: boolean;
1281
- }
1282
- declare function GlowEffect({ data, colors, isPlaying }: GlowEffectProps): react_jsx_runtime.JSX.Element;
1656
+ /**
1657
+ * Provider for VideoPlayer streaming configuration
1658
+ *
1659
+ * @example
1660
+ * // In your app layout or FileWorkspace
1661
+ * <VideoPlayerProvider
1662
+ * sessionId={sessionId}
1663
+ * getStreamUrl={terminalClient.terminal_media.streamStreamRetrieveUrl}
1664
+ * >
1665
+ * <VideoPlayer source={{ type: 'stream', path: '/video.mp4' }} />
1666
+ * </VideoPlayerProvider>
1667
+ */
1668
+ declare function VideoPlayerProvider({ children, getStreamUrl, sessionId, }: VideoPlayerProviderProps): react_jsx_runtime.JSX.Element;
1669
+ /**
1670
+ * Hook to access VideoPlayer context
1671
+ */
1672
+ declare function useVideoPlayerContext(): VideoPlayerContextValue | null;
1283
1673
 
1284
- interface OrbsEffectProps {
1285
- orbs: ReturnType<typeof calculateOrbs>;
1286
- blur: string;
1287
- isPlaying: boolean;
1288
- }
1289
- declare function OrbsEffect({ orbs, blur, isPlaying }: OrbsEffectProps): react_jsx_runtime.JSX.Element;
1674
+ /**
1675
+ * Video source and player mode resolvers
1676
+ */
1290
1677
 
1291
- interface SpotlightEffectProps {
1292
- data: ReturnType<typeof calculateSpotlight>;
1293
- colors: string[];
1294
- blur: string;
1295
- isPlaying: boolean;
1296
- }
1297
- declare function SpotlightEffect({ data, colors, blur, isPlaying }: SpotlightEffectProps): react_jsx_runtime.JSX.Element;
1678
+ /**
1679
+ * Determine which provider to use based on source type
1680
+ */
1681
+ declare function resolvePlayerMode(source: VideoSourceUnion, mode?: PlayerMode): 'vidstack' | 'native' | 'streaming';
1682
+ /**
1683
+ * Check if source is a simplified stream source (without getStreamUrl)
1684
+ */
1685
+ declare function isSimpleStreamSource(source: VideoSourceUnion | SimpleStreamSource): source is SimpleStreamSource;
1686
+ /**
1687
+ * Resolve simplified stream source to full stream source using context
1688
+ */
1689
+ declare function resolveStreamSource(source: SimpleStreamSource, context: VideoPlayerContextValue | null): StreamSource | null;
1298
1690
 
1299
- interface MeshEffectProps {
1300
- gradients: ReturnType<typeof calculateMeshGradients>;
1301
- blur: string;
1302
- isPlaying: boolean;
1303
- }
1304
- declare function MeshEffect({ gradients, isPlaying }: MeshEffectProps): react_jsx_runtime.JSX.Element;
1691
+ /**
1692
+ * File source resolution utilities
1693
+ */
1694
+
1695
+ /**
1696
+ * Resolve file content to VideoSourceUnion
1697
+ * Useful for FileWorkspace/file manager integrations
1698
+ *
1699
+ * @example
1700
+ * const source = resolveFileSource({
1701
+ * content: file.content,
1702
+ * path: file.path,
1703
+ * mimeType: file.mimeType,
1704
+ * sessionId: sessionId,
1705
+ * loadMethod: file.loadMethod,
1706
+ * getStreamUrl: terminalClient.terminal_media.streamStreamRetrieveUrl
1707
+ * });
1708
+ *
1709
+ * <VideoPlayer source={source} />
1710
+ */
1711
+ declare function resolveFileSource(options: ResolveFileSourceOptions): VideoSourceUnion | null;
1305
1712
 
1306
1713
  interface HybridAudioContextValue {
1307
1714
  state: HybridAudioState;
@@ -1352,32 +1759,6 @@ interface EqualizerOptions {
1352
1759
  */
1353
1760
  declare function formatTime(seconds: number): string;
1354
1761
 
1355
- /**
1356
- * ImageViewer type definitions
1357
- */
1358
- interface ImageFile {
1359
- /** Display name for the image */
1360
- name: string;
1361
- /** File path used for change detection and caching */
1362
- path: string;
1363
- /** Optional MIME type */
1364
- mimeType?: string;
1365
- }
1366
- interface ImageViewerProps {
1367
- /** File info (name, path, mimeType) */
1368
- file: ImageFile;
1369
- /** Image content as string (data URL or base64) or ArrayBuffer */
1370
- content: string | ArrayBuffer;
1371
- /**
1372
- * Direct image URL for HTTP streaming.
1373
- * When provided, bypasses content→blob conversion and uses URL directly.
1374
- * Useful for large files loaded via HTTP Range requests.
1375
- */
1376
- src?: string;
1377
- /** Hide expand button when already in dialog */
1378
- inDialog?: boolean;
1379
- }
1380
-
1381
1762
  declare function ImageViewer({ file, content, src: directSrc, inDialog }: ImageViewerProps): react_jsx_runtime.JSX.Element;
1382
1763
 
1383
1764
  interface BlobUrlEntry {
@@ -1558,137 +1939,4 @@ declare function useBlobUrlCleanup(key: string | null): void;
1558
1939
  */
1559
1940
  declare function generateContentKey(content: ArrayBuffer): string;
1560
1941
 
1561
- interface MarkdownMessageProps {
1562
- /** Markdown content to render */
1563
- content: string;
1564
- /** Additional CSS classes */
1565
- className?: string;
1566
- /** Whether the message is from the user (affects styling) */
1567
- isUser?: boolean;
1568
- /** Use compact size (text-xs instead of text-sm) */
1569
- isCompact?: boolean;
1570
- /**
1571
- * Enable collapsible "Read more..." functionality
1572
- * When enabled, long content will be truncated with a toggle button
1573
- * @default false
1574
- */
1575
- collapsible?: boolean;
1576
- /**
1577
- * Maximum character length before showing "Read more..."
1578
- * Only applies when collapsible is true
1579
- * If both maxLength and maxLines are set, the stricter limit applies
1580
- */
1581
- maxLength?: number;
1582
- /**
1583
- * Maximum number of lines before showing "Read more..."
1584
- * Only applies when collapsible is true
1585
- * If both maxLength and maxLines are set, the stricter limit applies
1586
- */
1587
- maxLines?: number;
1588
- /**
1589
- * Custom "Read more" button text
1590
- * @default "Read more..."
1591
- */
1592
- readMoreLabel?: string;
1593
- /**
1594
- * Custom "Show less" button text
1595
- * @default "Show less"
1596
- */
1597
- showLessLabel?: string;
1598
- /**
1599
- * Start expanded (only applies when collapsible is true)
1600
- * @default false
1601
- */
1602
- defaultExpanded?: boolean;
1603
- /**
1604
- * Callback when collapsed state changes
1605
- */
1606
- onCollapseChange?: (isCollapsed: boolean) => void;
1607
- }
1608
- /**
1609
- * MarkdownMessage - Renders markdown content with syntax highlighting and GFM support
1610
- *
1611
- * Features:
1612
- * - GitHub Flavored Markdown (GFM) support
1613
- * - Syntax highlighted code blocks with copy button
1614
- * - Mermaid diagram rendering
1615
- * - Tables, lists, blockquotes
1616
- * - User/assistant styling modes
1617
- * - Plain text optimization (skips ReactMarkdown for simple text)
1618
- * - Collapsible "Read more..." for long messages
1619
- *
1620
- * @example
1621
- * ```tsx
1622
- * <MarkdownMessage content="# Hello\n\nThis is **bold** text." />
1623
- *
1624
- * // User message styling
1625
- * <MarkdownMessage content="Some content" isUser />
1626
- *
1627
- * // Collapsible long content (for chat apps)
1628
- * <MarkdownMessage
1629
- * content={longText}
1630
- * collapsible
1631
- * maxLength={300}
1632
- * maxLines={5}
1633
- * />
1634
- * ```
1635
- */
1636
- declare const MarkdownMessage: React__default.FC<MarkdownMessageProps>;
1637
-
1638
- interface UseCollapsibleContentOptions {
1639
- /**
1640
- * Maximum character length before collapsing
1641
- * If both maxLength and maxLines are set, the stricter limit applies
1642
- */
1643
- maxLength?: number;
1644
- /**
1645
- * Maximum number of lines before collapsing
1646
- * If both maxLength and maxLines are set, the stricter limit applies
1647
- */
1648
- maxLines?: number;
1649
- /**
1650
- * Start in expanded state (default: false - starts collapsed)
1651
- */
1652
- defaultExpanded?: boolean;
1653
- }
1654
- interface UseCollapsibleContentResult {
1655
- /** Whether content is currently collapsed */
1656
- isCollapsed: boolean;
1657
- /** Toggle between collapsed/expanded state */
1658
- toggleCollapsed: () => void;
1659
- /** Set collapsed state directly */
1660
- setCollapsed: (collapsed: boolean) => void;
1661
- /** Content to display (truncated if collapsed, full if expanded) */
1662
- displayContent: string;
1663
- /** Whether the content exceeds limits and should be collapsible */
1664
- shouldCollapse: boolean;
1665
- /** Original content length */
1666
- originalLength: number;
1667
- /** Original line count */
1668
- originalLineCount: number;
1669
- }
1670
- /**
1671
- * Hook for managing collapsible content with "Read more..." functionality
1672
- *
1673
- * @example
1674
- * ```tsx
1675
- * const { isCollapsed, toggleCollapsed, displayContent, shouldCollapse } = useCollapsibleContent(
1676
- * longText,
1677
- * { maxLength: 300, maxLines: 5 }
1678
- * );
1679
- *
1680
- * return (
1681
- * <div>
1682
- * <Markdown content={displayContent} />
1683
- * {shouldCollapse && (
1684
- * <button onClick={toggleCollapsed}>
1685
- * {isCollapsed ? 'Read more...' : 'Show less'}
1686
- * </button>
1687
- * )}
1688
- * </div>
1689
- * );
1690
- * ```
1691
- */
1692
- declare function useCollapsibleContent(content: string, options?: UseCollapsibleContentOptions): UseCollapsibleContentResult;
1693
-
1694
- export { ArrayFieldItemTemplate, ArrayFieldTemplate, type AspectRatioValue, type AudioLevels, AudioReactiveCover, type AudioReactiveCoverProps, BaseInputTemplate, type BlobSource, COLOR_SCHEMES, COLOR_SCHEME_INFO, CheckboxWidget, ColorWidget, type CreateVideoErrorFallbackOptions, type DASHSource, type DataUrlSource, EFFECT_ANIMATIONS, type EffectColorScheme, type EffectColors, type EffectConfig$1 as EffectConfig, type EffectIntensity, type EffectLayer, type EffectVariant, type EqualizerOptions, type ErrorFallbackProps, ErrorListTemplate, FieldTemplate, GlowEffect, type GlowEffectData, type HLSSource, type HybridAudioContextValue, type HybridAudioControls, HybridAudioPlayer, type HybridAudioPlayerProps, HybridAudioProvider, type HybridAudioProviderProps, type HybridAudioState, HybridSimplePlayer, type HybridSimplePlayerProps, HybridWaveform, type HybridWaveformProps, type HybridWebAudioAPI, INTENSITY_CONFIG, INTENSITY_INFO, type ImageFile, ImageViewer, type ImageViewerProps, JsonSchemaForm, type JsonSchemaFormProps, JsonTreeComponent as JsonTree, type JsonTreeConfig, type LottieDirection, LottiePlayer, type LottiePlayerProps, type LottieSize, type LottieSpeed, MarkdownMessage, type MarkdownMessageProps, Mermaid, MeshEffect, NativeProvider, NumberWidget, ObjectFieldTemplate, Playground as OpenapiViewer, OrbsEffect, type PlayerMode, type PlaygroundConfig, type PlaygroundProps, PrettyCode, type ResolveFileSourceOptions, type SchemaSource, SelectWidget, type SimpleStreamSource, SliderWidget, SpotlightEffect, StreamProvider, type StreamSource, SwitchWidget, TextWidget, type UrlSource, type UseAudioVisualizationReturn, type UseCollapsibleContentOptions, type UseCollapsibleContentResult, type UseHybridAudioOptions, type UseHybridAudioReturn, type UseLottieOptions, type UseLottieReturn, type UseVisualizationReturn, VARIANT_INFO, VideoControls, VideoErrorFallback, type VideoErrorFallbackProps, VideoPlayer, type VideoPlayerContextValue, type VideoPlayerProps, VideoPlayerProvider, type VideoPlayerProviderProps, type VideoPlayerRef, type VideoSourceUnion, VidstackProvider, type VimeoSource, type VisualizationColorScheme, type VisualizationIntensity, VisualizationProvider, type VisualizationProviderProps, type VisualizationSettings, type VisualizationVariant, type YouTubeSource, calculateGlowLayers, calculateMeshGradients, calculateOrbs, calculateSpotlight, createVideoErrorFallback, formatTime, generateContentKey, getColors, getEffectConfig, getRequiredFields, hasRequiredFields, isSimpleStreamSource, mergeDefaults, normalizeFormData, prepareEffectColors, resolveFileSource, resolvePlayerMode, resolveStreamSource, safeJsonParse, safeJsonStringify, useAudioCache, useAudioVisualization, useBlobUrlCleanup, useCollapsibleContent, useHybridAudio, useHybridAudioAnalysis, useHybridAudioContext, useHybridAudioControls, useHybridAudioLevels, useHybridAudioState, useHybridWebAudio, useImageCache, useLottie, useMediaCacheStore, useVideoCache, useVideoPlayerContext, useVideoPlayerSettings, useVisualization, validateRequiredFields, validateSchema };
1942
+ export { ArrayFieldItemTemplate, ArrayFieldTemplate, type AspectRatioValue, type AudioLevels, AudioReactiveCover, type AudioReactiveCoverProps, BaseInputTemplate, type BlobSource, COLOR_SCHEMES, COLOR_SCHEME_INFO, CardLoadingFallback, CheckboxWidget, ColorWidget, type CreateLazyComponentOptions, type CreateVideoErrorFallbackOptions, type DASHSource, type DataUrlSource, EFFECT_ANIMATIONS, type EffectColorScheme, type EffectColors, type EffectConfig$1 as EffectConfig, type EffectIntensity, type EffectLayer, type EffectVariant, type EqualizerOptions, type ErrorFallbackProps, ErrorListTemplate, FieldTemplate, GlowEffect, type GlowEffectData, type HLSSource, type HybridAudioContextValue, type HybridAudioControls, HybridAudioPlayer, type HybridAudioPlayerProps, HybridAudioProvider, type HybridAudioProviderProps, type HybridAudioState, HybridSimplePlayer, type HybridSimplePlayerProps, HybridWaveform, type HybridWaveformProps, type HybridWebAudioAPI, INTENSITY_CONFIG, INTENSITY_INFO, type ImageFile, ImageViewer, type ImageViewerProps, JsonSchemaForm, type JsonSchemaFormProps, JsonTreeComponent as JsonTree, type JsonTreeConfig, type JsonTreeProps, LazyHybridAudioPlayer, LazyHybridSimplePlayer, LazyImageViewer, LazyJsonSchemaForm, LazyJsonTree, LazyLottiePlayer, LazyMapContainer, LazyMapView, LazyMermaid, LazyOpenapiViewer, LazyPrettyCode, LazyVideoPlayer, LazyWrapper, type LazyWrapperProps, LoadingFallback, type LoadingFallbackProps, type LottieDirection, LottiePlayer, type LottiePlayerProps, type LottieSize, type LottieSpeed, type MapContainerProps, MapLoadingFallback, type MapStyleKey, type MapViewport, MarkdownMessage, type MarkdownMessageProps, type MarkerData, Mermaid, type MermaidProps$1 as MermaidProps, MeshEffect, NativeProvider, NumberWidget, ObjectFieldTemplate, Playground as OpenapiViewer, OrbsEffect, type PlayerMode, type PlaygroundConfig, type PlaygroundProps$1 as PlaygroundProps, PrettyCode, type PrettyCodeProps$1 as PrettyCodeProps, type ResolveFileSourceOptions, type SchemaSource, SelectWidget, type SimpleStreamSource, SliderWidget, Spinner, SpotlightEffect, StreamProvider, type StreamSource, SwitchWidget, TextWidget, type UrlSource, type UseAudioVisualizationReturn, type UseCollapsibleContentOptions, type UseCollapsibleContentResult, type UseHybridAudioOptions, type UseHybridAudioReturn, type UseLottieOptions, type UseLottieReturn, type UseVisualizationReturn, VARIANT_INFO, VideoControls, VideoErrorFallback, type VideoErrorFallbackProps, VideoPlayer, type VideoPlayerContextValue, type VideoPlayerProps, VideoPlayerProvider, type VideoPlayerProviderProps, type VideoPlayerRef, type VideoSourceUnion, VidstackProvider, type VimeoSource, type VisualizationColorScheme, type VisualizationIntensity, VisualizationProvider, type VisualizationProviderProps, type VisualizationSettings, type VisualizationVariant, type YouTubeSource, calculateGlowLayers, calculateMeshGradients, calculateOrbs, calculateSpotlight, createLazyComponent, createVideoErrorFallback, formatTime, generateContentKey, getColors, getEffectConfig, getRequiredFields, hasRequiredFields, isSimpleStreamSource, mergeDefaults, normalizeFormData, prepareEffectColors, resolveFileSource, resolvePlayerMode, resolveStreamSource, safeJsonParse, safeJsonStringify, useAudioCache, useAudioVisualization, useBlobUrlCleanup, useCollapsibleContent, useHybridAudio, useHybridAudioAnalysis, useHybridAudioContext, useHybridAudioControls, useHybridAudioLevels, useHybridAudioState, useHybridWebAudio, useImageCache, useLottie, useMediaCacheStore, useVideoCache, useVideoPlayerContext, useVideoPlayerSettings, useVisualization, validateRequiredFields, validateSchema };