@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/base.css ADDED
@@ -0,0 +1,1204 @@
1
+ /* base.css - basic structural 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-border-default: 1px solid #bbb;
544
+ --xy-node-border-selected-default: 1px solid #555;
545
+
546
+ --xy-handle-background-color-default: #333;
547
+
548
+ --xy-selection-background-color-default: rgba(150, 150, 180, 0.1);
549
+ --xy-selection-border-default: 1px dotted rgba(155, 155, 155, 0.8);
550
+ }
551
+
552
+
553
+ .xy-flow.dark {
554
+ --xy-node-color-default: #f8f8f8;
555
+ }
556
+
557
+
558
+ .xy-flow__handle {
559
+ background-color: var(--xy-handle-background-color, var(--xy-handle-background-color-default));
560
+ }
561
+
562
+
563
+ .xy-flow__node-input,
564
+ .xy-flow__node-default,
565
+ .xy-flow__node-output,
566
+ .xy-flow__node-group {
567
+ border: var(--xy-node-border, var(--xy-node-border-default));
568
+ color: var(--xy-node-color, var(--xy-node-color-default));
569
+
570
+ &.selected,
571
+ &:focus,
572
+ &:focus-visible {
573
+ outline: none;
574
+ border: var(--xy-node-border-selected, var(--xy-node-border-selected-default));
575
+ }
576
+ }
577
+
578
+
579
+ .xy-flow__nodesselection-rect,
580
+ .xy-flow__selection {
581
+ background: var(--xy-selection-background-color, var(--xy-selection-background-color-default));
582
+ border: var(--xy-selection-border, var(--xy-selection-border-default));
583
+ }
584
+
585
+
586
+ .xy-flow {
587
+ --xy-resize-background-color-default: #3367d9;
588
+ }
589
+
590
+
591
+ .xy-flow__resize-control {
592
+ position: absolute;
593
+ }
594
+
595
+
596
+ .xy-flow__resize-control.left,
597
+ .xy-flow__resize-control.right {
598
+ cursor: ew-resize;
599
+ }
600
+
601
+
602
+ .xy-flow__resize-control.top,
603
+ .xy-flow__resize-control.bottom {
604
+ cursor: ns-resize;
605
+ }
606
+
607
+
608
+ .xy-flow__resize-control.top.left,
609
+ .xy-flow__resize-control.bottom.right {
610
+ cursor: nwse-resize;
611
+ }
612
+
613
+
614
+ .xy-flow__resize-control.bottom.left,
615
+ .xy-flow__resize-control.top.right {
616
+ cursor: nesw-resize;
617
+ }
618
+
619
+
620
+ /* handle styles */
621
+ .xy-flow__resize-control.handle {
622
+ width: 5px;
623
+ height: 5px;
624
+ border: 1px solid #fff;
625
+ border-radius: 1px;
626
+ background-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default));
627
+ translate: -50% -50%;
628
+ }
629
+
630
+
631
+ .xy-flow__resize-control.handle.left {
632
+ left: 0;
633
+ top: 50%;
634
+ }
635
+
636
+ .xy-flow__resize-control.handle.right {
637
+ left: 100%;
638
+ top: 50%;
639
+ }
640
+
641
+ .xy-flow__resize-control.handle.top {
642
+ left: 50%;
643
+ top: 0;
644
+ }
645
+
646
+ .xy-flow__resize-control.handle.bottom {
647
+ left: 50%;
648
+ top: 100%;
649
+ }
650
+
651
+ .xy-flow__resize-control.handle.top.left {
652
+ left: 0;
653
+ }
654
+
655
+ .xy-flow__resize-control.handle.bottom.left {
656
+ left: 0;
657
+ }
658
+
659
+ .xy-flow__resize-control.handle.top.right {
660
+ left: 100%;
661
+ }
662
+
663
+ .xy-flow__resize-control.handle.bottom.right {
664
+ left: 100%;
665
+ }
666
+
667
+
668
+ /* line styles */
669
+ .xy-flow__resize-control.line {
670
+ border-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default));
671
+ border-width: 0;
672
+ border-style: solid;
673
+ }
674
+
675
+
676
+ .xy-flow__resize-control.line.left,
677
+ .xy-flow__resize-control.line.right {
678
+ width: 1px;
679
+ transform: translate(-50%, 0);
680
+ top: 0;
681
+ height: 100%;
682
+ }
683
+
684
+
685
+ .xy-flow__resize-control.line.left {
686
+ left: 0;
687
+ border-left-width: 1px;
688
+ }
689
+
690
+
691
+ .xy-flow__resize-control.line.right {
692
+ left: 100%;
693
+ border-right-width: 1px;
694
+ }
695
+
696
+
697
+ .xy-flow__resize-control.line.top,
698
+ .xy-flow__resize-control.line.bottom {
699
+ height: 1px;
700
+ transform: translate(0, -50%);
701
+ left: 0;
702
+ width: 100%;
703
+ }
704
+
705
+
706
+ .xy-flow__resize-control.line.top {
707
+ top: 0;
708
+ border-top-width: 1px;
709
+ }
710
+
711
+
712
+ .xy-flow__resize-control.line.bottom {
713
+ border-bottom-width: 1px;
714
+ top: 100%;
715
+ }
716
+
717
+
718
+
719
+ /*
720
+ * @ngflow/angular — Complete stylesheet
721
+ *
722
+ * Import this once in your app's global styles:
723
+ * @import '@ngflow/angular/styles/ng-flow.css';
724
+ *
725
+ * Or in angular.json:
726
+ * "styles": ["node_modules/@ngflow/angular/styles/ng-flow.css"]
727
+ */
728
+
729
+ /* ── CSS Custom Properties (theme defaults) ─────────────────────── */
730
+ .xy-flow {
731
+ direction: ltr;
732
+
733
+ /* Edges */
734
+ --xy-edge-stroke-default: #999;
735
+ --xy-edge-stroke-width-default: 1.5;
736
+ --xy-edge-stroke-selected-default: #555;
737
+
738
+ /* Connection line */
739
+ --xy-connectionline-stroke-default: #555;
740
+ --xy-connectionline-stroke-width-default: 2;
741
+
742
+ /* Attribution */
743
+ --xy-attribution-background-color-default: rgba(255, 255, 255, 0.5);
744
+
745
+ /* Minimap */
746
+ --xy-minimap-background-color-default: #fff;
747
+ --xy-minimap-mask-background-color-default: rgba(240, 240, 240, 0.6);
748
+ --xy-minimap-mask-stroke-color-default: transparent;
749
+ --xy-minimap-mask-stroke-width-default: 1;
750
+ --xy-minimap-node-background-color-default: #e2e2e2;
751
+ --xy-minimap-node-stroke-color-default: transparent;
752
+ --xy-minimap-node-stroke-width-default: 2;
753
+
754
+ /* Background */
755
+ --xy-background-color-default: #fafafa;
756
+ --xy-background-pattern-dots-color-default: #91919a;
757
+ --xy-background-pattern-lines-color-default: #eee;
758
+ --xy-background-pattern-cross-color-default: #e2e2e2;
759
+
760
+ /* Nodes */
761
+ --xy-node-color-default: inherit;
762
+ --xy-node-border-default: 1px solid #1a192b;
763
+ --xy-node-background-color-default: #fff;
764
+ --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25);
765
+ --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, 0.08);
766
+ --xy-node-boxshadow-selected-default: 0 0 0 0.5px #1a192b;
767
+ --xy-node-border-radius-default: 3px;
768
+
769
+ /* Handles */
770
+ --xy-handle-background-color-default: #1a192b;
771
+ --xy-handle-border-color-default: #fff;
772
+
773
+ /* Selection */
774
+ --xy-selection-background-color-default: rgba(0, 89, 220, 0.08);
775
+ --xy-selection-border-default: 1px dotted rgba(0, 89, 220, 0.8);
776
+
777
+ /* Controls */
778
+ --xy-controls-button-background-color-default: #fefefe;
779
+ --xy-controls-button-background-color-hover-default: #f4f4f4;
780
+ --xy-controls-button-color-default: inherit;
781
+ --xy-controls-button-border-color-default: #eee;
782
+ --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08);
783
+
784
+ /* Edge labels */
785
+ --xy-edge-label-background-color-default: #ffffff;
786
+ --xy-edge-label-color-default: inherit;
787
+
788
+ background-color: var(--xy-background-color, var(--xy-background-color-default));
789
+ }
790
+
791
+
792
+ /* Dark mode */
793
+ .xy-flow.dark {
794
+ --xy-edge-stroke-default: #3e3e3e;
795
+ --xy-edge-stroke-selected-default: #727272;
796
+ --xy-node-color-default: #f8f8f8;
797
+ --xy-node-border-default: 1px solid #3c3c3c;
798
+ --xy-node-background-color-default: #1e1e1e;
799
+ --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, 0.08);
800
+ --xy-node-boxshadow-selected-default: 0 0 0 0.5px #999;
801
+ --xy-handle-background-color-default: #bebebe;
802
+ --xy-handle-border-color-default: #1e1e1e;
803
+ --xy-background-color-default: #141414;
804
+ --xy-background-pattern-dots-color-default: #777;
805
+ --xy-background-pattern-lines-color-default: #777;
806
+ --xy-background-pattern-cross-color-default: #777;
807
+ --xy-minimap-background-color-default: #141414;
808
+ --xy-minimap-mask-background-color-default: rgba(60, 60, 60, 0.6);
809
+ --xy-minimap-node-background-color-default: #2b2b2b;
810
+ --xy-controls-button-background-color-default: #2b2b2b;
811
+ --xy-controls-button-background-color-hover-default: #3e3e3e;
812
+ --xy-controls-button-color-default: #f8f8f8;
813
+ --xy-controls-button-border-color-default: #5b5b5b;
814
+ --xy-edge-label-background-color-default: #141414;
815
+ --xy-edge-label-color-default: #f8f8f8;
816
+ }
817
+
818
+
819
+ /* ── Layout ─────────────────────────────────────────────────────── */
820
+ .xy-flow__container {
821
+ position: absolute;
822
+ width: 100%;
823
+ height: 100%;
824
+ top: 0;
825
+ left: 0;
826
+ }
827
+
828
+
829
+ .xy-flow__pane {
830
+ z-index: 1;
831
+ cursor: default;
832
+ }
833
+
834
+ .xy-flow__pane.selection { cursor: pointer; }
835
+
836
+
837
+ .xy-flow__viewport {
838
+ transform-origin: 0 0;
839
+ z-index: 2;
840
+ pointer-events: none;
841
+ }
842
+
843
+
844
+ .xy-flow__renderer { z-index: 4; }
845
+
846
+ .xy-flow__selection { z-index: 6; }
847
+
848
+
849
+ /* ── Edges ──────────────────────────────────────────────────────── */
850
+ .xy-flow__edge-path {
851
+ stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default));
852
+ stroke-width: var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));
853
+ fill: none;
854
+ }
855
+
856
+
857
+ .xy-flow__connection-path {
858
+ stroke: var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));
859
+ stroke-width: var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));
860
+ fill: none;
861
+ }
862
+
863
+
864
+ .xy-flow .xy-flow__edges { position: absolute; }
865
+
866
+ .xy-flow .xy-flow__edges svg {
867
+ overflow: visible;
868
+ position: absolute;
869
+ pointer-events: none;
870
+ }
871
+
872
+
873
+ .xy-flow__edge { pointer-events: visibleStroke; }
874
+
875
+ .xy-flow__edge.selectable { cursor: pointer; }
876
+
877
+ .xy-flow__edge.animated path {
878
+ stroke-dasharray: 5;
879
+ animation: xy-flow-dashdraw 0.5s linear infinite;
880
+ }
881
+
882
+ .xy-flow__edge.animated path.xy-flow__edge-interaction {
883
+ stroke-dasharray: none;
884
+ animation: none;
885
+ }
886
+
887
+ .xy-flow__edge.selected .xy-flow__edge-path,
888
+ .xy-flow__edge.selectable:focus .xy-flow__edge-path,
889
+ .xy-flow__edge.selectable:focus-visible .xy-flow__edge-path {
890
+ stroke: var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default));
891
+ }
892
+
893
+
894
+ .xy-flow__edge-textwrapper { pointer-events: all; }
895
+
896
+ .xy-flow__edge-text { pointer-events: none; user-select: none; }
897
+
898
+
899
+ .xy-flow__arrowhead polyline {
900
+ stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default));
901
+ }
902
+
903
+ .xy-flow__arrowhead polyline.arrowclosed {
904
+ fill: var(--xy-edge-stroke, var(--xy-edge-stroke-default));
905
+ }
906
+
907
+
908
+ .xy-flow__connection { pointer-events: none; }
909
+
910
+ svg.xy-flow__connectionline {
911
+ z-index: 1001;
912
+ overflow: visible;
913
+ position: absolute;
914
+ }
915
+
916
+
917
+ @keyframes xy-flow-dashdraw {
918
+ from { stroke-dashoffset: 10; }
919
+ }
920
+
921
+
922
+ /* ── Nodes ──────────────────────────────────────────────────────── */
923
+ .xy-flow__nodes {
924
+ pointer-events: none;
925
+ transform-origin: 0 0;
926
+ }
927
+
928
+
929
+ .xy-flow__node {
930
+ position: absolute;
931
+ user-select: none;
932
+ pointer-events: all;
933
+ transform-origin: 0 0;
934
+ box-sizing: border-box;
935
+ cursor: default;
936
+ }
937
+
938
+ .xy-flow__node.selectable { cursor: pointer; }
939
+
940
+ .xy-flow__node.selectable:hover {
941
+ box-shadow: var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default));
942
+ }
943
+
944
+ .xy-flow__node.selectable.selected,
945
+ .xy-flow__node.selectable:focus,
946
+ .xy-flow__node.selectable:focus-visible {
947
+ box-shadow: var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default));
948
+ outline: none;
949
+ }
950
+
951
+
952
+ .xy-flow__node-input,
953
+ .xy-flow__node-default,
954
+ .xy-flow__node-output,
955
+ .xy-flow__node-group {
956
+ padding: 10px;
957
+ border-radius: var(--xy-node-border-radius, var(--xy-node-border-radius-default));
958
+ width: 150px;
959
+ font-size: 12px;
960
+ color: var(--xy-node-color, var(--xy-node-color-default));
961
+ text-align: center;
962
+ border: var(--xy-node-border, var(--xy-node-border-default));
963
+ background-color: var(--xy-node-background-color, var(--xy-node-background-color-default));
964
+ }
965
+
966
+
967
+ .xy-flow__node-group {
968
+ background-color: var(--xy-node-group-background-color, var(--xy-node-group-background-color-default));
969
+ }
970
+
971
+
972
+ .xy-flow__nodesselection {
973
+ z-index: 3;
974
+ transform-origin: left top;
975
+ pointer-events: none;
976
+ }
977
+
978
+ .xy-flow__nodesselection-rect {
979
+ position: absolute;
980
+ pointer-events: all;
981
+ cursor: grab;
982
+ }
983
+
984
+
985
+ /* ── Handles ────────────────────────────────────────────────────── */
986
+ .xy-flow__handle {
987
+ position: absolute;
988
+ pointer-events: none;
989
+ min-width: 5px;
990
+ min-height: 5px;
991
+ width: 8px;
992
+ height: 8px;
993
+ background-color: var(--xy-handle-background-color, var(--xy-handle-background-color-default));
994
+ border: 1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));
995
+ border-radius: 100%;
996
+ }
997
+
998
+ .xy-flow__handle.connectingfrom { pointer-events: all; }
999
+
1000
+ .xy-flow__handle.connectionindicator { pointer-events: all; }
1001
+
1002
+ .xy-flow__handle-bottom { top: auto; left: 50%; bottom: 0; transform: translate(-50%, 50%); }
1003
+
1004
+ .xy-flow__handle-top { top: 0; left: 50%; transform: translate(-50%, -50%); }
1005
+
1006
+ .xy-flow__handle-left { top: 50%; left: 0; transform: translate(-50%, -50%); }
1007
+
1008
+ .xy-flow__handle-right { top: 50%; right: 0; transform: translate(50%, -50%); }
1009
+
1010
+
1011
+ /* ── Selection box ──────────────────────────────────────────────── */
1012
+ .xy-flow__selection,
1013
+ .xy-flow__nodesselection-rect {
1014
+ background: var(--xy-selection-background-color, var(--xy-selection-background-color-default));
1015
+ border: var(--xy-selection-border, var(--xy-selection-border-default));
1016
+ }
1017
+
1018
+ .xy-flow__nodesselection-rect:focus,
1019
+ .xy-flow__nodesselection-rect:focus-visible { outline: none; }
1020
+
1021
+
1022
+ /* ── Panels ─────────────────────────────────────────────────────── */
1023
+ .xy-flow__panel {
1024
+ position: absolute;
1025
+ z-index: 5;
1026
+ margin: 15px;
1027
+ }
1028
+
1029
+ .xy-flow__panel.top { top: 0; }
1030
+
1031
+ .xy-flow__panel.bottom { bottom: 0; }
1032
+
1033
+ .xy-flow__panel.left { left: 0; }
1034
+
1035
+ .xy-flow__panel.right { right: 0; }
1036
+
1037
+ .xy-flow__panel.top.center, .xy-flow__panel.bottom.center {
1038
+ left: 50%;
1039
+ transform: translateX(-15px) translateX(-50%);
1040
+ }
1041
+
1042
+ .xy-flow__panel.left.center, .xy-flow__panel.right.center {
1043
+ top: 50%;
1044
+ transform: translateY(-15px) translateY(-50%);
1045
+ }
1046
+
1047
+
1048
+ .xy-flow__pane.selection .xy-flow__panel { pointer-events: none; }
1049
+
1050
+
1051
+ /* ── Controls ───────────────────────────────────────────────────── */
1052
+ .xy-flow__controls {
1053
+ display: flex;
1054
+ flex-direction: column;
1055
+ box-shadow: var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default));
1056
+ }
1057
+
1058
+ .xy-flow__controls-button {
1059
+ display: flex;
1060
+ justify-content: center;
1061
+ align-items: center;
1062
+ height: 26px;
1063
+ width: 26px;
1064
+ padding: 4px;
1065
+ border: none;
1066
+ background: var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));
1067
+ border-bottom: 1px solid var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default));
1068
+ color: var(--xy-controls-button-color, var(--xy-controls-button-color-default));
1069
+ cursor: pointer;
1070
+ user-select: none;
1071
+ }
1072
+
1073
+ .xy-flow__controls-button:hover {
1074
+ background: var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default));
1075
+ }
1076
+
1077
+ .xy-flow__controls-button:disabled { pointer-events: none; }
1078
+
1079
+ .xy-flow__controls-button:disabled svg { fill-opacity: 0.4; }
1080
+
1081
+ .xy-flow__controls-button svg {
1082
+ width: 100%;
1083
+ max-width: 12px;
1084
+ max-height: 12px;
1085
+ fill: currentColor;
1086
+ }
1087
+
1088
+ .xy-flow__controls-button:last-child { border-bottom: none; }
1089
+
1090
+
1091
+ /* ── Minimap ────────────────────────────────────────────────────── */
1092
+ .xy-flow__minimap {
1093
+ background: var(--xy-minimap-background-color, var(--xy-minimap-background-color-default));
1094
+ }
1095
+
1096
+ .xy-flow__minimap-svg { display: block; }
1097
+
1098
+ .xy-flow__minimap-mask {
1099
+ fill: var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default));
1100
+ stroke: var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default));
1101
+ stroke-width: var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default));
1102
+ }
1103
+
1104
+ .xy-flow__minimap-node {
1105
+ fill: var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default));
1106
+ stroke: var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default));
1107
+ stroke-width: var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default));
1108
+ }
1109
+
1110
+
1111
+ /* ── Background ─────────────────────────────────────────────────── */
1112
+ .xy-flow__background { pointer-events: none; z-index: -1; }
1113
+
1114
+ .xy-flow__background-pattern.dots {
1115
+ fill: var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default));
1116
+ }
1117
+
1118
+ .xy-flow__background-pattern.lines {
1119
+ stroke: var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default));
1120
+ }
1121
+
1122
+ .xy-flow__background-pattern.cross {
1123
+ stroke: var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default));
1124
+ }
1125
+
1126
+
1127
+ /* ── Edge labels / portals ──────────────────────────────────────── */
1128
+ .ng-flow__edge-textbg {
1129
+ fill: var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default));
1130
+ }
1131
+
1132
+ .ng-flow__edge-text {
1133
+ fill: var(--xy-edge-label-color, var(--xy-edge-label-color-default));
1134
+ }
1135
+
1136
+
1137
+ .xy-flow__edgelabel-renderer {
1138
+ position: absolute;
1139
+ width: 100%;
1140
+ height: 100%;
1141
+ pointer-events: none;
1142
+ user-select: none;
1143
+ left: 0;
1144
+ top: 0;
1145
+ }
1146
+
1147
+
1148
+ .xy-flow__viewport-portal {
1149
+ position: absolute;
1150
+ width: 100%;
1151
+ height: 100%;
1152
+ left: 0;
1153
+ top: 0;
1154
+ user-select: none;
1155
+ }
1156
+
1157
+
1158
+ /* ── Edge reconnect anchors ─────────────────────────────────────── */
1159
+ .xy-flow__edgeupdater {
1160
+ cursor: move;
1161
+ pointer-events: all;
1162
+ }
1163
+
1164
+
1165
+ /* ── Attribution ────────────────────────────────────────────────── */
1166
+ .xy-flow__attribution {
1167
+ font-size: 10px;
1168
+ background: var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));
1169
+ padding: 2px 3px;
1170
+ margin: 0;
1171
+ }
1172
+
1173
+ .xy-flow__attribution a { text-decoration: none; color: #999; }
1174
+
1175
+
1176
+ /*
1177
+ * ── Cursor overrides ───────────────────────────────────────────────
1178
+ *
1179
+ * Native CSS cursors (grab, grabbing, crosshair) render as invisible white
1180
+ * on some Windows setups with a white pointer scheme. We ship custom SVG
1181
+ * cursors (white fill + black outline) that always work on any OS/theme,
1182
+ * with native cursors as fallback.
1183
+ */
1184
+
1185
+ /* Open hand — pane & draggable nodes */
1186
+ .xy-flow__pane.draggable,
1187
+ .xy-flow__node.draggable {
1188
+ 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;
1189
+ pointer-events: all;
1190
+ }
1191
+
1192
+
1193
+ /* Closed hand — while dragging */
1194
+ .xy-flow__pane.dragging,
1195
+ .xy-flow__node.draggable.dragging {
1196
+ 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;
1197
+ }
1198
+
1199
+
1200
+ /* Crosshair — connection handles */
1201
+ .xy-flow__handle.connectionindicator {
1202
+ 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;
1203
+ }
1204
+