@flowdrop/flowdrop 1.0.0
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/LICENSE +21 -0
- package/README.md +252 -0
- package/dist/adapters/WorkflowAdapter.d.ts +167 -0
- package/dist/adapters/WorkflowAdapter.js +368 -0
- package/dist/adapters/agentspec/AgentSpecAdapter.d.ts +96 -0
- package/dist/adapters/agentspec/AgentSpecAdapter.js +626 -0
- package/dist/adapters/agentspec/agentAdapter.d.ts +59 -0
- package/dist/adapters/agentspec/agentAdapter.js +91 -0
- package/dist/adapters/agentspec/autoLayout.d.ts +34 -0
- package/dist/adapters/agentspec/autoLayout.js +127 -0
- package/dist/adapters/agentspec/componentTypeDefaults.d.ts +73 -0
- package/dist/adapters/agentspec/componentTypeDefaults.js +238 -0
- package/dist/adapters/agentspec/defaultNodeTypes.d.ts +53 -0
- package/dist/adapters/agentspec/defaultNodeTypes.js +561 -0
- package/dist/adapters/agentspec/index.d.ts +37 -0
- package/dist/adapters/agentspec/index.js +39 -0
- package/dist/adapters/agentspec/validator.d.ts +34 -0
- package/dist/adapters/agentspec/validator.js +169 -0
- package/dist/api/enhanced-client.d.ts +183 -0
- package/dist/api/enhanced-client.js +430 -0
- package/dist/components/App.svelte +981 -0
- package/dist/components/App.svelte.d.ts +54 -0
- package/dist/components/CanvasBanner.stories.svelte +29 -0
- package/dist/components/CanvasBanner.stories.svelte.d.ts +27 -0
- package/dist/components/CanvasBanner.svelte +57 -0
- package/dist/components/CanvasBanner.svelte.d.ts +8 -0
- package/dist/components/ConfigForm.svelte +1138 -0
- package/dist/components/ConfigForm.svelte.d.ts +44 -0
- package/dist/components/ConfigModal.svelte +188 -0
- package/dist/components/ConfigModal.svelte.d.ts +13 -0
- package/dist/components/ConfigPanel.stories.svelte +47 -0
- package/dist/components/ConfigPanel.stories.svelte.d.ts +27 -0
- package/dist/components/ConfigPanel.svelte +182 -0
- package/dist/components/ConfigPanel.svelte.d.ts +32 -0
- package/dist/components/ConnectionLine.svelte +32 -0
- package/dist/components/ConnectionLine.svelte.d.ts +3 -0
- package/dist/components/EdgeRefresher.svelte +41 -0
- package/dist/components/EdgeRefresher.svelte.d.ts +9 -0
- package/dist/components/FlowDropZone.svelte +83 -0
- package/dist/components/FlowDropZone.svelte.d.ts +13 -0
- package/dist/components/LoadingSpinner.stories.svelte +30 -0
- package/dist/components/LoadingSpinner.stories.svelte.d.ts +27 -0
- package/dist/components/LoadingSpinner.svelte +36 -0
- package/dist/components/LoadingSpinner.svelte.d.ts +8 -0
- package/dist/components/Logo.stories.svelte +22 -0
- package/dist/components/Logo.stories.svelte.d.ts +27 -0
- package/dist/components/Logo.svelte +102 -0
- package/dist/components/Logo.svelte.d.ts +26 -0
- package/dist/components/LogsSidebar.svelte +563 -0
- package/dist/components/LogsSidebar.svelte.d.ts +17 -0
- package/dist/components/MarkdownDisplay.stories.svelte +36 -0
- package/dist/components/MarkdownDisplay.stories.svelte.d.ts +27 -0
- package/dist/components/MarkdownDisplay.svelte +29 -0
- package/dist/components/MarkdownDisplay.svelte.d.ts +7 -0
- package/dist/components/Navbar.stories.svelte +53 -0
- package/dist/components/Navbar.stories.svelte.d.ts +27 -0
- package/dist/components/Navbar.svelte +726 -0
- package/dist/components/Navbar.svelte.d.ts +29 -0
- package/dist/components/NodeSidebar.svelte +762 -0
- package/dist/components/NodeSidebar.svelte.d.ts +9 -0
- package/dist/components/NodeStatusOverlay.stories.svelte +85 -0
- package/dist/components/NodeStatusOverlay.stories.svelte.d.ts +27 -0
- package/dist/components/NodeStatusOverlay.svelte +327 -0
- package/dist/components/NodeStatusOverlay.svelte.d.ts +11 -0
- package/dist/components/PipelineStatus.svelte +314 -0
- package/dist/components/PipelineStatus.svelte.d.ts +20 -0
- package/dist/components/PortCoordinateTracker.svelte +58 -0
- package/dist/components/PortCoordinateTracker.svelte.d.ts +12 -0
- package/dist/components/ReadOnlyDetails.svelte +170 -0
- package/dist/components/ReadOnlyDetails.svelte.d.ts +25 -0
- package/dist/components/SchemaForm.stories.svelte +116 -0
- package/dist/components/SchemaForm.stories.svelte.d.ts +27 -0
- package/dist/components/SchemaForm.svelte +536 -0
- package/dist/components/SchemaForm.svelte.d.ts +83 -0
- package/dist/components/SettingsModal.svelte +279 -0
- package/dist/components/SettingsModal.svelte.d.ts +23 -0
- package/dist/components/SettingsPanel.svelte +638 -0
- package/dist/components/SettingsPanel.svelte.d.ts +21 -0
- package/dist/components/StatusIcon.stories.svelte +60 -0
- package/dist/components/StatusIcon.stories.svelte.d.ts +27 -0
- package/dist/components/StatusIcon.svelte +119 -0
- package/dist/components/StatusIcon.svelte.d.ts +10 -0
- package/dist/components/StatusLabel.stories.svelte +17 -0
- package/dist/components/StatusLabel.stories.svelte.d.ts +27 -0
- package/dist/components/StatusLabel.svelte +33 -0
- package/dist/components/StatusLabel.svelte.d.ts +7 -0
- package/dist/components/ThemeToggle.stories.svelte +25 -0
- package/dist/components/ThemeToggle.stories.svelte.d.ts +27 -0
- package/dist/components/ThemeToggle.svelte +185 -0
- package/dist/components/ThemeToggle.svelte.d.ts +14 -0
- package/dist/components/UniversalNode.svelte +155 -0
- package/dist/components/UniversalNode.svelte.d.ts +15 -0
- package/dist/components/WorkflowEditor.svelte +1035 -0
- package/dist/components/WorkflowEditor.svelte.d.ts +23 -0
- package/dist/components/form/FormArray.svelte +1049 -0
- package/dist/components/form/FormArray.svelte.d.ts +22 -0
- package/dist/components/form/FormAutocomplete.svelte +1009 -0
- package/dist/components/form/FormAutocomplete.svelte.d.ts +25 -0
- package/dist/components/form/FormCheckboxGroup.stories.svelte +28 -0
- package/dist/components/form/FormCheckboxGroup.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormCheckboxGroup.svelte +155 -0
- package/dist/components/form/FormCheckboxGroup.svelte.d.ts +17 -0
- package/dist/components/form/FormCodeEditor.svelte +458 -0
- package/dist/components/form/FormCodeEditor.svelte.d.ts +25 -0
- package/dist/components/form/FormField.svelte +417 -0
- package/dist/components/form/FormField.svelte.d.ts +29 -0
- package/dist/components/form/FormFieldLight.svelte +425 -0
- package/dist/components/form/FormFieldLight.svelte.d.ts +18 -0
- package/dist/components/form/FormFieldWrapper.stories.svelte +53 -0
- package/dist/components/form/FormFieldWrapper.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormFieldWrapper.svelte +125 -0
- package/dist/components/form/FormFieldWrapper.svelte.d.ts +18 -0
- package/dist/components/form/FormFieldset.svelte +142 -0
- package/dist/components/form/FormFieldset.svelte.d.ts +11 -0
- package/dist/components/form/FormMarkdownEditor.svelte +752 -0
- package/dist/components/form/FormMarkdownEditor.svelte.d.ts +33 -0
- package/dist/components/form/FormNumberField.stories.svelte +36 -0
- package/dist/components/form/FormNumberField.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormNumberField.svelte +112 -0
- package/dist/components/form/FormNumberField.svelte.d.ts +25 -0
- package/dist/components/form/FormRangeField.stories.svelte +31 -0
- package/dist/components/form/FormRangeField.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormRangeField.svelte +246 -0
- package/dist/components/form/FormRangeField.svelte.d.ts +23 -0
- package/dist/components/form/FormSelect.stories.svelte +50 -0
- package/dist/components/form/FormSelect.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormSelect.svelte +129 -0
- package/dist/components/form/FormSelect.svelte.d.ts +20 -0
- package/dist/components/form/FormTemplateEditor.svelte +825 -0
- package/dist/components/form/FormTemplateEditor.svelte.d.ts +41 -0
- package/dist/components/form/FormTextField.stories.svelte +30 -0
- package/dist/components/form/FormTextField.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormTextField.svelte +91 -0
- package/dist/components/form/FormTextField.svelte.d.ts +19 -0
- package/dist/components/form/FormTextarea.stories.svelte +34 -0
- package/dist/components/form/FormTextarea.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormTextarea.svelte +97 -0
- package/dist/components/form/FormTextarea.svelte.d.ts +21 -0
- package/dist/components/form/FormToggle.stories.svelte +30 -0
- package/dist/components/form/FormToggle.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormToggle.svelte +126 -0
- package/dist/components/form/FormToggle.svelte.d.ts +19 -0
- package/dist/components/form/FormUISchemaRenderer.svelte +136 -0
- package/dist/components/form/FormUISchemaRenderer.svelte.d.ts +32 -0
- package/dist/components/form/index.d.ts +50 -0
- package/dist/components/form/index.js +54 -0
- package/dist/components/form/templateAutocomplete.d.ts +29 -0
- package/dist/components/form/templateAutocomplete.js +254 -0
- package/dist/components/form/types.d.ts +485 -0
- package/dist/components/form/types.js +73 -0
- package/dist/components/interrupt/ChoicePrompt.stories.svelte +52 -0
- package/dist/components/interrupt/ChoicePrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/ChoicePrompt.svelte +401 -0
- package/dist/components/interrupt/ChoicePrompt.svelte.d.ts +23 -0
- package/dist/components/interrupt/ConfirmationPrompt.stories.svelte +71 -0
- package/dist/components/interrupt/ConfirmationPrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/ConfirmationPrompt.svelte +292 -0
- package/dist/components/interrupt/ConfirmationPrompt.svelte.d.ts +25 -0
- package/dist/components/interrupt/FormPrompt.svelte +236 -0
- package/dist/components/interrupt/FormPrompt.svelte.d.ts +23 -0
- package/dist/components/interrupt/InterruptBubble.svelte +601 -0
- package/dist/components/interrupt/InterruptBubble.svelte.d.ts +16 -0
- package/dist/components/interrupt/ReviewPrompt.stories.svelte +67 -0
- package/dist/components/interrupt/ReviewPrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/ReviewPrompt.svelte +861 -0
- package/dist/components/interrupt/ReviewPrompt.svelte.d.ts +23 -0
- package/dist/components/interrupt/TextInputPrompt.stories.svelte +47 -0
- package/dist/components/interrupt/TextInputPrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/TextInputPrompt.svelte +346 -0
- package/dist/components/interrupt/TextInputPrompt.svelte.d.ts +23 -0
- package/dist/components/interrupt/index.d.ts +13 -0
- package/dist/components/interrupt/index.js +15 -0
- package/dist/components/layouts/MainLayout.svelte +718 -0
- package/dist/components/layouts/MainLayout.svelte.d.ts +62 -0
- package/dist/components/nodes/GatewayNode.stories.svelte +108 -0
- package/dist/components/nodes/GatewayNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/GatewayNode.svelte +591 -0
- package/dist/components/nodes/GatewayNode.svelte.d.ts +15 -0
- package/dist/components/nodes/IdeaNode.stories.svelte +52 -0
- package/dist/components/nodes/IdeaNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/IdeaNode.svelte +455 -0
- package/dist/components/nodes/IdeaNode.svelte.d.ts +24 -0
- package/dist/components/nodes/NotesNode.stories.svelte +76 -0
- package/dist/components/nodes/NotesNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/NotesNode.svelte +378 -0
- package/dist/components/nodes/NotesNode.svelte.d.ts +24 -0
- package/dist/components/nodes/SimpleNode.stories.svelte +159 -0
- package/dist/components/nodes/SimpleNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/SimpleNode.svelte +451 -0
- package/dist/components/nodes/SimpleNode.svelte.d.ts +25 -0
- package/dist/components/nodes/SquareNode.stories.svelte +82 -0
- package/dist/components/nodes/SquareNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/SquareNode.svelte +407 -0
- package/dist/components/nodes/SquareNode.svelte.d.ts +25 -0
- package/dist/components/nodes/TerminalNode.stories.svelte +25 -0
- package/dist/components/nodes/TerminalNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/TerminalNode.svelte +690 -0
- package/dist/components/nodes/TerminalNode.svelte.d.ts +25 -0
- package/dist/components/nodes/ToolNode.stories.svelte +189 -0
- package/dist/components/nodes/ToolNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/ToolNode.svelte +471 -0
- package/dist/components/nodes/ToolNode.svelte.d.ts +36 -0
- package/dist/components/nodes/WorkflowNode.stories.svelte +55 -0
- package/dist/components/nodes/WorkflowNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/WorkflowNode.svelte +571 -0
- package/dist/components/nodes/WorkflowNode.svelte.d.ts +15 -0
- package/dist/components/playground/ChatPanel.svelte +905 -0
- package/dist/components/playground/ChatPanel.svelte.d.ts +46 -0
- package/dist/components/playground/ExecutionLogs.svelte +488 -0
- package/dist/components/playground/ExecutionLogs.svelte.d.ts +14 -0
- package/dist/components/playground/InputCollector.svelte +444 -0
- package/dist/components/playground/InputCollector.svelte.d.ts +16 -0
- package/dist/components/playground/MessageBubble.stories.svelte +62 -0
- package/dist/components/playground/MessageBubble.stories.svelte.d.ts +27 -0
- package/dist/components/playground/MessageBubble.svelte +633 -0
- package/dist/components/playground/MessageBubble.svelte.d.ts +24 -0
- package/dist/components/playground/Playground.svelte +1075 -0
- package/dist/components/playground/Playground.svelte.d.ts +25 -0
- package/dist/components/playground/PlaygroundModal.svelte +220 -0
- package/dist/components/playground/PlaygroundModal.svelte.d.ts +25 -0
- package/dist/components/playground/SessionManager.svelte +538 -0
- package/dist/components/playground/SessionManager.svelte.d.ts +20 -0
- package/dist/config/agentSpecEndpoints.d.ts +70 -0
- package/dist/config/agentSpecEndpoints.js +65 -0
- package/dist/config/constants.d.ts +43 -0
- package/dist/config/constants.js +31 -0
- package/dist/config/defaultCategories.d.ts +7 -0
- package/dist/config/defaultCategories.js +126 -0
- package/dist/config/defaultPortConfig.d.ts +6 -0
- package/dist/config/defaultPortConfig.js +201 -0
- package/dist/config/endpoints.d.ts +160 -0
- package/dist/config/endpoints.js +146 -0
- package/dist/config/runtimeConfig.d.ts +47 -0
- package/dist/config/runtimeConfig.js +80 -0
- package/dist/core/index.d.ts +75 -0
- package/dist/core/index.js +92 -0
- package/dist/display/index.d.ts +29 -0
- package/dist/display/index.js +36 -0
- package/dist/editor/index.d.ts +95 -0
- package/dist/editor/index.js +138 -0
- package/dist/form/code.d.ts +101 -0
- package/dist/form/code.js +168 -0
- package/dist/form/fieldRegistry.d.ts +169 -0
- package/dist/form/fieldRegistry.js +152 -0
- package/dist/form/full.d.ts +56 -0
- package/dist/form/full.js +80 -0
- package/dist/form/index.d.ts +77 -0
- package/dist/form/index.js +91 -0
- package/dist/form/markdown.d.ts +69 -0
- package/dist/form/markdown.js +103 -0
- package/dist/helpers/nodeLayoutHelper.d.ts +14 -0
- package/dist/helpers/nodeLayoutHelper.js +19 -0
- package/dist/helpers/proximityConnect.d.ts +94 -0
- package/dist/helpers/proximityConnect.js +314 -0
- package/dist/helpers/workflowEditorHelper.d.ts +183 -0
- package/dist/helpers/workflowEditorHelper.js +595 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +64 -0
- package/dist/mocks/app-environment.d.ts +8 -0
- package/dist/mocks/app-environment.js +16 -0
- package/dist/mocks/app-forms.d.ts +2 -0
- package/dist/mocks/app-forms.js +22 -0
- package/dist/mocks/app-navigation.d.ts +5 -0
- package/dist/mocks/app-navigation.js +36 -0
- package/dist/mocks/app-stores.d.ts +14 -0
- package/dist/mocks/app-stores.js +26 -0
- package/dist/playground/index.d.ts +131 -0
- package/dist/playground/index.js +172 -0
- package/dist/playground/mount.d.ts +203 -0
- package/dist/playground/mount.js +235 -0
- package/dist/registry/BaseRegistry.d.ts +92 -0
- package/dist/registry/BaseRegistry.js +124 -0
- package/dist/registry/builtinFormats.d.ts +23 -0
- package/dist/registry/builtinFormats.js +70 -0
- package/dist/registry/builtinNodes.d.ts +77 -0
- package/dist/registry/builtinNodes.js +211 -0
- package/dist/registry/index.d.ts +8 -0
- package/dist/registry/index.js +12 -0
- package/dist/registry/nodeComponentRegistry.d.ts +276 -0
- package/dist/registry/nodeComponentRegistry.js +262 -0
- package/dist/registry/plugin.d.ts +215 -0
- package/dist/registry/plugin.js +249 -0
- package/dist/registry/workflowFormatRegistry.d.ts +122 -0
- package/dist/registry/workflowFormatRegistry.js +96 -0
- package/dist/schema/index.d.ts +23 -0
- package/dist/schema/index.js +23 -0
- package/dist/schemas/v1/workflow.schema.json +1078 -0
- package/dist/services/agentSpecExecutionService.d.ts +106 -0
- package/dist/services/agentSpecExecutionService.js +334 -0
- package/dist/services/api.d.ts +115 -0
- package/dist/services/api.js +214 -0
- package/dist/services/apiVariableService.d.ts +114 -0
- package/dist/services/apiVariableService.js +338 -0
- package/dist/services/autoSaveService.d.ts +112 -0
- package/dist/services/autoSaveService.js +227 -0
- package/dist/services/categoriesApi.d.ts +14 -0
- package/dist/services/categoriesApi.js +49 -0
- package/dist/services/draftStorage.d.ts +171 -0
- package/dist/services/draftStorage.js +299 -0
- package/dist/services/dynamicSchemaService.d.ts +108 -0
- package/dist/services/dynamicSchemaService.js +444 -0
- package/dist/services/globalSave.d.ts +69 -0
- package/dist/services/globalSave.js +248 -0
- package/dist/services/historyService.d.ts +208 -0
- package/dist/services/historyService.js +321 -0
- package/dist/services/interruptService.d.ts +133 -0
- package/dist/services/interruptService.js +280 -0
- package/dist/services/nodeExecutionService.d.ts +63 -0
- package/dist/services/nodeExecutionService.js +266 -0
- package/dist/services/playgroundService.d.ts +130 -0
- package/dist/services/playgroundService.js +321 -0
- package/dist/services/portConfigApi.d.ts +14 -0
- package/dist/services/portConfigApi.js +54 -0
- package/dist/services/settingsService.d.ts +92 -0
- package/dist/services/settingsService.js +196 -0
- package/dist/services/toastService.d.ts +156 -0
- package/dist/services/toastService.js +265 -0
- package/dist/services/variableService.d.ts +141 -0
- package/dist/services/variableService.js +463 -0
- package/dist/services/workflowStorage.d.ts +37 -0
- package/dist/services/workflowStorage.js +116 -0
- package/dist/settings/index.d.ts +25 -0
- package/dist/settings/index.js +33 -0
- package/dist/stores/categoriesStore.svelte.d.ts +32 -0
- package/dist/stores/categoriesStore.svelte.js +77 -0
- package/dist/stores/editorStateMachine.svelte.d.ts +42 -0
- package/dist/stores/editorStateMachine.svelte.js +132 -0
- package/dist/stores/historyStore.svelte.d.ts +136 -0
- package/dist/stores/historyStore.svelte.js +207 -0
- package/dist/stores/interruptStore.svelte.d.ts +179 -0
- package/dist/stores/interruptStore.svelte.js +346 -0
- package/dist/stores/playgroundStore.svelte.d.ts +230 -0
- package/dist/stores/playgroundStore.svelte.js +515 -0
- package/dist/stores/portCoordinateStore.svelte.d.ts +66 -0
- package/dist/stores/portCoordinateStore.svelte.js +186 -0
- package/dist/stores/settingsStore.svelte.d.ts +158 -0
- package/dist/stores/settingsStore.svelte.js +544 -0
- package/dist/stores/workflowStore.svelte.d.ts +260 -0
- package/dist/stores/workflowStore.svelte.js +649 -0
- package/dist/stories/CanvasDecorator.svelte +49 -0
- package/dist/stories/CanvasDecorator.svelte.d.ts +8 -0
- package/dist/stories/NodeDecorator.svelte +73 -0
- package/dist/stories/NodeDecorator.svelte.d.ts +8 -0
- package/dist/stories/utils.d.ts +93 -0
- package/dist/stories/utils.js +122 -0
- package/dist/styles/base.css +1300 -0
- package/dist/styles/toast.css +35 -0
- package/dist/styles/tokens.css +475 -0
- package/dist/svelte-app.d.ts +150 -0
- package/dist/svelte-app.js +295 -0
- package/dist/types/agentspec.d.ts +318 -0
- package/dist/types/agentspec.js +48 -0
- package/dist/types/auth.d.ts +263 -0
- package/dist/types/auth.js +229 -0
- package/dist/types/config.d.ts +151 -0
- package/dist/types/config.js +7 -0
- package/dist/types/events.d.ts +190 -0
- package/dist/types/events.js +30 -0
- package/dist/types/index.d.ts +1234 -0
- package/dist/types/index.js +27 -0
- package/dist/types/interrupt.d.ts +390 -0
- package/dist/types/interrupt.js +145 -0
- package/dist/types/interruptState.d.ts +211 -0
- package/dist/types/interruptState.js +308 -0
- package/dist/types/playground.d.ts +351 -0
- package/dist/types/playground.js +95 -0
- package/dist/types/settings.d.ts +189 -0
- package/dist/types/settings.js +97 -0
- package/dist/types/uischema.d.ts +144 -0
- package/dist/types/uischema.js +51 -0
- package/dist/utils/colors.d.ts +288 -0
- package/dist/utils/colors.js +548 -0
- package/dist/utils/config.d.ts +37 -0
- package/dist/utils/config.js +226 -0
- package/dist/utils/connections.d.ts +125 -0
- package/dist/utils/connections.js +414 -0
- package/dist/utils/errors.d.ts +28 -0
- package/dist/utils/errors.js +44 -0
- package/dist/utils/fetchWithAuth.d.ts +25 -0
- package/dist/utils/fetchWithAuth.js +34 -0
- package/dist/utils/handleIds.d.ts +35 -0
- package/dist/utils/handleIds.js +58 -0
- package/dist/utils/handlePositioning.d.ts +31 -0
- package/dist/utils/handlePositioning.js +35 -0
- package/dist/utils/icons.d.ts +106 -0
- package/dist/utils/icons.js +157 -0
- package/dist/utils/logger.d.ts +47 -0
- package/dist/utils/logger.js +72 -0
- package/dist/utils/nodeStatus.d.ts +53 -0
- package/dist/utils/nodeStatus.js +183 -0
- package/dist/utils/nodeTypes.d.ts +117 -0
- package/dist/utils/nodeTypes.js +244 -0
- package/dist/utils/nodeWrapper.d.ts +39 -0
- package/dist/utils/nodeWrapper.js +62 -0
- package/dist/utils/performanceUtils.d.ts +30 -0
- package/dist/utils/performanceUtils.js +108 -0
- package/dist/utils/sanitize.d.ts +19 -0
- package/dist/utils/sanitize.js +31 -0
- package/dist/utils/uischema.d.ts +52 -0
- package/dist/utils/uischema.js +88 -0
- package/dist/utils/validation.d.ts +29 -0
- package/dist/utils/validation.js +39 -0
- package/package.json +292 -0
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Pipeline Status Component
|
|
3
|
+
Displays workflow execution status using the App component in read-only mode
|
|
4
|
+
Styled with BEM syntax
|
|
5
|
+
-->
|
|
6
|
+
|
|
7
|
+
<script lang="ts">
|
|
8
|
+
import { onMount } from 'svelte';
|
|
9
|
+
import App from './App.svelte';
|
|
10
|
+
import LogsSidebar from './LogsSidebar.svelte';
|
|
11
|
+
import { EnhancedFlowDropApiClient } from '../api/enhanced-client.js';
|
|
12
|
+
import { createEndpointConfig } from '../config/endpoints.js';
|
|
13
|
+
import type { Workflow } from '../types/index.js';
|
|
14
|
+
import type { EndpointConfig } from '../config/endpoints.js';
|
|
15
|
+
import { logger } from '../utils/logger.js';
|
|
16
|
+
|
|
17
|
+
interface Props {
|
|
18
|
+
pipelineId: string;
|
|
19
|
+
workflow: Workflow;
|
|
20
|
+
apiClient?: EnhancedFlowDropApiClient;
|
|
21
|
+
baseUrl?: string;
|
|
22
|
+
endpointConfig?: EndpointConfig;
|
|
23
|
+
onActionsReady?: (
|
|
24
|
+
actions: Array<{
|
|
25
|
+
label: string;
|
|
26
|
+
href: string;
|
|
27
|
+
icon?: string;
|
|
28
|
+
variant?: 'primary' | 'secondary' | 'outline';
|
|
29
|
+
onclick?: (event: Event) => void;
|
|
30
|
+
}>
|
|
31
|
+
) => void;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
let { pipelineId, workflow, apiClient, baseUrl, endpointConfig, onActionsReady }: Props =
|
|
35
|
+
$props();
|
|
36
|
+
|
|
37
|
+
// Initialize API client if not provided
|
|
38
|
+
// svelte-ignore state_referenced_locally — client created once from props
|
|
39
|
+
const client =
|
|
40
|
+
apiClient ||
|
|
41
|
+
new EnhancedFlowDropApiClient(
|
|
42
|
+
endpointConfig ?? createEndpointConfig(baseUrl || '/api/flowdrop')
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
// Pipeline status and job data
|
|
46
|
+
let pipelineStatus = $state<string>('unknown');
|
|
47
|
+
interface PipelineNodeStatus {
|
|
48
|
+
status: string;
|
|
49
|
+
[key: string]: unknown;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
let jobStatusData = $state<{
|
|
53
|
+
jobs: Record<string, unknown>[];
|
|
54
|
+
node_statuses: Record<string, PipelineNodeStatus>;
|
|
55
|
+
status_summary: {
|
|
56
|
+
total: number;
|
|
57
|
+
pending: number;
|
|
58
|
+
running: number;
|
|
59
|
+
completed: number;
|
|
60
|
+
failed: number;
|
|
61
|
+
cancelled: number;
|
|
62
|
+
};
|
|
63
|
+
}>({
|
|
64
|
+
jobs: [],
|
|
65
|
+
node_statuses: {},
|
|
66
|
+
status_summary: {
|
|
67
|
+
total: 0,
|
|
68
|
+
pending: 0,
|
|
69
|
+
running: 0,
|
|
70
|
+
completed: 0,
|
|
71
|
+
failed: 0,
|
|
72
|
+
cancelled: 0
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// Node statuses for visual indicators
|
|
77
|
+
let nodeStatuses = $state<Record<string, 'pending' | 'running' | 'completed' | 'error'>>({});
|
|
78
|
+
|
|
79
|
+
// Loading and error states
|
|
80
|
+
let isLoadingJobStatus = $state(false);
|
|
81
|
+
|
|
82
|
+
// Logs sidebar state
|
|
83
|
+
let isLogsSidebarOpen = $state(false);
|
|
84
|
+
let logs = $state<Array<{ level: string; message: string; timestamp: string }>>([]);
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Fetch pipeline data including job information
|
|
88
|
+
*/
|
|
89
|
+
async function fetchPipelineData(): Promise<void> {
|
|
90
|
+
if (!pipelineId) return;
|
|
91
|
+
|
|
92
|
+
try {
|
|
93
|
+
isLoadingJobStatus = true;
|
|
94
|
+
const pipelineData = await client.getPipelineData(pipelineId);
|
|
95
|
+
|
|
96
|
+
pipelineStatus = pipelineData.status;
|
|
97
|
+
jobStatusData = {
|
|
98
|
+
jobs: pipelineData.jobs || [],
|
|
99
|
+
node_statuses: pipelineData.node_statuses || {},
|
|
100
|
+
status_summary: pipelineData.job_status_summary || {
|
|
101
|
+
total: 0,
|
|
102
|
+
pending: 0,
|
|
103
|
+
running: 0,
|
|
104
|
+
completed: 0,
|
|
105
|
+
failed: 0,
|
|
106
|
+
cancelled: 0
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
// Update node statuses based on job data
|
|
111
|
+
if (jobStatusData.node_statuses) {
|
|
112
|
+
const newNodeStatuses: Record<string, 'pending' | 'running' | 'completed' | 'error'> = {};
|
|
113
|
+
|
|
114
|
+
// Initialize all nodes as pending
|
|
115
|
+
if (workflow && workflow.nodes) {
|
|
116
|
+
workflow.nodes.forEach((node) => {
|
|
117
|
+
newNodeStatuses[node.id] = 'pending';
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Override with actual job statuses
|
|
122
|
+
for (const nodeId in jobStatusData.node_statuses) {
|
|
123
|
+
const status = jobStatusData.node_statuses[nodeId].status;
|
|
124
|
+
if (['pending', 'running', 'completed', 'failed', 'cancelled'].includes(status)) {
|
|
125
|
+
newNodeStatuses[nodeId] =
|
|
126
|
+
status === 'failed' ? 'error' : (status as 'pending' | 'running' | 'completed');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
nodeStatuses = newNodeStatuses;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
addLog('info', `Job status updated: ${jobStatusData.status_summary.total} total jobs`);
|
|
133
|
+
} catch (error) {
|
|
134
|
+
logger.error('Failed to fetch pipeline data:', error);
|
|
135
|
+
addLog(
|
|
136
|
+
'error',
|
|
137
|
+
`Failed to fetch pipeline data: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
138
|
+
);
|
|
139
|
+
} finally {
|
|
140
|
+
isLoadingJobStatus = false;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Add a log entry
|
|
146
|
+
*/
|
|
147
|
+
function addLog(level: string, message: string): void {
|
|
148
|
+
logs = [
|
|
149
|
+
...logs,
|
|
150
|
+
{
|
|
151
|
+
level,
|
|
152
|
+
message,
|
|
153
|
+
timestamp: new Date().toISOString()
|
|
154
|
+
}
|
|
155
|
+
];
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Toggle logs sidebar
|
|
160
|
+
*/
|
|
161
|
+
function toggleLogsSidebar(): void {
|
|
162
|
+
isLogsSidebarOpen = !isLogsSidebarOpen;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Get pipeline actions for the parent navbar
|
|
167
|
+
*/
|
|
168
|
+
function getPipelineActions() {
|
|
169
|
+
return [
|
|
170
|
+
{
|
|
171
|
+
label: isLoadingJobStatus ? 'Refreshing...' : 'Refresh Status',
|
|
172
|
+
href: '#refresh',
|
|
173
|
+
icon: isLoadingJobStatus ? 'mdi:loading' : 'mdi:refresh',
|
|
174
|
+
variant: 'outline' as const,
|
|
175
|
+
onclick: (e: Event) => {
|
|
176
|
+
e.preventDefault();
|
|
177
|
+
fetchPipelineData();
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
label: 'View Logs',
|
|
182
|
+
href: '#logs',
|
|
183
|
+
icon: 'mdi:file-document-outline',
|
|
184
|
+
variant: 'outline' as const,
|
|
185
|
+
onclick: (e: Event) => {
|
|
186
|
+
e.preventDefault();
|
|
187
|
+
toggleLogsSidebar();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
];
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Fetch pipeline data on mount
|
|
194
|
+
onMount(() => {
|
|
195
|
+
fetchPipelineData();
|
|
196
|
+
// Expose actions to parent
|
|
197
|
+
if (onActionsReady) {
|
|
198
|
+
onActionsReady(getPipelineActions());
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Listen for custom events from the layout navbar
|
|
202
|
+
const handleRefresh = () => fetchPipelineData();
|
|
203
|
+
const handleViewLogs = () => toggleLogsSidebar();
|
|
204
|
+
|
|
205
|
+
window.addEventListener('pipeline-refresh', handleRefresh);
|
|
206
|
+
window.addEventListener('pipeline-view-logs', handleViewLogs);
|
|
207
|
+
|
|
208
|
+
return () => {
|
|
209
|
+
window.removeEventListener('pipeline-refresh', handleRefresh);
|
|
210
|
+
window.removeEventListener('pipeline-view-logs', handleViewLogs);
|
|
211
|
+
};
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
// Send pipeline breadcrumbs to layout when they change
|
|
215
|
+
$effect(() => {
|
|
216
|
+
if (pipelineStatus && pipelineId && workflow) {
|
|
217
|
+
const breadcrumbs = [
|
|
218
|
+
{
|
|
219
|
+
label: 'Home',
|
|
220
|
+
href: '/',
|
|
221
|
+
icon: 'mdi:home'
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
label: 'Workflows',
|
|
225
|
+
href: '/',
|
|
226
|
+
icon: 'mdi:view-list'
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
label: workflow.name || 'Workflow',
|
|
230
|
+
href: `/workflow/${workflow.id}/edit`,
|
|
231
|
+
icon: 'mdi:workflow'
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
label: 'Pipelines',
|
|
235
|
+
href: `/workflow/${workflow.id}/pipelines`,
|
|
236
|
+
icon: 'mdi:source-branch'
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
label: `Pipeline ${pipelineId} - ${pipelineStatus}`,
|
|
240
|
+
icon: 'mdi:play-circle'
|
|
241
|
+
}
|
|
242
|
+
];
|
|
243
|
+
|
|
244
|
+
window.dispatchEvent(
|
|
245
|
+
new CustomEvent('page-breadcrumbs-update', {
|
|
246
|
+
detail: { breadcrumbs }
|
|
247
|
+
})
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
// Update actions when loading state changes
|
|
253
|
+
$effect(() => {
|
|
254
|
+
if (onActionsReady) {
|
|
255
|
+
onActionsReady(getPipelineActions());
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
// Auto-refresh pipeline data every 5 seconds when pipeline is running
|
|
260
|
+
let refreshInterval: NodeJS.Timeout | null = null;
|
|
261
|
+
|
|
262
|
+
$effect(() => {
|
|
263
|
+
// Clear existing interval
|
|
264
|
+
if (refreshInterval) {
|
|
265
|
+
clearInterval(refreshInterval);
|
|
266
|
+
refreshInterval = null;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Only start polling if pipeline is running
|
|
270
|
+
if (pipelineStatus === 'running' && pipelineId) {
|
|
271
|
+
refreshInterval = setInterval(() => {
|
|
272
|
+
fetchPipelineData();
|
|
273
|
+
}, 5000);
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
// Note: Interval cleanup is handled by the $effect above.
|
|
278
|
+
// In Svelte 5, $effect cleanup runs both on re-execution and component destroy.
|
|
279
|
+
</script>
|
|
280
|
+
|
|
281
|
+
<div class="pipeline-status-container">
|
|
282
|
+
<!-- Workflow Visualization using App component -->
|
|
283
|
+
<App
|
|
284
|
+
{workflow}
|
|
285
|
+
height="100vh"
|
|
286
|
+
width="100%"
|
|
287
|
+
showNavbar={false}
|
|
288
|
+
disableSidebar={true}
|
|
289
|
+
lockWorkflow={true}
|
|
290
|
+
readOnly={true}
|
|
291
|
+
{nodeStatuses}
|
|
292
|
+
{pipelineId}
|
|
293
|
+
{endpointConfig}
|
|
294
|
+
/>
|
|
295
|
+
|
|
296
|
+
<!-- Logs Sidebar -->
|
|
297
|
+
{#if isLogsSidebarOpen}
|
|
298
|
+
<LogsSidebar {logs} isOpen={isLogsSidebarOpen} onClose={() => (isLogsSidebarOpen = false)} />
|
|
299
|
+
{/if}
|
|
300
|
+
</div>
|
|
301
|
+
|
|
302
|
+
<style>
|
|
303
|
+
.pipeline-status-container {
|
|
304
|
+
display: flex;
|
|
305
|
+
flex-direction: column;
|
|
306
|
+
height: 100vh;
|
|
307
|
+
background: var(--fd-layout-background, var(--fd-muted));
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/* Dark mode override */
|
|
311
|
+
:global([data-theme='dark']) .pipeline-status-container {
|
|
312
|
+
background: linear-gradient(135deg, #141418 0%, #1a1a2e 50%, #16162a 100%);
|
|
313
|
+
}
|
|
314
|
+
</style>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { EnhancedFlowDropApiClient } from '../api/enhanced-client.js';
|
|
2
|
+
import type { Workflow } from '../types/index.js';
|
|
3
|
+
import type { EndpointConfig } from '../config/endpoints.js';
|
|
4
|
+
interface Props {
|
|
5
|
+
pipelineId: string;
|
|
6
|
+
workflow: Workflow;
|
|
7
|
+
apiClient?: EnhancedFlowDropApiClient;
|
|
8
|
+
baseUrl?: string;
|
|
9
|
+
endpointConfig?: EndpointConfig;
|
|
10
|
+
onActionsReady?: (actions: Array<{
|
|
11
|
+
label: string;
|
|
12
|
+
href: string;
|
|
13
|
+
icon?: string;
|
|
14
|
+
variant?: 'primary' | 'secondary' | 'outline';
|
|
15
|
+
onclick?: (event: Event) => void;
|
|
16
|
+
}>) => void;
|
|
17
|
+
}
|
|
18
|
+
declare const PipelineStatus: import("svelte").Component<Props, {}, "">;
|
|
19
|
+
type PipelineStatus = ReturnType<typeof PipelineStatus>;
|
|
20
|
+
export default PipelineStatus;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Port Coordinate Tracker Component
|
|
3
|
+
Bridge component that exposes SvelteFlow's getInternalNode to the parent.
|
|
4
|
+
Must be rendered inside SvelteFlowProvider context.
|
|
5
|
+
|
|
6
|
+
Uses the same pattern as EdgeRefresher - a renderless component that hooks
|
|
7
|
+
into the SvelteFlow context.
|
|
8
|
+
-->
|
|
9
|
+
|
|
10
|
+
<script lang="ts">
|
|
11
|
+
import { useSvelteFlow, type InternalNode } from '@xyflow/svelte';
|
|
12
|
+
import type { WorkflowNode as WorkflowNodeType } from '../types/index.js';
|
|
13
|
+
import {
|
|
14
|
+
rebuildAllPortCoordinates,
|
|
15
|
+
updateNodePortCoordinates
|
|
16
|
+
} from '../stores/portCoordinateStore.svelte.js';
|
|
17
|
+
|
|
18
|
+
interface Props {
|
|
19
|
+
/** Node to update coordinates for (e.g., during drag). Set to null when not dragging. */
|
|
20
|
+
nodeToUpdate: WorkflowNodeType | null;
|
|
21
|
+
/** Set to trigger a full rebuild of all port coordinates */
|
|
22
|
+
rebuildTrigger: number;
|
|
23
|
+
/** All workflow nodes - used for full rebuild */
|
|
24
|
+
nodes: WorkflowNodeType[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
let { nodeToUpdate, rebuildTrigger, nodes }: Props = $props();
|
|
28
|
+
|
|
29
|
+
const { getInternalNode } = useSvelteFlow();
|
|
30
|
+
|
|
31
|
+
// Cast the getInternalNode function for our use
|
|
32
|
+
const getInternal = getInternalNode as (id: string) => InternalNode | undefined;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Rebuild all port coordinates when rebuildTrigger changes.
|
|
36
|
+
* Debounced to batch rapid position updates (e.g., animated auto-layout,
|
|
37
|
+
* magnetic child nodes following a parent drag).
|
|
38
|
+
*/
|
|
39
|
+
$effect(() => {
|
|
40
|
+
const _trigger = rebuildTrigger;
|
|
41
|
+
if (_trigger > 0) {
|
|
42
|
+
const timeout = setTimeout(() => {
|
|
43
|
+
rebuildAllPortCoordinates(nodes, getInternal);
|
|
44
|
+
}, 150);
|
|
45
|
+
return () => clearTimeout(timeout);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Update a single node's coordinates when nodeToUpdate changes.
|
|
51
|
+
* This is used during drag for efficient per-node updates.
|
|
52
|
+
*/
|
|
53
|
+
$effect(() => {
|
|
54
|
+
if (nodeToUpdate) {
|
|
55
|
+
updateNodePortCoordinates(nodeToUpdate, getInternal);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
</script>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { WorkflowNode as WorkflowNodeType } from '../types/index.js';
|
|
2
|
+
interface Props {
|
|
3
|
+
/** Node to update coordinates for (e.g., during drag). Set to null when not dragging. */
|
|
4
|
+
nodeToUpdate: WorkflowNodeType | null;
|
|
5
|
+
/** Set to trigger a full rebuild of all port coordinates */
|
|
6
|
+
rebuildTrigger: number;
|
|
7
|
+
/** All workflow nodes - used for full rebuild */
|
|
8
|
+
nodes: WorkflowNodeType[];
|
|
9
|
+
}
|
|
10
|
+
declare const PortCoordinateTracker: import("svelte").Component<Props, {}, "">;
|
|
11
|
+
type PortCoordinateTracker = ReturnType<typeof PortCoordinateTracker>;
|
|
12
|
+
export default PortCoordinateTracker;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
ReadOnlyDetails Component
|
|
3
|
+
Displays readonly information with an ID (with copy button), title, description, and label-value pairs
|
|
4
|
+
Compact inline layout with BEM syntax
|
|
5
|
+
-->
|
|
6
|
+
|
|
7
|
+
<script lang="ts">
|
|
8
|
+
/**
|
|
9
|
+
* A single detail item with label and value
|
|
10
|
+
*/
|
|
11
|
+
interface DetailItem {
|
|
12
|
+
/** The label to display */
|
|
13
|
+
label: string;
|
|
14
|
+
/** The value to display */
|
|
15
|
+
value: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Props interface for ReadOnlyDetails component
|
|
20
|
+
*/
|
|
21
|
+
interface Props {
|
|
22
|
+
/** The unique identifier to display with a copy button */
|
|
23
|
+
id: string;
|
|
24
|
+
/** Optional section title */
|
|
25
|
+
title?: string;
|
|
26
|
+
/** Optional description text */
|
|
27
|
+
description?: string;
|
|
28
|
+
/** Array of label-value pairs to display */
|
|
29
|
+
details: DetailItem[];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const { id, title, description, details }: Props = $props();
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Copy the ID to clipboard
|
|
36
|
+
*/
|
|
37
|
+
function copyId(): void {
|
|
38
|
+
navigator.clipboard.writeText(id);
|
|
39
|
+
}
|
|
40
|
+
</script>
|
|
41
|
+
|
|
42
|
+
<div class="readonly-details">
|
|
43
|
+
{#if title}
|
|
44
|
+
<h3 class="readonly-details__title">{title}</h3>
|
|
45
|
+
{/if}
|
|
46
|
+
|
|
47
|
+
<div class="readonly-details__grid">
|
|
48
|
+
<!-- ID row -->
|
|
49
|
+
<span class="readonly-details__label">ID</span>
|
|
50
|
+
<div class="readonly-details__id-row">
|
|
51
|
+
<code class="readonly-details__id">{id}</code>
|
|
52
|
+
<button
|
|
53
|
+
class="readonly-details__copy-btn"
|
|
54
|
+
onclick={copyId}
|
|
55
|
+
title="Copy ID"
|
|
56
|
+
aria-label="Copy ID to clipboard"
|
|
57
|
+
>
|
|
58
|
+
<svg
|
|
59
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
60
|
+
fill="none"
|
|
61
|
+
width="12"
|
|
62
|
+
height="12"
|
|
63
|
+
viewBox="0 0 24 24"
|
|
64
|
+
stroke-width="2"
|
|
65
|
+
stroke="currentColor"
|
|
66
|
+
>
|
|
67
|
+
<path
|
|
68
|
+
stroke-linecap="round"
|
|
69
|
+
stroke-linejoin="round"
|
|
70
|
+
d="M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 0 1-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 0 1 1.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 0 0-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 0 1-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 0 0-3.375-3.375h-1.5a1.125 1.125 0 0 1-1.125-1.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H9.75"
|
|
71
|
+
/>
|
|
72
|
+
</svg>
|
|
73
|
+
</button>
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
<!-- Dynamic label-value pairs -->
|
|
77
|
+
{#each details as detail (detail.label)}
|
|
78
|
+
<span class="readonly-details__label">{detail.label}</span>
|
|
79
|
+
<span class="readonly-details__value">{detail.value}</span>
|
|
80
|
+
{/each}
|
|
81
|
+
</div>
|
|
82
|
+
|
|
83
|
+
<!-- Description (if provided) -->
|
|
84
|
+
{#if description}
|
|
85
|
+
<p class="readonly-details__description">{description}</p>
|
|
86
|
+
{/if}
|
|
87
|
+
</div>
|
|
88
|
+
|
|
89
|
+
<style>
|
|
90
|
+
.readonly-details {
|
|
91
|
+
display: flex;
|
|
92
|
+
flex-direction: column;
|
|
93
|
+
gap: 0.5rem;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.readonly-details__title {
|
|
97
|
+
margin: 0;
|
|
98
|
+
font-size: 0.75rem;
|
|
99
|
+
font-weight: 600;
|
|
100
|
+
color: var(--fd-muted-foreground);
|
|
101
|
+
text-transform: uppercase;
|
|
102
|
+
letter-spacing: 0.05em;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.readonly-details__grid {
|
|
106
|
+
display: grid;
|
|
107
|
+
grid-template-columns: auto 1fr;
|
|
108
|
+
gap: 0.25rem 0.75rem;
|
|
109
|
+
align-items: center;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.readonly-details__label {
|
|
113
|
+
font-size: 0.75rem;
|
|
114
|
+
font-weight: 500;
|
|
115
|
+
color: var(--fd-muted-foreground);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.readonly-details__value {
|
|
119
|
+
font-size: 0.8125rem;
|
|
120
|
+
color: var(--fd-foreground);
|
|
121
|
+
font-weight: 500;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.readonly-details__id-row {
|
|
125
|
+
display: flex;
|
|
126
|
+
align-items: center;
|
|
127
|
+
gap: 0.375rem;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.readonly-details__id {
|
|
131
|
+
font-size: 0.75rem;
|
|
132
|
+
font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, monospace;
|
|
133
|
+
color: var(--fd-muted-foreground);
|
|
134
|
+
background-color: var(--fd-subtle);
|
|
135
|
+
padding: 0.125rem 0.375rem;
|
|
136
|
+
border-radius: var(--fd-radius-sm);
|
|
137
|
+
word-break: break-all;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.readonly-details__copy-btn {
|
|
141
|
+
background: transparent;
|
|
142
|
+
border: none;
|
|
143
|
+
padding: 0.25rem;
|
|
144
|
+
cursor: pointer;
|
|
145
|
+
color: var(--fd-muted-foreground);
|
|
146
|
+
border-radius: var(--fd-radius-sm);
|
|
147
|
+
display: flex;
|
|
148
|
+
align-items: center;
|
|
149
|
+
justify-content: center;
|
|
150
|
+
transition:
|
|
151
|
+
color var(--fd-transition-fast),
|
|
152
|
+
background-color var(--fd-transition-fast);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.readonly-details__copy-btn:hover {
|
|
156
|
+
color: var(--fd-foreground);
|
|
157
|
+
background-color: var(--fd-subtle);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.readonly-details__copy-btn:active {
|
|
161
|
+
color: var(--fd-foreground);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.readonly-details__description {
|
|
165
|
+
margin: 0;
|
|
166
|
+
font-size: 0.8125rem;
|
|
167
|
+
color: var(--fd-muted-foreground);
|
|
168
|
+
line-height: 1.5;
|
|
169
|
+
}
|
|
170
|
+
</style>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A single detail item with label and value
|
|
3
|
+
*/
|
|
4
|
+
interface DetailItem {
|
|
5
|
+
/** The label to display */
|
|
6
|
+
label: string;
|
|
7
|
+
/** The value to display */
|
|
8
|
+
value: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Props interface for ReadOnlyDetails component
|
|
12
|
+
*/
|
|
13
|
+
interface Props {
|
|
14
|
+
/** The unique identifier to display with a copy button */
|
|
15
|
+
id: string;
|
|
16
|
+
/** Optional section title */
|
|
17
|
+
title?: string;
|
|
18
|
+
/** Optional description text */
|
|
19
|
+
description?: string;
|
|
20
|
+
/** Array of label-value pairs to display */
|
|
21
|
+
details: DetailItem[];
|
|
22
|
+
}
|
|
23
|
+
declare const ReadOnlyDetails: import("svelte").Component<Props, {}, "">;
|
|
24
|
+
type ReadOnlyDetails = ReturnType<typeof ReadOnlyDetails>;
|
|
25
|
+
export default ReadOnlyDetails;
|