@particle-academy/fancy-flow 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,124 +1,8 @@
1
+ import { a as NodeKindDefinition } from '../types-BodwZiST.js';
2
+ export { C as ConfigField, b as CredentialConfigField, E as ExpressionConfigField, J as JsonConfigField, N as NodeCategory, c as NumberConfigField, R as RenderBodyContext, S as SelectConfigField, d as SwitchConfigField, T as TextConfigField, e as TextareaConfigField } from '../types-BodwZiST.js';
1
3
  import * as react from 'react';
2
- import { ReactNode } from 'react';
3
- import { P as PortDescriptor, N as NodeExecutor, F as FlowNode } from '../types-TemTtb04.js';
4
4
  import { NodeProps, NodeTypes } from '@xyflow/react';
5
-
6
- /** Categories used by the palette for grouping. */
7
- type NodeCategory = "trigger" | "logic" | "data" | "ai" | "io" | "human" | "output" | "custom";
8
- /**
9
- * Tagged-union of config-field shapes the auto-form knows how to render.
10
- * Each variant has a `key` (the config object property it writes to) and
11
- * a `label`. Hosts can render fully custom panels via the kind's
12
- * `renderPanel` instead.
13
- */
14
- type ConfigField = TextConfigField | TextareaConfigField | NumberConfigField | SelectConfigField | SwitchConfigField | JsonConfigField | ExpressionConfigField | CredentialConfigField;
15
- type ConfigFieldBase = {
16
- key: string;
17
- label: string;
18
- description?: string;
19
- required?: boolean;
20
- };
21
- type TextConfigField = ConfigFieldBase & {
22
- type: "text";
23
- placeholder?: string;
24
- default?: string;
25
- };
26
- type TextareaConfigField = ConfigFieldBase & {
27
- type: "textarea";
28
- placeholder?: string;
29
- rows?: number;
30
- default?: string;
31
- };
32
- type NumberConfigField = ConfigFieldBase & {
33
- type: "number";
34
- min?: number;
35
- max?: number;
36
- step?: number;
37
- default?: number;
38
- };
39
- type SelectConfigField = ConfigFieldBase & {
40
- type: "select";
41
- options: Array<{
42
- value: string;
43
- label: string;
44
- }>;
45
- default?: string;
46
- };
47
- type SwitchConfigField = ConfigFieldBase & {
48
- type: "switch";
49
- default?: boolean;
50
- };
51
- type JsonConfigField = ConfigFieldBase & {
52
- type: "json";
53
- language?: "json" | "yaml" | "javascript";
54
- rows?: number;
55
- default?: unknown;
56
- };
57
- type ExpressionConfigField = ConfigFieldBase & {
58
- type: "expression";
59
- /** A short example string shown as placeholder, e.g. "{{ $json.name }}". */
60
- example?: string;
61
- default?: string;
62
- };
63
- type CredentialConfigField = ConfigFieldBase & {
64
- type: "credential";
65
- /** Logical credential type. The host implements lookup / picker. */
66
- credentialType: string;
67
- };
68
- /**
69
- * Context passed to a kind's optional `renderBody`. Hosts can read the
70
- * resolved config + node id to render whatever fancy-* component they
71
- * want inside the node card.
72
- */
73
- type RenderBodyContext<TConfig = unknown> = {
74
- nodeId: string;
75
- config: TConfig;
76
- selected: boolean;
77
- };
78
- /**
79
- * NodeKindDefinition — declares an authorable node type. Register one
80
- * via `registerNodeKind()`. Hosts (and the agent bridge) introspect the
81
- * registry to know what's authorable.
82
- */
83
- type NodeKindDefinition<TConfig = Record<string, unknown>, TIn = any, TOut = any> = {
84
- /** Stable identifier — used as the xyflow node `type` and the schema export key. */
85
- name: string;
86
- /** Palette grouping. */
87
- category: NodeCategory;
88
- /** Display label. */
89
- label: string;
90
- /** One-line summary surfaced in the palette + agent bridge. */
91
- description?: string;
92
- /** Emoji or icon glyph rendered in the node header. */
93
- icon?: string;
94
- /** Hex / CSS color for the header bar. Falls back to a category default. */
95
- accent?: string;
96
- /** Declarative form schema for the config panel. */
97
- configSchema?: ConfigField[];
98
- /** Default config values used when a node of this kind is created. */
99
- defaultConfig?: TConfig;
100
- /** Input ports. Defaults vary by category. */
101
- inputs?: PortDescriptor[];
102
- /** Output ports. Defaults vary by category. */
103
- outputs?: PortDescriptor[];
104
- /** Optional custom body rendered inside the node card. */
105
- renderBody?: (ctx: RenderBodyContext<TConfig>) => ReactNode;
106
- /**
107
- * Optional override for the config panel. Receives the current config and
108
- * an onChange to update it. Defaults to the auto-generated form.
109
- */
110
- renderPanel?: (props: {
111
- config: TConfig;
112
- onChange: (next: TConfig) => void;
113
- nodeId: string;
114
- }) => ReactNode;
115
- /**
116
- * Executor — host-implemented function that runs at flow execution.
117
- * Optional: built-in agentic kinds ship without one so the host wires
118
- * the actual work (memory store backend, LLM client, HTTP fetcher, etc.).
119
- */
120
- executor?: NodeExecutor<TIn, TOut>;
121
- };
5
+ import { F as FlowNode } from '../types-TemTtb04.js';
122
6
 
123
7
  /**
124
8
  * registerNodeKind — install a node kind in the global registry. Returns
@@ -166,4 +50,4 @@ declare const BUILTIN_KINDS: NodeKindDefinition[];
166
50
  */
167
51
  declare function buildNodeTypes(): NodeTypes;
168
52
 
169
- export { BUILTIN_KINDS, type ConfigField, type CredentialConfigField, type ExpressionConfigField, type JsonConfigField, type NodeCategory, type NodeKindDefinition, type NumberConfigField, RegistryNode, type RenderBodyContext, type SelectConfigField, type SwitchConfigField, type TextConfigField, type TextareaConfigField, buildNodeTypes, categoryAccent, defaultConfigFor, getNodeKind, listNodeKinds, onNodeKindsChanged, registerBuiltinKinds, registerNodeKind, validateConfig };
53
+ export { BUILTIN_KINDS, NodeKindDefinition, RegistryNode, buildNodeTypes, categoryAccent, defaultConfigFor, getNodeKind, listNodeKinds, onNodeKindsChanged, registerBuiltinKinds, registerNodeKind, validateConfig };
package/dist/styles.css CHANGED
@@ -1,3 +1,566 @@
1
+ /* node_modules/@xyflow/react/dist/style.css */
2
+ .react-flow {
3
+ direction: ltr;
4
+ --xy-edge-stroke-default: #b1b1b7;
5
+ --xy-edge-stroke-width-default: 1;
6
+ --xy-edge-stroke-selected-default: #555;
7
+ --xy-connectionline-stroke-default: #b1b1b7;
8
+ --xy-connectionline-stroke-width-default: 1;
9
+ --xy-attribution-background-color-default: rgba(255, 255, 255, 0.5);
10
+ --xy-minimap-background-color-default: #fff;
11
+ --xy-minimap-mask-background-color-default: rgba(240, 240, 240, 0.6);
12
+ --xy-minimap-mask-stroke-color-default: transparent;
13
+ --xy-minimap-mask-stroke-width-default: 1;
14
+ --xy-minimap-node-background-color-default: #e2e2e2;
15
+ --xy-minimap-node-stroke-color-default: transparent;
16
+ --xy-minimap-node-stroke-width-default: 2;
17
+ --xy-background-color-default: transparent;
18
+ --xy-background-pattern-dots-color-default: #91919a;
19
+ --xy-background-pattern-lines-color-default: #eee;
20
+ --xy-background-pattern-cross-color-default: #e2e2e2;
21
+ background-color: var(--xy-background-color, var(--xy-background-color-default));
22
+ --xy-node-color-default: inherit;
23
+ --xy-node-border-default: 1px solid #1a192b;
24
+ --xy-node-background-color-default: #fff;
25
+ --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25);
26
+ --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, 0.08);
27
+ --xy-node-boxshadow-selected-default: 0 0 0 0.5px #1a192b;
28
+ --xy-node-border-radius-default: 3px;
29
+ --xy-handle-background-color-default: #1a192b;
30
+ --xy-handle-border-color-default: #fff;
31
+ --xy-selection-background-color-default: rgba(0, 89, 220, 0.08);
32
+ --xy-selection-border-default: 1px dotted rgba(0, 89, 220, 0.8);
33
+ --xy-controls-button-background-color-default: #fefefe;
34
+ --xy-controls-button-background-color-hover-default: #f4f4f4;
35
+ --xy-controls-button-color-default: inherit;
36
+ --xy-controls-button-color-hover-default: inherit;
37
+ --xy-controls-button-border-color-default: #eee;
38
+ --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08);
39
+ --xy-edge-label-background-color-default: #ffffff;
40
+ --xy-edge-label-color-default: inherit;
41
+ --xy-resize-background-color-default: #3367d9;
42
+ }
43
+ .react-flow.dark {
44
+ --xy-edge-stroke-default: #3e3e3e;
45
+ --xy-edge-stroke-width-default: 1;
46
+ --xy-edge-stroke-selected-default: #727272;
47
+ --xy-connectionline-stroke-default: #b1b1b7;
48
+ --xy-connectionline-stroke-width-default: 1;
49
+ --xy-attribution-background-color-default: rgba(150, 150, 150, 0.25);
50
+ --xy-minimap-background-color-default: #141414;
51
+ --xy-minimap-mask-background-color-default: rgba(60, 60, 60, 0.6);
52
+ --xy-minimap-mask-stroke-color-default: transparent;
53
+ --xy-minimap-mask-stroke-width-default: 1;
54
+ --xy-minimap-node-background-color-default: #2b2b2b;
55
+ --xy-minimap-node-stroke-color-default: transparent;
56
+ --xy-minimap-node-stroke-width-default: 2;
57
+ --xy-background-color-default: #141414;
58
+ --xy-background-pattern-dots-color-default: #777;
59
+ --xy-background-pattern-lines-color-default: #777;
60
+ --xy-background-pattern-cross-color-default: #777;
61
+ --xy-node-color-default: #f8f8f8;
62
+ --xy-node-border-default: 1px solid #3c3c3c;
63
+ --xy-node-background-color-default: #1e1e1e;
64
+ --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25);
65
+ --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, 0.08);
66
+ --xy-node-boxshadow-selected-default: 0 0 0 0.5px #999;
67
+ --xy-handle-background-color-default: #bebebe;
68
+ --xy-handle-border-color-default: #1e1e1e;
69
+ --xy-selection-background-color-default: rgba(200, 200, 220, 0.08);
70
+ --xy-selection-border-default: 1px dotted rgba(200, 200, 220, 0.8);
71
+ --xy-controls-button-background-color-default: #2b2b2b;
72
+ --xy-controls-button-background-color-hover-default: #3e3e3e;
73
+ --xy-controls-button-color-default: #f8f8f8;
74
+ --xy-controls-button-color-hover-default: #fff;
75
+ --xy-controls-button-border-color-default: #5b5b5b;
76
+ --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08);
77
+ --xy-edge-label-background-color-default: #141414;
78
+ --xy-edge-label-color-default: #f8f8f8;
79
+ }
80
+ .react-flow__background {
81
+ background-color: var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));
82
+ pointer-events: none;
83
+ z-index: -1;
84
+ }
85
+ .react-flow__container {
86
+ position: absolute;
87
+ width: 100%;
88
+ height: 100%;
89
+ top: 0;
90
+ left: 0;
91
+ }
92
+ .react-flow__pane {
93
+ z-index: 1;
94
+ touch-action: none;
95
+ }
96
+ .react-flow__pane.draggable {
97
+ cursor: grab;
98
+ }
99
+ .react-flow__pane.dragging {
100
+ cursor: grabbing;
101
+ }
102
+ .react-flow__pane.selection {
103
+ cursor: pointer;
104
+ }
105
+ .react-flow__viewport {
106
+ transform-origin: 0 0;
107
+ z-index: 2;
108
+ pointer-events: none;
109
+ }
110
+ .react-flow__renderer {
111
+ z-index: 4;
112
+ }
113
+ .react-flow__selection {
114
+ z-index: 6;
115
+ }
116
+ .react-flow__nodesselection-rect:focus,
117
+ .react-flow__nodesselection-rect:focus-visible {
118
+ outline: none;
119
+ }
120
+ .react-flow__edge-path {
121
+ stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default));
122
+ stroke-width: var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));
123
+ fill: none;
124
+ }
125
+ .react-flow__connection-path {
126
+ stroke: var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));
127
+ stroke-width: var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));
128
+ fill: none;
129
+ }
130
+ .react-flow .react-flow__edges {
131
+ position: absolute;
132
+ }
133
+ .react-flow .react-flow__edges svg {
134
+ overflow: visible;
135
+ position: absolute;
136
+ pointer-events: none;
137
+ }
138
+ .react-flow__edge {
139
+ pointer-events: visibleStroke;
140
+ }
141
+ .react-flow__edge.selectable {
142
+ cursor: pointer;
143
+ }
144
+ .react-flow__edge.animated path {
145
+ stroke-dasharray: 5;
146
+ animation: dashdraw 0.5s linear infinite;
147
+ }
148
+ .react-flow__edge.animated path.react-flow__edge-interaction {
149
+ stroke-dasharray: none;
150
+ animation: none;
151
+ }
152
+ .react-flow__edge.inactive {
153
+ pointer-events: none;
154
+ }
155
+ .react-flow__edge.selected,
156
+ .react-flow__edge:focus,
157
+ .react-flow__edge:focus-visible {
158
+ outline: none;
159
+ }
160
+ .react-flow__edge.selected .react-flow__edge-path,
161
+ .react-flow__edge.selectable:focus .react-flow__edge-path,
162
+ .react-flow__edge.selectable:focus-visible .react-flow__edge-path {
163
+ stroke: var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default));
164
+ }
165
+ .react-flow__edge-textwrapper {
166
+ pointer-events: all;
167
+ }
168
+ .react-flow__edge .react-flow__edge-text {
169
+ pointer-events: none;
170
+ -webkit-user-select: none;
171
+ -moz-user-select: none;
172
+ user-select: none;
173
+ }
174
+ .react-flow__arrowhead polyline {
175
+ stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default));
176
+ }
177
+ .react-flow__arrowhead polyline.arrowclosed {
178
+ fill: var(--xy-edge-stroke, var(--xy-edge-stroke-default));
179
+ }
180
+ .react-flow__connection {
181
+ pointer-events: none;
182
+ }
183
+ .react-flow__connection .animated {
184
+ stroke-dasharray: 5;
185
+ animation: dashdraw 0.5s linear infinite;
186
+ }
187
+ svg.react-flow__connectionline {
188
+ z-index: 1001;
189
+ overflow: visible;
190
+ position: absolute;
191
+ }
192
+ .react-flow__nodes {
193
+ pointer-events: none;
194
+ transform-origin: 0 0;
195
+ }
196
+ .react-flow__node {
197
+ position: absolute;
198
+ -webkit-user-select: none;
199
+ -moz-user-select: none;
200
+ user-select: none;
201
+ pointer-events: all;
202
+ transform-origin: 0 0;
203
+ box-sizing: border-box;
204
+ cursor: default;
205
+ }
206
+ .react-flow__node.selectable {
207
+ cursor: pointer;
208
+ }
209
+ .react-flow__node.draggable {
210
+ cursor: grab;
211
+ pointer-events: all;
212
+ }
213
+ .react-flow__node.draggable.dragging {
214
+ cursor: grabbing;
215
+ }
216
+ .react-flow__nodesselection {
217
+ z-index: 3;
218
+ transform-origin: left top;
219
+ pointer-events: none;
220
+ }
221
+ .react-flow__nodesselection-rect {
222
+ position: absolute;
223
+ pointer-events: all;
224
+ cursor: grab;
225
+ }
226
+ .react-flow__handle {
227
+ position: absolute;
228
+ pointer-events: none;
229
+ min-width: 5px;
230
+ min-height: 5px;
231
+ width: 6px;
232
+ height: 6px;
233
+ background-color: var(--xy-handle-background-color, var(--xy-handle-background-color-default));
234
+ border: 1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));
235
+ border-radius: 100%;
236
+ }
237
+ .react-flow__handle.connectingfrom {
238
+ pointer-events: all;
239
+ }
240
+ .react-flow__handle.connectionindicator {
241
+ pointer-events: all;
242
+ cursor: crosshair;
243
+ }
244
+ .react-flow__handle-bottom {
245
+ top: auto;
246
+ left: 50%;
247
+ bottom: 0;
248
+ transform: translate(-50%, 50%);
249
+ }
250
+ .react-flow__handle-top {
251
+ top: 0;
252
+ left: 50%;
253
+ transform: translate(-50%, -50%);
254
+ }
255
+ .react-flow__handle-left {
256
+ top: 50%;
257
+ left: 0;
258
+ transform: translate(-50%, -50%);
259
+ }
260
+ .react-flow__handle-right {
261
+ top: 50%;
262
+ right: 0;
263
+ transform: translate(50%, -50%);
264
+ }
265
+ .react-flow__edgeupdater {
266
+ cursor: move;
267
+ pointer-events: all;
268
+ }
269
+ .react-flow__pane.selection .react-flow__panel {
270
+ pointer-events: none;
271
+ }
272
+ .react-flow__panel {
273
+ position: absolute;
274
+ z-index: 5;
275
+ margin: 15px;
276
+ }
277
+ .react-flow__panel.top {
278
+ top: 0;
279
+ }
280
+ .react-flow__panel.bottom {
281
+ bottom: 0;
282
+ }
283
+ .react-flow__panel.top.center,
284
+ .react-flow__panel.bottom.center {
285
+ left: 50%;
286
+ transform: translateX(-15px) translateX(-50%);
287
+ }
288
+ .react-flow__panel.left {
289
+ left: 0;
290
+ }
291
+ .react-flow__panel.right {
292
+ right: 0;
293
+ }
294
+ .react-flow__panel.left.center,
295
+ .react-flow__panel.right.center {
296
+ top: 50%;
297
+ transform: translateY(-15px) translateY(-50%);
298
+ }
299
+ .react-flow__attribution {
300
+ font-size: 10px;
301
+ background: var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));
302
+ padding: 2px 3px;
303
+ margin: 0;
304
+ }
305
+ .react-flow__attribution a {
306
+ text-decoration: none;
307
+ color: #999;
308
+ }
309
+ @keyframes dashdraw {
310
+ from {
311
+ stroke-dashoffset: 10;
312
+ }
313
+ }
314
+ .react-flow__edgelabel-renderer {
315
+ position: absolute;
316
+ width: 100%;
317
+ height: 100%;
318
+ pointer-events: none;
319
+ -webkit-user-select: none;
320
+ -moz-user-select: none;
321
+ user-select: none;
322
+ left: 0;
323
+ top: 0;
324
+ }
325
+ .react-flow__viewport-portal {
326
+ position: absolute;
327
+ width: 100%;
328
+ height: 100%;
329
+ left: 0;
330
+ top: 0;
331
+ -webkit-user-select: none;
332
+ -moz-user-select: none;
333
+ user-select: none;
334
+ }
335
+ .react-flow__minimap {
336
+ background: var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) );
337
+ }
338
+ .react-flow__minimap-svg {
339
+ display: block;
340
+ }
341
+ .react-flow__minimap-mask {
342
+ fill: var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );
343
+ stroke: var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );
344
+ stroke-width: var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) );
345
+ }
346
+ .react-flow__minimap-node {
347
+ fill: var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );
348
+ stroke: var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );
349
+ stroke-width: var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) );
350
+ }
351
+ .react-flow__background-pattern.dots {
352
+ fill: var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) );
353
+ }
354
+ .react-flow__background-pattern.lines {
355
+ stroke: var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) );
356
+ }
357
+ .react-flow__background-pattern.cross {
358
+ stroke: var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) );
359
+ }
360
+ .react-flow__controls {
361
+ display: flex;
362
+ flex-direction: column;
363
+ box-shadow: var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default));
364
+ }
365
+ .react-flow__controls.horizontal {
366
+ flex-direction: row;
367
+ }
368
+ .react-flow__controls-button {
369
+ display: flex;
370
+ justify-content: center;
371
+ align-items: center;
372
+ height: 26px;
373
+ width: 26px;
374
+ padding: 4px;
375
+ border: none;
376
+ background: var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));
377
+ border-bottom: 1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );
378
+ color: var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );
379
+ cursor: pointer;
380
+ -webkit-user-select: none;
381
+ -moz-user-select: none;
382
+ user-select: none;
383
+ }
384
+ .react-flow__controls-button svg {
385
+ width: 100%;
386
+ max-width: 12px;
387
+ max-height: 12px;
388
+ fill: currentColor;
389
+ }
390
+ .react-flow__edge.updating .react-flow__edge-path {
391
+ stroke: #777;
392
+ }
393
+ .react-flow__edge-text {
394
+ font-size: 10px;
395
+ }
396
+ .react-flow__node.selectable:focus,
397
+ .react-flow__node.selectable:focus-visible {
398
+ outline: none;
399
+ }
400
+ .react-flow__node-input,
401
+ .react-flow__node-default,
402
+ .react-flow__node-output,
403
+ .react-flow__node-group {
404
+ padding: 10px;
405
+ border-radius: var(--xy-node-border-radius, var(--xy-node-border-radius-default));
406
+ width: 150px;
407
+ font-size: 12px;
408
+ color: var(--xy-node-color, var(--xy-node-color-default));
409
+ text-align: center;
410
+ border: var(--xy-node-border, var(--xy-node-border-default));
411
+ background-color: var(--xy-node-background-color, var(--xy-node-background-color-default));
412
+ }
413
+ .react-flow__node-input.selectable:hover,
414
+ .react-flow__node-default.selectable:hover,
415
+ .react-flow__node-output.selectable:hover,
416
+ .react-flow__node-group.selectable:hover {
417
+ box-shadow: var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default));
418
+ }
419
+ .react-flow__node-input.selectable.selected,
420
+ .react-flow__node-input.selectable:focus,
421
+ .react-flow__node-input.selectable:focus-visible,
422
+ .react-flow__node-default.selectable.selected,
423
+ .react-flow__node-default.selectable:focus,
424
+ .react-flow__node-default.selectable:focus-visible,
425
+ .react-flow__node-output.selectable.selected,
426
+ .react-flow__node-output.selectable:focus,
427
+ .react-flow__node-output.selectable:focus-visible,
428
+ .react-flow__node-group.selectable.selected,
429
+ .react-flow__node-group.selectable:focus,
430
+ .react-flow__node-group.selectable:focus-visible {
431
+ box-shadow: var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default));
432
+ }
433
+ .react-flow__node-group {
434
+ background-color: var(--xy-node-group-background-color, var(--xy-node-group-background-color-default));
435
+ }
436
+ .react-flow__nodesselection-rect,
437
+ .react-flow__selection {
438
+ background: var(--xy-selection-background-color, var(--xy-selection-background-color-default));
439
+ border: var(--xy-selection-border, var(--xy-selection-border-default));
440
+ }
441
+ .react-flow__nodesselection-rect:focus,
442
+ .react-flow__nodesselection-rect:focus-visible,
443
+ .react-flow__selection:focus,
444
+ .react-flow__selection:focus-visible {
445
+ outline: none;
446
+ }
447
+ .react-flow__controls-button:hover {
448
+ background: var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );
449
+ color: var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) );
450
+ }
451
+ .react-flow__controls-button:disabled {
452
+ pointer-events: none;
453
+ }
454
+ .react-flow__controls-button:disabled svg {
455
+ fill-opacity: 0.4;
456
+ }
457
+ .react-flow__controls-button:last-child {
458
+ border-bottom: none;
459
+ }
460
+ .react-flow__controls.horizontal .react-flow__controls-button {
461
+ border-bottom: none;
462
+ border-right: 1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );
463
+ }
464
+ .react-flow__controls.horizontal .react-flow__controls-button:last-child {
465
+ border-right: none;
466
+ }
467
+ .react-flow__resize-control {
468
+ position: absolute;
469
+ }
470
+ .react-flow__resize-control.left,
471
+ .react-flow__resize-control.right {
472
+ cursor: ew-resize;
473
+ }
474
+ .react-flow__resize-control.top,
475
+ .react-flow__resize-control.bottom {
476
+ cursor: ns-resize;
477
+ }
478
+ .react-flow__resize-control.top.left,
479
+ .react-flow__resize-control.bottom.right {
480
+ cursor: nwse-resize;
481
+ }
482
+ .react-flow__resize-control.bottom.left,
483
+ .react-flow__resize-control.top.right {
484
+ cursor: nesw-resize;
485
+ }
486
+ .react-flow__resize-control.handle {
487
+ width: 5px;
488
+ height: 5px;
489
+ border: 1px solid #fff;
490
+ border-radius: 1px;
491
+ background-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default));
492
+ translate: -50% -50%;
493
+ }
494
+ .react-flow__resize-control.handle.left {
495
+ left: 0;
496
+ top: 50%;
497
+ }
498
+ .react-flow__resize-control.handle.right {
499
+ left: 100%;
500
+ top: 50%;
501
+ }
502
+ .react-flow__resize-control.handle.top {
503
+ left: 50%;
504
+ top: 0;
505
+ }
506
+ .react-flow__resize-control.handle.bottom {
507
+ left: 50%;
508
+ top: 100%;
509
+ }
510
+ .react-flow__resize-control.handle.top.left {
511
+ left: 0;
512
+ }
513
+ .react-flow__resize-control.handle.bottom.left {
514
+ left: 0;
515
+ }
516
+ .react-flow__resize-control.handle.top.right {
517
+ left: 100%;
518
+ }
519
+ .react-flow__resize-control.handle.bottom.right {
520
+ left: 100%;
521
+ }
522
+ .react-flow__resize-control.line {
523
+ border-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default));
524
+ border-width: 0;
525
+ border-style: solid;
526
+ }
527
+ .react-flow__resize-control.line.left,
528
+ .react-flow__resize-control.line.right {
529
+ width: 1px;
530
+ transform: translate(-50%, 0);
531
+ top: 0;
532
+ height: 100%;
533
+ }
534
+ .react-flow__resize-control.line.left {
535
+ left: 0;
536
+ border-left-width: 1px;
537
+ }
538
+ .react-flow__resize-control.line.right {
539
+ left: 100%;
540
+ border-right-width: 1px;
541
+ }
542
+ .react-flow__resize-control.line.top,
543
+ .react-flow__resize-control.line.bottom {
544
+ height: 1px;
545
+ transform: translate(0, -50%);
546
+ left: 0;
547
+ width: 100%;
548
+ }
549
+ .react-flow__resize-control.line.top {
550
+ top: 0;
551
+ border-top-width: 1px;
552
+ }
553
+ .react-flow__resize-control.line.bottom {
554
+ border-bottom-width: 1px;
555
+ top: 100%;
556
+ }
557
+ .react-flow__edge-textbg {
558
+ fill: var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default));
559
+ }
560
+ .react-flow__edge-text {
561
+ fill: var(--xy-edge-label-color, var(--xy-edge-label-color-default));
562
+ }
563
+
1
564
  /* src/styles.css */
2
565
  .ff-canvas {
3
566
  display: flex;