@djangocfg/ui-tools 2.1.404 → 2.1.408
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 +9 -11
- package/dist/file-icon/index.cjs +449 -61
- package/dist/file-icon/index.cjs.map +1 -1
- package/dist/file-icon/index.d.cts +56 -18
- package/dist/file-icon/index.d.ts +56 -18
- package/dist/file-icon/index.mjs +448 -62
- package/dist/file-icon/index.mjs.map +1 -1
- package/dist/tree/index.cjs +49 -22
- package/dist/tree/index.cjs.map +1 -1
- package/dist/tree/index.d.cts +9 -3
- package/dist/tree/index.d.ts +9 -3
- package/dist/tree/index.mjs +49 -22
- package/dist/tree/index.mjs.map +1 -1
- package/dist/{types-B_zhyAqR.d.cts → types-eEu8SeiQ.d.cts} +4 -0
- package/dist/{types-B_zhyAqR.d.ts → types-eEu8SeiQ.d.ts} +4 -0
- package/package.json +13 -16
- package/src/components/FloatingToolbar/index.tsx +37 -3
- package/src/lib/page-snapshot/__tests__/capture-integration.test.ts +85 -0
- package/src/lib/page-snapshot/__tests__/engine.test.ts +36 -0
- package/src/lib/page-snapshot/__tests__/redaction-integration.test.ts +99 -0
- package/src/lib/page-snapshot/__tests__/tokens.test.ts +17 -0
- package/src/lib/page-snapshot/capture/__tests__/budget.test.ts +49 -0
- package/src/lib/page-snapshot/capture/__tests__/chrome-filter.test.ts +47 -0
- package/src/lib/page-snapshot/capture/__tests__/fold.test.ts +66 -0
- package/src/lib/page-snapshot/capture/__tests__/scope.test.ts +74 -0
- package/src/lib/page-snapshot/capture/__tests__/walk.test.ts +129 -0
- package/src/lib/page-snapshot/capture/accessible-name.ts +73 -0
- package/src/lib/page-snapshot/capture/budget.ts +95 -0
- package/src/lib/page-snapshot/capture/chrome-filter.ts +81 -0
- package/src/lib/page-snapshot/capture/classify.ts +111 -0
- package/src/lib/page-snapshot/capture/dom-utils.ts +111 -0
- package/src/lib/page-snapshot/capture/fold.ts +96 -0
- package/src/lib/page-snapshot/capture/scope.ts +169 -0
- package/src/lib/page-snapshot/capture/walk.ts +250 -0
- package/src/lib/page-snapshot/cst/__tests__/serialize.test.ts +50 -0
- package/src/lib/page-snapshot/cst/directives.ts +47 -0
- package/src/lib/page-snapshot/cst/payload.ts +50 -0
- package/src/lib/page-snapshot/cst/serialize.ts +84 -0
- package/src/lib/page-snapshot/cst/types.ts +115 -0
- package/src/lib/page-snapshot/engine.ts +176 -0
- package/src/lib/page-snapshot/index.ts +93 -0
- package/src/lib/page-snapshot/react/PageSnapshotChip.tsx +72 -0
- package/src/lib/page-snapshot/react/PageSnapshotPreview.tsx +78 -0
- package/src/lib/page-snapshot/react/__tests__/PageSnapshotChip.test.tsx +54 -0
- package/src/lib/page-snapshot/react/__tests__/provider.test.tsx +103 -0
- package/src/lib/page-snapshot/react/__tests__/use-page-snapshot-toggle.test.tsx +62 -0
- package/src/lib/page-snapshot/react/provider.tsx +162 -0
- package/src/lib/page-snapshot/react/use-page-snapshot-toggle.ts +47 -0
- package/src/lib/page-snapshot/react/use-page-snapshot.ts +67 -0
- package/src/lib/page-snapshot/redaction/__tests__/audit.test.ts +25 -0
- package/src/lib/page-snapshot/redaction/__tests__/heuristics.test.ts +73 -0
- package/src/lib/page-snapshot/redaction/__tests__/luhn.test.ts +26 -0
- package/src/lib/page-snapshot/redaction/__tests__/patterns.test.ts +60 -0
- package/src/lib/page-snapshot/redaction/audit.ts +58 -0
- package/src/lib/page-snapshot/redaction/heuristics.ts +75 -0
- package/src/lib/page-snapshot/redaction/index.ts +75 -0
- package/src/lib/page-snapshot/redaction/luhn.ts +25 -0
- package/src/lib/page-snapshot/redaction/patterns.ts +111 -0
- package/src/lib/page-snapshot/refs/__tests__/registry.test.ts +24 -0
- package/src/lib/page-snapshot/refs/registry.ts +46 -0
- package/src/lib/page-snapshot/staleness/__tests__/hash.test.ts +34 -0
- package/src/lib/page-snapshot/staleness/hash.ts +20 -0
- package/src/lib/page-snapshot/tokens.ts +15 -0
- package/src/tools/AudioPlayer/context/PlayerProvider.tsx +13 -14
- package/src/tools/AudioPlayer/hooks/useAudioElementEvents.ts +55 -6
- package/src/tools/AudioPlayer/lazy.tsx +13 -27
- package/src/tools/AudioPlayer/parts/Meta/TimeDisplay.tsx +2 -5
- package/src/tools/Chat/README.md +267 -39
- package/src/tools/Chat/composer/Composer.tsx +471 -0
- package/src/tools/Chat/composer/ComposerActionBar.tsx +65 -0
- package/src/tools/Chat/composer/ComposerBanner.tsx +128 -0
- package/src/tools/Chat/composer/ComposerButton.tsx +64 -0
- package/src/tools/Chat/composer/ComposerFooter.tsx +90 -0
- package/src/tools/Chat/composer/ComposerMenuButton.tsx +62 -0
- package/src/tools/Chat/composer/ComposerModelPicker.tsx +104 -0
- package/src/tools/Chat/composer/ComposerRichTextarea.tsx +88 -0
- package/src/tools/Chat/composer/ComposerToolPill.tsx +95 -0
- package/src/tools/Chat/composer/index.ts +45 -0
- package/src/tools/Chat/composer/size-context.tsx +26 -0
- package/src/tools/Chat/composer/types.ts +143 -0
- package/src/tools/Chat/composer/useComposerActions.tsx +164 -0
- package/src/tools/Chat/context/ChatProvider.tsx +54 -3
- package/src/tools/Chat/core/__tests__/metadata.test.ts +69 -0
- package/src/tools/Chat/core/index.ts +23 -1
- package/src/tools/Chat/core/markdown.ts +1 -1
- package/src/tools/Chat/core/metadata.ts +47 -0
- package/src/tools/Chat/core/payload-dispatch.ts +1 -1
- package/src/tools/Chat/core/transport/http.ts +71 -32
- package/src/tools/Chat/core/transport/sse.ts +18 -10
- package/src/tools/Chat/highlight/HighlightOverlay.tsx +101 -0
- package/src/tools/Chat/highlight/README.md +103 -0
- package/src/tools/Chat/highlight/SpotlightCanvas.tsx +153 -0
- package/src/tools/Chat/highlight/__tests__/HighlightOverlay.test.tsx +112 -0
- package/src/tools/Chat/highlight/__tests__/resolveRef.test.ts +55 -0
- package/src/tools/Chat/highlight/index.ts +21 -0
- package/src/tools/Chat/highlight/resolveRef.ts +42 -0
- package/src/tools/Chat/highlight/types.ts +49 -0
- package/src/tools/Chat/highlight/useHighlightTargets.ts +128 -0
- package/src/tools/Chat/hooks/index.ts +0 -5
- package/src/tools/Chat/hooks/useAutoFocusOnStreamEnd.ts +28 -47
- package/src/tools/Chat/hooks/useChat.ts +47 -14
- package/src/tools/Chat/hooks/useChatComposer.ts +2 -2
- package/src/tools/Chat/hooks/useChatLayout.ts +1 -1
- package/src/tools/Chat/hooks/useStreamEndFocus.ts +54 -0
- package/src/tools/Chat/index.ts +25 -219
- package/src/tools/Chat/launcher/ChatDock.tsx +1 -1
- package/src/tools/Chat/launcher/ChatLauncher.tsx +1 -1
- package/src/tools/Chat/launcher/{ChatHeader.tsx → header/ChatHeader.tsx} +24 -11
- package/src/tools/Chat/launcher/{ChatHeaderActionButton.tsx → header/ChatHeaderActionButton.tsx} +34 -3
- package/src/tools/Chat/launcher/{ChatHeaderLanguageButton.tsx → header/ChatHeaderLanguageButton.tsx} +2 -2
- package/src/tools/Chat/launcher/{ChatHeaderModeToggle.tsx → header/ChatHeaderModeToggle.tsx} +1 -1
- package/src/tools/Chat/launcher/{ChatHeaderResetButton.tsx → header/ChatHeaderResetButton.tsx} +2 -1
- package/src/tools/Chat/launcher/{HeaderSlots.tsx → header/HeaderSlots.tsx} +3 -3
- package/src/tools/Chat/launcher/header/index.ts +26 -0
- package/src/tools/Chat/launcher/index.ts +3 -10
- package/src/tools/Chat/lazy.tsx +38 -284
- package/src/tools/Chat/{components → messages}/MessageBubble.tsx +58 -5
- package/src/tools/Chat/{components → messages}/MessageList.tsx +8 -25
- package/src/tools/Chat/messages/blocks/MessageBlocks.tsx +131 -0
- package/src/tools/Chat/messages/blocks/builtin.tsx +91 -0
- package/src/tools/Chat/messages/blocks/index.ts +12 -0
- package/src/tools/Chat/messages/blocks/registry.tsx +42 -0
- package/src/tools/Chat/messages/blocks/renderers/AudioBlock.tsx +20 -0
- package/src/tools/Chat/messages/blocks/renderers/CodeBlock.tsx +19 -0
- package/src/tools/Chat/messages/blocks/renderers/GalleryBlock.tsx +26 -0
- package/src/tools/Chat/messages/blocks/renderers/ImageBlock.tsx +27 -0
- package/src/tools/Chat/messages/blocks/renderers/JsonBlock.tsx +12 -0
- package/src/tools/Chat/messages/blocks/renderers/LottieBlock.tsx +11 -0
- package/src/tools/Chat/messages/blocks/renderers/MapBlock.tsx +36 -0
- package/src/tools/Chat/messages/blocks/renderers/MermaidBlock.tsx +11 -0
- package/src/tools/Chat/messages/blocks/renderers/VideoBlock.tsx +24 -0
- package/src/tools/Chat/messages/blocks/renderers/types.ts +8 -0
- package/src/tools/Chat/{components → messages}/index.ts +11 -5
- package/src/tools/Chat/public.ts +212 -0
- package/src/tools/Chat/shell/ChatRoot.tsx +326 -0
- package/src/tools/Chat/{components → shell}/EmptyState.tsx +4 -2
- package/src/tools/Chat/shell/index.ts +15 -0
- package/src/tools/Chat/types/block.ts +120 -0
- package/src/tools/Chat/types/config.ts +0 -5
- package/src/tools/Chat/types/index.ts +17 -0
- package/src/tools/Chat/types/message.ts +3 -0
- package/src/tools/Chat/utils/index.ts +4 -0
- package/src/tools/CodeEditor/README.md +4 -6
- package/src/tools/CodeEditor/components/DiffEditor.tsx +48 -13
- package/src/tools/CodeEditor/components/Editor.tsx +96 -44
- package/src/tools/CodeEditor/context/EditorProvider.tsx +34 -17
- package/src/tools/CodeEditor/hooks/useEditorTheme.ts +92 -99
- package/src/tools/CodeEditor/hooks/useMonaco.ts +37 -22
- package/src/tools/CodeEditor/lazy.tsx +6 -0
- package/src/tools/CodeEditor/lib/index.ts +1 -1
- package/src/tools/CodeEditor/lib/themes.ts +3 -39
- package/src/tools/CronScheduler/CronScheduler.client.tsx +230 -61
- package/src/tools/CronScheduler/components/CustomInput.tsx +21 -4
- package/src/tools/CronScheduler/components/DayChips.tsx +13 -11
- package/src/tools/CronScheduler/components/MonthDayGrid.tsx +4 -4
- package/src/tools/CronScheduler/components/SchedulePreview.tsx +7 -3
- package/src/tools/CronScheduler/components/TimeSelector.tsx +1 -1
- package/src/tools/CronScheduler/index.tsx +1 -1
- package/src/tools/CronScheduler/types/index.ts +8 -3
- package/src/tools/CronScheduler/utils/cron-humanize.ts +61 -16
- package/src/tools/CronScheduler/utils/cron-parser.ts +13 -4
- package/src/tools/FileIcon/FileIcon.tsx +24 -39
- package/src/tools/FileIcon/get-file-icon.ts +73 -0
- package/src/tools/FileIcon/icons/icon-data.ts +399 -0
- package/src/tools/FileIcon/index.ts +4 -0
- package/src/tools/FileIcon/loader.ts +17 -35
- package/src/tools/FileIcon/specialFolders.ts +18 -0
- package/src/tools/Gallery/components/lightbox/GalleryLightbox.tsx +112 -35
- package/src/tools/Gallery/components/media/GalleryVideo.tsx +21 -2
- package/src/tools/Gallery/components/preview/GalleryCarousel.tsx +11 -1
- package/src/tools/Gallery/hooks/usePreloadImages.ts +54 -7
- package/src/tools/ImageViewer/components/ImageInfo.tsx +12 -1
- package/src/tools/ImageViewer/components/ImageToolbar.tsx +51 -43
- package/src/tools/ImageViewer/components/ImageViewer.tsx +106 -26
- package/src/tools/ImageViewer/hooks/useImageLoading.ts +13 -0
- package/src/tools/ImageViewer/utils/constants.ts +3 -0
- package/src/tools/ImageViewer/utils/index.ts +1 -0
- package/src/tools/JsonForm/JsonSchemaForm.tsx +4 -1
- package/src/tools/JsonForm/templates/ArrayFieldTemplate.tsx +5 -3
- package/src/tools/JsonForm/templates/BaseInputTemplate.tsx +7 -4
- package/src/tools/JsonForm/templates/ErrorListTemplate.tsx +3 -1
- package/src/tools/JsonForm/templates/ObjectFieldTemplate.tsx +23 -3
- package/src/tools/JsonForm/widgets/ColorWidget.tsx +20 -12
- package/src/tools/JsonForm/widgets/NumberWidget.tsx +14 -9
- package/src/tools/JsonForm/widgets/RadioWidget.tsx +78 -0
- package/src/tools/JsonForm/widgets/SelectWidget.tsx +1 -0
- package/src/tools/JsonForm/widgets/SliderWidget.tsx +7 -4
- package/src/tools/JsonForm/widgets/TextWidget.tsx +41 -17
- package/src/tools/JsonForm/widgets/index.ts +1 -0
- package/src/tools/JsonTree/components/JsonContent.tsx +115 -40
- package/src/tools/LottiePlayer/LottiePlayer.client.tsx +177 -72
- package/src/tools/LottiePlayer/index.tsx +14 -4
- package/src/tools/LottiePlayer/lazy.tsx +11 -3
- package/src/tools/LottiePlayer/types.ts +31 -1
- package/src/tools/LottiePlayer/useLottie.ts +32 -9
- package/src/tools/LottiePlayer/usePrefersReducedMotion.ts +46 -0
- package/src/tools/Map/components/LayerSwitcher.tsx +54 -21
- package/src/tools/Map/components/MapCluster.tsx +28 -21
- package/src/tools/Map/components/MapContainer.tsx +11 -4
- package/src/tools/Map/components/MapLegend.tsx +46 -15
- package/src/tools/Map/components/MapMarker.tsx +31 -2
- package/src/tools/Map/hooks/useMapEvents.ts +64 -105
- package/src/tools/MarkdownEditor/MarkdownEditor.tsx +61 -6
- package/src/tools/MarkdownEditor/MentionList.tsx +37 -4
- package/src/tools/MarkdownEditor/createMentionSuggestion.ts +11 -0
- package/src/tools/MarkdownEditor/lazy.tsx +32 -7
- package/src/tools/MarkdownEditor/styles.css +13 -0
- package/src/tools/MarkdownMessage/CodeBlock.tsx +40 -17
- package/src/tools/MarkdownMessage/MarkdownMessage.tsx +26 -6
- package/src/tools/MarkdownMessage/components.tsx +22 -9
- package/src/tools/MarkdownMessage/types.ts +24 -1
- package/src/tools/Mermaid/Mermaid.client.tsx +27 -5
- package/src/tools/Mermaid/components/MermaidErrorPanel.tsx +31 -0
- package/src/tools/Mermaid/components/MermaidFullscreenModal.tsx +14 -17
- package/src/tools/Mermaid/hooks/useMermaidRenderer.ts +264 -168
- package/src/tools/Mermaid/hooks/useMermaidValidation.ts +76 -10
- package/src/tools/Mermaid/index.tsx +6 -0
- package/src/tools/Mermaid/utils/mermaid-helpers.ts +141 -18
- package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/SchemaFields/FieldRow.tsx +11 -1
- package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/SchemaFields/buildTree.ts +49 -20
- package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/index.tsx +7 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/grouping.ts +7 -4
- package/src/tools/OpenapiViewer/constants.ts +3 -0
- package/src/tools/OpenapiViewer/hooks/useOpenApiSchema.ts +73 -11
- package/src/tools/OpenapiViewer/utils/schemaExport.ts +26 -6
- package/src/tools/PrettyCode/PrettyCode.client.tsx +23 -16
- package/src/tools/PrettyCode/lazy.tsx +1 -1
- package/src/tools/SpeechRecognition/README.md +1 -1
- package/src/tools/SpeechRecognition/__tests__/language.test.ts +9 -3
- package/src/tools/SpeechRecognition/components/RecordingPulse.tsx +59 -0
- package/src/tools/SpeechRecognition/components/index.ts +2 -0
- package/src/tools/SpeechRecognition/core/engine/external.ts +24 -7
- package/src/tools/SpeechRecognition/core/language.ts +23 -6
- package/src/tools/SpeechRecognition/hooks/usePushToTalk.ts +36 -5
- package/src/tools/SpeechRecognition/hooks/useSpeechRecognition.ts +18 -11
- package/src/tools/SpeechRecognition/widgets/VoiceComposerSlot.tsx +94 -26
- package/src/tools/SpeechRecognition/widgets/index.ts +1 -1
- package/src/tools/Tree/README.md +4 -8
- package/src/tools/Tree/TreeRoot.tsx +22 -10
- package/src/tools/Tree/components/TreeContent.tsx +24 -4
- package/src/tools/Tree/components/TreeLabel.tsx +8 -2
- package/src/tools/Tree/components/TreeRow.tsx +16 -6
- package/src/tools/Tree/data/flatten.ts +10 -4
- package/src/tools/Tree/types.ts +4 -0
- package/src/tools/Uploader/components/UploadAddButton.tsx +29 -6
- package/src/tools/Uploader/components/UploadDropzone.tsx +63 -7
- package/src/tools/Uploader/components/UploadPageDropOverlay.tsx +19 -5
- package/src/tools/Uploader/components/UploadPreviewItem.tsx +47 -17
- package/src/tools/Uploader/components/UploadPreviewList.tsx +24 -12
- package/src/tools/Uploader/utils/formatters.ts +8 -3
- package/src/tools/VideoPlayer/README.md +87 -230
- package/src/tools/VideoPlayer/VideoPlayer.tsx +82 -0
- package/src/tools/VideoPlayer/canvas/canvas-dispatcher.tsx +34 -0
- package/src/tools/VideoPlayer/canvas/hls-canvas.tsx +39 -0
- package/src/tools/VideoPlayer/canvas/iframe-canvas.tsx +33 -0
- package/src/tools/VideoPlayer/canvas/index.ts +12 -0
- package/src/tools/VideoPlayer/canvas/jsx-augmentation.ts +47 -0
- package/src/tools/VideoPlayer/canvas/native-canvas.tsx +38 -0
- package/src/tools/VideoPlayer/canvas/vimeo-canvas.tsx +40 -0
- package/src/tools/VideoPlayer/canvas/youtube-canvas.tsx +78 -0
- package/src/tools/VideoPlayer/index.ts +51 -65
- package/src/tools/VideoPlayer/lazy.tsx +11 -54
- package/src/tools/VideoPlayer/parts/controls-bar.tsx +35 -0
- package/src/tools/VideoPlayer/parts/fullscreen.tsx +19 -0
- package/src/tools/VideoPlayer/parts/index.ts +15 -0
- package/src/tools/VideoPlayer/parts/pip.tsx +19 -0
- package/src/tools/VideoPlayer/parts/play-button.tsx +19 -0
- package/src/tools/VideoPlayer/parts/playback-rate.tsx +31 -0
- package/src/tools/VideoPlayer/parts/poster.tsx +3 -0
- package/src/tools/VideoPlayer/parts/seek-bar.tsx +26 -0
- package/src/tools/VideoPlayer/parts/volume.tsx +32 -0
- package/src/tools/VideoPlayer/styles/video-player.css +141 -0
- package/src/tools/VideoPlayer/types.ts +82 -0
- package/src/tools/VideoPlayer/utils/parse-embed-url.ts +70 -0
- package/src/tools/VideoPlayer/utils/vimeo-id.ts +24 -0
- package/src/tools/VideoPlayer/utils/youtube-id.ts +64 -0
- package/src/tools/index.ts +37 -29
- package/src/tools/Chat/components/AudioToggle.tsx +0 -78
- package/src/tools/Chat/components/ChatRoot.tsx +0 -305
- package/src/tools/Chat/components/Composer.tsx +0 -216
- package/src/tools/Chat/hooks/useChatScroll.ts +0 -145
- package/src/tools/Chat/types.ts +0 -9
- package/src/tools/JsonTree/components/JsonToolbar.tsx +0 -95
- package/src/tools/JsonTree/hooks/useElementCorner.ts +0 -84
- package/src/tools/JsonTree/hooks/useNavbarHeight.ts +0 -83
- package/src/tools/OpenapiViewer/components/DocsLayout/schemaFields.ts +0 -121
- package/src/tools/Tour/README.md +0 -373
- package/src/tools/Tour/components/Tour.tsx +0 -12
- package/src/tools/Tour/components/TourContent.tsx +0 -171
- package/src/tools/Tour/components/TourNavigation.tsx +0 -77
- package/src/tools/Tour/components/TourProgress.tsx +0 -88
- package/src/tools/Tour/components/TourSpotlight.tsx +0 -199
- package/src/tools/Tour/components/index.ts +0 -5
- package/src/tools/Tour/context/TourContext.ts +0 -19
- package/src/tools/Tour/context/TourProvider.tsx +0 -292
- package/src/tools/Tour/context/index.ts +0 -2
- package/src/tools/Tour/hooks/index.ts +0 -3
- package/src/tools/Tour/hooks/useKeyboardNavigation.ts +0 -59
- package/src/tools/Tour/hooks/useStepTarget.ts +0 -121
- package/src/tools/Tour/hooks/useTour.ts +0 -42
- package/src/tools/Tour/index.ts +0 -38
- package/src/tools/Tour/types/index.ts +0 -224
- package/src/tools/Tour/utils/dom.ts +0 -98
- package/src/tools/Tour/utils/index.ts +0 -3
- package/src/tools/Tour/utils/logger.ts +0 -3
- package/src/tools/Tour/utils/scrollIntoView.ts +0 -24
- package/src/tools/VideoPlayer/components/VideoControls.tsx +0 -138
- package/src/tools/VideoPlayer/components/VideoErrorFallback.tsx +0 -172
- package/src/tools/VideoPlayer/components/VideoPlayer.tsx +0 -201
- package/src/tools/VideoPlayer/components/index.ts +0 -14
- package/src/tools/VideoPlayer/context/VideoPlayerContext.tsx +0 -52
- package/src/tools/VideoPlayer/context/index.ts +0 -8
- package/src/tools/VideoPlayer/hooks/index.ts +0 -12
- package/src/tools/VideoPlayer/hooks/useVideoPlayerSettings.ts +0 -71
- package/src/tools/VideoPlayer/hooks/useVideoPositionCache.ts +0 -117
- package/src/tools/VideoPlayer/providers/NativeProvider.tsx +0 -284
- package/src/tools/VideoPlayer/providers/StreamProvider.tsx +0 -505
- package/src/tools/VideoPlayer/providers/VidstackProvider.tsx +0 -397
- package/src/tools/VideoPlayer/providers/index.ts +0 -8
- package/src/tools/VideoPlayer/types/index.ts +0 -38
- package/src/tools/VideoPlayer/types/player.ts +0 -116
- package/src/tools/VideoPlayer/types/provider.ts +0 -93
- package/src/tools/VideoPlayer/types/sources.ts +0 -97
- package/src/tools/VideoPlayer/utils/debug.ts +0 -14
- package/src/tools/VideoPlayer/utils/fileSource.ts +0 -78
- package/src/tools/VideoPlayer/utils/index.ts +0 -12
- package/src/tools/VideoPlayer/utils/resolvers.ts +0 -75
- /package/src/tools/Chat/{config.ts → constants.ts} +0 -0
- /package/src/tools/Chat/launcher/{ChatHeaderAudioToggle.tsx → header/ChatHeaderAudioToggle.tsx} +0 -0
- /package/src/tools/Chat/{components → messages}/Attachments.tsx +0 -0
- /package/src/tools/Chat/{components → messages}/JumpToLatest.tsx +0 -0
- /package/src/tools/Chat/{components → messages}/MessageActions.tsx +0 -0
- /package/src/tools/Chat/{components → messages}/Sources.tsx +0 -0
- /package/src/tools/Chat/{components → messages}/StreamingIndicator.tsx +0 -0
- /package/src/tools/Chat/{components → messages}/ToolCalls.tsx +0 -0
- /package/src/tools/Chat/{components → shell}/ErrorBanner.tsx +0 -0
|
@@ -1,31 +1,33 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { useEffect,
|
|
4
|
-
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
|
|
5
|
+
/** Background used for the editor and its loading/error placeholders. */
|
|
6
|
+
export const EDITOR_BACKGROUND = '#0a0a0a';
|
|
5
7
|
|
|
6
8
|
/**
|
|
7
|
-
* Hook that
|
|
9
|
+
* Hook that registers and returns the Monaco editor theme.
|
|
8
10
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
+
* The editor is always dark — devtool-style — regardless of the app theme.
|
|
12
|
+
* Colors are read from the document's CSS variables so the editor still
|
|
13
|
+
* matches the design tokens, with a dark fallback for SSR.
|
|
11
14
|
*
|
|
12
15
|
* @param monaco - Monaco namespace (null during loading)
|
|
13
|
-
* @param themeOverride - Optional explicit theme name (skips
|
|
16
|
+
* @param themeOverride - Optional explicit theme name (skips the app theme)
|
|
14
17
|
* @returns Resolved Monaco theme name to pass to editor options
|
|
15
18
|
*/
|
|
16
19
|
export function useEditorTheme(
|
|
17
20
|
monaco: typeof import('monaco-editor') | null,
|
|
18
21
|
themeOverride?: string,
|
|
19
22
|
): string {
|
|
20
|
-
|
|
21
|
-
const registered =
|
|
23
|
+
// State (not ref) so consumers re-render once the custom theme is registered.
|
|
24
|
+
const [registered, setRegistered] = useState(false);
|
|
22
25
|
|
|
23
|
-
// Register custom themes once Monaco is loaded
|
|
24
26
|
useEffect(() => {
|
|
25
|
-
if (!monaco
|
|
27
|
+
if (!monaco) return;
|
|
26
28
|
|
|
27
29
|
try {
|
|
28
|
-
const colors =
|
|
30
|
+
const colors = readEditorColors();
|
|
29
31
|
|
|
30
32
|
monaco.editor.defineTheme('app-dark', {
|
|
31
33
|
base: 'vs-dark',
|
|
@@ -53,106 +55,97 @@ export function useEditorTheme(
|
|
|
53
55
|
},
|
|
54
56
|
});
|
|
55
57
|
|
|
56
|
-
|
|
57
|
-
base: 'vs',
|
|
58
|
-
inherit: true,
|
|
59
|
-
rules: [
|
|
60
|
-
{ token: 'comment', foreground: '008000', fontStyle: 'italic' },
|
|
61
|
-
{ token: 'keyword', foreground: 'AF00DB' },
|
|
62
|
-
{ token: 'string', foreground: 'A31515' },
|
|
63
|
-
{ token: 'number', foreground: '098658' },
|
|
64
|
-
{ token: 'type', foreground: '267F99' },
|
|
65
|
-
{ token: 'function', foreground: '795E26' },
|
|
66
|
-
{ token: 'variable', foreground: '001080' },
|
|
67
|
-
],
|
|
68
|
-
colors: {
|
|
69
|
-
'editor.background': colors.backgroundLight,
|
|
70
|
-
'editor.foreground': colors.foregroundLight,
|
|
71
|
-
'editor.lineHighlightBackground': colors.lineHighlightLight,
|
|
72
|
-
'editor.selectionBackground': colors.selectionLight,
|
|
73
|
-
'editorLineNumber.foreground': colors.mutedForegroundLight,
|
|
74
|
-
'editorWidget.background': colors.cardLight,
|
|
75
|
-
'editorWidget.border': colors.borderLight,
|
|
76
|
-
},
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
registered.current = true;
|
|
58
|
+
setRegistered(true);
|
|
80
59
|
} catch {
|
|
81
|
-
// Fallback — use built-in
|
|
60
|
+
// Fallback — use the built-in dark theme.
|
|
61
|
+
setRegistered(false);
|
|
82
62
|
}
|
|
83
63
|
}, [monaco]);
|
|
84
64
|
|
|
85
|
-
// If explicit override provided, use it
|
|
86
65
|
if (themeOverride) return themeOverride;
|
|
87
|
-
|
|
88
|
-
// Use registered app themes if available, fallback to built-in
|
|
89
|
-
if (registered.current) {
|
|
90
|
-
return appTheme === 'dark' ? 'app-dark' : 'app-light';
|
|
91
|
-
}
|
|
92
|
-
return appTheme === 'dark' ? 'vs-dark' : 'vs';
|
|
66
|
+
return registered ? 'app-dark' : 'vs-dark';
|
|
93
67
|
}
|
|
94
68
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
69
|
+
/**
|
|
70
|
+
* Read editor colors from the document's dark theme CSS variables.
|
|
71
|
+
*
|
|
72
|
+
* Tokens in `tokens.css` are stored wrapped, e.g. `--background: hsl(0 0% 4%)`,
|
|
73
|
+
* so we resolve them through the browser by painting onto a probe element and
|
|
74
|
+
* reading back the computed (already-rgb) color. This works for any color
|
|
75
|
+
* syntax (hsl/oklch/hex).
|
|
76
|
+
*/
|
|
77
|
+
function readEditorColors() {
|
|
78
|
+
// Dark defaults — used during SSR and as a safety net.
|
|
79
|
+
const fallback = {
|
|
80
|
+
background: EDITOR_BACKGROUND,
|
|
81
|
+
foreground: '#f5f5f5',
|
|
82
|
+
card: '#141414',
|
|
83
|
+
border: '#262626',
|
|
84
|
+
mutedForeground: '#858585',
|
|
85
|
+
lineHighlight: '#1a1a1a',
|
|
86
|
+
selection: '#264F78',
|
|
101
87
|
};
|
|
102
88
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
const parts = hsl.split(/\s+/).map(s => parseFloat(s.replace('%', '')));
|
|
107
|
-
if (parts.length < 3 || parts.some(isNaN)) return '';
|
|
108
|
-
const [h, s, l] = [parts[0], parts[1] / 100, parts[2] / 100];
|
|
109
|
-
|
|
110
|
-
const a = s * Math.min(l, 1 - l);
|
|
111
|
-
const f = (n: number) => {
|
|
112
|
-
const k = (n + h / 30) % 12;
|
|
113
|
-
const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);
|
|
114
|
-
return Math.round(255 * color).toString(16).padStart(2, '0');
|
|
115
|
-
};
|
|
116
|
-
return `#${f(0)}${f(8)}${f(4)}`;
|
|
117
|
-
};
|
|
89
|
+
if (typeof document === 'undefined' || typeof window === 'undefined') {
|
|
90
|
+
return fallback;
|
|
91
|
+
}
|
|
118
92
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
// Light theme colors (hardcoded since we can't switch CSS context)
|
|
132
|
-
return {
|
|
133
|
-
background,
|
|
134
|
-
foreground,
|
|
135
|
-
card,
|
|
136
|
-
border,
|
|
137
|
-
mutedForeground,
|
|
138
|
-
lineHighlight,
|
|
139
|
-
selection,
|
|
140
|
-
// Light variants
|
|
141
|
-
backgroundLight: '#ffffff',
|
|
142
|
-
foregroundLight: '#1a1a1a',
|
|
143
|
-
cardLight: '#ffffff',
|
|
144
|
-
borderLight: '#e5e5e5',
|
|
145
|
-
mutedForegroundLight: '#737373',
|
|
146
|
-
lineHighlightLight: '#f5f5f5',
|
|
147
|
-
selectionLight: '#ADD6FF',
|
|
93
|
+
const probe = document.createElement('div');
|
|
94
|
+
probe.style.position = 'absolute';
|
|
95
|
+
probe.style.pointerEvents = 'none';
|
|
96
|
+
probe.style.opacity = '0';
|
|
97
|
+
document.body.appendChild(probe);
|
|
98
|
+
|
|
99
|
+
/** Resolve a CSS var to a hex color via computed style; '' on failure. */
|
|
100
|
+
const resolve = (varName: string): string => {
|
|
101
|
+
probe.style.color = `var(${varName})`;
|
|
102
|
+
const computed = getComputedStyle(probe).color;
|
|
103
|
+
return rgbToHex(computed);
|
|
148
104
|
};
|
|
105
|
+
|
|
106
|
+
try {
|
|
107
|
+
const background = resolve('--background') || fallback.background;
|
|
108
|
+
const foreground = resolve('--foreground') || fallback.foreground;
|
|
109
|
+
const card = resolve('--card') || fallback.card;
|
|
110
|
+
const border = resolve('--border') || fallback.border;
|
|
111
|
+
const mutedForeground = resolve('--muted-foreground') || fallback.mutedForeground;
|
|
112
|
+
const primary = resolve('--primary');
|
|
113
|
+
|
|
114
|
+
return {
|
|
115
|
+
background,
|
|
116
|
+
foreground,
|
|
117
|
+
card,
|
|
118
|
+
border,
|
|
119
|
+
mutedForeground,
|
|
120
|
+
lineHighlight: mixHex(background, foreground, 0.06),
|
|
121
|
+
selection: primary ? mixHex(primary, background, 0.55) : fallback.selection,
|
|
122
|
+
};
|
|
123
|
+
} finally {
|
|
124
|
+
probe.remove();
|
|
125
|
+
}
|
|
149
126
|
}
|
|
150
127
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
const b =
|
|
156
|
-
|
|
128
|
+
/** Convert a computed `rgb(r, g, b)` / `rgba(...)` string to `#rrggbb`. */
|
|
129
|
+
function rgbToHex(rgb: string): string {
|
|
130
|
+
const match = rgb.match(/(\d+(?:\.\d+)?)/g);
|
|
131
|
+
if (!match || match.length < 3) return '';
|
|
132
|
+
const [r, g, b] = match.slice(0, 3).map((n) => Math.round(parseFloat(n)));
|
|
133
|
+
const toHex = (v: number) => Math.min(255, Math.max(0, v)).toString(16).padStart(2, '0');
|
|
134
|
+
return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
|
|
157
135
|
}
|
|
158
136
|
|
|
137
|
+
/** Linearly blend `a` toward `b` by `t` (0..1). Both must be `#rrggbb`. */
|
|
138
|
+
function mixHex(a: string, b: string, t: number): string {
|
|
139
|
+
const pa = parseInt(a.slice(1), 16);
|
|
140
|
+
const pb = parseInt(b.slice(1), 16);
|
|
141
|
+
if (Number.isNaN(pa) || Number.isNaN(pb)) return a;
|
|
142
|
+
const lerp = (shift: number) => {
|
|
143
|
+
const ca = (pa >> shift) & 0xff;
|
|
144
|
+
const cb = (pb >> shift) & 0xff;
|
|
145
|
+
return Math.round(ca + (cb - ca) * t);
|
|
146
|
+
};
|
|
147
|
+
const r = lerp(16);
|
|
148
|
+
const g = lerp(8);
|
|
149
|
+
const bch = lerp(0);
|
|
150
|
+
return `#${((r << 16) | (g << 8) | bch).toString(16).padStart(6, '0')}`;
|
|
151
|
+
}
|
|
@@ -6,11 +6,36 @@ import type * as MonacoEditor from 'monaco-editor';
|
|
|
6
6
|
import { setupMonacoWorkers } from '../workers/setup';
|
|
7
7
|
import type { UseMonacoReturn } from '../types';
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Shared, module-level Monaco loader.
|
|
11
|
+
*
|
|
12
|
+
* Monaco is ~550KB — we load it exactly once per page and hand the same
|
|
13
|
+
* module to every `useMonaco()` consumer. Without this each Editor /
|
|
14
|
+
* DiffEditor / EditorProvider would manage its own loading state and
|
|
15
|
+
* briefly flash a spinner even though the module is already in memory.
|
|
16
|
+
*/
|
|
17
|
+
let monacoPromise: Promise<typeof MonacoEditor> | null = null;
|
|
18
|
+
|
|
19
|
+
function loadMonaco(): Promise<typeof MonacoEditor> {
|
|
20
|
+
if (!monacoPromise) {
|
|
21
|
+
monacoPromise = (async () => {
|
|
22
|
+
setupMonacoWorkers();
|
|
23
|
+
return import('monaco-editor');
|
|
24
|
+
})().catch((err) => {
|
|
25
|
+
// Reset so a later mount can retry instead of being stuck on a
|
|
26
|
+
// permanently-rejected promise.
|
|
27
|
+
monacoPromise = null;
|
|
28
|
+
throw err;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
return monacoPromise;
|
|
32
|
+
}
|
|
33
|
+
|
|
9
34
|
/**
|
|
10
35
|
* Hook to load and access Monaco Editor instance
|
|
11
36
|
*
|
|
12
37
|
* Handles:
|
|
13
|
-
* - Dynamic import of Monaco (client-side only)
|
|
38
|
+
* - Dynamic import of Monaco (client-side only, loaded once and shared)
|
|
14
39
|
* - Web worker configuration
|
|
15
40
|
* - Loading state management
|
|
16
41
|
*
|
|
@@ -33,27 +58,17 @@ export function useMonaco(): UseMonacoReturn {
|
|
|
33
58
|
useEffect(() => {
|
|
34
59
|
let mounted = true;
|
|
35
60
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
} catch (err) {
|
|
49
|
-
if (mounted) {
|
|
50
|
-
setError(err instanceof Error ? err : new Error('Failed to load Monaco Editor'));
|
|
51
|
-
setIsLoading(false);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
loadMonaco();
|
|
61
|
+
loadMonaco()
|
|
62
|
+
.then((monacoModule) => {
|
|
63
|
+
if (!mounted) return;
|
|
64
|
+
setMonaco(monacoModule);
|
|
65
|
+
setIsLoading(false);
|
|
66
|
+
})
|
|
67
|
+
.catch((err) => {
|
|
68
|
+
if (!mounted) return;
|
|
69
|
+
setError(err instanceof Error ? err : new Error('Failed to load Monaco Editor'));
|
|
70
|
+
setIsLoading(false);
|
|
71
|
+
});
|
|
57
72
|
|
|
58
73
|
return () => {
|
|
59
74
|
mounted = false;
|
|
@@ -43,6 +43,12 @@ export const LazyDiffEditor = createLazyComponent<DiffEditorProps>(
|
|
|
43
43
|
},
|
|
44
44
|
);
|
|
45
45
|
|
|
46
|
+
// `Editor` / `DiffEditor` are the plain named exports — same lazy components,
|
|
47
|
+
// kept so callers can `import { Editor } from '@djangocfg/ui-tools/code-editor'`
|
|
48
|
+
// without knowing about the `Lazy*` naming.
|
|
49
|
+
export { LazyEditor as Editor };
|
|
50
|
+
export { LazyDiffEditor as DiffEditor };
|
|
51
|
+
|
|
46
52
|
// ============================================================================
|
|
47
53
|
// Light surface
|
|
48
54
|
// ============================================================================
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { getLanguageByExtension, getLanguageByFilename, LANGUAGE_MAP } from './languages';
|
|
2
|
-
export { EDITOR_THEMES
|
|
2
|
+
export { EDITOR_THEMES } from './themes';
|
|
@@ -1,32 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Editor Themes
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* The editor is always dark (devtool-style), so only dark themes are exposed.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
export type EditorTheme = 'vs
|
|
7
|
+
export type EditorTheme = 'vs-dark' | 'hc-black' | 'cmdop-dark';
|
|
8
8
|
|
|
9
9
|
export const EDITOR_THEMES = {
|
|
10
10
|
// Built-in themes
|
|
11
|
-
'vs': 'Light (VS Code)',
|
|
12
11
|
'vs-dark': 'Dark (VS Code)',
|
|
13
12
|
'hc-black': 'High Contrast Dark',
|
|
14
|
-
|
|
15
|
-
// Custom themes (to be defined)
|
|
13
|
+
// Custom themes
|
|
16
14
|
'cmdop-dark': 'CMDOP Dark',
|
|
17
|
-
'cmdop-light': 'CMDOP Light',
|
|
18
15
|
} as const;
|
|
19
16
|
|
|
20
|
-
/**
|
|
21
|
-
* Get default theme based on system preference
|
|
22
|
-
*/
|
|
23
|
-
export function getDefaultTheme(): EditorTheme {
|
|
24
|
-
if (typeof window === 'undefined') return 'vs-dark';
|
|
25
|
-
|
|
26
|
-
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
27
|
-
return prefersDark ? 'vs-dark' : 'vs';
|
|
28
|
-
}
|
|
29
|
-
|
|
30
17
|
/**
|
|
31
18
|
* CMDOP Dark Theme Definition
|
|
32
19
|
* Can be registered with monaco.editor.defineTheme()
|
|
@@ -53,26 +40,3 @@ export const cmdopDarkTheme = {
|
|
|
53
40
|
'editorLineNumber.activeForeground': '#C6C6C6',
|
|
54
41
|
},
|
|
55
42
|
};
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* CMDOP Light Theme Definition
|
|
59
|
-
*/
|
|
60
|
-
export const cmdopLightTheme = {
|
|
61
|
-
base: 'vs' as const,
|
|
62
|
-
inherit: true,
|
|
63
|
-
rules: [
|
|
64
|
-
{ token: 'comment', foreground: '008000', fontStyle: 'italic' },
|
|
65
|
-
{ token: 'keyword', foreground: 'AF00DB' },
|
|
66
|
-
{ token: 'string', foreground: 'A31515' },
|
|
67
|
-
{ token: 'number', foreground: '098658' },
|
|
68
|
-
{ token: 'type', foreground: '267F99' },
|
|
69
|
-
{ token: 'function', foreground: '795E26' },
|
|
70
|
-
{ token: 'variable', foreground: '001080' },
|
|
71
|
-
],
|
|
72
|
-
colors: {
|
|
73
|
-
'editor.background': '#FFFFFF',
|
|
74
|
-
'editor.foreground': '#000000',
|
|
75
|
-
'editor.lineHighlightBackground': '#F5F5F5',
|
|
76
|
-
'editor.selectionBackground': '#ADD6FF',
|
|
77
|
-
},
|
|
78
|
-
};
|