@djangocfg/ui-tools 2.1.356 → 2.1.358
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ChatRoot-6U7633X3.mjs +5 -0
- package/dist/{ChatRoot-L2T7LU54.mjs.map → ChatRoot-6U7633X3.mjs.map} +1 -1
- package/dist/ChatRoot-HARTIAJ5.cjs +14 -0
- package/dist/{ChatRoot-XY3E6AKV.cjs.map → ChatRoot-HARTIAJ5.cjs.map} +1 -1
- package/dist/{DocsLayout-VFPPNKSQ.mjs → DocsLayout-HGYIJTF3.mjs} +4 -4
- package/dist/{DocsLayout-VFPPNKSQ.mjs.map → DocsLayout-HGYIJTF3.mjs.map} +1 -1
- package/dist/{DocsLayout-N5ZJZPBY.cjs → DocsLayout-OQHDNKZE.cjs} +11 -11
- package/dist/{DocsLayout-N5ZJZPBY.cjs.map → DocsLayout-OQHDNKZE.cjs.map} +1 -1
- package/dist/JsonTree-43PQAJKY.mjs +5 -0
- package/dist/{JsonTree-55625VVH.mjs.map → JsonTree-43PQAJKY.mjs.map} +1 -1
- package/dist/JsonTree-X6W5YEVY.cjs +11 -0
- package/dist/{JsonTree-DCM5QGWF.cjs.map → JsonTree-X6W5YEVY.cjs.map} +1 -1
- package/dist/TreeRoot-5COOOSWG.mjs +4 -0
- package/dist/{TreeRoot-N72OYKXU.cjs.map → TreeRoot-5COOOSWG.mjs.map} +1 -1
- package/dist/TreeRoot-AABP2J6Y.cjs +19 -0
- package/dist/{TreeRoot-VGAIXCUA.mjs.map → TreeRoot-AABP2J6Y.cjs.map} +1 -1
- package/dist/{chunk-5G5YBFS6.mjs → chunk-ECONRHIG.mjs} +7 -7
- package/dist/chunk-ECONRHIG.mjs.map +1 -0
- package/dist/{chunk-IEEAENLX.cjs → chunk-FVVF7VCD.cjs} +14 -10
- package/dist/chunk-FVVF7VCD.cjs.map +1 -0
- package/dist/{chunk-2ZLKZ5VR.mjs → chunk-NWUT327A.mjs} +110 -32
- package/dist/chunk-NWUT327A.mjs.map +1 -0
- package/dist/{chunk-H42G3HTQ.cjs → chunk-OPKFKTIN.cjs} +12 -11
- package/dist/chunk-OPKFKTIN.cjs.map +1 -0
- package/dist/{chunk-SGP7V2UW.cjs → chunk-T3MWM23F.cjs} +6 -6
- package/dist/chunk-T3MWM23F.cjs.map +1 -0
- package/dist/{chunk-PRRH35VD.mjs → chunk-WGU5BEZX.mjs} +11 -10
- package/dist/chunk-WGU5BEZX.mjs.map +1 -0
- package/dist/{chunk-B5AWZOHJ.cjs → chunk-XACCHZH2.cjs} +119 -41
- package/dist/chunk-XACCHZH2.cjs.map +1 -0
- package/dist/{chunk-G5IEC7SR.mjs → chunk-ZL7FH4NW.mjs} +15 -11
- package/dist/chunk-ZL7FH4NW.mjs.map +1 -0
- package/dist/index.cjs +93 -93
- package/dist/index.d.cts +35 -4
- package/dist/index.d.ts +35 -4
- package/dist/index.mjs +10 -10
- package/dist/tree/index.cjs +33 -33
- package/dist/tree/index.d.cts +34 -4
- package/dist/tree/index.d.ts +34 -4
- package/dist/tree/index.mjs +1 -1
- package/package.json +6 -6
- package/src/components/markdown/MarkdownMessage/ActionRow.tsx +8 -3
- package/src/components/markdown/MarkdownMessage/ChatMessageRow.tsx +10 -4
- package/src/components/markdown/MarkdownMessage/CodeBlock.tsx +18 -6
- package/src/components/markdown/MarkdownMessage/CollapseToggle.tsx +13 -6
- package/src/components/markdown/MarkdownMessage/MarkdownMessage.tsx +10 -3
- package/src/tools/Chat/components/ChatRoot.tsx +2 -0
- package/src/tools/Chat/components/MessageActions.tsx +13 -3
- package/src/tools/Chat/components/StreamingIndicator.tsx +11 -1
- package/src/tools/JsonTree/components/JsonContent.tsx +13 -4
- package/src/tools/JsonTree/components/JsonToolbar.tsx +11 -4
- package/src/tools/JsonTree/index.tsx +10 -3
- package/src/tools/Tree/components/TreeChevron.tsx +10 -1
- package/src/tools/Tree/components/TreeIcon.tsx +11 -1
- package/src/tools/Tree/components/TreeLabel.tsx +10 -1
- package/src/tools/Tree/components/TreeRow.tsx +11 -1
- package/dist/ChatRoot-L2T7LU54.mjs +0 -5
- package/dist/ChatRoot-XY3E6AKV.cjs +0 -14
- package/dist/JsonTree-55625VVH.mjs +0 -5
- package/dist/JsonTree-DCM5QGWF.cjs +0 -11
- package/dist/TreeRoot-N72OYKXU.cjs +0 -19
- package/dist/TreeRoot-VGAIXCUA.mjs +0 -4
- package/dist/chunk-2ZLKZ5VR.mjs.map +0 -1
- package/dist/chunk-5G5YBFS6.mjs.map +0 -1
- package/dist/chunk-B5AWZOHJ.cjs.map +0 -1
- package/dist/chunk-G5IEC7SR.mjs.map +0 -1
- package/dist/chunk-H42G3HTQ.cjs.map +0 -1
- package/dist/chunk-IEEAENLX.cjs.map +0 -1
- package/dist/chunk-PRRH35VD.mjs.map +0 -1
- package/dist/chunk-SGP7V2UW.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/markdown/useCollapsibleContent.ts","../src/components/markdown/MarkdownMessage/plainText.ts","../src/tools/Mermaid/index.tsx","../src/tools/PrettyCode/index.tsx","../src/components/markdown/MarkdownMessage/sanitize.ts","../src/components/markdown/MarkdownMessage/CodeBlock.tsx","../src/components/markdown/MarkdownMessage/components.tsx","../src/components/markdown/MarkdownMessage/CollapseToggle.tsx","../src/components/markdown/MarkdownMessage/linkRules.ts","../src/components/markdown/MarkdownMessage/MarkdownMessage.tsx"],"names":["__name","useState","useMemo","useCallback","React","lazy","jsx","Suspense","LoadingFallback","jsxs","defaultSchema","useResolvedTheme","CopyButton","Fragment","ReactMarkdown","remarkGfm","remarkBreaks","remarkSmartypants","remarkEmoji","rehypeRaw","rehypeSanitize","rehypeExternalLinks"],"mappings":"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","file":"chunk-B5AWZOHJ.cjs","sourcesContent":["'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","import React from 'react';\n\n/** Recursively concatenate the text content of a React.ReactNode tree.\n * Used by the markdown renderers (e.g. `<pre>` extracting code) and\n * by consumers that need a plain-string label out of link children. */\nexport function extractTextFromChildren(children: React.ReactNode): string {\n if (typeof children === 'string') return children;\n if (typeof children === 'number') return String(children);\n if (React.isValidElement(children)) {\n const props = children.props as { children?: React.ReactNode };\n return extractTextFromChildren(props.children);\n }\n if (Array.isArray(children)) {\n return children.map(extractTextFromChildren).join('');\n }\n return '';\n}\n\n/**\n * Auto-detect whether `text` should bypass ReactMarkdown and render as\n * a flat `<div whitespace-pre-wrap>`. Used as the *fallback* when the\n * caller doesn't pass `plainText` explicitly to `MarkdownMessage`.\n *\n * The signal we trust: short, single-paragraph, no markdown markers.\n * Anything longer / multi-paragraph / structurally suggestive falls\n * through to the markdown pipeline — false negatives there are cheap\n * (markdown renders prose correctly), false positives in the prose\n * branch surface as escaped `*` / `#` / etc. so we err markdown-ward.\n *\n * Thresholds were picked from chat-bubble UX research (see ChatGPT,\n * Claude.ai, WhatsApp): roughly \"would a person have written this in\n * one keystroke without thinking about formatting?\". If you find them\n * too tight or too loose, tune here — every consumer goes through\n * `MarkdownMessage` so the change is universal.\n */\nexport function looksLikePlainProse(text: string): boolean {\n const trimmed = text.trim();\n // Empty / whitespace-only — render as plain (cheap path, nothing to parse).\n if (trimmed.length === 0) return true;\n // Long enough that it's likely a structured assistant reply.\n if (trimmed.length > 500) return false;\n // Paragraph break → almost certainly markdown territory.\n if (/\\n\\s*\\n/.test(trimmed)) return false;\n // Many single-line breaks → probably a list or stanza.\n const newlineCount = (trimmed.match(/\\n/g) || []).length;\n if (newlineCount > 4) return false;\n // Any markdown marker → defer to ReactMarkdown.\n if (hasMarkdownSyntax(trimmed)) return false;\n return true;\n}\n\n/** Affordance test: does this string look like markdown? Used to skip\n * the (heavier) ReactMarkdown pipeline when the content is pure\n * prose. NOT a validator — false negatives are fine; false positives\n * cost a render but render correctly. */\nexport function hasMarkdownSyntax(text: string): boolean {\n // Newlines after trim → render as markdown so paragraphs work.\n if (text.trim().includes('\\n')) return true;\n\n // Inline HTML tags (`<br>`, `<b>`, `<code>`, …) — common in OpenAPI\n // descriptions. Without this branch the fast path would escape them\n // and the user sees literal angle brackets.\n if (/<\\/?[a-zA-Z][a-zA-Z0-9-]*(\\s[^>]*)?\\/?>/.test(text)) return true;\n\n const patterns = [\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 return patterns.some((p) => p.test(text));\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 * Enable the FloatingToolbar's \"click to scroll\" lock overlay.\n * Defaults to `false` — Mermaid diagrams don't scroll internally,\n * so the lock overlay just steals page wheel events. See the\n * Mermaid.client implementation for the full rationale.\n */\n scrollIsolation?: 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","/**\n * PrettyCode Component - Dynamic Import Wrapper\n *\n * Lazy loads the heavy Prism library (~500KB) only when needed.\n * This significantly reduces the initial bundle size.\n */\n\n'use client';\n\nimport React, { lazy, Suspense } from 'react';\nimport type { Language } from 'prism-react-renderer';\n\n// Lazy load the client component\nconst PrettyCodeClient = lazy(() => import('./PrettyCode.client'));\n\n// Loading fallback component\nconst LoadingFallback = () => (\n <div className=\"relative rounded-sm border border-border overflow-hidden bg-muted dark:bg-zinc-900\">\n <div className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"animate-pulse h-4 w-4 rounded-full bg-muted-foreground/20\"></div>\n <span className=\"text-xs text-muted-foreground\">Loading code...</span>\n </div>\n </div>\n </div>\n);\n\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 /** Block scroll capture until user clicks (default: true) */\n scrollIsolation?: boolean;\n /**\n * Line count above which the block starts scrolling instead of growing.\n * ``undefined`` (default) = no cap, block grows to fit. Set e.g. ``50``\n * to inline short snippets and cap long ones.\n */\n maxLines?: number;\n /**\n * Visual variant:\n * - ``\"card\"`` (default) — full chrome: border, background, hover\n * toolbar (Copy + language tag), optional internal scroll. Suits\n * a standalone code block in documentation prose where the block\n * is its own surface.\n * - ``\"plain\"`` — chrome-less: no border, no background, no toolbar,\n * no internal scroll. Grows to fit its content. Use when\n * embedding inside another scroll container (e.g. the Response\n * panel) — avoids double-scroll surfaces and lets the parent\n * manage copy/language affordances.\n */\n variant?: 'card' | 'plain';\n}\n\nconst PrettyCode: React.FC<PrettyCodeProps> = (props) => {\n return (\n <Suspense fallback={<LoadingFallback />}>\n <PrettyCodeClient {...props} />\n </Suspense>\n );\n};\n\nexport default PrettyCode;\nexport type { Language };\n","import { defaultSchema } from 'rehype-sanitize';\n\n/** Sanitize schema. Typed loosely (`Record<string, unknown>`) so this\n * package's published types don't try to re-export\n * `hast-util-sanitize`'s internal Schema type — that breaks consumers\n * whose TS doesn't have the transitive dependency in scope. */\nexport type SanitizeSchema = Record<string, unknown>;\n\n// Allow-list HTML that OpenAPI descriptions commonly use — we want\n// `<b>`/`<code>`/`<br>` to render, not to appear as literal text.\n// Built on top of rehype-sanitize's default schema so we keep the\n// XSS protection (no `<script>`, no `on*` handlers, no `javascript:`\n// URLs); we just extend the tag allow-list with safe presentational\n// elements that are in wide use in API docs.\nexport const HTML_SCHEMA_BASE: SanitizeSchema = {\n ...defaultSchema,\n tagNames: [\n ...(defaultSchema.tagNames ?? []),\n 'br',\n 'b',\n 'i',\n 'u',\n 's',\n 'sub',\n 'sup',\n 'small',\n 'mark',\n 'kbd',\n 'code',\n 'pre',\n 'details',\n 'summary',\n ],\n};\n\n/** Build a sanitize schema with extra href-URL protocols allowed on\n * `<a>`. Default whitelists `http(s)/mailto/xmpp/irc(s)` — pass extras\n * here (e.g. `'cmdop'`, `'obsidian'`) to opt them in. */\nexport function buildSchema(extraProtocols: readonly string[] | undefined): SanitizeSchema {\n if (!extraProtocols || extraProtocols.length === 0) return HTML_SCHEMA_BASE;\n const baseProtocols =\n (HTML_SCHEMA_BASE as { protocols?: Record<string, string[]> }).protocols\n ?? (defaultSchema as { protocols?: Record<string, string[]> }).protocols\n ?? {};\n const baseHref = baseProtocols.href ?? ['http', 'https', 'mailto', 'xmpp', 'irc', 'ircs'];\n return {\n ...HTML_SCHEMA_BASE,\n protocols: {\n ...baseProtocols,\n href: [...baseHref, ...extraProtocols],\n },\n };\n}\n\n/** Build a `urlTransform` for ReactMarkdown that lets opted-in schemes\n * pass through verbatim. react-markdown's default strips `href` for\n * unrecognised schemes BEFORE sanitize runs — even with our extended\n * sanitize schema, custom schemes would arrive with `href=\"\"`. */\nexport function buildUrlTransform(extraProtocols: readonly string[] | undefined) {\n if (!extraProtocols || extraProtocols.length === 0) return undefined;\n const lower = extraProtocols.map((p) => p.toLowerCase() + ':');\n return (url: string): string => {\n const u = url.trim().toLowerCase();\n for (const p of lower) {\n if (u.startsWith(p)) return url;\n }\n // Fallback: replicate react-markdown's defaults for safe schemes\n // and relative paths. Anything else → empty string so the\n // anchor's href is dropped (XSS guard).\n if (\n /^(https?:|mailto:|tel:|xmpp:|irc:|ircs:|#|\\/|\\.\\/|\\.\\.\\/|\\?)/i.test(u)\n || /^[a-z0-9._~!$&'()*+,;=:@%-]+$/i.test(u)\n ) {\n return url;\n }\n return '';\n };\n}\n","import React from 'react';\nimport { CopyButton } from '@djangocfg/ui-core/components';\nimport { useResolvedTheme } from '@djangocfg/ui-core/hooks';\nimport PrettyCode from '../../../tools/PrettyCode';\n\ninterface CodeBlockProps {\n code: string;\n language: string;\n isUser: boolean;\n isCompact?: boolean;\n}\n\n/**\n * Markdown code block. Renders <PrettyCode> directly — its own\n * FloatingToolbar already carries the language tag and Copy action.\n *\n * Earlier versions stacked an extra <CopyButton> here too, which\n * surfaced as two copy buttons on every code fence. The fallback\n * branch below still ships its own button because the plain <pre>\n * has no toolbar of its own.\n */\nexport const CodeBlock: React.FC<CodeBlockProps> = ({ code, language }) => {\n const theme = useResolvedTheme();\n\n // Chat fences are always rendered in PrettyCode's compact mode:\n // 12px font, tighter padding, line-height 1.4. A fenced block in\n // a chat bubble shouldn't outweigh two paragraphs of body text —\n // the standalone PrettyCode story keeps the larger default for\n // docs/diff viewers.\n return (\n <div className=\"my-2\">\n <PrettyCode\n data={code}\n language={language}\n className=\"text-xs\"\n customBg=\"bg-code\"\n mode={theme}\n isCompact\n // Disable click-to-scroll-isolation in chat markdown: code\n // fences here are part of an assistant reply, not a docs\n // viewer. Forcing the user to click into a small block to\n // scroll past it interrupts the reading flow. The standalone\n // PrettyCode use cases (docs, diff viewers, long code panes)\n // keep the default `true`.\n scrollIsolation={false}\n />\n </div>\n );\n};\n\n/** Simple `<pre>` fallback used when CodeBlock throws (lazy module\n * failure, missing PrettyCode peer, etc). */\nexport const CodeBlockFallback: React.FC<CodeBlockProps> = ({ code, isUser }) => {\n // See CodeBlock above for the spirit of this layout — palette\n // pre-computed before render.\n const copyHoverClass = isUser\n ? 'hover:bg-white/20 text-white'\n : 'hover:bg-muted-foreground/20 text-muted-foreground hover:text-foreground';\n const copyButtonClass =\n `absolute top-2 right-2 z-10 opacity-0 group-hover:opacity-100 transition-opacity ` +\n `h-8 w-8 ${copyHoverClass}`;\n\n return (\n <div className=\"relative group my-3\">\n <CopyButton\n value={code}\n variant=\"ghost\"\n className={copyButtonClass}\n title=\"Copy code\"\n />\n <pre className=\"p-3 rounded text-xs font-mono overflow-x-auto bg-code text-code-foreground border border-code-border\">\n <code>{code}</code>\n </pre>\n </div>\n );\n};\n","import React from 'react';\nimport type { Components } from 'react-markdown';\nimport Mermaid from '../../../tools/Mermaid';\nimport { CodeBlock, CodeBlockFallback } from './CodeBlock';\nimport { extractTextFromChildren } from './plainText';\n\n/**\n * Build the chat-tuned markdown component map.\n *\n * Base text size: text-sm (14px) for normal, text-xs (12px) for compact.\n * Heading sizes are scaled down a notch from the prose defaults so\n * inline-in-chat headings don't dominate.\n */\nexport function createMarkdownComponents(\n isUser: boolean = false,\n isCompact: boolean = false,\n): Components {\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 h1: ({ children }) => (\n <h1 className={`${headingBase} font-semibold mb-2 mt-3 first:mt-0`}>{children}</h1>\n ),\n h2: ({ children }) => (\n <h2 className={`${headingSm} font-semibold 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 p: ({ children }) => (\n <p className={`${textSize} mb-4 last:mb-0 leading-relaxed break-words`}>{children}</p>\n ),\n\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 }) => <li className=\"break-words\">{children}</li>,\n\n // `target` / `rel` for external links are NOT set here — the\n // rehype-external-links plugin tags them on the rehype side, so\n // every `<a>` that sanitize let through gets the same security\n // treatment regardless of which renderer (default vs linkRules\n // override) emitted it. Doing it twice here would just duplicate\n // attributes; doing it only here would miss the linkRules path.\n a: ({ href, children, ...rest }) => (\n <a\n {...rest}\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 >\n {children}\n </a>\n ),\n\n pre: ({ children }) => {\n let codeContent = '';\n let language = 'plaintext';\n\n if (React.isValidElement(children)) {\n const child = children;\n if (\n child.type === 'code'\n || (typeof child.type === 'function' && child.type.name === 'code')\n ) {\n const codeProps = child.props as {\n className?: string;\n children?: React.ReactNode;\n };\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 (!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 if (language === 'mermaid') {\n // Inline render fits the bubble width; the Mermaid component\n // owns its own click-to-fullscreen modal which sizes against\n // the viewport, so we don't cap it here. A previous version\n // hardcoded `max-w-[600px]` and that constraint leaked into\n // the fullscreen modal too — diagram rendered at 600px in the\n // middle of an empty viewport.\n return (\n <div className=\"my-3 w-full\">\n <Mermaid chart={codeContent} isCompact={isCompact} />\n </div>\n );\n }\n\n try {\n return <CodeBlock code={codeContent} language={language} isUser={isUser} isCompact={isCompact} />;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn('CodeBlock failed, using fallback:', error);\n return <CodeBlockFallback code={codeContent} language={language} isUser={isUser} isCompact={isCompact} />;\n }\n },\n\n code: ({ children, className }) => {\n // Inside <pre>: let pre handle styling.\n if (className?.includes('language-')) {\n return <code className={className}>{children}</code>;\n }\n // Inline `<code>` uses the design system's `--code-inline`\n // token. One semantic chip surface across both themes; on a\n // user bubble we still palette-switch with `text-primary-\n // foreground` because the inline chip blends INTO the bubble\n // — there's no panel boundary like a fence has. We trade a\n // perfect \"code surface\" tone here for legible body inheritance,\n // matching ChatGPT's behaviour in coloured user bubbles.\n const inlineCodeClass = isUser\n ? 'bg-primary-foreground/15 text-primary-foreground'\n : 'bg-code-inline text-code-inline-foreground';\n return (\n <code className={`px-1 py-0.5 rounded font-mono text-[0.875em] ${inlineCodeClass} break-all`}>\n {extractTextFromChildren(children)}\n </code>\n );\n },\n\n // Modern chat convention drops italic on blockquotes — italic +\n // tight bubble = hard to read. Border-left at 2px (4px reads\n // heavy in a 320–480px bubble). On the saturated user bubble we\n // use a primary-foreground tint; on the assistant bubble we use\n // the muted-foreground role for de-emphasis.\n blockquote: ({ children }) => {\n const cls = isUser\n ? 'border-primary-foreground/40 text-primary-foreground/80'\n : 'border-border text-muted-foreground';\n return (\n <blockquote className={`${textSize} border-l-2 pl-3 my-3 break-words ${cls}`}>\n {children}\n </blockquote>\n );\n },\n\n // Tables: outer wrapper handles overflow, inner `<table>`\n // inherits the chat-density text size. Borders / header use\n // semantic tokens — `border-code-border` for the assistant\n // (matches the code-fence panel for visual cohesion when both\n // appear in the same reply); primary-foreground/N for the user\n // bubble so lines read against the saturated `bg-primary`.\n table: ({ children }) => (\n <div className=\"overflow-x-auto my-3\">\n <table className={`min-w-full ${textSize} border-collapse`}>{children}</table>\n </div>\n ),\n thead: ({ children }) => (\n <thead className={isUser ? 'bg-primary-foreground/10' : 'bg-muted/40'}>\n {children}\n </thead>\n ),\n tbody: ({ children }) => <tbody>{children}</tbody>,\n tr: ({ children }) => (\n <tr className={isUser ? 'border-b border-primary-foreground/15' : 'border-b border-border'}>\n {children}\n </tr>\n ),\n th: ({ children }) => {\n const borderCls = isUser ? 'border-primary-foreground/25' : 'border-border';\n return (\n <th className={`px-2 py-1.5 text-left font-semibold border-b ${borderCls} break-words`}>\n {children}\n </th>\n );\n },\n td: ({ children }) => <td className=\"px-2 py-1.5 break-words\">{children}</td>,\n\n // Soft separator. ChatGPT / Slack / Linear strip the visible\n // line, Claude.ai keeps a hairline. We follow Claude — present\n // but quiet. Palette switches by role so the hairline reads on\n // both surfaces.\n hr: () => (\n <hr\n className={`my-4 border-0 h-px ${\n isUser ? 'bg-primary-foreground/20' : 'bg-border'\n }`}\n />\n ),\n\n strong: ({ children }) => <strong className=\"font-semibold\">{children}</strong>,\n em: ({ children }) => <em className=\"italic\">{children}</em>,\n };\n}\n","import React from 'react';\n\ninterface CollapseToggleProps {\n isCollapsed: boolean;\n onClick: () => void;\n readMoreLabel: string;\n showLessLabel: string;\n isUser: boolean;\n isCompact: boolean;\n}\n\n/** \"Read more...\" / \"Show less\" button. */\nexport const 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 return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`\n ${textSize} font-medium cursor-pointer\n transition-colors duration-200\n ${isUser ? 'text-white/80 hover:text-white' : 'text-primary hover:text-primary/80'}\n inline-flex items-center gap-1\n mt-1\n `}\n >\n {isCollapsed ? (\n <>\n {readMoreLabel}\n <Chevron direction=\"down\" />\n </>\n ) : (\n <>\n {showLessLabel}\n <Chevron direction=\"up\" />\n </>\n )}\n </button>\n );\n};\n\nfunction Chevron({ direction }: { direction: 'up' | 'down' }) {\n return (\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d={direction === 'down' ? 'M19 9l-7 7-7-7' : 'M5 15l7-7 7 7'}\n />\n </svg>\n );\n}\n","import React from 'react';\nimport type { ComponentProps, ComponentType } from 'react';\nimport type { Components } from 'react-markdown';\nimport type { LinkRule } from './types';\n\n// react-markdown's `Components['a']` is `keyof IntrinsicElements | ComponentType<…>`,\n// so it isn't necessarily a function we can directly call. This is the\n// component-shaped variant — what callers practically pass when they\n// override `a`.\ntype AComponent = ComponentType<ComponentProps<'a'>>;\n\n/** Run every rule's `preprocess` hook in order. Errors in a single\n * rule are logged and skipped — the other rules still run. */\nexport function applyPreprocess(\n source: string,\n rules: readonly LinkRule[] | undefined,\n): string {\n if (!rules || rules.length === 0) return source;\n let s = source;\n for (const rule of rules) {\n if (!rule.preprocess) continue;\n try {\n s = rule.preprocess(s);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(\n `[MarkdownMessage] linkRule \"${rule.name ?? '(anonymous)'}\" preprocess threw; skipping`,\n err,\n );\n }\n }\n return s;\n}\n\n/** Union of `extraHrefProtocols` and any `protocols` declared by rules. */\nexport function collectProtocols(\n extraHrefProtocols: readonly string[] | undefined,\n rules: readonly LinkRule[] | undefined,\n): readonly string[] | undefined {\n const set = new Set<string>();\n if (extraHrefProtocols) for (const p of extraHrefProtocols) set.add(p);\n if (rules) {\n for (const r of rules) {\n if (r.protocols) for (const p of r.protocols) set.add(p);\n }\n }\n return set.size === 0 ? undefined : Array.from(set);\n}\n\n/** Build a custom `a` renderer that dispatches to the first matching\n * rule, falling through to `callerA` (or the built-in chat anchor)\n * for anything no rule claims. */\nexport function buildLinkRulesComponent(\n rules: readonly LinkRule[],\n isUser: boolean,\n callerA: NonNullable<Components['a']> | undefined,\n): NonNullable<Components['a']> {\n const Renderer: AComponent = (props) => {\n const { href, children } = props;\n if (typeof href === 'string') {\n for (const rule of rules) {\n if (rule.match(href)) {\n return React.createElement(\n React.Fragment,\n null,\n rule.render({ href, children, isUser }),\n );\n }\n }\n }\n // Defer to the caller's `a` override if any. We only call it when\n // it's a function/component — string-form intrinsic overrides\n // (`'a' | 'span' | …`) aren't a thing react-markdown supports for\n // tag overrides, but the type still admits the union, so guard.\n if (callerA && typeof callerA === 'function') {\n const Caller = callerA as AComponent;\n return React.createElement(Caller, props);\n }\n // Fall through to the built-in anchor by rendering a plain `<a>`.\n return React.createElement('a', props, children);\n };\n return Renderer as NonNullable<Components['a']>;\n}\n","'use client';\n\nimport React from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport rehypeExternalLinks from 'rehype-external-links';\nimport rehypeRaw from 'rehype-raw';\nimport rehypeSanitize from 'rehype-sanitize';\nimport remarkBreaks from 'remark-breaks';\nimport remarkEmoji from 'remark-emoji';\nimport remarkGfm from 'remark-gfm';\nimport remarkSmartypants from 'remark-smartypants';\nimport type { Components } from 'react-markdown';\n\nimport { useCollapsibleContent } from '../useCollapsibleContent';\nimport type { MarkdownMessageProps } from './types';\nimport { buildSchema, buildUrlTransform } from './sanitize';\nimport { looksLikePlainProse } from './plainText';\nimport { createMarkdownComponents } from './components';\nimport { CollapseToggle } from './CollapseToggle';\nimport { applyPreprocess, buildLinkRulesComponent, collectProtocols } from './linkRules';\n\n/**\n * MarkdownMessage — chat-tuned markdown renderer.\n *\n * Features:\n * - GitHub Flavored Markdown (GFM) via remark-gfm\n * - Syntax-highlighted code blocks with Copy button\n * - Mermaid diagram rendering (` ```mermaid ` fence)\n * - Tables, lists, blockquotes scaled for chat density\n * - User vs assistant styling modes (`isUser`)\n * - Plain-text fast path: skips ReactMarkdown when content has no\n * markdown syntax (cheaper render, preserves newlines via CSS)\n * - Optional collapsible \"Read more...\" for long messages\n *\n * Custom URL schemes (chat mentions, deep-links, custom file viewers)\n * are best handled with the declarative `linkRules` prop — see the\n * type definition in `./types.ts` and the storybook for examples.\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 * // Custom URL scheme via linkRules\n * <MarkdownMessage\n * content=\"Talk to [Vps-audi](cmdop://machine/abc-123)\"\n * linkRules={[machineMentionRule]}\n * />\n * ```\n */\nexport const MarkdownMessage: React.FC<MarkdownMessageProps> = ({\n content,\n className = '',\n isUser = false,\n isCompact = false,\n plainText,\n customComponents,\n extraHrefProtocols,\n linkRules,\n collapsible = false,\n maxLength,\n maxLines,\n readMoreLabel = 'Read more...',\n showLessLabel = 'Show less',\n defaultExpanded = false,\n onCollapseChange,\n}) => {\n // Pre-process content through any rules that requested it. Done\n // before trim so a rule can rewrite multi-line shapes too.\n const preprocessed = React.useMemo(\n () => applyPreprocess(content, linkRules),\n [content, linkRules],\n );\n\n // Union of `extraHrefProtocols` and any `protocols` declared by rules.\n const effectiveProtocols = React.useMemo(\n () => collectProtocols(extraHrefProtocols, linkRules),\n [extraHrefProtocols, linkRules],\n );\n\n // Effective custom components: merge linkRules' synthesized `a`\n // renderer with any caller-provided `customComponents`. linkRules\n // wins when both target the same href (rule is the more specific\n // declarative claim by design).\n const effectiveCustomComponents = React.useMemo<Partial<Components> | undefined>(() => {\n if (!linkRules || linkRules.length === 0) return customComponents;\n const callerA = customComponents?.a;\n const aRenderer = buildLinkRulesComponent(linkRules, isUser, callerA);\n return { ...(customComponents ?? {}), a: aRenderer };\n }, [customComponents, linkRules, isUser]);\n\n const trimmedContent = preprocessed.trim();\n\n // Collapsible content logic — defaults kick in only when enabled.\n const collapsibleOptions = React.useMemo(() => {\n if (!collapsible) return {};\n return {\n maxLength: maxLength ?? 1000,\n maxLines: maxLines ?? 10,\n defaultExpanded,\n };\n }, [collapsible, maxLength, maxLines, defaultExpanded]);\n\n const { isCollapsed, toggleCollapsed, displayContent, shouldCollapse } =\n useCollapsibleContent(trimmedContent, collapsible ? collapsibleOptions : {});\n\n React.useEffect(() => {\n if (collapsible && shouldCollapse && onCollapseChange) {\n onCollapseChange(isCollapsed);\n }\n }, [isCollapsed, collapsible, shouldCollapse, onCollapseChange]);\n\n const components = React.useMemo(() => {\n const base = createMarkdownComponents(isUser, isCompact);\n return effectiveCustomComponents ? { ...base, ...effectiveCustomComponents } : base;\n }, [isUser, isCompact, effectiveCustomComponents]);\n\n const schema = React.useMemo(() => buildSchema(effectiveProtocols), [effectiveProtocols]);\n const urlTransform = React.useMemo(\n () => buildUrlTransform(effectiveProtocols),\n [effectiveProtocols],\n );\n\n const textSizeClass = isCompact ? 'text-xs' : 'text-sm';\n const proseClass = isCompact ? 'prose-xs' : 'prose-sm';\n\n // Resolve plain-vs-markdown branch:\n // 1. Caller-passed `plainText` wins outright (explicit beats clever).\n // 2. Caller-supplied non-`a` customComponents force the markdown\n // pipeline — those overrides only matter on real markdown nodes.\n // 3. Otherwise auto-detect via `looksLikePlainProse` (short,\n // single-paragraph, no markdown markers). This is the chat-bubble\n // WhatsApp/Telegram heuristic — \"would the human have written\n // this in one keystroke?\".\n const customComponentsBeyondLinks = React.useMemo(() => {\n if (!customComponents) return false;\n return Object.keys(customComponents).some((k) => k !== 'a');\n }, [customComponents]);\n const isPlainText = plainText !== undefined\n ? plainText\n : !customComponentsBeyondLinks && looksLikePlainProse(displayContent);\n\n if (isPlainText) {\n // <div> + whitespace-pre-wrap: respects newlines AND collapses\n // double spaces, which is what users mean when they hit Enter\n // twice. <span> would break flow inside a flex bubble.\n //\n // leading-snug (1.375), not leading-relaxed (1.625) — `pre-wrap`\n // makes every `\\n` a hard line break, so the relaxed leading\n // turns multi-line user messages into airy ladders. snug matches\n // WhatsApp/Telegram bubble density.\n return (\n <div\n className={`${textSizeClass} font-normal antialiased leading-snug break-words whitespace-pre-wrap ${className}`}\n >\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 </div>\n );\n }\n\n return (\n <div className={className}>\n <div\n className={`\n prose ${proseClass} max-w-none break-words overflow-hidden ${textSizeClass} font-normal antialiased\n ${isUser ? 'prose-invert' : 'dark:prose-invert'}\n [&>*]:leading-relaxed\n [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\n [&_p]:my-2\n [&_ul]:my-2 [&_ol]:my-2 [&_ul]:pl-5 [&_ol]:pl-5\n [&_li]:my-1 [&_li>p]:my-0\n [&_h1]:mt-4 [&_h1]:mb-2 [&_h1]:text-base [&_h1]:font-semibold\n [&_h2]:mt-3.5 [&_h2]:mb-1.5 [&_h2]:text-[15px] [&_h2]:font-semibold\n [&_h3]:mt-3 [&_h3]:mb-1 [&_h3]:text-sm [&_h3]:font-medium\n [&_h4]:mt-3 [&_h4]:mb-1 [&_h4]:text-sm [&_h4]:font-medium\n `}\n style={{\n // Inherit colors from parent — fixes issues with external\n // CSS variables overriding prose tokens.\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 // Remark plugin order is load-bearing:\n // 1. `remark-gfm` — tables, strikethrough, autolinks, task lists.\n // 2. `remark-breaks` — chat convention: single `\\n` → `<br>`\n // (ChatGPT / Slack / Discord / Linear). CommonMark's\n // default would collapse those into one paragraph and\n // LLM punchlines / poems / dialogue would render as a\n // run-on line. Goes BEFORE smartypants so quotes that\n // land at line breaks still get the curly treatment.\n // 3. `remark-smartypants` — typographic substitutions:\n // \"...\" → …, -- → —, \"x\" → \"x\". Cheap \"humanized\"\n // polish à la Medium / Substack.\n // 4. `remark-emoji` — `:smile:` → 😄 (GitHub / Linear\n // shortcode style). Leaves Unicode emoji untouched.\n remarkPlugins={[remarkGfm, remarkBreaks, remarkSmartypants, remarkEmoji]}\n // rehype-raw parses inline HTML in the source; rehype-sanitize\n // (with our extended schema) runs after to keep XSS guards\n // (no scripts, no on* handlers, no javascript: urls).\n // rehype-external-links runs LAST so it tags every <a> that\n // sanitize let through — externals get target=_blank +\n // rel=noopener noreferrer in one pass, instead of every\n // custom `a` renderer reimplementing the rule.\n rehypePlugins={[\n rehypeRaw,\n [rehypeSanitize, schema],\n [rehypeExternalLinks, { target: '_blank', rel: ['noopener', 'noreferrer'] }],\n ]}\n components={components}\n // urlTransform runs in remark-rehype before sanitize. Without\n // overriding it, react-markdown's default strips `href` for\n // unknown schemes — making our extended sanitize whitelist\n // moot. Only set when the caller opted into extra protocols.\n urlTransform={urlTransform}\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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tools/Tree/types.ts","../src/tools/Tree/data/childCache.ts","../src/tools/Tree/data/flatten.ts","../src/tools/Tree/data/persist.ts","../src/tools/Tree/data/appearance.ts","../src/tools/Tree/context/TreeContext.tsx","../src/tools/Tree/components/TreeChevron.tsx","../src/tools/Tree/components/TreeIcon.tsx","../src/tools/Tree/components/TreeIndentGuides.tsx","../src/tools/Tree/components/TreeLabel.tsx","../src/tools/Tree/components/TreeRow.tsx","../src/tools/Tree/components/TreeEmpty.tsx","../src/tools/Tree/components/TreeContent.tsx","../src/tools/Tree/context/hooks.ts","../src/tools/Tree/components/TreeSearchInput.tsx","../src/tools/Tree/hooks/useTreeKeyboard.ts","../src/tools/Tree/hooks/useTreeTypeAhead.ts","../src/tools/Tree/TreeRoot.tsx"],"names":["children","jsx","cn","Fragment","useMemo","useCallback","jsxs","useRef","useEffect"],"mappings":"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","file":"chunk-G5IEC7SR.mjs","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\n\nimport type { TreeAppearance } from './data/appearance';\n\nexport type TreeItemId = string;\n\n/** A single node in the consumer's tree data. Generic over your payload. */\nexport interface TreeNode<T = unknown> {\n id: TreeItemId;\n data: T;\n /** Inline children. Omit (and provide a `loadChildren`) for async loading. */\n children?: TreeNode<T>[];\n /**\n * Set to `true` to mark a node as a folder even when its `children` array\n * is empty (e.g. an unloaded async folder). Default: derived from\n * `Array.isArray(children)`.\n */\n isFolder?: boolean;\n /** Disable interaction. */\n disabled?: boolean;\n}\n\nexport interface TreeLabels {\n loading: string;\n empty: string;\n error: string;\n searchPlaceholder: string;\n searchMatches: (count: number) => string;\n ariaLabel: string;\n}\n\nexport const DEFAULT_TREE_LABELS: TreeLabels = {\n loading: 'Loading…',\n empty: 'Nothing to show',\n error: 'Failed to load',\n searchPlaceholder: 'Search…',\n searchMatches: (n) => `${n} match${n === 1 ? '' : 'es'}`,\n ariaLabel: 'Tree',\n};\n\nexport type TreeSelectionMode = 'none' | 'single' | 'multiple';\n\n/**\n * How a node becomes \"activated\" (i.e. opened) on pointer interaction.\n *\n * - `'single-click'` (default): single click activates a leaf immediately;\n * double-click also activates. Folders always toggle on single click.\n * - `'double-click'`: single click only selects + focuses; double-click is\n * required to activate. Mirrors classic file-manager behaviour.\n * - `'single-click-preview'`: VSCode Explorer / Cursor behaviour. Single\n * click activates with `{ preview: true }` (consumer renders a preview\n * tab); double-click activates with `{ preview: false }` (pinned tab).\n *\n * Folders ignore this setting — they always toggle on single click and\n * never call `onActivate`.\n */\nexport type TreeActivationMode =\n | 'single-click'\n | 'double-click'\n | 'single-click-preview';\n\nexport interface TreeActivateOptions {\n /**\n * `true` when the activation came from a single click in\n * `'single-click-preview'` mode. `false` for double-click and for\n * non-preview modes. Consumers typically map this to a\n * preview-tab vs pinned-tab distinction.\n */\n preview: boolean;\n}\n\n/**\n * Async loader: called the first time a folder is expanded with no inline\n * `children`. Result is cached; concurrent expansions are de-duplicated.\n */\nexport type TreeLoadChildren<T> = (\n node: TreeNode<T>,\n) => Promise<TreeNode<T>[]>;\n\nexport interface TreeRowRenderProps<T> {\n node: TreeNode<T>;\n level: number;\n isSelected: boolean;\n isExpanded: boolean;\n isFocused: boolean;\n isFolder: boolean;\n isLoading: boolean;\n isMatchingSearch: boolean;\n}\n\nexport type TreeRowSlot<T> = (props: TreeRowRenderProps<T>) => ReactNode;\n\nexport type TreeContextMenuSlot<T> = (\n props: TreeRowRenderProps<T>,\n trigger: ReactNode,\n) => ReactNode;\n\nexport interface TreeRootProps<T> {\n /** Root nodes. Top-level items are rendered directly (no synthetic root). */\n data: TreeNode<T>[];\n /** Returns the human-readable name for a node (used by search/type-ahead). */\n getItemName: (node: TreeNode<T>) => string;\n\n /** Async loader for folders without inline `children`. */\n loadChildren?: TreeLoadChildren<T>;\n\n /** Selection behaviour. Default: `'single'`. */\n selectionMode?: TreeSelectionMode;\n /** Pointer activation behaviour. Default: `'single-click'`. */\n activationMode?: TreeActivationMode;\n /** Initially expanded ids. */\n initialExpandedIds?: TreeItemId[];\n /** Initially selected ids. */\n initialSelectedIds?: TreeItemId[];\n /** Pixels of indent per nesting level. Default: 16. (Shortcut for `appearance.indent`.) */\n indent?: number;\n /** Cosmetic configuration: density, sizes, accent intensity, radius. */\n appearance?: TreeAppearance;\n\n /** Triggered when selection changes. */\n onSelectionChange?: (selectedIds: TreeItemId[]) => void;\n /** Triggered when expanded set changes. */\n onExpansionChange?: (expandedIds: TreeItemId[]) => void;\n /**\n * Triggered when a leaf is activated (Enter / dblclick / click depending\n * on `activationMode`). Folders never call this — they toggle instead.\n */\n onActivate?: (node: TreeNode<T>, opts: TreeActivateOptions) => void;\n\n /**\n * Optional predicate. Nodes returning `false` (and their descendants) are\n * not rendered and not searchable. Use this to hide dot-files, system\n * entries, or anything else the consumer wants to filter out.\n */\n filterNode?: (node: TreeNode<T>) => boolean;\n\n /** Show built-in search input. Default: false. */\n enableSearch?: boolean;\n /** Type printable letters to jump to a matching name. Default: true. */\n enableTypeAhead?: boolean;\n /** Render vertical indent guides under expanded folders. Default: false. */\n showIndentGuides?: boolean;\n\n /** Custom row renderer. Falls back to the default <TreeRow />. */\n renderRow?: TreeRowSlot<T>;\n /** Replace default folder/file icon. */\n renderIcon?: TreeRowSlot<T>;\n /** Replace default label rendering. */\n renderLabel?: TreeRowSlot<T>;\n /** Right-side actions slot (per row). */\n renderActions?: TreeRowSlot<T>;\n /** Wrap each row in a context menu (right-click). Receives the row meta + trigger element. */\n renderContextMenu?: TreeContextMenuSlot<T>;\n\n /** Override built-in copy in your locale. */\n labels?: Partial<TreeLabels>;\n /** Persist expanded + (optional) selected ids in localStorage under this key. */\n persistKey?: string;\n /** Persist selection alongside expansion. Default: false. */\n persistSelection?: boolean;\n\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Internal flat-row representation used by the renderer + keyboard nav. */\nexport interface FlatRow<T> {\n node: TreeNode<T>;\n level: number;\n parentId: TreeItemId | null;\n isFolder: boolean;\n isExpanded: boolean;\n isLoading: boolean;\n hasError: boolean;\n}\n","'use client';\n\nimport type { TreeItemId, TreeNode } from '../types';\n\nexport type ChildEntryStatus = 'idle' | 'loading' | 'loaded' | 'error';\n\nexport interface ChildEntry<T> {\n status: ChildEntryStatus;\n children: TreeNode<T>[];\n error?: string;\n}\n\nexport type ChildCache<T> = Map<TreeItemId, ChildEntry<T>>;\n\nexport const createChildCache = <T>(): ChildCache<T> => new Map();\n\nexport const getEntry = <T>(\n cache: ChildCache<T>,\n id: TreeItemId,\n): ChildEntry<T> | undefined => cache.get(id);\n\n/**\n * Resolve a node's children for the current render.\n *\n * - If the node carries inline `children`, those win (no async fetch).\n * - Otherwise we look in the cache.\n *\n * Returns `null` when nothing is loaded yet (caller may show a skeleton).\n */\nexport const resolveChildren = <T>(\n cache: ChildCache<T>,\n node: TreeNode<T>,\n): { children: TreeNode<T>[] | null; status: ChildEntryStatus; error?: string } => {\n if (Array.isArray(node.children)) {\n return { children: node.children, status: 'loaded' };\n }\n const entry = cache.get(node.id);\n if (!entry) return { children: null, status: 'idle' };\n if (entry.status === 'loaded') {\n return { children: entry.children, status: 'loaded' };\n }\n return { children: null, status: entry.status, error: entry.error };\n};\n","'use client';\n\nimport type { FlatRow, TreeItemId, TreeNode } from '../types';\nimport { resolveChildren, type ChildCache } from './childCache';\n\nexport interface FlattenInput<T> {\n roots: TreeNode<T>[];\n expandedIds: ReadonlySet<TreeItemId>;\n cache: ChildCache<T>;\n /** Optional predicate. Nodes returning `false` (and their descendants) are excluded. */\n filterNode?: (node: TreeNode<T>) => boolean;\n}\n\nconst isNodeFolder = <T>(node: TreeNode<T>): boolean => {\n if (typeof node.isFolder === 'boolean') return node.isFolder;\n return Array.isArray(node.children);\n};\n\n/**\n * Walk the tree top-to-bottom and produce a flat list of visible rows.\n *\n * Visibility rule: a child row appears only when every ancestor is in\n * `expandedIds`. The output is ordered exactly as it should render,\n * which keeps keyboard navigation (next/prev row) trivial.\n */\nexport function flattenTree<T>({\n roots,\n expandedIds,\n cache,\n filterNode,\n}: FlattenInput<T>): FlatRow<T>[] {\n const out: FlatRow<T>[] = [];\n\n const walk = (nodes: TreeNode<T>[], level: number, parentId: TreeItemId | null) => {\n for (const node of nodes) {\n if (filterNode && !filterNode(node)) continue;\n\n const isFolder = isNodeFolder(node);\n const isExpanded = expandedIds.has(node.id);\n const resolved = isFolder ? resolveChildren(cache, node) : { children: [], status: 'loaded' as const };\n\n out.push({\n node,\n level,\n parentId,\n isFolder,\n isExpanded,\n isLoading: resolved.status === 'loading',\n hasError: resolved.status === 'error',\n });\n\n if (isFolder && isExpanded && resolved.children) {\n walk(resolved.children, level + 1, node.id);\n }\n }\n };\n\n walk(roots, 0, null);\n return out;\n}\n","'use client';\n\nimport type { TreeItemId } from '../types';\n\nconst KEY_PREFIX = '@djangocfg/tree:';\nconst VERSION = 1;\n\nexport interface PersistedTreeState {\n expandedItems: TreeItemId[];\n selectedItems: TreeItemId[];\n}\n\ninterface PersistedShape extends PersistedTreeState {\n version: number;\n}\n\nfunction safeStorage(): Storage | null {\n if (typeof window === 'undefined') return null;\n try {\n return window.localStorage;\n } catch {\n return null;\n }\n}\n\nexport function loadTreeState(key: string): PersistedTreeState | null {\n const storage = safeStorage();\n if (!storage) return null;\n try {\n const raw = storage.getItem(KEY_PREFIX + key);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as Partial<PersistedShape>;\n if (parsed.version !== VERSION) return null;\n return {\n expandedItems: Array.isArray(parsed.expandedItems) ? parsed.expandedItems : [],\n selectedItems: Array.isArray(parsed.selectedItems) ? parsed.selectedItems : [],\n };\n } catch {\n return null;\n }\n}\n\nexport function saveTreeState(key: string, state: PersistedTreeState): void {\n const storage = safeStorage();\n if (!storage) return;\n try {\n const payload: PersistedShape = { ...state, version: VERSION };\n storage.setItem(KEY_PREFIX + key, JSON.stringify(payload));\n } catch {\n /* quota / serialization — best-effort persistence */\n }\n}\n\nexport function clearTreeState(key: string): void {\n const storage = safeStorage();\n if (!storage) return;\n try {\n storage.removeItem(KEY_PREFIX + key);\n } catch {\n /* ignore */\n }\n}\n","'use client';\n\nimport type { CSSProperties } from 'react';\n\nexport type TreeDensity = 'compact' | 'cozy' | 'comfortable';\nexport type TreeAccentIntensity = 'subtle' | 'default' | 'strong';\nexport type TreeRadius = 'none' | 'sm' | 'md';\n\n/**\n * Cosmetic configuration. Every field is optional; missing values fall\n * back to the `cozy` preset (a comfortable VSCode-Explorer-like density).\n *\n * Customize the look without re-implementing slots.\n */\nexport interface TreeAppearance {\n /** Built-in size preset. Default: `'cozy'`. */\n density?: TreeDensity;\n /** Override row height in px (wins over density). */\n rowHeight?: number;\n /** Override icon + chevron size in px (wins over density). */\n iconSize?: number;\n /** Lucide stroke width for icon + chevron. Default: 1.5. */\n iconStrokeWidth?: number;\n /** Override label font size in px (wins over density). */\n fontSize?: number;\n /** Pixels between chevron / icon / label. Default depends on density. */\n gap?: number;\n /** Pixels between nesting levels. Default: 16. */\n indent?: number;\n /** Hover / selected highlight intensity. Default: `'default'`. */\n accent?: TreeAccentIntensity;\n /** Row corner radius. Default: `'sm'`. */\n radius?: TreeRadius;\n /** Indent-guide line opacity (0..1). Default: 0.4. */\n indentGuideOpacity?: number;\n /**\n * Show a 2px primary-tinted bar on the left of the selected row.\n * Mimics the VSCode active-tab indicator. Default: `true`.\n */\n showActiveIndicator?: boolean;\n}\n\nexport interface ResolvedAppearance {\n density: TreeDensity;\n rowHeight: number;\n iconSize: number;\n iconStrokeWidth: number;\n fontSize: number;\n gap: number;\n indent: number;\n accent: TreeAccentIntensity;\n radius: TreeRadius;\n indentGuideOpacity: number;\n showActiveIndicator: boolean;\n}\n\nconst DENSITY_PRESETS: Record<\n TreeDensity,\n Pick<ResolvedAppearance, 'rowHeight' | 'iconSize' | 'fontSize' | 'gap'>\n> = {\n compact: { rowHeight: 24, iconSize: 14, fontSize: 13, gap: 6 },\n cozy: { rowHeight: 28, iconSize: 16, fontSize: 13, gap: 8 },\n comfortable: { rowHeight: 32, iconSize: 16, fontSize: 14, gap: 8 },\n};\n\nexport const DEFAULT_TREE_APPEARANCE: ResolvedAppearance = {\n density: 'cozy',\n ...DENSITY_PRESETS.cozy,\n iconStrokeWidth: 1.5,\n indent: 16,\n accent: 'default',\n radius: 'sm',\n indentGuideOpacity: 0.4,\n showActiveIndicator: true,\n};\n\n/**\n * Merge a partial appearance with the default + density preset.\n *\n * Explicit numeric overrides (e.g. `rowHeight`) win over the density preset.\n */\nexport function resolveAppearance(\n input?: TreeAppearance,\n /** Outer `indent` prop (kept on TreeRoot for back-compat). */\n outerIndent?: number,\n): ResolvedAppearance {\n if (!input && outerIndent === undefined) return DEFAULT_TREE_APPEARANCE;\n\n const density: TreeDensity = input?.density ?? 'cozy';\n const preset = DENSITY_PRESETS[density];\n\n return {\n density,\n rowHeight: input?.rowHeight ?? preset.rowHeight,\n iconSize: input?.iconSize ?? preset.iconSize,\n iconStrokeWidth: input?.iconStrokeWidth ?? DEFAULT_TREE_APPEARANCE.iconStrokeWidth,\n fontSize: input?.fontSize ?? preset.fontSize,\n gap: input?.gap ?? preset.gap,\n indent: input?.indent ?? outerIndent ?? DEFAULT_TREE_APPEARANCE.indent,\n accent: input?.accent ?? DEFAULT_TREE_APPEARANCE.accent,\n radius: input?.radius ?? DEFAULT_TREE_APPEARANCE.radius,\n indentGuideOpacity:\n input?.indentGuideOpacity ?? DEFAULT_TREE_APPEARANCE.indentGuideOpacity,\n showActiveIndicator:\n input?.showActiveIndicator ?? DEFAULT_TREE_APPEARANCE.showActiveIndicator,\n };\n}\n\n/**\n * Build the `style` object that exposes the resolved appearance to any\n * descendant via CSS variables. Set on `<TreeRoot>`'s outer div.\n */\nexport function appearanceToStyle(a: ResolvedAppearance): CSSProperties {\n return {\n ['--tree-row-height' as string]: `${a.rowHeight}px`,\n ['--tree-icon-size' as string]: `${a.iconSize}px`,\n ['--tree-icon-stroke' as string]: a.iconStrokeWidth,\n ['--tree-font-size' as string]: `${a.fontSize}px`,\n ['--tree-gap' as string]: `${a.gap}px`,\n ['--tree-indent' as string]: `${a.indent}px`,\n ['--tree-guide-opacity' as string]: a.indentGuideOpacity,\n };\n}\n\nconst RADIUS_CLASS: Record<TreeRadius, string> = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n};\nexport function radiusClass(a: ResolvedAppearance) {\n return RADIUS_CLASS[a.radius];\n}\n\n/**\n * VSCode-style row state classes.\n *\n * - hover: subtle neutral wash\n * - focused (keyboard nav, not yet selected): slightly stronger neutral\n * - selected (tree NOT focused): muted neutral block\n * - selected + tree focused-within: primary-tinted block + colored text\n *\n * Intensity scales with `appearance.accent`.\n */\nconst HOVER: Record<TreeAccentIntensity, string> = {\n subtle: 'hover:bg-foreground/[.03]',\n default: 'hover:bg-foreground/[.06]',\n strong: 'hover:bg-foreground/[.09]',\n};\nconst FOCUSED_NOT_SELECTED: Record<TreeAccentIntensity, string> = {\n subtle: 'data-[focused=true]:bg-foreground/[.05]',\n default: 'data-[focused=true]:bg-foreground/[.08]',\n strong: 'data-[focused=true]:bg-foreground/[.12]',\n};\nconst SELECTED_INACTIVE: Record<TreeAccentIntensity, string> = {\n subtle: 'data-[selected=true]:bg-foreground/[.06]',\n default: 'data-[selected=true]:bg-foreground/[.10]',\n strong: 'data-[selected=true]:bg-foreground/[.14]',\n};\nconst SELECTED_ACTIVE: Record<TreeAccentIntensity, string> = {\n subtle:\n 'data-[selected=true]:group-focus-within/tree:bg-primary/10 data-[selected=true]:group-focus-within/tree:text-primary',\n default:\n 'data-[selected=true]:group-focus-within/tree:bg-primary/15 data-[selected=true]:group-focus-within/tree:text-primary',\n strong:\n 'data-[selected=true]:group-focus-within/tree:bg-primary/25 data-[selected=true]:group-focus-within/tree:text-primary',\n};\n\nexport function rowStateClasses(a: ResolvedAppearance) {\n return [\n HOVER[a.accent],\n FOCUSED_NOT_SELECTED[a.accent],\n SELECTED_INACTIVE[a.accent],\n SELECTED_ACTIVE[a.accent],\n ].join(' ');\n}\n","'use client';\n\nimport * as React from 'react';\nimport {\n createContext,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from 'react';\n\nimport {\n DEFAULT_TREE_LABELS,\n type FlatRow,\n type TreeContextMenuSlot,\n type TreeItemId,\n type TreeLabels,\n type TreeLoadChildren,\n type TreeNode,\n type TreeActivateOptions,\n type TreeActivationMode,\n type TreeRootProps,\n type TreeRowSlot,\n type TreeSelectionMode,\n} from '../types';\nimport {\n createChildCache,\n type ChildCache,\n type ChildEntry,\n} from '../data/childCache';\nimport { flattenTree } from '../data/flatten';\nimport { loadTreeState, saveTreeState } from '../data/persist';\nimport {\n resolveAppearance,\n type ResolvedAppearance,\n type TreeAppearance,\n} from '../data/appearance';\n\n// =====================================================================\n// Reducer\n// =====================================================================\n\ninterface State<T> {\n expanded: Set<TreeItemId>;\n selected: Set<TreeItemId>;\n focused: TreeItemId | null;\n query: string;\n /** Bumped on every cache mutation so memos see a fresh dep. */\n cacheTick: number;\n}\n\ntype Action<T> =\n | { type: 'expand'; id: TreeItemId }\n | { type: 'collapse'; id: TreeItemId }\n | { type: 'toggle'; id: TreeItemId }\n | { type: 'set-expanded'; ids: TreeItemId[] }\n | { type: 'select'; id: TreeItemId; mode: TreeSelectionMode }\n | { type: 'select-many'; ids: TreeItemId[] }\n | { type: 'clear-selection' }\n | { type: 'focus'; id: TreeItemId | null }\n | { type: 'set-query'; q: string }\n | { type: 'cache-tick' };\n\nconst reducer = <T,>(state: State<T>, action: Action<T>): State<T> => {\n switch (action.type) {\n case 'expand': {\n if (state.expanded.has(action.id)) return state;\n const next = new Set(state.expanded);\n next.add(action.id);\n return { ...state, expanded: next };\n }\n case 'collapse': {\n if (!state.expanded.has(action.id)) return state;\n const next = new Set(state.expanded);\n next.delete(action.id);\n return { ...state, expanded: next };\n }\n case 'toggle': {\n const next = new Set(state.expanded);\n if (next.has(action.id)) next.delete(action.id);\n else next.add(action.id);\n return { ...state, expanded: next };\n }\n case 'set-expanded':\n return { ...state, expanded: new Set(action.ids) };\n case 'select': {\n if (action.mode === 'none') return state;\n if (action.mode === 'single') {\n return { ...state, selected: new Set([action.id]), focused: action.id };\n }\n const next = new Set(state.selected);\n if (next.has(action.id)) next.delete(action.id);\n else next.add(action.id);\n return { ...state, selected: next, focused: action.id };\n }\n case 'select-many':\n return { ...state, selected: new Set(action.ids) };\n case 'clear-selection':\n return { ...state, selected: new Set() };\n case 'focus':\n return { ...state, focused: action.id };\n case 'set-query':\n return { ...state, query: action.q };\n case 'cache-tick':\n return { ...state, cacheTick: state.cacheTick + 1 };\n default:\n return state;\n }\n};\n\n// =====================================================================\n// Context value\n// =====================================================================\n\nexport interface TreeContextValue<T> {\n // State\n expanded: ReadonlySet<TreeItemId>;\n selected: ReadonlySet<TreeItemId>;\n focused: TreeItemId | null;\n query: string;\n\n // Flattened render rows (visible items only)\n flatRows: FlatRow<T>[];\n /** Search-matching node ids (subset of all flatRows). */\n matchingIds: ReadonlySet<TreeItemId>;\n\n // Imperative actions\n expand: (id: TreeItemId) => void;\n collapse: (id: TreeItemId) => void;\n toggle: (id: TreeItemId) => void;\n expandAll: () => void;\n collapseAll: () => void;\n select: (id: TreeItemId) => void;\n setSelectedIds: (ids: TreeItemId[]) => void;\n clearSelection: () => void;\n setFocus: (id: TreeItemId | null) => void;\n setQuery: (q: string) => void;\n refresh: (id: TreeItemId) => Promise<void>;\n refreshAll: () => Promise<void>;\n activate: (node: TreeNode<T>, opts?: TreeActivateOptions) => void;\n\n // Config / slots\n labels: TreeLabels;\n /** Resolved cosmetic config — never null. */\n appearance: ResolvedAppearance;\n /** Convenience alias for `appearance.indent`. */\n indent: number;\n selectionMode: TreeSelectionMode;\n activationMode: TreeActivationMode;\n enableSearch: boolean;\n showIndentGuides: boolean;\n getItemName: (node: TreeNode<T>) => string;\n\n renderIcon?: TreeRowSlot<T>;\n renderLabel?: TreeRowSlot<T>;\n renderActions?: TreeRowSlot<T>;\n renderContextMenu?: TreeContextMenuSlot<T>;\n}\n\nconst TreeContext = createContext<TreeContextValue<unknown> | null>(null);\n\nexport function useTreeContext<T>(): TreeContextValue<T> {\n const ctx = React.useContext(TreeContext);\n if (!ctx) {\n throw new Error('useTreeContext must be used inside <TreeProvider>');\n }\n return ctx as TreeContextValue<T>;\n}\n\n// =====================================================================\n// Provider\n// =====================================================================\n\nexport interface TreeProviderProps<T>\n extends Pick<\n TreeRootProps<T>,\n | 'data'\n | 'getItemName'\n | 'loadChildren'\n | 'selectionMode'\n | 'activationMode'\n | 'initialExpandedIds'\n | 'initialSelectedIds'\n | 'indent'\n | 'appearance'\n | 'onSelectionChange'\n | 'onExpansionChange'\n | 'onActivate'\n | 'filterNode'\n | 'enableSearch'\n | 'showIndentGuides'\n | 'renderIcon'\n | 'renderLabel'\n | 'renderActions'\n | 'renderContextMenu'\n | 'labels'\n | 'persistKey'\n | 'persistSelection'\n > {\n children: React.ReactNode;\n}\n\nconst setEqualsArr = (set: ReadonlySet<string>, arr: readonly string[]) => {\n if (set.size !== arr.length) return false;\n for (const id of arr) if (!set.has(id)) return false;\n return true;\n};\n\nconst collectAllIds = <T,>(\n roots: TreeNode<T>[],\n cache: ChildCache<T>,\n out: TreeItemId[],\n) => {\n for (const node of roots) {\n if (Array.isArray(node.children)) {\n out.push(node.id);\n collectAllIds(node.children, cache, out);\n } else if (node.isFolder) {\n out.push(node.id);\n const entry = cache.get(node.id);\n if (entry?.children) collectAllIds(entry.children, cache, out);\n }\n }\n};\n\nexport function TreeProvider<T>(props: TreeProviderProps<T>) {\n const {\n data,\n getItemName,\n loadChildren,\n selectionMode = 'single',\n activationMode = 'single-click',\n initialExpandedIds,\n initialSelectedIds,\n indent,\n appearance,\n onSelectionChange,\n onExpansionChange,\n onActivate,\n filterNode,\n enableSearch = false,\n showIndentGuides = false,\n renderIcon,\n renderLabel,\n renderActions,\n renderContextMenu,\n labels: labelsOverride,\n persistKey,\n persistSelection = false,\n children,\n } = props;\n\n const labels = useMemo(\n () => ({ ...DEFAULT_TREE_LABELS, ...labelsOverride }),\n [labelsOverride],\n );\n\n const resolvedAppearance = useMemo(\n () => resolveAppearance(appearance, indent),\n [appearance, indent],\n );\n\n // Persisted state, loaded once.\n const persisted = useMemo(\n () => (persistKey ? loadTreeState(persistKey) : null),\n [persistKey],\n );\n\n const [state, dispatch] = useReducer(reducer<T>, undefined, () => ({\n expanded: new Set(persisted?.expandedItems ?? initialExpandedIds ?? []),\n selected: new Set(\n (persistSelection ? persisted?.selectedItems : undefined) ??\n initialSelectedIds ??\n [],\n ),\n focused: null,\n query: '',\n cacheTick: 0,\n }));\n\n // Async cache survives provider re-renders, lives in a ref.\n const cacheRef = useRef<ChildCache<T>>(createChildCache<T>());\n const inflightRef = useRef<Map<TreeItemId, Promise<void>>>(new Map());\n\n // Trigger one fetch per (folder id) — concurrent expansions are deduped.\n const fetchChildren = useCallback(\n async (node: TreeNode<T>) => {\n if (!loadChildren) return;\n if (Array.isArray(node.children)) return;\n const existing = cacheRef.current.get(node.id);\n if (existing?.status === 'loaded' || existing?.status === 'loading') return;\n const inflight = inflightRef.current.get(node.id);\n if (inflight) return inflight;\n\n cacheRef.current.set(node.id, { status: 'loading', children: [] });\n dispatch({ type: 'cache-tick' });\n\n const promise = (async () => {\n try {\n const children = await loadChildren(node);\n cacheRef.current.set(node.id, { status: 'loaded', children });\n } catch (err) {\n cacheRef.current.set(node.id, {\n status: 'error',\n children: [],\n error: err instanceof Error ? err.message : String(err),\n });\n } finally {\n inflightRef.current.delete(node.id);\n dispatch({ type: 'cache-tick' });\n }\n })();\n\n inflightRef.current.set(node.id, promise);\n return promise;\n },\n [loadChildren],\n );\n\n // Build a quick id → node map for any visible node (incl. cached children).\n const nodeById = useMemo(() => {\n const map = new Map<TreeItemId, TreeNode<T>>();\n const walk = (nodes: TreeNode<T>[]) => {\n for (const n of nodes) {\n map.set(n.id, n);\n if (Array.isArray(n.children)) walk(n.children);\n else {\n const entry = cacheRef.current.get(n.id);\n if (entry?.children) walk(entry.children);\n }\n }\n };\n walk(data);\n return map;\n }, [data, state.cacheTick]);\n\n // On expand, kick async fetch (no-op if already cached or has inline children).\n useEffect(() => {\n if (!loadChildren) return;\n for (const id of state.expanded) {\n const node = nodeById.get(id);\n if (!node) continue;\n void fetchChildren(node);\n }\n }, [loadChildren, state.expanded, state.cacheTick, nodeById, fetchChildren]);\n\n // Flatten on relevant changes.\n const flatRows = useMemo(\n () =>\n flattenTree<T>({\n roots: data,\n expandedIds: state.expanded,\n cache: cacheRef.current,\n filterNode,\n }),\n [data, state.expanded, state.cacheTick, filterNode],\n );\n\n // Search matches (case-insensitive substring on getItemName).\n const matchingIds = useMemo(() => {\n const set = new Set<TreeItemId>();\n if (!enableSearch || state.query.trim() === '') return set;\n const q = state.query.trim().toLowerCase();\n for (const row of flatRows) {\n if (getItemName(row.node).toLowerCase().includes(q)) {\n set.add(row.node.id);\n }\n }\n return set;\n }, [enableSearch, state.query, flatRows, getItemName]);\n\n // External callbacks via stable refs.\n const onSelectionChangeRef = useRef(onSelectionChange);\n const onExpansionChangeRef = useRef(onExpansionChange);\n const onActivateRef = useRef(onActivate);\n onSelectionChangeRef.current = onSelectionChange;\n onExpansionChangeRef.current = onExpansionChange;\n onActivateRef.current = onActivate;\n\n // Notify on changes + persist.\n const lastSelectedArrRef = useRef<TreeItemId[]>([...state.selected]);\n const lastExpandedArrRef = useRef<TreeItemId[]>([...state.expanded]);\n\n useEffect(() => {\n const arr = [...state.expanded];\n if (!setEqualsArr(state.expanded, lastExpandedArrRef.current)) {\n lastExpandedArrRef.current = arr;\n onExpansionChangeRef.current?.(arr);\n if (persistKey) {\n saveTreeState(persistKey, {\n expandedItems: arr,\n selectedItems: persistSelection ? [...state.selected] : [],\n });\n }\n }\n }, [state.expanded, persistKey, persistSelection, state.selected]);\n\n useEffect(() => {\n const arr = [...state.selected];\n if (!setEqualsArr(state.selected, lastSelectedArrRef.current)) {\n lastSelectedArrRef.current = arr;\n onSelectionChangeRef.current?.(arr);\n if (persistKey && persistSelection) {\n saveTreeState(persistKey, {\n expandedItems: [...state.expanded],\n selectedItems: arr,\n });\n }\n }\n }, [state.selected, persistKey, persistSelection, state.expanded]);\n\n // Imperative actions.\n const expand = useCallback((id: TreeItemId) => dispatch({ type: 'expand', id }), []);\n const collapse = useCallback((id: TreeItemId) => dispatch({ type: 'collapse', id }), []);\n const toggle = useCallback((id: TreeItemId) => dispatch({ type: 'toggle', id }), []);\n\n const expandAll = useCallback(() => {\n const ids: TreeItemId[] = [];\n collectAllIds(data, cacheRef.current, ids);\n dispatch({ type: 'set-expanded', ids });\n }, [data]);\n\n const collapseAll = useCallback(\n () => dispatch({ type: 'set-expanded', ids: [] }),\n [],\n );\n\n const select = useCallback(\n (id: TreeItemId) => dispatch({ type: 'select', id, mode: selectionMode }),\n [selectionMode],\n );\n const setSelectedIds = useCallback(\n (ids: TreeItemId[]) => dispatch({ type: 'select-many', ids }),\n [],\n );\n const clearSelection = useCallback(() => dispatch({ type: 'clear-selection' }), []);\n const setFocus = useCallback(\n (id: TreeItemId | null) => dispatch({ type: 'focus', id }),\n [],\n );\n const setQuery = useCallback((q: string) => dispatch({ type: 'set-query', q }), []);\n\n const refresh = useCallback(\n async (id: TreeItemId) => {\n const node = nodeById.get(id);\n if (!node || !loadChildren) return;\n cacheRef.current.delete(id);\n dispatch({ type: 'cache-tick' });\n await fetchChildren(node);\n },\n [nodeById, loadChildren, fetchChildren],\n );\n\n const refreshAll = useCallback(async () => {\n cacheRef.current.clear();\n dispatch({ type: 'cache-tick' });\n if (!loadChildren) return;\n await Promise.all(\n [...state.expanded].map((id) => {\n const node = nodeById.get(id);\n return node ? fetchChildren(node) : undefined;\n }),\n );\n }, [loadChildren, state.expanded, nodeById, fetchChildren]);\n\n const activate = useCallback(\n (node: TreeNode<T>, opts: TreeActivateOptions = { preview: false }) =>\n onActivateRef.current?.(node, opts),\n [],\n );\n\n const value = useMemo<TreeContextValue<T>>(\n () => ({\n expanded: state.expanded,\n selected: state.selected,\n focused: state.focused,\n query: state.query,\n flatRows,\n matchingIds,\n expand,\n collapse,\n toggle,\n expandAll,\n collapseAll,\n select,\n setSelectedIds,\n clearSelection,\n setFocus,\n setQuery,\n refresh,\n refreshAll,\n activate,\n labels,\n appearance: resolvedAppearance,\n indent: resolvedAppearance.indent,\n selectionMode,\n activationMode,\n enableSearch,\n showIndentGuides,\n getItemName,\n renderIcon,\n renderLabel,\n renderActions,\n renderContextMenu,\n }),\n [\n state.expanded,\n state.selected,\n state.focused,\n state.query,\n flatRows,\n matchingIds,\n expand,\n collapse,\n toggle,\n expandAll,\n collapseAll,\n select,\n setSelectedIds,\n clearSelection,\n setFocus,\n setQuery,\n refresh,\n refreshAll,\n activate,\n labels,\n resolvedAppearance,\n selectionMode,\n activationMode,\n enableSearch,\n showIndentGuides,\n getItemName,\n renderIcon,\n renderLabel,\n renderActions,\n renderContextMenu,\n ],\n );\n\n return (\n <TreeContext.Provider value={value as TreeContextValue<unknown>}>\n {children}\n </TreeContext.Provider>\n );\n}\n\n// Re-export internal types referenced by hook consumers.\nexport type { ChildCache, ChildEntry };\n","'use client';\n\nimport { ChevronDown, ChevronRight } from 'lucide-react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useTreeContext } from '../context/TreeContext';\n\nexport interface TreeChevronProps {\n isExpanded: boolean;\n isFolder: boolean;\n className?: string;\n}\n\nexport function TreeChevron({ isExpanded, isFolder, className }: TreeChevronProps) {\n const { appearance } = useTreeContext();\n const size = { width: 'var(--tree-icon-size)', height: 'var(--tree-icon-size)' };\n\n if (!isFolder) {\n return (\n <span\n aria-hidden\n style={size}\n className={cn('inline-block shrink-0', className)}\n />\n );\n }\n const Icon = isExpanded ? ChevronDown : ChevronRight;\n return (\n <Icon\n aria-hidden\n strokeWidth={appearance.iconStrokeWidth}\n style={size}\n className={cn(\n 'shrink-0 text-muted-foreground/70 transition-transform',\n className,\n )}\n />\n );\n}\n","'use client';\n\nimport { File, Folder, FolderOpen } from 'lucide-react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useTreeContext } from '../context/TreeContext';\n\nexport interface TreeIconProps {\n isFolder: boolean;\n isExpanded: boolean;\n className?: string;\n}\n\nexport function TreeIcon({ isFolder, isExpanded, className }: TreeIconProps) {\n const { appearance } = useTreeContext();\n const Icon = isFolder ? (isExpanded ? FolderOpen : Folder) : File;\n return (\n <Icon\n aria-hidden\n strokeWidth={appearance.iconStrokeWidth}\n style={{ width: 'var(--tree-icon-size)', height: 'var(--tree-icon-size)' }}\n className={cn(\n 'shrink-0',\n isFolder ? 'text-foreground/70' : 'text-muted-foreground/80',\n className,\n )}\n />\n );\n}\n","'use client';\n\nimport { useTreeContext } from '../context/TreeContext';\n\nexport interface TreeIndentGuidesProps {\n level: number;\n indent: number;\n}\n\n/**\n * Vertical guide lines under nested rows. Renders one absolute-positioned\n * 1px column per ancestor level. Decorative — `aria-hidden` and\n * pointer-events disabled. Opacity comes from the tree appearance.\n */\nexport function TreeIndentGuides({ level, indent }: TreeIndentGuidesProps) {\n const { appearance } = useTreeContext();\n if (level <= 0) return null;\n return (\n <span\n aria-hidden\n className=\"pointer-events-none absolute inset-y-0 left-0\"\n style={{ width: 8 + level * indent, opacity: appearance.indentGuideOpacity }}\n >\n {Array.from({ length: level }).map((_, i) => (\n <span\n key={i}\n className=\"absolute inset-y-0 w-px bg-border\"\n style={{ left: 8 + i * indent + indent / 2 - 0.5 }}\n />\n ))}\n </span>\n );\n}\n","'use client';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nexport interface TreeLabelProps {\n children: React.ReactNode;\n isMatchingSearch?: boolean;\n className?: string;\n}\n\nexport function TreeLabel({ children, isMatchingSearch, className }: TreeLabelProps) {\n return (\n <span\n style={{ fontSize: 'var(--tree-font-size)' }}\n className={cn(\n 'truncate leading-tight tracking-[-0.005em]',\n isMatchingSearch && 'font-medium text-foreground',\n className,\n )}\n >\n {children}\n </span>\n );\n}\n","'use client';\n\nimport { Loader2 } from 'lucide-react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useTreeContext } from '../context/TreeContext';\nimport { radiusClass, rowStateClasses } from '../data/appearance';\nimport type { FlatRow, TreeRowRenderProps } from '../types';\nimport { TreeChevron } from './TreeChevron';\nimport { TreeIcon } from './TreeIcon';\nimport { TreeIndentGuides } from './TreeIndentGuides';\nimport { TreeLabel } from './TreeLabel';\n\nexport interface TreeRowProps<T> {\n row: FlatRow<T>;\n className?: string;\n}\n\nexport function TreeRow<T>({ row, className }: TreeRowProps<T>) {\n const ctx = useTreeContext<T>();\n const {\n appearance,\n activationMode,\n showIndentGuides,\n selected,\n focused,\n matchingIds,\n select,\n toggle,\n setFocus,\n activate,\n getItemName,\n renderIcon,\n renderLabel,\n renderActions,\n renderContextMenu,\n } = ctx;\n\n const { node, level, isFolder, isExpanded, isLoading } = row;\n const isSelected = selected.has(node.id);\n const isFocused = focused === node.id;\n const isMatchingSearch = matchingIds.has(node.id);\n\n const slot: TreeRowRenderProps<T> = {\n node,\n level,\n isSelected,\n isExpanded,\n isFocused,\n isFolder,\n isLoading,\n isMatchingSearch,\n };\n\n // Folders always toggle on single click regardless of `activationMode`.\n // Leaves dispatch by mode:\n // single-click → click activates {preview:false}\n // double-click → click only selects; dblclick activates {preview:false}\n // single-click-preview → click activates {preview:true}; dblclick activates {preview:false}\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (node.disabled) return;\n setFocus(node.id);\n select(node.id);\n if (isFolder) {\n toggle(node.id);\n } else if (activationMode === 'single-click') {\n activate(node, { preview: false });\n } else if (activationMode === 'single-click-preview') {\n activate(node, { preview: true });\n }\n e.currentTarget.scrollIntoView?.({ block: 'nearest' });\n };\n\n const handleDoubleClick = () => {\n if (node.disabled) return;\n if (isFolder) return;\n activate(node, { preview: false });\n };\n\n const trigger = (\n <div\n role=\"treeitem\"\n aria-level={level + 1}\n aria-expanded={isFolder ? isExpanded : undefined}\n aria-selected={isSelected || undefined}\n aria-current={isSelected ? 'true' : undefined}\n aria-disabled={node.disabled || undefined}\n data-tree-row=\"\"\n data-id={node.id}\n data-activation-mode={activationMode}\n data-selected={isSelected ? 'true' : undefined}\n data-focused={isFocused && !isSelected ? 'true' : undefined}\n data-folder={isFolder || undefined}\n data-expanded={isExpanded || undefined}\n tabIndex={isFocused ? 0 : -1}\n style={{\n paddingLeft: 6 + level * appearance.indent,\n height: 'var(--tree-row-height)',\n gap: 'var(--tree-gap)',\n }}\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\n onFocus={() => setFocus(node.id)}\n className={cn(\n 'group/row relative flex w-full select-none items-center pr-2 text-left',\n 'transition-colors outline-none',\n node.disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n radiusClass(appearance),\n rowStateClasses(appearance),\n 'focus-visible:ring-1 focus-visible:ring-ring/50',\n isMatchingSearch && 'ring-1 ring-primary/30',\n node.disabled && 'opacity-50',\n className,\n )}\n >\n {/* Active-row left indicator (VSCode style) */}\n {appearance.showActiveIndicator && isSelected ? (\n <span\n aria-hidden\n className={cn(\n 'absolute left-0 top-1 bottom-1 w-0.5 rounded-r-full',\n 'bg-foreground/30 group-focus-within/tree:bg-primary',\n )}\n />\n ) : null}\n\n {showIndentGuides && level > 0 ? (\n <TreeIndentGuides level={level} indent={appearance.indent} />\n ) : null}\n\n <TreeChevron isExpanded={isExpanded} isFolder={isFolder} />\n\n {isLoading ? (\n <Loader2\n aria-hidden\n strokeWidth={appearance.iconStrokeWidth}\n style={{ width: 'var(--tree-icon-size)', height: 'var(--tree-icon-size)' }}\n className=\"shrink-0 animate-spin text-muted-foreground/70\"\n />\n ) : renderIcon ? (\n renderIcon(slot)\n ) : (\n <TreeIcon isFolder={isFolder} isExpanded={isExpanded} />\n )}\n\n <span\n className=\"flex min-w-0 flex-1 items-center\"\n style={{ gap: 'var(--tree-gap)' }}\n >\n {renderLabel ? (\n renderLabel(slot)\n ) : (\n <TreeLabel isMatchingSearch={isMatchingSearch}>{getItemName(node)}</TreeLabel>\n )}\n </span>\n\n {renderActions ? (\n <span\n className=\"ml-auto flex shrink-0 items-center gap-1 opacity-0 transition-opacity group-hover/row:opacity-100 group-focus-within/row:opacity-100\"\n onClick={(e) => e.stopPropagation()}\n >\n {renderActions(slot)}\n </span>\n ) : null}\n </div>\n );\n\n if (renderContextMenu) {\n return <>{renderContextMenu(slot, trigger)}</>;\n }\n return trigger;\n}\n","'use client';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nexport interface TreeEmptyProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function TreeEmpty({ children, className }: TreeEmptyProps) {\n return (\n <div\n className={cn(\n 'flex h-full min-h-32 items-center justify-center px-4 py-6 text-sm text-muted-foreground',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","'use client';\n\nimport { Fragment, type ReactNode } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useTreeContext } from '../context/TreeContext';\nimport { appearanceToStyle } from '../data/appearance';\nimport type { FlatRow, TreeRowRenderProps, TreeRowSlot } from '../types';\nimport { TreeRow } from './TreeRow';\nimport { TreeEmpty } from './TreeEmpty';\n\nexport interface TreeContentProps<T> {\n /** Custom row renderer; falls back to <TreeRow />. */\n children?: TreeRowSlot<T>;\n className?: string;\n /** Override aria-label for the container. */\n ariaLabel?: string;\n}\n\nexport function TreeContent<T>({ children, className, ariaLabel }: TreeContentProps<T>) {\n const { flatRows, labels, selected, focused, matchingIds, appearance } = useTreeContext<T>();\n\n if (flatRows.length === 0) {\n return <TreeEmpty>{labels.empty}</TreeEmpty>;\n }\n\n return (\n <div\n role=\"tree\"\n aria-label={ariaLabel ?? labels.ariaLabel}\n className={cn('relative flex flex-col py-1', className)}\n style={appearanceToStyle(appearance)}\n >\n {flatRows.map((row: FlatRow<T>) => {\n const slot: TreeRowRenderProps<T> = {\n node: row.node,\n level: row.level,\n isSelected: selected.has(row.node.id),\n isExpanded: row.isExpanded,\n isFocused: focused === row.node.id,\n isFolder: row.isFolder,\n isLoading: row.isLoading,\n isMatchingSearch: matchingIds.has(row.node.id),\n };\n const node: ReactNode = children ? children(slot) : <TreeRow row={row} />;\n return <Fragment key={row.node.id}>{node}</Fragment>;\n })}\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useMemo } from 'react';\n\nimport type { TreeItemId } from '../types';\nimport { useTreeContext } from './TreeContext';\n\nexport function useTreeLabels() {\n return useTreeContext().labels;\n}\n\nexport function useTreeRows<T>() {\n return useTreeContext<T>().flatRows;\n}\n\nexport function useTreeSelection<T>() {\n const ctx = useTreeContext<T>();\n const selectedIds = useMemo(() => [...ctx.selected], [ctx.selected]);\n const isSelected = useCallback(\n (id: TreeItemId) => ctx.selected.has(id),\n [ctx.selected],\n );\n return useMemo(\n () => ({\n selectedIds,\n select: ctx.select,\n setSelectedIds: ctx.setSelectedIds,\n clear: ctx.clearSelection,\n isSelected,\n }),\n [selectedIds, ctx.select, ctx.setSelectedIds, ctx.clearSelection, isSelected],\n );\n}\n\nexport function useTreeExpansion<T>() {\n const ctx = useTreeContext<T>();\n const expandedIds = useMemo(() => [...ctx.expanded], [ctx.expanded]);\n const isExpanded = useCallback(\n (id: TreeItemId) => ctx.expanded.has(id),\n [ctx.expanded],\n );\n return useMemo(\n () => ({\n expandedIds,\n expand: ctx.expand,\n collapse: ctx.collapse,\n toggle: ctx.toggle,\n expandAll: ctx.expandAll,\n collapseAll: ctx.collapseAll,\n isExpanded,\n }),\n [\n expandedIds,\n ctx.expand,\n ctx.collapse,\n ctx.toggle,\n ctx.expandAll,\n ctx.collapseAll,\n isExpanded,\n ],\n );\n}\n\nexport function useTreeFocus<T>() {\n const ctx = useTreeContext<T>();\n return useMemo(\n () => ({ focusedId: ctx.focused, setFocus: ctx.setFocus }),\n [ctx.focused, ctx.setFocus],\n );\n}\n\nexport function useTreeSearch<T>() {\n const ctx = useTreeContext<T>();\n return useMemo(\n () => ({\n isOpen: ctx.enableSearch,\n query: ctx.query,\n setQuery: ctx.setQuery,\n matchingIds: ctx.matchingIds,\n matchCount: ctx.matchingIds.size,\n }),\n [ctx.enableSearch, ctx.query, ctx.setQuery, ctx.matchingIds],\n );\n}\n\nexport function useTreeActions<T>() {\n const ctx = useTreeContext<T>();\n return useMemo(\n () => ({\n expand: ctx.expand,\n collapse: ctx.collapse,\n toggle: ctx.toggle,\n expandAll: ctx.expandAll,\n collapseAll: ctx.collapseAll,\n refresh: ctx.refresh,\n refreshAll: ctx.refreshAll,\n activate: ctx.activate,\n }),\n [\n ctx.expand,\n ctx.collapse,\n ctx.toggle,\n ctx.expandAll,\n ctx.collapseAll,\n ctx.refresh,\n ctx.refreshAll,\n ctx.activate,\n ],\n );\n}\n","'use client';\n\nimport { Search, X } from 'lucide-react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useTreeContext } from '../context/TreeContext';\nimport { useTreeSearch } from '../context/hooks';\n\nexport interface TreeSearchInputProps {\n className?: string;\n showMatches?: boolean;\n}\n\nexport function TreeSearchInput({ className, showMatches = true }: TreeSearchInputProps) {\n const { labels } = useTreeContext();\n const { query, setQuery, matchCount } = useTreeSearch();\n\n return (\n <div\n className={cn(\n 'flex items-center gap-2 rounded-md border border-border bg-background px-2',\n className,\n )}\n >\n <Search aria-hidden className=\"size-3.5 shrink-0 text-muted-foreground\" />\n <input\n type=\"search\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={labels.searchPlaceholder}\n className=\"h-7 w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n />\n {showMatches && query.trim().length > 0 ? (\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {labels.searchMatches(matchCount)}\n </span>\n ) : null}\n {query.length > 0 ? (\n <button\n type=\"button\"\n onClick={() => setQuery('')}\n aria-label=\"Clear search\"\n className=\"shrink-0 rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n <X aria-hidden className=\"size-3.5\" />\n </button>\n ) : null}\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useRef } from 'react';\nimport { useHotkey } from '@djangocfg/ui-core/hooks';\n\nimport type { FlatRow, TreeItemId } from '../types';\n\nexport interface UseTreeKeyboardOptions<T> {\n rows: FlatRow<T>[];\n focusedId: TreeItemId | null;\n enabled?: boolean;\n onFocus: (id: TreeItemId) => void;\n onSelect: (id: TreeItemId) => void;\n onActivate: (id: TreeItemId) => void;\n onExpand: (id: TreeItemId) => void;\n onCollapse: (id: TreeItemId) => void;\n onClearSelection: () => void;\n}\n\nexport interface UseTreeKeyboardReturn {\n /** Attach to the tree container. Hotkeys only fire when focus is inside. */\n ref: (instance: HTMLElement | null) => void;\n}\n\n/**\n * Standard tree keyboard navigation, scoped to the container ref.\n *\n * - ↑ / ↓ : prev / next visible row\n * - Home / End : first / last visible row\n * - → : expand folder; if already expanded, jump to first child\n * - ← : collapse folder; if already collapsed (or leaf), jump to parent\n * - Enter / Space : activate (folder => toggle, leaf => onActivate)\n * - Esc : clear selection\n *\n * Built on `useHotkey` (react-hotkeys-hook) — focus gating is automatic; no\n * manual `addEventListener` or `data-scope` juggling.\n */\nexport function useTreeKeyboard<T>({\n rows,\n focusedId,\n enabled = true,\n onFocus,\n onSelect,\n onActivate,\n onExpand,\n onCollapse,\n onClearSelection,\n}: UseTreeKeyboardOptions<T>): UseTreeKeyboardReturn {\n // Keep latest values in refs so the callbacks below stay stable across\n // renders — react-hotkeys-hook re-binds on dep change otherwise.\n const rowsRef = useRef(rows);\n const focusedIdRef = useRef(focusedId);\n rowsRef.current = rows;\n focusedIdRef.current = focusedId;\n\n const getCurrent = () => {\n const r = rowsRef.current;\n const id = focusedIdRef.current;\n const idx = id ? r.findIndex((x) => x.node.id === id) : -1;\n return { rows: r, idx, current: idx >= 0 ? r[idx] : null };\n };\n\n const refDown = useHotkey(\n 'down',\n () => {\n const { rows: r, idx } = getCurrent();\n if (r.length === 0) return;\n const next = r[Math.min(idx + 1, r.length - 1)] ?? r[0];\n onFocus(next.node.id);\n },\n { enabled, preventDefault: true, description: 'Next row' },\n );\n\n const refUp = useHotkey(\n 'up',\n () => {\n const { rows: r, idx } = getCurrent();\n if (r.length === 0) return;\n const prev = r[Math.max(idx - 1, 0)] ?? r[0];\n onFocus(prev.node.id);\n },\n { enabled, preventDefault: true, description: 'Previous row' },\n );\n\n const refHome = useHotkey(\n 'home',\n () => {\n const { rows: r } = getCurrent();\n if (r.length === 0) return;\n onFocus(r[0].node.id);\n },\n { enabled, preventDefault: true, description: 'First row' },\n );\n\n const refEnd = useHotkey(\n 'end',\n () => {\n const { rows: r } = getCurrent();\n if (r.length === 0) return;\n onFocus(r[r.length - 1].node.id);\n },\n { enabled, preventDefault: true, description: 'Last row' },\n );\n\n const refRight = useHotkey(\n 'right',\n () => {\n const { rows: r, idx, current } = getCurrent();\n if (!current) return;\n if (current.isFolder && !current.isExpanded) {\n onExpand(current.node.id);\n } else if (current.isFolder && current.isExpanded) {\n const next = r[idx + 1];\n if (next) onFocus(next.node.id);\n }\n },\n { enabled, preventDefault: true, description: 'Expand / first child' },\n );\n\n const refLeft = useHotkey(\n 'left',\n () => {\n const { current } = getCurrent();\n if (!current) return;\n if (current.isFolder && current.isExpanded) {\n onCollapse(current.node.id);\n } else if (current.parentId) {\n onFocus(current.parentId);\n }\n },\n { enabled, preventDefault: true, description: 'Collapse / parent' },\n );\n\n const refActivate = useHotkey(\n ['enter', 'space'],\n () => {\n const { current } = getCurrent();\n if (!current) return;\n onSelect(current.node.id);\n if (current.isFolder) {\n if (current.isExpanded) onCollapse(current.node.id);\n else onExpand(current.node.id);\n } else {\n onActivate(current.node.id);\n }\n },\n { enabled, preventDefault: true, description: 'Activate / toggle' },\n );\n\n const refEscape = useHotkey(\n 'escape',\n () => onClearSelection(),\n { enabled, preventDefault: true, description: 'Clear selection' },\n );\n\n const ref = useCallback(\n (instance: HTMLElement | null) => {\n refDown(instance);\n refUp(instance);\n refHome(instance);\n refEnd(instance);\n refRight(instance);\n refLeft(instance);\n refActivate(instance);\n refEscape(instance);\n },\n [refDown, refUp, refHome, refEnd, refRight, refLeft, refActivate, refEscape],\n );\n\n return { ref };\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\n\nimport type { FlatRow, TreeNode } from '../types';\n\nconst FLUSH_MS = 600;\n\nexport interface UseTreeTypeAheadOptions<T> {\n /** Visible flat rows in render order. */\n rows: FlatRow<T>[];\n /** How to read the displayed name of a node (matched case-insensitively). */\n getItemName: (node: TreeNode<T>) => string;\n /** Element receiving keydown events. */\n containerRef: React.RefObject<HTMLElement | null>;\n /** Called with the matched node id so the consumer can focus / scroll. */\n onMatch: (id: string) => void;\n /** Disable without removing the call site. */\n enabled?: boolean;\n}\n\n/**\n * Type-ahead jump (Finder / VSCode style).\n *\n * Builds a rolling buffer of printable keys (within ~600 ms of each other)\n * and notifies the consumer of the first row whose name starts with that\n * prefix. Resets on Esc / Enter / navigation keys / timeout.\n */\nexport function useTreeTypeAhead<T>({\n rows,\n getItemName,\n containerRef,\n onMatch,\n enabled = true,\n}: UseTreeTypeAheadOptions<T>) {\n const bufferRef = useRef('');\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const rowsRef = useRef(rows);\n const getNameRef = useRef(getItemName);\n const onMatchRef = useRef(onMatch);\n rowsRef.current = rows;\n getNameRef.current = getItemName;\n onMatchRef.current = onMatch;\n\n useEffect(() => {\n if (!enabled) return;\n const target = containerRef.current;\n if (!target) return;\n\n const reset = () => {\n bufferRef.current = '';\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n };\n\n const handler = (e: KeyboardEvent) => {\n const tag = (e.target as HTMLElement | null)?.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA') return;\n if ((e.target as HTMLElement | null)?.isContentEditable) return;\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n\n if (\n e.key === 'Escape' ||\n e.key === 'Enter' ||\n e.key === 'Tab' ||\n e.key.startsWith('Arrow') ||\n e.key === 'Home' ||\n e.key === 'End' ||\n e.key === 'PageUp' ||\n e.key === 'PageDown'\n ) {\n reset();\n return;\n }\n\n if (e.key.length !== 1) return;\n\n bufferRef.current += e.key.toLowerCase();\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(reset, FLUSH_MS);\n\n const prefix = bufferRef.current;\n const hit = rowsRef.current.find((row) =>\n getNameRef.current(row.node).toLowerCase().startsWith(prefix),\n );\n if (hit) {\n e.preventDefault();\n onMatchRef.current(hit.node.id);\n }\n };\n\n target.addEventListener('keydown', handler);\n return () => {\n target.removeEventListener('keydown', handler);\n reset();\n };\n }, [containerRef, enabled]);\n}\n","'use client';\n\nimport { useCallback, useRef } from 'react';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { TreeProvider, useTreeContext } from './context/TreeContext';\nimport { TreeContent } from './components/TreeContent';\nimport { TreeSearchInput } from './components/TreeSearchInput';\nimport { appearanceToStyle } from './data/appearance';\nimport { useTreeKeyboard } from './hooks/useTreeKeyboard';\nimport { useTreeTypeAhead } from './hooks/useTreeTypeAhead';\nimport type { TreeRootProps } from './types';\n\n/**\n * High-level entry point. Wraps Provider + (optional) search bar + content.\n *\n * For full control, compose with <TreeProvider>, <TreeContent>,\n * <TreeSearchInput>, <TreeRow>, etc. directly from `@djangocfg/ui-tools/tree`.\n */\nfunction TreeRoot<T>(props: TreeRootProps<T>) {\n const {\n data,\n getItemName,\n loadChildren,\n selectionMode,\n activationMode,\n initialExpandedIds,\n initialSelectedIds,\n indent,\n appearance,\n onSelectionChange,\n onExpansionChange,\n onActivate,\n filterNode,\n enableSearch = false,\n enableTypeAhead = true,\n showIndentGuides = false,\n renderRow,\n renderIcon,\n renderLabel,\n renderActions,\n renderContextMenu,\n labels,\n persistKey,\n persistSelection = false,\n className,\n style,\n } = props;\n\n return (\n <TreeProvider<T>\n data={data}\n getItemName={getItemName}\n loadChildren={loadChildren}\n selectionMode={selectionMode}\n activationMode={activationMode}\n initialExpandedIds={initialExpandedIds}\n initialSelectedIds={initialSelectedIds}\n indent={indent}\n appearance={appearance}\n onSelectionChange={onSelectionChange}\n onExpansionChange={onExpansionChange}\n onActivate={onActivate}\n filterNode={filterNode}\n enableSearch={enableSearch}\n showIndentGuides={showIndentGuides}\n renderIcon={renderIcon}\n renderLabel={renderLabel}\n renderActions={renderActions}\n renderContextMenu={renderContextMenu}\n labels={labels}\n persistKey={persistKey}\n persistSelection={persistSelection}\n >\n <TreeRootShell<T>\n className={className}\n style={style}\n enableSearch={enableSearch}\n enableTypeAhead={enableTypeAhead}\n renderRow={renderRow}\n />\n </TreeProvider>\n );\n}\n\ninterface TreeRootShellProps<T> {\n className?: string;\n style?: React.CSSProperties;\n enableSearch: boolean;\n enableTypeAhead: boolean;\n renderRow?: TreeRootProps<T>['renderRow'];\n}\n\nfunction TreeRootShell<T>({\n className,\n style,\n enableSearch,\n enableTypeAhead,\n renderRow,\n}: TreeRootShellProps<T>) {\n const containerRef = useRef<HTMLDivElement>(null);\n const ctx = useTreeContext<T>();\n\n // Keyboard navigation (↑↓ ←→ Home/End Enter Esc) — scoped via callback ref.\n const { ref: keyboardRef } = useTreeKeyboard<T>({\n rows: ctx.flatRows,\n focusedId: ctx.focused,\n onFocus: ctx.setFocus,\n onSelect: ctx.select,\n onActivate: (id) => {\n // Keyboard Enter / Space is always an explicit action — pin (no preview).\n const row = ctx.flatRows.find((r) => r.node.id === id);\n if (row) ctx.activate(row.node, { preview: false });\n },\n onExpand: ctx.expand,\n onCollapse: ctx.collapse,\n onClearSelection: ctx.clearSelection,\n });\n\n const setContainerRef = useCallback(\n (instance: HTMLDivElement | null) => {\n containerRef.current = instance;\n keyboardRef(instance);\n },\n [keyboardRef],\n );\n\n // Type-ahead jump.\n const onTypeAheadMatch = useCallback(\n (id: string) => {\n ctx.setFocus(id);\n // Scroll the row into view if it has rendered.\n const el = containerRef.current?.querySelector<HTMLElement>(\n `[data-tree-row][data-id=\"${CSS.escape(id)}\"]`,\n );\n el?.scrollIntoView({ block: 'nearest' });\n },\n [ctx],\n );\n\n useTreeTypeAhead<T>({\n rows: ctx.flatRows,\n getItemName: ctx.getItemName,\n containerRef,\n onMatch: onTypeAheadMatch,\n enabled: enableTypeAhead,\n });\n\n return (\n <div\n ref={setContainerRef}\n tabIndex={0}\n className={cn(\n 'group/tree flex h-full w-full flex-col gap-2 outline-none',\n className,\n )}\n style={{ ...appearanceToStyle(ctx.appearance), ...style }}\n data-tree-root=\"\"\n >\n {enableSearch ? <TreeSearchInput className=\"mx-2 mt-2\" /> : null}\n <div className=\"min-h-0 flex-1 overflow-auto px-1\">\n <TreeContent<T>>{renderRow}</TreeContent>\n </div>\n </div>\n );\n}\n\nexport default TreeRoot;\nexport { TreeRoot };\n"]}
|