@djangocfg/ui-tools 2.1.418 → 2.1.419
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/file-icon/index.cjs +3 -3
- package/dist/file-icon/index.cjs.map +1 -1
- package/dist/file-icon/index.mjs +3 -3
- package/dist/file-icon/index.mjs.map +1 -1
- package/package.json +93 -28
- package/src/common/FloatingToolbar/actions/CopyAction.tsx +31 -0
- package/src/{components → common}/FloatingToolbar/actions/DownloadAction.tsx +15 -10
- package/src/common/FloatingToolbar/actions/ExpandAction.tsx +33 -0
- package/src/common/FloatingToolbar/actions/FullscreenAction.tsx +38 -0
- package/src/{components → common}/FloatingToolbar/index.tsx +39 -0
- package/src/lib/http.ts +64 -0
- package/src/tools/chat/index.ts +1 -1
- package/src/tools/chat/launcher/ChatFAB.tsx +66 -74
- package/src/tools/chat/launcher/header/ChatHeaderActionButton.tsx +2 -3
- package/src/tools/chat/lazy.tsx +1 -1
- package/src/tools/chat/messages/MessageBubble.tsx +1 -1
- package/src/tools/chat/messages/blocks/builtin.tsx +1 -1
- package/src/tools/chat/messages/blocks/renderers/CodeBlock.tsx +2 -2
- package/src/tools/chat/messages/blocks/renderers/JsonBlock.tsx +12 -1
- package/src/tools/data/DataGrid/lazy.tsx +1 -1
- package/src/tools/data/DataTable/lazy.tsx +1 -1
- package/src/tools/data/JsonTree/JsonViewer.tsx +720 -0
- package/src/tools/data/JsonTree/README.md +126 -73
- package/src/tools/data/JsonTree/index.tsx +3 -95
- package/src/tools/data/JsonTree/lazy.tsx +10 -50
- package/src/tools/data/JsonTree/types.ts +82 -63
- package/src/tools/data/Kanban/lazy.tsx +1 -1
- package/src/tools/data/Listbox/lazy.tsx +1 -1
- package/src/tools/data/Masonry/lazy.tsx +1 -1
- package/src/tools/data/Timeline/lazy.tsx +1 -1
- package/src/tools/data/Tree/lazy.tsx +1 -1
- package/src/tools/dev/Map/lazy.tsx +1 -1
- package/src/tools/dev/Mermaid/Mermaid.client.tsx +2 -2
- package/src/tools/dev/Mermaid/lazy.tsx +1 -1
- package/src/tools/dev/api/ApiRefTable/ApiRefTable.tsx +65 -0
- package/src/tools/dev/api/ApiRefTable/README.md +31 -0
- package/src/tools/dev/api/ApiRefTable/components/Row.tsx +96 -0
- package/src/tools/dev/api/ApiRefTable/components/TypeDisplay.tsx +44 -0
- package/src/tools/dev/api/ApiRefTable/index.ts +6 -0
- package/src/tools/dev/api/ApiRefTable/lazy.tsx +21 -0
- package/src/tools/dev/api/ApiRefTable/types.ts +82 -0
- package/src/tools/dev/api/ApiRefTable/utils.ts +42 -0
- package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/ApiIntroSection.tsx +1 -1
- package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/CodeSamples/index.tsx +1 -1
- package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Header/index.tsx +1 -1
- package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Responses/ResponseBody.tsx +7 -21
- package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/RequestPanel.tsx +1 -1
- package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/PrettyView.tsx +13 -19
- package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/types.ts +1 -1
- package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/lazy.tsx +1 -1
- package/src/tools/dev/api/RequestViewer/README.md +33 -0
- package/src/tools/dev/api/RequestViewer/RequestViewer.tsx +121 -0
- package/src/tools/dev/api/RequestViewer/components/BodyTab.tsx +44 -0
- package/src/tools/dev/api/RequestViewer/components/EmptyState.tsx +13 -0
- package/src/tools/dev/api/RequestViewer/components/HeadersTab.tsx +78 -0
- package/src/tools/dev/api/RequestViewer/components/TimingTab.tsx +113 -0
- package/src/tools/dev/api/RequestViewer/components/utils.ts +31 -0
- package/src/tools/dev/api/RequestViewer/index.ts +16 -0
- package/src/tools/dev/api/RequestViewer/lazy.tsx +30 -0
- package/src/tools/dev/api/RequestViewer/types.ts +81 -0
- package/src/tools/dev/code/DiffViewer/DiffViewer.tsx +144 -0
- package/src/tools/dev/code/DiffViewer/README.md +33 -0
- package/src/tools/dev/code/DiffViewer/components/CopyButton.tsx +49 -0
- package/src/tools/dev/code/DiffViewer/components/DiffLineContent.tsx +48 -0
- package/src/tools/dev/code/DiffViewer/components/SplitView.tsx +220 -0
- package/src/tools/dev/code/DiffViewer/components/UnifiedView.tsx +154 -0
- package/src/tools/dev/code/DiffViewer/hooks/useDiff.ts +47 -0
- package/src/tools/dev/code/DiffViewer/hooks/useHighlighter.ts +54 -0
- package/src/tools/dev/code/DiffViewer/index.ts +22 -0
- package/src/tools/dev/code/DiffViewer/lazy.tsx +22 -0
- package/src/tools/dev/code/DiffViewer/types.ts +109 -0
- package/src/tools/dev/code/DiffViewer/utils/computeDiff.ts +159 -0
- package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/CollapseToggle.tsx +1 -1
- package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/MarkdownMessage.tsx +1 -1
- package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/components.tsx +2 -2
- package/src/tools/dev/{PrettyCode → code/PrettyCode}/PrettyCode.client.tsx +2 -2
- package/src/tools/dev/{PrettyCode → code/PrettyCode}/lazy.tsx +1 -1
- package/src/tools/dev/ops/EnvTable/EnvTable.tsx +228 -0
- package/src/tools/dev/ops/EnvTable/README.md +29 -0
- package/src/tools/dev/ops/EnvTable/hooks/useEnvMask.ts +121 -0
- package/src/tools/dev/ops/EnvTable/index.ts +12 -0
- package/src/tools/dev/ops/EnvTable/lazy.tsx +21 -0
- package/src/tools/dev/ops/EnvTable/types.ts +76 -0
- package/src/tools/dev/ops/LogViewer/LogViewer.tsx +194 -0
- package/src/tools/dev/ops/LogViewer/README.md +30 -0
- package/src/tools/dev/ops/LogViewer/components/LogRow.tsx +151 -0
- package/src/tools/dev/ops/LogViewer/components/Toolbar.tsx +199 -0
- package/src/tools/dev/ops/LogViewer/hooks/useAutoScroll.ts +68 -0
- package/src/tools/dev/ops/LogViewer/hooks/useLogFilter.ts +58 -0
- package/src/tools/dev/ops/LogViewer/index.ts +18 -0
- package/src/tools/dev/ops/LogViewer/lazy.tsx +25 -0
- package/src/tools/dev/ops/LogViewer/types.ts +142 -0
- package/src/tools/dev/ops/LogViewer/utils/ansi.ts +231 -0
- package/src/tools/forms/CodeEditor/hooks/useEditorTheme.ts +13 -73
- package/src/tools/forms/CodeEditor/lazy.tsx +1 -1
- package/src/tools/forms/FileUpload/lazy.tsx +1 -1
- package/src/tools/forms/JsonEditor/JsonEditor.tsx +115 -0
- package/src/tools/forms/JsonEditor/index.ts +1 -0
- package/src/tools/forms/JsonEditor/lazy.tsx +24 -0
- package/src/tools/forms/JsonForm/index.ts +1 -1
- package/src/tools/forms/JsonForm/lazy.tsx +1 -1
- package/src/tools/forms/MarkdownEditor/lazy.tsx +1 -1
- package/src/tools/forms/NotionEditor/README.md +237 -0
- package/src/tools/forms/NotionEditor/lazy.tsx +1 -1
- package/src/tools/index.ts +153 -13
- package/src/tools/input/Combobox/lazy.tsx +1 -1
- package/src/tools/input/CronScheduler/components/CronPreview.README.md +28 -0
- package/src/tools/input/CronScheduler/components/CronPreview.tsx +136 -0
- package/src/tools/input/CronScheduler/components/index.ts +3 -0
- package/src/tools/input/CronScheduler/index.tsx +5 -1
- package/src/tools/input/CronScheduler/lazy.tsx +5 -1
- package/src/tools/input/CronScheduler/utils/cron-next-runs.ts +122 -0
- package/src/tools/input/CronScheduler/utils/index.ts +1 -0
- package/src/tools/input/Scroller/lazy.tsx +1 -1
- package/src/tools/input/Sortable/lazy.tsx +1 -1
- package/src/tools/input/SpeechRecognition/lazy.tsx +1 -1
- package/src/tools/input/SpeechRecognition/widgets/VoiceComposerSlot.tsx +41 -36
- package/src/tools/media/ImageViewer/components/ImageToolbar.tsx +58 -47
- package/src/tools/media/ImageViewer/components/ImageViewer.tsx +27 -19
- package/src/tools/media/ImageViewer/lazy.tsx +1 -1
- package/src/tools/media/LottiePlayer/lazy.tsx +1 -1
- package/src/tools/media/VideoPlayer/VideoPlayer.tsx +28 -1
- package/src/tools/media/VideoPlayer/parts/fullscreen.tsx +21 -4
- package/src/tools/media/VideoPlayer/parts/pip.tsx +21 -4
- package/src/tools/media/VideoPlayer/parts/play-button.tsx +21 -4
- package/src/tools/media/VideoPlayer/parts/playback-rate.tsx +19 -3
- package/src/tools/media/VideoPlayer/parts/volume.tsx +237 -18
- package/src/tools/media/VideoPlayer/styles/video-player.css +87 -7
- package/src/tools/overlay/ResponsiveDialog/lazy.tsx +1 -1
- package/src/tools/overlay/ScrollSpy/lazy.tsx +1 -1
- package/src/tools/overlay/SelectionToolbar/lazy.tsx +1 -1
- package/src/tools/overlay/Tour/lazy.tsx +1 -1
- package/src/tools/visual/Marquee/lazy.tsx +1 -1
- package/src/tools/visual/QRCode/lazy.tsx +1 -1
- package/src/tools/visual/charts/ActivityGraph/ActivityGraph.tsx +195 -0
- package/src/tools/visual/charts/ActivityGraph/README.md +28 -0
- package/src/tools/visual/charts/ActivityGraph/index.ts +8 -0
- package/src/tools/visual/charts/ActivityGraph/lazy.tsx +21 -0
- package/src/tools/visual/charts/ActivityGraph/types.ts +59 -0
- package/src/tools/visual/charts/ActivityGraph/utils.ts +88 -0
- package/src/tools/visual/charts/CommitGraph/CommitGraph.tsx +80 -0
- package/src/tools/visual/charts/CommitGraph/README.md +28 -0
- package/src/tools/visual/charts/CommitGraph/components/CommitDetail.tsx +107 -0
- package/src/tools/visual/charts/CommitGraph/components/CommitRow.tsx +122 -0
- package/src/tools/visual/charts/CommitGraph/components/Rails.tsx +171 -0
- package/src/tools/visual/charts/CommitGraph/hooks/useGraphLayout.ts +169 -0
- package/src/tools/visual/charts/CommitGraph/hooks/useLaneColors.ts +45 -0
- package/src/tools/visual/charts/CommitGraph/index.ts +14 -0
- package/src/tools/visual/charts/CommitGraph/lazy.tsx +25 -0
- package/src/tools/visual/charts/CommitGraph/types.ts +85 -0
- package/src/tools/visual/charts/CommitGraph/utils.ts +53 -0
- package/src/tools/visual/{Gauge → charts/Gauge}/lazy.tsx +1 -1
- package/src/tools/visual/charts/Sparkline/README.md +29 -0
- package/src/tools/visual/charts/Sparkline/Sparkline.tsx +217 -0
- package/src/tools/visual/charts/Sparkline/index.ts +9 -0
- package/src/tools/visual/charts/Sparkline/lazy.tsx +26 -0
- package/src/tools/visual/charts/Sparkline/types.ts +58 -0
- package/src/tools/visual/design/ColorPalette/ColorPalette.tsx +129 -0
- package/src/tools/visual/design/ColorPalette/README.md +34 -0
- package/src/tools/visual/design/ColorPalette/components/Swatch.tsx +102 -0
- package/src/tools/visual/design/ColorPalette/hooks/useCopyToClipboard.ts +41 -0
- package/src/tools/visual/design/ColorPalette/index.ts +12 -0
- package/src/tools/visual/design/ColorPalette/lazy.tsx +21 -0
- package/src/tools/visual/design/ColorPalette/types.ts +63 -0
- package/src/tools/visual/design/ColorPalette/utils.ts +83 -0
- package/src/tools/visual/{ColorPicker → design/ColorPicker}/lazy.tsx +1 -1
- package/src/tools/visual/{FileIcon → design/FileIcon}/treeAdapter.tsx +1 -1
- package/src/tools/visual/{Fps → indicators/Fps}/lazy.tsx +1 -1
- package/src/tools/visual/{Rating → indicators/Rating}/lazy.tsx +1 -1
- package/src/tools/visual/indicators/StatusIndicator/README.md +28 -0
- package/src/tools/visual/indicators/StatusIndicator/StatusIndicator.tsx +83 -0
- package/src/tools/visual/indicators/StatusIndicator/index.ts +14 -0
- package/src/tools/visual/indicators/StatusIndicator/lazy.tsx +21 -0
- package/src/tools/visual/indicators/StatusIndicator/types.ts +133 -0
- package/src/components/FloatingToolbar/actions/CopyAction.tsx +0 -22
- package/src/components/FloatingToolbar/actions/ExpandAction.tsx +0 -25
- package/src/components/FloatingToolbar/actions/FullscreenAction.tsx +0 -30
- package/src/tools/data/JsonTree/components/JsonContent.tsx +0 -197
- package/src/tools/data/JsonTree/hooks/useJsonExpand.ts +0 -50
- /package/src/{components → common}/FloatingToolbar/FloatingToolbar.css +0 -0
- /package/src/{components → common}/FloatingToolbar/actions/index.ts +0 -0
- /package/src/{components → common}/FloatingToolbar/hooks/useElementCorner.ts +0 -0
- /package/src/{components → common}/FloatingToolbar/hooks/useScrollIsolation.ts +0 -0
- /package/src/{components → common}/index.ts +0 -0
- /package/src/{components → common}/lazy-wrapper.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/README.md +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/DocsView.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/CodeSamples/LanguageTabs.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/CodeSamples/useCodeSnippet.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Header/MetaActions.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Header/MethodBadge.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Header/PathDisplay.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Parameters/ParamGroup.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Parameters/ParamRow.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Parameters/index.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/RequestBody/index.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Responses/ResponseRow.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Responses/StatusTag.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Responses/index.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/SchemaFields/FieldRow.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/SchemaFields/buildTree.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/SchemaFields/index.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/SchemaFields/types.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Section/SectionHeader.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Section/defaults.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/Section/index.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/context.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/hooks/useSectionHash.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/index.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/store/index.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/store/selectors.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/EndpointDoc/types.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/SchemaCopyMenu.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/BrandHeader.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/CategoryBlock.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/EndpointRow.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/SchemaSection.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/SearchInput.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/SidebarBody.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/Toolbar.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/buildVM.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/index.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/types.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/Sidebar/useDebouncedValue.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/SlideInPlayground.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/TryItSheet.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/anchor.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/grouping.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/index.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/DocsLayout/sidebarLabel.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/index.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/BodyFormEditor.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/EndpointDraftSync.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/EndpointResetButton.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/PreviewView.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/RawView.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/StatusBar.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/ViewTabs.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/detectContent.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/index.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ResponsePanel/useResponseView.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/SendButton.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/components/shared/ui.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/constants.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/context/PlaygroundContext.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/hooks/index.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/hooks/useDocsUrlSync.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/hooks/useEndpointDraft.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/hooks/useMobile.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/hooks/useOpenApiSchema.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/index.tsx +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/types.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/apiKeyManager.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/codeSamples.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/formatters.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/index.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/operationToHar.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/sampler.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/schemaExport.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/scrollParent.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/url.ts +0 -0
- /package/src/tools/dev/{OpenapiViewer → api/OpenapiViewer}/utils/versionManager.ts +0 -0
- /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/ActionRow.tsx +0 -0
- /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/ChatMessageRow.tsx +0 -0
- /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/CodeBlock.tsx +0 -0
- /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/README.md +0 -0
- /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/index.ts +0 -0
- /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/linkRules.ts +0 -0
- /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/plainText.ts +0 -0
- /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/sanitize.ts +0 -0
- /package/src/tools/dev/{MarkdownMessage → code/MarkdownMessage}/types.ts +0 -0
- /package/src/tools/dev/{PrettyCode → code/PrettyCode}/README.md +0 -0
- /package/src/tools/dev/{PrettyCode → code/PrettyCode}/index.tsx +0 -0
- /package/src/tools/dev/{PrettyCode → code/PrettyCode}/registerPrismLanguages.ts +0 -0
- /package/src/tools/visual/{Gauge → charts/Gauge}/Gauge.tsx +0 -0
- /package/src/tools/visual/{Gauge → charts/Gauge}/index.ts +0 -0
- /package/src/tools/visual/{Gauge → charts/Gauge}/types.ts +0 -0
- /package/src/tools/visual/{ColorPicker → design/ColorPicker}/ColorPicker.tsx +0 -0
- /package/src/tools/visual/{ColorPicker → design/ColorPicker}/context/ColorPickerContext.tsx +0 -0
- /package/src/tools/visual/{ColorPicker → design/ColorPicker}/context/ColorPickerStore.tsx +0 -0
- /package/src/tools/visual/{ColorPicker → design/ColorPicker}/context/index.ts +0 -0
- /package/src/tools/visual/{ColorPicker → design/ColorPicker}/index.ts +0 -0
- /package/src/tools/visual/{ColorPicker → design/ColorPicker}/lib/color-utils.ts +0 -0
- /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/ColorPickerAlphaSlider.tsx +0 -0
- /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/ColorPickerArea.tsx +0 -0
- /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/ColorPickerEyeDropper.tsx +0 -0
- /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/ColorPickerFormatSelect.tsx +0 -0
- /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/ColorPickerHueSlider.tsx +0 -0
- /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/ColorPickerInput.tsx +0 -0
- /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/ColorPickerSwatch.tsx +0 -0
- /package/src/tools/visual/{ColorPicker → design/ColorPicker}/parts/index.ts +0 -0
- /package/src/tools/visual/{ColorPicker → design/ColorPicker}/types.ts +0 -0
- /package/src/tools/visual/{FileIcon → design/FileIcon}/FileIcon.tsx +0 -0
- /package/src/tools/visual/{FileIcon → design/FileIcon}/get-file-icon.ts +0 -0
- /package/src/tools/visual/{FileIcon → design/FileIcon}/icons/icon-data.ts +0 -0
- /package/src/tools/visual/{FileIcon → design/FileIcon}/index.ts +0 -0
- /package/src/tools/visual/{FileIcon → design/FileIcon}/loader.ts +0 -0
- /package/src/tools/visual/{FileIcon → design/FileIcon}/specialFolders.ts +0 -0
- /package/src/tools/visual/{Fps → indicators/Fps}/Fps.tsx +0 -0
- /package/src/tools/visual/{Fps → indicators/Fps}/index.ts +0 -0
- /package/src/tools/visual/{Fps → indicators/Fps}/types.ts +0 -0
- /package/src/tools/visual/{Rating → indicators/Rating}/Rating.tsx +0 -0
- /package/src/tools/visual/{Rating → indicators/Rating}/index.ts +0 -0
- /package/src/tools/visual/{Rating → indicators/Rating}/types.ts +0 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// Adapted from jalcoui (MIT) — github.com/jal-co/ui
|
|
2
|
+
|
|
3
|
+
import type * as React from 'react';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Display format for the copied / rendered color value.
|
|
7
|
+
*
|
|
8
|
+
* - `hex` — `#0989aa` (default). Canvas2D / SVG friendly.
|
|
9
|
+
* - `rgb` — `rgb(9, 137, 170)`.
|
|
10
|
+
* - `hsl` — `hsl(192, 90%, 35%)`.
|
|
11
|
+
*/
|
|
12
|
+
export type ColorFormat = 'hex' | 'rgb' | 'hsl';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* A single color entry rendered as one swatch.
|
|
16
|
+
*
|
|
17
|
+
* `value` is always a hex string (`#rrggbb`). Resolve theme tokens
|
|
18
|
+
* to hex via `useThemeColor(...)` before passing them in.
|
|
19
|
+
*/
|
|
20
|
+
export interface ColorEntry {
|
|
21
|
+
/** Display name (e.g. "Primary", "Success", "brand-accent"). */
|
|
22
|
+
name: string;
|
|
23
|
+
/** Hex color value, e.g. `#0989aa`. */
|
|
24
|
+
value: string;
|
|
25
|
+
/** Optional usage note. */
|
|
26
|
+
description?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Source of swatches.
|
|
31
|
+
*
|
|
32
|
+
* - `theme` — semantic tokens from `useThemePalette()` (background,
|
|
33
|
+
* foreground, primary, secondary, muted, accent, destructive, …).
|
|
34
|
+
* - `preset` — status preset family from `useStylePresets()`
|
|
35
|
+
* (primary, success, warning, danger, info, chart3-5).
|
|
36
|
+
* - `custom` — caller-provided `colors` array.
|
|
37
|
+
*/
|
|
38
|
+
export type ColorPaletteMode = 'theme' | 'preset' | 'custom';
|
|
39
|
+
|
|
40
|
+
export interface ColorPaletteProps
|
|
41
|
+
extends Omit<React.ComponentProps<'div'>, 'children'> {
|
|
42
|
+
/**
|
|
43
|
+
* Where swatches come from. Defaults to `'custom'` when `colors` is
|
|
44
|
+
* provided, otherwise `'theme'`.
|
|
45
|
+
*/
|
|
46
|
+
mode?: ColorPaletteMode;
|
|
47
|
+
/**
|
|
48
|
+
* Explicit list of swatches (required when `mode === 'custom'`).
|
|
49
|
+
* Ignored for `'theme'` / `'preset'`.
|
|
50
|
+
*/
|
|
51
|
+
colors?: ColorEntry[];
|
|
52
|
+
/** Grid column count. @default 4 */
|
|
53
|
+
columns?: number;
|
|
54
|
+
/**
|
|
55
|
+
* Format of the copied value AND the rendered value text.
|
|
56
|
+
* @default 'hex'
|
|
57
|
+
*/
|
|
58
|
+
copyFormat?: ColorFormat;
|
|
59
|
+
/** Show the color name label below the swatch. @default true */
|
|
60
|
+
showName?: boolean;
|
|
61
|
+
/** Show the color value string below the swatch. @default true */
|
|
62
|
+
showValue?: boolean;
|
|
63
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Adapted from jalcoui (MIT) — github.com/jal-co/ui
|
|
2
|
+
|
|
3
|
+
import type { ColorFormat } from './types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Parse a `#rrggbb` / `#rgb` hex string into `{ r, g, b }` (0–255).
|
|
7
|
+
* Returns `null` for malformed input.
|
|
8
|
+
*/
|
|
9
|
+
function parseHex(hex: string): { r: number; g: number; b: number } | null {
|
|
10
|
+
const cleaned = hex.trim().replace(/^#/, '');
|
|
11
|
+
if (cleaned.length === 3) {
|
|
12
|
+
const r = parseInt(cleaned[0] + cleaned[0], 16);
|
|
13
|
+
const g = parseInt(cleaned[1] + cleaned[1], 16);
|
|
14
|
+
const b = parseInt(cleaned[2] + cleaned[2], 16);
|
|
15
|
+
if ([r, g, b].some(Number.isNaN)) return null;
|
|
16
|
+
return { r, g, b };
|
|
17
|
+
}
|
|
18
|
+
if (cleaned.length === 6) {
|
|
19
|
+
const r = parseInt(cleaned.slice(0, 2), 16);
|
|
20
|
+
const g = parseInt(cleaned.slice(2, 4), 16);
|
|
21
|
+
const b = parseInt(cleaned.slice(4, 6), 16);
|
|
22
|
+
if ([r, g, b].some(Number.isNaN)) return null;
|
|
23
|
+
return { r, g, b };
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function rgbToHsl(
|
|
29
|
+
r: number,
|
|
30
|
+
g: number,
|
|
31
|
+
b: number,
|
|
32
|
+
): { h: number; s: number; l: number } {
|
|
33
|
+
const rn = r / 255;
|
|
34
|
+
const gn = g / 255;
|
|
35
|
+
const bn = b / 255;
|
|
36
|
+
const max = Math.max(rn, gn, bn);
|
|
37
|
+
const min = Math.min(rn, gn, bn);
|
|
38
|
+
const l = (max + min) / 2;
|
|
39
|
+
let h = 0;
|
|
40
|
+
let s = 0;
|
|
41
|
+
if (max !== min) {
|
|
42
|
+
const d = max - min;
|
|
43
|
+
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
|
44
|
+
switch (max) {
|
|
45
|
+
case rn:
|
|
46
|
+
h = (gn - bn) / d + (gn < bn ? 6 : 0);
|
|
47
|
+
break;
|
|
48
|
+
case gn:
|
|
49
|
+
h = (bn - rn) / d + 2;
|
|
50
|
+
break;
|
|
51
|
+
case bn:
|
|
52
|
+
h = (rn - gn) / d + 4;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
h /= 6;
|
|
56
|
+
}
|
|
57
|
+
return { h: Math.round(h * 360), s: Math.round(s * 100), l: Math.round(l * 100) };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Format a hex color into the requested {@link ColorFormat}. Falls
|
|
62
|
+
* back to the original string when the hex is unparseable.
|
|
63
|
+
*/
|
|
64
|
+
export function formatColor(hex: string, format: ColorFormat): string {
|
|
65
|
+
if (format === 'hex') return hex.toLowerCase();
|
|
66
|
+
const rgb = parseHex(hex);
|
|
67
|
+
if (!rgb) return hex;
|
|
68
|
+
if (format === 'rgb') return `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`;
|
|
69
|
+
const { h, s, l } = rgbToHsl(rgb.r, rgb.g, rgb.b);
|
|
70
|
+
return `hsl(${h}, ${s}%, ${l}%)`;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Return `'light'` when the hex color is bright enough that black
|
|
75
|
+
* text reads better against it, otherwise `'dark'`. Uses standard
|
|
76
|
+
* Rec. 601 luminance (`0.299·R + 0.587·G + 0.114·B`).
|
|
77
|
+
*/
|
|
78
|
+
export function getReadableContrast(hex: string): 'light' | 'dark' {
|
|
79
|
+
const rgb = parseHex(hex);
|
|
80
|
+
if (!rgb) return 'dark';
|
|
81
|
+
const luminance = (0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b) / 255;
|
|
82
|
+
return luminance > 0.6 ? 'light' : 'dark';
|
|
83
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { createLazyComponent } from '
|
|
3
|
+
import { createLazyComponent } from '../../../../common/lazy-wrapper';
|
|
4
4
|
import type { ColorPickerProps } from './types';
|
|
5
5
|
|
|
6
6
|
export const LazyColorPicker = createLazyComponent<ColorPickerProps>(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import type { TreeNode, TreeRowSlot } from '
|
|
3
|
+
import type { TreeNode, TreeRowSlot } from '../../../data/Tree/types';
|
|
4
4
|
import { FileIcon, type FileIconSize } from './FileIcon';
|
|
5
5
|
import type { FolderIconOverrides } from './specialFolders';
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { createLazyComponent } from '
|
|
3
|
+
import { createLazyComponent } from '../../../../common/lazy-wrapper';
|
|
4
4
|
import type { RatingProps } from './types';
|
|
5
5
|
|
|
6
6
|
export const LazyRating = createLazyComponent<RatingProps>(
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# StatusIndicator
|
|
2
|
+
|
|
3
|
+
Compact operational-status pill (dot + label). Maps `Status` → semantic `StatusTone` (success / warning / destructive / info / muted) via `STATUS_CONFIG`.
|
|
4
|
+
|
|
5
|
+
This component is the **golden sample** for the jalcoui port — it demonstrates all CONTRACT rules (semantic tokens, CVA variants, no nested providers, attribution).
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
import { StatusIndicator } from '@djangocfg/ui-tools/status-indicator';
|
|
9
|
+
|
|
10
|
+
<StatusIndicator status="operational" />
|
|
11
|
+
<StatusIndicator status="degraded" size="lg" />
|
|
12
|
+
<StatusIndicator status="incident" label="Custom label" />
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Props
|
|
16
|
+
|
|
17
|
+
| Prop | Type | Default | Description |
|
|
18
|
+
|---|---|---|---|
|
|
19
|
+
| `status` | `Status` | — | `'operational' \| 'degraded' \| 'partial-outage' \| 'major-outage' \| 'maintenance' \| 'incident' \| 'unknown'`. |
|
|
20
|
+
| `tone` | `StatusTone` | from `STATUS_CONFIG` | Override the semantic tone. |
|
|
21
|
+
| `label` | `string` | from `STATUS_CONFIG` | Override the visible label. |
|
|
22
|
+
| `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Pill scale. |
|
|
23
|
+
|
|
24
|
+
Storybook: `apps/storybook/stories/ui-tools/visual/StatusIndicator.stories.tsx`
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
Adapted from jalcoui (MIT).
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Adapted from jalcoui (MIT) — github.com/jal-co/ui
|
|
2
|
+
//
|
|
3
|
+
// Operational status badge with colored dot and label for dashboards,
|
|
4
|
+
// status pages, and header bars.
|
|
5
|
+
//
|
|
6
|
+
// Golden sample — see CONTRACT.md. Demonstrates:
|
|
7
|
+
// - semantic tokens only (no raw color scales)
|
|
8
|
+
// - Tailwind `animate-ping` for pulse (no framer-motion)
|
|
9
|
+
// - attribution header
|
|
10
|
+
// - no nested providers
|
|
11
|
+
// - decomposed types in `./types`, lazy in `./lazy`
|
|
12
|
+
|
|
13
|
+
'use client';
|
|
14
|
+
|
|
15
|
+
import * as React from 'react';
|
|
16
|
+
import { cn } from '@djangocfg/ui-core/lib';
|
|
17
|
+
import {
|
|
18
|
+
STATUS_CONFIG,
|
|
19
|
+
TONE_CLASSES,
|
|
20
|
+
statusIndicatorVariants,
|
|
21
|
+
type StatusIndicatorProps,
|
|
22
|
+
type StatusTone,
|
|
23
|
+
} from './types';
|
|
24
|
+
|
|
25
|
+
const LIVE_STATUSES = new Set<string>([
|
|
26
|
+
'incident',
|
|
27
|
+
'major-outage',
|
|
28
|
+
'partial-outage',
|
|
29
|
+
'degraded',
|
|
30
|
+
]);
|
|
31
|
+
|
|
32
|
+
export function StatusIndicator({
|
|
33
|
+
status,
|
|
34
|
+
label,
|
|
35
|
+
tone: toneProp,
|
|
36
|
+
pulse: pulseProp,
|
|
37
|
+
size,
|
|
38
|
+
className,
|
|
39
|
+
...props
|
|
40
|
+
}: StatusIndicatorProps) {
|
|
41
|
+
const config = STATUS_CONFIG[status];
|
|
42
|
+
const tone: StatusTone = toneProp ?? config.tone;
|
|
43
|
+
const displayLabel = label ?? config.label;
|
|
44
|
+
const pulse = pulseProp ?? LIVE_STATUSES.has(status);
|
|
45
|
+
|
|
46
|
+
const toneClasses = TONE_CLASSES[tone];
|
|
47
|
+
|
|
48
|
+
return (
|
|
49
|
+
<span
|
|
50
|
+
data-slot="status-indicator"
|
|
51
|
+
data-status={status}
|
|
52
|
+
data-tone={tone}
|
|
53
|
+
role="status"
|
|
54
|
+
aria-label={displayLabel}
|
|
55
|
+
className={cn(
|
|
56
|
+
statusIndicatorVariants({ size }),
|
|
57
|
+
'border-border/60 shadow-xs',
|
|
58
|
+
toneClasses.pill,
|
|
59
|
+
className,
|
|
60
|
+
)}
|
|
61
|
+
{...props}
|
|
62
|
+
>
|
|
63
|
+
<span
|
|
64
|
+
data-slot="status-dot"
|
|
65
|
+
className={cn('relative shrink-0 rounded-full', toneClasses.dot)}
|
|
66
|
+
aria-hidden="true"
|
|
67
|
+
>
|
|
68
|
+
{pulse && (
|
|
69
|
+
<span
|
|
70
|
+
data-slot="status-dot-pulse"
|
|
71
|
+
className={cn(
|
|
72
|
+
'absolute inset-0 rounded-full opacity-60 animate-ping',
|
|
73
|
+
toneClasses.dot,
|
|
74
|
+
)}
|
|
75
|
+
/>
|
|
76
|
+
)}
|
|
77
|
+
</span>
|
|
78
|
+
<span className={cn('whitespace-nowrap', toneClasses.text)}>
|
|
79
|
+
{displayLabel}
|
|
80
|
+
</span>
|
|
81
|
+
</span>
|
|
82
|
+
);
|
|
83
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Adapted from jalcoui (MIT) — github.com/jal-co/ui
|
|
2
|
+
|
|
3
|
+
export { StatusIndicator } from './StatusIndicator';
|
|
4
|
+
export {
|
|
5
|
+
STATUS_CONFIG,
|
|
6
|
+
TONE_CLASSES,
|
|
7
|
+
statusIndicatorVariants,
|
|
8
|
+
} from './types';
|
|
9
|
+
export type {
|
|
10
|
+
Status,
|
|
11
|
+
StatusTone,
|
|
12
|
+
StatusIndicatorSize,
|
|
13
|
+
StatusIndicatorProps,
|
|
14
|
+
} from './types';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Adapted from jalcoui (MIT) — github.com/jal-co/ui
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
import { createLazyComponent } from '../../../../common/lazy-wrapper';
|
|
6
|
+
import type { StatusIndicatorProps } from './types';
|
|
7
|
+
|
|
8
|
+
export const LazyStatusIndicator = createLazyComponent<StatusIndicatorProps>(
|
|
9
|
+
() => import('./StatusIndicator').then((mod) => ({ default: mod.StatusIndicator })),
|
|
10
|
+
{
|
|
11
|
+
displayName: 'LazyStatusIndicator',
|
|
12
|
+
fallback: (
|
|
13
|
+
<span
|
|
14
|
+
data-slot="status-indicator-skeleton"
|
|
15
|
+
className="inline-flex h-7 w-24 animate-pulse rounded-full bg-muted"
|
|
16
|
+
/>
|
|
17
|
+
),
|
|
18
|
+
},
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
export type { StatusIndicatorProps } from './types';
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// Adapted from jalcoui (MIT) — github.com/jal-co/ui
|
|
2
|
+
|
|
3
|
+
import type * as React from 'react';
|
|
4
|
+
import { cva, type VariantProps } from 'class-variance-authority';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Operational status of a service or component.
|
|
8
|
+
*
|
|
9
|
+
* Each value maps to a semantic tone defined in {@link STATUS_TONE}. Custom
|
|
10
|
+
* statuses can be passed by extending {@link STATUS_TONE} at the call site
|
|
11
|
+
* (see `<StatusIndicator tone="..." />` escape hatch).
|
|
12
|
+
*/
|
|
13
|
+
export type Status =
|
|
14
|
+
| 'operational'
|
|
15
|
+
| 'degraded'
|
|
16
|
+
| 'partial-outage'
|
|
17
|
+
| 'major-outage'
|
|
18
|
+
| 'maintenance'
|
|
19
|
+
| 'incident'
|
|
20
|
+
| 'unknown';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Semantic tone used to colorize the dot and label.
|
|
24
|
+
*
|
|
25
|
+
* Maps 1:1 to status-surface tokens in `ui-core/styles` (success / warning /
|
|
26
|
+
* destructive / info / muted). Themes / presets override these tokens —
|
|
27
|
+
* never reference raw scales like `emerald-500`.
|
|
28
|
+
*/
|
|
29
|
+
export type StatusTone = 'success' | 'warning' | 'destructive' | 'info' | 'muted';
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Default Status → tone + label mapping. Override per-instance via the
|
|
33
|
+
* `tone` and `label` props.
|
|
34
|
+
*/
|
|
35
|
+
export const STATUS_CONFIG: Record<Status, { label: string; tone: StatusTone }> = {
|
|
36
|
+
operational: { label: 'Operational', tone: 'success' },
|
|
37
|
+
degraded: { label: 'Degraded', tone: 'warning' },
|
|
38
|
+
'partial-outage': { label: 'Partial Outage', tone: 'warning' },
|
|
39
|
+
'major-outage': { label: 'Major Outage', tone: 'destructive' },
|
|
40
|
+
maintenance: { label: 'Maintenance', tone: 'info' },
|
|
41
|
+
incident: { label: 'Incident', tone: 'destructive' },
|
|
42
|
+
unknown: { label: 'Unknown', tone: 'muted' },
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Tailwind classes per tone. All classes resolve to semantic tokens; no raw
|
|
47
|
+
* color scales.
|
|
48
|
+
*
|
|
49
|
+
* The whole pill (background) uses the status-surface `bg-*-background`
|
|
50
|
+
* token paired with the readable `text-*-foreground` token — that pair
|
|
51
|
+
* is the one `ui-core/styles` specifically tunes for banner/pill use
|
|
52
|
+
* (low-saturation surface + dark accent text). Stacking a red-on-pale-red
|
|
53
|
+
* label over a `bg-card` pill, as the previous version did, dropped
|
|
54
|
+
* contrast under 3:1 on light theme.
|
|
55
|
+
*
|
|
56
|
+
* The dot stays at the saturated accent color (`bg-*`) so it visually
|
|
57
|
+
* pops against the muted surface.
|
|
58
|
+
*
|
|
59
|
+
* `destructive` has no `--destructive-foreground` tuned for surface use
|
|
60
|
+
* (the existing token is the white-on-red filled-button text), so we use
|
|
61
|
+
* the accent color itself — dark red on the pale-red surface still meets
|
|
62
|
+
* AA contrast in both light and dark themes.
|
|
63
|
+
*/
|
|
64
|
+
export const TONE_CLASSES: Record<
|
|
65
|
+
StatusTone,
|
|
66
|
+
{ dot: string; text: string; pill: string }
|
|
67
|
+
> = {
|
|
68
|
+
success: {
|
|
69
|
+
dot: 'bg-success',
|
|
70
|
+
text: 'text-success-foreground',
|
|
71
|
+
pill: 'bg-success-background',
|
|
72
|
+
},
|
|
73
|
+
warning: {
|
|
74
|
+
dot: 'bg-warning',
|
|
75
|
+
text: 'text-warning-foreground',
|
|
76
|
+
pill: 'bg-warning-background',
|
|
77
|
+
},
|
|
78
|
+
destructive: {
|
|
79
|
+
dot: 'bg-destructive',
|
|
80
|
+
text: 'text-destructive',
|
|
81
|
+
pill: 'bg-destructive-background',
|
|
82
|
+
},
|
|
83
|
+
info: {
|
|
84
|
+
dot: 'bg-info',
|
|
85
|
+
text: 'text-info-foreground',
|
|
86
|
+
pill: 'bg-info-background',
|
|
87
|
+
},
|
|
88
|
+
muted: {
|
|
89
|
+
dot: 'bg-muted-foreground/60',
|
|
90
|
+
text: 'text-muted-foreground',
|
|
91
|
+
pill: 'bg-muted',
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export const statusIndicatorVariants = cva(
|
|
96
|
+
'inline-flex items-center gap-2 rounded-full border font-medium',
|
|
97
|
+
{
|
|
98
|
+
variants: {
|
|
99
|
+
size: {
|
|
100
|
+
sm: 'h-6 px-2.5 text-[11px] [&>[data-slot=status-dot]]:size-1.5',
|
|
101
|
+
md: 'h-7 px-3 text-xs [&>[data-slot=status-dot]]:size-2',
|
|
102
|
+
lg: 'h-8 px-3.5 text-sm [&>[data-slot=status-dot]]:size-2.5',
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
defaultVariants: {
|
|
106
|
+
size: 'md',
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
export type StatusIndicatorSize = NonNullable<
|
|
112
|
+
VariantProps<typeof statusIndicatorVariants>['size']
|
|
113
|
+
>;
|
|
114
|
+
|
|
115
|
+
export interface StatusIndicatorProps
|
|
116
|
+
extends Omit<React.ComponentProps<'span'>, 'children'>,
|
|
117
|
+
VariantProps<typeof statusIndicatorVariants> {
|
|
118
|
+
/** Current operational status. */
|
|
119
|
+
status: Status;
|
|
120
|
+
/** Custom label text. Auto-generated from status when omitted. */
|
|
121
|
+
label?: string;
|
|
122
|
+
/**
|
|
123
|
+
* Override the tone (semantic color) used for dot + label. Defaults to
|
|
124
|
+
* {@link STATUS_CONFIG}`[status].tone`.
|
|
125
|
+
*/
|
|
126
|
+
tone?: StatusTone;
|
|
127
|
+
/**
|
|
128
|
+
* Enable the pulsing halo around the dot. Defaults to `true` for live
|
|
129
|
+
* statuses (`incident`, `major-outage`, `partial-outage`, `degraded`)
|
|
130
|
+
* and `false` for steady states.
|
|
131
|
+
*/
|
|
132
|
+
pulse?: boolean;
|
|
133
|
+
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import React from 'react';
|
|
4
|
-
import { CopyButton } from '@djangocfg/ui-core/components';
|
|
5
|
-
|
|
6
|
-
interface CopyActionProps {
|
|
7
|
-
value: string;
|
|
8
|
-
title?: string;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
const BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';
|
|
12
|
-
|
|
13
|
-
export const CopyAction: React.FC<CopyActionProps> = ({ value, title = 'Copy' }) => (
|
|
14
|
-
<CopyButton
|
|
15
|
-
value={value}
|
|
16
|
-
variant="ghost"
|
|
17
|
-
size="icon"
|
|
18
|
-
className={BUTTON_CLASS}
|
|
19
|
-
iconClassName="h-3 w-3"
|
|
20
|
-
title={title}
|
|
21
|
-
/>
|
|
22
|
-
);
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { ChevronDown, ChevronUp } from 'lucide-react';
|
|
4
|
-
import React from 'react';
|
|
5
|
-
|
|
6
|
-
import { Button } from '@djangocfg/ui-core/components';
|
|
7
|
-
|
|
8
|
-
interface ExpandActionProps {
|
|
9
|
-
isExpanded: boolean;
|
|
10
|
-
onToggle: () => void;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';
|
|
14
|
-
|
|
15
|
-
export const ExpandAction: React.FC<ExpandActionProps> = ({ isExpanded, onToggle }) => (
|
|
16
|
-
<Button
|
|
17
|
-
variant="ghost"
|
|
18
|
-
size="icon"
|
|
19
|
-
onClick={onToggle}
|
|
20
|
-
className={BUTTON_CLASS}
|
|
21
|
-
title={isExpanded ? 'Collapse All' : 'Expand All'}
|
|
22
|
-
>
|
|
23
|
-
{isExpanded ? <ChevronUp className="h-3 w-3" /> : <ChevronDown className="h-3 w-3" />}
|
|
24
|
-
</Button>
|
|
25
|
-
);
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { Maximize2, Minimize2 } from 'lucide-react';
|
|
4
|
-
import React from 'react';
|
|
5
|
-
|
|
6
|
-
import { Button } from '@djangocfg/ui-core/components';
|
|
7
|
-
|
|
8
|
-
interface FullscreenActionProps {
|
|
9
|
-
isFullscreen?: boolean;
|
|
10
|
-
onToggle: () => void;
|
|
11
|
-
title?: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';
|
|
15
|
-
|
|
16
|
-
export const FullscreenAction: React.FC<FullscreenActionProps> = ({
|
|
17
|
-
isFullscreen = false,
|
|
18
|
-
onToggle,
|
|
19
|
-
title,
|
|
20
|
-
}) => (
|
|
21
|
-
<Button
|
|
22
|
-
variant="ghost"
|
|
23
|
-
size="icon"
|
|
24
|
-
onClick={onToggle}
|
|
25
|
-
className={BUTTON_CLASS}
|
|
26
|
-
title={title ?? (isFullscreen ? 'Exit fullscreen' : 'Fullscreen')}
|
|
27
|
-
>
|
|
28
|
-
{isFullscreen ? <Minimize2 className="h-3 w-3" /> : <Maximize2 className="h-3 w-3" />}
|
|
29
|
-
</Button>
|
|
30
|
-
);
|