@d34dman/flowdrop 0.0.44 → 0.0.45
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/dist/components/NodeSidebar.svelte +6 -2
- package/dist/components/WorkflowEditor.svelte +11 -9
- package/dist/components/nodes/GatewayNode.svelte +99 -78
- package/dist/components/nodes/IdeaNode.svelte +20 -35
- package/dist/components/nodes/NotesNode.svelte +6 -2
- package/dist/components/nodes/SimpleNode.svelte +32 -30
- package/dist/components/nodes/SquareNode.svelte +35 -45
- package/dist/components/nodes/TerminalNode.svelte +25 -61
- package/dist/components/nodes/ToolNode.svelte +36 -18
- package/dist/components/nodes/WorkflowNode.svelte +97 -65
- package/dist/helpers/nodeLayoutHelper.d.ts +14 -0
- package/dist/helpers/nodeLayoutHelper.js +19 -0
- package/dist/styles/base.css +40 -0
- package/dist/styles/tokens.css +36 -0
- package/dist/utils/colors.js +1 -1
- package/package.json +2 -2
|
@@ -598,7 +598,7 @@
|
|
|
598
598
|
width: 2rem;
|
|
599
599
|
height: 2rem;
|
|
600
600
|
border-radius: 0.5rem;
|
|
601
|
-
background: color-mix(in srgb, var(--_icon-color)
|
|
601
|
+
background: color-mix(in srgb, var(--_icon-color) var(--fd-node-icon-bg-opacity), transparent);
|
|
602
602
|
color: var(--fd-node-icon);
|
|
603
603
|
font-size: var(--fd-text-sm);
|
|
604
604
|
display: flex;
|
|
@@ -610,7 +610,11 @@
|
|
|
610
610
|
|
|
611
611
|
.flowdrop-node-item:hover .flowdrop-node-icon,
|
|
612
612
|
.flowdrop-details__summary:hover .flowdrop-node-icon {
|
|
613
|
-
background: color-mix(
|
|
613
|
+
background: color-mix(
|
|
614
|
+
in srgb,
|
|
615
|
+
var(--_icon-color) var(--fd-node-icon-bg-opacity-hover),
|
|
616
|
+
transparent
|
|
617
|
+
);
|
|
614
618
|
transform: scale(1.05);
|
|
615
619
|
}
|
|
616
620
|
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
} from '../helpers/workflowEditorHelper.js';
|
|
40
40
|
import type { NodeExecutionInfo } from '../types/index.js';
|
|
41
41
|
import { areNodeArraysEqual, areEdgeArraysEqual, throttle } from '../utils/performanceUtils.js';
|
|
42
|
-
import { Toaster } from
|
|
43
|
-
import { flowdropToastOptions, FLOWDROP_TOASTER_CLASS } from
|
|
42
|
+
import { Toaster } from 'svelte-5-french-toast';
|
|
43
|
+
import { flowdropToastOptions, FLOWDROP_TOASTER_CLASS } from '../services/toastService.js';
|
|
44
44
|
|
|
45
45
|
interface Props {
|
|
46
46
|
nodes?: NodeMetadata[];
|
|
@@ -530,10 +530,10 @@
|
|
|
530
530
|
|
|
531
531
|
<!-- Toast notifications container -->
|
|
532
532
|
<Toaster
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
533
|
+
position="bottom-center"
|
|
534
|
+
containerClassName={FLOWDROP_TOASTER_CLASS}
|
|
535
|
+
toastOptions={flowdropToastOptions}
|
|
536
|
+
/>
|
|
537
537
|
|
|
538
538
|
<style>
|
|
539
539
|
.flowdrop-workflow-editor {
|
|
@@ -625,10 +625,10 @@
|
|
|
625
625
|
fill: currentColor;
|
|
626
626
|
}
|
|
627
627
|
|
|
628
|
+
/* Handle size/position only; colors come from inline --fd-handle-fill and base.css ::before */
|
|
628
629
|
:global(.flowdrop-workflow-editor .svelte-flow__handle) {
|
|
629
|
-
width:
|
|
630
|
-
height:
|
|
631
|
-
border: 2px solid white;
|
|
630
|
+
width: var(--fd-handle-size);
|
|
631
|
+
height: var(--fd-handle-size);
|
|
632
632
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
633
633
|
z-index: 20;
|
|
634
634
|
}
|
|
@@ -637,6 +637,8 @@
|
|
|
637
637
|
:global(.flowdrop-workflow-editor .svelte-flow__handle) {
|
|
638
638
|
pointer-events: all;
|
|
639
639
|
cursor: crosshair;
|
|
640
|
+
background-color: var(--fd-handle-fill);
|
|
641
|
+
border-color: var(--fd-handle-border-color);
|
|
640
642
|
}
|
|
641
643
|
|
|
642
644
|
/**
|
|
@@ -13,7 +13,11 @@
|
|
|
13
13
|
import type { WorkflowNode, NodePort, Branch } from '../../types/index.js';
|
|
14
14
|
import Icon from '@iconify/svelte';
|
|
15
15
|
import { getNodeIcon } from '../../utils/icons.js';
|
|
16
|
-
import {
|
|
16
|
+
import {
|
|
17
|
+
getDataTypeColorToken,
|
|
18
|
+
getCategoryColorToken,
|
|
19
|
+
getPortBackgroundColor
|
|
20
|
+
} from '../../utils/colors.js';
|
|
17
21
|
import { connectedHandles } from '../../stores/workflowStore.js';
|
|
18
22
|
|
|
19
23
|
interface Props {
|
|
@@ -156,15 +160,18 @@
|
|
|
156
160
|
aria-label="Gateway node: {displayTitle}"
|
|
157
161
|
aria-describedby="node-description-{props.data.nodeId || 'unknown'}"
|
|
158
162
|
>
|
|
159
|
-
<!-- Node Header -->
|
|
163
|
+
<!-- Node Header: expands in multiples of 10 (title row 40px + gap 10px + description 20px per line) -->
|
|
160
164
|
<div class="flowdrop-workflow-node__header">
|
|
161
|
-
<div class="flowdrop-
|
|
165
|
+
<div class="flowdrop-workflow-node__header-title">
|
|
162
166
|
<!-- Node Icon with Squircle Background -->
|
|
163
167
|
<div
|
|
164
168
|
class="flowdrop-workflow-node__icon-wrapper"
|
|
165
169
|
style="--_icon-color: {getCategoryColorToken(props.data.metadata.category)}"
|
|
166
170
|
>
|
|
167
|
-
<Icon
|
|
171
|
+
<Icon
|
|
172
|
+
icon={getNodeIcon(props.data.metadata.icon, props.data.metadata.category)}
|
|
173
|
+
class="flowdrop-workflow-node__icon"
|
|
174
|
+
/>
|
|
168
175
|
</div>
|
|
169
176
|
|
|
170
177
|
<!-- Node Title - uses instanceTitle override if set -->
|
|
@@ -172,9 +179,9 @@
|
|
|
172
179
|
{displayTitle}
|
|
173
180
|
</h3>
|
|
174
181
|
</div>
|
|
175
|
-
<!-- Node Description -
|
|
182
|
+
<!-- Node Description - line-height 20px so header grows in steps of 10 -->
|
|
176
183
|
<p
|
|
177
|
-
class="flowdrop-
|
|
184
|
+
class="flowdrop-workflow-node__header-desc"
|
|
178
185
|
id="node-description-{props.data.nodeId || 'unknown'}"
|
|
179
186
|
>
|
|
180
187
|
{displayDescription}
|
|
@@ -184,33 +191,35 @@
|
|
|
184
191
|
<!-- Input Ports Container (filtered based on hideUnconnectedHandles) -->
|
|
185
192
|
{#if visibleInputPorts.length > 0}
|
|
186
193
|
<div class="flowdrop-workflow-node__ports">
|
|
187
|
-
<div class="flowdrop-workflow-node__ports-header">
|
|
188
|
-
<h5 class="flowdrop-workflow-node__ports-title">Inputs</h5>
|
|
189
|
-
</div>
|
|
190
194
|
<div class="flowdrop-workflow-node__ports-list">
|
|
191
|
-
{#each visibleInputPorts as port (port.id)}
|
|
195
|
+
{#each visibleInputPorts as port, inputIndex (port.id)}
|
|
192
196
|
<div class="flowdrop-workflow-node__port">
|
|
193
|
-
<!-- Input Handle -->
|
|
197
|
+
<!-- Input Handle: centered in row, at node edge (ports have no padding) -->
|
|
194
198
|
<Handle
|
|
195
199
|
type="target"
|
|
196
200
|
position={Position.Left}
|
|
197
201
|
id={`${props.data.nodeId}-input-${port.id}`}
|
|
198
202
|
class="flowdrop-workflow-node__handle"
|
|
199
|
-
style="top: 50%; transform: translateY(-50%);
|
|
203
|
+
style="top: 50%; transform: translateY(-50%); left: calc(-1 * (var(--fd-handle-size) / 2)); --fd-handle-fill: {getDataTypeColorToken(
|
|
200
204
|
port.dataType
|
|
201
|
-
)}; border-color: var(--fd-handle-border);"
|
|
205
|
+
)}; --fd-handle-border-color: var(--fd-handle-border);"
|
|
202
206
|
role="button"
|
|
203
207
|
tabindex={0}
|
|
204
208
|
aria-label="Connect to {port.name} input port"
|
|
205
209
|
/>
|
|
206
210
|
|
|
207
|
-
<!-- Port Info -->
|
|
208
|
-
<div class="flowdrop-flex--1 flowdrop-min-w--0">
|
|
211
|
+
<!-- Port Info: padding lives here so handle position is simple -->
|
|
212
|
+
<div class="flowdrop-workflow-node__port-content flowdrop-flex--1 flowdrop-min-w--0">
|
|
209
213
|
<div class="flowdrop-flex flowdrop-gap--2">
|
|
210
214
|
<span class="flowdrop-text--xs flowdrop-font--medium">{port.name}</span>
|
|
211
215
|
<span
|
|
212
216
|
class="flowdrop-badge flowdrop-badge--sm"
|
|
213
|
-
style="background-color: {getPortBackgroundColor(
|
|
217
|
+
style="background-color: {getPortBackgroundColor(
|
|
218
|
+
port.dataType,
|
|
219
|
+
15
|
|
220
|
+
)}; color: {getDataTypeColorToken(
|
|
221
|
+
port.dataType
|
|
222
|
+
)}; border: 1px solid {getPortBackgroundColor(port.dataType, 30)};"
|
|
214
223
|
>
|
|
215
224
|
{port.dataType}
|
|
216
225
|
</span>
|
|
@@ -235,18 +244,14 @@
|
|
|
235
244
|
<!-- Branches Section (Output Ports) - filtered based on hideUnconnectedHandles -->
|
|
236
245
|
{#if visibleBranches.length > 0}
|
|
237
246
|
<div class="flowdrop-workflow-node__ports">
|
|
238
|
-
<div class="flowdrop-workflow-node__ports-header">
|
|
239
|
-
<h5 class="flowdrop-workflow-node__ports-title">
|
|
240
|
-
<Icon icon="mdi:source-branch" />
|
|
241
|
-
<span>Branches ({visibleBranches.length})</span>
|
|
242
|
-
</h5>
|
|
243
|
-
</div>
|
|
244
247
|
<div class="flowdrop-workflow-node__ports-list">
|
|
245
|
-
{#each visibleBranches as branch (branch.name)}
|
|
248
|
+
{#each visibleBranches as branch, branchIndex (branch.name)}
|
|
246
249
|
{@const isActive = isBranchActive(branch.name)}
|
|
247
250
|
<div class="flowdrop-workflow-node__port">
|
|
248
|
-
<!-- Port Info -->
|
|
249
|
-
<div
|
|
251
|
+
<!-- Port Info: padding lives here so handle position is simple -->
|
|
252
|
+
<div
|
|
253
|
+
class="flowdrop-workflow-node__port-content flowdrop-flex--1 flowdrop-min-w--0 flowdrop-text--right"
|
|
254
|
+
>
|
|
250
255
|
<div
|
|
251
256
|
class="flowdrop-flex flowdrop-gap--2 flowdrop-justify--end flowdrop-items--center"
|
|
252
257
|
>
|
|
@@ -263,22 +268,29 @@
|
|
|
263
268
|
</span>
|
|
264
269
|
<span
|
|
265
270
|
class="flowdrop-badge flowdrop-badge--sm"
|
|
266
|
-
style="background-color: {getPortBackgroundColor(
|
|
271
|
+
style="background-color: {getPortBackgroundColor(
|
|
272
|
+
'trigger',
|
|
273
|
+
15
|
|
274
|
+
)}; color: {getDataTypeColorToken(
|
|
275
|
+
'trigger'
|
|
276
|
+
)}; border: 1px solid {getPortBackgroundColor('trigger', 30)};"
|
|
267
277
|
>
|
|
268
278
|
trigger
|
|
269
279
|
</span>
|
|
270
280
|
</div>
|
|
271
281
|
</div>
|
|
272
282
|
|
|
273
|
-
<!-- Output Handle
|
|
283
|
+
<!-- Output Handle: centered in row, at node edge (ports have no padding) -->
|
|
274
284
|
<Handle
|
|
275
285
|
type="source"
|
|
276
286
|
position={Position.Right}
|
|
277
287
|
id={`${props.data.nodeId}-output-${branch.name}`}
|
|
278
288
|
class={`flowdrop-workflow-node__handle ${isActive ? 'flowdrop-workflow-node__handle--active' : ''}`}
|
|
279
|
-
style="top: 50%; transform: translateY(-50%);
|
|
289
|
+
style="top: 50%; transform: translateY(-50%); right: calc(-1 * (var(--fd-handle-size) / 2)); --fd-handle-fill: {isActive
|
|
280
290
|
? getDataTypeColorToken('trigger')
|
|
281
|
-
: getDataTypeColorToken(
|
|
291
|
+
: getDataTypeColorToken(
|
|
292
|
+
'trigger'
|
|
293
|
+
)}; --fd-handle-border-color: var(--fd-handle-border);"
|
|
282
294
|
role="button"
|
|
283
295
|
tabindex={0}
|
|
284
296
|
aria-label="Connect from {branch.name} branch"
|
|
@@ -315,14 +327,14 @@
|
|
|
315
327
|
border: 1.5px solid var(--fd-node-border);
|
|
316
328
|
border-radius: var(--fd-radius-xl);
|
|
317
329
|
box-shadow: var(--fd-shadow-md);
|
|
318
|
-
width:
|
|
330
|
+
width: var(--fd-node-default-width);
|
|
319
331
|
z-index: 10;
|
|
320
332
|
color: var(--fd-foreground);
|
|
321
333
|
transition: all var(--fd-transition-fast);
|
|
322
334
|
}
|
|
323
335
|
|
|
324
336
|
.flowdrop-workflow-node--gateway {
|
|
325
|
-
min-width:
|
|
337
|
+
min-width: var(--fd-node-default-width);
|
|
326
338
|
}
|
|
327
339
|
|
|
328
340
|
.flowdrop-workflow-node:hover {
|
|
@@ -331,12 +343,16 @@
|
|
|
331
343
|
}
|
|
332
344
|
|
|
333
345
|
.flowdrop-workflow-node--selected {
|
|
334
|
-
box-shadow:
|
|
346
|
+
box-shadow:
|
|
347
|
+
0 0 0 2px var(--fd-primary-muted),
|
|
348
|
+
var(--fd-shadow-lg);
|
|
335
349
|
border-color: var(--fd-primary);
|
|
336
350
|
}
|
|
337
351
|
|
|
338
352
|
.flowdrop-workflow-node--selected:hover {
|
|
339
|
-
box-shadow:
|
|
353
|
+
box-shadow:
|
|
354
|
+
0 0 0 2px var(--fd-primary-muted),
|
|
355
|
+
var(--fd-shadow-lg);
|
|
340
356
|
border-color: var(--fd-primary);
|
|
341
357
|
}
|
|
342
358
|
|
|
@@ -346,11 +362,41 @@
|
|
|
346
362
|
}
|
|
347
363
|
|
|
348
364
|
.flowdrop-workflow-node__header {
|
|
349
|
-
|
|
365
|
+
box-sizing: border-box;
|
|
366
|
+
padding: var(--fd-node-header-gap) var(--fd-space-4);
|
|
350
367
|
border-bottom: 1px solid var(--fd-border-muted);
|
|
351
368
|
background: var(--fd-header);
|
|
352
369
|
border-top-left-radius: var(--fd-radius-xl);
|
|
353
370
|
border-top-right-radius: var(--fd-radius-xl);
|
|
371
|
+
display: flex;
|
|
372
|
+
flex-direction: column;
|
|
373
|
+
gap: var(--fd-node-header-gap);
|
|
374
|
+
min-height: calc(
|
|
375
|
+
var(--fd-node-header-gap) * 2 + var(--fd-node-header-title-height) +
|
|
376
|
+
var(--fd-node-header-desc-line)
|
|
377
|
+
);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
.flowdrop-workflow-node__header-title {
|
|
381
|
+
display: flex;
|
|
382
|
+
align-items: center;
|
|
383
|
+
gap: var(--fd-space-3);
|
|
384
|
+
min-height: var(--fd-node-header-title-height);
|
|
385
|
+
flex-shrink: 0;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
.flowdrop-workflow-node__header-desc {
|
|
389
|
+
margin: 0;
|
|
390
|
+
font-size: var(--fd-text-xs);
|
|
391
|
+
color: var(--fd-muted-foreground);
|
|
392
|
+
line-height: var(--fd-node-header-desc-line);
|
|
393
|
+
min-height: var(--fd-node-header-desc-line);
|
|
394
|
+
overflow: hidden;
|
|
395
|
+
text-overflow: ellipsis;
|
|
396
|
+
display: -webkit-box;
|
|
397
|
+
-webkit-line-clamp: 3;
|
|
398
|
+
line-clamp: 3;
|
|
399
|
+
-webkit-box-orient: vertical;
|
|
354
400
|
}
|
|
355
401
|
|
|
356
402
|
/* Squircle icon wrapper - Apple-style rounded square background */
|
|
@@ -361,13 +407,17 @@
|
|
|
361
407
|
width: 2.25rem;
|
|
362
408
|
height: 2.25rem;
|
|
363
409
|
border-radius: 0.5rem;
|
|
364
|
-
background: color-mix(in srgb, var(--_icon-color)
|
|
410
|
+
background: color-mix(in srgb, var(--_icon-color) var(--fd-node-icon-bg-opacity), transparent);
|
|
365
411
|
flex-shrink: 0;
|
|
366
412
|
transition: all var(--fd-transition-normal);
|
|
367
413
|
}
|
|
368
414
|
|
|
369
415
|
.flowdrop-workflow-node:hover .flowdrop-workflow-node__icon-wrapper {
|
|
370
|
-
background: color-mix(
|
|
416
|
+
background: color-mix(
|
|
417
|
+
in srgb,
|
|
418
|
+
var(--_icon-color) var(--fd-node-icon-bg-opacity-hover),
|
|
419
|
+
transparent
|
|
420
|
+
);
|
|
371
421
|
transform: scale(1.05);
|
|
372
422
|
}
|
|
373
423
|
|
|
@@ -377,49 +427,36 @@
|
|
|
377
427
|
color: var(--fd-node-icon);
|
|
378
428
|
}
|
|
379
429
|
|
|
380
|
-
.flowdrop-workflow-node__header h3 {
|
|
430
|
+
.flowdrop-workflow-node__header-title h3 {
|
|
381
431
|
margin: 0;
|
|
382
432
|
line-height: 1;
|
|
383
433
|
color: var(--fd-foreground);
|
|
384
434
|
}
|
|
385
435
|
|
|
386
436
|
.flowdrop-workflow-node__ports {
|
|
387
|
-
padding:
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
.flowdrop-workflow-node__ports-header {
|
|
391
|
-
margin-bottom: var(--fd-space-2);
|
|
392
|
-
display: flex;
|
|
393
|
-
align-items: center;
|
|
394
|
-
gap: var(--fd-space-1);
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
.flowdrop-workflow-node__ports-title {
|
|
398
|
-
margin: 0;
|
|
399
|
-
font-size: var(--fd-text-xs);
|
|
400
|
-
font-weight: 600;
|
|
401
|
-
color: var(--fd-foreground);
|
|
402
|
-
text-transform: uppercase;
|
|
403
|
-
letter-spacing: 0.05em;
|
|
404
|
-
display: flex;
|
|
405
|
-
align-items: center;
|
|
406
|
-
gap: var(--fd-space-2);
|
|
437
|
+
padding: 0;
|
|
407
438
|
}
|
|
408
439
|
|
|
409
440
|
.flowdrop-workflow-node__ports-list {
|
|
410
441
|
display: flex;
|
|
411
442
|
flex-direction: column;
|
|
412
|
-
gap: var(--fd-
|
|
443
|
+
gap: var(--fd-node-header-gap);
|
|
444
|
+
padding: var(--fd-node-header-gap) 0;
|
|
413
445
|
}
|
|
414
446
|
|
|
415
447
|
.flowdrop-workflow-node__port {
|
|
416
448
|
display: flex;
|
|
417
449
|
align-items: center;
|
|
418
|
-
gap:
|
|
450
|
+
gap: 0;
|
|
451
|
+
min-height: var(--fd-node-port-row-height);
|
|
419
452
|
padding: var(--fd-space-1) 0;
|
|
420
453
|
position: relative;
|
|
421
454
|
}
|
|
422
455
|
|
|
456
|
+
.flowdrop-workflow-node__port-content {
|
|
457
|
+
padding: 0 var(--fd-space-4);
|
|
458
|
+
}
|
|
459
|
+
|
|
423
460
|
.flowdrop-badge {
|
|
424
461
|
padding: 0.125rem var(--fd-space-1);
|
|
425
462
|
border-radius: var(--fd-radius-sm);
|
|
@@ -451,28 +488,12 @@
|
|
|
451
488
|
font-size: var(--fd-text-sm);
|
|
452
489
|
}
|
|
453
490
|
|
|
454
|
-
/* Handle
|
|
455
|
-
:global(.flowdrop-workflow-node__handle) {
|
|
456
|
-
width: 0.75rem;
|
|
457
|
-
height: 0.75rem;
|
|
458
|
-
background-color: var(--fd-muted-foreground);
|
|
459
|
-
border: 2px solid var(--fd-handle-border);
|
|
460
|
-
border-radius: 50%;
|
|
461
|
-
transition: all var(--fd-transition-normal);
|
|
462
|
-
cursor: pointer;
|
|
463
|
-
}
|
|
464
|
-
|
|
491
|
+
/* Handle overrides: hover scale, active state (base 20px/12px from base.css) */
|
|
465
492
|
:global(.flowdrop-workflow-node__handle:hover) {
|
|
466
|
-
|
|
467
|
-
transform: scale(1.2);
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
:global(.flowdrop-workflow-node__handle:focus) {
|
|
471
|
-
outline: 2px solid var(--fd-ring);
|
|
472
|
-
outline-offset: 2px;
|
|
493
|
+
transform: translateY(-50%) scale(1.2);
|
|
473
494
|
}
|
|
474
495
|
|
|
475
|
-
:global(.flowdrop-workflow-node__handle--active) {
|
|
496
|
+
:global(.flowdrop-workflow-node__handle--active::before) {
|
|
476
497
|
transform: scale(1.15);
|
|
477
498
|
box-shadow: 0 0 0 3px color-mix(in srgb, var(--fd-success) 20%, transparent);
|
|
478
499
|
}
|
|
@@ -144,26 +144,26 @@
|
|
|
144
144
|
tabindex="0"
|
|
145
145
|
aria-label="Idea node: {displayTitle}"
|
|
146
146
|
>
|
|
147
|
-
<!-- Left Port (Target/Input) -->
|
|
147
|
+
<!-- Left Port (Target/Input): center at top 40px (multiple of 10), 20px connection area -->
|
|
148
148
|
{#if enableLeftPort}
|
|
149
149
|
<Handle
|
|
150
150
|
type="target"
|
|
151
151
|
position={Position.Left}
|
|
152
|
-
style="
|
|
152
|
+
style="--fd-handle-fill: {getDataTypeColor(
|
|
153
153
|
IDEA_DATA_TYPE
|
|
154
|
-
)}; border-color:
|
|
154
|
+
)}; --fd-handle-border-color: var(--fd-handle-border); top: 40px; transform: translateY(-50%); margin-left: -10px; z-index: 30;"
|
|
155
155
|
id={`${props.data.nodeId}-input-left`}
|
|
156
156
|
/>
|
|
157
157
|
{/if}
|
|
158
158
|
|
|
159
|
-
<!-- Top Port (Target/Input) -->
|
|
159
|
+
<!-- Top Port (Target/Input): center at left 150px (multiple of 10), 20px connection area -->
|
|
160
160
|
{#if enableTopPort}
|
|
161
161
|
<Handle
|
|
162
162
|
type="target"
|
|
163
163
|
position={Position.Top}
|
|
164
|
-
style="
|
|
164
|
+
style="--fd-handle-fill: {getDataTypeColor(
|
|
165
165
|
IDEA_DATA_TYPE
|
|
166
|
-
)}; border-color:
|
|
166
|
+
)}; --fd-handle-border-color: var(--fd-handle-border); left: 150px; transform: translateX(-50%); margin-top: -10px; z-index: 30;"
|
|
167
167
|
id={`${props.data.nodeId}-input-top`}
|
|
168
168
|
/>
|
|
169
169
|
{/if}
|
|
@@ -208,26 +208,26 @@
|
|
|
208
208
|
<Icon icon="mdi:cog" />
|
|
209
209
|
</button>
|
|
210
210
|
|
|
211
|
-
<!-- Right Port (Source/Output) -->
|
|
211
|
+
<!-- Right Port (Source/Output): center at top 40px (multiple of 10), 20px connection area -->
|
|
212
212
|
{#if enableRightPort}
|
|
213
213
|
<Handle
|
|
214
214
|
type="source"
|
|
215
215
|
position={Position.Right}
|
|
216
|
-
style="
|
|
216
|
+
style="--fd-handle-fill: {getDataTypeColor(
|
|
217
217
|
IDEA_DATA_TYPE
|
|
218
|
-
)}; border-color:
|
|
218
|
+
)}; --fd-handle-border-color: var(--fd-handle-border); top: 40px; transform: translateY(-50%); margin-right: -10px; z-index: 30;"
|
|
219
219
|
id={`${props.data.nodeId}-output-right`}
|
|
220
220
|
/>
|
|
221
221
|
{/if}
|
|
222
222
|
|
|
223
|
-
<!-- Bottom Port (Source/Output) -->
|
|
223
|
+
<!-- Bottom Port (Source/Output): center at left 150px (multiple of 10), 20px connection area -->
|
|
224
224
|
{#if enableBottomPort}
|
|
225
225
|
<Handle
|
|
226
226
|
type="source"
|
|
227
227
|
position={Position.Bottom}
|
|
228
|
-
style="
|
|
228
|
+
style="--fd-handle-fill: {getDataTypeColor(
|
|
229
229
|
IDEA_DATA_TYPE
|
|
230
|
-
)}; border-color:
|
|
230
|
+
)}; --fd-handle-border-color: var(--fd-handle-border); left: 150px; transform: translateX(-50%); margin-bottom: -10px; z-index: 30;"
|
|
231
231
|
id={`${props.data.nodeId}-output-bottom`}
|
|
232
232
|
/>
|
|
233
233
|
{/if}
|
|
@@ -236,7 +236,8 @@
|
|
|
236
236
|
<style>
|
|
237
237
|
.flowdrop-idea-node {
|
|
238
238
|
position: relative;
|
|
239
|
-
width:
|
|
239
|
+
width: var(--fd-node-default-width);
|
|
240
|
+
min-height: var(--fd-node-simple-height);
|
|
240
241
|
cursor: pointer;
|
|
241
242
|
transition: all var(--fd-transition-normal);
|
|
242
243
|
z-index: 10;
|
|
@@ -296,7 +297,7 @@
|
|
|
296
297
|
height: 2rem;
|
|
297
298
|
background-color: color-mix(
|
|
298
299
|
in srgb,
|
|
299
|
-
var(--idea-accent-color, var(--fd-accent))
|
|
300
|
+
var(--idea-accent-color, var(--fd-accent)) var(--fd-node-icon-bg-opacity),
|
|
300
301
|
transparent
|
|
301
302
|
);
|
|
302
303
|
border-radius: var(--fd-radius-lg);
|
|
@@ -413,39 +414,28 @@
|
|
|
413
414
|
transform: scale(1.05);
|
|
414
415
|
}
|
|
415
416
|
|
|
416
|
-
/* Handle
|
|
417
|
+
/* Handle: 20px/12px from base.css; position offsets for 20px handle */
|
|
417
418
|
:global(.flowdrop-idea-node .svelte-flow__handle) {
|
|
418
|
-
width: 16px !important;
|
|
419
|
-
height: 16px !important;
|
|
420
|
-
border-radius: 50% !important;
|
|
421
|
-
border: 2px solid #ffffff !important;
|
|
422
|
-
transition: all var(--fd-transition-normal) !important;
|
|
423
|
-
cursor: pointer !important;
|
|
424
419
|
z-index: 20 !important;
|
|
425
420
|
pointer-events: auto !important;
|
|
426
421
|
}
|
|
427
422
|
|
|
428
|
-
/* Left handle positioning */
|
|
429
423
|
:global(.flowdrop-idea-node .svelte-flow__handle-left) {
|
|
430
|
-
left: -
|
|
424
|
+
left: -10px !important;
|
|
431
425
|
}
|
|
432
426
|
|
|
433
|
-
/* Right handle positioning */
|
|
434
427
|
:global(.flowdrop-idea-node .svelte-flow__handle-right) {
|
|
435
|
-
right: -
|
|
428
|
+
right: -10px !important;
|
|
436
429
|
}
|
|
437
430
|
|
|
438
|
-
/* Top handle positioning */
|
|
439
431
|
:global(.flowdrop-idea-node .svelte-flow__handle-top) {
|
|
440
|
-
top: -
|
|
432
|
+
top: -10px !important;
|
|
441
433
|
}
|
|
442
434
|
|
|
443
|
-
/* Bottom handle positioning */
|
|
444
435
|
:global(.flowdrop-idea-node .svelte-flow__handle-bottom) {
|
|
445
|
-
bottom: -
|
|
436
|
+
bottom: -10px !important;
|
|
446
437
|
}
|
|
447
438
|
|
|
448
|
-
/* Handle hover effects */
|
|
449
439
|
:global(.flowdrop-idea-node .svelte-flow__handle-left:hover),
|
|
450
440
|
:global(.flowdrop-idea-node .svelte-flow__handle-right:hover) {
|
|
451
441
|
transform: translateY(-50%) scale(1.2) !important;
|
|
@@ -456,11 +446,6 @@
|
|
|
456
446
|
transform: translateX(-50%) scale(1.2) !important;
|
|
457
447
|
}
|
|
458
448
|
|
|
459
|
-
:global(.flowdrop-idea-node .svelte-flow__handle:focus) {
|
|
460
|
-
outline: 2px solid var(--fd-ring) !important;
|
|
461
|
-
outline-offset: 2px !important;
|
|
462
|
-
}
|
|
463
|
-
|
|
464
449
|
/* Responsive design */
|
|
465
450
|
@media (max-width: 640px) {
|
|
466
451
|
.flowdrop-idea-node {
|
|
@@ -259,13 +259,17 @@
|
|
|
259
259
|
width: 2.25rem;
|
|
260
260
|
height: 2.25rem;
|
|
261
261
|
border-radius: 0.5rem;
|
|
262
|
-
background: color-mix(in srgb, var(--_notes-icon)
|
|
262
|
+
background: color-mix(in srgb, var(--_notes-icon) var(--fd-node-icon-bg-opacity), transparent);
|
|
263
263
|
flex-shrink: 0;
|
|
264
264
|
transition: all var(--fd-transition-normal);
|
|
265
265
|
}
|
|
266
266
|
|
|
267
267
|
.flowdrop-notes-node:hover .flowdrop-notes-node__icon-wrapper {
|
|
268
|
-
background: color-mix(
|
|
268
|
+
background: color-mix(
|
|
269
|
+
in srgb,
|
|
270
|
+
var(--_notes-icon) var(--fd-node-icon-bg-opacity-hover),
|
|
271
|
+
transparent
|
|
272
|
+
);
|
|
269
273
|
transform: scale(1.05);
|
|
270
274
|
}
|
|
271
275
|
|