@djangocfg/ui-tools 2.1.381 → 2.1.383
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +132 -899
- package/dist/ChatRoot-6IZFM5HM.mjs +5 -0
- package/dist/{ChatRoot-EJC5Y2YM.cjs.map → ChatRoot-6IZFM5HM.mjs.map} +1 -1
- package/dist/ChatRoot-LW4XNIKP.cjs +14 -0
- package/dist/{ChatRoot-QOSKJPM6.mjs.map → ChatRoot-LW4XNIKP.cjs.map} +1 -1
- package/dist/DictationField-U25MEYAL.mjs +4 -0
- package/dist/DictationField-U25MEYAL.mjs.map +1 -0
- package/dist/DictationField-XWR5VOID.cjs +13 -0
- package/dist/DictationField-XWR5VOID.cjs.map +1 -0
- package/dist/{DocsLayout-2YKPXZYO.mjs → DocsLayout-2P3ONDWJ.mjs} +3 -3
- package/dist/{DocsLayout-2YKPXZYO.mjs.map → DocsLayout-2P3ONDWJ.mjs.map} +1 -1
- package/dist/{DocsLayout-Q4KS3QWW.cjs → DocsLayout-2YZNS5VK.cjs} +8 -8
- package/dist/{DocsLayout-Q4KS3QWW.cjs.map → DocsLayout-2YZNS5VK.cjs.map} +1 -1
- package/dist/chunk-4PFW7MIJ.cjs +837 -0
- package/dist/chunk-4PFW7MIJ.cjs.map +1 -0
- package/dist/chunk-C2YN6WEO.mjs +833 -0
- package/dist/chunk-C2YN6WEO.mjs.map +1 -0
- package/dist/{chunk-XACCHZH2.cjs → chunk-FIRK5CEH.cjs} +42 -4
- package/dist/chunk-FIRK5CEH.cjs.map +1 -0
- package/dist/{chunk-NWUT327A.mjs → chunk-HIK6BPL7.mjs} +38 -5
- package/dist/chunk-HIK6BPL7.mjs.map +1 -0
- package/dist/chunk-OZAU3QWD.cjs +2493 -0
- package/dist/chunk-OZAU3QWD.cjs.map +1 -0
- package/dist/chunk-UWVP6LCW.mjs +2447 -0
- package/dist/chunk-UWVP6LCW.mjs.map +1 -0
- package/dist/index.cjs +1668 -99
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1215 -107
- package/dist/index.d.ts +1215 -107
- package/dist/index.mjs +1555 -50
- package/dist/index.mjs.map +1 -1
- package/package.json +16 -15
- package/src/audio-assets.d.ts +8 -0
- package/src/components/markdown/MarkdownMessage/CollapseToggle.tsx +3 -1
- package/src/components/markdown/MarkdownMessage/components.tsx +2 -5
- package/src/tools/Chat/README.md +347 -530
- package/src/tools/Chat/components/Attachments.tsx +6 -1
- package/src/tools/Chat/components/ChatRoot.tsx +30 -2
- package/src/tools/Chat/components/Composer.tsx +20 -3
- package/src/tools/Chat/components/ErrorBanner.tsx +7 -3
- package/src/tools/Chat/components/MessageActions.tsx +3 -1
- package/src/tools/Chat/components/MessageBubble.tsx +6 -5
- package/src/tools/Chat/components/MessageList.tsx +87 -1
- package/src/tools/Chat/components/ToolCalls.tsx +21 -3
- package/src/tools/Chat/context/ChatProvider.tsx +21 -3
- package/src/tools/Chat/core/audio/audioBus.ts +10 -163
- package/src/tools/Chat/core/audio/defaults.ts +43 -0
- package/src/tools/Chat/core/audio/index.ts +1 -0
- package/src/tools/Chat/core/audio/preferences.ts +5 -59
- package/src/tools/Chat/core/audio/sounds/error.mp3 +0 -0
- package/src/tools/Chat/core/audio/sounds/mention.mp3 +0 -0
- package/src/tools/Chat/core/audio/sounds/notification.mp3 +0 -0
- package/src/tools/Chat/core/audio/sounds/received.mp3 +0 -0
- package/src/tools/Chat/core/audio/sounds/sent.mp3 +0 -0
- package/src/tools/Chat/core/audio/sounds/start.mp3 +0 -0
- package/src/tools/Chat/core/audio/types.ts +28 -0
- package/src/tools/Chat/core/reducer.ts +33 -0
- package/src/tools/Chat/core/transport/index.ts +13 -0
- package/src/tools/Chat/core/transport/mappers/index.ts +6 -0
- package/src/tools/Chat/core/transport/mappers/pydantic-ai.ts +142 -0
- package/src/tools/Chat/core/transport/pydantic-ai-transport.ts +208 -0
- package/src/tools/Chat/core/transport/sse.ts +18 -5
- package/src/tools/Chat/hooks/index.ts +25 -0
- package/src/tools/Chat/hooks/useAutoFocusOnStreamEnd.ts +5 -3
- package/src/tools/Chat/hooks/useChat.ts +28 -0
- package/src/tools/Chat/hooks/useChatAudio.ts +59 -180
- package/src/tools/Chat/hooks/useChatDockPrefs.ts +74 -0
- package/src/tools/Chat/hooks/useChatReset.ts +70 -0
- package/src/tools/Chat/hooks/useChatUnread.ts +87 -0
- package/src/tools/Chat/hooks/useFocusOnEmptyClick.ts +111 -0
- package/src/tools/Chat/hooks/useVisitorFingerprint.ts +48 -0
- package/src/tools/Chat/index.ts +84 -1
- package/src/tools/Chat/launcher/ChatDock.tsx +263 -0
- package/src/tools/Chat/launcher/ChatFAB.tsx +349 -0
- package/src/tools/Chat/launcher/ChatGreeting.tsx +200 -0
- package/src/tools/Chat/launcher/ChatHeader.tsx +76 -0
- package/src/tools/Chat/launcher/ChatHeaderActionButton.tsx +87 -0
- package/src/tools/Chat/launcher/ChatHeaderAudioToggle.tsx +47 -0
- package/src/tools/Chat/launcher/ChatHeaderLanguageButton.tsx +179 -0
- package/src/tools/Chat/launcher/ChatHeaderModeToggle.tsx +57 -0
- package/src/tools/Chat/launcher/ChatHeaderResetButton.tsx +93 -0
- package/src/tools/Chat/launcher/ChatLauncher.tsx +321 -0
- package/src/tools/Chat/launcher/ChatUnreadPreview.tsx +197 -0
- package/src/tools/Chat/launcher/index.ts +46 -0
- package/src/tools/Chat/launcher/useChatPresence.ts +44 -0
- package/src/tools/Chat/styles/bubbleTokens.ts +71 -0
- package/src/tools/Chat/styles/index.ts +16 -0
- package/src/tools/Chat/styles/useChatStyles.ts +101 -0
- package/src/tools/Chat/types/attachment.ts +25 -0
- package/src/tools/Chat/types/config.ts +48 -0
- package/src/tools/Chat/types/events.ts +35 -0
- package/src/tools/Chat/types/index.ts +34 -0
- package/src/tools/Chat/types/labels.ts +38 -0
- package/src/tools/Chat/types/message.ts +32 -0
- package/src/tools/Chat/types/persona.ts +31 -0
- package/src/tools/Chat/types/session.ts +43 -0
- package/src/tools/Chat/types/tool-call.ts +17 -0
- package/src/tools/Chat/types/transport.ts +28 -0
- package/src/tools/Chat/types.ts +5 -240
- package/src/tools/MarkdownEditor/MarkdownEditor.tsx +50 -14
- package/src/tools/MarkdownEditor/index.ts +1 -1
- package/src/tools/SpeechRecognition/README.md +336 -0
- package/src/tools/SpeechRecognition/__tests__/ids.test.ts +15 -0
- package/src/tools/SpeechRecognition/__tests__/language.test.ts +59 -0
- package/src/tools/SpeechRecognition/__tests__/reducer.test.ts +71 -0
- package/src/tools/SpeechRecognition/__tests__/transcript.test.ts +52 -0
- package/src/tools/SpeechRecognition/components/DevicePicker.tsx +49 -0
- package/src/tools/SpeechRecognition/components/DictationButton.tsx +93 -0
- package/src/tools/SpeechRecognition/components/EngineBadge.tsx +30 -0
- package/src/tools/SpeechRecognition/components/ErrorBanner.tsx +52 -0
- package/src/tools/SpeechRecognition/components/LanguagePicker.tsx +63 -0
- package/src/tools/SpeechRecognition/components/MicMeter.tsx +63 -0
- package/src/tools/SpeechRecognition/components/PushToTalkHint.tsx +51 -0
- package/src/tools/SpeechRecognition/components/TranscriptView.tsx +55 -0
- package/src/tools/SpeechRecognition/components/index.ts +16 -0
- package/src/tools/SpeechRecognition/context/SpeechRecognitionProvider.tsx +47 -0
- package/src/tools/SpeechRecognition/context/index.ts +6 -0
- package/src/tools/SpeechRecognition/core/audio/defaults.ts +24 -0
- package/src/tools/SpeechRecognition/core/engine/external.ts +222 -0
- package/src/tools/SpeechRecognition/core/engine/http.ts +147 -0
- package/src/tools/SpeechRecognition/core/engine/index.ts +52 -0
- package/src/tools/SpeechRecognition/core/engine/mediarecorder.ts +105 -0
- package/src/tools/SpeechRecognition/core/engine/websocket.ts +211 -0
- package/src/tools/SpeechRecognition/core/engine/webspeech.ts +188 -0
- package/src/tools/SpeechRecognition/core/ids.ts +11 -0
- package/src/tools/SpeechRecognition/core/index.ts +14 -0
- package/src/tools/SpeechRecognition/core/language.ts +78 -0
- package/src/tools/SpeechRecognition/core/languages-catalog.ts +229 -0
- package/src/tools/SpeechRecognition/core/logger.ts +3 -0
- package/src/tools/SpeechRecognition/core/reducer.ts +105 -0
- package/src/tools/SpeechRecognition/core/transcript.ts +36 -0
- package/src/tools/SpeechRecognition/hooks/index.ts +14 -0
- package/src/tools/SpeechRecognition/hooks/useDictation.ts +59 -0
- package/src/tools/SpeechRecognition/hooks/useEnginePrefs.ts +15 -0
- package/src/tools/SpeechRecognition/hooks/useMicDevices.ts +57 -0
- package/src/tools/SpeechRecognition/hooks/useMicLevel.ts +52 -0
- package/src/tools/SpeechRecognition/hooks/usePushToTalk.ts +85 -0
- package/src/tools/SpeechRecognition/hooks/useResolvedLanguage.ts +28 -0
- package/src/tools/SpeechRecognition/hooks/useSpeechLanguageInfo.ts +108 -0
- package/src/tools/SpeechRecognition/hooks/useSpeechRecognition.ts +188 -0
- package/src/tools/SpeechRecognition/hooks/useVoiceSupport.ts +78 -0
- package/src/tools/SpeechRecognition/index.ts +82 -0
- package/src/tools/SpeechRecognition/lazy.tsx +19 -0
- package/src/tools/SpeechRecognition/store/index.ts +2 -0
- package/src/tools/SpeechRecognition/store/prefsStore.ts +54 -0
- package/src/tools/SpeechRecognition/types.ts +133 -0
- package/src/tools/SpeechRecognition/widgets/DictationField.tsx +105 -0
- package/src/tools/SpeechRecognition/widgets/VoiceComposerSlot.tsx +305 -0
- package/src/tools/SpeechRecognition/widgets/VoiceMessageRecorder.tsx +88 -0
- package/src/tools/SpeechRecognition/widgets/index.ts +6 -0
- package/dist/ChatRoot-EJC5Y2YM.cjs +0 -14
- package/dist/ChatRoot-QOSKJPM6.mjs +0 -5
- package/dist/chunk-NWUT327A.mjs.map +0 -1
- package/dist/chunk-QLMKCSR6.mjs +0 -2420
- package/dist/chunk-QLMKCSR6.mjs.map +0 -1
- package/dist/chunk-SI5RD2GD.cjs +0 -2460
- package/dist/chunk-SI5RD2GD.cjs.map +0 -1
- package/dist/chunk-XACCHZH2.cjs.map +0 -1
- package/src/components/markdown/MarkdownMessage/MarkdownMessage.story.tsx +0 -771
- package/src/stories/index.ts +0 -33
- package/src/tools/AudioPlayer/AudioPlayer.story.tsx +0 -481
- package/src/tools/Chat/Chat.story.tsx +0 -1457
- package/src/tools/CodeEditor/CodeEditor.story.tsx +0 -202
- package/src/tools/CronScheduler/CronScheduler.story.tsx +0 -300
- package/src/tools/Gallery/Gallery.story.tsx +0 -237
- package/src/tools/ImageViewer/ImageViewer.story.tsx +0 -85
- package/src/tools/JsonForm/JsonForm.story.tsx +0 -350
- package/src/tools/JsonTree/JsonTree.story.tsx +0 -141
- package/src/tools/LottiePlayer/LottiePlayer.story.tsx +0 -95
- package/src/tools/Map/Map.story.tsx +0 -458
- package/src/tools/MarkdownEditor/MarkdownEditor.story.tsx +0 -225
- package/src/tools/Mermaid/Mermaid.story.tsx +0 -251
- package/src/tools/OpenapiViewer/OpenapiViewer.story.tsx +0 -230
- package/src/tools/PrettyCode/PrettyCode.story.tsx +0 -304
- package/src/tools/Tour/Tour.story.tsx +0 -279
- package/src/tools/Tree/Tree.story.tsx +0 -620
- package/src/tools/Uploader/Uploader.story.tsx +0 -415
- package/src/tools/VideoPlayer/VideoPlayer.story.tsx +0 -87
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/lazy-wrapper.tsx","../src/tools/Map/lazy.tsx","../src/tools/Mermaid/lazy.tsx","../src/tools/PrettyCode/lazy.tsx","../src/tools/OpenapiViewer/lazy.tsx","../src/tools/JsonForm/lazy.tsx","../src/tools/LottiePlayer/lazy.tsx","../src/tools/AudioPlayer/lazy.tsx","../src/tools/VideoPlayer/lazy.tsx","../src/tools/JsonTree/lazy.tsx","../src/tools/ImageViewer/lazy.tsx","../src/tools/CronScheduler/lazy.tsx","../src/tools/Tree/lazy.tsx","../src/tools/Chat/lazy.tsx","../src/tools/Chat/core/transport/types.ts","../src/tools/Chat/core/transport/sse.ts","../src/tools/Chat/core/transport/http.ts","../src/tools/Chat/core/transport/mock.ts","../src/tools/Chat/hooks/useChatScroll.ts","../src/tools/Chat/hooks/useChatHistory.ts","../src/tools/Chat/hooks/useChatLightbox.ts","../src/tools/Chat/hooks/useAutoFocusOnStreamEnd.ts","../src/tools/Chat/core/payload-dispatch.ts","../src/tools/Chat/utils/collectImageAttachments.ts","../src/tools/Chat/components/AudioToggle.tsx","../src/tools/LottiePlayer/index.tsx","../src/tools/OpenapiViewer/index.tsx","../src/tools/CronScheduler/index.tsx","../src/tools/CodeEditor/workers/setup.ts","../src/tools/CodeEditor/hooks/useMonaco.ts","../src/tools/CodeEditor/hooks/useEditorTheme.ts","../src/tools/CodeEditor/components/Editor.tsx","../src/tools/CodeEditor/components/DiffEditor.tsx","../src/tools/CodeEditor/lib/languages.ts","../src/tools/CodeEditor/context/EditorProvider.tsx","../src/tools/CodeEditor/hooks/useEditor.ts","../src/tools/CodeEditor/hooks/useLanguage.ts","../src/tools/MarkdownEditor/MentionList.tsx","../src/tools/MarkdownEditor/createMentionSuggestion.ts","../src/tools/MarkdownEditor/mentionPresets.ts","../src/tools/MarkdownEditor/submitOnEnter.ts","../src/tools/MarkdownEditor/MarkdownEditor.tsx"],"names":["useAppT","jsx","cn","__name","jsxs","Suspense","React","PlaygroundProvider","__publicField","LIMITS","createId","useState","useRef","useCallback","useEffect","useChatContextOptional","useChatAudioPrefs","VolumeX","Volume2","Button","lazy","LoadingFallback","useResolvedTheme","s","forwardRef","Editor","useImperativeHandle","createContext","useContext","useMemo","computePosition","offset","flip","shift","ReactRenderer","autoUpdate","Extension","StarterKit","Placeholder","Markdown","Mention","useEditor","editor","EditorContent","Bold","Italic","Strikethrough","Code","Heading1","Heading2","Heading3","List","ListOrdered","Quote","Minus"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Suspense, type ReactNode, type ComponentType } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { useAppT } from '@djangocfg/i18n';\n\n// ============================================================================\n// Loading Fallback Components\n// ============================================================================\n\nexport interface LoadingFallbackProps {\n /** Minimum height of the loading container */\n minHeight?: string | number;\n /** Show loading text */\n showText?: boolean;\n /** Custom loading text */\n text?: string;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Spinner - Simple spinning loader\n */\nexport function Spinner({ className }: { className?: string }) {\n const t = useAppT();\n const loadingLabel = t('ui.states.loading');\n\n return (\n <div\n className={cn(\n 'inline-block h-8 w-8 animate-spin rounded-full',\n 'border-4 border-solid border-current border-r-transparent',\n 'align-[-0.125em] motion-reduce:animate-[spin_1.5s_linear_infinite]',\n className\n )}\n role=\"status\"\n aria-label={loadingLabel}\n />\n );\n}\n\n/**\n * LoadingFallback - Default loading state for lazy components\n */\nexport function LoadingFallback({\n minHeight = 200,\n showText = true,\n text,\n className,\n}: LoadingFallbackProps) {\n const t = useAppT();\n const loadingText = text ?? t('ui.form.loading');\n const height = typeof minHeight === 'number' ? `${minHeight}px` : minHeight;\n\n return (\n <div\n className={cn(\n 'flex items-center justify-center bg-muted/30 rounded-lg',\n className\n )}\n style={{ minHeight: height }}\n >\n <div className=\"text-center\">\n <Spinner className=\"text-primary\" />\n {showText && (\n <p className=\"mt-3 text-sm text-muted-foreground\">{loadingText}</p>\n )}\n </div>\n </div>\n );\n}\n\n/**\n * CardLoadingFallback - Loading state styled as a card\n */\nexport function CardLoadingFallback({\n title,\n description,\n minHeight = 200,\n className,\n}: {\n title?: string;\n description?: string;\n minHeight?: string | number;\n className?: string;\n}) {\n const t = useAppT();\n const cardTitle = title ?? t('ui.states.loading');\n const height = typeof minHeight === 'number' ? `${minHeight}px` : minHeight;\n\n return (\n <div\n className={cn(\n 'relative bg-card rounded-lg border border-border overflow-hidden',\n className\n )}\n >\n <div className=\"p-4 border-b border-border bg-muted/50\">\n <h6 className=\"text-sm font-semibold text-foreground\">{cardTitle}</h6>\n {description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{description}</p>\n )}\n </div>\n <div className=\"p-4\">\n <div\n className=\"flex justify-center items-center\"\n style={{ minHeight: height }}\n >\n <Spinner className=\"text-primary\" />\n </div>\n </div>\n </div>\n );\n}\n\n/**\n * MapLoadingFallback - Loading state for map components\n */\nexport function MapLoadingFallback({\n minHeight = 400,\n className,\n}: {\n minHeight?: string | number;\n className?: string;\n}) {\n const t = useAppT();\n const loadingText = t('ui.form.loading');\n const height = typeof minHeight === 'number' ? `${minHeight}px` : minHeight;\n\n return (\n <div\n className={cn(\n 'relative bg-muted/50 rounded-lg overflow-hidden',\n 'flex items-center justify-center',\n className\n )}\n style={{ minHeight: height }}\n >\n <div className=\"text-center\">\n <div className=\"relative\">\n <Spinner className=\"text-primary h-10 w-10\" />\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <svg\n className=\"h-5 w-5 text-muted-foreground\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n </div>\n </div>\n <p className=\"mt-3 text-sm text-muted-foreground\">{loadingText}</p>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Wrapper\n// ============================================================================\n\nexport interface LazyWrapperProps {\n children: ReactNode;\n /** Custom fallback component */\n fallback?: ReactNode;\n /** Use card-style fallback */\n card?: boolean;\n /** Card title (when card=true) */\n cardTitle?: string;\n /** Card description (when card=true) */\n cardDescription?: string;\n /** Minimum height for fallback */\n minHeight?: string | number;\n /** Additional CSS classes for fallback */\n className?: string;\n}\n\n/**\n * LazyWrapper - Suspense wrapper with configurable fallbacks\n *\n * @example\n * // Basic usage\n * <LazyWrapper>\n * <LazyComponent />\n * </LazyWrapper>\n *\n * @example\n * // Card style fallback\n * <LazyWrapper card cardTitle=\"Diagram\" minHeight={300}>\n * <Mermaid chart={...} />\n * </LazyWrapper>\n *\n * @example\n * // Custom fallback\n * <LazyWrapper fallback={<MyCustomLoader />}>\n * <HeavyComponent />\n * </LazyWrapper>\n */\nexport function LazyWrapper({\n children,\n fallback,\n card = false,\n cardTitle,\n cardDescription,\n minHeight = 200,\n className,\n}: LazyWrapperProps) {\n const defaultFallback = card ? (\n <CardLoadingFallback\n title={cardTitle}\n description={cardDescription}\n minHeight={minHeight}\n className={className}\n />\n ) : (\n <LoadingFallback minHeight={minHeight} className={className} />\n );\n\n return <Suspense fallback={fallback ?? defaultFallback}>{children}</Suspense>;\n}\n\n// ============================================================================\n// Lazy Component Factory\n// ============================================================================\n\nexport interface CreateLazyComponentOptions<P> {\n /** Loading fallback component */\n fallback?: ReactNode | ((props: P) => ReactNode);\n /** Display name for the component */\n displayName?: string;\n}\n\n/**\n * createLazyComponent - Factory for creating lazy-loaded components\n *\n * @example\n * const LazyMermaid = createLazyComponent(\n * () => import('./Mermaid.client'),\n * {\n * displayName: 'Mermaid',\n * fallback: <CardLoadingFallback title=\"Diagram\" />,\n * }\n * );\n */\nexport function createLazyComponent<P extends object>(\n loader: () => Promise<{ default: ComponentType<P> }>,\n options: CreateLazyComponentOptions<P> = {}\n): ComponentType<P> {\n const LazyComponent = React.lazy(loader);\n\n const WrappedComponent = (props: P) => {\n const fallback =\n typeof options.fallback === 'function'\n ? options.fallback(props)\n : options.fallback ?? <LoadingFallback />;\n\n return (\n <Suspense fallback={fallback}>\n <LazyComponent {...props} />\n </Suspense>\n );\n };\n\n WrappedComponent.displayName = options.displayName ?? 'LazyComponent';\n\n return WrappedComponent;\n}\n","'use client';\n\n/**\n * Lazy-loaded Map Components\n *\n * Heavy MapLibre GL (~800KB) is loaded only when components are rendered.\n * Use these for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { MapContainer } from '@djangocfg/ui-tools/map'\n */\n\nimport * as React from 'react';\nimport { createLazyComponent, MapLoadingFallback } from '../../components';\n\n// ============================================================================\n// Lazy Components\n// ============================================================================\n\n/**\n * LazyMapContainer - Lazy-loaded map container\n *\n * Automatically shows loading state while MapLibre GL loads (~800KB)\n */\nexport const LazyMapContainer = createLazyComponent(\n () => import('./components/MapContainer').then((mod) => ({ default: mod.MapContainer })),\n {\n displayName: 'LazyMapContainer',\n fallback: <MapLoadingFallback minHeight={400} />,\n }\n);\n\n/**\n * LazyMapView - Lazy-loaded map view (alias for MapContainer)\n */\nexport const LazyMapView = createLazyComponent(\n () => import('./components/MapContainer').then((mod) => ({ default: mod.MapView })),\n {\n displayName: 'LazyMapView',\n fallback: <MapLoadingFallback minHeight={400} />,\n }\n);\n\n// ============================================================================\n// Re-export types for convenience\n// ============================================================================\n\nexport type {\n MapContainerProps,\n} from './components';\n\nexport type {\n MapViewport,\n MapStyleKey,\n MarkerData,\n} from './types';\n","'use client';\n\n/**\n * Lazy-loaded Mermaid Component\n *\n * Heavy Mermaid library (~800KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import Mermaid from '@djangocfg/ui-tools/mermaid'\n */\n\nimport { createLazyComponent, CardLoadingFallback } from '../../components';\nimport type { MermaidProps } from './index';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type { MermaidProps };\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyMermaid - Lazy-loaded Mermaid diagram renderer\n *\n * Automatically shows loading state while Mermaid loads (~800KB)\n */\nexport const LazyMermaid = createLazyComponent<MermaidProps>(\n () => import('./Mermaid.client'),\n {\n displayName: 'LazyMermaid',\n fallback: (\n <CardLoadingFallback\n title=\"Diagram\"\n description=\"Loading...\"\n minHeight={200}\n />\n ),\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded PrettyCode Component\n *\n * Heavy Prism library (~500KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import PrettyCode from '@djangocfg/ui-tools/pretty-code'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { Language } from 'prism-react-renderer';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PrettyCodeProps {\n data: string | object;\n language: Language;\n className?: string;\n mode?: 'dark' | 'light';\n inline?: boolean;\n customBg?: string;\n isCompact?: boolean;\n scrollIsolation?: boolean;\n maxLines?: number;\n /** ``'card'`` (default) ships the full chrome. ``'plain'`` is\n * chrome-less — for embedding inside another scroll container. */\n variant?: 'card' | 'plain';\n}\n\nexport type { Language };\n\n// ============================================================================\n// Code Loading Fallback\n// ============================================================================\n\nfunction CodeLoadingFallback() {\n return (\n <div className=\"relative rounded-sm border border-border overflow-hidden bg-muted dark:bg-zinc-900\">\n <div className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"animate-pulse h-4 w-4 rounded-full bg-muted-foreground/20\" />\n <span className=\"text-xs text-muted-foreground\">Loading code...</span>\n </div>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyPrettyCode - Lazy-loaded code syntax highlighter\n *\n * Automatically shows loading state while Prism loads (~500KB)\n */\nexport const LazyPrettyCode = createLazyComponent<PrettyCodeProps>(\n () => import('./PrettyCode.client'),\n {\n displayName: 'LazyPrettyCode',\n fallback: <CodeLoadingFallback />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded OpenapiViewer Component\n *\n * Heavy OpenAPI viewer (~400KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import OpenapiViewer from '@djangocfg/ui-tools/openapi'\n */\n\nimport * as React from 'react';\nimport { createLazyComponent } from '../../components';\nimport { PlaygroundProvider } from './context/PlaygroundContext';\nimport type { ApiKey, PlaygroundConfig, SchemaSource } from './types';\n\nexport interface PlaygroundProps {\n config: PlaygroundConfig;\n}\n\nexport type { ApiKey, PlaygroundConfig, SchemaSource };\n\nfunction OpenapiLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center min-h-[400px] bg-muted/30 rounded-lg\">\n <div className=\"text-center\">\n <div className=\"inline-block h-8 w-8 animate-spin rounded-full border-4 border-solid border-primary border-r-transparent\" />\n <p className=\"mt-3 text-sm text-muted-foreground\">Loading API Playground...</p>\n </div>\n </div>\n );\n}\n\nconst LazyDocsLayout = createLazyComponent(\n () => import('./components/DocsLayout').then((mod) => ({ default: mod.DocsLayout })),\n {\n displayName: 'LazyDocsLayout',\n fallback: <OpenapiLoadingFallback />,\n }\n);\n\nexport const LazyOpenapiViewer: React.FC<PlaygroundProps> = ({ config }) => {\n return (\n <PlaygroundProvider config={config}>\n <LazyDocsLayout />\n </PlaygroundProvider>\n );\n};\n\nLazyOpenapiViewer.displayName = 'LazyOpenapiViewer';\n","'use client';\n\n/**\n * Lazy-loaded JsonForm Component\n *\n * Heavy JSON Schema Form (~300KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { JsonSchemaForm } from '@djangocfg/ui-tools/json-form'\n */\n\nimport { createLazyComponent, CardLoadingFallback } from '../../components';\nimport type { JsonSchemaFormProps } from './types';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type { JsonSchemaFormProps };\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyJsonSchemaForm - Lazy-loaded JSON Schema form generator\n *\n * Automatically shows loading state while RJSF loads (~300KB)\n */\nexport const LazyJsonSchemaForm = createLazyComponent<JsonSchemaFormProps>(\n () => import('./JsonSchemaForm').then((mod) => ({ default: mod.JsonSchemaForm })),\n {\n displayName: 'LazyJsonSchemaForm',\n fallback: (\n <CardLoadingFallback\n title=\"Form\"\n description=\"Loading form schema...\"\n minHeight={200}\n />\n ),\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded LottiePlayer Component\n *\n * Lottie library (~200KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { LottiePlayer } from '@djangocfg/ui-tools/lottie'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { LottiePlayerProps } from './types';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type {\n LottiePlayerProps,\n LottieSize,\n LottieSpeed,\n LottieDirection,\n} from './types';\n\n// ============================================================================\n// Lottie Loading Fallback\n// ============================================================================\n\nfunction LottieLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-muted border-t-primary\" />\n <span className=\"text-sm text-muted-foreground\">Loading animation...</span>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyLottiePlayer - Lazy-loaded Lottie animation player\n *\n * Automatically shows loading state while Lottie loads (~200KB)\n */\nexport const LazyLottiePlayer = createLazyComponent<LottiePlayerProps>(\n () => import('./LottiePlayer.client').then((mod) => ({ default: mod.LottiePlayer })),\n {\n displayName: 'LazyLottiePlayer',\n fallback: <LottieLoadingFallback />,\n }\n);\n","'use client';\n\nimport { createLazyComponent } from '../../components';\nimport type { PlayerProps } from './types';\n\nexport const LazyPlayer = createLazyComponent<PlayerProps>(\n () => import('./Player').then((mod) => ({ default: mod.Player })),\n {\n displayName: 'LazyAudioPlayer',\n fallback: (\n <div className=\"rounded-lg border border-border/60 bg-card px-4 py-6 text-sm text-muted-foreground\">\n Loading audio player…\n </div>\n ),\n },\n);\n","'use client';\n\n/**\n * Lazy-loaded VideoPlayer Component\n *\n * Heavy Vidstack (~150KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { VideoPlayer } from '@djangocfg/ui-tools/video'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { VideoPlayerProps } from './types';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type { VideoPlayerProps };\n\n// ============================================================================\n// Video Loading Fallback\n// ============================================================================\n\nfunction VideoLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center bg-black/90 rounded-lg aspect-video\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"relative\">\n <div className=\"h-10 w-10 animate-spin rounded-full border-4 border-white/20 border-t-white\" />\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <svg\n className=\"h-5 w-5 text-white/60\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n </div>\n </div>\n <span className=\"text-sm text-white/60\">Loading video player...</span>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyVideoPlayer - Lazy-loaded professional video player\n *\n * Automatically shows loading state while Vidstack loads (~150KB)\n */\nexport const LazyVideoPlayer = createLazyComponent<VideoPlayerProps>(\n () => import('./components').then((mod) => ({ default: mod.VideoPlayer })),\n {\n displayName: 'LazyVideoPlayer',\n fallback: <VideoLoadingFallback />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded JsonTree Component\n *\n * JsonTree (~100KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import JsonTree from '@djangocfg/ui-tools/json-tree'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { JsonTreeConfig, JsonTreeMode } from './index';\nimport type { CommonExternalProps } from 'react-json-tree';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface JsonTreeProps {\n title?: string;\n data: unknown;\n /**\n * Display mode:\n * - \"full\" (default): With toolbar and border\n * - \"compact\": No toolbar, subtle styling\n * - \"inline\": Minimal, no border\n */\n mode?: JsonTreeMode;\n config?: JsonTreeConfig;\n jsonTreeProps?: Partial<CommonExternalProps>;\n}\n\nexport type { JsonTreeConfig, JsonTreeMode };\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyJsonTree - Lazy-loaded JSON visualization tree\n *\n * Automatically shows loading state while JsonTree loads (~100KB)\n *\n * @example\n * // Full mode (with toolbar)\n * <LazyJsonTree data={obj} mode=\"full\" />\n *\n * // Compact mode (no toolbar)\n * <LazyJsonTree data={obj} mode=\"compact\" />\n *\n * // Inline mode (minimal, for embedding)\n * <LazyJsonTree data={obj} mode=\"inline\" />\n */\nexport const LazyJsonTree = createLazyComponent<JsonTreeProps>(\n () => import('./index'),\n {\n displayName: 'LazyJsonTree',\n fallback: <LoadingFallback minHeight={100} text=\"Loading JSON viewer...\" />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded ImageViewer Component\n *\n * ImageViewer (~50KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { ImageViewer } from '@djangocfg/ui-tools/image-viewer'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { ImageViewerProps } from './types';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type { ImageViewerProps };\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyImageViewer - Lazy-loaded image viewer with zoom/pan/rotate\n *\n * Automatically shows loading state while ImageViewer loads (~50KB)\n */\nexport const LazyImageViewer = createLazyComponent<ImageViewerProps>(\n () => import('./components').then((mod) => ({ default: mod.ImageViewer })),\n {\n displayName: 'LazyImageViewer',\n fallback: <LoadingFallback minHeight={200} text=\"Loading image viewer...\" />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded CronScheduler Component\n *\n * CronScheduler (~15KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * @example\n * import { LazyCronScheduler } from '@djangocfg/ui-tools';\n *\n * <LazyCronScheduler\n * value={cron}\n * onChange={setCron}\n * />\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { CronSchedulerProps } from './types';\n\n// Re-export types\nexport type {\n CronSchedulerProps,\n ScheduleType,\n WeekDay,\n MonthDay,\n CronSchedulerState,\n} from './types';\n\n/**\n * LazyCronScheduler - Lazy-loaded cron expression builder\n *\n * Automatically shows loading state while CronScheduler loads (~15KB).\n * Uses createLazyComponent factory for optimal code-splitting.\n *\n * @example\n * // Basic usage\n * <LazyCronScheduler\n * value=\"0 9 * * *\"\n * onChange={handleChange}\n * />\n *\n * @example\n * // With all options\n * <LazyCronScheduler\n * value={cron}\n * onChange={setCron}\n * defaultType=\"weekly\"\n * showPreview\n * showCronExpression\n * allowCopy\n * timeFormat=\"24h\"\n * />\n */\nexport const LazyCronScheduler = createLazyComponent<CronSchedulerProps>(\n () => import('./CronScheduler.client'),\n {\n displayName: 'LazyCronScheduler',\n fallback: (\n <LoadingFallback\n minHeight={120}\n showText={false}\n className=\"rounded-lg\"\n />\n ),\n }\n);\n","'use client';\n\nimport { createLazyComponent, LoadingFallback } from '../../components/lazy-wrapper';\nimport type { TreeRootProps } from './types';\n\nexport const LazyTree = createLazyComponent<TreeRootProps<unknown>>(\n () => import('./TreeRoot'),\n {\n displayName: 'LazyTree',\n fallback: <LoadingFallback minHeight={200} text=\"Loading tree…\" />,\n },\n);\n\nexport type { TreeRootProps };\n","'use client';\n\nimport { createLazyComponent, LoadingFallback } from '../../components/lazy-wrapper';\nimport type { ChatRootProps } from './components/ChatRoot';\n\nexport const LazyChat = createLazyComponent<ChatRootProps>(\n () => import('./components/ChatRoot').then((m) => ({ default: m.ChatRoot })),\n {\n displayName: 'LazyChat',\n fallback: <LoadingFallback minHeight={320} text=\"Loading chat…\" />,\n },\n);\n\nexport type { ChatRootProps };\n","/**\n * Transport surface re-export. Lives in core so transport implementations\n * never need to reach into the public types module.\n */\n\nexport type {\n ChatTransport,\n ChatStreamEvent,\n CreateSessionOptions,\n SessionInfo,\n HistoryPage,\n StreamOptions,\n SendOptions,\n} from '../../types';\n\nexport class TransportError extends Error {\n code: string;\n\n constructor(message: string, code = 'transport_error') {\n super(message);\n this.name = 'TransportError';\n this.code = code;\n }\n}\n","/**\n * Server-Sent Events parser as an AsyncGenerator.\n *\n * Yields parsed events from a `Response` body. Handles the split-read case\n * where `event:` and `data:` arrive in separate TCP packets. Skips malformed\n * JSON gracefully. Honors AbortSignal (caller passes one to fetch).\n */\n\nimport type { ChatStreamEvent } from '../../types';\nimport { LIMITS } from '../../config';\n\ninterface RawEvent {\n event?: string;\n data?: string;\n}\n\nexport interface ParseSSEOptions {\n signal?: AbortSignal;\n /** Map a raw SSE event to a ChatStreamEvent. Default: parse `data` as JSON\n * and assume the JSON shape already matches `ChatStreamEvent`. */\n map?: (raw: RawEvent) => ChatStreamEvent | null;\n idleTimeoutMs?: number;\n}\n\nconst DEFAULT_MAP = (raw: RawEvent): ChatStreamEvent | null => {\n if (!raw.data) return null;\n try {\n const parsed = JSON.parse(raw.data) as ChatStreamEvent;\n if (raw.event && !('type' in parsed)) {\n return { ...(parsed as object), type: raw.event } as ChatStreamEvent;\n }\n return parsed;\n } catch {\n return null;\n }\n};\n\nexport async function* parseSSE(\n response: Response,\n options: ParseSSEOptions = {},\n): AsyncGenerator<ChatStreamEvent, void, void> {\n if (!response.body) {\n throw new Error('SSE response has no body');\n }\n\n const map = options.map ?? DEFAULT_MAP;\n const idleMs = options.idleTimeoutMs ?? LIMITS.sseIdleMs;\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let lastChunkAt = Date.now();\n\n const idleCheck = () => {\n if (Date.now() - lastChunkAt > idleMs) {\n throw new Error(`SSE idle timeout (${idleMs}ms)`);\n }\n };\n\n try {\n while (true) {\n if (options.signal?.aborted) {\n return;\n }\n const { value, done } = await reader.read();\n if (done) break;\n\n lastChunkAt = Date.now();\n buffer += decoder.decode(value, { stream: true });\n\n // Split on blank line which delimits SSE events.\n let separator = buffer.indexOf('\\n\\n');\n while (separator !== -1) {\n const rawBlock = buffer.slice(0, separator);\n buffer = buffer.slice(separator + 2);\n\n const raw = parseEventBlock(rawBlock);\n const evt = map(raw);\n if (evt) yield evt;\n\n separator = buffer.indexOf('\\n\\n');\n }\n\n idleCheck();\n }\n\n // Flush any trailing partial event.\n if (buffer.trim()) {\n const raw = parseEventBlock(buffer);\n const evt = map(raw);\n if (evt) yield evt;\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n /* ignore */\n }\n }\n}\n\nfunction parseEventBlock(block: string): RawEvent {\n const out: RawEvent = {};\n const lines = block.split(/\\r?\\n/);\n const dataLines: string[] = [];\n for (const line of lines) {\n if (!line || line.startsWith(':')) continue;\n const colon = line.indexOf(':');\n if (colon === -1) continue;\n const field = line.slice(0, colon).trim();\n const value = line.slice(colon + 1).replace(/^ /, '');\n if (field === 'event') out.event = value;\n else if (field === 'data') dataLines.push(value);\n }\n if (dataLines.length) out.data = dataLines.join('\\n');\n return out;\n}\n","/**\n * HTTP + SSE transport. Default implementation for web hosts.\n *\n * Backend contract (see @dev/@refactoring7-chat/06-integration.md):\n * POST /sessions → SessionInfo (JSON)\n * GET /sessions/:id/history?cursor= → HistoryPage (JSON)\n * POST /sessions/:id/messages → SSE stream of ChatStreamEvent\n * POST /sessions/:id/messages/buffered → ChatMessage (JSON, fallback)\n * DELETE /sessions/:id → 204\n */\n\nimport type {\n ChatMessage,\n ChatStreamEvent,\n ChatTransport,\n CreateSessionOptions,\n HistoryPage,\n SendOptions,\n SessionInfo,\n StreamOptions,\n} from '../../types';\nimport { TransportError } from './types';\nimport { parseSSE } from './sse';\n\nexport interface HttpTransportConfig {\n /** Base URL without trailing slash, e.g. '/api/chat' or 'https://api.example.com/v1/chat'. */\n baseUrl: string;\n /** Optional slug appended/forwarded as project identifier. */\n slug?: string;\n /** Returns headers applied to every request — e.g. Authorization. */\n getAuthHeader?: () => Record<string, string> | Promise<Record<string, string>>;\n /** Default fetch timeout (per non-streaming request). */\n timeoutMs?: number;\n /** Override fetch implementation (useful for tests or custom retry layers). */\n fetchImpl?: typeof fetch;\n}\n\nconst DEFAULT_TIMEOUT = 20_000;\n\nasync function jsonOrThrow<T>(res: Response, label: string): Promise<T> {\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new TransportError(\n `${label} failed (${res.status}): ${text || res.statusText}`,\n mapStatusToCode(res.status),\n );\n }\n try {\n return (await res.json()) as T;\n } catch {\n throw new TransportError(`${label} returned invalid JSON`, 'invalid_response');\n }\n}\n\nfunction mapStatusToCode(status: number): string {\n if (status === 401) return 'unauthorized';\n if (status === 403) return 'forbidden';\n if (status === 404) return 'not_found';\n if (status === 429) return 'rate_limited';\n if (status >= 500) return 'server_error';\n return 'http_error';\n}\n\nfunction withTimeout(signal: AbortSignal | undefined, timeoutMs: number): AbortSignal {\n const ctrl = new AbortController();\n const onAbort = () => ctrl.abort();\n signal?.addEventListener('abort', onAbort, { once: true });\n setTimeout(() => ctrl.abort(), timeoutMs);\n return ctrl.signal;\n}\n\nexport function createHttpTransport(config: HttpTransportConfig): ChatTransport {\n const fetchImpl = config.fetchImpl ?? fetch;\n const timeout = config.timeoutMs ?? DEFAULT_TIMEOUT;\n const base = config.baseUrl.replace(/\\/$/, '');\n\n async function buildHeaders(extra?: Record<string, string>): Promise<Record<string, string>> {\n const auth = (await config.getAuthHeader?.()) ?? {};\n return {\n 'Content-Type': 'application/json',\n ...auth,\n ...(extra ?? {}),\n };\n }\n\n return {\n async createSession(opts?: CreateSessionOptions): Promise<SessionInfo> {\n const res = await fetchImpl(`${base}/sessions`, {\n method: 'POST',\n headers: await buildHeaders(),\n body: JSON.stringify({ slug: config.slug, metadata: opts?.metadata ?? {} }),\n signal: withTimeout(undefined, timeout),\n });\n return jsonOrThrow<SessionInfo>(res, 'createSession');\n },\n\n async loadHistory(sessionId, cursor, limit): Promise<HistoryPage> {\n const params = new URLSearchParams();\n if (cursor) params.set('cursor', cursor);\n if (limit) params.set('limit', String(limit));\n const url = `${base}/sessions/${encodeURIComponent(sessionId)}/history${\n params.toString() ? `?${params.toString()}` : ''\n }`;\n const res = await fetchImpl(url, {\n method: 'GET',\n headers: await buildHeaders(),\n signal: withTimeout(undefined, timeout),\n });\n return jsonOrThrow<HistoryPage>(res, 'loadHistory');\n },\n\n async *stream(\n sessionId: string,\n content: string,\n options: StreamOptions,\n ): AsyncGenerator<ChatStreamEvent, void, void> {\n const url = `${base}/sessions/${encodeURIComponent(sessionId)}/messages`;\n const res = await fetchImpl(url, {\n method: 'POST',\n headers: await buildHeaders({ Accept: 'text/event-stream' }),\n body: JSON.stringify({\n content,\n attachments: options.attachments ?? [],\n metadata: options.metadata ?? {},\n }),\n signal: options.signal,\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new TransportError(\n `stream failed (${res.status}): ${text || res.statusText}`,\n mapStatusToCode(res.status),\n );\n }\n\n yield* parseSSE(res, { signal: options.signal });\n },\n\n async send(sessionId, content, options?: SendOptions): Promise<ChatMessage> {\n const url = `${base}/sessions/${encodeURIComponent(sessionId)}/messages/buffered`;\n const res = await fetchImpl(url, {\n method: 'POST',\n headers: await buildHeaders(),\n body: JSON.stringify({\n content,\n attachments: options?.attachments ?? [],\n metadata: options?.metadata ?? {},\n }),\n signal: options?.signal ?? withTimeout(undefined, timeout),\n });\n return jsonOrThrow<ChatMessage>(res, 'send');\n },\n\n async closeSession(sessionId: string): Promise<void> {\n const url = `${base}/sessions/${encodeURIComponent(sessionId)}`;\n const res = await fetchImpl(url, {\n method: 'DELETE',\n headers: await buildHeaders(),\n signal: withTimeout(undefined, timeout),\n });\n if (!res.ok && res.status !== 404) {\n throw new TransportError(`closeSession failed (${res.status})`, mapStatusToCode(res.status));\n }\n },\n };\n}\n","/**\n * In-memory chat transport for stories and tests. Replays scripted replies.\n */\n\nimport type {\n ChatMessage,\n ChatStreamEvent,\n ChatTransport,\n CreateSessionOptions,\n HistoryPage,\n SendOptions,\n SessionInfo,\n StreamOptions,\n} from '../../types';\nimport { createId } from '../ids';\n\nexport interface MockTransportOptions {\n /** Each entry is the assistant's reply for one user turn. Strings are split\n * into chunks; arrays are taken as the exact event sequence (after a\n * prepended `message_start` and before a synthetic `message_end`). */\n replies?: Array<string | ChatStreamEvent[]>;\n latencyMs?: number;\n /** Initial history returned by `createSession`. */\n initialMessages?: ChatMessage[];\n shouldFail?: (attempt: number) => boolean;\n}\n\nconst DEFAULT_REPLY = 'Hi there!';\n\nfunction splitForStream(text: string, parts = 4): string[] {\n if (!text) return [];\n const chunkSize = Math.max(1, Math.ceil(text.length / parts));\n const out: string[] = [];\n for (let i = 0; i < text.length; i += chunkSize) {\n out.push(text.slice(i, i + chunkSize));\n }\n return out;\n}\n\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nexport function createMockTransport(opts: MockTransportOptions = {}): ChatTransport {\n const replies = opts.replies?.length ? opts.replies : [DEFAULT_REPLY];\n const latency = opts.latencyMs ?? 30;\n const history: ChatMessage[] = [...(opts.initialMessages ?? [])];\n let turn = 0;\n let attempt = 0;\n\n return {\n async createSession(_opts?: CreateSessionOptions): Promise<SessionInfo> {\n await sleep(latency);\n return {\n sessionId: createId('s'),\n messages: history.length ? [...history] : undefined,\n hasMore: false,\n cursor: null,\n resumed: history.length > 0,\n };\n },\n\n async loadHistory(_sid, _cursor, _limit): Promise<HistoryPage> {\n await sleep(latency);\n return { messages: [], hasMore: false, nextCursor: null };\n },\n\n async *stream(\n _sid: string,\n content: string,\n options: StreamOptions,\n ): AsyncGenerator<ChatStreamEvent, void, void> {\n attempt += 1;\n if (opts.shouldFail?.(attempt)) {\n throw new Error('mock transport scripted failure');\n }\n\n // Record the user message for any subsequent loadHistory.\n history.push({\n id: createId('u'),\n role: 'user',\n content,\n createdAt: Date.now(),\n });\n\n const messageId = createId('a');\n yield { type: 'message_start', messageId, sessionId: _sid };\n\n const reply = replies[turn % replies.length];\n turn += 1;\n\n if (typeof reply === 'string') {\n for (const piece of splitForStream(reply)) {\n if (options.signal.aborted) return;\n await sleep(latency);\n yield { type: 'chunk', delta: piece };\n }\n yield { type: 'message_end', tokensIn: content.length, tokensOut: reply.length };\n } else {\n for (const ev of reply) {\n if (options.signal.aborted) return;\n await sleep(latency);\n yield ev;\n }\n // If the script didn't end the message itself, do it for them.\n const lastType = reply[reply.length - 1]?.type;\n if (lastType !== 'message_end' && lastType !== 'error') {\n yield { type: 'message_end' };\n }\n }\n },\n\n async send(_sid, content, _options?: SendOptions): Promise<ChatMessage> {\n await sleep(latency);\n const reply = replies[turn % replies.length];\n turn += 1;\n const text =\n typeof reply === 'string'\n ? reply\n : reply\n .filter((e) => e.type === 'chunk')\n .map((e) => (e as { delta: string }).delta)\n .join('');\n return {\n id: createId('a'),\n role: 'assistant',\n content: text || DEFAULT_REPLY,\n createdAt: Date.now(),\n };\n },\n\n async closeSession(_sid: string): Promise<void> {\n // no-op\n },\n };\n}\n","'use client';\n\nimport { type RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\n/**\n * @deprecated Plan64. As of ui-tools 2.1.369, `<MessageList>` is\n * virtualized via react-virtuoso and owns its own scroll viewport.\n * Sticky-bottom + auto-follow on streaming live inside the component;\n * use the new `MessageListProps.onAtBottomChange` prop and the\n * `MessageListHandle.scrollToBottom()` imperative method instead.\n *\n * This hook is kept for hosts that render messages outside\n * `<MessageList>` (e.g. headless story shells, custom non-virtualized\n * scroll containers). It still works against any HTMLElement scroll\n * container, but it does NOT integrate with Virtuoso — passing a\n * Virtuoso-managed element here will read garbage scroll metrics.\n */\nexport interface UseChatScrollOptions {\n containerRef: RefObject<HTMLElement | null>;\n bottomRef: RefObject<HTMLElement | null>;\n isStreaming?: boolean;\n /** Distance from bottom (px) considered \"at bottom\". */\n bottomThresholdPx?: number;\n /** Bump key — increment when a new message arrives so the hook re-evaluates auto-scroll. */\n messagesCount?: number;\n}\n\nexport interface UseChatScrollReturn {\n isAtBottom: boolean;\n unreadCount: number;\n scrollToBottom: (smooth?: boolean) => void;\n resetUnread: () => void;\n}\n\nexport function useChatScroll(options: UseChatScrollOptions): UseChatScrollReturn {\n const {\n containerRef,\n bottomRef,\n isStreaming = false,\n bottomThresholdPx = 80,\n messagesCount = 0,\n } = options;\n\n const [isAtBottom, setIsAtBottom] = useState(true);\n const [unreadCount, setUnreadCount] = useState(0);\n const lastCountRef = useRef(messagesCount);\n const stickyRef = useRef(true);\n const wasStreamingRef = useRef(isStreaming);\n\n const scrollToBottom = useCallback(\n (smooth = false) => {\n const el = containerRef.current;\n if (!el) return;\n el.scrollTo({\n top: el.scrollHeight,\n behavior: smooth ? 'smooth' : 'auto',\n });\n stickyRef.current = true;\n setIsAtBottom(true);\n setUnreadCount(0);\n },\n [containerRef],\n );\n\n const resetUnread = useCallback(() => setUnreadCount(0), []);\n\n // Track scroll position relative to bottom.\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n const onScroll = () => {\n const distance = el.scrollHeight - el.scrollTop - el.clientHeight;\n const atBottom = distance <= bottomThresholdPx;\n stickyRef.current = atBottom;\n setIsAtBottom(atBottom);\n if (atBottom) setUnreadCount(0);\n };\n onScroll();\n el.addEventListener('scroll', onScroll, { passive: true });\n return () => {\n el.removeEventListener('scroll', onScroll);\n };\n }, [containerRef, bottomThresholdPx]);\n\n // Stick to bottom while streaming, and one extra rAF after stream ends so\n // the final layout (markdown re-render, sources/tool-call panels) doesn't\n // push the latest content out of view.\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n\n if (isStreaming) {\n wasStreamingRef.current = true;\n if (!stickyRef.current) return;\n let raf = 0;\n const tick = () => {\n if (!stickyRef.current) return;\n el.scrollTop = el.scrollHeight;\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(raf);\n }\n\n // Stream just ended — flush one more scroll on the next two frames so\n // both markdown swap and any post-stream panel insertions are reflected.\n if (wasStreamingRef.current && stickyRef.current) {\n wasStreamingRef.current = false;\n let raf1 = 0;\n let raf2 = 0;\n raf1 = requestAnimationFrame(() => {\n el.scrollTop = el.scrollHeight;\n raf2 = requestAnimationFrame(() => {\n el.scrollTop = el.scrollHeight;\n });\n });\n return () => {\n cancelAnimationFrame(raf1);\n cancelAnimationFrame(raf2);\n };\n }\n wasStreamingRef.current = false;\n return;\n }, [containerRef, isStreaming]);\n\n // On message count increase, decide whether to scroll or bump unread.\n useEffect(() => {\n if (messagesCount > lastCountRef.current) {\n if (stickyRef.current) {\n const el = containerRef.current;\n if (el) el.scrollTop = el.scrollHeight;\n } else {\n setUnreadCount((n) => n + (messagesCount - lastCountRef.current));\n }\n }\n lastCountRef.current = messagesCount;\n }, [containerRef, messagesCount]);\n\n // Watch bottom sentinel just for symmetry/future hooks.\n useEffect(() => {\n void bottomRef;\n }, [bottomRef]);\n\n return { isAtBottom, unreadCount, scrollToBottom, resetUnread };\n}\n","'use client';\n\nimport { type RefObject, useEffect, useRef } from 'react';\n\nexport interface UseChatHistoryOptions {\n enabled?: boolean;\n containerRef: RefObject<HTMLElement | null>;\n topSentinelRef: RefObject<HTMLElement | null>;\n hasMore: boolean;\n isLoadingMore: boolean;\n loadMore: () => Promise<void>;\n}\n\n/** Triggers `loadMore` when the top sentinel enters the container's viewport.\n * Preserves scroll anchor: if the container's height grows after load, we\n * bump scrollTop by the delta so the previously-visible message stays put. */\nexport function useChatHistory(options: UseChatHistoryOptions): void {\n const { enabled = true, containerRef, topSentinelRef, hasMore, isLoadingMore, loadMore } = options;\n const heightBeforeRef = useRef<number | null>(null);\n\n // Restore anchor after content prepends.\n useEffect(() => {\n if (heightBeforeRef.current == null) return;\n const el = containerRef.current;\n if (!el) {\n heightBeforeRef.current = null;\n return;\n }\n if (!isLoadingMore) {\n const delta = el.scrollHeight - heightBeforeRef.current;\n if (delta > 0) {\n el.scrollTop += delta;\n }\n heightBeforeRef.current = null;\n }\n }, [containerRef, isLoadingMore]);\n\n useEffect(() => {\n if (!enabled || !hasMore) return;\n const sentinel = topSentinelRef.current;\n const root = containerRef.current;\n if (!sentinel || !root) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n if (!entry?.isIntersecting) return;\n if (isLoadingMore) return;\n const el = containerRef.current;\n if (el) heightBeforeRef.current = el.scrollHeight;\n void loadMore();\n },\n { root, threshold: 0, rootMargin: '200px 0px 0px 0px' },\n );\n\n observer.observe(sentinel);\n return () => observer.disconnect();\n }, [enabled, hasMore, isLoadingMore, containerRef, topSentinelRef, loadMore]);\n}\n","'use client';\n\nimport { useCallback, useState } from 'react';\n\nimport type { ChatAttachment } from '../types';\n\nexport type ChatLightboxScope = 'message' | 'conversation';\n\nexport interface ChatLightboxState {\n gallery: ChatAttachment[];\n index: number;\n}\n\nexport interface UseChatLightboxReturn {\n state: ChatLightboxState | null;\n open: (att: ChatAttachment, gallery?: ChatAttachment[]) => void;\n close: () => void;\n}\n\n/** Tiny state container for an image lightbox. The host owns the modal +\n * `<LazyImageViewer>` mount; we just track which gallery to show. */\nexport function useChatLightbox(): UseChatLightboxReturn {\n const [state, setState] = useState<ChatLightboxState | null>(null);\n\n const open = useCallback((att: ChatAttachment, gallery?: ChatAttachment[]) => {\n const list = gallery && gallery.length ? gallery : [att];\n const idx = list.findIndex((a) => a.id === att.id);\n setState({ gallery: list, index: idx === -1 ? 0 : idx });\n }, []);\n\n const close = useCallback(() => setState(null), []);\n\n return { state, open, close };\n}\n","'use client';\n\nimport { type RefObject, useEffect, useRef } from 'react';\n\nimport { useChatContextOptional, type ComposerHandle } from '../context';\n\n/** Anything with a `.focus()` method — covers HTMLElement, the\n * composer's textareaRef from `useChatComposer`, and any custom\n * imperative handle exposing the same shape. */\nexport interface Focusable {\n focus: () => void;\n}\n\nexport interface UseAutoFocusOnStreamEndOptions {\n /** True while an assistant reply is streaming. The hook fires the\n * focus() call on the true → false transition.\n *\n * When omitted, the hook reads `isStreaming` from `useChatContext`.\n * Pass it explicitly only if you're driving stream state from your\n * own store (cmdop's Wails event bus, for example). */\n isStreaming?: boolean;\n /** Ref / handle to focus when the reply lands.\n *\n * When omitted, the hook uses the composer handle registered in\n * the chat context — the built-in `<Composer>` registers itself\n * automatically, custom composers can opt in via\n * `useRegisterComposer`. Pass `targetRef` only when you need to\n * focus something other than the composer (e.g. an \"approve\"\n * button, a quick-reply chip). */\n targetRef?: RefObject<Focusable | HTMLElement | null>;\n /** Opt-out. Default true. Pass false to disable without unmounting\n * the hook (e.g. user preference). */\n enabled?: boolean;\n /** Delay the focus call by this many ms. Default 0 = next animation\n * frame, which lets the streaming bubble's final commit settle\n * before focus pulls scroll. Bump to 50-150ms for layouts that\n * re-mount the composer after the final chunk. */\n delayMs?: number;\n}\n\n/**\n * Refocus the chat composer the moment the assistant reply finishes\n * streaming. Standard chat UX: the user types → sends → reads the\n * reply → starts typing again without reaching for the mouse.\n *\n * Default (zero-config) usage — works the moment a `<Composer>` is\n * mounted inside a `<ChatProvider>`:\n *\n * useAutoFocusOnStreamEnd();\n *\n * Custom composer / advanced wiring:\n *\n * const ref = useRef<{ focus: () => void } | null>(null);\n * useAutoFocusOnStreamEnd({ targetRef: ref });\n *\n * Driving stream state yourself:\n *\n * useAutoFocusOnStreamEnd({ isStreaming: myExternalStreaming });\n *\n * Only the true → false transition fires focus — toggling `enabled`\n * mid-stream won't steal focus while the user is reading.\n */\nexport function useAutoFocusOnStreamEnd(\n options: UseAutoFocusOnStreamEndOptions = {},\n): void {\n const { isStreaming: isStreamingProp, targetRef, enabled = true, delayMs = 0 } = options;\n const ctx = useChatContextOptional();\n // Prefer the prop (caller knows best), fall back to context.\n const isStreaming = isStreamingProp ?? ctx?.isStreaming ?? false;\n\n // Keep latest ctx-composer in a ref so the focus effect always\n // sees the freshest registered handle without re-firing when\n // composers re-mount.\n const composerHandleRef = useRef<ComposerHandle | null>(null);\n composerHandleRef.current = ctx?.composer ?? null;\n\n const prevStreamingRef = useRef(isStreaming);\n\n useEffect(() => {\n const wasStreaming = prevStreamingRef.current;\n prevStreamingRef.current = isStreaming;\n\n if (!enabled) return;\n if (!(wasStreaming && !isStreaming)) return;\n\n const focusNow = () => {\n // Resolve target in priority order: explicit ref > registered\n // composer handle. Refs may carry an HTMLElement (raw DOM) or\n // any object with `.focus()`; both are handled by the same\n // call site below.\n const explicit = targetRef?.current as Focusable | null;\n const target: Focusable | null = explicit ?? composerHandleRef.current;\n target?.focus();\n };\n\n if (delayMs > 0) {\n const id = window.setTimeout(focusNow, delayMs);\n return () => window.clearTimeout(id);\n }\n const raf = requestAnimationFrame(focusNow);\n return () => cancelAnimationFrame(raf);\n }, [isStreaming, enabled, delayMs, targetRef]);\n}\n\n/**\n * Helper for custom composers (anything that's NOT the built-in\n * `<Composer>`) to register their focus() with the chat context so\n * `useAutoFocusOnStreamEnd()` and other consumers work without\n * prop-drilling.\n *\n * Usage inside your custom composer:\n *\n * const focus = useCallback(() => {\n * myEditorRef.current?.commands.focus();\n * }, []);\n * useRegisterComposer(focus);\n *\n * No-op when called outside a `<ChatProvider>`.\n */\nexport function useRegisterComposer(focus: () => void): void {\n const ctx = useChatContextOptional();\n const register = ctx?.registerComposer;\n useEffect(() => {\n if (!register) return;\n register({ focus });\n return () => register(null);\n }, [register, focus]);\n}\n","// Tiny dispatcher for tool-call payload renderers.\n//\n// Hosts compose matchers (predicate + render) and a fallback. The result is a\n// `renderPayload` function compatible with `<ToolCalls renderPayload>`.\n//\n// Pure — no React, no DOM. The matchers themselves return ReactNode.\n\nimport type { ReactNode } from 'react';\n\nimport type { ChatToolCall } from '../types';\nimport type { ToolPayloadKind } from '../components/ToolCalls';\n\nexport interface ToolPayloadMatcher {\n /** Cheap predicate. First match wins. */\n match: (value: unknown, kind: ToolPayloadKind, call: ChatToolCall) => boolean;\n render: (value: unknown, kind: ToolPayloadKind, call: ChatToolCall) => ReactNode;\n}\n\nexport type ToolPayloadFallback = (\n value: unknown,\n kind: ToolPayloadKind,\n call: ChatToolCall,\n) => ReactNode;\n\nexport function dispatchToolPayload(\n matchers: ToolPayloadMatcher[],\n fallback: ToolPayloadFallback,\n): ToolPayloadFallback {\n return (value, kind, call) => {\n for (const m of matchers) {\n if (m.match(value, kind, call)) return m.render(value, kind, call);\n }\n return fallback(value, kind, call);\n };\n}\n\n// ---- Common matcher predicates -------------------------------------------\n// Re-export as building blocks. Hosts can use directly or compose.\n\nexport function isPlainObject(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v);\n}\n\nexport function isLatLng(v: unknown): v is { lat: number; lng: number } {\n return isPlainObject(v) && typeof v.lat === 'number' && typeof v.lng === 'number';\n}\n\nexport function isGeoJSONFeatureCollection(v: unknown): v is { type: 'FeatureCollection'; features: unknown[] } {\n return isPlainObject(v) && v.type === 'FeatureCollection' && Array.isArray(v.features);\n}\n\nexport function isStringValue(v: unknown): v is string {\n return typeof v === 'string';\n}\n","import type { ChatAttachment, ChatMessage } from '../types';\n\n/** Walk the conversation and collect image attachments in chronological order. */\nexport function collectImageAttachments(messages: ChatMessage[]): ChatAttachment[] {\n const out: ChatAttachment[] = [];\n for (const m of messages) {\n if (!m.attachments) continue;\n for (const a of m.attachments) {\n if (a.type === 'image') out.push(a);\n }\n }\n return out;\n}\n","'use client';\n\n/**\n * Mute / unmute toggle for chat audio events.\n *\n * Reads the current ``muted`` state from the active chat context and\n * persists changes through ``useChatAudioPrefs`` (cross-tab safe). The\n * button auto-hides when no ``audio.sounds`` config is provided —\n * showing a mute toggle for a chat with no sounds is just clutter.\n *\n * Drop into a ChatRoot ``header`` slot or anywhere inside a chat\n * provider:\n *\n * ```tsx\n * <ChatRoot\n * header={<AudioToggle />}\n * audio={{ sounds: { messageReceived: '/ping.mp3' } }}\n * ...\n * />\n * ```\n */\n\nimport { Volume2, VolumeX } from 'lucide-react';\n\nimport { Button } from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useChatContextOptional } from '../context';\nimport { useChatAudioPrefs } from '../core/audio/preferences';\n\nexport interface AudioToggleProps {\n /** Visual size — matches Button sizes. Default: ``icon``. */\n size?: 'sm' | 'icon';\n /** Variant passed to the underlying Button. Default: ``ghost``. */\n variant?: 'ghost' | 'outline' | 'secondary';\n /** Force-show even when no audio config is wired (e.g. for stories). */\n alwaysShow?: boolean;\n className?: string;\n}\n\nexport function AudioToggle({\n size = 'icon',\n variant = 'ghost',\n alwaysShow = false,\n className,\n}: AudioToggleProps) {\n // Read straight from the persist store so the toggle works even\n // when rendered OUTSIDE the ChatRoot (e.g. in a parent header). The\n // chat audio bus reads the same store, so a click here flips the\n // \"muted\" state for any sibling ChatRoot in the same tab and\n // mirrors across tabs via the storage event.\n const muted = useChatAudioPrefs((s) => s.muted);\n const setMuted = useChatAudioPrefs((s) => s.setMuted);\n\n // If a ChatRoot is in scope, hide unless it actually wired sounds —\n // otherwise the button is a no-op for that surface. When rendered\n // standalone (no context), default to visible.\n const ctx = useChatContextOptional();\n if (ctx && !ctx.hasAudio && !alwaysShow) return null;\n\n const Icon = muted ? VolumeX : Volume2;\n const label = muted ? 'Unmute chat sounds' : 'Mute chat sounds';\n\n return (\n <Button\n type=\"button\"\n variant={variant}\n size={size}\n onClick={() => setMuted(!muted)}\n aria-label={label}\n aria-pressed={muted}\n title={label}\n className={cn(size === 'icon' ? 'h-9 w-9' : '', className)}\n >\n <Icon aria-hidden className=\"size-4\" />\n </Button>\n );\n}\n","/**\n * LottiePlayer - Dynamic Import Wrapper\n *\n * Lazy loads the LottiePlayer component for optimal bundle size\n */\n\n'use client';\n\nimport React, { lazy, Suspense } from 'react';\nimport { LottiePlayerProps } from './types';\n\n// Lazy load the client component\nconst LottiePlayerClient = lazy(() =>\n import('./LottiePlayer.client').then((mod) => ({ default: mod.LottiePlayer }))\n);\n\n// Loading fallback component\nconst LoadingFallback = () => (\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-gray-300 border-t-gray-900\" />\n <span className=\"text-sm text-gray-500\">Loading player...</span>\n </div>\n </div>\n);\n\n/**\n * LottiePlayer component wrapper with dynamic import\n *\n * This component automatically handles code splitting and lazy loading\n * of the Lottie player to optimize bundle size.\n *\n * Usage:\n * ```tsx\n * import { LottiePlayer } from '@djangocfg/ui-core/tools';\n *\n * <LottiePlayer\n * src=\"https://example.com/animation.json\"\n * size=\"md\"\n * autoplay\n * loop\n * />\n * ```\n */\nexport function LottiePlayer(props: LottiePlayerProps) {\n return (\n <Suspense fallback={<LoadingFallback />}>\n <LottiePlayerClient {...props} />\n </Suspense>\n );\n}\n\n// Re-export types for convenience\nexport type { LottiePlayerProps, LottieSize, LottieSpeed, LottieDirection } from './types';\nexport { useLottie } from './useLottie';\nexport type { UseLottieOptions, UseLottieReturn } from './useLottie';\n","'use client';\n\nimport React, { lazy, Suspense } from 'react';\nimport { PlaygroundProvider } from './context/PlaygroundContext';\nimport type { PlaygroundConfig } from './types';\n\nconst DocsLayout = lazy(() =>\n import('./components/DocsLayout').then((mod) => ({ default: mod.DocsLayout }))\n);\n\nconst LoadingFallback = () => (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <div className=\"text-muted-foreground\">Loading API Playground...</div>\n </div>\n);\n\nexport interface PlaygroundProps {\n config: PlaygroundConfig;\n}\n\nexport const Playground: React.FC<PlaygroundProps> = ({ config }) => {\n return (\n <PlaygroundProvider config={config}>\n <Suspense fallback={<LoadingFallback />}>\n <DocsLayout />\n </Suspense>\n </PlaygroundProvider>\n );\n};\n\nexport type { PlaygroundConfig, SchemaSource } from './types';\n\nexport default Playground;\n","'use client';\n\n/**\n * CronScheduler\n *\n * Compact cron expression builder following Apple HIG principles.\n * Lazy-loaded for optimal bundle size (~15KB).\n *\n * @example\n * import { CronScheduler } from '@djangocfg/ui-tools';\n *\n * <CronScheduler\n * value={cron}\n * onChange={setCron}\n * showPreview\n * />\n */\n\nimport React, { lazy, Suspense } from 'react';\nimport { LoadingFallback } from '../../components';\nimport type { CronSchedulerProps } from './types';\n\n// Lazy load the client component\nconst CronSchedulerClient = lazy(() => import('./CronScheduler.client'));\n\n/**\n * CronScheduler with Suspense wrapper\n */\nexport function CronScheduler(props: CronSchedulerProps) {\n return (\n <Suspense fallback={<CronSchedulerFallback />}>\n <CronSchedulerClient {...props} />\n </Suspense>\n );\n}\n\n/**\n * Loading fallback for CronScheduler\n */\nfunction CronSchedulerFallback() {\n return (\n <LoadingFallback\n minHeight={120}\n showText={false}\n className=\"rounded-lg\"\n />\n );\n}\n\n// Re-export types\nexport type {\n CronSchedulerProps,\n ScheduleType,\n WeekDay,\n MonthDay,\n CronSchedulerState,\n CronSchedulerContextValue,\n} from './types';\n\n// Re-export context and hooks for advanced usage\nexport {\n CronSchedulerProvider,\n useCronSchedulerContext,\n useCronType,\n useCronTime,\n useCronWeekDays,\n useCronMonthDays,\n useCronCustom,\n useCronPreview,\n useCronScheduler,\n} from './context';\n\n// Re-export utilities\nexport {\n buildCron,\n parseCron,\n isValidCron,\n humanizeCron,\n} from './utils';\n\n// Re-export components for custom compositions\nexport {\n ScheduleTypeSelector,\n TimeSelector,\n DayChips,\n MonthDayGrid,\n CustomInput,\n SchedulePreview,\n} from './components';\n\nexport default CronScheduler;\n","'use client';\n\n/**\n * Monaco Editor Web Worker Setup\n *\n * Workers improve performance for language services (TypeScript type-checking,\n * JSON validation, etc.) but require bundler-specific configuration:\n *\n * **Vite**: Use `?worker` imports (see example below)\n * **Next.js/Webpack**: Use `monaco-editor-webpack-plugin`\n * **No config**: Monaco falls back to main-thread execution (fully functional)\n *\n * @example Vite setup (call once in app entry):\n * ```ts\n * import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'\n * import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker'\n * import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker'\n * import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker'\n * import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker'\n *\n * setupMonacoWorkers((label) => {\n * switch (label) {\n * case 'typescript': case 'javascript': return new tsWorker()\n * case 'json': return new jsonWorker()\n * case 'css': case 'scss': case 'less': return new cssWorker()\n * case 'html': case 'handlebars': case 'razor': return new htmlWorker()\n * default: return new editorWorker()\n * }\n * })\n * ```\n *\n * @example Next.js setup:\n * ```ts\n * // next.config.js — add monaco-editor-webpack-plugin\n * // Then just call setupMonacoWorkers() without arguments\n * setupMonacoWorkers()\n * ```\n */\n\ntype GetWorkerFn = (label: string) => Worker;\n\nlet isSetup = false;\n\nexport function setupMonacoWorkers(getWorker?: GetWorkerFn): void {\n if (isSetup || typeof window === 'undefined') return;\n\n if (getWorker) {\n // App provides bundler-specific worker factory\n (self as unknown as { MonacoEnvironment: object }).MonacoEnvironment = {\n getWorker: (_workerId: string, label: string) => getWorker(label),\n };\n }\n // else: don't set MonacoEnvironment at all.\n // - If webpack plugin is installed, it sets MonacoEnvironment automatically.\n // - If nothing sets it, Monaco falls back to main-thread execution.\n\n isSetup = true;\n}\n","'use client';\n\nimport { useState, useEffect } from 'react';\nimport type * as MonacoEditor from 'monaco-editor';\n\nimport { setupMonacoWorkers } from '../workers/setup';\nimport type { UseMonacoReturn } from '../types';\n\n/**\n * Hook to load and access Monaco Editor instance\n *\n * Handles:\n * - Dynamic import of Monaco (client-side only)\n * - Web worker configuration\n * - Loading state management\n *\n * @example\n * ```tsx\n * const { monaco, isLoading, error } = useMonaco();\n *\n * if (isLoading) return <Spinner />;\n * if (error) return <Error message={error.message} />;\n *\n * // Use monaco API\n * monaco.editor.create(...)\n * ```\n */\nexport function useMonaco(): UseMonacoReturn {\n const [monaco, setMonaco] = useState<typeof MonacoEditor | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n let mounted = true;\n\n async function loadMonaco() {\n try {\n // Setup workers first\n setupMonacoWorkers();\n\n // Dynamic import Monaco\n const monacoModule = await import('monaco-editor');\n\n if (mounted) {\n setMonaco(monacoModule);\n setIsLoading(false);\n }\n } catch (err) {\n if (mounted) {\n setError(err instanceof Error ? err : new Error('Failed to load Monaco Editor'));\n setIsLoading(false);\n }\n }\n }\n\n loadMonaco();\n\n return () => {\n mounted = false;\n };\n }, []);\n\n return { monaco, isLoading, error };\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\nimport { useResolvedTheme } from '@djangocfg/ui-core/hooks';\n\n/**\n * Hook that syncs Monaco editor theme with the app theme.\n *\n * Reads CSS variables from the document and creates custom Monaco themes\n * that match the current light/dark mode. Falls back to built-in 'vs' / 'vs-dark'.\n *\n * @param monaco - Monaco namespace (null during loading)\n * @param themeOverride - Optional explicit theme name (skips auto-detection)\n * @returns Resolved Monaco theme name to pass to editor options\n */\nexport function useEditorTheme(\n monaco: typeof import('monaco-editor') | null,\n themeOverride?: string,\n): string {\n const appTheme = useResolvedTheme();\n const registered = useRef(false);\n\n // Register custom themes once Monaco is loaded\n useEffect(() => {\n if (!monaco || registered.current) return;\n\n try {\n const colors = _readCSSColors();\n\n monaco.editor.defineTheme('app-dark', {\n base: 'vs-dark',\n inherit: true,\n rules: [\n { token: 'comment', foreground: '6A9955', fontStyle: 'italic' },\n { token: 'keyword', foreground: 'C586C0' },\n { token: 'string', foreground: 'CE9178' },\n { token: 'number', foreground: 'B5CEA8' },\n { token: 'type', foreground: '4EC9B0' },\n { token: 'function', foreground: 'DCDCAA' },\n { token: 'variable', foreground: '9CDCFE' },\n ],\n colors: {\n 'editor.background': colors.background,\n 'editor.foreground': colors.foreground,\n 'editor.lineHighlightBackground': colors.lineHighlight,\n 'editor.selectionBackground': colors.selection,\n 'editorCursor.foreground': colors.foreground,\n 'editorLineNumber.foreground': colors.mutedForeground,\n 'editorWidget.background': colors.card,\n 'editorWidget.border': colors.border,\n 'input.background': colors.card,\n 'dropdown.background': colors.card,\n },\n });\n\n monaco.editor.defineTheme('app-light', {\n base: 'vs',\n inherit: true,\n rules: [\n { token: 'comment', foreground: '008000', fontStyle: 'italic' },\n { token: 'keyword', foreground: 'AF00DB' },\n { token: 'string', foreground: 'A31515' },\n { token: 'number', foreground: '098658' },\n { token: 'type', foreground: '267F99' },\n { token: 'function', foreground: '795E26' },\n { token: 'variable', foreground: '001080' },\n ],\n colors: {\n 'editor.background': colors.backgroundLight,\n 'editor.foreground': colors.foregroundLight,\n 'editor.lineHighlightBackground': colors.lineHighlightLight,\n 'editor.selectionBackground': colors.selectionLight,\n 'editorLineNumber.foreground': colors.mutedForegroundLight,\n 'editorWidget.background': colors.cardLight,\n 'editorWidget.border': colors.borderLight,\n },\n });\n\n registered.current = true;\n } catch {\n // Fallback — use built-in themes\n }\n }, [monaco]);\n\n // If explicit override provided, use it\n if (themeOverride) return themeOverride;\n\n // Use registered app themes if available, fallback to built-in\n if (registered.current) {\n return appTheme === 'dark' ? 'app-dark' : 'app-light';\n }\n return appTheme === 'dark' ? 'vs-dark' : 'vs';\n}\n\n\n/** Read CSS variables and convert HSL to hex for Monaco */\nfunction _readCSSColors() {\n const get = (varName: string): string => {\n if (typeof document === 'undefined') return '';\n return getComputedStyle(document.documentElement).getPropertyValue(varName).trim();\n };\n\n const hslToHex = (hsl: string): string => {\n if (!hsl) return '';\n // CSS vars are \"0 0% 96%\" — strip % before parsing\n const parts = hsl.split(/\\s+/).map(s => parseFloat(s.replace('%', '')));\n if (parts.length < 3 || parts.some(isNaN)) return '';\n const [h, s, l] = [parts[0], parts[1] / 100, parts[2] / 100];\n\n const a = s * Math.min(l, 1 - l);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color).toString(16).padStart(2, '0');\n };\n return `#${f(0)}${f(8)}${f(4)}`;\n };\n\n // Read current (dark) theme CSS variables\n const background = hslToHex(get('--background')) || '#0a0a0a';\n const foreground = hslToHex(get('--foreground')) || '#f5f5f5';\n const card = hslToHex(get('--card')) || '#141414';\n const border = hslToHex(get('--border')) || '#262626';\n const mutedForeground = hslToHex(get('--muted-foreground')) || '#858585';\n\n // Compute derived colors\n const lineHighlight = _adjustBrightness(background, 10);\n const primary = hslToHex(get('--primary'));\n const selection = primary ? _adjustBrightness(primary, -40) : '#264F78';\n\n // Light theme colors (hardcoded since we can't switch CSS context)\n return {\n background,\n foreground,\n card,\n border,\n mutedForeground,\n lineHighlight,\n selection,\n // Light variants\n backgroundLight: '#ffffff',\n foregroundLight: '#1a1a1a',\n cardLight: '#ffffff',\n borderLight: '#e5e5e5',\n mutedForegroundLight: '#737373',\n lineHighlightLight: '#f5f5f5',\n selectionLight: '#ADD6FF',\n };\n}\n\nfunction _adjustBrightness(hex: string, amount: number): string {\n const num = parseInt(hex.replace('#', ''), 16);\n const r = Math.min(255, Math.max(0, ((num >> 16) & 0xff) + amount));\n const g = Math.min(255, Math.max(0, ((num >> 8) & 0xff) + amount));\n const b = Math.min(255, Math.max(0, (num & 0xff) + amount));\n return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, '0')}`;\n}\n\n","'use client';\n\nimport { useRef, useEffect, useState, useCallback, forwardRef, useImperativeHandle } from 'react';\nimport type * as monaco from 'monaco-editor';\n\nimport { useMonaco } from '../hooks/useMonaco';\nimport { useEditorTheme } from '../hooks/useEditorTheme';\nimport type { EditorProps } from '../types';\n\nexport interface EditorRef {\n /** Get editor instance */\n getEditor: () => monaco.editor.IStandaloneCodeEditor | null;\n /** Get current value */\n getValue: () => string;\n /** Set value */\n setValue: (value: string) => void;\n /** Focus editor */\n focus: () => void;\n}\n\n/**\n * Monaco Editor Component\n *\n * A React wrapper around Monaco Editor with full TypeScript support.\n *\n * @example\n * ```tsx\n * <Editor\n * value={code}\n * language=\"typescript\"\n * onChange={(value) => setCode(value)}\n * options={{ fontSize: 14, minimap: false }}\n * />\n * ```\n */\nexport const Editor = forwardRef<EditorRef, EditorProps>(function Editor(\n {\n value = '',\n language = 'plaintext',\n onChange,\n onMount,\n options = {},\n className = '',\n height = '100%',\n width = '100%',\n autoHeight = false,\n minHeight = 100,\n maxHeight = 600,\n },\n ref\n) {\n const containerRef = useRef<HTMLDivElement>(null);\n const editorRef = useRef<monaco.editor.IStandaloneCodeEditor | null>(null);\n const { monaco, isLoading } = useMonaco();\n const resolvedTheme = useEditorTheme(monaco, options.theme);\n\n // Auto-height state\n const [contentHeight, setContentHeight] = useState<number | null>(null);\n\n const updateContentHeight = useCallback((editor: monaco.editor.IStandaloneCodeEditor) => {\n if (!autoHeight) return;\n const h = editor.getContentHeight();\n setContentHeight(Math.min(Math.max(h, minHeight), maxHeight));\n }, [autoHeight, minHeight, maxHeight]);\n\n // Track internal changes to prevent cursor reset on prop sync\n const isInternalChangeRef = useRef(false);\n\n // Expose editor methods via ref\n useImperativeHandle(ref, () => ({\n getEditor: () => editorRef.current,\n getValue: () => editorRef.current?.getValue() || '',\n setValue: (val: string) => editorRef.current?.setValue(val),\n focus: () => editorRef.current?.focus(),\n }));\n\n // Create editor\n useEffect(() => {\n if (!monaco || !containerRef.current || editorRef.current) return;\n\n const editor = monaco.editor.create(containerRef.current, {\n value,\n language,\n theme: resolvedTheme,\n fontSize: options.fontSize || 14,\n fontFamily: options.fontFamily || \"'Fira Code', 'Consolas', monospace\",\n tabSize: options.tabSize || 2,\n insertSpaces: options.insertSpaces !== false,\n wordWrap: options.wordWrap || 'on',\n minimap: { enabled: options.minimap !== false },\n lineNumbers: options.lineNumbers || 'on',\n readOnly: options.readOnly || false,\n automaticLayout: true,\n scrollBeyondLastLine: autoHeight ? false : false,\n scrollbar: autoHeight ? { vertical: 'hidden', horizontal: 'auto' } : undefined,\n overviewRulerLanes: autoHeight ? 0 : undefined,\n padding: { top: 16, bottom: 16 },\n renderLineHighlight: 'all',\n cursorBlinking: 'smooth',\n cursorSmoothCaretAnimation: 'on',\n smoothScrolling: true,\n bracketPairColorization: { enabled: true },\n guides: {\n bracketPairs: true,\n indentation: true,\n },\n });\n\n editorRef.current = editor;\n\n // Setup change listener\n if (onChange) {\n editor.onDidChangeModelContent(() => {\n // Mark as internal change to prevent cursor reset on prop sync\n isInternalChangeRef.current = true;\n onChange(editor.getValue());\n });\n }\n\n // Auto-height: resize container to fit content\n if (autoHeight) {\n editor.onDidContentSizeChange(() => updateContentHeight(editor));\n updateContentHeight(editor);\n }\n\n // Call onMount callback\n onMount?.(editor);\n\n return () => {\n editor.dispose();\n editorRef.current = null;\n };\n }, [monaco]);\n\n // Update value when prop changes (only for external changes)\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n\n // Skip if this is an internal change (user typing) - prevents cursor reset\n if (isInternalChangeRef.current) {\n isInternalChangeRef.current = false;\n return;\n }\n\n const currentValue = editor.getValue();\n if (value !== currentValue) {\n // Save cursor position\n const position = editor.getPosition();\n const selections = editor.getSelections();\n\n editor.setValue(value);\n\n // Restore cursor position if possible\n if (position) {\n editor.setPosition(position);\n }\n if (selections && selections.length > 0) {\n editor.setSelections(selections);\n }\n }\n }, [value]);\n\n // Update language when prop changes\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor || !monaco) return;\n\n const model = editor.getModel();\n if (model) {\n monaco.editor.setModelLanguage(model, language);\n }\n }, [language, monaco]);\n\n // Update options when props change\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n\n editor.updateOptions({\n theme: resolvedTheme,\n fontSize: options.fontSize,\n readOnly: options.readOnly,\n minimap: { enabled: options.minimap !== false },\n wordWrap: options.wordWrap,\n lineNumbers: options.lineNumbers,\n });\n }, [options, resolvedTheme]);\n\n if (isLoading) {\n return (\n <div\n className={className}\n style={{\n width,\n height,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#1e1e1e',\n color: '#666',\n }}\n >\n Loading editor...\n </div>\n );\n }\n\n const resolvedHeight = autoHeight && contentHeight != null ? contentHeight : height;\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={{\n width,\n height: resolvedHeight,\n ...(autoHeight && { minHeight: minHeight, maxHeight: maxHeight, overflow: 'hidden' }),\n }}\n />\n );\n});\n","'use client';\n\nimport { useRef, useEffect } from 'react';\nimport type * as monaco from 'monaco-editor';\n\nimport { useMonaco } from '../hooks/useMonaco';\nimport { useEditorTheme } from '../hooks/useEditorTheme';\nimport type { DiffEditorProps } from '../types';\n\n/**\n * Monaco Diff Editor Component\n *\n * Side-by-side or inline diff view for comparing two versions of content.\n *\n * @example\n * ```tsx\n * <DiffEditor\n * original={originalCode}\n * modified={modifiedCode}\n * language=\"typescript\"\n * />\n * ```\n */\nexport function DiffEditor({\n original,\n modified,\n language = 'plaintext',\n options = {},\n className = '',\n height = '100%',\n}: DiffEditorProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const editorRef = useRef<monaco.editor.IStandaloneDiffEditor | null>(null);\n const { monaco, isLoading } = useMonaco();\n const resolvedTheme = useEditorTheme(monaco, options.theme);\n\n // Create diff editor\n useEffect(() => {\n if (!monaco || !containerRef.current || editorRef.current) return;\n\n const editor = monaco.editor.createDiffEditor(containerRef.current, {\n theme: resolvedTheme,\n fontSize: options.fontSize || 14,\n fontFamily: options.fontFamily || \"'Fira Code', 'Consolas', monospace\",\n readOnly: true,\n automaticLayout: true,\n renderSideBySide: true,\n scrollBeyondLastLine: false,\n minimap: { enabled: false },\n });\n\n const originalModel = monaco.editor.createModel(original, language);\n const modifiedModel = monaco.editor.createModel(modified, language);\n\n editor.setModel({\n original: originalModel,\n modified: modifiedModel,\n });\n\n editorRef.current = editor;\n\n return () => {\n originalModel.dispose();\n modifiedModel.dispose();\n editor.dispose();\n editorRef.current = null;\n };\n }, [monaco]);\n\n // Update models when content changes\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor || !monaco) return;\n\n const model = editor.getModel();\n if (model) {\n model.original.setValue(original);\n model.modified.setValue(modified);\n }\n }, [original, modified, monaco]);\n\n // Update language\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor || !monaco) return;\n\n const model = editor.getModel();\n if (model) {\n monaco.editor.setModelLanguage(model.original, language);\n monaco.editor.setModelLanguage(model.modified, language);\n }\n }, [language, monaco]);\n\n if (isLoading) {\n return (\n <div\n className={className}\n style={{\n width: '100%',\n height,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#1e1e1e',\n color: '#666',\n }}\n >\n Loading diff editor...\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={{\n width: '100%',\n height,\n }}\n />\n );\n}\n","/**\n * Language Detection & Mapping\n *\n * Maps file extensions to Monaco Editor language IDs.\n * Monaco supports 80+ languages out of the box.\n */\n\n/**\n * File extension to Monaco language ID mapping\n */\nexport const LANGUAGE_MAP: Record<string, string> = {\n // Web\n '.html': 'html',\n '.htm': 'html',\n '.xhtml': 'html',\n '.vue': 'html',\n '.svelte': 'html',\n\n // CSS\n '.css': 'css',\n '.scss': 'scss',\n '.sass': 'scss',\n '.less': 'less',\n\n // JavaScript/TypeScript\n '.js': 'javascript',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n '.jsx': 'javascript',\n '.ts': 'typescript',\n '.tsx': 'typescript',\n '.mts': 'typescript',\n '.cts': 'typescript',\n\n // Data formats\n '.json': 'json',\n '.jsonc': 'json',\n '.json5': 'json',\n '.yaml': 'yaml',\n '.yml': 'yaml',\n '.toml': 'ini',\n '.xml': 'xml',\n '.svg': 'xml',\n '.xsl': 'xml',\n '.xsd': 'xml',\n\n // Markdown & Documentation\n '.md': 'markdown',\n '.mdx': 'markdown',\n '.markdown': 'markdown',\n '.rst': 'restructuredtext',\n '.txt': 'plaintext',\n '.text': 'plaintext',\n\n // Programming languages\n '.py': 'python',\n '.pyw': 'python',\n '.pyi': 'python',\n '.rb': 'ruby',\n '.rake': 'ruby',\n '.gemspec': 'ruby',\n '.php': 'php',\n '.phtml': 'php',\n '.java': 'java',\n '.kt': 'kotlin',\n '.kts': 'kotlin',\n '.scala': 'scala',\n '.go': 'go',\n '.rs': 'rust',\n '.swift': 'swift',\n '.c': 'c',\n '.h': 'c',\n '.cpp': 'cpp',\n '.cc': 'cpp',\n '.cxx': 'cpp',\n '.hpp': 'cpp',\n '.hxx': 'cpp',\n '.cs': 'csharp',\n '.fs': 'fsharp',\n '.fsx': 'fsharp',\n '.vb': 'vb',\n '.lua': 'lua',\n '.r': 'r',\n '.R': 'r',\n '.m': 'objective-c',\n '.mm': 'objective-c',\n '.pl': 'perl',\n '.pm': 'perl',\n '.ex': 'elixir',\n '.exs': 'elixir',\n '.erl': 'erlang',\n '.hrl': 'erlang',\n '.clj': 'clojure',\n '.cljs': 'clojure',\n '.cljc': 'clojure',\n '.hs': 'haskell',\n '.lhs': 'haskell',\n '.ml': 'fsharp',\n '.mli': 'fsharp',\n '.dart': 'dart',\n '.groovy': 'groovy',\n '.gradle': 'groovy',\n '.jl': 'julia',\n\n // Shell & Scripts\n '.sh': 'shell',\n '.bash': 'shell',\n '.zsh': 'shell',\n '.fish': 'shell',\n '.ps1': 'powershell',\n '.psm1': 'powershell',\n '.psd1': 'powershell',\n '.bat': 'bat',\n '.cmd': 'bat',\n\n // Config files\n '.ini': 'ini',\n '.cfg': 'ini',\n '.conf': 'ini',\n '.properties': 'ini',\n '.env': 'ini',\n '.gitignore': 'ini',\n '.gitattributes': 'ini',\n '.editorconfig': 'ini',\n '.npmrc': 'ini',\n\n // Database\n '.sql': 'sql',\n '.mysql': 'mysql',\n '.pgsql': 'pgsql',\n '.plsql': 'plsql',\n '.redis': 'redis',\n\n // Templates\n '.hbs': 'handlebars',\n '.handlebars': 'handlebars',\n '.mustache': 'handlebars',\n '.ejs': 'html',\n '.pug': 'pug',\n '.jade': 'pug',\n '.twig': 'twig',\n '.liquid': 'liquid',\n\n // GraphQL\n '.graphql': 'graphql',\n '.gql': 'graphql',\n\n // Docker\n '.dockerfile': 'dockerfile',\n\n // Other\n '.diff': 'diff',\n '.patch': 'diff',\n '.log': 'log',\n '.tex': 'latex',\n '.cls': 'latex',\n '.sty': 'latex',\n '.proto': 'protobuf',\n '.sol': 'sol',\n '.asm': 'mips',\n '.s': 'mips',\n '.wasm': 'wasm',\n};\n\n/**\n * Special filename mappings (without extension)\n */\nconst FILENAME_MAP: Record<string, string> = {\n Dockerfile: 'dockerfile',\n 'docker-compose.yml': 'yaml',\n 'docker-compose.yaml': 'yaml',\n Makefile: 'makefile',\n makefile: 'makefile',\n Gemfile: 'ruby',\n Rakefile: 'ruby',\n Jenkinsfile: 'groovy',\n Vagrantfile: 'ruby',\n '.bashrc': 'shell',\n '.bash_profile': 'shell',\n '.zshrc': 'shell',\n '.profile': 'shell',\n '.vimrc': 'plaintext',\n '.gitconfig': 'ini',\n '.htaccess': 'ini',\n 'nginx.conf': 'ini',\n 'package.json': 'json',\n 'tsconfig.json': 'json',\n 'jsconfig.json': 'json',\n '.prettierrc': 'json',\n '.eslintrc': 'json',\n 'composer.json': 'json',\n 'Cargo.toml': 'ini',\n 'go.mod': 'go',\n 'go.sum': 'plaintext',\n 'requirements.txt': 'plaintext',\n 'pyproject.toml': 'ini',\n 'setup.py': 'python',\n 'setup.cfg': 'ini',\n};\n\n/**\n * Get Monaco language ID from file extension\n */\nexport function getLanguageByExtension(extension: string): string {\n const ext = extension.startsWith('.') ? extension.toLowerCase() : `.${extension.toLowerCase()}`;\n return LANGUAGE_MAP[ext] || 'plaintext';\n}\n\n/**\n * Get Monaco language ID from filename\n * Checks special filenames first, then falls back to extension\n */\nexport function getLanguageByFilename(filename: string): string {\n // Check special filenames first\n if (FILENAME_MAP[filename]) {\n return FILENAME_MAP[filename];\n }\n\n // Extract extension\n const lastDot = filename.lastIndexOf('.');\n if (lastDot === -1) {\n return 'plaintext';\n }\n\n const extension = filename.slice(lastDot).toLowerCase();\n return LANGUAGE_MAP[extension] || 'plaintext';\n}\n","'use client';\n\nimport { createContext, useContext, useState, useCallback, useMemo } from 'react';\nimport type * as monaco from 'monaco-editor';\n\nimport { useMonaco } from '../hooks/useMonaco';\nimport { getLanguageByFilename } from '../lib/languages';\nimport type { EditorFile, EditorContextValue } from '../types';\n\nconst EditorContext = createContext<EditorContextValue | null>(null);\n\n/**\n * Hook to access editor context\n * Must be used within EditorProvider\n */\nexport function useEditorContext(): EditorContextValue {\n const context = useContext(EditorContext);\n if (!context) {\n throw new Error('useEditorContext must be used within EditorProvider');\n }\n return context;\n}\n\ninterface EditorProviderProps {\n children: React.ReactNode;\n /** Callback when file save is requested */\n onSave?: (path: string, content: string) => Promise<void>;\n}\n\n/**\n * Editor Context Provider\n *\n * Manages multiple open files, active file state, and editor instance.\n *\n * @example\n * ```tsx\n * <EditorProvider onSave={handleSave}>\n * <EditorTabs />\n * <Editor />\n * </EditorProvider>\n * ```\n */\nexport function EditorProvider({ children, onSave }: EditorProviderProps) {\n const { monaco } = useMonaco();\n const [editor, setEditor] = useState<monaco.editor.IStandaloneCodeEditor | null>(null);\n const [openFiles, setOpenFiles] = useState<EditorFile[]>([]);\n const [activeFilePath, setActiveFilePath] = useState<string | null>(null);\n\n // Get active file\n const activeFile = useMemo(\n () => openFiles.find((f) => f.path === activeFilePath) || null,\n [openFiles, activeFilePath]\n );\n\n // Open a file\n const openFile = useCallback(\n (path: string, content: string, language?: string) => {\n setOpenFiles((files) => {\n // Check if already open\n const existing = files.find((f) => f.path === path);\n if (existing) {\n return files;\n }\n\n // Detect language from filename\n const basename = path.split('/').pop() || path;\n const detectedLanguage = language || getLanguageByFilename(basename);\n\n // Create new file entry\n const newFile: EditorFile = {\n path,\n content,\n language: detectedLanguage,\n isDirty: false,\n };\n\n return [...files, newFile];\n });\n\n // Set as active\n setActiveFilePath(path);\n },\n []\n );\n\n // Close a file\n const closeFile = useCallback(\n (path: string) => {\n setOpenFiles((files) => {\n const index = files.findIndex((f) => f.path === path);\n if (index === -1) return files;\n\n const newFiles = files.filter((f) => f.path !== path);\n\n // If closing active file, activate adjacent file\n if (activeFilePath === path && newFiles.length > 0) {\n const newIndex = Math.min(index, newFiles.length - 1);\n setActiveFilePath(newFiles[newIndex].path);\n } else if (newFiles.length === 0) {\n setActiveFilePath(null);\n }\n\n return newFiles;\n });\n },\n [activeFilePath]\n );\n\n // Set active file\n const setActiveFile = useCallback((path: string) => {\n setActiveFilePath(path);\n }, []);\n\n // Update file content\n const updateContent = useCallback((path: string, content: string) => {\n setOpenFiles((files) =>\n files.map((f) =>\n f.path === path\n ? { ...f, content, isDirty: true }\n : f\n )\n );\n }, []);\n\n // Save file\n const saveFile = useCallback(\n async (path: string) => {\n const file = openFiles.find((f) => f.path === path);\n if (!file) return;\n\n if (onSave) {\n await onSave(path, file.content);\n }\n\n // Mark as not dirty\n setOpenFiles((files) =>\n files.map((f) =>\n f.path === path ? { ...f, isDirty: false } : f\n )\n );\n },\n [openFiles, onSave]\n );\n\n // Check if file is dirty\n const isDirty = useCallback(\n (path: string) => {\n const file = openFiles.find((f) => f.path === path);\n return file?.isDirty || false;\n },\n [openFiles]\n );\n\n // Get file content\n const getContent = useCallback(\n (path: string) => {\n const file = openFiles.find((f) => f.path === path);\n return file?.content || null;\n },\n [openFiles]\n );\n\n // Get file by path\n const getFile = useCallback(\n (path: string) => {\n return openFiles.find((f) => f.path === path) || null;\n },\n [openFiles]\n );\n\n const value: EditorContextValue = {\n openFiles,\n activeFile,\n monaco,\n editor,\n isReady: monaco !== null && editor !== null,\n\n openFile,\n closeFile,\n setActiveFile,\n updateContent,\n saveFile,\n\n isDirty,\n getContent,\n getFile,\n };\n\n return (\n <EditorContext.Provider value={value}>\n {children}\n </EditorContext.Provider>\n );\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport type * as monaco from 'monaco-editor';\n\nimport type { UseEditorReturn } from '../types';\n\n/**\n * Hook to manage editor instance reference\n *\n * @example\n * ```tsx\n * const { editor, isReady, setEditor } = useEditor();\n *\n * // Pass setEditor to Editor component's onMount\n * <Editor onMount={setEditor} />\n *\n * // Use editor when ready\n * if (isReady) {\n * editor.getModel()?.getValue();\n * }\n * ```\n */\nexport function useEditor(): UseEditorReturn {\n const [editor, setEditorState] = useState<monaco.editor.IStandaloneCodeEditor | null>(null);\n\n const setEditor = useCallback((editorInstance: monaco.editor.IStandaloneCodeEditor | null) => {\n setEditorState(editorInstance);\n }, []);\n\n return {\n editor,\n isReady: editor !== null,\n setEditor,\n };\n}\n","'use client';\n\nimport { useMemo } from 'react';\nimport { getLanguageByFilename } from '../lib/languages';\n\n/**\n * Hook to detect language from filename\n *\n * @param filename - File name or path\n * @returns Monaco language ID\n *\n * @example\n * ```tsx\n * const language = useLanguage('app.tsx');\n * // Returns: 'typescript'\n *\n * const language2 = useLanguage('/path/to/Dockerfile');\n * // Returns: 'dockerfile'\n * ```\n */\nexport function useLanguage(filename: string | undefined): string {\n return useMemo(() => {\n if (!filename) return 'plaintext';\n\n // Extract basename from path\n const basename = filename.split('/').pop() || filename;\n return getLanguageByFilename(basename);\n }, [filename]);\n}\n","'use client';\n\nimport { forwardRef, useImperativeHandle, useState, useCallback, useEffect, type KeyboardEvent } from 'react';\nimport type { MentionItem } from './types';\n\nexport interface MentionListRef {\n onKeyDown: (event: KeyboardEvent) => boolean;\n}\n\ninterface MentionListProps {\n items: MentionItem[];\n command: (item: MentionItem) => void;\n}\n\nexport const MentionList = forwardRef<MentionListRef, MentionListProps>(\n ({ items, command }, ref) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useEffect(() => setSelectedIndex(0), [items]);\n\n const select = useCallback(\n (index: number) => {\n const item = items[index];\n if (item) command(item);\n },\n [items, command],\n );\n\n useImperativeHandle(ref, () => ({\n onKeyDown: (event: KeyboardEvent) => {\n if (event.key === 'ArrowUp') {\n setSelectedIndex((i) => (i + items.length - 1) % items.length);\n return true;\n }\n if (event.key === 'ArrowDown') {\n setSelectedIndex((i) => (i + 1) % items.length);\n return true;\n }\n if (event.key === 'Enter') {\n select(selectedIndex);\n return true;\n }\n return false;\n },\n }));\n\n if (items.length === 0) return null;\n\n return (\n <div className=\"markdown-mention-list\">\n {items.map((item, i) => {\n const isSelected = i === selectedIndex;\n const cls = `markdown-mention-item ${isSelected ? 'selected' : ''}`;\n return (\n <button key={item.id} type=\"button\" className={cls} onClick={() => select(i)}>\n {item.thumbnail && (\n <img src={item.thumbnail} alt=\"\" className=\"markdown-mention-avatar\" />\n )}\n <div className=\"markdown-mention-info\">\n <span className=\"markdown-mention-name\">{item.label}</span>\n {item.description && (\n <span className=\"markdown-mention-desc\">{item.description}</span>\n )}\n </div>\n </button>\n );\n })}\n </div>\n );\n },\n);\n\nMentionList.displayName = 'MentionList';\n","import { ReactRenderer } from '@tiptap/react';\nimport type { SuggestionOptions } from '@tiptap/suggestion';\nimport { autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { MentionList, type MentionListRef } from './MentionList';\nimport type { MentionItem, MentionConfig } from './types';\n\nexport function createMentionSuggestion(\n config: MentionConfig,\n): Omit<SuggestionOptions<MentionItem>, 'editor'> {\n const { maxItems = 5, trigger = '@' } = config;\n\n return {\n char: trigger,\n\n items: ({ query }) => {\n const q = query.toLowerCase();\n return config.items\n .filter((item) => item.label.toLowerCase().includes(q))\n .slice(0, maxItems);\n },\n\n render: () => {\n let component: ReactRenderer<MentionListRef> | null = null;\n let popup: HTMLDivElement | null = null;\n let cleanupAutoUpdate: (() => void) | null = null;\n let getReferenceRect: (() => DOMRect | null) | null = null;\n\n // Floating-UI virtual element backed by Tiptap's clientRect.\n // We re-read it on every reposition so caret movement is tracked.\n const buildVirtualElement = () => ({\n getBoundingClientRect: () => {\n const rect = getReferenceRect?.();\n // Fallback to a zero-sized rect at origin if the editor is detached\n // (e.g. mid-teardown). Floating-UI tolerates this.\n return rect ?? new DOMRect(0, 0, 0, 0);\n },\n });\n\n const updatePosition = () => {\n if (!popup) return;\n const virtualEl = buildVirtualElement();\n void computePosition(virtualEl, popup, {\n placement: 'bottom-start',\n middleware: [\n offset(4),\n flip({ fallbackPlacements: ['top-start'] }),\n shift({ padding: 8 }),\n ],\n }).then(({ x, y }) => {\n if (!popup) return;\n // transform is more performant than top/left and avoids\n // sub-pixel layout thrash during scroll/resize.\n popup.style.transform = `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`;\n });\n };\n\n const teardown = () => {\n cleanupAutoUpdate?.();\n cleanupAutoUpdate = null;\n popup?.remove();\n popup = null;\n component?.destroy();\n component = null;\n getReferenceRect = null;\n };\n\n return {\n onStart: (props) => {\n component = new ReactRenderer(MentionList, {\n props: {\n items: props.items,\n command: (item: MentionItem) => {\n props.command({ id: item.id, label: item.label });\n },\n },\n editor: props.editor,\n });\n\n popup = document.createElement('div');\n // top/left at 0; actual position is applied via transform by computePosition.\n popup.style.cssText = 'position: absolute; top: 0; left: 0; z-index: 99999;';\n popup.appendChild(component.element);\n document.body.appendChild(popup);\n\n getReferenceRect = () => props.clientRect?.() ?? null;\n\n // autoUpdate handles scroll, resize, ancestor scroll/resize, layout shifts.\n // It calls updatePosition synchronously on registration too — no manual first call needed.\n const virtualEl = buildVirtualElement();\n cleanupAutoUpdate = autoUpdate(virtualEl, popup, updatePosition);\n },\n\n onUpdate: (props) => {\n component?.updateProps({\n items: props.items,\n command: (item: MentionItem) => {\n props.command({ id: item.id, label: item.label });\n },\n });\n\n // Refresh reference accessor so autoUpdate sees the new caret rect.\n getReferenceRect = () => props.clientRect?.() ?? null;\n updatePosition();\n },\n\n onKeyDown: (props) => {\n if (props.event.key === 'Escape') {\n teardown();\n return true;\n }\n return component?.ref?.onKeyDown(props.event as unknown as React.KeyboardEvent) ?? false;\n },\n\n onExit: () => {\n teardown();\n },\n };\n },\n };\n}\n","import type { MentionMarkdownRenderer } from './types';\n\n/**\n * Escape characters that have meaning in markdown link/inline contexts.\n * Conservative — covers the chars that would break `[text](url)` and\n * inline emphasis when a label contains them.\n */\nconst escapeMd = (s: string): string => s.replace(/([\\\\\\[\\]()_*~`])/g, '\\\\$1');\n\n/**\n * Built-in serializers for the `MentionConfig.renderMarkdown` callback.\n *\n * Pick one based on what consumes the markdown:\n *\n * - LLM / chat composer → `plainAt` (the default)\n * - Plain text export → `plainLabel`\n * - Web app with deep-link → `markdownLink(baseUrl)`\n * - Notion / Linear-style → `customUri(scheme, kind)`\n * - Slack-style id refs → `slackStyle`\n * - HTML-allowing renderer → `htmlSpan(className?)`\n *\n * Or pass a custom function — the type is just `(attrs) => string`.\n */\nexport const mentionPresets = {\n /** \"@Label\" — default, ideal for chat where LLMs read the text. */\n plainAt: (({ label, id }) => `@${label || id}`) as MentionMarkdownRenderer,\n\n /** \"Label\" — bare label, no @ prefix. */\n plainLabel: (({ label, id }) => label || id) as MentionMarkdownRenderer,\n\n /** \"[@Label](baseUrl/id)\" — clickable markdown link. */\n markdownLink: (baseUrl: string): MentionMarkdownRenderer =>\n ({ label, id }) =>\n `[@${escapeMd(label || id)}](${baseUrl}${encodeURIComponent(id)})`,\n\n /** \"@[Label](scheme://kind/id)\" — Notion / Linear-style custom URI. */\n customUri: (scheme: string, kind: string): MentionMarkdownRenderer =>\n ({ label, id }) =>\n `@[${escapeMd(label || id)}](${scheme}://${kind}/${encodeURIComponent(id)})`,\n\n /** \"<@id>\" — Slack-style id-only reference (label dropped — receivers resolve it). */\n slackStyle: (({ id }) => `<@${id}>`) as MentionMarkdownRenderer,\n\n /** Inline HTML span — for products that consume markdown with raw HTML allowed. */\n htmlSpan:\n (className = 'mention'): MentionMarkdownRenderer =>\n ({ label, id }) =>\n `<span class=\"${className}\" data-mention-id=\"${encodeURIComponent(id)}\">@${escapeMd(label || id)}</span>`,\n};\n","// SubmitOnEnter — Tiptap extension that hooks ProseMirror's keymap\n// before StarterKit's HardBreak so Enter consistently submits and\n// Shift+Enter inserts a newline (ChatGPT / Telegram behaviour).\n//\n// Why an extension and not a wrapper `onKeyDown` handler:\n//\n// Tiptap registers its keymaps inside the ProseMirror keymap\n// plugin, which runs in the ProseMirror dispatch pipeline. A React\n// `onKeyDown` / `onKeyDownCapture` on a wrapper div fires AFTER\n// ProseMirror has already committed the HardBreak transaction in\n// the same event tick — so calling `preventDefault()` there is too\n// late: the user sees a hard-break flash in, the React handler\n// then runs its preventDefault, and the next Enter submits.\n//\n// Registering the keybinding via `addKeyboardShortcuts` puts us in\n// the same keymap pipeline at a higher priority than StarterKit's\n// default Enter binding, so we intercept before HardBreak runs.\n//\n// The handler also respects IME composition and the mention popover\n// (Tiptap's suggestion plugin captures Enter when its popover is\n// open — we mirror that by checking `.markdown-mention-list` in the\n// DOM; same predicate the wrapper used).\n\nimport { Extension } from '@tiptap/core';\n\nexport interface SubmitOnEnterOptions {\n /** Fired when Enter is pressed without Shift, no IME composition,\n * and no mention popover open. Return `true` to consume the key\n * (default behaviour), `false` to let ProseMirror handle it (i.e.\n * fall back to HardBreak). */\n onSubmit: () => boolean | void;\n}\n\nexport const SubmitOnEnter = Extension.create<SubmitOnEnterOptions>({\n name: 'submitOnEnter',\n\n addOptions() {\n return {\n // Default no-op — explicit consumer must override. We never\n // intercept Enter unless an onSubmit is wired, so leaving the\n // extension installed with no handler is safe.\n onSubmit: () => false,\n };\n },\n\n addKeyboardShortcuts() {\n return {\n Enter: () => {\n // Mention suggestion popover owns Enter while open.\n // The suggestion plugin renders the list with this class\n // (see createMentionSuggestion.ts).\n if (typeof document !== 'undefined' && document.querySelector('.markdown-mention-list')) {\n return false;\n }\n const result = this.options.onSubmit();\n // Default: consume the key (true). Only let it fall through\n // to HardBreak if onSubmit explicitly returned false.\n return result !== false;\n },\n // Shift+Enter — always insert a newline. Tiptap's StarterKit\n // already binds this to HardBreak; we re-bind to `false` (not\n // handled) so the chain falls through cleanly even if other\n // extensions try to grab Shift+Enter.\n 'Shift-Enter': () => false,\n };\n },\n});\n","'use client';\n\nimport { useEditor, EditorContent, type Editor } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Mention from '@tiptap/extension-mention';\nimport { Markdown } from '@tiptap/markdown';\nimport type { AnyExtension } from '@tiptap/core';\nimport { useEffect, useRef, useMemo } from 'react';\nimport {\n Bold, Italic, Strikethrough, Heading1, Heading2, Heading3,\n List, ListOrdered, Quote, Minus, Code, type LucideIcon,\n} from 'lucide-react';\nimport { createMentionSuggestion } from './createMentionSuggestion';\nimport { mentionPresets } from './mentionPresets';\nimport { SubmitOnEnter } from './submitOnEnter';\nimport type { MentionAttrs, MentionConfig } from './types';\nimport './styles.css';\n\n// ── Helpers ──\n\ninterface MarkdownManager {\n serialize: (json: Record<string, unknown>) => string;\n}\n\nfunction getMarkdown(editor: Editor): string {\n const storage = editor.storage.markdown as { manager?: MarkdownManager } | undefined;\n if (!storage?.manager) return editor.getText();\n return storage.manager.serialize(editor.getJSON());\n}\n\nfunction extractMentionIds(editor: Editor): string[] {\n const ids: string[] = [];\n editor.state.doc.descendants((node) => {\n if (node.type.name === 'mention' && node.attrs.id) {\n ids.push(node.attrs.id as string);\n }\n });\n return [...new Set(ids)];\n}\n\n// ── Types ──\n\nexport interface MarkdownEditorProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n minHeight?: number;\n className?: string;\n disabled?: boolean;\n showToolbar?: boolean;\n /**\n * `@`-mention autocomplete config.\n *\n * IMPORTANT: Tiptap's `useEditor` initialises the editor exactly once.\n * The `Mention` extension is only registered when `mentions` is truthy\n * on the FIRST render — handing in a real config later (e.g. after an\n * async items fetch) silently does nothing, and typing `@` will not\n * open the popover.\n *\n * If you want mentions even with async-loaded items, pass\n * `{ items: [] }` from the very first render and update the array\n * when data arrives. Either keep the `MentionConfig` object identity\n * stable across renders and mutate `items` in place (the suggestion\n * plugin captures the config by closure and reads `items` on each\n * query), or accept that swapping the whole object reference is a\n * no-op for the live editor.\n */\n mentions?: MentionConfig;\n /** Called when mentioned IDs change */\n onMentionIdsChange?: (ids: string[]) => void;\n /**\n * Called when the user presses Enter (without Shift, no IME\n * composition, no mention popover open). When set, Enter submits\n * and Shift+Enter inserts a newline — ChatGPT / Telegram chat\n * behaviour. When omitted, Enter behaves as Tiptap default\n * (HardBreak).\n *\n * Implementation lives in `submitOnEnter.ts` — it's a Tiptap\n * keymap extension, NOT a React wrapper handler. Wrapper-level\n * onKeyDown fires AFTER ProseMirror's keymap commits HardBreak in\n * the same tick; routing through the extension lets us intercept\n * before HardBreak runs.\n *\n * Return value (optional): truthy / undefined = consume the key\n * (default). Return `false` from onSubmit to let Tiptap fall\n * through to HardBreak — useful for guards like \"don't submit an\n * empty draft\".\n */\n onSubmit?: () => boolean | void;\n}\n\n// ── Component ──\n\nexport function MarkdownEditor({\n value,\n onChange,\n placeholder = 'Write markdown...',\n minHeight = 120,\n className = '',\n disabled = false,\n showToolbar = true,\n mentions,\n onMentionIdsChange,\n onSubmit,\n}: MarkdownEditorProps) {\n // Keep the latest onSubmit in a ref so the Tiptap extension's\n // keymap closure always calls the freshest handler — Tiptap's\n // useEditor initialises extensions ONCE on first render. Without\n // the ref the extension would call a stale onSubmit (e.g. one\n // that references an outdated `value`).\n const onSubmitRef = useRef(onSubmit);\n onSubmitRef.current = onSubmit;\n const isExternalUpdate = useRef(false);\n\n // ── Dev-mode trap detector ──\n // Tiptap initialises the editor once with the extensions array from\n // first render. If `mentions` is undefined on mount and becomes\n // truthy later, the Mention extension is never installed and the\n // user-visible @-trigger silently does nothing. Catch this early so\n // future consumers don't spend hours debugging why @ does nothing.\n const initialMentionsDefinedRef = useRef<boolean>(mentions !== undefined);\n const warnedRef = useRef(false);\n if (\n process.env.NODE_ENV !== 'production' &&\n !initialMentionsDefinedRef.current &&\n mentions !== undefined &&\n !warnedRef.current\n ) {\n warnedRef.current = true;\n // eslint-disable-next-line no-console\n console.warn(\n '[MarkdownEditor] `mentions` flipped from undefined to a config ' +\n 'after mount. Tiptap only installs the Mention extension on first ' +\n 'render — the @-popover will NOT work for this editor instance. ' +\n 'Pass `{ items: [] }` from the very first render and mutate `.items` ' +\n 'in place instead.',\n );\n }\n\n const extensions = useMemo(() => {\n const exts: AnyExtension[] = [\n StarterKit.configure({ heading: { levels: [1, 2, 3] } }),\n Placeholder.configure({ placeholder }),\n Markdown,\n // SubmitOnEnter — when the consumer wired an onSubmit, intercept\n // Enter at the keymap level (before StarterKit's HardBreak).\n // The extension calls through `onSubmitRef.current` so handler\n // identity changes don't require an editor rebuild. See\n // submitOnEnter.ts for the keymap-vs-wrapper-handler rationale.\n SubmitOnEnter.configure({\n onSubmit: () => {\n const h = onSubmitRef.current;\n if (!h) return false; // no handler → let Tiptap insert HardBreak\n return h();\n },\n }),\n ];\n\n if (mentions) {\n // ── Why .extend() with renderMarkdown ──\n //\n // Tiptap's `Mention` extension ships a default markdown serializer\n // (via `createInlineMarkdownSpec`, see @tiptap/extension-mention)\n // that emits a shortcode like `[@ id=\"...\" label=\"...\"]`. That's\n // round-trippable but useless for most consumers: a chat composer\n // feeding an LLM wants `@<label>`, a deep-linking app wants a\n // markdown link, etc.\n //\n // `renderText` only affects `editor.getText()` and the rendered\n // node — it does NOT influence `@tiptap/markdown`'s serializer.\n // The serializer reads `renderMarkdown` off the extension config\n // (see MarkdownManager.registerExtension → getExtensionField).\n // Overriding it via `.extend({ renderMarkdown })` replaces the\n // shortcode output with whatever the consumer supplied (or the\n // `plainAt` default — see ./mentionPresets.ts).\n //\n // Renderer-choice capture: useEditor only initialises once, so the\n // chosen renderer is captured by closure on first render. This is\n // intentional — swapping renderers per render would mean tearing\n // the editor down anyway, which we don't do for any other prop.\n //\n // Round-trip note: we intentionally do NOT also override\n // `parseMarkdown` / `markdownTokenizer`. Once a mention is\n // serialized, parsing it back would need the original mention\n // items list to look up the id, which we don't have at parse time.\n // Mentions are write-only by design here — `setContent(value)`\n // after submit gets back a plain string, which is fine for the\n // chat use case.\n const renderMarkdown = mentions.renderMarkdown ?? mentionPresets.plainAt;\n exts.push(\n Mention.extend({\n renderMarkdown(node) {\n const raw = node.attrs as { label?: string | null; id?: string | null };\n const attrs: MentionAttrs = {\n id: raw?.id ?? '',\n label: raw?.label ?? '',\n };\n // Defensive: if both are empty (shouldn't happen for a real\n // mention node, but `setContent` of malformed data could),\n // emit nothing rather than a stray \"@\" or invalid link.\n if (!attrs.id && !attrs.label) return '';\n return renderMarkdown(attrs);\n },\n }).configure({\n HTMLAttributes: { class: 'markdown-mention' },\n suggestion: createMentionSuggestion(mentions),\n renderText: ({ node }) => `@${node.attrs.label}`,\n }),\n );\n }\n\n return exts;\n }, [placeholder, mentions]);\n\n const editor = useEditor({\n immediatelyRender: false,\n editable: !disabled,\n extensions,\n content: value,\n onUpdate: ({ editor }) => {\n if (isExternalUpdate.current) return;\n onChange(getMarkdown(editor));\n\n if (onMentionIdsChange) {\n onMentionIdsChange(extractMentionIds(editor));\n }\n },\n editorProps: {\n attributes: {\n class: 'markdown-editor-content focus:outline-none text-sm',\n style: `min-height: ${minHeight}px`,\n },\n },\n });\n\n useEffect(() => {\n if (!editor) return;\n const current = getMarkdown(editor);\n if (current !== value) {\n isExternalUpdate.current = true;\n editor.commands.setContent(value);\n isExternalUpdate.current = false;\n }\n }, [value, editor]);\n\n const wrapperClass = `markdown-editor rounded-md border border-input bg-background ${disabled ? 'opacity-60' : ''} ${className}`.trim();\n\n return (\n <div className={wrapperClass}>\n {showToolbar && editor && <MarkdownToolbar editor={editor} />}\n <div className=\"px-3 py-2\">\n <EditorContent editor={editor} />\n </div>\n </div>\n );\n}\n\n// ── Toolbar ──\n\ninterface ToolbarItem {\n icon: LucideIcon;\n action: () => void;\n active: boolean;\n title: string;\n}\n\nfunction MarkdownToolbar({ editor }: { editor: Editor }) {\n const items = useMemo<(ToolbarItem | null)[]>(() => [\n { icon: Bold, title: 'Bold', action: () => editor.chain().focus().toggleBold().run(), active: editor.isActive('bold') },\n { icon: Italic, title: 'Italic', action: () => editor.chain().focus().toggleItalic().run(), active: editor.isActive('italic') },\n { icon: Strikethrough, title: 'Strike', action: () => editor.chain().focus().toggleStrike().run(), active: editor.isActive('strike') },\n { icon: Code, title: 'Code', action: () => editor.chain().focus().toggleCode().run(), active: editor.isActive('code') },\n null,\n { icon: Heading1, title: 'H1', action: () => editor.chain().focus().toggleHeading({ level: 1 }).run(), active: editor.isActive('heading', { level: 1 }) },\n { icon: Heading2, title: 'H2', action: () => editor.chain().focus().toggleHeading({ level: 2 }).run(), active: editor.isActive('heading', { level: 2 }) },\n { icon: Heading3, title: 'H3', action: () => editor.chain().focus().toggleHeading({ level: 3 }).run(), active: editor.isActive('heading', { level: 3 }) },\n null,\n { icon: List, title: 'Bullet list', action: () => editor.chain().focus().toggleBulletList().run(), active: editor.isActive('bulletList') },\n { icon: ListOrdered, title: 'Ordered list', action: () => editor.chain().focus().toggleOrderedList().run(), active: editor.isActive('orderedList') },\n { icon: Quote, title: 'Quote', action: () => editor.chain().focus().toggleBlockquote().run(), active: editor.isActive('blockquote') },\n { icon: Minus, title: 'Divider', action: () => editor.chain().focus().setHorizontalRule().run(), active: false },\n ], [editor]);\n\n return (\n <div className=\"flex items-center gap-0.5 px-2 py-1.5 border-b border-border\">\n {items.map((item, i) => {\n if (!item) return <div key={i} className=\"w-px h-4 bg-border mx-1\" />;\n const Icon = item.icon;\n const btnClass = `markdown-toolbar-btn ${item.active ? 'active' : ''}`;\n return (\n <button key={i} type=\"button\" onClick={item.action} title={item.title} className={btnClass}>\n <Icon style={{ width: 14, height: 14 }} />\n </button>\n );\n })}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/lazy-wrapper.tsx","../src/tools/Map/lazy.tsx","../src/tools/Mermaid/lazy.tsx","../src/tools/PrettyCode/lazy.tsx","../src/tools/OpenapiViewer/lazy.tsx","../src/tools/JsonForm/lazy.tsx","../src/tools/LottiePlayer/lazy.tsx","../src/tools/AudioPlayer/lazy.tsx","../src/tools/VideoPlayer/lazy.tsx","../src/tools/JsonTree/lazy.tsx","../src/tools/ImageViewer/lazy.tsx","../src/tools/CronScheduler/lazy.tsx","../src/tools/Tree/lazy.tsx","../src/tools/Chat/lazy.tsx","../src/tools/Chat/core/transport/types.ts","../src/tools/Chat/core/transport/sse.ts","../src/tools/Chat/core/transport/http.ts","../src/tools/Chat/core/transport/mock.ts","../src/tools/Chat/core/transport/mappers/pydantic-ai.ts","../src/tools/Chat/core/transport/pydantic-ai-transport.ts","../src/tools/Chat/launcher/ChatFAB.tsx","../src/tools/Chat/launcher/ChatHeader.tsx","../src/tools/Chat/launcher/useChatPresence.ts","../src/tools/Chat/launcher/ChatDock.tsx","../src/tools/Chat/launcher/ChatHeaderActionButton.tsx","../src/tools/Chat/launcher/ChatHeaderModeToggle.tsx","../src/tools/Chat/launcher/ChatHeaderAudioToggle.tsx","../src/tools/Chat/hooks/useChatReset.ts","../src/tools/Chat/launcher/ChatHeaderResetButton.tsx","../src/tools/SpeechRecognition/core/languages-catalog.ts","../src/tools/SpeechRecognition/context/SpeechRecognitionProvider.tsx","../src/tools/SpeechRecognition/lazy.tsx","../src/tools/Chat/launcher/ChatHeaderLanguageButton.tsx","../src/tools/Chat/launcher/ChatGreeting.tsx","../src/tools/Chat/launcher/ChatUnreadPreview.tsx","../src/tools/Chat/launcher/ChatLauncher.tsx","../src/tools/Chat/hooks/useChatScroll.ts","../src/tools/Chat/hooks/useChatHistory.ts","../src/tools/Chat/hooks/useChatLightbox.ts","../src/tools/Chat/hooks/useVisitorFingerprint.ts","../src/tools/Chat/hooks/useChatDockPrefs.ts","../src/tools/Chat/hooks/useChatUnread.ts","../src/tools/Chat/core/audio/preferences.ts","../src/tools/Chat/core/payload-dispatch.ts","../src/tools/Chat/utils/collectImageAttachments.ts","../src/tools/Chat/components/AudioToggle.tsx","../src/tools/LottiePlayer/index.tsx","../src/tools/OpenapiViewer/index.tsx","../src/tools/CronScheduler/index.tsx","../src/tools/CodeEditor/workers/setup.ts","../src/tools/CodeEditor/hooks/useMonaco.ts","../src/tools/CodeEditor/hooks/useEditorTheme.ts","../src/tools/CodeEditor/components/Editor.tsx","../src/tools/CodeEditor/components/DiffEditor.tsx","../src/tools/CodeEditor/lib/languages.ts","../src/tools/CodeEditor/context/EditorProvider.tsx","../src/tools/CodeEditor/hooks/useEditor.ts","../src/tools/CodeEditor/hooks/useLanguage.ts","../src/tools/MarkdownEditor/MentionList.tsx","../src/tools/MarkdownEditor/createMentionSuggestion.ts","../src/tools/MarkdownEditor/mentionPresets.ts","../src/tools/MarkdownEditor/submitOnEnter.ts","../src/tools/MarkdownEditor/MarkdownEditor.tsx"],"names":["useAppT","jsx","cn","__name","jsxs","Suspense","React","PlaygroundProvider","__publicField","LIMITS","createId","mapStatusToCode","useIsPhone","useIsTabletOrBelow","offset","Bot","Fragment","Button","X","useState","useRef","useEffect","useIsMobile","Portal","forwardRef","ChatHeaderActionButton","PanelRightClose","PanelRightOpen","VolumeX","Volume2","useCallback","RotateCcw","createContext","useSpeechPrefs","useResolvedLanguage","useMemo","Combobox","Flag","Globe","anchorStyle","originClass","Avatar","AvatarImage","AvatarFallback","useHotkey","useLocalStorage","useChatContext","createAudioPrefsStore","useChatContextOptional","lazy","LoadingFallback","useResolvedTheme","s","Editor","useImperativeHandle","useContext","computePosition","flip","shift","ReactRenderer","autoUpdate","Extension","MarkdownEditor","StarterKit","Placeholder","Markdown","Mention","useEditor","editor","EditorContent","Bold","Italic","Strikethrough","Code","Heading1","Heading2","Heading3","List","ListOrdered","Quote","Minus"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Suspense, type ReactNode, type ComponentType } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { useAppT } from '@djangocfg/i18n';\n\n// ============================================================================\n// Loading Fallback Components\n// ============================================================================\n\nexport interface LoadingFallbackProps {\n /** Minimum height of the loading container */\n minHeight?: string | number;\n /** Show loading text */\n showText?: boolean;\n /** Custom loading text */\n text?: string;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Spinner - Simple spinning loader\n */\nexport function Spinner({ className }: { className?: string }) {\n const t = useAppT();\n const loadingLabel = t('ui.states.loading');\n\n return (\n <div\n className={cn(\n 'inline-block h-8 w-8 animate-spin rounded-full',\n 'border-4 border-solid border-current border-r-transparent',\n 'align-[-0.125em] motion-reduce:animate-[spin_1.5s_linear_infinite]',\n className\n )}\n role=\"status\"\n aria-label={loadingLabel}\n />\n );\n}\n\n/**\n * LoadingFallback - Default loading state for lazy components\n */\nexport function LoadingFallback({\n minHeight = 200,\n showText = true,\n text,\n className,\n}: LoadingFallbackProps) {\n const t = useAppT();\n const loadingText = text ?? t('ui.form.loading');\n const height = typeof minHeight === 'number' ? `${minHeight}px` : minHeight;\n\n return (\n <div\n className={cn(\n 'flex items-center justify-center bg-muted/30 rounded-lg',\n className\n )}\n style={{ minHeight: height }}\n >\n <div className=\"text-center\">\n <Spinner className=\"text-primary\" />\n {showText && (\n <p className=\"mt-3 text-sm text-muted-foreground\">{loadingText}</p>\n )}\n </div>\n </div>\n );\n}\n\n/**\n * CardLoadingFallback - Loading state styled as a card\n */\nexport function CardLoadingFallback({\n title,\n description,\n minHeight = 200,\n className,\n}: {\n title?: string;\n description?: string;\n minHeight?: string | number;\n className?: string;\n}) {\n const t = useAppT();\n const cardTitle = title ?? t('ui.states.loading');\n const height = typeof minHeight === 'number' ? `${minHeight}px` : minHeight;\n\n return (\n <div\n className={cn(\n 'relative bg-card rounded-lg border border-border overflow-hidden',\n className\n )}\n >\n <div className=\"p-4 border-b border-border bg-muted/50\">\n <h6 className=\"text-sm font-semibold text-foreground\">{cardTitle}</h6>\n {description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{description}</p>\n )}\n </div>\n <div className=\"p-4\">\n <div\n className=\"flex justify-center items-center\"\n style={{ minHeight: height }}\n >\n <Spinner className=\"text-primary\" />\n </div>\n </div>\n </div>\n );\n}\n\n/**\n * MapLoadingFallback - Loading state for map components\n */\nexport function MapLoadingFallback({\n minHeight = 400,\n className,\n}: {\n minHeight?: string | number;\n className?: string;\n}) {\n const t = useAppT();\n const loadingText = t('ui.form.loading');\n const height = typeof minHeight === 'number' ? `${minHeight}px` : minHeight;\n\n return (\n <div\n className={cn(\n 'relative bg-muted/50 rounded-lg overflow-hidden',\n 'flex items-center justify-center',\n className\n )}\n style={{ minHeight: height }}\n >\n <div className=\"text-center\">\n <div className=\"relative\">\n <Spinner className=\"text-primary h-10 w-10\" />\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <svg\n className=\"h-5 w-5 text-muted-foreground\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n </div>\n </div>\n <p className=\"mt-3 text-sm text-muted-foreground\">{loadingText}</p>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Wrapper\n// ============================================================================\n\nexport interface LazyWrapperProps {\n children: ReactNode;\n /** Custom fallback component */\n fallback?: ReactNode;\n /** Use card-style fallback */\n card?: boolean;\n /** Card title (when card=true) */\n cardTitle?: string;\n /** Card description (when card=true) */\n cardDescription?: string;\n /** Minimum height for fallback */\n minHeight?: string | number;\n /** Additional CSS classes for fallback */\n className?: string;\n}\n\n/**\n * LazyWrapper - Suspense wrapper with configurable fallbacks\n *\n * @example\n * // Basic usage\n * <LazyWrapper>\n * <LazyComponent />\n * </LazyWrapper>\n *\n * @example\n * // Card style fallback\n * <LazyWrapper card cardTitle=\"Diagram\" minHeight={300}>\n * <Mermaid chart={...} />\n * </LazyWrapper>\n *\n * @example\n * // Custom fallback\n * <LazyWrapper fallback={<MyCustomLoader />}>\n * <HeavyComponent />\n * </LazyWrapper>\n */\nexport function LazyWrapper({\n children,\n fallback,\n card = false,\n cardTitle,\n cardDescription,\n minHeight = 200,\n className,\n}: LazyWrapperProps) {\n const defaultFallback = card ? (\n <CardLoadingFallback\n title={cardTitle}\n description={cardDescription}\n minHeight={minHeight}\n className={className}\n />\n ) : (\n <LoadingFallback minHeight={minHeight} className={className} />\n );\n\n return <Suspense fallback={fallback ?? defaultFallback}>{children}</Suspense>;\n}\n\n// ============================================================================\n// Lazy Component Factory\n// ============================================================================\n\nexport interface CreateLazyComponentOptions<P> {\n /** Loading fallback component */\n fallback?: ReactNode | ((props: P) => ReactNode);\n /** Display name for the component */\n displayName?: string;\n}\n\n/**\n * createLazyComponent - Factory for creating lazy-loaded components\n *\n * @example\n * const LazyMermaid = createLazyComponent(\n * () => import('./Mermaid.client'),\n * {\n * displayName: 'Mermaid',\n * fallback: <CardLoadingFallback title=\"Diagram\" />,\n * }\n * );\n */\nexport function createLazyComponent<P extends object>(\n loader: () => Promise<{ default: ComponentType<P> }>,\n options: CreateLazyComponentOptions<P> = {}\n): ComponentType<P> {\n const LazyComponent = React.lazy(loader);\n\n const WrappedComponent = (props: P) => {\n const fallback =\n typeof options.fallback === 'function'\n ? options.fallback(props)\n : options.fallback ?? <LoadingFallback />;\n\n return (\n <Suspense fallback={fallback}>\n <LazyComponent {...props} />\n </Suspense>\n );\n };\n\n WrappedComponent.displayName = options.displayName ?? 'LazyComponent';\n\n return WrappedComponent;\n}\n","'use client';\n\n/**\n * Lazy-loaded Map Components\n *\n * Heavy MapLibre GL (~800KB) is loaded only when components are rendered.\n * Use these for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { MapContainer } from '@djangocfg/ui-tools/map'\n */\n\nimport * as React from 'react';\nimport { createLazyComponent, MapLoadingFallback } from '../../components';\n\n// ============================================================================\n// Lazy Components\n// ============================================================================\n\n/**\n * LazyMapContainer - Lazy-loaded map container\n *\n * Automatically shows loading state while MapLibre GL loads (~800KB)\n */\nexport const LazyMapContainer = createLazyComponent(\n () => import('./components/MapContainer').then((mod) => ({ default: mod.MapContainer })),\n {\n displayName: 'LazyMapContainer',\n fallback: <MapLoadingFallback minHeight={400} />,\n }\n);\n\n/**\n * LazyMapView - Lazy-loaded map view (alias for MapContainer)\n */\nexport const LazyMapView = createLazyComponent(\n () => import('./components/MapContainer').then((mod) => ({ default: mod.MapView })),\n {\n displayName: 'LazyMapView',\n fallback: <MapLoadingFallback minHeight={400} />,\n }\n);\n\n// ============================================================================\n// Re-export types for convenience\n// ============================================================================\n\nexport type {\n MapContainerProps,\n} from './components';\n\nexport type {\n MapViewport,\n MapStyleKey,\n MarkerData,\n} from './types';\n","'use client';\n\n/**\n * Lazy-loaded Mermaid Component\n *\n * Heavy Mermaid library (~800KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import Mermaid from '@djangocfg/ui-tools/mermaid'\n */\n\nimport { createLazyComponent, CardLoadingFallback } from '../../components';\nimport type { MermaidProps } from './index';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type { MermaidProps };\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyMermaid - Lazy-loaded Mermaid diagram renderer\n *\n * Automatically shows loading state while Mermaid loads (~800KB)\n */\nexport const LazyMermaid = createLazyComponent<MermaidProps>(\n () => import('./Mermaid.client'),\n {\n displayName: 'LazyMermaid',\n fallback: (\n <CardLoadingFallback\n title=\"Diagram\"\n description=\"Loading...\"\n minHeight={200}\n />\n ),\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded PrettyCode Component\n *\n * Heavy Prism library (~500KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import PrettyCode from '@djangocfg/ui-tools/pretty-code'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { Language } from 'prism-react-renderer';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PrettyCodeProps {\n data: string | object;\n language: Language;\n className?: string;\n mode?: 'dark' | 'light';\n inline?: boolean;\n customBg?: string;\n isCompact?: boolean;\n scrollIsolation?: boolean;\n maxLines?: number;\n /** ``'card'`` (default) ships the full chrome. ``'plain'`` is\n * chrome-less — for embedding inside another scroll container. */\n variant?: 'card' | 'plain';\n}\n\nexport type { Language };\n\n// ============================================================================\n// Code Loading Fallback\n// ============================================================================\n\nfunction CodeLoadingFallback() {\n return (\n <div className=\"relative rounded-sm border border-border overflow-hidden bg-muted dark:bg-zinc-900\">\n <div className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"animate-pulse h-4 w-4 rounded-full bg-muted-foreground/20\" />\n <span className=\"text-xs text-muted-foreground\">Loading code...</span>\n </div>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyPrettyCode - Lazy-loaded code syntax highlighter\n *\n * Automatically shows loading state while Prism loads (~500KB)\n */\nexport const LazyPrettyCode = createLazyComponent<PrettyCodeProps>(\n () => import('./PrettyCode.client'),\n {\n displayName: 'LazyPrettyCode',\n fallback: <CodeLoadingFallback />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded OpenapiViewer Component\n *\n * Heavy OpenAPI viewer (~400KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import OpenapiViewer from '@djangocfg/ui-tools/openapi'\n */\n\nimport * as React from 'react';\nimport { createLazyComponent } from '../../components';\nimport { PlaygroundProvider } from './context/PlaygroundContext';\nimport type { ApiKey, PlaygroundConfig, SchemaSource } from './types';\n\nexport interface PlaygroundProps {\n config: PlaygroundConfig;\n}\n\nexport type { ApiKey, PlaygroundConfig, SchemaSource };\n\nfunction OpenapiLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center min-h-[400px] bg-muted/30 rounded-lg\">\n <div className=\"text-center\">\n <div className=\"inline-block h-8 w-8 animate-spin rounded-full border-4 border-solid border-primary border-r-transparent\" />\n <p className=\"mt-3 text-sm text-muted-foreground\">Loading API Playground...</p>\n </div>\n </div>\n );\n}\n\nconst LazyDocsLayout = createLazyComponent(\n () => import('./components/DocsLayout').then((mod) => ({ default: mod.DocsLayout })),\n {\n displayName: 'LazyDocsLayout',\n fallback: <OpenapiLoadingFallback />,\n }\n);\n\nexport const LazyOpenapiViewer: React.FC<PlaygroundProps> = ({ config }) => {\n return (\n <PlaygroundProvider config={config}>\n <LazyDocsLayout />\n </PlaygroundProvider>\n );\n};\n\nLazyOpenapiViewer.displayName = 'LazyOpenapiViewer';\n","'use client';\n\n/**\n * Lazy-loaded JsonForm Component\n *\n * Heavy JSON Schema Form (~300KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { JsonSchemaForm } from '@djangocfg/ui-tools/json-form'\n */\n\nimport { createLazyComponent, CardLoadingFallback } from '../../components';\nimport type { JsonSchemaFormProps } from './types';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type { JsonSchemaFormProps };\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyJsonSchemaForm - Lazy-loaded JSON Schema form generator\n *\n * Automatically shows loading state while RJSF loads (~300KB)\n */\nexport const LazyJsonSchemaForm = createLazyComponent<JsonSchemaFormProps>(\n () => import('./JsonSchemaForm').then((mod) => ({ default: mod.JsonSchemaForm })),\n {\n displayName: 'LazyJsonSchemaForm',\n fallback: (\n <CardLoadingFallback\n title=\"Form\"\n description=\"Loading form schema...\"\n minHeight={200}\n />\n ),\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded LottiePlayer Component\n *\n * Lottie library (~200KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { LottiePlayer } from '@djangocfg/ui-tools/lottie'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { LottiePlayerProps } from './types';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type {\n LottiePlayerProps,\n LottieSize,\n LottieSpeed,\n LottieDirection,\n} from './types';\n\n// ============================================================================\n// Lottie Loading Fallback\n// ============================================================================\n\nfunction LottieLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-muted border-t-primary\" />\n <span className=\"text-sm text-muted-foreground\">Loading animation...</span>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyLottiePlayer - Lazy-loaded Lottie animation player\n *\n * Automatically shows loading state while Lottie loads (~200KB)\n */\nexport const LazyLottiePlayer = createLazyComponent<LottiePlayerProps>(\n () => import('./LottiePlayer.client').then((mod) => ({ default: mod.LottiePlayer })),\n {\n displayName: 'LazyLottiePlayer',\n fallback: <LottieLoadingFallback />,\n }\n);\n","'use client';\n\nimport { createLazyComponent } from '../../components';\nimport type { PlayerProps } from './types';\n\nexport const LazyPlayer = createLazyComponent<PlayerProps>(\n () => import('./Player').then((mod) => ({ default: mod.Player })),\n {\n displayName: 'LazyAudioPlayer',\n fallback: (\n <div className=\"rounded-lg border border-border/60 bg-card px-4 py-6 text-sm text-muted-foreground\">\n Loading audio player…\n </div>\n ),\n },\n);\n","'use client';\n\n/**\n * Lazy-loaded VideoPlayer Component\n *\n * Heavy Vidstack (~150KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { VideoPlayer } from '@djangocfg/ui-tools/video'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { VideoPlayerProps } from './types';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type { VideoPlayerProps };\n\n// ============================================================================\n// Video Loading Fallback\n// ============================================================================\n\nfunction VideoLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center bg-black/90 rounded-lg aspect-video\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"relative\">\n <div className=\"h-10 w-10 animate-spin rounded-full border-4 border-white/20 border-t-white\" />\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <svg\n className=\"h-5 w-5 text-white/60\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n </div>\n </div>\n <span className=\"text-sm text-white/60\">Loading video player...</span>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyVideoPlayer - Lazy-loaded professional video player\n *\n * Automatically shows loading state while Vidstack loads (~150KB)\n */\nexport const LazyVideoPlayer = createLazyComponent<VideoPlayerProps>(\n () => import('./components').then((mod) => ({ default: mod.VideoPlayer })),\n {\n displayName: 'LazyVideoPlayer',\n fallback: <VideoLoadingFallback />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded JsonTree Component\n *\n * JsonTree (~100KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import JsonTree from '@djangocfg/ui-tools/json-tree'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { JsonTreeConfig, JsonTreeMode } from './index';\nimport type { CommonExternalProps } from 'react-json-tree';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface JsonTreeProps {\n title?: string;\n data: unknown;\n /**\n * Display mode:\n * - \"full\" (default): With toolbar and border\n * - \"compact\": No toolbar, subtle styling\n * - \"inline\": Minimal, no border\n */\n mode?: JsonTreeMode;\n config?: JsonTreeConfig;\n jsonTreeProps?: Partial<CommonExternalProps>;\n}\n\nexport type { JsonTreeConfig, JsonTreeMode };\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyJsonTree - Lazy-loaded JSON visualization tree\n *\n * Automatically shows loading state while JsonTree loads (~100KB)\n *\n * @example\n * // Full mode (with toolbar)\n * <LazyJsonTree data={obj} mode=\"full\" />\n *\n * // Compact mode (no toolbar)\n * <LazyJsonTree data={obj} mode=\"compact\" />\n *\n * // Inline mode (minimal, for embedding)\n * <LazyJsonTree data={obj} mode=\"inline\" />\n */\nexport const LazyJsonTree = createLazyComponent<JsonTreeProps>(\n () => import('./index'),\n {\n displayName: 'LazyJsonTree',\n fallback: <LoadingFallback minHeight={100} text=\"Loading JSON viewer...\" />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded ImageViewer Component\n *\n * ImageViewer (~50KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { ImageViewer } from '@djangocfg/ui-tools/image-viewer'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { ImageViewerProps } from './types';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type { ImageViewerProps };\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyImageViewer - Lazy-loaded image viewer with zoom/pan/rotate\n *\n * Automatically shows loading state while ImageViewer loads (~50KB)\n */\nexport const LazyImageViewer = createLazyComponent<ImageViewerProps>(\n () => import('./components').then((mod) => ({ default: mod.ImageViewer })),\n {\n displayName: 'LazyImageViewer',\n fallback: <LoadingFallback minHeight={200} text=\"Loading image viewer...\" />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded CronScheduler Component\n *\n * CronScheduler (~15KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * @example\n * import { LazyCronScheduler } from '@djangocfg/ui-tools';\n *\n * <LazyCronScheduler\n * value={cron}\n * onChange={setCron}\n * />\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { CronSchedulerProps } from './types';\n\n// Re-export types\nexport type {\n CronSchedulerProps,\n ScheduleType,\n WeekDay,\n MonthDay,\n CronSchedulerState,\n} from './types';\n\n/**\n * LazyCronScheduler - Lazy-loaded cron expression builder\n *\n * Automatically shows loading state while CronScheduler loads (~15KB).\n * Uses createLazyComponent factory for optimal code-splitting.\n *\n * @example\n * // Basic usage\n * <LazyCronScheduler\n * value=\"0 9 * * *\"\n * onChange={handleChange}\n * />\n *\n * @example\n * // With all options\n * <LazyCronScheduler\n * value={cron}\n * onChange={setCron}\n * defaultType=\"weekly\"\n * showPreview\n * showCronExpression\n * allowCopy\n * timeFormat=\"24h\"\n * />\n */\nexport const LazyCronScheduler = createLazyComponent<CronSchedulerProps>(\n () => import('./CronScheduler.client'),\n {\n displayName: 'LazyCronScheduler',\n fallback: (\n <LoadingFallback\n minHeight={120}\n showText={false}\n className=\"rounded-lg\"\n />\n ),\n }\n);\n","'use client';\n\nimport { createLazyComponent, LoadingFallback } from '../../components/lazy-wrapper';\nimport type { TreeRootProps } from './types';\n\nexport const LazyTree = createLazyComponent<TreeRootProps<unknown>>(\n () => import('./TreeRoot'),\n {\n displayName: 'LazyTree',\n fallback: <LoadingFallback minHeight={200} text=\"Loading tree…\" />,\n },\n);\n\nexport type { TreeRootProps };\n","'use client';\n\nimport { createLazyComponent, LoadingFallback } from '../../components/lazy-wrapper';\nimport type { ChatRootProps } from './components/ChatRoot';\n\nexport const LazyChat = createLazyComponent<ChatRootProps>(\n () => import('./components/ChatRoot').then((m) => ({ default: m.ChatRoot })),\n {\n displayName: 'LazyChat',\n fallback: <LoadingFallback minHeight={320} text=\"Loading chat…\" />,\n },\n);\n\nexport type { ChatRootProps };\n","/**\n * Transport surface re-export. Lives in core so transport implementations\n * never need to reach into the public types module.\n */\n\nexport type {\n ChatTransport,\n ChatStreamEvent,\n CreateSessionOptions,\n SessionInfo,\n HistoryPage,\n StreamOptions,\n SendOptions,\n} from '../../types';\n\nexport class TransportError extends Error {\n code: string;\n\n constructor(message: string, code = 'transport_error') {\n super(message);\n this.name = 'TransportError';\n this.code = code;\n }\n}\n","/**\n * Server-Sent Events parser as an AsyncGenerator.\n *\n * Yields parsed events from a `Response` body. Handles the split-read case\n * where `event:` and `data:` arrive in separate TCP packets. Skips malformed\n * JSON gracefully. Honors AbortSignal (caller passes one to fetch).\n */\n\nimport type { ChatStreamEvent } from '../../types';\nimport { LIMITS } from '../../config';\n\ninterface RawEvent {\n event?: string;\n data?: string;\n}\n\nexport interface ParseSSEOptions {\n signal?: AbortSignal;\n /** Map a raw SSE event to zero, one, or many `ChatStreamEvent`s.\n * Default: parse `data` as JSON and assume the JSON shape already\n * matches `ChatStreamEvent`. */\n map?: (raw: RawEvent) => ChatStreamEvent | ChatStreamEvent[] | null;\n idleTimeoutMs?: number;\n}\n\nconst DEFAULT_MAP = (raw: RawEvent): ChatStreamEvent | null => {\n if (!raw.data) return null;\n try {\n const parsed = JSON.parse(raw.data) as ChatStreamEvent;\n if (raw.event && !('type' in parsed)) {\n return { ...(parsed as object), type: raw.event } as ChatStreamEvent;\n }\n return parsed;\n } catch {\n return null;\n }\n};\n\nexport async function* parseSSE(\n response: Response,\n options: ParseSSEOptions = {},\n): AsyncGenerator<ChatStreamEvent, void, void> {\n if (!response.body) {\n throw new Error('SSE response has no body');\n }\n\n const map = options.map ?? DEFAULT_MAP;\n const idleMs = options.idleTimeoutMs ?? LIMITS.sseIdleMs;\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let lastChunkAt = Date.now();\n\n const idleCheck = () => {\n if (Date.now() - lastChunkAt > idleMs) {\n throw new Error(`SSE idle timeout (${idleMs}ms)`);\n }\n };\n\n try {\n while (true) {\n if (options.signal?.aborted) {\n return;\n }\n const { value, done } = await reader.read();\n if (done) break;\n\n lastChunkAt = Date.now();\n buffer += decoder.decode(value, { stream: true });\n\n // Split on blank line which delimits SSE events.\n let separator = buffer.indexOf('\\n\\n');\n while (separator !== -1) {\n const rawBlock = buffer.slice(0, separator);\n buffer = buffer.slice(separator + 2);\n\n const raw = parseEventBlock(rawBlock);\n const evt = map(raw);\n if (evt) {\n if (Array.isArray(evt)) {\n for (const e of evt) yield e;\n } else {\n yield evt;\n }\n }\n\n separator = buffer.indexOf('\\n\\n');\n }\n\n idleCheck();\n }\n\n // Flush any trailing partial event.\n if (buffer.trim()) {\n const raw = parseEventBlock(buffer);\n const evt = map(raw);\n if (evt) {\n if (Array.isArray(evt)) {\n for (const e of evt) yield e;\n } else {\n yield evt;\n }\n }\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n /* ignore */\n }\n }\n}\n\nfunction parseEventBlock(block: string): RawEvent {\n const out: RawEvent = {};\n const lines = block.split(/\\r?\\n/);\n const dataLines: string[] = [];\n for (const line of lines) {\n if (!line || line.startsWith(':')) continue;\n const colon = line.indexOf(':');\n if (colon === -1) continue;\n const field = line.slice(0, colon).trim();\n const value = line.slice(colon + 1).replace(/^ /, '');\n if (field === 'event') out.event = value;\n else if (field === 'data') dataLines.push(value);\n }\n if (dataLines.length) out.data = dataLines.join('\\n');\n return out;\n}\n","/**\n * HTTP + SSE transport. Default implementation for web hosts.\n *\n * Backend contract (see @dev/@refactoring7-chat/06-integration.md):\n * POST /sessions → SessionInfo (JSON)\n * GET /sessions/:id/history?cursor= → HistoryPage (JSON)\n * POST /sessions/:id/messages → SSE stream of ChatStreamEvent\n * POST /sessions/:id/messages/buffered → ChatMessage (JSON, fallback)\n * DELETE /sessions/:id → 204\n */\n\nimport type {\n ChatMessage,\n ChatStreamEvent,\n ChatTransport,\n CreateSessionOptions,\n HistoryPage,\n SendOptions,\n SessionInfo,\n StreamOptions,\n} from '../../types';\nimport { TransportError } from './types';\nimport { parseSSE } from './sse';\n\nexport interface HttpTransportConfig {\n /** Base URL without trailing slash, e.g. '/api/chat' or 'https://api.example.com/v1/chat'. */\n baseUrl: string;\n /** Optional slug appended/forwarded as project identifier. */\n slug?: string;\n /** Returns headers applied to every request — e.g. Authorization. */\n getAuthHeader?: () => Record<string, string> | Promise<Record<string, string>>;\n /** Default fetch timeout (per non-streaming request). */\n timeoutMs?: number;\n /** Override fetch implementation (useful for tests or custom retry layers). */\n fetchImpl?: typeof fetch;\n}\n\nconst DEFAULT_TIMEOUT = 20_000;\n\nasync function jsonOrThrow<T>(res: Response, label: string): Promise<T> {\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new TransportError(\n `${label} failed (${res.status}): ${text || res.statusText}`,\n mapStatusToCode(res.status),\n );\n }\n try {\n return (await res.json()) as T;\n } catch {\n throw new TransportError(`${label} returned invalid JSON`, 'invalid_response');\n }\n}\n\nfunction mapStatusToCode(status: number): string {\n if (status === 401) return 'unauthorized';\n if (status === 403) return 'forbidden';\n if (status === 404) return 'not_found';\n if (status === 429) return 'rate_limited';\n if (status >= 500) return 'server_error';\n return 'http_error';\n}\n\nfunction withTimeout(signal: AbortSignal | undefined, timeoutMs: number): AbortSignal {\n const ctrl = new AbortController();\n const onAbort = () => ctrl.abort();\n signal?.addEventListener('abort', onAbort, { once: true });\n setTimeout(() => ctrl.abort(), timeoutMs);\n return ctrl.signal;\n}\n\nexport function createHttpTransport(config: HttpTransportConfig): ChatTransport {\n const fetchImpl = config.fetchImpl ?? fetch;\n const timeout = config.timeoutMs ?? DEFAULT_TIMEOUT;\n const base = config.baseUrl.replace(/\\/$/, '');\n\n async function buildHeaders(extra?: Record<string, string>): Promise<Record<string, string>> {\n const auth = (await config.getAuthHeader?.()) ?? {};\n return {\n 'Content-Type': 'application/json',\n ...auth,\n ...(extra ?? {}),\n };\n }\n\n return {\n async createSession(opts?: CreateSessionOptions): Promise<SessionInfo> {\n const res = await fetchImpl(`${base}/sessions`, {\n method: 'POST',\n headers: await buildHeaders(),\n body: JSON.stringify({ slug: config.slug, metadata: opts?.metadata ?? {} }),\n signal: withTimeout(undefined, timeout),\n });\n return jsonOrThrow<SessionInfo>(res, 'createSession');\n },\n\n async loadHistory(sessionId, cursor, limit): Promise<HistoryPage> {\n const params = new URLSearchParams();\n if (cursor) params.set('cursor', cursor);\n if (limit) params.set('limit', String(limit));\n const url = `${base}/sessions/${encodeURIComponent(sessionId)}/history${\n params.toString() ? `?${params.toString()}` : ''\n }`;\n const res = await fetchImpl(url, {\n method: 'GET',\n headers: await buildHeaders(),\n signal: withTimeout(undefined, timeout),\n });\n return jsonOrThrow<HistoryPage>(res, 'loadHistory');\n },\n\n async *stream(\n sessionId: string,\n content: string,\n options: StreamOptions,\n ): AsyncGenerator<ChatStreamEvent, void, void> {\n const url = `${base}/sessions/${encodeURIComponent(sessionId)}/messages`;\n const res = await fetchImpl(url, {\n method: 'POST',\n headers: await buildHeaders({ Accept: 'text/event-stream' }),\n body: JSON.stringify({\n content,\n attachments: options.attachments ?? [],\n metadata: options.metadata ?? {},\n }),\n signal: options.signal,\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new TransportError(\n `stream failed (${res.status}): ${text || res.statusText}`,\n mapStatusToCode(res.status),\n );\n }\n\n yield* parseSSE(res, { signal: options.signal });\n },\n\n async send(sessionId, content, options?: SendOptions): Promise<ChatMessage> {\n const url = `${base}/sessions/${encodeURIComponent(sessionId)}/messages/buffered`;\n const res = await fetchImpl(url, {\n method: 'POST',\n headers: await buildHeaders(),\n body: JSON.stringify({\n content,\n attachments: options?.attachments ?? [],\n metadata: options?.metadata ?? {},\n }),\n signal: options?.signal ?? withTimeout(undefined, timeout),\n });\n return jsonOrThrow<ChatMessage>(res, 'send');\n },\n\n async closeSession(sessionId: string): Promise<void> {\n const url = `${base}/sessions/${encodeURIComponent(sessionId)}`;\n const res = await fetchImpl(url, {\n method: 'DELETE',\n headers: await buildHeaders(),\n signal: withTimeout(undefined, timeout),\n });\n if (!res.ok && res.status !== 404) {\n throw new TransportError(`closeSession failed (${res.status})`, mapStatusToCode(res.status));\n }\n },\n };\n}\n","/**\n * In-memory chat transport for stories and tests. Replays scripted replies.\n */\n\nimport type {\n ChatMessage,\n ChatStreamEvent,\n ChatTransport,\n CreateSessionOptions,\n HistoryPage,\n SendOptions,\n SessionInfo,\n StreamOptions,\n} from '../../types';\nimport { createId } from '../ids';\n\nexport interface MockTransportOptions {\n /** Each entry is the assistant's reply for one user turn. Strings are split\n * into chunks; arrays are taken as the exact event sequence (after a\n * prepended `message_start` and before a synthetic `message_end`). */\n replies?: Array<string | ChatStreamEvent[]>;\n latencyMs?: number;\n /** Initial history returned by `createSession`. */\n initialMessages?: ChatMessage[];\n shouldFail?: (attempt: number) => boolean;\n}\n\nconst DEFAULT_REPLY = 'Hi there!';\n\nfunction splitForStream(text: string, parts = 4): string[] {\n if (!text) return [];\n const chunkSize = Math.max(1, Math.ceil(text.length / parts));\n const out: string[] = [];\n for (let i = 0; i < text.length; i += chunkSize) {\n out.push(text.slice(i, i + chunkSize));\n }\n return out;\n}\n\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nexport function createMockTransport(opts: MockTransportOptions = {}): ChatTransport {\n const replies = opts.replies?.length ? opts.replies : [DEFAULT_REPLY];\n const latency = opts.latencyMs ?? 30;\n const history: ChatMessage[] = [...(opts.initialMessages ?? [])];\n let turn = 0;\n let attempt = 0;\n\n return {\n async createSession(_opts?: CreateSessionOptions): Promise<SessionInfo> {\n await sleep(latency);\n return {\n sessionId: createId('s'),\n messages: history.length ? [...history] : undefined,\n hasMore: false,\n cursor: null,\n resumed: history.length > 0,\n };\n },\n\n async loadHistory(_sid, _cursor, _limit): Promise<HistoryPage> {\n await sleep(latency);\n return { messages: [], hasMore: false, nextCursor: null };\n },\n\n async *stream(\n _sid: string,\n content: string,\n options: StreamOptions,\n ): AsyncGenerator<ChatStreamEvent, void, void> {\n attempt += 1;\n if (opts.shouldFail?.(attempt)) {\n throw new Error('mock transport scripted failure');\n }\n\n // Record the user message for any subsequent loadHistory.\n history.push({\n id: createId('u'),\n role: 'user',\n content,\n createdAt: Date.now(),\n });\n\n const messageId = createId('a');\n yield { type: 'message_start', messageId, sessionId: _sid };\n\n const reply = replies[turn % replies.length];\n turn += 1;\n\n if (typeof reply === 'string') {\n for (const piece of splitForStream(reply)) {\n if (options.signal.aborted) return;\n await sleep(latency);\n yield { type: 'chunk', delta: piece };\n }\n yield { type: 'message_end', tokensIn: content.length, tokensOut: reply.length };\n } else {\n for (const ev of reply) {\n if (options.signal.aborted) return;\n await sleep(latency);\n yield ev;\n }\n // If the script didn't end the message itself, do it for them.\n const lastType = reply[reply.length - 1]?.type;\n if (lastType !== 'message_end' && lastType !== 'error') {\n yield { type: 'message_end' };\n }\n }\n },\n\n async send(_sid, content, _options?: SendOptions): Promise<ChatMessage> {\n await sleep(latency);\n const reply = replies[turn % replies.length];\n turn += 1;\n const text =\n typeof reply === 'string'\n ? reply\n : reply\n .filter((e) => e.type === 'chunk')\n .map((e) => (e as { delta: string }).delta)\n .join('');\n return {\n id: createId('a'),\n role: 'assistant',\n content: text || DEFAULT_REPLY,\n createdAt: Date.now(),\n };\n },\n\n async closeSession(_sid: string): Promise<void> {\n // no-op\n },\n };\n}\n","/**\n * Pydantic-AI SSE event mapper.\n *\n * Translates the event shape emitted by pydantic-AI–style Django backends\n * (text_delta / tool_call / tool_result / done / error / approval_required)\n * into the canonical `ChatStreamEvent` stream consumed by the Chat reducer.\n *\n * Backends that don't expose a stable `tool_call_id` are supported via a\n * per-stream FIFO queue keyed by tool name. The earlier \"Map<name, toolId>\"\n * approach lost the first toolId when a tool was invoked twice in one turn\n * (e.g. `list_tasks` for search and again for confirmation) — using a queue\n * keeps each call/result pair correctly matched.\n */\n\nimport type { ChatStreamEvent } from '../../../types';\nimport type { ParseSSEOptions } from '../sse';\n\nexport interface PydanticAIEvent {\n type:\n | 'text_delta'\n | 'tool_call'\n | 'tool_result'\n | 'done'\n | 'error'\n | 'approval_required';\n delta?: string;\n tool?: string;\n args?: unknown;\n result?: unknown;\n /**\n * Structured frontend payload — present on `tool_result` when the tool has\n * a `result_schema`. The LLM sees only `result` (compact text); the\n * frontend uses `data` to render rich UI (e.g. vehicle cards).\n */\n data?: unknown;\n total_tokens?: number;\n error?: string;\n tool_call_id?: string;\n session_id?: string;\n}\n\n/** Per-stream FIFO queue keyed by tool name. Created via `createToolIdQueue`. */\nexport interface ToolIdQueue {\n /** Allocate a new toolId for a `tool_call` event and enqueue it under `name`. */\n push(name: string): string;\n /** Pop the oldest toolId for `name` (or return an orphan marker if none). */\n shift(name: string): string;\n /** Reset all queues (e.g. on stream close). */\n clear(): void;\n}\n\nexport function createToolIdQueue(): ToolIdQueue {\n const queues = new Map<string, string[]>();\n let counter = 0;\n return {\n push(name) {\n const id = `${name}-${counter++}-${Date.now()}`;\n const q = queues.get(name) ?? [];\n q.push(id);\n queues.set(name, q);\n return id;\n },\n shift(name) {\n return queues.get(name)?.shift() ?? `${name}-orphan-${counter++}`;\n },\n clear() {\n queues.clear();\n },\n };\n}\n\n/**\n * Translate a single pydantic-AI event into zero or more `ChatStreamEvent`s.\n * Pass a `ToolIdQueue` shared across the lifetime of one stream so that\n * `tool_call` / `tool_result` pairs match correctly.\n */\nexport function* mapPydanticAIEvent(\n ev: PydanticAIEvent,\n toolIds: ToolIdQueue,\n): Generator<ChatStreamEvent> {\n switch (ev.type) {\n case 'text_delta':\n if (ev.delta) yield { type: 'chunk', delta: ev.delta };\n return;\n\n case 'tool_call': {\n const name = ev.tool ?? 'tool';\n const toolId = toolIds.push(name);\n yield { type: 'tool_call_start', toolId, name, input: ev.args };\n return;\n }\n\n case 'tool_result': {\n const name = ev.tool ?? 'tool';\n const toolId = toolIds.shift(name);\n // `data` is the structured JSON for the frontend; `result` is the LLM-facing text.\n const output: unknown = ev.data !== undefined ? ev.data : ev.result;\n yield { type: 'tool_call_end', toolId, output, status: 'success' };\n return;\n }\n\n case 'done':\n yield { type: 'message_end', tokensOut: ev.total_tokens };\n return;\n\n case 'error':\n yield { type: 'error', code: 'backend_error', message: ev.error ?? 'Unknown error' };\n return;\n\n case 'approval_required':\n // Surfaced via a separate side-channel (see ResumableTransport in\n // host packages). Not translated to a ChatStreamEvent here.\n return;\n }\n}\n\n/**\n * Convenience factory: returns a `ParseSSEOptions['map']` callback that\n * decodes raw SSE frames as `PydanticAIEvent` JSON and yields zero or\n * more `ChatStreamEvent`s through `mapPydanticAIEvent`.\n *\n * Allocates an internal `ToolIdQueue` — call this once per stream.\n */\nexport function createPydanticAISSEMap(): NonNullable<ParseSSEOptions['map']> {\n const toolIds = createToolIdQueue();\n return (raw) => {\n if (!raw.data) return null;\n let parsed: PydanticAIEvent;\n try {\n parsed = JSON.parse(raw.data) as PydanticAIEvent;\n } catch {\n return null;\n }\n const out: ChatStreamEvent[] = [];\n for (const evt of mapPydanticAIEvent(parsed, toolIds)) {\n out.push(evt);\n }\n if (out.length === 0) return null;\n if (out.length === 1) return out[0]!;\n return out;\n };\n}\n","/**\n * High-level transport factory for pydantic-AI–style backends.\n *\n * Composes:\n * - `parseSSE` for spec-compliant SSE framing (multi-line `data:`, comments, idle timeout).\n * - `createPydanticAISSEMap` for normalizing pydantic-AI events into `ChatStreamEvent`.\n *\n * Use when your backend speaks the canonical pydantic-AI stream shape\n * (`text_delta` / `tool_call` / `tool_result` / `done` / `error`).\n * URL building, auth headers, history loading, and optional session\n * bootstrapping are caller responsibilities — pass them in.\n */\n\nimport type {\n ChatMessage,\n ChatStreamEvent,\n ChatTransport,\n CreateSessionOptions,\n HistoryPage,\n SendOptions,\n SessionInfo,\n StreamOptions,\n} from '../../types';\nimport { TransportError } from './types';\nimport { parseSSE } from './sse';\nimport {\n createPydanticAISSEMap,\n mapPydanticAIEvent,\n createToolIdQueue,\n type PydanticAIEvent,\n} from './mappers';\n\nexport interface PydanticAIChatTransportOpts {\n /**\n * Build the SSE stream URL for a user message turn.\n * @example (sessionId, message) => `${base}/stream?session_id=${sessionId}&message=${encodeURIComponent(message)}`\n */\n buildStreamUrl: (sessionId: string, message: string) => string | URL;\n\n /** Optional history loader. If omitted, `loadHistory` returns an empty page. */\n loadHistory?: (sessionId: string, cursor?: string | null) => Promise<HistoryPage>;\n\n /**\n * Optional session bootstrap. Called from `createSession`. Useful for\n * backends that need a `POST /sessions` round-trip or want to pre-seed\n * history.\n */\n bootstrapSession?: (opts?: CreateSessionOptions) => Promise<SessionInfo>;\n\n /** Optional session teardown. */\n closeSession?: (sessionId: string) => Promise<void>;\n\n /**\n * Optional non-streaming send (for hosts that need a buffered fallback,\n * e.g. when the user disables streaming). Defaults to throwing — most\n * hosts only use streaming.\n */\n send?: (\n sessionId: string,\n content: string,\n options?: SendOptions,\n ) => Promise<ChatMessage>;\n\n /** Request headers (Authorization, content-type, etc.). */\n buildHeaders?: () => HeadersInit | Promise<HeadersInit>;\n\n /** Override fetch (tests, retry layers). */\n fetchImpl?: typeof fetch;\n\n /**\n * HTTP method for the stream request. Defaults to `'POST'` with\n * `{ content, attachments, metadata }` JSON body. Set to `'GET'` if\n * your backend embeds the message in the URL via `buildStreamUrl`.\n */\n streamMethod?: 'GET' | 'POST';\n\n /** Idle timeout for the SSE connection, in ms. Forwarded to `parseSSE`. */\n idleTimeoutMs?: number;\n\n /**\n * Side-channel for events that don't translate to `ChatStreamEvent`\n * (e.g. `approval_required` — surfaces interactive prompts outside the\n * normal message stream). Called synchronously while parsing the SSE\n * frame; mutate caller-owned state, don't `await` long work here.\n */\n onPydanticEvent?: (event: PydanticAIEvent) => void;\n}\n\nconst DEFAULT_SESSION_ID = 'default';\n\nfunction mapStatusToCode(status: number): string {\n if (status === 401 || status === 403) return 'unauthorized';\n if (status === 404) return 'not_found';\n if (status === 408) return 'timeout';\n if (status === 429) return 'rate_limited';\n if (status >= 500) return 'server_error';\n return 'error';\n}\n\nexport function createPydanticAIChatTransport(\n opts: PydanticAIChatTransportOpts,\n): ChatTransport {\n const fetchImpl = opts.fetchImpl ?? fetch.bind(globalThis);\n const streamMethod = opts.streamMethod ?? 'POST';\n\n async function resolvedHeaders(extra?: Record<string, string>): Promise<Headers> {\n const base = opts.buildHeaders ? await opts.buildHeaders() : {};\n const headers = new Headers(base as HeadersInit);\n if (extra) {\n for (const [k, v] of Object.entries(extra)) headers.set(k, v);\n }\n return headers;\n }\n\n return {\n async createSession(createOpts) {\n if (opts.bootstrapSession) return opts.bootstrapSession(createOpts);\n return { sessionId: DEFAULT_SESSION_ID };\n },\n\n async loadHistory(sessionId, cursor) {\n if (opts.loadHistory) return opts.loadHistory(sessionId, cursor);\n return { messages: [], hasMore: false, nextCursor: null };\n },\n\n async *stream(\n sessionId: string,\n content: string,\n options: StreamOptions,\n ): AsyncGenerator<ChatStreamEvent, void, void> {\n const url = opts.buildStreamUrl(sessionId, content);\n\n const headers = await resolvedHeaders({ Accept: 'text/event-stream' });\n const init: RequestInit = {\n method: streamMethod,\n headers,\n signal: options.signal,\n };\n if (streamMethod === 'POST') {\n headers.set('Content-Type', 'application/json');\n init.body = JSON.stringify({\n content,\n attachments: options.attachments ?? [],\n metadata: options.metadata ?? {},\n });\n }\n\n const res = await fetchImpl(typeof url === 'string' ? url : url.toString(), init);\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new TransportError(\n `stream failed (${res.status}): ${text || res.statusText}`,\n mapStatusToCode(res.status),\n );\n }\n\n const sideChannel = opts.onPydanticEvent;\n if (!sideChannel) {\n yield* parseSSE(res, {\n signal: options.signal,\n idleTimeoutMs: opts.idleTimeoutMs,\n map: createPydanticAISSEMap(),\n });\n return;\n }\n\n // Side-channel mode: parse the raw pydantic event, fire callback,\n // then forward through the canonical mapper.\n const toolIds = createToolIdQueue();\n yield* parseSSE(res, {\n signal: options.signal,\n idleTimeoutMs: opts.idleTimeoutMs,\n map: (raw) => {\n if (!raw.data) return null;\n let parsed: PydanticAIEvent;\n try {\n parsed = JSON.parse(raw.data) as PydanticAIEvent;\n } catch {\n return null;\n }\n try {\n sideChannel(parsed);\n } catch {\n // Side-channel handler must not break the stream.\n }\n const out: ChatStreamEvent[] = [];\n for (const evt of mapPydanticAIEvent(parsed, toolIds)) out.push(evt);\n if (out.length === 0) return null;\n if (out.length === 1) return out[0]!;\n return out;\n },\n });\n },\n\n async send(sessionId, content, sendOpts) {\n if (opts.send) return opts.send(sessionId, content, sendOpts);\n throw new TransportError(\n 'Buffered send is not supported by this transport',\n 'unsupported',\n );\n },\n\n async closeSession(sessionId) {\n if (opts.closeSession) await opts.closeSession(sessionId);\n },\n };\n}\n","'use client';\n\nimport { Bot } from 'lucide-react';\nimport type { CSSProperties, ReactNode } from 'react';\n\nimport { useIsPhone, useIsTabletOrBelow } from '@djangocfg/ui-core/hooks';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nexport type ChatFABPosition =\n | 'bottom-right'\n | 'bottom-left'\n | 'top-right'\n | 'top-left';\n\nexport type ChatFABVariant = 'simple' | 'animated' | 'glass';\nexport type ChatFABSize = 'sm' | 'md' | 'lg' | 'responsive';\n\nexport interface ChatFABProps {\n /** Click handler — typically toggles a `ChatDock`. */\n onClick: () => void;\n /** Accessible label. */\n ariaLabel?: string;\n /** Icon inside the FAB. Defaults to a bot glyph. */\n icon?: ReactNode;\n /** Visual style. @default 'simple' */\n variant?: ChatFABVariant;\n /** Button size. @default 'md' */\n size?: ChatFABSize;\n /** Fixed-screen position. @default 'bottom-right' */\n position?: ChatFABPosition;\n /** Pixel offset from screen edges. @default 24 */\n offset?: number;\n /** z-index for the button. @default 9999 */\n zIndex?: number;\n /** Show a small attention dot (unread / new). */\n pulse?: boolean;\n /**\n * Numeric badge — unread count. Numbers > 9 render as \"9+\".\n * Overrides `pulse` when both set.\n */\n badge?: number;\n /** Hover tooltip text. Shows next to the FAB on hover/focus. */\n tooltip?: string;\n /**\n * Render in-place (no fixed positioning) so the FAB sits inline in the\n * normal document flow. Useful for stories, screenshots, and previews\n * inside a contained playground panel. @default false\n */\n inline?: boolean;\n /** Override classes on the button itself. */\n className?: string;\n /** Extra style on the button (caller-controlled overrides). */\n style?: CSSProperties;\n}\n\ntype ChatFABFixedSize = Exclude<ChatFABSize, 'responsive'>;\n\nconst SIZE_PX: Record<ChatFABFixedSize, number> = { sm: 44, md: 56, lg: 64 };\nconst ICON_PX: Record<ChatFABFixedSize, number> = { sm: 18, md: 22, lg: 26 };\n\n/**\n * Resolve `size='responsive'` to a concrete fixed size based on the\n * viewport. Phone → `sm`, tablet → `md`, desktop → `lg`. `inline`\n * previews always collapse to `md` so stories stay stable.\n */\nfunction useEffectiveFABSize(size: ChatFABSize, inline: boolean): ChatFABFixedSize {\n const isPhone = useIsPhone();\n const isBelowDesktop = useIsTabletOrBelow();\n if (size !== 'responsive') return size;\n if (inline) return 'md';\n if (isPhone) return 'sm';\n if (isBelowDesktop) return 'md';\n return 'lg';\n}\n\nfunction positionStyle(position: ChatFABPosition, offset: number): CSSProperties {\n const [vert, horiz] = position.split('-') as ['bottom' | 'top', 'right' | 'left'];\n return { [vert]: offset, [horiz]: offset } as CSSProperties;\n}\n\nfunction tooltipSideClasses(position: ChatFABPosition): string {\n // Tooltip sits opposite-horizontal to the FAB so it doesn't run off-screen.\n return position.endsWith('right')\n ? 'right-full mr-3 origin-right'\n : 'left-full ml-3 origin-left';\n}\n\nfunction Badge({ value }: { value: number }) {\n const display = value > 9 ? '9+' : String(value);\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n 'absolute -right-1 -top-1 inline-flex min-w-[18px] h-[18px] items-center justify-center',\n 'rounded-full bg-destructive px-1 text-[10px] font-semibold leading-none text-destructive-foreground',\n 'ring-2 ring-background',\n )}\n >\n {display}\n </span>\n );\n}\n\nfunction PulseDot() {\n return (\n <span aria-hidden=\"true\" className=\"absolute right-1 top-1\">\n <span className=\"relative inline-flex h-2.5 w-2.5\">\n <span className=\"absolute inset-0 rounded-full bg-destructive opacity-75 animate-ping\" />\n <span className=\"relative inline-flex h-2.5 w-2.5 rounded-full bg-destructive ring-2 ring-background\" />\n </span>\n </span>\n );\n}\n\nfunction Tooltip({ text, side }: { text: string; side: string }) {\n return (\n <span\n role=\"tooltip\"\n className={cn(\n 'pointer-events-none absolute top-1/2 -translate-y-1/2 whitespace-nowrap',\n 'rounded-md bg-popover px-2.5 py-1 text-xs font-medium text-popover-foreground shadow-md',\n 'border border-border opacity-0 scale-95 transition-all duration-150',\n 'group-hover:opacity-100 group-hover:scale-100',\n 'group-focus-within:opacity-100 group-focus-within:scale-100',\n side,\n )}\n >\n {text}\n </span>\n );\n}\n\n/**\n * Floating action button for opening a chat dock. Pure presentation — owns\n * no state. Wire it to whatever toggles your dock open.\n *\n * For the common \"FAB + dock + hotkey\" composition, use `<ChatLauncher>` —\n * this primitive is only useful when you need custom triggering.\n */\nexport function ChatFAB({\n onClick,\n ariaLabel = 'Open chat',\n icon,\n variant = 'simple',\n size = 'responsive',\n position = 'bottom-right',\n offset = 24,\n zIndex = 9999,\n pulse = false,\n badge,\n tooltip,\n inline = false,\n className,\n style,\n}: ChatFABProps) {\n const effectiveSize = useEffectiveFABSize(size, inline);\n const px = SIZE_PX[effectiveSize];\n const iconPx = ICON_PX[effectiveSize];\n const renderedIcon = icon ?? <Bot size={iconPx} />;\n\n const baseButton = cn(\n 'relative grid place-items-center rounded-full focus:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'transition-transform hover:scale-105',\n );\n\n return (\n <div\n className={cn('group', inline ? 'relative inline-flex' : 'fixed')}\n style={\n inline\n ? undefined\n : { ...positionStyle(position, offset), zIndex }\n }\n >\n {variant === 'animated' && (\n <AnimatedFAB\n ariaLabel={ariaLabel}\n onClick={onClick}\n size={px}\n className={className}\n style={style}\n >\n {renderedIcon}\n </AnimatedFAB>\n )}\n\n {variant === 'glass' && (\n <button\n type=\"button\"\n aria-label={ariaLabel}\n onClick={onClick}\n className={cn(\n baseButton,\n 'border border-border/40 bg-background/60 text-foreground shadow-lg backdrop-blur-xl',\n 'hover:bg-background/80',\n className,\n )}\n style={{ width: px, height: px, ...style }}\n >\n {renderedIcon}\n {badge !== undefined ? <Badge value={badge} /> : pulse ? <PulseDot /> : null}\n </button>\n )}\n\n {variant === 'simple' && (\n <button\n type=\"button\"\n aria-label={ariaLabel}\n onClick={onClick}\n className={cn(\n baseButton,\n 'bg-primary text-primary-foreground hover:bg-primary/90 shadow-2xl',\n className,\n )}\n style={{ width: px, height: px, ...style }}\n >\n {renderedIcon}\n {badge !== undefined ? <Badge value={badge} /> : pulse ? <PulseDot /> : null}\n </button>\n )}\n\n {tooltip && <Tooltip text={tooltip} side={tooltipSideClasses(position)} />}\n </div>\n );\n}\n\n// ── Animated variant ──────────────────────────────────────────────────────\n// Orbital gradient ring + glow + entrance bounce. Self-contained CSS via\n// inline <style>, scoped by a unique class name per instance to avoid\n// collisions when multiple FABs mount.\n\ninterface AnimatedFABProps {\n ariaLabel: string;\n onClick: () => void;\n size: number;\n className?: string;\n style?: CSSProperties;\n children: ReactNode;\n}\n\nfunction AnimatedFAB({ ariaLabel, onClick, size, className, style, children }: AnimatedFABProps) {\n return (\n <>\n <style>{ANIMATED_CSS}</style>\n <div\n className={cn('cmdop-fab-anim', className)}\n style={{ width: size, height: size, ...style }}\n >\n <div className=\"cmdop-fab-anim-glow\">\n <div className=\"cmdop-fab-anim-wrap\">\n <div className=\"cmdop-fab-anim-grad cmdop-fab-anim-grad-1\" />\n <div className=\"cmdop-fab-anim-grad cmdop-fab-anim-grad-2\" />\n <div className=\"cmdop-fab-anim-inner\" />\n <button\n type=\"button\"\n aria-label={ariaLabel}\n onClick={onClick}\n className=\"cmdop-fab-anim-btn\"\n >\n <span className=\"cmdop-fab-anim-icon\">{children}</span>\n </button>\n </div>\n </div>\n </div>\n </>\n );\n}\n\nconst ANIMATED_CSS = `\n.cmdop-fab-anim {\n position: relative;\n pointer-events: auto;\n}\n.cmdop-fab-anim-glow {\n width: 100%; height: 100%;\n border-radius: 50%;\n overflow: hidden;\n animation:\n cmdop-fab-entrance 0.6s cubic-bezier(0.34, 1.45, 0.64, 1) forwards,\n cmdop-fab-glow-shift 8s ease-in-out 0.6s infinite;\n}\n.cmdop-fab-anim-wrap {\n position: relative; width: 100%; height: 100%;\n border-radius: 50%; overflow: hidden;\n}\n.cmdop-fab-anim-grad { position: absolute; inset: 0; border-radius: 50%; }\n.cmdop-fab-anim-grad-1 {\n background: conic-gradient(\n from 0deg,\n #fbbf24 0%, rgba(251,191,36,0) 15%,\n rgba(168,85,247,0) 20%, #a855f7 35%, rgba(168,85,247,0) 50%,\n rgba(20,184,166,0) 55%, #14b8a6 70%, rgba(20,184,166,0) 85%,\n rgba(236,72,153,0) 88%, #ec4899 97%, #fbbf24 100%\n );\n animation: cmdop-fab-rotate 7s linear infinite;\n filter: blur(1px); opacity: 0.95;\n}\n.cmdop-fab-anim-grad-2 {\n inset: 1px;\n background: conic-gradient(\n from 180deg,\n #a855f7 0%, rgba(168,85,247,0) 20%,\n rgba(20,184,166,0) 30%, #14b8a6 50%, rgba(20,184,166,0) 70%,\n rgba(251,191,36,0) 75%, #fbbf24 95%, #a855f7 100%\n );\n animation: cmdop-fab-rotate-rev 9s linear infinite;\n filter: blur(0.75px); opacity: 0.7;\n}\n.cmdop-fab-anim-inner {\n position: absolute; inset: 3px; border-radius: 50%;\n background: rgba(10, 10, 10, 0.65);\n backdrop-filter: blur(12px) saturate(1.8);\n -webkit-backdrop-filter: blur(12px) saturate(1.8);\n animation: cmdop-fab-inner-glow 5s ease-in-out infinite;\n}\n.cmdop-fab-anim-btn {\n position: absolute; inset: 2px;\n border-radius: 50%; border: none; background: transparent;\n cursor: pointer; display: flex; align-items: center; justify-content: center;\n transition: transform 0.2s;\n}\n.cmdop-fab-anim-btn:hover { transform: scale(1.06); }\n.cmdop-fab-anim-icon {\n color: #fbbf24; display: flex;\n filter: drop-shadow(0 0 6px rgba(251,191,36,0.8));\n animation: cmdop-fab-icon-pulse 2.5s ease-in-out infinite;\n}\n@keyframes cmdop-fab-rotate { to { transform: rotate(360deg); } }\n@keyframes cmdop-fab-rotate-rev { to { transform: rotate(-360deg); } }\n@keyframes cmdop-fab-entrance {\n 0% { transform: scale(0); }\n 50% { transform: scale(1.08); }\n 70% { transform: scale(0.98); }\n 100% { transform: scale(1); }\n}\n@keyframes cmdop-fab-glow-shift {\n 0%, 100% { box-shadow: 0 0 20px rgba(251,191,36,0.5), 0 0 40px rgba(168,85,247,0.3); }\n 33% { box-shadow: 0 0 20px rgba(168,85,247,0.5), 0 0 40px rgba(20,184,166,0.3); }\n 66% { box-shadow: 0 0 20px rgba(20,184,166,0.5), 0 0 40px rgba(236,72,153,0.3); }\n}\n@keyframes cmdop-fab-icon-pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.85; transform: scale(1.15); }\n}\n@keyframes cmdop-fab-inner-glow {\n 0%, 100% { box-shadow: inset 0 0 20px rgba(251,191,36,0.25), inset 0 0 40px rgba(168,85,247,0.15); }\n 50% { box-shadow: inset 0 0 25px rgba(168,85,247,0.3), inset 0 0 45px rgba(20,184,166,0.2); }\n}\n`;\n","'use client';\n\nimport { Bot, X } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport { Button } from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nexport interface ChatHeaderProps {\n /** Window title text. */\n title?: ReactNode;\n /** Icon next to the title. Defaults to a bot glyph. */\n icon?: ReactNode;\n /**\n * Action slot — appears to the right of the title, before the close button.\n * Use for reset / settings / minimize / etc. Compose with `ChatHeaderActionButton`.\n */\n actions?: ReactNode;\n /** Show the close (×) button. @default true */\n showClose?: boolean;\n /** Close click handler. */\n onClose?: () => void;\n /** ARIA label for the close button. @default 'Close' */\n closeLabel?: string;\n /** Replace the close button entirely (rare — most hosts want the default). */\n closeSlot?: ReactNode;\n /** Extra classes on the `<header>` element. */\n className?: string;\n}\n\n/**\n * Standalone chat header — title + icon + action slot + close button.\n *\n * Used by `<ChatDock>` automatically, but can be rendered standalone when\n * the host owns the chat container (e.g. embedded inline in a page).\n */\nexport function ChatHeader({\n title,\n icon,\n actions,\n showClose = true,\n onClose,\n closeLabel = 'Close',\n closeSlot,\n className,\n}: ChatHeaderProps) {\n return (\n <header\n className={cn(\n 'border-border bg-muted/30 flex shrink-0 items-center justify-between border-b px-4 py-2.5',\n className,\n )}\n >\n <div className=\"flex min-w-0 items-center gap-2 text-sm font-semibold\">\n {icon ?? <Bot className=\"text-primary h-4 w-4 shrink-0\" />}\n <span className=\"truncate\">{title}</span>\n </div>\n\n <div className=\"flex items-center gap-0.5\">\n {actions}\n {closeSlot ??\n (showClose && onClose && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onClose}\n aria-label={closeLabel}\n className=\"-mr-1 h-7 w-7 p-0\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n ))}\n </div>\n </header>\n );\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\n\nexport type ChatPresencePhase = 'hidden' | 'entering' | 'visible' | 'leaving';\n\n/**\n * Presence state machine for floating popovers.\n *\n * Drives a four-phase lifecycle so enter/leave CSS transitions actually fire:\n *\n * hidden → entering (mount, transition class starts) → visible\n * visible → leaving (transition runs) → hidden (unmount)\n *\n * Mounting in `entering` and ticking to `visible` on the next paint is what\n * lets transition classes animate. Without it the element appears already\n * at its final state and CSS transitions never observe a change.\n *\n * @param open - controlled open state\n * @param exitDurationMs - how long the leave transition runs; should match CSS\n */\nexport function useChatPresence(open: boolean, exitDurationMs = 200): ChatPresencePhase {\n const [phase, setPhase] = useState<ChatPresencePhase>('hidden');\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (timerRef.current) clearTimeout(timerRef.current);\n\n if (open) {\n setPhase('entering');\n // One paint later: switch to 'visible' so the CSS transition runs.\n timerRef.current = setTimeout(() => setPhase('visible'), 16);\n } else {\n setPhase('leaving');\n timerRef.current = setTimeout(() => setPhase('hidden'), exitDurationMs);\n }\n\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, [open, exitDurationMs]);\n\n return phase;\n}\n","'use client';\n\nimport { useEffect } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\n\nimport { Portal } from '@djangocfg/ui-core/components';\nimport { useIsMobile, useIsTabletOrBelow } from '@djangocfg/ui-core/hooks';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { ChatHeader } from './ChatHeader';\nimport { useChatPresence } from './useChatPresence';\nimport type { ChatFABPosition } from './ChatFAB';\n\nexport type ChatDockMode = 'popover' | 'side';\nexport type ChatDockSide = 'left' | 'right';\n\nexport interface ChatDockProps {\n /** Controlled open state. */\n open: boolean;\n /** Called when the user clicks the close button. */\n onClose: () => void;\n /** Dock contents (typically a `<Chat>` component). */\n children: ReactNode;\n /**\n * Visual mode.\n * - `popover` (default): floating card anchored to a corner, fixed size, FAB-style.\n * - `side`: docked panel pinned to the left/right edge, full viewport height.\n */\n mode?: ChatDockMode;\n /** Side for `mode='side'`. @default 'right' */\n side?: ChatDockSide;\n /** Header title text. */\n title?: ReactNode;\n /** Header icon. Defaults to a bot glyph. */\n icon?: ReactNode;\n /**\n * Header actions slot (right side, before the close button).\n * Use `ChatHeaderActionButton` to keep visual consistency.\n */\n headerActions?: ReactNode;\n /** Hide the header entirely (you render your own inside `children`). */\n hideHeader?: boolean;\n /** ARIA label for the close button. @default 'Close' */\n closeLabel?: string;\n /** Dock width in px. Clamped to viewport. @default 480 (popover) / 420 (side) */\n width?: number;\n /** Dock height in px. Only used in `popover` mode. @default 720 */\n height?: number;\n /** Which screen corner to dock to in `popover` mode. @default 'bottom-right' */\n position?: ChatFABPosition;\n /** Offset from screen edges in px (popover only). @default 24 / 96 */\n offset?: { horizontal?: number; vertical?: number };\n /** Transition duration in ms — should match CSS animation. @default 200 */\n exitDurationMs?: number;\n /** z-index. @default 10000 */\n zIndex?: number;\n /** Accessible dialog label. */\n ariaLabel?: string;\n /** Extra classes on the dock container. */\n className?: string;\n /**\n * Take over the full viewport on mobile (< 768px). Applies to both modes.\n * @default true\n */\n mobileFullscreen?: boolean;\n /**\n * Render in-place (not in `document.body` via a portal). Useful for stories,\n * screenshots, or wrapping the dock inside a custom container. @default false\n */\n disablePortal?: boolean;\n /**\n * Drop fixed positioning entirely — the dock renders as a normal flow\n * element sized by `width`/`height`. Combine with `disablePortal` for\n * stories/previews where the dock should sit inside the panel instead\n * of attaching to the viewport. @default false\n */\n inline?: boolean;\n /**\n * In `mode='side'`, reserve space on the document body so page content\n * isn't covered by the dock. Sets `padding-{side}` on `<body>` while\n * the dock is open and exposes the width via the `--chat-dock-reserve`\n * CSS variable for custom layouts. @default true (when mode='side')\n */\n reserveBodySpace?: boolean;\n}\n\nfunction dockPositionStyle(\n position: ChatFABPosition,\n horizontal: number,\n vertical: number,\n): CSSProperties {\n const [vert, horiz] = position.split('-') as ['bottom' | 'top', 'right' | 'left'];\n return { [vert]: vertical, [horiz]: horizontal } as CSSProperties;\n}\n\n/**\n * Fixed-position chat surface. Two modes:\n *\n * - `popover` — floating card anchored to a corner. Companion to `<ChatFAB>`.\n * - `side` — full-height panel pinned to the left/right edge. App-shell style.\n *\n * Renders only when `open` is true (plus the leave-transition tail). Uses\n * `useChatPresence` for the four-phase mount/animate/unmount cycle.\n */\nexport function ChatDock({\n open,\n onClose,\n children,\n mode = 'popover',\n side = 'right',\n title = 'Chat',\n icon,\n headerActions,\n hideHeader = false,\n closeLabel,\n width,\n height = 720,\n position = 'bottom-right',\n offset,\n exitDurationMs = 200,\n zIndex = 10000,\n ariaLabel,\n className,\n mobileFullscreen = true,\n disablePortal = false,\n inline = false,\n reserveBodySpace,\n}: ChatDockProps) {\n const phase = useChatPresence(open, exitDurationMs);\n const isMobile = useIsMobile();\n // Side mode is desktop-only — narrow viewports fall back to popover so\n // we never cover 33% of a phone/tablet with a chat panel.\n const isBelowDesktop = useIsTabletOrBelow();\n const effectiveMode: ChatDockMode =\n mode === 'side' && !isBelowDesktop ? 'side' : 'popover';\n const fullscreen = mobileFullscreen && isMobile;\n\n // Reserve body padding for side mode so page content stays visible\n // next to the dock. Auto-on when mode='side' unless explicitly disabled.\n const wantsReserve =\n !inline && !fullscreen && effectiveMode === 'side' && (reserveBodySpace ?? true);\n const resolvedSideWidth = width ?? 420;\n useEffect(() => {\n if (!wantsReserve || phase === 'hidden') return;\n const body = document.body;\n if (!body) return;\n const cssVar = `${resolvedSideWidth}px`;\n const padKey = side === 'right' ? 'paddingRight' : 'paddingLeft';\n const prevPad = body.style[padKey as 'paddingRight' | 'paddingLeft'];\n const prevVar = body.style.getPropertyValue('--chat-dock-reserve');\n body.style[padKey as 'paddingRight' | 'paddingLeft'] = cssVar;\n body.style.setProperty('--chat-dock-reserve', cssVar);\n return () => {\n body.style[padKey as 'paddingRight' | 'paddingLeft'] = prevPad;\n if (prevVar) body.style.setProperty('--chat-dock-reserve', prevVar);\n else body.style.removeProperty('--chat-dock-reserve');\n };\n }, [wantsReserve, phase, side, resolvedSideWidth]);\n\n if (phase === 'hidden') return null;\n\n const animating = phase === 'entering' || phase === 'leaving';\n\n const horizontal = offset?.horizontal ?? 24;\n const vertical = offset?.vertical ?? 96;\n const resolvedWidth = width ?? (effectiveMode === 'side' ? resolvedSideWidth : 480);\n\n let containerStyle: CSSProperties;\n let cornerClass: string;\n\n // Dynamic viewport heights — `dvh` follows iOS Safari URL bar (preferred),\n // `svh`/`lvh` are the small/large fallbacks if the dynamic value isn't\n // supported. Min-height keeps the popover usable even on tiny landscape phones.\n const dynVH = '100dvh';\n\n if (inline) {\n containerStyle = {\n position: 'relative',\n width: resolvedWidth,\n height,\n maxHeight: `calc(${dynVH} - 16px)`,\n pointerEvents: phase === 'visible' ? 'auto' : 'none',\n };\n cornerClass = 'rounded-xl border';\n } else if (fullscreen) {\n containerStyle = {\n position: 'fixed',\n top: 0,\n [side === 'left' ? 'left' : 'right']: 0,\n width: '100vw',\n height: dynVH,\n zIndex,\n pointerEvents: phase === 'visible' ? 'auto' : 'none',\n } as CSSProperties;\n cornerClass = 'rounded-none border-0';\n } else if (effectiveMode === 'side') {\n containerStyle = {\n position: 'fixed',\n top: 0,\n [side]: 0,\n height: dynVH,\n zIndex,\n width: `min(${resolvedWidth}px, 100vw)`,\n pointerEvents: phase === 'visible' ? 'auto' : 'none',\n } as CSSProperties;\n cornerClass = side === 'right' ? 'rounded-none border-l' : 'rounded-none border-r';\n } else {\n // popover — anchored to a corner, capped to viewport so it never\n // overlaps the FAB or goes off-screen on small windows.\n const heightCap = `calc(${dynVH} - ${vertical + 24}px)`;\n containerStyle = {\n position: 'fixed',\n ...dockPositionStyle(position, horizontal, vertical),\n zIndex,\n width: `min(${resolvedWidth}px, calc(100vw - 32px))`,\n height: `min(${height}px, ${heightCap})`,\n minHeight: `min(320px, ${heightCap})`,\n pointerEvents: phase === 'visible' ? 'auto' : 'none',\n };\n cornerClass = 'rounded-xl border';\n }\n\n // Per-mode enter/leave transform classes — side slides in horizontally,\n // popover scales + lifts.\n const enterClass = (() => {\n if (fullscreen) return 'opacity-0';\n if (effectiveMode === 'side') {\n return side === 'right' ? 'opacity-0 translate-x-4' : 'opacity-0 -translate-x-4';\n }\n return 'opacity-0 scale-95 translate-y-2';\n })();\n const visibleClass = 'opacity-100 scale-100 translate-y-0 translate-x-0';\n\n return (\n <Portal disablePortal={disablePortal || inline}>\n <div\n role=\"dialog\"\n aria-label={ariaLabel ?? (typeof title === 'string' ? title : 'Chat')}\n aria-hidden={phase === 'leaving'}\n className={cn(\n 'bg-popover text-popover-foreground border-border',\n 'flex flex-col overflow-hidden shadow-2xl',\n cornerClass,\n 'transition-all duration-200 ease-out',\n animating ? enterClass : visibleClass,\n className,\n )}\n style={containerStyle}\n >\n {!hideHeader && (\n <ChatHeader\n title={title}\n icon={icon}\n actions={headerActions}\n onClose={onClose}\n closeLabel={closeLabel}\n />\n )}\n <div className=\"min-h-0 min-w-0 flex-1 overflow-hidden\">{children}</div>\n </div>\n </Portal>\n );\n}\n","'use client';\n\nimport { forwardRef } from 'react';\nimport type { ButtonHTMLAttributes, ReactNode } from 'react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nexport interface ChatHeaderActionButtonProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\n /** Icon (required). */\n icon: ReactNode;\n /** Accessible label + native tooltip. */\n ariaLabel: string;\n /** Optional unread / status badge — small number on top-right. */\n badge?: number;\n /** Mark as destructive — uses destructive hover tokens. */\n destructive?: boolean;\n /** Optional visual loading state (e.g. while reset is in flight). */\n loading?: boolean;\n}\n\n/**\n * Compact icon button for the chat header actions slot.\n *\n * Standard chrome: 28×28 ghost button, hover bg-accent, focus ring, optional\n * destructive variant, optional numeric badge for unread / pending.\n *\n * @example\n * ```tsx\n * <ChatHeader\n * title=\"Assistant\"\n * onClose={close}\n * actions={\n * <>\n * <ChatHeaderActionButton\n * icon={<RotateCcw className=\"h-3.5 w-3.5\" />}\n * ariaLabel=\"Clear context\"\n * onClick={handleReset}\n * loading={isResetting}\n * />\n * <ChatHeaderActionButton\n * icon={<Settings className=\"h-3.5 w-3.5\" />}\n * ariaLabel=\"Settings\"\n * onClick={openSettings}\n * />\n * </>\n * }\n * />\n * ```\n */\nexport const ChatHeaderActionButton = forwardRef<HTMLButtonElement, ChatHeaderActionButtonProps>(\n function ChatHeaderActionButton(\n { icon, ariaLabel, badge, destructive, loading, disabled, className, ...rest },\n ref,\n ) {\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label={ariaLabel}\n title={ariaLabel}\n disabled={disabled || loading}\n className={cn(\n 'relative inline-flex h-7 w-7 items-center justify-center rounded-md',\n 'text-muted-foreground transition-colors',\n 'hover:bg-accent hover:text-foreground',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n destructive && 'hover:bg-destructive/15 hover:text-destructive',\n loading && 'animate-pulse',\n className,\n )}\n {...rest}\n >\n {icon}\n {badge !== undefined && (\n <span\n aria-hidden=\"true\"\n className=\"absolute -right-0.5 -top-0.5 inline-flex min-w-[14px] h-[14px] items-center justify-center rounded-full bg-destructive px-1 text-[9px] font-semibold leading-none text-destructive-foreground ring-2 ring-background\"\n >\n {badge > 9 ? '9+' : badge}\n </span>\n )}\n </button>\n );\n },\n);\n","'use client';\n\nimport { PanelRightOpen, PanelRightClose } from 'lucide-react';\n\nimport { useIsTabletOrBelow } from '@djangocfg/ui-core/hooks';\n\nimport { ChatHeaderActionButton } from './ChatHeaderActionButton';\nimport type { ChatDockMode } from './ChatDock';\n\nexport interface ChatHeaderModeToggleProps {\n /** Current dock mode. */\n mode: ChatDockMode;\n /** Toggle handler. Wire to `useChatDockPrefs().toggleMode`. */\n onToggle: () => void;\n /** Override aria/tooltip label for popover→side. */\n expandLabel?: string;\n /** Override aria/tooltip label for side→popover. */\n collapseLabel?: string;\n /**\n * Always render — useful for stories. By default the toggle hides itself on\n * viewports below `lg` (1024px) since side mode falls back to popover there.\n */\n forceVisible?: boolean;\n}\n\n/**\n * \"Dock to side\" / \"back to popover\" toggle.\n *\n * Side mode is desktop-only — on viewports below `lg` (1024px) `<ChatDock>`\n * silently falls back to popover anyway, so the toggle has nothing to do\n * and auto-hides. Pass `forceVisible` to override (e.g. in stories).\n */\nexport function ChatHeaderModeToggle({\n mode,\n onToggle,\n expandLabel = 'Dock to side',\n collapseLabel = 'Back to popover',\n forceVisible = false,\n}: ChatHeaderModeToggleProps) {\n const isBelowDesktop = useIsTabletOrBelow();\n if (isBelowDesktop && !forceVisible) return null;\n\n const isSide = mode === 'side';\n return (\n <ChatHeaderActionButton\n icon={\n isSide ? (\n <PanelRightClose className=\"h-3.5 w-3.5\" />\n ) : (\n <PanelRightOpen className=\"h-3.5 w-3.5\" />\n )\n }\n ariaLabel={isSide ? collapseLabel : expandLabel}\n onClick={onToggle}\n />\n );\n}\n","'use client';\n\nimport { Volume2, VolumeX } from 'lucide-react';\n\nimport { ChatHeaderActionButton } from './ChatHeaderActionButton';\n\nexport interface ChatHeaderAudioToggleProps {\n /** Current muted state. */\n muted: boolean;\n /** Toggle handler. Wire to `useChatAudio().setMuted` or `toggleMute`. */\n onToggle: () => void;\n /** Override tooltip label for muted → unmuted. */\n unmuteLabel?: string;\n /** Override tooltip label for unmuted → muted. */\n muteLabel?: string;\n}\n\n/**\n * Mute / unmute notification sounds. Drop into a `<ChatHeader>` actions\n * slot or into `<ChatDock headerActions>`.\n *\n * @example\n * ```tsx\n * const audio = useChatAudio({ sounds: {...} });\n * <ChatHeaderAudioToggle muted={audio.muted} onToggle={() => audio.setMuted(!audio.muted)} />\n * ```\n */\nexport function ChatHeaderAudioToggle({\n muted,\n onToggle,\n unmuteLabel = 'Unmute notifications',\n muteLabel = 'Mute notifications',\n}: ChatHeaderAudioToggleProps) {\n return (\n <ChatHeaderActionButton\n icon={\n muted ? (\n <VolumeX className=\"h-3.5 w-3.5\" />\n ) : (\n <Volume2 className=\"h-3.5 w-3.5\" />\n )\n }\n ariaLabel={muted ? unmuteLabel : muteLabel}\n onClick={onToggle}\n />\n );\n}\n","'use client';\n\nimport { useCallback, useState } from 'react';\n\nexport interface UseChatResetOptions {\n /**\n * Backend call that performs the actual reset (e.g. POST /chat/reset).\n * Should resolve to `true` on success, `false` on failure.\n * Throwing also counts as failure — caught and logged.\n */\n onReset: () => Promise<boolean>;\n /**\n * Called after a successful reset (status === true). Use to clear the\n * local message list, navigate, or fire analytics.\n */\n onSuccess?: () => void;\n /**\n * Called when reset fails (returned `false` or threw). Defaults to no-op\n * — wire to a toast/banner if you want to surface it.\n */\n onError?: (error?: unknown) => void;\n}\n\nexport interface UseChatResetReturn {\n /** Trigger the reset. Safe to call multiple times — re-entrant guard. */\n reset: () => Promise<boolean>;\n /** True while the reset is in flight. */\n isResetting: boolean;\n}\n\n/**\n * Generic \"clear chat context\" hook.\n *\n * Stays generic — the backend call lives in the host (it knows the URL,\n * auth, project slug). Provides the in-flight state and success/error\n * callbacks every consumer wires up the same way.\n *\n * @example\n * ```tsx\n * const { reset, isResetting } = useChatReset({\n * onReset: async () => {\n * const res = await fetch('/api/chat/reset', { method: 'POST', credentials: 'include' });\n * return res.ok;\n * },\n * onSuccess: () => chat.clearMessages(),\n * });\n * ```\n */\nexport function useChatReset(opts: UseChatResetOptions): UseChatResetReturn {\n const { onReset, onSuccess, onError } = opts;\n const [isResetting, setIsResetting] = useState(false);\n\n const reset = useCallback(async (): Promise<boolean> => {\n if (isResetting) return false;\n setIsResetting(true);\n try {\n const ok = await onReset();\n if (ok) onSuccess?.();\n else onError?.();\n return ok;\n } catch (err) {\n onError?.(err);\n return false;\n } finally {\n setIsResetting(false);\n }\n }, [isResetting, onReset, onSuccess, onError]);\n\n return { reset, isResetting };\n}\n","'use client';\n\nimport { RotateCcw } from 'lucide-react';\n\nimport { useChatReset } from '../hooks/useChatReset';\nimport { ChatHeaderActionButton } from './ChatHeaderActionButton';\n\nexport interface ChatHeaderResetButtonProps {\n /**\n * Backend reset call. Should resolve to `true` on success.\n * Plugged into `useChatReset` for in-flight state.\n */\n onReset: () => Promise<boolean>;\n /** Called after a successful reset (e.g. clear local messages, refetch). */\n onSuccess?: () => void;\n /** Called when reset fails (returned `false` or threw). */\n onError?: (error?: unknown) => void;\n /**\n * Show a `window.dialog.confirm` before calling `onReset`. @default true\n *\n * Requires the host to mount `<DialogProvider>` from `@djangocfg/ui-core`\n * — it installs the `window.dialog` API used here.\n */\n confirm?: boolean;\n /** Confirm dialog title. */\n confirmTitle?: string;\n /** Confirm dialog message. */\n confirmMessage?: string;\n /** Override tooltip / aria label. */\n ariaLabel?: string;\n}\n\nconst DEFAULT_TITLE = 'Clear conversation?';\nconst DEFAULT_MESSAGE =\n 'The assistant will forget this session and start a new one. This cannot be undone.';\nconst DEFAULT_LABEL = 'Clear conversation';\n\n/**\n * Standard chat-reset action: prompts the user via `window.dialog.confirm`,\n * then runs the backend reset call through `useChatReset` so the button\n * spins while it's in flight.\n *\n * @example\n * ```tsx\n * <ChatHeaderResetButton\n * onReset={api.clearChat}\n * onSuccess={() => chat.clearMessages()}\n * />\n * ```\n */\nexport function ChatHeaderResetButton({\n onReset,\n onSuccess,\n onError,\n confirm = true,\n confirmTitle = DEFAULT_TITLE,\n confirmMessage = DEFAULT_MESSAGE,\n ariaLabel = DEFAULT_LABEL,\n}: ChatHeaderResetButtonProps) {\n const { reset, isResetting } = useChatReset({ onReset, onSuccess, onError });\n\n const handleClick = async () => {\n if (confirm) {\n const api = typeof window !== 'undefined' ? window.dialog : undefined;\n if (api?.confirm) {\n const ok = await api.confirm({\n title: confirmTitle,\n message: confirmMessage,\n variant: 'destructive',\n confirmText: 'Clear',\n cancelText: 'Cancel',\n });\n if (!ok) return;\n } else if (typeof window !== 'undefined' && typeof window.confirm === 'function') {\n // Fallback to the native browser confirm when the dialog service\n // isn't wired (e.g. host forgot to mount DialogProvider).\n const ok = window.confirm(`${confirmTitle}\\n\\n${confirmMessage}`);\n if (!ok) return;\n }\n }\n await reset();\n };\n\n return (\n <ChatHeaderActionButton\n icon={<RotateCcw className=\"h-3.5 w-3.5\" />}\n ariaLabel={ariaLabel}\n onClick={handleClick}\n loading={isResetting}\n destructive\n />\n );\n}\n","/**\n * Canonical list of BCP-47 language tags that the browser Web Speech\n * API is known to accept. Sourced from the official Google Chrome\n * Speech API demo (`google.com/intl/en/chrome/demos/speech.html`),\n * which is the de-facto reference — the spec itself doesn't expose a\n * way to enumerate supported languages, so this list is the\n * best-effort guarantee for what works in Chromium-based browsers.\n *\n * Each entry groups one human-readable language with its dialect\n * variants. The default tag (first in `dialects`) is what `lang` is\n * set to when the user picks the language without a regional dialect.\n *\n * For custom engines (cmdop wails-whisper, Deepgram, …) hosts can\n * pass their own subset via the `availableLanguages` prop on the\n * picker — backend may support more or fewer tags than the browser.\n */\n\nexport interface SpeechLanguageDialect {\n /** BCP-47 tag (e.g. `en-US`). */\n code: string;\n /** Region label in the language's native script (e.g. \"United States\"). */\n region: string;\n}\n\nexport interface SpeechLanguage {\n /** Native-script name (e.g. \"Русский\", \"中文\"). */\n name: string;\n /**\n * English name used as a secondary search key so users typing\n * \"russian\" / \"chinese\" / \"korean\" land on the right row regardless\n * of the native script. Always lowercase.\n */\n englishName: string;\n /**\n * Primary-subtag ISO-639 code (e.g. `en`, `ru`, `cmn`). Used as the\n * map key into the `LanguageSelect` ui-core component.\n */\n iso: string;\n /** One or more region dialects. Length >= 1. */\n dialects: SpeechLanguageDialect[];\n}\n\nexport const WEB_SPEECH_LANGUAGES: SpeechLanguage[] = [\n { name: 'Afrikaans', iso: 'af', englishName: 'afrikaans', dialects: [{ code: 'af-ZA', region: 'South Africa' }] },\n { name: 'አማርኛ', iso: 'am', englishName: 'amharic', dialects: [{ code: 'am-ET', region: 'Ethiopia' }] },\n { name: 'Azərbaycanca', iso: 'az', englishName: 'azerbaijani', dialects: [{ code: 'az-AZ', region: 'Azerbaijan' }] },\n {\n name: 'বাংলা', iso: 'bn', englishName: 'bengali',\n dialects: [\n { code: 'bn-BD', region: 'Bangladesh' },\n { code: 'bn-IN', region: 'India' },\n ],\n },\n { name: 'Bahasa Indonesia', iso: 'id', englishName: 'indonesian', dialects: [{ code: 'id-ID', region: 'Indonesia' }] },\n { name: 'Bahasa Melayu', iso: 'ms', englishName: 'malay', dialects: [{ code: 'ms-MY', region: 'Malaysia' }] },\n { name: 'Català', iso: 'ca', englishName: 'catalan', dialects: [{ code: 'ca-ES', region: 'Spain' }] },\n { name: 'Čeština', iso: 'cs', englishName: 'czech', dialects: [{ code: 'cs-CZ', region: 'Czechia' }] },\n { name: 'Dansk', iso: 'da', englishName: 'danish', dialects: [{ code: 'da-DK', region: 'Denmark' }] },\n { name: 'Deutsch', iso: 'de', englishName: 'german', dialects: [{ code: 'de-DE', region: 'Germany' }] },\n {\n name: 'English', iso: 'en', englishName: 'english',\n dialects: [\n { code: 'en-US', region: 'United States' },\n { code: 'en-GB', region: 'United Kingdom' },\n { code: 'en-AU', region: 'Australia' },\n { code: 'en-CA', region: 'Canada' },\n { code: 'en-IN', region: 'India' },\n { code: 'en-NZ', region: 'New Zealand' },\n { code: 'en-PH', region: 'Philippines' },\n { code: 'en-ZA', region: 'South Africa' },\n { code: 'en-NG', region: 'Nigeria' },\n { code: 'en-GH', region: 'Ghana' },\n { code: 'en-KE', region: 'Kenya' },\n { code: 'en-TZ', region: 'Tanzania' },\n ],\n },\n {\n name: 'Español', iso: 'es', englishName: 'spanish',\n dialects: [\n { code: 'es-ES', region: 'España' },\n { code: 'es-MX', region: 'México' },\n { code: 'es-US', region: 'Estados Unidos' },\n { code: 'es-AR', region: 'Argentina' },\n { code: 'es-CL', region: 'Chile' },\n { code: 'es-CO', region: 'Colombia' },\n { code: 'es-PE', region: 'Perú' },\n { code: 'es-VE', region: 'Venezuela' },\n { code: 'es-EC', region: 'Ecuador' },\n { code: 'es-GT', region: 'Guatemala' },\n { code: 'es-CR', region: 'Costa Rica' },\n { code: 'es-PA', region: 'Panamá' },\n { code: 'es-DO', region: 'Rep. Dominicana' },\n { code: 'es-UY', region: 'Uruguay' },\n { code: 'es-PY', region: 'Paraguay' },\n { code: 'es-BO', region: 'Bolivia' },\n { code: 'es-SV', region: 'El Salvador' },\n { code: 'es-HN', region: 'Honduras' },\n { code: 'es-NI', region: 'Nicaragua' },\n { code: 'es-PR', region: 'Puerto Rico' },\n ],\n },\n { name: 'Euskara', iso: 'eu', englishName: 'basque', dialects: [{ code: 'eu-ES', region: 'Spain' }] },\n { name: 'Filipino', iso: 'fil', englishName: 'filipino tagalog', dialects: [{ code: 'fil-PH', region: 'Philippines' }] },\n { name: 'Français', iso: 'fr', englishName: 'french', dialects: [{ code: 'fr-FR', region: 'France' }] },\n { name: 'Basa Jawa', iso: 'jv', englishName: 'javanese', dialects: [{ code: 'jv-ID', region: 'Indonesia' }] },\n { name: 'Galego', iso: 'gl', englishName: 'galician', dialects: [{ code: 'gl-ES', region: 'Spain' }] },\n { name: 'ગુજરાતી', iso: 'gu', englishName: 'gujarati', dialects: [{ code: 'gu-IN', region: 'India' }] },\n { name: 'Hrvatski', iso: 'hr', englishName: 'croatian', dialects: [{ code: 'hr-HR', region: 'Croatia' }] },\n { name: 'IsiZulu', iso: 'zu', englishName: 'zulu', dialects: [{ code: 'zu-ZA', region: 'South Africa' }] },\n { name: 'Íslenska', iso: 'is', englishName: 'icelandic', dialects: [{ code: 'is-IS', region: 'Iceland' }] },\n {\n name: 'Italiano', iso: 'it', englishName: 'italian',\n dialects: [\n { code: 'it-IT', region: 'Italia' },\n { code: 'it-CH', region: 'Svizzera' },\n ],\n },\n { name: 'ಕನ್ನಡ', iso: 'kn', englishName: 'kannada', dialects: [{ code: 'kn-IN', region: 'India' }] },\n { name: 'ភាសាខ្មែរ', iso: 'km', englishName: 'khmer cambodian', dialects: [{ code: 'km-KH', region: 'Cambodia' }] },\n { name: 'Latviešu', iso: 'lv', englishName: 'latvian', dialects: [{ code: 'lv-LV', region: 'Latvia' }] },\n { name: 'Lietuvių', iso: 'lt', englishName: 'lithuanian', dialects: [{ code: 'lt-LT', region: 'Lithuania' }] },\n { name: 'മലയാളം', iso: 'ml', englishName: 'malayalam', dialects: [{ code: 'ml-IN', region: 'India' }] },\n { name: 'मराठी', iso: 'mr', englishName: 'marathi', dialects: [{ code: 'mr-IN', region: 'India' }] },\n { name: 'Magyar', iso: 'hu', englishName: 'hungarian', dialects: [{ code: 'hu-HU', region: 'Hungary' }] },\n { name: 'ລາວ', iso: 'lo', englishName: 'lao laotian', dialects: [{ code: 'lo-LA', region: 'Laos' }] },\n { name: 'Nederlands', iso: 'nl', englishName: 'dutch', dialects: [{ code: 'nl-NL', region: 'Netherlands' }] },\n { name: 'नेपाली भाषा', iso: 'ne', englishName: 'nepali', dialects: [{ code: 'ne-NP', region: 'Nepal' }] },\n { name: 'Norsk bokmål', iso: 'nb', englishName: 'norwegian bokmal', dialects: [{ code: 'nb-NO', region: 'Norway' }] },\n { name: 'Polski', iso: 'pl', englishName: 'polish', dialects: [{ code: 'pl-PL', region: 'Poland' }] },\n {\n name: 'Português', iso: 'pt', englishName: 'portuguese',\n dialects: [\n { code: 'pt-BR', region: 'Brasil' },\n { code: 'pt-PT', region: 'Portugal' },\n ],\n },\n { name: 'Română', iso: 'ro', englishName: 'romanian', dialects: [{ code: 'ro-RO', region: 'Romania' }] },\n { name: 'සිංහල', iso: 'si', englishName: 'sinhala sinhalese', dialects: [{ code: 'si-LK', region: 'Sri Lanka' }] },\n { name: 'Slovenščina', iso: 'sl', englishName: 'slovenian', dialects: [{ code: 'sl-SI', region: 'Slovenia' }] },\n { name: 'Basa Sunda', iso: 'su', englishName: 'sundanese', dialects: [{ code: 'su-ID', region: 'Indonesia' }] },\n { name: 'Slovenčina', iso: 'sk', englishName: 'slovak', dialects: [{ code: 'sk-SK', region: 'Slovakia' }] },\n { name: 'Suomi', iso: 'fi', englishName: 'finnish', dialects: [{ code: 'fi-FI', region: 'Finland' }] },\n { name: 'Svenska', iso: 'sv', englishName: 'swedish', dialects: [{ code: 'sv-SE', region: 'Sweden' }] },\n {\n name: 'Kiswahili', iso: 'sw', englishName: 'swahili',\n dialects: [\n { code: 'sw-TZ', region: 'Tanzania' },\n { code: 'sw-KE', region: 'Kenya' },\n ],\n },\n { name: 'ქართული', iso: 'ka', englishName: 'georgian', dialects: [{ code: 'ka-GE', region: 'Georgia' }] },\n { name: 'Հայերեն', iso: 'hy', englishName: 'armenian', dialects: [{ code: 'hy-AM', region: 'Armenia' }] },\n {\n name: 'தமிழ்', iso: 'ta', englishName: 'tamil',\n dialects: [\n { code: 'ta-IN', region: 'இந்தியா' },\n { code: 'ta-SG', region: 'சிங்கப்பூர்' },\n { code: 'ta-LK', region: 'இலங்கை' },\n { code: 'ta-MY', region: 'மலேசியா' },\n ],\n },\n { name: 'తెలుగు', iso: 'te', englishName: 'telugu', dialects: [{ code: 'te-IN', region: 'India' }] },\n { name: 'Tiếng Việt', iso: 'vi', englishName: 'vietnamese', dialects: [{ code: 'vi-VN', region: 'Vietnam' }] },\n { name: 'Türkçe', iso: 'tr', englishName: 'turkish', dialects: [{ code: 'tr-TR', region: 'Türkiye' }] },\n {\n name: 'اُردُو', iso: 'ur', englishName: 'urdu',\n dialects: [\n { code: 'ur-PK', region: 'پاکستان' },\n { code: 'ur-IN', region: 'بھارت' },\n ],\n },\n { name: 'Ελληνικά', iso: 'el', englishName: 'greek', dialects: [{ code: 'el-GR', region: 'Greece' }] },\n { name: 'български', iso: 'bg', englishName: 'bulgarian', dialects: [{ code: 'bg-BG', region: 'Bulgaria' }] },\n { name: 'Русский', iso: 'ru', englishName: 'russian', dialects: [{ code: 'ru-RU', region: 'Russia' }] },\n { name: 'Српски', iso: 'sr', englishName: 'serbian', dialects: [{ code: 'sr-RS', region: 'Serbia' }] },\n { name: 'Українська', iso: 'uk', englishName: 'ukrainian', dialects: [{ code: 'uk-UA', region: 'Ukraine' }] },\n { name: '한국어', iso: 'ko', englishName: 'korean', dialects: [{ code: 'ko-KR', region: 'Korea' }] },\n {\n name: '中文', iso: 'cmn', englishName: 'chinese mandarin cantonese',\n dialects: [\n { code: 'cmn-Hans-CN', region: '普通话 (中国大陆)' },\n { code: 'cmn-Hans-HK', region: '普通话 (香港)' },\n { code: 'cmn-Hant-TW', region: '中文 (台灣)' },\n { code: 'yue-Hant-HK', region: '粵語 (香港)' },\n ],\n },\n { name: '日本語', iso: 'ja', englishName: 'japanese', dialects: [{ code: 'ja-JP', region: 'Japan' }] },\n { name: 'हिन्दी', iso: 'hi', englishName: 'hindi', dialects: [{ code: 'hi-IN', region: 'India' }] },\n { name: 'ภาษาไทย', iso: 'th', englishName: 'thai', dialects: [{ code: 'th-TH', region: 'Thailand' }] },\n];\n\n/** Flat list of every supported BCP-47 tag, useful for validation. */\nexport const WEB_SPEECH_TAGS: string[] = WEB_SPEECH_LANGUAGES.flatMap((l) =>\n l.dialects.map((d) => d.code),\n);\n\n/**\n * Find the human-readable language entry that owns a given BCP-47 tag.\n * Returns `null` for unknown / custom tags (custom engines may use\n * codes outside this catalogue).\n */\nexport function findSpeechLanguage(tag: string | null | undefined): {\n language: SpeechLanguage;\n dialect: SpeechLanguageDialect;\n} | null {\n if (!tag) return null;\n const lower = tag.toLowerCase();\n for (const language of WEB_SPEECH_LANGUAGES) {\n for (const dialect of language.dialects) {\n if (dialect.code.toLowerCase() === lower) return { language, dialect };\n }\n }\n return null;\n}\n\n/**\n * Extract the ISO-3166 country code (2 uppercase letters) from a\n * BCP-47 tag, or `null` if the tag has no region subtag. Used by the\n * language flag button to find the right country flag asset.\n */\nexport function countryFromTag(tag: string | null | undefined): string | null {\n if (!tag) return null;\n const parts = tag.split('-');\n for (let i = parts.length - 1; i >= 0; i -= 1) {\n const p = parts[i];\n if (p.length === 2 && /^[A-Za-z]{2}$/.test(p)) return p.toUpperCase();\n }\n return null;\n}\n","'use client';\n\nimport type * as React from 'react';\nimport { createContext, useContext, useMemo } from 'react';\n\nimport type { UseSpeechRecognitionConfig, UseSpeechRecognitionReturn } from '../types';\nimport { useSpeechRecognition } from '../hooks/useSpeechRecognition';\n\nconst Ctx = createContext<UseSpeechRecognitionReturn | null>(null);\n\nexport interface SpeechRecognitionProviderProps extends UseSpeechRecognitionConfig {\n children?: React.ReactNode;\n}\n\n/**\n * Lifts a single `useSpeechRecognition` instance into a context so any\n * descendant — composer slot, header badge, transcript overlay — can\n * read the same status / transcript / level without each component\n * spinning up its own engine. Mount it once per Chat (or per\n * dictation-aware screen).\n */\nexport function SpeechRecognitionProvider({\n children,\n ...config\n}: SpeechRecognitionProviderProps): React.ReactElement {\n const rec = useSpeechRecognition(config);\n // Memo prevents context-value churn from leaking through to every\n // useContext consumer when only one of {status, level, transcript}\n // changes — React already triggers them via the inner state, the\n // outer object identity should stay stable across renders.\n const value = useMemo(() => rec, [rec]);\n return <Ctx.Provider value={value}>{children}</Ctx.Provider>;\n}\n\nexport function useSpeechRecognitionContext(): UseSpeechRecognitionReturn {\n const ctx = useContext(Ctx);\n if (!ctx) {\n throw new Error(\n 'useSpeechRecognitionContext must be used inside a <SpeechRecognitionProvider>.',\n );\n }\n return ctx;\n}\n\nexport function useSpeechRecognitionContextOptional(): UseSpeechRecognitionReturn | null {\n return useContext(Ctx);\n}\n","'use client';\n\nimport { createLazyComponent } from '../../components';\nimport type { DictationFieldProps } from './widgets/DictationField';\n\nexport const LazyDictationField = createLazyComponent<DictationFieldProps>(\n () =>\n import('./widgets/DictationField').then((mod) => ({\n default: mod.DictationField,\n })),\n {\n displayName: 'LazyDictationField',\n fallback: (\n <div className=\"rounded-lg border border-border/60 bg-card px-3 py-2 text-xs text-muted-foreground\">\n Loading dictation…\n </div>\n ),\n },\n);\n","'use client';\n\nimport type * as React from 'react';\nimport { useMemo } from 'react';\nimport { Globe } from 'lucide-react';\n\nimport {\n Combobox,\n type ComboboxOption,\n Flag,\n} from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { findSpeechLanguage } from '../../SpeechRecognition';\n\nimport {\n WEB_SPEECH_LANGUAGES,\n countryFromTag,\n useResolvedLanguage,\n useSpeechPrefs,\n} from '../../SpeechRecognition';\n\nexport interface ChatHeaderLanguageButtonProps {\n /** Override aria-label. Default \"Speech language\". */\n ariaLabel?: string;\n /**\n * Subset of BCP-47 tags to offer. Default: every entry from the\n * Web Speech catalogue (~66 tags incl. regional variants). Pass a\n * tighter list when your backend STT only supports a subset.\n */\n allowedTags?: string[];\n /** Hide the globe-fallback icon when no flag resolves. */\n hideFallbackIcon?: boolean;\n className?: string;\n}\n\n/**\n * Compact flag-button language picker for the chat header. Built on\n * top of the ui-core `<Combobox>` — searchable autocomplete with\n * flags, ~66 BCP-47 tags from the official Chrome Web Speech demo, and\n * a custom 28×28 trigger via `renderTrigger`.\n *\n * The selection persists into `useSpeechPrefs` (zustand+localStorage)\n * so `useSpeechRecognition` picks it up as the second-priority resolver\n * value (above i18n locale, below an explicit `language` prop).\n */\nexport function ChatHeaderLanguageButton({\n ariaLabel = 'Speech language',\n allowedTags,\n hideFallbackIcon,\n className,\n}: ChatHeaderLanguageButtonProps): React.ReactElement {\n const prefs = useSpeechPrefs();\n const active = useResolvedLanguage();\n\n // Flatten every dialect into one Combobox option. Display name keeps\n // the native language label; we stash the English aliases + BCP-47\n // tag + region in `description` purely as a hidden search index.\n // (We intentionally hide the description from the rendered row in\n // `renderOption` — it would just clutter the dropdown.)\n const options = useMemo<ComboboxOption[]>(() => {\n const allow = allowedTags ? new Set(allowedTags) : null;\n const out: ComboboxOption[] = [];\n for (const lang of WEB_SPEECH_LANGUAGES) {\n for (const d of lang.dialects) {\n if (allow && !allow.has(d.code)) continue;\n out.push({\n value: d.code,\n // \"Русский\" / \"Español — Argentina\" / \"English — United States\"\n label:\n lang.dialects.length === 1\n ? lang.name\n : `${lang.name} — ${d.region}`,\n // Search-only index: English name, BCP-47 tag, ISO, region.\n // Lets users type \"russian\" / \"ru-RU\" / \"ru\" / \"argentina\"\n // and still find the row regardless of native script.\n description: `${lang.englishName} ${d.code} ${lang.iso} ${d.region}`.toLowerCase(),\n });\n }\n }\n return out;\n }, [allowedTags]);\n\n return (\n <Combobox\n options={options}\n value={prefs.language ?? active}\n onValueChange={(v) => prefs.setLanguage(v || null)}\n placeholder={ariaLabel}\n searchPlaceholder=\"Search language…\"\n filterFunction={(opt, search) => {\n const s = search.toLowerCase();\n // Match label (native script), value (BCP-47), and our packed\n // search index in description (English name + tag + region).\n return (\n opt.label.toLowerCase().includes(s) ||\n opt.value.toLowerCase().includes(s) ||\n (opt.description?.includes(s) ?? false)\n );\n }}\n // Popover width follows the trigger by default (28px → narrow).\n // Force a usable width and bump z-index above ChatDock (z-10000).\n contentClassName=\"w-[280px]\"\n contentStyle={{ zIndex: 10001 }}\n // Custom row: country flag + native language label + BCP-47 tag.\n // ui-core Combobox default rendering only shows label/description\n // — feeding the flag here keeps every list row instantly\n // identifiable. Fallback to a neutral globe glyph when the tag\n // has no resolvable country (rare: bn-BD etc. all have flags).\n renderOption={(option) => {\n const country = countryFromTag(option.value);\n return (\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n {country ? (\n <Flag\n countryCode={country}\n className=\"h-4 w-5 shrink-0 overflow-hidden rounded-[2px] border border-border/60 ring-1 ring-black/5\"\n />\n ) : (\n <Globe className=\"h-4 w-4 shrink-0 text-muted-foreground\" aria-hidden />\n )}\n {/* Native-script label only — BCP-47 subtitle removed to\n keep the dropdown visually quiet. Tag + region still\n live in `description` for search. */}\n <span className=\"truncate text-sm\">{option.label}</span>\n </div>\n );\n }}\n // Compact icon-only trigger — replaces the default wide outline\n // button. Stays the same 28×28 footprint as ChatHeaderActionButton\n // siblings (audio toggle, reset).\n renderTrigger={(selected, open) => {\n const tag = selected?.value ?? active;\n const country = countryFromTag(tag);\n const found = findSpeechLanguage(tag);\n // Tooltip copy: native language name + dialect region + tag.\n // Falls back to just the tag for unknown / custom-engine codes.\n const tooltipLabel = found\n ? `${found.language.name}${\n found.language.dialects.length > 1 ? ` — ${found.dialect.region}` : ''\n } · ${tag}`\n : tag;\n // Note on tooltip: we intentionally use the native `title`\n // attribute instead of `<Tooltip>` here. The button is already\n // wrapped by Combobox's `PopoverTrigger asChild`, and stacking\n // a second `TooltipTrigger asChild` on the same node makes\n // Radix Slot merge two competing refs/handlers — popover click\n // stops working. Native `title` is \"good enough\" for a single\n // status label and ships zero extra DOM.\n return (\n <button\n type=\"button\"\n aria-label={`${ariaLabel}: ${tooltipLabel}`}\n aria-expanded={open}\n title={tooltipLabel}\n className={cn(\n 'inline-flex h-7 w-7 items-center justify-center rounded-md',\n 'text-muted-foreground transition-colors',\n 'hover:bg-accent hover:text-foreground',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n className,\n )}\n >\n {country ? (\n <Flag\n countryCode={country}\n // Subtle hairline so flags with light edges (Japan,\n // Switzerland, …) don't blend into the header bg.\n className=\"h-4 w-5 overflow-hidden rounded-[2px] border border-border/60 ring-1 ring-black/5\"\n />\n ) : hideFallbackIcon ? null : (\n <Globe className=\"h-3.5 w-3.5\" aria-hidden />\n )}\n </button>\n );\n }}\n />\n );\n}\n","'use client';\n\nimport { X } from 'lucide-react';\nimport { useEffect, useState } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useChatPresence } from './useChatPresence';\nimport type { ChatFABPosition } from './ChatFAB';\n\nexport interface ChatGreetingProps {\n /** Controlled visibility — usually `!chatOpen && !userDismissed`. */\n open: boolean;\n /** Greeting text. Pass a string for the default bubble, or any ReactNode. */\n children: ReactNode;\n /** Click handler — typically opens the chat. Bubble is clickable when set. */\n onClick?: () => void;\n /** Close (×) button handler — typically marks the greeting as dismissed. */\n onDismiss?: () => void;\n /** Anchor relative to a FAB on the same side. @default 'bottom-right' */\n position?: ChatFABPosition;\n /**\n * Horizontal pixel offset matching the FAB's `offset` prop, so the greeting\n * lines up under the FAB. @default 24\n */\n fabOffset?: number;\n /**\n * Vertical pixel offset above/below the FAB centerline. @default 96\n * (room for an `md` FAB plus a small gap).\n */\n fabClearance?: number;\n /** Delay before the greeting appears, in ms. @default 1500 */\n delayMs?: number;\n /** z-index. @default 9998 (just below the default FAB at 9999). */\n zIndex?: number;\n /** Override classes on the bubble. */\n className?: string;\n /** Override styles on the bubble. */\n style?: CSSProperties;\n /** Optional sender avatar / icon shown on the left. */\n avatar?: ReactNode;\n /** Optional sender label rendered above the text. */\n senderName?: string;\n /** ARIA label for the dismiss button. @default 'Dismiss' */\n dismissLabel?: string;\n /**\n * Render in-place (no fixed positioning). Useful for stories and inline previews.\n * @default false\n */\n inline?: boolean;\n}\n\nfunction anchorStyle(\n position: ChatFABPosition,\n fabOffset: number,\n fabClearance: number,\n): CSSProperties {\n const [vert, horiz] = position.split('-') as ['bottom' | 'top', 'right' | 'left'];\n return { [vert]: fabClearance, [horiz]: fabOffset } as CSSProperties;\n}\n\nfunction originClass(position: ChatFABPosition): string {\n // Scale-in origin matches the corner the bubble attaches to.\n if (position === 'bottom-right') return 'origin-bottom-right';\n if (position === 'bottom-left') return 'origin-bottom-left';\n if (position === 'top-right') return 'origin-top-right';\n return 'origin-top-left';\n}\n\n/**\n * Greeting bubble shown next to a `ChatFAB` to invite the user to start a\n * conversation (LiveChat / Intercom-style proactive prompt).\n *\n * Renders fixed-position, anchored to the same corner as the FAB. Owns its\n * own delayed-mount + presence animation. Hide on chat open and/or after\n * user dismissal.\n *\n * @example\n * ```tsx\n * const [open, setOpen] = useState(false);\n * const [dismissed, setDismissed] = useState(false);\n *\n * <ChatLauncher\n * open={open}\n * onOpenChange={setOpen}\n * fab={{ variant: 'animated' }}\n * dock={{ title: 'Support' }}\n * >\n * <SupportChat />\n * </ChatLauncher>\n *\n * <ChatGreeting\n * open={!open && !dismissed}\n * onClick={() => setOpen(true)}\n * onDismiss={() => setDismissed(true)}\n * senderName=\"Anna from Support\"\n * delayMs={2000}\n * >\n * Hi! 👋 Got a question? I'm here to help.\n * </ChatGreeting>\n * ```\n */\nexport function ChatGreeting({\n open,\n children,\n onClick,\n onDismiss,\n position = 'bottom-right',\n fabOffset = 24,\n fabClearance = 96,\n delayMs = 1500,\n zIndex = 9998,\n className,\n style,\n avatar,\n senderName,\n dismissLabel = 'Dismiss',\n inline = false,\n}: ChatGreetingProps) {\n const [delayed, setDelayed] = useState(delayMs <= 0);\n\n useEffect(() => {\n if (!open || delayMs <= 0) return;\n const t = setTimeout(() => setDelayed(true), delayMs);\n return () => clearTimeout(t);\n }, [open, delayMs]);\n\n const shouldShow = open && delayed;\n const phase = useChatPresence(shouldShow, 220);\n\n if (phase === 'hidden') return null;\n\n const animating = phase === 'entering' || phase === 'leaving';\n const clickable = !!onClick;\n\n return (\n <div\n role={clickable ? 'button' : 'status'}\n aria-live=\"polite\"\n tabIndex={clickable ? 0 : -1}\n onClick={clickable ? onClick : undefined}\n onKeyDown={\n clickable\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }\n : undefined\n }\n className={cn(\n inline ? 'relative inline-flex' : 'fixed',\n 'flex items-start gap-2.5 max-w-[280px]',\n 'rounded-2xl border border-border bg-popover text-popover-foreground',\n 'px-3.5 py-2.5 shadow-2xl transition-all duration-200 ease-out',\n clickable && 'cursor-pointer hover:bg-accent/40 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n originClass(position),\n animating ? 'opacity-0 scale-95 translate-y-1' : 'opacity-100 scale-100 translate-y-0',\n className,\n )}\n style={{\n ...(inline ? {} : anchorStyle(position, fabOffset, fabClearance)),\n ...(inline ? {} : { zIndex }),\n pointerEvents: phase === 'visible' ? 'auto' : 'none',\n ...style,\n }}\n >\n {avatar && <div className=\"mt-0.5 shrink-0\">{avatar}</div>}\n\n <div className=\"min-w-0 flex-1 text-sm leading-snug\">\n {senderName && (\n <div className=\"mb-0.5 text-[11px] font-medium text-muted-foreground\">\n {senderName}\n </div>\n )}\n <div className=\"text-foreground\">{children}</div>\n </div>\n\n {onDismiss && (\n <button\n type=\"button\"\n aria-label={dismissLabel}\n onClick={(e) => {\n e.stopPropagation();\n onDismiss();\n }}\n className={cn(\n '-mr-1 -mt-1 flex h-6 w-6 shrink-0 items-center justify-center rounded-full',\n 'text-muted-foreground transition-colors hover:bg-accent hover:text-foreground',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n )}\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { X } from 'lucide-react';\nimport type { CSSProperties, ReactNode } from 'react';\n\nimport { Avatar, AvatarFallback, AvatarImage } from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport type { ChatMessage, ChatPersona } from '../types';\nimport type { ChatFABPosition } from './ChatFAB';\nimport { useChatPresence } from './useChatPresence';\n\nexport interface ChatUnreadPreviewProps {\n /** Controlled — usually `!dockOpen && !!message`. */\n open: boolean;\n /** Inbound message to preview. `null` hides the bubble. */\n message: ChatMessage | null;\n /** Tap → open chat + mark read. */\n onClick?: () => void;\n /** × → mark read without opening. */\n onDismiss?: () => void;\n /** Anchor corner — match the FAB so the bubble sits above it. @default 'bottom-right' */\n position?: ChatFABPosition;\n /** Horizontal offset from screen edge, matches the FAB. @default 24 */\n fabOffset?: number;\n /** Vertical clearance above/below the FAB. @default 96 */\n fabClearance?: number;\n /** Lines of body text before ellipsis. @default 2 */\n truncate?: number;\n /** z-index. @default 9998 */\n zIndex?: number;\n /** Render in-place (stories / previews). @default false */\n inline?: boolean;\n /** Override classes on the bubble. */\n className?: string;\n /** Override styles on the bubble. */\n style?: CSSProperties;\n /** ARIA label for the dismiss button. @default 'Mark as read' */\n dismissLabel?: string;\n /** Override the avatar — defaults to derived from `message.sender`. */\n avatar?: ReactNode;\n /** Override the sender label — defaults to `message.sender?.name`. */\n senderName?: string;\n}\n\nconst TIME_FORMAT = new Intl.DateTimeFormat(undefined, {\n hour: '2-digit',\n minute: '2-digit',\n});\n\nfunction anchorStyle(\n position: ChatFABPosition,\n fabOffset: number,\n fabClearance: number,\n): CSSProperties {\n const [vert, horiz] = position.split('-') as ['bottom' | 'top', 'right' | 'left'];\n return { [vert]: fabClearance, [horiz]: fabOffset } as CSSProperties;\n}\n\nfunction originClass(position: ChatFABPosition): string {\n if (position === 'bottom-right') return 'origin-bottom-right';\n if (position === 'bottom-left') return 'origin-bottom-left';\n if (position === 'top-right') return 'origin-top-right';\n return 'origin-top-left';\n}\n\nfunction deriveAvatar(persona?: ChatPersona, name?: string): ReactNode {\n const initials =\n persona?.initials ??\n (name ?? persona?.name ?? '?')\n .split(/\\s+/)\n .map((p) => p[0])\n .filter(Boolean)\n .slice(0, 2)\n .join('')\n .toUpperCase();\n return (\n <Avatar className=\"h-9 w-9\">\n {persona?.avatarUrl ? <AvatarImage src={persona.avatarUrl} /> : null}\n <AvatarFallback>{initials || '?'}</AvatarFallback>\n </Avatar>\n );\n}\n\n/**\n * Push-notification bubble next to the chat FAB.\n *\n * Shows the last inbound message while the chat is closed —\n * Intercom / LiveChat-style. Tap → open chat (host wires `onClick`).\n * Dismiss × → keep chat closed but stop nagging.\n *\n * Pair with `useChatUnread()` (inside `<ChatProvider>`) for state.\n */\nexport function ChatUnreadPreview({\n open,\n message,\n onClick,\n onDismiss,\n position = 'bottom-right',\n fabOffset = 24,\n fabClearance = 96,\n truncate = 2,\n zIndex = 9998,\n inline = false,\n className,\n style,\n dismissLabel = 'Mark as read',\n avatar,\n senderName,\n}: ChatUnreadPreviewProps) {\n const shouldShow = open && !!message;\n const phase = useChatPresence(shouldShow, 200);\n if (phase === 'hidden' || !message) return null;\n\n const animating = phase === 'entering' || phase === 'leaving';\n const clickable = !!onClick;\n const displayName = senderName ?? message.sender?.name ?? 'New message';\n const stamp = TIME_FORMAT.format(new Date(message.createdAt));\n\n return (\n <div\n role={clickable ? 'button' : 'status'}\n aria-live=\"polite\"\n tabIndex={clickable ? 0 : -1}\n onClick={clickable ? onClick : undefined}\n onKeyDown={\n clickable\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }\n : undefined\n }\n className={cn(\n inline ? 'relative inline-flex' : 'fixed',\n 'flex items-start gap-2.5 max-w-[300px]',\n 'rounded-2xl border border-border bg-popover text-popover-foreground',\n 'px-3.5 py-2.5 shadow-2xl transition-all duration-200 ease-out',\n clickable &&\n 'cursor-pointer hover:bg-accent/40 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n originClass(position),\n animating ? 'opacity-0 scale-95 translate-y-1' : 'opacity-100 scale-100 translate-y-0',\n className,\n )}\n style={{\n ...(inline ? {} : anchorStyle(position, fabOffset, fabClearance)),\n ...(inline ? {} : { zIndex }),\n pointerEvents: phase === 'visible' ? 'auto' : 'none',\n ...style,\n }}\n >\n <div className=\"mt-0.5 shrink-0\">\n {avatar ?? deriveAvatar(message.sender, displayName)}\n </div>\n\n <div className=\"min-w-0 flex-1 text-sm leading-snug\">\n <div className=\"flex items-baseline justify-between gap-2\">\n <div className=\"truncate text-[12px] font-semibold text-foreground\">\n {displayName}\n </div>\n <div className=\"shrink-0 text-[10px] text-muted-foreground\">{stamp}</div>\n </div>\n <div\n className=\"text-foreground/90 mt-0.5 break-words\"\n style={{\n display: '-webkit-box',\n WebkitLineClamp: truncate,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {message.content}\n </div>\n </div>\n\n {onDismiss ? (\n <button\n type=\"button\"\n aria-label={dismissLabel}\n onClick={(e) => {\n e.stopPropagation();\n onDismiss();\n }}\n className={cn(\n '-mr-1 -mt-1 flex h-6 w-6 shrink-0 items-center justify-center rounded-full',\n 'text-muted-foreground transition-colors hover:bg-accent hover:text-foreground',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n )}\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n ) : null}\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { useHotkey } from '@djangocfg/ui-core/hooks';\n\nimport { ChatFAB, type ChatFABPosition, type ChatFABProps } from './ChatFAB';\nimport { ChatDock, type ChatDockProps } from './ChatDock';\nimport { ChatGreeting, type ChatGreetingProps } from './ChatGreeting';\nimport { ChatHeaderAudioToggle } from './ChatHeaderAudioToggle';\nimport { ChatUnreadPreview, type ChatUnreadPreviewProps } from './ChatUnreadPreview';\nimport type { ChatMessage } from '../types';\n\nexport interface ChatLauncherHotkey {\n /** Key (case-sensitive single char or named like 'Escape'). */\n key: string;\n /** Require Cmd (mac) or Ctrl (other). */\n meta?: boolean;\n /** Require Shift. */\n shift?: boolean;\n /** Require Alt. */\n alt?: boolean;\n}\n\nexport interface ChatLauncherGreeting\n extends Omit<ChatGreetingProps, 'open' | 'onClick' | 'onDismiss' | 'position' | 'fabOffset' | 'children'> {\n /** Greeting body — string for the default style, or any ReactNode. */\n content: ReactNode;\n /** Persistence key for \"user dismissed this greeting\" in `localStorage`. Pass `null` to disable persistence. @default null */\n dismissStorageKey?: string | null;\n /** Hide the greeting once the user opens the chat. @default true */\n hideOnOpen?: boolean;\n}\n\nexport interface ChatLauncherProps {\n /** Dock contents — typically a `<Chat>` instance. */\n children: ReactNode;\n /** FAB customization (icon, position, label, pulse, badge, tooltip, variant, size). */\n fab?: Omit<ChatFABProps, 'onClick'>;\n /** Dock customization (size, title, position, transition, mobileFullscreen). */\n dock?: Omit<ChatDockProps, 'open' | 'onClose' | 'children'>;\n /**\n * Proactive greeting bubble shown next to the FAB before the user opens the chat.\n * Set to a string or full config object. Omit to disable.\n */\n greeting?: string | ChatLauncherGreeting;\n /** Open/close via a keyboard shortcut. */\n hotkey?: ChatLauncherHotkey;\n /** Initial open state for uncontrolled mode. @default false */\n defaultOpen?: boolean;\n /** Controlled open state (pair with `onOpenChange`). */\n open?: boolean;\n /** Controlled open state setter. */\n onOpenChange?: (open: boolean) => void;\n /**\n * Focus the composer textarea when the dock opens. Saves a click for\n * every \"FAB → start typing\" interaction. @default true\n */\n autoFocusComposerOnOpen?: boolean;\n /**\n * Close the dock on `Escape`. Mirrors standard popover / drawer UX.\n * Set to `false` to disable (e.g. if you want Escape to do something\n * else inside the chat). @default true\n */\n closeOnEscape?: boolean;\n /**\n * Last inbound message (admin reply / system notice / agent push) the\n * user hasn't seen yet. Drives the `<ChatUnreadPreview>` bubble next\n * to the FAB and (by default) the FAB badge.\n *\n * Source it from `useChatUnread()` inside your `<ChatProvider>`.\n */\n unreadMessage?: ChatMessage | null;\n /**\n * Called when the user opens the chat via FAB/preview/hotkey or\n * dismisses the preview with ×. Wire to `useChatUnread().markRead`.\n */\n onMarkRead?: () => void;\n /**\n * Customize the unread bubble (`truncate`, `dismissLabel`, …).\n * `open`/`message`/`onClick`/`onDismiss`/`position`/`fabOffset` are\n * wired automatically.\n */\n unreadPreview?: Omit<\n ChatUnreadPreviewProps,\n 'open' | 'message' | 'onClick' | 'onDismiss' | 'position' | 'fabOffset'\n >;\n /**\n * Auto-inject a mute / unmute button into the header. Pass the\n * `useChatAudio()` (or any compatible `{ muted, toggleMute }`)\n * instance — the launcher renders `<ChatHeaderAudioToggle>` in the\n * header's actions slot when audio is actually configured (not silent).\n *\n * Hosts that manage their own header can ignore this prop and render\n * `<ChatHeaderAudioToggle>` directly.\n */\n audio?: { muted: boolean; toggleMute: () => void; isSilent?: boolean } | null;\n /**\n * Suppress the auto-injected audio toggle even when `audio` is passed.\n * @default false\n */\n hideAudioToggle?: boolean;\n}\n\nfunction readDismissed(storageKey: string | null | undefined): boolean {\n if (!storageKey) return false;\n if (typeof window === 'undefined') return false;\n try {\n return window.localStorage.getItem(storageKey) === '1';\n } catch {\n return false;\n }\n}\n\nfunction writeDismissed(storageKey: string | null | undefined): void {\n if (!storageKey) return;\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(storageKey, '1');\n } catch {\n // private mode / storage full — silently ignore\n }\n}\n\n/**\n * Floating chat launcher = FAB + Dock + presence + optional greeting + hotkey.\n *\n * 99% of hosts use this directly. For non-FAB triggers (e.g. an inline\n * link in the page) compose `<ChatDock>` with your own button.\n */\nexport function ChatLauncher({\n children,\n fab,\n dock,\n greeting,\n hotkey,\n defaultOpen = false,\n open: controlledOpen,\n onOpenChange,\n autoFocusComposerOnOpen = true,\n closeOnEscape = true,\n unreadMessage,\n onMarkRead,\n unreadPreview,\n audio,\n hideAudioToggle = false,\n}: ChatLauncherProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : uncontrolledOpen;\n const dockContentRef = useRef<HTMLDivElement>(null);\n\n // Auto-focus the composer when the dock opens.\n // We probe the dock subtree for the first textarea/input after the\n // enter-transition settles. Keeps the hook self-contained — no need to\n // bridge into the ChatProvider context which lives inside `children`.\n useEffect(() => {\n if (!autoFocusComposerOnOpen || !open) return;\n const t = setTimeout(() => {\n const root = dockContentRef.current;\n if (!root) return;\n const target = root.querySelector<HTMLElement>(\n 'textarea:not([disabled]):not([readonly]), input[type=\"text\"]:not([disabled]):not([readonly])',\n );\n target?.focus();\n }, 120);\n return () => clearTimeout(t);\n }, [open, autoFocusComposerOnOpen]);\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setUncontrolledOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n const toggleOpen = useCallback(() => setOpen(!open), [open, setOpen]);\n\n // Two-step Escape (ChatGPT / Slack behaviour):\n // - When focus is inside a textarea / input / contenteditable, first Esc\n // just blurs — drafts survive accidental presses.\n // - When focus is elsewhere (the user already left the composer or never\n // focused it), Esc closes the dock.\n // Disabled when chat is shut so we don't intercept page-level Esc bindings.\n useHotkey(\n 'escape',\n (e) => {\n const target = (e?.target as HTMLElement | null) ?? null;\n const inEditable =\n !!target &&\n (target.matches?.('input, textarea, [contenteditable=\"true\"]') ?? false);\n if (inEditable) {\n target.blur();\n return;\n }\n setOpen(false);\n },\n { enabled: closeOnEscape && open },\n );\n\n // Normalize greeting prop.\n const greetingConfig: ChatLauncherGreeting | null =\n greeting === undefined\n ? null\n : typeof greeting === 'string'\n ? { content: greeting }\n : greeting;\n\n const [dismissed, setDismissed] = useState(() =>\n readDismissed(greetingConfig?.dismissStorageKey),\n );\n\n // Hotkey.\n useEffect(() => {\n if (!hotkey) return;\n const handler = (e: KeyboardEvent) => {\n const metaOk = hotkey.meta ? e.metaKey || e.ctrlKey : !e.metaKey && !e.ctrlKey;\n const shiftOk = hotkey.shift ? e.shiftKey : !e.shiftKey;\n const altOk = hotkey.alt ? e.altKey : !e.altKey;\n if (!metaOk || !shiftOk || !altOk) return;\n if (e.key !== hotkey.key) return;\n e.preventDefault();\n setOpen(!open);\n };\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, [hotkey?.key, hotkey?.meta, hotkey?.shift, hotkey?.alt, open, setOpen, hotkey]);\n\n // Greeting visibility: respect dismissal, hideOnOpen, and the actual open state.\n const greetingOpen = !!greetingConfig\n && !dismissed\n && (greetingConfig.hideOnOpen === false || !open);\n\n const fabPosition: ChatFABPosition = fab?.position ?? 'bottom-right';\n const fabOffset = fab?.offset ?? 24;\n\n const handleGreetingDismiss = () => {\n setDismissed(true);\n writeDismissed(greetingConfig?.dismissStorageKey);\n };\n\n const handleGreetingClick = () => {\n setOpen(true);\n // Tap-to-open also clears the proactive bubble — pushing it again on\n // the same visit would feel spammy. Persisted dismissal honours the\n // storage key so it doesn't reappear after navigation either.\n setDismissed(true);\n writeDismissed(greetingConfig?.dismissStorageKey);\n };\n\n // Mark-as-read also fires when the chat opens through any path (FAB,\n // hotkey, controlled state) — symmetric with click-to-open via the\n // preview itself.\n useEffect(() => {\n if (open && unreadMessage) onMarkRead?.();\n }, [open, unreadMessage, onMarkRead]);\n\n // Unread preview replaces the greeting when there's a real inbound\n // message to surface — same anchor, more relevant content.\n const unreadOpen = !open && !!unreadMessage;\n const handleUnreadClick = () => {\n setOpen(true);\n onMarkRead?.();\n };\n const handleUnreadDismiss = () => {\n onMarkRead?.();\n };\n\n // Auto-derive a \"1\" badge from unread when the host didn't set one.\n const resolvedFab = unreadMessage && fab?.badge === undefined\n ? { ...fab, badge: 1 }\n : fab;\n\n return (\n <>\n <ChatFAB {...resolvedFab} onClick={toggleOpen} />\n {unreadMessage ? (\n <ChatUnreadPreview\n {...unreadPreview}\n open={unreadOpen}\n message={unreadMessage}\n onClick={handleUnreadClick}\n onDismiss={handleUnreadDismiss}\n position={fabPosition}\n fabOffset={fabOffset}\n />\n ) : greetingConfig ? (\n <ChatGreeting\n {...greetingConfig}\n open={greetingOpen}\n onClick={handleGreetingClick}\n onDismiss={handleGreetingDismiss}\n position={fabPosition}\n fabOffset={fabOffset}\n >\n {greetingConfig.content}\n </ChatGreeting>\n ) : null}\n <ChatDock\n {...dock}\n open={open}\n onClose={() => setOpen(false)}\n headerActions={\n (audio && !audio.isSilent && !hideAudioToggle) || dock?.headerActions ? (\n <>\n {dock?.headerActions}\n {audio && !audio.isSilent && !hideAudioToggle ? (\n <ChatHeaderAudioToggle muted={audio.muted} onToggle={audio.toggleMute} />\n ) : null}\n </>\n ) : undefined\n }\n >\n <div ref={dockContentRef} className=\"flex h-full min-h-0 min-w-0 flex-col\">\n {children}\n </div>\n </ChatDock>\n </>\n );\n}\n","'use client';\n\nimport { type RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\n/**\n * @deprecated Plan64. As of ui-tools 2.1.369, `<MessageList>` is\n * virtualized via react-virtuoso and owns its own scroll viewport.\n * Sticky-bottom + auto-follow on streaming live inside the component;\n * use the new `MessageListProps.onAtBottomChange` prop and the\n * `MessageListHandle.scrollToBottom()` imperative method instead.\n *\n * This hook is kept for hosts that render messages outside\n * `<MessageList>` (e.g. headless story shells, custom non-virtualized\n * scroll containers). It still works against any HTMLElement scroll\n * container, but it does NOT integrate with Virtuoso — passing a\n * Virtuoso-managed element here will read garbage scroll metrics.\n */\nexport interface UseChatScrollOptions {\n containerRef: RefObject<HTMLElement | null>;\n bottomRef: RefObject<HTMLElement | null>;\n isStreaming?: boolean;\n /** Distance from bottom (px) considered \"at bottom\". */\n bottomThresholdPx?: number;\n /** Bump key — increment when a new message arrives so the hook re-evaluates auto-scroll. */\n messagesCount?: number;\n}\n\nexport interface UseChatScrollReturn {\n isAtBottom: boolean;\n unreadCount: number;\n scrollToBottom: (smooth?: boolean) => void;\n resetUnread: () => void;\n}\n\nexport function useChatScroll(options: UseChatScrollOptions): UseChatScrollReturn {\n const {\n containerRef,\n bottomRef,\n isStreaming = false,\n bottomThresholdPx = 80,\n messagesCount = 0,\n } = options;\n\n const [isAtBottom, setIsAtBottom] = useState(true);\n const [unreadCount, setUnreadCount] = useState(0);\n const lastCountRef = useRef(messagesCount);\n const stickyRef = useRef(true);\n const wasStreamingRef = useRef(isStreaming);\n\n const scrollToBottom = useCallback(\n (smooth = false) => {\n const el = containerRef.current;\n if (!el) return;\n el.scrollTo({\n top: el.scrollHeight,\n behavior: smooth ? 'smooth' : 'auto',\n });\n stickyRef.current = true;\n setIsAtBottom(true);\n setUnreadCount(0);\n },\n [containerRef],\n );\n\n const resetUnread = useCallback(() => setUnreadCount(0), []);\n\n // Track scroll position relative to bottom.\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n const onScroll = () => {\n const distance = el.scrollHeight - el.scrollTop - el.clientHeight;\n const atBottom = distance <= bottomThresholdPx;\n stickyRef.current = atBottom;\n setIsAtBottom(atBottom);\n if (atBottom) setUnreadCount(0);\n };\n onScroll();\n el.addEventListener('scroll', onScroll, { passive: true });\n return () => {\n el.removeEventListener('scroll', onScroll);\n };\n }, [containerRef, bottomThresholdPx]);\n\n // Stick to bottom while streaming, and one extra rAF after stream ends so\n // the final layout (markdown re-render, sources/tool-call panels) doesn't\n // push the latest content out of view.\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n\n if (isStreaming) {\n wasStreamingRef.current = true;\n if (!stickyRef.current) return;\n let raf = 0;\n const tick = () => {\n if (!stickyRef.current) return;\n el.scrollTop = el.scrollHeight;\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(raf);\n }\n\n // Stream just ended — flush one more scroll on the next two frames so\n // both markdown swap and any post-stream panel insertions are reflected.\n if (wasStreamingRef.current && stickyRef.current) {\n wasStreamingRef.current = false;\n let raf1 = 0;\n let raf2 = 0;\n raf1 = requestAnimationFrame(() => {\n el.scrollTop = el.scrollHeight;\n raf2 = requestAnimationFrame(() => {\n el.scrollTop = el.scrollHeight;\n });\n });\n return () => {\n cancelAnimationFrame(raf1);\n cancelAnimationFrame(raf2);\n };\n }\n wasStreamingRef.current = false;\n return;\n }, [containerRef, isStreaming]);\n\n // On message count increase, decide whether to scroll or bump unread.\n useEffect(() => {\n if (messagesCount > lastCountRef.current) {\n if (stickyRef.current) {\n const el = containerRef.current;\n if (el) el.scrollTop = el.scrollHeight;\n } else {\n setUnreadCount((n) => n + (messagesCount - lastCountRef.current));\n }\n }\n lastCountRef.current = messagesCount;\n }, [containerRef, messagesCount]);\n\n // Watch bottom sentinel just for symmetry/future hooks.\n useEffect(() => {\n void bottomRef;\n }, [bottomRef]);\n\n return { isAtBottom, unreadCount, scrollToBottom, resetUnread };\n}\n","'use client';\n\nimport { type RefObject, useEffect, useRef } from 'react';\n\nexport interface UseChatHistoryOptions {\n enabled?: boolean;\n containerRef: RefObject<HTMLElement | null>;\n topSentinelRef: RefObject<HTMLElement | null>;\n hasMore: boolean;\n isLoadingMore: boolean;\n loadMore: () => Promise<void>;\n}\n\n/** Triggers `loadMore` when the top sentinel enters the container's viewport.\n * Preserves scroll anchor: if the container's height grows after load, we\n * bump scrollTop by the delta so the previously-visible message stays put. */\nexport function useChatHistory(options: UseChatHistoryOptions): void {\n const { enabled = true, containerRef, topSentinelRef, hasMore, isLoadingMore, loadMore } = options;\n const heightBeforeRef = useRef<number | null>(null);\n\n // Restore anchor after content prepends.\n useEffect(() => {\n if (heightBeforeRef.current == null) return;\n const el = containerRef.current;\n if (!el) {\n heightBeforeRef.current = null;\n return;\n }\n if (!isLoadingMore) {\n const delta = el.scrollHeight - heightBeforeRef.current;\n if (delta > 0) {\n el.scrollTop += delta;\n }\n heightBeforeRef.current = null;\n }\n }, [containerRef, isLoadingMore]);\n\n useEffect(() => {\n if (!enabled || !hasMore) return;\n const sentinel = topSentinelRef.current;\n const root = containerRef.current;\n if (!sentinel || !root) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n if (!entry?.isIntersecting) return;\n if (isLoadingMore) return;\n const el = containerRef.current;\n if (el) heightBeforeRef.current = el.scrollHeight;\n void loadMore();\n },\n { root, threshold: 0, rootMargin: '200px 0px 0px 0px' },\n );\n\n observer.observe(sentinel);\n return () => observer.disconnect();\n }, [enabled, hasMore, isLoadingMore, containerRef, topSentinelRef, loadMore]);\n}\n","'use client';\n\nimport { useCallback, useState } from 'react';\n\nimport type { ChatAttachment } from '../types';\n\nexport type ChatLightboxScope = 'message' | 'conversation';\n\nexport interface ChatLightboxState {\n gallery: ChatAttachment[];\n index: number;\n}\n\nexport interface UseChatLightboxReturn {\n state: ChatLightboxState | null;\n open: (att: ChatAttachment, gallery?: ChatAttachment[]) => void;\n close: () => void;\n}\n\n/** Tiny state container for an image lightbox. The host owns the modal +\n * `<LazyImageViewer>` mount; we just track which gallery to show. */\nexport function useChatLightbox(): UseChatLightboxReturn {\n const [state, setState] = useState<ChatLightboxState | null>(null);\n\n const open = useCallback((att: ChatAttachment, gallery?: ChatAttachment[]) => {\n const list = gallery && gallery.length ? gallery : [att];\n const idx = list.findIndex((a) => a.id === att.id);\n setState({ gallery: list, index: idx === -1 ? 0 : idx });\n }, []);\n\n const close = useCallback(() => setState(null), []);\n\n return { state, open, close };\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nconst DEFAULT_STORAGE_KEY = 'chat.visitor.fingerprint';\n\nfunction generate(): string {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return crypto.randomUUID();\n }\n return `v-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport interface UseVisitorFingerprintOptions {\n /** localStorage key. @default 'chat.visitor.fingerprint' */\n storageKey?: string;\n}\n\n/**\n * Persistent anonymous visitor id, kept in `localStorage`.\n *\n * Returns `null` on the first render (SSR-safe) and the stable id from\n * the second render onwards. Use as `fingerprint` for public chat\n * transports that need to dedupe sessions per visitor without auth.\n */\nexport function useVisitorFingerprint(\n opts: UseVisitorFingerprintOptions = {},\n): string | null {\n const storageKey = opts.storageKey ?? DEFAULT_STORAGE_KEY;\n const [fp, setFp] = useState<string | null>(null);\n\n useEffect(() => {\n let value: string | null = null;\n try {\n value = window.localStorage.getItem(storageKey);\n if (!value) {\n value = generate();\n window.localStorage.setItem(storageKey, value);\n }\n } catch {\n // Private mode / storage disabled — fall back to ephemeral.\n value = generate();\n }\n setFp(value);\n }, [storageKey]);\n\n return fp;\n}\n","'use client';\n\nimport { useCallback } from 'react';\n\nimport { useLocalStorage } from '@djangocfg/ui-core/hooks';\n\nimport type { ChatDockMode, ChatDockSide } from '../launcher/ChatDock';\n\nexport interface ChatDockPrefs {\n /** Popover (FAB-style) or side-docked panel. */\n mode: ChatDockMode;\n /** Which edge the side dock attaches to. */\n side: ChatDockSide;\n /** Width in px when side-docked (resizable in the future). */\n sideWidth: number;\n}\n\nexport const DEFAULT_DOCK_PREFS: ChatDockPrefs = {\n mode: 'popover',\n side: 'right',\n sideWidth: 420,\n};\n\nconst DEFAULT_KEY = 'chat.dock.prefs';\n\nexport interface UseChatDockPrefsOptions {\n /** localStorage key. @default 'chat.dock.prefs' */\n storageKey?: string;\n /** Override the baseline defaults (per-product branding, etc.). */\n defaults?: Partial<ChatDockPrefs>;\n}\n\nexport interface UseChatDockPrefsReturn extends ChatDockPrefs {\n /** Merge-update — pass only the fields that changed. */\n setPrefs: (patch: Partial<ChatDockPrefs>) => void;\n /** Convenience toggle: popover ⇆ side. */\n toggleMode: () => void;\n /** Convenience toggle: right ⇆ left (only affects side mode). */\n toggleSide: () => void;\n /** Reset to defaults. */\n reset: () => void;\n}\n\n/**\n * Persistent dock preferences (mode / side / width) via ui-core localStorage.\n *\n * SSR-safe: returns defaults on the server, hydrates on mount.\n * Survives reloads — power users keep their preferred chat layout.\n */\nexport function useChatDockPrefs(opts: UseChatDockPrefsOptions = {}): UseChatDockPrefsReturn {\n const key = opts.storageKey ?? DEFAULT_KEY;\n const initial: ChatDockPrefs = { ...DEFAULT_DOCK_PREFS, ...opts.defaults };\n\n const [prefs, setStored] = useLocalStorage<ChatDockPrefs>(key, initial);\n\n const setPrefs = useCallback(\n (patch: Partial<ChatDockPrefs>) => {\n setStored((prev) => ({ ...prev, ...patch }));\n },\n [setStored],\n );\n\n const toggleMode = useCallback(() => {\n setStored((prev) => ({ ...prev, mode: prev.mode === 'side' ? 'popover' : 'side' }));\n }, [setStored]);\n\n const toggleSide = useCallback(() => {\n setStored((prev) => ({ ...prev, side: prev.side === 'right' ? 'left' : 'right' }));\n }, [setStored]);\n\n const reset = useCallback(() => setStored(initial), [setStored, initial]);\n\n return { ...prefs, setPrefs, toggleMode, toggleSide, reset };\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useChatContext } from '../context';\nimport type { ChatMessage } from '../types';\n\nexport interface UseChatUnreadOptions {\n /**\n * When true, unread state is auto-cleared (treated as \"user is reading\n * the chat right now\"). Pass your dock-open boolean here so the badge\n * resets the moment the user opens the chat.\n */\n open?: boolean;\n /**\n * Which message roles count as \"unread\". Defaults to `['assistant']` —\n * we only count inbound replies, not the user's own messages.\n */\n countRoles?: Array<ChatMessage['role']>;\n}\n\nexport interface UseChatUnreadReturn {\n /** Most-recent inbound message since the last mark-as-read. */\n unread: ChatMessage | null;\n /** Total inbound messages since the last mark-as-read. */\n count: number;\n /** Manually clear the unread state. */\n markRead: () => void;\n}\n\n/**\n * Track inbound chat messages while the user isn't watching.\n *\n * Must be called **inside** the chat's `<ChatProvider>` (i.e. inside the\n * `children` of `ChatLauncher`, alongside `ChatRoot`).\n *\n * @example\n * ```tsx\n * function ChatRootWithUnreadBadge({ open, onUnread }: { open: boolean; onUnread: (m: ChatMessage | null) => void }) {\n * const { unread, count, markRead } = useChatUnread({ open });\n * useEffect(() => onUnread(unread), [unread, onUnread]);\n * // pass `count` to your FAB badge via the host's state\n * return <ChatRoot transport={transport} />;\n * }\n * ```\n *\n * For end-to-end wiring with `<ChatLauncher unreadMessage onMarkRead>`,\n * see the `Launcher / WithLivePush` story.\n */\nexport function useChatUnread(opts: UseChatUnreadOptions = {}): UseChatUnreadReturn {\n const { open = false, countRoles = ['assistant'] } = opts;\n const ctx = useChatContext();\n\n const [lastSeenId, setLastSeenId] = useState<string | null>(null);\n // On first mount, treat the current tail as already seen so old history\n // doesn't immediately register as unread.\n const initialized = useRef(false);\n useEffect(() => {\n if (initialized.current) return;\n initialized.current = true;\n const tail = ctx.messages[ctx.messages.length - 1];\n setLastSeenId(tail?.id ?? null);\n }, [ctx.messages]);\n\n // While the dock is open, auto-advance the seen pointer to the tail so\n // count stays at 0.\n useEffect(() => {\n if (!open) return;\n const tail = ctx.messages[ctx.messages.length - 1];\n setLastSeenId(tail?.id ?? null);\n }, [open, ctx.messages]);\n\n // Compute unread tail since `lastSeenId`.\n const seenIdx = lastSeenId\n ? ctx.messages.findIndex((m) => m.id === lastSeenId)\n : -1;\n const after = seenIdx === -1 ? ctx.messages : ctx.messages.slice(seenIdx + 1);\n const inbound = after.filter((m) => countRoles.includes(m.role));\n const unread = inbound.length > 0 ? inbound[inbound.length - 1]! : null;\n\n const markRead = useCallback(() => {\n const tail = ctx.messages[ctx.messages.length - 1];\n setLastSeenId(tail?.id ?? null);\n }, [ctx.messages]);\n\n return { unread, count: inbound.length, markRead };\n}\n","// Thin re-export — audio prefs storage now lives in `@djangocfg/ui-core/hooks`.\n// Existing direct consumers (`AudioToggle`) keep working through this wrapper.\n\n'use client';\n\nimport { createAudioPrefsStore, type AudioPrefsState } from '@djangocfg/ui-core/hooks';\n\nimport type { ChatAudioEvent } from './types';\n\nconst STORAGE_KEY = 'djangocfg-chat-audio:prefs';\n\nexport type ChatAudioPrefsState = AudioPrefsState<ChatAudioEvent>;\n\nexport const useChatAudioPrefs = createAudioPrefsStore<ChatAudioEvent>(STORAGE_KEY);\n","// Tiny dispatcher for tool-call payload renderers.\n//\n// Hosts compose matchers (predicate + render) and a fallback. The result is a\n// `renderPayload` function compatible with `<ToolCalls renderPayload>`.\n//\n// Pure — no React, no DOM. The matchers themselves return ReactNode.\n\nimport type { ReactNode } from 'react';\n\nimport type { ChatToolCall } from '../types';\nimport type { ToolPayloadKind } from '../components/ToolCalls';\n\nexport interface ToolPayloadMatcher {\n /** Cheap predicate. First match wins. */\n match: (value: unknown, kind: ToolPayloadKind, call: ChatToolCall) => boolean;\n render: (value: unknown, kind: ToolPayloadKind, call: ChatToolCall) => ReactNode;\n}\n\nexport type ToolPayloadFallback = (\n value: unknown,\n kind: ToolPayloadKind,\n call: ChatToolCall,\n) => ReactNode;\n\nexport function dispatchToolPayload(\n matchers: ToolPayloadMatcher[],\n fallback: ToolPayloadFallback,\n): ToolPayloadFallback {\n return (value, kind, call) => {\n for (const m of matchers) {\n if (m.match(value, kind, call)) return m.render(value, kind, call);\n }\n return fallback(value, kind, call);\n };\n}\n\n// ---- Common matcher predicates -------------------------------------------\n// Re-export as building blocks. Hosts can use directly or compose.\n\nexport function isPlainObject(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v);\n}\n\nexport function isLatLng(v: unknown): v is { lat: number; lng: number } {\n return isPlainObject(v) && typeof v.lat === 'number' && typeof v.lng === 'number';\n}\n\nexport function isGeoJSONFeatureCollection(v: unknown): v is { type: 'FeatureCollection'; features: unknown[] } {\n return isPlainObject(v) && v.type === 'FeatureCollection' && Array.isArray(v.features);\n}\n\nexport function isStringValue(v: unknown): v is string {\n return typeof v === 'string';\n}\n","import type { ChatAttachment, ChatMessage } from '../types';\n\n/** Walk the conversation and collect image attachments in chronological order. */\nexport function collectImageAttachments(messages: ChatMessage[]): ChatAttachment[] {\n const out: ChatAttachment[] = [];\n for (const m of messages) {\n if (!m.attachments) continue;\n for (const a of m.attachments) {\n if (a.type === 'image') out.push(a);\n }\n }\n return out;\n}\n","'use client';\n\n/**\n * Mute / unmute toggle for chat audio events.\n *\n * Reads the current ``muted`` state from the active chat context and\n * persists changes through ``useChatAudioPrefs`` (cross-tab safe). The\n * button auto-hides when no ``audio.sounds`` config is provided —\n * showing a mute toggle for a chat with no sounds is just clutter.\n *\n * Drop into a ChatRoot ``header`` slot or anywhere inside a chat\n * provider:\n *\n * ```tsx\n * <ChatRoot\n * header={<AudioToggle />}\n * audio={{ sounds: { messageReceived: '/ping.mp3' } }}\n * ...\n * />\n * ```\n */\n\nimport { Volume2, VolumeX } from 'lucide-react';\n\nimport { Button } from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useChatContextOptional } from '../context';\nimport { useChatAudioPrefs } from '../core/audio/preferences';\n\nexport interface AudioToggleProps {\n /** Visual size — matches Button sizes. Default: ``icon``. */\n size?: 'sm' | 'icon';\n /** Variant passed to the underlying Button. Default: ``ghost``. */\n variant?: 'ghost' | 'outline' | 'secondary';\n /** Force-show even when no audio config is wired (e.g. for stories). */\n alwaysShow?: boolean;\n className?: string;\n}\n\nexport function AudioToggle({\n size = 'icon',\n variant = 'ghost',\n alwaysShow = false,\n className,\n}: AudioToggleProps) {\n // Read straight from the persist store so the toggle works even\n // when rendered OUTSIDE the ChatRoot (e.g. in a parent header). The\n // chat audio bus reads the same store, so a click here flips the\n // \"muted\" state for any sibling ChatRoot in the same tab and\n // mirrors across tabs via the storage event.\n const muted = useChatAudioPrefs((s) => s.muted);\n const setMuted = useChatAudioPrefs((s) => s.setMuted);\n\n // If a ChatRoot is in scope, hide unless it actually wired sounds —\n // otherwise the button is a no-op for that surface. When rendered\n // standalone (no context), default to visible.\n const ctx = useChatContextOptional();\n if (ctx && !ctx.hasAudio && !alwaysShow) return null;\n\n const Icon = muted ? VolumeX : Volume2;\n const label = muted ? 'Unmute chat sounds' : 'Mute chat sounds';\n\n return (\n <Button\n type=\"button\"\n variant={variant}\n size={size}\n onClick={() => setMuted(!muted)}\n aria-label={label}\n aria-pressed={muted}\n title={label}\n className={cn(size === 'icon' ? 'h-9 w-9' : '', className)}\n >\n <Icon aria-hidden className=\"size-4\" />\n </Button>\n );\n}\n","/**\n * LottiePlayer - Dynamic Import Wrapper\n *\n * Lazy loads the LottiePlayer component for optimal bundle size\n */\n\n'use client';\n\nimport React, { lazy, Suspense } from 'react';\nimport { LottiePlayerProps } from './types';\n\n// Lazy load the client component\nconst LottiePlayerClient = lazy(() =>\n import('./LottiePlayer.client').then((mod) => ({ default: mod.LottiePlayer }))\n);\n\n// Loading fallback component\nconst LoadingFallback = () => (\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-gray-300 border-t-gray-900\" />\n <span className=\"text-sm text-gray-500\">Loading player...</span>\n </div>\n </div>\n);\n\n/**\n * LottiePlayer component wrapper with dynamic import\n *\n * This component automatically handles code splitting and lazy loading\n * of the Lottie player to optimize bundle size.\n *\n * Usage:\n * ```tsx\n * import { LottiePlayer } from '@djangocfg/ui-core/tools';\n *\n * <LottiePlayer\n * src=\"https://example.com/animation.json\"\n * size=\"md\"\n * autoplay\n * loop\n * />\n * ```\n */\nexport function LottiePlayer(props: LottiePlayerProps) {\n return (\n <Suspense fallback={<LoadingFallback />}>\n <LottiePlayerClient {...props} />\n </Suspense>\n );\n}\n\n// Re-export types for convenience\nexport type { LottiePlayerProps, LottieSize, LottieSpeed, LottieDirection } from './types';\nexport { useLottie } from './useLottie';\nexport type { UseLottieOptions, UseLottieReturn } from './useLottie';\n","'use client';\n\nimport React, { lazy, Suspense } from 'react';\nimport { PlaygroundProvider } from './context/PlaygroundContext';\nimport type { PlaygroundConfig } from './types';\n\nconst DocsLayout = lazy(() =>\n import('./components/DocsLayout').then((mod) => ({ default: mod.DocsLayout }))\n);\n\nconst LoadingFallback = () => (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <div className=\"text-muted-foreground\">Loading API Playground...</div>\n </div>\n);\n\nexport interface PlaygroundProps {\n config: PlaygroundConfig;\n}\n\nexport const Playground: React.FC<PlaygroundProps> = ({ config }) => {\n return (\n <PlaygroundProvider config={config}>\n <Suspense fallback={<LoadingFallback />}>\n <DocsLayout />\n </Suspense>\n </PlaygroundProvider>\n );\n};\n\nexport type { PlaygroundConfig, SchemaSource } from './types';\n\nexport default Playground;\n","'use client';\n\n/**\n * CronScheduler\n *\n * Compact cron expression builder following Apple HIG principles.\n * Lazy-loaded for optimal bundle size (~15KB).\n *\n * @example\n * import { CronScheduler } from '@djangocfg/ui-tools';\n *\n * <CronScheduler\n * value={cron}\n * onChange={setCron}\n * showPreview\n * />\n */\n\nimport React, { lazy, Suspense } from 'react';\nimport { LoadingFallback } from '../../components';\nimport type { CronSchedulerProps } from './types';\n\n// Lazy load the client component\nconst CronSchedulerClient = lazy(() => import('./CronScheduler.client'));\n\n/**\n * CronScheduler with Suspense wrapper\n */\nexport function CronScheduler(props: CronSchedulerProps) {\n return (\n <Suspense fallback={<CronSchedulerFallback />}>\n <CronSchedulerClient {...props} />\n </Suspense>\n );\n}\n\n/**\n * Loading fallback for CronScheduler\n */\nfunction CronSchedulerFallback() {\n return (\n <LoadingFallback\n minHeight={120}\n showText={false}\n className=\"rounded-lg\"\n />\n );\n}\n\n// Re-export types\nexport type {\n CronSchedulerProps,\n ScheduleType,\n WeekDay,\n MonthDay,\n CronSchedulerState,\n CronSchedulerContextValue,\n} from './types';\n\n// Re-export context and hooks for advanced usage\nexport {\n CronSchedulerProvider,\n useCronSchedulerContext,\n useCronType,\n useCronTime,\n useCronWeekDays,\n useCronMonthDays,\n useCronCustom,\n useCronPreview,\n useCronScheduler,\n} from './context';\n\n// Re-export utilities\nexport {\n buildCron,\n parseCron,\n isValidCron,\n humanizeCron,\n} from './utils';\n\n// Re-export components for custom compositions\nexport {\n ScheduleTypeSelector,\n TimeSelector,\n DayChips,\n MonthDayGrid,\n CustomInput,\n SchedulePreview,\n} from './components';\n\nexport default CronScheduler;\n","'use client';\n\n/**\n * Monaco Editor Web Worker Setup\n *\n * Workers improve performance for language services (TypeScript type-checking,\n * JSON validation, etc.) but require bundler-specific configuration:\n *\n * **Vite**: Use `?worker` imports (see example below)\n * **Next.js/Webpack**: Use `monaco-editor-webpack-plugin`\n * **No config**: Monaco falls back to main-thread execution (fully functional)\n *\n * @example Vite setup (call once in app entry):\n * ```ts\n * import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'\n * import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker'\n * import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker'\n * import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker'\n * import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker'\n *\n * setupMonacoWorkers((label) => {\n * switch (label) {\n * case 'typescript': case 'javascript': return new tsWorker()\n * case 'json': return new jsonWorker()\n * case 'css': case 'scss': case 'less': return new cssWorker()\n * case 'html': case 'handlebars': case 'razor': return new htmlWorker()\n * default: return new editorWorker()\n * }\n * })\n * ```\n *\n * @example Next.js setup:\n * ```ts\n * // next.config.js — add monaco-editor-webpack-plugin\n * // Then just call setupMonacoWorkers() without arguments\n * setupMonacoWorkers()\n * ```\n */\n\ntype GetWorkerFn = (label: string) => Worker;\n\nlet isSetup = false;\n\nexport function setupMonacoWorkers(getWorker?: GetWorkerFn): void {\n if (isSetup || typeof window === 'undefined') return;\n\n if (getWorker) {\n // App provides bundler-specific worker factory\n (self as unknown as { MonacoEnvironment: object }).MonacoEnvironment = {\n getWorker: (_workerId: string, label: string) => getWorker(label),\n };\n }\n // else: don't set MonacoEnvironment at all.\n // - If webpack plugin is installed, it sets MonacoEnvironment automatically.\n // - If nothing sets it, Monaco falls back to main-thread execution.\n\n isSetup = true;\n}\n","'use client';\n\nimport { useState, useEffect } from 'react';\nimport type * as MonacoEditor from 'monaco-editor';\n\nimport { setupMonacoWorkers } from '../workers/setup';\nimport type { UseMonacoReturn } from '../types';\n\n/**\n * Hook to load and access Monaco Editor instance\n *\n * Handles:\n * - Dynamic import of Monaco (client-side only)\n * - Web worker configuration\n * - Loading state management\n *\n * @example\n * ```tsx\n * const { monaco, isLoading, error } = useMonaco();\n *\n * if (isLoading) return <Spinner />;\n * if (error) return <Error message={error.message} />;\n *\n * // Use monaco API\n * monaco.editor.create(...)\n * ```\n */\nexport function useMonaco(): UseMonacoReturn {\n const [monaco, setMonaco] = useState<typeof MonacoEditor | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n let mounted = true;\n\n async function loadMonaco() {\n try {\n // Setup workers first\n setupMonacoWorkers();\n\n // Dynamic import Monaco\n const monacoModule = await import('monaco-editor');\n\n if (mounted) {\n setMonaco(monacoModule);\n setIsLoading(false);\n }\n } catch (err) {\n if (mounted) {\n setError(err instanceof Error ? err : new Error('Failed to load Monaco Editor'));\n setIsLoading(false);\n }\n }\n }\n\n loadMonaco();\n\n return () => {\n mounted = false;\n };\n }, []);\n\n return { monaco, isLoading, error };\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\nimport { useResolvedTheme } from '@djangocfg/ui-core/hooks';\n\n/**\n * Hook that syncs Monaco editor theme with the app theme.\n *\n * Reads CSS variables from the document and creates custom Monaco themes\n * that match the current light/dark mode. Falls back to built-in 'vs' / 'vs-dark'.\n *\n * @param monaco - Monaco namespace (null during loading)\n * @param themeOverride - Optional explicit theme name (skips auto-detection)\n * @returns Resolved Monaco theme name to pass to editor options\n */\nexport function useEditorTheme(\n monaco: typeof import('monaco-editor') | null,\n themeOverride?: string,\n): string {\n const appTheme = useResolvedTheme();\n const registered = useRef(false);\n\n // Register custom themes once Monaco is loaded\n useEffect(() => {\n if (!monaco || registered.current) return;\n\n try {\n const colors = _readCSSColors();\n\n monaco.editor.defineTheme('app-dark', {\n base: 'vs-dark',\n inherit: true,\n rules: [\n { token: 'comment', foreground: '6A9955', fontStyle: 'italic' },\n { token: 'keyword', foreground: 'C586C0' },\n { token: 'string', foreground: 'CE9178' },\n { token: 'number', foreground: 'B5CEA8' },\n { token: 'type', foreground: '4EC9B0' },\n { token: 'function', foreground: 'DCDCAA' },\n { token: 'variable', foreground: '9CDCFE' },\n ],\n colors: {\n 'editor.background': colors.background,\n 'editor.foreground': colors.foreground,\n 'editor.lineHighlightBackground': colors.lineHighlight,\n 'editor.selectionBackground': colors.selection,\n 'editorCursor.foreground': colors.foreground,\n 'editorLineNumber.foreground': colors.mutedForeground,\n 'editorWidget.background': colors.card,\n 'editorWidget.border': colors.border,\n 'input.background': colors.card,\n 'dropdown.background': colors.card,\n },\n });\n\n monaco.editor.defineTheme('app-light', {\n base: 'vs',\n inherit: true,\n rules: [\n { token: 'comment', foreground: '008000', fontStyle: 'italic' },\n { token: 'keyword', foreground: 'AF00DB' },\n { token: 'string', foreground: 'A31515' },\n { token: 'number', foreground: '098658' },\n { token: 'type', foreground: '267F99' },\n { token: 'function', foreground: '795E26' },\n { token: 'variable', foreground: '001080' },\n ],\n colors: {\n 'editor.background': colors.backgroundLight,\n 'editor.foreground': colors.foregroundLight,\n 'editor.lineHighlightBackground': colors.lineHighlightLight,\n 'editor.selectionBackground': colors.selectionLight,\n 'editorLineNumber.foreground': colors.mutedForegroundLight,\n 'editorWidget.background': colors.cardLight,\n 'editorWidget.border': colors.borderLight,\n },\n });\n\n registered.current = true;\n } catch {\n // Fallback — use built-in themes\n }\n }, [monaco]);\n\n // If explicit override provided, use it\n if (themeOverride) return themeOverride;\n\n // Use registered app themes if available, fallback to built-in\n if (registered.current) {\n return appTheme === 'dark' ? 'app-dark' : 'app-light';\n }\n return appTheme === 'dark' ? 'vs-dark' : 'vs';\n}\n\n\n/** Read CSS variables and convert HSL to hex for Monaco */\nfunction _readCSSColors() {\n const get = (varName: string): string => {\n if (typeof document === 'undefined') return '';\n return getComputedStyle(document.documentElement).getPropertyValue(varName).trim();\n };\n\n const hslToHex = (hsl: string): string => {\n if (!hsl) return '';\n // CSS vars are \"0 0% 96%\" — strip % before parsing\n const parts = hsl.split(/\\s+/).map(s => parseFloat(s.replace('%', '')));\n if (parts.length < 3 || parts.some(isNaN)) return '';\n const [h, s, l] = [parts[0], parts[1] / 100, parts[2] / 100];\n\n const a = s * Math.min(l, 1 - l);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color).toString(16).padStart(2, '0');\n };\n return `#${f(0)}${f(8)}${f(4)}`;\n };\n\n // Read current (dark) theme CSS variables\n const background = hslToHex(get('--background')) || '#0a0a0a';\n const foreground = hslToHex(get('--foreground')) || '#f5f5f5';\n const card = hslToHex(get('--card')) || '#141414';\n const border = hslToHex(get('--border')) || '#262626';\n const mutedForeground = hslToHex(get('--muted-foreground')) || '#858585';\n\n // Compute derived colors\n const lineHighlight = _adjustBrightness(background, 10);\n const primary = hslToHex(get('--primary'));\n const selection = primary ? _adjustBrightness(primary, -40) : '#264F78';\n\n // Light theme colors (hardcoded since we can't switch CSS context)\n return {\n background,\n foreground,\n card,\n border,\n mutedForeground,\n lineHighlight,\n selection,\n // Light variants\n backgroundLight: '#ffffff',\n foregroundLight: '#1a1a1a',\n cardLight: '#ffffff',\n borderLight: '#e5e5e5',\n mutedForegroundLight: '#737373',\n lineHighlightLight: '#f5f5f5',\n selectionLight: '#ADD6FF',\n };\n}\n\nfunction _adjustBrightness(hex: string, amount: number): string {\n const num = parseInt(hex.replace('#', ''), 16);\n const r = Math.min(255, Math.max(0, ((num >> 16) & 0xff) + amount));\n const g = Math.min(255, Math.max(0, ((num >> 8) & 0xff) + amount));\n const b = Math.min(255, Math.max(0, (num & 0xff) + amount));\n return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, '0')}`;\n}\n\n","'use client';\n\nimport { useRef, useEffect, useState, useCallback, forwardRef, useImperativeHandle } from 'react';\nimport type * as monaco from 'monaco-editor';\n\nimport { useMonaco } from '../hooks/useMonaco';\nimport { useEditorTheme } from '../hooks/useEditorTheme';\nimport type { EditorProps } from '../types';\n\nexport interface EditorRef {\n /** Get editor instance */\n getEditor: () => monaco.editor.IStandaloneCodeEditor | null;\n /** Get current value */\n getValue: () => string;\n /** Set value */\n setValue: (value: string) => void;\n /** Focus editor */\n focus: () => void;\n}\n\n/**\n * Monaco Editor Component\n *\n * A React wrapper around Monaco Editor with full TypeScript support.\n *\n * @example\n * ```tsx\n * <Editor\n * value={code}\n * language=\"typescript\"\n * onChange={(value) => setCode(value)}\n * options={{ fontSize: 14, minimap: false }}\n * />\n * ```\n */\nexport const Editor = forwardRef<EditorRef, EditorProps>(function Editor(\n {\n value = '',\n language = 'plaintext',\n onChange,\n onMount,\n options = {},\n className = '',\n height = '100%',\n width = '100%',\n autoHeight = false,\n minHeight = 100,\n maxHeight = 600,\n },\n ref\n) {\n const containerRef = useRef<HTMLDivElement>(null);\n const editorRef = useRef<monaco.editor.IStandaloneCodeEditor | null>(null);\n const { monaco, isLoading } = useMonaco();\n const resolvedTheme = useEditorTheme(monaco, options.theme);\n\n // Auto-height state\n const [contentHeight, setContentHeight] = useState<number | null>(null);\n\n const updateContentHeight = useCallback((editor: monaco.editor.IStandaloneCodeEditor) => {\n if (!autoHeight) return;\n const h = editor.getContentHeight();\n setContentHeight(Math.min(Math.max(h, minHeight), maxHeight));\n }, [autoHeight, minHeight, maxHeight]);\n\n // Track internal changes to prevent cursor reset on prop sync\n const isInternalChangeRef = useRef(false);\n\n // Expose editor methods via ref\n useImperativeHandle(ref, () => ({\n getEditor: () => editorRef.current,\n getValue: () => editorRef.current?.getValue() || '',\n setValue: (val: string) => editorRef.current?.setValue(val),\n focus: () => editorRef.current?.focus(),\n }));\n\n // Create editor\n useEffect(() => {\n if (!monaco || !containerRef.current || editorRef.current) return;\n\n const editor = monaco.editor.create(containerRef.current, {\n value,\n language,\n theme: resolvedTheme,\n fontSize: options.fontSize || 14,\n fontFamily: options.fontFamily || \"'Fira Code', 'Consolas', monospace\",\n tabSize: options.tabSize || 2,\n insertSpaces: options.insertSpaces !== false,\n wordWrap: options.wordWrap || 'on',\n minimap: { enabled: options.minimap !== false },\n lineNumbers: options.lineNumbers || 'on',\n readOnly: options.readOnly || false,\n automaticLayout: true,\n scrollBeyondLastLine: autoHeight ? false : false,\n scrollbar: autoHeight ? { vertical: 'hidden', horizontal: 'auto' } : undefined,\n overviewRulerLanes: autoHeight ? 0 : undefined,\n padding: { top: 16, bottom: 16 },\n renderLineHighlight: 'all',\n cursorBlinking: 'smooth',\n cursorSmoothCaretAnimation: 'on',\n smoothScrolling: true,\n bracketPairColorization: { enabled: true },\n guides: {\n bracketPairs: true,\n indentation: true,\n },\n });\n\n editorRef.current = editor;\n\n // Setup change listener\n if (onChange) {\n editor.onDidChangeModelContent(() => {\n // Mark as internal change to prevent cursor reset on prop sync\n isInternalChangeRef.current = true;\n onChange(editor.getValue());\n });\n }\n\n // Auto-height: resize container to fit content\n if (autoHeight) {\n editor.onDidContentSizeChange(() => updateContentHeight(editor));\n updateContentHeight(editor);\n }\n\n // Call onMount callback\n onMount?.(editor);\n\n return () => {\n editor.dispose();\n editorRef.current = null;\n };\n }, [monaco]);\n\n // Update value when prop changes (only for external changes)\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n\n // Skip if this is an internal change (user typing) - prevents cursor reset\n if (isInternalChangeRef.current) {\n isInternalChangeRef.current = false;\n return;\n }\n\n const currentValue = editor.getValue();\n if (value !== currentValue) {\n // Save cursor position\n const position = editor.getPosition();\n const selections = editor.getSelections();\n\n editor.setValue(value);\n\n // Restore cursor position if possible\n if (position) {\n editor.setPosition(position);\n }\n if (selections && selections.length > 0) {\n editor.setSelections(selections);\n }\n }\n }, [value]);\n\n // Update language when prop changes\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor || !monaco) return;\n\n const model = editor.getModel();\n if (model) {\n monaco.editor.setModelLanguage(model, language);\n }\n }, [language, monaco]);\n\n // Update options when props change\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n\n editor.updateOptions({\n theme: resolvedTheme,\n fontSize: options.fontSize,\n readOnly: options.readOnly,\n minimap: { enabled: options.minimap !== false },\n wordWrap: options.wordWrap,\n lineNumbers: options.lineNumbers,\n });\n }, [options, resolvedTheme]);\n\n if (isLoading) {\n return (\n <div\n className={className}\n style={{\n width,\n height,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#1e1e1e',\n color: '#666',\n }}\n >\n Loading editor...\n </div>\n );\n }\n\n const resolvedHeight = autoHeight && contentHeight != null ? contentHeight : height;\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={{\n width,\n height: resolvedHeight,\n ...(autoHeight && { minHeight: minHeight, maxHeight: maxHeight, overflow: 'hidden' }),\n }}\n />\n );\n});\n","'use client';\n\nimport { useRef, useEffect } from 'react';\nimport type * as monaco from 'monaco-editor';\n\nimport { useMonaco } from '../hooks/useMonaco';\nimport { useEditorTheme } from '../hooks/useEditorTheme';\nimport type { DiffEditorProps } from '../types';\n\n/**\n * Monaco Diff Editor Component\n *\n * Side-by-side or inline diff view for comparing two versions of content.\n *\n * @example\n * ```tsx\n * <DiffEditor\n * original={originalCode}\n * modified={modifiedCode}\n * language=\"typescript\"\n * />\n * ```\n */\nexport function DiffEditor({\n original,\n modified,\n language = 'plaintext',\n options = {},\n className = '',\n height = '100%',\n}: DiffEditorProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const editorRef = useRef<monaco.editor.IStandaloneDiffEditor | null>(null);\n const { monaco, isLoading } = useMonaco();\n const resolvedTheme = useEditorTheme(monaco, options.theme);\n\n // Create diff editor\n useEffect(() => {\n if (!monaco || !containerRef.current || editorRef.current) return;\n\n const editor = monaco.editor.createDiffEditor(containerRef.current, {\n theme: resolvedTheme,\n fontSize: options.fontSize || 14,\n fontFamily: options.fontFamily || \"'Fira Code', 'Consolas', monospace\",\n readOnly: true,\n automaticLayout: true,\n renderSideBySide: true,\n scrollBeyondLastLine: false,\n minimap: { enabled: false },\n });\n\n const originalModel = monaco.editor.createModel(original, language);\n const modifiedModel = monaco.editor.createModel(modified, language);\n\n editor.setModel({\n original: originalModel,\n modified: modifiedModel,\n });\n\n editorRef.current = editor;\n\n return () => {\n originalModel.dispose();\n modifiedModel.dispose();\n editor.dispose();\n editorRef.current = null;\n };\n }, [monaco]);\n\n // Update models when content changes\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor || !monaco) return;\n\n const model = editor.getModel();\n if (model) {\n model.original.setValue(original);\n model.modified.setValue(modified);\n }\n }, [original, modified, monaco]);\n\n // Update language\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor || !monaco) return;\n\n const model = editor.getModel();\n if (model) {\n monaco.editor.setModelLanguage(model.original, language);\n monaco.editor.setModelLanguage(model.modified, language);\n }\n }, [language, monaco]);\n\n if (isLoading) {\n return (\n <div\n className={className}\n style={{\n width: '100%',\n height,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#1e1e1e',\n color: '#666',\n }}\n >\n Loading diff editor...\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={{\n width: '100%',\n height,\n }}\n />\n );\n}\n","/**\n * Language Detection & Mapping\n *\n * Maps file extensions to Monaco Editor language IDs.\n * Monaco supports 80+ languages out of the box.\n */\n\n/**\n * File extension to Monaco language ID mapping\n */\nexport const LANGUAGE_MAP: Record<string, string> = {\n // Web\n '.html': 'html',\n '.htm': 'html',\n '.xhtml': 'html',\n '.vue': 'html',\n '.svelte': 'html',\n\n // CSS\n '.css': 'css',\n '.scss': 'scss',\n '.sass': 'scss',\n '.less': 'less',\n\n // JavaScript/TypeScript\n '.js': 'javascript',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n '.jsx': 'javascript',\n '.ts': 'typescript',\n '.tsx': 'typescript',\n '.mts': 'typescript',\n '.cts': 'typescript',\n\n // Data formats\n '.json': 'json',\n '.jsonc': 'json',\n '.json5': 'json',\n '.yaml': 'yaml',\n '.yml': 'yaml',\n '.toml': 'ini',\n '.xml': 'xml',\n '.svg': 'xml',\n '.xsl': 'xml',\n '.xsd': 'xml',\n\n // Markdown & Documentation\n '.md': 'markdown',\n '.mdx': 'markdown',\n '.markdown': 'markdown',\n '.rst': 'restructuredtext',\n '.txt': 'plaintext',\n '.text': 'plaintext',\n\n // Programming languages\n '.py': 'python',\n '.pyw': 'python',\n '.pyi': 'python',\n '.rb': 'ruby',\n '.rake': 'ruby',\n '.gemspec': 'ruby',\n '.php': 'php',\n '.phtml': 'php',\n '.java': 'java',\n '.kt': 'kotlin',\n '.kts': 'kotlin',\n '.scala': 'scala',\n '.go': 'go',\n '.rs': 'rust',\n '.swift': 'swift',\n '.c': 'c',\n '.h': 'c',\n '.cpp': 'cpp',\n '.cc': 'cpp',\n '.cxx': 'cpp',\n '.hpp': 'cpp',\n '.hxx': 'cpp',\n '.cs': 'csharp',\n '.fs': 'fsharp',\n '.fsx': 'fsharp',\n '.vb': 'vb',\n '.lua': 'lua',\n '.r': 'r',\n '.R': 'r',\n '.m': 'objective-c',\n '.mm': 'objective-c',\n '.pl': 'perl',\n '.pm': 'perl',\n '.ex': 'elixir',\n '.exs': 'elixir',\n '.erl': 'erlang',\n '.hrl': 'erlang',\n '.clj': 'clojure',\n '.cljs': 'clojure',\n '.cljc': 'clojure',\n '.hs': 'haskell',\n '.lhs': 'haskell',\n '.ml': 'fsharp',\n '.mli': 'fsharp',\n '.dart': 'dart',\n '.groovy': 'groovy',\n '.gradle': 'groovy',\n '.jl': 'julia',\n\n // Shell & Scripts\n '.sh': 'shell',\n '.bash': 'shell',\n '.zsh': 'shell',\n '.fish': 'shell',\n '.ps1': 'powershell',\n '.psm1': 'powershell',\n '.psd1': 'powershell',\n '.bat': 'bat',\n '.cmd': 'bat',\n\n // Config files\n '.ini': 'ini',\n '.cfg': 'ini',\n '.conf': 'ini',\n '.properties': 'ini',\n '.env': 'ini',\n '.gitignore': 'ini',\n '.gitattributes': 'ini',\n '.editorconfig': 'ini',\n '.npmrc': 'ini',\n\n // Database\n '.sql': 'sql',\n '.mysql': 'mysql',\n '.pgsql': 'pgsql',\n '.plsql': 'plsql',\n '.redis': 'redis',\n\n // Templates\n '.hbs': 'handlebars',\n '.handlebars': 'handlebars',\n '.mustache': 'handlebars',\n '.ejs': 'html',\n '.pug': 'pug',\n '.jade': 'pug',\n '.twig': 'twig',\n '.liquid': 'liquid',\n\n // GraphQL\n '.graphql': 'graphql',\n '.gql': 'graphql',\n\n // Docker\n '.dockerfile': 'dockerfile',\n\n // Other\n '.diff': 'diff',\n '.patch': 'diff',\n '.log': 'log',\n '.tex': 'latex',\n '.cls': 'latex',\n '.sty': 'latex',\n '.proto': 'protobuf',\n '.sol': 'sol',\n '.asm': 'mips',\n '.s': 'mips',\n '.wasm': 'wasm',\n};\n\n/**\n * Special filename mappings (without extension)\n */\nconst FILENAME_MAP: Record<string, string> = {\n Dockerfile: 'dockerfile',\n 'docker-compose.yml': 'yaml',\n 'docker-compose.yaml': 'yaml',\n Makefile: 'makefile',\n makefile: 'makefile',\n Gemfile: 'ruby',\n Rakefile: 'ruby',\n Jenkinsfile: 'groovy',\n Vagrantfile: 'ruby',\n '.bashrc': 'shell',\n '.bash_profile': 'shell',\n '.zshrc': 'shell',\n '.profile': 'shell',\n '.vimrc': 'plaintext',\n '.gitconfig': 'ini',\n '.htaccess': 'ini',\n 'nginx.conf': 'ini',\n 'package.json': 'json',\n 'tsconfig.json': 'json',\n 'jsconfig.json': 'json',\n '.prettierrc': 'json',\n '.eslintrc': 'json',\n 'composer.json': 'json',\n 'Cargo.toml': 'ini',\n 'go.mod': 'go',\n 'go.sum': 'plaintext',\n 'requirements.txt': 'plaintext',\n 'pyproject.toml': 'ini',\n 'setup.py': 'python',\n 'setup.cfg': 'ini',\n};\n\n/**\n * Get Monaco language ID from file extension\n */\nexport function getLanguageByExtension(extension: string): string {\n const ext = extension.startsWith('.') ? extension.toLowerCase() : `.${extension.toLowerCase()}`;\n return LANGUAGE_MAP[ext] || 'plaintext';\n}\n\n/**\n * Get Monaco language ID from filename\n * Checks special filenames first, then falls back to extension\n */\nexport function getLanguageByFilename(filename: string): string {\n // Check special filenames first\n if (FILENAME_MAP[filename]) {\n return FILENAME_MAP[filename];\n }\n\n // Extract extension\n const lastDot = filename.lastIndexOf('.');\n if (lastDot === -1) {\n return 'plaintext';\n }\n\n const extension = filename.slice(lastDot).toLowerCase();\n return LANGUAGE_MAP[extension] || 'plaintext';\n}\n","'use client';\n\nimport { createContext, useContext, useState, useCallback, useMemo } from 'react';\nimport type * as monaco from 'monaco-editor';\n\nimport { useMonaco } from '../hooks/useMonaco';\nimport { getLanguageByFilename } from '../lib/languages';\nimport type { EditorFile, EditorContextValue } from '../types';\n\nconst EditorContext = createContext<EditorContextValue | null>(null);\n\n/**\n * Hook to access editor context\n * Must be used within EditorProvider\n */\nexport function useEditorContext(): EditorContextValue {\n const context = useContext(EditorContext);\n if (!context) {\n throw new Error('useEditorContext must be used within EditorProvider');\n }\n return context;\n}\n\ninterface EditorProviderProps {\n children: React.ReactNode;\n /** Callback when file save is requested */\n onSave?: (path: string, content: string) => Promise<void>;\n}\n\n/**\n * Editor Context Provider\n *\n * Manages multiple open files, active file state, and editor instance.\n *\n * @example\n * ```tsx\n * <EditorProvider onSave={handleSave}>\n * <EditorTabs />\n * <Editor />\n * </EditorProvider>\n * ```\n */\nexport function EditorProvider({ children, onSave }: EditorProviderProps) {\n const { monaco } = useMonaco();\n const [editor, setEditor] = useState<monaco.editor.IStandaloneCodeEditor | null>(null);\n const [openFiles, setOpenFiles] = useState<EditorFile[]>([]);\n const [activeFilePath, setActiveFilePath] = useState<string | null>(null);\n\n // Get active file\n const activeFile = useMemo(\n () => openFiles.find((f) => f.path === activeFilePath) || null,\n [openFiles, activeFilePath]\n );\n\n // Open a file\n const openFile = useCallback(\n (path: string, content: string, language?: string) => {\n setOpenFiles((files) => {\n // Check if already open\n const existing = files.find((f) => f.path === path);\n if (existing) {\n return files;\n }\n\n // Detect language from filename\n const basename = path.split('/').pop() || path;\n const detectedLanguage = language || getLanguageByFilename(basename);\n\n // Create new file entry\n const newFile: EditorFile = {\n path,\n content,\n language: detectedLanguage,\n isDirty: false,\n };\n\n return [...files, newFile];\n });\n\n // Set as active\n setActiveFilePath(path);\n },\n []\n );\n\n // Close a file\n const closeFile = useCallback(\n (path: string) => {\n setOpenFiles((files) => {\n const index = files.findIndex((f) => f.path === path);\n if (index === -1) return files;\n\n const newFiles = files.filter((f) => f.path !== path);\n\n // If closing active file, activate adjacent file\n if (activeFilePath === path && newFiles.length > 0) {\n const newIndex = Math.min(index, newFiles.length - 1);\n setActiveFilePath(newFiles[newIndex].path);\n } else if (newFiles.length === 0) {\n setActiveFilePath(null);\n }\n\n return newFiles;\n });\n },\n [activeFilePath]\n );\n\n // Set active file\n const setActiveFile = useCallback((path: string) => {\n setActiveFilePath(path);\n }, []);\n\n // Update file content\n const updateContent = useCallback((path: string, content: string) => {\n setOpenFiles((files) =>\n files.map((f) =>\n f.path === path\n ? { ...f, content, isDirty: true }\n : f\n )\n );\n }, []);\n\n // Save file\n const saveFile = useCallback(\n async (path: string) => {\n const file = openFiles.find((f) => f.path === path);\n if (!file) return;\n\n if (onSave) {\n await onSave(path, file.content);\n }\n\n // Mark as not dirty\n setOpenFiles((files) =>\n files.map((f) =>\n f.path === path ? { ...f, isDirty: false } : f\n )\n );\n },\n [openFiles, onSave]\n );\n\n // Check if file is dirty\n const isDirty = useCallback(\n (path: string) => {\n const file = openFiles.find((f) => f.path === path);\n return file?.isDirty || false;\n },\n [openFiles]\n );\n\n // Get file content\n const getContent = useCallback(\n (path: string) => {\n const file = openFiles.find((f) => f.path === path);\n return file?.content || null;\n },\n [openFiles]\n );\n\n // Get file by path\n const getFile = useCallback(\n (path: string) => {\n return openFiles.find((f) => f.path === path) || null;\n },\n [openFiles]\n );\n\n const value: EditorContextValue = {\n openFiles,\n activeFile,\n monaco,\n editor,\n isReady: monaco !== null && editor !== null,\n\n openFile,\n closeFile,\n setActiveFile,\n updateContent,\n saveFile,\n\n isDirty,\n getContent,\n getFile,\n };\n\n return (\n <EditorContext.Provider value={value}>\n {children}\n </EditorContext.Provider>\n );\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport type * as monaco from 'monaco-editor';\n\nimport type { UseEditorReturn } from '../types';\n\n/**\n * Hook to manage editor instance reference\n *\n * @example\n * ```tsx\n * const { editor, isReady, setEditor } = useEditor();\n *\n * // Pass setEditor to Editor component's onMount\n * <Editor onMount={setEditor} />\n *\n * // Use editor when ready\n * if (isReady) {\n * editor.getModel()?.getValue();\n * }\n * ```\n */\nexport function useEditor(): UseEditorReturn {\n const [editor, setEditorState] = useState<monaco.editor.IStandaloneCodeEditor | null>(null);\n\n const setEditor = useCallback((editorInstance: monaco.editor.IStandaloneCodeEditor | null) => {\n setEditorState(editorInstance);\n }, []);\n\n return {\n editor,\n isReady: editor !== null,\n setEditor,\n };\n}\n","'use client';\n\nimport { useMemo } from 'react';\nimport { getLanguageByFilename } from '../lib/languages';\n\n/**\n * Hook to detect language from filename\n *\n * @param filename - File name or path\n * @returns Monaco language ID\n *\n * @example\n * ```tsx\n * const language = useLanguage('app.tsx');\n * // Returns: 'typescript'\n *\n * const language2 = useLanguage('/path/to/Dockerfile');\n * // Returns: 'dockerfile'\n * ```\n */\nexport function useLanguage(filename: string | undefined): string {\n return useMemo(() => {\n if (!filename) return 'plaintext';\n\n // Extract basename from path\n const basename = filename.split('/').pop() || filename;\n return getLanguageByFilename(basename);\n }, [filename]);\n}\n","'use client';\n\nimport { forwardRef, useImperativeHandle, useState, useCallback, useEffect, type KeyboardEvent } from 'react';\nimport type { MentionItem } from './types';\n\nexport interface MentionListRef {\n onKeyDown: (event: KeyboardEvent) => boolean;\n}\n\ninterface MentionListProps {\n items: MentionItem[];\n command: (item: MentionItem) => void;\n}\n\nexport const MentionList = forwardRef<MentionListRef, MentionListProps>(\n ({ items, command }, ref) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useEffect(() => setSelectedIndex(0), [items]);\n\n const select = useCallback(\n (index: number) => {\n const item = items[index];\n if (item) command(item);\n },\n [items, command],\n );\n\n useImperativeHandle(ref, () => ({\n onKeyDown: (event: KeyboardEvent) => {\n if (event.key === 'ArrowUp') {\n setSelectedIndex((i) => (i + items.length - 1) % items.length);\n return true;\n }\n if (event.key === 'ArrowDown') {\n setSelectedIndex((i) => (i + 1) % items.length);\n return true;\n }\n if (event.key === 'Enter') {\n select(selectedIndex);\n return true;\n }\n return false;\n },\n }));\n\n if (items.length === 0) return null;\n\n return (\n <div className=\"markdown-mention-list\">\n {items.map((item, i) => {\n const isSelected = i === selectedIndex;\n const cls = `markdown-mention-item ${isSelected ? 'selected' : ''}`;\n return (\n <button key={item.id} type=\"button\" className={cls} onClick={() => select(i)}>\n {item.thumbnail && (\n <img src={item.thumbnail} alt=\"\" className=\"markdown-mention-avatar\" />\n )}\n <div className=\"markdown-mention-info\">\n <span className=\"markdown-mention-name\">{item.label}</span>\n {item.description && (\n <span className=\"markdown-mention-desc\">{item.description}</span>\n )}\n </div>\n </button>\n );\n })}\n </div>\n );\n },\n);\n\nMentionList.displayName = 'MentionList';\n","import { ReactRenderer } from '@tiptap/react';\nimport type { SuggestionOptions } from '@tiptap/suggestion';\nimport { autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { MentionList, type MentionListRef } from './MentionList';\nimport type { MentionItem, MentionConfig } from './types';\n\nexport function createMentionSuggestion(\n config: MentionConfig,\n): Omit<SuggestionOptions<MentionItem>, 'editor'> {\n const { maxItems = 5, trigger = '@' } = config;\n\n return {\n char: trigger,\n\n items: ({ query }) => {\n const q = query.toLowerCase();\n return config.items\n .filter((item) => item.label.toLowerCase().includes(q))\n .slice(0, maxItems);\n },\n\n render: () => {\n let component: ReactRenderer<MentionListRef> | null = null;\n let popup: HTMLDivElement | null = null;\n let cleanupAutoUpdate: (() => void) | null = null;\n let getReferenceRect: (() => DOMRect | null) | null = null;\n\n // Floating-UI virtual element backed by Tiptap's clientRect.\n // We re-read it on every reposition so caret movement is tracked.\n const buildVirtualElement = () => ({\n getBoundingClientRect: () => {\n const rect = getReferenceRect?.();\n // Fallback to a zero-sized rect at origin if the editor is detached\n // (e.g. mid-teardown). Floating-UI tolerates this.\n return rect ?? new DOMRect(0, 0, 0, 0);\n },\n });\n\n const updatePosition = () => {\n if (!popup) return;\n const virtualEl = buildVirtualElement();\n void computePosition(virtualEl, popup, {\n placement: 'bottom-start',\n middleware: [\n offset(4),\n flip({ fallbackPlacements: ['top-start'] }),\n shift({ padding: 8 }),\n ],\n }).then(({ x, y }) => {\n if (!popup) return;\n // transform is more performant than top/left and avoids\n // sub-pixel layout thrash during scroll/resize.\n popup.style.transform = `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`;\n });\n };\n\n const teardown = () => {\n cleanupAutoUpdate?.();\n cleanupAutoUpdate = null;\n popup?.remove();\n popup = null;\n component?.destroy();\n component = null;\n getReferenceRect = null;\n };\n\n return {\n onStart: (props) => {\n component = new ReactRenderer(MentionList, {\n props: {\n items: props.items,\n command: (item: MentionItem) => {\n props.command({ id: item.id, label: item.label });\n },\n },\n editor: props.editor,\n });\n\n popup = document.createElement('div');\n // top/left at 0; actual position is applied via transform by computePosition.\n popup.style.cssText = 'position: absolute; top: 0; left: 0; z-index: 99999;';\n popup.appendChild(component.element);\n document.body.appendChild(popup);\n\n getReferenceRect = () => props.clientRect?.() ?? null;\n\n // autoUpdate handles scroll, resize, ancestor scroll/resize, layout shifts.\n // It calls updatePosition synchronously on registration too — no manual first call needed.\n const virtualEl = buildVirtualElement();\n cleanupAutoUpdate = autoUpdate(virtualEl, popup, updatePosition);\n },\n\n onUpdate: (props) => {\n component?.updateProps({\n items: props.items,\n command: (item: MentionItem) => {\n props.command({ id: item.id, label: item.label });\n },\n });\n\n // Refresh reference accessor so autoUpdate sees the new caret rect.\n getReferenceRect = () => props.clientRect?.() ?? null;\n updatePosition();\n },\n\n onKeyDown: (props) => {\n if (props.event.key === 'Escape') {\n teardown();\n return true;\n }\n return component?.ref?.onKeyDown(props.event as unknown as React.KeyboardEvent) ?? false;\n },\n\n onExit: () => {\n teardown();\n },\n };\n },\n };\n}\n","import type { MentionMarkdownRenderer } from './types';\n\n/**\n * Escape characters that have meaning in markdown link/inline contexts.\n * Conservative — covers the chars that would break `[text](url)` and\n * inline emphasis when a label contains them.\n */\nconst escapeMd = (s: string): string => s.replace(/([\\\\\\[\\]()_*~`])/g, '\\\\$1');\n\n/**\n * Built-in serializers for the `MentionConfig.renderMarkdown` callback.\n *\n * Pick one based on what consumes the markdown:\n *\n * - LLM / chat composer → `plainAt` (the default)\n * - Plain text export → `plainLabel`\n * - Web app with deep-link → `markdownLink(baseUrl)`\n * - Notion / Linear-style → `customUri(scheme, kind)`\n * - Slack-style id refs → `slackStyle`\n * - HTML-allowing renderer → `htmlSpan(className?)`\n *\n * Or pass a custom function — the type is just `(attrs) => string`.\n */\nexport const mentionPresets = {\n /** \"@Label\" — default, ideal for chat where LLMs read the text. */\n plainAt: (({ label, id }) => `@${label || id}`) as MentionMarkdownRenderer,\n\n /** \"Label\" — bare label, no @ prefix. */\n plainLabel: (({ label, id }) => label || id) as MentionMarkdownRenderer,\n\n /** \"[@Label](baseUrl/id)\" — clickable markdown link. */\n markdownLink: (baseUrl: string): MentionMarkdownRenderer =>\n ({ label, id }) =>\n `[@${escapeMd(label || id)}](${baseUrl}${encodeURIComponent(id)})`,\n\n /** \"@[Label](scheme://kind/id)\" — Notion / Linear-style custom URI. */\n customUri: (scheme: string, kind: string): MentionMarkdownRenderer =>\n ({ label, id }) =>\n `@[${escapeMd(label || id)}](${scheme}://${kind}/${encodeURIComponent(id)})`,\n\n /** \"<@id>\" — Slack-style id-only reference (label dropped — receivers resolve it). */\n slackStyle: (({ id }) => `<@${id}>`) as MentionMarkdownRenderer,\n\n /** Inline HTML span — for products that consume markdown with raw HTML allowed. */\n htmlSpan:\n (className = 'mention'): MentionMarkdownRenderer =>\n ({ label, id }) =>\n `<span class=\"${className}\" data-mention-id=\"${encodeURIComponent(id)}\">@${escapeMd(label || id)}</span>`,\n};\n","// SubmitOnEnter — Tiptap extension that hooks ProseMirror's keymap\n// before StarterKit's HardBreak so Enter consistently submits and\n// Shift+Enter inserts a newline (ChatGPT / Telegram behaviour).\n//\n// Why an extension and not a wrapper `onKeyDown` handler:\n//\n// Tiptap registers its keymaps inside the ProseMirror keymap\n// plugin, which runs in the ProseMirror dispatch pipeline. A React\n// `onKeyDown` / `onKeyDownCapture` on a wrapper div fires AFTER\n// ProseMirror has already committed the HardBreak transaction in\n// the same event tick — so calling `preventDefault()` there is too\n// late: the user sees a hard-break flash in, the React handler\n// then runs its preventDefault, and the next Enter submits.\n//\n// Registering the keybinding via `addKeyboardShortcuts` puts us in\n// the same keymap pipeline at a higher priority than StarterKit's\n// default Enter binding, so we intercept before HardBreak runs.\n//\n// The handler also respects IME composition and the mention popover\n// (Tiptap's suggestion plugin captures Enter when its popover is\n// open — we mirror that by checking `.markdown-mention-list` in the\n// DOM; same predicate the wrapper used).\n\nimport { Extension } from '@tiptap/core';\n\nexport interface SubmitOnEnterOptions {\n /** Fired when Enter is pressed without Shift, no IME composition,\n * and no mention popover open. Return `true` to consume the key\n * (default behaviour), `false` to let ProseMirror handle it (i.e.\n * fall back to HardBreak). */\n onSubmit: () => boolean | void;\n}\n\nexport const SubmitOnEnter = Extension.create<SubmitOnEnterOptions>({\n name: 'submitOnEnter',\n\n addOptions() {\n return {\n // Default no-op — explicit consumer must override. We never\n // intercept Enter unless an onSubmit is wired, so leaving the\n // extension installed with no handler is safe.\n onSubmit: () => false,\n };\n },\n\n addKeyboardShortcuts() {\n return {\n Enter: () => {\n // Mention suggestion popover owns Enter while open.\n // The suggestion plugin renders the list with this class\n // (see createMentionSuggestion.ts).\n if (typeof document !== 'undefined' && document.querySelector('.markdown-mention-list')) {\n return false;\n }\n const result = this.options.onSubmit();\n // Default: consume the key (true). Only let it fall through\n // to HardBreak if onSubmit explicitly returned false.\n return result !== false;\n },\n // Shift+Enter — always insert a newline. Tiptap's StarterKit\n // already binds this to HardBreak; we re-bind to `false` (not\n // handled) so the chain falls through cleanly even if other\n // extensions try to grab Shift+Enter.\n 'Shift-Enter': () => false,\n };\n },\n});\n","'use client';\n\nimport { useEditor, EditorContent, type Editor } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Mention from '@tiptap/extension-mention';\nimport { Markdown } from '@tiptap/markdown';\nimport type { AnyExtension } from '@tiptap/core';\nimport { forwardRef, useEffect, useImperativeHandle, useMemo, useRef } from 'react';\nimport {\n Bold, Italic, Strikethrough, Heading1, Heading2, Heading3,\n List, ListOrdered, Quote, Minus, Code, type LucideIcon,\n} from 'lucide-react';\nimport { createMentionSuggestion } from './createMentionSuggestion';\nimport { mentionPresets } from './mentionPresets';\nimport { SubmitOnEnter } from './submitOnEnter';\nimport type { MentionAttrs, MentionConfig } from './types';\nimport './styles.css';\n\n// ── Helpers ──\n\ninterface MarkdownManager {\n serialize: (json: Record<string, unknown>) => string;\n}\n\nfunction getMarkdown(editor: Editor): string {\n const storage = editor.storage.markdown as { manager?: MarkdownManager } | undefined;\n if (!storage?.manager) return editor.getText();\n return storage.manager.serialize(editor.getJSON());\n}\n\nfunction extractMentionIds(editor: Editor): string[] {\n const ids: string[] = [];\n editor.state.doc.descendants((node) => {\n if (node.type.name === 'mention' && node.attrs.id) {\n ids.push(node.attrs.id as string);\n }\n });\n return [...new Set(ids)];\n}\n\n// ── Types ──\n\nexport interface MarkdownEditorProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n minHeight?: number;\n className?: string;\n disabled?: boolean;\n showToolbar?: boolean;\n /**\n * `@`-mention autocomplete config.\n *\n * IMPORTANT: Tiptap's `useEditor` initialises the editor exactly once.\n * The `Mention` extension is only registered when `mentions` is truthy\n * on the FIRST render — handing in a real config later (e.g. after an\n * async items fetch) silently does nothing, and typing `@` will not\n * open the popover.\n *\n * If you want mentions even with async-loaded items, pass\n * `{ items: [] }` from the very first render and update the array\n * when data arrives. Either keep the `MentionConfig` object identity\n * stable across renders and mutate `items` in place (the suggestion\n * plugin captures the config by closure and reads `items` on each\n * query), or accept that swapping the whole object reference is a\n * no-op for the live editor.\n */\n mentions?: MentionConfig;\n /** Called when mentioned IDs change */\n onMentionIdsChange?: (ids: string[]) => void;\n /**\n * Called when the user presses Enter (without Shift, no IME\n * composition, no mention popover open). When set, Enter submits\n * and Shift+Enter inserts a newline — ChatGPT / Telegram chat\n * behaviour. When omitted, Enter behaves as Tiptap default\n * (HardBreak).\n *\n * Implementation lives in `submitOnEnter.ts` — it's a Tiptap\n * keymap extension, NOT a React wrapper handler. Wrapper-level\n * onKeyDown fires AFTER ProseMirror's keymap commits HardBreak in\n * the same tick; routing through the extension lets us intercept\n * before HardBreak runs.\n *\n * Return value (optional): truthy / undefined = consume the key\n * (default). Return `false` from onSubmit to let Tiptap fall\n * through to HardBreak — useful for guards like \"don't submit an\n * empty draft\".\n */\n onSubmit?: () => boolean | void;\n}\n\n/**\n * Imperative handle exposed via `ref`. Matches `ComposerHandle` from\n * `@djangocfg/ui-tools/chat` so consumers can forward it straight into\n * `useRegisterComposer({ focus, moveCursorToEnd })` — that's what makes\n * voice dictation (`VoiceComposerSlot`) push live text into a TipTap\n * composer.\n */\nexport interface MarkdownEditorHandle {\n /** Move keyboard focus into the editor. */\n focus: () => void;\n /** Place the caret at the end of the document (and focus). */\n moveCursorToEnd: () => void;\n /** Escape hatch — the underlying TipTap `Editor` instance. */\n getEditor: () => Editor | null;\n}\n\n// ── Component ──\n\nexport const MarkdownEditor = forwardRef<MarkdownEditorHandle, MarkdownEditorProps>(function MarkdownEditor(\n {\n value,\n onChange,\n placeholder = 'Write markdown...',\n minHeight = 120,\n className = '',\n disabled = false,\n showToolbar = true,\n mentions,\n onMentionIdsChange,\n onSubmit,\n },\n ref,\n) {\n // Keep the latest onSubmit in a ref so the Tiptap extension's\n // keymap closure always calls the freshest handler — Tiptap's\n // useEditor initialises extensions ONCE on first render. Without\n // the ref the extension would call a stale onSubmit (e.g. one\n // that references an outdated `value`).\n const onSubmitRef = useRef(onSubmit);\n onSubmitRef.current = onSubmit;\n const isExternalUpdate = useRef(false);\n\n // ── Dev-mode trap detector ──\n // Tiptap initialises the editor once with the extensions array from\n // first render. If `mentions` is undefined on mount and becomes\n // truthy later, the Mention extension is never installed and the\n // user-visible @-trigger silently does nothing. Catch this early so\n // future consumers don't spend hours debugging why @ does nothing.\n const initialMentionsDefinedRef = useRef<boolean>(mentions !== undefined);\n const warnedRef = useRef(false);\n if (\n process.env.NODE_ENV !== 'production' &&\n !initialMentionsDefinedRef.current &&\n mentions !== undefined &&\n !warnedRef.current\n ) {\n warnedRef.current = true;\n // eslint-disable-next-line no-console\n console.warn(\n '[MarkdownEditor] `mentions` flipped from undefined to a config ' +\n 'after mount. Tiptap only installs the Mention extension on first ' +\n 'render — the @-popover will NOT work for this editor instance. ' +\n 'Pass `{ items: [] }` from the very first render and mutate `.items` ' +\n 'in place instead.',\n );\n }\n\n const extensions = useMemo(() => {\n const exts: AnyExtension[] = [\n StarterKit.configure({ heading: { levels: [1, 2, 3] } }),\n Placeholder.configure({ placeholder }),\n Markdown,\n // SubmitOnEnter — when the consumer wired an onSubmit, intercept\n // Enter at the keymap level (before StarterKit's HardBreak).\n // The extension calls through `onSubmitRef.current` so handler\n // identity changes don't require an editor rebuild. See\n // submitOnEnter.ts for the keymap-vs-wrapper-handler rationale.\n SubmitOnEnter.configure({\n onSubmit: () => {\n const h = onSubmitRef.current;\n if (!h) return false; // no handler → let Tiptap insert HardBreak\n return h();\n },\n }),\n ];\n\n if (mentions) {\n // ── Why .extend() with renderMarkdown ──\n //\n // Tiptap's `Mention` extension ships a default markdown serializer\n // (via `createInlineMarkdownSpec`, see @tiptap/extension-mention)\n // that emits a shortcode like `[@ id=\"...\" label=\"...\"]`. That's\n // round-trippable but useless for most consumers: a chat composer\n // feeding an LLM wants `@<label>`, a deep-linking app wants a\n // markdown link, etc.\n //\n // `renderText` only affects `editor.getText()` and the rendered\n // node — it does NOT influence `@tiptap/markdown`'s serializer.\n // The serializer reads `renderMarkdown` off the extension config\n // (see MarkdownManager.registerExtension → getExtensionField).\n // Overriding it via `.extend({ renderMarkdown })` replaces the\n // shortcode output with whatever the consumer supplied (or the\n // `plainAt` default — see ./mentionPresets.ts).\n //\n // Renderer-choice capture: useEditor only initialises once, so the\n // chosen renderer is captured by closure on first render. This is\n // intentional — swapping renderers per render would mean tearing\n // the editor down anyway, which we don't do for any other prop.\n //\n // Round-trip note: we intentionally do NOT also override\n // `parseMarkdown` / `markdownTokenizer`. Once a mention is\n // serialized, parsing it back would need the original mention\n // items list to look up the id, which we don't have at parse time.\n // Mentions are write-only by design here — `setContent(value)`\n // after submit gets back a plain string, which is fine for the\n // chat use case.\n const renderMarkdown = mentions.renderMarkdown ?? mentionPresets.plainAt;\n exts.push(\n Mention.extend({\n renderMarkdown(node) {\n const raw = node.attrs as { label?: string | null; id?: string | null };\n const attrs: MentionAttrs = {\n id: raw?.id ?? '',\n label: raw?.label ?? '',\n };\n // Defensive: if both are empty (shouldn't happen for a real\n // mention node, but `setContent` of malformed data could),\n // emit nothing rather than a stray \"@\" or invalid link.\n if (!attrs.id && !attrs.label) return '';\n return renderMarkdown(attrs);\n },\n }).configure({\n HTMLAttributes: { class: 'markdown-mention' },\n suggestion: createMentionSuggestion(mentions),\n renderText: ({ node }) => `@${node.attrs.label}`,\n }),\n );\n }\n\n return exts;\n }, [placeholder, mentions]);\n\n const editor = useEditor({\n immediatelyRender: false,\n editable: !disabled,\n extensions,\n content: value,\n onUpdate: ({ editor }) => {\n if (isExternalUpdate.current) return;\n onChange(getMarkdown(editor));\n\n if (onMentionIdsChange) {\n onMentionIdsChange(extractMentionIds(editor));\n }\n },\n editorProps: {\n attributes: {\n class: 'markdown-editor-content focus:outline-none text-sm',\n style: `min-height: ${minHeight}px`,\n },\n },\n });\n\n useEffect(() => {\n if (!editor) return;\n const current = getMarkdown(editor);\n if (current !== value) {\n isExternalUpdate.current = true;\n editor.commands.setContent(value);\n isExternalUpdate.current = false;\n }\n }, [value, editor]);\n\n // Imperative API for hosts that drive the editor without owning a\n // TipTap ref directly — chat composer registration, voice slot,\n // focus-on-stream-end.\n useImperativeHandle(\n ref,\n (): MarkdownEditorHandle => ({\n focus: () => {\n editor?.commands.focus();\n },\n moveCursorToEnd: () => {\n editor?.commands.focus('end');\n },\n getEditor: () => editor ?? null,\n }),\n [editor],\n );\n\n const wrapperClass = `markdown-editor rounded-md border border-input bg-background ${disabled ? 'opacity-60' : ''} ${className}`.trim();\n\n return (\n <div className={wrapperClass}>\n {showToolbar && editor && <MarkdownToolbar editor={editor} />}\n <div className=\"px-3 py-2\">\n <EditorContent editor={editor} />\n </div>\n </div>\n );\n});\n\n// ── Toolbar ──\n\ninterface ToolbarItem {\n icon: LucideIcon;\n action: () => void;\n active: boolean;\n title: string;\n}\n\nfunction MarkdownToolbar({ editor }: { editor: Editor }) {\n const items = useMemo<(ToolbarItem | null)[]>(() => [\n { icon: Bold, title: 'Bold', action: () => editor.chain().focus().toggleBold().run(), active: editor.isActive('bold') },\n { icon: Italic, title: 'Italic', action: () => editor.chain().focus().toggleItalic().run(), active: editor.isActive('italic') },\n { icon: Strikethrough, title: 'Strike', action: () => editor.chain().focus().toggleStrike().run(), active: editor.isActive('strike') },\n { icon: Code, title: 'Code', action: () => editor.chain().focus().toggleCode().run(), active: editor.isActive('code') },\n null,\n { icon: Heading1, title: 'H1', action: () => editor.chain().focus().toggleHeading({ level: 1 }).run(), active: editor.isActive('heading', { level: 1 }) },\n { icon: Heading2, title: 'H2', action: () => editor.chain().focus().toggleHeading({ level: 2 }).run(), active: editor.isActive('heading', { level: 2 }) },\n { icon: Heading3, title: 'H3', action: () => editor.chain().focus().toggleHeading({ level: 3 }).run(), active: editor.isActive('heading', { level: 3 }) },\n null,\n { icon: List, title: 'Bullet list', action: () => editor.chain().focus().toggleBulletList().run(), active: editor.isActive('bulletList') },\n { icon: ListOrdered, title: 'Ordered list', action: () => editor.chain().focus().toggleOrderedList().run(), active: editor.isActive('orderedList') },\n { icon: Quote, title: 'Quote', action: () => editor.chain().focus().toggleBlockquote().run(), active: editor.isActive('blockquote') },\n { icon: Minus, title: 'Divider', action: () => editor.chain().focus().setHorizontalRule().run(), active: false },\n ], [editor]);\n\n return (\n <div className=\"flex items-center gap-0.5 px-2 py-1.5 border-b border-border\">\n {items.map((item, i) => {\n if (!item) return <div key={i} className=\"w-px h-4 bg-border mx-1\" />;\n const Icon = item.icon;\n const btnClass = `markdown-toolbar-btn ${item.active ? 'active' : ''}`;\n return (\n <button key={i} type=\"button\" onClick={item.action} title={item.title} className={btnClass}>\n <Icon style={{ width: 14, height: 14 }} />\n </button>\n );\n })}\n </div>\n );\n}\n"]}
|