@d34dman/flowdrop 0.0.1 → 0.0.2
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 +307 -215
- package/dist/adapters/WorkflowAdapter.d.ts +1 -1
- package/dist/adapters/WorkflowAdapter.js +30 -30
- package/dist/api/client.d.ts +24 -1
- package/dist/api/client.js +55 -38
- package/dist/api/enhanced-client.d.ts +46 -0
- package/dist/api/enhanced-client.js +211 -0
- package/dist/clients/ApiClient.d.ts +19 -23
- package/dist/clients/ApiClient.js +36 -34
- package/dist/components/App.svelte +1299 -230
- package/dist/components/App.svelte.d.ts +21 -1
- package/dist/components/CanvasBanner.svelte +50 -44
- package/dist/components/CanvasBanner.svelte.d.ts +5 -19
- package/dist/components/ConfigForm.svelte +555 -0
- package/dist/components/ConfigForm.svelte.d.ts +32 -0
- package/dist/components/ConfigModal.svelte +261 -0
- package/dist/components/ConfigModal.svelte.d.ts +31 -0
- package/dist/components/ConfigSidebar.svelte +934 -0
- package/dist/components/ConfigSidebar.svelte.d.ts +51 -0
- package/dist/components/ConnectionLine.svelte +32 -0
- package/dist/components/ConnectionLine.svelte.d.ts +3 -0
- package/dist/components/GatewayNode.svelte +471 -0
- package/dist/components/GatewayNode.svelte.d.ts +15 -0
- package/dist/components/LoadingSpinner.svelte +23 -23
- package/dist/components/LoadingSpinner.svelte.d.ts +1 -1
- package/dist/components/Logo.svelte +82 -0
- package/dist/components/Logo.svelte.d.ts +26 -0
- package/dist/components/LogsSidebar.svelte +565 -0
- package/dist/components/LogsSidebar.svelte.d.ts +34 -0
- package/dist/components/MarkdownDisplay.svelte +28 -0
- package/dist/components/MarkdownDisplay.svelte.d.ts +7 -0
- package/dist/components/Navbar.svelte +663 -0
- package/dist/components/Navbar.svelte.d.ts +21 -0
- package/dist/components/NodeSidebar.svelte +629 -488
- package/dist/components/NodeSidebar.svelte.d.ts +1 -2
- package/dist/components/NodeStatusOverlay.svelte +327 -0
- package/dist/components/NodeStatusOverlay.svelte.d.ts +11 -0
- package/dist/components/NotesNode.svelte +566 -0
- package/dist/components/NotesNode.svelte.d.ts +43 -0
- package/dist/components/PipelineStatus.svelte +331 -0
- package/dist/components/PipelineStatus.svelte.d.ts +18 -0
- package/dist/components/SimpleNode.svelte +447 -0
- package/dist/components/SimpleNode.svelte.d.ts +24 -0
- package/dist/components/SquareNode.svelte +346 -0
- package/dist/components/SquareNode.svelte.d.ts +24 -0
- package/dist/components/StatusIcon.svelte +112 -0
- package/dist/components/StatusIcon.svelte.d.ts +10 -0
- package/dist/components/StatusLabel.svelte +33 -0
- package/dist/components/StatusLabel.svelte.d.ts +7 -0
- package/dist/components/ToolNode.svelte +385 -0
- package/dist/components/ToolNode.svelte.d.ts +36 -0
- package/dist/components/UniversalNode.svelte +126 -0
- package/dist/components/UniversalNode.svelte.d.ts +15 -0
- package/dist/components/WorkflowEditor.svelte +871 -528
- package/dist/components/WorkflowEditor.svelte.d.ts +15 -5
- package/dist/components/WorkflowNode.svelte +428 -542
- package/dist/components/WorkflowNode.svelte.d.ts +7 -3
- package/dist/config/apiConfig.d.ts +33 -0
- package/dist/config/apiConfig.js +39 -0
- package/dist/config/defaultPortConfig.d.ts +6 -0
- package/dist/config/defaultPortConfig.js +192 -0
- package/dist/config/demo.d.ts +58 -0
- package/dist/config/demo.js +142 -0
- package/dist/config/endpoints.d.ts +106 -0
- package/dist/config/endpoints.js +128 -0
- package/dist/data/samples.d.ts +38 -4
- package/dist/data/samples.js +2789 -737
- package/dist/examples/adapter-usage.d.ts +4 -4
- package/dist/examples/adapter-usage.js +21 -26
- package/dist/examples/api-client-usage.d.ts +6 -6
- package/dist/examples/api-client-usage.js +55 -54
- package/dist/index.d.ts +23 -15
- package/dist/index.js +23 -15
- 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 +21 -0
- package/dist/mocks/app-navigation.d.ts +5 -0
- package/dist/mocks/app-navigation.js +34 -0
- package/dist/mocks/app-stores.d.ts +14 -0
- package/dist/mocks/app-stores.js +26 -0
- package/dist/services/api.d.ts +13 -3
- package/dist/services/api.js +91 -36
- package/dist/services/globalSave.d.ts +20 -0
- package/dist/services/globalSave.js +165 -0
- package/dist/services/nodeExecutionService.d.ts +63 -0
- package/dist/services/nodeExecutionService.js +261 -0
- package/dist/services/portConfigApi.d.ts +14 -0
- package/dist/services/portConfigApi.js +69 -0
- package/dist/services/toastService.d.ts +147 -0
- package/dist/services/toastService.js +235 -0
- package/dist/services/workflowStorage.d.ts +2 -2
- package/dist/services/workflowStorage.js +10 -10
- package/dist/stores/workflowStore.d.ts +53 -0
- package/dist/stores/workflowStore.js +264 -0
- package/dist/styles/base.css +896 -363
- package/dist/svelte-app.d.ts +52 -5
- package/dist/svelte-app.js +128 -6
- package/dist/types/config.d.ts +291 -0
- package/dist/types/config.js +4 -0
- package/dist/types/index.d.ts +231 -19
- package/dist/types/index.js +1 -1
- package/dist/utils/colors.d.ts +67 -33
- package/dist/utils/colors.js +183 -118
- package/dist/utils/config.d.ts +41 -0
- package/dist/utils/config.js +248 -0
- package/dist/utils/connections.d.ts +40 -3
- package/dist/utils/connections.js +115 -44
- package/dist/utils/icons.d.ts +1 -1
- package/dist/utils/icons.js +71 -70
- package/dist/utils/nodeStatus.d.ts +53 -0
- package/dist/utils/nodeStatus.js +183 -0
- package/dist/utils/nodeTypes.d.ts +57 -0
- package/dist/utils/nodeTypes.js +109 -0
- package/dist/utils/nodeWrapper.d.ts +39 -0
- package/dist/utils/nodeWrapper.js +62 -0
- package/package.json +129 -97
- package/dist/components/Node.svelte +0 -38
- package/dist/components/Node.svelte.d.ts +0 -4
|
@@ -0,0 +1,566 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { NodeConfig, NodeMetadata } from '../types/index.js';
|
|
3
|
+
import Icon from '@iconify/svelte';
|
|
4
|
+
import { createEventDispatcher } from 'svelte';
|
|
5
|
+
import MarkdownDisplay from './MarkdownDisplay.svelte';
|
|
6
|
+
|
|
7
|
+
const dispatch = createEventDispatcher();
|
|
8
|
+
|
|
9
|
+
const props = $props<{
|
|
10
|
+
data: {
|
|
11
|
+
label: string;
|
|
12
|
+
config: NodeConfig;
|
|
13
|
+
metadata: NodeMetadata;
|
|
14
|
+
nodeId?: string;
|
|
15
|
+
onConfigOpen?: (node: {
|
|
16
|
+
id: string;
|
|
17
|
+
type: string;
|
|
18
|
+
data: { label: string; config: NodeConfig; metadata: NodeMetadata };
|
|
19
|
+
}) => void;
|
|
20
|
+
};
|
|
21
|
+
selected?: boolean;
|
|
22
|
+
isProcessing?: boolean;
|
|
23
|
+
isError?: boolean;
|
|
24
|
+
isEditing?: boolean;
|
|
25
|
+
}>();
|
|
26
|
+
|
|
27
|
+
// Internal state for edit mode
|
|
28
|
+
let isInternalEditing = $state(false);
|
|
29
|
+
|
|
30
|
+
// Reactive values that update when props change
|
|
31
|
+
let noteContent = $state((props.data.config?.content as string) || 'Add your notes here...');
|
|
32
|
+
let noteType = $state((props.data.config?.noteType as string) || 'info');
|
|
33
|
+
|
|
34
|
+
// Update reactive values when props change
|
|
35
|
+
$effect(() => {
|
|
36
|
+
const newContent = (props.data.config?.content as string) || 'Add your notes here...';
|
|
37
|
+
const newType = (props.data.config?.noteType as string) || 'info';
|
|
38
|
+
|
|
39
|
+
if (noteContent !== newContent) {
|
|
40
|
+
noteContent = newContent;
|
|
41
|
+
}
|
|
42
|
+
if (noteType !== newType) {
|
|
43
|
+
noteType = newType;
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// Note type configuration
|
|
48
|
+
const noteTypes = {
|
|
49
|
+
info: {
|
|
50
|
+
name: 'Info',
|
|
51
|
+
bgColor: 'bg-blue-50',
|
|
52
|
+
borderColor: 'border-blue-200',
|
|
53
|
+
textColor: 'text-blue-800',
|
|
54
|
+
iconColor: 'text-blue-500',
|
|
55
|
+
icon: 'mdi:information'
|
|
56
|
+
},
|
|
57
|
+
warning: {
|
|
58
|
+
name: 'Warning',
|
|
59
|
+
bgColor: 'bg-yellow-50',
|
|
60
|
+
borderColor: 'border-yellow-200',
|
|
61
|
+
textColor: 'text-yellow-800',
|
|
62
|
+
iconColor: 'text-yellow-500',
|
|
63
|
+
icon: 'mdi:alert'
|
|
64
|
+
},
|
|
65
|
+
success: {
|
|
66
|
+
name: 'Success',
|
|
67
|
+
bgColor: 'bg-green-50',
|
|
68
|
+
borderColor: 'border-green-200',
|
|
69
|
+
textColor: 'text-green-800',
|
|
70
|
+
iconColor: 'text-green-500',
|
|
71
|
+
icon: 'mdi:check-circle'
|
|
72
|
+
},
|
|
73
|
+
error: {
|
|
74
|
+
name: 'Error',
|
|
75
|
+
bgColor: 'bg-red-50',
|
|
76
|
+
borderColor: 'border-red-200',
|
|
77
|
+
textColor: 'text-red-800',
|
|
78
|
+
iconColor: 'text-red-500',
|
|
79
|
+
icon: 'mdi:close-circle'
|
|
80
|
+
},
|
|
81
|
+
note: {
|
|
82
|
+
name: 'Note',
|
|
83
|
+
bgColor: 'bg-gray-50',
|
|
84
|
+
borderColor: 'border-gray-200',
|
|
85
|
+
textColor: 'text-gray-800',
|
|
86
|
+
iconColor: 'text-gray-500',
|
|
87
|
+
icon: 'mdi:note-text'
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// Reactive derived values
|
|
92
|
+
let currentType = $derived(noteTypes[noteType as keyof typeof noteTypes] || noteTypes.info);
|
|
93
|
+
|
|
94
|
+
// Handle content updates
|
|
95
|
+
function handleContentChange(event: Event) {
|
|
96
|
+
const target = event.target as HTMLTextAreaElement;
|
|
97
|
+
noteContent = target.value;
|
|
98
|
+
if (props.data.config) {
|
|
99
|
+
props.data.config.content = target.value;
|
|
100
|
+
// Dispatch event to notify parent of config change
|
|
101
|
+
dispatch('configChange', { config: props.data.config });
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Handle note type changes
|
|
106
|
+
function handleTypeChange(event: Event) {
|
|
107
|
+
const target = event.target as HTMLSelectElement;
|
|
108
|
+
noteType = target.value;
|
|
109
|
+
if (props.data.config) {
|
|
110
|
+
props.data.config.noteType = target.value;
|
|
111
|
+
// Dispatch event to notify parent of config change
|
|
112
|
+
dispatch('configChange', { config: props.data.config });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Toggle edit mode
|
|
117
|
+
function toggleEditMode() {
|
|
118
|
+
isInternalEditing = !isInternalEditing;
|
|
119
|
+
// Dispatch event to notify parent of state change
|
|
120
|
+
dispatch('editModeChange', { isEditing: isInternalEditing });
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Handle configuration sidebar - now using global ConfigSidebar
|
|
124
|
+
function openConfigSidebar(): void {
|
|
125
|
+
if (props.data.onConfigOpen) {
|
|
126
|
+
// Create a WorkflowNodeType-like object for the global ConfigSidebar
|
|
127
|
+
const nodeForConfig = {
|
|
128
|
+
id: props.data.nodeId || 'unknown',
|
|
129
|
+
type: 'note',
|
|
130
|
+
data: props.data
|
|
131
|
+
};
|
|
132
|
+
props.data.onConfigOpen(nodeForConfig);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Handle node click - only handle selection, no config opening
|
|
137
|
+
function handleNodeClick(): void {
|
|
138
|
+
// Node selection is handled by Svelte Flow
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Handle double-click to open config
|
|
142
|
+
function handleDoubleClick(): void {
|
|
143
|
+
openConfigSidebar();
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Handle keyboard events
|
|
147
|
+
function handleKeydown(event: KeyboardEvent): void {
|
|
148
|
+
if (event.key === 'Enter' || event.key === ' ') {
|
|
149
|
+
event.preventDefault();
|
|
150
|
+
handleDoubleClick();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
</script>
|
|
154
|
+
|
|
155
|
+
<div
|
|
156
|
+
class="flowdrop-notes-node {currentType.bgColor}"
|
|
157
|
+
class:flowdrop-notes-node--selected={props.selected}
|
|
158
|
+
class:flowdrop-notes-node--processing={props.isProcessing}
|
|
159
|
+
class:flowdrop-notes-node--error={props.isError}
|
|
160
|
+
onclick={handleNodeClick}
|
|
161
|
+
ondblclick={handleDoubleClick}
|
|
162
|
+
onkeydown={handleKeydown}
|
|
163
|
+
role="button"
|
|
164
|
+
tabindex="0"
|
|
165
|
+
>
|
|
166
|
+
{#if isInternalEditing || props.isEditing}
|
|
167
|
+
<!-- Edit Mode -->
|
|
168
|
+
<div class="flowdrop-notes-node__edit">
|
|
169
|
+
<!-- Note Type Selector -->
|
|
170
|
+
<div class="flowdrop-notes-node__type-selector">
|
|
171
|
+
<label for="note-type" class="flowdrop-notes-node__label">Note Type:</label>
|
|
172
|
+
<select
|
|
173
|
+
id="note-type"
|
|
174
|
+
class="flowdrop-notes-node__select"
|
|
175
|
+
value={noteType}
|
|
176
|
+
onchange={handleTypeChange}
|
|
177
|
+
>
|
|
178
|
+
{#each Object.entries(noteTypes) as [key, type] (key)}
|
|
179
|
+
<option value={key}>{type.name}</option>
|
|
180
|
+
{/each}
|
|
181
|
+
</select>
|
|
182
|
+
</div>
|
|
183
|
+
|
|
184
|
+
<!-- Markdown Textarea -->
|
|
185
|
+
<div class="flowdrop-notes-node__textarea-container">
|
|
186
|
+
<label for="note-content" class="flowdrop-notes-node__label">Content (Markdown):</label>
|
|
187
|
+
<textarea
|
|
188
|
+
id="note-content"
|
|
189
|
+
class="flowdrop-notes-node__textarea"
|
|
190
|
+
placeholder="Write your note in Markdown..."
|
|
191
|
+
value={noteContent}
|
|
192
|
+
oninput={handleContentChange}
|
|
193
|
+
></textarea>
|
|
194
|
+
</div>
|
|
195
|
+
|
|
196
|
+
<!-- Save/Cancel Buttons -->
|
|
197
|
+
<div class="flowdrop-notes-node__edit-actions">
|
|
198
|
+
<button
|
|
199
|
+
class="flowdrop-notes-node__btn flowdrop-notes-node__btn--save"
|
|
200
|
+
onclick={toggleEditMode}
|
|
201
|
+
>
|
|
202
|
+
<Icon icon="mdi:check" />
|
|
203
|
+
Save
|
|
204
|
+
</button>
|
|
205
|
+
<button
|
|
206
|
+
class="flowdrop-notes-node__btn flowdrop-notes-node__btn--cancel"
|
|
207
|
+
onclick={toggleEditMode}
|
|
208
|
+
>
|
|
209
|
+
<Icon icon="mdi:close" />
|
|
210
|
+
Cancel
|
|
211
|
+
</button>
|
|
212
|
+
</div>
|
|
213
|
+
</div>
|
|
214
|
+
{:else}
|
|
215
|
+
<!-- Display Mode -->
|
|
216
|
+
<div class="flowdrop-notes-node__content {currentType.borderColor} {currentType.textColor}">
|
|
217
|
+
<!-- Header with icon, type, and edit button -->
|
|
218
|
+
<div class="flowdrop-notes-node__header">
|
|
219
|
+
<div class="flowdrop-notes-node__header-left">
|
|
220
|
+
<Icon icon={currentType.icon} class="flowdrop-notes-node__icon {currentType.iconColor}" />
|
|
221
|
+
<span class="flowdrop-notes-node__type">{currentType.name}</span>
|
|
222
|
+
</div>
|
|
223
|
+
<button class="flowdrop-notes-node__edit-btn" onclick={toggleEditMode} title="Edit note">
|
|
224
|
+
<Icon icon="mdi:pencil" />
|
|
225
|
+
</button>
|
|
226
|
+
</div>
|
|
227
|
+
|
|
228
|
+
<!-- Rendered markdown content -->
|
|
229
|
+
<div class="flowdrop-notes-node__body">
|
|
230
|
+
<MarkdownDisplay content={noteContent} className="flowdrop-notes-node__markdown" />
|
|
231
|
+
</div>
|
|
232
|
+
|
|
233
|
+
<!-- Processing indicator -->
|
|
234
|
+
{#if props.isProcessing}
|
|
235
|
+
<div class="flowdrop-notes-node__processing">
|
|
236
|
+
<div class="flowdrop-notes-node__spinner"></div>
|
|
237
|
+
<span>Processing...</span>
|
|
238
|
+
</div>
|
|
239
|
+
{/if}
|
|
240
|
+
|
|
241
|
+
<!-- Error indicator -->
|
|
242
|
+
{#if props.isError}
|
|
243
|
+
<div class="flowdrop-notes-node__error">
|
|
244
|
+
<Icon icon="mdi:alert-circle" class="flowdrop-notes-node__error-icon" />
|
|
245
|
+
<span>Error occurred</span>
|
|
246
|
+
</div>
|
|
247
|
+
{/if}
|
|
248
|
+
</div>
|
|
249
|
+
{/if}
|
|
250
|
+
|
|
251
|
+
<!-- Config button -->
|
|
252
|
+
<button
|
|
253
|
+
class="flowdrop-notes-node__config-btn"
|
|
254
|
+
onclick={openConfigSidebar}
|
|
255
|
+
title="Configure note"
|
|
256
|
+
>
|
|
257
|
+
<Icon icon="mdi:cog" />
|
|
258
|
+
</button>
|
|
259
|
+
</div>
|
|
260
|
+
|
|
261
|
+
<!-- Configuration Sidebar -->
|
|
262
|
+
<!-- ConfigSidebar removed - now using global ConfigSidebar in WorkflowEditor -->
|
|
263
|
+
|
|
264
|
+
<style>
|
|
265
|
+
.flowdrop-notes-node {
|
|
266
|
+
min-width: var(--notes-node-min-width);
|
|
267
|
+
max-width: var(--notes-node-max-width);
|
|
268
|
+
width: var(--notes-node-width);
|
|
269
|
+
border-radius: var(--notes-node-border-radius);
|
|
270
|
+
border: 1px solid;
|
|
271
|
+
background: var(--notes-node-background);
|
|
272
|
+
backdrop-filter: var(--notes-node-backdrop-filter);
|
|
273
|
+
box-shadow: var(--notes-node-box-shadow);
|
|
274
|
+
transition: var(--notes-node-transition);
|
|
275
|
+
overflow: hidden;
|
|
276
|
+
z-index: 5;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/* Background color overrides for different note types */
|
|
280
|
+
.flowdrop-notes-node.bg-blue-50 {
|
|
281
|
+
background-color: var(--notes-node-info-bg);
|
|
282
|
+
border-color: var(--notes-node-info-border);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
.flowdrop-notes-node.bg-yellow-50 {
|
|
286
|
+
background-color: var(--notes-node-warning-bg);
|
|
287
|
+
border-color: var(--notes-node-warning-border);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
.flowdrop-notes-node.bg-green-50 {
|
|
291
|
+
background-color: var(--notes-node-success-bg);
|
|
292
|
+
border-color: var(--notes-node-success-border);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
.flowdrop-notes-node.bg-red-50 {
|
|
296
|
+
background-color: var(--notes-node-error-bg);
|
|
297
|
+
border-color: var(--notes-node-error-border);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
.flowdrop-notes-node.bg-gray-50 {
|
|
301
|
+
background-color: var(--notes-node-note-bg);
|
|
302
|
+
border-color: var(--notes-node-note-border);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
.flowdrop-notes-node:hover {
|
|
306
|
+
box-shadow: var(--notes-node-hover-box-shadow);
|
|
307
|
+
transform: translateY(-1px);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
.flowdrop-notes-node--selected {
|
|
311
|
+
box-shadow: var(--notes-node-selected-box-shadow);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
.flowdrop-notes-node--processing {
|
|
315
|
+
opacity: 0.7;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
.flowdrop-notes-node--error {
|
|
319
|
+
border-color: #ef4444 !important;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/* Edit Mode Styles */
|
|
323
|
+
.flowdrop-notes-node__edit {
|
|
324
|
+
padding: var(--notes-node-padding);
|
|
325
|
+
height: 100%;
|
|
326
|
+
display: flex;
|
|
327
|
+
flex-direction: column;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
.flowdrop-notes-node__type-selector {
|
|
331
|
+
margin-bottom: 1rem;
|
|
332
|
+
flex-shrink: 0;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
.flowdrop-notes-node__label {
|
|
336
|
+
display: block;
|
|
337
|
+
font-size: 0.875rem;
|
|
338
|
+
font-weight: 600;
|
|
339
|
+
margin-bottom: 0.5rem;
|
|
340
|
+
color: #374151;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
.flowdrop-notes-node__select {
|
|
344
|
+
width: 100%;
|
|
345
|
+
padding: 0.5rem;
|
|
346
|
+
border: 1px solid #d1d5db;
|
|
347
|
+
border-radius: 0.375rem;
|
|
348
|
+
font-size: 0.875rem;
|
|
349
|
+
background-color: white;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
.flowdrop-notes-node__textarea-container {
|
|
353
|
+
margin-bottom: 1rem;
|
|
354
|
+
flex: 1;
|
|
355
|
+
display: flex;
|
|
356
|
+
flex-direction: column;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
.flowdrop-notes-node__textarea {
|
|
360
|
+
width: 100%;
|
|
361
|
+
min-height: 120px;
|
|
362
|
+
flex: 1;
|
|
363
|
+
padding: 0.75rem;
|
|
364
|
+
border: 1px solid #d1d5db;
|
|
365
|
+
border-radius: 0.375rem;
|
|
366
|
+
font-size: 0.875rem;
|
|
367
|
+
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
|
368
|
+
line-height: 1.5;
|
|
369
|
+
resize: none; /* Prevent resizing to maintain consistent size */
|
|
370
|
+
background-color: white;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
.flowdrop-notes-node__textarea:focus {
|
|
374
|
+
outline: none;
|
|
375
|
+
border-color: #3b82f6;
|
|
376
|
+
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
.flowdrop-notes-node__edit-actions {
|
|
380
|
+
display: flex;
|
|
381
|
+
gap: 0.5rem;
|
|
382
|
+
margin-top: 1rem;
|
|
383
|
+
justify-content: flex-end;
|
|
384
|
+
flex-shrink: 0;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
.flowdrop-notes-node__btn {
|
|
388
|
+
display: flex;
|
|
389
|
+
align-items: center;
|
|
390
|
+
gap: 0.25rem;
|
|
391
|
+
padding: 0.5rem 1rem;
|
|
392
|
+
border: 1px solid;
|
|
393
|
+
border-radius: 0.375rem;
|
|
394
|
+
font-size: 0.875rem;
|
|
395
|
+
font-weight: 500;
|
|
396
|
+
cursor: pointer;
|
|
397
|
+
transition: all 0.2s ease-in-out;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
.flowdrop-notes-node__btn--save {
|
|
401
|
+
background-color: #10b981;
|
|
402
|
+
border-color: #10b981;
|
|
403
|
+
color: white;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
.flowdrop-notes-node__btn--save:hover {
|
|
407
|
+
background-color: #059669;
|
|
408
|
+
border-color: #059669;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
.flowdrop-notes-node__btn--cancel {
|
|
412
|
+
background-color: transparent;
|
|
413
|
+
border-color: #d1d5db;
|
|
414
|
+
color: #374151;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
.flowdrop-notes-node__btn--cancel:hover {
|
|
418
|
+
background-color: #f3f4f6;
|
|
419
|
+
border-color: #9ca3af;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/* Display Mode Styles */
|
|
423
|
+
.flowdrop-notes-node__content {
|
|
424
|
+
padding: var(--notes-node-padding);
|
|
425
|
+
border-radius: var(--notes-node-border-radius);
|
|
426
|
+
border: 1px solid;
|
|
427
|
+
height: 100%;
|
|
428
|
+
display: flex;
|
|
429
|
+
flex-direction: column;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
.flowdrop-notes-node__header {
|
|
433
|
+
display: flex;
|
|
434
|
+
align-items: center;
|
|
435
|
+
justify-content: space-between;
|
|
436
|
+
margin-bottom: 0.75rem;
|
|
437
|
+
flex-shrink: 0;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
.flowdrop-notes-node__header-left {
|
|
441
|
+
display: flex;
|
|
442
|
+
align-items: center;
|
|
443
|
+
gap: 0.5rem;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
.flowdrop-notes-node__edit-btn {
|
|
447
|
+
display: flex;
|
|
448
|
+
align-items: center;
|
|
449
|
+
justify-content: center;
|
|
450
|
+
width: 2rem;
|
|
451
|
+
height: 2rem;
|
|
452
|
+
border: none;
|
|
453
|
+
background: transparent;
|
|
454
|
+
color: currentColor;
|
|
455
|
+
opacity: 0.7;
|
|
456
|
+
cursor: pointer;
|
|
457
|
+
border-radius: 0.25rem;
|
|
458
|
+
transition: all 0.2s ease-in-out;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
.flowdrop-notes-node__edit-btn:hover {
|
|
462
|
+
opacity: 1;
|
|
463
|
+
background-color: rgba(0, 0, 0, 0.1);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
.flowdrop-notes-node__icon {
|
|
467
|
+
width: 1.75rem;
|
|
468
|
+
height: 1.75rem;
|
|
469
|
+
flex-shrink: 0;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
.flowdrop-notes-node__type {
|
|
473
|
+
font-size: 0.875rem;
|
|
474
|
+
font-weight: 600;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
.flowdrop-notes-node__body {
|
|
478
|
+
margin-bottom: 0.5rem;
|
|
479
|
+
flex: 1;
|
|
480
|
+
overflow-y: auto;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
.flowdrop-notes-node__processing {
|
|
484
|
+
display: flex;
|
|
485
|
+
align-items: center;
|
|
486
|
+
gap: 0.5rem;
|
|
487
|
+
font-size: 0.75rem;
|
|
488
|
+
opacity: 0.7;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
.flowdrop-notes-node__spinner {
|
|
492
|
+
width: 0.75rem;
|
|
493
|
+
height: 0.75rem;
|
|
494
|
+
border: 1px solid currentColor;
|
|
495
|
+
border-top-color: transparent;
|
|
496
|
+
border-radius: 50%;
|
|
497
|
+
animation: spin 1s linear infinite;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
.flowdrop-notes-node__error {
|
|
501
|
+
display: flex;
|
|
502
|
+
align-items: center;
|
|
503
|
+
gap: 0.5rem;
|
|
504
|
+
font-size: 0.75rem;
|
|
505
|
+
color: #ef4444;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
.flowdrop-notes-node__error-icon {
|
|
509
|
+
width: 0.75rem;
|
|
510
|
+
height: 0.75rem;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
@keyframes spin {
|
|
514
|
+
to {
|
|
515
|
+
transform: rotate(360deg);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
.flowdrop-notes-node__config-btn {
|
|
520
|
+
position: absolute;
|
|
521
|
+
top: 0.5rem;
|
|
522
|
+
right: 0.5rem;
|
|
523
|
+
width: 1.5rem;
|
|
524
|
+
height: 1.5rem;
|
|
525
|
+
background-color: rgba(255, 255, 255, 0.9);
|
|
526
|
+
border: 1px solid #e5e7eb;
|
|
527
|
+
border-radius: 0.25rem;
|
|
528
|
+
color: #6b7280;
|
|
529
|
+
cursor: pointer;
|
|
530
|
+
display: flex;
|
|
531
|
+
align-items: center;
|
|
532
|
+
justify-content: center;
|
|
533
|
+
opacity: 0;
|
|
534
|
+
transition: all 0.2s ease-in-out;
|
|
535
|
+
backdrop-filter: blur(4px);
|
|
536
|
+
z-index: 15;
|
|
537
|
+
font-size: 0.875rem;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
.flowdrop-notes-node:hover .flowdrop-notes-node__config-btn {
|
|
541
|
+
opacity: 1;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
.flowdrop-notes-node__config-btn:hover {
|
|
545
|
+
background-color: #f9fafb;
|
|
546
|
+
border-color: #d1d5db;
|
|
547
|
+
color: #374151;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
/* Responsive design */
|
|
551
|
+
@media (max-width: 640px) {
|
|
552
|
+
.flowdrop-notes-node {
|
|
553
|
+
min-width: 200px;
|
|
554
|
+
max-width: 350px;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
.flowdrop-notes-node__edit,
|
|
558
|
+
.flowdrop-notes-node__content {
|
|
559
|
+
padding: 0.75rem;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
.flowdrop-notes-node__textarea {
|
|
563
|
+
min-height: 100px;
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
</style>
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { NodeConfig, NodeMetadata } from '../types/index.js';
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
data: {
|
|
4
|
+
label: string;
|
|
5
|
+
config: NodeConfig;
|
|
6
|
+
metadata: NodeMetadata;
|
|
7
|
+
nodeId?: string;
|
|
8
|
+
onConfigOpen?: (node: {
|
|
9
|
+
id: string;
|
|
10
|
+
type: string;
|
|
11
|
+
data: {
|
|
12
|
+
label: string;
|
|
13
|
+
config: NodeConfig;
|
|
14
|
+
metadata: NodeMetadata;
|
|
15
|
+
};
|
|
16
|
+
}) => void;
|
|
17
|
+
};
|
|
18
|
+
selected?: boolean;
|
|
19
|
+
isProcessing?: boolean;
|
|
20
|
+
isError?: boolean;
|
|
21
|
+
isEditing?: boolean;
|
|
22
|
+
};
|
|
23
|
+
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> {
|
|
24
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
25
|
+
$$bindings?: Bindings;
|
|
26
|
+
} & Exports;
|
|
27
|
+
(internal: unknown, props: Props & {
|
|
28
|
+
$$events?: Events;
|
|
29
|
+
$$slots?: Slots;
|
|
30
|
+
}): Exports & {
|
|
31
|
+
$set?: any;
|
|
32
|
+
$on?: any;
|
|
33
|
+
};
|
|
34
|
+
z_$$bindings?: Bindings;
|
|
35
|
+
}
|
|
36
|
+
declare const NotesNode: $$__sveltets_2_IsomorphicComponent<$$ComponentProps, {
|
|
37
|
+
configChange: CustomEvent<any>;
|
|
38
|
+
editModeChange: CustomEvent<any>;
|
|
39
|
+
} & {
|
|
40
|
+
[evt: string]: CustomEvent<any>;
|
|
41
|
+
}, {}, {}, "">;
|
|
42
|
+
type NotesNode = InstanceType<typeof NotesNode>;
|
|
43
|
+
export default NotesNode;
|