@d34dman/flowdrop 0.0.60 → 0.0.62
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 +6 -0
- package/dist/adapters/WorkflowAdapter.d.ts +1 -1
- package/dist/adapters/agentspec/AgentSpecAdapter.js +3 -1
- package/dist/api/client.d.ts +4 -0
- package/dist/api/client.js +6 -1
- package/dist/api/enhanced-client.js +7 -6
- package/dist/components/App.svelte +143 -219
- package/dist/components/CanvasBanner.stories.svelte +25 -0
- package/dist/components/CanvasBanner.stories.svelte.d.ts +27 -0
- package/dist/components/CanvasBanner.svelte +2 -2
- package/dist/components/ConfigForm.svelte +37 -36
- package/dist/components/ConfigPanel.stories.svelte +38 -0
- package/dist/components/ConfigPanel.stories.svelte.d.ts +27 -0
- package/dist/components/ConfigPanel.svelte +2 -2
- package/dist/components/ConnectionLine.svelte +2 -2
- package/dist/components/FlowDropZone.svelte +18 -2
- package/dist/components/FlowDropZone.svelte.d.ts +2 -0
- package/dist/components/LoadingSpinner.stories.svelte +30 -0
- package/dist/components/LoadingSpinner.stories.svelte.d.ts +27 -0
- package/dist/components/Logo.stories.svelte +22 -0
- package/dist/components/Logo.stories.svelte.d.ts +27 -0
- package/dist/components/Logo.svelte +33 -13
- package/dist/components/Logo.svelte.d.ts +1 -1
- package/dist/components/MarkdownDisplay.stories.svelte +21 -0
- package/dist/components/MarkdownDisplay.stories.svelte.d.ts +27 -0
- package/dist/components/MarkdownDisplay.svelte +4 -3
- package/dist/components/Navbar.stories.svelte +41 -0
- package/dist/components/Navbar.stories.svelte.d.ts +27 -0
- package/dist/components/Navbar.svelte +4 -4
- package/dist/components/NodeSidebar.svelte +12 -12
- package/dist/components/NodeStatusOverlay.stories.svelte +74 -0
- package/dist/components/NodeStatusOverlay.stories.svelte.d.ts +27 -0
- package/dist/components/PipelineStatus.svelte +11 -4
- package/dist/components/PortCoordinateTracker.svelte +1 -1
- package/dist/components/SchemaForm.stories.svelte +101 -0
- package/dist/components/SchemaForm.stories.svelte.d.ts +27 -0
- package/dist/components/SchemaForm.svelte +17 -12
- package/dist/components/SettingsModal.svelte +3 -3
- package/dist/components/SettingsPanel.svelte +23 -22
- package/dist/components/StatusIcon.stories.svelte +60 -0
- package/dist/components/StatusIcon.stories.svelte.d.ts +27 -0
- package/dist/components/StatusIcon.svelte +7 -0
- package/dist/components/StatusLabel.stories.svelte +17 -0
- package/dist/components/StatusLabel.stories.svelte.d.ts +27 -0
- package/dist/components/ThemeToggle.stories.svelte +25 -0
- package/dist/components/ThemeToggle.stories.svelte.d.ts +27 -0
- package/dist/components/ThemeToggle.svelte +8 -8
- package/dist/components/UniversalNode.svelte +1 -1
- package/dist/components/WorkflowEditor.svelte +298 -294
- package/dist/components/form/FormAutocomplete.svelte +20 -19
- package/dist/components/form/FormCheckboxGroup.stories.svelte +28 -0
- package/dist/components/form/FormCheckboxGroup.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormField.svelte +3 -3
- package/dist/components/form/FormFieldLight.svelte +2 -2
- package/dist/components/form/FormFieldWrapper.stories.svelte +31 -0
- package/dist/components/form/FormFieldWrapper.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormFieldset.svelte +7 -7
- package/dist/components/form/FormNumberField.stories.svelte +33 -0
- package/dist/components/form/FormNumberField.stories.svelte.d.ts +27 -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/FormSelect.stories.svelte +50 -0
- package/dist/components/form/FormSelect.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormTemplateEditor.svelte +2 -1
- package/dist/components/form/FormTextField.stories.svelte +30 -0
- package/dist/components/form/FormTextField.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormTextarea.stories.svelte +31 -0
- package/dist/components/form/FormTextarea.stories.svelte.d.ts +27 -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/FormUISchemaRenderer.svelte +1 -1
- package/dist/components/form/types.d.ts +15 -47
- package/dist/components/interrupt/ChoicePrompt.stories.svelte +43 -0
- package/dist/components/interrupt/ChoicePrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/ChoicePrompt.svelte +24 -24
- package/dist/components/interrupt/ConfirmationPrompt.stories.svelte +49 -0
- package/dist/components/interrupt/ConfirmationPrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/ConfirmationPrompt.svelte +19 -19
- package/dist/components/interrupt/FormPrompt.svelte +15 -15
- package/dist/components/interrupt/InterruptBubble.svelte +202 -236
- package/dist/components/interrupt/InterruptBubble.svelte.d.ts +1 -1
- package/dist/components/interrupt/ReviewPrompt.stories.svelte +46 -0
- package/dist/components/interrupt/ReviewPrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/ReviewPrompt.svelte +842 -0
- package/dist/components/interrupt/ReviewPrompt.svelte.d.ts +23 -0
- package/dist/components/interrupt/TextInputPrompt.stories.svelte +34 -0
- package/dist/components/interrupt/TextInputPrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/TextInputPrompt.svelte +21 -21
- package/dist/components/nodes/GatewayNode.stories.svelte +76 -0
- package/dist/components/nodes/GatewayNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/GatewayNode.svelte +19 -17
- package/dist/components/nodes/IdeaNode.stories.svelte +48 -0
- package/dist/components/nodes/IdeaNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/IdeaNode.svelte +10 -26
- package/dist/components/nodes/NotesNode.stories.svelte +69 -0
- package/dist/components/nodes/NotesNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/NotesNode.svelte +8 -8
- package/dist/components/nodes/SimpleNode.stories.svelte +101 -0
- package/dist/components/nodes/SimpleNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/SimpleNode.svelte +16 -24
- package/dist/components/nodes/SquareNode.stories.svelte +56 -0
- package/dist/components/nodes/SquareNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/SquareNode.svelte +13 -21
- 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 +6 -6
- package/dist/components/nodes/ToolNode.stories.svelte +71 -0
- package/dist/components/nodes/ToolNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/ToolNode.svelte +7 -15
- package/dist/components/nodes/WorkflowNode.stories.svelte +50 -0
- package/dist/components/nodes/WorkflowNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/WorkflowNode.svelte +13 -13
- package/dist/components/playground/ChatPanel.svelte +48 -48
- package/dist/components/playground/ExecutionLogs.svelte +23 -23
- package/dist/components/playground/InputCollector.svelte +24 -24
- package/dist/components/playground/MessageBubble.stories.svelte +49 -0
- package/dist/components/playground/MessageBubble.stories.svelte.d.ts +27 -0
- package/dist/components/playground/MessageBubble.svelte +49 -46
- package/dist/components/playground/Playground.svelte +203 -172
- package/dist/components/playground/PlaygroundModal.svelte +5 -5
- package/dist/components/playground/SessionManager.svelte +26 -26
- package/dist/config/constants.d.ts +22 -0
- package/dist/config/constants.js +22 -0
- package/dist/config/endpoints.d.ts +19 -0
- package/dist/config/runtimeConfig.js +2 -1
- package/dist/core/index.d.ts +5 -2
- package/dist/core/index.js +9 -1
- package/dist/editor/index.d.ts +13 -9
- package/dist/editor/index.js +15 -11
- package/dist/form/code.d.ts +2 -1
- package/dist/form/code.js +1 -3
- package/dist/form/markdown.d.ts +2 -1
- package/dist/form/markdown.js +1 -3
- package/dist/helpers/workflowEditorHelper.js +13 -9
- package/dist/mocks/app-forms.js +1 -0
- package/dist/mocks/app-navigation.js +3 -1
- package/dist/mocks/app-stores.d.ts +4 -4
- package/dist/playground/index.d.ts +5 -4
- package/dist/playground/index.js +15 -11
- package/dist/playground/mount.d.ts +20 -1
- package/dist/playground/mount.js +24 -6
- package/dist/services/agentSpecExecutionService.js +2 -1
- package/dist/services/api.js +10 -18
- package/dist/services/apiVariableService.js +2 -1
- package/dist/services/autoSaveService.d.ts +3 -3
- package/dist/services/autoSaveService.js +21 -17
- package/dist/services/categoriesApi.js +13 -5
- package/dist/services/draftStorage.js +5 -4
- package/dist/services/dynamicSchemaService.js +4 -4
- package/dist/services/globalSave.d.ts +60 -11
- package/dist/services/globalSave.js +160 -83
- package/dist/services/historyService.d.ts +2 -1
- package/dist/services/historyService.js +7 -3
- package/dist/services/interruptService.js +9 -8
- package/dist/services/nodeExecutionService.js +14 -6
- package/dist/services/playgroundService.d.ts +3 -2
- package/dist/services/playgroundService.js +8 -7
- package/dist/services/portConfigApi.js +11 -7
- package/dist/services/toastService.d.ts +1 -1
- package/dist/services/toastService.js +6 -5
- package/dist/services/variableService.js +3 -2
- package/dist/settings/index.d.ts +1 -1
- package/dist/settings/index.js +1 -1
- package/dist/stores/{categoriesStore.d.ts → categoriesStore.svelte.d.ts} +3 -3
- package/dist/stores/{categoriesStore.js → categoriesStore.svelte.js} +15 -18
- package/dist/stores/editorStateMachine.svelte.d.ts +42 -0
- package/dist/stores/editorStateMachine.svelte.js +132 -0
- package/dist/stores/{historyStore.d.ts → historyStore.svelte.d.ts} +18 -15
- package/dist/stores/{historyStore.js → historyStore.svelte.js} +40 -21
- package/dist/stores/{interruptStore.d.ts → interruptStore.svelte.d.ts} +16 -15
- package/dist/stores/{interruptStore.js → interruptStore.svelte.js} +85 -94
- package/dist/stores/{playgroundStore.d.ts → playgroundStore.svelte.d.ts} +52 -34
- package/dist/stores/{playgroundStore.js → playgroundStore.svelte.js} +193 -100
- package/dist/stores/{portCoordinateStore.d.ts → portCoordinateStore.svelte.d.ts} +10 -4
- package/dist/stores/{portCoordinateStore.js → portCoordinateStore.svelte.js} +38 -35
- package/dist/stores/{settingsStore.d.ts → settingsStore.svelte.d.ts} +45 -28
- package/dist/stores/{settingsStore.js → settingsStore.svelte.js} +169 -128
- package/dist/stores/{workflowStore.d.ts → workflowStore.svelte.d.ts} +101 -65
- package/dist/stores/{workflowStore.js → workflowStore.svelte.js} +285 -239
- package/dist/stories/CanvasDecorator.svelte +50 -0
- package/dist/stories/CanvasDecorator.svelte.d.ts +8 -0
- package/dist/stories/NodeDecorator.svelte +74 -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 +114 -61
- package/dist/styles/toast.css +2 -2
- package/dist/styles/tokens.css +250 -185
- package/dist/svelte-app.d.ts +0 -6
- package/dist/svelte-app.js +13 -31
- package/dist/types/index.d.ts +2 -0
- package/dist/types/interrupt.d.ts +89 -5
- package/dist/types/interrupt.js +13 -1
- package/dist/types/playground.d.ts +42 -1
- package/dist/types/playground.js +38 -0
- package/dist/types/settings.js +1 -1
- package/dist/utils/colors.js +4 -4
- package/dist/utils/connections.js +33 -8
- package/dist/utils/icons.js +1 -1
- package/dist/utils/logger.d.ts +47 -0
- package/dist/utils/logger.js +72 -0
- package/dist/utils/nodeWrapper.js +1 -1
- package/dist/utils/sanitize.d.ts +19 -0
- package/dist/utils/sanitize.js +31 -0
- package/dist/utils/validation.d.ts +29 -0
- package/dist/utils/validation.js +39 -0
- package/package.json +243 -232
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
<script module>
|
|
2
|
+
import { defineMeta } from "@storybook/addon-svelte-csf";
|
|
3
|
+
import NodeDecorator from "../../stories/NodeDecorator.svelte";
|
|
4
|
+
import { createSampleNodeData } from "../../stories/utils.js";
|
|
5
|
+
|
|
6
|
+
const { Story } = defineMeta({
|
|
7
|
+
title: "Nodes/ToolNode",
|
|
8
|
+
tags: ["autodocs"],
|
|
9
|
+
parameters: {
|
|
10
|
+
layout: "centered",
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
<Story name="Default">
|
|
16
|
+
<NodeDecorator data={createSampleNodeData({
|
|
17
|
+
label: "AI Content Analyzer",
|
|
18
|
+
metadata: {
|
|
19
|
+
id: "ai_content_analyzer",
|
|
20
|
+
name: "AI Content Analyzer",
|
|
21
|
+
description: "AI-powered content analysis for smart text processing and context understanding",
|
|
22
|
+
category: "ai",
|
|
23
|
+
version: "1.0.0",
|
|
24
|
+
type: "tool",
|
|
25
|
+
supportedTypes: ["tool", "default"],
|
|
26
|
+
icon: "mdi:brain",
|
|
27
|
+
color: "#9C27B0",
|
|
28
|
+
inputs: [
|
|
29
|
+
{ id: "content", name: "Content to Analyze", type: "input", dataType: "mixed", required: false, description: "Text content or array of content items for AI analysis" },
|
|
30
|
+
{ id: "tool", name: "Tool", type: "input", dataType: "tool", required: false, description: "Available Tools" },
|
|
31
|
+
{ id: "trigger", name: "Trigger", type: "input", dataType: "trigger", required: false, description: "" },
|
|
32
|
+
],
|
|
33
|
+
outputs: [
|
|
34
|
+
{ id: "tool", name: "Tool", type: "output", dataType: "tool", required: false, description: "Available tools" },
|
|
35
|
+
{ id: "analyzed_content", name: "analyzed_content", type: "output", dataType: "array", required: false, description: "Content items with AI analysis results" },
|
|
36
|
+
{ id: "total_analyzed", name: "total_analyzed", type: "output", dataType: "number", required: false, description: "Total number of items analyzed" },
|
|
37
|
+
{ id: "analysis_mode", name: "analysis_mode", type: "output", dataType: "string", required: false, description: "The analysis mode used" },
|
|
38
|
+
],
|
|
39
|
+
},
|
|
40
|
+
})} />
|
|
41
|
+
</Story>
|
|
42
|
+
|
|
43
|
+
<Story name="Multiple Parameters">
|
|
44
|
+
<NodeDecorator data={createSampleNodeData({
|
|
45
|
+
label: "Content Classifier",
|
|
46
|
+
metadata: {
|
|
47
|
+
id: "content_classifier",
|
|
48
|
+
name: "Content Classifier",
|
|
49
|
+
description: "Classify content into categories (support, features, sales) for proper triage",
|
|
50
|
+
category: "ai",
|
|
51
|
+
version: "1.0.0",
|
|
52
|
+
type: "tool",
|
|
53
|
+
supportedTypes: ["tool", "default"],
|
|
54
|
+
icon: "mdi:tag-multiple",
|
|
55
|
+
color: "#9C27B0",
|
|
56
|
+
inputs: [
|
|
57
|
+
{ id: "tool", name: "Tool", type: "input", dataType: "tool", required: false, description: "Available Tools" },
|
|
58
|
+
{ id: "structured_data", name: "Structured Data", type: "input", dataType: "json", required: false, description: "Processed form data for classification" },
|
|
59
|
+
{ id: "raw_data", name: "Raw Data", type: "input", dataType: "json", required: false, description: "Original form data" },
|
|
60
|
+
{ id: "submission_id", name: "Submission ID", type: "input", dataType: "string", required: false, description: "Unique submission identifier" },
|
|
61
|
+
{ id: "trigger", name: "Trigger", type: "input", dataType: "trigger", required: false, description: "" },
|
|
62
|
+
],
|
|
63
|
+
outputs: [
|
|
64
|
+
{ id: "tool", name: "Tool", type: "output", dataType: "tool", required: false, description: "Available tools" },
|
|
65
|
+
{ id: "primary_category", name: "primary_category", type: "output", dataType: "string", required: false, description: "Primary classification category" },
|
|
66
|
+
{ id: "confidence", name: "confidence", type: "output", dataType: "number", required: false, description: "Classification confidence score (0-1)" },
|
|
67
|
+
{ id: "priority_level", name: "priority_level", type: "output", dataType: "string", required: false, description: "Priority level (normal, medium, high)" },
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
})} />
|
|
71
|
+
</Story>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export default ToolNode;
|
|
2
|
+
type ToolNode = SvelteComponent<{
|
|
3
|
+
[x: string]: never;
|
|
4
|
+
}, {
|
|
5
|
+
[evt: string]: CustomEvent<any>;
|
|
6
|
+
}, {}> & {
|
|
7
|
+
$$bindings?: string | undefined;
|
|
8
|
+
};
|
|
9
|
+
declare const ToolNode: $$__sveltets_2_IsomorphicComponent<{
|
|
10
|
+
[x: string]: never;
|
|
11
|
+
}, {
|
|
12
|
+
[evt: string]: CustomEvent<any>;
|
|
13
|
+
}, {}, {}, string>;
|
|
14
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
15
|
+
new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
|
|
16
|
+
$$bindings?: Bindings;
|
|
17
|
+
} & Exports;
|
|
18
|
+
(internal: unknown, props: {
|
|
19
|
+
$$events?: Events;
|
|
20
|
+
$$slots?: Slots;
|
|
21
|
+
}): Exports & {
|
|
22
|
+
$set?: any;
|
|
23
|
+
$on?: any;
|
|
24
|
+
};
|
|
25
|
+
z_$$bindings?: Bindings;
|
|
26
|
+
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { Position, Handle } from '@xyflow/svelte';
|
|
9
9
|
import Icon from '@iconify/svelte';
|
|
10
10
|
import { getDataTypeColor } from '../../utils/colors';
|
|
11
|
-
import type { NodeMetadata } from '../../types/index.js';
|
|
11
|
+
import type { NodeMetadata, NodePort } from '../../types/index.js';
|
|
12
12
|
|
|
13
13
|
interface ToolNodeParameter {
|
|
14
14
|
name: string;
|
|
@@ -104,18 +104,18 @@
|
|
|
104
104
|
|
|
105
105
|
// Check for matching interface ports in metadata
|
|
106
106
|
let hasToolInputPort = $derived(
|
|
107
|
-
props.data.metadata?.inputs?.some((port) => port.dataType === portDataType) || false
|
|
107
|
+
props.data.metadata?.inputs?.some((port: NodePort) => port.dataType === portDataType) || false
|
|
108
108
|
);
|
|
109
109
|
let hasToolOutputPort = $derived(
|
|
110
|
-
props.data.metadata?.outputs?.some((port) => port.dataType === portDataType) || false
|
|
110
|
+
props.data.metadata?.outputs?.some((port: NodePort) => port.dataType === portDataType) || false
|
|
111
111
|
);
|
|
112
112
|
|
|
113
113
|
// Get the actual matching ports for proper handle generation
|
|
114
114
|
let toolInputPort = $derived(
|
|
115
|
-
props.data.metadata?.inputs?.find((port) => port.dataType === portDataType)
|
|
115
|
+
props.data.metadata?.inputs?.find((port: NodePort) => port.dataType === portDataType)
|
|
116
116
|
);
|
|
117
117
|
let toolOutputPort = $derived(
|
|
118
|
-
props.data.metadata?.outputs?.find((port) => port.dataType === portDataType)
|
|
118
|
+
props.data.metadata?.outputs?.find((port: NodePort) => port.dataType === portDataType)
|
|
119
119
|
);
|
|
120
120
|
|
|
121
121
|
/**
|
|
@@ -164,7 +164,7 @@
|
|
|
164
164
|
type="target"
|
|
165
165
|
position={Position.Left}
|
|
166
166
|
id={`${props.data.nodeId}-input-${toolInputPort.id}`}
|
|
167
|
-
style="top: 40px; transform: translateY(-50%);
|
|
167
|
+
style="top: 40px; transform: translateY(-50%); z-index: 30; --fd-handle-fill: {getDataTypeColor(
|
|
168
168
|
portDataType
|
|
169
169
|
)}; --fd-handle-border-color: var(--fd-handle-border);"
|
|
170
170
|
/>
|
|
@@ -237,7 +237,7 @@
|
|
|
237
237
|
type="source"
|
|
238
238
|
position={Position.Right}
|
|
239
239
|
id={`${props.data.nodeId}-output-${toolOutputPort.id}`}
|
|
240
|
-
style="top: 40px; transform: translateY(-50%);
|
|
240
|
+
style="top: 40px; transform: translateY(-50%); z-index: 30; --fd-handle-fill: {getDataTypeColor(
|
|
241
241
|
portDataType
|
|
242
242
|
)}; --fd-handle-border-color: var(--fd-handle-border);"
|
|
243
243
|
/>
|
|
@@ -456,14 +456,6 @@
|
|
|
456
456
|
pointer-events: auto !important;
|
|
457
457
|
}
|
|
458
458
|
|
|
459
|
-
:global(.svelte-flow__node-tool .svelte-flow__handle-left) {
|
|
460
|
-
left: -10px !important;
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
:global(.svelte-flow__node-tool .svelte-flow__handle-right) {
|
|
464
|
-
right: -10px !important;
|
|
465
|
-
}
|
|
466
|
-
|
|
467
459
|
:global(.svelte-flow__node-tool .svelte-flow__handle:hover) {
|
|
468
460
|
transform: translateY(-50%) scale(1.2) !important;
|
|
469
461
|
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<script module>
|
|
2
|
+
import { defineMeta } from "@storybook/addon-svelte-csf";
|
|
3
|
+
import NodeDecorator from "../../stories/NodeDecorator.svelte";
|
|
4
|
+
import { createSampleNodeData } from "../../stories/utils.js";
|
|
5
|
+
|
|
6
|
+
const { Story } = defineMeta({
|
|
7
|
+
title: "Nodes/WorkflowNode",
|
|
8
|
+
tags: ["autodocs"],
|
|
9
|
+
parameters: {
|
|
10
|
+
layout: "centered",
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
<Story name="Default">
|
|
16
|
+
<NodeDecorator data={createSampleNodeData({
|
|
17
|
+
label: "Sub Workflow",
|
|
18
|
+
metadata: {
|
|
19
|
+
id: "sub-workflow",
|
|
20
|
+
name: "Sub Workflow",
|
|
21
|
+
description: "Execute a nested workflow",
|
|
22
|
+
category: "bundles",
|
|
23
|
+
version: "1.0.0",
|
|
24
|
+
type: "workflow",
|
|
25
|
+
icon: "mdi:sitemap",
|
|
26
|
+
inputs: [{ id: "input", name: "Input", type: "input", dataType: "any", required: false }],
|
|
27
|
+
outputs: [{ id: "output", name: "Output", type: "output", dataType: "any" }],
|
|
28
|
+
},
|
|
29
|
+
})} />
|
|
30
|
+
</Story>
|
|
31
|
+
|
|
32
|
+
<Story name="Selected">
|
|
33
|
+
<NodeDecorator data={createSampleNodeData({
|
|
34
|
+
label: "Data Pipeline",
|
|
35
|
+
metadata: {
|
|
36
|
+
id: "data-pipeline",
|
|
37
|
+
name: "Data Pipeline",
|
|
38
|
+
description: "Process data through a pipeline workflow",
|
|
39
|
+
category: "bundles",
|
|
40
|
+
version: "1.0.0",
|
|
41
|
+
type: "workflow",
|
|
42
|
+
icon: "mdi:pipe",
|
|
43
|
+
inputs: [
|
|
44
|
+
{ id: "data", name: "Data", type: "input", dataType: "any", required: true },
|
|
45
|
+
{ id: "config", name: "Config", type: "input", dataType: "object", required: false },
|
|
46
|
+
],
|
|
47
|
+
outputs: [{ id: "result", name: "Result", type: "output", dataType: "any" }],
|
|
48
|
+
},
|
|
49
|
+
})} selected={true} />
|
|
50
|
+
</Story>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export default WorkflowNode;
|
|
2
|
+
type WorkflowNode = SvelteComponent<{
|
|
3
|
+
[x: string]: never;
|
|
4
|
+
}, {
|
|
5
|
+
[evt: string]: CustomEvent<any>;
|
|
6
|
+
}, {}> & {
|
|
7
|
+
$$bindings?: string | undefined;
|
|
8
|
+
};
|
|
9
|
+
declare const WorkflowNode: $$__sveltets_2_IsomorphicComponent<{
|
|
10
|
+
[x: string]: never;
|
|
11
|
+
}, {
|
|
12
|
+
[evt: string]: CustomEvent<any>;
|
|
13
|
+
}, {}, {}, string>;
|
|
14
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
15
|
+
new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
|
|
16
|
+
$$bindings?: Bindings;
|
|
17
|
+
} & Exports;
|
|
18
|
+
(internal: unknown, props: {
|
|
19
|
+
$$events?: Events;
|
|
20
|
+
$$slots?: Slots;
|
|
21
|
+
}): Exports & {
|
|
22
|
+
$set?: any;
|
|
23
|
+
$on?: any;
|
|
24
|
+
};
|
|
25
|
+
z_$$bindings?: Bindings;
|
|
26
|
+
}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
getCategoryColorToken,
|
|
20
20
|
getPortBackgroundColor
|
|
21
21
|
} from '../../utils/colors.js';
|
|
22
|
-
import {
|
|
22
|
+
import { getConnectedHandles } from '../../stores/workflowStore.svelte.js';
|
|
23
23
|
|
|
24
24
|
interface Props {
|
|
25
25
|
data: WorkflowNode['data'] & {
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
|
|
108
108
|
// Check if port is connected
|
|
109
109
|
const handleId = `${props.data.nodeId}-${type}-${port.id}`;
|
|
110
|
-
return
|
|
110
|
+
return getConnectedHandles().has(handleId);
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
/**
|
|
@@ -218,7 +218,7 @@
|
|
|
218
218
|
position={Position.Left}
|
|
219
219
|
id={`${props.data.nodeId}-input-${port.id}`}
|
|
220
220
|
class="flowdrop-workflow-node__handle"
|
|
221
|
-
style="top: 50%; transform: translateY(-50%);
|
|
221
|
+
style="top: 50%; transform: translateY(-50%); --fd-handle-fill: {getDataTypeColorToken(
|
|
222
222
|
port.dataType
|
|
223
223
|
)}; --fd-handle-border-color: var(--fd-handle-border);"
|
|
224
224
|
role="button"
|
|
@@ -296,7 +296,7 @@
|
|
|
296
296
|
position={Position.Right}
|
|
297
297
|
id={`${props.data.nodeId}-output-${port.id}`}
|
|
298
298
|
class="flowdrop-workflow-node__handle"
|
|
299
|
-
style="top: 50%; transform: translateY(-50%);
|
|
299
|
+
style="top: 50%; transform: translateY(-50%); --fd-handle-fill: {getDataTypeColorToken(
|
|
300
300
|
port.dataType
|
|
301
301
|
)}; --fd-handle-border-color: var(--fd-handle-border);"
|
|
302
302
|
role="button"
|
|
@@ -358,7 +358,7 @@
|
|
|
358
358
|
|
|
359
359
|
.flowdrop-workflow-node__header {
|
|
360
360
|
box-sizing: border-box;
|
|
361
|
-
padding: var(--fd-node-header-gap) var(--fd-space-
|
|
361
|
+
padding: var(--fd-node-header-gap) var(--fd-space-xl);
|
|
362
362
|
border-bottom: 1px solid var(--fd-border-muted);
|
|
363
363
|
background: var(--fd-header);
|
|
364
364
|
border-top-left-radius: var(--fd-radius-xl);
|
|
@@ -375,7 +375,7 @@
|
|
|
375
375
|
.flowdrop-workflow-node__header-title {
|
|
376
376
|
display: flex;
|
|
377
377
|
align-items: center;
|
|
378
|
-
gap: var(--fd-space-
|
|
378
|
+
gap: var(--fd-space-md);
|
|
379
379
|
min-height: var(--fd-node-header-title-height);
|
|
380
380
|
flex-shrink: 0;
|
|
381
381
|
}
|
|
@@ -453,16 +453,16 @@
|
|
|
453
453
|
align-items: center;
|
|
454
454
|
gap: 0;
|
|
455
455
|
min-height: var(--fd-node-port-row-height);
|
|
456
|
-
padding: var(--fd-space-
|
|
456
|
+
padding: var(--fd-space-3xs) 0;
|
|
457
457
|
position: relative;
|
|
458
458
|
}
|
|
459
459
|
|
|
460
460
|
.flowdrop-workflow-node__port-content {
|
|
461
|
-
padding: 0 var(--fd-space-
|
|
461
|
+
padding: 0 var(--fd-space-xl);
|
|
462
462
|
}
|
|
463
463
|
|
|
464
464
|
.flowdrop-badge {
|
|
465
|
-
padding: 0.125rem var(--fd-space-
|
|
465
|
+
padding: 0.125rem var(--fd-space-3xs);
|
|
466
466
|
border-radius: var(--fd-radius-sm);
|
|
467
467
|
font-size: 0.625rem;
|
|
468
468
|
font-weight: 500;
|
|
@@ -477,7 +477,7 @@
|
|
|
477
477
|
|
|
478
478
|
.flowdrop-badge--sm {
|
|
479
479
|
font-size: 0.625rem;
|
|
480
|
-
padding: 0.125rem var(--fd-space-
|
|
480
|
+
padding: 0.125rem var(--fd-space-3xs);
|
|
481
481
|
}
|
|
482
482
|
|
|
483
483
|
/* Handle overrides: hover scale (base 20px/12px from base.css) */
|
|
@@ -495,7 +495,7 @@
|
|
|
495
495
|
}
|
|
496
496
|
|
|
497
497
|
.flowdrop-gap--2 {
|
|
498
|
-
gap: var(--fd-space-
|
|
498
|
+
gap: var(--fd-space-xs);
|
|
499
499
|
}
|
|
500
500
|
|
|
501
501
|
.flowdrop-items--center {
|
|
@@ -540,8 +540,8 @@
|
|
|
540
540
|
|
|
541
541
|
.flowdrop-workflow-node__config-btn {
|
|
542
542
|
position: absolute;
|
|
543
|
-
top: var(--fd-space-
|
|
544
|
-
right: var(--fd-space-
|
|
543
|
+
top: var(--fd-space-xs);
|
|
544
|
+
right: var(--fd-space-xs);
|
|
545
545
|
width: 1.5rem;
|
|
546
546
|
height: 1.5rem;
|
|
547
547
|
background-color: var(--fd-backdrop);
|
|
@@ -19,17 +19,17 @@
|
|
|
19
19
|
metadataToInterrupt
|
|
20
20
|
} from '../../types/interrupt.js';
|
|
21
21
|
import {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
} from '../../stores/playgroundStore.js';
|
|
22
|
+
getMessages,
|
|
23
|
+
getChatMessages,
|
|
24
|
+
getIsExecuting,
|
|
25
|
+
getSessionStatus,
|
|
26
|
+
getCurrentSession
|
|
27
|
+
} from '../../stores/playgroundStore.svelte.js';
|
|
28
28
|
import {
|
|
29
|
-
|
|
29
|
+
getInterruptsMap,
|
|
30
30
|
interruptActions,
|
|
31
31
|
getInterruptByMessageId
|
|
32
|
-
} from '../../stores/interruptStore.js';
|
|
32
|
+
} from '../../stores/interruptStore.svelte.js';
|
|
33
33
|
|
|
34
34
|
/**
|
|
35
35
|
* Component props
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
/**
|
|
116
116
|
* Filter messages based on showLogsInline setting
|
|
117
117
|
*/
|
|
118
|
-
const displayMessages = $derived(showLogsInline ?
|
|
118
|
+
const displayMessages = $derived(showLogsInline ? getMessages() : getChatMessages());
|
|
119
119
|
|
|
120
120
|
/**
|
|
121
121
|
* Track previous message count for detecting new messages.
|
|
@@ -209,7 +209,7 @@
|
|
|
209
209
|
*/
|
|
210
210
|
const interruptsByMessageId = $derived(
|
|
211
211
|
new Map(
|
|
212
|
-
Array.from(
|
|
212
|
+
Array.from(getInterruptsMap().values())
|
|
213
213
|
.filter((i) => i.messageId)
|
|
214
214
|
.map((i) => [i.messageId, i])
|
|
215
215
|
)
|
|
@@ -225,19 +225,19 @@
|
|
|
225
225
|
/**
|
|
226
226
|
* Check if we should show the welcome state
|
|
227
227
|
*/
|
|
228
|
-
const showWelcome = $derived(
|
|
228
|
+
const showWelcome = $derived(!getCurrentSession() && displayMessages.length === 0);
|
|
229
229
|
|
|
230
230
|
/**
|
|
231
231
|
* Check if we should show the empty chat state (session exists but no messages)
|
|
232
232
|
*/
|
|
233
|
-
const showEmptyChat = $derived(
|
|
233
|
+
const showEmptyChat = $derived(getCurrentSession() && displayMessages.length === 0);
|
|
234
234
|
|
|
235
235
|
/**
|
|
236
236
|
* Handle sending a message
|
|
237
237
|
*/
|
|
238
238
|
function handleSend(): void {
|
|
239
239
|
const trimmedValue = inputValue.trim();
|
|
240
|
-
if (!trimmedValue ||
|
|
240
|
+
if (!trimmedValue || getIsExecuting()) {
|
|
241
241
|
return;
|
|
242
242
|
}
|
|
243
243
|
|
|
@@ -278,7 +278,7 @@
|
|
|
278
278
|
* Disables the Run button after clicking until backend re-enables it.
|
|
279
279
|
*/
|
|
280
280
|
function handleRun(): void {
|
|
281
|
-
if (
|
|
281
|
+
if (getIsExecuting() || !runEnabled) {
|
|
282
282
|
return;
|
|
283
283
|
}
|
|
284
284
|
// Disable the Run button after clicking
|
|
@@ -318,7 +318,7 @@
|
|
|
318
318
|
* This ensures a fresh state for each session.
|
|
319
319
|
*/
|
|
320
320
|
$effect(() => {
|
|
321
|
-
const session =
|
|
321
|
+
const session = getCurrentSession();
|
|
322
322
|
if (session) {
|
|
323
323
|
// Reset to enabled state for new/changed sessions
|
|
324
324
|
runEnabled = true;
|
|
@@ -388,7 +388,7 @@
|
|
|
388
388
|
* Auto-focus input when execution completes or session becomes ready
|
|
389
389
|
*/
|
|
390
390
|
$effect(() => {
|
|
391
|
-
const currentlyExecuting =
|
|
391
|
+
const currentlyExecuting = getIsExecuting();
|
|
392
392
|
|
|
393
393
|
// Focus input when execution completes (was executing, now not)
|
|
394
394
|
if (wasExecuting && !currentlyExecuting && inputField) {
|
|
@@ -405,8 +405,8 @@
|
|
|
405
405
|
* Focus input when session status changes to idle or completed
|
|
406
406
|
*/
|
|
407
407
|
$effect(() => {
|
|
408
|
-
const status =
|
|
409
|
-
if ((status === 'idle' || status === 'completed') && inputField &&
|
|
408
|
+
const status = getSessionStatus();
|
|
409
|
+
if ((status === 'idle' || status === 'completed') && inputField && !getIsExecuting()) {
|
|
410
410
|
tick().then(() => {
|
|
411
411
|
inputField?.focus();
|
|
412
412
|
});
|
|
@@ -417,8 +417,8 @@
|
|
|
417
417
|
* Focus input when a new session is created/loaded
|
|
418
418
|
*/
|
|
419
419
|
$effect(() => {
|
|
420
|
-
const session =
|
|
421
|
-
if (session && inputField &&
|
|
420
|
+
const session = getCurrentSession();
|
|
421
|
+
if (session && inputField && !getIsExecuting()) {
|
|
422
422
|
tick().then(() => {
|
|
423
423
|
inputField?.focus();
|
|
424
424
|
});
|
|
@@ -545,7 +545,7 @@
|
|
|
545
545
|
{/if}
|
|
546
546
|
{/each}
|
|
547
547
|
|
|
548
|
-
{#if
|
|
548
|
+
{#if getIsExecuting()}
|
|
549
549
|
<div class="chat-panel__typing">
|
|
550
550
|
<div class="chat-panel__typing-indicator">
|
|
551
551
|
<span></span>
|
|
@@ -579,14 +579,14 @@
|
|
|
579
579
|
class="chat-panel__input"
|
|
580
580
|
{placeholder}
|
|
581
581
|
rows="1"
|
|
582
|
-
disabled={
|
|
582
|
+
disabled={getIsExecuting()}
|
|
583
583
|
onkeydown={handleKeydown}
|
|
584
584
|
oninput={handleInput}
|
|
585
585
|
></textarea>
|
|
586
586
|
</div>
|
|
587
587
|
{/if}
|
|
588
588
|
|
|
589
|
-
{#if
|
|
589
|
+
{#if getSessionStatus() === 'running' || getIsExecuting()}
|
|
590
590
|
<button
|
|
591
591
|
type="button"
|
|
592
592
|
class="chat-panel__stop-btn"
|
|
@@ -637,7 +637,7 @@
|
|
|
637
637
|
flex: 1;
|
|
638
638
|
min-height: 0; /* Critical: allows overflow to work in flex container */
|
|
639
639
|
overflow-y: auto;
|
|
640
|
-
padding: var(--fd-space-
|
|
640
|
+
padding: var(--fd-space-3xl);
|
|
641
641
|
scroll-behavior: smooth;
|
|
642
642
|
}
|
|
643
643
|
|
|
@@ -649,7 +649,7 @@
|
|
|
649
649
|
justify-content: center;
|
|
650
650
|
height: 100%;
|
|
651
651
|
text-align: center;
|
|
652
|
-
padding: var(--fd-space-
|
|
652
|
+
padding: var(--fd-space-4xl);
|
|
653
653
|
}
|
|
654
654
|
|
|
655
655
|
.chat-panel__welcome-icon {
|
|
@@ -658,7 +658,7 @@
|
|
|
658
658
|
justify-content: center;
|
|
659
659
|
width: 80px;
|
|
660
660
|
height: 80px;
|
|
661
|
-
margin-bottom: var(--fd-space-
|
|
661
|
+
margin-bottom: var(--fd-space-3xl);
|
|
662
662
|
color: var(--fd-foreground);
|
|
663
663
|
}
|
|
664
664
|
|
|
@@ -671,7 +671,7 @@
|
|
|
671
671
|
font-size: var(--fd-text-2xl);
|
|
672
672
|
font-weight: 600;
|
|
673
673
|
color: var(--fd-foreground);
|
|
674
|
-
margin: 0 0 var(--fd-space-
|
|
674
|
+
margin: 0 0 var(--fd-space-xs) 0;
|
|
675
675
|
}
|
|
676
676
|
|
|
677
677
|
.chat-panel__welcome-text {
|
|
@@ -684,9 +684,9 @@
|
|
|
684
684
|
.chat-panel__typing {
|
|
685
685
|
display: flex;
|
|
686
686
|
align-items: center;
|
|
687
|
-
gap: var(--fd-space-
|
|
688
|
-
padding: var(--fd-space-
|
|
689
|
-
margin-top: var(--fd-space-
|
|
687
|
+
gap: var(--fd-space-xs);
|
|
688
|
+
padding: var(--fd-space-md) var(--fd-space-xl);
|
|
689
|
+
margin-top: var(--fd-space-xs);
|
|
690
690
|
background-color: var(--fd-muted);
|
|
691
691
|
border-radius: var(--fd-radius-2xl);
|
|
692
692
|
width: fit-content;
|
|
@@ -694,12 +694,12 @@
|
|
|
694
694
|
|
|
695
695
|
.chat-panel__typing-indicator {
|
|
696
696
|
display: flex;
|
|
697
|
-
gap: var(--fd-space-
|
|
697
|
+
gap: var(--fd-space-3xs);
|
|
698
698
|
}
|
|
699
699
|
|
|
700
700
|
.chat-panel__typing-indicator span {
|
|
701
|
-
width:
|
|
702
|
-
height:
|
|
701
|
+
width: var(--fd-space-2xs);
|
|
702
|
+
height: var(--fd-space-2xs);
|
|
703
703
|
background-color: var(--fd-muted-foreground);
|
|
704
704
|
border-radius: var(--fd-radius-full);
|
|
705
705
|
animation: bounce 1.4s ease-in-out infinite;
|
|
@@ -736,7 +736,7 @@
|
|
|
736
736
|
/* Input Area - Always stays at bottom, never shrinks */
|
|
737
737
|
.chat-panel__input-area {
|
|
738
738
|
flex-shrink: 0;
|
|
739
|
-
padding: var(--fd-space-
|
|
739
|
+
padding: var(--fd-space-xl) var(--fd-space-3xl) var(--fd-space-3xl);
|
|
740
740
|
background-color: var(--fd-background);
|
|
741
741
|
border-top: 1px solid var(--fd-border-muted);
|
|
742
742
|
}
|
|
@@ -744,7 +744,7 @@
|
|
|
744
744
|
.chat-panel__input-container {
|
|
745
745
|
display: flex;
|
|
746
746
|
align-items: flex-end;
|
|
747
|
-
gap: var(--fd-space-
|
|
747
|
+
gap: var(--fd-space-md);
|
|
748
748
|
max-width: 800px;
|
|
749
749
|
margin: 0 auto;
|
|
750
750
|
}
|
|
@@ -756,7 +756,7 @@
|
|
|
756
756
|
background-color: var(--fd-background);
|
|
757
757
|
border: 1px solid var(--fd-border);
|
|
758
758
|
border-radius: var(--fd-radius-xl);
|
|
759
|
-
padding:
|
|
759
|
+
padding: var(--fd-space-sm) var(--fd-space-md);
|
|
760
760
|
transition:
|
|
761
761
|
border-color var(--fd-transition-fast),
|
|
762
762
|
box-shadow var(--fd-transition-fast);
|
|
@@ -774,7 +774,7 @@
|
|
|
774
774
|
resize: none;
|
|
775
775
|
font-family: inherit;
|
|
776
776
|
font-size: var(--fd-text-base);
|
|
777
|
-
line-height:
|
|
777
|
+
line-height: var(--fd-leading-normal);
|
|
778
778
|
max-height: 120px;
|
|
779
779
|
background: transparent;
|
|
780
780
|
color: var(--fd-foreground);
|
|
@@ -793,7 +793,7 @@
|
|
|
793
793
|
display: flex;
|
|
794
794
|
align-items: center;
|
|
795
795
|
justify-content: center;
|
|
796
|
-
padding:
|
|
796
|
+
padding: var(--fd-space-sm) var(--fd-space-2xl);
|
|
797
797
|
border: none;
|
|
798
798
|
border-radius: var(--fd-radius-lg);
|
|
799
799
|
background-color: var(--fd-foreground);
|
|
@@ -818,8 +818,8 @@
|
|
|
818
818
|
.chat-panel__stop-btn {
|
|
819
819
|
display: flex;
|
|
820
820
|
align-items: center;
|
|
821
|
-
gap: var(--fd-space-
|
|
822
|
-
padding:
|
|
821
|
+
gap: var(--fd-space-3xs);
|
|
822
|
+
padding: var(--fd-space-sm) var(--fd-space-xl);
|
|
823
823
|
border: none;
|
|
824
824
|
border-radius: var(--fd-radius-lg);
|
|
825
825
|
background-color: var(--fd-error);
|
|
@@ -839,8 +839,8 @@
|
|
|
839
839
|
.chat-panel__run-btn {
|
|
840
840
|
display: flex;
|
|
841
841
|
align-items: center;
|
|
842
|
-
gap: var(--fd-space-
|
|
843
|
-
padding:
|
|
842
|
+
gap: var(--fd-space-3xs);
|
|
843
|
+
padding: var(--fd-space-sm) var(--fd-space-2xl);
|
|
844
844
|
border: none;
|
|
845
845
|
border-radius: var(--fd-radius-lg);
|
|
846
846
|
background-color: var(--fd-success);
|
|
@@ -872,8 +872,8 @@
|
|
|
872
872
|
display: flex;
|
|
873
873
|
align-items: center;
|
|
874
874
|
justify-content: center;
|
|
875
|
-
gap: var(--fd-space-
|
|
876
|
-
padding: var(--fd-space-
|
|
875
|
+
gap: var(--fd-space-xs);
|
|
876
|
+
padding: var(--fd-space-md) var(--fd-space-xl);
|
|
877
877
|
background-color: var(--fd-muted);
|
|
878
878
|
border-radius: var(--fd-radius-lg);
|
|
879
879
|
color: var(--fd-muted-foreground);
|
|
@@ -885,21 +885,21 @@
|
|
|
885
885
|
/* Responsive */
|
|
886
886
|
@media (max-width: 640px) {
|
|
887
887
|
.chat-panel__messages {
|
|
888
|
-
padding: var(--fd-space-
|
|
888
|
+
padding: var(--fd-space-xl);
|
|
889
889
|
}
|
|
890
890
|
|
|
891
891
|
.chat-panel__input-area {
|
|
892
|
-
padding: var(--fd-space-
|
|
892
|
+
padding: var(--fd-space-md) var(--fd-space-xl) var(--fd-space-xl);
|
|
893
893
|
}
|
|
894
894
|
|
|
895
895
|
.chat-panel__input-container {
|
|
896
|
-
gap: var(--fd-space-
|
|
896
|
+
gap: var(--fd-space-xs);
|
|
897
897
|
}
|
|
898
898
|
|
|
899
899
|
.chat-panel__send-btn,
|
|
900
900
|
.chat-panel__stop-btn,
|
|
901
901
|
.chat-panel__run-btn {
|
|
902
|
-
padding: var(--fd-space-
|
|
902
|
+
padding: var(--fd-space-xs) var(--fd-space-xl);
|
|
903
903
|
}
|
|
904
904
|
}
|
|
905
905
|
</style>
|