@genfeedai/workflow-ui 0.1.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.
Files changed (86) hide show
  1. package/dist/canvas.d.mts +27 -0
  2. package/dist/canvas.d.ts +27 -0
  3. package/dist/canvas.js +45 -0
  4. package/dist/canvas.mjs +16 -0
  5. package/dist/chunk-22PDGHNQ.mjs +737 -0
  6. package/dist/chunk-3SPPKCWR.js +458 -0
  7. package/dist/chunk-3YFFDHC5.js +300 -0
  8. package/dist/chunk-5HJFQVUR.js +61 -0
  9. package/dist/chunk-5LQ4QBR5.js +2 -0
  10. package/dist/chunk-6DOEUDD5.js +254 -0
  11. package/dist/chunk-7SKSRSS7.mjs +57 -0
  12. package/dist/chunk-AC6TWLRT.mjs +27 -0
  13. package/dist/chunk-ADWNF7V3.js +120 -0
  14. package/dist/chunk-BJ3R5R32.mjs +2163 -0
  15. package/dist/chunk-CETJJ73S.js +1555 -0
  16. package/dist/chunk-CSUBLSKZ.mjs +1002 -0
  17. package/dist/chunk-CV4M7CNU.mjs +251 -0
  18. package/dist/chunk-E323WAZG.mjs +272 -0
  19. package/dist/chunk-E544XUBL.js +378 -0
  20. package/dist/chunk-EC2ZIWOK.js +1007 -0
  21. package/dist/chunk-EFXQT23N.mjs +99 -0
  22. package/dist/chunk-EMUMKW5C.js +107 -0
  23. package/dist/chunk-FOMOOERN.js +2 -0
  24. package/dist/chunk-FT33LFII.mjs +21 -0
  25. package/dist/chunk-FT64PCUP.mjs +533 -0
  26. package/dist/chunk-H6LZKSLY.js +5678 -0
  27. package/dist/chunk-HPQT36RR.js +543 -0
  28. package/dist/chunk-JLWKW3G5.js +2 -0
  29. package/dist/chunk-L5TF4EHW.mjs +1 -0
  30. package/dist/chunk-LAJ34AH2.mjs +374 -0
  31. package/dist/chunk-LDN7IX4Y.mjs +1 -0
  32. package/dist/chunk-MLJJBBTB.mjs +1 -0
  33. package/dist/chunk-NSDLGLAQ.js +2166 -0
  34. package/dist/chunk-RJ262NXS.js +24 -0
  35. package/dist/chunk-RXNEDWK2.js +141 -0
  36. package/dist/chunk-SW7QNEZU.js +744 -0
  37. package/dist/chunk-UQQUWGHW.mjs +118 -0
  38. package/dist/chunk-VOGL2WCE.mjs +1542 -0
  39. package/dist/chunk-VRN3UWE5.mjs +138 -0
  40. package/dist/chunk-XV5Z5XYR.mjs +5640 -0
  41. package/dist/chunk-Z7PWFZG5.js +30 -0
  42. package/dist/chunk-ZJD5WMR3.mjs +418 -0
  43. package/dist/hooks.d.mts +255 -0
  44. package/dist/hooks.d.ts +255 -0
  45. package/dist/hooks.js +56 -0
  46. package/dist/hooks.mjs +11 -0
  47. package/dist/index.d.mts +29 -0
  48. package/dist/index.d.ts +29 -0
  49. package/dist/index.js +180 -0
  50. package/dist/index.mjs +19 -0
  51. package/dist/lib.d.mts +164 -0
  52. package/dist/lib.d.ts +164 -0
  53. package/dist/lib.js +144 -0
  54. package/dist/lib.mjs +3 -0
  55. package/dist/nodes.d.mts +128 -0
  56. package/dist/nodes.d.ts +128 -0
  57. package/dist/nodes.js +151 -0
  58. package/dist/nodes.mjs +14 -0
  59. package/dist/panels.d.mts +22 -0
  60. package/dist/panels.d.ts +22 -0
  61. package/dist/panels.js +21 -0
  62. package/dist/panels.mjs +4 -0
  63. package/dist/promptLibraryStore-BZnfmEkc.d.ts +464 -0
  64. package/dist/promptLibraryStore-zqb59nsu.d.mts +464 -0
  65. package/dist/provider.d.mts +29 -0
  66. package/dist/provider.d.ts +29 -0
  67. package/dist/provider.js +17 -0
  68. package/dist/provider.mjs +4 -0
  69. package/dist/stores.d.mts +96 -0
  70. package/dist/stores.d.ts +96 -0
  71. package/dist/stores.js +113 -0
  72. package/dist/stores.mjs +43 -0
  73. package/dist/toolbar.d.mts +73 -0
  74. package/dist/toolbar.d.ts +73 -0
  75. package/dist/toolbar.js +34 -0
  76. package/dist/toolbar.mjs +5 -0
  77. package/dist/types-ipAnBzAJ.d.mts +46 -0
  78. package/dist/types-ipAnBzAJ.d.ts +46 -0
  79. package/dist/ui.d.mts +67 -0
  80. package/dist/ui.d.ts +67 -0
  81. package/dist/ui.js +84 -0
  82. package/dist/ui.mjs +3 -0
  83. package/dist/workflowStore-4EGKJLYK.mjs +3 -0
  84. package/dist/workflowStore-KM32FDL7.js +12 -0
  85. package/package.json +117 -0
  86. package/src/styles/workflow-ui.css +186 -0
package/dist/ui.d.ts ADDED
@@ -0,0 +1,67 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as class_variance_authority_types from 'class-variance-authority/types';
3
+ import { VariantProps } from 'class-variance-authority';
4
+ import * as react from 'react';
5
+ import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
6
+ import * as LabelPrimitive from '@radix-ui/react-label';
7
+ import * as SelectPrimitive from '@radix-ui/react-select';
8
+ import * as SliderPrimitive from '@radix-ui/react-slider';
9
+ import { ClassValue } from 'clsx';
10
+
11
+ declare const buttonVariants: (props?: ({
12
+ variant?: "link" | "default" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
13
+ size?: "default" | "sm" | "lg" | "icon" | "icon-sm" | "icon-lg" | null | undefined;
14
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
15
+ declare function Button({ className, variant, size, asChild, ...props }: react.ComponentProps<'button'> & VariantProps<typeof buttonVariants> & {
16
+ asChild?: boolean;
17
+ }): react_jsx_runtime.JSX.Element;
18
+
19
+ declare function Checkbox({ className, ...props }: react.ComponentProps<typeof CheckboxPrimitive.Root>): react_jsx_runtime.JSX.Element;
20
+
21
+ interface ComparisonSliderProps {
22
+ beforeSrc: string;
23
+ afterSrc: string;
24
+ beforeLabel?: string;
25
+ afterLabel?: string;
26
+ position: number;
27
+ onPositionChange: (position: number) => void;
28
+ height?: number;
29
+ className?: string;
30
+ }
31
+ declare function ComparisonSliderComponent({ beforeSrc, afterSrc, beforeLabel, afterLabel, position, onPositionChange, height, className, }: ComparisonSliderProps): react_jsx_runtime.JSX.Element;
32
+ declare const ComparisonSlider: react.MemoExoticComponent<typeof ComparisonSliderComponent>;
33
+
34
+ interface GridPosition {
35
+ x: number;
36
+ y: number;
37
+ }
38
+ interface GridPositionSelectorProps {
39
+ position: GridPosition;
40
+ onPositionChange: (position: GridPosition) => void;
41
+ className?: string;
42
+ }
43
+ declare function GridPositionSelectorComponent({ position, onPositionChange, className, }: GridPositionSelectorProps): react_jsx_runtime.JSX.Element;
44
+ declare const GridPositionSelector: react.MemoExoticComponent<typeof GridPositionSelectorComponent>;
45
+
46
+ declare function Input({ className, type, ...props }: react.ComponentProps<'input'>): react_jsx_runtime.JSX.Element;
47
+
48
+ declare function Label({ className, ...props }: react.ComponentProps<typeof LabelPrimitive.Root>): react_jsx_runtime.JSX.Element;
49
+
50
+ declare function Select({ ...props }: react.ComponentProps<typeof SelectPrimitive.Root>): react_jsx_runtime.JSX.Element;
51
+ declare function SelectGroup({ ...props }: react.ComponentProps<typeof SelectPrimitive.Group>): react_jsx_runtime.JSX.Element;
52
+ declare function SelectValue({ ...props }: react.ComponentProps<typeof SelectPrimitive.Value>): react_jsx_runtime.JSX.Element;
53
+ declare function SelectTrigger({ className, size, children, ...props }: react.ComponentProps<typeof SelectPrimitive.Trigger> & {
54
+ size?: 'sm' | 'default';
55
+ }): react_jsx_runtime.JSX.Element;
56
+ declare function SelectContent({ className, children, position, align, ...props }: react.ComponentProps<typeof SelectPrimitive.Content>): react_jsx_runtime.JSX.Element;
57
+ declare function SelectLabel({ className, ...props }: react.ComponentProps<typeof SelectPrimitive.Label>): react_jsx_runtime.JSX.Element;
58
+ declare function SelectItem({ className, children, ...props }: react.ComponentProps<typeof SelectPrimitive.Item>): react_jsx_runtime.JSX.Element;
59
+ declare function SelectSeparator({ className, ...props }: react.ComponentProps<typeof SelectPrimitive.Separator>): react_jsx_runtime.JSX.Element;
60
+ declare function SelectScrollUpButton({ className, ...props }: react.ComponentProps<typeof SelectPrimitive.ScrollUpButton>): react_jsx_runtime.JSX.Element;
61
+ declare function SelectScrollDownButton({ className, ...props }: react.ComponentProps<typeof SelectPrimitive.ScrollDownButton>): react_jsx_runtime.JSX.Element;
62
+
63
+ declare function Slider({ className, defaultValue, value, min, max, ...props }: react.ComponentProps<typeof SliderPrimitive.Root>): react_jsx_runtime.JSX.Element;
64
+
65
+ declare function cn(...inputs: ClassValue[]): string;
66
+
67
+ export { Button, Checkbox, ComparisonSlider, GridPositionSelector, Input, Label, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Slider, buttonVariants, cn };
package/dist/ui.js ADDED
@@ -0,0 +1,84 @@
1
+ 'use strict';
2
+
3
+ var chunk3SPPKCWR_js = require('./chunk-3SPPKCWR.js');
4
+ var chunk5HJFQVUR_js = require('./chunk-5HJFQVUR.js');
5
+ require('./chunk-Z7PWFZG5.js');
6
+
7
+
8
+
9
+ Object.defineProperty(exports, "Checkbox", {
10
+ enumerable: true,
11
+ get: function () { return chunk3SPPKCWR_js.Checkbox; }
12
+ });
13
+ Object.defineProperty(exports, "ComparisonSlider", {
14
+ enumerable: true,
15
+ get: function () { return chunk3SPPKCWR_js.ComparisonSlider; }
16
+ });
17
+ Object.defineProperty(exports, "GridPositionSelector", {
18
+ enumerable: true,
19
+ get: function () { return chunk3SPPKCWR_js.GridPositionSelector; }
20
+ });
21
+ Object.defineProperty(exports, "Input", {
22
+ enumerable: true,
23
+ get: function () { return chunk3SPPKCWR_js.Input; }
24
+ });
25
+ Object.defineProperty(exports, "Label", {
26
+ enumerable: true,
27
+ get: function () { return chunk3SPPKCWR_js.Label; }
28
+ });
29
+ Object.defineProperty(exports, "Select", {
30
+ enumerable: true,
31
+ get: function () { return chunk3SPPKCWR_js.Select; }
32
+ });
33
+ Object.defineProperty(exports, "SelectContent", {
34
+ enumerable: true,
35
+ get: function () { return chunk3SPPKCWR_js.SelectContent; }
36
+ });
37
+ Object.defineProperty(exports, "SelectGroup", {
38
+ enumerable: true,
39
+ get: function () { return chunk3SPPKCWR_js.SelectGroup; }
40
+ });
41
+ Object.defineProperty(exports, "SelectItem", {
42
+ enumerable: true,
43
+ get: function () { return chunk3SPPKCWR_js.SelectItem; }
44
+ });
45
+ Object.defineProperty(exports, "SelectLabel", {
46
+ enumerable: true,
47
+ get: function () { return chunk3SPPKCWR_js.SelectLabel; }
48
+ });
49
+ Object.defineProperty(exports, "SelectScrollDownButton", {
50
+ enumerable: true,
51
+ get: function () { return chunk3SPPKCWR_js.SelectScrollDownButton; }
52
+ });
53
+ Object.defineProperty(exports, "SelectScrollUpButton", {
54
+ enumerable: true,
55
+ get: function () { return chunk3SPPKCWR_js.SelectScrollUpButton; }
56
+ });
57
+ Object.defineProperty(exports, "SelectSeparator", {
58
+ enumerable: true,
59
+ get: function () { return chunk3SPPKCWR_js.SelectSeparator; }
60
+ });
61
+ Object.defineProperty(exports, "SelectTrigger", {
62
+ enumerable: true,
63
+ get: function () { return chunk3SPPKCWR_js.SelectTrigger; }
64
+ });
65
+ Object.defineProperty(exports, "SelectValue", {
66
+ enumerable: true,
67
+ get: function () { return chunk3SPPKCWR_js.SelectValue; }
68
+ });
69
+ Object.defineProperty(exports, "Slider", {
70
+ enumerable: true,
71
+ get: function () { return chunk3SPPKCWR_js.Slider; }
72
+ });
73
+ Object.defineProperty(exports, "Button", {
74
+ enumerable: true,
75
+ get: function () { return chunk5HJFQVUR_js.Button; }
76
+ });
77
+ Object.defineProperty(exports, "buttonVariants", {
78
+ enumerable: true,
79
+ get: function () { return chunk5HJFQVUR_js.buttonVariants; }
80
+ });
81
+ Object.defineProperty(exports, "cn", {
82
+ enumerable: true,
83
+ get: function () { return chunk5HJFQVUR_js.cn; }
84
+ });
package/dist/ui.mjs ADDED
@@ -0,0 +1,3 @@
1
+ export { Checkbox, ComparisonSlider, GridPositionSelector, Input, Label, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Slider } from './chunk-ZJD5WMR3.mjs';
2
+ export { Button, buttonVariants, cn } from './chunk-7SKSRSS7.mjs';
3
+ import './chunk-AC6TWLRT.mjs';
@@ -0,0 +1,3 @@
1
+ import './chunk-LDN7IX4Y.mjs';
2
+ export { useWorkflowStore } from './chunk-BJ3R5R32.mjs';
3
+ import './chunk-AC6TWLRT.mjs';
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ require('./chunk-JLWKW3G5.js');
4
+ var chunkNSDLGLAQ_js = require('./chunk-NSDLGLAQ.js');
5
+ require('./chunk-Z7PWFZG5.js');
6
+
7
+
8
+
9
+ Object.defineProperty(exports, "useWorkflowStore", {
10
+ enumerable: true,
11
+ get: function () { return chunkNSDLGLAQ_js.useWorkflowStore; }
12
+ });
package/package.json ADDED
@@ -0,0 +1,117 @@
1
+ {
2
+ "name": "@genfeedai/workflow-ui",
3
+ "version": "0.1.0",
4
+ "license": "AGPL-3.0",
5
+ "description": "Shared UI components for Genfeed workflow editor",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/genfeedai/core.git",
9
+ "directory": "packages/workflow-ui"
10
+ },
11
+ "publishConfig": {
12
+ "access": "public",
13
+ "registry": "https://registry.npmjs.org/"
14
+ },
15
+ "main": "./dist/index.js",
16
+ "module": "./dist/index.js",
17
+ "types": "./dist/index.d.ts",
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "import": "./dist/index.js",
22
+ "require": "./dist/index.cjs"
23
+ },
24
+ "./canvas": {
25
+ "types": "./dist/canvas.d.ts",
26
+ "import": "./dist/canvas.js",
27
+ "require": "./dist/canvas.cjs"
28
+ },
29
+ "./nodes": {
30
+ "types": "./dist/nodes.d.ts",
31
+ "import": "./dist/nodes.js",
32
+ "require": "./dist/nodes.cjs"
33
+ },
34
+ "./panels": {
35
+ "types": "./dist/panels.d.ts",
36
+ "import": "./dist/panels.js",
37
+ "require": "./dist/panels.cjs"
38
+ },
39
+ "./toolbar": {
40
+ "types": "./dist/toolbar.d.ts",
41
+ "import": "./dist/toolbar.js",
42
+ "require": "./dist/toolbar.cjs"
43
+ },
44
+ "./hooks": {
45
+ "types": "./dist/hooks.d.ts",
46
+ "import": "./dist/hooks.js",
47
+ "require": "./dist/hooks.cjs"
48
+ },
49
+ "./stores": {
50
+ "types": "./dist/stores.d.ts",
51
+ "import": "./dist/stores.js",
52
+ "require": "./dist/stores.cjs"
53
+ },
54
+ "./provider": {
55
+ "types": "./dist/provider.d.ts",
56
+ "import": "./dist/provider.js",
57
+ "require": "./dist/provider.cjs"
58
+ },
59
+ "./ui": {
60
+ "types": "./dist/ui.d.ts",
61
+ "import": "./dist/ui.js",
62
+ "require": "./dist/ui.cjs"
63
+ },
64
+ "./lib": {
65
+ "types": "./dist/lib.d.ts",
66
+ "import": "./dist/lib.js",
67
+ "require": "./dist/lib.cjs"
68
+ },
69
+ "./styles": "./src/styles/workflow-ui.css"
70
+ },
71
+ "files": [
72
+ "dist",
73
+ "src/styles"
74
+ ],
75
+ "sideEffects": [
76
+ "**/*.css"
77
+ ],
78
+ "peerDependencies": {
79
+ "@xyflow/react": ">=12.0.0",
80
+ "next": ">=14.0.0",
81
+ "react": ">=19.0.0",
82
+ "react-dom": ">=19.0.0",
83
+ "zustand": ">=5.0.0",
84
+ "zundo": ">=2.0.0"
85
+ },
86
+ "dependencies": {
87
+ "@genfeedai/core": "workspace:*",
88
+ "@radix-ui/react-checkbox": "^1.1.4",
89
+ "@radix-ui/react-label": "^2.1.2",
90
+ "@radix-ui/react-select": "^2.1.6",
91
+ "@radix-ui/react-slider": "^1.2.3",
92
+ "@radix-ui/react-slot": "^1.1.2",
93
+ "class-variance-authority": "^0.7.1",
94
+ "clsx": "^2.1.1",
95
+ "lucide-react": "^0.562.0",
96
+ "nanoid": "^5.1.6",
97
+ "react-compare-slider": "^3.1.0",
98
+ "tailwind-merge": "^3.4.0"
99
+ },
100
+ "devDependencies": {
101
+ "@genfeedai/types": "workspace:*",
102
+ "@types/react": "19.2.4",
103
+ "@types/react-dom": "19.2.4",
104
+ "@xyflow/react": "12.10.0",
105
+ "react": "19.2.4",
106
+ "react-dom": "19.2.4",
107
+ "tsup": "8.4.0",
108
+ "typescript": "5.9.3",
109
+ "zustand": "5.0.3",
110
+ "zundo": "2.3.0"
111
+ },
112
+ "scripts": {
113
+ "build": "tsup",
114
+ "dev": "tsup --watch",
115
+ "prepublishOnly": "bun run build"
116
+ }
117
+ }
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Workflow UI Styles
3
+ *
4
+ * Workflow-specific CSS for @genfeedai/workflow-ui.
5
+ * Import this file in your app's global styles or layout.
6
+ *
7
+ * Does NOT include: tailwind directives, base styles, design tokens,
8
+ * scrollbar styles, or app-level theme variables.
9
+ */
10
+
11
+ /* ==========================================================================
12
+ CSS Custom Properties - Handle & Category Colors
13
+ ========================================================================== */
14
+
15
+ :root {
16
+ /* Handle type colors (inputs) */
17
+ --handle-image: oklch(0.75 0.18 75);
18
+ --handle-video: oklch(0.65 0.2 285);
19
+ --handle-text: oklch(0.7 0.17 160);
20
+ --handle-number: oklch(0.65 0.2 250);
21
+ --handle-audio: oklch(0.7 0.2 330);
22
+
23
+ /* Output handle color (cyan) */
24
+ --handle-output: oklch(0.7 0.2 200);
25
+
26
+ /* Node category colors (for borders and buttons) */
27
+ --category-input: oklch(0.7 0.15 160);
28
+ --category-ai: oklch(0.65 0.25 300);
29
+ --category-processing: oklch(0.65 0.2 250);
30
+ --category-output: oklch(0.75 0.18 70);
31
+ --category-composition: oklch(0.7 0.2 30);
32
+ }
33
+
34
+ /* ==========================================================================
35
+ React Flow Overrides
36
+ ========================================================================== */
37
+
38
+ .react-flow__node {
39
+ font-size: 12px;
40
+ background: transparent !important;
41
+ border: none !important;
42
+ padding: 0 !important;
43
+ }
44
+
45
+ .react-flow__handle {
46
+ width: 10px;
47
+ height: 10px;
48
+ border-radius: 50%;
49
+ background: var(--primary);
50
+ border: 2px solid var(--background);
51
+ }
52
+
53
+ .react-flow__handle-left { left: -5px; }
54
+ .react-flow__handle-right { right: -5px; }
55
+ .react-flow__handle-top { top: -5px; }
56
+ .react-flow__handle-bottom { bottom: -5px; }
57
+
58
+ .react-flow__edge-path {
59
+ stroke: var(--muted-foreground);
60
+ stroke-width: 2;
61
+ }
62
+
63
+ /* Edge type colors (based on data type flowing through) */
64
+ .react-flow__edge.edge-image .react-flow__edge-path { stroke: var(--handle-image); }
65
+ .react-flow__edge.edge-video .react-flow__edge-path { stroke: var(--handle-video); }
66
+ .react-flow__edge.edge-text .react-flow__edge-path { stroke: var(--handle-text); }
67
+ .react-flow__edge.edge-number .react-flow__edge-path { stroke: var(--handle-number); }
68
+ .react-flow__edge.edge-audio .react-flow__edge-path { stroke: var(--handle-audio); }
69
+
70
+ /* Selected edge - highlight with glow (preserves type color) */
71
+ .react-flow__edge.selected .react-flow__edge-path {
72
+ stroke-width: 3px;
73
+ filter: drop-shadow(0 0 6px currentColor) brightness(1.3);
74
+ transition: stroke-width 0.15s ease, filter 0.15s ease;
75
+ }
76
+
77
+ /* Dimmed edges (not connected to selection) */
78
+ .react-flow__edge.dimmed .react-flow__edge-path {
79
+ opacity: 0.25;
80
+ transition: opacity 0.2s ease;
81
+ }
82
+
83
+ /* Highlighted edges (connected to selection) - brighten the type color */
84
+ .react-flow__edge.highlighted .react-flow__edge-path {
85
+ filter: drop-shadow(0 0 4px currentColor) brightness(1.2);
86
+ transition: opacity 0.2s ease, filter 0.2s ease;
87
+ }
88
+
89
+ /* Executing edges (during workflow execution) - pipe flow effect */
90
+ .react-flow__edge.executing .react-flow__edge-path {
91
+ stroke-width: 2.5px;
92
+ filter: drop-shadow(0 0 8px currentColor) brightness(1.3);
93
+ stroke-dasharray: 8 4;
94
+ animation: edge-flow 0.5s linear infinite;
95
+ }
96
+
97
+ /* Active pipe - all edges glow during execution */
98
+ .react-flow__edge.active-pipe .react-flow__edge-path {
99
+ stroke-width: 2px;
100
+ filter: drop-shadow(0 0 4px currentColor);
101
+ stroke-dasharray: 6 3;
102
+ animation: edge-flow 0.8s linear infinite;
103
+ opacity: 0.8;
104
+ }
105
+
106
+ /* Disabled edges - targeting inputs not supported by current model */
107
+ .react-flow__edge.edge-disabled .react-flow__edge-path {
108
+ stroke: var(--chart-3);
109
+ stroke-width: 1.5px;
110
+ stroke-dasharray: 5 5;
111
+ opacity: 0.3;
112
+ transition: opacity 0.2s ease, stroke 0.2s ease;
113
+ }
114
+
115
+ .react-flow__background {
116
+ background-color: var(--background);
117
+ }
118
+
119
+ .react-flow__minimap {
120
+ background-color: var(--card);
121
+ border-radius: 8px;
122
+ overflow: hidden;
123
+ }
124
+
125
+ .react-flow__controls {
126
+ background: var(--card) !important;
127
+ border-radius: 8px !important;
128
+ border: 1px solid var(--border) !important;
129
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4) !important;
130
+ }
131
+
132
+ .react-flow__controls-button {
133
+ background: var(--card) !important;
134
+ border-bottom: 1px solid var(--border) !important;
135
+ fill: var(--muted-foreground) !important;
136
+ color: var(--muted-foreground) !important;
137
+ }
138
+
139
+ .react-flow__controls-button:hover {
140
+ background: var(--secondary) !important;
141
+ fill: var(--foreground) !important;
142
+ color: var(--foreground) !important;
143
+ }
144
+
145
+ .react-flow__controls-button svg {
146
+ fill: inherit !important;
147
+ }
148
+
149
+ /* ==========================================================================
150
+ Handle Type Color Classes
151
+ ========================================================================== */
152
+
153
+ .handle-image { background: var(--handle-image) !important; }
154
+ .handle-video { background: var(--handle-video) !important; }
155
+ .handle-text { background: var(--handle-text) !important; }
156
+ .handle-number { background: var(--handle-number) !important; }
157
+ .handle-audio { background: var(--handle-audio) !important; }
158
+ .handle-output { background: var(--handle-output) !important; }
159
+
160
+ /* ==========================================================================
161
+ Animation Keyframes
162
+ ========================================================================== */
163
+
164
+ /* Processing node glow animation */
165
+ @keyframes processing-glow {
166
+ 0%, 100% {
167
+ box-shadow: 0 0 8px 2px var(--node-color, var(--primary));
168
+ }
169
+ 50% {
170
+ box-shadow: 0 0 20px 6px var(--node-color, var(--primary));
171
+ }
172
+ }
173
+
174
+ .node-processing {
175
+ animation: processing-glow 1.5s ease-in-out infinite;
176
+ }
177
+
178
+ /* Edge flow animation - simulates data flowing through pipes */
179
+ @keyframes edge-flow {
180
+ 0% {
181
+ stroke-dashoffset: 24;
182
+ }
183
+ 100% {
184
+ stroke-dashoffset: 0;
185
+ }
186
+ }