@djangocfg/ui-tools 2.1.239 → 2.1.241

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/lazy-wrapper.tsx","../src/tools/Mermaid/index.tsx","../src/components/markdown/useCollapsibleContent.ts","../src/components/markdown/MarkdownMessage.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/LottiePlayer/index.tsx","../src/tools/OpenapiViewer/index.tsx","../src/tools/CronScheduler/index.tsx"],"names":["React","lazy","LoadingFallback","jsx","Suspense","jsxs"],"mappings":"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","file":"index.mjs","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","/**\n * Mermaid Component - Dynamic Import Wrapper\n *\n * Lazy loads the heavy Mermaid library (~800KB) only when needed.\n * This significantly reduces the initial bundle size.\n */\n\n'use client';\n\nimport React, { lazy, Suspense } from 'react';\n\n// Lazy load the client component\nconst MermaidClient = lazy(() => import('./Mermaid.client'));\n\n// Loading fallback component\nconst LoadingFallback = () => (\n <div className=\"flex justify-center items-center min-h-[100px]\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-b-2 border-primary\" />\n </div>\n);\n\nexport interface MermaidProps {\n chart: string;\n className?: string;\n isCompact?: boolean;\n /** Enable click-to-fullscreen functionality (default: true) */\n fullscreen?: boolean;\n}\n\nconst Mermaid: React.FC<MermaidProps> = (props) => {\n return (\n <Suspense fallback={<LoadingFallback />}>\n <MermaidClient {...props} />\n </Suspense>\n );\n};\n\nexport default Mermaid;\n\n// Re-export builders for declarative diagram construction\nexport {\n // Core\n DiagramStore,\n sanitizeLabel,\n toNodeId,\n // Theme hooks\n useThemePalette,\n useStylePresets,\n useBoxColors,\n // FlowDiagram\n FlowDiagram,\n STYLE_PRESETS,\n // SequenceDiagram\n SequenceDiagram,\n // JourneyDiagram\n JourneyDiagram,\n} from './builders';\n\nexport type {\n // Core types\n DiagramStoreOptions,\n FlowDirection,\n NodeShape,\n ParticipantType,\n TaskScore,\n // Theme types\n ThemePalette,\n StyleColors,\n StylePresets,\n BoxColors,\n // FlowDiagram types\n FlowDiagramOptions,\n FlowDiagramBuilder,\n NodeBuilder,\n EdgeBuilder,\n StyleBuilder,\n // SequenceDiagram types\n ParticipantsObject,\n SequenceDiagramOptions,\n SequenceDiagramBuilder,\n // JourneyDiagram types\n JourneyDiagramOptions,\n JourneyDiagramBuilder,\n SectionBuilder,\n} from './builders';\n","'use client';\n\nimport { useCallback, useMemo, useState } from 'react';\n\nexport interface UseCollapsibleContentOptions {\n /**\n * Maximum character length before collapsing\n * If both maxLength and maxLines are set, the stricter limit applies\n */\n maxLength?: number;\n /**\n * Maximum number of lines before collapsing\n * If both maxLength and maxLines are set, the stricter limit applies\n */\n maxLines?: number;\n /**\n * Start in expanded state (default: false - starts collapsed)\n */\n defaultExpanded?: boolean;\n}\n\nexport interface UseCollapsibleContentResult {\n /** Whether content is currently collapsed */\n isCollapsed: boolean;\n /** Toggle between collapsed/expanded state */\n toggleCollapsed: () => void;\n /** Set collapsed state directly */\n setCollapsed: (collapsed: boolean) => void;\n /** Content to display (truncated if collapsed, full if expanded) */\n displayContent: string;\n /** Whether the content exceeds limits and should be collapsible */\n shouldCollapse: boolean;\n /** Original content length */\n originalLength: number;\n /** Original line count */\n originalLineCount: number;\n}\n\n/**\n * Smart truncation that doesn't break words or markdown syntax\n */\nfunction smartTruncate(content: string, maxLength: number): string {\n if (content.length <= maxLength) {\n return content;\n }\n\n // Find a good break point (space, newline) near maxLength\n let breakPoint = maxLength;\n\n // Look backwards for a space or newline\n while (breakPoint > maxLength - 50 && breakPoint > 0) {\n const char = content[breakPoint];\n if (char === ' ' || char === '\\n' || char === '\\t') {\n break;\n }\n breakPoint--;\n }\n\n // If we couldn't find a good break point, just use maxLength\n if (breakPoint <= maxLength - 50) {\n breakPoint = maxLength;\n }\n\n let truncated = content.slice(0, breakPoint).trimEnd();\n\n // Fix unclosed markdown syntax\n truncated = fixUnclosedMarkdown(truncated);\n\n return truncated;\n}\n\n/**\n * Truncate by line count\n */\nfunction truncateByLines(content: string, maxLines: number): string {\n const lines = content.split('\\n');\n\n if (lines.length <= maxLines) {\n return content;\n }\n\n let truncated = lines.slice(0, maxLines).join('\\n').trimEnd();\n\n // Fix unclosed markdown syntax\n truncated = fixUnclosedMarkdown(truncated);\n\n return truncated;\n}\n\n/**\n * Fix unclosed markdown syntax to prevent rendering issues\n */\nfunction fixUnclosedMarkdown(content: string): string {\n let result = content;\n\n // Count occurrences of markdown markers\n const countOccurrences = (str: string, marker: string): number => {\n const escaped = marker.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const matches = str.match(new RegExp(escaped, 'g'));\n return matches ? matches.length : 0;\n };\n\n // Fix unclosed bold (**) - must have even count\n const boldCount = countOccurrences(result, '**');\n if (boldCount % 2 !== 0) {\n result += '**';\n }\n\n // Fix unclosed italic (*) - but not **\n // Remove ** first for counting, then count single *\n const withoutBold = result.replace(/\\*\\*/g, '');\n const italicCount = countOccurrences(withoutBold, '*');\n if (italicCount % 2 !== 0) {\n result += '*';\n }\n\n // Fix unclosed inline code (`)\n const codeCount = countOccurrences(result, '`');\n // Ignore triple backticks for code blocks\n const tripleCount = countOccurrences(result, '```');\n const singleCodeCount = codeCount - (tripleCount * 3);\n if (singleCodeCount % 2 !== 0) {\n result += '`';\n }\n\n // Fix unclosed code blocks (```)\n if (tripleCount % 2 !== 0) {\n result += '\\n```';\n }\n\n // Fix unclosed strikethrough (~~)\n const strikeCount = countOccurrences(result, '~~');\n if (strikeCount % 2 !== 0) {\n result += '~~';\n }\n\n // Fix unclosed underline bold (__)\n const underlineBoldCount = countOccurrences(result, '__');\n if (underlineBoldCount % 2 !== 0) {\n result += '__';\n }\n\n // Fix unclosed underline italic (_) - but not __\n const withoutUnderlineBold = result.replace(/__/g, '');\n const underlineItalicCount = countOccurrences(withoutUnderlineBold, '_');\n if (underlineItalicCount % 2 !== 0) {\n result += '_';\n }\n\n return result;\n}\n\n/**\n * Hook for managing collapsible content with \"Read more...\" functionality\n *\n * @example\n * ```tsx\n * const { isCollapsed, toggleCollapsed, displayContent, shouldCollapse } = useCollapsibleContent(\n * longText,\n * { maxLength: 300, maxLines: 5 }\n * );\n *\n * return (\n * <div>\n * <Markdown content={displayContent} />\n * {shouldCollapse && (\n * <button onClick={toggleCollapsed}>\n * {isCollapsed ? 'Read more...' : 'Show less'}\n * </button>\n * )}\n * </div>\n * );\n * ```\n */\nexport function useCollapsibleContent(\n content: string,\n options: UseCollapsibleContentOptions = {}\n): UseCollapsibleContentResult {\n const { maxLength, maxLines, defaultExpanded = false } = options;\n\n const [isCollapsed, setIsCollapsed] = useState(!defaultExpanded);\n\n const originalLength = content.length;\n const originalLineCount = content.split('\\n').length;\n\n const { shouldCollapse, truncatedContent } = useMemo(() => {\n // If no limits set, don't collapse\n if (maxLength === undefined && maxLines === undefined) {\n return { shouldCollapse: false, truncatedContent: content };\n }\n\n let needsCollapse = false;\n let result = content;\n\n // Check line limit first (usually more restrictive for chat)\n if (maxLines !== undefined && originalLineCount > maxLines) {\n needsCollapse = true;\n result = truncateByLines(result, maxLines);\n }\n\n // Then check character limit\n if (maxLength !== undefined && result.length > maxLength) {\n needsCollapse = true;\n result = smartTruncate(result, maxLength);\n }\n\n return { shouldCollapse: needsCollapse, truncatedContent: result };\n }, [content, maxLength, maxLines, originalLineCount]);\n\n const displayContent = useMemo(() => {\n if (!shouldCollapse || !isCollapsed) {\n return content;\n }\n return truncatedContent;\n }, [content, truncatedContent, shouldCollapse, isCollapsed]);\n\n const toggleCollapsed = useCallback(() => {\n setIsCollapsed((prev) => !prev);\n }, []);\n\n const setCollapsed = useCallback((collapsed: boolean) => {\n setIsCollapsed(collapsed);\n }, []);\n\n return {\n isCollapsed,\n toggleCollapsed,\n setCollapsed,\n displayContent,\n shouldCollapse,\n originalLength,\n originalLineCount,\n };\n}\n\nexport default useCollapsibleContent;\n","'use client';\n\nimport React from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\n\nimport { CopyButton } from '@djangocfg/ui-core/components';\nimport { useResolvedTheme } from '@djangocfg/ui-core/hooks';\n\nimport Mermaid from '../../tools/Mermaid';\nimport PrettyCode from '../../tools/PrettyCode';\nimport { useCollapsibleContent } from './useCollapsibleContent';\n\nimport type { Components } from 'react-markdown';\n\n// Helper function to extract text content from React children\nconst extractTextFromChildren = (children: React.ReactNode): string => {\n if (typeof children === 'string') {\n return children;\n }\n\n if (typeof children === 'number') {\n return String(children);\n }\n\n if (React.isValidElement(children)) {\n const props = children.props as { children?: React.ReactNode };\n return extractTextFromChildren(props.children);\n }\n\n if (Array.isArray(children)) {\n return children.map(extractTextFromChildren).join('');\n }\n\n return '';\n};\n\nexport interface MarkdownMessageProps {\n /** Markdown content to render */\n content: string;\n /** Additional CSS classes */\n className?: string;\n /** Whether the message is from the user (affects styling) */\n isUser?: boolean;\n /** Use compact size (text-xs instead of text-sm) */\n isCompact?: boolean;\n /**\n * Enable collapsible \"Read more...\" functionality\n * When enabled, long content will be truncated with a toggle button\n * @default false\n */\n collapsible?: boolean;\n /**\n * Maximum character length before showing \"Read more...\"\n * Only applies when collapsible is true\n * If both maxLength and maxLines are set, the stricter limit applies\n */\n maxLength?: number;\n /**\n * Maximum number of lines before showing \"Read more...\"\n * Only applies when collapsible is true\n * If both maxLength and maxLines are set, the stricter limit applies\n */\n maxLines?: number;\n /**\n * Custom \"Read more\" button text\n * @default \"Read more...\"\n */\n readMoreLabel?: string;\n /**\n * Custom \"Show less\" button text\n * @default \"Show less\"\n */\n showLessLabel?: string;\n /**\n * Start expanded (only applies when collapsible is true)\n * @default false\n */\n defaultExpanded?: boolean;\n /**\n * Callback when collapsed state changes\n */\n onCollapseChange?: (isCollapsed: boolean) => void;\n}\n\n// Code block component with copy functionality\ninterface CodeBlockProps {\n code: string;\n language: string;\n isUser: boolean;\n isCompact?: boolean;\n}\n\nconst CodeBlock: React.FC<CodeBlockProps> = ({ code, language, isUser, isCompact = false }) => {\n const theme = useResolvedTheme();\n\n return (\n <div className=\"relative group my-3\">\n {/* Copy button */}\n <CopyButton\n value={code}\n variant=\"ghost\"\n className={`\n absolute top-2 right-2 z-10 opacity-0 group-hover:opacity-100 transition-opacity\n h-8 w-8\n ${isUser\n ? 'hover:bg-white/20 text-white'\n : 'hover:bg-muted-foreground/20 text-muted-foreground hover:text-foreground'\n }\n `}\n title=\"Copy code\"\n />\n\n {/* Code content */}\n <PrettyCode\n data={code}\n language={language}\n className={isCompact ? 'text-xs' : 'text-sm'}\n customBg={isUser ? \"bg-white/10\" : \"bg-muted dark:bg-muted\"}\n mode={theme}\n isCompact={isCompact}\n />\n </div>\n );\n};\n\n// Custom components for markdown in chat\n// Base size: text-sm (14px) for normal, text-xs (12px) for compact\nconst createMarkdownComponents = (isUser: boolean = false, isCompact: boolean = false): Components => {\n // Text size classes based on compact mode\n const textSize = isCompact ? 'text-xs' : 'text-sm';\n const headingBase = isCompact ? 'text-sm' : 'text-base';\n const headingSm = isCompact ? 'text-xs' : 'text-sm';\n\n return {\n // Headings - scaled for chat context\n h1: ({ children }) => (\n <h1 className={`${headingBase} font-bold mb-2 mt-3 first:mt-0`}>{children}</h1>\n ),\n h2: ({ children }) => (\n <h2 className={`${headingSm} font-bold mb-2 mt-3 first:mt-0`}>{children}</h2>\n ),\n h3: ({ children }) => (\n <h3 className={`${headingSm} font-semibold mb-1 mt-2 first:mt-0`}>{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className={`${headingSm} font-semibold mb-1 mt-2 first:mt-0`}>{children}</h4>\n ),\n h5: ({ children }) => (\n <h5 className={`${headingSm} font-medium mb-1 mt-2 first:mt-0`}>{children}</h5>\n ),\n h6: ({ children }) => (\n <h6 className={`${headingSm} font-medium mb-1 mt-2 first:mt-0`}>{children}</h6>\n ),\n\n // Paragraphs - optimized for chat readability\n p: ({ children }) => (\n <p className={`${textSize} mb-4 last:mb-0 leading-7 break-words font-light`}>{children}</p>\n ),\n\n // Lists - compact\n ul: ({ children }) => (\n <ul className={`list-disc list-inside mb-2 space-y-1 ${textSize}`}>{children}</ul>\n ),\n ol: ({ children }) => (\n <ol className={`list-decimal list-inside mb-2 space-y-1 ${textSize}`}>{children}</ol>\n ),\n li: ({ children }) => (\n <li className=\"break-words\">{children}</li>\n ),\n\n // Links - appropriate for chat context\n a: ({ href, children }) => (\n <a\n href={href}\n className={`${textSize} ${\n isUser\n ? 'text-white/90 underline hover:text-white'\n : 'text-primary underline hover:text-primary/80'\n } transition-colors break-all`}\n target={href?.startsWith('http') ? '_blank' : undefined}\n rel={href?.startsWith('http') ? 'noopener noreferrer' : undefined}\n >\n {children}\n </a>\n ),\n\n // Code blocks - using CodeBlock component with copy functionality\n pre: ({ children }) => {\n // Extract code content and language\n let codeContent = '';\n let language = 'plaintext';\n\n if (React.isValidElement(children)) {\n const child = children;\n\n if (child.type === 'code' || (typeof child.type === 'function' && child.type.name === 'code')) {\n const codeProps = child.props as { className?: string; children?: React.ReactNode };\n const rawClassName = codeProps.className;\n language = rawClassName?.replace(/language-/, '').trim() || 'plaintext';\n codeContent = extractTextFromChildren(codeProps.children).trim();\n } else {\n codeContent = extractTextFromChildren(children).trim();\n }\n } else {\n codeContent = extractTextFromChildren(children).trim();\n }\n\n // If still no content, show placeholder\n if (!codeContent) {\n return (\n <div className=\"my-3 p-3 bg-muted rounded text-sm text-muted-foreground\">\n No content available\n </div>\n );\n }\n\n // Handle Mermaid diagrams separately\n if (language === 'mermaid') {\n return (\n <div className=\"my-3 max-w-full overflow-x-auto\">\n <Mermaid chart={codeContent} className=\"max-w-[600px] mx-auto\" isCompact={isCompact} />\n </div>\n );\n }\n\n // Try to use CodeBlock component, fallback to simple pre if it fails\n try {\n return <CodeBlock code={codeContent} language={language} isUser={isUser} isCompact={isCompact} />;\n } catch (error) {\n // Fallback to simple pre element with copy button\n console.warn('CodeBlock failed, using fallback:', error);\n return (\n <div className=\"relative group my-3\">\n <CopyButton\n value={codeContent}\n variant=\"ghost\"\n className={`\n absolute top-2 right-2 z-10 opacity-0 group-hover:opacity-100 transition-opacity\n h-8 w-8\n ${isUser\n ? 'hover:bg-white/20 text-white'\n : 'hover:bg-muted-foreground/20 text-muted-foreground hover:text-foreground'\n }\n `}\n title=\"Copy code\"\n />\n <pre className={`\n p-3 rounded text-xs font-mono overflow-x-auto\n ${isUser\n ? 'bg-white/10 text-white'\n : 'bg-muted text-foreground'\n }\n `}>\n <code>{codeContent}</code>\n </pre>\n </div>\n );\n }\n },\n\n // Inline code\n code: ({ children, className }) => {\n // If it's inside a pre tag, let pre handle it\n if (className?.includes('language-')) {\n return <code className={className}>{children}</code>;\n }\n\n // Extract text content safely\n const codeContent = extractTextFromChildren(children);\n\n // Inline code styling\n return (\n <code className=\"px-1.5 py-0.5 rounded text-xs font-mono bg-muted text-foreground break-all\">\n {codeContent}\n </code>\n );\n },\n\n // Blockquotes\n blockquote: ({ children }) => (\n <blockquote className={`${textSize} border-l-2 border-border pl-3 my-2 italic text-muted-foreground break-words`}>\n {children}\n </blockquote>\n ),\n\n // Tables - compact for chat\n table: ({ children }) => (\n <div className=\"overflow-x-auto my-3\">\n <table className={`min-w-full ${textSize} border-collapse`}>\n {children}\n </table>\n </div>\n ),\n thead: ({ children }) => (\n <thead className=\"bg-muted/50\">\n {children}\n </thead>\n ),\n tbody: ({ children }) => (\n <tbody>{children}</tbody>\n ),\n tr: ({ children }) => (\n <tr className=\"border-b border-border/50\">{children}</tr>\n ),\n th: ({ children }) => (\n <th className=\"px-2 py-1 text-left font-medium break-words\">{children}</th>\n ),\n td: ({ children }) => (\n <td className=\"px-2 py-1 break-words\">{children}</td>\n ),\n\n // Horizontal rule\n hr: () => (\n <hr className=\"my-3 border-0 h-px bg-border\" />\n ),\n\n // Strong and emphasis\n strong: ({ children }) => (\n <strong className=\"font-semibold\">{children}</strong>\n ),\n em: ({ children }) => (\n <em className=\"italic\">{children}</em>\n ),\n};};\n\n// Check if content contains markdown syntax or line breaks\nconst hasMarkdownSyntax = (text: string): boolean => {\n // If there are line breaks (after trim), treat as markdown for proper paragraph rendering\n if (text.trim().includes('\\n')) {\n return true;\n }\n\n // Common markdown patterns\n const markdownPatterns = [\n /^#{1,6}\\s/m, // Headers\n /\\*\\*[^*]+\\*\\*/, // Bold\n /\\*[^*]+\\*/, // Italic\n /__[^_]+__/, // Bold (underscore)\n /_[^_]+_/, // Italic (underscore)\n /\\[.+\\]\\(.+\\)/, // Links\n /!\\[.*\\]\\(.+\\)/, // Images\n /```[\\s\\S]*```/, // Code blocks\n /`[^`]+`/, // Inline code\n /^\\s*[-*+]\\s/m, // Unordered lists\n /^\\s*\\d+\\.\\s/m, // Ordered lists\n /^\\s*>/m, // Blockquotes\n /\\|.+\\|/, // Tables\n /^---+$/m, // Horizontal rules\n /~~[^~]+~~/, // Strikethrough\n ];\n\n return markdownPatterns.some(pattern => pattern.test(text));\n};\n\n/**\n * Read more / Show less toggle button\n */\ninterface CollapseToggleProps {\n isCollapsed: boolean;\n onClick: () => void;\n readMoreLabel: string;\n showLessLabel: string;\n isUser: boolean;\n isCompact: boolean;\n}\n\nconst CollapseToggle: React.FC<CollapseToggleProps> = ({\n isCollapsed,\n onClick,\n readMoreLabel,\n showLessLabel,\n isUser,\n isCompact,\n}) => {\n const textSize = isCompact ? 'text-xs' : 'text-sm';\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`\n ${textSize} font-medium cursor-pointer\n transition-colors duration-200\n ${isUser\n ? 'text-white/80 hover:text-white'\n : 'text-primary hover:text-primary/80'\n }\n inline-flex items-center gap-1\n mt-1\n `}\n >\n {isCollapsed ? (\n <>\n {readMoreLabel}\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </>\n ) : (\n <>\n {showLessLabel}\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 15l7-7 7 7\"\n />\n </svg>\n </>\n )}\n </button>\n );\n};\n\n/**\n * MarkdownMessage - Renders markdown content with syntax highlighting and GFM support\n *\n * Features:\n * - GitHub Flavored Markdown (GFM) support\n * - Syntax highlighted code blocks with copy button\n * - Mermaid diagram rendering\n * - Tables, lists, blockquotes\n * - User/assistant styling modes\n * - Plain text optimization (skips ReactMarkdown for simple text)\n * - Collapsible \"Read more...\" for long messages\n *\n * @example\n * ```tsx\n * <MarkdownMessage content=\"# Hello\\n\\nThis is **bold** text.\" />\n *\n * // User message styling\n * <MarkdownMessage content=\"Some content\" isUser />\n *\n * // Collapsible long content (for chat apps)\n * <MarkdownMessage\n * content={longText}\n * collapsible\n * maxLength={300}\n * maxLines={5}\n * />\n * ```\n */\nexport const MarkdownMessage: React.FC<MarkdownMessageProps> = ({\n content,\n className = \"\",\n isUser = false,\n isCompact = false,\n collapsible = false,\n maxLength,\n maxLines,\n readMoreLabel = \"Read more...\",\n showLessLabel = \"Show less\",\n defaultExpanded = false,\n onCollapseChange,\n}) => {\n // Trim content to remove leading/trailing whitespace and empty lines\n const trimmedContent = content.trim();\n\n // Collapsible content logic - use defaults when collapsible is enabled\n const collapsibleOptions = React.useMemo(() => {\n if (!collapsible) return {};\n // Default limits when collapsible is enabled but no limits specified\n const effectiveMaxLength = maxLength ?? 1000;\n const effectiveMaxLines = maxLines ?? 10;\n return { maxLength: effectiveMaxLength, maxLines: effectiveMaxLines, defaultExpanded };\n }, [collapsible, maxLength, maxLines, defaultExpanded]);\n\n const {\n isCollapsed,\n toggleCollapsed,\n displayContent,\n shouldCollapse,\n } = useCollapsibleContent(\n trimmedContent,\n collapsible ? collapsibleOptions : {}\n );\n\n // Call onCollapseChange when state changes\n React.useEffect(() => {\n if (collapsible && shouldCollapse && onCollapseChange) {\n onCollapseChange(isCollapsed);\n }\n }, [isCollapsed, collapsible, shouldCollapse, onCollapseChange]);\n\n const components = React.useMemo(() => createMarkdownComponents(isUser, isCompact), [isUser, isCompact]);\n\n const textSizeClass = isCompact ? 'text-xs' : 'text-sm';\n const proseClass = isCompact ? 'prose-xs' : 'prose-sm';\n\n // For plain text without markdown, render directly without ReactMarkdown\n const isPlainText = !hasMarkdownSyntax(displayContent);\n\n // Render plain text - use CSS white-space: pre-line to preserve newlines\n if (isPlainText) {\n return (\n <span className={`${textSizeClass} leading-7 break-words whitespace-pre-line font-light ${className}`}>\n {displayContent}\n {collapsible && shouldCollapse && (\n <>\n {isCollapsed && '... '}\n <CollapseToggle\n isCollapsed={isCollapsed}\n onClick={toggleCollapsed}\n readMoreLabel={readMoreLabel}\n showLessLabel={showLessLabel}\n isUser={isUser}\n isCompact={isCompact}\n />\n </>\n )}\n </span>\n );\n }\n\n // Render markdown\n return (\n <div className={className}>\n <div\n className={`\n prose ${proseClass} max-w-none break-words overflow-hidden ${textSizeClass}\n ${isUser ? 'prose-invert' : 'dark:prose-invert'}\n [&>*]:leading-7\n `}\n style={{\n // Inherit colors from parent - fixes issues with external CSS variables\n '--tw-prose-body': 'inherit',\n '--tw-prose-headings': 'inherit',\n '--tw-prose-bold': 'inherit',\n '--tw-prose-links': 'inherit',\n color: 'inherit',\n } as React.CSSProperties}\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={components}\n >\n {displayContent}\n </ReactMarkdown>\n </div>\n {collapsible && shouldCollapse && (\n <CollapseToggle\n isCollapsed={isCollapsed}\n onClick={toggleCollapsed}\n readMoreLabel={readMoreLabel}\n showLessLabel={showLessLabel}\n isUser={isUser}\n isCompact={isCompact}\n />\n )}\n </div>\n );\n};\n\nexport default MarkdownMessage;\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}\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, LoadingFallback } from '../../components';\nimport { PlaygroundProvider } from './context/PlaygroundContext';\nimport type { PlaygroundConfig, SchemaSource } from './types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PlaygroundProps {\n config: PlaygroundConfig;\n}\n\nexport type { PlaygroundConfig, SchemaSource };\n\n// ============================================================================\n// OpenAPI Loading Fallback\n// ============================================================================\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\n// ============================================================================\n// Lazy Component (internal)\n// ============================================================================\n\nconst LazyPlaygroundLayout = createLazyComponent(\n () => import('./components/PlaygroundLayout').then((mod) => ({ default: mod.PlaygroundLayout })),\n {\n displayName: 'LazyPlaygroundLayout',\n fallback: <OpenapiLoadingFallback />,\n }\n);\n\n// ============================================================================\n// LazyOpenapiViewer\n// ============================================================================\n\n/**\n * LazyOpenapiViewer - Lazy-loaded OpenAPI schema viewer & playground\n *\n * Automatically shows loading state while OpenAPI components load (~400KB)\n */\nexport const LazyOpenapiViewer: React.FC<PlaygroundProps> = ({ config }) => {\n return (\n <PlaygroundProvider config={config}>\n <LazyPlaygroundLayout />\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\n/**\n * Lazy-loaded AudioPlayer Components\n *\n * Heavy WaveSurfer.js (~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 { HybridAudioPlayer } from '@djangocfg/ui-tools/audio'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type {\n HybridAudioPlayerProps,\n HybridSimplePlayerProps,\n HybridCompactPlayerProps,\n} from './components';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type { HybridAudioPlayerProps, HybridSimplePlayerProps, HybridCompactPlayerProps };\n\n// ============================================================================\n// Audio Loading Fallback\n// ============================================================================\n\nfunction AudioLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center p-6 bg-muted/30 rounded-lg\">\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-muted border-t-primary\" />\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=\"M9 19V6l12-3v13M9 19c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zm12-3c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zM9 10l12-3\"\n />\n </svg>\n </div>\n </div>\n <span className=\"text-sm text-muted-foreground\">Loading audio player...</span>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Components\n// ============================================================================\n\n/**\n * LazyHybridAudioPlayer - Lazy-loaded full-featured audio player\n *\n * Automatically shows loading state while WaveSurfer loads (~200KB)\n */\nexport const LazyHybridAudioPlayer = createLazyComponent<HybridAudioPlayerProps>(\n () => import('./components').then((mod) => ({ default: mod.HybridAudioPlayer })),\n {\n displayName: 'LazyHybridAudioPlayer',\n fallback: <AudioLoadingFallback />,\n }\n);\n\n/**\n * LazyHybridSimplePlayer - Lazy-loaded simple audio player\n *\n * Automatically shows loading state while WaveSurfer loads (~200KB)\n */\nexport const LazyHybridSimplePlayer = createLazyComponent<HybridSimplePlayerProps>(\n () => import('./components').then((mod) => ({ default: mod.HybridSimplePlayer })),\n {\n displayName: 'LazyHybridSimplePlayer',\n fallback: <AudioLoadingFallback />,\n }\n);\n\n/**\n * LazyHybridCompactPlayer - Lazy-loaded compact single-row audio player\n *\n * Use in tight spaces: play/pause + waveform + timer in one line.\n */\nexport const LazyHybridCompactPlayer = createLazyComponent<HybridCompactPlayerProps>(\n () => import('./components').then((mod) => ({ default: mod.HybridCompactPlayer })),\n {\n displayName: 'LazyHybridCompactPlayer',\n fallback: (\n <div className=\"flex items-center gap-2 h-8 px-1 animate-pulse\">\n <div className=\"h-8 w-8 rounded-md bg-muted flex-shrink-0\" />\n <div className=\"flex-1 h-4 rounded bg-muted\" />\n <div className=\"h-3 w-12 rounded bg-muted flex-shrink-0\" />\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","/**\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\n// Lazy load the PlaygroundLayout component\nconst PlaygroundLayout = lazy(() =>\n import('./components/PlaygroundLayout').then((mod) => ({ default: mod.PlaygroundLayout }))\n);\n\n// Loading fallback component\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 <PlaygroundLayout />\n </Suspense>\n </PlaygroundProvider>\n );\n};\n\n// Re-export types for convenience\nexport type { PlaygroundConfig, SchemaSource } from './types';\n\n// Default export for dynamic import\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"]}
1
+ {"version":3,"sources":["../src/components/lazy-wrapper.tsx","../src/tools/Mermaid/index.tsx","../src/components/markdown/useCollapsibleContent.ts","../src/components/markdown/MarkdownMessage.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/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"],"names":["React","lazy","LoadingFallback","jsx","Suspense","jsxs","useState","useEffect","useResolvedTheme","useRef","hslToHex","s","Editor","useCallback","useMemo"],"mappings":"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","file":"index.mjs","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","/**\n * Mermaid Component - Dynamic Import Wrapper\n *\n * Lazy loads the heavy Mermaid library (~800KB) only when needed.\n * This significantly reduces the initial bundle size.\n */\n\n'use client';\n\nimport React, { lazy, Suspense } from 'react';\n\n// Lazy load the client component\nconst MermaidClient = lazy(() => import('./Mermaid.client'));\n\n// Loading fallback component\nconst LoadingFallback = () => (\n <div className=\"flex justify-center items-center min-h-[100px]\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-b-2 border-primary\" />\n </div>\n);\n\nexport interface MermaidProps {\n chart: string;\n className?: string;\n isCompact?: boolean;\n /** Enable click-to-fullscreen functionality (default: true) */\n fullscreen?: boolean;\n}\n\nconst Mermaid: React.FC<MermaidProps> = (props) => {\n return (\n <Suspense fallback={<LoadingFallback />}>\n <MermaidClient {...props} />\n </Suspense>\n );\n};\n\nexport default Mermaid;\n\n// Re-export builders for declarative diagram construction\nexport {\n // Core\n DiagramStore,\n sanitizeLabel,\n toNodeId,\n // Theme hooks\n useThemePalette,\n useStylePresets,\n useBoxColors,\n // FlowDiagram\n FlowDiagram,\n STYLE_PRESETS,\n // SequenceDiagram\n SequenceDiagram,\n // JourneyDiagram\n JourneyDiagram,\n} from './builders';\n\nexport type {\n // Core types\n DiagramStoreOptions,\n FlowDirection,\n NodeShape,\n ParticipantType,\n TaskScore,\n // Theme types\n ThemePalette,\n StyleColors,\n StylePresets,\n BoxColors,\n // FlowDiagram types\n FlowDiagramOptions,\n FlowDiagramBuilder,\n NodeBuilder,\n EdgeBuilder,\n StyleBuilder,\n // SequenceDiagram types\n ParticipantsObject,\n SequenceDiagramOptions,\n SequenceDiagramBuilder,\n // JourneyDiagram types\n JourneyDiagramOptions,\n JourneyDiagramBuilder,\n SectionBuilder,\n} from './builders';\n","'use client';\n\nimport { useCallback, useMemo, useState } from 'react';\n\nexport interface UseCollapsibleContentOptions {\n /**\n * Maximum character length before collapsing\n * If both maxLength and maxLines are set, the stricter limit applies\n */\n maxLength?: number;\n /**\n * Maximum number of lines before collapsing\n * If both maxLength and maxLines are set, the stricter limit applies\n */\n maxLines?: number;\n /**\n * Start in expanded state (default: false - starts collapsed)\n */\n defaultExpanded?: boolean;\n}\n\nexport interface UseCollapsibleContentResult {\n /** Whether content is currently collapsed */\n isCollapsed: boolean;\n /** Toggle between collapsed/expanded state */\n toggleCollapsed: () => void;\n /** Set collapsed state directly */\n setCollapsed: (collapsed: boolean) => void;\n /** Content to display (truncated if collapsed, full if expanded) */\n displayContent: string;\n /** Whether the content exceeds limits and should be collapsible */\n shouldCollapse: boolean;\n /** Original content length */\n originalLength: number;\n /** Original line count */\n originalLineCount: number;\n}\n\n/**\n * Smart truncation that doesn't break words or markdown syntax\n */\nfunction smartTruncate(content: string, maxLength: number): string {\n if (content.length <= maxLength) {\n return content;\n }\n\n // Find a good break point (space, newline) near maxLength\n let breakPoint = maxLength;\n\n // Look backwards for a space or newline\n while (breakPoint > maxLength - 50 && breakPoint > 0) {\n const char = content[breakPoint];\n if (char === ' ' || char === '\\n' || char === '\\t') {\n break;\n }\n breakPoint--;\n }\n\n // If we couldn't find a good break point, just use maxLength\n if (breakPoint <= maxLength - 50) {\n breakPoint = maxLength;\n }\n\n let truncated = content.slice(0, breakPoint).trimEnd();\n\n // Fix unclosed markdown syntax\n truncated = fixUnclosedMarkdown(truncated);\n\n return truncated;\n}\n\n/**\n * Truncate by line count\n */\nfunction truncateByLines(content: string, maxLines: number): string {\n const lines = content.split('\\n');\n\n if (lines.length <= maxLines) {\n return content;\n }\n\n let truncated = lines.slice(0, maxLines).join('\\n').trimEnd();\n\n // Fix unclosed markdown syntax\n truncated = fixUnclosedMarkdown(truncated);\n\n return truncated;\n}\n\n/**\n * Fix unclosed markdown syntax to prevent rendering issues\n */\nfunction fixUnclosedMarkdown(content: string): string {\n let result = content;\n\n // Count occurrences of markdown markers\n const countOccurrences = (str: string, marker: string): number => {\n const escaped = marker.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const matches = str.match(new RegExp(escaped, 'g'));\n return matches ? matches.length : 0;\n };\n\n // Fix unclosed bold (**) - must have even count\n const boldCount = countOccurrences(result, '**');\n if (boldCount % 2 !== 0) {\n result += '**';\n }\n\n // Fix unclosed italic (*) - but not **\n // Remove ** first for counting, then count single *\n const withoutBold = result.replace(/\\*\\*/g, '');\n const italicCount = countOccurrences(withoutBold, '*');\n if (italicCount % 2 !== 0) {\n result += '*';\n }\n\n // Fix unclosed inline code (`)\n const codeCount = countOccurrences(result, '`');\n // Ignore triple backticks for code blocks\n const tripleCount = countOccurrences(result, '```');\n const singleCodeCount = codeCount - (tripleCount * 3);\n if (singleCodeCount % 2 !== 0) {\n result += '`';\n }\n\n // Fix unclosed code blocks (```)\n if (tripleCount % 2 !== 0) {\n result += '\\n```';\n }\n\n // Fix unclosed strikethrough (~~)\n const strikeCount = countOccurrences(result, '~~');\n if (strikeCount % 2 !== 0) {\n result += '~~';\n }\n\n // Fix unclosed underline bold (__)\n const underlineBoldCount = countOccurrences(result, '__');\n if (underlineBoldCount % 2 !== 0) {\n result += '__';\n }\n\n // Fix unclosed underline italic (_) - but not __\n const withoutUnderlineBold = result.replace(/__/g, '');\n const underlineItalicCount = countOccurrences(withoutUnderlineBold, '_');\n if (underlineItalicCount % 2 !== 0) {\n result += '_';\n }\n\n return result;\n}\n\n/**\n * Hook for managing collapsible content with \"Read more...\" functionality\n *\n * @example\n * ```tsx\n * const { isCollapsed, toggleCollapsed, displayContent, shouldCollapse } = useCollapsibleContent(\n * longText,\n * { maxLength: 300, maxLines: 5 }\n * );\n *\n * return (\n * <div>\n * <Markdown content={displayContent} />\n * {shouldCollapse && (\n * <button onClick={toggleCollapsed}>\n * {isCollapsed ? 'Read more...' : 'Show less'}\n * </button>\n * )}\n * </div>\n * );\n * ```\n */\nexport function useCollapsibleContent(\n content: string,\n options: UseCollapsibleContentOptions = {}\n): UseCollapsibleContentResult {\n const { maxLength, maxLines, defaultExpanded = false } = options;\n\n const [isCollapsed, setIsCollapsed] = useState(!defaultExpanded);\n\n const originalLength = content.length;\n const originalLineCount = content.split('\\n').length;\n\n const { shouldCollapse, truncatedContent } = useMemo(() => {\n // If no limits set, don't collapse\n if (maxLength === undefined && maxLines === undefined) {\n return { shouldCollapse: false, truncatedContent: content };\n }\n\n let needsCollapse = false;\n let result = content;\n\n // Check line limit first (usually more restrictive for chat)\n if (maxLines !== undefined && originalLineCount > maxLines) {\n needsCollapse = true;\n result = truncateByLines(result, maxLines);\n }\n\n // Then check character limit\n if (maxLength !== undefined && result.length > maxLength) {\n needsCollapse = true;\n result = smartTruncate(result, maxLength);\n }\n\n return { shouldCollapse: needsCollapse, truncatedContent: result };\n }, [content, maxLength, maxLines, originalLineCount]);\n\n const displayContent = useMemo(() => {\n if (!shouldCollapse || !isCollapsed) {\n return content;\n }\n return truncatedContent;\n }, [content, truncatedContent, shouldCollapse, isCollapsed]);\n\n const toggleCollapsed = useCallback(() => {\n setIsCollapsed((prev) => !prev);\n }, []);\n\n const setCollapsed = useCallback((collapsed: boolean) => {\n setIsCollapsed(collapsed);\n }, []);\n\n return {\n isCollapsed,\n toggleCollapsed,\n setCollapsed,\n displayContent,\n shouldCollapse,\n originalLength,\n originalLineCount,\n };\n}\n\nexport default useCollapsibleContent;\n","'use client';\n\nimport React from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\n\nimport { CopyButton } from '@djangocfg/ui-core/components';\nimport { useResolvedTheme } from '@djangocfg/ui-core/hooks';\n\nimport Mermaid from '../../tools/Mermaid';\nimport PrettyCode from '../../tools/PrettyCode';\nimport { useCollapsibleContent } from './useCollapsibleContent';\n\nimport type { Components } from 'react-markdown';\n\n// Helper function to extract text content from React children\nconst extractTextFromChildren = (children: React.ReactNode): string => {\n if (typeof children === 'string') {\n return children;\n }\n\n if (typeof children === 'number') {\n return String(children);\n }\n\n if (React.isValidElement(children)) {\n const props = children.props as { children?: React.ReactNode };\n return extractTextFromChildren(props.children);\n }\n\n if (Array.isArray(children)) {\n return children.map(extractTextFromChildren).join('');\n }\n\n return '';\n};\n\nexport interface MarkdownMessageProps {\n /** Markdown content to render */\n content: string;\n /** Additional CSS classes */\n className?: string;\n /** Whether the message is from the user (affects styling) */\n isUser?: boolean;\n /** Use compact size (text-xs instead of text-sm) */\n isCompact?: boolean;\n /**\n * Enable collapsible \"Read more...\" functionality\n * When enabled, long content will be truncated with a toggle button\n * @default false\n */\n collapsible?: boolean;\n /**\n * Maximum character length before showing \"Read more...\"\n * Only applies when collapsible is true\n * If both maxLength and maxLines are set, the stricter limit applies\n */\n maxLength?: number;\n /**\n * Maximum number of lines before showing \"Read more...\"\n * Only applies when collapsible is true\n * If both maxLength and maxLines are set, the stricter limit applies\n */\n maxLines?: number;\n /**\n * Custom \"Read more\" button text\n * @default \"Read more...\"\n */\n readMoreLabel?: string;\n /**\n * Custom \"Show less\" button text\n * @default \"Show less\"\n */\n showLessLabel?: string;\n /**\n * Start expanded (only applies when collapsible is true)\n * @default false\n */\n defaultExpanded?: boolean;\n /**\n * Callback when collapsed state changes\n */\n onCollapseChange?: (isCollapsed: boolean) => void;\n}\n\n// Code block component with copy functionality\ninterface CodeBlockProps {\n code: string;\n language: string;\n isUser: boolean;\n isCompact?: boolean;\n}\n\nconst CodeBlock: React.FC<CodeBlockProps> = ({ code, language, isUser, isCompact = false }) => {\n const theme = useResolvedTheme();\n\n return (\n <div className=\"relative group my-3\">\n {/* Copy button */}\n <CopyButton\n value={code}\n variant=\"ghost\"\n className={`\n absolute top-2 right-2 z-10 opacity-0 group-hover:opacity-100 transition-opacity\n h-8 w-8\n ${isUser\n ? 'hover:bg-white/20 text-white'\n : 'hover:bg-muted-foreground/20 text-muted-foreground hover:text-foreground'\n }\n `}\n title=\"Copy code\"\n />\n\n {/* Code content */}\n <PrettyCode\n data={code}\n language={language}\n className={isCompact ? 'text-xs' : 'text-sm'}\n customBg={isUser ? \"bg-white/10\" : \"bg-muted dark:bg-muted\"}\n mode={theme}\n isCompact={isCompact}\n />\n </div>\n );\n};\n\n// Custom components for markdown in chat\n// Base size: text-sm (14px) for normal, text-xs (12px) for compact\nconst createMarkdownComponents = (isUser: boolean = false, isCompact: boolean = false): Components => {\n // Text size classes based on compact mode\n const textSize = isCompact ? 'text-xs' : 'text-sm';\n const headingBase = isCompact ? 'text-sm' : 'text-base';\n const headingSm = isCompact ? 'text-xs' : 'text-sm';\n\n return {\n // Headings - scaled for chat context\n h1: ({ children }) => (\n <h1 className={`${headingBase} font-bold mb-2 mt-3 first:mt-0`}>{children}</h1>\n ),\n h2: ({ children }) => (\n <h2 className={`${headingSm} font-bold mb-2 mt-3 first:mt-0`}>{children}</h2>\n ),\n h3: ({ children }) => (\n <h3 className={`${headingSm} font-semibold mb-1 mt-2 first:mt-0`}>{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className={`${headingSm} font-semibold mb-1 mt-2 first:mt-0`}>{children}</h4>\n ),\n h5: ({ children }) => (\n <h5 className={`${headingSm} font-medium mb-1 mt-2 first:mt-0`}>{children}</h5>\n ),\n h6: ({ children }) => (\n <h6 className={`${headingSm} font-medium mb-1 mt-2 first:mt-0`}>{children}</h6>\n ),\n\n // Paragraphs - optimized for chat readability\n p: ({ children }) => (\n <p className={`${textSize} mb-4 last:mb-0 leading-7 break-words font-light`}>{children}</p>\n ),\n\n // Lists - compact\n ul: ({ children }) => (\n <ul className={`list-disc list-inside mb-2 space-y-1 ${textSize}`}>{children}</ul>\n ),\n ol: ({ children }) => (\n <ol className={`list-decimal list-inside mb-2 space-y-1 ${textSize}`}>{children}</ol>\n ),\n li: ({ children }) => (\n <li className=\"break-words\">{children}</li>\n ),\n\n // Links - appropriate for chat context\n a: ({ href, children }) => (\n <a\n href={href}\n className={`${textSize} ${\n isUser\n ? 'text-white/90 underline hover:text-white'\n : 'text-primary underline hover:text-primary/80'\n } transition-colors break-all`}\n target={href?.startsWith('http') ? '_blank' : undefined}\n rel={href?.startsWith('http') ? 'noopener noreferrer' : undefined}\n >\n {children}\n </a>\n ),\n\n // Code blocks - using CodeBlock component with copy functionality\n pre: ({ children }) => {\n // Extract code content and language\n let codeContent = '';\n let language = 'plaintext';\n\n if (React.isValidElement(children)) {\n const child = children;\n\n if (child.type === 'code' || (typeof child.type === 'function' && child.type.name === 'code')) {\n const codeProps = child.props as { className?: string; children?: React.ReactNode };\n const rawClassName = codeProps.className;\n language = rawClassName?.replace(/language-/, '').trim() || 'plaintext';\n codeContent = extractTextFromChildren(codeProps.children).trim();\n } else {\n codeContent = extractTextFromChildren(children).trim();\n }\n } else {\n codeContent = extractTextFromChildren(children).trim();\n }\n\n // If still no content, show placeholder\n if (!codeContent) {\n return (\n <div className=\"my-3 p-3 bg-muted rounded text-sm text-muted-foreground\">\n No content available\n </div>\n );\n }\n\n // Handle Mermaid diagrams separately\n if (language === 'mermaid') {\n return (\n <div className=\"my-3 max-w-full overflow-x-auto\">\n <Mermaid chart={codeContent} className=\"max-w-[600px] mx-auto\" isCompact={isCompact} />\n </div>\n );\n }\n\n // Try to use CodeBlock component, fallback to simple pre if it fails\n try {\n return <CodeBlock code={codeContent} language={language} isUser={isUser} isCompact={isCompact} />;\n } catch (error) {\n // Fallback to simple pre element with copy button\n console.warn('CodeBlock failed, using fallback:', error);\n return (\n <div className=\"relative group my-3\">\n <CopyButton\n value={codeContent}\n variant=\"ghost\"\n className={`\n absolute top-2 right-2 z-10 opacity-0 group-hover:opacity-100 transition-opacity\n h-8 w-8\n ${isUser\n ? 'hover:bg-white/20 text-white'\n : 'hover:bg-muted-foreground/20 text-muted-foreground hover:text-foreground'\n }\n `}\n title=\"Copy code\"\n />\n <pre className={`\n p-3 rounded text-xs font-mono overflow-x-auto\n ${isUser\n ? 'bg-white/10 text-white'\n : 'bg-muted text-foreground'\n }\n `}>\n <code>{codeContent}</code>\n </pre>\n </div>\n );\n }\n },\n\n // Inline code\n code: ({ children, className }) => {\n // If it's inside a pre tag, let pre handle it\n if (className?.includes('language-')) {\n return <code className={className}>{children}</code>;\n }\n\n // Extract text content safely\n const codeContent = extractTextFromChildren(children);\n\n // Inline code styling\n return (\n <code className=\"px-1.5 py-0.5 rounded text-xs font-mono bg-muted text-foreground break-all\">\n {codeContent}\n </code>\n );\n },\n\n // Blockquotes\n blockquote: ({ children }) => (\n <blockquote className={`${textSize} border-l-2 border-border pl-3 my-2 italic text-muted-foreground break-words`}>\n {children}\n </blockquote>\n ),\n\n // Tables - compact for chat\n table: ({ children }) => (\n <div className=\"overflow-x-auto my-3\">\n <table className={`min-w-full ${textSize} border-collapse`}>\n {children}\n </table>\n </div>\n ),\n thead: ({ children }) => (\n <thead className=\"bg-muted/50\">\n {children}\n </thead>\n ),\n tbody: ({ children }) => (\n <tbody>{children}</tbody>\n ),\n tr: ({ children }) => (\n <tr className=\"border-b border-border/50\">{children}</tr>\n ),\n th: ({ children }) => (\n <th className=\"px-2 py-1 text-left font-medium break-words\">{children}</th>\n ),\n td: ({ children }) => (\n <td className=\"px-2 py-1 break-words\">{children}</td>\n ),\n\n // Horizontal rule\n hr: () => (\n <hr className=\"my-3 border-0 h-px bg-border\" />\n ),\n\n // Strong and emphasis\n strong: ({ children }) => (\n <strong className=\"font-semibold\">{children}</strong>\n ),\n em: ({ children }) => (\n <em className=\"italic\">{children}</em>\n ),\n};};\n\n// Check if content contains markdown syntax or line breaks\nconst hasMarkdownSyntax = (text: string): boolean => {\n // If there are line breaks (after trim), treat as markdown for proper paragraph rendering\n if (text.trim().includes('\\n')) {\n return true;\n }\n\n // Common markdown patterns\n const markdownPatterns = [\n /^#{1,6}\\s/m, // Headers\n /\\*\\*[^*]+\\*\\*/, // Bold\n /\\*[^*]+\\*/, // Italic\n /__[^_]+__/, // Bold (underscore)\n /_[^_]+_/, // Italic (underscore)\n /\\[.+\\]\\(.+\\)/, // Links\n /!\\[.*\\]\\(.+\\)/, // Images\n /```[\\s\\S]*```/, // Code blocks\n /`[^`]+`/, // Inline code\n /^\\s*[-*+]\\s/m, // Unordered lists\n /^\\s*\\d+\\.\\s/m, // Ordered lists\n /^\\s*>/m, // Blockquotes\n /\\|.+\\|/, // Tables\n /^---+$/m, // Horizontal rules\n /~~[^~]+~~/, // Strikethrough\n ];\n\n return markdownPatterns.some(pattern => pattern.test(text));\n};\n\n/**\n * Read more / Show less toggle button\n */\ninterface CollapseToggleProps {\n isCollapsed: boolean;\n onClick: () => void;\n readMoreLabel: string;\n showLessLabel: string;\n isUser: boolean;\n isCompact: boolean;\n}\n\nconst CollapseToggle: React.FC<CollapseToggleProps> = ({\n isCollapsed,\n onClick,\n readMoreLabel,\n showLessLabel,\n isUser,\n isCompact,\n}) => {\n const textSize = isCompact ? 'text-xs' : 'text-sm';\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`\n ${textSize} font-medium cursor-pointer\n transition-colors duration-200\n ${isUser\n ? 'text-white/80 hover:text-white'\n : 'text-primary hover:text-primary/80'\n }\n inline-flex items-center gap-1\n mt-1\n `}\n >\n {isCollapsed ? (\n <>\n {readMoreLabel}\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </>\n ) : (\n <>\n {showLessLabel}\n <svg\n className=\"w-3 h-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 15l7-7 7 7\"\n />\n </svg>\n </>\n )}\n </button>\n );\n};\n\n/**\n * MarkdownMessage - Renders markdown content with syntax highlighting and GFM support\n *\n * Features:\n * - GitHub Flavored Markdown (GFM) support\n * - Syntax highlighted code blocks with copy button\n * - Mermaid diagram rendering\n * - Tables, lists, blockquotes\n * - User/assistant styling modes\n * - Plain text optimization (skips ReactMarkdown for simple text)\n * - Collapsible \"Read more...\" for long messages\n *\n * @example\n * ```tsx\n * <MarkdownMessage content=\"# Hello\\n\\nThis is **bold** text.\" />\n *\n * // User message styling\n * <MarkdownMessage content=\"Some content\" isUser />\n *\n * // Collapsible long content (for chat apps)\n * <MarkdownMessage\n * content={longText}\n * collapsible\n * maxLength={300}\n * maxLines={5}\n * />\n * ```\n */\nexport const MarkdownMessage: React.FC<MarkdownMessageProps> = ({\n content,\n className = \"\",\n isUser = false,\n isCompact = false,\n collapsible = false,\n maxLength,\n maxLines,\n readMoreLabel = \"Read more...\",\n showLessLabel = \"Show less\",\n defaultExpanded = false,\n onCollapseChange,\n}) => {\n // Trim content to remove leading/trailing whitespace and empty lines\n const trimmedContent = content.trim();\n\n // Collapsible content logic - use defaults when collapsible is enabled\n const collapsibleOptions = React.useMemo(() => {\n if (!collapsible) return {};\n // Default limits when collapsible is enabled but no limits specified\n const effectiveMaxLength = maxLength ?? 1000;\n const effectiveMaxLines = maxLines ?? 10;\n return { maxLength: effectiveMaxLength, maxLines: effectiveMaxLines, defaultExpanded };\n }, [collapsible, maxLength, maxLines, defaultExpanded]);\n\n const {\n isCollapsed,\n toggleCollapsed,\n displayContent,\n shouldCollapse,\n } = useCollapsibleContent(\n trimmedContent,\n collapsible ? collapsibleOptions : {}\n );\n\n // Call onCollapseChange when state changes\n React.useEffect(() => {\n if (collapsible && shouldCollapse && onCollapseChange) {\n onCollapseChange(isCollapsed);\n }\n }, [isCollapsed, collapsible, shouldCollapse, onCollapseChange]);\n\n const components = React.useMemo(() => createMarkdownComponents(isUser, isCompact), [isUser, isCompact]);\n\n const textSizeClass = isCompact ? 'text-xs' : 'text-sm';\n const proseClass = isCompact ? 'prose-xs' : 'prose-sm';\n\n // For plain text without markdown, render directly without ReactMarkdown\n const isPlainText = !hasMarkdownSyntax(displayContent);\n\n // Render plain text - use CSS white-space: pre-line to preserve newlines\n if (isPlainText) {\n return (\n <span className={`${textSizeClass} leading-7 break-words whitespace-pre-line font-light ${className}`}>\n {displayContent}\n {collapsible && shouldCollapse && (\n <>\n {isCollapsed && '... '}\n <CollapseToggle\n isCollapsed={isCollapsed}\n onClick={toggleCollapsed}\n readMoreLabel={readMoreLabel}\n showLessLabel={showLessLabel}\n isUser={isUser}\n isCompact={isCompact}\n />\n </>\n )}\n </span>\n );\n }\n\n // Render markdown\n return (\n <div className={className}>\n <div\n className={`\n prose ${proseClass} max-w-none break-words overflow-hidden ${textSizeClass}\n ${isUser ? 'prose-invert' : 'dark:prose-invert'}\n [&>*]:leading-7\n `}\n style={{\n // Inherit colors from parent - fixes issues with external CSS variables\n '--tw-prose-body': 'inherit',\n '--tw-prose-headings': 'inherit',\n '--tw-prose-bold': 'inherit',\n '--tw-prose-links': 'inherit',\n color: 'inherit',\n } as React.CSSProperties}\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={components}\n >\n {displayContent}\n </ReactMarkdown>\n </div>\n {collapsible && shouldCollapse && (\n <CollapseToggle\n isCollapsed={isCollapsed}\n onClick={toggleCollapsed}\n readMoreLabel={readMoreLabel}\n showLessLabel={showLessLabel}\n isUser={isUser}\n isCompact={isCompact}\n />\n )}\n </div>\n );\n};\n\nexport default MarkdownMessage;\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}\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, LoadingFallback } from '../../components';\nimport { PlaygroundProvider } from './context/PlaygroundContext';\nimport type { PlaygroundConfig, SchemaSource } from './types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PlaygroundProps {\n config: PlaygroundConfig;\n}\n\nexport type { PlaygroundConfig, SchemaSource };\n\n// ============================================================================\n// OpenAPI Loading Fallback\n// ============================================================================\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\n// ============================================================================\n// Lazy Component (internal)\n// ============================================================================\n\nconst LazyPlaygroundLayout = createLazyComponent(\n () => import('./components/PlaygroundLayout').then((mod) => ({ default: mod.PlaygroundLayout })),\n {\n displayName: 'LazyPlaygroundLayout',\n fallback: <OpenapiLoadingFallback />,\n }\n);\n\n// ============================================================================\n// LazyOpenapiViewer\n// ============================================================================\n\n/**\n * LazyOpenapiViewer - Lazy-loaded OpenAPI schema viewer & playground\n *\n * Automatically shows loading state while OpenAPI components load (~400KB)\n */\nexport const LazyOpenapiViewer: React.FC<PlaygroundProps> = ({ config }) => {\n return (\n <PlaygroundProvider config={config}>\n <LazyPlaygroundLayout />\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\n/**\n * Lazy-loaded AudioPlayer Components\n *\n * Heavy WaveSurfer.js (~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 { HybridAudioPlayer } from '@djangocfg/ui-tools/audio'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type {\n HybridAudioPlayerProps,\n HybridSimplePlayerProps,\n HybridCompactPlayerProps,\n} from './components';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type { HybridAudioPlayerProps, HybridSimplePlayerProps, HybridCompactPlayerProps };\n\n// ============================================================================\n// Audio Loading Fallback\n// ============================================================================\n\nfunction AudioLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center p-6 bg-muted/30 rounded-lg\">\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-muted border-t-primary\" />\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=\"M9 19V6l12-3v13M9 19c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zm12-3c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zM9 10l12-3\"\n />\n </svg>\n </div>\n </div>\n <span className=\"text-sm text-muted-foreground\">Loading audio player...</span>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Components\n// ============================================================================\n\n/**\n * LazyHybridAudioPlayer - Lazy-loaded full-featured audio player\n *\n * Automatically shows loading state while WaveSurfer loads (~200KB)\n */\nexport const LazyHybridAudioPlayer = createLazyComponent<HybridAudioPlayerProps>(\n () => import('./components').then((mod) => ({ default: mod.HybridAudioPlayer })),\n {\n displayName: 'LazyHybridAudioPlayer',\n fallback: <AudioLoadingFallback />,\n }\n);\n\n/**\n * LazyHybridSimplePlayer - Lazy-loaded simple audio player\n *\n * Automatically shows loading state while WaveSurfer loads (~200KB)\n */\nexport const LazyHybridSimplePlayer = createLazyComponent<HybridSimplePlayerProps>(\n () => import('./components').then((mod) => ({ default: mod.HybridSimplePlayer })),\n {\n displayName: 'LazyHybridSimplePlayer',\n fallback: <AudioLoadingFallback />,\n }\n);\n\n/**\n * LazyHybridCompactPlayer - Lazy-loaded compact single-row audio player\n *\n * Use in tight spaces: play/pause + waveform + timer in one line.\n */\nexport const LazyHybridCompactPlayer = createLazyComponent<HybridCompactPlayerProps>(\n () => import('./components').then((mod) => ({ default: mod.HybridCompactPlayer })),\n {\n displayName: 'LazyHybridCompactPlayer',\n fallback: (\n <div className=\"flex items-center gap-2 h-8 px-1 animate-pulse\">\n <div className=\"h-8 w-8 rounded-md bg-muted flex-shrink-0\" />\n <div className=\"flex-1 h-4 rounded bg-muted\" />\n <div className=\"h-3 w-12 rounded bg-muted flex-shrink-0\" />\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","/**\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\n// Lazy load the PlaygroundLayout component\nconst PlaygroundLayout = lazy(() =>\n import('./components/PlaygroundLayout').then((mod) => ({ default: mod.PlaygroundLayout }))\n);\n\n// Loading fallback component\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 <PlaygroundLayout />\n </Suspense>\n </PlaygroundProvider>\n );\n};\n\n// Re-export types for convenience\nexport type { PlaygroundConfig, SchemaSource } from './types';\n\n// Default export for dynamic import\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"]}