@angflow/angular 0.0.1

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 (196) hide show
  1. package/README.md +187 -0
  2. package/dist/base.css +1204 -0
  3. package/dist/esm/index.d.ts +2 -0
  4. package/dist/esm/index.d.ts.map +1 -0
  5. package/dist/esm/index.js +2 -0
  6. package/dist/esm/index.js.map +1 -0
  7. package/dist/esm/lib/components/a11y-descriptions/a11y-descriptions.component.d.ts +25 -0
  8. package/dist/esm/lib/components/a11y-descriptions/a11y-descriptions.component.d.ts.map +1 -0
  9. package/dist/esm/lib/components/a11y-descriptions/a11y-descriptions.component.js +58 -0
  10. package/dist/esm/lib/components/a11y-descriptions/a11y-descriptions.component.js.map +1 -0
  11. package/dist/esm/lib/components/attribution/attribution.component.d.ts +6 -0
  12. package/dist/esm/lib/components/attribution/attribution.component.d.ts.map +1 -0
  13. package/dist/esm/lib/components/attribution/attribution.component.js +32 -0
  14. package/dist/esm/lib/components/attribution/attribution.component.js.map +1 -0
  15. package/dist/esm/lib/components/background/background.component.d.ts +31 -0
  16. package/dist/esm/lib/components/background/background.component.d.ts.map +1 -0
  17. package/dist/esm/lib/components/background/background.component.js +209 -0
  18. package/dist/esm/lib/components/background/background.component.js.map +1 -0
  19. package/dist/esm/lib/components/connection-line/connection-line.component.d.ts +36 -0
  20. package/dist/esm/lib/components/connection-line/connection-line.component.d.ts.map +1 -0
  21. package/dist/esm/lib/components/connection-line/connection-line.component.js +146 -0
  22. package/dist/esm/lib/components/connection-line/connection-line.component.js.map +1 -0
  23. package/dist/esm/lib/components/controls/controls.component.d.ts +25 -0
  24. package/dist/esm/lib/components/controls/controls.component.d.ts.map +1 -0
  25. package/dist/esm/lib/components/controls/controls.component.js +174 -0
  26. package/dist/esm/lib/components/controls/controls.component.js.map +1 -0
  27. package/dist/esm/lib/components/edge-label-renderer/edge-label-renderer.component.d.ts +6 -0
  28. package/dist/esm/lib/components/edge-label-renderer/edge-label-renderer.component.d.ts.map +1 -0
  29. package/dist/esm/lib/components/edge-label-renderer/edge-label-renderer.component.js +24 -0
  30. package/dist/esm/lib/components/edge-label-renderer/edge-label-renderer.component.js.map +1 -0
  31. package/dist/esm/lib/components/edge-toolbar/edge-toolbar.component.d.ts +22 -0
  32. package/dist/esm/lib/components/edge-toolbar/edge-toolbar.component.d.ts.map +1 -0
  33. package/dist/esm/lib/components/edge-toolbar/edge-toolbar.component.js +64 -0
  34. package/dist/esm/lib/components/edge-toolbar/edge-toolbar.component.js.map +1 -0
  35. package/dist/esm/lib/components/edges/base-edge.component.d.ts +11 -0
  36. package/dist/esm/lib/components/edges/base-edge.component.d.ts.map +1 -0
  37. package/dist/esm/lib/components/edges/base-edge.component.js +56 -0
  38. package/dist/esm/lib/components/edges/base-edge.component.js.map +1 -0
  39. package/dist/esm/lib/components/edges/bezier-edge.component.d.ts +30 -0
  40. package/dist/esm/lib/components/edges/bezier-edge.component.d.ts.map +1 -0
  41. package/dist/esm/lib/components/edges/bezier-edge.component.js +68 -0
  42. package/dist/esm/lib/components/edges/bezier-edge.component.js.map +1 -0
  43. package/dist/esm/lib/components/edges/edge-text.component.d.ts +11 -0
  44. package/dist/esm/lib/components/edges/edge-text.component.d.ts.map +1 -0
  45. package/dist/esm/lib/components/edges/edge-text.component.js +48 -0
  46. package/dist/esm/lib/components/edges/edge-text.component.js.map +1 -0
  47. package/dist/esm/lib/components/edges/simple-bezier-edge.component.d.ts +21 -0
  48. package/dist/esm/lib/components/edges/simple-bezier-edge.component.d.ts.map +1 -0
  49. package/dist/esm/lib/components/edges/simple-bezier-edge.component.js +57 -0
  50. package/dist/esm/lib/components/edges/simple-bezier-edge.component.js.map +1 -0
  51. package/dist/esm/lib/components/edges/smooth-step-edge.component.d.ts +22 -0
  52. package/dist/esm/lib/components/edges/smooth-step-edge.component.d.ts.map +1 -0
  53. package/dist/esm/lib/components/edges/smooth-step-edge.component.js +59 -0
  54. package/dist/esm/lib/components/edges/smooth-step-edge.component.js.map +1 -0
  55. package/dist/esm/lib/components/edges/step-edge.component.d.ts +22 -0
  56. package/dist/esm/lib/components/edges/step-edge.component.d.ts.map +1 -0
  57. package/dist/esm/lib/components/edges/step-edge.component.js +60 -0
  58. package/dist/esm/lib/components/edges/step-edge.component.js.map +1 -0
  59. package/dist/esm/lib/components/edges/straight-edge.component.d.ts +18 -0
  60. package/dist/esm/lib/components/edges/straight-edge.component.d.ts.map +1 -0
  61. package/dist/esm/lib/components/edges/straight-edge.component.js +53 -0
  62. package/dist/esm/lib/components/edges/straight-edge.component.js.map +1 -0
  63. package/dist/esm/lib/components/handle/handle.component.d.ts +28 -0
  64. package/dist/esm/lib/components/handle/handle.component.d.ts.map +1 -0
  65. package/dist/esm/lib/components/handle/handle.component.js +162 -0
  66. package/dist/esm/lib/components/handle/handle.component.js.map +1 -0
  67. package/dist/esm/lib/components/minimap/minimap.component.d.ts +75 -0
  68. package/dist/esm/lib/components/minimap/minimap.component.d.ts.map +1 -0
  69. package/dist/esm/lib/components/minimap/minimap.component.js +319 -0
  70. package/dist/esm/lib/components/minimap/minimap.component.js.map +1 -0
  71. package/dist/esm/lib/components/ng-flow-provider/ng-flow-provider.component.d.ts +6 -0
  72. package/dist/esm/lib/components/ng-flow-provider/ng-flow-provider.component.d.ts.map +1 -0
  73. package/dist/esm/lib/components/ng-flow-provider/ng-flow-provider.component.js +24 -0
  74. package/dist/esm/lib/components/ng-flow-provider/ng-flow-provider.component.js.map +1 -0
  75. package/dist/esm/lib/components/node-resizer/node-resizer.component.d.ts +44 -0
  76. package/dist/esm/lib/components/node-resizer/node-resizer.component.d.ts.map +1 -0
  77. package/dist/esm/lib/components/node-resizer/node-resizer.component.js +198 -0
  78. package/dist/esm/lib/components/node-resizer/node-resizer.component.js.map +1 -0
  79. package/dist/esm/lib/components/node-toolbar/node-toolbar.component.d.ts +19 -0
  80. package/dist/esm/lib/components/node-toolbar/node-toolbar.component.d.ts.map +1 -0
  81. package/dist/esm/lib/components/node-toolbar/node-toolbar.component.js +101 -0
  82. package/dist/esm/lib/components/node-toolbar/node-toolbar.component.js.map +1 -0
  83. package/dist/esm/lib/components/nodes/default-node.component.d.ts +20 -0
  84. package/dist/esm/lib/components/nodes/default-node.component.d.ts.map +1 -0
  85. package/dist/esm/lib/components/nodes/default-node.component.js +52 -0
  86. package/dist/esm/lib/components/nodes/default-node.component.js.map +1 -0
  87. package/dist/esm/lib/components/nodes/group-node.component.d.ts +19 -0
  88. package/dist/esm/lib/components/nodes/group-node.component.d.ts.map +1 -0
  89. package/dist/esm/lib/components/nodes/group-node.component.js +34 -0
  90. package/dist/esm/lib/components/nodes/group-node.component.js.map +1 -0
  91. package/dist/esm/lib/components/nodes/input-node.component.d.ts +20 -0
  92. package/dist/esm/lib/components/nodes/input-node.component.d.ts.map +1 -0
  93. package/dist/esm/lib/components/nodes/input-node.component.js +49 -0
  94. package/dist/esm/lib/components/nodes/input-node.component.js.map +1 -0
  95. package/dist/esm/lib/components/nodes/output-node.component.d.ts +20 -0
  96. package/dist/esm/lib/components/nodes/output-node.component.d.ts.map +1 -0
  97. package/dist/esm/lib/components/nodes/output-node.component.js +48 -0
  98. package/dist/esm/lib/components/nodes/output-node.component.js.map +1 -0
  99. package/dist/esm/lib/components/panel/panel.component.d.ts +13 -0
  100. package/dist/esm/lib/components/panel/panel.component.d.ts.map +1 -0
  101. package/dist/esm/lib/components/panel/panel.component.js +39 -0
  102. package/dist/esm/lib/components/panel/panel.component.js.map +1 -0
  103. package/dist/esm/lib/components/selection-box/selection-box.component.d.ts +12 -0
  104. package/dist/esm/lib/components/selection-box/selection-box.component.d.ts.map +1 -0
  105. package/dist/esm/lib/components/selection-box/selection-box.component.js +56 -0
  106. package/dist/esm/lib/components/selection-box/selection-box.component.js.map +1 -0
  107. package/dist/esm/lib/components/viewport-portal/viewport-portal.component.d.ts +8 -0
  108. package/dist/esm/lib/components/viewport-portal/viewport-portal.component.d.ts.map +1 -0
  109. package/dist/esm/lib/components/viewport-portal/viewport-portal.component.js +35 -0
  110. package/dist/esm/lib/components/viewport-portal/viewport-portal.component.js.map +1 -0
  111. package/dist/esm/lib/container/edge-renderer/edge-renderer.component.d.ts +70 -0
  112. package/dist/esm/lib/container/edge-renderer/edge-renderer.component.d.ts.map +1 -0
  113. package/dist/esm/lib/container/edge-renderer/edge-renderer.component.js +503 -0
  114. package/dist/esm/lib/container/edge-renderer/edge-renderer.component.js.map +1 -0
  115. package/dist/esm/lib/container/ng-flow/ng-flow.component.d.ts +281 -0
  116. package/dist/esm/lib/container/ng-flow/ng-flow.component.d.ts.map +1 -0
  117. package/dist/esm/lib/container/ng-flow/ng-flow.component.js +644 -0
  118. package/dist/esm/lib/container/ng-flow/ng-flow.component.js.map +1 -0
  119. package/dist/esm/lib/container/node-renderer/node-renderer.component.d.ts +56 -0
  120. package/dist/esm/lib/container/node-renderer/node-renderer.component.d.ts.map +1 -0
  121. package/dist/esm/lib/container/node-renderer/node-renderer.component.js +312 -0
  122. package/dist/esm/lib/container/node-renderer/node-renderer.component.js.map +1 -0
  123. package/dist/esm/lib/container/pane/pane.component.d.ts +35 -0
  124. package/dist/esm/lib/container/pane/pane.component.d.ts.map +1 -0
  125. package/dist/esm/lib/container/pane/pane.component.js +161 -0
  126. package/dist/esm/lib/container/pane/pane.component.js.map +1 -0
  127. package/dist/esm/lib/container/viewport/viewport.component.d.ts +9 -0
  128. package/dist/esm/lib/container/viewport/viewport.component.d.ts.map +1 -0
  129. package/dist/esm/lib/container/viewport/viewport.component.js +35 -0
  130. package/dist/esm/lib/container/viewport/viewport.component.js.map +1 -0
  131. package/dist/esm/lib/directives/drag.directive.d.ts +21 -0
  132. package/dist/esm/lib/directives/drag.directive.d.ts.map +1 -0
  133. package/dist/esm/lib/directives/drag.directive.js +69 -0
  134. package/dist/esm/lib/directives/drag.directive.js.map +1 -0
  135. package/dist/esm/lib/directives/drop-zone.directive.d.ts +30 -0
  136. package/dist/esm/lib/directives/drop-zone.directive.d.ts.map +1 -0
  137. package/dist/esm/lib/directives/drop-zone.directive.js +58 -0
  138. package/dist/esm/lib/directives/drop-zone.directive.js.map +1 -0
  139. package/dist/esm/lib/directives/key-handler.directive.d.ts +29 -0
  140. package/dist/esm/lib/directives/key-handler.directive.d.ts.map +1 -0
  141. package/dist/esm/lib/directives/key-handler.directive.js +176 -0
  142. package/dist/esm/lib/directives/key-handler.directive.js.map +1 -0
  143. package/dist/esm/lib/directives/node-type.directive.d.ts +21 -0
  144. package/dist/esm/lib/directives/node-type.directive.d.ts.map +1 -0
  145. package/dist/esm/lib/directives/node-type.directive.js +32 -0
  146. package/dist/esm/lib/directives/node-type.directive.js.map +1 -0
  147. package/dist/esm/lib/public-api.d.ts +40 -0
  148. package/dist/esm/lib/public-api.d.ts.map +1 -0
  149. package/dist/esm/lib/public-api.js +67 -0
  150. package/dist/esm/lib/public-api.js.map +1 -0
  151. package/dist/esm/lib/services/flow-store.service.d.ts +227 -0
  152. package/dist/esm/lib/services/flow-store.service.d.ts.map +1 -0
  153. package/dist/esm/lib/services/flow-store.service.js +542 -0
  154. package/dist/esm/lib/services/flow-store.service.js.map +1 -0
  155. package/dist/esm/lib/services/ng-flow.service.d.ts +186 -0
  156. package/dist/esm/lib/services/ng-flow.service.d.ts.map +1 -0
  157. package/dist/esm/lib/services/ng-flow.service.js +501 -0
  158. package/dist/esm/lib/services/ng-flow.service.js.map +1 -0
  159. package/dist/esm/lib/services/tokens.d.ts +4 -0
  160. package/dist/esm/lib/services/tokens.d.ts.map +1 -0
  161. package/dist/esm/lib/services/tokens.js +4 -0
  162. package/dist/esm/lib/services/tokens.js.map +1 -0
  163. package/dist/esm/lib/types/edges.d.ts +83 -0
  164. package/dist/esm/lib/types/edges.d.ts.map +1 -0
  165. package/dist/esm/lib/types/edges.js +2 -0
  166. package/dist/esm/lib/types/edges.js.map +1 -0
  167. package/dist/esm/lib/types/general.d.ts +128 -0
  168. package/dist/esm/lib/types/general.d.ts.map +1 -0
  169. package/dist/esm/lib/types/general.js +2 -0
  170. package/dist/esm/lib/types/general.js.map +1 -0
  171. package/dist/esm/lib/types/index.d.ts +5 -0
  172. package/dist/esm/lib/types/index.d.ts.map +1 -0
  173. package/dist/esm/lib/types/index.js +5 -0
  174. package/dist/esm/lib/types/index.js.map +1 -0
  175. package/dist/esm/lib/types/nodes.d.ts +53 -0
  176. package/dist/esm/lib/types/nodes.d.ts.map +1 -0
  177. package/dist/esm/lib/types/nodes.js +2 -0
  178. package/dist/esm/lib/types/nodes.js.map +1 -0
  179. package/dist/esm/lib/types/store.d.ts +71 -0
  180. package/dist/esm/lib/types/store.d.ts.map +1 -0
  181. package/dist/esm/lib/types/store.js +2 -0
  182. package/dist/esm/lib/types/store.js.map +1 -0
  183. package/dist/esm/lib/utils/changes.d.ts +12 -0
  184. package/dist/esm/lib/utils/changes.d.ts.map +1 -0
  185. package/dist/esm/lib/utils/changes.js +134 -0
  186. package/dist/esm/lib/utils/changes.js.map +1 -0
  187. package/dist/esm/lib/utils/index.d.ts +2 -0
  188. package/dist/esm/lib/utils/index.d.ts.map +1 -0
  189. package/dist/esm/lib/utils/index.js +2 -0
  190. package/dist/esm/lib/utils/index.js.map +1 -0
  191. package/dist/esm/lib/utils/type-guards.d.ts +12 -0
  192. package/dist/esm/lib/utils/type-guards.d.ts.map +1 -0
  193. package/dist/esm/lib/utils/type-guards.js +16 -0
  194. package/dist/esm/lib/utils/type-guards.js.map +1 -0
  195. package/dist/style.css +1392 -0
  196. package/package.json +60 -0
package/dist/style.css ADDED
@@ -0,0 +1,1392 @@
1
+ /* style.css - default theme styling for ng-flow */
2
+ /* these are the necessary styles for React/Svelte Flow, they get used by base.css and style.css */
3
+
4
+ .xy-flow {
5
+ direction: ltr;
6
+
7
+ --xy-edge-stroke-default: #b1b1b7;
8
+ --xy-edge-stroke-width-default: 1;
9
+ --xy-edge-stroke-selected-default: #555;
10
+
11
+ --xy-connectionline-stroke-default: #b1b1b7;
12
+ --xy-connectionline-stroke-width-default: 1;
13
+
14
+ --xy-attribution-background-color-default: rgba(255, 255, 255, 0.5);
15
+
16
+ --xy-minimap-background-color-default: #fff;
17
+ --xy-minimap-mask-background-color-default: rgba(240, 240, 240, 0.6);
18
+ --xy-minimap-mask-stroke-color-default: transparent;
19
+ --xy-minimap-mask-stroke-width-default: 1;
20
+ --xy-minimap-node-background-color-default: #e2e2e2;
21
+ --xy-minimap-node-stroke-color-default: transparent;
22
+ --xy-minimap-node-stroke-width-default: 2;
23
+
24
+ --xy-background-color-default: transparent;
25
+ --xy-background-pattern-dots-color-default: #91919a;
26
+ --xy-background-pattern-lines-color-default: #eee;
27
+ --xy-background-pattern-cross-color-default: #e2e2e2;
28
+ }
29
+
30
+
31
+ .xy-flow.dark {
32
+ --xy-edge-stroke-default: #3e3e3e;
33
+ --xy-edge-stroke-width-default: 1;
34
+ --xy-edge-stroke-selected-default: #727272;
35
+
36
+ --xy-connectionline-stroke-default: #b1b1b7;
37
+ --xy-connectionline-stroke-width-default: 1;
38
+
39
+ --xy-attribution-background-color-default: rgba(150, 150, 150, 0.25);
40
+
41
+ --xy-minimap-background-color-default: #141414;
42
+ --xy-minimap-mask-background-color-default: rgba(60, 60, 60, 0.6);
43
+ --xy-minimap-mask-stroke-color-default: transparent;
44
+ --xy-minimap-mask-stroke-width-default: 1;
45
+ --xy-minimap-node-background-color-default: #2b2b2b;
46
+ --xy-minimap-node-stroke-color-default: transparent;
47
+ --xy-minimap-node-stroke-width-default: 2;
48
+
49
+ --xy-background-color-default: #141414;
50
+ --xy-background-pattern-dots-color-default: #777;
51
+ --xy-background-pattern-lines-color-default: #777;
52
+ --xy-background-pattern-cross-color-default: #777;
53
+ }
54
+
55
+
56
+ .xy-flow {
57
+ background-color: var(--xy-background-color, var(--xy-background-color-default));
58
+ }
59
+
60
+
61
+ .xy-flow__background {
62
+ background-color: var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));
63
+ }
64
+
65
+
66
+ .xy-flow__container {
67
+ position: absolute;
68
+ width: 100%;
69
+ height: 100%;
70
+ top: 0;
71
+ left: 0;
72
+ }
73
+
74
+
75
+ .xy-flow__pane {
76
+ z-index: 1;
77
+
78
+ &.draggable {
79
+ cursor: grab;
80
+ }
81
+
82
+ &.dragging {
83
+ cursor: grabbing;
84
+ }
85
+
86
+ &.selection {
87
+ cursor: pointer;
88
+ }
89
+ }
90
+
91
+
92
+ .xy-flow__viewport {
93
+ transform-origin: 0 0;
94
+ z-index: 2;
95
+ pointer-events: none;
96
+ }
97
+
98
+
99
+ .xy-flow__renderer {
100
+ z-index: 4;
101
+ }
102
+
103
+
104
+ .xy-flow__selection {
105
+ z-index: 6;
106
+ }
107
+
108
+
109
+ .xy-flow__nodesselection-rect:focus,
110
+ .xy-flow__nodesselection-rect:focus-visible {
111
+ outline: none;
112
+ }
113
+
114
+
115
+ .xy-flow__edge-path {
116
+ stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default));
117
+ stroke-width: var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));
118
+ fill: none;
119
+ }
120
+
121
+
122
+ .xy-flow__connection-path {
123
+ stroke: var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));
124
+ stroke-width: var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));
125
+ fill: none;
126
+ }
127
+
128
+
129
+ .xy-flow .xy-flow__edges {
130
+ position: absolute;
131
+
132
+ svg {
133
+ overflow: visible;
134
+ position: absolute;
135
+ pointer-events: none;
136
+ }
137
+ }
138
+ .xy-flow__edge {
139
+
140
+ pointer-events: visibleStroke;
141
+
142
+
143
+
144
+
145
+
146
+
147
+
148
+
149
+
150
+
151
+
152
+
153
+
154
+
155
+
156
+ .xy-flow__edge-text {
157
+ pointer-events: none;
158
+ user-select: none;
159
+ }
160
+ }
161
+
162
+ .xy-flow__edge.selectable {
163
+
164
+ cursor: pointer;
165
+ }
166
+
167
+ .xy-flow__edge.animated path {
168
+
169
+ stroke-dasharray: 5;
170
+ animation: dashdraw 0.5s linear infinite;
171
+ }
172
+
173
+ .xy-flow__edge.animated path.xy-flow__edge-interaction {
174
+
175
+ stroke-dasharray: none;
176
+ animation: none;
177
+ }
178
+
179
+ .xy-flow__edge.inactive {
180
+
181
+ pointer-events: none;
182
+ }
183
+
184
+ .xy-flow__edge.selected,
185
+ .xy-flow__edge:focus,
186
+ .xy-flow__edge:focus-visible {
187
+
188
+ outline: none;
189
+ }
190
+
191
+ .xy-flow__edge.selected .xy-flow__edge-path,
192
+ .xy-flow__edge.selectable:focus .xy-flow__edge-path,
193
+ .xy-flow__edge.selectable:focus-visible .xy-flow__edge-path {
194
+
195
+ stroke: var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default));
196
+ }
197
+
198
+ .xy-flow__edge-textwrapper {
199
+
200
+ pointer-events: all;
201
+ }
202
+
203
+
204
+
205
+ /* Arrowhead marker styles - use CSS custom properties as default */
206
+ .xy-flow__arrowhead polyline {
207
+ stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default));
208
+ }
209
+
210
+
211
+ .xy-flow__arrowhead polyline.arrowclosed {
212
+ fill: var(--xy-edge-stroke, var(--xy-edge-stroke-default));
213
+ }
214
+
215
+
216
+ .xy-flow__connection {
217
+ pointer-events: none;
218
+
219
+ .animated {
220
+ stroke-dasharray: 5;
221
+ animation: dashdraw 0.5s linear infinite;
222
+ }
223
+ }
224
+
225
+
226
+ svg.xy-flow__connectionline {
227
+ z-index: 1001;
228
+ overflow: visible;
229
+ position: absolute;
230
+ }
231
+
232
+
233
+ .xy-flow__nodes {
234
+ pointer-events: none;
235
+ transform-origin: 0 0;
236
+ }
237
+
238
+
239
+ .xy-flow__node {
240
+ position: absolute;
241
+ user-select: none;
242
+ pointer-events: all;
243
+ transform-origin: 0 0;
244
+ box-sizing: border-box;
245
+ cursor: default;
246
+
247
+ &.selectable {
248
+ cursor: pointer;
249
+ }
250
+
251
+ &.draggable {
252
+ cursor: grab;
253
+ pointer-events: all;
254
+
255
+ &.dragging {
256
+ cursor: grabbing;
257
+ }
258
+ }
259
+ }
260
+ .xy-flow__nodesselection {
261
+
262
+ z-index: 3;
263
+ transform-origin: left top;
264
+ pointer-events: none;
265
+
266
+
267
+ }
268
+
269
+ .xy-flow__nodesselection-rect {
270
+
271
+ position: absolute;
272
+ pointer-events: all;
273
+ cursor: grab;
274
+ }
275
+
276
+ .xy-flow__handle {
277
+
278
+ position: absolute;
279
+ pointer-events: none;
280
+ min-width: 5px;
281
+ min-height: 5px;
282
+
283
+
284
+
285
+
286
+
287
+
288
+
289
+
290
+
291
+
292
+
293
+
294
+ }
295
+
296
+ .xy-flow__handle.connectingfrom {
297
+
298
+ pointer-events: all;
299
+ }
300
+
301
+ .xy-flow__handle.connectionindicator {
302
+
303
+ pointer-events: all;
304
+ cursor: crosshair;
305
+ }
306
+
307
+ .xy-flow__handle-bottom {
308
+
309
+ top: auto;
310
+ left: 50%;
311
+ bottom: 0;
312
+ transform: translate(-50%, 50%);
313
+ }
314
+
315
+ .xy-flow__handle-top {
316
+
317
+ top: 0;
318
+ left: 50%;
319
+ transform: translate(-50%, -50%);
320
+ }
321
+
322
+ .xy-flow__handle-left {
323
+
324
+ top: 50%;
325
+ left: 0;
326
+ transform: translate(-50%, -50%);
327
+ }
328
+
329
+ .xy-flow__handle-right {
330
+
331
+ top: 50%;
332
+ right: 0;
333
+ transform: translate(50%, -50%);
334
+ }
335
+
336
+
337
+
338
+ .xy-flow__edgeupdater {
339
+ cursor: move;
340
+ pointer-events: all;
341
+ }
342
+
343
+
344
+ .xy-flow__pane.selection .xy-flow__panel {
345
+ pointer-events: none;
346
+ }
347
+
348
+
349
+ .xy-flow__panel {
350
+ position: absolute;
351
+ z-index: 5;
352
+ margin: 15px;
353
+
354
+ &.top {
355
+ top: 0;
356
+ }
357
+
358
+ &.bottom {
359
+ bottom: 0;
360
+ }
361
+
362
+ &.top,
363
+ &.bottom {
364
+ &.center {
365
+ left: 50%;
366
+ transform: translateX(-15px) translateX(-50%);
367
+ }
368
+ }
369
+
370
+ &.left {
371
+ left: 0;
372
+ }
373
+
374
+ &.right {
375
+ right: 0;
376
+ }
377
+
378
+ &.left,
379
+ &.right {
380
+ &.center {
381
+ top: 50%;
382
+ transform: translateY(-15px) translateY(-50%);
383
+ }
384
+ }
385
+ }
386
+
387
+
388
+ .xy-flow__attribution {
389
+ font-size: 10px;
390
+ background: var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));
391
+ padding: 2px 3px;
392
+ margin: 0;
393
+
394
+ a {
395
+ text-decoration: none;
396
+ color: #999;
397
+ }
398
+ }
399
+
400
+
401
+ @keyframes dashdraw {
402
+ from {
403
+ stroke-dashoffset: 10;
404
+ }
405
+ }
406
+
407
+
408
+ .xy-flow__edgelabel-renderer {
409
+ position: absolute;
410
+ width: 100%;
411
+ height: 100%;
412
+ pointer-events: none;
413
+ user-select: none;
414
+ left: 0;
415
+ top: 0;
416
+ }
417
+
418
+
419
+ .xy-flow__viewport-portal {
420
+ position: absolute;
421
+ width: 100%;
422
+ height: 100%;
423
+ left: 0;
424
+ top: 0;
425
+ user-select: none;
426
+ }
427
+ .xy-flow__minimap {
428
+
429
+ background: var(
430
+ --xy-minimap-background-color-props,
431
+ var(--xy-minimap-background-color, var(--xy-minimap-background-color-default))
432
+ );
433
+
434
+
435
+
436
+
437
+
438
+
439
+ }
440
+
441
+ .xy-flow__minimap-svg {
442
+
443
+ display: block;
444
+ }
445
+
446
+ .xy-flow__minimap-mask {
447
+
448
+ fill: var(
449
+ --xy-minimap-mask-background-color-props,
450
+ var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default))
451
+ );
452
+ stroke: var(
453
+ --xy-minimap-mask-stroke-color-props,
454
+ var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default))
455
+ );
456
+ stroke-width: var(
457
+ --xy-minimap-mask-stroke-width-props,
458
+ var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default))
459
+ );
460
+ }
461
+
462
+ .xy-flow__minimap-node {
463
+
464
+ fill: var(
465
+ --xy-minimap-node-background-color-props,
466
+ var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default))
467
+ );
468
+ stroke: var(
469
+ --xy-minimap-node-stroke-color-props,
470
+ var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default))
471
+ );
472
+ stroke-width: var(
473
+ --xy-minimap-node-stroke-width-props,
474
+ var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default))
475
+ );
476
+ }
477
+
478
+
479
+
480
+ .xy-flow__background {
481
+ pointer-events: none;
482
+ z-index: -1;
483
+ }
484
+
485
+
486
+ .xy-flow__background-pattern {
487
+ &.dots {
488
+ fill: var(
489
+ --xy-background-pattern-color-props,
490
+ var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default))
491
+ );
492
+ }
493
+
494
+ &.lines {
495
+ stroke: var(
496
+ --xy-background-pattern-color-props,
497
+ var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default))
498
+ );
499
+ }
500
+
501
+ &.cross {
502
+ stroke: var(
503
+ --xy-background-pattern-color-props,
504
+ var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default))
505
+ );
506
+ }
507
+ }
508
+ .xy-flow__controls {
509
+
510
+ display: flex;
511
+ flex-direction: column;
512
+
513
+
514
+
515
+
516
+ }
517
+
518
+ .xy-flow__controls.horizontal {
519
+
520
+ flex-direction: row;
521
+ }
522
+
523
+ .xy-flow__controls-button {
524
+
525
+ display: flex;
526
+ justify-content: center;
527
+ align-items: center;
528
+ height: 26px;
529
+ width: 26px;
530
+ padding: 4px;
531
+
532
+ svg {
533
+ width: 100%;
534
+ max-width: 12px;
535
+ max-height: 12px;
536
+ fill: currentColor;
537
+ }
538
+ }
539
+
540
+
541
+
542
+ .xy-flow {
543
+ --xy-node-color-default: inherit;
544
+ --xy-node-border-default: 1px solid #1a192b;
545
+ --xy-node-background-color-default: #fff;
546
+ --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25);
547
+ --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, 0.08);
548
+ --xy-node-boxshadow-selected-default: 0 0 0 0.5px #1a192b;
549
+ --xy-node-border-radius-default: 3px;
550
+
551
+ --xy-handle-background-color-default: #1a192b;
552
+ --xy-handle-border-color-default: #fff;
553
+
554
+ --xy-selection-background-color-default: rgba(0, 89, 220, 0.08);
555
+ --xy-selection-border-default: 1px dotted rgba(0, 89, 220, 0.8);
556
+
557
+ --xy-controls-button-background-color-default: #fefefe;
558
+ --xy-controls-button-background-color-hover-default: #f4f4f4;
559
+ --xy-controls-button-color-default: inherit;
560
+ --xy-controls-button-color-hover-default: inherit;
561
+ --xy-controls-button-border-color-default: #eee;
562
+ --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08);
563
+
564
+ --xy-edge-label-background-color-default: #ffffff;
565
+ --xy-edge-label-color-default: inherit;
566
+ }
567
+
568
+
569
+ .xy-flow.dark {
570
+ --xy-node-color-default: #f8f8f8;
571
+ --xy-node-border-default: 1px solid #3c3c3c;
572
+ --xy-node-background-color-default: #1e1e1e;
573
+ --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25);
574
+ --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, 0.08);
575
+ --xy-node-boxshadow-selected-default: 0 0 0 0.5px #999;
576
+
577
+ --xy-handle-background-color-default: #bebebe;
578
+ --xy-handle-border-color-default: #1e1e1e;
579
+
580
+ --xy-selection-background-color-default: rgba(200, 200, 220, 0.08);
581
+ --xy-selection-border-default: 1px dotted rgba(200, 200, 220, 0.8);
582
+
583
+ --xy-controls-button-background-color-default: #2b2b2b;
584
+ --xy-controls-button-background-color-hover-default: #3e3e3e;
585
+ --xy-controls-button-color-default: #f8f8f8;
586
+ --xy-controls-button-color-hover-default: #fff;
587
+ --xy-controls-button-border-color-default: #5b5b5b;
588
+ --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08);
589
+
590
+ --xy-edge-label-background-color-default: #141414;
591
+ --xy-edge-label-color-default: #f8f8f8;
592
+ }
593
+ .xy-flow__edge.updating {
594
+
595
+ .xy-flow__edge-path {
596
+ stroke: #777;
597
+ }
598
+ }
599
+
600
+ .xy-flow__edge-text {
601
+
602
+ font-size: 10px;
603
+ }
604
+
605
+
606
+
607
+ .xy-flow__node.selectable {
608
+ &:focus,
609
+ &:focus-visible {
610
+ outline: none;
611
+ }
612
+ }
613
+
614
+
615
+ .xy-flow__node-input,
616
+ .xy-flow__node-default,
617
+ .xy-flow__node-output,
618
+ .xy-flow__node-group {
619
+ padding: 10px;
620
+ border-radius: var(--xy-node-border-radius, var(--xy-node-border-radius-default));
621
+ width: 150px;
622
+ font-size: 12px;
623
+ color: var(--xy-node-color, var(--xy-node-color-default));
624
+ text-align: center;
625
+ border: var(--xy-node-border, var(--xy-node-border-default));
626
+ background-color: var(--xy-node-background-color, var(--xy-node-background-color-default));
627
+
628
+ &.selectable {
629
+ &:hover {
630
+ box-shadow: var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default));
631
+ }
632
+
633
+ &.selected,
634
+ &:focus,
635
+ &:focus-visible {
636
+ box-shadow: var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default));
637
+ }
638
+ }
639
+ }
640
+
641
+
642
+ .xy-flow__node-group {
643
+ background-color: var(--xy-node-group-background-color, var(--xy-node-group-background-color-default));
644
+ }
645
+
646
+
647
+ .xy-flow__nodesselection-rect,
648
+ .xy-flow__selection {
649
+ background: var(--xy-selection-background-color, var(--xy-selection-background-color-default));
650
+ border: var(--xy-selection-border, var(--xy-selection-border-default));
651
+
652
+ &:focus,
653
+ &:focus-visible {
654
+ outline: none;
655
+ }
656
+ }
657
+
658
+
659
+ .xy-flow__handle {
660
+ width: 6px;
661
+ height: 6px;
662
+ background-color: var(--xy-handle-background-color, var(--xy-handle-background-color-default));
663
+ border: 1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));
664
+ border-radius: 100%;
665
+ }
666
+ .xy-flow__controls {
667
+
668
+ box-shadow: var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default));
669
+
670
+
671
+
672
+
673
+
674
+
675
+
676
+
677
+ }
678
+
679
+ .xy-flow__controls-button {
680
+
681
+ border: none;
682
+ background: var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));
683
+ border-bottom: 1px solid
684
+ var(
685
+ --xy-controls-button-border-color-props,
686
+ var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default))
687
+ );
688
+ color: var(
689
+ --xy-controls-button-color-props,
690
+ var(--xy-controls-button-color, var(--xy-controls-button-color-default))
691
+ );
692
+ cursor: pointer;
693
+ user-select: none;
694
+
695
+ &:hover {
696
+ background: var(
697
+ --xy-controls-button-background-color-hover-props,
698
+ var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default))
699
+ );
700
+ color: var(
701
+ --xy-controls-button-color-hover-props,
702
+ var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default))
703
+ );
704
+ }
705
+
706
+ &:disabled {
707
+ pointer-events: none;
708
+
709
+ svg {
710
+ fill-opacity: 0.4;
711
+ }
712
+ }
713
+ }
714
+
715
+ .xy-flow__controls-button:last-child {
716
+
717
+ border-bottom: none;
718
+ }
719
+
720
+ .xy-flow__controls.horizontal .xy-flow__controls-button {
721
+
722
+ border-bottom: none;
723
+ border-right: 1px solid
724
+ var(
725
+ --xy-controls-button-border-color-props,
726
+ var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default))
727
+ );
728
+ }
729
+
730
+ .xy-flow__controls.horizontal .xy-flow__controls-button:last-child {
731
+
732
+ border-right: none;
733
+ }
734
+
735
+
736
+
737
+ .xy-flow {
738
+ --xy-resize-background-color-default: #3367d9;
739
+ }
740
+
741
+
742
+ .xy-flow__resize-control {
743
+ position: absolute;
744
+ }
745
+
746
+
747
+ .xy-flow__resize-control.left,
748
+ .xy-flow__resize-control.right {
749
+ cursor: ew-resize;
750
+ }
751
+
752
+
753
+ .xy-flow__resize-control.top,
754
+ .xy-flow__resize-control.bottom {
755
+ cursor: ns-resize;
756
+ }
757
+
758
+
759
+ .xy-flow__resize-control.top.left,
760
+ .xy-flow__resize-control.bottom.right {
761
+ cursor: nwse-resize;
762
+ }
763
+
764
+
765
+ .xy-flow__resize-control.bottom.left,
766
+ .xy-flow__resize-control.top.right {
767
+ cursor: nesw-resize;
768
+ }
769
+
770
+
771
+ /* handle styles */
772
+ .xy-flow__resize-control.handle {
773
+ width: 5px;
774
+ height: 5px;
775
+ border: 1px solid #fff;
776
+ border-radius: 1px;
777
+ background-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default));
778
+ translate: -50% -50%;
779
+ }
780
+
781
+
782
+ .xy-flow__resize-control.handle.left {
783
+ left: 0;
784
+ top: 50%;
785
+ }
786
+
787
+ .xy-flow__resize-control.handle.right {
788
+ left: 100%;
789
+ top: 50%;
790
+ }
791
+
792
+ .xy-flow__resize-control.handle.top {
793
+ left: 50%;
794
+ top: 0;
795
+ }
796
+
797
+ .xy-flow__resize-control.handle.bottom {
798
+ left: 50%;
799
+ top: 100%;
800
+ }
801
+
802
+ .xy-flow__resize-control.handle.top.left {
803
+ left: 0;
804
+ }
805
+
806
+ .xy-flow__resize-control.handle.bottom.left {
807
+ left: 0;
808
+ }
809
+
810
+ .xy-flow__resize-control.handle.top.right {
811
+ left: 100%;
812
+ }
813
+
814
+ .xy-flow__resize-control.handle.bottom.right {
815
+ left: 100%;
816
+ }
817
+
818
+
819
+ /* line styles */
820
+ .xy-flow__resize-control.line {
821
+ border-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default));
822
+ border-width: 0;
823
+ border-style: solid;
824
+ }
825
+
826
+
827
+ .xy-flow__resize-control.line.left,
828
+ .xy-flow__resize-control.line.right {
829
+ width: 1px;
830
+ transform: translate(-50%, 0);
831
+ top: 0;
832
+ height: 100%;
833
+ }
834
+
835
+
836
+ .xy-flow__resize-control.line.left {
837
+ left: 0;
838
+ border-left-width: 1px;
839
+ }
840
+
841
+
842
+ .xy-flow__resize-control.line.right {
843
+ left: 100%;
844
+ border-right-width: 1px;
845
+ }
846
+
847
+
848
+ .xy-flow__resize-control.line.top,
849
+ .xy-flow__resize-control.line.bottom {
850
+ height: 1px;
851
+ transform: translate(0, -50%);
852
+ left: 0;
853
+ width: 100%;
854
+ }
855
+
856
+
857
+ .xy-flow__resize-control.line.top {
858
+ top: 0;
859
+ border-top-width: 1px;
860
+ }
861
+
862
+
863
+ .xy-flow__resize-control.line.bottom {
864
+ border-bottom-width: 1px;
865
+ top: 100%;
866
+ }
867
+
868
+
869
+
870
+ .ng-flow__edge-textbg {
871
+ fill: var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default));
872
+ }
873
+
874
+
875
+ .ng-flow__edge-text {
876
+ fill: var(--xy-edge-label-color, var(--xy-edge-label-color-default));
877
+ }
878
+
879
+
880
+ /*
881
+ * Cursor overrides — native grab/grabbing/crosshair cursors are invisible
882
+ * on some Windows setups (white pointer scheme). We ship custom SVG cursors
883
+ * that match the native look (white fill + black outline) and always work.
884
+ * Falls back to native cursor if SVG fails to load.
885
+ */
886
+
887
+ /* Open hand — for pane pan and draggable nodes */
888
+ .xy-flow__pane.draggable,
889
+ .xy-flow__node.draggable {
890
+ cursor: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22'%3E%3Cg fill='white' stroke='black' stroke-width='1.3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6.5 10V5.5a1.25 1.25 0 0 1 2.5 0V9'/%3E%3Cpath d='M9 6V3.5a1.25 1.25 0 0 1 2.5 0V9'/%3E%3Cpath d='M11.5 5.5V4a1.25 1.25 0 0 1 2.5 0V9'/%3E%3Cpath d='M14 6.5V5.5a1.25 1.25 0 0 1 2.5 0v5a5 5 0 0 1-5 5h-1a5 5 0 0 1-4.2-2.3L4 9.8a1.25 1.25 0 0 1 1.8-1.5L6.5 10'/%3E%3C/g%3E%3C/svg%3E") 11 4, grab;
891
+ }
892
+
893
+
894
+ /* Closed hand — while dragging */
895
+ .xy-flow__pane.dragging,
896
+ .xy-flow__node.draggable.dragging {
897
+ cursor: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22'%3E%3Cg fill='white' stroke='black' stroke-width='1.3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6.5 11V10c0-.7.6-1.2 1.3-1.2s1.2.5 1.2 1.2'/%3E%3Cpath d='M9 9.5V9c0-.7.6-1.2 1.3-1.2S11.5 8.3 11.5 9'/%3E%3Cpath d='M11.5 9V8.5c0-.7.6-1.2 1.3-1.2s1.2.5 1.2 1.2'/%3E%3Cpath d='M14 9v-.5c0-.7.6-1.2 1.3-1.2s1.2.5 1.2 1.2v4a5 5 0 0 1-5 5h-1a5 5 0 0 1-4.2-2.3L4 11.8a1.25 1.25 0 0 1 1.8-1.5L6.5 11'/%3E%3C/g%3E%3C/svg%3E") 11 8, grabbing;
898
+ }
899
+
900
+
901
+ /* Crosshair — for connection handles */
902
+ .xy-flow__handle.connectionindicator {
903
+ cursor: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='19' height='19'%3E%3Cg stroke='black' stroke-width='1.3'%3E%3Cline x1='9.5' y1='1' x2='9.5' y2='6' stroke='white' stroke-width='3'/%3E%3Cline x1='9.5' y1='13' x2='9.5' y2='18' stroke='white' stroke-width='3'/%3E%3Cline x1='1' y1='9.5' x2='6' y2='9.5' stroke='white' stroke-width='3'/%3E%3Cline x1='13' y1='9.5' x2='18' y2='9.5' stroke='white' stroke-width='3'/%3E%3Cline x1='9.5' y1='1' x2='9.5' y2='6'/%3E%3Cline x1='9.5' y1='13' x2='9.5' y2='18'/%3E%3Cline x1='1' y1='9.5' x2='6' y2='9.5'/%3E%3Cline x1='13' y1='9.5' x2='18' y2='9.5'/%3E%3C/g%3E%3C/svg%3E") 9 9, crosshair;
904
+ }
905
+
906
+
907
+ /*
908
+ * @ngflow/angular — Complete stylesheet
909
+ *
910
+ * Import this once in your app's global styles:
911
+ * @import '@ngflow/angular/styles/ng-flow.css';
912
+ *
913
+ * Or in angular.json:
914
+ * "styles": ["node_modules/@ngflow/angular/styles/ng-flow.css"]
915
+ */
916
+
917
+ /* ── CSS Custom Properties (theme defaults) ─────────────────────── */
918
+ .xy-flow {
919
+ direction: ltr;
920
+
921
+ /* Edges */
922
+ --xy-edge-stroke-default: #999;
923
+ --xy-edge-stroke-width-default: 1.5;
924
+ --xy-edge-stroke-selected-default: #555;
925
+
926
+ /* Connection line */
927
+ --xy-connectionline-stroke-default: #555;
928
+ --xy-connectionline-stroke-width-default: 2;
929
+
930
+ /* Attribution */
931
+ --xy-attribution-background-color-default: rgba(255, 255, 255, 0.5);
932
+
933
+ /* Minimap */
934
+ --xy-minimap-background-color-default: #fff;
935
+ --xy-minimap-mask-background-color-default: rgba(240, 240, 240, 0.6);
936
+ --xy-minimap-mask-stroke-color-default: transparent;
937
+ --xy-minimap-mask-stroke-width-default: 1;
938
+ --xy-minimap-node-background-color-default: #e2e2e2;
939
+ --xy-minimap-node-stroke-color-default: transparent;
940
+ --xy-minimap-node-stroke-width-default: 2;
941
+
942
+ /* Background */
943
+ --xy-background-color-default: #fafafa;
944
+ --xy-background-pattern-dots-color-default: #91919a;
945
+ --xy-background-pattern-lines-color-default: #eee;
946
+ --xy-background-pattern-cross-color-default: #e2e2e2;
947
+
948
+ /* Nodes */
949
+ --xy-node-color-default: inherit;
950
+ --xy-node-border-default: 1px solid #1a192b;
951
+ --xy-node-background-color-default: #fff;
952
+ --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25);
953
+ --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, 0.08);
954
+ --xy-node-boxshadow-selected-default: 0 0 0 0.5px #1a192b;
955
+ --xy-node-border-radius-default: 3px;
956
+
957
+ /* Handles */
958
+ --xy-handle-background-color-default: #1a192b;
959
+ --xy-handle-border-color-default: #fff;
960
+
961
+ /* Selection */
962
+ --xy-selection-background-color-default: rgba(0, 89, 220, 0.08);
963
+ --xy-selection-border-default: 1px dotted rgba(0, 89, 220, 0.8);
964
+
965
+ /* Controls */
966
+ --xy-controls-button-background-color-default: #fefefe;
967
+ --xy-controls-button-background-color-hover-default: #f4f4f4;
968
+ --xy-controls-button-color-default: inherit;
969
+ --xy-controls-button-border-color-default: #eee;
970
+ --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08);
971
+
972
+ /* Edge labels */
973
+ --xy-edge-label-background-color-default: #ffffff;
974
+ --xy-edge-label-color-default: inherit;
975
+
976
+ background-color: var(--xy-background-color, var(--xy-background-color-default));
977
+ }
978
+
979
+
980
+ /* Dark mode */
981
+ .xy-flow.dark {
982
+ --xy-edge-stroke-default: #3e3e3e;
983
+ --xy-edge-stroke-selected-default: #727272;
984
+ --xy-node-color-default: #f8f8f8;
985
+ --xy-node-border-default: 1px solid #3c3c3c;
986
+ --xy-node-background-color-default: #1e1e1e;
987
+ --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, 0.08);
988
+ --xy-node-boxshadow-selected-default: 0 0 0 0.5px #999;
989
+ --xy-handle-background-color-default: #bebebe;
990
+ --xy-handle-border-color-default: #1e1e1e;
991
+ --xy-background-color-default: #141414;
992
+ --xy-background-pattern-dots-color-default: #777;
993
+ --xy-background-pattern-lines-color-default: #777;
994
+ --xy-background-pattern-cross-color-default: #777;
995
+ --xy-minimap-background-color-default: #141414;
996
+ --xy-minimap-mask-background-color-default: rgba(60, 60, 60, 0.6);
997
+ --xy-minimap-node-background-color-default: #2b2b2b;
998
+ --xy-controls-button-background-color-default: #2b2b2b;
999
+ --xy-controls-button-background-color-hover-default: #3e3e3e;
1000
+ --xy-controls-button-color-default: #f8f8f8;
1001
+ --xy-controls-button-border-color-default: #5b5b5b;
1002
+ --xy-edge-label-background-color-default: #141414;
1003
+ --xy-edge-label-color-default: #f8f8f8;
1004
+ }
1005
+
1006
+
1007
+ /* ── Layout ─────────────────────────────────────────────────────── */
1008
+ .xy-flow__container {
1009
+ position: absolute;
1010
+ width: 100%;
1011
+ height: 100%;
1012
+ top: 0;
1013
+ left: 0;
1014
+ }
1015
+
1016
+
1017
+ .xy-flow__pane {
1018
+ z-index: 1;
1019
+ cursor: default;
1020
+ }
1021
+
1022
+ .xy-flow__pane.selection { cursor: pointer; }
1023
+
1024
+
1025
+ .xy-flow__viewport {
1026
+ transform-origin: 0 0;
1027
+ z-index: 2;
1028
+ pointer-events: none;
1029
+ }
1030
+
1031
+
1032
+ .xy-flow__renderer { z-index: 4; }
1033
+
1034
+ .xy-flow__selection { z-index: 6; }
1035
+
1036
+
1037
+ /* ── Edges ──────────────────────────────────────────────────────── */
1038
+ .xy-flow__edge-path {
1039
+ stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default));
1040
+ stroke-width: var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));
1041
+ fill: none;
1042
+ }
1043
+
1044
+
1045
+ .xy-flow__connection-path {
1046
+ stroke: var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));
1047
+ stroke-width: var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));
1048
+ fill: none;
1049
+ }
1050
+
1051
+
1052
+ .xy-flow .xy-flow__edges { position: absolute; }
1053
+
1054
+ .xy-flow .xy-flow__edges svg {
1055
+ overflow: visible;
1056
+ position: absolute;
1057
+ pointer-events: none;
1058
+ }
1059
+
1060
+
1061
+ .xy-flow__edge { pointer-events: visibleStroke; }
1062
+
1063
+ .xy-flow__edge.selectable { cursor: pointer; }
1064
+
1065
+ .xy-flow__edge.animated path {
1066
+ stroke-dasharray: 5;
1067
+ animation: xy-flow-dashdraw 0.5s linear infinite;
1068
+ }
1069
+
1070
+ .xy-flow__edge.animated path.xy-flow__edge-interaction {
1071
+ stroke-dasharray: none;
1072
+ animation: none;
1073
+ }
1074
+
1075
+ .xy-flow__edge.selected .xy-flow__edge-path,
1076
+ .xy-flow__edge.selectable:focus .xy-flow__edge-path,
1077
+ .xy-flow__edge.selectable:focus-visible .xy-flow__edge-path {
1078
+ stroke: var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default));
1079
+ }
1080
+
1081
+
1082
+ .xy-flow__edge-textwrapper { pointer-events: all; }
1083
+
1084
+ .xy-flow__edge-text { pointer-events: none; user-select: none; }
1085
+
1086
+
1087
+ .xy-flow__arrowhead polyline {
1088
+ stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default));
1089
+ }
1090
+
1091
+ .xy-flow__arrowhead polyline.arrowclosed {
1092
+ fill: var(--xy-edge-stroke, var(--xy-edge-stroke-default));
1093
+ }
1094
+
1095
+
1096
+ .xy-flow__connection { pointer-events: none; }
1097
+
1098
+ svg.xy-flow__connectionline {
1099
+ z-index: 1001;
1100
+ overflow: visible;
1101
+ position: absolute;
1102
+ }
1103
+
1104
+
1105
+ @keyframes xy-flow-dashdraw {
1106
+ from { stroke-dashoffset: 10; }
1107
+ }
1108
+
1109
+
1110
+ /* ── Nodes ──────────────────────────────────────────────────────── */
1111
+ .xy-flow__nodes {
1112
+ pointer-events: none;
1113
+ transform-origin: 0 0;
1114
+ }
1115
+
1116
+
1117
+ .xy-flow__node {
1118
+ position: absolute;
1119
+ user-select: none;
1120
+ pointer-events: all;
1121
+ transform-origin: 0 0;
1122
+ box-sizing: border-box;
1123
+ cursor: default;
1124
+ }
1125
+
1126
+ .xy-flow__node.selectable { cursor: pointer; }
1127
+
1128
+ .xy-flow__node.selectable:hover {
1129
+ box-shadow: var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default));
1130
+ }
1131
+
1132
+ .xy-flow__node.selectable.selected,
1133
+ .xy-flow__node.selectable:focus,
1134
+ .xy-flow__node.selectable:focus-visible {
1135
+ box-shadow: var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default));
1136
+ outline: none;
1137
+ }
1138
+
1139
+
1140
+ .xy-flow__node-input,
1141
+ .xy-flow__node-default,
1142
+ .xy-flow__node-output,
1143
+ .xy-flow__node-group {
1144
+ padding: 10px;
1145
+ border-radius: var(--xy-node-border-radius, var(--xy-node-border-radius-default));
1146
+ width: 150px;
1147
+ font-size: 12px;
1148
+ color: var(--xy-node-color, var(--xy-node-color-default));
1149
+ text-align: center;
1150
+ border: var(--xy-node-border, var(--xy-node-border-default));
1151
+ background-color: var(--xy-node-background-color, var(--xy-node-background-color-default));
1152
+ }
1153
+
1154
+
1155
+ .xy-flow__node-group {
1156
+ background-color: var(--xy-node-group-background-color, var(--xy-node-group-background-color-default));
1157
+ }
1158
+
1159
+
1160
+ .xy-flow__nodesselection {
1161
+ z-index: 3;
1162
+ transform-origin: left top;
1163
+ pointer-events: none;
1164
+ }
1165
+
1166
+ .xy-flow__nodesselection-rect {
1167
+ position: absolute;
1168
+ pointer-events: all;
1169
+ cursor: grab;
1170
+ }
1171
+
1172
+
1173
+ /* ── Handles ────────────────────────────────────────────────────── */
1174
+ .xy-flow__handle {
1175
+ position: absolute;
1176
+ pointer-events: none;
1177
+ min-width: 5px;
1178
+ min-height: 5px;
1179
+ width: 8px;
1180
+ height: 8px;
1181
+ background-color: var(--xy-handle-background-color, var(--xy-handle-background-color-default));
1182
+ border: 1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));
1183
+ border-radius: 100%;
1184
+ }
1185
+
1186
+ .xy-flow__handle.connectingfrom { pointer-events: all; }
1187
+
1188
+ .xy-flow__handle.connectionindicator { pointer-events: all; }
1189
+
1190
+ .xy-flow__handle-bottom { top: auto; left: 50%; bottom: 0; transform: translate(-50%, 50%); }
1191
+
1192
+ .xy-flow__handle-top { top: 0; left: 50%; transform: translate(-50%, -50%); }
1193
+
1194
+ .xy-flow__handle-left { top: 50%; left: 0; transform: translate(-50%, -50%); }
1195
+
1196
+ .xy-flow__handle-right { top: 50%; right: 0; transform: translate(50%, -50%); }
1197
+
1198
+
1199
+ /* ── Selection box ──────────────────────────────────────────────── */
1200
+ .xy-flow__selection,
1201
+ .xy-flow__nodesselection-rect {
1202
+ background: var(--xy-selection-background-color, var(--xy-selection-background-color-default));
1203
+ border: var(--xy-selection-border, var(--xy-selection-border-default));
1204
+ }
1205
+
1206
+ .xy-flow__nodesselection-rect:focus,
1207
+ .xy-flow__nodesselection-rect:focus-visible { outline: none; }
1208
+
1209
+
1210
+ /* ── Panels ─────────────────────────────────────────────────────── */
1211
+ .xy-flow__panel {
1212
+ position: absolute;
1213
+ z-index: 5;
1214
+ margin: 15px;
1215
+ }
1216
+
1217
+ .xy-flow__panel.top { top: 0; }
1218
+
1219
+ .xy-flow__panel.bottom { bottom: 0; }
1220
+
1221
+ .xy-flow__panel.left { left: 0; }
1222
+
1223
+ .xy-flow__panel.right { right: 0; }
1224
+
1225
+ .xy-flow__panel.top.center, .xy-flow__panel.bottom.center {
1226
+ left: 50%;
1227
+ transform: translateX(-15px) translateX(-50%);
1228
+ }
1229
+
1230
+ .xy-flow__panel.left.center, .xy-flow__panel.right.center {
1231
+ top: 50%;
1232
+ transform: translateY(-15px) translateY(-50%);
1233
+ }
1234
+
1235
+
1236
+ .xy-flow__pane.selection .xy-flow__panel { pointer-events: none; }
1237
+
1238
+
1239
+ /* ── Controls ───────────────────────────────────────────────────── */
1240
+ .xy-flow__controls {
1241
+ display: flex;
1242
+ flex-direction: column;
1243
+ box-shadow: var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default));
1244
+ }
1245
+
1246
+ .xy-flow__controls-button {
1247
+ display: flex;
1248
+ justify-content: center;
1249
+ align-items: center;
1250
+ height: 26px;
1251
+ width: 26px;
1252
+ padding: 4px;
1253
+ border: none;
1254
+ background: var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));
1255
+ border-bottom: 1px solid var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default));
1256
+ color: var(--xy-controls-button-color, var(--xy-controls-button-color-default));
1257
+ cursor: pointer;
1258
+ user-select: none;
1259
+ }
1260
+
1261
+ .xy-flow__controls-button:hover {
1262
+ background: var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default));
1263
+ }
1264
+
1265
+ .xy-flow__controls-button:disabled { pointer-events: none; }
1266
+
1267
+ .xy-flow__controls-button:disabled svg { fill-opacity: 0.4; }
1268
+
1269
+ .xy-flow__controls-button svg {
1270
+ width: 100%;
1271
+ max-width: 12px;
1272
+ max-height: 12px;
1273
+ fill: currentColor;
1274
+ }
1275
+
1276
+ .xy-flow__controls-button:last-child { border-bottom: none; }
1277
+
1278
+
1279
+ /* ── Minimap ────────────────────────────────────────────────────── */
1280
+ .xy-flow__minimap {
1281
+ background: var(--xy-minimap-background-color, var(--xy-minimap-background-color-default));
1282
+ }
1283
+
1284
+ .xy-flow__minimap-svg { display: block; }
1285
+
1286
+ .xy-flow__minimap-mask {
1287
+ fill: var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default));
1288
+ stroke: var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default));
1289
+ stroke-width: var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default));
1290
+ }
1291
+
1292
+ .xy-flow__minimap-node {
1293
+ fill: var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default));
1294
+ stroke: var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default));
1295
+ stroke-width: var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default));
1296
+ }
1297
+
1298
+
1299
+ /* ── Background ─────────────────────────────────────────────────── */
1300
+ .xy-flow__background { pointer-events: none; z-index: -1; }
1301
+
1302
+ .xy-flow__background-pattern.dots {
1303
+ fill: var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default));
1304
+ }
1305
+
1306
+ .xy-flow__background-pattern.lines {
1307
+ stroke: var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default));
1308
+ }
1309
+
1310
+ .xy-flow__background-pattern.cross {
1311
+ stroke: var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default));
1312
+ }
1313
+
1314
+
1315
+ /* ── Edge labels / portals ──────────────────────────────────────── */
1316
+ .ng-flow__edge-textbg {
1317
+ fill: var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default));
1318
+ }
1319
+
1320
+ .ng-flow__edge-text {
1321
+ fill: var(--xy-edge-label-color, var(--xy-edge-label-color-default));
1322
+ }
1323
+
1324
+
1325
+ .xy-flow__edgelabel-renderer {
1326
+ position: absolute;
1327
+ width: 100%;
1328
+ height: 100%;
1329
+ pointer-events: none;
1330
+ user-select: none;
1331
+ left: 0;
1332
+ top: 0;
1333
+ }
1334
+
1335
+
1336
+ .xy-flow__viewport-portal {
1337
+ position: absolute;
1338
+ width: 100%;
1339
+ height: 100%;
1340
+ left: 0;
1341
+ top: 0;
1342
+ user-select: none;
1343
+ }
1344
+
1345
+
1346
+ /* ── Edge reconnect anchors ─────────────────────────────────────── */
1347
+ .xy-flow__edgeupdater {
1348
+ cursor: move;
1349
+ pointer-events: all;
1350
+ }
1351
+
1352
+
1353
+ /* ── Attribution ────────────────────────────────────────────────── */
1354
+ .xy-flow__attribution {
1355
+ font-size: 10px;
1356
+ background: var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));
1357
+ padding: 2px 3px;
1358
+ margin: 0;
1359
+ }
1360
+
1361
+ .xy-flow__attribution a { text-decoration: none; color: #999; }
1362
+
1363
+
1364
+ /*
1365
+ * ── Cursor overrides ───────────────────────────────────────────────
1366
+ *
1367
+ * Native CSS cursors (grab, grabbing, crosshair) render as invisible white
1368
+ * on some Windows setups with a white pointer scheme. We ship custom SVG
1369
+ * cursors (white fill + black outline) that always work on any OS/theme,
1370
+ * with native cursors as fallback.
1371
+ */
1372
+
1373
+ /* Open hand — pane & draggable nodes */
1374
+ .xy-flow__pane.draggable,
1375
+ .xy-flow__node.draggable {
1376
+ cursor: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22'%3E%3Cg fill='white' stroke='black' stroke-width='1.3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6.5 10V5.5a1.25 1.25 0 0 1 2.5 0V9'/%3E%3Cpath d='M9 6V3.5a1.25 1.25 0 0 1 2.5 0V9'/%3E%3Cpath d='M11.5 5.5V4a1.25 1.25 0 0 1 2.5 0V9'/%3E%3Cpath d='M14 6.5V5.5a1.25 1.25 0 0 1 2.5 0v5a5 5 0 0 1-5 5h-1a5 5 0 0 1-4.2-2.3L4 9.8a1.25 1.25 0 0 1 1.8-1.5L6.5 10'/%3E%3C/g%3E%3C/svg%3E") 11 4, grab;
1377
+ pointer-events: all;
1378
+ }
1379
+
1380
+
1381
+ /* Closed hand — while dragging */
1382
+ .xy-flow__pane.dragging,
1383
+ .xy-flow__node.draggable.dragging {
1384
+ cursor: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22'%3E%3Cg fill='white' stroke='black' stroke-width='1.3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6.5 11V10c0-.7.6-1.2 1.3-1.2s1.2.5 1.2 1.2'/%3E%3Cpath d='M9 9.5V9c0-.7.6-1.2 1.3-1.2S11.5 8.3 11.5 9'/%3E%3Cpath d='M11.5 9V8.5c0-.7.6-1.2 1.3-1.2s1.2.5 1.2 1.2'/%3E%3Cpath d='M14 9v-.5c0-.7.6-1.2 1.3-1.2s1.2.5 1.2 1.2v4a5 5 0 0 1-5 5h-1a5 5 0 0 1-4.2-2.3L4 11.8a1.25 1.25 0 0 1 1.8-1.5L6.5 11'/%3E%3C/g%3E%3C/svg%3E") 11 8, grabbing;
1385
+ }
1386
+
1387
+
1388
+ /* Crosshair — connection handles */
1389
+ .xy-flow__handle.connectionindicator {
1390
+ cursor: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='19' height='19'%3E%3Cg stroke='black' stroke-width='1.3'%3E%3Cline x1='9.5' y1='1' x2='9.5' y2='6' stroke='white' stroke-width='3'/%3E%3Cline x1='9.5' y1='13' x2='9.5' y2='18' stroke='white' stroke-width='3'/%3E%3Cline x1='1' y1='9.5' x2='6' y2='9.5' stroke='white' stroke-width='3'/%3E%3Cline x1='13' y1='9.5' x2='18' y2='9.5' stroke='white' stroke-width='3'/%3E%3Cline x1='9.5' y1='1' x2='9.5' y2='6'/%3E%3Cline x1='9.5' y1='13' x2='9.5' y2='18'/%3E%3Cline x1='1' y1='9.5' x2='6' y2='9.5'/%3E%3Cline x1='13' y1='9.5' x2='18' y2='9.5'/%3E%3C/g%3E%3C/svg%3E") 9 9, crosshair;
1391
+ }
1392
+