@flanksource/clicky-ui 0.3.46 → 0.3.48
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/NOTICE.md +11 -0
- package/README.md +49 -0
- package/dist/ai.cjs +13 -8
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +7 -2
- package/dist/ai.js.map +1 -1
- package/dist/comments/CommentSidePanel.cjs +10 -4
- package/dist/comments/CommentSidePanel.cjs.map +1 -1
- package/dist/comments/CommentSidePanel.d.ts +2 -0
- package/dist/comments/CommentSidePanel.d.ts.map +1 -1
- package/dist/comments/CommentSidePanel.js +10 -4
- package/dist/comments/CommentSidePanel.js.map +1 -1
- package/dist/comments/CommentThread.cjs +2 -0
- package/dist/comments/CommentThread.cjs.map +1 -1
- package/dist/comments/CommentThread.d.ts +2 -1
- package/dist/comments/CommentThread.d.ts.map +1 -1
- package/dist/comments/CommentThread.js +2 -0
- package/dist/comments/CommentThread.js.map +1 -1
- package/dist/comments/CommentThreadList.cjs +3 -0
- package/dist/comments/CommentThreadList.cjs.map +1 -1
- package/dist/comments/CommentThreadList.d.ts +3 -1
- package/dist/comments/CommentThreadList.d.ts.map +1 -1
- package/dist/comments/CommentThreadList.js +3 -0
- package/dist/comments/CommentThreadList.js.map +1 -1
- package/dist/components/ErrorWrapper.cjs +2 -3
- package/dist/components/ErrorWrapper.cjs.map +1 -1
- package/dist/components/ErrorWrapper.d.ts.map +1 -1
- package/dist/components/ErrorWrapper.js +3 -4
- package/dist/components/ErrorWrapper.js.map +1 -1
- package/dist/data/Clicky.cjs +3 -0
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.js +3 -0
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/CodeLine.cjs +4 -2
- package/dist/data/CodeLine.cjs.map +1 -1
- package/dist/data/CodeLine.d.ts.map +1 -1
- package/dist/data/CodeLine.js +4 -2
- package/dist/data/CodeLine.js.map +1 -1
- package/dist/data/FilterPill.cjs +15 -2
- package/dist/data/FilterPill.cjs.map +1 -1
- package/dist/data/FilterPill.d.ts +1 -1
- package/dist/data/FilterPill.d.ts.map +1 -1
- package/dist/data/FilterPill.js +15 -2
- package/dist/data/FilterPill.js.map +1 -1
- package/dist/data/LogViewer.cjs +27 -8
- package/dist/data/LogViewer.cjs.map +1 -1
- package/dist/data/LogViewer.d.ts +11 -3
- package/dist/data/LogViewer.d.ts.map +1 -1
- package/dist/data/LogViewer.js +27 -8
- package/dist/data/LogViewer.js.map +1 -1
- package/dist/data/Properties.cjs +2 -15
- package/dist/data/Properties.cjs.map +1 -1
- package/dist/data/Properties.d.ts +4 -0
- package/dist/data/Properties.d.ts.map +1 -1
- package/dist/data/Properties.js +2 -15
- package/dist/data/Properties.js.map +1 -1
- package/dist/data/PropertyValue.cjs +37 -0
- package/dist/data/PropertyValue.cjs.map +1 -0
- package/dist/data/PropertyValue.d.ts +6 -0
- package/dist/data/PropertyValue.d.ts.map +1 -0
- package/dist/data/PropertyValue.js +37 -0
- package/dist/data/PropertyValue.js.map +1 -0
- package/dist/data/SymbolBadge.cjs +61 -0
- package/dist/data/SymbolBadge.cjs.map +1 -0
- package/dist/data/SymbolBadge.d.ts +21 -0
- package/dist/data/SymbolBadge.d.ts.map +1 -0
- package/dist/data/SymbolBadge.js +61 -0
- package/dist/data/SymbolBadge.js.map +1 -0
- package/dist/data/Tree.cjs +4 -3
- package/dist/data/Tree.cjs.map +1 -1
- package/dist/data/Tree.d.ts +3 -1
- package/dist/data/Tree.d.ts.map +1 -1
- package/dist/data/Tree.js +4 -3
- package/dist/data/Tree.js.map +1 -1
- package/dist/data/ai/ChatFab.cjs +1 -1
- package/dist/data/ai/ChatFab.cjs.map +1 -1
- package/dist/data/ai/ChatFab.js +1 -1
- package/dist/data/ai/ChatFab.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +106 -171
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts +6 -2
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.header.cjs +104 -0
- package/dist/data/ai/ChatWindow.header.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.header.d.ts +29 -0
- package/dist/data/ai/ChatWindow.header.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.header.js +104 -0
- package/dist/data/ai/ChatWindow.header.js.map +1 -0
- package/dist/data/ai/ChatWindow.js +107 -172
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.placement.cjs +95 -0
- package/dist/data/ai/ChatWindow.placement.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.placement.d.ts +32 -0
- package/dist/data/ai/ChatWindow.placement.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.placement.js +95 -0
- package/dist/data/ai/ChatWindow.placement.js.map +1 -0
- package/dist/data/ai/SessionChatComposer.cjs +3 -1
- package/dist/data/ai/SessionChatComposer.cjs.map +1 -1
- package/dist/data/ai/SessionChatComposer.d.ts +4 -1
- package/dist/data/ai/SessionChatComposer.d.ts.map +1 -1
- package/dist/data/ai/SessionChatComposer.js +3 -1
- package/dist/data/ai/SessionChatComposer.js.map +1 -1
- package/dist/data/ai/SessionInspector.cjs +68 -72
- package/dist/data/ai/SessionInspector.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.composer-slot.cjs +8 -0
- package/dist/data/ai/SessionInspector.composer-slot.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.composer-slot.d.ts +9 -0
- package/dist/data/ai/SessionInspector.composer-slot.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.composer-slot.js +8 -0
- package/dist/data/ai/SessionInspector.composer-slot.js.map +1 -0
- package/dist/data/ai/SessionInspector.d.ts +6 -1
- package/dist/data/ai/SessionInspector.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.js +69 -73
- package/dist/data/ai/SessionInspector.js.map +1 -1
- package/dist/data/ai/SessionInspector.legacy.cjs +41 -42
- package/dist/data/ai/SessionInspector.legacy.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.legacy.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.legacy.js +41 -42
- package/dist/data/ai/SessionInspector.legacy.js.map +1 -1
- package/dist/data/ai/SessionInspector.remote-view.cjs +14 -9
- package/dist/data/ai/SessionInspector.remote-view.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.remote-view.d.ts +6 -2
- package/dist/data/ai/SessionInspector.remote-view.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.remote-view.js +14 -9
- package/dist/data/ai/SessionInspector.remote-view.js.map +1 -1
- package/dist/data/ai/SessionInspector.remote.cjs +84 -16
- package/dist/data/ai/SessionInspector.remote.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.remote.d.ts +42 -7
- package/dist/data/ai/SessionInspector.remote.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.remote.js +86 -18
- package/dist/data/ai/SessionInspector.remote.js.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.cjs +5 -0
- package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.js +5 -0
- package/dist/data/ai/SessionInspector.transcript.js.map +1 -1
- package/dist/data/ai/SessionTail.cjs +63 -0
- package/dist/data/ai/SessionTail.cjs.map +1 -0
- package/dist/data/ai/SessionTail.d.ts +14 -0
- package/dist/data/ai/SessionTail.d.ts.map +1 -0
- package/dist/data/ai/SessionTail.js +63 -0
- package/dist/data/ai/SessionTail.js.map +1 -0
- package/dist/data/ai/SessionViewer.cjs +10 -3
- package/dist/data/ai/SessionViewer.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.d.ts +7 -1
- package/dist/data/ai/SessionViewer.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.js +10 -3
- package/dist/data/ai/SessionViewer.js.map +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +14 -0
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/index.d.ts +4 -3
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/use-session-scroll.cjs +30 -6
- package/dist/data/ai/use-session-scroll.cjs.map +1 -1
- package/dist/data/ai/use-session-scroll.d.ts +7 -0
- package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
- package/dist/data/ai/use-session-scroll.js +30 -6
- package/dist/data/ai/use-session-scroll.js.map +1 -1
- package/dist/data/chat/Chat.cjs +1 -1
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.js +1 -1
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.cjs +4 -4
- package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.js +4 -4
- package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
- package/dist/data/chat/PromptInput.cjs +4 -2
- package/dist/data/chat/PromptInput.cjs.map +1 -1
- package/dist/data/chat/PromptInput.d.ts +5 -1
- package/dist/data/chat/PromptInput.d.ts.map +1 -1
- package/dist/data/chat/PromptInput.js +4 -2
- package/dist/data/chat/PromptInput.js.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.cjs +13 -2
- package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.d.ts +3 -1
- package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.js +14 -3
- package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.cjs +3 -2
- package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.js +3 -2
- package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
- package/dist/data/diagnostics/error-diagnostics.cjs +5 -0
- package/dist/data/diagnostics/error-diagnostics.cjs.map +1 -1
- package/dist/data/diagnostics/error-diagnostics.d.ts +1 -0
- package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -1
- package/dist/data/diagnostics/error-diagnostics.js +6 -1
- package/dist/data/diagnostics/error-diagnostics.js.map +1 -1
- package/dist/data/har/HarPanel.cjs +3 -1
- package/dist/data/har/HarPanel.cjs.map +1 -1
- package/dist/data/har/HarPanel.d.ts +4 -1
- package/dist/data/har/HarPanel.d.ts.map +1 -1
- package/dist/data/har/HarPanel.js +3 -1
- package/dist/data/har/HarPanel.js.map +1 -1
- package/dist/data/test-runner/Expectation.cjs +57 -0
- package/dist/data/test-runner/Expectation.cjs.map +1 -0
- package/dist/data/test-runner/Expectation.d.ts +19 -0
- package/dist/data/test-runner/Expectation.d.ts.map +1 -0
- package/dist/data/test-runner/Expectation.js +57 -0
- package/dist/data/test-runner/Expectation.js.map +1 -0
- package/dist/data/test-runner/MarkIcons.cjs +38 -0
- package/dist/data/test-runner/MarkIcons.cjs.map +1 -0
- package/dist/data/test-runner/MarkIcons.d.ts +15 -0
- package/dist/data/test-runner/MarkIcons.d.ts.map +1 -0
- package/dist/data/test-runner/MarkIcons.js +38 -0
- package/dist/data/test-runner/MarkIcons.js.map +1 -0
- package/dist/data/test-runner/TestDetailPanel.cjs +99 -53
- package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
- package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
- package/dist/data/test-runner/TestDetailPanel.js +101 -55
- package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
- package/dist/data/test-runner/TestFailureDetail.cjs +23 -27
- package/dist/data/test-runner/TestFailureDetail.cjs.map +1 -1
- package/dist/data/test-runner/TestFailureDetail.d.ts +2 -2
- package/dist/data/test-runner/TestFailureDetail.d.ts.map +1 -1
- package/dist/data/test-runner/TestFailureDetail.js +23 -27
- package/dist/data/test-runner/TestFailureDetail.js.map +1 -1
- package/dist/data/test-runner/TestFilterBar.cjs +87 -93
- package/dist/data/test-runner/TestFilterBar.cjs.map +1 -1
- package/dist/data/test-runner/TestFilterBar.d.ts +3 -2
- package/dist/data/test-runner/TestFilterBar.d.ts.map +1 -1
- package/dist/data/test-runner/TestFilterBar.js +89 -95
- package/dist/data/test-runner/TestFilterBar.js.map +1 -1
- package/dist/data/test-runner/TestRunSummary.cjs +35 -21
- package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
- package/dist/data/test-runner/TestRunSummary.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunSummary.js +35 -21
- package/dist/data/test-runner/TestRunSummary.js.map +1 -1
- package/dist/data/test-runner/TestRunner.cjs +58 -30
- package/dist/data/test-runner/TestRunner.cjs.map +1 -1
- package/dist/data/test-runner/TestRunner.d.ts +6 -3
- package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunner.js +58 -30
- package/dist/data/test-runner/TestRunner.js.map +1 -1
- package/dist/data/test-runner/TestTree.cjs +5 -2
- package/dist/data/test-runner/TestTree.cjs.map +1 -1
- package/dist/data/test-runner/TestTree.d.ts +5 -2
- package/dist/data/test-runner/TestTree.d.ts.map +1 -1
- package/dist/data/test-runner/TestTree.js +5 -2
- package/dist/data/test-runner/TestTree.js.map +1 -1
- package/dist/data/test-runner/TestTreeNode.cjs +28 -19
- package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
- package/dist/data/test-runner/TestTreeNode.d.ts.map +1 -1
- package/dist/data/test-runner/TestTreeNode.js +29 -20
- package/dist/data/test-runner/TestTreeNode.js.map +1 -1
- package/dist/data/test-runner/adapter.cjs +15 -0
- package/dist/data/test-runner/adapter.cjs.map +1 -1
- package/dist/data/test-runner/adapter.d.ts +27 -7
- package/dist/data/test-runner/adapter.d.ts.map +1 -1
- package/dist/data/test-runner/adapter.js +15 -0
- package/dist/data/test-runner/adapter.js.map +1 -1
- package/dist/data/test-runner/context.cjs.map +1 -1
- package/dist/data/test-runner/context.d.ts +2 -0
- package/dist/data/test-runner/context.d.ts.map +1 -1
- package/dist/data/test-runner/context.js.map +1 -1
- package/dist/data/test-runner/copy.cjs +114 -0
- package/dist/data/test-runner/copy.cjs.map +1 -0
- package/dist/data/test-runner/copy.d.ts +47 -0
- package/dist/data/test-runner/copy.d.ts.map +1 -0
- package/dist/data/test-runner/copy.js +114 -0
- package/dist/data/test-runner/copy.js.map +1 -0
- package/dist/data/test-runner/index.d.ts +6 -3
- package/dist/data/test-runner/index.d.ts.map +1 -1
- package/dist/data/test-runner/marks.cjs +184 -0
- package/dist/data/test-runner/marks.cjs.map +1 -0
- package/dist/data/test-runner/marks.d.ts +40 -0
- package/dist/data/test-runner/marks.d.ts.map +1 -0
- package/dist/data/test-runner/marks.js +184 -0
- package/dist/data/test-runner/marks.js.map +1 -0
- package/dist/data/test-runner/status.cjs +27 -44
- package/dist/data/test-runner/status.cjs.map +1 -1
- package/dist/data/test-runner/status.d.ts +12 -3
- package/dist/data/test-runner/status.d.ts.map +1 -1
- package/dist/data/test-runner/status.js +27 -44
- package/dist/data/test-runner/status.js.map +1 -1
- package/dist/data/traces/TerminalCastPlayer.d.ts +21 -0
- package/dist/data/traces/TerminalCastPlayer.d.ts.map +1 -0
- package/dist/data/traces/TraceHarView.d.ts +13 -0
- package/dist/data/traces/TraceHarView.d.ts.map +1 -0
- package/dist/data/traces/cast.d.ts +9 -0
- package/dist/data/traces/cast.d.ts.map +1 -0
- package/dist/data/traces/fixtures.d.ts +8 -0
- package/dist/data/traces/fixtures.d.ts.map +1 -0
- package/dist/data/traces/har-adapter.d.ts +13 -0
- package/dist/data/traces/har-adapter.d.ts.map +1 -0
- package/dist/data/traces/terminal-screen.d.ts +45 -0
- package/dist/data/traces/terminal-screen.d.ts.map +1 -0
- package/dist/data/traces/terminal-timeline.d.ts +26 -0
- package/dist/data/traces/terminal-timeline.d.ts.map +1 -0
- package/dist/data/traces/types.d.ts +141 -0
- package/dist/data/traces/types.d.ts.map +1 -0
- package/dist/data/verification/VerificationResults.cjs +4 -0
- package/dist/data/verification/VerificationResults.cjs.map +1 -1
- package/dist/data/verification/VerificationResults.d.ts +3 -1
- package/dist/data/verification/VerificationResults.d.ts.map +1 -1
- package/dist/data/verification/VerificationResults.js +4 -0
- package/dist/data/verification/VerificationResults.js.map +1 -1
- package/dist/data/verification/adapterViews.cjs +28 -44
- package/dist/data/verification/adapterViews.cjs.map +1 -1
- package/dist/data/verification/adapterViews.d.ts +4 -1
- package/dist/data/verification/adapterViews.d.ts.map +1 -1
- package/dist/data/verification/adapterViews.js +28 -44
- package/dist/data/verification/adapterViews.js.map +1 -1
- package/dist/data/verification/adapters.cjs +163 -8
- package/dist/data/verification/adapters.cjs.map +1 -1
- package/dist/data/verification/adapters.d.ts +7 -1
- package/dist/data/verification/adapters.d.ts.map +1 -1
- package/dist/data/verification/adapters.js +163 -8
- package/dist/data/verification/adapters.js.map +1 -1
- package/dist/data/verification/index.d.ts +4 -2
- package/dist/data/verification/index.d.ts.map +1 -1
- package/dist/data/verification/stepKind.cjs +217 -0
- package/dist/data/verification/stepKind.cjs.map +1 -0
- package/dist/data/verification/stepKind.d.ts +87 -0
- package/dist/data/verification/stepKind.d.ts.map +1 -0
- package/dist/data/verification/stepKind.js +217 -0
- package/dist/data/verification/stepKind.js.map +1 -0
- package/dist/data/verification/stepKindViews.cjs +111 -0
- package/dist/data/verification/stepKindViews.cjs.map +1 -0
- package/dist/data/verification/stepKindViews.d.ts +18 -0
- package/dist/data/verification/stepKindViews.d.ts.map +1 -0
- package/dist/data/verification/stepKindViews.js +111 -0
- package/dist/data/verification/stepKindViews.js.map +1 -0
- package/dist/data/verification/verifyReportTests.cjs +1 -0
- package/dist/data/verification/verifyReportTests.cjs.map +1 -1
- package/dist/data/verification/verifyReportTests.d.ts +2 -1
- package/dist/data/verification/verifyReportTests.d.ts.map +1 -1
- package/dist/data/verification/verifyReportTests.js +1 -0
- package/dist/data/verification/verifyReportTests.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +58 -3
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +3 -0
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +60 -5
- package/dist/data.js.map +1 -1
- package/dist/icons/components/UiLogoEslint.cjs +10 -0
- package/dist/icons/components/UiLogoEslint.cjs.map +1 -0
- package/dist/icons/components/UiLogoEslint.d.ts +9 -0
- package/dist/icons/components/UiLogoEslint.d.ts.map +1 -0
- package/dist/icons/components/UiLogoEslint.js +10 -0
- package/dist/icons/components/UiLogoEslint.js.map +1 -0
- package/dist/icons/components/UiLogoGo.cjs +10 -0
- package/dist/icons/components/UiLogoGo.cjs.map +1 -0
- package/dist/icons/components/UiLogoGo.d.ts +9 -0
- package/dist/icons/components/UiLogoGo.d.ts.map +1 -0
- package/dist/icons/components/UiLogoGo.js +10 -0
- package/dist/icons/components/UiLogoGo.js.map +1 -0
- package/dist/icons/components/UiLogoJest.cjs +10 -0
- package/dist/icons/components/UiLogoJest.cjs.map +1 -0
- package/dist/icons/components/UiLogoJest.d.ts +9 -0
- package/dist/icons/components/UiLogoJest.d.ts.map +1 -0
- package/dist/icons/components/UiLogoJest.js +10 -0
- package/dist/icons/components/UiLogoJest.js.map +1 -0
- package/dist/icons/components/UiLogoMarkdown.cjs +10 -0
- package/dist/icons/components/UiLogoMarkdown.cjs.map +1 -0
- package/dist/icons/components/UiLogoMarkdown.d.ts +9 -0
- package/dist/icons/components/UiLogoMarkdown.d.ts.map +1 -0
- package/dist/icons/components/UiLogoMarkdown.js +10 -0
- package/dist/icons/components/UiLogoMarkdown.js.map +1 -0
- package/dist/icons/components/UiLogoOxc.cjs +10 -0
- package/dist/icons/components/UiLogoOxc.cjs.map +1 -0
- package/dist/icons/components/UiLogoOxc.d.ts +9 -0
- package/dist/icons/components/UiLogoOxc.d.ts.map +1 -0
- package/dist/icons/components/UiLogoOxc.js +10 -0
- package/dist/icons/components/UiLogoOxc.js.map +1 -0
- package/dist/icons/components/UiLogoPlaywright.cjs +10 -0
- package/dist/icons/components/UiLogoPlaywright.cjs.map +1 -0
- package/dist/icons/components/UiLogoPlaywright.d.ts +9 -0
- package/dist/icons/components/UiLogoPlaywright.d.ts.map +1 -0
- package/dist/icons/components/UiLogoPlaywright.js +10 -0
- package/dist/icons/components/UiLogoPlaywright.js.map +1 -0
- package/dist/icons/components/UiLogoPython.cjs +10 -0
- package/dist/icons/components/UiLogoPython.cjs.map +1 -0
- package/dist/icons/components/UiLogoPython.d.ts +9 -0
- package/dist/icons/components/UiLogoPython.d.ts.map +1 -0
- package/dist/icons/components/UiLogoPython.js +10 -0
- package/dist/icons/components/UiLogoPython.js.map +1 -0
- package/dist/icons/components/UiLogoReact.cjs +10 -0
- package/dist/icons/components/UiLogoReact.cjs.map +1 -0
- package/dist/icons/components/UiLogoReact.d.ts +9 -0
- package/dist/icons/components/UiLogoReact.d.ts.map +1 -0
- package/dist/icons/components/UiLogoReact.js +10 -0
- package/dist/icons/components/UiLogoReact.js.map +1 -0
- package/dist/icons/components/UiLogoRuff.cjs +10 -0
- package/dist/icons/components/UiLogoRuff.cjs.map +1 -0
- package/dist/icons/components/UiLogoRuff.d.ts +9 -0
- package/dist/icons/components/UiLogoRuff.d.ts.map +1 -0
- package/dist/icons/components/UiLogoRuff.js +10 -0
- package/dist/icons/components/UiLogoRuff.js.map +1 -0
- package/dist/icons/components/UiLogoTypescript.cjs +10 -0
- package/dist/icons/components/UiLogoTypescript.cjs.map +1 -0
- package/dist/icons/components/UiLogoTypescript.d.ts +9 -0
- package/dist/icons/components/UiLogoTypescript.d.ts.map +1 -0
- package/dist/icons/components/UiLogoTypescript.js +10 -0
- package/dist/icons/components/UiLogoTypescript.js.map +1 -0
- package/dist/icons/components/UiLogoVitest.cjs +10 -0
- package/dist/icons/components/UiLogoVitest.cjs.map +1 -0
- package/dist/icons/components/UiLogoVitest.d.ts +9 -0
- package/dist/icons/components/UiLogoVitest.d.ts.map +1 -0
- package/dist/icons/components/UiLogoVitest.js +10 -0
- package/dist/icons/components/UiLogoVitest.js.map +1 -0
- package/dist/icons/index.d.ts +11 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/registry.cjs +22 -0
- package/dist/icons/registry.cjs.map +1 -1
- package/dist/icons/registry.d.ts.map +1 -1
- package/dist/icons/registry.js +22 -0
- package/dist/icons/registry.js.map +1 -1
- package/dist/icons.cjs +22 -0
- package/dist/icons.cjs.map +1 -1
- package/dist/icons.js +22 -0
- package/dist/icons.js.map +1 -1
- package/dist/index.cjs +60 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +62 -5
- package/dist/index.js.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.cjs +4 -4
- package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.js +4 -4
- package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
- package/dist/rpc/FilterForm.cjs +9 -0
- package/dist/rpc/FilterForm.cjs.map +1 -1
- package/dist/rpc/FilterForm.d.ts +5 -1
- package/dist/rpc/FilterForm.d.ts.map +1 -1
- package/dist/rpc/FilterForm.js +9 -0
- package/dist/rpc/FilterForm.js.map +1 -1
- package/dist/rpc/InlineError.cjs +12 -43
- package/dist/rpc/InlineError.cjs.map +1 -1
- package/dist/rpc/InlineError.d.ts.map +1 -1
- package/dist/rpc/InlineError.js +13 -44
- package/dist/rpc/InlineError.js.map +1 -1
- package/dist/rpc/OperationArgsForm.cjs +153 -0
- package/dist/rpc/OperationArgsForm.cjs.map +1 -0
- package/dist/rpc/OperationArgsForm.d.ts +16 -0
- package/dist/rpc/OperationArgsForm.d.ts.map +1 -0
- package/dist/rpc/OperationArgsForm.js +153 -0
- package/dist/rpc/OperationArgsForm.js.map +1 -0
- package/dist/rpc/OperationScheduleDialog.cjs +119 -22
- package/dist/rpc/OperationScheduleDialog.cjs.map +1 -1
- package/dist/rpc/OperationScheduleDialog.d.ts +7 -0
- package/dist/rpc/OperationScheduleDialog.d.ts.map +1 -1
- package/dist/rpc/OperationScheduleDialog.js +120 -23
- package/dist/rpc/OperationScheduleDialog.js.map +1 -1
- package/dist/rpc/OperationSchedules.cjs +17 -2
- package/dist/rpc/OperationSchedules.cjs.map +1 -1
- package/dist/rpc/OperationSchedules.d.ts.map +1 -1
- package/dist/rpc/OperationSchedules.js +17 -2
- package/dist/rpc/OperationSchedules.js.map +1 -1
- package/dist/rpc/operation-schedule-model.cjs +2 -7
- package/dist/rpc/operation-schedule-model.cjs.map +1 -1
- package/dist/rpc/operation-schedule-model.d.ts +0 -2
- package/dist/rpc/operation-schedule-model.d.ts.map +1 -1
- package/dist/rpc/operation-schedule-model.js +2 -7
- package/dist/rpc/operation-schedule-model.js.map +1 -1
- package/dist/rpc/operation-schedule-types.d.ts +12 -1
- package/dist/rpc/operation-schedule-types.d.ts.map +1 -1
- package/dist/rpc.cjs +2 -0
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +1 -0
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +2 -0
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/dist/data/test-runner/frameworkIcon.cjs +0 -27
- package/dist/data/test-runner/frameworkIcon.cjs.map +0 -1
- package/dist/data/test-runner/frameworkIcon.d.ts +0 -3
- package/dist/data/test-runner/frameworkIcon.d.ts.map +0 -1
- package/dist/data/test-runner/frameworkIcon.js +0 -27
- package/dist/data/test-runner/frameworkIcon.js.map +0 -1
package/dist/data/CodeLine.cjs
CHANGED
|
@@ -2,20 +2,22 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const react = require("react");
|
|
5
|
+
const useTheme = require("../hooks/use-theme.cjs");
|
|
5
6
|
const codeHighlight = require("./code-highlight.cjs");
|
|
6
7
|
const HighlightedTokens = require("./HighlightedTokens.cjs");
|
|
7
8
|
function CodeLine({ code, language, className }) {
|
|
8
9
|
const [tokens, setTokens] = react.useState(void 0);
|
|
10
|
+
const theme = useTheme.useResolvedTheme();
|
|
9
11
|
react.useEffect(() => {
|
|
10
12
|
let cancelled = false;
|
|
11
13
|
setTokens(void 0);
|
|
12
|
-
codeHighlight.highlightToLines(code, { lang: language }).then((out) => {
|
|
14
|
+
codeHighlight.highlightToLines(code, { lang: language, theme: theme === "dark" ? "github-dark" : "github-light" }).then((out) => {
|
|
13
15
|
if (!cancelled) setTokens(out == null ? void 0 : out[0]);
|
|
14
16
|
});
|
|
15
17
|
return () => {
|
|
16
18
|
cancelled = true;
|
|
17
19
|
};
|
|
18
|
-
}, [code, language]);
|
|
20
|
+
}, [code, language, theme]);
|
|
19
21
|
return /* @__PURE__ */ jsxRuntime.jsx("code", { className: ["whitespace-pre font-mono", className].filter(Boolean).join(" "), children: /* @__PURE__ */ jsxRuntime.jsx(HighlightedTokens.HighlightedTokens, { tokens, content: code }) });
|
|
20
22
|
}
|
|
21
23
|
exports.CodeLine = CodeLine;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeLine.cjs","sources":["../../src/data/CodeLine.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { highlightToLines, type HighlightedLine } from \"./code-highlight\";\nimport { HighlightedTokens } from \"./HighlightedTokens\";\n\nexport interface CodeLineProps {\n code: string;\n /** Shiki language id; without one the line renders as plain text. */\n language?: string;\n className?: string;\n}\n\n// CodeLine paints a single source line, syntax-highlighted, inline — the line a\n// stack frame or trace node ran, shown without the gutter and frame of a block.\nexport function CodeLine({ code, language, className }: CodeLineProps) {\n const [tokens, setTokens] = useState<HighlightedLine | undefined>(undefined);\n\n useEffect(() => {\n let cancelled = false;\n setTokens(undefined);\n highlightToLines(code, { lang: language }).then((out) => {\n if (!cancelled) setTokens(out?.[0]);\n });\n return () => {\n cancelled = true;\n };\n }, [code, language]);\n\n return (\n <code className={[\"whitespace-pre font-mono\", className].filter(Boolean).join(\" \")}>\n <HighlightedTokens tokens={tokens} content={code} />\n </code>\n );\n}\n"],"names":["useState","useEffect","highlightToLines","jsx","HighlightedTokens"],"mappings":"
|
|
1
|
+
{"version":3,"file":"CodeLine.cjs","sources":["../../src/data/CodeLine.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { useResolvedTheme } from \"../hooks/use-theme\";\nimport { highlightToLines, type HighlightedLine } from \"./code-highlight\";\nimport { HighlightedTokens } from \"./HighlightedTokens\";\n\nexport interface CodeLineProps {\n code: string;\n /** Shiki language id; without one the line renders as plain text. */\n language?: string;\n className?: string;\n}\n\n// CodeLine paints a single source line, syntax-highlighted, inline — the line a\n// stack frame or trace node ran, shown without the gutter and frame of a block.\nexport function CodeLine({ code, language, className }: CodeLineProps) {\n const [tokens, setTokens] = useState<HighlightedLine | undefined>(undefined);\n const theme = useResolvedTheme();\n\n useEffect(() => {\n let cancelled = false;\n setTokens(undefined);\n highlightToLines(code, { lang: language, theme: theme === \"dark\" ? \"github-dark\" : \"github-light\" }).then((out) => {\n if (!cancelled) setTokens(out?.[0]);\n });\n return () => {\n cancelled = true;\n };\n }, [code, language, theme]);\n\n return (\n <code className={[\"whitespace-pre font-mono\", className].filter(Boolean).join(\" \")}>\n <HighlightedTokens tokens={tokens} content={code} />\n </code>\n );\n}\n"],"names":["useState","useResolvedTheme","useEffect","highlightToLines","jsx","HighlightedTokens"],"mappings":";;;;;;;AAcO,SAAS,SAAS,EAAE,MAAM,UAAU,aAA4B;AACrE,QAAM,CAAC,QAAQ,SAAS,IAAIA,MAAAA,SAAsC,MAAS;AAC3E,QAAM,QAAQC,SAAAA,iBAAA;AAEdC,QAAAA,UAAU,MAAM;AACd,QAAI,YAAY;AAChB,cAAU,MAAS;AACnBC,kBAAAA,iBAAiB,MAAM,EAAE,MAAM,UAAU,OAAO,UAAU,SAAS,gBAAgB,eAAA,CAAgB,EAAE,KAAK,CAAC,QAAQ;AACjH,UAAI,CAAC,UAAW,WAAU,2BAAM,EAAE;AAAA,IACpC,CAAC;AACD,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,KAAK,CAAC;AAE1B,wCACG,QAAA,EAAK,WAAW,CAAC,4BAA4B,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAC/E,UAAAC,2BAAAA,IAACC,kBAAAA,qBAAkB,QAAgB,SAAS,MAAM,GACpD;AAEJ;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeLine.d.ts","sourceRoot":"","sources":["../../src/data/CodeLine.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CodeLine.d.ts","sourceRoot":"","sources":["../../src/data/CodeLine.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,aAAa,+BAoBpE"}
|
package/dist/data/CodeLine.js
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
2
|
import { useState, useEffect } from "react";
|
|
3
|
+
import { useResolvedTheme } from "../hooks/use-theme.js";
|
|
3
4
|
import { highlightToLines } from "./code-highlight.js";
|
|
4
5
|
import { HighlightedTokens } from "./HighlightedTokens.js";
|
|
5
6
|
function CodeLine({ code, language, className }) {
|
|
6
7
|
const [tokens, setTokens] = useState(void 0);
|
|
8
|
+
const theme = useResolvedTheme();
|
|
7
9
|
useEffect(() => {
|
|
8
10
|
let cancelled = false;
|
|
9
11
|
setTokens(void 0);
|
|
10
|
-
highlightToLines(code, { lang: language }).then((out) => {
|
|
12
|
+
highlightToLines(code, { lang: language, theme: theme === "dark" ? "github-dark" : "github-light" }).then((out) => {
|
|
11
13
|
if (!cancelled) setTokens(out == null ? void 0 : out[0]);
|
|
12
14
|
});
|
|
13
15
|
return () => {
|
|
14
16
|
cancelled = true;
|
|
15
17
|
};
|
|
16
|
-
}, [code, language]);
|
|
18
|
+
}, [code, language, theme]);
|
|
17
19
|
return /* @__PURE__ */ jsx("code", { className: ["whitespace-pre font-mono", className].filter(Boolean).join(" "), children: /* @__PURE__ */ jsx(HighlightedTokens, { tokens, content: code }) });
|
|
18
20
|
}
|
|
19
21
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeLine.js","sources":["../../src/data/CodeLine.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { highlightToLines, type HighlightedLine } from \"./code-highlight\";\nimport { HighlightedTokens } from \"./HighlightedTokens\";\n\nexport interface CodeLineProps {\n code: string;\n /** Shiki language id; without one the line renders as plain text. */\n language?: string;\n className?: string;\n}\n\n// CodeLine paints a single source line, syntax-highlighted, inline — the line a\n// stack frame or trace node ran, shown without the gutter and frame of a block.\nexport function CodeLine({ code, language, className }: CodeLineProps) {\n const [tokens, setTokens] = useState<HighlightedLine | undefined>(undefined);\n\n useEffect(() => {\n let cancelled = false;\n setTokens(undefined);\n highlightToLines(code, { lang: language }).then((out) => {\n if (!cancelled) setTokens(out?.[0]);\n });\n return () => {\n cancelled = true;\n };\n }, [code, language]);\n\n return (\n <code className={[\"whitespace-pre font-mono\", className].filter(Boolean).join(\" \")}>\n <HighlightedTokens tokens={tokens} content={code} />\n </code>\n );\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CodeLine.js","sources":["../../src/data/CodeLine.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { useResolvedTheme } from \"../hooks/use-theme\";\nimport { highlightToLines, type HighlightedLine } from \"./code-highlight\";\nimport { HighlightedTokens } from \"./HighlightedTokens\";\n\nexport interface CodeLineProps {\n code: string;\n /** Shiki language id; without one the line renders as plain text. */\n language?: string;\n className?: string;\n}\n\n// CodeLine paints a single source line, syntax-highlighted, inline — the line a\n// stack frame or trace node ran, shown without the gutter and frame of a block.\nexport function CodeLine({ code, language, className }: CodeLineProps) {\n const [tokens, setTokens] = useState<HighlightedLine | undefined>(undefined);\n const theme = useResolvedTheme();\n\n useEffect(() => {\n let cancelled = false;\n setTokens(undefined);\n highlightToLines(code, { lang: language, theme: theme === \"dark\" ? \"github-dark\" : \"github-light\" }).then((out) => {\n if (!cancelled) setTokens(out?.[0]);\n });\n return () => {\n cancelled = true;\n };\n }, [code, language, theme]);\n\n return (\n <code className={[\"whitespace-pre font-mono\", className].filter(Boolean).join(\" \")}>\n <HighlightedTokens tokens={tokens} content={code} />\n </code>\n );\n}\n"],"names":[],"mappings":";;;;;AAcO,SAAS,SAAS,EAAE,MAAM,UAAU,aAA4B;AACrE,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAsC,MAAS;AAC3E,QAAM,QAAQ,iBAAA;AAEd,YAAU,MAAM;AACd,QAAI,YAAY;AAChB,cAAU,MAAS;AACnB,qBAAiB,MAAM,EAAE,MAAM,UAAU,OAAO,UAAU,SAAS,gBAAgB,eAAA,CAAgB,EAAE,KAAK,CAAC,QAAQ;AACjH,UAAI,CAAC,UAAW,WAAU,2BAAM,EAAE;AAAA,IACpC,CAAC;AACD,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,KAAK,CAAC;AAE1B,6BACG,QAAA,EAAK,WAAW,CAAC,4BAA4B,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAC/E,UAAA,oBAAC,qBAAkB,QAAgB,SAAS,MAAM,GACpD;AAEJ;"}
|
package/dist/data/FilterPill.cjs
CHANGED
|
@@ -112,6 +112,7 @@ function FilterPill({
|
|
|
112
112
|
className
|
|
113
113
|
}) {
|
|
114
114
|
const triState = !!onModeChange;
|
|
115
|
+
const iconNode = icon && /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { ...typeof icon === "string" ? { name: icon } : { icon }, className: "text-sm" });
|
|
115
116
|
const content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
116
117
|
count !== void 0 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
117
118
|
"span",
|
|
@@ -123,10 +124,22 @@ function FilterPill({
|
|
|
123
124
|
children: count
|
|
124
125
|
}
|
|
125
126
|
),
|
|
126
|
-
|
|
127
|
+
iconNode,
|
|
127
128
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: label })
|
|
128
129
|
] });
|
|
129
130
|
if (triState) {
|
|
131
|
+
const optionContent = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
132
|
+
iconNode,
|
|
133
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: label }),
|
|
134
|
+
count !== void 0 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
135
|
+
"span",
|
|
136
|
+
{
|
|
137
|
+
className: "shrink-0 text-[10px] tabular-nums text-muted-foreground",
|
|
138
|
+
"data-pill-count": "",
|
|
139
|
+
children: count
|
|
140
|
+
}
|
|
141
|
+
)
|
|
142
|
+
] });
|
|
130
143
|
const control = /* @__PURE__ */ jsxRuntime.jsx(
|
|
131
144
|
TristateSwitch,
|
|
132
145
|
{
|
|
@@ -136,7 +149,7 @@ function FilterPill({
|
|
|
136
149
|
...title ? { ariaLabel: title } : {}
|
|
137
150
|
}
|
|
138
151
|
);
|
|
139
|
-
const labelContent = /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex min-w-0 items-center gap-1.5 text-xs text-foreground", children:
|
|
152
|
+
const labelContent = /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex min-w-0 items-center gap-1.5 text-xs text-foreground", children: optionContent });
|
|
140
153
|
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: utils.cn("inline-flex items-center gap-1.5 select-none", className), title, children: togglePosition === "right" ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
141
154
|
labelContent,
|
|
142
155
|
control
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterPill.cjs","sources":["../../src/data/FilterPill.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"./Icon\";\nimport { UiAdd, UiCheck, UiClose, UiRemove } from \"../icons\";\n\nexport type FilterMode = \"active\" | \"neutral\" | \"include\" | \"exclude\";\n\nexport type FilterPillProps = {\n /** Visual and semantic state for the pill. */\n mode?: FilterMode;\n /** Primary visible label. */\n label: ReactNode;\n /** Optional count badge rendered before the label. */\n count?: number;\n /** Iconify name or imported icon component. */\n icon?: string | StaticIconComponent;\n /** Classes for the count badge background. */\n badge?: string;\n /**\n * Tri-state handler. When provided the pill renders as a toggle with a left\n * minus (exclude) and right plus (include) region. Clicking a side toggles\n * that state against \"neutral\"; clicking the label cycles neutral → include\n * → exclude → neutral.\n */\n onModeChange?: (next: FilterMode) => void;\n /** Legacy single-click handler, used when onModeChange is not provided. */\n onClick?: () => void;\n /** Browser tooltip and accessible label for tri-state controls. */\n title?: string;\n /** Places the tri-state toggle before or after the label. */\n togglePosition?: \"left\" | \"right\";\n /**\n * When false the tri-state switch renders without button semantics (an\n * aria-hidden span, nothing focusable) for hosts that own focus and keyboard\n * themselves — e.g. a combobox listbox option, where a nested focusable\n * button would violate the option content model. The region click zones\n * remain active. Defaults to true.\n */\n interactive?: boolean;\n /** Classes applied to the pill root. */\n className?: string;\n};\n\nfunction bodyClasses(mode: FilterMode): string {\n switch (mode) {\n case \"active\":\n return \"bg-primary/10 border-primary/40 text-primary font-medium\";\n case \"include\":\n return \"bg-green-500/10 border-green-500/50 text-green-700 dark:text-green-400 font-medium\";\n case \"exclude\":\n return \"bg-red-500/10 border-red-500/50 text-red-700 dark:text-red-400 font-medium\";\n case \"neutral\":\n default:\n return \"border-border text-muted-foreground hover:bg-accent\";\n }\n}\n\ntype SlotMode = \"exclude\" | \"neutral\" | \"include\";\n\nconst SLOT_TRANSLATE: Record<SlotMode, string> = {\n exclude: \"translate-x-0\",\n neutral: \"translate-x-4\",\n include: \"translate-x-8\",\n};\n\nfunction TristateSwitch({\n mode,\n onChange,\n ariaLabel,\n interactive = true,\n}: {\n mode: FilterMode;\n onChange: (next: FilterMode) => void;\n ariaLabel?: string;\n interactive?: boolean;\n}) {\n const slot: SlotMode =\n mode === \"exclude\" ? \"exclude\" : mode === \"include\" ? \"include\" : \"neutral\";\n const bg =\n slot === \"exclude\" ? \"bg-red-500/80\" : slot === \"include\" ? \"bg-green-500/80\" : \"bg-muted\";\n\n // The three regions are aria-hidden click targets layered over the toggle\n // track: clicking the left edge toggles exclude, the right edge toggles\n // include, and the middle rotates. They are NOT focusable buttons — the\n // whole switch is a single <button> so it exposes one accessible name and\n // does not pollute the accessible name of any FilterBar wrapper that hosts\n // it (e.g. the multi-filter option row, which is itself a role=\"button\").\n const region = (next: FilterMode, regionMode: SlotMode) => (\n <span\n aria-hidden\n data-tristate-region={regionMode}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onChange(next);\n }}\n className=\"relative z-10 h-full flex-1 cursor-pointer\"\n />\n );\n\n const content = (\n <>\n {region(mode === \"exclude\" ? \"neutral\" : \"exclude\", \"exclude\")}\n {region(nextTriStateMode(mode), \"neutral\")}\n {region(mode === \"include\" ? \"neutral\" : \"include\", \"include\")}\n <span\n aria-hidden\n className={cn(\n // The knob stays white in BOTH themes (standard switch look): on the\n // dark-mode muted/red/green tracks white is the high-contrast choice,\n // while bg-background would vanish against the track.\n \"pointer-events-none absolute left-0.5 top-0.5 z-20 flex size-4 items-center justify-center rounded-full bg-white shadow-sm transition-transform duration-150\",\n SLOT_TRANSLATE[slot],\n )}\n >\n {slot !== \"neutral\" && (\n <Icon\n icon={slot === \"exclude\" ? UiClose : UiCheck}\n className={cn(\n \"text-[10px]\",\n slot === \"exclude\" && \"text-red-600\",\n slot === \"include\" && \"text-green-600\",\n )}\n />\n )}\n </span>\n </>\n );\n\n const trackClasses = cn(\n \"relative inline-flex h-5 w-[52px] shrink-0 overflow-hidden rounded-full transition-colors duration-200\",\n bg,\n );\n\n // Non-interactive hosts (combobox listbox options) own focus and keyboard;\n // the switch must not add a nested focusable button inside role=\"option\".\n if (!interactive) {\n return (\n <span aria-hidden className={trackClasses}>\n {content}\n </span>\n );\n }\n\n return (\n <button\n type=\"button\"\n aria-label={ariaLabel}\n title={ariaLabel}\n onClick={(event) => {\n // Keyboard activation (Enter/Space) lands here without a region —\n // cycle, matching the middle-region rotation.\n event.preventDefault();\n event.stopPropagation();\n onChange(nextTriStateMode(mode));\n }}\n className={trackClasses}\n >\n {content}\n </button>\n );\n}\n\nexport function FilterPill({\n mode = \"neutral\",\n label,\n count,\n icon,\n badge,\n onModeChange,\n onClick,\n title,\n togglePosition = \"left\",\n interactive = true,\n className,\n}: FilterPillProps) {\n const triState = !!onModeChange;\n const content = (\n <>\n {count !== undefined && (\n <span\n className={cn(\n \"inline-flex items-center justify-center min-w-[16px] h-[16px] px-1 rounded-full text-[10px] font-bold text-white\",\n badge ?? \"bg-muted-foreground\",\n )}\n >\n {count}\n </span>\n )}\n {icon && (\n <Icon {...(typeof icon === \"string\" ? { name: icon } : { icon })} className=\"text-sm\" />\n )}\n <span className=\"truncate\">{label}</span>\n </>\n );\n\n if (triState) {\n const control = (\n <TristateSwitch\n mode={mode}\n onChange={onModeChange!}\n interactive={interactive}\n {...(title ? { ariaLabel: title } : {})}\n />\n );\n const labelContent = (\n <span className=\"inline-flex min-w-0 items-center gap-1.5 text-xs text-foreground\">\n {content}\n </span>\n );\n\n return (\n <span className={cn(\"inline-flex items-center gap-1.5 select-none\", className)} title={title}>\n {togglePosition === \"right\" ? (\n <>\n {labelContent}\n {control}\n </>\n ) : (\n <>\n {control}\n {labelContent}\n </>\n )}\n </span>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={title}\n className={cn(\n \"inline-flex items-center gap-1.5 text-xs px-2 py-0.5 rounded-full border transition-colors\",\n bodyClasses(mode),\n className,\n )}\n >\n <LegacyMarker mode={mode} />\n {content}\n </button>\n );\n}\n\nfunction LegacyMarker({ mode }: { mode: FilterMode }) {\n if (mode === \"include\") return <Icon icon={UiAdd} className=\"text-xs\" />;\n if (mode === \"exclude\") return <Icon icon={UiRemove} className=\"text-xs\" />;\n if (mode === \"active\") return <span className=\"w-2 h-2 rounded-full bg-current\" />;\n return <span className=\"w-2 h-2 rounded-full bg-current opacity-30\" />;\n}\n\nfunction nextTriStateMode(mode: FilterMode): FilterMode {\n if (mode === \"include\") return \"exclude\";\n if (mode === \"exclude\") return \"neutral\";\n return \"include\";\n}\n\nexport type FilterPillGroupProps = {\n /** Filter pills or separators to lay out. */\n children: ReactNode;\n /** Classes applied to the wrapping row. */\n className?: string;\n};\n\nexport function FilterPillGroup({ children, className }: FilterPillGroupProps) {\n return <div className={cn(\"flex items-center gap-1.5 flex-wrap\", className)}>{children}</div>;\n}\n\nexport function FilterSeparator() {\n return (\n <span aria-hidden className=\"text-border mx-0.5\">\n |\n </span>\n );\n}\n"],"names":["jsx","jsxs","Fragment","cn","Icon","UiClose","UiCheck","UiAdd","UiRemove"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FilterPill.cjs","sources":["../../src/data/FilterPill.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"./Icon\";\nimport { UiAdd, UiCheck, UiClose, UiRemove } from \"../icons\";\n\nexport type FilterMode = \"active\" | \"neutral\" | \"include\" | \"exclude\";\n\nexport type FilterPillProps = {\n /** Visual and semantic state for the pill. */\n mode?: FilterMode;\n /** Primary visible label. */\n label: ReactNode;\n /** Optional count: a badge before the label, or muted text after it on a tri-state option. */\n count?: number;\n /** Iconify name or imported icon component. */\n icon?: string | StaticIconComponent;\n /** Classes for the count badge background. */\n badge?: string;\n /**\n * Tri-state handler. When provided the pill renders as a toggle with a left\n * minus (exclude) and right plus (include) region. Clicking a side toggles\n * that state against \"neutral\"; clicking the label cycles neutral → include\n * → exclude → neutral.\n */\n onModeChange?: (next: FilterMode) => void;\n /** Legacy single-click handler, used when onModeChange is not provided. */\n onClick?: () => void;\n /** Browser tooltip and accessible label for tri-state controls. */\n title?: string;\n /** Places the tri-state toggle before or after the label. */\n togglePosition?: \"left\" | \"right\";\n /**\n * When false the tri-state switch renders without button semantics (an\n * aria-hidden span, nothing focusable) for hosts that own focus and keyboard\n * themselves — e.g. a combobox listbox option, where a nested focusable\n * button would violate the option content model. The region click zones\n * remain active. Defaults to true.\n */\n interactive?: boolean;\n /** Classes applied to the pill root. */\n className?: string;\n};\n\nfunction bodyClasses(mode: FilterMode): string {\n switch (mode) {\n case \"active\":\n return \"bg-primary/10 border-primary/40 text-primary font-medium\";\n case \"include\":\n return \"bg-green-500/10 border-green-500/50 text-green-700 dark:text-green-400 font-medium\";\n case \"exclude\":\n return \"bg-red-500/10 border-red-500/50 text-red-700 dark:text-red-400 font-medium\";\n case \"neutral\":\n default:\n return \"border-border text-muted-foreground hover:bg-accent\";\n }\n}\n\ntype SlotMode = \"exclude\" | \"neutral\" | \"include\";\n\nconst SLOT_TRANSLATE: Record<SlotMode, string> = {\n exclude: \"translate-x-0\",\n neutral: \"translate-x-4\",\n include: \"translate-x-8\",\n};\n\nfunction TristateSwitch({\n mode,\n onChange,\n ariaLabel,\n interactive = true,\n}: {\n mode: FilterMode;\n onChange: (next: FilterMode) => void;\n ariaLabel?: string;\n interactive?: boolean;\n}) {\n const slot: SlotMode =\n mode === \"exclude\" ? \"exclude\" : mode === \"include\" ? \"include\" : \"neutral\";\n const bg =\n slot === \"exclude\" ? \"bg-red-500/80\" : slot === \"include\" ? \"bg-green-500/80\" : \"bg-muted\";\n\n // The three regions are aria-hidden click targets layered over the toggle\n // track: clicking the left edge toggles exclude, the right edge toggles\n // include, and the middle rotates. They are NOT focusable buttons — the\n // whole switch is a single <button> so it exposes one accessible name and\n // does not pollute the accessible name of any FilterBar wrapper that hosts\n // it (e.g. the multi-filter option row, which is itself a role=\"button\").\n const region = (next: FilterMode, regionMode: SlotMode) => (\n <span\n aria-hidden\n data-tristate-region={regionMode}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onChange(next);\n }}\n className=\"relative z-10 h-full flex-1 cursor-pointer\"\n />\n );\n\n const content = (\n <>\n {region(mode === \"exclude\" ? \"neutral\" : \"exclude\", \"exclude\")}\n {region(nextTriStateMode(mode), \"neutral\")}\n {region(mode === \"include\" ? \"neutral\" : \"include\", \"include\")}\n <span\n aria-hidden\n className={cn(\n // The knob stays white in BOTH themes (standard switch look): on the\n // dark-mode muted/red/green tracks white is the high-contrast choice,\n // while bg-background would vanish against the track.\n \"pointer-events-none absolute left-0.5 top-0.5 z-20 flex size-4 items-center justify-center rounded-full bg-white shadow-sm transition-transform duration-150\",\n SLOT_TRANSLATE[slot],\n )}\n >\n {slot !== \"neutral\" && (\n <Icon\n icon={slot === \"exclude\" ? UiClose : UiCheck}\n className={cn(\n \"text-[10px]\",\n slot === \"exclude\" && \"text-red-600\",\n slot === \"include\" && \"text-green-600\",\n )}\n />\n )}\n </span>\n </>\n );\n\n const trackClasses = cn(\n \"relative inline-flex h-5 w-[52px] shrink-0 overflow-hidden rounded-full transition-colors duration-200\",\n bg,\n );\n\n // Non-interactive hosts (combobox listbox options) own focus and keyboard;\n // the switch must not add a nested focusable button inside role=\"option\".\n if (!interactive) {\n return (\n <span aria-hidden className={trackClasses}>\n {content}\n </span>\n );\n }\n\n return (\n <button\n type=\"button\"\n aria-label={ariaLabel}\n title={ariaLabel}\n onClick={(event) => {\n // Keyboard activation (Enter/Space) lands here without a region —\n // cycle, matching the middle-region rotation.\n event.preventDefault();\n event.stopPropagation();\n onChange(nextTriStateMode(mode));\n }}\n className={trackClasses}\n >\n {content}\n </button>\n );\n}\n\nexport function FilterPill({\n mode = \"neutral\",\n label,\n count,\n icon,\n badge,\n onModeChange,\n onClick,\n title,\n togglePosition = \"left\",\n interactive = true,\n className,\n}: FilterPillProps) {\n const triState = !!onModeChange;\n const iconNode = icon && (\n <Icon {...(typeof icon === \"string\" ? { name: icon } : { icon })} className=\"text-sm\" />\n );\n const content = (\n <>\n {count !== undefined && (\n <span\n className={cn(\n \"inline-flex items-center justify-center min-w-[16px] h-[16px] px-1 rounded-full text-[10px] font-bold text-white\",\n badge ?? \"bg-muted-foreground\",\n )}\n >\n {count}\n </span>\n )}\n {iconNode}\n <span className=\"truncate\">{label}</span>\n </>\n );\n\n if (triState) {\n // In an option list the count is a facet of the label, not a badge: it\n // trails the label in muted text so the labels stay aligned.\n const optionContent = (\n <>\n {iconNode}\n <span className=\"truncate\">{label}</span>\n {count !== undefined && (\n <span\n className=\"shrink-0 text-[10px] tabular-nums text-muted-foreground\"\n data-pill-count=\"\"\n >\n {count}\n </span>\n )}\n </>\n );\n const control = (\n <TristateSwitch\n mode={mode}\n onChange={onModeChange!}\n interactive={interactive}\n {...(title ? { ariaLabel: title } : {})}\n />\n );\n const labelContent = (\n <span className=\"inline-flex min-w-0 items-center gap-1.5 text-xs text-foreground\">\n {optionContent}\n </span>\n );\n\n return (\n <span className={cn(\"inline-flex items-center gap-1.5 select-none\", className)} title={title}>\n {togglePosition === \"right\" ? (\n <>\n {labelContent}\n {control}\n </>\n ) : (\n <>\n {control}\n {labelContent}\n </>\n )}\n </span>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={title}\n className={cn(\n \"inline-flex items-center gap-1.5 text-xs px-2 py-0.5 rounded-full border transition-colors\",\n bodyClasses(mode),\n className,\n )}\n >\n <LegacyMarker mode={mode} />\n {content}\n </button>\n );\n}\n\nfunction LegacyMarker({ mode }: { mode: FilterMode }) {\n if (mode === \"include\") return <Icon icon={UiAdd} className=\"text-xs\" />;\n if (mode === \"exclude\") return <Icon icon={UiRemove} className=\"text-xs\" />;\n if (mode === \"active\") return <span className=\"w-2 h-2 rounded-full bg-current\" />;\n return <span className=\"w-2 h-2 rounded-full bg-current opacity-30\" />;\n}\n\nfunction nextTriStateMode(mode: FilterMode): FilterMode {\n if (mode === \"include\") return \"exclude\";\n if (mode === \"exclude\") return \"neutral\";\n return \"include\";\n}\n\nexport type FilterPillGroupProps = {\n /** Filter pills or separators to lay out. */\n children: ReactNode;\n /** Classes applied to the wrapping row. */\n className?: string;\n};\n\nexport function FilterPillGroup({ children, className }: FilterPillGroupProps) {\n return <div className={cn(\"flex items-center gap-1.5 flex-wrap\", className)}>{children}</div>;\n}\n\nexport function FilterSeparator() {\n return (\n <span aria-hidden className=\"text-border mx-0.5\">\n |\n </span>\n );\n}\n"],"names":["jsx","jsxs","Fragment","cn","Icon","UiClose","UiCheck","UiAdd","UiRemove"],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ export type FilterPillProps = {
|
|
|
6
6
|
mode?: FilterMode;
|
|
7
7
|
/** Primary visible label. */
|
|
8
8
|
label: ReactNode;
|
|
9
|
-
/** Optional count badge
|
|
9
|
+
/** Optional count: a badge before the label, or muted text after it on a tri-state option. */
|
|
10
10
|
count?: number;
|
|
11
11
|
/** Iconify name or imported icon component. */
|
|
12
12
|
icon?: string | StaticIconComponent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterPill.d.ts","sourceRoot":"","sources":["../../src/data/FilterPill.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAQ,KAAK,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAGxD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAEtE,MAAM,MAAM,eAAe,GAAG;IAC5B,8CAA8C;IAC9C,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,6BAA6B;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,
|
|
1
|
+
{"version":3,"file":"FilterPill.d.ts","sourceRoot":"","sources":["../../src/data/FilterPill.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAQ,KAAK,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAGxD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAEtE,MAAM,MAAM,eAAe,GAAG;IAC5B,8CAA8C;IAC9C,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,6BAA6B;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,8FAA8F;IAC9F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACpC,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AA0HF,wBAAgB,UAAU,CAAC,EACzB,IAAgB,EAChB,KAAK,EACL,KAAK,EACL,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,OAAO,EACP,KAAK,EACL,cAAuB,EACvB,WAAkB,EAClB,SAAS,GACV,EAAE,eAAe,+BAqFjB;AAeD,MAAM,MAAM,oBAAoB,GAAG;IACjC,6CAA6C;IAC7C,QAAQ,EAAE,SAAS,CAAC;IACpB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,oBAAoB,+BAE5E;AAED,wBAAgB,eAAe,gCAM9B"}
|
package/dist/data/FilterPill.js
CHANGED
|
@@ -110,6 +110,7 @@ function FilterPill({
|
|
|
110
110
|
className
|
|
111
111
|
}) {
|
|
112
112
|
const triState = !!onModeChange;
|
|
113
|
+
const iconNode = icon && /* @__PURE__ */ jsx(Icon, { ...typeof icon === "string" ? { name: icon } : { icon }, className: "text-sm" });
|
|
113
114
|
const content = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
114
115
|
count !== void 0 && /* @__PURE__ */ jsx(
|
|
115
116
|
"span",
|
|
@@ -121,10 +122,22 @@ function FilterPill({
|
|
|
121
122
|
children: count
|
|
122
123
|
}
|
|
123
124
|
),
|
|
124
|
-
|
|
125
|
+
iconNode,
|
|
125
126
|
/* @__PURE__ */ jsx("span", { className: "truncate", children: label })
|
|
126
127
|
] });
|
|
127
128
|
if (triState) {
|
|
129
|
+
const optionContent = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
130
|
+
iconNode,
|
|
131
|
+
/* @__PURE__ */ jsx("span", { className: "truncate", children: label }),
|
|
132
|
+
count !== void 0 && /* @__PURE__ */ jsx(
|
|
133
|
+
"span",
|
|
134
|
+
{
|
|
135
|
+
className: "shrink-0 text-[10px] tabular-nums text-muted-foreground",
|
|
136
|
+
"data-pill-count": "",
|
|
137
|
+
children: count
|
|
138
|
+
}
|
|
139
|
+
)
|
|
140
|
+
] });
|
|
128
141
|
const control = /* @__PURE__ */ jsx(
|
|
129
142
|
TristateSwitch,
|
|
130
143
|
{
|
|
@@ -134,7 +147,7 @@ function FilterPill({
|
|
|
134
147
|
...title ? { ariaLabel: title } : {}
|
|
135
148
|
}
|
|
136
149
|
);
|
|
137
|
-
const labelContent = /* @__PURE__ */ jsx("span", { className: "inline-flex min-w-0 items-center gap-1.5 text-xs text-foreground", children:
|
|
150
|
+
const labelContent = /* @__PURE__ */ jsx("span", { className: "inline-flex min-w-0 items-center gap-1.5 text-xs text-foreground", children: optionContent });
|
|
138
151
|
return /* @__PURE__ */ jsx("span", { className: cn("inline-flex items-center gap-1.5 select-none", className), title, children: togglePosition === "right" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
139
152
|
labelContent,
|
|
140
153
|
control
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterPill.js","sources":["../../src/data/FilterPill.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"./Icon\";\nimport { UiAdd, UiCheck, UiClose, UiRemove } from \"../icons\";\n\nexport type FilterMode = \"active\" | \"neutral\" | \"include\" | \"exclude\";\n\nexport type FilterPillProps = {\n /** Visual and semantic state for the pill. */\n mode?: FilterMode;\n /** Primary visible label. */\n label: ReactNode;\n /** Optional count badge rendered before the label. */\n count?: number;\n /** Iconify name or imported icon component. */\n icon?: string | StaticIconComponent;\n /** Classes for the count badge background. */\n badge?: string;\n /**\n * Tri-state handler. When provided the pill renders as a toggle with a left\n * minus (exclude) and right plus (include) region. Clicking a side toggles\n * that state against \"neutral\"; clicking the label cycles neutral → include\n * → exclude → neutral.\n */\n onModeChange?: (next: FilterMode) => void;\n /** Legacy single-click handler, used when onModeChange is not provided. */\n onClick?: () => void;\n /** Browser tooltip and accessible label for tri-state controls. */\n title?: string;\n /** Places the tri-state toggle before or after the label. */\n togglePosition?: \"left\" | \"right\";\n /**\n * When false the tri-state switch renders without button semantics (an\n * aria-hidden span, nothing focusable) for hosts that own focus and keyboard\n * themselves — e.g. a combobox listbox option, where a nested focusable\n * button would violate the option content model. The region click zones\n * remain active. Defaults to true.\n */\n interactive?: boolean;\n /** Classes applied to the pill root. */\n className?: string;\n};\n\nfunction bodyClasses(mode: FilterMode): string {\n switch (mode) {\n case \"active\":\n return \"bg-primary/10 border-primary/40 text-primary font-medium\";\n case \"include\":\n return \"bg-green-500/10 border-green-500/50 text-green-700 dark:text-green-400 font-medium\";\n case \"exclude\":\n return \"bg-red-500/10 border-red-500/50 text-red-700 dark:text-red-400 font-medium\";\n case \"neutral\":\n default:\n return \"border-border text-muted-foreground hover:bg-accent\";\n }\n}\n\ntype SlotMode = \"exclude\" | \"neutral\" | \"include\";\n\nconst SLOT_TRANSLATE: Record<SlotMode, string> = {\n exclude: \"translate-x-0\",\n neutral: \"translate-x-4\",\n include: \"translate-x-8\",\n};\n\nfunction TristateSwitch({\n mode,\n onChange,\n ariaLabel,\n interactive = true,\n}: {\n mode: FilterMode;\n onChange: (next: FilterMode) => void;\n ariaLabel?: string;\n interactive?: boolean;\n}) {\n const slot: SlotMode =\n mode === \"exclude\" ? \"exclude\" : mode === \"include\" ? \"include\" : \"neutral\";\n const bg =\n slot === \"exclude\" ? \"bg-red-500/80\" : slot === \"include\" ? \"bg-green-500/80\" : \"bg-muted\";\n\n // The three regions are aria-hidden click targets layered over the toggle\n // track: clicking the left edge toggles exclude, the right edge toggles\n // include, and the middle rotates. They are NOT focusable buttons — the\n // whole switch is a single <button> so it exposes one accessible name and\n // does not pollute the accessible name of any FilterBar wrapper that hosts\n // it (e.g. the multi-filter option row, which is itself a role=\"button\").\n const region = (next: FilterMode, regionMode: SlotMode) => (\n <span\n aria-hidden\n data-tristate-region={regionMode}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onChange(next);\n }}\n className=\"relative z-10 h-full flex-1 cursor-pointer\"\n />\n );\n\n const content = (\n <>\n {region(mode === \"exclude\" ? \"neutral\" : \"exclude\", \"exclude\")}\n {region(nextTriStateMode(mode), \"neutral\")}\n {region(mode === \"include\" ? \"neutral\" : \"include\", \"include\")}\n <span\n aria-hidden\n className={cn(\n // The knob stays white in BOTH themes (standard switch look): on the\n // dark-mode muted/red/green tracks white is the high-contrast choice,\n // while bg-background would vanish against the track.\n \"pointer-events-none absolute left-0.5 top-0.5 z-20 flex size-4 items-center justify-center rounded-full bg-white shadow-sm transition-transform duration-150\",\n SLOT_TRANSLATE[slot],\n )}\n >\n {slot !== \"neutral\" && (\n <Icon\n icon={slot === \"exclude\" ? UiClose : UiCheck}\n className={cn(\n \"text-[10px]\",\n slot === \"exclude\" && \"text-red-600\",\n slot === \"include\" && \"text-green-600\",\n )}\n />\n )}\n </span>\n </>\n );\n\n const trackClasses = cn(\n \"relative inline-flex h-5 w-[52px] shrink-0 overflow-hidden rounded-full transition-colors duration-200\",\n bg,\n );\n\n // Non-interactive hosts (combobox listbox options) own focus and keyboard;\n // the switch must not add a nested focusable button inside role=\"option\".\n if (!interactive) {\n return (\n <span aria-hidden className={trackClasses}>\n {content}\n </span>\n );\n }\n\n return (\n <button\n type=\"button\"\n aria-label={ariaLabel}\n title={ariaLabel}\n onClick={(event) => {\n // Keyboard activation (Enter/Space) lands here without a region —\n // cycle, matching the middle-region rotation.\n event.preventDefault();\n event.stopPropagation();\n onChange(nextTriStateMode(mode));\n }}\n className={trackClasses}\n >\n {content}\n </button>\n );\n}\n\nexport function FilterPill({\n mode = \"neutral\",\n label,\n count,\n icon,\n badge,\n onModeChange,\n onClick,\n title,\n togglePosition = \"left\",\n interactive = true,\n className,\n}: FilterPillProps) {\n const triState = !!onModeChange;\n const content = (\n <>\n {count !== undefined && (\n <span\n className={cn(\n \"inline-flex items-center justify-center min-w-[16px] h-[16px] px-1 rounded-full text-[10px] font-bold text-white\",\n badge ?? \"bg-muted-foreground\",\n )}\n >\n {count}\n </span>\n )}\n {icon && (\n <Icon {...(typeof icon === \"string\" ? { name: icon } : { icon })} className=\"text-sm\" />\n )}\n <span className=\"truncate\">{label}</span>\n </>\n );\n\n if (triState) {\n const control = (\n <TristateSwitch\n mode={mode}\n onChange={onModeChange!}\n interactive={interactive}\n {...(title ? { ariaLabel: title } : {})}\n />\n );\n const labelContent = (\n <span className=\"inline-flex min-w-0 items-center gap-1.5 text-xs text-foreground\">\n {content}\n </span>\n );\n\n return (\n <span className={cn(\"inline-flex items-center gap-1.5 select-none\", className)} title={title}>\n {togglePosition === \"right\" ? (\n <>\n {labelContent}\n {control}\n </>\n ) : (\n <>\n {control}\n {labelContent}\n </>\n )}\n </span>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={title}\n className={cn(\n \"inline-flex items-center gap-1.5 text-xs px-2 py-0.5 rounded-full border transition-colors\",\n bodyClasses(mode),\n className,\n )}\n >\n <LegacyMarker mode={mode} />\n {content}\n </button>\n );\n}\n\nfunction LegacyMarker({ mode }: { mode: FilterMode }) {\n if (mode === \"include\") return <Icon icon={UiAdd} className=\"text-xs\" />;\n if (mode === \"exclude\") return <Icon icon={UiRemove} className=\"text-xs\" />;\n if (mode === \"active\") return <span className=\"w-2 h-2 rounded-full bg-current\" />;\n return <span className=\"w-2 h-2 rounded-full bg-current opacity-30\" />;\n}\n\nfunction nextTriStateMode(mode: FilterMode): FilterMode {\n if (mode === \"include\") return \"exclude\";\n if (mode === \"exclude\") return \"neutral\";\n return \"include\";\n}\n\nexport type FilterPillGroupProps = {\n /** Filter pills or separators to lay out. */\n children: ReactNode;\n /** Classes applied to the wrapping row. */\n className?: string;\n};\n\nexport function FilterPillGroup({ children, className }: FilterPillGroupProps) {\n return <div className={cn(\"flex items-center gap-1.5 flex-wrap\", className)}>{children}</div>;\n}\n\nexport function FilterSeparator() {\n return (\n <span aria-hidden className=\"text-border mx-0.5\">\n |\n </span>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FilterPill.js","sources":["../../src/data/FilterPill.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"./Icon\";\nimport { UiAdd, UiCheck, UiClose, UiRemove } from \"../icons\";\n\nexport type FilterMode = \"active\" | \"neutral\" | \"include\" | \"exclude\";\n\nexport type FilterPillProps = {\n /** Visual and semantic state for the pill. */\n mode?: FilterMode;\n /** Primary visible label. */\n label: ReactNode;\n /** Optional count: a badge before the label, or muted text after it on a tri-state option. */\n count?: number;\n /** Iconify name or imported icon component. */\n icon?: string | StaticIconComponent;\n /** Classes for the count badge background. */\n badge?: string;\n /**\n * Tri-state handler. When provided the pill renders as a toggle with a left\n * minus (exclude) and right plus (include) region. Clicking a side toggles\n * that state against \"neutral\"; clicking the label cycles neutral → include\n * → exclude → neutral.\n */\n onModeChange?: (next: FilterMode) => void;\n /** Legacy single-click handler, used when onModeChange is not provided. */\n onClick?: () => void;\n /** Browser tooltip and accessible label for tri-state controls. */\n title?: string;\n /** Places the tri-state toggle before or after the label. */\n togglePosition?: \"left\" | \"right\";\n /**\n * When false the tri-state switch renders without button semantics (an\n * aria-hidden span, nothing focusable) for hosts that own focus and keyboard\n * themselves — e.g. a combobox listbox option, where a nested focusable\n * button would violate the option content model. The region click zones\n * remain active. Defaults to true.\n */\n interactive?: boolean;\n /** Classes applied to the pill root. */\n className?: string;\n};\n\nfunction bodyClasses(mode: FilterMode): string {\n switch (mode) {\n case \"active\":\n return \"bg-primary/10 border-primary/40 text-primary font-medium\";\n case \"include\":\n return \"bg-green-500/10 border-green-500/50 text-green-700 dark:text-green-400 font-medium\";\n case \"exclude\":\n return \"bg-red-500/10 border-red-500/50 text-red-700 dark:text-red-400 font-medium\";\n case \"neutral\":\n default:\n return \"border-border text-muted-foreground hover:bg-accent\";\n }\n}\n\ntype SlotMode = \"exclude\" | \"neutral\" | \"include\";\n\nconst SLOT_TRANSLATE: Record<SlotMode, string> = {\n exclude: \"translate-x-0\",\n neutral: \"translate-x-4\",\n include: \"translate-x-8\",\n};\n\nfunction TristateSwitch({\n mode,\n onChange,\n ariaLabel,\n interactive = true,\n}: {\n mode: FilterMode;\n onChange: (next: FilterMode) => void;\n ariaLabel?: string;\n interactive?: boolean;\n}) {\n const slot: SlotMode =\n mode === \"exclude\" ? \"exclude\" : mode === \"include\" ? \"include\" : \"neutral\";\n const bg =\n slot === \"exclude\" ? \"bg-red-500/80\" : slot === \"include\" ? \"bg-green-500/80\" : \"bg-muted\";\n\n // The three regions are aria-hidden click targets layered over the toggle\n // track: clicking the left edge toggles exclude, the right edge toggles\n // include, and the middle rotates. They are NOT focusable buttons — the\n // whole switch is a single <button> so it exposes one accessible name and\n // does not pollute the accessible name of any FilterBar wrapper that hosts\n // it (e.g. the multi-filter option row, which is itself a role=\"button\").\n const region = (next: FilterMode, regionMode: SlotMode) => (\n <span\n aria-hidden\n data-tristate-region={regionMode}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onChange(next);\n }}\n className=\"relative z-10 h-full flex-1 cursor-pointer\"\n />\n );\n\n const content = (\n <>\n {region(mode === \"exclude\" ? \"neutral\" : \"exclude\", \"exclude\")}\n {region(nextTriStateMode(mode), \"neutral\")}\n {region(mode === \"include\" ? \"neutral\" : \"include\", \"include\")}\n <span\n aria-hidden\n className={cn(\n // The knob stays white in BOTH themes (standard switch look): on the\n // dark-mode muted/red/green tracks white is the high-contrast choice,\n // while bg-background would vanish against the track.\n \"pointer-events-none absolute left-0.5 top-0.5 z-20 flex size-4 items-center justify-center rounded-full bg-white shadow-sm transition-transform duration-150\",\n SLOT_TRANSLATE[slot],\n )}\n >\n {slot !== \"neutral\" && (\n <Icon\n icon={slot === \"exclude\" ? UiClose : UiCheck}\n className={cn(\n \"text-[10px]\",\n slot === \"exclude\" && \"text-red-600\",\n slot === \"include\" && \"text-green-600\",\n )}\n />\n )}\n </span>\n </>\n );\n\n const trackClasses = cn(\n \"relative inline-flex h-5 w-[52px] shrink-0 overflow-hidden rounded-full transition-colors duration-200\",\n bg,\n );\n\n // Non-interactive hosts (combobox listbox options) own focus and keyboard;\n // the switch must not add a nested focusable button inside role=\"option\".\n if (!interactive) {\n return (\n <span aria-hidden className={trackClasses}>\n {content}\n </span>\n );\n }\n\n return (\n <button\n type=\"button\"\n aria-label={ariaLabel}\n title={ariaLabel}\n onClick={(event) => {\n // Keyboard activation (Enter/Space) lands here without a region —\n // cycle, matching the middle-region rotation.\n event.preventDefault();\n event.stopPropagation();\n onChange(nextTriStateMode(mode));\n }}\n className={trackClasses}\n >\n {content}\n </button>\n );\n}\n\nexport function FilterPill({\n mode = \"neutral\",\n label,\n count,\n icon,\n badge,\n onModeChange,\n onClick,\n title,\n togglePosition = \"left\",\n interactive = true,\n className,\n}: FilterPillProps) {\n const triState = !!onModeChange;\n const iconNode = icon && (\n <Icon {...(typeof icon === \"string\" ? { name: icon } : { icon })} className=\"text-sm\" />\n );\n const content = (\n <>\n {count !== undefined && (\n <span\n className={cn(\n \"inline-flex items-center justify-center min-w-[16px] h-[16px] px-1 rounded-full text-[10px] font-bold text-white\",\n badge ?? \"bg-muted-foreground\",\n )}\n >\n {count}\n </span>\n )}\n {iconNode}\n <span className=\"truncate\">{label}</span>\n </>\n );\n\n if (triState) {\n // In an option list the count is a facet of the label, not a badge: it\n // trails the label in muted text so the labels stay aligned.\n const optionContent = (\n <>\n {iconNode}\n <span className=\"truncate\">{label}</span>\n {count !== undefined && (\n <span\n className=\"shrink-0 text-[10px] tabular-nums text-muted-foreground\"\n data-pill-count=\"\"\n >\n {count}\n </span>\n )}\n </>\n );\n const control = (\n <TristateSwitch\n mode={mode}\n onChange={onModeChange!}\n interactive={interactive}\n {...(title ? { ariaLabel: title } : {})}\n />\n );\n const labelContent = (\n <span className=\"inline-flex min-w-0 items-center gap-1.5 text-xs text-foreground\">\n {optionContent}\n </span>\n );\n\n return (\n <span className={cn(\"inline-flex items-center gap-1.5 select-none\", className)} title={title}>\n {togglePosition === \"right\" ? (\n <>\n {labelContent}\n {control}\n </>\n ) : (\n <>\n {control}\n {labelContent}\n </>\n )}\n </span>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={title}\n className={cn(\n \"inline-flex items-center gap-1.5 text-xs px-2 py-0.5 rounded-full border transition-colors\",\n bodyClasses(mode),\n className,\n )}\n >\n <LegacyMarker mode={mode} />\n {content}\n </button>\n );\n}\n\nfunction LegacyMarker({ mode }: { mode: FilterMode }) {\n if (mode === \"include\") return <Icon icon={UiAdd} className=\"text-xs\" />;\n if (mode === \"exclude\") return <Icon icon={UiRemove} className=\"text-xs\" />;\n if (mode === \"active\") return <span className=\"w-2 h-2 rounded-full bg-current\" />;\n return <span className=\"w-2 h-2 rounded-full bg-current opacity-30\" />;\n}\n\nfunction nextTriStateMode(mode: FilterMode): FilterMode {\n if (mode === \"include\") return \"exclude\";\n if (mode === \"exclude\") return \"neutral\";\n return \"include\";\n}\n\nexport type FilterPillGroupProps = {\n /** Filter pills or separators to lay out. */\n children: ReactNode;\n /** Classes applied to the wrapping row. */\n className?: string;\n};\n\nexport function FilterPillGroup({ children, className }: FilterPillGroupProps) {\n return <div className={cn(\"flex items-center gap-1.5 flex-wrap\", className)}>{children}</div>;\n}\n\nexport function FilterSeparator() {\n return (\n <span aria-hidden className=\"text-border mx-0.5\">\n |\n </span>\n );\n}\n"],"names":[],"mappings":"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"}
|
package/dist/data/LogViewer.cjs
CHANGED
|
@@ -3,29 +3,48 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const react = require("react");
|
|
5
5
|
const utils = require("../lib/utils.cjs");
|
|
6
|
+
const AnsiHtml = require("./AnsiHtml.cjs");
|
|
7
|
+
const VARIANTS = {
|
|
8
|
+
muted: {
|
|
9
|
+
bg: "bg-muted",
|
|
10
|
+
border: "border-border",
|
|
11
|
+
text: "text-muted-foreground"
|
|
12
|
+
},
|
|
13
|
+
terminal: {
|
|
14
|
+
bg: "bg-zinc-950",
|
|
15
|
+
border: "border-zinc-800",
|
|
16
|
+
text: "text-zinc-100"
|
|
17
|
+
}
|
|
18
|
+
};
|
|
6
19
|
function LogViewer({
|
|
7
20
|
logs,
|
|
8
21
|
collapsedLines = 5,
|
|
22
|
+
maxHeight,
|
|
9
23
|
maxExpandedVh = 70,
|
|
10
|
-
|
|
11
|
-
|
|
24
|
+
variant = "muted",
|
|
25
|
+
bgClass,
|
|
26
|
+
borderClass,
|
|
12
27
|
className
|
|
13
28
|
}) {
|
|
14
29
|
const [expanded, setExpanded] = react.useState(false);
|
|
15
30
|
const lines = react.useMemo(() => logs.split("\n"), [logs]);
|
|
16
31
|
const hasMore = lines.length > collapsedLines;
|
|
17
|
-
const
|
|
32
|
+
const tone = VARIANTS[variant];
|
|
33
|
+
const collapsedHeight = maxHeight ?? `${collapsedLines * 1.4}em`;
|
|
34
|
+
const shown = expanded || maxHeight ? logs : lines.slice(0, collapsedLines).join("\n");
|
|
18
35
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils.cn("relative", className), children: [
|
|
19
36
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
20
37
|
"pre",
|
|
21
38
|
{
|
|
22
39
|
className: utils.cn(
|
|
23
|
-
"mt-0.5 text-[11px]
|
|
24
|
-
|
|
25
|
-
|
|
40
|
+
"mt-0.5 text-[11px] rounded p-1.5 whitespace-pre-wrap overflow-y-auto border transition-all duration-200",
|
|
41
|
+
tone.text,
|
|
42
|
+
bgClass ?? tone.bg,
|
|
43
|
+
borderClass ?? tone.border
|
|
26
44
|
),
|
|
27
|
-
style: { maxHeight },
|
|
28
|
-
|
|
45
|
+
style: { maxHeight: expanded ? `${maxExpandedVh}vh` : collapsedHeight },
|
|
46
|
+
"data-log-variant": variant,
|
|
47
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(AnsiHtml.AnsiHtml, { as: "span", text: shown })
|
|
29
48
|
}
|
|
30
49
|
),
|
|
31
50
|
hasMore && /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogViewer.cjs","sources":["../../src/data/LogViewer.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type LogViewerProps = {\n /** Raw log text separated by newlines. */\n logs: string;\n /** Number of lines shown before the viewer is expanded. */\n collapsedLines?: number;\n /** Maximum expanded height in viewport-height units. */\n maxExpandedVh?: number;\n /** Background utility class for the log container. */\n bgClass?: string;\n /** Border utility class for the log container. */\n borderClass?: string;\n /** Classes applied to the root wrapper. */\n className?: string;\n};\n\nexport function LogViewer({\n logs,\n collapsedLines = 5,\n maxExpandedVh = 70,\n
|
|
1
|
+
{"version":3,"file":"LogViewer.cjs","sources":["../../src/data/LogViewer.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { AnsiHtml } from \"./AnsiHtml\";\n\nexport type LogViewerProps = {\n /** Raw log text separated by newlines; ANSI SGR escapes are styled. */\n logs: string;\n /** Number of lines shown before the viewer is expanded. Ignored when `maxHeight` is set. */\n collapsedLines?: number;\n /**\n * Collapsed height as a CSS length (e.g. `25cqh` for a quarter of the\n * enclosing size container). Every line is rendered and the block scrolls,\n * instead of cutting the text at `collapsedLines`.\n */\n maxHeight?: string;\n /** Maximum expanded height in viewport-height units. */\n maxExpandedVh?: number;\n /** `terminal` renders light text on black, like the console it came from. */\n variant?: \"muted\" | \"terminal\";\n /** Background utility class for the log container. */\n bgClass?: string;\n /** Border utility class for the log container. */\n borderClass?: string;\n /** Classes applied to the root wrapper. */\n className?: string;\n};\n\nconst VARIANTS = {\n muted: {\n bg: \"bg-muted\",\n border: \"border-border\",\n text: \"text-muted-foreground\",\n },\n terminal: {\n bg: \"bg-zinc-950\",\n border: \"border-zinc-800\",\n text: \"text-zinc-100\",\n },\n};\n\nexport function LogViewer({\n logs,\n collapsedLines = 5,\n maxHeight,\n maxExpandedVh = 70,\n variant = \"muted\",\n bgClass,\n borderClass,\n className,\n}: LogViewerProps) {\n const [expanded, setExpanded] = useState(false);\n const lines = useMemo(() => logs.split(\"\\n\"), [logs]);\n const hasMore = lines.length > collapsedLines;\n const tone = VARIANTS[variant];\n\n const collapsedHeight = maxHeight ?? `${collapsedLines * 1.4}em`;\n const shown = expanded || maxHeight ? logs : lines.slice(0, collapsedLines).join(\"\\n\");\n\n return (\n <div className={cn(\"relative\", className)}>\n <pre\n className={cn(\n \"mt-0.5 text-[11px] rounded p-1.5 whitespace-pre-wrap overflow-y-auto border transition-all duration-200\",\n tone.text,\n bgClass ?? tone.bg,\n borderClass ?? tone.border,\n )}\n style={{ maxHeight: expanded ? `${maxExpandedVh}vh` : collapsedHeight }}\n data-log-variant={variant}\n >\n <AnsiHtml as=\"span\" text={shown} />\n </pre>\n {hasMore && (\n <button\n type=\"button\"\n className={cn(\n \"text-[10px] mt-0.5\",\n expanded ? \"text-muted-foreground\" : \"text-primary hover:opacity-80\",\n )}\n onClick={() => setExpanded((e) => !e)}\n >\n {expanded ? `▲ Collapse (${lines.length} lines)` : `▼ Show more (${lines.length} lines)`}\n </button>\n )}\n </div>\n );\n}\n"],"names":["useState","useMemo","cn","jsx","AnsiHtml"],"mappings":";;;;;;AA2BA,MAAM,WAAW;AAAA,EACf,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,EAAA;AAAA,EAER,UAAU;AAAA,IACR,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,EAAA;AAEV;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,CAAC,UAAU,WAAW,IAAIA,MAAAA,SAAS,KAAK;AAC9C,QAAM,QAAQC,MAAAA,QAAQ,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC;AACpD,QAAM,UAAU,MAAM,SAAS;AAC/B,QAAM,OAAO,SAAS,OAAO;AAE7B,QAAM,kBAAkB,aAAa,GAAG,iBAAiB,GAAG;AAC5D,QAAM,QAAQ,YAAY,YAAY,OAAO,MAAM,MAAM,GAAG,cAAc,EAAE,KAAK,IAAI;AAErF,yCACG,OAAA,EAAI,WAAWC,MAAAA,GAAG,YAAY,SAAS,GACtC,UAAA;AAAA,IAAAC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWD,MAAAA;AAAAA,UACT;AAAA,UACA,KAAK;AAAA,UACL,WAAW,KAAK;AAAA,UAChB,eAAe,KAAK;AAAA,QAAA;AAAA,QAEtB,OAAO,EAAE,WAAW,WAAW,GAAG,aAAa,OAAO,gBAAA;AAAA,QACtD,oBAAkB;AAAA,QAElB,UAAAC,2BAAAA,IAACC,mBAAA,EAAS,IAAG,QAAO,MAAM,MAAA,CAAO;AAAA,MAAA;AAAA,IAAA;AAAA,IAElC,WACCD,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAWD,MAAAA;AAAAA,UACT;AAAA,UACA,WAAW,0BAA0B;AAAA,QAAA;AAAA,QAEvC,SAAS,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;AAAA,QAEnC,qBAAW,eAAe,MAAM,MAAM,YAAY,gBAAgB,MAAM,MAAM;AAAA,MAAA;AAAA,IAAA;AAAA,EACjF,GAEJ;AAEJ;;"}
|
package/dist/data/LogViewer.d.ts
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
export type LogViewerProps = {
|
|
2
|
-
/** Raw log text separated by newlines. */
|
|
2
|
+
/** Raw log text separated by newlines; ANSI SGR escapes are styled. */
|
|
3
3
|
logs: string;
|
|
4
|
-
/** Number of lines shown before the viewer is expanded. */
|
|
4
|
+
/** Number of lines shown before the viewer is expanded. Ignored when `maxHeight` is set. */
|
|
5
5
|
collapsedLines?: number;
|
|
6
|
+
/**
|
|
7
|
+
* Collapsed height as a CSS length (e.g. `25cqh` for a quarter of the
|
|
8
|
+
* enclosing size container). Every line is rendered and the block scrolls,
|
|
9
|
+
* instead of cutting the text at `collapsedLines`.
|
|
10
|
+
*/
|
|
11
|
+
maxHeight?: string;
|
|
6
12
|
/** Maximum expanded height in viewport-height units. */
|
|
7
13
|
maxExpandedVh?: number;
|
|
14
|
+
/** `terminal` renders light text on black, like the console it came from. */
|
|
15
|
+
variant?: "muted" | "terminal";
|
|
8
16
|
/** Background utility class for the log container. */
|
|
9
17
|
bgClass?: string;
|
|
10
18
|
/** Border utility class for the log container. */
|
|
@@ -12,5 +20,5 @@ export type LogViewerProps = {
|
|
|
12
20
|
/** Classes applied to the root wrapper. */
|
|
13
21
|
className?: string;
|
|
14
22
|
};
|
|
15
|
-
export declare function LogViewer({ logs, collapsedLines, maxExpandedVh, bgClass, borderClass, className, }: LogViewerProps): import("react").JSX.Element;
|
|
23
|
+
export declare function LogViewer({ logs, collapsedLines, maxHeight, maxExpandedVh, variant, bgClass, borderClass, className, }: LogViewerProps): import("react").JSX.Element;
|
|
16
24
|
//# sourceMappingURL=LogViewer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogViewer.d.ts","sourceRoot":"","sources":["../../src/data/LogViewer.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"LogViewer.d.ts","sourceRoot":"","sources":["../../src/data/LogViewer.tsx"],"names":[],"mappings":"AAIA,MAAM,MAAM,cAAc,GAAG;IAC3B,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,4FAA4F;IAC5F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAC/B,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAeF,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,cAAkB,EAClB,SAAS,EACT,aAAkB,EAClB,OAAiB,EACjB,OAAO,EACP,WAAW,EACX,SAAS,GACV,EAAE,cAAc,+BAqChB"}
|
package/dist/data/LogViewer.js
CHANGED
|
@@ -1,29 +1,48 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
2
|
import { useState, useMemo } from "react";
|
|
3
3
|
import { cn } from "../lib/utils.js";
|
|
4
|
+
import { AnsiHtml } from "./AnsiHtml.js";
|
|
5
|
+
const VARIANTS = {
|
|
6
|
+
muted: {
|
|
7
|
+
bg: "bg-muted",
|
|
8
|
+
border: "border-border",
|
|
9
|
+
text: "text-muted-foreground"
|
|
10
|
+
},
|
|
11
|
+
terminal: {
|
|
12
|
+
bg: "bg-zinc-950",
|
|
13
|
+
border: "border-zinc-800",
|
|
14
|
+
text: "text-zinc-100"
|
|
15
|
+
}
|
|
16
|
+
};
|
|
4
17
|
function LogViewer({
|
|
5
18
|
logs,
|
|
6
19
|
collapsedLines = 5,
|
|
20
|
+
maxHeight,
|
|
7
21
|
maxExpandedVh = 70,
|
|
8
|
-
|
|
9
|
-
|
|
22
|
+
variant = "muted",
|
|
23
|
+
bgClass,
|
|
24
|
+
borderClass,
|
|
10
25
|
className
|
|
11
26
|
}) {
|
|
12
27
|
const [expanded, setExpanded] = useState(false);
|
|
13
28
|
const lines = useMemo(() => logs.split("\n"), [logs]);
|
|
14
29
|
const hasMore = lines.length > collapsedLines;
|
|
15
|
-
const
|
|
30
|
+
const tone = VARIANTS[variant];
|
|
31
|
+
const collapsedHeight = maxHeight ?? `${collapsedLines * 1.4}em`;
|
|
32
|
+
const shown = expanded || maxHeight ? logs : lines.slice(0, collapsedLines).join("\n");
|
|
16
33
|
return /* @__PURE__ */ jsxs("div", { className: cn("relative", className), children: [
|
|
17
34
|
/* @__PURE__ */ jsx(
|
|
18
35
|
"pre",
|
|
19
36
|
{
|
|
20
37
|
className: cn(
|
|
21
|
-
"mt-0.5 text-[11px]
|
|
22
|
-
|
|
23
|
-
|
|
38
|
+
"mt-0.5 text-[11px] rounded p-1.5 whitespace-pre-wrap overflow-y-auto border transition-all duration-200",
|
|
39
|
+
tone.text,
|
|
40
|
+
bgClass ?? tone.bg,
|
|
41
|
+
borderClass ?? tone.border
|
|
24
42
|
),
|
|
25
|
-
style: { maxHeight },
|
|
26
|
-
|
|
43
|
+
style: { maxHeight: expanded ? `${maxExpandedVh}vh` : collapsedHeight },
|
|
44
|
+
"data-log-variant": variant,
|
|
45
|
+
children: /* @__PURE__ */ jsx(AnsiHtml, { as: "span", text: shown })
|
|
27
46
|
}
|
|
28
47
|
),
|
|
29
48
|
hasMore && /* @__PURE__ */ jsx(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogViewer.js","sources":["../../src/data/LogViewer.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type LogViewerProps = {\n /** Raw log text separated by newlines. */\n logs: string;\n /** Number of lines shown before the viewer is expanded. */\n collapsedLines?: number;\n /** Maximum expanded height in viewport-height units. */\n maxExpandedVh?: number;\n /** Background utility class for the log container. */\n bgClass?: string;\n /** Border utility class for the log container. */\n borderClass?: string;\n /** Classes applied to the root wrapper. */\n className?: string;\n};\n\nexport function LogViewer({\n logs,\n collapsedLines = 5,\n maxExpandedVh = 70,\n
|
|
1
|
+
{"version":3,"file":"LogViewer.js","sources":["../../src/data/LogViewer.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { AnsiHtml } from \"./AnsiHtml\";\n\nexport type LogViewerProps = {\n /** Raw log text separated by newlines; ANSI SGR escapes are styled. */\n logs: string;\n /** Number of lines shown before the viewer is expanded. Ignored when `maxHeight` is set. */\n collapsedLines?: number;\n /**\n * Collapsed height as a CSS length (e.g. `25cqh` for a quarter of the\n * enclosing size container). Every line is rendered and the block scrolls,\n * instead of cutting the text at `collapsedLines`.\n */\n maxHeight?: string;\n /** Maximum expanded height in viewport-height units. */\n maxExpandedVh?: number;\n /** `terminal` renders light text on black, like the console it came from. */\n variant?: \"muted\" | \"terminal\";\n /** Background utility class for the log container. */\n bgClass?: string;\n /** Border utility class for the log container. */\n borderClass?: string;\n /** Classes applied to the root wrapper. */\n className?: string;\n};\n\nconst VARIANTS = {\n muted: {\n bg: \"bg-muted\",\n border: \"border-border\",\n text: \"text-muted-foreground\",\n },\n terminal: {\n bg: \"bg-zinc-950\",\n border: \"border-zinc-800\",\n text: \"text-zinc-100\",\n },\n};\n\nexport function LogViewer({\n logs,\n collapsedLines = 5,\n maxHeight,\n maxExpandedVh = 70,\n variant = \"muted\",\n bgClass,\n borderClass,\n className,\n}: LogViewerProps) {\n const [expanded, setExpanded] = useState(false);\n const lines = useMemo(() => logs.split(\"\\n\"), [logs]);\n const hasMore = lines.length > collapsedLines;\n const tone = VARIANTS[variant];\n\n const collapsedHeight = maxHeight ?? `${collapsedLines * 1.4}em`;\n const shown = expanded || maxHeight ? logs : lines.slice(0, collapsedLines).join(\"\\n\");\n\n return (\n <div className={cn(\"relative\", className)}>\n <pre\n className={cn(\n \"mt-0.5 text-[11px] rounded p-1.5 whitespace-pre-wrap overflow-y-auto border transition-all duration-200\",\n tone.text,\n bgClass ?? tone.bg,\n borderClass ?? tone.border,\n )}\n style={{ maxHeight: expanded ? `${maxExpandedVh}vh` : collapsedHeight }}\n data-log-variant={variant}\n >\n <AnsiHtml as=\"span\" text={shown} />\n </pre>\n {hasMore && (\n <button\n type=\"button\"\n className={cn(\n \"text-[10px] mt-0.5\",\n expanded ? \"text-muted-foreground\" : \"text-primary hover:opacity-80\",\n )}\n onClick={() => setExpanded((e) => !e)}\n >\n {expanded ? `▲ Collapse (${lines.length} lines)` : `▼ Show more (${lines.length} lines)`}\n </button>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;AA2BA,MAAM,WAAW;AAAA,EACf,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,EAAA;AAAA,EAER,UAAU;AAAA,IACR,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,EAAA;AAEV;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,QAAQ,QAAQ,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC;AACpD,QAAM,UAAU,MAAM,SAAS;AAC/B,QAAM,OAAO,SAAS,OAAO;AAE7B,QAAM,kBAAkB,aAAa,GAAG,iBAAiB,GAAG;AAC5D,QAAM,QAAQ,YAAY,YAAY,OAAO,MAAM,MAAM,GAAG,cAAc,EAAE,KAAK,IAAI;AAErF,8BACG,OAAA,EAAI,WAAW,GAAG,YAAY,SAAS,GACtC,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,KAAK;AAAA,UACL,WAAW,KAAK;AAAA,UAChB,eAAe,KAAK;AAAA,QAAA;AAAA,QAEtB,OAAO,EAAE,WAAW,WAAW,GAAG,aAAa,OAAO,gBAAA;AAAA,QACtD,oBAAkB;AAAA,QAElB,UAAA,oBAAC,UAAA,EAAS,IAAG,QAAO,MAAM,MAAA,CAAO;AAAA,MAAA;AAAA,IAAA;AAAA,IAElC,WACC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW;AAAA,UACT;AAAA,UACA,WAAW,0BAA0B;AAAA,QAAA;AAAA,QAEvC,SAAS,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;AAAA,QAEnC,qBAAW,eAAe,MAAM,MAAM,YAAY,gBAAgB,MAAM,MAAM;AAAA,MAAA;AAAA,IAAA;AAAA,EACjF,GAEJ;AAEJ;"}
|
package/dist/data/Properties.cjs
CHANGED
|
@@ -8,6 +8,7 @@ const DropdownMenu = require("../overlay/DropdownMenu.cjs");
|
|
|
8
8
|
const Icon = require("./Icon.cjs");
|
|
9
9
|
const propertiesUtils = require("./properties-utils.cjs");
|
|
10
10
|
const propertiesContext = require("./properties-context.cjs");
|
|
11
|
+
const PropertyValue = require("./PropertyValue.cjs");
|
|
11
12
|
const UiRows = require("../icons/components/UiRows.cjs");
|
|
12
13
|
const UiListFlat = require("../icons/components/UiListFlat.cjs");
|
|
13
14
|
const UiListDashes = require("../icons/components/UiListDashes.cjs");
|
|
@@ -133,7 +134,7 @@ function Properties({
|
|
|
133
134
|
"div",
|
|
134
135
|
{
|
|
135
136
|
className: utils.cn("min-w-0 max-w-full flex-1", styles.value),
|
|
136
|
-
children: renderValue ? renderValue(item.key, item.value, item) :
|
|
137
|
+
children: renderValue ? renderValue(item.key, item.value, item) : /* @__PURE__ */ jsxRuntime.jsx(PropertyValue.PropertyValue, { item, density: activeDensity })
|
|
137
138
|
}
|
|
138
139
|
),
|
|
139
140
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -299,19 +300,5 @@ function PropertiesActionButton({
|
|
|
299
300
|
}
|
|
300
301
|
);
|
|
301
302
|
}
|
|
302
|
-
function defaultRenderValue(value) {
|
|
303
|
-
if (value === null || value === void 0) {
|
|
304
|
-
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-mono italic text-muted-foreground", children: "null" });
|
|
305
|
-
}
|
|
306
|
-
if (typeof value === "string") return value;
|
|
307
|
-
if (typeof value === "number" || typeof value === "boolean") {
|
|
308
|
-
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-mono", children: String(value) });
|
|
309
|
-
}
|
|
310
|
-
try {
|
|
311
|
-
return /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "max-h-48 overflow-auto whitespace-pre-wrap break-words font-mono text-[11px] leading-relaxed", children: JSON.stringify(value, null, 2) });
|
|
312
|
-
} catch {
|
|
313
|
-
return String(value);
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
303
|
exports.Properties = Properties;
|
|
317
304
|
//# sourceMappingURL=Properties.cjs.map
|