@djangocfg/ui-tools 2.1.389 → 2.1.393
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -10
- package/dist/chunk-PAWJFY3S.mjs +6 -0
- package/dist/{chunk-N2XQF2OL.mjs.map → chunk-PAWJFY3S.mjs.map} +1 -1
- package/dist/chunk-PK6SKIKE.cjs +8 -0
- package/dist/{chunk-OLISEQHS.cjs.map → chunk-PK6SKIKE.cjs.map} +1 -1
- package/dist/file-icon/index.cjs +6 -6
- package/dist/file-icon/index.d.cts +1 -1
- package/dist/file-icon/index.d.ts +1 -1
- package/dist/file-icon/index.mjs +1 -1
- package/dist/tree/index.cjs +1372 -143
- package/dist/tree/index.cjs.map +1 -1
- package/dist/tree/index.d.cts +2 -2
- package/dist/tree/index.d.ts +2 -2
- package/dist/tree/index.mjs +1322 -3
- package/dist/tree/index.mjs.map +1 -1
- package/dist/{types-CevSbyfD.d.cts → types-B_zhyAqR.d.cts} +1 -1
- package/dist/{types-CevSbyfD.d.ts → types-B_zhyAqR.d.ts} +1 -1
- package/package.json +9 -17
- package/src/tools/AudioPlayer/README.md +4 -4
- package/src/tools/Chat/README.md +6 -6
- package/src/tools/CronScheduler/index.tsx +1 -1
- package/src/tools/CronScheduler/lazy.tsx +1 -1
- package/src/tools/ImageViewer/README.md +1 -1
- package/src/tools/JsonForm/README.md +2 -2
- package/src/tools/MarkdownEditor/README.md +3 -3
- package/src/tools/MarkdownMessage/README.md +2 -2
- package/src/tools/OpenapiViewer/components/DocsLayout/grouping.ts +5 -1
- package/src/tools/SpeechRecognition/README.md +1 -1
- package/dist/ChatRoot-EFNXQXXN.cjs +0 -15
- package/dist/ChatRoot-EFNXQXXN.cjs.map +0 -1
- package/dist/ChatRoot-FITF5RVP.mjs +0 -6
- package/dist/ChatRoot-FITF5RVP.mjs.map +0 -1
- package/dist/ChatRoot-PNNGQCYF.css +0 -7
- package/dist/ChatRoot-PNNGQCYF.css.map +0 -1
- package/dist/CronScheduler.client-DLMXCPAJ.mjs +0 -67
- package/dist/CronScheduler.client-DLMXCPAJ.mjs.map +0 -1
- package/dist/CronScheduler.client-WEJF4PWQ.cjs +0 -72
- package/dist/CronScheduler.client-WEJF4PWQ.cjs.map +0 -1
- package/dist/DictationField-AS2F33WI.cjs +0 -13
- package/dist/DictationField-AS2F33WI.cjs.map +0 -1
- package/dist/DictationField-WPONUCYE.mjs +0 -4
- package/dist/DictationField-WPONUCYE.mjs.map +0 -1
- package/dist/DocsLayout-EKASBSP7.mjs +0 -3448
- package/dist/DocsLayout-EKASBSP7.mjs.map +0 -1
- package/dist/DocsLayout-MBFIB4NO.css +0 -7
- package/dist/DocsLayout-MBFIB4NO.css.map +0 -1
- package/dist/DocsLayout-OURFYWQE.cjs +0 -3455
- package/dist/DocsLayout-OURFYWQE.cjs.map +0 -1
- package/dist/JsonSchemaForm-DD7CLRIG.cjs +0 -13
- package/dist/JsonSchemaForm-DD7CLRIG.cjs.map +0 -1
- package/dist/JsonSchemaForm-XKUIVELK.mjs +0 -4
- package/dist/JsonSchemaForm-XKUIVELK.mjs.map +0 -1
- package/dist/JsonTree-43PQAJKY.mjs +0 -5
- package/dist/JsonTree-43PQAJKY.mjs.map +0 -1
- package/dist/JsonTree-MLET23ZA.css +0 -7
- package/dist/JsonTree-MLET23ZA.css.map +0 -1
- package/dist/JsonTree-X6W5YEVY.cjs +0 -11
- package/dist/JsonTree-X6W5YEVY.cjs.map +0 -1
- package/dist/LottiePlayer.client-2S7ISJ2S.cjs +0 -168
- package/dist/LottiePlayer.client-2S7ISJ2S.cjs.map +0 -1
- package/dist/LottiePlayer.client-5LDSSJWS.mjs +0 -161
- package/dist/LottiePlayer.client-5LDSSJWS.mjs.map +0 -1
- package/dist/MapContainer-AKIPABJK.mjs +0 -4
- package/dist/MapContainer-AKIPABJK.mjs.map +0 -1
- package/dist/MapContainer-STVDMC36.cjs +0 -17
- package/dist/MapContainer-STVDMC36.cjs.map +0 -1
- package/dist/Mermaid.client-DDXWXZXY.css +0 -7
- package/dist/Mermaid.client-DDXWXZXY.css.map +0 -1
- package/dist/Mermaid.client-NL4SVR7F.mjs +0 -481
- package/dist/Mermaid.client-NL4SVR7F.mjs.map +0 -1
- package/dist/Mermaid.client-NNTI6DFX.cjs +0 -487
- package/dist/Mermaid.client-NNTI6DFX.cjs.map +0 -1
- package/dist/Player-BRV7XTWR.mjs +0 -4
- package/dist/Player-BRV7XTWR.mjs.map +0 -1
- package/dist/Player-PM7F7DD7.cjs +0 -13
- package/dist/Player-PM7F7DD7.cjs.map +0 -1
- package/dist/Player-ZGQKKOWI.css +0 -66
- package/dist/Player-ZGQKKOWI.css.map +0 -1
- package/dist/PrettyCode.client-GWFAIVFN.css +0 -7
- package/dist/PrettyCode.client-GWFAIVFN.css.map +0 -1
- package/dist/PrettyCode.client-KOHDVPPN.cjs +0 -285
- package/dist/PrettyCode.client-KOHDVPPN.cjs.map +0 -1
- package/dist/PrettyCode.client-ZGYGKE7G.mjs +0 -283
- package/dist/PrettyCode.client-ZGYGKE7G.mjs.map +0 -1
- package/dist/TreeRoot-5COOOSWG.mjs +0 -4
- package/dist/TreeRoot-5COOOSWG.mjs.map +0 -1
- package/dist/TreeRoot-AABP2J6Y.cjs +0 -19
- package/dist/TreeRoot-AABP2J6Y.cjs.map +0 -1
- package/dist/chunk-2NG4SXEP.mjs +0 -743
- package/dist/chunk-2NG4SXEP.mjs.map +0 -1
- package/dist/chunk-4LFB7I5K.cjs +0 -1387
- package/dist/chunk-4LFB7I5K.cjs.map +0 -1
- package/dist/chunk-5D2OCOPQ.cjs +0 -222
- package/dist/chunk-5D2OCOPQ.cjs.map +0 -1
- package/dist/chunk-5I5QNGUG.cjs +0 -611
- package/dist/chunk-5I5QNGUG.cjs.map +0 -1
- package/dist/chunk-6ZX2G25W.mjs +0 -1361
- package/dist/chunk-6ZX2G25W.mjs.map +0 -1
- package/dist/chunk-76NNDZH6.cjs +0 -1061
- package/dist/chunk-76NNDZH6.cjs.map +0 -1
- package/dist/chunk-7CWGZPO3.mjs +0 -214
- package/dist/chunk-7CWGZPO3.mjs.map +0 -1
- package/dist/chunk-7EYHNP3E.cjs +0 -965
- package/dist/chunk-7EYHNP3E.cjs.map +0 -1
- package/dist/chunk-7IYXZUJO.cjs +0 -769
- package/dist/chunk-7IYXZUJO.cjs.map +0 -1
- package/dist/chunk-ADEN3UA4.cjs +0 -892
- package/dist/chunk-ADEN3UA4.cjs.map +0 -1
- package/dist/chunk-B6IR5KSC.mjs +0 -59
- package/dist/chunk-B6IR5KSC.mjs.map +0 -1
- package/dist/chunk-C6GXVH5J.mjs +0 -338
- package/dist/chunk-C6GXVH5J.mjs.map +0 -1
- package/dist/chunk-DMX7W4XZ.mjs +0 -1113
- package/dist/chunk-DMX7W4XZ.mjs.map +0 -1
- package/dist/chunk-ECONRHIG.mjs +0 -212
- package/dist/chunk-ECONRHIG.mjs.map +0 -1
- package/dist/chunk-FEN5S772.cjs +0 -1227
- package/dist/chunk-FEN5S772.cjs.map +0 -1
- package/dist/chunk-FP2RLYQZ.cjs +0 -187
- package/dist/chunk-FP2RLYQZ.cjs.map +0 -1
- package/dist/chunk-FVVF7VCD.cjs +0 -1325
- package/dist/chunk-FVVF7VCD.cjs.map +0 -1
- package/dist/chunk-GYIO7W7M.mjs +0 -1197
- package/dist/chunk-GYIO7W7M.mjs.map +0 -1
- package/dist/chunk-KNDLV4PI.cjs +0 -1356
- package/dist/chunk-KNDLV4PI.cjs.map +0 -1
- package/dist/chunk-KNEQRUBA.mjs +0 -181
- package/dist/chunk-KNEQRUBA.mjs.map +0 -1
- package/dist/chunk-N2XQF2OL.mjs +0 -14
- package/dist/chunk-N4MZYNR4.mjs +0 -1342
- package/dist/chunk-N4MZYNR4.mjs.map +0 -1
- package/dist/chunk-NTVBIIUD.mjs +0 -1439
- package/dist/chunk-NTVBIIUD.mjs.map +0 -1
- package/dist/chunk-OBRSGM64.mjs +0 -607
- package/dist/chunk-OBRSGM64.mjs.map +0 -1
- package/dist/chunk-ODO4GMW7.mjs +0 -79
- package/dist/chunk-ODO4GMW7.mjs.map +0 -1
- package/dist/chunk-OLISEQHS.cjs +0 -18
- package/dist/chunk-PVAX67JG.mjs +0 -1041
- package/dist/chunk-PVAX67JG.mjs.map +0 -1
- package/dist/chunk-QJ6GTUCO.cjs +0 -81
- package/dist/chunk-QJ6GTUCO.cjs.map +0 -1
- package/dist/chunk-T3MWM23F.cjs +0 -214
- package/dist/chunk-T3MWM23F.cjs.map +0 -1
- package/dist/chunk-TBSHZO5R.cjs +0 -1134
- package/dist/chunk-TBSHZO5R.cjs.map +0 -1
- package/dist/chunk-UNCS5V5F.mjs +0 -887
- package/dist/chunk-UNCS5V5F.mjs.map +0 -1
- package/dist/chunk-VWQ5WOIL.mjs +0 -2059
- package/dist/chunk-VWQ5WOIL.mjs.map +0 -1
- package/dist/chunk-W75B7Y6C.cjs +0 -1478
- package/dist/chunk-W75B7Y6C.cjs.map +0 -1
- package/dist/chunk-Y6UTOBF6.mjs +0 -938
- package/dist/chunk-Y6UTOBF6.mjs.map +0 -1
- package/dist/chunk-YDPDTOSP.cjs +0 -2061
- package/dist/chunk-YDPDTOSP.cjs.map +0 -1
- package/dist/chunk-YW5IVWHQ.cjs +0 -346
- package/dist/chunk-YW5IVWHQ.cjs.map +0 -1
- package/dist/chunk-YXZ6GU7H.cjs +0 -63
- package/dist/chunk-YXZ6GU7H.cjs.map +0 -1
- package/dist/chunk-ZL7FH4NW.mjs +0 -1274
- package/dist/chunk-ZL7FH4NW.mjs.map +0 -1
- package/dist/components-EHOGXATG.cjs +0 -22
- package/dist/components-EHOGXATG.cjs.map +0 -1
- package/dist/components-MQ6DR7TX.cjs +0 -26
- package/dist/components-MQ6DR7TX.cjs.map +0 -1
- package/dist/components-XRX7QGLB.mjs +0 -5
- package/dist/components-XRX7QGLB.mjs.map +0 -1
- package/dist/components-YATKRWLH.mjs +0 -5
- package/dist/components-YATKRWLH.mjs.map +0 -1
- package/dist/index.cjs +0 -3674
- package/dist/index.cjs.map +0 -1
- package/dist/index.css +0 -234
- package/dist/index.css.map +0 -1
- package/dist/index.d.cts +0 -4929
- package/dist/index.d.ts +0 -4929
- package/dist/index.mjs +0 -2912
- package/dist/index.mjs.map +0 -1
- package/dist/launcher-5Y42OBSN.mjs +0 -6
- package/dist/launcher-5Y42OBSN.mjs.map +0 -1
- package/dist/launcher-PMW2YB24.cjs +0 -59
- package/dist/launcher-PMW2YB24.cjs.map +0 -1
- package/src/index.ts +0 -157
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tools/Map/components/MapMarker.tsx","../src/tools/Map/components/MapPopup.tsx","../src/tools/Map/layers/cluster.ts","../src/tools/Map/components/MapCluster.tsx","../src/tools/Map/components/MapSource.tsx","../src/tools/Map/components/CustomOverlay.tsx","../src/tools/Map/components/MapLegend.tsx","../src/tools/Map/hooks/useMapLayers.ts","../src/tools/Map/components/LayerSwitcher.tsx","../src/tools/Map/lazy.tsx","../src/tools/Mermaid/lazy.tsx","../src/tools/PrettyCode/lazy.tsx","../src/tools/OpenapiViewer/lazy.tsx","../src/tools/JsonForm/lazy.tsx","../src/tools/LottiePlayer/lazy.tsx","../src/tools/AudioPlayer/lazy.tsx","../src/tools/VideoPlayer/lazy.tsx","../src/tools/JsonTree/lazy.tsx","../src/tools/ImageViewer/lazy.tsx","../src/tools/CronScheduler/lazy.tsx","../src/tools/Tree/lazy.tsx","../src/tools/Chat/core/transport/types.ts","../src/tools/Chat/core/transport/sse.ts","../src/tools/Chat/core/transport/http.ts","../src/tools/Chat/core/transport/mock.ts","../src/tools/Chat/core/transport/mappers/pydantic-ai.ts","../src/tools/Chat/core/transport/pydantic-ai-transport.ts","../src/tools/Chat/hooks/useChatScroll.ts","../src/tools/Chat/hooks/useChatHistory.ts","../src/tools/Chat/hooks/useChatLightbox.ts","../src/tools/Chat/hooks/useVisitorFingerprint.ts","../src/tools/Chat/hooks/useChatDockPrefs.ts","../src/tools/Chat/hooks/useChatUnread.ts","../src/tools/Chat/core/audio/preferences.ts","../src/tools/Chat/core/payload-dispatch.ts","../src/tools/Chat/utils/collectImageAttachments.ts","../src/tools/Chat/components/AudioToggle.tsx","../src/tools/Chat/lazy.tsx","../src/tools/LottiePlayer/index.tsx","../src/tools/OpenapiViewer/index.tsx","../src/tools/CronScheduler/index.tsx","../src/tools/CodeEditor/workers/setup.ts","../src/tools/CodeEditor/hooks/useMonaco.ts","../src/tools/CodeEditor/hooks/useEditorTheme.ts","../src/tools/CodeEditor/components/Editor.tsx","../src/tools/CodeEditor/components/DiffEditor.tsx","../src/tools/CodeEditor/lib/languages.ts","../src/tools/CodeEditor/context/EditorProvider.tsx","../src/tools/CodeEditor/hooks/useEditor.ts","../src/tools/CodeEditor/hooks/useLanguage.ts","../src/tools/MarkdownEditor/MentionList.tsx","../src/tools/MarkdownEditor/createMentionSuggestion.ts","../src/tools/MarkdownEditor/mentionPresets.ts","../src/tools/MarkdownEditor/submitOnEnter.ts","../src/tools/MarkdownEditor/MarkdownEditor.tsx"],"names":["DefaultPin","jsxs","jsx","MapMarker","memo","MapPopup","offset","MapCluster","useCallback","Fragment","Popup","MapSource","Source","MapLayer","Layer","useState","positionStyles","useMemo","mapStatusToCode","useEffect","useRef","LoadingFallback","lazy","Suspense","s","Editor","forwardRef","useImperativeHandle","MarkdownEditor","useEditor","editor"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client'\n\nimport { useCallback, memo, type ReactNode } from 'react'\nimport { Marker, type MarkerEvent, type MarkerDragEvent } from 'react-map-gl/maplibre'\nimport type { LngLat } from 'maplibre-gl'\nimport type { MarkerData } from '../types'\n\nexport interface MapMarkerProps {\n marker: MarkerData\n onClick?: (marker: MarkerData) => void\n children?: ReactNode\n anchor?: 'center' | 'top' | 'bottom' | 'left' | 'right' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\n draggable?: boolean\n onDragStart?: (marker: MarkerData) => void\n onDrag?: (marker: MarkerData, lngLat: LngLat) => void\n onDragEnd?: (marker: MarkerData, lngLat: LngLat) => void\n color?: string\n size?: number\n}\n\nconst DefaultPin = memo(function DefaultPin({\n size = 24,\n color = '#ef4444'\n}: {\n size?: number\n color?: string\n}) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{ cursor: 'pointer' }}\n >\n <path\n d=\"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7z\"\n fill={color}\n stroke=\"#fff\"\n strokeWidth=\"1.5\"\n />\n <circle cx=\"12\" cy=\"9\" r=\"2.5\" fill=\"#fff\" />\n </svg>\n )\n})\n\nexport const MapMarker = memo(function MapMarker({\n marker,\n onClick,\n children,\n anchor = 'bottom',\n draggable = false,\n onDragStart,\n onDrag,\n onDragEnd,\n color,\n size,\n}: MapMarkerProps) {\n const handleClick = useCallback(\n (e: MarkerEvent<MouseEvent>) => {\n e.originalEvent.stopPropagation()\n onClick?.(marker)\n },\n [onClick, marker]\n )\n\n const handleDragStart = useCallback(\n (e: MarkerDragEvent) => {\n onDragStart?.(marker)\n },\n [onDragStart, marker]\n )\n\n const handleDrag = useCallback(\n (e: MarkerDragEvent) => {\n onDrag?.(marker, e.lngLat)\n },\n [onDrag, marker]\n )\n\n const handleDragEnd = useCallback(\n (e: MarkerDragEvent) => {\n onDragEnd?.(marker, e.lngLat)\n },\n [onDragEnd, marker]\n )\n\n return (\n <Marker\n longitude={marker.longitude}\n latitude={marker.latitude}\n anchor={anchor}\n draggable={draggable}\n onClick={handleClick}\n onDragStart={handleDragStart}\n onDrag={handleDrag}\n onDragEnd={handleDragEnd}\n >\n {children ?? <DefaultPin color={color} size={size} />}\n </Marker>\n )\n})\n","'use client'\n\nimport { memo, type ReactNode } from 'react'\nimport { Popup } from 'react-map-gl/maplibre'\n\nexport interface MapPopupProps {\n longitude: number\n latitude: number\n onClose: () => void\n children: ReactNode\n anchor?: 'top' | 'bottom' | 'left' | 'right' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\n closeOnClick?: boolean\n closeButton?: boolean\n className?: string\n maxWidth?: string\n offset?: number | [number, number]\n}\n\nexport const MapPopup = memo(function MapPopup({\n longitude,\n latitude,\n onClose,\n children,\n anchor = 'bottom',\n closeOnClick = true,\n closeButton = true,\n className,\n maxWidth = '300px',\n offset = 15,\n}: MapPopupProps) {\n return (\n <Popup\n longitude={longitude}\n latitude={latitude}\n anchor={anchor}\n onClose={onClose}\n closeOnClick={closeOnClick}\n closeButton={closeButton}\n className={className}\n maxWidth={maxWidth}\n offset={offset}\n >\n {children}\n </Popup>\n )\n})\n","import type { LayerProps } from 'react-map-gl/maplibre'\nimport type { ClusterLayerOptions } from '../types'\n\nconst DEFAULT_COLORS: [string, string, string] = ['#51bbd6', '#f1f075', '#f28cb1']\nconst DEFAULT_RADII: [number, number, number] = [20, 30, 40]\nconst DEFAULT_THRESHOLDS: [number, number] = [100, 750]\nconst DEFAULT_HOVER_COLOR = '#3b82f6' // blue-500\n\nexport function createClusterLayers(options: ClusterLayerOptions): {\n cluster: LayerProps\n clusterCount: LayerProps\n unclusteredPoint: LayerProps\n} {\n const {\n sourceId,\n colors = DEFAULT_COLORS,\n radii = DEFAULT_RADII,\n thresholds = DEFAULT_THRESHOLDS,\n hoverColor = DEFAULT_HOVER_COLOR,\n } = options\n\n const cluster: LayerProps = {\n id: `${sourceId}-clusters`,\n type: 'circle',\n source: sourceId,\n filter: ['has', 'point_count'],\n paint: {\n 'circle-color': [\n 'case',\n ['boolean', ['feature-state', 'hover'], false],\n hoverColor,\n [\n 'step',\n ['get', 'point_count'],\n colors[0],\n thresholds[0],\n colors[1],\n thresholds[1],\n colors[2],\n ],\n ],\n 'circle-radius': [\n 'step',\n ['get', 'point_count'],\n radii[0],\n thresholds[0],\n radii[1],\n thresholds[1],\n radii[2],\n ],\n 'circle-stroke-width': 2,\n 'circle-stroke-color': '#fff',\n },\n }\n\n const clusterCount: LayerProps = {\n id: `${sourceId}-cluster-count`,\n type: 'symbol',\n source: sourceId,\n filter: ['has', 'point_count'],\n layout: {\n 'text-field': ['get', 'point_count_abbreviated'],\n 'text-size': 12,\n },\n paint: {\n 'text-color': '#000',\n },\n }\n\n const unclusteredPoint: LayerProps = {\n id: `${sourceId}-unclustered-point`,\n type: 'circle',\n source: sourceId,\n filter: ['!', ['has', 'point_count']],\n paint: {\n 'circle-color': [\n 'case',\n ['boolean', ['feature-state', 'hover'], false],\n hoverColor,\n colors[0],\n ],\n 'circle-radius': [\n 'case',\n ['boolean', ['feature-state', 'hover'], false],\n 10,\n 8,\n ],\n 'circle-stroke-width': 2,\n 'circle-stroke-color': '#fff',\n },\n }\n\n return { cluster, clusterCount, unclusteredPoint }\n}\n","'use client'\n\nimport { useCallback, useState, useEffect, memo, type ReactNode } from 'react'\nimport { Source, Layer, useMap, Popup } from 'react-map-gl/maplibre'\nimport type { GeoJSONSource, MapMouseEvent } from 'maplibre-gl'\nimport { createClusterLayers } from '../layers'\nimport type { ClusterLayerOptions } from '../types'\n\n// Inject popup styles once\nconst POPUP_STYLE_ID = 'map-cluster-popup-styles'\nfunction injectPopupStyles() {\n if (typeof document === 'undefined') return\n if (document.getElementById(POPUP_STYLE_ID)) return\n\n const style = document.createElement('style')\n style.id = POPUP_STYLE_ID\n style.textContent = `\n .maplibregl-popup.map-popup-clean .maplibregl-popup-content {\n padding: 0 !important;\n background: transparent !important;\n box-shadow: none !important;\n border-radius: 0 !important;\n }\n .maplibregl-popup.map-popup-clean .maplibregl-popup-tip {\n display: none !important;\n }\n `\n document.head.appendChild(style)\n}\n\nexport interface MapClusterProps {\n sourceId: string\n data: GeoJSON.FeatureCollection\n clusterRadius?: number\n clusterMaxZoom?: number\n onClusterClick?: (clusterId: number, coordinates: [number, number]) => void\n onPointClick?: (feature: GeoJSON.Feature) => void\n /** Render prop for popup content - handles popup state automatically */\n renderPopup?: (feature: GeoJSON.Feature, onClose: () => void) => ReactNode\n /** Popup anchor position */\n popupAnchor?: 'top' | 'bottom' | 'left' | 'right'\n /** Popup offset */\n popupOffset?: number | [number, number]\n /** Pan offset X when clicking point (pixels). Positive = point shifts right. */\n panOffsetX?: number\n /** Pan offset Y when clicking point (pixels). Positive = point shifts down. */\n panOffsetY?: number\n colors?: [string, string, string]\n radii?: [number, number, number]\n thresholds?: [number, number]\n /** Color when marker/cluster is hovered */\n hoverColor?: string\n}\n\nexport const MapCluster = memo(function MapCluster({\n sourceId,\n data,\n clusterRadius = 50,\n clusterMaxZoom = 14,\n onClusterClick,\n onPointClick,\n renderPopup,\n popupAnchor = 'bottom',\n popupOffset = 15,\n panOffsetX = 0,\n panOffsetY = 150,\n colors,\n radii,\n thresholds,\n hoverColor,\n}: MapClusterProps) {\n const { current: map } = useMap()\n const [selectedFeature, setSelectedFeature] = useState<GeoJSON.Feature | null>(null)\n const [popupCoords, setPopupCoords] = useState<[number, number] | null>(null)\n\n // Inject popup styles on mount\n useEffect(() => {\n injectPopupStyles()\n }, [])\n\n const layerOptions: ClusterLayerOptions = {\n sourceId,\n colors,\n radii,\n thresholds,\n hoverColor,\n }\n\n const { cluster, clusterCount, unclusteredPoint } = createClusterLayers(layerOptions)\n\n const handleClosePopup = useCallback(() => {\n setSelectedFeature(null)\n setPopupCoords(null)\n }, [])\n\n const handleClick = useCallback(\n async (event: MapMouseEvent) => {\n if (!map) return\n\n const features = map.queryRenderedFeatures(event.point, {\n layers: [cluster.id!, unclusteredPoint.id!],\n })\n\n if (!features || features.length === 0) return\n\n const feature = features[0]\n const geometry = feature.geometry\n\n if (geometry.type !== 'Point') return\n\n const coordinates = geometry.coordinates as [number, number]\n const clusterId = feature.properties?.cluster_id\n\n if (clusterId) {\n const source = map.getSource(sourceId) as GeoJSONSource\n if (!source) return\n\n try {\n const zoom = await source.getClusterExpansionZoom(clusterId)\n map.easeTo({\n center: coordinates,\n zoom,\n duration: 500,\n })\n onClusterClick?.(clusterId, coordinates)\n } catch (error) {\n console.error('Error expanding cluster:', error)\n }\n } else {\n // Handle point click\n onPointClick?.(feature)\n\n // If renderPopup is provided, show popup and pan to point\n if (renderPopup) {\n // Pan map to center on point with offset for popup visibility\n map.easeTo({\n center: coordinates,\n duration: 300,\n offset: [panOffsetX, panOffsetY],\n })\n setSelectedFeature(feature)\n setPopupCoords(coordinates)\n }\n }\n },\n [map, sourceId, cluster.id, unclusteredPoint.id, onClusterClick, onPointClick, renderPopup, panOffsetX, panOffsetY]\n )\n\n // Close popup when clicking empty area\n const handleMapClick = useCallback(\n (event: MapMouseEvent) => {\n if (!map) return\n\n const features = map.queryRenderedFeatures(event.point, {\n layers: [cluster.id!, unclusteredPoint.id!],\n })\n\n // Close popup if clicked on empty area (no features)\n if (!features || features.length === 0) {\n handleClosePopup()\n }\n },\n [map, cluster.id, unclusteredPoint.id, handleClosePopup]\n )\n\n // Register click and hover handlers with proper cleanup\n useEffect(() => {\n if (!map) return\n\n const clusterLayerId = cluster.id!\n const pointLayerId = unclusteredPoint.id!\n let currentHoveredId: number | string | null = null\n\n // Helper to clear hover state\n const clearHoverState = () => {\n if (currentHoveredId !== null) {\n map.setFeatureState(\n { source: sourceId, id: currentHoveredId },\n { hover: false }\n )\n currentHoveredId = null\n }\n }\n\n // Hover handler for both clusters and points\n const handleMouseMove = (e: MapMouseEvent) => {\n const features = map.queryRenderedFeatures(e.point, {\n layers: [clusterLayerId, pointLayerId],\n })\n\n if (features.length > 0) {\n map.getCanvas().style.cursor = 'pointer'\n const feature = features[0]\n const featureId = feature.id\n\n if (featureId !== undefined && featureId !== currentHoveredId) {\n clearHoverState()\n currentHoveredId = featureId\n map.setFeatureState(\n { source: sourceId, id: featureId },\n { hover: true }\n )\n }\n } else {\n map.getCanvas().style.cursor = ''\n clearHoverState()\n }\n }\n\n const handleMouseLeave = () => {\n map.getCanvas().style.cursor = ''\n clearHoverState()\n }\n\n map.on('click', clusterLayerId, handleClick)\n map.on('click', pointLayerId, handleClick)\n map.on('click', handleMapClick)\n map.on('mousemove', clusterLayerId, handleMouseMove)\n map.on('mousemove', pointLayerId, handleMouseMove)\n map.on('mouseleave', clusterLayerId, handleMouseLeave)\n map.on('mouseleave', pointLayerId, handleMouseLeave)\n\n // Cleanup on unmount\n return () => {\n clearHoverState()\n map.off('click', clusterLayerId, handleClick)\n map.off('click', pointLayerId, handleClick)\n map.off('click', handleMapClick)\n map.off('mousemove', clusterLayerId, handleMouseMove)\n map.off('mousemove', pointLayerId, handleMouseMove)\n map.off('mouseleave', clusterLayerId, handleMouseLeave)\n map.off('mouseleave', pointLayerId, handleMouseLeave)\n }\n }, [map, sourceId, cluster.id, unclusteredPoint.id, handleClick, handleMapClick])\n\n return (\n <>\n <Source\n id={sourceId}\n type=\"geojson\"\n data={data}\n cluster={true}\n clusterMaxZoom={clusterMaxZoom}\n clusterRadius={clusterRadius}\n generateId={true}\n >\n <Layer {...cluster} />\n <Layer {...clusterCount} />\n <Layer {...unclusteredPoint} />\n </Source>\n\n {/* Popup rendered via render prop */}\n {renderPopup && selectedFeature && popupCoords && (\n <Popup\n longitude={popupCoords[0]}\n latitude={popupCoords[1]}\n anchor={popupAnchor}\n onClose={handleClosePopup}\n closeOnClick={false}\n closeButton={false}\n offset={popupOffset}\n maxWidth=\"none\"\n className=\"map-popup-clean\"\n >\n {renderPopup(selectedFeature, handleClosePopup)}\n </Popup>\n )}\n </>\n )\n})\n","'use client'\n\nimport { memo, type ReactNode } from 'react'\nimport { Source, Layer, type LayerProps } from 'react-map-gl/maplibre'\n\nexport interface MapSourceProps {\n id: string\n data: GeoJSON.GeoJSON | string\n type?: 'geojson'\n children?: ReactNode\n}\n\nexport const MapSource = memo(function MapSource({\n id,\n data,\n type = 'geojson',\n children,\n}: MapSourceProps) {\n return (\n <Source id={id} type={type} data={data}>\n {children}\n </Source>\n )\n})\n\nexport type MapLayerProps = LayerProps\n\nexport const MapLayer = memo(function MapLayer(props: MapLayerProps) {\n return <Layer {...props} />\n})\n","'use client'\n\nimport { useState, memo } from 'react'\nimport { createPortal } from 'react-dom'\nimport { useControl } from 'react-map-gl/maplibre'\n\nimport type { IControl, MapInstance } from 'react-map-gl/maplibre'\nimport type { CustomOverlayProps } from '../types'\n\nclass OverlayControl implements IControl {\n _map: MapInstance | null = null\n _container: HTMLElement | null = null\n _redraw: () => void\n\n constructor(redraw: () => void) {\n this._redraw = redraw\n }\n\n onAdd(map: MapInstance): HTMLElement {\n this._map = map\n map.on('move', this._redraw)\n this._container = document.createElement('div')\n this._redraw()\n return this._container\n }\n\n onRemove(): void {\n this._container?.remove()\n this._map?.off('move', this._redraw)\n this._map = null\n }\n\n getElement(): HTMLElement | null {\n return this._container\n }\n}\n\nfunction CustomOverlayComponent({ children }: CustomOverlayProps) {\n const [, setVersion] = useState(0)\n\n const ctrl = useControl<OverlayControl>(() => {\n const forceUpdate = () => setVersion((v) => v + 1)\n return new OverlayControl(forceUpdate)\n })\n\n const element = ctrl.getElement()\n\n if (!element) return null\n\n // Children can use useMapContext() to access the map if needed\n return createPortal(children, element)\n}\n\nexport const CustomOverlay = memo(CustomOverlayComponent)\n","'use client'\n\nimport { useState, useMemo, memo } from 'react'\n\nimport type { MapLegendProps, LegendItem } from '../types'\n\nconst positionStyles: Record<string, React.CSSProperties> = {\n 'top-left': { top: 10, left: 10 },\n 'top-right': { top: 10, right: 10 },\n 'bottom-left': { bottom: 10, left: 10 },\n 'bottom-right': { bottom: 10, right: 10 },\n}\n\nfunction LegendIcon({\n type,\n color,\n}: {\n type: LegendItem['type']\n color?: string\n}) {\n const fill = color || '#888'\n\n switch (type) {\n case 'circle':\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" fill={fill} />\n </svg>\n )\n case 'line':\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\n <line\n x1=\"0\"\n y1=\"8\"\n x2=\"16\"\n y2=\"8\"\n stroke={fill}\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n />\n </svg>\n )\n case 'fill':\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\n <rect x=\"1\" y=\"1\" width=\"14\" height=\"14\" fill={fill} rx=\"2\" />\n </svg>\n )\n case 'symbol':\n default:\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\n <path\n d=\"M8 1l2.5 5 5.5.8-4 3.9.9 5.3L8 13.5l-4.9 2.5.9-5.3-4-3.9 5.5-.8z\"\n fill={fill}\n />\n </svg>\n )\n }\n}\n\nfunction MapLegendComponent({\n items,\n position = 'bottom-right',\n title,\n collapsible = false,\n defaultCollapsed = false,\n className = '',\n style,\n onItemClick,\n}: MapLegendProps) {\n const [collapsed, setCollapsed] = useState(defaultCollapsed)\n\n const containerStyle = useMemo<React.CSSProperties>(\n () => ({\n position: 'absolute',\n ...positionStyles[position],\n backgroundColor: 'white',\n borderRadius: 8,\n boxShadow: '0 2px 8px rgba(0,0,0,0.15)',\n padding: collapsed ? 8 : 12,\n minWidth: collapsed ? 'auto' : 120,\n zIndex: 1,\n ...style,\n }),\n [position, collapsed, style]\n )\n\n const headerStyle = useMemo<React.CSSProperties>(\n () => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 8,\n cursor: collapsible ? 'pointer' : 'default',\n fontWeight: 600,\n fontSize: 12,\n color: '#333',\n marginBottom: collapsed ? 0 : 8,\n }),\n [collapsible, collapsed]\n )\n\n const itemStyle = useMemo<React.CSSProperties>(\n () => ({\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '4px 0',\n fontSize: 12,\n color: '#666',\n cursor: onItemClick ? 'pointer' : 'default',\n }),\n [onItemClick]\n )\n\n const handleHeaderClick = collapsible ? () => setCollapsed(!collapsed) : undefined\n\n return (\n <div className={className} style={containerStyle}>\n {(title || collapsible) && (\n <div style={headerStyle} onClick={handleHeaderClick}>\n {title && <span>{title}</span>}\n {collapsible && (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n style={{\n transform: collapsed ? 'rotate(-90deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s',\n }}\n >\n <path d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"#666\" fill=\"none\" />\n </svg>\n )}\n </div>\n )}\n {!collapsed && (\n <div>\n {items.map((item) => (\n <div\n key={item.id}\n style={{\n ...itemStyle,\n opacity: item.visible === false ? 0.5 : 1,\n }}\n onClick={onItemClick ? () => onItemClick(item) : undefined}\n >\n {item.icon || <LegendIcon type={item.type} color={item.color} />}\n <span>{item.label}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport const MapLegend = memo(MapLegendComponent)\n","'use client'\n\nimport { useCallback } from 'react';\n\nimport { useMapContext } from '../context';\n\nimport type { LayerProps } from 'react-map-gl/maplibre'\nimport type { FilterSpecification } from 'maplibre-gl'\n/**\n * Hook for dynamic layer management\n */\nexport function useMapLayers() {\n const { mapRef, isLoaded } = useMapContext()\n\n const addLayer = useCallback(\n (layer: LayerProps, beforeId?: string) => {\n const map = mapRef.current?.getMap()\n if (!map || !isLoaded) return\n\n if (layer.id && map.getLayer(layer.id)) {\n map.removeLayer(layer.id)\n }\n\n map.addLayer(layer as Parameters<typeof map.addLayer>[0], beforeId)\n },\n [mapRef, isLoaded]\n )\n\n const removeLayer = useCallback(\n (id: string) => {\n const map = mapRef.current?.getMap()\n if (!map || !isLoaded) return\n\n if (map.getLayer(id)) {\n map.removeLayer(id)\n }\n },\n [mapRef, isLoaded]\n )\n\n const setLayerVisibility = useCallback(\n (id: string, visible: boolean) => {\n const map = mapRef.current?.getMap()\n if (!map || !isLoaded) return\n\n if (map.getLayer(id)) {\n map.setLayoutProperty(id, 'visibility', visible ? 'visible' : 'none')\n }\n },\n [mapRef, isLoaded]\n )\n\n const setLayerFilter = useCallback(\n (id: string, filter: FilterSpecification | null) => {\n const map = mapRef.current?.getMap()\n if (!map || !isLoaded) return\n\n if (map.getLayer(id)) {\n map.setFilter(id, filter)\n }\n },\n [mapRef, isLoaded]\n )\n\n const setLayerPaint = useCallback(\n (id: string, property: string, value: unknown) => {\n const map = mapRef.current?.getMap()\n if (!map || !isLoaded) return\n\n if (map.getLayer(id)) {\n map.setPaintProperty(id, property, value)\n }\n },\n [mapRef, isLoaded]\n )\n\n return {\n addLayer,\n removeLayer,\n setLayerVisibility,\n setLayerFilter,\n setLayerPaint,\n }\n}\n","'use client'\n\nimport { useState, useCallback, useMemo, memo } from 'react'\nimport { useMapLayers } from '../hooks/useMapLayers'\n\nimport type { LayerSwitcherProps, LayerConfig } from '../types'\n\nconst positionStyles: Record<string, React.CSSProperties> = {\n 'top-left': { top: 10, left: 10 },\n 'top-right': { top: 10, right: 10 },\n 'bottom-left': { bottom: 10, left: 10 },\n 'bottom-right': { bottom: 10, right: 10 },\n}\n\nfunction LayerSwitcherComponent({\n layers,\n position = 'top-right',\n title = 'Layers',\n collapsible = true,\n defaultCollapsed = false,\n showToggleAll = false,\n className = '',\n style,\n onChange,\n}: LayerSwitcherProps) {\n const { setLayerVisibility } = useMapLayers()\n const [collapsed, setCollapsed] = useState(defaultCollapsed)\n\n const initialVisibility = useMemo(() => {\n const initial: Record<string, boolean> = {}\n layers.forEach((layer) => {\n initial[layer.id] = layer.defaultVisible !== false\n })\n return initial\n }, [layers])\n\n const [visibility, setVisibility] = useState<Record<string, boolean>>(initialVisibility)\n\n const handleToggle = useCallback(\n (layerId: string) => {\n const newVisible = !visibility[layerId]\n setVisibility((prev) => ({ ...prev, [layerId]: newVisible }))\n setLayerVisibility(layerId, newVisible)\n onChange?.(layerId, newVisible)\n },\n [visibility, setLayerVisibility, onChange]\n )\n\n const handleToggleAll = useCallback(\n (visible: boolean) => {\n const newVisibility: Record<string, boolean> = {}\n layers.forEach((layer) => {\n newVisibility[layer.id] = visible\n setLayerVisibility(layer.id, visible)\n onChange?.(layer.id, visible)\n })\n setVisibility(newVisibility)\n },\n [layers, setLayerVisibility, onChange]\n )\n\n const allVisible = useMemo(() => Object.values(visibility).every(Boolean), [visibility])\n const noneVisible = useMemo(() => Object.values(visibility).every((v) => !v), [visibility])\n\n const containerStyle = useMemo<React.CSSProperties>(\n () => ({\n position: 'absolute',\n ...positionStyles[position],\n backgroundColor: 'white',\n borderRadius: 8,\n boxShadow: '0 2px 8px rgba(0,0,0,0.15)',\n padding: collapsed ? 8 : 12,\n minWidth: collapsed ? 'auto' : 150,\n zIndex: 1,\n ...style,\n }),\n [position, collapsed, style]\n )\n\n const headerStyle = useMemo<React.CSSProperties>(\n () => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 8,\n cursor: collapsible ? 'pointer' : 'default',\n fontWeight: 600,\n fontSize: 12,\n color: '#333',\n marginBottom: collapsed ? 0 : 8,\n }),\n [collapsible, collapsed]\n )\n\n const itemStyle = useMemo<React.CSSProperties>(\n () => ({\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '4px 0',\n fontSize: 12,\n color: '#666',\n cursor: 'pointer',\n }),\n []\n )\n\n const checkboxStyle = useMemo<React.CSSProperties>(\n () => ({\n width: 14,\n height: 14,\n cursor: 'pointer',\n }),\n []\n )\n\n const groups = useMemo(() => {\n return layers.reduce(\n (acc, layer) => {\n const group = layer.group || ''\n if (!acc[group]) acc[group] = []\n acc[group].push(layer)\n return acc\n },\n {} as Record<string, LayerConfig[]>\n )\n }, [layers])\n\n const handleHeaderClick = collapsible ? () => setCollapsed(!collapsed) : undefined\n\n return (\n <div className={className} style={containerStyle}>\n <div style={headerStyle} onClick={handleHeaderClick}>\n <span>{title}</span>\n {collapsible && (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n style={{\n transform: collapsed ? 'rotate(-90deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s',\n }}\n >\n <path d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"#666\" fill=\"none\" />\n </svg>\n )}\n </div>\n {!collapsed && (\n <div>\n {showToggleAll && (\n <div\n style={{\n ...itemStyle,\n borderBottom: '1px solid #eee',\n marginBottom: 4,\n paddingBottom: 8,\n }}\n >\n <button\n onClick={() => handleToggleAll(true)}\n disabled={allVisible}\n style={{\n fontSize: 10,\n padding: '2px 6px',\n cursor: allVisible ? 'default' : 'pointer',\n opacity: allVisible ? 0.5 : 1,\n }}\n >\n All\n </button>\n <button\n onClick={() => handleToggleAll(false)}\n disabled={noneVisible}\n style={{\n fontSize: 10,\n padding: '2px 6px',\n cursor: noneVisible ? 'default' : 'pointer',\n opacity: noneVisible ? 0.5 : 1,\n }}\n >\n None\n </button>\n </div>\n )}\n {Object.entries(groups).map(([group, groupLayers]) => (\n <div key={group || 'default'}>\n {group && (\n <div\n style={{\n fontSize: 10,\n fontWeight: 600,\n color: '#999',\n marginTop: 8,\n marginBottom: 4,\n textTransform: 'uppercase',\n }}\n >\n {group}\n </div>\n )}\n {groupLayers.map((layer) => (\n <div\n key={layer.id}\n style={itemStyle}\n onClick={() => handleToggle(layer.id)}\n >\n <input\n type=\"checkbox\"\n checked={visibility[layer.id]}\n onChange={() => handleToggle(layer.id)}\n style={checkboxStyle}\n />\n <span>{layer.label}</span>\n </div>\n ))}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport const LayerSwitcher = memo(LayerSwitcherComponent)\n","'use client';\n\n/**\n * Lazy-loaded Map Components\n *\n * Heavy MapLibre GL (~800KB) is loaded only when components are rendered.\n * Use these for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { MapContainer } from '@djangocfg/ui-tools/map'\n */\n\nimport * as React from 'react';\nimport { createLazyComponent, MapLoadingFallback } from '../../components';\n\n// ============================================================================\n// Lazy Components\n// ============================================================================\n\n/**\n * LazyMapContainer - Lazy-loaded map container\n *\n * Automatically shows loading state while MapLibre GL loads (~800KB)\n */\nexport const LazyMapContainer = createLazyComponent(\n () => import('./components/MapContainer').then((mod) => ({ default: mod.MapContainer })),\n {\n displayName: 'LazyMapContainer',\n fallback: <MapLoadingFallback minHeight={400} />,\n }\n);\n\n/**\n * LazyMapView - Lazy-loaded map view (alias for MapContainer)\n */\nexport const LazyMapView = createLazyComponent(\n () => import('./components/MapContainer').then((mod) => ({ default: mod.MapView })),\n {\n displayName: 'LazyMapView',\n fallback: <MapLoadingFallback minHeight={400} />,\n }\n);\n\n// ============================================================================\n// Light primitives — direct re-exports\n//\n// MapMarker / MapPopup / MapCluster / MapSource / MapLayer / MapControls\n// etc. are thin wrappers around `react-map-gl/maplibre`. They don't import\n// `maplibre-gl` at module scope (only types, which are erased), so exporting\n// them synchronously here costs ~tens of KB at most — not the ~800KB of\n// MapLibre GL itself.\n//\n// The heavy library only loads when `LazyMapContainer` actually mounts,\n// because `MapContainer.tsx` (the only module that imports `maplibre-gl`\n// at runtime) is reached exclusively via the dynamic import above.\n//\n// This means consumers can write:\n//\n// import { LazyMapContainer, MapMarker, MapPopup } from '@djangocfg/ui-tools/map'\n//\n// …and still get correct code-splitting.\n// ============================================================================\n\nexport {\n MapMarker,\n MapPopup,\n MapCluster,\n MapSource,\n MapLayer,\n MapControls,\n CustomOverlay,\n MapLegend,\n LayerSwitcher,\n} from './components';\n\nexport { MapProvider, useMapContext, MapContext } from './context';\nexport type { MapProviderProps } from './context';\n\nexport type {\n MapContainerProps,\n MapMarkerProps,\n MapPopupProps,\n MapClusterProps,\n MapSourceProps,\n MapLayerProps,\n MapControlsProps,\n} from './components';\n\nexport type {\n MapViewport,\n MapStyleKey,\n MarkerData,\n} from './types';\n","'use client';\n\n/**\n * Lazy-loaded Mermaid Component\n *\n * Heavy Mermaid library (~800KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import Mermaid from '@djangocfg/ui-tools/mermaid'\n */\n\nimport { createLazyComponent, CardLoadingFallback } from '../../components';\nimport type { MermaidProps } from './index';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type { MermaidProps };\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyMermaid - Lazy-loaded Mermaid diagram renderer\n *\n * Automatically shows loading state while Mermaid loads (~800KB)\n */\nexport const LazyMermaid = createLazyComponent<MermaidProps>(\n () => import('./Mermaid.client'),\n {\n displayName: 'LazyMermaid',\n fallback: (\n <CardLoadingFallback\n title=\"Diagram\"\n description=\"Loading...\"\n minHeight={200}\n />\n ),\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded PrettyCode Component\n *\n * Heavy Prism library (~500KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import PrettyCode from '@djangocfg/ui-tools/pretty-code'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { Language } from 'prism-react-renderer';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PrettyCodeProps {\n data: string | object;\n language: Language;\n className?: string;\n mode?: 'dark' | 'light';\n inline?: boolean;\n customBg?: string;\n isCompact?: boolean;\n scrollIsolation?: boolean;\n maxLines?: number;\n /** ``'card'`` (default) ships the full chrome. ``'plain'`` is\n * chrome-less — for embedding inside another scroll container. */\n variant?: 'card' | 'plain';\n}\n\nexport type { Language };\n\n// ============================================================================\n// Code Loading Fallback\n// ============================================================================\n\nfunction CodeLoadingFallback() {\n return (\n <div className=\"relative rounded-sm border border-border overflow-hidden bg-muted dark:bg-zinc-900\">\n <div className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"animate-pulse h-4 w-4 rounded-full bg-muted-foreground/20\" />\n <span className=\"text-xs text-muted-foreground\">Loading code...</span>\n </div>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyPrettyCode - Lazy-loaded code syntax highlighter\n *\n * Automatically shows loading state while Prism loads (~500KB)\n */\nexport const LazyPrettyCode = createLazyComponent<PrettyCodeProps>(\n () => import('./PrettyCode.client'),\n {\n displayName: 'LazyPrettyCode',\n fallback: <CodeLoadingFallback />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded OpenapiViewer Component\n *\n * Heavy OpenAPI viewer (~400KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import OpenapiViewer from '@djangocfg/ui-tools/openapi'\n */\n\nimport * as React from 'react';\nimport { createLazyComponent } from '../../components';\nimport { PlaygroundProvider } from './context/PlaygroundContext';\nimport type { ApiKey, PlaygroundConfig, SchemaSource } from './types';\n\nexport interface PlaygroundProps {\n config: PlaygroundConfig;\n}\n\nexport type { ApiKey, PlaygroundConfig, SchemaSource };\n\nfunction OpenapiLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center min-h-[400px] bg-muted/30 rounded-lg\">\n <div className=\"text-center\">\n <div className=\"inline-block h-8 w-8 animate-spin rounded-full border-4 border-solid border-primary border-r-transparent\" />\n <p className=\"mt-3 text-sm text-muted-foreground\">Loading API Playground...</p>\n </div>\n </div>\n );\n}\n\nconst LazyDocsLayout = createLazyComponent(\n () => import('./components/DocsLayout').then((mod) => ({ default: mod.DocsLayout })),\n {\n displayName: 'LazyDocsLayout',\n fallback: <OpenapiLoadingFallback />,\n }\n);\n\nexport const LazyOpenapiViewer: React.FC<PlaygroundProps> = ({ config }) => {\n return (\n <PlaygroundProvider config={config}>\n <LazyDocsLayout />\n </PlaygroundProvider>\n );\n};\n\nLazyOpenapiViewer.displayName = 'LazyOpenapiViewer';\n","'use client';\n\n/**\n * Lazy-loaded JsonForm Component\n *\n * Heavy JSON Schema Form (~300KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { JsonSchemaForm } from '@djangocfg/ui-tools/json-form'\n */\n\nimport { createLazyComponent, CardLoadingFallback } from '../../components';\nimport type { JsonSchemaFormProps } from './types';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type { JsonSchemaFormProps };\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyJsonSchemaForm - Lazy-loaded JSON Schema form generator\n *\n * Automatically shows loading state while RJSF loads (~300KB)\n */\nexport const LazyJsonSchemaForm = createLazyComponent<JsonSchemaFormProps>(\n () => import('./JsonSchemaForm').then((mod) => ({ default: mod.JsonSchemaForm })),\n {\n displayName: 'LazyJsonSchemaForm',\n fallback: (\n <CardLoadingFallback\n title=\"Form\"\n description=\"Loading form schema...\"\n minHeight={200}\n />\n ),\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded LottiePlayer Component\n *\n * Lottie library (~200KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { LottiePlayer } from '@djangocfg/ui-tools/lottie'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { LottiePlayerProps } from './types';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type {\n LottiePlayerProps,\n LottieSize,\n LottieSpeed,\n LottieDirection,\n} from './types';\n\n// ============================================================================\n// Lottie Loading Fallback\n// ============================================================================\n\nfunction LottieLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-muted border-t-primary\" />\n <span className=\"text-sm text-muted-foreground\">Loading animation...</span>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyLottiePlayer - Lazy-loaded Lottie animation player\n *\n * Automatically shows loading state while Lottie loads (~200KB)\n */\nexport const LazyLottiePlayer = createLazyComponent<LottiePlayerProps>(\n () => import('./LottiePlayer.client').then((mod) => ({ default: mod.LottiePlayer })),\n {\n displayName: 'LazyLottiePlayer',\n fallback: <LottieLoadingFallback />,\n }\n);\n","'use client';\n\n/**\n * `@djangocfg/ui-tools/audio-player` subpath entrypoint.\n *\n * `LazyPlayer` is the only heavy export — it dynamically imports the full\n * `Player` tree (PlayerShell + Layout + Cover + Waveform + Controls + audio\n * decoding helpers). Everything else listed here is light:\n * - types are erased,\n * - the Zustand store, context hooks, and selectors carry no UI,\n * - the slot components (`Cover`, `Title`, `PlayButton`, `Waveform`, …)\n * are presentational React components that read from PlayerContext —\n * they only become meaningful inside a `<PlayerProvider>` (which only\n * exists inside `LazyPlayer` once loaded).\n *\n * Consumers building a fully custom layout: render `<LazyPlayer>` once to\n * get the provider, then arrange slot components inside via render-children\n * pattern, or use the bare `Player` re-exported from the root barrel.\n */\n\nimport { createLazyComponent } from '../../components';\nimport type { PlayerProps } from './types';\n\n// ============================================================================\n// Lazy heavy component\n// ============================================================================\n\nexport const LazyPlayer = createLazyComponent<PlayerProps>(\n () => import('./Player').then((mod) => ({ default: mod.Player })),\n {\n displayName: 'LazyAudioPlayer',\n fallback: (\n <div className=\"rounded-lg border border-border/60 bg-card px-4 py-6 text-sm text-muted-foreground\">\n Loading audio player…\n </div>\n ),\n },\n);\n\n// ============================================================================\n// Light surface — types, store, context, slot components, hooks\n// ============================================================================\n\n// Types\nexport type {\n PlayerProps,\n PlayerState,\n PlayerStateKind,\n PlayerControls,\n PlayerHandle,\n WaveformConfig,\n WaveformMode,\n ReactiveCoverMode,\n PlayerVariant,\n PlayerErrorReason,\n} from './types';\n\n// Context provider + selector hooks (no UI)\nexport {\n PlayerProvider,\n usePlayerAudio,\n usePlayerControls,\n usePlayerDuration,\n usePlayerLevels,\n usePlayerMeta,\n usePlayerPaused,\n usePlayerState,\n} from './context';\n\n// Cross-instance store (active player, preferences)\nexport {\n setActivePlayer,\n getActivePlayer,\n getLastActivePlayer,\n subscribeActivePlayer,\n getPreferences,\n setStoredVolume,\n setStoredMuted,\n subscribePreferences,\n type PlayerPreferences,\n} from './store';\n\n// Store-backed hooks\nexport {\n useActivePlayer,\n useLastActivePlayer,\n useIsActivePlayer,\n} from './hooks/useActivePlayer';\nexport { usePlayerPreferences } from './hooks/usePlayerPreferences';\n\n// Peak cache helpers\nexport { clearPeaksCache, setPeaks } from './audio';\n\n// Slot components — presentational, read from PlayerContext. Safe to\n// re-export synchronously: they don't import the heavy Player tree\n// (audio decoding, layouts, shell) — only context selectors and types.\nexport { Cover, CoverPlaceholder, ReactivePulse } from './parts/Cover';\nexport { Title, Artist, TimeDisplay } from './parts/Meta';\nexport {\n PlayButton,\n SkipButton,\n VolumeControl,\n LoopButton,\n ControlsRow,\n IconButton,\n} from './parts/Controls';\nexport {\n Waveform,\n PeaksWaveform,\n LiveWaveform,\n BarsWaveform,\n ProgressBar,\n WaveformSkeleton,\n} from './parts/Waveform';\nexport { ErrorState } from './parts/ErrorState';\nexport { DefaultLayout, CompactLayout } from './parts/Layout';\n","'use client';\n\n/**\n * Lazy-loaded VideoPlayer Component\n *\n * Heavy Vidstack (~150KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { VideoPlayer } from '@djangocfg/ui-tools/video'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { VideoPlayerProps } from './types';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type { VideoPlayerProps };\n\n// ============================================================================\n// Video Loading Fallback\n// ============================================================================\n\nfunction VideoLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center bg-black/90 rounded-lg aspect-video\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"relative\">\n <div className=\"h-10 w-10 animate-spin rounded-full border-4 border-white/20 border-t-white\" />\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <svg\n className=\"h-5 w-5 text-white/60\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n </div>\n </div>\n <span className=\"text-sm text-white/60\">Loading video player...</span>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyVideoPlayer - Lazy-loaded professional video player\n *\n * Automatically shows loading state while Vidstack loads (~150KB)\n */\nexport const LazyVideoPlayer = createLazyComponent<VideoPlayerProps>(\n () => import('./components').then((mod) => ({ default: mod.VideoPlayer })),\n {\n displayName: 'LazyVideoPlayer',\n fallback: <VideoLoadingFallback />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded JsonTree Component\n *\n * JsonTree (~100KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import JsonTree from '@djangocfg/ui-tools/json-tree'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { JsonTreeConfig, JsonTreeMode } from './index';\nimport type { CommonExternalProps } from 'react-json-tree';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface JsonTreeProps {\n title?: string;\n data: unknown;\n /**\n * Display mode:\n * - \"full\" (default): With toolbar and border\n * - \"compact\": No toolbar, subtle styling\n * - \"inline\": Minimal, no border\n */\n mode?: JsonTreeMode;\n config?: JsonTreeConfig;\n jsonTreeProps?: Partial<CommonExternalProps>;\n}\n\nexport type { JsonTreeConfig, JsonTreeMode };\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyJsonTree - Lazy-loaded JSON visualization tree\n *\n * Automatically shows loading state while JsonTree loads (~100KB)\n *\n * @example\n * // Full mode (with toolbar)\n * <LazyJsonTree data={obj} mode=\"full\" />\n *\n * // Compact mode (no toolbar)\n * <LazyJsonTree data={obj} mode=\"compact\" />\n *\n * // Inline mode (minimal, for embedding)\n * <LazyJsonTree data={obj} mode=\"inline\" />\n */\nexport const LazyJsonTree = createLazyComponent<JsonTreeProps>(\n () => import('./index'),\n {\n displayName: 'LazyJsonTree',\n fallback: <LoadingFallback minHeight={100} text=\"Loading JSON viewer...\" />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded ImageViewer Component\n *\n * ImageViewer (~50KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * For direct imports without lazy loading, use:\n * import { ImageViewer } from '@djangocfg/ui-tools/image-viewer'\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { ImageViewerProps } from './types';\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type { ImageViewerProps };\n\n// ============================================================================\n// Lazy Component\n// ============================================================================\n\n/**\n * LazyImageViewer - Lazy-loaded image viewer with zoom/pan/rotate\n *\n * Automatically shows loading state while ImageViewer loads (~50KB)\n */\nexport const LazyImageViewer = createLazyComponent<ImageViewerProps>(\n () => import('./components').then((mod) => ({ default: mod.ImageViewer })),\n {\n displayName: 'LazyImageViewer',\n fallback: <LoadingFallback minHeight={200} text=\"Loading image viewer...\" />,\n }\n);\n","'use client';\n\n/**\n * Lazy-loaded CronScheduler Component\n *\n * CronScheduler (~15KB) is loaded only when component is rendered.\n * Use this for automatic code-splitting with Suspense fallback.\n *\n * @example\n * import { LazyCronScheduler } from '@djangocfg/ui-tools';\n *\n * <LazyCronScheduler\n * value={cron}\n * onChange={setCron}\n * />\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components';\nimport type { CronSchedulerProps } from './types';\n\n// Re-export types\nexport type {\n CronSchedulerProps,\n ScheduleType,\n WeekDay,\n MonthDay,\n CronSchedulerState,\n} from './types';\n\n/**\n * LazyCronScheduler - Lazy-loaded cron expression builder\n *\n * Automatically shows loading state while CronScheduler loads (~15KB).\n * Uses createLazyComponent factory for optimal code-splitting.\n *\n * @example\n * // Basic usage\n * <LazyCronScheduler\n * value=\"0 9 * * *\"\n * onChange={handleChange}\n * />\n *\n * @example\n * // With all options\n * <LazyCronScheduler\n * value={cron}\n * onChange={setCron}\n * defaultType=\"weekly\"\n * showPreview\n * showCronExpression\n * allowCopy\n * timeFormat=\"24h\"\n * />\n */\nexport const LazyCronScheduler = createLazyComponent<CronSchedulerProps>(\n () => import('./CronScheduler.client'),\n {\n displayName: 'LazyCronScheduler',\n fallback: (\n <LoadingFallback\n minHeight={120}\n showText={false}\n className=\"rounded-lg\"\n />\n ),\n }\n);\n","'use client';\n\nimport { createLazyComponent, LoadingFallback } from '../../components/lazy-wrapper';\nimport type { TreeRootProps } from './types';\n\nexport const LazyTree = createLazyComponent<TreeRootProps<unknown>>(\n () => import('./TreeRoot'),\n {\n displayName: 'LazyTree',\n fallback: <LoadingFallback minHeight={200} text=\"Loading tree…\" />,\n },\n);\n\nexport type { TreeRootProps };\n","/**\n * Transport surface re-export. Lives in core so transport implementations\n * never need to reach into the public types module.\n */\n\nexport type {\n ChatTransport,\n ChatStreamEvent,\n CreateSessionOptions,\n SessionInfo,\n HistoryPage,\n StreamOptions,\n SendOptions,\n} from '../../types';\n\nexport class TransportError extends Error {\n code: string;\n\n constructor(message: string, code = 'transport_error') {\n super(message);\n this.name = 'TransportError';\n this.code = code;\n }\n}\n","/**\n * Server-Sent Events parser as an AsyncGenerator.\n *\n * Yields parsed events from a `Response` body. Handles the split-read case\n * where `event:` and `data:` arrive in separate TCP packets. Skips malformed\n * JSON gracefully. Honors AbortSignal (caller passes one to fetch).\n */\n\nimport type { ChatStreamEvent } from '../../types';\nimport { LIMITS } from '../../config';\n\ninterface RawEvent {\n event?: string;\n data?: string;\n}\n\nexport interface ParseSSEOptions {\n signal?: AbortSignal;\n /** Map a raw SSE event to zero, one, or many `ChatStreamEvent`s.\n * Default: parse `data` as JSON and assume the JSON shape already\n * matches `ChatStreamEvent`. */\n map?: (raw: RawEvent) => ChatStreamEvent | ChatStreamEvent[] | null;\n idleTimeoutMs?: number;\n}\n\nconst DEFAULT_MAP = (raw: RawEvent): ChatStreamEvent | null => {\n if (!raw.data) return null;\n try {\n const parsed = JSON.parse(raw.data) as ChatStreamEvent;\n if (raw.event && !('type' in parsed)) {\n return { ...(parsed as object), type: raw.event } as ChatStreamEvent;\n }\n return parsed;\n } catch {\n return null;\n }\n};\n\nexport async function* parseSSE(\n response: Response,\n options: ParseSSEOptions = {},\n): AsyncGenerator<ChatStreamEvent, void, void> {\n if (!response.body) {\n throw new Error('SSE response has no body');\n }\n\n const map = options.map ?? DEFAULT_MAP;\n const idleMs = options.idleTimeoutMs ?? LIMITS.sseIdleMs;\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let lastChunkAt = Date.now();\n\n const idleCheck = () => {\n if (Date.now() - lastChunkAt > idleMs) {\n throw new Error(`SSE idle timeout (${idleMs}ms)`);\n }\n };\n\n try {\n while (true) {\n if (options.signal?.aborted) {\n return;\n }\n const { value, done } = await reader.read();\n if (done) break;\n\n lastChunkAt = Date.now();\n buffer += decoder.decode(value, { stream: true });\n\n // Split on blank line which delimits SSE events.\n let separator = buffer.indexOf('\\n\\n');\n while (separator !== -1) {\n const rawBlock = buffer.slice(0, separator);\n buffer = buffer.slice(separator + 2);\n\n const raw = parseEventBlock(rawBlock);\n const evt = map(raw);\n if (evt) {\n if (Array.isArray(evt)) {\n for (const e of evt) yield e;\n } else {\n yield evt;\n }\n }\n\n separator = buffer.indexOf('\\n\\n');\n }\n\n idleCheck();\n }\n\n // Flush any trailing partial event.\n if (buffer.trim()) {\n const raw = parseEventBlock(buffer);\n const evt = map(raw);\n if (evt) {\n if (Array.isArray(evt)) {\n for (const e of evt) yield e;\n } else {\n yield evt;\n }\n }\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n /* ignore */\n }\n }\n}\n\nfunction parseEventBlock(block: string): RawEvent {\n const out: RawEvent = {};\n const lines = block.split(/\\r?\\n/);\n const dataLines: string[] = [];\n for (const line of lines) {\n if (!line || line.startsWith(':')) continue;\n const colon = line.indexOf(':');\n if (colon === -1) continue;\n const field = line.slice(0, colon).trim();\n const value = line.slice(colon + 1).replace(/^ /, '');\n if (field === 'event') out.event = value;\n else if (field === 'data') dataLines.push(value);\n }\n if (dataLines.length) out.data = dataLines.join('\\n');\n return out;\n}\n","/**\n * HTTP + SSE transport. Default implementation for web hosts.\n *\n * Backend contract (see @dev/@refactoring7-chat/06-integration.md):\n * POST /sessions → SessionInfo (JSON)\n * GET /sessions/:id/history?cursor= → HistoryPage (JSON)\n * POST /sessions/:id/messages → SSE stream of ChatStreamEvent\n * POST /sessions/:id/messages/buffered → ChatMessage (JSON, fallback)\n * DELETE /sessions/:id → 204\n */\n\nimport type {\n ChatMessage,\n ChatStreamEvent,\n ChatTransport,\n CreateSessionOptions,\n HistoryPage,\n SendOptions,\n SessionInfo,\n StreamOptions,\n} from '../../types';\nimport { TransportError } from './types';\nimport { parseSSE } from './sse';\n\nexport interface HttpTransportConfig {\n /** Base URL without trailing slash, e.g. '/api/chat' or 'https://api.example.com/v1/chat'. */\n baseUrl: string;\n /** Optional slug appended/forwarded as project identifier. */\n slug?: string;\n /** Returns headers applied to every request — e.g. Authorization. */\n getAuthHeader?: () => Record<string, string> | Promise<Record<string, string>>;\n /** Default fetch timeout (per non-streaming request). */\n timeoutMs?: number;\n /** Override fetch implementation (useful for tests or custom retry layers). */\n fetchImpl?: typeof fetch;\n}\n\nconst DEFAULT_TIMEOUT = 20_000;\n\nasync function jsonOrThrow<T>(res: Response, label: string): Promise<T> {\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new TransportError(\n `${label} failed (${res.status}): ${text || res.statusText}`,\n mapStatusToCode(res.status),\n );\n }\n try {\n return (await res.json()) as T;\n } catch {\n throw new TransportError(`${label} returned invalid JSON`, 'invalid_response');\n }\n}\n\nfunction mapStatusToCode(status: number): string {\n if (status === 401) return 'unauthorized';\n if (status === 403) return 'forbidden';\n if (status === 404) return 'not_found';\n if (status === 429) return 'rate_limited';\n if (status >= 500) return 'server_error';\n return 'http_error';\n}\n\nfunction withTimeout(signal: AbortSignal | undefined, timeoutMs: number): AbortSignal {\n const ctrl = new AbortController();\n const onAbort = () => ctrl.abort();\n signal?.addEventListener('abort', onAbort, { once: true });\n setTimeout(() => ctrl.abort(), timeoutMs);\n return ctrl.signal;\n}\n\nexport function createHttpTransport(config: HttpTransportConfig): ChatTransport {\n const fetchImpl = config.fetchImpl ?? fetch;\n const timeout = config.timeoutMs ?? DEFAULT_TIMEOUT;\n const base = config.baseUrl.replace(/\\/$/, '');\n\n async function buildHeaders(extra?: Record<string, string>): Promise<Record<string, string>> {\n const auth = (await config.getAuthHeader?.()) ?? {};\n return {\n 'Content-Type': 'application/json',\n ...auth,\n ...(extra ?? {}),\n };\n }\n\n return {\n async createSession(opts?: CreateSessionOptions): Promise<SessionInfo> {\n const res = await fetchImpl(`${base}/sessions`, {\n method: 'POST',\n headers: await buildHeaders(),\n body: JSON.stringify({ slug: config.slug, metadata: opts?.metadata ?? {} }),\n signal: withTimeout(undefined, timeout),\n });\n return jsonOrThrow<SessionInfo>(res, 'createSession');\n },\n\n async loadHistory(sessionId, cursor, limit): Promise<HistoryPage> {\n const params = new URLSearchParams();\n if (cursor) params.set('cursor', cursor);\n if (limit) params.set('limit', String(limit));\n const url = `${base}/sessions/${encodeURIComponent(sessionId)}/history${\n params.toString() ? `?${params.toString()}` : ''\n }`;\n const res = await fetchImpl(url, {\n method: 'GET',\n headers: await buildHeaders(),\n signal: withTimeout(undefined, timeout),\n });\n return jsonOrThrow<HistoryPage>(res, 'loadHistory');\n },\n\n async *stream(\n sessionId: string,\n content: string,\n options: StreamOptions,\n ): AsyncGenerator<ChatStreamEvent, void, void> {\n const url = `${base}/sessions/${encodeURIComponent(sessionId)}/messages`;\n const res = await fetchImpl(url, {\n method: 'POST',\n headers: await buildHeaders({ Accept: 'text/event-stream' }),\n body: JSON.stringify({\n content,\n attachments: options.attachments ?? [],\n metadata: options.metadata ?? {},\n }),\n signal: options.signal,\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new TransportError(\n `stream failed (${res.status}): ${text || res.statusText}`,\n mapStatusToCode(res.status),\n );\n }\n\n yield* parseSSE(res, { signal: options.signal });\n },\n\n async send(sessionId, content, options?: SendOptions): Promise<ChatMessage> {\n const url = `${base}/sessions/${encodeURIComponent(sessionId)}/messages/buffered`;\n const res = await fetchImpl(url, {\n method: 'POST',\n headers: await buildHeaders(),\n body: JSON.stringify({\n content,\n attachments: options?.attachments ?? [],\n metadata: options?.metadata ?? {},\n }),\n signal: options?.signal ?? withTimeout(undefined, timeout),\n });\n return jsonOrThrow<ChatMessage>(res, 'send');\n },\n\n async closeSession(sessionId: string): Promise<void> {\n const url = `${base}/sessions/${encodeURIComponent(sessionId)}`;\n const res = await fetchImpl(url, {\n method: 'DELETE',\n headers: await buildHeaders(),\n signal: withTimeout(undefined, timeout),\n });\n if (!res.ok && res.status !== 404) {\n throw new TransportError(`closeSession failed (${res.status})`, mapStatusToCode(res.status));\n }\n },\n };\n}\n","/**\n * In-memory chat transport for stories and tests. Replays scripted replies.\n */\n\nimport type {\n ChatMessage,\n ChatStreamEvent,\n ChatTransport,\n CreateSessionOptions,\n HistoryPage,\n SendOptions,\n SessionInfo,\n StreamOptions,\n} from '../../types';\nimport { createId } from '../ids';\n\nexport interface MockTransportOptions {\n /** Each entry is the assistant's reply for one user turn. Strings are split\n * into chunks; arrays are taken as the exact event sequence (after a\n * prepended `message_start` and before a synthetic `message_end`). */\n replies?: Array<string | ChatStreamEvent[]>;\n latencyMs?: number;\n /** Initial history returned by `createSession`. */\n initialMessages?: ChatMessage[];\n shouldFail?: (attempt: number) => boolean;\n}\n\nconst DEFAULT_REPLY = 'Hi there!';\n\nfunction splitForStream(text: string, parts = 4): string[] {\n if (!text) return [];\n const chunkSize = Math.max(1, Math.ceil(text.length / parts));\n const out: string[] = [];\n for (let i = 0; i < text.length; i += chunkSize) {\n out.push(text.slice(i, i + chunkSize));\n }\n return out;\n}\n\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nexport function createMockTransport(opts: MockTransportOptions = {}): ChatTransport {\n const replies = opts.replies?.length ? opts.replies : [DEFAULT_REPLY];\n const latency = opts.latencyMs ?? 30;\n const history: ChatMessage[] = [...(opts.initialMessages ?? [])];\n let turn = 0;\n let attempt = 0;\n\n return {\n async createSession(_opts?: CreateSessionOptions): Promise<SessionInfo> {\n await sleep(latency);\n return {\n sessionId: createId('s'),\n messages: history.length ? [...history] : undefined,\n hasMore: false,\n cursor: null,\n resumed: history.length > 0,\n };\n },\n\n async loadHistory(_sid, _cursor, _limit): Promise<HistoryPage> {\n await sleep(latency);\n return { messages: [], hasMore: false, nextCursor: null };\n },\n\n async *stream(\n _sid: string,\n content: string,\n options: StreamOptions,\n ): AsyncGenerator<ChatStreamEvent, void, void> {\n attempt += 1;\n if (opts.shouldFail?.(attempt)) {\n throw new Error('mock transport scripted failure');\n }\n\n // Record the user message for any subsequent loadHistory.\n history.push({\n id: createId('u'),\n role: 'user',\n content,\n createdAt: Date.now(),\n });\n\n const messageId = createId('a');\n yield { type: 'message_start', messageId, sessionId: _sid };\n\n const reply = replies[turn % replies.length];\n turn += 1;\n\n if (typeof reply === 'string') {\n for (const piece of splitForStream(reply)) {\n if (options.signal.aborted) return;\n await sleep(latency);\n yield { type: 'chunk', delta: piece };\n }\n yield { type: 'message_end', tokensIn: content.length, tokensOut: reply.length };\n } else {\n for (const ev of reply) {\n if (options.signal.aborted) return;\n await sleep(latency);\n yield ev;\n }\n // If the script didn't end the message itself, do it for them.\n const lastType = reply[reply.length - 1]?.type;\n if (lastType !== 'message_end' && lastType !== 'error') {\n yield { type: 'message_end' };\n }\n }\n },\n\n async send(_sid, content, _options?: SendOptions): Promise<ChatMessage> {\n await sleep(latency);\n const reply = replies[turn % replies.length];\n turn += 1;\n const text =\n typeof reply === 'string'\n ? reply\n : reply\n .filter((e) => e.type === 'chunk')\n .map((e) => (e as { delta: string }).delta)\n .join('');\n return {\n id: createId('a'),\n role: 'assistant',\n content: text || DEFAULT_REPLY,\n createdAt: Date.now(),\n };\n },\n\n async closeSession(_sid: string): Promise<void> {\n // no-op\n },\n };\n}\n","/**\n * Pydantic-AI SSE event mapper.\n *\n * Translates the event shape emitted by pydantic-AI–style Django backends\n * (text_delta / tool_call / tool_result / done / error / approval_required)\n * into the canonical `ChatStreamEvent` stream consumed by the Chat reducer.\n *\n * Backends that don't expose a stable `tool_call_id` are supported via a\n * per-stream FIFO queue keyed by tool name. The earlier \"Map<name, toolId>\"\n * approach lost the first toolId when a tool was invoked twice in one turn\n * (e.g. `list_tasks` for search and again for confirmation) — using a queue\n * keeps each call/result pair correctly matched.\n */\n\nimport type { ChatStreamEvent } from '../../../types';\nimport type { ParseSSEOptions } from '../sse';\n\nexport interface PydanticAIEvent {\n type:\n | 'text_delta'\n | 'tool_call'\n | 'tool_result'\n | 'done'\n | 'error'\n | 'approval_required';\n delta?: string;\n tool?: string;\n args?: unknown;\n result?: unknown;\n /**\n * Structured frontend payload — present on `tool_result` when the tool has\n * a `result_schema`. The LLM sees only `result` (compact text); the\n * frontend uses `data` to render rich UI (e.g. vehicle cards).\n */\n data?: unknown;\n total_tokens?: number;\n error?: string;\n tool_call_id?: string;\n session_id?: string;\n}\n\n/** Per-stream FIFO queue keyed by tool name. Created via `createToolIdQueue`. */\nexport interface ToolIdQueue {\n /** Allocate a new toolId for a `tool_call` event and enqueue it under `name`. */\n push(name: string): string;\n /** Pop the oldest toolId for `name` (or return an orphan marker if none). */\n shift(name: string): string;\n /** Reset all queues (e.g. on stream close). */\n clear(): void;\n}\n\nexport function createToolIdQueue(): ToolIdQueue {\n const queues = new Map<string, string[]>();\n let counter = 0;\n return {\n push(name) {\n const id = `${name}-${counter++}-${Date.now()}`;\n const q = queues.get(name) ?? [];\n q.push(id);\n queues.set(name, q);\n return id;\n },\n shift(name) {\n return queues.get(name)?.shift() ?? `${name}-orphan-${counter++}`;\n },\n clear() {\n queues.clear();\n },\n };\n}\n\n/**\n * Translate a single pydantic-AI event into zero or more `ChatStreamEvent`s.\n * Pass a `ToolIdQueue` shared across the lifetime of one stream so that\n * `tool_call` / `tool_result` pairs match correctly.\n */\nexport function* mapPydanticAIEvent(\n ev: PydanticAIEvent,\n toolIds: ToolIdQueue,\n): Generator<ChatStreamEvent> {\n switch (ev.type) {\n case 'text_delta':\n if (ev.delta) yield { type: 'chunk', delta: ev.delta };\n return;\n\n case 'tool_call': {\n const name = ev.tool ?? 'tool';\n const toolId = toolIds.push(name);\n yield { type: 'tool_call_start', toolId, name, input: ev.args };\n return;\n }\n\n case 'tool_result': {\n const name = ev.tool ?? 'tool';\n const toolId = toolIds.shift(name);\n // `data` is the structured JSON for the frontend; `result` is the LLM-facing text.\n const output: unknown = ev.data !== undefined ? ev.data : ev.result;\n yield { type: 'tool_call_end', toolId, output, status: 'success' };\n return;\n }\n\n case 'done':\n yield { type: 'message_end', tokensOut: ev.total_tokens };\n return;\n\n case 'error':\n yield { type: 'error', code: 'backend_error', message: ev.error ?? 'Unknown error' };\n return;\n\n case 'approval_required':\n // Surfaced via a separate side-channel (see ResumableTransport in\n // host packages). Not translated to a ChatStreamEvent here.\n return;\n }\n}\n\n/**\n * Convenience factory: returns a `ParseSSEOptions['map']` callback that\n * decodes raw SSE frames as `PydanticAIEvent` JSON and yields zero or\n * more `ChatStreamEvent`s through `mapPydanticAIEvent`.\n *\n * Allocates an internal `ToolIdQueue` — call this once per stream.\n */\nexport function createPydanticAISSEMap(): NonNullable<ParseSSEOptions['map']> {\n const toolIds = createToolIdQueue();\n return (raw) => {\n if (!raw.data) return null;\n let parsed: PydanticAIEvent;\n try {\n parsed = JSON.parse(raw.data) as PydanticAIEvent;\n } catch {\n return null;\n }\n const out: ChatStreamEvent[] = [];\n for (const evt of mapPydanticAIEvent(parsed, toolIds)) {\n out.push(evt);\n }\n if (out.length === 0) return null;\n if (out.length === 1) return out[0]!;\n return out;\n };\n}\n","/**\n * High-level transport factory for pydantic-AI–style backends.\n *\n * Composes:\n * - `parseSSE` for spec-compliant SSE framing (multi-line `data:`, comments, idle timeout).\n * - `createPydanticAISSEMap` for normalizing pydantic-AI events into `ChatStreamEvent`.\n *\n * Use when your backend speaks the canonical pydantic-AI stream shape\n * (`text_delta` / `tool_call` / `tool_result` / `done` / `error`).\n * URL building, auth headers, history loading, and optional session\n * bootstrapping are caller responsibilities — pass them in.\n */\n\nimport type {\n ChatMessage,\n ChatStreamEvent,\n ChatTransport,\n CreateSessionOptions,\n HistoryPage,\n SendOptions,\n SessionInfo,\n StreamOptions,\n} from '../../types';\nimport { TransportError } from './types';\nimport { parseSSE } from './sse';\nimport {\n createPydanticAISSEMap,\n mapPydanticAIEvent,\n createToolIdQueue,\n type PydanticAIEvent,\n} from './mappers';\n\nexport interface PydanticAIChatTransportOpts {\n /**\n * Build the SSE stream URL for a user message turn.\n * @example (sessionId, message) => `${base}/stream?session_id=${sessionId}&message=${encodeURIComponent(message)}`\n */\n buildStreamUrl: (sessionId: string, message: string) => string | URL;\n\n /** Optional history loader. If omitted, `loadHistory` returns an empty page. */\n loadHistory?: (sessionId: string, cursor?: string | null) => Promise<HistoryPage>;\n\n /**\n * Optional session bootstrap. Called from `createSession`. Useful for\n * backends that need a `POST /sessions` round-trip or want to pre-seed\n * history.\n */\n bootstrapSession?: (opts?: CreateSessionOptions) => Promise<SessionInfo>;\n\n /** Optional session teardown. */\n closeSession?: (sessionId: string) => Promise<void>;\n\n /**\n * Optional non-streaming send (for hosts that need a buffered fallback,\n * e.g. when the user disables streaming). Defaults to throwing — most\n * hosts only use streaming.\n */\n send?: (\n sessionId: string,\n content: string,\n options?: SendOptions,\n ) => Promise<ChatMessage>;\n\n /** Request headers (Authorization, content-type, etc.). */\n buildHeaders?: () => HeadersInit | Promise<HeadersInit>;\n\n /** Override fetch (tests, retry layers). */\n fetchImpl?: typeof fetch;\n\n /**\n * HTTP method for the stream request. Defaults to `'POST'` with\n * `{ content, attachments, metadata }` JSON body. Set to `'GET'` if\n * your backend embeds the message in the URL via `buildStreamUrl`.\n */\n streamMethod?: 'GET' | 'POST';\n\n /** Idle timeout for the SSE connection, in ms. Forwarded to `parseSSE`. */\n idleTimeoutMs?: number;\n\n /**\n * Side-channel for events that don't translate to `ChatStreamEvent`\n * (e.g. `approval_required` — surfaces interactive prompts outside the\n * normal message stream). Called synchronously while parsing the SSE\n * frame; mutate caller-owned state, don't `await` long work here.\n */\n onPydanticEvent?: (event: PydanticAIEvent) => void;\n}\n\nconst DEFAULT_SESSION_ID = 'default';\n\nfunction mapStatusToCode(status: number): string {\n if (status === 401 || status === 403) return 'unauthorized';\n if (status === 404) return 'not_found';\n if (status === 408) return 'timeout';\n if (status === 429) return 'rate_limited';\n if (status >= 500) return 'server_error';\n return 'error';\n}\n\nexport function createPydanticAIChatTransport(\n opts: PydanticAIChatTransportOpts,\n): ChatTransport {\n const fetchImpl = opts.fetchImpl ?? fetch.bind(globalThis);\n const streamMethod = opts.streamMethod ?? 'POST';\n\n async function resolvedHeaders(extra?: Record<string, string>): Promise<Headers> {\n const base = opts.buildHeaders ? await opts.buildHeaders() : {};\n const headers = new Headers(base as HeadersInit);\n if (extra) {\n for (const [k, v] of Object.entries(extra)) headers.set(k, v);\n }\n return headers;\n }\n\n return {\n async createSession(createOpts) {\n if (opts.bootstrapSession) return opts.bootstrapSession(createOpts);\n return { sessionId: DEFAULT_SESSION_ID };\n },\n\n async loadHistory(sessionId, cursor) {\n if (opts.loadHistory) return opts.loadHistory(sessionId, cursor);\n return { messages: [], hasMore: false, nextCursor: null };\n },\n\n async *stream(\n sessionId: string,\n content: string,\n options: StreamOptions,\n ): AsyncGenerator<ChatStreamEvent, void, void> {\n const url = opts.buildStreamUrl(sessionId, content);\n\n const headers = await resolvedHeaders({ Accept: 'text/event-stream' });\n const init: RequestInit = {\n method: streamMethod,\n headers,\n signal: options.signal,\n };\n if (streamMethod === 'POST') {\n headers.set('Content-Type', 'application/json');\n init.body = JSON.stringify({\n content,\n attachments: options.attachments ?? [],\n metadata: options.metadata ?? {},\n });\n }\n\n const res = await fetchImpl(typeof url === 'string' ? url : url.toString(), init);\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new TransportError(\n `stream failed (${res.status}): ${text || res.statusText}`,\n mapStatusToCode(res.status),\n );\n }\n\n const sideChannel = opts.onPydanticEvent;\n if (!sideChannel) {\n yield* parseSSE(res, {\n signal: options.signal,\n idleTimeoutMs: opts.idleTimeoutMs,\n map: createPydanticAISSEMap(),\n });\n return;\n }\n\n // Side-channel mode: parse the raw pydantic event, fire callback,\n // then forward through the canonical mapper.\n const toolIds = createToolIdQueue();\n yield* parseSSE(res, {\n signal: options.signal,\n idleTimeoutMs: opts.idleTimeoutMs,\n map: (raw) => {\n if (!raw.data) return null;\n let parsed: PydanticAIEvent;\n try {\n parsed = JSON.parse(raw.data) as PydanticAIEvent;\n } catch {\n return null;\n }\n try {\n sideChannel(parsed);\n } catch {\n // Side-channel handler must not break the stream.\n }\n const out: ChatStreamEvent[] = [];\n for (const evt of mapPydanticAIEvent(parsed, toolIds)) out.push(evt);\n if (out.length === 0) return null;\n if (out.length === 1) return out[0]!;\n return out;\n },\n });\n },\n\n async send(sessionId, content, sendOpts) {\n if (opts.send) return opts.send(sessionId, content, sendOpts);\n throw new TransportError(\n 'Buffered send is not supported by this transport',\n 'unsupported',\n );\n },\n\n async closeSession(sessionId) {\n if (opts.closeSession) await opts.closeSession(sessionId);\n },\n };\n}\n","'use client';\n\nimport { type RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\n/**\n * @deprecated Plan64. As of ui-tools 2.1.369, `<MessageList>` is\n * virtualized via react-virtuoso and owns its own scroll viewport.\n * Sticky-bottom + auto-follow on streaming live inside the component;\n * use the new `MessageListProps.onAtBottomChange` prop and the\n * `MessageListHandle.scrollToBottom()` imperative method instead.\n *\n * This hook is kept for hosts that render messages outside\n * `<MessageList>` (e.g. headless story shells, custom non-virtualized\n * scroll containers). It still works against any HTMLElement scroll\n * container, but it does NOT integrate with Virtuoso — passing a\n * Virtuoso-managed element here will read garbage scroll metrics.\n */\nexport interface UseChatScrollOptions {\n containerRef: RefObject<HTMLElement | null>;\n bottomRef: RefObject<HTMLElement | null>;\n isStreaming?: boolean;\n /** Distance from bottom (px) considered \"at bottom\". */\n bottomThresholdPx?: number;\n /** Bump key — increment when a new message arrives so the hook re-evaluates auto-scroll. */\n messagesCount?: number;\n}\n\nexport interface UseChatScrollReturn {\n isAtBottom: boolean;\n unreadCount: number;\n scrollToBottom: (smooth?: boolean) => void;\n resetUnread: () => void;\n}\n\nexport function useChatScroll(options: UseChatScrollOptions): UseChatScrollReturn {\n const {\n containerRef,\n bottomRef,\n isStreaming = false,\n bottomThresholdPx = 80,\n messagesCount = 0,\n } = options;\n\n const [isAtBottom, setIsAtBottom] = useState(true);\n const [unreadCount, setUnreadCount] = useState(0);\n const lastCountRef = useRef(messagesCount);\n const stickyRef = useRef(true);\n const wasStreamingRef = useRef(isStreaming);\n\n const scrollToBottom = useCallback(\n (smooth = false) => {\n const el = containerRef.current;\n if (!el) return;\n el.scrollTo({\n top: el.scrollHeight,\n behavior: smooth ? 'smooth' : 'auto',\n });\n stickyRef.current = true;\n setIsAtBottom(true);\n setUnreadCount(0);\n },\n [containerRef],\n );\n\n const resetUnread = useCallback(() => setUnreadCount(0), []);\n\n // Track scroll position relative to bottom.\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n const onScroll = () => {\n const distance = el.scrollHeight - el.scrollTop - el.clientHeight;\n const atBottom = distance <= bottomThresholdPx;\n stickyRef.current = atBottom;\n setIsAtBottom(atBottom);\n if (atBottom) setUnreadCount(0);\n };\n onScroll();\n el.addEventListener('scroll', onScroll, { passive: true });\n return () => {\n el.removeEventListener('scroll', onScroll);\n };\n }, [containerRef, bottomThresholdPx]);\n\n // Stick to bottom while streaming, and one extra rAF after stream ends so\n // the final layout (markdown re-render, sources/tool-call panels) doesn't\n // push the latest content out of view.\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n\n if (isStreaming) {\n wasStreamingRef.current = true;\n if (!stickyRef.current) return;\n let raf = 0;\n const tick = () => {\n if (!stickyRef.current) return;\n el.scrollTop = el.scrollHeight;\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(raf);\n }\n\n // Stream just ended — flush one more scroll on the next two frames so\n // both markdown swap and any post-stream panel insertions are reflected.\n if (wasStreamingRef.current && stickyRef.current) {\n wasStreamingRef.current = false;\n let raf1 = 0;\n let raf2 = 0;\n raf1 = requestAnimationFrame(() => {\n el.scrollTop = el.scrollHeight;\n raf2 = requestAnimationFrame(() => {\n el.scrollTop = el.scrollHeight;\n });\n });\n return () => {\n cancelAnimationFrame(raf1);\n cancelAnimationFrame(raf2);\n };\n }\n wasStreamingRef.current = false;\n return;\n }, [containerRef, isStreaming]);\n\n // On message count increase, decide whether to scroll or bump unread.\n useEffect(() => {\n if (messagesCount > lastCountRef.current) {\n if (stickyRef.current) {\n const el = containerRef.current;\n if (el) el.scrollTop = el.scrollHeight;\n } else {\n setUnreadCount((n) => n + (messagesCount - lastCountRef.current));\n }\n }\n lastCountRef.current = messagesCount;\n }, [containerRef, messagesCount]);\n\n // Watch bottom sentinel just for symmetry/future hooks.\n useEffect(() => {\n void bottomRef;\n }, [bottomRef]);\n\n return { isAtBottom, unreadCount, scrollToBottom, resetUnread };\n}\n","'use client';\n\nimport { type RefObject, useEffect, useRef } from 'react';\n\nexport interface UseChatHistoryOptions {\n enabled?: boolean;\n containerRef: RefObject<HTMLElement | null>;\n topSentinelRef: RefObject<HTMLElement | null>;\n hasMore: boolean;\n isLoadingMore: boolean;\n loadMore: () => Promise<void>;\n}\n\n/** Triggers `loadMore` when the top sentinel enters the container's viewport.\n * Preserves scroll anchor: if the container's height grows after load, we\n * bump scrollTop by the delta so the previously-visible message stays put. */\nexport function useChatHistory(options: UseChatHistoryOptions): void {\n const { enabled = true, containerRef, topSentinelRef, hasMore, isLoadingMore, loadMore } = options;\n const heightBeforeRef = useRef<number | null>(null);\n\n // Restore anchor after content prepends.\n useEffect(() => {\n if (heightBeforeRef.current == null) return;\n const el = containerRef.current;\n if (!el) {\n heightBeforeRef.current = null;\n return;\n }\n if (!isLoadingMore) {\n const delta = el.scrollHeight - heightBeforeRef.current;\n if (delta > 0) {\n el.scrollTop += delta;\n }\n heightBeforeRef.current = null;\n }\n }, [containerRef, isLoadingMore]);\n\n useEffect(() => {\n if (!enabled || !hasMore) return;\n const sentinel = topSentinelRef.current;\n const root = containerRef.current;\n if (!sentinel || !root) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n if (!entry?.isIntersecting) return;\n if (isLoadingMore) return;\n const el = containerRef.current;\n if (el) heightBeforeRef.current = el.scrollHeight;\n void loadMore();\n },\n { root, threshold: 0, rootMargin: '200px 0px 0px 0px' },\n );\n\n observer.observe(sentinel);\n return () => observer.disconnect();\n }, [enabled, hasMore, isLoadingMore, containerRef, topSentinelRef, loadMore]);\n}\n","'use client';\n\nimport { useCallback, useState } from 'react';\n\nimport type { ChatAttachment } from '../types';\n\nexport type ChatLightboxScope = 'message' | 'conversation';\n\nexport interface ChatLightboxState {\n gallery: ChatAttachment[];\n index: number;\n}\n\nexport interface UseChatLightboxReturn {\n state: ChatLightboxState | null;\n open: (att: ChatAttachment, gallery?: ChatAttachment[]) => void;\n close: () => void;\n}\n\n/** Tiny state container for an image lightbox. The host owns the modal +\n * `<LazyImageViewer>` mount; we just track which gallery to show. */\nexport function useChatLightbox(): UseChatLightboxReturn {\n const [state, setState] = useState<ChatLightboxState | null>(null);\n\n const open = useCallback((att: ChatAttachment, gallery?: ChatAttachment[]) => {\n const list = gallery && gallery.length ? gallery : [att];\n const idx = list.findIndex((a) => a.id === att.id);\n setState({ gallery: list, index: idx === -1 ? 0 : idx });\n }, []);\n\n const close = useCallback(() => setState(null), []);\n\n return { state, open, close };\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nconst DEFAULT_STORAGE_KEY = 'chat.visitor.fingerprint';\n\nfunction generate(): string {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return crypto.randomUUID();\n }\n return `v-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport interface UseVisitorFingerprintOptions {\n /** localStorage key. @default 'chat.visitor.fingerprint' */\n storageKey?: string;\n}\n\n/**\n * Persistent anonymous visitor id, kept in `localStorage`.\n *\n * Returns `null` on the first render (SSR-safe) and the stable id from\n * the second render onwards. Use as `fingerprint` for public chat\n * transports that need to dedupe sessions per visitor without auth.\n */\nexport function useVisitorFingerprint(\n opts: UseVisitorFingerprintOptions = {},\n): string | null {\n const storageKey = opts.storageKey ?? DEFAULT_STORAGE_KEY;\n const [fp, setFp] = useState<string | null>(null);\n\n useEffect(() => {\n let value: string | null = null;\n try {\n value = window.localStorage.getItem(storageKey);\n if (!value) {\n value = generate();\n window.localStorage.setItem(storageKey, value);\n }\n } catch {\n // Private mode / storage disabled — fall back to ephemeral.\n value = generate();\n }\n setFp(value);\n }, [storageKey]);\n\n return fp;\n}\n","'use client';\n\nimport { useCallback } from 'react';\n\nimport { useLocalStorage } from '@djangocfg/ui-core/hooks';\n\nimport type { ChatDockMode, ChatDockSide } from '../launcher/ChatDock';\n\nexport interface ChatDockPrefs {\n /** Popover (FAB-style) or side-docked panel. */\n mode: ChatDockMode;\n /** Which edge the side dock attaches to. */\n side: ChatDockSide;\n /** Width in px when side-docked (resizable in the future). */\n sideWidth: number;\n}\n\nexport const DEFAULT_DOCK_PREFS: ChatDockPrefs = {\n mode: 'popover',\n side: 'right',\n sideWidth: 420,\n};\n\nconst DEFAULT_KEY = 'chat.dock.prefs';\n\nexport interface UseChatDockPrefsOptions {\n /** localStorage key. @default 'chat.dock.prefs' */\n storageKey?: string;\n /** Override the baseline defaults (per-product branding, etc.). */\n defaults?: Partial<ChatDockPrefs>;\n}\n\nexport interface UseChatDockPrefsReturn extends ChatDockPrefs {\n /** Merge-update — pass only the fields that changed. */\n setPrefs: (patch: Partial<ChatDockPrefs>) => void;\n /** Convenience toggle: popover ⇆ side. */\n toggleMode: () => void;\n /** Convenience toggle: right ⇆ left (only affects side mode). */\n toggleSide: () => void;\n /** Reset to defaults. */\n reset: () => void;\n}\n\n/**\n * Persistent dock preferences (mode / side / width) via ui-core localStorage.\n *\n * SSR-safe: returns defaults on the server, hydrates on mount.\n * Survives reloads — power users keep their preferred chat layout.\n */\nexport function useChatDockPrefs(opts: UseChatDockPrefsOptions = {}): UseChatDockPrefsReturn {\n const key = opts.storageKey ?? DEFAULT_KEY;\n const initial: ChatDockPrefs = { ...DEFAULT_DOCK_PREFS, ...opts.defaults };\n\n const [prefs, setStored] = useLocalStorage<ChatDockPrefs>(key, initial);\n\n const setPrefs = useCallback(\n (patch: Partial<ChatDockPrefs>) => {\n setStored((prev) => ({ ...prev, ...patch }));\n },\n [setStored],\n );\n\n const toggleMode = useCallback(() => {\n setStored((prev) => ({ ...prev, mode: prev.mode === 'side' ? 'popover' : 'side' }));\n }, [setStored]);\n\n const toggleSide = useCallback(() => {\n setStored((prev) => ({ ...prev, side: prev.side === 'right' ? 'left' : 'right' }));\n }, [setStored]);\n\n const reset = useCallback(() => setStored(initial), [setStored, initial]);\n\n return { ...prefs, setPrefs, toggleMode, toggleSide, reset };\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useChatContext } from '../context';\nimport type { ChatMessage } from '../types';\n\nexport interface UseChatUnreadOptions {\n /**\n * When true, unread state is auto-cleared (treated as \"user is reading\n * the chat right now\"). Pass your dock-open boolean here so the badge\n * resets the moment the user opens the chat.\n */\n open?: boolean;\n /**\n * Which message roles count as \"unread\". Defaults to `['assistant']` —\n * we only count inbound replies, not the user's own messages.\n */\n countRoles?: Array<ChatMessage['role']>;\n}\n\nexport interface UseChatUnreadReturn {\n /** Most-recent inbound message since the last mark-as-read. */\n unread: ChatMessage | null;\n /** Total inbound messages since the last mark-as-read. */\n count: number;\n /** Manually clear the unread state. */\n markRead: () => void;\n}\n\n/**\n * Track inbound chat messages while the user isn't watching.\n *\n * Must be called **inside** the chat's `<ChatProvider>` (i.e. inside the\n * `children` of `ChatLauncher`, alongside `ChatRoot`).\n *\n * @example\n * ```tsx\n * function ChatRootWithUnreadBadge({ open, onUnread }: { open: boolean; onUnread: (m: ChatMessage | null) => void }) {\n * const { unread, count, markRead } = useChatUnread({ open });\n * useEffect(() => onUnread(unread), [unread, onUnread]);\n * // pass `count` to your FAB badge via the host's state\n * return <ChatRoot transport={transport} />;\n * }\n * ```\n *\n * For end-to-end wiring with `<ChatLauncher unreadMessage onMarkRead>`,\n * see the `Launcher / WithLivePush` story.\n */\nexport function useChatUnread(opts: UseChatUnreadOptions = {}): UseChatUnreadReturn {\n const { open = false, countRoles = ['assistant'] } = opts;\n const ctx = useChatContext();\n\n const [lastSeenId, setLastSeenId] = useState<string | null>(null);\n // On first mount, treat the current tail as already seen so old history\n // doesn't immediately register as unread.\n const initialized = useRef(false);\n useEffect(() => {\n if (initialized.current) return;\n initialized.current = true;\n const tail = ctx.messages[ctx.messages.length - 1];\n setLastSeenId(tail?.id ?? null);\n }, [ctx.messages]);\n\n // While the dock is open, auto-advance the seen pointer to the tail so\n // count stays at 0.\n useEffect(() => {\n if (!open) return;\n const tail = ctx.messages[ctx.messages.length - 1];\n setLastSeenId(tail?.id ?? null);\n }, [open, ctx.messages]);\n\n // Compute unread tail since `lastSeenId`.\n const seenIdx = lastSeenId\n ? ctx.messages.findIndex((m) => m.id === lastSeenId)\n : -1;\n const after = seenIdx === -1 ? ctx.messages : ctx.messages.slice(seenIdx + 1);\n const inbound = after.filter((m) => countRoles.includes(m.role));\n const unread = inbound.length > 0 ? inbound[inbound.length - 1]! : null;\n\n const markRead = useCallback(() => {\n const tail = ctx.messages[ctx.messages.length - 1];\n setLastSeenId(tail?.id ?? null);\n }, [ctx.messages]);\n\n return { unread, count: inbound.length, markRead };\n}\n","// Thin re-export — audio prefs storage now lives in `@djangocfg/ui-core/hooks`.\n// Existing direct consumers (`AudioToggle`) keep working through this wrapper.\n\n'use client';\n\nimport { createAudioPrefsStore, type AudioPrefsState } from '@djangocfg/ui-core/hooks';\n\nimport type { ChatAudioEvent } from './types';\n\nconst STORAGE_KEY = 'djangocfg-chat-audio:prefs';\n\nexport type ChatAudioPrefsState = AudioPrefsState<ChatAudioEvent>;\n\nexport const useChatAudioPrefs = createAudioPrefsStore<ChatAudioEvent>(STORAGE_KEY);\n","// Tiny dispatcher for tool-call payload renderers.\n//\n// Hosts compose matchers (predicate + render) and a fallback. The result is a\n// `renderPayload` function compatible with `<ToolCalls renderPayload>`.\n//\n// Pure — no React, no DOM. The matchers themselves return ReactNode.\n\nimport type { ReactNode } from 'react';\n\nimport type { ChatToolCall } from '../types';\nimport type { ToolPayloadKind } from '../components/ToolCalls';\n\nexport interface ToolPayloadMatcher {\n /** Cheap predicate. First match wins. */\n match: (value: unknown, kind: ToolPayloadKind, call: ChatToolCall) => boolean;\n render: (value: unknown, kind: ToolPayloadKind, call: ChatToolCall) => ReactNode;\n}\n\nexport type ToolPayloadFallback = (\n value: unknown,\n kind: ToolPayloadKind,\n call: ChatToolCall,\n) => ReactNode;\n\nexport function dispatchToolPayload(\n matchers: ToolPayloadMatcher[],\n fallback: ToolPayloadFallback,\n): ToolPayloadFallback {\n return (value, kind, call) => {\n for (const m of matchers) {\n if (m.match(value, kind, call)) return m.render(value, kind, call);\n }\n return fallback(value, kind, call);\n };\n}\n\n// ---- Common matcher predicates -------------------------------------------\n// Re-export as building blocks. Hosts can use directly or compose.\n\nexport function isPlainObject(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v);\n}\n\nexport function isLatLng(v: unknown): v is { lat: number; lng: number } {\n return isPlainObject(v) && typeof v.lat === 'number' && typeof v.lng === 'number';\n}\n\nexport function isGeoJSONFeatureCollection(v: unknown): v is { type: 'FeatureCollection'; features: unknown[] } {\n return isPlainObject(v) && v.type === 'FeatureCollection' && Array.isArray(v.features);\n}\n\nexport function isStringValue(v: unknown): v is string {\n return typeof v === 'string';\n}\n","import type { ChatAttachment, ChatMessage } from '../types';\n\n/** Walk the conversation and collect image attachments in chronological order. */\nexport function collectImageAttachments(messages: ChatMessage[]): ChatAttachment[] {\n const out: ChatAttachment[] = [];\n for (const m of messages) {\n if (!m.attachments) continue;\n for (const a of m.attachments) {\n if (a.type === 'image') out.push(a);\n }\n }\n return out;\n}\n","'use client';\n\n/**\n * Mute / unmute toggle for chat audio events.\n *\n * Reads the current ``muted`` state from the active chat context and\n * persists changes through ``useChatAudioPrefs`` (cross-tab safe). The\n * button auto-hides when no ``audio.sounds`` config is provided —\n * showing a mute toggle for a chat with no sounds is just clutter.\n *\n * Drop into a ChatRoot ``header`` slot or anywhere inside a chat\n * provider:\n *\n * ```tsx\n * <ChatRoot\n * header={<AudioToggle />}\n * audio={{ sounds: { messageReceived: '/ping.mp3' } }}\n * ...\n * />\n * ```\n */\n\nimport { Volume2, VolumeX } from 'lucide-react';\n\nimport { Button } from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useChatContextOptional } from '../context';\nimport { useChatAudioPrefs } from '../core/audio/preferences';\n\nexport interface AudioToggleProps {\n /** Visual size — matches Button sizes. Default: ``icon``. */\n size?: 'sm' | 'icon';\n /** Variant passed to the underlying Button. Default: ``ghost``. */\n variant?: 'ghost' | 'outline' | 'secondary';\n /** Force-show even when no audio config is wired (e.g. for stories). */\n alwaysShow?: boolean;\n className?: string;\n}\n\nexport function AudioToggle({\n size = 'icon',\n variant = 'ghost',\n alwaysShow = false,\n className,\n}: AudioToggleProps) {\n // Read straight from the persist store so the toggle works even\n // when rendered OUTSIDE the ChatRoot (e.g. in a parent header). The\n // chat audio bus reads the same store, so a click here flips the\n // \"muted\" state for any sibling ChatRoot in the same tab and\n // mirrors across tabs via the storage event.\n const muted = useChatAudioPrefs((s) => s.muted);\n const setMuted = useChatAudioPrefs((s) => s.setMuted);\n\n // If a ChatRoot is in scope, hide unless it actually wired sounds —\n // otherwise the button is a no-op for that surface. When rendered\n // standalone (no context), default to visible.\n const ctx = useChatContextOptional();\n if (ctx && !ctx.hasAudio && !alwaysShow) return null;\n\n const Icon = muted ? VolumeX : Volume2;\n const label = muted ? 'Unmute chat sounds' : 'Mute chat sounds';\n\n return (\n <Button\n type=\"button\"\n variant={variant}\n size={size}\n onClick={() => setMuted(!muted)}\n aria-label={label}\n aria-pressed={muted}\n title={label}\n className={cn(size === 'icon' ? 'h-9 w-9' : '', className)}\n >\n <Icon aria-hidden className=\"size-4\" />\n </Button>\n );\n}\n","'use client';\n\n/**\n * `@djangocfg/ui-tools/chat` subpath entrypoint.\n *\n * This file is the public surface consumers see when they\n * `import … from '@djangocfg/ui-tools/chat'`. It is designed so that the\n * heavy chat UI (~hundreds of KB across MessageList, Composer, ToolCalls,\n * Attachments, MarkdownMessage transitively) loads only when one of the\n * `Lazy*` wrappers actually mounts.\n *\n * Rules of thumb:\n * - **Heavy** (ChatRoot, ChatLauncher, ChatFAB, ChatDock, MessageList,\n * MessageBubble, Composer, ToolCalls, Attachments*, ChatHeader*, …) —\n * loaded only via `Lazy*` wrappers below. Do NOT add synchronous\n * re-exports for these from this file.\n * - **Light** (types, config constants, pure core reducer/utils,\n * transports, hooks without UI, audio prefs, draft sanitizer) —\n * re-exported synchronously here. Types are erased at compile time;\n * helpers and hooks pull in no UI components.\n *\n * Consumers that need synchronous access to the heavy components\n * (custom chat layouts, Storybook stories) can import from the root\n * barrel `@djangocfg/ui-tools` instead.\n */\n\nimport { createLazyComponent, LoadingFallback } from '../../components/lazy-wrapper';\nimport type { ChatRootProps } from './components/ChatRoot';\nimport type { ChatLauncherProps } from './launcher';\n\n// ============================================================================\n// Lazy UI components\n// ============================================================================\n\nexport const LazyChat = createLazyComponent<ChatRootProps>(\n () => import('./components/ChatRoot').then((m) => ({ default: m.ChatRoot })),\n {\n displayName: 'LazyChat',\n fallback: <LoadingFallback minHeight={320} text=\"Loading chat…\" />,\n },\n);\n\nexport const LazyChatLauncher = createLazyComponent<ChatLauncherProps>(\n () => import('./launcher').then((m) => ({ default: m.ChatLauncher })),\n {\n displayName: 'LazyChatLauncher',\n // Launcher renders a floating FAB by default — no inline placeholder.\n fallback: null,\n },\n);\n\n// ============================================================================\n// Light surface re-exports — types + pure helpers + hooks without UI\n// ============================================================================\n\n// Types (erased at compile time, free to re-export)\nexport type {\n ChatRole,\n ChatMessage,\n ChatPersona,\n ChatToolCall,\n ChatAttachment,\n ChatSource,\n ChatDisplayMode,\n ChatUserContext,\n ChatAssistantContext,\n ChatPrefs,\n ChatConfig,\n ChatLabels,\n ChatTransport,\n ChatStreamEvent,\n CreateSessionOptions,\n SessionInfo,\n HistoryPage,\n StreamOptions,\n SendOptions,\n} from './types';\nexport { DEFAULT_LABELS } from './types';\n\n// Config — plain constants, no UI imports\nexport {\n STORAGE_KEYS,\n CSS_VARS,\n DEFAULT_Z_INDEX,\n LIMITS,\n DEFAULT_SIDEBAR,\n HOTKEYS,\n CHAT_EVENT_NAME,\n type ChatEventDetail,\n} from './config';\n\n// Core — pure reducer / id / token buffer / persona / initials\nexport {\n reducer,\n initialState,\n createId,\n createTokenBuffer,\n resolvePersona,\n deriveInitials,\n type ChatState,\n type ChatAction,\n type TokenBuffer,\n} from './core';\n\n// Transports — pure functions, no UI\nexport {\n createHttpTransport,\n createMockTransport,\n parseSSE,\n TransportError,\n createPydanticAIChatTransport,\n createToolIdQueue,\n mapPydanticAIEvent,\n createPydanticAISSEMap,\n type HttpTransportConfig,\n type MockTransportOptions,\n type ParseSSEOptions,\n type PydanticAIChatTransportOpts,\n type PydanticAIEvent,\n type ToolIdQueue,\n} from './core/transport';\n\n// Hooks — no JSX, no UI\nexport {\n useChat,\n useChatComposer,\n useChatScroll,\n useChatHistory,\n useChatLayout,\n useChatAudio,\n useAutoFocusOnStreamEnd,\n useRegisterComposer,\n useChatReset,\n useVisitorFingerprint,\n useChatDockPrefs,\n DEFAULT_DOCK_PREFS,\n useFocusOnEmptyClick,\n useChatUnread,\n useChatLightbox,\n type UseChatUnreadOptions,\n type UseChatUnreadReturn,\n type UseChatConfig,\n type UseChatReturn,\n type UseChatComposerOptions,\n type UseChatComposerReturn,\n type UseChatScrollOptions,\n type UseChatScrollReturn,\n type UseChatHistoryOptions,\n type UseChatLayoutConfig,\n type UseChatLayoutReturn,\n type UseAutoFocusOnStreamEndOptions,\n type Focusable,\n type UseChatResetOptions,\n type UseChatResetReturn,\n type UseVisitorFingerprintOptions,\n type ChatDockPrefs,\n type UseChatDockPrefsOptions,\n type UseChatDockPrefsReturn,\n type UseFocusOnEmptyClickOptions,\n type UseChatLightboxReturn,\n type ChatLightboxState,\n} from './hooks';\n\n// Audio\nexport {\n useChatAudioPrefs,\n DEFAULT_CHAT_SOUNDS,\n type ChatAudioEvent,\n type ChatAudioSounds,\n type ChatAudioConfig,\n type UseChatAudioReturn,\n} from './core/audio';\n\n// Tool-call payload dispatcher — pure\nexport {\n dispatchToolPayload,\n isPlainObject,\n isLatLng,\n isGeoJSONFeatureCollection,\n isStringValue,\n type ToolPayloadMatcher,\n type ToolPayloadFallback,\n} from './core/payload-dispatch';\n\n// Logger — pure\nexport {\n getChatLogger,\n type ChatLogger,\n type ChatLogScope,\n} from './core/logger';\n\n// Utils — pure\nexport { sanitizeDraft, isSubmittableDraft } from './utils/sanitizeDraft';\nexport { collectImageAttachments } from './utils/collectImageAttachments';\n\n// Style tokens — strings + hooks, no UI components\nexport {\n BUBBLE_SURFACE,\n ANCHOR,\n TOGGLE,\n DESTRUCTIVE_SURFACE,\n TOOL_CALL,\n useChatBubbleStyles,\n useChatRoleStyles,\n useChatDestructiveStyles,\n type ChatBubbleSurface,\n type ChatBubbleStyles,\n type ChatRoleStyles,\n type ChatDestructiveStyles,\n} from './styles';\n\n// Provider / context — needed by callers wiring custom chat shells\nexport {\n ChatProvider,\n useChatContext,\n useChatContextOptional,\n type ChatContextValue,\n type ChatProviderProps,\n} from './context';\n\n// ============================================================================\n// Composable surface — synchronously re-exported components and their prop\n// types. These are needed by consumers that build custom chat shells\n// (e.g. `@djangocfg/crm`'s AdminChat / PublicChat) rather than rendering\n// `LazyChat` directly.\n//\n// They DO transitively pull in MarkdownMessage / Sources / StreamingIndicator\n// when actually rendered. Importing the types alone is free. Importing the\n// component costs the dependency graph — that's the price of a custom shell.\n//\n// Apps that want maximum laziness should use `LazyChat` / `LazyChatLauncher`\n// above and skip these.\n// ============================================================================\n\nexport {\n ChatLauncher,\n ChatFAB,\n ChatDock,\n ChatHeader,\n ChatHeaderActionButton,\n ChatHeaderAudioToggle,\n ChatHeaderLanguageButton,\n ChatHeaderModeToggle,\n ChatHeaderResetButton,\n ChatGreeting,\n ChatUnreadPreview,\n} from './launcher';\n\nexport {\n ChatRoot,\n MessageList,\n MessageBubble,\n MessageActions,\n Composer,\n Sources,\n ToolCalls,\n Attachments,\n AttachmentsGrid,\n AttachmentsList,\n EmptyState,\n ErrorBanner,\n JumpToLatest,\n StreamingIndicator,\n AudioToggle,\n} from './components';\n\n// Heavy-component prop types\nexport type {\n ChatLauncherProps,\n ChatLauncherHotkey,\n ChatLauncherGreeting,\n ChatFABProps,\n ChatFABPosition,\n ChatFABVariant,\n ChatFABSize,\n ChatDockProps,\n ChatDockMode,\n ChatDockSide,\n ChatHeaderProps,\n ChatHeaderActionButtonProps,\n ChatHeaderModeToggleProps,\n ChatHeaderAudioToggleProps,\n ChatHeaderResetButtonProps,\n ChatHeaderLanguageButtonProps,\n ChatGreetingProps,\n ChatUnreadPreviewProps,\n ChatPresencePhase,\n} from './launcher';\n\nexport { useChatPresence } from './launcher';\n\nexport type {\n ChatRootProps,\n MessageListProps,\n MessageListHandle,\n MessageBubbleProps,\n MessageActionsProps,\n ComposerProps,\n SourcesProps,\n ToolCallsProps,\n ToolPayloadKind,\n AttachmentsProps,\n AttachmentsGridProps,\n AttachmentsListProps,\n AttachmentRenderer,\n AttachmentRendererArgs,\n AttachmentRendererMap,\n EmptyStateProps,\n ErrorBannerProps,\n JumpToLatestProps,\n StreamingIndicatorProps,\n AudioToggleProps,\n} from './components';\n","/**\n * LottiePlayer - Dynamic Import Wrapper\n *\n * Lazy loads the LottiePlayer component for optimal bundle size\n */\n\n'use client';\n\nimport React, { lazy, Suspense } from 'react';\nimport { LottiePlayerProps } from './types';\n\n// Lazy load the client component\nconst LottiePlayerClient = lazy(() =>\n import('./LottiePlayer.client').then((mod) => ({ default: mod.LottiePlayer }))\n);\n\n// Loading fallback component\nconst LoadingFallback = () => (\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-gray-300 border-t-gray-900\" />\n <span className=\"text-sm text-gray-500\">Loading player...</span>\n </div>\n </div>\n);\n\n/**\n * LottiePlayer component wrapper with dynamic import\n *\n * This component automatically handles code splitting and lazy loading\n * of the Lottie player to optimize bundle size.\n *\n * Usage:\n * ```tsx\n * import { LottiePlayer } from '@djangocfg/ui-core/tools';\n *\n * <LottiePlayer\n * src=\"https://example.com/animation.json\"\n * size=\"md\"\n * autoplay\n * loop\n * />\n * ```\n */\nexport function LottiePlayer(props: LottiePlayerProps) {\n return (\n <Suspense fallback={<LoadingFallback />}>\n <LottiePlayerClient {...props} />\n </Suspense>\n );\n}\n\n// Re-export types for convenience\nexport type { LottiePlayerProps, LottieSize, LottieSpeed, LottieDirection } from './types';\nexport { useLottie } from './useLottie';\nexport type { UseLottieOptions, UseLottieReturn } from './useLottie';\n","'use client';\n\nimport React, { lazy, Suspense } from 'react';\nimport { PlaygroundProvider } from './context/PlaygroundContext';\nimport type { PlaygroundConfig } from './types';\n\nconst DocsLayout = lazy(() =>\n import('./components/DocsLayout').then((mod) => ({ default: mod.DocsLayout }))\n);\n\nconst LoadingFallback = () => (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <div className=\"text-muted-foreground\">Loading API Playground...</div>\n </div>\n);\n\nexport interface PlaygroundProps {\n config: PlaygroundConfig;\n}\n\nexport const Playground: React.FC<PlaygroundProps> = ({ config }) => {\n return (\n <PlaygroundProvider config={config}>\n <Suspense fallback={<LoadingFallback />}>\n <DocsLayout />\n </Suspense>\n </PlaygroundProvider>\n );\n};\n\nexport type { PlaygroundConfig, SchemaSource } from './types';\n\nexport default Playground;\n","'use client';\n\n/**\n * CronScheduler\n *\n * Compact cron expression builder following Apple HIG principles.\n * Lazy-loaded for optimal bundle size (~15KB).\n *\n * @example\n * import { CronScheduler } from '@djangocfg/ui-tools';\n *\n * <CronScheduler\n * value={cron}\n * onChange={setCron}\n * showPreview\n * />\n */\n\nimport React, { lazy, Suspense } from 'react';\nimport { LoadingFallback } from '../../components';\nimport type { CronSchedulerProps } from './types';\n\n// Lazy load the client component\nconst CronSchedulerClient = lazy(() => import('./CronScheduler.client'));\n\n/**\n * CronScheduler with Suspense wrapper\n */\nexport function CronScheduler(props: CronSchedulerProps) {\n return (\n <Suspense fallback={<CronSchedulerFallback />}>\n <CronSchedulerClient {...props} />\n </Suspense>\n );\n}\n\n/**\n * Loading fallback for CronScheduler\n */\nfunction CronSchedulerFallback() {\n return (\n <LoadingFallback\n minHeight={120}\n showText={false}\n className=\"rounded-lg\"\n />\n );\n}\n\n// Re-export types\nexport type {\n CronSchedulerProps,\n ScheduleType,\n WeekDay,\n MonthDay,\n CronSchedulerState,\n CronSchedulerContextValue,\n} from './types';\n\n// Re-export context and hooks for advanced usage\nexport {\n CronSchedulerProvider,\n useCronSchedulerContext,\n useCronType,\n useCronTime,\n useCronWeekDays,\n useCronMonthDays,\n useCronCustom,\n useCronPreview,\n useCronScheduler,\n} from './context';\n\n// Re-export utilities\nexport {\n buildCron,\n parseCron,\n isValidCron,\n humanizeCron,\n} from './utils';\n\n// Re-export components for custom compositions\nexport {\n ScheduleTypeSelector,\n TimeSelector,\n DayChips,\n MonthDayGrid,\n CustomInput,\n SchedulePreview,\n} from './components';\n\nexport default CronScheduler;\n","'use client';\n\n/**\n * Monaco Editor Web Worker Setup\n *\n * Workers improve performance for language services (TypeScript type-checking,\n * JSON validation, etc.) but require bundler-specific configuration:\n *\n * **Vite**: Use `?worker` imports (see example below)\n * **Next.js/Webpack**: Use `monaco-editor-webpack-plugin`\n * **No config**: Monaco falls back to main-thread execution (fully functional)\n *\n * @example Vite setup (call once in app entry):\n * ```ts\n * import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'\n * import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker'\n * import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker'\n * import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker'\n * import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker'\n *\n * setupMonacoWorkers((label) => {\n * switch (label) {\n * case 'typescript': case 'javascript': return new tsWorker()\n * case 'json': return new jsonWorker()\n * case 'css': case 'scss': case 'less': return new cssWorker()\n * case 'html': case 'handlebars': case 'razor': return new htmlWorker()\n * default: return new editorWorker()\n * }\n * })\n * ```\n *\n * @example Next.js setup:\n * ```ts\n * // next.config.js — add monaco-editor-webpack-plugin\n * // Then just call setupMonacoWorkers() without arguments\n * setupMonacoWorkers()\n * ```\n */\n\ntype GetWorkerFn = (label: string) => Worker;\n\nlet isSetup = false;\n\nexport function setupMonacoWorkers(getWorker?: GetWorkerFn): void {\n if (isSetup || typeof window === 'undefined') return;\n\n if (getWorker) {\n // App provides bundler-specific worker factory\n (self as unknown as { MonacoEnvironment: object }).MonacoEnvironment = {\n getWorker: (_workerId: string, label: string) => getWorker(label),\n };\n }\n // else: don't set MonacoEnvironment at all.\n // - If webpack plugin is installed, it sets MonacoEnvironment automatically.\n // - If nothing sets it, Monaco falls back to main-thread execution.\n\n isSetup = true;\n}\n","'use client';\n\nimport { useState, useEffect } from 'react';\nimport type * as MonacoEditor from 'monaco-editor';\n\nimport { setupMonacoWorkers } from '../workers/setup';\nimport type { UseMonacoReturn } from '../types';\n\n/**\n * Hook to load and access Monaco Editor instance\n *\n * Handles:\n * - Dynamic import of Monaco (client-side only)\n * - Web worker configuration\n * - Loading state management\n *\n * @example\n * ```tsx\n * const { monaco, isLoading, error } = useMonaco();\n *\n * if (isLoading) return <Spinner />;\n * if (error) return <Error message={error.message} />;\n *\n * // Use monaco API\n * monaco.editor.create(...)\n * ```\n */\nexport function useMonaco(): UseMonacoReturn {\n const [monaco, setMonaco] = useState<typeof MonacoEditor | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n let mounted = true;\n\n async function loadMonaco() {\n try {\n // Setup workers first\n setupMonacoWorkers();\n\n // Dynamic import Monaco\n const monacoModule = await import('monaco-editor');\n\n if (mounted) {\n setMonaco(monacoModule);\n setIsLoading(false);\n }\n } catch (err) {\n if (mounted) {\n setError(err instanceof Error ? err : new Error('Failed to load Monaco Editor'));\n setIsLoading(false);\n }\n }\n }\n\n loadMonaco();\n\n return () => {\n mounted = false;\n };\n }, []);\n\n return { monaco, isLoading, error };\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\nimport { useResolvedTheme } from '@djangocfg/ui-core/hooks';\n\n/**\n * Hook that syncs Monaco editor theme with the app theme.\n *\n * Reads CSS variables from the document and creates custom Monaco themes\n * that match the current light/dark mode. Falls back to built-in 'vs' / 'vs-dark'.\n *\n * @param monaco - Monaco namespace (null during loading)\n * @param themeOverride - Optional explicit theme name (skips auto-detection)\n * @returns Resolved Monaco theme name to pass to editor options\n */\nexport function useEditorTheme(\n monaco: typeof import('monaco-editor') | null,\n themeOverride?: string,\n): string {\n const appTheme = useResolvedTheme();\n const registered = useRef(false);\n\n // Register custom themes once Monaco is loaded\n useEffect(() => {\n if (!monaco || registered.current) return;\n\n try {\n const colors = _readCSSColors();\n\n monaco.editor.defineTheme('app-dark', {\n base: 'vs-dark',\n inherit: true,\n rules: [\n { token: 'comment', foreground: '6A9955', fontStyle: 'italic' },\n { token: 'keyword', foreground: 'C586C0' },\n { token: 'string', foreground: 'CE9178' },\n { token: 'number', foreground: 'B5CEA8' },\n { token: 'type', foreground: '4EC9B0' },\n { token: 'function', foreground: 'DCDCAA' },\n { token: 'variable', foreground: '9CDCFE' },\n ],\n colors: {\n 'editor.background': colors.background,\n 'editor.foreground': colors.foreground,\n 'editor.lineHighlightBackground': colors.lineHighlight,\n 'editor.selectionBackground': colors.selection,\n 'editorCursor.foreground': colors.foreground,\n 'editorLineNumber.foreground': colors.mutedForeground,\n 'editorWidget.background': colors.card,\n 'editorWidget.border': colors.border,\n 'input.background': colors.card,\n 'dropdown.background': colors.card,\n },\n });\n\n monaco.editor.defineTheme('app-light', {\n base: 'vs',\n inherit: true,\n rules: [\n { token: 'comment', foreground: '008000', fontStyle: 'italic' },\n { token: 'keyword', foreground: 'AF00DB' },\n { token: 'string', foreground: 'A31515' },\n { token: 'number', foreground: '098658' },\n { token: 'type', foreground: '267F99' },\n { token: 'function', foreground: '795E26' },\n { token: 'variable', foreground: '001080' },\n ],\n colors: {\n 'editor.background': colors.backgroundLight,\n 'editor.foreground': colors.foregroundLight,\n 'editor.lineHighlightBackground': colors.lineHighlightLight,\n 'editor.selectionBackground': colors.selectionLight,\n 'editorLineNumber.foreground': colors.mutedForegroundLight,\n 'editorWidget.background': colors.cardLight,\n 'editorWidget.border': colors.borderLight,\n },\n });\n\n registered.current = true;\n } catch {\n // Fallback — use built-in themes\n }\n }, [monaco]);\n\n // If explicit override provided, use it\n if (themeOverride) return themeOverride;\n\n // Use registered app themes if available, fallback to built-in\n if (registered.current) {\n return appTheme === 'dark' ? 'app-dark' : 'app-light';\n }\n return appTheme === 'dark' ? 'vs-dark' : 'vs';\n}\n\n\n/** Read CSS variables and convert HSL to hex for Monaco */\nfunction _readCSSColors() {\n const get = (varName: string): string => {\n if (typeof document === 'undefined') return '';\n return getComputedStyle(document.documentElement).getPropertyValue(varName).trim();\n };\n\n const hslToHex = (hsl: string): string => {\n if (!hsl) return '';\n // CSS vars are \"0 0% 96%\" — strip % before parsing\n const parts = hsl.split(/\\s+/).map(s => parseFloat(s.replace('%', '')));\n if (parts.length < 3 || parts.some(isNaN)) return '';\n const [h, s, l] = [parts[0], parts[1] / 100, parts[2] / 100];\n\n const a = s * Math.min(l, 1 - l);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color).toString(16).padStart(2, '0');\n };\n return `#${f(0)}${f(8)}${f(4)}`;\n };\n\n // Read current (dark) theme CSS variables\n const background = hslToHex(get('--background')) || '#0a0a0a';\n const foreground = hslToHex(get('--foreground')) || '#f5f5f5';\n const card = hslToHex(get('--card')) || '#141414';\n const border = hslToHex(get('--border')) || '#262626';\n const mutedForeground = hslToHex(get('--muted-foreground')) || '#858585';\n\n // Compute derived colors\n const lineHighlight = _adjustBrightness(background, 10);\n const primary = hslToHex(get('--primary'));\n const selection = primary ? _adjustBrightness(primary, -40) : '#264F78';\n\n // Light theme colors (hardcoded since we can't switch CSS context)\n return {\n background,\n foreground,\n card,\n border,\n mutedForeground,\n lineHighlight,\n selection,\n // Light variants\n backgroundLight: '#ffffff',\n foregroundLight: '#1a1a1a',\n cardLight: '#ffffff',\n borderLight: '#e5e5e5',\n mutedForegroundLight: '#737373',\n lineHighlightLight: '#f5f5f5',\n selectionLight: '#ADD6FF',\n };\n}\n\nfunction _adjustBrightness(hex: string, amount: number): string {\n const num = parseInt(hex.replace('#', ''), 16);\n const r = Math.min(255, Math.max(0, ((num >> 16) & 0xff) + amount));\n const g = Math.min(255, Math.max(0, ((num >> 8) & 0xff) + amount));\n const b = Math.min(255, Math.max(0, (num & 0xff) + amount));\n return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, '0')}`;\n}\n\n","'use client';\n\nimport { useRef, useEffect, useState, useCallback, forwardRef, useImperativeHandle } from 'react';\nimport type * as monaco from 'monaco-editor';\n\nimport { useMonaco } from '../hooks/useMonaco';\nimport { useEditorTheme } from '../hooks/useEditorTheme';\nimport type { EditorProps } from '../types';\n\nexport interface EditorRef {\n /** Get editor instance */\n getEditor: () => monaco.editor.IStandaloneCodeEditor | null;\n /** Get current value */\n getValue: () => string;\n /** Set value */\n setValue: (value: string) => void;\n /** Focus editor */\n focus: () => void;\n}\n\n/**\n * Monaco Editor Component\n *\n * A React wrapper around Monaco Editor with full TypeScript support.\n *\n * @example\n * ```tsx\n * <Editor\n * value={code}\n * language=\"typescript\"\n * onChange={(value) => setCode(value)}\n * options={{ fontSize: 14, minimap: false }}\n * />\n * ```\n */\nexport const Editor = forwardRef<EditorRef, EditorProps>(function Editor(\n {\n value = '',\n language = 'plaintext',\n onChange,\n onMount,\n options = {},\n className = '',\n height = '100%',\n width = '100%',\n autoHeight = false,\n minHeight = 100,\n maxHeight = 600,\n },\n ref\n) {\n const containerRef = useRef<HTMLDivElement>(null);\n const editorRef = useRef<monaco.editor.IStandaloneCodeEditor | null>(null);\n const { monaco, isLoading } = useMonaco();\n const resolvedTheme = useEditorTheme(monaco, options.theme);\n\n // Auto-height state\n const [contentHeight, setContentHeight] = useState<number | null>(null);\n\n const updateContentHeight = useCallback((editor: monaco.editor.IStandaloneCodeEditor) => {\n if (!autoHeight) return;\n const h = editor.getContentHeight();\n setContentHeight(Math.min(Math.max(h, minHeight), maxHeight));\n }, [autoHeight, minHeight, maxHeight]);\n\n // Track internal changes to prevent cursor reset on prop sync\n const isInternalChangeRef = useRef(false);\n\n // Expose editor methods via ref\n useImperativeHandle(ref, () => ({\n getEditor: () => editorRef.current,\n getValue: () => editorRef.current?.getValue() || '',\n setValue: (val: string) => editorRef.current?.setValue(val),\n focus: () => editorRef.current?.focus(),\n }));\n\n // Create editor\n useEffect(() => {\n if (!monaco || !containerRef.current || editorRef.current) return;\n\n const editor = monaco.editor.create(containerRef.current, {\n value,\n language,\n theme: resolvedTheme,\n fontSize: options.fontSize || 14,\n fontFamily: options.fontFamily || \"'Fira Code', 'Consolas', monospace\",\n tabSize: options.tabSize || 2,\n insertSpaces: options.insertSpaces !== false,\n wordWrap: options.wordWrap || 'on',\n minimap: { enabled: options.minimap !== false },\n lineNumbers: options.lineNumbers || 'on',\n readOnly: options.readOnly || false,\n automaticLayout: true,\n scrollBeyondLastLine: autoHeight ? false : false,\n scrollbar: autoHeight ? { vertical: 'hidden', horizontal: 'auto' } : undefined,\n overviewRulerLanes: autoHeight ? 0 : undefined,\n padding: { top: 16, bottom: 16 },\n renderLineHighlight: 'all',\n cursorBlinking: 'smooth',\n cursorSmoothCaretAnimation: 'on',\n smoothScrolling: true,\n bracketPairColorization: { enabled: true },\n guides: {\n bracketPairs: true,\n indentation: true,\n },\n });\n\n editorRef.current = editor;\n\n // Setup change listener\n if (onChange) {\n editor.onDidChangeModelContent(() => {\n // Mark as internal change to prevent cursor reset on prop sync\n isInternalChangeRef.current = true;\n onChange(editor.getValue());\n });\n }\n\n // Auto-height: resize container to fit content\n if (autoHeight) {\n editor.onDidContentSizeChange(() => updateContentHeight(editor));\n updateContentHeight(editor);\n }\n\n // Call onMount callback\n onMount?.(editor);\n\n return () => {\n editor.dispose();\n editorRef.current = null;\n };\n }, [monaco]);\n\n // Update value when prop changes (only for external changes)\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n\n // Skip if this is an internal change (user typing) - prevents cursor reset\n if (isInternalChangeRef.current) {\n isInternalChangeRef.current = false;\n return;\n }\n\n const currentValue = editor.getValue();\n if (value !== currentValue) {\n // Save cursor position\n const position = editor.getPosition();\n const selections = editor.getSelections();\n\n editor.setValue(value);\n\n // Restore cursor position if possible\n if (position) {\n editor.setPosition(position);\n }\n if (selections && selections.length > 0) {\n editor.setSelections(selections);\n }\n }\n }, [value]);\n\n // Update language when prop changes\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor || !monaco) return;\n\n const model = editor.getModel();\n if (model) {\n monaco.editor.setModelLanguage(model, language);\n }\n }, [language, monaco]);\n\n // Update options when props change\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n\n editor.updateOptions({\n theme: resolvedTheme,\n fontSize: options.fontSize,\n readOnly: options.readOnly,\n minimap: { enabled: options.minimap !== false },\n wordWrap: options.wordWrap,\n lineNumbers: options.lineNumbers,\n });\n }, [options, resolvedTheme]);\n\n if (isLoading) {\n return (\n <div\n className={className}\n style={{\n width,\n height,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#1e1e1e',\n color: '#666',\n }}\n >\n Loading editor...\n </div>\n );\n }\n\n const resolvedHeight = autoHeight && contentHeight != null ? contentHeight : height;\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={{\n width,\n height: resolvedHeight,\n ...(autoHeight && { minHeight: minHeight, maxHeight: maxHeight, overflow: 'hidden' }),\n }}\n />\n );\n});\n","'use client';\n\nimport { useRef, useEffect } from 'react';\nimport type * as monaco from 'monaco-editor';\n\nimport { useMonaco } from '../hooks/useMonaco';\nimport { useEditorTheme } from '../hooks/useEditorTheme';\nimport type { DiffEditorProps } from '../types';\n\n/**\n * Monaco Diff Editor Component\n *\n * Side-by-side or inline diff view for comparing two versions of content.\n *\n * @example\n * ```tsx\n * <DiffEditor\n * original={originalCode}\n * modified={modifiedCode}\n * language=\"typescript\"\n * />\n * ```\n */\nexport function DiffEditor({\n original,\n modified,\n language = 'plaintext',\n options = {},\n className = '',\n height = '100%',\n}: DiffEditorProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const editorRef = useRef<monaco.editor.IStandaloneDiffEditor | null>(null);\n const { monaco, isLoading } = useMonaco();\n const resolvedTheme = useEditorTheme(monaco, options.theme);\n\n // Create diff editor\n useEffect(() => {\n if (!monaco || !containerRef.current || editorRef.current) return;\n\n const editor = monaco.editor.createDiffEditor(containerRef.current, {\n theme: resolvedTheme,\n fontSize: options.fontSize || 14,\n fontFamily: options.fontFamily || \"'Fira Code', 'Consolas', monospace\",\n readOnly: true,\n automaticLayout: true,\n renderSideBySide: true,\n scrollBeyondLastLine: false,\n minimap: { enabled: false },\n });\n\n const originalModel = monaco.editor.createModel(original, language);\n const modifiedModel = monaco.editor.createModel(modified, language);\n\n editor.setModel({\n original: originalModel,\n modified: modifiedModel,\n });\n\n editorRef.current = editor;\n\n return () => {\n originalModel.dispose();\n modifiedModel.dispose();\n editor.dispose();\n editorRef.current = null;\n };\n }, [monaco]);\n\n // Update models when content changes\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor || !monaco) return;\n\n const model = editor.getModel();\n if (model) {\n model.original.setValue(original);\n model.modified.setValue(modified);\n }\n }, [original, modified, monaco]);\n\n // Update language\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor || !monaco) return;\n\n const model = editor.getModel();\n if (model) {\n monaco.editor.setModelLanguage(model.original, language);\n monaco.editor.setModelLanguage(model.modified, language);\n }\n }, [language, monaco]);\n\n if (isLoading) {\n return (\n <div\n className={className}\n style={{\n width: '100%',\n height,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#1e1e1e',\n color: '#666',\n }}\n >\n Loading diff editor...\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={{\n width: '100%',\n height,\n }}\n />\n );\n}\n","/**\n * Language Detection & Mapping\n *\n * Maps file extensions to Monaco Editor language IDs.\n * Monaco supports 80+ languages out of the box.\n */\n\n/**\n * File extension to Monaco language ID mapping\n */\nexport const LANGUAGE_MAP: Record<string, string> = {\n // Web\n '.html': 'html',\n '.htm': 'html',\n '.xhtml': 'html',\n '.vue': 'html',\n '.svelte': 'html',\n\n // CSS\n '.css': 'css',\n '.scss': 'scss',\n '.sass': 'scss',\n '.less': 'less',\n\n // JavaScript/TypeScript\n '.js': 'javascript',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n '.jsx': 'javascript',\n '.ts': 'typescript',\n '.tsx': 'typescript',\n '.mts': 'typescript',\n '.cts': 'typescript',\n\n // Data formats\n '.json': 'json',\n '.jsonc': 'json',\n '.json5': 'json',\n '.yaml': 'yaml',\n '.yml': 'yaml',\n '.toml': 'ini',\n '.xml': 'xml',\n '.svg': 'xml',\n '.xsl': 'xml',\n '.xsd': 'xml',\n\n // Markdown & Documentation\n '.md': 'markdown',\n '.mdx': 'markdown',\n '.markdown': 'markdown',\n '.rst': 'restructuredtext',\n '.txt': 'plaintext',\n '.text': 'plaintext',\n\n // Programming languages\n '.py': 'python',\n '.pyw': 'python',\n '.pyi': 'python',\n '.rb': 'ruby',\n '.rake': 'ruby',\n '.gemspec': 'ruby',\n '.php': 'php',\n '.phtml': 'php',\n '.java': 'java',\n '.kt': 'kotlin',\n '.kts': 'kotlin',\n '.scala': 'scala',\n '.go': 'go',\n '.rs': 'rust',\n '.swift': 'swift',\n '.c': 'c',\n '.h': 'c',\n '.cpp': 'cpp',\n '.cc': 'cpp',\n '.cxx': 'cpp',\n '.hpp': 'cpp',\n '.hxx': 'cpp',\n '.cs': 'csharp',\n '.fs': 'fsharp',\n '.fsx': 'fsharp',\n '.vb': 'vb',\n '.lua': 'lua',\n '.r': 'r',\n '.R': 'r',\n '.m': 'objective-c',\n '.mm': 'objective-c',\n '.pl': 'perl',\n '.pm': 'perl',\n '.ex': 'elixir',\n '.exs': 'elixir',\n '.erl': 'erlang',\n '.hrl': 'erlang',\n '.clj': 'clojure',\n '.cljs': 'clojure',\n '.cljc': 'clojure',\n '.hs': 'haskell',\n '.lhs': 'haskell',\n '.ml': 'fsharp',\n '.mli': 'fsharp',\n '.dart': 'dart',\n '.groovy': 'groovy',\n '.gradle': 'groovy',\n '.jl': 'julia',\n\n // Shell & Scripts\n '.sh': 'shell',\n '.bash': 'shell',\n '.zsh': 'shell',\n '.fish': 'shell',\n '.ps1': 'powershell',\n '.psm1': 'powershell',\n '.psd1': 'powershell',\n '.bat': 'bat',\n '.cmd': 'bat',\n\n // Config files\n '.ini': 'ini',\n '.cfg': 'ini',\n '.conf': 'ini',\n '.properties': 'ini',\n '.env': 'ini',\n '.gitignore': 'ini',\n '.gitattributes': 'ini',\n '.editorconfig': 'ini',\n '.npmrc': 'ini',\n\n // Database\n '.sql': 'sql',\n '.mysql': 'mysql',\n '.pgsql': 'pgsql',\n '.plsql': 'plsql',\n '.redis': 'redis',\n\n // Templates\n '.hbs': 'handlebars',\n '.handlebars': 'handlebars',\n '.mustache': 'handlebars',\n '.ejs': 'html',\n '.pug': 'pug',\n '.jade': 'pug',\n '.twig': 'twig',\n '.liquid': 'liquid',\n\n // GraphQL\n '.graphql': 'graphql',\n '.gql': 'graphql',\n\n // Docker\n '.dockerfile': 'dockerfile',\n\n // Other\n '.diff': 'diff',\n '.patch': 'diff',\n '.log': 'log',\n '.tex': 'latex',\n '.cls': 'latex',\n '.sty': 'latex',\n '.proto': 'protobuf',\n '.sol': 'sol',\n '.asm': 'mips',\n '.s': 'mips',\n '.wasm': 'wasm',\n};\n\n/**\n * Special filename mappings (without extension)\n */\nconst FILENAME_MAP: Record<string, string> = {\n Dockerfile: 'dockerfile',\n 'docker-compose.yml': 'yaml',\n 'docker-compose.yaml': 'yaml',\n Makefile: 'makefile',\n makefile: 'makefile',\n Gemfile: 'ruby',\n Rakefile: 'ruby',\n Jenkinsfile: 'groovy',\n Vagrantfile: 'ruby',\n '.bashrc': 'shell',\n '.bash_profile': 'shell',\n '.zshrc': 'shell',\n '.profile': 'shell',\n '.vimrc': 'plaintext',\n '.gitconfig': 'ini',\n '.htaccess': 'ini',\n 'nginx.conf': 'ini',\n 'package.json': 'json',\n 'tsconfig.json': 'json',\n 'jsconfig.json': 'json',\n '.prettierrc': 'json',\n '.eslintrc': 'json',\n 'composer.json': 'json',\n 'Cargo.toml': 'ini',\n 'go.mod': 'go',\n 'go.sum': 'plaintext',\n 'requirements.txt': 'plaintext',\n 'pyproject.toml': 'ini',\n 'setup.py': 'python',\n 'setup.cfg': 'ini',\n};\n\n/**\n * Get Monaco language ID from file extension\n */\nexport function getLanguageByExtension(extension: string): string {\n const ext = extension.startsWith('.') ? extension.toLowerCase() : `.${extension.toLowerCase()}`;\n return LANGUAGE_MAP[ext] || 'plaintext';\n}\n\n/**\n * Get Monaco language ID from filename\n * Checks special filenames first, then falls back to extension\n */\nexport function getLanguageByFilename(filename: string): string {\n // Check special filenames first\n if (FILENAME_MAP[filename]) {\n return FILENAME_MAP[filename];\n }\n\n // Extract extension\n const lastDot = filename.lastIndexOf('.');\n if (lastDot === -1) {\n return 'plaintext';\n }\n\n const extension = filename.slice(lastDot).toLowerCase();\n return LANGUAGE_MAP[extension] || 'plaintext';\n}\n","'use client';\n\nimport { createContext, useContext, useState, useCallback, useMemo } from 'react';\nimport type * as monaco from 'monaco-editor';\n\nimport { useMonaco } from '../hooks/useMonaco';\nimport { getLanguageByFilename } from '../lib/languages';\nimport type { EditorFile, EditorContextValue } from '../types';\n\nconst EditorContext = createContext<EditorContextValue | null>(null);\n\n/**\n * Hook to access editor context\n * Must be used within EditorProvider\n */\nexport function useEditorContext(): EditorContextValue {\n const context = useContext(EditorContext);\n if (!context) {\n throw new Error('useEditorContext must be used within EditorProvider');\n }\n return context;\n}\n\ninterface EditorProviderProps {\n children: React.ReactNode;\n /** Callback when file save is requested */\n onSave?: (path: string, content: string) => Promise<void>;\n}\n\n/**\n * Editor Context Provider\n *\n * Manages multiple open files, active file state, and editor instance.\n *\n * @example\n * ```tsx\n * <EditorProvider onSave={handleSave}>\n * <EditorTabs />\n * <Editor />\n * </EditorProvider>\n * ```\n */\nexport function EditorProvider({ children, onSave }: EditorProviderProps) {\n const { monaco } = useMonaco();\n const [editor, setEditor] = useState<monaco.editor.IStandaloneCodeEditor | null>(null);\n const [openFiles, setOpenFiles] = useState<EditorFile[]>([]);\n const [activeFilePath, setActiveFilePath] = useState<string | null>(null);\n\n // Get active file\n const activeFile = useMemo(\n () => openFiles.find((f) => f.path === activeFilePath) || null,\n [openFiles, activeFilePath]\n );\n\n // Open a file\n const openFile = useCallback(\n (path: string, content: string, language?: string) => {\n setOpenFiles((files) => {\n // Check if already open\n const existing = files.find((f) => f.path === path);\n if (existing) {\n return files;\n }\n\n // Detect language from filename\n const basename = path.split('/').pop() || path;\n const detectedLanguage = language || getLanguageByFilename(basename);\n\n // Create new file entry\n const newFile: EditorFile = {\n path,\n content,\n language: detectedLanguage,\n isDirty: false,\n };\n\n return [...files, newFile];\n });\n\n // Set as active\n setActiveFilePath(path);\n },\n []\n );\n\n // Close a file\n const closeFile = useCallback(\n (path: string) => {\n setOpenFiles((files) => {\n const index = files.findIndex((f) => f.path === path);\n if (index === -1) return files;\n\n const newFiles = files.filter((f) => f.path !== path);\n\n // If closing active file, activate adjacent file\n if (activeFilePath === path && newFiles.length > 0) {\n const newIndex = Math.min(index, newFiles.length - 1);\n setActiveFilePath(newFiles[newIndex].path);\n } else if (newFiles.length === 0) {\n setActiveFilePath(null);\n }\n\n return newFiles;\n });\n },\n [activeFilePath]\n );\n\n // Set active file\n const setActiveFile = useCallback((path: string) => {\n setActiveFilePath(path);\n }, []);\n\n // Update file content\n const updateContent = useCallback((path: string, content: string) => {\n setOpenFiles((files) =>\n files.map((f) =>\n f.path === path\n ? { ...f, content, isDirty: true }\n : f\n )\n );\n }, []);\n\n // Save file\n const saveFile = useCallback(\n async (path: string) => {\n const file = openFiles.find((f) => f.path === path);\n if (!file) return;\n\n if (onSave) {\n await onSave(path, file.content);\n }\n\n // Mark as not dirty\n setOpenFiles((files) =>\n files.map((f) =>\n f.path === path ? { ...f, isDirty: false } : f\n )\n );\n },\n [openFiles, onSave]\n );\n\n // Check if file is dirty\n const isDirty = useCallback(\n (path: string) => {\n const file = openFiles.find((f) => f.path === path);\n return file?.isDirty || false;\n },\n [openFiles]\n );\n\n // Get file content\n const getContent = useCallback(\n (path: string) => {\n const file = openFiles.find((f) => f.path === path);\n return file?.content || null;\n },\n [openFiles]\n );\n\n // Get file by path\n const getFile = useCallback(\n (path: string) => {\n return openFiles.find((f) => f.path === path) || null;\n },\n [openFiles]\n );\n\n const value: EditorContextValue = {\n openFiles,\n activeFile,\n monaco,\n editor,\n isReady: monaco !== null && editor !== null,\n\n openFile,\n closeFile,\n setActiveFile,\n updateContent,\n saveFile,\n\n isDirty,\n getContent,\n getFile,\n };\n\n return (\n <EditorContext.Provider value={value}>\n {children}\n </EditorContext.Provider>\n );\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport type * as monaco from 'monaco-editor';\n\nimport type { UseEditorReturn } from '../types';\n\n/**\n * Hook to manage editor instance reference\n *\n * @example\n * ```tsx\n * const { editor, isReady, setEditor } = useEditor();\n *\n * // Pass setEditor to Editor component's onMount\n * <Editor onMount={setEditor} />\n *\n * // Use editor when ready\n * if (isReady) {\n * editor.getModel()?.getValue();\n * }\n * ```\n */\nexport function useEditor(): UseEditorReturn {\n const [editor, setEditorState] = useState<monaco.editor.IStandaloneCodeEditor | null>(null);\n\n const setEditor = useCallback((editorInstance: monaco.editor.IStandaloneCodeEditor | null) => {\n setEditorState(editorInstance);\n }, []);\n\n return {\n editor,\n isReady: editor !== null,\n setEditor,\n };\n}\n","'use client';\n\nimport { useMemo } from 'react';\nimport { getLanguageByFilename } from '../lib/languages';\n\n/**\n * Hook to detect language from filename\n *\n * @param filename - File name or path\n * @returns Monaco language ID\n *\n * @example\n * ```tsx\n * const language = useLanguage('app.tsx');\n * // Returns: 'typescript'\n *\n * const language2 = useLanguage('/path/to/Dockerfile');\n * // Returns: 'dockerfile'\n * ```\n */\nexport function useLanguage(filename: string | undefined): string {\n return useMemo(() => {\n if (!filename) return 'plaintext';\n\n // Extract basename from path\n const basename = filename.split('/').pop() || filename;\n return getLanguageByFilename(basename);\n }, [filename]);\n}\n","'use client';\n\nimport { forwardRef, useImperativeHandle, useState, useCallback, useEffect, type KeyboardEvent } from 'react';\nimport type { MentionItem } from './types';\n\nexport interface MentionListRef {\n onKeyDown: (event: KeyboardEvent) => boolean;\n}\n\ninterface MentionListProps {\n items: MentionItem[];\n command: (item: MentionItem) => void;\n}\n\nexport const MentionList = forwardRef<MentionListRef, MentionListProps>(\n ({ items, command }, ref) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useEffect(() => setSelectedIndex(0), [items]);\n\n const select = useCallback(\n (index: number) => {\n const item = items[index];\n if (item) command(item);\n },\n [items, command],\n );\n\n useImperativeHandle(ref, () => ({\n onKeyDown: (event: KeyboardEvent) => {\n if (event.key === 'ArrowUp') {\n setSelectedIndex((i) => (i + items.length - 1) % items.length);\n return true;\n }\n if (event.key === 'ArrowDown') {\n setSelectedIndex((i) => (i + 1) % items.length);\n return true;\n }\n if (event.key === 'Enter') {\n select(selectedIndex);\n return true;\n }\n return false;\n },\n }));\n\n if (items.length === 0) return null;\n\n return (\n <div className=\"markdown-mention-list\">\n {items.map((item, i) => {\n const isSelected = i === selectedIndex;\n const cls = `markdown-mention-item ${isSelected ? 'selected' : ''}`;\n return (\n <button key={item.id} type=\"button\" className={cls} onClick={() => select(i)}>\n {item.thumbnail && (\n <img src={item.thumbnail} alt=\"\" className=\"markdown-mention-avatar\" />\n )}\n <div className=\"markdown-mention-info\">\n <span className=\"markdown-mention-name\">{item.label}</span>\n {item.description && (\n <span className=\"markdown-mention-desc\">{item.description}</span>\n )}\n </div>\n </button>\n );\n })}\n </div>\n );\n },\n);\n\nMentionList.displayName = 'MentionList';\n","import { ReactRenderer } from '@tiptap/react';\nimport type { SuggestionOptions } from '@tiptap/suggestion';\nimport { autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { MentionList, type MentionListRef } from './MentionList';\nimport type { MentionItem, MentionConfig } from './types';\n\nexport function createMentionSuggestion(\n config: MentionConfig,\n): Omit<SuggestionOptions<MentionItem>, 'editor'> {\n const { maxItems = 5, trigger = '@' } = config;\n\n return {\n char: trigger,\n\n items: ({ query }) => {\n const q = query.toLowerCase();\n return config.items\n .filter((item) => item.label.toLowerCase().includes(q))\n .slice(0, maxItems);\n },\n\n render: () => {\n let component: ReactRenderer<MentionListRef> | null = null;\n let popup: HTMLDivElement | null = null;\n let cleanupAutoUpdate: (() => void) | null = null;\n let getReferenceRect: (() => DOMRect | null) | null = null;\n\n // Floating-UI virtual element backed by Tiptap's clientRect.\n // We re-read it on every reposition so caret movement is tracked.\n const buildVirtualElement = () => ({\n getBoundingClientRect: () => {\n const rect = getReferenceRect?.();\n // Fallback to a zero-sized rect at origin if the editor is detached\n // (e.g. mid-teardown). Floating-UI tolerates this.\n return rect ?? new DOMRect(0, 0, 0, 0);\n },\n });\n\n const updatePosition = () => {\n if (!popup) return;\n const virtualEl = buildVirtualElement();\n void computePosition(virtualEl, popup, {\n placement: 'bottom-start',\n middleware: [\n offset(4),\n flip({ fallbackPlacements: ['top-start'] }),\n shift({ padding: 8 }),\n ],\n }).then(({ x, y }) => {\n if (!popup) return;\n // transform is more performant than top/left and avoids\n // sub-pixel layout thrash during scroll/resize.\n popup.style.transform = `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`;\n });\n };\n\n const teardown = () => {\n cleanupAutoUpdate?.();\n cleanupAutoUpdate = null;\n popup?.remove();\n popup = null;\n component?.destroy();\n component = null;\n getReferenceRect = null;\n };\n\n return {\n onStart: (props) => {\n component = new ReactRenderer(MentionList, {\n props: {\n items: props.items,\n command: (item: MentionItem) => {\n props.command({ id: item.id, label: item.label });\n },\n },\n editor: props.editor,\n });\n\n popup = document.createElement('div');\n // top/left at 0; actual position is applied via transform by computePosition.\n popup.style.cssText = 'position: absolute; top: 0; left: 0; z-index: 99999;';\n popup.appendChild(component.element);\n document.body.appendChild(popup);\n\n getReferenceRect = () => props.clientRect?.() ?? null;\n\n // autoUpdate handles scroll, resize, ancestor scroll/resize, layout shifts.\n // It calls updatePosition synchronously on registration too — no manual first call needed.\n const virtualEl = buildVirtualElement();\n cleanupAutoUpdate = autoUpdate(virtualEl, popup, updatePosition);\n },\n\n onUpdate: (props) => {\n component?.updateProps({\n items: props.items,\n command: (item: MentionItem) => {\n props.command({ id: item.id, label: item.label });\n },\n });\n\n // Refresh reference accessor so autoUpdate sees the new caret rect.\n getReferenceRect = () => props.clientRect?.() ?? null;\n updatePosition();\n },\n\n onKeyDown: (props) => {\n if (props.event.key === 'Escape') {\n teardown();\n return true;\n }\n return component?.ref?.onKeyDown(props.event as unknown as React.KeyboardEvent) ?? false;\n },\n\n onExit: () => {\n teardown();\n },\n };\n },\n };\n}\n","import type { MentionMarkdownRenderer } from './types';\n\n/**\n * Escape characters that have meaning in markdown link/inline contexts.\n * Conservative — covers the chars that would break `[text](url)` and\n * inline emphasis when a label contains them.\n */\nconst escapeMd = (s: string): string => s.replace(/([\\\\\\[\\]()_*~`])/g, '\\\\$1');\n\n/**\n * Built-in serializers for the `MentionConfig.renderMarkdown` callback.\n *\n * Pick one based on what consumes the markdown:\n *\n * - LLM / chat composer → `plainAt` (the default)\n * - Plain text export → `plainLabel`\n * - Web app with deep-link → `markdownLink(baseUrl)`\n * - Notion / Linear-style → `customUri(scheme, kind)`\n * - Slack-style id refs → `slackStyle`\n * - HTML-allowing renderer → `htmlSpan(className?)`\n *\n * Or pass a custom function — the type is just `(attrs) => string`.\n */\nexport const mentionPresets = {\n /** \"@Label\" — default, ideal for chat where LLMs read the text. */\n plainAt: (({ label, id }) => `@${label || id}`) as MentionMarkdownRenderer,\n\n /** \"Label\" — bare label, no @ prefix. */\n plainLabel: (({ label, id }) => label || id) as MentionMarkdownRenderer,\n\n /** \"[@Label](baseUrl/id)\" — clickable markdown link. */\n markdownLink: (baseUrl: string): MentionMarkdownRenderer =>\n ({ label, id }) =>\n `[@${escapeMd(label || id)}](${baseUrl}${encodeURIComponent(id)})`,\n\n /** \"@[Label](scheme://kind/id)\" — Notion / Linear-style custom URI. */\n customUri: (scheme: string, kind: string): MentionMarkdownRenderer =>\n ({ label, id }) =>\n `@[${escapeMd(label || id)}](${scheme}://${kind}/${encodeURIComponent(id)})`,\n\n /** \"<@id>\" — Slack-style id-only reference (label dropped — receivers resolve it). */\n slackStyle: (({ id }) => `<@${id}>`) as MentionMarkdownRenderer,\n\n /** Inline HTML span — for products that consume markdown with raw HTML allowed. */\n htmlSpan:\n (className = 'mention'): MentionMarkdownRenderer =>\n ({ label, id }) =>\n `<span class=\"${className}\" data-mention-id=\"${encodeURIComponent(id)}\">@${escapeMd(label || id)}</span>`,\n};\n","// SubmitOnEnter — Tiptap extension that hooks ProseMirror's keymap\n// before StarterKit's HardBreak so Enter consistently submits and\n// Shift+Enter inserts a newline (ChatGPT / Telegram behaviour).\n//\n// Why an extension and not a wrapper `onKeyDown` handler:\n//\n// Tiptap registers its keymaps inside the ProseMirror keymap\n// plugin, which runs in the ProseMirror dispatch pipeline. A React\n// `onKeyDown` / `onKeyDownCapture` on a wrapper div fires AFTER\n// ProseMirror has already committed the HardBreak transaction in\n// the same event tick — so calling `preventDefault()` there is too\n// late: the user sees a hard-break flash in, the React handler\n// then runs its preventDefault, and the next Enter submits.\n//\n// Registering the keybinding via `addKeyboardShortcuts` puts us in\n// the same keymap pipeline at a higher priority than StarterKit's\n// default Enter binding, so we intercept before HardBreak runs.\n//\n// The handler also respects IME composition and the mention popover\n// (Tiptap's suggestion plugin captures Enter when its popover is\n// open — we mirror that by checking `.markdown-mention-list` in the\n// DOM; same predicate the wrapper used).\n\nimport { Extension } from '@tiptap/core';\n\nexport interface SubmitOnEnterOptions {\n /** Fired when Enter is pressed without Shift, no IME composition,\n * and no mention popover open. Return `true` to consume the key\n * (default behaviour), `false` to let ProseMirror handle it (i.e.\n * fall back to HardBreak). */\n onSubmit: () => boolean | void;\n}\n\nexport const SubmitOnEnter = Extension.create<SubmitOnEnterOptions>({\n name: 'submitOnEnter',\n\n addOptions() {\n return {\n // Default no-op — explicit consumer must override. We never\n // intercept Enter unless an onSubmit is wired, so leaving the\n // extension installed with no handler is safe.\n onSubmit: () => false,\n };\n },\n\n addKeyboardShortcuts() {\n return {\n Enter: () => {\n // Mention suggestion popover owns Enter while open.\n // The suggestion plugin renders the list with this class\n // (see createMentionSuggestion.ts).\n if (typeof document !== 'undefined' && document.querySelector('.markdown-mention-list')) {\n return false;\n }\n const result = this.options.onSubmit();\n // Default: consume the key (true). Only let it fall through\n // to HardBreak if onSubmit explicitly returned false.\n return result !== false;\n },\n // Shift+Enter — always insert a newline. Tiptap's StarterKit\n // already binds this to HardBreak; we re-bind to `false` (not\n // handled) so the chain falls through cleanly even if other\n // extensions try to grab Shift+Enter.\n 'Shift-Enter': () => false,\n };\n },\n});\n","'use client';\n\nimport { useEditor, EditorContent, type Editor } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Mention from '@tiptap/extension-mention';\nimport { Markdown } from '@tiptap/markdown';\nimport type { AnyExtension } from '@tiptap/core';\nimport { forwardRef, useEffect, useImperativeHandle, useMemo, useRef } from 'react';\nimport {\n Bold, Italic, Strikethrough, Heading1, Heading2, Heading3,\n List, ListOrdered, Quote, Minus, Code, type LucideIcon,\n} from 'lucide-react';\nimport { createMentionSuggestion } from './createMentionSuggestion';\nimport { mentionPresets } from './mentionPresets';\nimport { SubmitOnEnter } from './submitOnEnter';\nimport type { MentionAttrs, MentionConfig } from './types';\nimport './styles.css';\n\n// ── Helpers ──\n\ninterface MarkdownManager {\n serialize: (json: Record<string, unknown>) => string;\n}\n\nfunction getMarkdown(editor: Editor): string {\n const storage = editor.storage.markdown as { manager?: MarkdownManager } | undefined;\n if (!storage?.manager) return editor.getText();\n return storage.manager.serialize(editor.getJSON());\n}\n\nfunction extractMentionIds(editor: Editor): string[] {\n const ids: string[] = [];\n editor.state.doc.descendants((node) => {\n if (node.type.name === 'mention' && node.attrs.id) {\n ids.push(node.attrs.id as string);\n }\n });\n return [...new Set(ids)];\n}\n\n// ── Types ──\n\nexport interface MarkdownEditorProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n minHeight?: number;\n className?: string;\n disabled?: boolean;\n showToolbar?: boolean;\n /**\n * `@`-mention autocomplete config.\n *\n * IMPORTANT: Tiptap's `useEditor` initialises the editor exactly once.\n * The `Mention` extension is only registered when `mentions` is truthy\n * on the FIRST render — handing in a real config later (e.g. after an\n * async items fetch) silently does nothing, and typing `@` will not\n * open the popover.\n *\n * If you want mentions even with async-loaded items, pass\n * `{ items: [] }` from the very first render and update the array\n * when data arrives. Either keep the `MentionConfig` object identity\n * stable across renders and mutate `items` in place (the suggestion\n * plugin captures the config by closure and reads `items` on each\n * query), or accept that swapping the whole object reference is a\n * no-op for the live editor.\n */\n mentions?: MentionConfig;\n /** Called when mentioned IDs change */\n onMentionIdsChange?: (ids: string[]) => void;\n /**\n * Called when the user presses Enter (without Shift, no IME\n * composition, no mention popover open). When set, Enter submits\n * and Shift+Enter inserts a newline — ChatGPT / Telegram chat\n * behaviour. When omitted, Enter behaves as Tiptap default\n * (HardBreak).\n *\n * Implementation lives in `submitOnEnter.ts` — it's a Tiptap\n * keymap extension, NOT a React wrapper handler. Wrapper-level\n * onKeyDown fires AFTER ProseMirror's keymap commits HardBreak in\n * the same tick; routing through the extension lets us intercept\n * before HardBreak runs.\n *\n * Return value (optional): truthy / undefined = consume the key\n * (default). Return `false` from onSubmit to let Tiptap fall\n * through to HardBreak — useful for guards like \"don't submit an\n * empty draft\".\n */\n onSubmit?: () => boolean | void;\n}\n\n/**\n * Imperative handle exposed via `ref`. Matches `ComposerHandle` from\n * `@djangocfg/ui-tools/chat` so consumers can forward it straight into\n * `useRegisterComposer({ focus, moveCursorToEnd })` — that's what makes\n * voice dictation (`VoiceComposerSlot`) push live text into a TipTap\n * composer.\n */\nexport interface MarkdownEditorHandle {\n /** Move keyboard focus into the editor. */\n focus: () => void;\n /** Place the caret at the end of the document (and focus). */\n moveCursorToEnd: () => void;\n /** Escape hatch — the underlying TipTap `Editor` instance. */\n getEditor: () => Editor | null;\n}\n\n// ── Component ──\n\nexport const MarkdownEditor = forwardRef<MarkdownEditorHandle, MarkdownEditorProps>(function MarkdownEditor(\n {\n value,\n onChange,\n placeholder = 'Write markdown...',\n minHeight = 120,\n className = '',\n disabled = false,\n showToolbar = true,\n mentions,\n onMentionIdsChange,\n onSubmit,\n },\n ref,\n) {\n // Keep the latest onSubmit in a ref so the Tiptap extension's\n // keymap closure always calls the freshest handler — Tiptap's\n // useEditor initialises extensions ONCE on first render. Without\n // the ref the extension would call a stale onSubmit (e.g. one\n // that references an outdated `value`).\n const onSubmitRef = useRef(onSubmit);\n onSubmitRef.current = onSubmit;\n const isExternalUpdate = useRef(false);\n\n // ── Dev-mode trap detector ──\n // Tiptap initialises the editor once with the extensions array from\n // first render. If `mentions` is undefined on mount and becomes\n // truthy later, the Mention extension is never installed and the\n // user-visible @-trigger silently does nothing. Catch this early so\n // future consumers don't spend hours debugging why @ does nothing.\n const initialMentionsDefinedRef = useRef<boolean>(mentions !== undefined);\n const warnedRef = useRef(false);\n if (\n process.env.NODE_ENV !== 'production' &&\n !initialMentionsDefinedRef.current &&\n mentions !== undefined &&\n !warnedRef.current\n ) {\n warnedRef.current = true;\n // eslint-disable-next-line no-console\n console.warn(\n '[MarkdownEditor] `mentions` flipped from undefined to a config ' +\n 'after mount. Tiptap only installs the Mention extension on first ' +\n 'render — the @-popover will NOT work for this editor instance. ' +\n 'Pass `{ items: [] }` from the very first render and mutate `.items` ' +\n 'in place instead.',\n );\n }\n\n const extensions = useMemo(() => {\n const exts: AnyExtension[] = [\n StarterKit.configure({ heading: { levels: [1, 2, 3] } }),\n Placeholder.configure({ placeholder }),\n Markdown,\n // SubmitOnEnter — when the consumer wired an onSubmit, intercept\n // Enter at the keymap level (before StarterKit's HardBreak).\n // The extension calls through `onSubmitRef.current` so handler\n // identity changes don't require an editor rebuild. See\n // submitOnEnter.ts for the keymap-vs-wrapper-handler rationale.\n SubmitOnEnter.configure({\n onSubmit: () => {\n const h = onSubmitRef.current;\n if (!h) return false; // no handler → let Tiptap insert HardBreak\n return h();\n },\n }),\n ];\n\n if (mentions) {\n // ── Why .extend() with renderMarkdown ──\n //\n // Tiptap's `Mention` extension ships a default markdown serializer\n // (via `createInlineMarkdownSpec`, see @tiptap/extension-mention)\n // that emits a shortcode like `[@ id=\"...\" label=\"...\"]`. That's\n // round-trippable but useless for most consumers: a chat composer\n // feeding an LLM wants `@<label>`, a deep-linking app wants a\n // markdown link, etc.\n //\n // `renderText` only affects `editor.getText()` and the rendered\n // node — it does NOT influence `@tiptap/markdown`'s serializer.\n // The serializer reads `renderMarkdown` off the extension config\n // (see MarkdownManager.registerExtension → getExtensionField).\n // Overriding it via `.extend({ renderMarkdown })` replaces the\n // shortcode output with whatever the consumer supplied (or the\n // `plainAt` default — see ./mentionPresets.ts).\n //\n // Renderer-choice capture: useEditor only initialises once, so the\n // chosen renderer is captured by closure on first render. This is\n // intentional — swapping renderers per render would mean tearing\n // the editor down anyway, which we don't do for any other prop.\n //\n // Round-trip note: we intentionally do NOT also override\n // `parseMarkdown` / `markdownTokenizer`. Once a mention is\n // serialized, parsing it back would need the original mention\n // items list to look up the id, which we don't have at parse time.\n // Mentions are write-only by design here — `setContent(value)`\n // after submit gets back a plain string, which is fine for the\n // chat use case.\n const renderMarkdown = mentions.renderMarkdown ?? mentionPresets.plainAt;\n exts.push(\n Mention.extend({\n renderMarkdown(node) {\n const raw = node.attrs as { label?: string | null; id?: string | null };\n const attrs: MentionAttrs = {\n id: raw?.id ?? '',\n label: raw?.label ?? '',\n };\n // Defensive: if both are empty (shouldn't happen for a real\n // mention node, but `setContent` of malformed data could),\n // emit nothing rather than a stray \"@\" or invalid link.\n if (!attrs.id && !attrs.label) return '';\n return renderMarkdown(attrs);\n },\n }).configure({\n HTMLAttributes: { class: 'markdown-mention' },\n suggestion: createMentionSuggestion(mentions),\n renderText: ({ node }) => `@${node.attrs.label}`,\n }),\n );\n }\n\n return exts;\n }, [placeholder, mentions]);\n\n const editor = useEditor({\n immediatelyRender: false,\n editable: !disabled,\n extensions,\n content: value,\n onUpdate: ({ editor }) => {\n if (isExternalUpdate.current) return;\n onChange(getMarkdown(editor));\n\n if (onMentionIdsChange) {\n onMentionIdsChange(extractMentionIds(editor));\n }\n },\n editorProps: {\n attributes: {\n class: 'markdown-editor-content focus:outline-none text-sm',\n style: `min-height: ${minHeight}px`,\n },\n },\n });\n\n useEffect(() => {\n if (!editor) return;\n const current = getMarkdown(editor);\n if (current !== value) {\n isExternalUpdate.current = true;\n editor.commands.setContent(value);\n isExternalUpdate.current = false;\n }\n }, [value, editor]);\n\n // Imperative API for hosts that drive the editor without owning a\n // TipTap ref directly — chat composer registration, voice slot,\n // focus-on-stream-end.\n useImperativeHandle(\n ref,\n (): MarkdownEditorHandle => ({\n focus: () => {\n editor?.commands.focus();\n },\n moveCursorToEnd: () => {\n editor?.commands.focus('end');\n },\n getEditor: () => editor ?? null,\n }),\n [editor],\n );\n\n const wrapperClass = `markdown-editor rounded-md border border-input bg-background ${disabled ? 'opacity-60' : ''} ${className}`.trim();\n\n return (\n <div className={wrapperClass}>\n {showToolbar && editor && <MarkdownToolbar editor={editor} />}\n <div className=\"px-3 py-2\">\n <EditorContent editor={editor} />\n </div>\n </div>\n );\n});\n\n// ── Toolbar ──\n\ninterface ToolbarItem {\n icon: LucideIcon;\n action: () => void;\n active: boolean;\n title: string;\n}\n\nfunction MarkdownToolbar({ editor }: { editor: Editor }) {\n const items = useMemo<(ToolbarItem | null)[]>(() => [\n { icon: Bold, title: 'Bold', action: () => editor.chain().focus().toggleBold().run(), active: editor.isActive('bold') },\n { icon: Italic, title: 'Italic', action: () => editor.chain().focus().toggleItalic().run(), active: editor.isActive('italic') },\n { icon: Strikethrough, title: 'Strike', action: () => editor.chain().focus().toggleStrike().run(), active: editor.isActive('strike') },\n { icon: Code, title: 'Code', action: () => editor.chain().focus().toggleCode().run(), active: editor.isActive('code') },\n null,\n { icon: Heading1, title: 'H1', action: () => editor.chain().focus().toggleHeading({ level: 1 }).run(), active: editor.isActive('heading', { level: 1 }) },\n { icon: Heading2, title: 'H2', action: () => editor.chain().focus().toggleHeading({ level: 2 }).run(), active: editor.isActive('heading', { level: 2 }) },\n { icon: Heading3, title: 'H3', action: () => editor.chain().focus().toggleHeading({ level: 3 }).run(), active: editor.isActive('heading', { level: 3 }) },\n null,\n { icon: List, title: 'Bullet list', action: () => editor.chain().focus().toggleBulletList().run(), active: editor.isActive('bulletList') },\n { icon: ListOrdered, title: 'Ordered list', action: () => editor.chain().focus().toggleOrderedList().run(), active: editor.isActive('orderedList') },\n { icon: Quote, title: 'Quote', action: () => editor.chain().focus().toggleBlockquote().run(), active: editor.isActive('blockquote') },\n { icon: Minus, title: 'Divider', action: () => editor.chain().focus().setHorizontalRule().run(), active: false },\n ], [editor]);\n\n return (\n <div className=\"flex items-center gap-0.5 px-2 py-1.5 border-b border-border\">\n {items.map((item, i) => {\n if (!item) return <div key={i} className=\"w-px h-4 bg-border mx-1\" />;\n const Icon = item.icon;\n const btnClass = `markdown-toolbar-btn ${item.active ? 'active' : ''}`;\n return (\n <button key={i} type=\"button\" onClick={item.action} title={item.title} className={btnClass}>\n <Icon style={{ width: 14, height: 14 }} />\n </button>\n );\n })}\n </div>\n );\n}\n"]}
|