@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.
@@ -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) 15%, transparent);
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(in srgb, var(--_icon-color) 22%, transparent);
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 "svelte-5-french-toast";
43
- import { flowdropToastOptions, FLOWDROP_TOASTER_CLASS } from "../services/toastService.js";
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
- position="bottom-center"
534
- containerClassName={FLOWDROP_TOASTER_CLASS}
535
- toastOptions={flowdropToastOptions}
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: 18px;
630
- height: 18px;
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 { getDataTypeColorToken, getCategoryColorToken, getPortBackgroundColor } from '../../utils/colors.js';
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-flex flowdrop-gap--3 flowdrop-items--center">
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 icon={getNodeIcon(props.data.metadata.icon, props.data.metadata.category)} class="flowdrop-workflow-node__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 - uses instanceDescription override if set -->
182
+ <!-- Node Description - line-height 20px so header grows in steps of 10 -->
176
183
  <p
177
- class="flowdrop-text--xs flowdrop-text--gray flowdrop-truncate flowdrop-mt--1"
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%); margin-left: -32px; background-color: {getDataTypeColorToken(
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(port.dataType, 15)}; color: {getDataTypeColorToken(port.dataType)}; border: 1px solid {getPortBackgroundColor(port.dataType, 30)};"
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 class="flowdrop-flex--1 flowdrop-min-w--0 flowdrop-text--right">
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('trigger', 15)}; color: {getDataTypeColorToken('trigger')}; border: 1px solid {getPortBackgroundColor('trigger', 30)};"
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 - Generated from branch name -->
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%); margin-right: -32px; background-color: {isActive
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('trigger')}; border-color: var(--fd-handle-border);"
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: 18rem;
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: 18rem;
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: 0 0 0 2px var(--fd-primary-muted), var(--fd-shadow-lg);
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: 0 0 0 2px var(--fd-primary-muted), var(--fd-shadow-lg);
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
- padding: var(--fd-space-4);
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) 15%, transparent);
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(in srgb, var(--_icon-color) 22%, transparent);
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: var(--fd-space-3) var(--fd-space-4);
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-space-2);
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: var(--fd-space-2);
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 styles */
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
- background-color: var(--fd-primary);
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="background-color: {getDataTypeColor(
152
+ style="--fd-handle-fill: {getDataTypeColor(
153
153
  IDEA_DATA_TYPE
154
- )}; border-color: #ffffff; top: 50%; transform: translateY(-50%); z-index: 30;"
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="background-color: {getDataTypeColor(
164
+ style="--fd-handle-fill: {getDataTypeColor(
165
165
  IDEA_DATA_TYPE
166
- )}; border-color: #ffffff; left: 50%; transform: translateX(-50%); z-index: 30;"
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="background-color: {getDataTypeColor(
216
+ style="--fd-handle-fill: {getDataTypeColor(
217
217
  IDEA_DATA_TYPE
218
- )}; border-color: #ffffff; top: 50%; transform: translateY(-50%); z-index: 30;"
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="background-color: {getDataTypeColor(
228
+ style="--fd-handle-fill: {getDataTypeColor(
229
229
  IDEA_DATA_TYPE
230
- )}; border-color: #ffffff; left: 50%; transform: translateX(-50%); z-index: 30;"
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: 18rem;
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)) 15%,
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 styles */
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: -8px !important;
424
+ left: -10px !important;
431
425
  }
432
426
 
433
- /* Right handle positioning */
434
427
  :global(.flowdrop-idea-node .svelte-flow__handle-right) {
435
- right: -8px !important;
428
+ right: -10px !important;
436
429
  }
437
430
 
438
- /* Top handle positioning */
439
431
  :global(.flowdrop-idea-node .svelte-flow__handle-top) {
440
- top: -8px !important;
432
+ top: -10px !important;
441
433
  }
442
434
 
443
- /* Bottom handle positioning */
444
435
  :global(.flowdrop-idea-node .svelte-flow__handle-bottom) {
445
- bottom: -8px !important;
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) 15%, transparent);
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(in srgb, var(--_notes-icon) 22%, transparent);
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