@flanksource/clicky-ui 0.3.44 → 0.3.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/dist/ai.cjs +4 -2
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +3 -1
- package/dist/components/MdxEditorField.cjs +40 -22
- package/dist/components/MdxEditorField.cjs.map +1 -1
- package/dist/components/MdxEditorField.d.ts.map +1 -1
- package/dist/components/MdxEditorField.js +41 -23
- package/dist/components/MdxEditorField.js.map +1 -1
- package/dist/components/json-schema-form-item-summary.cjs +6 -1
- package/dist/components/json-schema-form-item-summary.cjs.map +1 -1
- package/dist/components/json-schema-form-item-summary.d.ts.map +1 -1
- package/dist/components/json-schema-form-item-summary.js +6 -1
- package/dist/components/json-schema-form-item-summary.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/CodeBlock.cjs +3 -2
- package/dist/data/CodeBlock.cjs.map +1 -1
- package/dist/data/CodeBlock.d.ts +3 -1
- package/dist/data/CodeBlock.d.ts.map +1 -1
- package/dist/data/CodeBlock.js +3 -2
- package/dist/data/CodeBlock.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/GraphDiagram.cjs +75 -11
- package/dist/data/GraphDiagram.cjs.map +1 -1
- package/dist/data/GraphDiagram.d.ts +17 -2
- package/dist/data/GraphDiagram.d.ts.map +1 -1
- package/dist/data/GraphDiagram.js +76 -12
- 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 +46 -51
- package/dist/data/GraphDiagramNodes.cjs.map +1 -1
- package/dist/data/GraphDiagramNodes.d.ts +8 -9
- package/dist/data/GraphDiagramNodes.d.ts.map +1 -1
- package/dist/data/GraphDiagramNodes.js +46 -51
- package/dist/data/GraphDiagramNodes.js.map +1 -1
- package/dist/data/JsonView.cjs +118 -49
- package/dist/data/JsonView.cjs.map +1 -1
- package/dist/data/JsonView.d.ts +13 -10
- package/dist/data/JsonView.d.ts.map +1 -1
- package/dist/data/JsonView.js +118 -49
- package/dist/data/JsonView.js.map +1 -1
- package/dist/data/MarkdownEditor.cjs +2 -2
- package/dist/data/MarkdownEditor.cjs.map +1 -1
- package/dist/data/MarkdownEditor.js +2 -2
- package/dist/data/MarkdownEditor.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/AdvancedChatConfig.cjs +90 -249
- package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.d.ts +2 -5
- package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.js +91 -250
- package/dist/data/ai/AdvancedChatConfig.js.map +1 -1
- package/dist/data/ai/ChatButton.cjs +2 -0
- package/dist/data/ai/ChatButton.cjs.map +1 -1
- package/dist/data/ai/ChatButton.d.ts +1 -1
- package/dist/data/ai/ChatButton.d.ts.map +1 -1
- package/dist/data/ai/ChatButton.js +2 -0
- package/dist/data/ai/ChatButton.js.map +1 -1
- package/dist/data/ai/ChatFab.cjs +5 -1
- package/dist/data/ai/ChatFab.cjs.map +1 -1
- package/dist/data/ai/ChatFab.d.ts +5 -1
- package/dist/data/ai/ChatFab.d.ts.map +1 -1
- package/dist/data/ai/ChatFab.js +5 -1
- package/dist/data/ai/ChatFab.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +2 -8
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +2 -8
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.cjs +0 -5
- package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.d.ts +0 -2
- package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.js +0 -5
- package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.cjs +2 -2
- package/dist/data/ai/PromptRunEditor/runtimeActions.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.js +2 -2
- package/dist/data/ai/PromptRunEditor/runtimeActions.js.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.cjs +3 -6
- package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.js +3 -6
- package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
- package/dist/data/ai/SessionViewer.cjs +13 -4
- package/dist/data/ai/SessionViewer.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.d.ts +5 -1
- package/dist/data/ai/SessionViewer.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.header.cjs +1 -1
- package/dist/data/ai/SessionViewer.header.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.header.js +1 -1
- package/dist/data/ai/SessionViewer.header.js.map +1 -1
- package/dist/data/ai/SessionViewer.js +13 -4
- package/dist/data/ai/SessionViewer.js.map +1 -1
- package/dist/data/ai/SessionViewer.model.cjs +2 -0
- package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.model.d.ts +1 -0
- package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.model.js +2 -0
- package/dist/data/ai/SessionViewer.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.rows.cjs +41 -27
- package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.rows.d.ts +4 -2
- package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.rows.js +41 -27
- package/dist/data/ai/SessionViewer.rows.js.map +1 -1
- package/dist/data/ai/SessionViewer.tokens.cjs +35 -0
- package/dist/data/ai/SessionViewer.tokens.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.tokens.d.ts +5 -0
- package/dist/data/ai/SessionViewer.tokens.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.tokens.js +35 -0
- package/dist/data/ai/SessionViewer.tokens.js.map +1 -0
- package/dist/data/ai/SessionViewer.tool-cost.cjs +128 -0
- package/dist/data/ai/SessionViewer.tool-cost.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.tool-cost.d.ts +6 -0
- package/dist/data/ai/SessionViewer.tool-cost.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.tool-cost.js +128 -0
- package/dist/data/ai/SessionViewer.tool-cost.js.map +1 -0
- package/dist/data/ai/SessionViewer.tool-details.cjs +3 -1
- package/dist/data/ai/SessionViewer.tool-details.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.tool-details.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.tool-details.js +3 -1
- package/dist/data/ai/SessionViewer.tool-details.js.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.cjs +55 -35
- package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.d.ts +2 -1
- package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.js +55 -35
- package/dist/data/ai/SessionViewer.tool-row.js.map +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +4 -0
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/SessionViewerMenu.cjs +18 -1
- package/dist/data/ai/SessionViewerMenu.cjs.map +1 -1
- package/dist/data/ai/SessionViewerMenu.d.ts +6 -1
- package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -1
- package/dist/data/ai/SessionViewerMenu.js +18 -1
- package/dist/data/ai/SessionViewerMenu.js.map +1 -1
- package/dist/data/ai/ToolPreferences.cjs +149 -143
- package/dist/data/ai/ToolPreferences.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.d.ts +20 -6
- package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.js +151 -146
- package/dist/data/ai/ToolPreferences.js.map +1 -1
- package/dist/data/ai/ToolPreferences.model.cjs +14 -10
- package/dist/data/ai/ToolPreferences.model.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.model.d.ts +1 -0
- package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.model.js +15 -11
- package/dist/data/ai/ToolPreferences.model.js.map +1 -1
- package/dist/data/ai/ToolPreferencesList.cjs +1 -0
- package/dist/data/ai/ToolPreferencesList.cjs.map +1 -1
- package/dist/data/ai/ToolPreferencesList.d.ts +4 -1
- package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferencesList.js +2 -1
- package/dist/data/ai/ToolPreferencesList.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.cjs +52 -53
- package/dist/data/ai/ToolSchemaBrowser.cjs.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.d.ts +6 -3
- package/dist/data/ai/ToolSchemaBrowser.d.ts.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs +9 -13
- package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts +5 -2
- package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.directory-header.js +9 -13
- package/dist/data/ai/ToolSchemaBrowser.directory-header.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.js +53 -54
- package/dist/data/ai/ToolSchemaBrowser.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.model.cjs +19 -27
- package/dist/data/ai/ToolSchemaBrowser.model.cjs.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.model.d.ts +9 -6
- package/dist/data/ai/ToolSchemaBrowser.model.d.ts.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.model.js +20 -28
- package/dist/data/ai/ToolSchemaBrowser.model.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs +12 -213
- package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts +1 -3
- package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.sidebar.js +13 -214
- package/dist/data/ai/ToolSchemaBrowser.sidebar.js.map +1 -1
- package/dist/data/ai/ToolSchemaBrowser.strategies.cjs +54 -0
- package/dist/data/ai/ToolSchemaBrowser.strategies.cjs.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts +9 -0
- package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.strategies.js +54 -0
- package/dist/data/ai/ToolSchemaBrowser.strategies.js.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.cjs +179 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.cjs.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.d.ts +20 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.d.ts.map +1 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.js +179 -0
- package/dist/data/ai/ToolSchemaBrowser.tree.js.map +1 -0
- package/dist/data/ai/index.d.ts +2 -2
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs +8 -28
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs.map +1 -1
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.d.ts.map +1 -1
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js +9 -29
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js.map +1 -1
- package/dist/data/ai/session-token-sizing.d.ts +32 -0
- package/dist/data/ai/session-token-sizing.d.ts.map +1 -0
- package/dist/data/ai/use-session-token-sizing.cjs +73 -0
- package/dist/data/ai/use-session-token-sizing.cjs.map +1 -0
- package/dist/data/ai/use-session-token-sizing.d.ts +21 -0
- package/dist/data/ai/use-session-token-sizing.d.ts.map +1 -0
- package/dist/data/ai/use-session-token-sizing.js +73 -0
- package/dist/data/ai/use-session-token-sizing.js.map +1 -0
- package/dist/data/call-graph/CallGraph.cjs +269 -0
- package/dist/data/call-graph/CallGraph.cjs.map +1 -0
- package/dist/data/call-graph/CallGraph.d.ts +78 -0
- package/dist/data/call-graph/CallGraph.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraph.js +269 -0
- package/dist/data/call-graph/CallGraph.js.map +1 -0
- package/dist/data/call-graph/CallGraphGlyphs.cjs +39 -0
- package/dist/data/call-graph/CallGraphGlyphs.cjs.map +1 -0
- package/dist/data/call-graph/CallGraphGlyphs.d.ts +19 -0
- package/dist/data/call-graph/CallGraphGlyphs.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraphGlyphs.js +39 -0
- package/dist/data/call-graph/CallGraphGlyphs.js.map +1 -0
- package/dist/data/call-graph/CallGraphMembers.cjs +51 -0
- package/dist/data/call-graph/CallGraphMembers.cjs.map +1 -0
- package/dist/data/call-graph/CallGraphMembers.d.ts +22 -0
- package/dist/data/call-graph/CallGraphMembers.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraphMembers.js +51 -0
- package/dist/data/call-graph/CallGraphMembers.js.map +1 -0
- package/dist/data/call-graph/CallGraphParts.cjs +204 -0
- package/dist/data/call-graph/CallGraphParts.cjs.map +1 -0
- package/dist/data/call-graph/CallGraphParts.d.ts +44 -0
- package/dist/data/call-graph/CallGraphParts.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraphParts.js +204 -0
- package/dist/data/call-graph/CallGraphParts.js.map +1 -0
- package/dist/data/call-graph/CallGraphToolbar.cjs +198 -0
- package/dist/data/call-graph/CallGraphToolbar.cjs.map +1 -0
- package/dist/data/call-graph/CallGraphToolbar.d.ts +55 -0
- package/dist/data/call-graph/CallGraphToolbar.d.ts.map +1 -0
- package/dist/data/call-graph/CallGraphToolbar.js +198 -0
- package/dist/data/call-graph/CallGraphToolbar.js.map +1 -0
- package/dist/data/call-graph/call-graph-exclude.cjs +75 -0
- package/dist/data/call-graph/call-graph-exclude.cjs.map +1 -0
- package/dist/data/call-graph/call-graph-exclude.d.ts +31 -0
- package/dist/data/call-graph/call-graph-exclude.d.ts.map +1 -0
- package/dist/data/call-graph/call-graph-exclude.js +75 -0
- package/dist/data/call-graph/call-graph-exclude.js.map +1 -0
- package/dist/data/call-graph/call-graph-labels.cjs +96 -0
- package/dist/data/call-graph/call-graph-labels.cjs.map +1 -0
- package/dist/data/call-graph/call-graph-labels.d.ts +53 -0
- package/dist/data/call-graph/call-graph-labels.d.ts.map +1 -0
- package/dist/data/call-graph/call-graph-labels.js +96 -0
- package/dist/data/call-graph/call-graph-labels.js.map +1 -0
- package/dist/data/call-graph/call-graph-model.cjs +312 -0
- package/dist/data/call-graph/call-graph-model.cjs.map +1 -0
- package/dist/data/call-graph/call-graph-model.d.ts +138 -0
- package/dist/data/call-graph/call-graph-model.d.ts.map +1 -0
- package/dist/data/call-graph/call-graph-model.js +312 -0
- package/dist/data/call-graph/call-graph-model.js.map +1 -0
- package/dist/data/call-graph/call-graph-vocabulary.cjs +195 -0
- package/dist/data/call-graph/call-graph-vocabulary.cjs.map +1 -0
- package/dist/data/call-graph/call-graph-vocabulary.d.ts +76 -0
- package/dist/data/call-graph/call-graph-vocabulary.d.ts.map +1 -0
- package/dist/data/call-graph/call-graph-vocabulary.js +195 -0
- package/dist/data/call-graph/call-graph-vocabulary.js.map +1 -0
- package/dist/data/call-graph/call-graph.fixtures.d.ts +63 -0
- package/dist/data/call-graph/call-graph.fixtures.d.ts.map +1 -0
- package/dist/data/call-graph/index.d.ts +7 -0
- package/dist/data/call-graph/index.d.ts.map +1 -0
- package/dist/data/call-graph/types.cjs +5 -0
- package/dist/data/call-graph/types.cjs.map +1 -0
- package/dist/data/call-graph/types.d.ts +140 -0
- package/dist/data/call-graph/types.d.ts.map +1 -0
- package/dist/data/call-graph/types.js +5 -0
- package/dist/data/call-graph/types.js.map +1 -0
- package/dist/data/call-graph/use-call-graph.cjs +93 -0
- package/dist/data/call-graph/use-call-graph.cjs.map +1 -0
- package/dist/data/call-graph/use-call-graph.d.ts +24 -0
- package/dist/data/call-graph/use-call-graph.d.ts.map +1 -0
- package/dist/data/call-graph/use-call-graph.js +93 -0
- package/dist/data/call-graph/use-call-graph.js.map +1 -0
- package/dist/data/chat/Chat.cjs +39 -15
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.fixtures.cjs +2 -2
- package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
- package/dist/data/chat/Chat.fixtures.js +2 -2
- package/dist/data/chat/Chat.fixtures.js.map +1 -1
- package/dist/data/chat/Chat.js +40 -16
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.cjs +3 -6
- 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 +3 -6
- package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
- package/dist/data/chat/ContextMeter.bar.cjs +5 -8
- package/dist/data/chat/ContextMeter.bar.cjs.map +1 -1
- package/dist/data/chat/ContextMeter.bar.d.ts +1 -1
- package/dist/data/chat/ContextMeter.bar.d.ts.map +1 -1
- package/dist/data/chat/ContextMeter.bar.js +5 -8
- package/dist/data/chat/ContextMeter.bar.js.map +1 -1
- package/dist/data/chat/ContextMeter.cjs +18 -19
- package/dist/data/chat/ContextMeter.cjs.map +1 -1
- package/dist/data/chat/ContextMeter.d.ts +1 -1
- package/dist/data/chat/ContextMeter.d.ts.map +1 -1
- package/dist/data/chat/ContextMeter.js +18 -19
- package/dist/data/chat/ContextMeter.js.map +1 -1
- package/dist/data/chat/Conversation.cjs +2 -1
- package/dist/data/chat/Conversation.cjs.map +1 -1
- package/dist/data/chat/Conversation.d.ts +4 -1
- package/dist/data/chat/Conversation.d.ts.map +1 -1
- package/dist/data/chat/Conversation.js +2 -1
- package/dist/data/chat/Conversation.js.map +1 -1
- package/dist/data/chat/Message.cjs +39 -12
- package/dist/data/chat/Message.cjs.map +1 -1
- package/dist/data/chat/Message.d.ts +1 -1
- package/dist/data/chat/Message.d.ts.map +1 -1
- package/dist/data/chat/Message.js +40 -13
- package/dist/data/chat/Message.js.map +1 -1
- package/dist/data/chat/ToolCall.cjs +60 -5
- package/dist/data/chat/ToolCall.cjs.map +1 -1
- package/dist/data/chat/ToolCall.d.ts +7 -2
- package/dist/data/chat/ToolCall.d.ts.map +1 -1
- package/dist/data/chat/ToolCall.js +60 -5
- package/dist/data/chat/ToolCall.js.map +1 -1
- package/dist/data/chat/approval.cjs.map +1 -1
- package/dist/data/chat/approval.d.ts +2 -2
- package/dist/data/chat/approval.d.ts.map +1 -1
- package/dist/data/chat/approval.js.map +1 -1
- package/dist/data/chat/tool-policy.cjs +59 -2
- package/dist/data/chat/tool-policy.cjs.map +1 -1
- package/dist/data/chat/tool-policy.d.ts +9 -0
- package/dist/data/chat/tool-policy.d.ts.map +1 -1
- package/dist/data/chat/tool-policy.js +59 -2
- package/dist/data/chat/tool-policy.js.map +1 -1
- package/dist/data/chat/types.cjs +6 -0
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +13 -4
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js +7 -1
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/chat/usage-snapshot.cjs +11 -6
- package/dist/data/chat/usage-snapshot.cjs.map +1 -1
- package/dist/data/chat/usage-snapshot.d.ts +0 -1
- package/dist/data/chat/usage-snapshot.d.ts.map +1 -1
- package/dist/data/chat/usage-snapshot.js +11 -6
- package/dist/data/chat/usage-snapshot.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/StackFrameRow.cjs +3 -3
- package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -1
- package/dist/data/diagnostics/StackFrameRow.js +3 -3
- package/dist/data/diagnostics/StackFrameRow.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 +61 -14
- package/dist/data/graph-columns-layout.cjs.map +1 -1
- package/dist/data/graph-columns-layout.d.ts +42 -0
- package/dist/data/graph-columns-layout.d.ts.map +1 -1
- package/dist/data/graph-columns-layout.js +61 -14
- 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 +24 -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-edge-routing.cjs +9 -3
- package/dist/data/graph-edge-routing.cjs.map +1 -1
- package/dist/data/graph-edge-routing.d.ts +2 -0
- package/dist/data/graph-edge-routing.d.ts.map +1 -1
- package/dist/data/graph-edge-routing.js +9 -3
- package/dist/data/graph-edge-routing.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/json-view/JsonSource.cjs +84 -0
- package/dist/data/json-view/JsonSource.cjs.map +1 -0
- package/dist/data/json-view/JsonSource.d.ts +7 -0
- package/dist/data/json-view/JsonSource.d.ts.map +1 -0
- package/dist/data/json-view/JsonSource.js +84 -0
- package/dist/data/json-view/JsonSource.js.map +1 -0
- package/dist/data/json-view/parse-prefix.cjs +132 -0
- package/dist/data/json-view/parse-prefix.cjs.map +1 -0
- package/dist/data/json-view/parse-prefix.d.ts +11 -0
- package/dist/data/json-view/parse-prefix.d.ts.map +1 -0
- package/dist/data/json-view/parse-prefix.js +132 -0
- package/dist/data/json-view/parse-prefix.js.map +1 -0
- package/dist/data/json-view/parse-source.cjs +62 -0
- package/dist/data/json-view/parse-source.cjs.map +1 -0
- package/dist/data/json-view/parse-source.d.ts +16 -0
- package/dist/data/json-view/parse-source.d.ts.map +1 -0
- package/dist/data/json-view/parse-source.js +62 -0
- package/dist/data/json-view/parse-source.js.map +1 -0
- package/dist/data/json-view/story-fixtures.d.ts +6 -0
- package/dist/data/json-view/story-fixtures.d.ts.map +1 -0
- package/dist/data/json-view/types.d.ts +14 -0
- package/dist/data/json-view/types.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.cjs +2 -5
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.d.ts +2 -4
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.fields.cjs +2 -2
- package/dist/data/runtime/RuntimeBar.fields.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.fields.js +2 -2
- package/dist/data/runtime/RuntimeBar.fields.js.map +1 -1
- package/dist/data/runtime/RuntimeBar.js +2 -5
- package/dist/data/runtime/RuntimeBar.js.map +1 -1
- package/dist/data/runtime/RuntimeBar.selection.cjs +4 -1
- package/dist/data/runtime/RuntimeBar.selection.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.selection.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.selection.js +5 -2
- package/dist/data/runtime/RuntimeBar.selection.js.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.cjs +1 -5
- package/dist/data/runtime/RuntimeBarActions.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.d.ts +1 -1
- package/dist/data/runtime/RuntimeBarActions.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.js +1 -5
- package/dist/data/runtime/RuntimeBarActions.js.map +1 -1
- package/dist/data/runtime/RuntimeBarIdentity.cjs +6 -14
- package/dist/data/runtime/RuntimeBarIdentity.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarIdentity.d.ts +0 -1
- package/dist/data/runtime/RuntimeBarIdentity.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarIdentity.js +6 -14
- package/dist/data/runtime/RuntimeBarIdentity.js.map +1 -1
- package/dist/data/runtime/RuntimeBarLayout.cjs +8 -27
- package/dist/data/runtime/RuntimeBarLayout.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarLayout.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarLayout.js +8 -27
- package/dist/data/runtime/RuntimeBarLayout.js.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.cjs +1 -5
- package/dist/data/runtime/RuntimeBarSegment.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.js +1 -5
- package/dist/data/runtime/RuntimeBarSegment.js.map +1 -1
- package/dist/data/runtime/use-runtime-bar-overflow.cjs +4 -10
- package/dist/data/runtime/use-runtime-bar-overflow.cjs.map +1 -1
- package/dist/data/runtime/use-runtime-bar-overflow.d.ts +1 -2
- package/dist/data/runtime/use-runtime-bar-overflow.d.ts.map +1 -1
- package/dist/data/runtime/use-runtime-bar-overflow.js +4 -10
- package/dist/data/runtime/use-runtime-bar-overflow.js.map +1 -1
- package/dist/data/test-runner/TestRunner.fixtures.d.ts +0 -20
- package/dist/data/test-runner/TestRunner.fixtures.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunner.large-fixtures.d.ts +22 -0
- package/dist/data/test-runner/TestRunner.large-fixtures.d.ts.map +1 -0
- 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/use-pan-zoom.cjs +23 -10
- package/dist/data/use-pan-zoom.cjs.map +1 -1
- package/dist/data/use-pan-zoom.d.ts +16 -2
- package/dist/data/use-pan-zoom.d.ts.map +1 -1
- package/dist/data/use-pan-zoom.js +23 -10
- package/dist/data/use-pan-zoom.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +36 -2
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +5 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +35 -1
- 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/index.cjs +40 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +37 -1
- package/dist/index.js.map +1 -1
- package/dist/layout/Workspace.cjs +13 -4
- package/dist/layout/Workspace.cjs.map +1 -1
- package/dist/layout/Workspace.d.ts +7 -2
- package/dist/layout/Workspace.d.ts.map +1 -1
- package/dist/layout/Workspace.js +13 -4
- package/dist/layout/Workspace.js.map +1 -1
- package/dist/lib/permission-strategies.cjs +71 -11
- package/dist/lib/permission-strategies.cjs.map +1 -1
- package/dist/lib/permission-strategies.d.ts +3 -0
- package/dist/lib/permission-strategies.d.ts.map +1 -1
- package/dist/lib/permission-strategies.js +71 -11
- package/dist/lib/permission-strategies.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/styles.css +1 -1
- package/package.json +5 -3
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs +0 -57
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs.map +0 -1
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts +0 -7
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts.map +0 -1
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js +0 -57
- package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js.map +0 -1
- package/dist/data/runtime/RuntimeBar.context.cjs +0 -8
- package/dist/data/runtime/RuntimeBar.context.cjs.map +0 -1
- package/dist/data/runtime/RuntimeBar.context.d.ts +0 -2
- package/dist/data/runtime/RuntimeBar.context.d.ts.map +0 -1
- package/dist/data/runtime/RuntimeBar.context.js +0 -8
- package/dist/data/runtime/RuntimeBar.context.js.map +0 -1
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const react = require("react");
|
|
5
|
+
const button = require("../../components/button.cjs");
|
|
6
|
+
const IconButton = require("../../components/IconButton.cjs");
|
|
7
|
+
const InputField = require("../../components/InputField.cjs");
|
|
8
|
+
const SegmentedControl = require("../../components/SegmentedControl.cjs");
|
|
9
|
+
const Switch = require("../../components/Switch.cjs");
|
|
10
|
+
const DropdownMenu = require("../../overlay/DropdownMenu.cjs");
|
|
11
|
+
const Badge = require("../Badge.cjs");
|
|
12
|
+
const callGraphExclude = require("./call-graph-exclude.cjs");
|
|
13
|
+
const callGraphLabels = require("./call-graph-labels.cjs");
|
|
14
|
+
const callGraphModel = require("./call-graph-model.cjs");
|
|
15
|
+
const types = require("./types.cjs");
|
|
16
|
+
const UiHome = require("../../icons/components/UiHome.cjs");
|
|
17
|
+
const UiFilter = require("../../icons/components/UiFilter.cjs");
|
|
18
|
+
const UiExpandAll = require("../../icons/components/UiExpandAll.cjs");
|
|
19
|
+
const UiCollapseAll = require("../../icons/components/UiCollapseAll.cjs");
|
|
20
|
+
const UiWarningTriangle = require("../../icons/components/UiWarningTriangle.cjs");
|
|
21
|
+
const DIRECTIONS = [
|
|
22
|
+
{ id: "callers", label: "Callers" },
|
|
23
|
+
{ id: "both", label: "Both" },
|
|
24
|
+
{ id: "callees", label: "Callees" }
|
|
25
|
+
];
|
|
26
|
+
function DepthStepper({ depth, maxDepth, onChange }) {
|
|
27
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", role: "group", "aria-label": "Depth", children: [
|
|
28
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: "Depth" }),
|
|
29
|
+
/* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", variant: "outline", size: "sm", className: "size-8 px-0", "aria-label": "Decrease depth", disabled: depth <= 1, onClick: () => onChange(depth - 1), children: "−" }),
|
|
30
|
+
/* @__PURE__ */ jsxRuntime.jsx("output", { className: "w-5 text-center text-sm font-medium tabular-nums", "aria-live": "polite", "aria-label": "Graph depth", children: depth }),
|
|
31
|
+
/* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", variant: "outline", size: "sm", className: "size-8 px-0", "aria-label": "Increase depth", disabled: depth >= maxDepth, onClick: () => onChange(depth + 1), children: "+" })
|
|
32
|
+
] });
|
|
33
|
+
}
|
|
34
|
+
function OmittedChip({ omitted, noun }) {
|
|
35
|
+
const parts = callGraphLabels.omittedParts(omitted);
|
|
36
|
+
if (parts.length === 0) return null;
|
|
37
|
+
const tally = callGraphLabels.excludedTally(omitted).map(({ group, count }) => `${group}: ${count}`);
|
|
38
|
+
const title = [`Not drawn: ${parts.join(", ")}`, ...tally.length ? [`Excluded per ${noun}:`, ...tally] : []].join("\n");
|
|
39
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { title, "data-testid": "graph-omitted", children: /* @__PURE__ */ jsxRuntime.jsx(Badge.Badge, { tone: "warning", size: "md", icon: UiWarningTriangle.UiWarningTriangle, clickToCopy: false, children: parts.join(" · ") }) });
|
|
40
|
+
}
|
|
41
|
+
function GroupRow({ group, onToggle }) {
|
|
42
|
+
const name = group.label ?? group.name;
|
|
43
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-center gap-2 py-1", children: [
|
|
44
|
+
/* @__PURE__ */ jsxRuntime.jsx(Switch.Switch, { checked: !group.excluded, onChange: onToggle, "aria-label": `Show ${name}` }),
|
|
45
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate font-mono text-xs", title: group.name, children: name }),
|
|
46
|
+
group.external && /* @__PURE__ */ jsxRuntime.jsx(Badge.Badge, { variant: "outline", size: "sm", clickToCopy: false, children: "external" }),
|
|
47
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "w-8 shrink-0 text-right text-xs tabular-nums text-muted-foreground", title: `${group.nodes} nodes`, children: group.nodes })
|
|
48
|
+
] });
|
|
49
|
+
}
|
|
50
|
+
function GroupFacets({ exclude, groups, matches, onExclude, onDefaults, busy, vocabulary }) {
|
|
51
|
+
const [filter, setFilter] = react.useState("");
|
|
52
|
+
const [pattern, setPattern] = react.useState("");
|
|
53
|
+
const [error, setError] = react.useState();
|
|
54
|
+
const { plural, patternHint } = vocabulary.group;
|
|
55
|
+
const needle = filter.trim().toLowerCase();
|
|
56
|
+
const shown = groups.filter((group) => `${group.name} ${group.label ?? ""}`.toLowerCase().includes(needle));
|
|
57
|
+
const submit = (event) => {
|
|
58
|
+
event.preventDefault();
|
|
59
|
+
const typed = pattern.trim();
|
|
60
|
+
const problem = callGraphExclude.excludePatternError(exclude, typed);
|
|
61
|
+
setError(problem);
|
|
62
|
+
if (problem) return;
|
|
63
|
+
setPattern("");
|
|
64
|
+
onExclude(callGraphExclude.addExcludePattern(exclude, typed));
|
|
65
|
+
};
|
|
66
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("fieldset", { disabled: busy, "aria-busy": busy, className: "flex w-96 min-w-0 max-w-[90vw] flex-col gap-2 p-2 text-sm", children: [
|
|
67
|
+
/* @__PURE__ */ jsxRuntime.jsx(InputField.InputField, { "aria-label": `Filter ${plural}`, placeholder: `Filter ${plural}`, value: filter, onChange: setFilter }),
|
|
68
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-1", "aria-label": "Exclusion patterns", children: [
|
|
69
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: "Excluding" }),
|
|
70
|
+
exclude.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: "nothing" }),
|
|
71
|
+
exclude.map((entry) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
72
|
+
"button",
|
|
73
|
+
{
|
|
74
|
+
type: "button",
|
|
75
|
+
className: "rounded border border-border px-1.5 font-mono text-xs hover:bg-muted",
|
|
76
|
+
"aria-label": `Stop excluding ${entry}`,
|
|
77
|
+
title: `Stop excluding ${entry}`,
|
|
78
|
+
onClick: () => onExclude(callGraphExclude.removeExcludePattern(exclude, entry)),
|
|
79
|
+
children: [
|
|
80
|
+
entry,
|
|
81
|
+
" ×"
|
|
82
|
+
]
|
|
83
|
+
},
|
|
84
|
+
entry
|
|
85
|
+
))
|
|
86
|
+
] }),
|
|
87
|
+
/* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "max-h-72 overflow-y-auto pr-1", "aria-label": plural, children: [
|
|
88
|
+
shown.map((group) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
89
|
+
GroupRow,
|
|
90
|
+
{
|
|
91
|
+
group,
|
|
92
|
+
onToggle: () => onExclude(group.excluded ? callGraphExclude.includeGroup(exclude, group, groups, matches) : callGraphExclude.excludeGroup(exclude, group.name))
|
|
93
|
+
},
|
|
94
|
+
group.name
|
|
95
|
+
)),
|
|
96
|
+
shown.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("li", { className: "py-1 text-xs text-muted-foreground", children: groups.length ? `No ${vocabulary.group.noun} matches the filter.` : `The graph reached no ${vocabulary.group.noun}.` })
|
|
97
|
+
] }),
|
|
98
|
+
/* @__PURE__ */ jsxRuntime.jsxs("form", { className: "flex items-start gap-2", onSubmit: submit, children: [
|
|
99
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [
|
|
100
|
+
/* @__PURE__ */ jsxRuntime.jsx(InputField.InputField, { "aria-label": "Exclude pattern", placeholder: patternHint, value: pattern, onChange: setPattern }),
|
|
101
|
+
error && /* @__PURE__ */ jsxRuntime.jsx("span", { role: "alert", className: "text-xs text-destructive", children: error })
|
|
102
|
+
] }),
|
|
103
|
+
/* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "submit", size: "sm", variant: "outline", children: "Exclude" })
|
|
104
|
+
] }),
|
|
105
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between gap-2 border-t border-border pt-2", children: [
|
|
106
|
+
/* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", size: "sm", variant: "ghost", onClick: onDefaults, children: "Reset to defaults" }),
|
|
107
|
+
/* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", size: "sm", variant: "ghost", onClick: () => onExclude([]), children: "Show all" })
|
|
108
|
+
] })
|
|
109
|
+
] });
|
|
110
|
+
}
|
|
111
|
+
const ACCESS_LABELS = { call: "Calls", read: "Reads", write: "Writes", variable: "Variables" };
|
|
112
|
+
function DataAccessControls({ access, onAccess, columns, onColumns, variables }) {
|
|
113
|
+
const lastOn = callGraphModel.baseAccess(access).length === 1;
|
|
114
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
115
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1", role: "group", "aria-label": "Access", children: (variables ? [...types.CALL_GRAPH_ACCESS, "variable"] : types.CALL_GRAPH_ACCESS).map((type) => {
|
|
116
|
+
const on = access.includes(type);
|
|
117
|
+
const kept = on && lastOn && type !== "variable";
|
|
118
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
119
|
+
button.Button,
|
|
120
|
+
{
|
|
121
|
+
type: "button",
|
|
122
|
+
size: "sm",
|
|
123
|
+
variant: on ? "secondary" : "outline",
|
|
124
|
+
"aria-pressed": on,
|
|
125
|
+
disabled: kept,
|
|
126
|
+
title: kept ? "At least one kind of access stays on" : void 0,
|
|
127
|
+
onClick: () => onAccess(callGraphModel.toggleAccess(access, type)),
|
|
128
|
+
children: ACCESS_LABELS[type]
|
|
129
|
+
},
|
|
130
|
+
type
|
|
131
|
+
);
|
|
132
|
+
}) }),
|
|
133
|
+
/* @__PURE__ */ jsxRuntime.jsx(Switch.Switch, { checked: columns, label: "Columns", onChange: onColumns })
|
|
134
|
+
] });
|
|
135
|
+
}
|
|
136
|
+
function GroupCollapseControls({ anyCollapsed, anyExpanded, onExpandAll, onCollapseAll }) {
|
|
137
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-0.5", role: "group", "aria-label": "Groups", children: [
|
|
138
|
+
/* @__PURE__ */ jsxRuntime.jsx(IconButton.IconButton, { icon: UiExpandAll.UiExpandAll, label: "Expand all groups", className: "size-7", disabled: !anyCollapsed, onClick: onExpandAll }),
|
|
139
|
+
/* @__PURE__ */ jsxRuntime.jsx(IconButton.IconButton, { icon: UiCollapseAll.UiCollapseAll, label: "Collapse all groups", className: "size-7", disabled: !anyExpanded, onClick: onCollapseAll })
|
|
140
|
+
] });
|
|
141
|
+
}
|
|
142
|
+
function CallGraphToolbar(props) {
|
|
143
|
+
const { exclusions, pin, vocabulary } = props;
|
|
144
|
+
const excludedCount = (exclusions == null ? void 0 : exclusions.groups.filter((group) => group.excluded).length) ?? 0;
|
|
145
|
+
const hasExternal = (exclusions == null ? void 0 : exclusions.groups.some((group) => group.external)) ?? false;
|
|
146
|
+
const { noun, plural } = vocabulary.group;
|
|
147
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
|
|
148
|
+
/* @__PURE__ */ jsxRuntime.jsx(SegmentedControl.SegmentedControl, { value: props.direction, options: DIRECTIONS, onChange: props.onDirection, size: "sm", "aria-label": "Direction" }),
|
|
149
|
+
/* @__PURE__ */ jsxRuntime.jsx(DepthStepper, { depth: props.depth, maxDepth: props.maxDepth, onChange: props.onDepth }),
|
|
150
|
+
props.data && /* @__PURE__ */ jsxRuntime.jsx(DataAccessControls, { ...props.data }),
|
|
151
|
+
pin && /* @__PURE__ */ jsxRuntime.jsx(
|
|
152
|
+
button.Button,
|
|
153
|
+
{
|
|
154
|
+
type: "button",
|
|
155
|
+
variant: pin.pinned ? "secondary" : "outline",
|
|
156
|
+
size: "sm",
|
|
157
|
+
disabled: !pin.pinned && !pin.canPin,
|
|
158
|
+
"aria-pressed": pin.pinned,
|
|
159
|
+
title: pin.pinned ? "The graph keeps this root while the selection changes" : "Keep this root while the selection changes",
|
|
160
|
+
onClick: () => pin.onPin(!pin.pinned),
|
|
161
|
+
children: pin.pinned ? "Unpin root" : "Pin root"
|
|
162
|
+
}
|
|
163
|
+
),
|
|
164
|
+
/* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", variant: "outline", size: "sm", onClick: props.onFit, children: "Fit" }),
|
|
165
|
+
/* @__PURE__ */ jsxRuntime.jsxs(button.Button, { type: "button", variant: "outline", size: "sm", onClick: props.onReset, children: [
|
|
166
|
+
/* @__PURE__ */ jsxRuntime.jsx(UiHome.UiHome, {}),
|
|
167
|
+
"Reset"
|
|
168
|
+
] }),
|
|
169
|
+
props.groupCollapse && /* @__PURE__ */ jsxRuntime.jsx(GroupCollapseControls, { ...props.groupCollapse }),
|
|
170
|
+
exclusions && hasExternal && /* @__PURE__ */ jsxRuntime.jsx(
|
|
171
|
+
Switch.Switch,
|
|
172
|
+
{
|
|
173
|
+
checked: exclusions.exclude.includes(callGraphExclude.EXCLUDE_EXTERNAL),
|
|
174
|
+
disabled: exclusions.busy,
|
|
175
|
+
label: "Hide all external",
|
|
176
|
+
onChange: (hidden) => exclusions.onExclude(callGraphExclude.setExternalHidden(exclusions.exclude, hidden))
|
|
177
|
+
}
|
|
178
|
+
),
|
|
179
|
+
exclusions && /* @__PURE__ */ jsxRuntime.jsx(
|
|
180
|
+
DropdownMenu.DropdownMenu,
|
|
181
|
+
{
|
|
182
|
+
icon: UiFilter.UiFilter,
|
|
183
|
+
label: `${callGraphLabels.capitalize(plural)}${excludedCount ? ` (${excludedCount} excluded)` : ""}`,
|
|
184
|
+
variant: "outline",
|
|
185
|
+
size: "sm",
|
|
186
|
+
menuLabel: `${callGraphLabels.capitalize(noun)} exclusions`,
|
|
187
|
+
title: `Choose the ${plural} the graph leaves out`,
|
|
188
|
+
children: () => /* @__PURE__ */ jsxRuntime.jsx(GroupFacets, { ...exclusions })
|
|
189
|
+
}
|
|
190
|
+
),
|
|
191
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-auto flex items-center gap-2", children: [
|
|
192
|
+
props.omitted && /* @__PURE__ */ jsxRuntime.jsx(OmittedChip, { omitted: props.omitted, noun }),
|
|
193
|
+
props.end
|
|
194
|
+
] })
|
|
195
|
+
] });
|
|
196
|
+
}
|
|
197
|
+
exports.CallGraphToolbar = CallGraphToolbar;
|
|
198
|
+
//# sourceMappingURL=CallGraphToolbar.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CallGraphToolbar.cjs","sources":["../../../src/data/call-graph/CallGraphToolbar.tsx"],"sourcesContent":["import { useState, type FormEvent, type ReactNode } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { IconButton } from \"../../components/IconButton\";\nimport { InputField } from \"../../components/InputField\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport { Switch } from \"../../components/Switch\";\nimport { UiCollapseAll, UiExpandAll, UiFilter, UiHome, UiWarningTriangle } from \"../../icons\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Badge } from \"../Badge\";\nimport {\n addExcludePattern,\n EXCLUDE_EXTERNAL,\n excludeGroup,\n excludePatternError,\n includeGroup,\n removeExcludePattern,\n setExternalHidden,\n type ExcludeMatcher,\n} from \"./call-graph-exclude\";\nimport { capitalize, excludedTally, omittedParts } from \"./call-graph-labels\";\nimport { baseAccess, toggleAccess } from \"./call-graph-model\";\nimport type { CallGraphVocabulary } from \"./call-graph-vocabulary\";\nimport { CALL_GRAPH_ACCESS, type CallGraphAccess, type CallGraphDirection, type CallGraphGroupFact, type CallGraphOmitted } from \"./types\";\n\nconst DIRECTIONS: { id: CallGraphDirection; label: string }[] = [\n { id: \"callers\", label: \"Callers\" },\n { id: \"both\", label: \"Both\" },\n { id: \"callees\", label: \"Callees\" },\n];\n\nfunction DepthStepper({ depth, maxDepth, onChange }: { depth: number; maxDepth: number; onChange: (depth: number) => void }) {\n return (\n <div className=\"flex items-center gap-1\" role=\"group\" aria-label=\"Depth\">\n <span className=\"text-xs text-muted-foreground\">Depth</span>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"size-8 px-0\" aria-label=\"Decrease depth\" disabled={depth <= 1} onClick={() => onChange(depth - 1)}>−</Button>\n <output className=\"w-5 text-center text-sm font-medium tabular-nums\" aria-live=\"polite\" aria-label=\"Graph depth\">{depth}</output>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"size-8 px-0\" aria-label=\"Increase depth\" disabled={depth >= maxDepth} onClick={() => onChange(depth + 1)}>+</Button>\n </div>\n );\n}\n\nfunction OmittedChip({ omitted, noun }: { omitted: CallGraphOmitted; noun: string }) {\n const parts = omittedParts(omitted);\n if (parts.length === 0) return null;\n const tally = excludedTally(omitted).map(({ group, count }) => `${group}: ${count}`);\n const title = [`Not drawn: ${parts.join(\", \")}`, ...(tally.length ? [`Excluded per ${noun}:`, ...tally] : [])].join(\"\\n\");\n return (\n <span title={title} data-testid=\"graph-omitted\">\n <Badge tone=\"warning\" size=\"md\" icon={UiWarningTriangle} clickToCopy={false}>{parts.join(\" · \")}</Badge>\n </span>\n );\n}\n\nexport interface ExclusionsProps {\n /** The patterns in force. */\n exclude: string[];\n groups: CallGraphGroupFact[];\n matches: ExcludeMatcher;\n onExclude: (patterns: string[]) => void;\n onDefaults: () => void;\n /** A graph for the last edit is loading: the facts describe the one before it, so editing waits. */\n busy: boolean;\n vocabulary: CallGraphVocabulary;\n}\n\nfunction GroupRow({ group, onToggle }: { group: CallGraphGroupFact; onToggle: () => void }) {\n const name = group.label ?? group.name;\n return (\n <li className=\"flex items-center gap-2 py-1\">\n <Switch checked={!group.excluded} onChange={onToggle} aria-label={`Show ${name}`} />\n <span className=\"min-w-0 flex-1 truncate font-mono text-xs\" title={group.name}>{name}</span>\n {group.external && <Badge variant=\"outline\" size=\"sm\" clickToCopy={false}>external</Badge>}\n <span className=\"w-8 shrink-0 text-right text-xs tabular-nums text-muted-foreground\" title={`${group.nodes} nodes`}>{group.nodes}</span>\n </li>\n );\n}\n\n/** The group facets: one switch per group the walk reached, the patterns in force, and free-text patterns. */\nfunction GroupFacets({ exclude, groups, matches, onExclude, onDefaults, busy, vocabulary }: ExclusionsProps) {\n const [filter, setFilter] = useState(\"\");\n const [pattern, setPattern] = useState(\"\");\n const [error, setError] = useState<string>();\n const { plural, patternHint } = vocabulary.group;\n const needle = filter.trim().toLowerCase();\n const shown = groups.filter((group) => `${group.name} ${group.label ?? \"\"}`.toLowerCase().includes(needle));\n const submit = (event: FormEvent) => {\n event.preventDefault();\n const typed = pattern.trim();\n const problem = excludePatternError(exclude, typed);\n setError(problem);\n if (problem) return;\n setPattern(\"\");\n onExclude(addExcludePattern(exclude, typed));\n };\n // The filter box comes first: the menu focuses its first control on opening, which must not be one that drops an exclusion.\n return (\n <fieldset disabled={busy} aria-busy={busy} className=\"flex w-96 min-w-0 max-w-[90vw] flex-col gap-2 p-2 text-sm\">\n <InputField aria-label={`Filter ${plural}`} placeholder={`Filter ${plural}`} value={filter} onChange={setFilter} />\n <div className=\"flex flex-wrap items-center gap-1\" aria-label=\"Exclusion patterns\">\n <span className=\"text-xs text-muted-foreground\">Excluding</span>\n {exclude.length === 0 && <span className=\"text-xs text-muted-foreground\">nothing</span>}\n {exclude.map((entry) => (\n <button key={entry} type=\"button\" className=\"rounded border border-border px-1.5 font-mono text-xs hover:bg-muted\"\n aria-label={`Stop excluding ${entry}`} title={`Stop excluding ${entry}`} onClick={() => onExclude(removeExcludePattern(exclude, entry))}>\n {entry} ×\n </button>\n ))}\n </div>\n <ul className=\"max-h-72 overflow-y-auto pr-1\" aria-label={plural}>\n {shown.map((group) => (\n <GroupRow key={group.name} group={group}\n onToggle={() => onExclude(group.excluded ? includeGroup(exclude, group, groups, matches) : excludeGroup(exclude, group.name))} />\n ))}\n {shown.length === 0 && (\n <li className=\"py-1 text-xs text-muted-foreground\">{groups.length ? `No ${vocabulary.group.noun} matches the filter.` : `The graph reached no ${vocabulary.group.noun}.`}</li>\n )}\n </ul>\n <form className=\"flex items-start gap-2\" onSubmit={submit}>\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <InputField aria-label=\"Exclude pattern\" placeholder={patternHint} value={pattern} onChange={setPattern} />\n {error && <span role=\"alert\" className=\"text-xs text-destructive\">{error}</span>}\n </div>\n <Button type=\"submit\" size=\"sm\" variant=\"outline\">Exclude</Button>\n </form>\n <div className=\"flex justify-between gap-2 border-t border-border pt-2\">\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={onDefaults}>Reset to defaults</Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={() => onExclude([])}>Show all</Button>\n </div>\n </fieldset>\n );\n}\n\nconst ACCESS_LABELS: Record<CallGraphAccess, string> = { call: \"Calls\", read: \"Reads\", write: \"Writes\", variable: \"Variables\" };\n\nexport interface DataAccessProps {\n access: CallGraphAccess[];\n onAccess: (access: CallGraphAccess[]) => void;\n columns: boolean;\n onColumns: (columns: boolean) => void;\n /** Offers the Variables toggle, on top of the access types. */\n variables?: boolean;\n}\n\n/** Which edge types the graph follows, at least one of calls, reads and writes, and whether columns and fields are nodes of their own. */\nfunction DataAccessControls({ access, onAccess, columns, onColumns, variables }: DataAccessProps) {\n const lastOn = baseAccess(access).length === 1;\n return (\n <>\n <div className=\"flex items-center gap-1\" role=\"group\" aria-label=\"Access\">\n {(variables ? [...CALL_GRAPH_ACCESS, \"variable\" as const] : CALL_GRAPH_ACCESS).map((type) => {\n const on = access.includes(type);\n const kept = on && lastOn && type !== \"variable\";\n return (\n <Button key={type} type=\"button\" size=\"sm\" variant={on ? \"secondary\" : \"outline\"} aria-pressed={on} disabled={kept}\n title={kept ? \"At least one kind of access stays on\" : undefined} onClick={() => onAccess(toggleAccess(access, type))}>\n {ACCESS_LABELS[type]}\n </Button>\n );\n })}\n </div>\n <Switch checked={columns} label=\"Columns\" onChange={onColumns} />\n </>\n );\n}\n\nexport interface GroupCollapseProps {\n anyCollapsed: boolean;\n anyExpanded: boolean;\n onExpandAll: () => void;\n onCollapseAll: () => void;\n}\n\n/** Expand or collapse every group the graph draws at once. */\nfunction GroupCollapseControls({ anyCollapsed, anyExpanded, onExpandAll, onCollapseAll }: GroupCollapseProps) {\n return (\n <div className=\"flex items-center gap-0.5\" role=\"group\" aria-label=\"Groups\">\n <IconButton icon={UiExpandAll} label=\"Expand all groups\" className=\"size-7\" disabled={!anyCollapsed} onClick={onExpandAll} />\n <IconButton icon={UiCollapseAll} label=\"Collapse all groups\" className=\"size-7\" disabled={!anyExpanded} onClick={onCollapseAll} />\n </div>\n );\n}\n\nexport interface CallGraphToolbarProps {\n /** Shown only when the host's graph has reads and writes. */\n data?: DataAccessProps | undefined;\n /** Shown only when the graph draws a group that can collapse. */\n groupCollapse?: GroupCollapseProps | undefined;\n direction: CallGraphDirection;\n depth: number;\n maxDepth: number;\n /** Shown only when the host keeps a root across selection changes. */\n pin?: { pinned: boolean; canPin: boolean; onPin: (pinned: boolean) => void } | undefined;\n exclusions?: ExclusionsProps | undefined;\n omitted?: CallGraphOmitted | undefined;\n /** Host content at the toolbar's end, such as server timing. */\n end?: ReactNode;\n onDirection: (direction: CallGraphDirection) => void;\n onDepth: (depth: number) => void;\n onFit: () => void;\n onReset: () => void;\n vocabulary: CallGraphVocabulary;\n}\n\nexport function CallGraphToolbar(props: CallGraphToolbarProps) {\n const { exclusions, pin, vocabulary } = props;\n const excludedCount = exclusions?.groups.filter((group) => group.excluded).length ?? 0;\n const hasExternal = exclusions?.groups.some((group) => group.external) ?? false;\n const { noun, plural } = vocabulary.group;\n return (\n <div className=\"flex flex-wrap items-center gap-3\">\n <SegmentedControl value={props.direction} options={DIRECTIONS} onChange={props.onDirection} size=\"sm\" aria-label=\"Direction\" />\n <DepthStepper depth={props.depth} maxDepth={props.maxDepth} onChange={props.onDepth} />\n {props.data && <DataAccessControls {...props.data} />}\n {pin && (\n <Button type=\"button\" variant={pin.pinned ? \"secondary\" : \"outline\"} size=\"sm\" disabled={!pin.pinned && !pin.canPin} aria-pressed={pin.pinned}\n title={pin.pinned ? \"The graph keeps this root while the selection changes\" : \"Keep this root while the selection changes\"} onClick={() => pin.onPin(!pin.pinned)}>\n {pin.pinned ? \"Unpin root\" : \"Pin root\"}\n </Button>\n )}\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={props.onFit}>Fit</Button>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={props.onReset}><UiHome />Reset</Button>\n {props.groupCollapse && <GroupCollapseControls {...props.groupCollapse} />}\n {exclusions && hasExternal && (\n <Switch checked={exclusions.exclude.includes(EXCLUDE_EXTERNAL)} disabled={exclusions.busy} label=\"Hide all external\"\n onChange={(hidden) => exclusions.onExclude(setExternalHidden(exclusions.exclude, hidden))} />\n )}\n {exclusions && (\n <DropdownMenu icon={UiFilter} label={`${capitalize(plural)}${excludedCount ? ` (${excludedCount} excluded)` : \"\"}`} variant=\"outline\" size=\"sm\"\n menuLabel={`${capitalize(noun)} exclusions`} title={`Choose the ${plural} the graph leaves out`}>\n {() => <GroupFacets {...exclusions} />}\n </DropdownMenu>\n )}\n <div className=\"ml-auto flex items-center gap-2\">\n {props.omitted && <OmittedChip omitted={props.omitted} noun={noun} />}\n {props.end}\n </div>\n </div>\n );\n}\n"],"names":["jsx","Button","omittedParts","excludedTally","Badge","UiWarningTriangle","jsxs","Switch","useState","excludePatternError","addExcludePattern","InputField","removeExcludePattern","includeGroup","excludeGroup","baseAccess","Fragment","CALL_GRAPH_ACCESS","toggleAccess","IconButton","UiExpandAll","UiCollapseAll","SegmentedControl","UiHome","EXCLUDE_EXTERNAL","setExternalHidden","DropdownMenu","UiFilter","capitalize"],"mappings":";;;;;;;;;;;;;;;;;;;;AAwBA,MAAM,aAA0D;AAAA,EAC9D,EAAE,IAAI,WAAW,OAAO,UAAA;AAAA,EACxB,EAAE,IAAI,QAAQ,OAAO,OAAA;AAAA,EACrB,EAAE,IAAI,WAAW,OAAO,UAAA;AAC1B;AAEA,SAAS,aAAa,EAAE,OAAO,UAAU,YAAoF;AAC3H,yCACG,OAAA,EAAI,WAAU,2BAA0B,MAAK,SAAQ,cAAW,SAC/D,UAAA;AAAA,IAAAA,2BAAAA,IAAC,QAAA,EAAK,WAAU,iCAAgC,UAAA,SAAK;AAAA,IACrDA,2BAAAA,IAACC,OAAAA,UAAO,MAAK,UAAS,SAAQ,WAAU,MAAK,MAAK,WAAU,eAAc,cAAW,kBAAiB,UAAU,SAAS,GAAG,SAAS,MAAM,SAAS,QAAQ,CAAC,GAAG,UAAA,IAAA,CAAC;AAAA,IACjKD,2BAAAA,IAAC,YAAO,WAAU,oDAAmD,aAAU,UAAS,cAAW,eAAe,UAAA,MAAA,CAAM;AAAA,IACxHA,2BAAAA,IAACC,OAAAA,UAAO,MAAK,UAAS,SAAQ,WAAU,MAAK,MAAK,WAAU,eAAc,cAAW,kBAAiB,UAAU,SAAS,UAAU,SAAS,MAAM,SAAS,QAAQ,CAAC,GAAG,UAAA,IAAA,CAAC;AAAA,EAAA,GAC1K;AAEJ;AAEA,SAAS,YAAY,EAAE,SAAS,QAAqD;AACnF,QAAM,QAAQC,gBAAAA,aAAa,OAAO;AAClC,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,QAAQC,gBAAAA,cAAc,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,MAAA,MAAY,GAAG,KAAK,KAAK,KAAK,EAAE;AACnF,QAAM,QAAQ,CAAC,cAAc,MAAM,KAAK,IAAI,CAAC,IAAI,GAAI,MAAM,SAAS,CAAC,gBAAgB,IAAI,KAAK,GAAG,KAAK,IAAI,CAAA,CAAG,EAAE,KAAK,IAAI;AACxH,wCACG,QAAA,EAAK,OAAc,eAAY,iBAC9B,UAAAH,2BAAAA,IAACI,eAAM,MAAK,WAAU,MAAK,MAAK,MAAMC,qCAAmB,aAAa,OAAQ,gBAAM,KAAK,KAAK,GAAE,EAAA,CAClG;AAEJ;AAcA,SAAS,SAAS,EAAE,OAAO,YAAiE;AAC1F,QAAM,OAAO,MAAM,SAAS,MAAM;AAClC,SACEC,2BAAAA,KAAC,MAAA,EAAG,WAAU,gCACZ,UAAA;AAAA,IAAAN,2BAAAA,IAACO,OAAAA,QAAA,EAAO,SAAS,CAAC,MAAM,UAAU,UAAU,UAAU,cAAY,QAAQ,IAAI,GAAA,CAAI;AAAA,mCACjF,QAAA,EAAK,WAAU,6CAA4C,OAAO,MAAM,MAAO,UAAA,MAAK;AAAA,IACpF,MAAM,YAAYP,2BAAAA,IAACI,MAAAA,OAAA,EAAM,SAAQ,WAAU,MAAK,MAAK,aAAa,OAAO,UAAA,WAAA,CAAQ;AAAA,IAClFJ,2BAAAA,IAAC,QAAA,EAAK,WAAU,sEAAqE,OAAO,GAAG,MAAM,KAAK,UAAW,UAAA,MAAM,MAAA,CAAM;AAAA,EAAA,GACnI;AAEJ;AAGA,SAAS,YAAY,EAAE,SAAS,QAAQ,SAAS,WAAW,YAAY,MAAM,cAA+B;AAC3G,QAAM,CAAC,QAAQ,SAAS,IAAIQ,MAAAA,SAAS,EAAE;AACvC,QAAM,CAAC,SAAS,UAAU,IAAIA,MAAAA,SAAS,EAAE;AACzC,QAAM,CAAC,OAAO,QAAQ,IAAIA,eAAA;AAC1B,QAAM,EAAE,QAAQ,YAAA,IAAgB,WAAW;AAC3C,QAAM,SAAS,OAAO,KAAA,EAAO,YAAA;AAC7B,QAAM,QAAQ,OAAO,OAAO,CAAC,UAAU,GAAG,MAAM,IAAI,IAAI,MAAM,SAAS,EAAE,GAAG,cAAc,SAAS,MAAM,CAAC;AAC1G,QAAM,SAAS,CAAC,UAAqB;AACnC,UAAM,eAAA;AACN,UAAM,QAAQ,QAAQ,KAAA;AACtB,UAAM,UAAUC,iBAAAA,oBAAoB,SAAS,KAAK;AAClD,aAAS,OAAO;AAChB,QAAI,QAAS;AACb,eAAW,EAAE;AACb,cAAUC,iBAAAA,kBAAkB,SAAS,KAAK,CAAC;AAAA,EAC7C;AAEA,yCACG,YAAA,EAAS,UAAU,MAAM,aAAW,MAAM,WAAU,6DACnD,UAAA;AAAA,IAAAV,2BAAAA,IAACW,WAAAA,YAAA,EAAW,cAAY,UAAU,MAAM,IAAI,aAAa,UAAU,MAAM,IAAI,OAAO,QAAQ,UAAU,WAAW;AAAA,IACjHL,2BAAAA,KAAC,OAAA,EAAI,WAAU,qCAAoC,cAAW,sBAC5D,UAAA;AAAA,MAAAN,2BAAAA,IAAC,QAAA,EAAK,WAAU,iCAAgC,UAAA,aAAS;AAAA,MACxD,QAAQ,WAAW,oCAAM,QAAA,EAAK,WAAU,iCAAgC,UAAA,WAAO;AAAA,MAC/E,QAAQ,IAAI,CAAC,UACZM,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UAAmB,MAAK;AAAA,UAAS,WAAU;AAAA,UAC1C,cAAY,kBAAkB,KAAK;AAAA,UAAI,OAAO,kBAAkB,KAAK;AAAA,UAAI,SAAS,MAAM,UAAUM,iBAAAA,qBAAqB,SAAS,KAAK,CAAC;AAAA,UACrI,UAAA;AAAA,YAAA;AAAA,YAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QAFI;AAAA,MAAA,CAId;AAAA,IAAA,GACH;AAAA,IACAN,2BAAAA,KAAC,MAAA,EAAG,WAAU,iCAAgC,cAAY,QACvD,UAAA;AAAA,MAAA,MAAM,IAAI,CAAC,UACVN,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UAA0B;AAAA,UACzB,UAAU,MAAM,UAAU,MAAM,WAAWa,iBAAAA,aAAa,SAAS,OAAO,QAAQ,OAAO,IAAIC,iBAAAA,aAAa,SAAS,MAAM,IAAI,CAAC;AAAA,QAAA;AAAA,QAD/G,MAAM;AAAA,MAAA,CAEtB;AAAA,MACA,MAAM,WAAW,oCACf,MAAA,EAAG,WAAU,sCAAsC,UAAA,OAAO,SAAS,MAAM,WAAW,MAAM,IAAI,yBAAyB,wBAAwB,WAAW,MAAM,IAAI,IAAA,CAAI;AAAA,IAAA,GAE7K;AAAA,IACAR,2BAAAA,KAAC,QAAA,EAAK,WAAU,0BAAyB,UAAU,QACjD,UAAA;AAAA,MAAAA,2BAAAA,KAAC,OAAA,EAAI,WAAU,sCACb,UAAA;AAAA,QAAAN,2BAAAA,IAACW,WAAAA,YAAA,EAAW,cAAW,mBAAkB,aAAa,aAAa,OAAO,SAAS,UAAU,WAAA,CAAY;AAAA,QACxG,SAASX,2BAAAA,IAAC,QAAA,EAAK,MAAK,SAAQ,WAAU,4BAA4B,UAAA,MAAA,CAAM;AAAA,MAAA,GAC3E;AAAA,MACAA,2BAAAA,IAACC,OAAAA,UAAO,MAAK,UAAS,MAAK,MAAK,SAAQ,WAAU,UAAA,UAAA,CAAO;AAAA,IAAA,GAC3D;AAAA,IACAK,2BAAAA,KAAC,OAAA,EAAI,WAAU,0DACb,UAAA;AAAA,MAAAN,2BAAAA,IAACC,OAAAA,QAAA,EAAO,MAAK,UAAS,MAAK,MAAK,SAAQ,SAAQ,SAAS,YAAY,UAAA,oBAAA,CAAiB;AAAA,MACtFD,2BAAAA,IAACC,OAAAA,QAAA,EAAO,MAAK,UAAS,MAAK,MAAK,SAAQ,SAAQ,SAAS,MAAM,UAAU,CAAA,CAAE,GAAG,UAAA,WAAA,CAAQ;AAAA,IAAA,EAAA,CACxF;AAAA,EAAA,GACF;AAEJ;AAEA,MAAM,gBAAiD,EAAE,MAAM,SAAS,MAAM,SAAS,OAAO,UAAU,UAAU,YAAA;AAYlH,SAAS,mBAAmB,EAAE,QAAQ,UAAU,SAAS,WAAW,aAA8B;AAChG,QAAM,SAASc,eAAAA,WAAW,MAAM,EAAE,WAAW;AAC7C,SACET,2BAAAA,KAAAU,qBAAA,EACE,UAAA;AAAA,IAAAhB,2BAAAA,IAAC,SAAI,WAAU,2BAA0B,MAAK,SAAQ,cAAW,UAC7D,WAAA,YAAY,CAAC,GAAGiB,yBAAmB,UAAmB,IAAIA,yBAAmB,IAAI,CAAC,SAAS;AAC3F,YAAM,KAAK,OAAO,SAAS,IAAI;AAC/B,YAAM,OAAO,MAAM,UAAU,SAAS;AACtC,aACEjB,2BAAAA;AAAAA,QAACC,OAAAA;AAAAA,QAAA;AAAA,UAAkB,MAAK;AAAA,UAAS,MAAK;AAAA,UAAK,SAAS,KAAK,cAAc;AAAA,UAAW,gBAAc;AAAA,UAAI,UAAU;AAAA,UAC5G,OAAO,OAAO,yCAAyC;AAAA,UAAW,SAAS,MAAM,SAASiB,eAAAA,aAAa,QAAQ,IAAI,CAAC;AAAA,UACnH,wBAAc,IAAI;AAAA,QAAA;AAAA,QAFR;AAAA,MAAA;AAAA,IAKjB,CAAC,EAAA,CACH;AAAA,mCACCX,OAAAA,QAAA,EAAO,SAAS,SAAS,OAAM,WAAU,UAAU,UAAA,CAAW;AAAA,EAAA,GACjE;AAEJ;AAUA,SAAS,sBAAsB,EAAE,cAAc,aAAa,aAAa,iBAAqC;AAC5G,yCACG,OAAA,EAAI,WAAU,6BAA4B,MAAK,SAAQ,cAAW,UACjE,UAAA;AAAA,IAAAP,2BAAAA,IAACmB,WAAAA,YAAA,EAAW,MAAMC,YAAAA,aAAa,OAAM,qBAAoB,WAAU,UAAS,UAAU,CAAC,cAAc,SAAS,YAAA,CAAa;AAAA,IAC3HpB,2BAAAA,IAACmB,WAAAA,YAAA,EAAW,MAAME,cAAAA,eAAe,OAAM,uBAAsB,WAAU,UAAS,UAAU,CAAC,aAAa,SAAS,cAAA,CAAe;AAAA,EAAA,GAClI;AAEJ;AAuBO,SAAS,iBAAiB,OAA8B;AAC7D,QAAM,EAAE,YAAY,KAAK,WAAA,IAAe;AACxC,QAAM,iBAAgB,yCAAY,OAAO,OAAO,CAAC,UAAU,MAAM,UAAU,WAAU;AACrF,QAAM,eAAc,yCAAY,OAAO,KAAK,CAAC,UAAU,MAAM,cAAa;AAC1E,QAAM,EAAE,MAAM,OAAA,IAAW,WAAW;AACpC,SACEf,2BAAAA,KAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,IAAAN,2BAAAA,IAACsB,iBAAAA,kBAAA,EAAiB,OAAO,MAAM,WAAW,SAAS,YAAY,UAAU,MAAM,aAAa,MAAK,MAAK,cAAW,aAAY;AAAA,IAC7HtB,2BAAAA,IAAC,cAAA,EAAa,OAAO,MAAM,OAAO,UAAU,MAAM,UAAU,UAAU,MAAM,QAAA,CAAS;AAAA,IACpF,MAAM,QAAQA,+BAAC,oBAAA,EAAoB,GAAG,MAAM,MAAM;AAAA,IAClD,OACCA,2BAAAA;AAAAA,MAACC,OAAAA;AAAAA,MAAA;AAAA,QAAO,MAAK;AAAA,QAAS,SAAS,IAAI,SAAS,cAAc;AAAA,QAAW,MAAK;AAAA,QAAK,UAAU,CAAC,IAAI,UAAU,CAAC,IAAI;AAAA,QAAQ,gBAAc,IAAI;AAAA,QACrI,OAAO,IAAI,SAAS,0DAA0D;AAAA,QAA8C,SAAS,MAAM,IAAI,MAAM,CAAC,IAAI,MAAM;AAAA,QAC/J,UAAA,IAAI,SAAS,eAAe;AAAA,MAAA;AAAA,IAAA;AAAA,IAGjCD,2BAAAA,IAACC,OAAAA,QAAA,EAAO,MAAK,UAAS,SAAQ,WAAU,MAAK,MAAK,SAAS,MAAM,OAAO,UAAA,MAAA,CAAG;AAAA,IAC3EK,2BAAAA,KAACL,OAAAA,QAAA,EAAO,MAAK,UAAS,SAAQ,WAAU,MAAK,MAAK,SAAS,MAAM,SAAS,UAAA;AAAA,MAAAD,2BAAAA,IAACuB,OAAAA,QAAA,EAAO;AAAA,MAAE;AAAA,IAAA,GAAK;AAAA,IACxF,MAAM,iBAAiBvB,+BAAC,uBAAA,EAAuB,GAAG,MAAM,eAAe;AAAA,IACvE,cAAc,eACbA,2BAAAA;AAAAA,MAACO,OAAAA;AAAAA,MAAA;AAAA,QAAO,SAAS,WAAW,QAAQ,SAASiB,iBAAAA,gBAAgB;AAAA,QAAG,UAAU,WAAW;AAAA,QAAM,OAAM;AAAA,QAC/F,UAAU,CAAC,WAAW,WAAW,UAAUC,iBAAAA,kBAAkB,WAAW,SAAS,MAAM,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,IAE3F,cACCzB,2BAAAA;AAAAA,MAAC0B,aAAAA;AAAAA,MAAA;AAAA,QAAa,MAAMC,SAAAA;AAAAA,QAAU,OAAO,GAAGC,2BAAW,MAAM,CAAC,GAAG,gBAAgB,KAAK,aAAa,eAAe,EAAE;AAAA,QAAI,SAAQ;AAAA,QAAU,MAAK;AAAA,QACzI,WAAW,GAAGA,gBAAAA,WAAW,IAAI,CAAC;AAAA,QAAe,OAAO,cAAc,MAAM;AAAA,QACvE,UAAA,MAAM5B,2BAAAA,IAAC,aAAA,EAAa,GAAG,WAAA,CAAY;AAAA,MAAA;AAAA,IAAA;AAAA,IAGxCM,2BAAAA,KAAC,OAAA,EAAI,WAAU,mCACZ,UAAA;AAAA,MAAA,MAAM,WAAWN,2BAAAA,IAAC,aAAA,EAAY,SAAS,MAAM,SAAS,MAAY;AAAA,MAClE,MAAM;AAAA,IAAA,EAAA,CACT;AAAA,EAAA,GACF;AAEJ;;"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { ExcludeMatcher } from './call-graph-exclude.js';
|
|
3
|
+
import { CallGraphVocabulary } from './call-graph-vocabulary.js';
|
|
4
|
+
import { CallGraphAccess, CallGraphDirection, CallGraphGroupFact, CallGraphOmitted } from './types.js';
|
|
5
|
+
export interface ExclusionsProps {
|
|
6
|
+
/** The patterns in force. */
|
|
7
|
+
exclude: string[];
|
|
8
|
+
groups: CallGraphGroupFact[];
|
|
9
|
+
matches: ExcludeMatcher;
|
|
10
|
+
onExclude: (patterns: string[]) => void;
|
|
11
|
+
onDefaults: () => void;
|
|
12
|
+
/** A graph for the last edit is loading: the facts describe the one before it, so editing waits. */
|
|
13
|
+
busy: boolean;
|
|
14
|
+
vocabulary: CallGraphVocabulary;
|
|
15
|
+
}
|
|
16
|
+
export interface DataAccessProps {
|
|
17
|
+
access: CallGraphAccess[];
|
|
18
|
+
onAccess: (access: CallGraphAccess[]) => void;
|
|
19
|
+
columns: boolean;
|
|
20
|
+
onColumns: (columns: boolean) => void;
|
|
21
|
+
/** Offers the Variables toggle, on top of the access types. */
|
|
22
|
+
variables?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface GroupCollapseProps {
|
|
25
|
+
anyCollapsed: boolean;
|
|
26
|
+
anyExpanded: boolean;
|
|
27
|
+
onExpandAll: () => void;
|
|
28
|
+
onCollapseAll: () => void;
|
|
29
|
+
}
|
|
30
|
+
export interface CallGraphToolbarProps {
|
|
31
|
+
/** Shown only when the host's graph has reads and writes. */
|
|
32
|
+
data?: DataAccessProps | undefined;
|
|
33
|
+
/** Shown only when the graph draws a group that can collapse. */
|
|
34
|
+
groupCollapse?: GroupCollapseProps | undefined;
|
|
35
|
+
direction: CallGraphDirection;
|
|
36
|
+
depth: number;
|
|
37
|
+
maxDepth: number;
|
|
38
|
+
/** Shown only when the host keeps a root across selection changes. */
|
|
39
|
+
pin?: {
|
|
40
|
+
pinned: boolean;
|
|
41
|
+
canPin: boolean;
|
|
42
|
+
onPin: (pinned: boolean) => void;
|
|
43
|
+
} | undefined;
|
|
44
|
+
exclusions?: ExclusionsProps | undefined;
|
|
45
|
+
omitted?: CallGraphOmitted | undefined;
|
|
46
|
+
/** Host content at the toolbar's end, such as server timing. */
|
|
47
|
+
end?: ReactNode;
|
|
48
|
+
onDirection: (direction: CallGraphDirection) => void;
|
|
49
|
+
onDepth: (depth: number) => void;
|
|
50
|
+
onFit: () => void;
|
|
51
|
+
onReset: () => void;
|
|
52
|
+
vocabulary: CallGraphVocabulary;
|
|
53
|
+
}
|
|
54
|
+
export declare function CallGraphToolbar(props: CallGraphToolbarProps): import("react").JSX.Element;
|
|
55
|
+
//# sourceMappingURL=CallGraphToolbar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CallGraphToolbar.d.ts","sourceRoot":"","sources":["../../../src/data/call-graph/CallGraphToolbar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AASjE,OAAO,EAQL,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAqB,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AA+B3I,MAAM,WAAW,eAAe;IAC9B,6BAA6B;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACxC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,oGAAoG;IACpG,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,mBAAmB,CAAC;CACjC;AAuED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,+DAA+D;IAC/D,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAwBD,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AAYD,MAAM,WAAW,qBAAqB;IACpC,6DAA6D;IAC7D,IAAI,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACnC,iEAAiE;IACjE,aAAa,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAC/C,SAAS,EAAE,kBAAkB,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,GAAG,CAAC,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,GAAG,SAAS,CAAC;IACzF,UAAU,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACzC,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACvC,gEAAgE;IAChE,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,WAAW,EAAE,CAAC,SAAS,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACrD,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,EAAE,mBAAmB,CAAC;CACjC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,+BAmC5D"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { Button } from "../../components/button.js";
|
|
4
|
+
import { IconButton } from "../../components/IconButton.js";
|
|
5
|
+
import { InputField } from "../../components/InputField.js";
|
|
6
|
+
import { SegmentedControl } from "../../components/SegmentedControl.js";
|
|
7
|
+
import { Switch } from "../../components/Switch.js";
|
|
8
|
+
import { DropdownMenu } from "../../overlay/DropdownMenu.js";
|
|
9
|
+
import { Badge } from "../Badge.js";
|
|
10
|
+
import { setExternalHidden, EXCLUDE_EXTERNAL, removeExcludePattern, includeGroup, excludeGroup, excludePatternError, addExcludePattern } from "./call-graph-exclude.js";
|
|
11
|
+
import { capitalize, omittedParts, excludedTally } from "./call-graph-labels.js";
|
|
12
|
+
import { baseAccess, toggleAccess } from "./call-graph-model.js";
|
|
13
|
+
import { CALL_GRAPH_ACCESS } from "./types.js";
|
|
14
|
+
import { UiHome } from "../../icons/components/UiHome.js";
|
|
15
|
+
import { UiFilter } from "../../icons/components/UiFilter.js";
|
|
16
|
+
import { UiExpandAll } from "../../icons/components/UiExpandAll.js";
|
|
17
|
+
import { UiCollapseAll } from "../../icons/components/UiCollapseAll.js";
|
|
18
|
+
import { UiWarningTriangle } from "../../icons/components/UiWarningTriangle.js";
|
|
19
|
+
const DIRECTIONS = [
|
|
20
|
+
{ id: "callers", label: "Callers" },
|
|
21
|
+
{ id: "both", label: "Both" },
|
|
22
|
+
{ id: "callees", label: "Callees" }
|
|
23
|
+
];
|
|
24
|
+
function DepthStepper({ depth, maxDepth, onChange }) {
|
|
25
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", role: "group", "aria-label": "Depth", children: [
|
|
26
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: "Depth" }),
|
|
27
|
+
/* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", size: "sm", className: "size-8 px-0", "aria-label": "Decrease depth", disabled: depth <= 1, onClick: () => onChange(depth - 1), children: "−" }),
|
|
28
|
+
/* @__PURE__ */ jsx("output", { className: "w-5 text-center text-sm font-medium tabular-nums", "aria-live": "polite", "aria-label": "Graph depth", children: depth }),
|
|
29
|
+
/* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", size: "sm", className: "size-8 px-0", "aria-label": "Increase depth", disabled: depth >= maxDepth, onClick: () => onChange(depth + 1), children: "+" })
|
|
30
|
+
] });
|
|
31
|
+
}
|
|
32
|
+
function OmittedChip({ omitted, noun }) {
|
|
33
|
+
const parts = omittedParts(omitted);
|
|
34
|
+
if (parts.length === 0) return null;
|
|
35
|
+
const tally = excludedTally(omitted).map(({ group, count }) => `${group}: ${count}`);
|
|
36
|
+
const title = [`Not drawn: ${parts.join(", ")}`, ...tally.length ? [`Excluded per ${noun}:`, ...tally] : []].join("\n");
|
|
37
|
+
return /* @__PURE__ */ jsx("span", { title, "data-testid": "graph-omitted", children: /* @__PURE__ */ jsx(Badge, { tone: "warning", size: "md", icon: UiWarningTriangle, clickToCopy: false, children: parts.join(" · ") }) });
|
|
38
|
+
}
|
|
39
|
+
function GroupRow({ group, onToggle }) {
|
|
40
|
+
const name = group.label ?? group.name;
|
|
41
|
+
return /* @__PURE__ */ jsxs("li", { className: "flex items-center gap-2 py-1", children: [
|
|
42
|
+
/* @__PURE__ */ jsx(Switch, { checked: !group.excluded, onChange: onToggle, "aria-label": `Show ${name}` }),
|
|
43
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate font-mono text-xs", title: group.name, children: name }),
|
|
44
|
+
group.external && /* @__PURE__ */ jsx(Badge, { variant: "outline", size: "sm", clickToCopy: false, children: "external" }),
|
|
45
|
+
/* @__PURE__ */ jsx("span", { className: "w-8 shrink-0 text-right text-xs tabular-nums text-muted-foreground", title: `${group.nodes} nodes`, children: group.nodes })
|
|
46
|
+
] });
|
|
47
|
+
}
|
|
48
|
+
function GroupFacets({ exclude, groups, matches, onExclude, onDefaults, busy, vocabulary }) {
|
|
49
|
+
const [filter, setFilter] = useState("");
|
|
50
|
+
const [pattern, setPattern] = useState("");
|
|
51
|
+
const [error, setError] = useState();
|
|
52
|
+
const { plural, patternHint } = vocabulary.group;
|
|
53
|
+
const needle = filter.trim().toLowerCase();
|
|
54
|
+
const shown = groups.filter((group) => `${group.name} ${group.label ?? ""}`.toLowerCase().includes(needle));
|
|
55
|
+
const submit = (event) => {
|
|
56
|
+
event.preventDefault();
|
|
57
|
+
const typed = pattern.trim();
|
|
58
|
+
const problem = excludePatternError(exclude, typed);
|
|
59
|
+
setError(problem);
|
|
60
|
+
if (problem) return;
|
|
61
|
+
setPattern("");
|
|
62
|
+
onExclude(addExcludePattern(exclude, typed));
|
|
63
|
+
};
|
|
64
|
+
return /* @__PURE__ */ jsxs("fieldset", { disabled: busy, "aria-busy": busy, className: "flex w-96 min-w-0 max-w-[90vw] flex-col gap-2 p-2 text-sm", children: [
|
|
65
|
+
/* @__PURE__ */ jsx(InputField, { "aria-label": `Filter ${plural}`, placeholder: `Filter ${plural}`, value: filter, onChange: setFilter }),
|
|
66
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-1", "aria-label": "Exclusion patterns", children: [
|
|
67
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: "Excluding" }),
|
|
68
|
+
exclude.length === 0 && /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: "nothing" }),
|
|
69
|
+
exclude.map((entry) => /* @__PURE__ */ jsxs(
|
|
70
|
+
"button",
|
|
71
|
+
{
|
|
72
|
+
type: "button",
|
|
73
|
+
className: "rounded border border-border px-1.5 font-mono text-xs hover:bg-muted",
|
|
74
|
+
"aria-label": `Stop excluding ${entry}`,
|
|
75
|
+
title: `Stop excluding ${entry}`,
|
|
76
|
+
onClick: () => onExclude(removeExcludePattern(exclude, entry)),
|
|
77
|
+
children: [
|
|
78
|
+
entry,
|
|
79
|
+
" ×"
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
entry
|
|
83
|
+
))
|
|
84
|
+
] }),
|
|
85
|
+
/* @__PURE__ */ jsxs("ul", { className: "max-h-72 overflow-y-auto pr-1", "aria-label": plural, children: [
|
|
86
|
+
shown.map((group) => /* @__PURE__ */ jsx(
|
|
87
|
+
GroupRow,
|
|
88
|
+
{
|
|
89
|
+
group,
|
|
90
|
+
onToggle: () => onExclude(group.excluded ? includeGroup(exclude, group, groups, matches) : excludeGroup(exclude, group.name))
|
|
91
|
+
},
|
|
92
|
+
group.name
|
|
93
|
+
)),
|
|
94
|
+
shown.length === 0 && /* @__PURE__ */ jsx("li", { className: "py-1 text-xs text-muted-foreground", children: groups.length ? `No ${vocabulary.group.noun} matches the filter.` : `The graph reached no ${vocabulary.group.noun}.` })
|
|
95
|
+
] }),
|
|
96
|
+
/* @__PURE__ */ jsxs("form", { className: "flex items-start gap-2", onSubmit: submit, children: [
|
|
97
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [
|
|
98
|
+
/* @__PURE__ */ jsx(InputField, { "aria-label": "Exclude pattern", placeholder: patternHint, value: pattern, onChange: setPattern }),
|
|
99
|
+
error && /* @__PURE__ */ jsx("span", { role: "alert", className: "text-xs text-destructive", children: error })
|
|
100
|
+
] }),
|
|
101
|
+
/* @__PURE__ */ jsx(Button, { type: "submit", size: "sm", variant: "outline", children: "Exclude" })
|
|
102
|
+
] }),
|
|
103
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between gap-2 border-t border-border pt-2", children: [
|
|
104
|
+
/* @__PURE__ */ jsx(Button, { type: "button", size: "sm", variant: "ghost", onClick: onDefaults, children: "Reset to defaults" }),
|
|
105
|
+
/* @__PURE__ */ jsx(Button, { type: "button", size: "sm", variant: "ghost", onClick: () => onExclude([]), children: "Show all" })
|
|
106
|
+
] })
|
|
107
|
+
] });
|
|
108
|
+
}
|
|
109
|
+
const ACCESS_LABELS = { call: "Calls", read: "Reads", write: "Writes", variable: "Variables" };
|
|
110
|
+
function DataAccessControls({ access, onAccess, columns, onColumns, variables }) {
|
|
111
|
+
const lastOn = baseAccess(access).length === 1;
|
|
112
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
113
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-1", role: "group", "aria-label": "Access", children: (variables ? [...CALL_GRAPH_ACCESS, "variable"] : CALL_GRAPH_ACCESS).map((type) => {
|
|
114
|
+
const on = access.includes(type);
|
|
115
|
+
const kept = on && lastOn && type !== "variable";
|
|
116
|
+
return /* @__PURE__ */ jsx(
|
|
117
|
+
Button,
|
|
118
|
+
{
|
|
119
|
+
type: "button",
|
|
120
|
+
size: "sm",
|
|
121
|
+
variant: on ? "secondary" : "outline",
|
|
122
|
+
"aria-pressed": on,
|
|
123
|
+
disabled: kept,
|
|
124
|
+
title: kept ? "At least one kind of access stays on" : void 0,
|
|
125
|
+
onClick: () => onAccess(toggleAccess(access, type)),
|
|
126
|
+
children: ACCESS_LABELS[type]
|
|
127
|
+
},
|
|
128
|
+
type
|
|
129
|
+
);
|
|
130
|
+
}) }),
|
|
131
|
+
/* @__PURE__ */ jsx(Switch, { checked: columns, label: "Columns", onChange: onColumns })
|
|
132
|
+
] });
|
|
133
|
+
}
|
|
134
|
+
function GroupCollapseControls({ anyCollapsed, anyExpanded, onExpandAll, onCollapseAll }) {
|
|
135
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-0.5", role: "group", "aria-label": "Groups", children: [
|
|
136
|
+
/* @__PURE__ */ jsx(IconButton, { icon: UiExpandAll, label: "Expand all groups", className: "size-7", disabled: !anyCollapsed, onClick: onExpandAll }),
|
|
137
|
+
/* @__PURE__ */ jsx(IconButton, { icon: UiCollapseAll, label: "Collapse all groups", className: "size-7", disabled: !anyExpanded, onClick: onCollapseAll })
|
|
138
|
+
] });
|
|
139
|
+
}
|
|
140
|
+
function CallGraphToolbar(props) {
|
|
141
|
+
const { exclusions, pin, vocabulary } = props;
|
|
142
|
+
const excludedCount = (exclusions == null ? void 0 : exclusions.groups.filter((group) => group.excluded).length) ?? 0;
|
|
143
|
+
const hasExternal = (exclusions == null ? void 0 : exclusions.groups.some((group) => group.external)) ?? false;
|
|
144
|
+
const { noun, plural } = vocabulary.group;
|
|
145
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
|
|
146
|
+
/* @__PURE__ */ jsx(SegmentedControl, { value: props.direction, options: DIRECTIONS, onChange: props.onDirection, size: "sm", "aria-label": "Direction" }),
|
|
147
|
+
/* @__PURE__ */ jsx(DepthStepper, { depth: props.depth, maxDepth: props.maxDepth, onChange: props.onDepth }),
|
|
148
|
+
props.data && /* @__PURE__ */ jsx(DataAccessControls, { ...props.data }),
|
|
149
|
+
pin && /* @__PURE__ */ jsx(
|
|
150
|
+
Button,
|
|
151
|
+
{
|
|
152
|
+
type: "button",
|
|
153
|
+
variant: pin.pinned ? "secondary" : "outline",
|
|
154
|
+
size: "sm",
|
|
155
|
+
disabled: !pin.pinned && !pin.canPin,
|
|
156
|
+
"aria-pressed": pin.pinned,
|
|
157
|
+
title: pin.pinned ? "The graph keeps this root while the selection changes" : "Keep this root while the selection changes",
|
|
158
|
+
onClick: () => pin.onPin(!pin.pinned),
|
|
159
|
+
children: pin.pinned ? "Unpin root" : "Pin root"
|
|
160
|
+
}
|
|
161
|
+
),
|
|
162
|
+
/* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: props.onFit, children: "Fit" }),
|
|
163
|
+
/* @__PURE__ */ jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: props.onReset, children: [
|
|
164
|
+
/* @__PURE__ */ jsx(UiHome, {}),
|
|
165
|
+
"Reset"
|
|
166
|
+
] }),
|
|
167
|
+
props.groupCollapse && /* @__PURE__ */ jsx(GroupCollapseControls, { ...props.groupCollapse }),
|
|
168
|
+
exclusions && hasExternal && /* @__PURE__ */ jsx(
|
|
169
|
+
Switch,
|
|
170
|
+
{
|
|
171
|
+
checked: exclusions.exclude.includes(EXCLUDE_EXTERNAL),
|
|
172
|
+
disabled: exclusions.busy,
|
|
173
|
+
label: "Hide all external",
|
|
174
|
+
onChange: (hidden) => exclusions.onExclude(setExternalHidden(exclusions.exclude, hidden))
|
|
175
|
+
}
|
|
176
|
+
),
|
|
177
|
+
exclusions && /* @__PURE__ */ jsx(
|
|
178
|
+
DropdownMenu,
|
|
179
|
+
{
|
|
180
|
+
icon: UiFilter,
|
|
181
|
+
label: `${capitalize(plural)}${excludedCount ? ` (${excludedCount} excluded)` : ""}`,
|
|
182
|
+
variant: "outline",
|
|
183
|
+
size: "sm",
|
|
184
|
+
menuLabel: `${capitalize(noun)} exclusions`,
|
|
185
|
+
title: `Choose the ${plural} the graph leaves out`,
|
|
186
|
+
children: () => /* @__PURE__ */ jsx(GroupFacets, { ...exclusions })
|
|
187
|
+
}
|
|
188
|
+
),
|
|
189
|
+
/* @__PURE__ */ jsxs("div", { className: "ml-auto flex items-center gap-2", children: [
|
|
190
|
+
props.omitted && /* @__PURE__ */ jsx(OmittedChip, { omitted: props.omitted, noun }),
|
|
191
|
+
props.end
|
|
192
|
+
] })
|
|
193
|
+
] });
|
|
194
|
+
}
|
|
195
|
+
export {
|
|
196
|
+
CallGraphToolbar
|
|
197
|
+
};
|
|
198
|
+
//# sourceMappingURL=CallGraphToolbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CallGraphToolbar.js","sources":["../../../src/data/call-graph/CallGraphToolbar.tsx"],"sourcesContent":["import { useState, type FormEvent, type ReactNode } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { IconButton } from \"../../components/IconButton\";\nimport { InputField } from \"../../components/InputField\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport { Switch } from \"../../components/Switch\";\nimport { UiCollapseAll, UiExpandAll, UiFilter, UiHome, UiWarningTriangle } from \"../../icons\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Badge } from \"../Badge\";\nimport {\n addExcludePattern,\n EXCLUDE_EXTERNAL,\n excludeGroup,\n excludePatternError,\n includeGroup,\n removeExcludePattern,\n setExternalHidden,\n type ExcludeMatcher,\n} from \"./call-graph-exclude\";\nimport { capitalize, excludedTally, omittedParts } from \"./call-graph-labels\";\nimport { baseAccess, toggleAccess } from \"./call-graph-model\";\nimport type { CallGraphVocabulary } from \"./call-graph-vocabulary\";\nimport { CALL_GRAPH_ACCESS, type CallGraphAccess, type CallGraphDirection, type CallGraphGroupFact, type CallGraphOmitted } from \"./types\";\n\nconst DIRECTIONS: { id: CallGraphDirection; label: string }[] = [\n { id: \"callers\", label: \"Callers\" },\n { id: \"both\", label: \"Both\" },\n { id: \"callees\", label: \"Callees\" },\n];\n\nfunction DepthStepper({ depth, maxDepth, onChange }: { depth: number; maxDepth: number; onChange: (depth: number) => void }) {\n return (\n <div className=\"flex items-center gap-1\" role=\"group\" aria-label=\"Depth\">\n <span className=\"text-xs text-muted-foreground\">Depth</span>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"size-8 px-0\" aria-label=\"Decrease depth\" disabled={depth <= 1} onClick={() => onChange(depth - 1)}>−</Button>\n <output className=\"w-5 text-center text-sm font-medium tabular-nums\" aria-live=\"polite\" aria-label=\"Graph depth\">{depth}</output>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"size-8 px-0\" aria-label=\"Increase depth\" disabled={depth >= maxDepth} onClick={() => onChange(depth + 1)}>+</Button>\n </div>\n );\n}\n\nfunction OmittedChip({ omitted, noun }: { omitted: CallGraphOmitted; noun: string }) {\n const parts = omittedParts(omitted);\n if (parts.length === 0) return null;\n const tally = excludedTally(omitted).map(({ group, count }) => `${group}: ${count}`);\n const title = [`Not drawn: ${parts.join(\", \")}`, ...(tally.length ? [`Excluded per ${noun}:`, ...tally] : [])].join(\"\\n\");\n return (\n <span title={title} data-testid=\"graph-omitted\">\n <Badge tone=\"warning\" size=\"md\" icon={UiWarningTriangle} clickToCopy={false}>{parts.join(\" · \")}</Badge>\n </span>\n );\n}\n\nexport interface ExclusionsProps {\n /** The patterns in force. */\n exclude: string[];\n groups: CallGraphGroupFact[];\n matches: ExcludeMatcher;\n onExclude: (patterns: string[]) => void;\n onDefaults: () => void;\n /** A graph for the last edit is loading: the facts describe the one before it, so editing waits. */\n busy: boolean;\n vocabulary: CallGraphVocabulary;\n}\n\nfunction GroupRow({ group, onToggle }: { group: CallGraphGroupFact; onToggle: () => void }) {\n const name = group.label ?? group.name;\n return (\n <li className=\"flex items-center gap-2 py-1\">\n <Switch checked={!group.excluded} onChange={onToggle} aria-label={`Show ${name}`} />\n <span className=\"min-w-0 flex-1 truncate font-mono text-xs\" title={group.name}>{name}</span>\n {group.external && <Badge variant=\"outline\" size=\"sm\" clickToCopy={false}>external</Badge>}\n <span className=\"w-8 shrink-0 text-right text-xs tabular-nums text-muted-foreground\" title={`${group.nodes} nodes`}>{group.nodes}</span>\n </li>\n );\n}\n\n/** The group facets: one switch per group the walk reached, the patterns in force, and free-text patterns. */\nfunction GroupFacets({ exclude, groups, matches, onExclude, onDefaults, busy, vocabulary }: ExclusionsProps) {\n const [filter, setFilter] = useState(\"\");\n const [pattern, setPattern] = useState(\"\");\n const [error, setError] = useState<string>();\n const { plural, patternHint } = vocabulary.group;\n const needle = filter.trim().toLowerCase();\n const shown = groups.filter((group) => `${group.name} ${group.label ?? \"\"}`.toLowerCase().includes(needle));\n const submit = (event: FormEvent) => {\n event.preventDefault();\n const typed = pattern.trim();\n const problem = excludePatternError(exclude, typed);\n setError(problem);\n if (problem) return;\n setPattern(\"\");\n onExclude(addExcludePattern(exclude, typed));\n };\n // The filter box comes first: the menu focuses its first control on opening, which must not be one that drops an exclusion.\n return (\n <fieldset disabled={busy} aria-busy={busy} className=\"flex w-96 min-w-0 max-w-[90vw] flex-col gap-2 p-2 text-sm\">\n <InputField aria-label={`Filter ${plural}`} placeholder={`Filter ${plural}`} value={filter} onChange={setFilter} />\n <div className=\"flex flex-wrap items-center gap-1\" aria-label=\"Exclusion patterns\">\n <span className=\"text-xs text-muted-foreground\">Excluding</span>\n {exclude.length === 0 && <span className=\"text-xs text-muted-foreground\">nothing</span>}\n {exclude.map((entry) => (\n <button key={entry} type=\"button\" className=\"rounded border border-border px-1.5 font-mono text-xs hover:bg-muted\"\n aria-label={`Stop excluding ${entry}`} title={`Stop excluding ${entry}`} onClick={() => onExclude(removeExcludePattern(exclude, entry))}>\n {entry} ×\n </button>\n ))}\n </div>\n <ul className=\"max-h-72 overflow-y-auto pr-1\" aria-label={plural}>\n {shown.map((group) => (\n <GroupRow key={group.name} group={group}\n onToggle={() => onExclude(group.excluded ? includeGroup(exclude, group, groups, matches) : excludeGroup(exclude, group.name))} />\n ))}\n {shown.length === 0 && (\n <li className=\"py-1 text-xs text-muted-foreground\">{groups.length ? `No ${vocabulary.group.noun} matches the filter.` : `The graph reached no ${vocabulary.group.noun}.`}</li>\n )}\n </ul>\n <form className=\"flex items-start gap-2\" onSubmit={submit}>\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <InputField aria-label=\"Exclude pattern\" placeholder={patternHint} value={pattern} onChange={setPattern} />\n {error && <span role=\"alert\" className=\"text-xs text-destructive\">{error}</span>}\n </div>\n <Button type=\"submit\" size=\"sm\" variant=\"outline\">Exclude</Button>\n </form>\n <div className=\"flex justify-between gap-2 border-t border-border pt-2\">\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={onDefaults}>Reset to defaults</Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={() => onExclude([])}>Show all</Button>\n </div>\n </fieldset>\n );\n}\n\nconst ACCESS_LABELS: Record<CallGraphAccess, string> = { call: \"Calls\", read: \"Reads\", write: \"Writes\", variable: \"Variables\" };\n\nexport interface DataAccessProps {\n access: CallGraphAccess[];\n onAccess: (access: CallGraphAccess[]) => void;\n columns: boolean;\n onColumns: (columns: boolean) => void;\n /** Offers the Variables toggle, on top of the access types. */\n variables?: boolean;\n}\n\n/** Which edge types the graph follows, at least one of calls, reads and writes, and whether columns and fields are nodes of their own. */\nfunction DataAccessControls({ access, onAccess, columns, onColumns, variables }: DataAccessProps) {\n const lastOn = baseAccess(access).length === 1;\n return (\n <>\n <div className=\"flex items-center gap-1\" role=\"group\" aria-label=\"Access\">\n {(variables ? [...CALL_GRAPH_ACCESS, \"variable\" as const] : CALL_GRAPH_ACCESS).map((type) => {\n const on = access.includes(type);\n const kept = on && lastOn && type !== \"variable\";\n return (\n <Button key={type} type=\"button\" size=\"sm\" variant={on ? \"secondary\" : \"outline\"} aria-pressed={on} disabled={kept}\n title={kept ? \"At least one kind of access stays on\" : undefined} onClick={() => onAccess(toggleAccess(access, type))}>\n {ACCESS_LABELS[type]}\n </Button>\n );\n })}\n </div>\n <Switch checked={columns} label=\"Columns\" onChange={onColumns} />\n </>\n );\n}\n\nexport interface GroupCollapseProps {\n anyCollapsed: boolean;\n anyExpanded: boolean;\n onExpandAll: () => void;\n onCollapseAll: () => void;\n}\n\n/** Expand or collapse every group the graph draws at once. */\nfunction GroupCollapseControls({ anyCollapsed, anyExpanded, onExpandAll, onCollapseAll }: GroupCollapseProps) {\n return (\n <div className=\"flex items-center gap-0.5\" role=\"group\" aria-label=\"Groups\">\n <IconButton icon={UiExpandAll} label=\"Expand all groups\" className=\"size-7\" disabled={!anyCollapsed} onClick={onExpandAll} />\n <IconButton icon={UiCollapseAll} label=\"Collapse all groups\" className=\"size-7\" disabled={!anyExpanded} onClick={onCollapseAll} />\n </div>\n );\n}\n\nexport interface CallGraphToolbarProps {\n /** Shown only when the host's graph has reads and writes. */\n data?: DataAccessProps | undefined;\n /** Shown only when the graph draws a group that can collapse. */\n groupCollapse?: GroupCollapseProps | undefined;\n direction: CallGraphDirection;\n depth: number;\n maxDepth: number;\n /** Shown only when the host keeps a root across selection changes. */\n pin?: { pinned: boolean; canPin: boolean; onPin: (pinned: boolean) => void } | undefined;\n exclusions?: ExclusionsProps | undefined;\n omitted?: CallGraphOmitted | undefined;\n /** Host content at the toolbar's end, such as server timing. */\n end?: ReactNode;\n onDirection: (direction: CallGraphDirection) => void;\n onDepth: (depth: number) => void;\n onFit: () => void;\n onReset: () => void;\n vocabulary: CallGraphVocabulary;\n}\n\nexport function CallGraphToolbar(props: CallGraphToolbarProps) {\n const { exclusions, pin, vocabulary } = props;\n const excludedCount = exclusions?.groups.filter((group) => group.excluded).length ?? 0;\n const hasExternal = exclusions?.groups.some((group) => group.external) ?? false;\n const { noun, plural } = vocabulary.group;\n return (\n <div className=\"flex flex-wrap items-center gap-3\">\n <SegmentedControl value={props.direction} options={DIRECTIONS} onChange={props.onDirection} size=\"sm\" aria-label=\"Direction\" />\n <DepthStepper depth={props.depth} maxDepth={props.maxDepth} onChange={props.onDepth} />\n {props.data && <DataAccessControls {...props.data} />}\n {pin && (\n <Button type=\"button\" variant={pin.pinned ? \"secondary\" : \"outline\"} size=\"sm\" disabled={!pin.pinned && !pin.canPin} aria-pressed={pin.pinned}\n title={pin.pinned ? \"The graph keeps this root while the selection changes\" : \"Keep this root while the selection changes\"} onClick={() => pin.onPin(!pin.pinned)}>\n {pin.pinned ? \"Unpin root\" : \"Pin root\"}\n </Button>\n )}\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={props.onFit}>Fit</Button>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={props.onReset}><UiHome />Reset</Button>\n {props.groupCollapse && <GroupCollapseControls {...props.groupCollapse} />}\n {exclusions && hasExternal && (\n <Switch checked={exclusions.exclude.includes(EXCLUDE_EXTERNAL)} disabled={exclusions.busy} label=\"Hide all external\"\n onChange={(hidden) => exclusions.onExclude(setExternalHidden(exclusions.exclude, hidden))} />\n )}\n {exclusions && (\n <DropdownMenu icon={UiFilter} label={`${capitalize(plural)}${excludedCount ? ` (${excludedCount} excluded)` : \"\"}`} variant=\"outline\" size=\"sm\"\n menuLabel={`${capitalize(noun)} exclusions`} title={`Choose the ${plural} the graph leaves out`}>\n {() => <GroupFacets {...exclusions} />}\n </DropdownMenu>\n )}\n <div className=\"ml-auto flex items-center gap-2\">\n {props.omitted && <OmittedChip omitted={props.omitted} noun={noun} />}\n {props.end}\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|