@flanksource/clicky-ui 0.3.45 → 0.3.47
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 +22 -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/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/AccessMark.cjs +23 -0
- package/dist/data/AccessMark.cjs.map +1 -0
- package/dist/data/AccessMark.d.ts +11 -0
- package/dist/data/AccessMark.d.ts.map +1 -0
- package/dist/data/AccessMark.js +23 -0
- package/dist/data/AccessMark.js.map +1 -0
- 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/CodeDiff.cjs +116 -23
- package/dist/data/CodeDiff.cjs.map +1 -1
- package/dist/data/CodeDiff.d.ts +26 -0
- package/dist/data/CodeDiff.d.ts.map +1 -1
- package/dist/data/CodeDiff.js +116 -23
- package/dist/data/CodeDiff.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/GraphDiagram.cjs +65 -13
- package/dist/data/GraphDiagram.cjs.map +1 -1
- package/dist/data/GraphDiagram.d.ts +9 -2
- package/dist/data/GraphDiagram.d.ts.map +1 -1
- package/dist/data/GraphDiagram.js +66 -14
- package/dist/data/GraphDiagram.js.map +1 -1
- package/dist/data/GraphDiagramGroups.cjs +100 -0
- package/dist/data/GraphDiagramGroups.cjs.map +1 -0
- package/dist/data/GraphDiagramGroups.d.ts +24 -0
- package/dist/data/GraphDiagramGroups.d.ts.map +1 -0
- package/dist/data/GraphDiagramGroups.js +100 -0
- package/dist/data/GraphDiagramGroups.js.map +1 -0
- package/dist/data/GraphDiagramNodes.cjs +17 -31
- package/dist/data/GraphDiagramNodes.cjs.map +1 -1
- package/dist/data/GraphDiagramNodes.d.ts +6 -13
- package/dist/data/GraphDiagramNodes.d.ts.map +1 -1
- package/dist/data/GraphDiagramNodes.js +17 -31
- package/dist/data/GraphDiagramNodes.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/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/TreeNode.cjs +1 -1
- package/dist/data/TreeNode.cjs.map +1 -1
- package/dist/data/TreeNode.d.ts.map +1 -1
- package/dist/data/TreeNode.js +1 -1
- package/dist/data/TreeNode.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/call-graph/CallGraph.cjs +50 -31
- package/dist/data/call-graph/CallGraph.cjs.map +1 -1
- package/dist/data/call-graph/CallGraph.d.ts +10 -1
- package/dist/data/call-graph/CallGraph.d.ts.map +1 -1
- package/dist/data/call-graph/CallGraph.js +52 -33
- package/dist/data/call-graph/CallGraph.js.map +1 -1
- package/dist/data/call-graph/CallGraphMembers.cjs +5 -4
- package/dist/data/call-graph/CallGraphMembers.cjs.map +1 -1
- package/dist/data/call-graph/CallGraphMembers.d.ts +1 -1
- package/dist/data/call-graph/CallGraphMembers.d.ts.map +1 -1
- package/dist/data/call-graph/CallGraphMembers.js +5 -4
- package/dist/data/call-graph/CallGraphMembers.js.map +1 -1
- package/dist/data/call-graph/CallGraphToolbar.cjs +17 -5
- package/dist/data/call-graph/CallGraphToolbar.cjs.map +1 -1
- package/dist/data/call-graph/CallGraphToolbar.d.ts +10 -0
- package/dist/data/call-graph/CallGraphToolbar.d.ts.map +1 -1
- package/dist/data/call-graph/CallGraphToolbar.js +18 -6
- package/dist/data/call-graph/CallGraphToolbar.js.map +1 -1
- package/dist/data/call-graph/call-graph-model.cjs +169 -18
- package/dist/data/call-graph/call-graph-model.cjs.map +1 -1
- package/dist/data/call-graph/call-graph-model.d.ts +40 -4
- package/dist/data/call-graph/call-graph-model.d.ts.map +1 -1
- package/dist/data/call-graph/call-graph-model.js +170 -19
- package/dist/data/call-graph/call-graph-model.js.map +1 -1
- package/dist/data/call-graph/call-graph-vocabulary.cjs +19 -1
- package/dist/data/call-graph/call-graph-vocabulary.cjs.map +1 -1
- package/dist/data/call-graph/call-graph-vocabulary.d.ts +4 -0
- package/dist/data/call-graph/call-graph-vocabulary.d.ts.map +1 -1
- package/dist/data/call-graph/call-graph-vocabulary.js +19 -1
- package/dist/data/call-graph/call-graph-vocabulary.js.map +1 -1
- package/dist/data/call-graph/call-graph.fixtures.d.ts.map +1 -1
- package/dist/data/call-graph/index.d.ts +2 -2
- package/dist/data/call-graph/index.d.ts.map +1 -1
- package/dist/data/call-graph/types.cjs.map +1 -1
- package/dist/data/call-graph/types.d.ts +7 -2
- package/dist/data/call-graph/types.d.ts.map +1 -1
- package/dist/data/call-graph/types.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/data-access.cjs +8 -0
- package/dist/data/data-access.cjs.map +1 -0
- package/dist/data/data-access.d.ts +5 -0
- package/dist/data/data-access.d.ts.map +1 -0
- package/dist/data/data-access.js +8 -0
- package/dist/data/data-access.js.map +1 -0
- 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/git/GitChangeList.cjs +6 -2
- package/dist/data/git/GitChangeList.cjs.map +1 -1
- package/dist/data/git/GitChangeList.d.ts +6 -1
- package/dist/data/git/GitChangeList.d.ts.map +1 -1
- package/dist/data/git/GitChangeList.js +6 -2
- package/dist/data/git/GitChangeList.js.map +1 -1
- package/dist/data/graph-columns-layout.cjs +47 -16
- package/dist/data/graph-columns-layout.cjs.map +1 -1
- package/dist/data/graph-columns-layout.d.ts +34 -0
- package/dist/data/graph-columns-layout.d.ts.map +1 -1
- package/dist/data/graph-columns-layout.js +47 -16
- package/dist/data/graph-columns-layout.js.map +1 -1
- package/dist/data/graph-diagram-model.cjs +5 -0
- package/dist/data/graph-diagram-model.cjs.map +1 -1
- package/dist/data/graph-diagram-model.d.ts +19 -0
- package/dist/data/graph-diagram-model.d.ts.map +1 -1
- package/dist/data/graph-diagram-model.js +5 -0
- package/dist/data/graph-diagram-model.js.map +1 -1
- package/dist/data/graph-group-window.cjs +60 -0
- package/dist/data/graph-group-window.cjs.map +1 -0
- package/dist/data/graph-group-window.d.ts +33 -0
- package/dist/data/graph-group-window.d.ts.map +1 -0
- package/dist/data/graph-group-window.js +60 -0
- package/dist/data/graph-group-window.js.map +1 -0
- 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 +74 -42
- 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 +76 -44
- 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 +52 -30
- package/dist/data/test-runner/TestRunner.cjs.map +1 -1
- package/dist/data/test-runner/TestRunner.d.ts +3 -2
- package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunner.js +52 -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 +27 -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 +28 -20
- package/dist/data/test-runner/TestTreeNode.js.map +1 -1
- package/dist/data/test-runner/adapter.cjs +11 -0
- package/dist/data/test-runner/adapter.cjs.map +1 -1
- package/dist/data/test-runner/adapter.d.ts +18 -7
- package/dist/data/test-runner/adapter.d.ts.map +1 -1
- package/dist/data/test-runner/adapter.js +11 -0
- package/dist/data/test-runner/adapter.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 +5 -2
- package/dist/data/test-runner/index.d.ts.map +1 -1
- package/dist/data/test-runner/marks.cjs +143 -0
- package/dist/data/test-runner/marks.cjs.map +1 -0
- package/dist/data/test-runner/marks.d.ts +30 -0
- package/dist/data/test-runner/marks.d.ts.map +1 -0
- package/dist/data/test-runner/marks.js +143 -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/use-group-windows.cjs +50 -0
- package/dist/data/use-group-windows.cjs.map +1 -0
- package/dist/data/use-group-windows.d.ts +27 -0
- package/dist/data/use-group-windows.d.ts.map +1 -0
- package/dist/data/use-group-windows.js +50 -0
- package/dist/data/use-group-windows.js.map +1 -0
- package/dist/data/verification/adapterViews.cjs +16 -41
- package/dist/data/verification/adapterViews.cjs.map +1 -1
- package/dist/data/verification/adapterViews.d.ts.map +1 -1
- package/dist/data/verification/adapterViews.js +16 -41
- package/dist/data/verification/adapterViews.js.map +1 -1
- package/dist/data/verification/adapters.cjs +115 -3
- package/dist/data/verification/adapters.cjs.map +1 -1
- package/dist/data/verification/adapters.d.ts.map +1 -1
- package/dist/data/verification/adapters.js +115 -3
- package/dist/data/verification/adapters.js.map +1 -1
- package/dist/data/verification/verifyReportTests.cjs.map +1 -1
- 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 +54 -3
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +6 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +58 -7
- package/dist/data.js.map +1 -1
- package/dist/hooks/event-hub.cjs +229 -0
- package/dist/hooks/event-hub.cjs.map +1 -0
- package/dist/hooks/event-hub.d.ts +26 -0
- package/dist/hooks/event-hub.d.ts.map +1 -0
- package/dist/hooks/event-hub.js +229 -0
- package/dist/hooks/event-hub.js.map +1 -0
- package/dist/hooks.cjs +2 -0
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.ts +1 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +2 -0
- package/dist/hooks.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 +56 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +60 -7
- 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/overlay/modalStack.cjs +13 -6
- package/dist/overlay/modalStack.cjs.map +1 -1
- package/dist/overlay/modalStack.d.ts.map +1 -1
- package/dist/overlay/modalStack.js +13 -6
- package/dist/overlay/modalStack.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/OperationScheduleDialog.cjs +63 -10
- package/dist/rpc/OperationScheduleDialog.cjs.map +1 -1
- package/dist/rpc/OperationScheduleDialog.d.ts +4 -0
- package/dist/rpc/OperationScheduleDialog.d.ts.map +1 -1
- package/dist/rpc/OperationScheduleDialog.js +63 -10
- package/dist/rpc/OperationScheduleDialog.js.map +1 -1
- package/dist/rpc/OperationSchedules.cjs +12 -2
- package/dist/rpc/OperationSchedules.cjs.map +1 -1
- package/dist/rpc/OperationSchedules.d.ts.map +1 -1
- package/dist/rpc/OperationSchedules.js +12 -2
- package/dist/rpc/OperationSchedules.js.map +1 -1
- package/dist/rpc/operation-schedule-model.cjs +2 -0
- package/dist/rpc/operation-schedule-model.cjs.map +1 -1
- package/dist/rpc/operation-schedule-model.d.ts.map +1 -1
- package/dist/rpc/operation-schedule-model.js +2 -0
- package/dist/rpc/operation-schedule-model.js.map +1 -1
- package/dist/rpc/operation-schedule-types.d.ts +7 -1
- package/dist/rpc/operation-schedule-types.d.ts.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
|
@@ -106,7 +106,9 @@ function GitDiffPanel({
|
|
|
106
106
|
error,
|
|
107
107
|
emptyLabel = "No text diff available",
|
|
108
108
|
className,
|
|
109
|
-
maxHeightClassName = "max-h-[520px]"
|
|
109
|
+
maxHeightClassName = "max-h-[520px]",
|
|
110
|
+
onLineAction,
|
|
111
|
+
lineWidgets
|
|
110
112
|
}) {
|
|
111
113
|
if (loading) {
|
|
112
114
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: utils.cn("border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground", className), children: "Loading diff..." });
|
|
@@ -129,7 +131,9 @@ function GitDiffPanel({
|
|
|
129
131
|
bare: true,
|
|
130
132
|
unified: payload.diff,
|
|
131
133
|
className: utils.cn("overflow-auto px-1 py-2", maxHeightClassName),
|
|
132
|
-
...language ? { language } : {}
|
|
134
|
+
...language ? { language } : {},
|
|
135
|
+
...onLineAction ? { onLineAction } : {},
|
|
136
|
+
...lineWidgets ? { lineWidgets } : {}
|
|
133
137
|
}
|
|
134
138
|
)
|
|
135
139
|
] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GitChangeList.cjs","sources":["../../../src/data/git/GitChangeList.tsx"],"sourcesContent":["import { useMemo, useState, type KeyboardEvent, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport {\n UiChevronDown,\n UiChevronRight,\n UiClock,\n UiCode2,\n UiDiff,\n UiFile,\n UiFileCode,\n UiFilePlus,\n UiGitCommit,\n UiLinkExternal,\n UiRemove,\n} from \"../../icons\";\nimport type { IconComponent } from \"../../icons/types\";\nimport { CodeDiff } from \"../CodeDiff\";\nimport { languageFromPath } from \"../code-highlight\";\nimport { dateKey, formatFallbackTime, formatGitCommitDateHeader } from \"./git-dates\";\n\nexport type GitDiffPayload = {\n diff: string;\n truncated?: boolean;\n binary?: boolean;\n path?: string;\n commit?: string;\n};\n\nexport type GitDiffLoader<T> = (item: T) => Promise<GitDiffPayload>;\n\nexport type GitCommitItem = {\n id?: string;\n sha: string;\n shortSha?: string;\n title: string;\n body?: string;\n authorName?: string;\n authorLogin?: string;\n authorAvatarUrl?: string;\n committedAt?: string;\n additions?: number;\n deletions?: number;\n changedFiles?: number;\n href?: string;\n};\n\nexport type GitFileChangeStatus =\n | \"added\"\n | \"modified\"\n | \"deleted\"\n | \"renamed\"\n | \"copied\"\n | string;\n\nexport type GitFileChangeItem = {\n id?: string;\n path: string;\n previousPath?: string;\n status?: GitFileChangeStatus;\n additions?: number;\n deletions?: number;\n href?: string;\n binary?: boolean;\n};\n\ntype DiffState = {\n loading: boolean;\n payload: GitDiffPayload | null;\n error: string;\n};\n\nexport type GitDiffPanelProps = {\n loading?: boolean;\n payload?: GitDiffPayload | null;\n error?: string;\n emptyLabel?: string;\n className?: string;\n maxHeightClassName?: string;\n};\n\nexport type GitCommitListProps = {\n commits: GitCommitItem[];\n loadDiff?: GitDiffLoader<GitCommitItem>;\n renderTime?: (iso: string) => ReactNode;\n groupByDate?: boolean;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n};\n\nexport type GitFileListProps = {\n files: GitFileChangeItem[];\n loadDiff?: GitDiffLoader<GitFileChangeItem>;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n};\n\ntype CommitGroup = {\n key: string;\n label: string;\n commits: GitCommitItem[];\n};\n\nconst DIFF_INITIAL_STATE: DiffState = {\n loading: false,\n payload: null,\n error: \"\",\n};\n\nfunction messageFromError(error: unknown): string {\n if (error instanceof Error) return error.message;\n if (typeof error === \"string\") return error;\n return \"Failed to load diff\";\n}\n\nfunction isActivationKey(event: KeyboardEvent<HTMLDivElement>): boolean {\n return event.key === \"Enter\" || event.key === \" \";\n}\n\nfunction groupCommits(commits: GitCommitItem[], enabled: boolean): CommitGroup[] {\n if (!enabled) return [{ key: \"all\", label: \"\", commits }];\n const groups: CommitGroup[] = [];\n const indexByKey = new Map<string, number>();\n for (const commit of commits) {\n const key = dateKey(commit.committedAt);\n const existing = indexByKey.get(key);\n if (existing != null) {\n groups[existing]?.commits.push(commit);\n continue;\n }\n indexByKey.set(key, groups.length);\n groups.push({\n key,\n label: formatGitCommitDateHeader(commit.committedAt),\n commits: [commit],\n });\n }\n return groups;\n}\n\nfunction shortSha(commit: GitCommitItem): string {\n return commit.shortSha || commit.sha.slice(0, 7);\n}\n\nfunction displayAuthor(commit: GitCommitItem): string {\n return commit.authorLogin || commit.authorName || \"\";\n}\n\nfunction statText(additions?: number, deletions?: number): ReactNode {\n const adds = additions ?? 0;\n const dels = deletions ?? 0;\n if (adds === 0 && dels === 0) return null;\n return (\n <>\n <span aria-hidden>·</span>\n {adds > 0 && <span className=\"text-emerald-600 dark:text-emerald-400\">+{adds}</span>}\n {dels > 0 && <span className=\"text-rose-600 dark:text-rose-400\">-{dels}</span>}\n </>\n );\n}\n\nfunction useLazyDiff<T>(item: T, loader: GitDiffLoader<T> | undefined): [boolean, DiffState, () => void] {\n const [expanded, setExpanded] = useState(false);\n const [state, setState] = useState<DiffState>(DIFF_INITIAL_STATE);\n\n function toggle() {\n setExpanded(open => !open);\n if (!expanded && loader && !state.payload && !state.loading && !state.error) {\n setState({ loading: true, payload: null, error: \"\" });\n loader(item)\n .then(payload => setState({ loading: false, payload, error: \"\" }))\n .catch(error => setState({ loading: false, payload: null, error: messageFromError(error) }));\n }\n }\n\n return [expanded, state, toggle];\n}\n\nfunction Chevron({ expanded }: { expanded: boolean }) {\n const Icon = expanded ? UiChevronDown : UiChevronRight;\n return <Icon className=\"h-3.5 w-3.5 text-muted-foreground\" />;\n}\n\nfunction AvatarImage({ src, alt }: { src: string; alt: string }) {\n return (\n <img\n src={src}\n alt={alt}\n className=\"h-4 w-4 rounded-full border border-border object-cover\"\n loading=\"lazy\"\n />\n );\n}\n\nexport function GitDiffPanel({\n loading,\n payload,\n error,\n emptyLabel = \"No text diff available\",\n className,\n maxHeightClassName = \"max-h-[520px]\",\n}: GitDiffPanelProps) {\n if (loading) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n Loading diff...\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={cn(\"border-t border-border bg-rose-50 px-3 py-3 text-xs text-rose-700 dark:bg-rose-950/30 dark:text-rose-300\", className)}>\n {error}\n </div>\n );\n }\n\n if (payload?.binary) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n Binary file not shown.\n </div>\n );\n }\n\n if (!payload?.diff) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n {emptyLabel}\n </div>\n );\n }\n\n const language = languageFromPath(payload.path);\n return (\n <div className={cn(\"border-t border-border\", className)}>\n {payload.truncated && (\n <div className=\"border-b border-border bg-amber-100/70 px-3 py-1.5 text-xs text-amber-800 [[data-theme=dark]_&]:bg-amber-950/40 [[data-theme=dark]_&]:text-amber-200\">\n Diff truncated.\n </div>\n )}\n <CodeDiff\n bare\n unified={payload.diff}\n className={cn(\"overflow-auto px-1 py-2\", maxHeightClassName)}\n {...(language ? { language } : {})}\n />\n </div>\n );\n}\n\nfunction CommitRow({\n commit,\n loadDiff,\n renderTime,\n diffMaxHeightClassName,\n}: {\n commit: GitCommitItem;\n loadDiff?: GitDiffLoader<GitCommitItem>;\n renderTime?: (iso: string) => ReactNode;\n diffMaxHeightClassName?: string;\n}) {\n const [expanded, diffState, toggle] = useLazyDiff(commit, loadDiff);\n const author = displayAuthor(commit);\n const canExpand = Boolean(loadDiff || commit.body);\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (!canExpand || !isActivationKey(event)) return;\n event.preventDefault();\n toggle();\n }\n\n return (\n <div>\n <div\n role={canExpand ? \"button\" : undefined}\n tabIndex={canExpand ? 0 : undefined}\n className={cn(\n \"flex min-h-14 items-start gap-2 px-3 py-2 text-xs transition-colors\",\n canExpand && \"cursor-pointer hover:bg-muted/70\",\n )}\n onClick={canExpand ? toggle : undefined}\n onKeyDown={canExpand ? onKeyDown : undefined}\n >\n <span className=\"mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n <UiGitCommit className=\"h-3.5 w-3.5\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium text-foreground\" title={commit.title}>\n {commit.title}\n </div>\n <div className=\"mt-1 flex flex-wrap items-center gap-1.5 text-muted-foreground\">\n {commit.authorAvatarUrl && (\n <AvatarImage src={commit.authorAvatarUrl} alt={author || \"Commit author\"} />\n )}\n {author && <span>{author}</span>}\n {commit.committedAt && (\n <>\n <span aria-hidden>·</span>\n <span className=\"inline-flex items-center gap-1\">\n <UiClock className=\"h-3 w-3\" />\n {renderTime ? renderTime(commit.committedAt) : formatFallbackTime(commit.committedAt)}\n </span>\n </>\n )}\n {statText(commit.additions, commit.deletions)}\n {(commit.changedFiles ?? 0) > 0 && (\n <>\n <span aria-hidden>·</span>\n <span>{commit.changedFiles} files</span>\n </>\n )}\n </div>\n </div>\n {commit.href ? (\n <a\n href={commit.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-0.5 inline-flex shrink-0 items-center gap-1 font-mono text-cyan-600 hover:underline\"\n onClick={event => event.stopPropagation()}\n >\n {shortSha(commit)}\n <UiLinkExternal className=\"h-3 w-3\" />\n </a>\n ) : (\n <span className=\"mt-0.5 shrink-0 font-mono text-cyan-600\">{shortSha(commit)}</span>\n )}\n {canExpand && (\n <span className=\"mt-1 shrink-0\">\n <Chevron expanded={expanded} />\n </span>\n )}\n </div>\n {expanded && (\n <div className=\"border-t border-border bg-secondary/50\">\n {commit.body && (\n <pre className=\"mx-3 my-2 whitespace-pre-wrap rounded bg-muted px-3 py-2 font-mono text-[11px] leading-5 text-muted-foreground\">\n {commit.body}\n </pre>\n )}\n {loadDiff && (\n <GitDiffPanel\n loading={diffState.loading}\n payload={diffState.payload}\n error={diffState.error}\n {...(diffMaxHeightClassName ? { maxHeightClassName: diffMaxHeightClassName } : {})}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function GitCommitList({\n commits,\n loadDiff,\n renderTime,\n groupByDate = true,\n emptyLabel = \"No commits found\",\n className,\n diffMaxHeightClassName,\n}: GitCommitListProps) {\n const groups = useMemo(() => groupCommits(commits, groupByDate), [commits, groupByDate]);\n\n if (commits.length === 0) {\n return <div className={cn(\"py-4 text-xs text-muted-foreground\", className)}>{emptyLabel}</div>;\n }\n\n return (\n <div className={cn(\"overflow-hidden rounded-md border border-border\", className)}>\n {groups.map(group => (\n <section key={group.key} aria-label={group.label || \"Commits\"}>\n {group.label && (\n <div className=\"border-b border-border bg-muted/60 px-3 py-2 text-xs font-semibold text-foreground\">\n {group.label}\n </div>\n )}\n <div className=\"divide-y divide-border\">\n {group.commits.map(commit => (\n <CommitRow\n key={commit.id || commit.sha}\n commit={commit}\n {...(loadDiff ? { loadDiff } : {})}\n {...(renderTime ? { renderTime } : {})}\n {...(diffMaxHeightClassName ? { diffMaxHeightClassName } : {})}\n />\n ))}\n </div>\n </section>\n ))}\n </div>\n );\n}\n\ntype StatusView = {\n label: string;\n icon: IconComponent;\n iconClassName: string;\n};\n\nfunction normalizedStatus(status?: string): string {\n return (status || \"modified\").toLowerCase();\n}\n\nfunction statusView(status?: string): StatusView {\n switch (normalizedStatus(status)) {\n case \"added\":\n return { label: \"Added\", icon: UiFilePlus, iconClassName: \"text-emerald-600 dark:text-emerald-400\" };\n case \"deleted\":\n return { label: \"Deleted\", icon: UiRemove, iconClassName: \"text-rose-600 dark:text-rose-400\" };\n case \"renamed\":\n return { label: \"Renamed\", icon: UiFileCode, iconClassName: \"text-sky-600 dark:text-sky-400\" };\n case \"copied\":\n return { label: \"Copied\", icon: UiCode2, iconClassName: \"text-sky-600 dark:text-sky-400\" };\n default:\n return { label: \"Modified\", icon: UiFile, iconClassName: \"text-amber-600 dark:text-amber-400\" };\n }\n}\n\nfunction splitPath(path: string): { directory: string; basename: string } {\n const index = path.lastIndexOf(\"/\");\n if (index < 0) return { directory: \"\", basename: path };\n return { directory: `${path.slice(0, index)}/`, basename: path.slice(index + 1) };\n}\n\nfunction DiffBars({ additions = 0, deletions = 0 }: { additions?: number; deletions?: number }) {\n const total = additions + deletions;\n const maxBars = 5;\n const addBars = total > 0 ? Math.round((additions / total) * maxBars) : 0;\n const delBars = total > 0 ? maxBars - addBars : 0;\n return (\n <span className=\"inline-flex gap-px\" aria-hidden>\n {Array.from({ length: addBars }).map((_, index) => (\n <span key={`a${index}`} className=\"inline-block h-2 w-1.5 rounded-sm bg-emerald-500\" />\n ))}\n {Array.from({ length: delBars }).map((_, index) => (\n <span key={`d${index}`} className=\"inline-block h-2 w-1.5 rounded-sm bg-rose-500\" />\n ))}\n {total === 0 && <span className=\"inline-block h-2 w-1.5 rounded-sm bg-muted-foreground/30\" />}\n </span>\n );\n}\n\nfunction FileRow({\n file,\n loadDiff,\n diffMaxHeightClassName,\n}: {\n file: GitFileChangeItem;\n loadDiff?: GitDiffLoader<GitFileChangeItem>;\n diffMaxHeightClassName?: string;\n}) {\n const [expanded, diffState, toggle] = useLazyDiff(file, loadDiff);\n const status = statusView(file.status);\n const StatusIcon = status.icon;\n const path = splitPath(file.path);\n const canExpand = Boolean(loadDiff);\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (!canExpand || !isActivationKey(event)) return;\n event.preventDefault();\n toggle();\n }\n\n return (\n <div>\n <div\n role={canExpand ? \"button\" : undefined}\n tabIndex={canExpand ? 0 : undefined}\n className={cn(\n \"flex min-h-11 items-center gap-2 px-3 py-2 text-xs transition-colors\",\n canExpand && \"cursor-pointer hover:bg-muted/70\",\n )}\n onClick={canExpand ? toggle : undefined}\n onKeyDown={canExpand ? onKeyDown : undefined}\n >\n <StatusIcon className={cn(\"h-4 w-4 shrink-0\", status.iconClassName)} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-mono text-foreground\" title={file.path}>\n {path.directory && <span className=\"text-muted-foreground\">{path.directory}</span>}\n <span>{path.basename}</span>\n </div>\n {file.previousPath && (\n <div className=\"mt-0.5 truncate font-mono text-[11px] text-muted-foreground\">\n from {file.previousPath}\n </div>\n )}\n </div>\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">{status.label}</span>\n <span className=\"shrink-0 tabular-nums text-emerald-600 dark:text-emerald-400\">\n +{file.additions ?? 0}\n </span>\n <span className=\"shrink-0 tabular-nums text-rose-600 dark:text-rose-400\">\n -{file.deletions ?? 0}\n </span>\n <DiffBars\n {...(file.additions !== undefined ? { additions: file.additions } : {})}\n {...(file.deletions !== undefined ? { deletions: file.deletions } : {})}\n />\n {file.href && (\n <a\n href={file.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={event => event.stopPropagation()}\n aria-label={`Open ${file.path}`}\n >\n <UiLinkExternal className=\"h-3.5 w-3.5\" />\n </a>\n )}\n {canExpand && (\n <span className=\"shrink-0\">\n <Chevron expanded={expanded} />\n </span>\n )}\n </div>\n {expanded && (\n <GitDiffPanel\n loading={diffState.loading}\n payload={diffState.payload}\n error={diffState.error}\n {...(diffMaxHeightClassName ? { maxHeightClassName: diffMaxHeightClassName } : {})}\n />\n )}\n </div>\n );\n}\n\nexport function GitFileList({\n files,\n loadDiff,\n emptyLabel = \"No changed files found\",\n className,\n diffMaxHeightClassName,\n}: GitFileListProps) {\n if (files.length === 0) {\n return <div className={cn(\"py-4 text-xs text-muted-foreground\", className)}>{emptyLabel}</div>;\n }\n\n return (\n <div className={cn(\"overflow-hidden rounded-md border border-border\", className)}>\n <div className=\"divide-y divide-border\">\n {files.map(file => (\n <FileRow\n key={file.id || file.path}\n file={file}\n {...(loadDiff ? { loadDiff } : {})}\n {...(diffMaxHeightClassName ? { diffMaxHeightClassName } : {})}\n />\n ))}\n </div>\n </div>\n );\n}\n\nexport function GitChangedFilesSummary({\n files,\n additions,\n deletions,\n className,\n}: {\n files: number;\n additions: number;\n deletions: number;\n className?: string;\n}) {\n return (\n <div className={cn(\"flex items-center gap-2 text-xs text-muted-foreground\", className)}>\n <span className=\"inline-flex items-center gap-1 font-medium\">\n <UiDiff className=\"h-3.5 w-3.5\" />\n {files} file{files === 1 ? \"\" : \"s\"} changed\n </span>\n <span aria-hidden>·</span>\n <span className=\"text-emerald-600 dark:text-emerald-400\">+{additions}</span>\n <span className=\"text-rose-600 dark:text-rose-400\">-{deletions}</span>\n </div>\n );\n}\n"],"names":["dateKey","formatGitCommitDateHeader","jsxs","Fragment","jsx","useState","UiChevronDown","UiChevronRight","cn","languageFromPath","CodeDiff","UiGitCommit","UiClock","formatFallbackTime","UiLinkExternal","useMemo","UiFilePlus","UiRemove","UiFileCode","UiCode2","UiFile","UiDiff"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GitChangeList.cjs","sources":["../../../src/data/git/GitChangeList.tsx"],"sourcesContent":["import { useMemo, useState, type KeyboardEvent, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport {\n UiChevronDown,\n UiChevronRight,\n UiClock,\n UiCode2,\n UiDiff,\n UiFile,\n UiFileCode,\n UiFilePlus,\n UiGitCommit,\n UiLinkExternal,\n UiRemove,\n} from \"../../icons\";\nimport type { IconComponent } from \"../../icons/types\";\nimport { CodeDiff, type DiffLineTarget, type DiffLineWidget } from \"../CodeDiff\";\nimport { languageFromPath } from \"../code-highlight\";\nimport { dateKey, formatFallbackTime, formatGitCommitDateHeader } from \"./git-dates\";\n\nexport type GitDiffPayload = {\n diff: string;\n truncated?: boolean;\n binary?: boolean;\n path?: string;\n commit?: string;\n};\n\nexport type GitDiffLoader<T> = (item: T) => Promise<GitDiffPayload>;\n\nexport type GitCommitItem = {\n id?: string;\n sha: string;\n shortSha?: string;\n title: string;\n body?: string;\n authorName?: string;\n authorLogin?: string;\n authorAvatarUrl?: string;\n committedAt?: string;\n additions?: number;\n deletions?: number;\n changedFiles?: number;\n href?: string;\n};\n\nexport type GitFileChangeStatus =\n | \"added\"\n | \"modified\"\n | \"deleted\"\n | \"renamed\"\n | \"copied\"\n | string;\n\nexport type GitFileChangeItem = {\n id?: string;\n path: string;\n previousPath?: string;\n status?: GitFileChangeStatus;\n additions?: number;\n deletions?: number;\n href?: string;\n binary?: boolean;\n};\n\ntype DiffState = {\n loading: boolean;\n payload: GitDiffPayload | null;\n error: string;\n};\n\nexport type GitDiffPanelProps = {\n loading?: boolean;\n payload?: GitDiffPayload | null;\n error?: string;\n emptyLabel?: string;\n className?: string;\n maxHeightClassName?: string;\n /** Forwarded to `CodeDiff`: shows a gutter \"+\" button per numbered line. */\n onLineAction?: (target: DiffLineTarget) => void;\n /** Forwarded to `CodeDiff`: rows rendered under the matching diff line. */\n lineWidgets?: DiffLineWidget[];\n};\n\nexport type GitCommitListProps = {\n commits: GitCommitItem[];\n loadDiff?: GitDiffLoader<GitCommitItem>;\n renderTime?: (iso: string) => ReactNode;\n groupByDate?: boolean;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n};\n\nexport type GitFileListProps = {\n files: GitFileChangeItem[];\n loadDiff?: GitDiffLoader<GitFileChangeItem>;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n};\n\ntype CommitGroup = {\n key: string;\n label: string;\n commits: GitCommitItem[];\n};\n\nconst DIFF_INITIAL_STATE: DiffState = {\n loading: false,\n payload: null,\n error: \"\",\n};\n\nfunction messageFromError(error: unknown): string {\n if (error instanceof Error) return error.message;\n if (typeof error === \"string\") return error;\n return \"Failed to load diff\";\n}\n\nfunction isActivationKey(event: KeyboardEvent<HTMLDivElement>): boolean {\n return event.key === \"Enter\" || event.key === \" \";\n}\n\nfunction groupCommits(commits: GitCommitItem[], enabled: boolean): CommitGroup[] {\n if (!enabled) return [{ key: \"all\", label: \"\", commits }];\n const groups: CommitGroup[] = [];\n const indexByKey = new Map<string, number>();\n for (const commit of commits) {\n const key = dateKey(commit.committedAt);\n const existing = indexByKey.get(key);\n if (existing != null) {\n groups[existing]?.commits.push(commit);\n continue;\n }\n indexByKey.set(key, groups.length);\n groups.push({\n key,\n label: formatGitCommitDateHeader(commit.committedAt),\n commits: [commit],\n });\n }\n return groups;\n}\n\nfunction shortSha(commit: GitCommitItem): string {\n return commit.shortSha || commit.sha.slice(0, 7);\n}\n\nfunction displayAuthor(commit: GitCommitItem): string {\n return commit.authorLogin || commit.authorName || \"\";\n}\n\nfunction statText(additions?: number, deletions?: number): ReactNode {\n const adds = additions ?? 0;\n const dels = deletions ?? 0;\n if (adds === 0 && dels === 0) return null;\n return (\n <>\n <span aria-hidden>·</span>\n {adds > 0 && <span className=\"text-emerald-600 dark:text-emerald-400\">+{adds}</span>}\n {dels > 0 && <span className=\"text-rose-600 dark:text-rose-400\">-{dels}</span>}\n </>\n );\n}\n\nfunction useLazyDiff<T>(item: T, loader: GitDiffLoader<T> | undefined): [boolean, DiffState, () => void] {\n const [expanded, setExpanded] = useState(false);\n const [state, setState] = useState<DiffState>(DIFF_INITIAL_STATE);\n\n function toggle() {\n setExpanded(open => !open);\n if (!expanded && loader && !state.payload && !state.loading && !state.error) {\n setState({ loading: true, payload: null, error: \"\" });\n loader(item)\n .then(payload => setState({ loading: false, payload, error: \"\" }))\n .catch(error => setState({ loading: false, payload: null, error: messageFromError(error) }));\n }\n }\n\n return [expanded, state, toggle];\n}\n\nfunction Chevron({ expanded }: { expanded: boolean }) {\n const Icon = expanded ? UiChevronDown : UiChevronRight;\n return <Icon className=\"h-3.5 w-3.5 text-muted-foreground\" />;\n}\n\nfunction AvatarImage({ src, alt }: { src: string; alt: string }) {\n return (\n <img\n src={src}\n alt={alt}\n className=\"h-4 w-4 rounded-full border border-border object-cover\"\n loading=\"lazy\"\n />\n );\n}\n\nexport function GitDiffPanel({\n loading,\n payload,\n error,\n emptyLabel = \"No text diff available\",\n className,\n maxHeightClassName = \"max-h-[520px]\",\n onLineAction,\n lineWidgets,\n}: GitDiffPanelProps) {\n if (loading) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n Loading diff...\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={cn(\"border-t border-border bg-rose-50 px-3 py-3 text-xs text-rose-700 dark:bg-rose-950/30 dark:text-rose-300\", className)}>\n {error}\n </div>\n );\n }\n\n if (payload?.binary) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n Binary file not shown.\n </div>\n );\n }\n\n if (!payload?.diff) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n {emptyLabel}\n </div>\n );\n }\n\n const language = languageFromPath(payload.path);\n return (\n <div className={cn(\"border-t border-border\", className)}>\n {payload.truncated && (\n <div className=\"border-b border-border bg-amber-100/70 px-3 py-1.5 text-xs text-amber-800 [[data-theme=dark]_&]:bg-amber-950/40 [[data-theme=dark]_&]:text-amber-200\">\n Diff truncated.\n </div>\n )}\n <CodeDiff\n bare\n unified={payload.diff}\n className={cn(\"overflow-auto px-1 py-2\", maxHeightClassName)}\n {...(language ? { language } : {})}\n {...(onLineAction ? { onLineAction } : {})}\n {...(lineWidgets ? { lineWidgets } : {})}\n />\n </div>\n );\n}\n\nfunction CommitRow({\n commit,\n loadDiff,\n renderTime,\n diffMaxHeightClassName,\n}: {\n commit: GitCommitItem;\n loadDiff?: GitDiffLoader<GitCommitItem>;\n renderTime?: (iso: string) => ReactNode;\n diffMaxHeightClassName?: string;\n}) {\n const [expanded, diffState, toggle] = useLazyDiff(commit, loadDiff);\n const author = displayAuthor(commit);\n const canExpand = Boolean(loadDiff || commit.body);\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (!canExpand || !isActivationKey(event)) return;\n event.preventDefault();\n toggle();\n }\n\n return (\n <div>\n <div\n role={canExpand ? \"button\" : undefined}\n tabIndex={canExpand ? 0 : undefined}\n className={cn(\n \"flex min-h-14 items-start gap-2 px-3 py-2 text-xs transition-colors\",\n canExpand && \"cursor-pointer hover:bg-muted/70\",\n )}\n onClick={canExpand ? toggle : undefined}\n onKeyDown={canExpand ? onKeyDown : undefined}\n >\n <span className=\"mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n <UiGitCommit className=\"h-3.5 w-3.5\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium text-foreground\" title={commit.title}>\n {commit.title}\n </div>\n <div className=\"mt-1 flex flex-wrap items-center gap-1.5 text-muted-foreground\">\n {commit.authorAvatarUrl && (\n <AvatarImage src={commit.authorAvatarUrl} alt={author || \"Commit author\"} />\n )}\n {author && <span>{author}</span>}\n {commit.committedAt && (\n <>\n <span aria-hidden>·</span>\n <span className=\"inline-flex items-center gap-1\">\n <UiClock className=\"h-3 w-3\" />\n {renderTime ? renderTime(commit.committedAt) : formatFallbackTime(commit.committedAt)}\n </span>\n </>\n )}\n {statText(commit.additions, commit.deletions)}\n {(commit.changedFiles ?? 0) > 0 && (\n <>\n <span aria-hidden>·</span>\n <span>{commit.changedFiles} files</span>\n </>\n )}\n </div>\n </div>\n {commit.href ? (\n <a\n href={commit.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-0.5 inline-flex shrink-0 items-center gap-1 font-mono text-cyan-600 hover:underline\"\n onClick={event => event.stopPropagation()}\n >\n {shortSha(commit)}\n <UiLinkExternal className=\"h-3 w-3\" />\n </a>\n ) : (\n <span className=\"mt-0.5 shrink-0 font-mono text-cyan-600\">{shortSha(commit)}</span>\n )}\n {canExpand && (\n <span className=\"mt-1 shrink-0\">\n <Chevron expanded={expanded} />\n </span>\n )}\n </div>\n {expanded && (\n <div className=\"border-t border-border bg-secondary/50\">\n {commit.body && (\n <pre className=\"mx-3 my-2 whitespace-pre-wrap rounded bg-muted px-3 py-2 font-mono text-[11px] leading-5 text-muted-foreground\">\n {commit.body}\n </pre>\n )}\n {loadDiff && (\n <GitDiffPanel\n loading={diffState.loading}\n payload={diffState.payload}\n error={diffState.error}\n {...(diffMaxHeightClassName ? { maxHeightClassName: diffMaxHeightClassName } : {})}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function GitCommitList({\n commits,\n loadDiff,\n renderTime,\n groupByDate = true,\n emptyLabel = \"No commits found\",\n className,\n diffMaxHeightClassName,\n}: GitCommitListProps) {\n const groups = useMemo(() => groupCommits(commits, groupByDate), [commits, groupByDate]);\n\n if (commits.length === 0) {\n return <div className={cn(\"py-4 text-xs text-muted-foreground\", className)}>{emptyLabel}</div>;\n }\n\n return (\n <div className={cn(\"overflow-hidden rounded-md border border-border\", className)}>\n {groups.map(group => (\n <section key={group.key} aria-label={group.label || \"Commits\"}>\n {group.label && (\n <div className=\"border-b border-border bg-muted/60 px-3 py-2 text-xs font-semibold text-foreground\">\n {group.label}\n </div>\n )}\n <div className=\"divide-y divide-border\">\n {group.commits.map(commit => (\n <CommitRow\n key={commit.id || commit.sha}\n commit={commit}\n {...(loadDiff ? { loadDiff } : {})}\n {...(renderTime ? { renderTime } : {})}\n {...(diffMaxHeightClassName ? { diffMaxHeightClassName } : {})}\n />\n ))}\n </div>\n </section>\n ))}\n </div>\n );\n}\n\ntype StatusView = {\n label: string;\n icon: IconComponent;\n iconClassName: string;\n};\n\nfunction normalizedStatus(status?: string): string {\n return (status || \"modified\").toLowerCase();\n}\n\nfunction statusView(status?: string): StatusView {\n switch (normalizedStatus(status)) {\n case \"added\":\n return { label: \"Added\", icon: UiFilePlus, iconClassName: \"text-emerald-600 dark:text-emerald-400\" };\n case \"deleted\":\n return { label: \"Deleted\", icon: UiRemove, iconClassName: \"text-rose-600 dark:text-rose-400\" };\n case \"renamed\":\n return { label: \"Renamed\", icon: UiFileCode, iconClassName: \"text-sky-600 dark:text-sky-400\" };\n case \"copied\":\n return { label: \"Copied\", icon: UiCode2, iconClassName: \"text-sky-600 dark:text-sky-400\" };\n default:\n return { label: \"Modified\", icon: UiFile, iconClassName: \"text-amber-600 dark:text-amber-400\" };\n }\n}\n\nfunction splitPath(path: string): { directory: string; basename: string } {\n const index = path.lastIndexOf(\"/\");\n if (index < 0) return { directory: \"\", basename: path };\n return { directory: `${path.slice(0, index)}/`, basename: path.slice(index + 1) };\n}\n\nfunction DiffBars({ additions = 0, deletions = 0 }: { additions?: number; deletions?: number }) {\n const total = additions + deletions;\n const maxBars = 5;\n const addBars = total > 0 ? Math.round((additions / total) * maxBars) : 0;\n const delBars = total > 0 ? maxBars - addBars : 0;\n return (\n <span className=\"inline-flex gap-px\" aria-hidden>\n {Array.from({ length: addBars }).map((_, index) => (\n <span key={`a${index}`} className=\"inline-block h-2 w-1.5 rounded-sm bg-emerald-500\" />\n ))}\n {Array.from({ length: delBars }).map((_, index) => (\n <span key={`d${index}`} className=\"inline-block h-2 w-1.5 rounded-sm bg-rose-500\" />\n ))}\n {total === 0 && <span className=\"inline-block h-2 w-1.5 rounded-sm bg-muted-foreground/30\" />}\n </span>\n );\n}\n\nfunction FileRow({\n file,\n loadDiff,\n diffMaxHeightClassName,\n}: {\n file: GitFileChangeItem;\n loadDiff?: GitDiffLoader<GitFileChangeItem>;\n diffMaxHeightClassName?: string;\n}) {\n const [expanded, diffState, toggle] = useLazyDiff(file, loadDiff);\n const status = statusView(file.status);\n const StatusIcon = status.icon;\n const path = splitPath(file.path);\n const canExpand = Boolean(loadDiff);\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (!canExpand || !isActivationKey(event)) return;\n event.preventDefault();\n toggle();\n }\n\n return (\n <div>\n <div\n role={canExpand ? \"button\" : undefined}\n tabIndex={canExpand ? 0 : undefined}\n className={cn(\n \"flex min-h-11 items-center gap-2 px-3 py-2 text-xs transition-colors\",\n canExpand && \"cursor-pointer hover:bg-muted/70\",\n )}\n onClick={canExpand ? toggle : undefined}\n onKeyDown={canExpand ? onKeyDown : undefined}\n >\n <StatusIcon className={cn(\"h-4 w-4 shrink-0\", status.iconClassName)} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-mono text-foreground\" title={file.path}>\n {path.directory && <span className=\"text-muted-foreground\">{path.directory}</span>}\n <span>{path.basename}</span>\n </div>\n {file.previousPath && (\n <div className=\"mt-0.5 truncate font-mono text-[11px] text-muted-foreground\">\n from {file.previousPath}\n </div>\n )}\n </div>\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">{status.label}</span>\n <span className=\"shrink-0 tabular-nums text-emerald-600 dark:text-emerald-400\">\n +{file.additions ?? 0}\n </span>\n <span className=\"shrink-0 tabular-nums text-rose-600 dark:text-rose-400\">\n -{file.deletions ?? 0}\n </span>\n <DiffBars\n {...(file.additions !== undefined ? { additions: file.additions } : {})}\n {...(file.deletions !== undefined ? { deletions: file.deletions } : {})}\n />\n {file.href && (\n <a\n href={file.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={event => event.stopPropagation()}\n aria-label={`Open ${file.path}`}\n >\n <UiLinkExternal className=\"h-3.5 w-3.5\" />\n </a>\n )}\n {canExpand && (\n <span className=\"shrink-0\">\n <Chevron expanded={expanded} />\n </span>\n )}\n </div>\n {expanded && (\n <GitDiffPanel\n loading={diffState.loading}\n payload={diffState.payload}\n error={diffState.error}\n {...(diffMaxHeightClassName ? { maxHeightClassName: diffMaxHeightClassName } : {})}\n />\n )}\n </div>\n );\n}\n\nexport function GitFileList({\n files,\n loadDiff,\n emptyLabel = \"No changed files found\",\n className,\n diffMaxHeightClassName,\n}: GitFileListProps) {\n if (files.length === 0) {\n return <div className={cn(\"py-4 text-xs text-muted-foreground\", className)}>{emptyLabel}</div>;\n }\n\n return (\n <div className={cn(\"overflow-hidden rounded-md border border-border\", className)}>\n <div className=\"divide-y divide-border\">\n {files.map(file => (\n <FileRow\n key={file.id || file.path}\n file={file}\n {...(loadDiff ? { loadDiff } : {})}\n {...(diffMaxHeightClassName ? { diffMaxHeightClassName } : {})}\n />\n ))}\n </div>\n </div>\n );\n}\n\nexport function GitChangedFilesSummary({\n files,\n additions,\n deletions,\n className,\n}: {\n files: number;\n additions: number;\n deletions: number;\n className?: string;\n}) {\n return (\n <div className={cn(\"flex items-center gap-2 text-xs text-muted-foreground\", className)}>\n <span className=\"inline-flex items-center gap-1 font-medium\">\n <UiDiff className=\"h-3.5 w-3.5\" />\n {files} file{files === 1 ? \"\" : \"s\"} changed\n </span>\n <span aria-hidden>·</span>\n <span className=\"text-emerald-600 dark:text-emerald-400\">+{additions}</span>\n <span className=\"text-rose-600 dark:text-rose-400\">-{deletions}</span>\n </div>\n );\n}\n"],"names":["dateKey","formatGitCommitDateHeader","jsxs","Fragment","jsx","useState","UiChevronDown","UiChevronRight","cn","languageFromPath","CodeDiff","UiGitCommit","UiClock","formatFallbackTime","UiLinkExternal","useMemo","UiFilePlus","UiRemove","UiFileCode","UiCode2","UiFile","UiDiff"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
|
+
import { DiffLineTarget, DiffLineWidget } from '../CodeDiff.js';
|
|
2
3
|
export type GitDiffPayload = {
|
|
3
4
|
diff: string;
|
|
4
5
|
truncated?: boolean;
|
|
@@ -40,6 +41,10 @@ export type GitDiffPanelProps = {
|
|
|
40
41
|
emptyLabel?: string;
|
|
41
42
|
className?: string;
|
|
42
43
|
maxHeightClassName?: string;
|
|
44
|
+
/** Forwarded to `CodeDiff`: shows a gutter "+" button per numbered line. */
|
|
45
|
+
onLineAction?: (target: DiffLineTarget) => void;
|
|
46
|
+
/** Forwarded to `CodeDiff`: rows rendered under the matching diff line. */
|
|
47
|
+
lineWidgets?: DiffLineWidget[];
|
|
43
48
|
};
|
|
44
49
|
export type GitCommitListProps = {
|
|
45
50
|
commits: GitCommitItem[];
|
|
@@ -57,7 +62,7 @@ export type GitFileListProps = {
|
|
|
57
62
|
className?: string;
|
|
58
63
|
diffMaxHeightClassName?: string;
|
|
59
64
|
};
|
|
60
|
-
export declare function GitDiffPanel({ loading, payload, error, emptyLabel, className, maxHeightClassName, }: GitDiffPanelProps): import("react").JSX.Element;
|
|
65
|
+
export declare function GitDiffPanel({ loading, payload, error, emptyLabel, className, maxHeightClassName, onLineAction, lineWidgets, }: GitDiffPanelProps): import("react").JSX.Element;
|
|
61
66
|
export declare function GitCommitList({ commits, loadDiff, renderTime, groupByDate, emptyLabel, className, diffMaxHeightClassName, }: GitCommitListProps): import("react").JSX.Element;
|
|
62
67
|
export declare function GitFileList({ files, loadDiff, emptyLabel, className, diffMaxHeightClassName, }: GitFileListProps): import("react").JSX.Element;
|
|
63
68
|
export declare function GitChangedFilesSummary({ files, additions, deletions, className, }: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GitChangeList.d.ts","sourceRoot":"","sources":["../../../src/data/git/GitChangeList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAyC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"GitChangeList.d.ts","sourceRoot":"","sources":["../../../src/data/git/GitChangeList.tsx"],"names":[],"mappings":"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"}
|
|
@@ -104,7 +104,9 @@ function GitDiffPanel({
|
|
|
104
104
|
error,
|
|
105
105
|
emptyLabel = "No text diff available",
|
|
106
106
|
className,
|
|
107
|
-
maxHeightClassName = "max-h-[520px]"
|
|
107
|
+
maxHeightClassName = "max-h-[520px]",
|
|
108
|
+
onLineAction,
|
|
109
|
+
lineWidgets
|
|
108
110
|
}) {
|
|
109
111
|
if (loading) {
|
|
110
112
|
return /* @__PURE__ */ jsx("div", { className: cn("border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground", className), children: "Loading diff..." });
|
|
@@ -127,7 +129,9 @@ function GitDiffPanel({
|
|
|
127
129
|
bare: true,
|
|
128
130
|
unified: payload.diff,
|
|
129
131
|
className: cn("overflow-auto px-1 py-2", maxHeightClassName),
|
|
130
|
-
...language ? { language } : {}
|
|
132
|
+
...language ? { language } : {},
|
|
133
|
+
...onLineAction ? { onLineAction } : {},
|
|
134
|
+
...lineWidgets ? { lineWidgets } : {}
|
|
131
135
|
}
|
|
132
136
|
)
|
|
133
137
|
] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GitChangeList.js","sources":["../../../src/data/git/GitChangeList.tsx"],"sourcesContent":["import { useMemo, useState, type KeyboardEvent, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport {\n UiChevronDown,\n UiChevronRight,\n UiClock,\n UiCode2,\n UiDiff,\n UiFile,\n UiFileCode,\n UiFilePlus,\n UiGitCommit,\n UiLinkExternal,\n UiRemove,\n} from \"../../icons\";\nimport type { IconComponent } from \"../../icons/types\";\nimport { CodeDiff } from \"../CodeDiff\";\nimport { languageFromPath } from \"../code-highlight\";\nimport { dateKey, formatFallbackTime, formatGitCommitDateHeader } from \"./git-dates\";\n\nexport type GitDiffPayload = {\n diff: string;\n truncated?: boolean;\n binary?: boolean;\n path?: string;\n commit?: string;\n};\n\nexport type GitDiffLoader<T> = (item: T) => Promise<GitDiffPayload>;\n\nexport type GitCommitItem = {\n id?: string;\n sha: string;\n shortSha?: string;\n title: string;\n body?: string;\n authorName?: string;\n authorLogin?: string;\n authorAvatarUrl?: string;\n committedAt?: string;\n additions?: number;\n deletions?: number;\n changedFiles?: number;\n href?: string;\n};\n\nexport type GitFileChangeStatus =\n | \"added\"\n | \"modified\"\n | \"deleted\"\n | \"renamed\"\n | \"copied\"\n | string;\n\nexport type GitFileChangeItem = {\n id?: string;\n path: string;\n previousPath?: string;\n status?: GitFileChangeStatus;\n additions?: number;\n deletions?: number;\n href?: string;\n binary?: boolean;\n};\n\ntype DiffState = {\n loading: boolean;\n payload: GitDiffPayload | null;\n error: string;\n};\n\nexport type GitDiffPanelProps = {\n loading?: boolean;\n payload?: GitDiffPayload | null;\n error?: string;\n emptyLabel?: string;\n className?: string;\n maxHeightClassName?: string;\n};\n\nexport type GitCommitListProps = {\n commits: GitCommitItem[];\n loadDiff?: GitDiffLoader<GitCommitItem>;\n renderTime?: (iso: string) => ReactNode;\n groupByDate?: boolean;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n};\n\nexport type GitFileListProps = {\n files: GitFileChangeItem[];\n loadDiff?: GitDiffLoader<GitFileChangeItem>;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n};\n\ntype CommitGroup = {\n key: string;\n label: string;\n commits: GitCommitItem[];\n};\n\nconst DIFF_INITIAL_STATE: DiffState = {\n loading: false,\n payload: null,\n error: \"\",\n};\n\nfunction messageFromError(error: unknown): string {\n if (error instanceof Error) return error.message;\n if (typeof error === \"string\") return error;\n return \"Failed to load diff\";\n}\n\nfunction isActivationKey(event: KeyboardEvent<HTMLDivElement>): boolean {\n return event.key === \"Enter\" || event.key === \" \";\n}\n\nfunction groupCommits(commits: GitCommitItem[], enabled: boolean): CommitGroup[] {\n if (!enabled) return [{ key: \"all\", label: \"\", commits }];\n const groups: CommitGroup[] = [];\n const indexByKey = new Map<string, number>();\n for (const commit of commits) {\n const key = dateKey(commit.committedAt);\n const existing = indexByKey.get(key);\n if (existing != null) {\n groups[existing]?.commits.push(commit);\n continue;\n }\n indexByKey.set(key, groups.length);\n groups.push({\n key,\n label: formatGitCommitDateHeader(commit.committedAt),\n commits: [commit],\n });\n }\n return groups;\n}\n\nfunction shortSha(commit: GitCommitItem): string {\n return commit.shortSha || commit.sha.slice(0, 7);\n}\n\nfunction displayAuthor(commit: GitCommitItem): string {\n return commit.authorLogin || commit.authorName || \"\";\n}\n\nfunction statText(additions?: number, deletions?: number): ReactNode {\n const adds = additions ?? 0;\n const dels = deletions ?? 0;\n if (adds === 0 && dels === 0) return null;\n return (\n <>\n <span aria-hidden>·</span>\n {adds > 0 && <span className=\"text-emerald-600 dark:text-emerald-400\">+{adds}</span>}\n {dels > 0 && <span className=\"text-rose-600 dark:text-rose-400\">-{dels}</span>}\n </>\n );\n}\n\nfunction useLazyDiff<T>(item: T, loader: GitDiffLoader<T> | undefined): [boolean, DiffState, () => void] {\n const [expanded, setExpanded] = useState(false);\n const [state, setState] = useState<DiffState>(DIFF_INITIAL_STATE);\n\n function toggle() {\n setExpanded(open => !open);\n if (!expanded && loader && !state.payload && !state.loading && !state.error) {\n setState({ loading: true, payload: null, error: \"\" });\n loader(item)\n .then(payload => setState({ loading: false, payload, error: \"\" }))\n .catch(error => setState({ loading: false, payload: null, error: messageFromError(error) }));\n }\n }\n\n return [expanded, state, toggle];\n}\n\nfunction Chevron({ expanded }: { expanded: boolean }) {\n const Icon = expanded ? UiChevronDown : UiChevronRight;\n return <Icon className=\"h-3.5 w-3.5 text-muted-foreground\" />;\n}\n\nfunction AvatarImage({ src, alt }: { src: string; alt: string }) {\n return (\n <img\n src={src}\n alt={alt}\n className=\"h-4 w-4 rounded-full border border-border object-cover\"\n loading=\"lazy\"\n />\n );\n}\n\nexport function GitDiffPanel({\n loading,\n payload,\n error,\n emptyLabel = \"No text diff available\",\n className,\n maxHeightClassName = \"max-h-[520px]\",\n}: GitDiffPanelProps) {\n if (loading) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n Loading diff...\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={cn(\"border-t border-border bg-rose-50 px-3 py-3 text-xs text-rose-700 dark:bg-rose-950/30 dark:text-rose-300\", className)}>\n {error}\n </div>\n );\n }\n\n if (payload?.binary) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n Binary file not shown.\n </div>\n );\n }\n\n if (!payload?.diff) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n {emptyLabel}\n </div>\n );\n }\n\n const language = languageFromPath(payload.path);\n return (\n <div className={cn(\"border-t border-border\", className)}>\n {payload.truncated && (\n <div className=\"border-b border-border bg-amber-100/70 px-3 py-1.5 text-xs text-amber-800 [[data-theme=dark]_&]:bg-amber-950/40 [[data-theme=dark]_&]:text-amber-200\">\n Diff truncated.\n </div>\n )}\n <CodeDiff\n bare\n unified={payload.diff}\n className={cn(\"overflow-auto px-1 py-2\", maxHeightClassName)}\n {...(language ? { language } : {})}\n />\n </div>\n );\n}\n\nfunction CommitRow({\n commit,\n loadDiff,\n renderTime,\n diffMaxHeightClassName,\n}: {\n commit: GitCommitItem;\n loadDiff?: GitDiffLoader<GitCommitItem>;\n renderTime?: (iso: string) => ReactNode;\n diffMaxHeightClassName?: string;\n}) {\n const [expanded, diffState, toggle] = useLazyDiff(commit, loadDiff);\n const author = displayAuthor(commit);\n const canExpand = Boolean(loadDiff || commit.body);\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (!canExpand || !isActivationKey(event)) return;\n event.preventDefault();\n toggle();\n }\n\n return (\n <div>\n <div\n role={canExpand ? \"button\" : undefined}\n tabIndex={canExpand ? 0 : undefined}\n className={cn(\n \"flex min-h-14 items-start gap-2 px-3 py-2 text-xs transition-colors\",\n canExpand && \"cursor-pointer hover:bg-muted/70\",\n )}\n onClick={canExpand ? toggle : undefined}\n onKeyDown={canExpand ? onKeyDown : undefined}\n >\n <span className=\"mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n <UiGitCommit className=\"h-3.5 w-3.5\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium text-foreground\" title={commit.title}>\n {commit.title}\n </div>\n <div className=\"mt-1 flex flex-wrap items-center gap-1.5 text-muted-foreground\">\n {commit.authorAvatarUrl && (\n <AvatarImage src={commit.authorAvatarUrl} alt={author || \"Commit author\"} />\n )}\n {author && <span>{author}</span>}\n {commit.committedAt && (\n <>\n <span aria-hidden>·</span>\n <span className=\"inline-flex items-center gap-1\">\n <UiClock className=\"h-3 w-3\" />\n {renderTime ? renderTime(commit.committedAt) : formatFallbackTime(commit.committedAt)}\n </span>\n </>\n )}\n {statText(commit.additions, commit.deletions)}\n {(commit.changedFiles ?? 0) > 0 && (\n <>\n <span aria-hidden>·</span>\n <span>{commit.changedFiles} files</span>\n </>\n )}\n </div>\n </div>\n {commit.href ? (\n <a\n href={commit.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-0.5 inline-flex shrink-0 items-center gap-1 font-mono text-cyan-600 hover:underline\"\n onClick={event => event.stopPropagation()}\n >\n {shortSha(commit)}\n <UiLinkExternal className=\"h-3 w-3\" />\n </a>\n ) : (\n <span className=\"mt-0.5 shrink-0 font-mono text-cyan-600\">{shortSha(commit)}</span>\n )}\n {canExpand && (\n <span className=\"mt-1 shrink-0\">\n <Chevron expanded={expanded} />\n </span>\n )}\n </div>\n {expanded && (\n <div className=\"border-t border-border bg-secondary/50\">\n {commit.body && (\n <pre className=\"mx-3 my-2 whitespace-pre-wrap rounded bg-muted px-3 py-2 font-mono text-[11px] leading-5 text-muted-foreground\">\n {commit.body}\n </pre>\n )}\n {loadDiff && (\n <GitDiffPanel\n loading={diffState.loading}\n payload={diffState.payload}\n error={diffState.error}\n {...(diffMaxHeightClassName ? { maxHeightClassName: diffMaxHeightClassName } : {})}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function GitCommitList({\n commits,\n loadDiff,\n renderTime,\n groupByDate = true,\n emptyLabel = \"No commits found\",\n className,\n diffMaxHeightClassName,\n}: GitCommitListProps) {\n const groups = useMemo(() => groupCommits(commits, groupByDate), [commits, groupByDate]);\n\n if (commits.length === 0) {\n return <div className={cn(\"py-4 text-xs text-muted-foreground\", className)}>{emptyLabel}</div>;\n }\n\n return (\n <div className={cn(\"overflow-hidden rounded-md border border-border\", className)}>\n {groups.map(group => (\n <section key={group.key} aria-label={group.label || \"Commits\"}>\n {group.label && (\n <div className=\"border-b border-border bg-muted/60 px-3 py-2 text-xs font-semibold text-foreground\">\n {group.label}\n </div>\n )}\n <div className=\"divide-y divide-border\">\n {group.commits.map(commit => (\n <CommitRow\n key={commit.id || commit.sha}\n commit={commit}\n {...(loadDiff ? { loadDiff } : {})}\n {...(renderTime ? { renderTime } : {})}\n {...(diffMaxHeightClassName ? { diffMaxHeightClassName } : {})}\n />\n ))}\n </div>\n </section>\n ))}\n </div>\n );\n}\n\ntype StatusView = {\n label: string;\n icon: IconComponent;\n iconClassName: string;\n};\n\nfunction normalizedStatus(status?: string): string {\n return (status || \"modified\").toLowerCase();\n}\n\nfunction statusView(status?: string): StatusView {\n switch (normalizedStatus(status)) {\n case \"added\":\n return { label: \"Added\", icon: UiFilePlus, iconClassName: \"text-emerald-600 dark:text-emerald-400\" };\n case \"deleted\":\n return { label: \"Deleted\", icon: UiRemove, iconClassName: \"text-rose-600 dark:text-rose-400\" };\n case \"renamed\":\n return { label: \"Renamed\", icon: UiFileCode, iconClassName: \"text-sky-600 dark:text-sky-400\" };\n case \"copied\":\n return { label: \"Copied\", icon: UiCode2, iconClassName: \"text-sky-600 dark:text-sky-400\" };\n default:\n return { label: \"Modified\", icon: UiFile, iconClassName: \"text-amber-600 dark:text-amber-400\" };\n }\n}\n\nfunction splitPath(path: string): { directory: string; basename: string } {\n const index = path.lastIndexOf(\"/\");\n if (index < 0) return { directory: \"\", basename: path };\n return { directory: `${path.slice(0, index)}/`, basename: path.slice(index + 1) };\n}\n\nfunction DiffBars({ additions = 0, deletions = 0 }: { additions?: number; deletions?: number }) {\n const total = additions + deletions;\n const maxBars = 5;\n const addBars = total > 0 ? Math.round((additions / total) * maxBars) : 0;\n const delBars = total > 0 ? maxBars - addBars : 0;\n return (\n <span className=\"inline-flex gap-px\" aria-hidden>\n {Array.from({ length: addBars }).map((_, index) => (\n <span key={`a${index}`} className=\"inline-block h-2 w-1.5 rounded-sm bg-emerald-500\" />\n ))}\n {Array.from({ length: delBars }).map((_, index) => (\n <span key={`d${index}`} className=\"inline-block h-2 w-1.5 rounded-sm bg-rose-500\" />\n ))}\n {total === 0 && <span className=\"inline-block h-2 w-1.5 rounded-sm bg-muted-foreground/30\" />}\n </span>\n );\n}\n\nfunction FileRow({\n file,\n loadDiff,\n diffMaxHeightClassName,\n}: {\n file: GitFileChangeItem;\n loadDiff?: GitDiffLoader<GitFileChangeItem>;\n diffMaxHeightClassName?: string;\n}) {\n const [expanded, diffState, toggle] = useLazyDiff(file, loadDiff);\n const status = statusView(file.status);\n const StatusIcon = status.icon;\n const path = splitPath(file.path);\n const canExpand = Boolean(loadDiff);\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (!canExpand || !isActivationKey(event)) return;\n event.preventDefault();\n toggle();\n }\n\n return (\n <div>\n <div\n role={canExpand ? \"button\" : undefined}\n tabIndex={canExpand ? 0 : undefined}\n className={cn(\n \"flex min-h-11 items-center gap-2 px-3 py-2 text-xs transition-colors\",\n canExpand && \"cursor-pointer hover:bg-muted/70\",\n )}\n onClick={canExpand ? toggle : undefined}\n onKeyDown={canExpand ? onKeyDown : undefined}\n >\n <StatusIcon className={cn(\"h-4 w-4 shrink-0\", status.iconClassName)} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-mono text-foreground\" title={file.path}>\n {path.directory && <span className=\"text-muted-foreground\">{path.directory}</span>}\n <span>{path.basename}</span>\n </div>\n {file.previousPath && (\n <div className=\"mt-0.5 truncate font-mono text-[11px] text-muted-foreground\">\n from {file.previousPath}\n </div>\n )}\n </div>\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">{status.label}</span>\n <span className=\"shrink-0 tabular-nums text-emerald-600 dark:text-emerald-400\">\n +{file.additions ?? 0}\n </span>\n <span className=\"shrink-0 tabular-nums text-rose-600 dark:text-rose-400\">\n -{file.deletions ?? 0}\n </span>\n <DiffBars\n {...(file.additions !== undefined ? { additions: file.additions } : {})}\n {...(file.deletions !== undefined ? { deletions: file.deletions } : {})}\n />\n {file.href && (\n <a\n href={file.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={event => event.stopPropagation()}\n aria-label={`Open ${file.path}`}\n >\n <UiLinkExternal className=\"h-3.5 w-3.5\" />\n </a>\n )}\n {canExpand && (\n <span className=\"shrink-0\">\n <Chevron expanded={expanded} />\n </span>\n )}\n </div>\n {expanded && (\n <GitDiffPanel\n loading={diffState.loading}\n payload={diffState.payload}\n error={diffState.error}\n {...(diffMaxHeightClassName ? { maxHeightClassName: diffMaxHeightClassName } : {})}\n />\n )}\n </div>\n );\n}\n\nexport function GitFileList({\n files,\n loadDiff,\n emptyLabel = \"No changed files found\",\n className,\n diffMaxHeightClassName,\n}: GitFileListProps) {\n if (files.length === 0) {\n return <div className={cn(\"py-4 text-xs text-muted-foreground\", className)}>{emptyLabel}</div>;\n }\n\n return (\n <div className={cn(\"overflow-hidden rounded-md border border-border\", className)}>\n <div className=\"divide-y divide-border\">\n {files.map(file => (\n <FileRow\n key={file.id || file.path}\n file={file}\n {...(loadDiff ? { loadDiff } : {})}\n {...(diffMaxHeightClassName ? { diffMaxHeightClassName } : {})}\n />\n ))}\n </div>\n </div>\n );\n}\n\nexport function GitChangedFilesSummary({\n files,\n additions,\n deletions,\n className,\n}: {\n files: number;\n additions: number;\n deletions: number;\n className?: string;\n}) {\n return (\n <div className={cn(\"flex items-center gap-2 text-xs text-muted-foreground\", className)}>\n <span className=\"inline-flex items-center gap-1 font-medium\">\n <UiDiff className=\"h-3.5 w-3.5\" />\n {files} file{files === 1 ? \"\" : \"s\"} changed\n </span>\n <span aria-hidden>·</span>\n <span className=\"text-emerald-600 dark:text-emerald-400\">+{additions}</span>\n <span className=\"text-rose-600 dark:text-rose-400\">-{deletions}</span>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GitChangeList.js","sources":["../../../src/data/git/GitChangeList.tsx"],"sourcesContent":["import { useMemo, useState, type KeyboardEvent, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport {\n UiChevronDown,\n UiChevronRight,\n UiClock,\n UiCode2,\n UiDiff,\n UiFile,\n UiFileCode,\n UiFilePlus,\n UiGitCommit,\n UiLinkExternal,\n UiRemove,\n} from \"../../icons\";\nimport type { IconComponent } from \"../../icons/types\";\nimport { CodeDiff, type DiffLineTarget, type DiffLineWidget } from \"../CodeDiff\";\nimport { languageFromPath } from \"../code-highlight\";\nimport { dateKey, formatFallbackTime, formatGitCommitDateHeader } from \"./git-dates\";\n\nexport type GitDiffPayload = {\n diff: string;\n truncated?: boolean;\n binary?: boolean;\n path?: string;\n commit?: string;\n};\n\nexport type GitDiffLoader<T> = (item: T) => Promise<GitDiffPayload>;\n\nexport type GitCommitItem = {\n id?: string;\n sha: string;\n shortSha?: string;\n title: string;\n body?: string;\n authorName?: string;\n authorLogin?: string;\n authorAvatarUrl?: string;\n committedAt?: string;\n additions?: number;\n deletions?: number;\n changedFiles?: number;\n href?: string;\n};\n\nexport type GitFileChangeStatus =\n | \"added\"\n | \"modified\"\n | \"deleted\"\n | \"renamed\"\n | \"copied\"\n | string;\n\nexport type GitFileChangeItem = {\n id?: string;\n path: string;\n previousPath?: string;\n status?: GitFileChangeStatus;\n additions?: number;\n deletions?: number;\n href?: string;\n binary?: boolean;\n};\n\ntype DiffState = {\n loading: boolean;\n payload: GitDiffPayload | null;\n error: string;\n};\n\nexport type GitDiffPanelProps = {\n loading?: boolean;\n payload?: GitDiffPayload | null;\n error?: string;\n emptyLabel?: string;\n className?: string;\n maxHeightClassName?: string;\n /** Forwarded to `CodeDiff`: shows a gutter \"+\" button per numbered line. */\n onLineAction?: (target: DiffLineTarget) => void;\n /** Forwarded to `CodeDiff`: rows rendered under the matching diff line. */\n lineWidgets?: DiffLineWidget[];\n};\n\nexport type GitCommitListProps = {\n commits: GitCommitItem[];\n loadDiff?: GitDiffLoader<GitCommitItem>;\n renderTime?: (iso: string) => ReactNode;\n groupByDate?: boolean;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n};\n\nexport type GitFileListProps = {\n files: GitFileChangeItem[];\n loadDiff?: GitDiffLoader<GitFileChangeItem>;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n};\n\ntype CommitGroup = {\n key: string;\n label: string;\n commits: GitCommitItem[];\n};\n\nconst DIFF_INITIAL_STATE: DiffState = {\n loading: false,\n payload: null,\n error: \"\",\n};\n\nfunction messageFromError(error: unknown): string {\n if (error instanceof Error) return error.message;\n if (typeof error === \"string\") return error;\n return \"Failed to load diff\";\n}\n\nfunction isActivationKey(event: KeyboardEvent<HTMLDivElement>): boolean {\n return event.key === \"Enter\" || event.key === \" \";\n}\n\nfunction groupCommits(commits: GitCommitItem[], enabled: boolean): CommitGroup[] {\n if (!enabled) return [{ key: \"all\", label: \"\", commits }];\n const groups: CommitGroup[] = [];\n const indexByKey = new Map<string, number>();\n for (const commit of commits) {\n const key = dateKey(commit.committedAt);\n const existing = indexByKey.get(key);\n if (existing != null) {\n groups[existing]?.commits.push(commit);\n continue;\n }\n indexByKey.set(key, groups.length);\n groups.push({\n key,\n label: formatGitCommitDateHeader(commit.committedAt),\n commits: [commit],\n });\n }\n return groups;\n}\n\nfunction shortSha(commit: GitCommitItem): string {\n return commit.shortSha || commit.sha.slice(0, 7);\n}\n\nfunction displayAuthor(commit: GitCommitItem): string {\n return commit.authorLogin || commit.authorName || \"\";\n}\n\nfunction statText(additions?: number, deletions?: number): ReactNode {\n const adds = additions ?? 0;\n const dels = deletions ?? 0;\n if (adds === 0 && dels === 0) return null;\n return (\n <>\n <span aria-hidden>·</span>\n {adds > 0 && <span className=\"text-emerald-600 dark:text-emerald-400\">+{adds}</span>}\n {dels > 0 && <span className=\"text-rose-600 dark:text-rose-400\">-{dels}</span>}\n </>\n );\n}\n\nfunction useLazyDiff<T>(item: T, loader: GitDiffLoader<T> | undefined): [boolean, DiffState, () => void] {\n const [expanded, setExpanded] = useState(false);\n const [state, setState] = useState<DiffState>(DIFF_INITIAL_STATE);\n\n function toggle() {\n setExpanded(open => !open);\n if (!expanded && loader && !state.payload && !state.loading && !state.error) {\n setState({ loading: true, payload: null, error: \"\" });\n loader(item)\n .then(payload => setState({ loading: false, payload, error: \"\" }))\n .catch(error => setState({ loading: false, payload: null, error: messageFromError(error) }));\n }\n }\n\n return [expanded, state, toggle];\n}\n\nfunction Chevron({ expanded }: { expanded: boolean }) {\n const Icon = expanded ? UiChevronDown : UiChevronRight;\n return <Icon className=\"h-3.5 w-3.5 text-muted-foreground\" />;\n}\n\nfunction AvatarImage({ src, alt }: { src: string; alt: string }) {\n return (\n <img\n src={src}\n alt={alt}\n className=\"h-4 w-4 rounded-full border border-border object-cover\"\n loading=\"lazy\"\n />\n );\n}\n\nexport function GitDiffPanel({\n loading,\n payload,\n error,\n emptyLabel = \"No text diff available\",\n className,\n maxHeightClassName = \"max-h-[520px]\",\n onLineAction,\n lineWidgets,\n}: GitDiffPanelProps) {\n if (loading) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n Loading diff...\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={cn(\"border-t border-border bg-rose-50 px-3 py-3 text-xs text-rose-700 dark:bg-rose-950/30 dark:text-rose-300\", className)}>\n {error}\n </div>\n );\n }\n\n if (payload?.binary) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n Binary file not shown.\n </div>\n );\n }\n\n if (!payload?.diff) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n {emptyLabel}\n </div>\n );\n }\n\n const language = languageFromPath(payload.path);\n return (\n <div className={cn(\"border-t border-border\", className)}>\n {payload.truncated && (\n <div className=\"border-b border-border bg-amber-100/70 px-3 py-1.5 text-xs text-amber-800 [[data-theme=dark]_&]:bg-amber-950/40 [[data-theme=dark]_&]:text-amber-200\">\n Diff truncated.\n </div>\n )}\n <CodeDiff\n bare\n unified={payload.diff}\n className={cn(\"overflow-auto px-1 py-2\", maxHeightClassName)}\n {...(language ? { language } : {})}\n {...(onLineAction ? { onLineAction } : {})}\n {...(lineWidgets ? { lineWidgets } : {})}\n />\n </div>\n );\n}\n\nfunction CommitRow({\n commit,\n loadDiff,\n renderTime,\n diffMaxHeightClassName,\n}: {\n commit: GitCommitItem;\n loadDiff?: GitDiffLoader<GitCommitItem>;\n renderTime?: (iso: string) => ReactNode;\n diffMaxHeightClassName?: string;\n}) {\n const [expanded, diffState, toggle] = useLazyDiff(commit, loadDiff);\n const author = displayAuthor(commit);\n const canExpand = Boolean(loadDiff || commit.body);\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (!canExpand || !isActivationKey(event)) return;\n event.preventDefault();\n toggle();\n }\n\n return (\n <div>\n <div\n role={canExpand ? \"button\" : undefined}\n tabIndex={canExpand ? 0 : undefined}\n className={cn(\n \"flex min-h-14 items-start gap-2 px-3 py-2 text-xs transition-colors\",\n canExpand && \"cursor-pointer hover:bg-muted/70\",\n )}\n onClick={canExpand ? toggle : undefined}\n onKeyDown={canExpand ? onKeyDown : undefined}\n >\n <span className=\"mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n <UiGitCommit className=\"h-3.5 w-3.5\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium text-foreground\" title={commit.title}>\n {commit.title}\n </div>\n <div className=\"mt-1 flex flex-wrap items-center gap-1.5 text-muted-foreground\">\n {commit.authorAvatarUrl && (\n <AvatarImage src={commit.authorAvatarUrl} alt={author || \"Commit author\"} />\n )}\n {author && <span>{author}</span>}\n {commit.committedAt && (\n <>\n <span aria-hidden>·</span>\n <span className=\"inline-flex items-center gap-1\">\n <UiClock className=\"h-3 w-3\" />\n {renderTime ? renderTime(commit.committedAt) : formatFallbackTime(commit.committedAt)}\n </span>\n </>\n )}\n {statText(commit.additions, commit.deletions)}\n {(commit.changedFiles ?? 0) > 0 && (\n <>\n <span aria-hidden>·</span>\n <span>{commit.changedFiles} files</span>\n </>\n )}\n </div>\n </div>\n {commit.href ? (\n <a\n href={commit.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-0.5 inline-flex shrink-0 items-center gap-1 font-mono text-cyan-600 hover:underline\"\n onClick={event => event.stopPropagation()}\n >\n {shortSha(commit)}\n <UiLinkExternal className=\"h-3 w-3\" />\n </a>\n ) : (\n <span className=\"mt-0.5 shrink-0 font-mono text-cyan-600\">{shortSha(commit)}</span>\n )}\n {canExpand && (\n <span className=\"mt-1 shrink-0\">\n <Chevron expanded={expanded} />\n </span>\n )}\n </div>\n {expanded && (\n <div className=\"border-t border-border bg-secondary/50\">\n {commit.body && (\n <pre className=\"mx-3 my-2 whitespace-pre-wrap rounded bg-muted px-3 py-2 font-mono text-[11px] leading-5 text-muted-foreground\">\n {commit.body}\n </pre>\n )}\n {loadDiff && (\n <GitDiffPanel\n loading={diffState.loading}\n payload={diffState.payload}\n error={diffState.error}\n {...(diffMaxHeightClassName ? { maxHeightClassName: diffMaxHeightClassName } : {})}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function GitCommitList({\n commits,\n loadDiff,\n renderTime,\n groupByDate = true,\n emptyLabel = \"No commits found\",\n className,\n diffMaxHeightClassName,\n}: GitCommitListProps) {\n const groups = useMemo(() => groupCommits(commits, groupByDate), [commits, groupByDate]);\n\n if (commits.length === 0) {\n return <div className={cn(\"py-4 text-xs text-muted-foreground\", className)}>{emptyLabel}</div>;\n }\n\n return (\n <div className={cn(\"overflow-hidden rounded-md border border-border\", className)}>\n {groups.map(group => (\n <section key={group.key} aria-label={group.label || \"Commits\"}>\n {group.label && (\n <div className=\"border-b border-border bg-muted/60 px-3 py-2 text-xs font-semibold text-foreground\">\n {group.label}\n </div>\n )}\n <div className=\"divide-y divide-border\">\n {group.commits.map(commit => (\n <CommitRow\n key={commit.id || commit.sha}\n commit={commit}\n {...(loadDiff ? { loadDiff } : {})}\n {...(renderTime ? { renderTime } : {})}\n {...(diffMaxHeightClassName ? { diffMaxHeightClassName } : {})}\n />\n ))}\n </div>\n </section>\n ))}\n </div>\n );\n}\n\ntype StatusView = {\n label: string;\n icon: IconComponent;\n iconClassName: string;\n};\n\nfunction normalizedStatus(status?: string): string {\n return (status || \"modified\").toLowerCase();\n}\n\nfunction statusView(status?: string): StatusView {\n switch (normalizedStatus(status)) {\n case \"added\":\n return { label: \"Added\", icon: UiFilePlus, iconClassName: \"text-emerald-600 dark:text-emerald-400\" };\n case \"deleted\":\n return { label: \"Deleted\", icon: UiRemove, iconClassName: \"text-rose-600 dark:text-rose-400\" };\n case \"renamed\":\n return { label: \"Renamed\", icon: UiFileCode, iconClassName: \"text-sky-600 dark:text-sky-400\" };\n case \"copied\":\n return { label: \"Copied\", icon: UiCode2, iconClassName: \"text-sky-600 dark:text-sky-400\" };\n default:\n return { label: \"Modified\", icon: UiFile, iconClassName: \"text-amber-600 dark:text-amber-400\" };\n }\n}\n\nfunction splitPath(path: string): { directory: string; basename: string } {\n const index = path.lastIndexOf(\"/\");\n if (index < 0) return { directory: \"\", basename: path };\n return { directory: `${path.slice(0, index)}/`, basename: path.slice(index + 1) };\n}\n\nfunction DiffBars({ additions = 0, deletions = 0 }: { additions?: number; deletions?: number }) {\n const total = additions + deletions;\n const maxBars = 5;\n const addBars = total > 0 ? Math.round((additions / total) * maxBars) : 0;\n const delBars = total > 0 ? maxBars - addBars : 0;\n return (\n <span className=\"inline-flex gap-px\" aria-hidden>\n {Array.from({ length: addBars }).map((_, index) => (\n <span key={`a${index}`} className=\"inline-block h-2 w-1.5 rounded-sm bg-emerald-500\" />\n ))}\n {Array.from({ length: delBars }).map((_, index) => (\n <span key={`d${index}`} className=\"inline-block h-2 w-1.5 rounded-sm bg-rose-500\" />\n ))}\n {total === 0 && <span className=\"inline-block h-2 w-1.5 rounded-sm bg-muted-foreground/30\" />}\n </span>\n );\n}\n\nfunction FileRow({\n file,\n loadDiff,\n diffMaxHeightClassName,\n}: {\n file: GitFileChangeItem;\n loadDiff?: GitDiffLoader<GitFileChangeItem>;\n diffMaxHeightClassName?: string;\n}) {\n const [expanded, diffState, toggle] = useLazyDiff(file, loadDiff);\n const status = statusView(file.status);\n const StatusIcon = status.icon;\n const path = splitPath(file.path);\n const canExpand = Boolean(loadDiff);\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (!canExpand || !isActivationKey(event)) return;\n event.preventDefault();\n toggle();\n }\n\n return (\n <div>\n <div\n role={canExpand ? \"button\" : undefined}\n tabIndex={canExpand ? 0 : undefined}\n className={cn(\n \"flex min-h-11 items-center gap-2 px-3 py-2 text-xs transition-colors\",\n canExpand && \"cursor-pointer hover:bg-muted/70\",\n )}\n onClick={canExpand ? toggle : undefined}\n onKeyDown={canExpand ? onKeyDown : undefined}\n >\n <StatusIcon className={cn(\"h-4 w-4 shrink-0\", status.iconClassName)} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-mono text-foreground\" title={file.path}>\n {path.directory && <span className=\"text-muted-foreground\">{path.directory}</span>}\n <span>{path.basename}</span>\n </div>\n {file.previousPath && (\n <div className=\"mt-0.5 truncate font-mono text-[11px] text-muted-foreground\">\n from {file.previousPath}\n </div>\n )}\n </div>\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">{status.label}</span>\n <span className=\"shrink-0 tabular-nums text-emerald-600 dark:text-emerald-400\">\n +{file.additions ?? 0}\n </span>\n <span className=\"shrink-0 tabular-nums text-rose-600 dark:text-rose-400\">\n -{file.deletions ?? 0}\n </span>\n <DiffBars\n {...(file.additions !== undefined ? { additions: file.additions } : {})}\n {...(file.deletions !== undefined ? { deletions: file.deletions } : {})}\n />\n {file.href && (\n <a\n href={file.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={event => event.stopPropagation()}\n aria-label={`Open ${file.path}`}\n >\n <UiLinkExternal className=\"h-3.5 w-3.5\" />\n </a>\n )}\n {canExpand && (\n <span className=\"shrink-0\">\n <Chevron expanded={expanded} />\n </span>\n )}\n </div>\n {expanded && (\n <GitDiffPanel\n loading={diffState.loading}\n payload={diffState.payload}\n error={diffState.error}\n {...(diffMaxHeightClassName ? { maxHeightClassName: diffMaxHeightClassName } : {})}\n />\n )}\n </div>\n );\n}\n\nexport function GitFileList({\n files,\n loadDiff,\n emptyLabel = \"No changed files found\",\n className,\n diffMaxHeightClassName,\n}: GitFileListProps) {\n if (files.length === 0) {\n return <div className={cn(\"py-4 text-xs text-muted-foreground\", className)}>{emptyLabel}</div>;\n }\n\n return (\n <div className={cn(\"overflow-hidden rounded-md border border-border\", className)}>\n <div className=\"divide-y divide-border\">\n {files.map(file => (\n <FileRow\n key={file.id || file.path}\n file={file}\n {...(loadDiff ? { loadDiff } : {})}\n {...(diffMaxHeightClassName ? { diffMaxHeightClassName } : {})}\n />\n ))}\n </div>\n </div>\n );\n}\n\nexport function GitChangedFilesSummary({\n files,\n additions,\n deletions,\n className,\n}: {\n files: number;\n additions: number;\n deletions: number;\n className?: string;\n}) {\n return (\n <div className={cn(\"flex items-center gap-2 text-xs text-muted-foreground\", className)}>\n <span className=\"inline-flex items-center gap-1 font-medium\">\n <UiDiff className=\"h-3.5 w-3.5\" />\n {files} file{files === 1 ? \"\" : \"s\"} changed\n </span>\n <span aria-hidden>·</span>\n <span className=\"text-emerald-600 dark:text-emerald-400\">+{additions}</span>\n <span className=\"text-rose-600 dark:text-rose-400\">-{deletions}</span>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const graphEdgeRouting = require("./graph-edge-routing.cjs");
|
|
4
|
+
const GROUP_MEMBER_WINDOW = 10;
|
|
5
|
+
const GROUP_WINDOW_FOOTER_HEIGHT = 18;
|
|
4
6
|
const DEFAULT_NODE_WIDTH = 168;
|
|
5
7
|
const DEFAULT_NODE_HEIGHT = 60;
|
|
6
8
|
const DEFAULT_COLUMN_GAP = 96;
|
|
@@ -20,6 +22,9 @@ function mustGet(map, key, what) {
|
|
|
20
22
|
}
|
|
21
23
|
function columnMetrics(options) {
|
|
22
24
|
return {
|
|
25
|
+
records: options.records ?? [],
|
|
26
|
+
collapsed: options.collapsed ?? [],
|
|
27
|
+
recordHeaderHeight: options.recordHeaderHeight ?? 24,
|
|
23
28
|
nodeWidth: options.nodeWidth ?? DEFAULT_NODE_WIDTH,
|
|
24
29
|
nodeHeight: options.nodeHeight ?? DEFAULT_NODE_HEIGHT,
|
|
25
30
|
columnGap: options.columnGap ?? DEFAULT_COLUMN_GAP,
|
|
@@ -63,18 +68,34 @@ function indexNeighbours(nodes, edges) {
|
|
|
63
68
|
}
|
|
64
69
|
return neighbours;
|
|
65
70
|
}
|
|
66
|
-
function
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
function collapsedRun(group, nodes, m) {
|
|
72
|
+
if (nodes.length !== 1) throw new Error(`columnsLayout: collapsed group "${group}" holds ${nodes.length} nodes in a column; it draws one stand-in`);
|
|
73
|
+
return { pad: 0, gap: 0, heightOf: () => m.recordHeaderHeight, header: 0, height: m.recordHeaderHeight, collapsed: true };
|
|
74
|
+
}
|
|
75
|
+
function runMetrics(group, nodes, m, record) {
|
|
76
|
+
if (group !== void 0 && m.collapsed.includes(group)) return collapsedRun(group, nodes, m);
|
|
77
|
+
let stack;
|
|
78
|
+
if (record) {
|
|
79
|
+
const regular = nodes.find((node) => !node.compact);
|
|
80
|
+
if (regular) throw new Error(`columnsLayout: record group "${group}" holds non-compact node "${regular.id}"`);
|
|
81
|
+
stack = { pad: 0, gap: 0, heightOf: () => m.compactNodeHeight, header: m.recordHeaderHeight };
|
|
82
|
+
} else {
|
|
83
|
+
const compact = group !== void 0 && nodes.every((node) => node.compact === true);
|
|
84
|
+
const heightOf = (node) => node.compact ? m.compactNodeHeight : m.nodeHeight;
|
|
85
|
+
stack = { pad: group === void 0 ? 0 : compact ? m.compactGroupPadding : m.groupPadding, gap: compact ? m.compactRowGap : m.rowGap, heightOf, header: 0 };
|
|
86
|
+
}
|
|
87
|
+
const chrome = stack.header + 2 * stack.pad;
|
|
88
|
+
if (group === void 0 || nodes.length <= GROUP_MEMBER_WINDOW) {
|
|
89
|
+
const stacked = nodes.reduce((sum, node) => sum + stack.heightOf(node), 0) + (nodes.length - 1) * stack.gap;
|
|
90
|
+
return { ...stack, height: chrome + stacked, collapsed: false };
|
|
91
|
+
}
|
|
92
|
+
const view = GROUP_MEMBER_WINDOW * Math.max(...nodes.map(stack.heightOf)) + (GROUP_MEMBER_WINDOW - 1) * stack.gap;
|
|
93
|
+
return { ...stack, view, height: chrome + view + GROUP_WINDOW_FOOTER_HEIGHT, collapsed: false };
|
|
73
94
|
}
|
|
74
95
|
function columnHeight(column, m) {
|
|
75
96
|
const runs = /* @__PURE__ */ new Map();
|
|
76
97
|
for (const node of column) runs.set(node.group, [...runs.get(node.group) ?? [], node]);
|
|
77
|
-
const stacked = [...runs].reduce((sum, [group, nodes]) => sum + runMetrics(group, nodes, m).height, 0);
|
|
98
|
+
const stacked = [...runs].reduce((sum, [group, nodes]) => sum + runMetrics(group, nodes, m, group !== void 0 && m.records.includes(group)).height, 0);
|
|
78
99
|
return stacked + (runs.size - 1) * m.rowGap;
|
|
79
100
|
}
|
|
80
101
|
function orderColumn(column, groupRank, weight) {
|
|
@@ -99,24 +120,33 @@ function stackColumn(runs, origin, m, placed) {
|
|
|
99
120
|
const boxes = [];
|
|
100
121
|
let cursor = origin.top;
|
|
101
122
|
for (const { group, nodes } of runs) {
|
|
102
|
-
const
|
|
103
|
-
|
|
123
|
+
const record = group !== void 0 && m.records.includes(group);
|
|
124
|
+
const run = runMetrics(group, nodes, m, record);
|
|
125
|
+
const first = cursor + run.pad + run.header;
|
|
126
|
+
const tops = [];
|
|
127
|
+
let top = first;
|
|
104
128
|
for (const node of nodes) {
|
|
105
|
-
|
|
106
|
-
top
|
|
129
|
+
tops.push(top - first);
|
|
130
|
+
placed.set(node.id, { x: origin.x, y: top + run.heightOf(node) / 2 });
|
|
131
|
+
top += run.heightOf(node) + run.gap;
|
|
107
132
|
}
|
|
108
133
|
if (group !== void 0) {
|
|
134
|
+
const memberWindow = run.view === void 0 ? void 0 : { members: nodes.map((node) => node.id), tops, rows: GROUP_MEMBER_WINDOW, top: first, height: run.view, footerHeight: GROUP_WINDOW_FOOTER_HEIGHT };
|
|
109
135
|
boxes.push({
|
|
110
136
|
id: `${origin.level}:${group}`,
|
|
111
137
|
group,
|
|
112
138
|
level: origin.level,
|
|
113
|
-
x: origin.x - m.nodeWidth / 2 - pad,
|
|
139
|
+
x: origin.x - m.nodeWidth / 2 - run.pad,
|
|
114
140
|
y: cursor,
|
|
115
|
-
width: m.nodeWidth + 2 * pad,
|
|
116
|
-
height
|
|
141
|
+
width: m.nodeWidth + 2 * run.pad,
|
|
142
|
+
height: run.height,
|
|
143
|
+
record,
|
|
144
|
+
headerHeight: run.collapsed ? m.recordHeaderHeight : run.header,
|
|
145
|
+
...memberWindow ? { window: memberWindow } : {},
|
|
146
|
+
...run.collapsed ? { collapsed: true } : {}
|
|
117
147
|
});
|
|
118
148
|
}
|
|
119
|
-
cursor += height + m.rowGap;
|
|
149
|
+
cursor += run.height + m.rowGap;
|
|
120
150
|
}
|
|
121
151
|
return boxes;
|
|
122
152
|
}
|
|
@@ -228,5 +258,6 @@ function columnsLayout(nodes, edges, options = {}) {
|
|
|
228
258
|
groups: [...boxes.values()].flat().map((box) => ({ ...box, x: box.x + room.left })).sort((a, b) => a.level - b.level || a.y - b.y)
|
|
229
259
|
};
|
|
230
260
|
}
|
|
261
|
+
exports.GROUP_MEMBER_WINDOW = GROUP_MEMBER_WINDOW;
|
|
231
262
|
exports.columnsLayout = columnsLayout;
|
|
232
263
|
//# sourceMappingURL=graph-columns-layout.cjs.map
|