@angflow/angular 0.0.13 → 0.0.14

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 (161) hide show
  1. package/README.md +14 -4
  2. package/dist/base.css +416 -411
  3. package/dist/esm/lib/components/a11y-descriptions/a11y-descriptions.component.d.ts +4 -0
  4. package/dist/esm/lib/components/a11y-descriptions/a11y-descriptions.component.d.ts.map +1 -1
  5. package/dist/esm/lib/components/a11y-descriptions/a11y-descriptions.component.js +24 -20
  6. package/dist/esm/lib/components/a11y-descriptions/a11y-descriptions.component.js.map +1 -1
  7. package/dist/esm/lib/components/attribution/attribution.component.d.ts +4 -0
  8. package/dist/esm/lib/components/attribution/attribution.component.d.ts.map +1 -1
  9. package/dist/esm/lib/components/attribution/attribution.component.js +22 -18
  10. package/dist/esm/lib/components/attribution/attribution.component.js.map +1 -1
  11. package/dist/esm/lib/components/background/background.component.d.ts +20 -0
  12. package/dist/esm/lib/components/background/background.component.d.ts.map +1 -1
  13. package/dist/esm/lib/components/background/background.component.js +159 -140
  14. package/dist/esm/lib/components/background/background.component.js.map +1 -1
  15. package/dist/esm/lib/components/connection-line/connection-line.component.d.ts +7 -0
  16. package/dist/esm/lib/components/connection-line/connection-line.component.d.ts.map +1 -1
  17. package/dist/esm/lib/components/connection-line/connection-line.component.js +7 -0
  18. package/dist/esm/lib/components/connection-line/connection-line.component.js.map +1 -1
  19. package/dist/esm/lib/components/controls/controls.component.d.ts +21 -0
  20. package/dist/esm/lib/components/controls/controls.component.d.ts.map +1 -1
  21. package/dist/esm/lib/components/controls/controls.component.js +21 -1
  22. package/dist/esm/lib/components/controls/controls.component.js.map +1 -1
  23. package/dist/esm/lib/components/edge-label-renderer/edge-label-renderer.component.d.ts +4 -0
  24. package/dist/esm/lib/components/edge-label-renderer/edge-label-renderer.component.d.ts.map +1 -1
  25. package/dist/esm/lib/components/edge-label-renderer/edge-label-renderer.component.js +4 -0
  26. package/dist/esm/lib/components/edge-label-renderer/edge-label-renderer.component.js.map +1 -1
  27. package/dist/esm/lib/components/edge-toolbar/edge-toolbar.component.d.ts +12 -0
  28. package/dist/esm/lib/components/edge-toolbar/edge-toolbar.component.d.ts.map +1 -1
  29. package/dist/esm/lib/components/edge-toolbar/edge-toolbar.component.js +12 -0
  30. package/dist/esm/lib/components/edge-toolbar/edge-toolbar.component.js.map +1 -1
  31. package/dist/esm/lib/components/edges/base-edge.component.d.ts +23 -0
  32. package/dist/esm/lib/components/edges/base-edge.component.d.ts.map +1 -1
  33. package/dist/esm/lib/components/edges/base-edge.component.js +63 -40
  34. package/dist/esm/lib/components/edges/base-edge.component.js.map +1 -1
  35. package/dist/esm/lib/components/edges/bezier-edge.component.d.ts +4 -0
  36. package/dist/esm/lib/components/edges/bezier-edge.component.d.ts.map +1 -1
  37. package/dist/esm/lib/components/edges/bezier-edge.component.js +4 -0
  38. package/dist/esm/lib/components/edges/bezier-edge.component.js.map +1 -1
  39. package/dist/esm/lib/components/edges/edge-text.component.d.ts +4 -0
  40. package/dist/esm/lib/components/edges/edge-text.component.d.ts.map +1 -1
  41. package/dist/esm/lib/components/edges/edge-text.component.js +30 -26
  42. package/dist/esm/lib/components/edges/edge-text.component.js.map +1 -1
  43. package/dist/esm/lib/components/edges/simple-bezier-edge.component.d.ts +4 -0
  44. package/dist/esm/lib/components/edges/simple-bezier-edge.component.d.ts.map +1 -1
  45. package/dist/esm/lib/components/edges/simple-bezier-edge.component.js +4 -0
  46. package/dist/esm/lib/components/edges/simple-bezier-edge.component.js.map +1 -1
  47. package/dist/esm/lib/components/edges/smooth-step-edge.component.d.ts +1 -0
  48. package/dist/esm/lib/components/edges/smooth-step-edge.component.d.ts.map +1 -1
  49. package/dist/esm/lib/components/edges/smooth-step-edge.component.js +1 -0
  50. package/dist/esm/lib/components/edges/smooth-step-edge.component.js.map +1 -1
  51. package/dist/esm/lib/components/edges/step-edge.component.d.ts +1 -0
  52. package/dist/esm/lib/components/edges/step-edge.component.d.ts.map +1 -1
  53. package/dist/esm/lib/components/edges/step-edge.component.js +1 -0
  54. package/dist/esm/lib/components/edges/step-edge.component.js.map +1 -1
  55. package/dist/esm/lib/components/edges/straight-edge.component.d.ts +1 -0
  56. package/dist/esm/lib/components/edges/straight-edge.component.d.ts.map +1 -1
  57. package/dist/esm/lib/components/edges/straight-edge.component.js +1 -0
  58. package/dist/esm/lib/components/edges/straight-edge.component.js.map +1 -1
  59. package/dist/esm/lib/components/handle/handle.component.d.ts +20 -1
  60. package/dist/esm/lib/components/handle/handle.component.d.ts.map +1 -1
  61. package/dist/esm/lib/components/handle/handle.component.js +25 -2
  62. package/dist/esm/lib/components/handle/handle.component.js.map +1 -1
  63. package/dist/esm/lib/components/minimap/minimap.component.d.ts +34 -0
  64. package/dist/esm/lib/components/minimap/minimap.component.d.ts.map +1 -1
  65. package/dist/esm/lib/components/minimap/minimap.component.js +30 -4
  66. package/dist/esm/lib/components/minimap/minimap.component.js.map +1 -1
  67. package/dist/esm/lib/components/ng-flow-provider/ng-flow-provider.component.d.ts +14 -0
  68. package/dist/esm/lib/components/ng-flow-provider/ng-flow-provider.component.d.ts.map +1 -1
  69. package/dist/esm/lib/components/ng-flow-provider/ng-flow-provider.component.js +14 -0
  70. package/dist/esm/lib/components/ng-flow-provider/ng-flow-provider.component.js.map +1 -1
  71. package/dist/esm/lib/components/node-resizer/node-resizer.component.d.ts +29 -0
  72. package/dist/esm/lib/components/node-resizer/node-resizer.component.d.ts.map +1 -1
  73. package/dist/esm/lib/components/node-resizer/node-resizer.component.js +153 -124
  74. package/dist/esm/lib/components/node-resizer/node-resizer.component.js.map +1 -1
  75. package/dist/esm/lib/components/node-toolbar/node-toolbar.component.d.ts +21 -1
  76. package/dist/esm/lib/components/node-toolbar/node-toolbar.component.d.ts.map +1 -1
  77. package/dist/esm/lib/components/node-toolbar/node-toolbar.component.js +21 -1
  78. package/dist/esm/lib/components/node-toolbar/node-toolbar.component.js.map +1 -1
  79. package/dist/esm/lib/components/nodes/default-node.component.d.ts +4 -0
  80. package/dist/esm/lib/components/nodes/default-node.component.d.ts.map +1 -1
  81. package/dist/esm/lib/components/nodes/default-node.component.js +13 -9
  82. package/dist/esm/lib/components/nodes/default-node.component.js.map +1 -1
  83. package/dist/esm/lib/components/nodes/group-node.component.d.ts +5 -0
  84. package/dist/esm/lib/components/nodes/group-node.component.d.ts.map +1 -1
  85. package/dist/esm/lib/components/nodes/group-node.component.js +5 -0
  86. package/dist/esm/lib/components/nodes/group-node.component.js.map +1 -1
  87. package/dist/esm/lib/components/nodes/input-node.component.d.ts +4 -0
  88. package/dist/esm/lib/components/nodes/input-node.component.d.ts.map +1 -1
  89. package/dist/esm/lib/components/nodes/input-node.component.js +11 -7
  90. package/dist/esm/lib/components/nodes/input-node.component.js.map +1 -1
  91. package/dist/esm/lib/components/nodes/output-node.component.d.ts +4 -0
  92. package/dist/esm/lib/components/nodes/output-node.component.d.ts.map +1 -1
  93. package/dist/esm/lib/components/nodes/output-node.component.js +11 -7
  94. package/dist/esm/lib/components/nodes/output-node.component.js.map +1 -1
  95. package/dist/esm/lib/components/panel/panel.component.d.ts +12 -0
  96. package/dist/esm/lib/components/panel/panel.component.d.ts.map +1 -1
  97. package/dist/esm/lib/components/panel/panel.component.js +12 -0
  98. package/dist/esm/lib/components/panel/panel.component.js.map +1 -1
  99. package/dist/esm/lib/components/viewport-portal/viewport-portal.component.d.ts +5 -0
  100. package/dist/esm/lib/components/viewport-portal/viewport-portal.component.d.ts.map +1 -1
  101. package/dist/esm/lib/components/viewport-portal/viewport-portal.component.js +5 -0
  102. package/dist/esm/lib/components/viewport-portal/viewport-portal.component.js.map +1 -1
  103. package/dist/esm/lib/container/edge-renderer/edge-renderer.component.d.ts.map +1 -1
  104. package/dist/esm/lib/container/edge-renderer/edge-renderer.component.js +35 -3
  105. package/dist/esm/lib/container/edge-renderer/edge-renderer.component.js.map +1 -1
  106. package/dist/esm/lib/container/ng-flow/ng-flow.component.d.ts +154 -1
  107. package/dist/esm/lib/container/ng-flow/ng-flow.component.d.ts.map +1 -1
  108. package/dist/esm/lib/container/ng-flow/ng-flow.component.js +162 -23
  109. package/dist/esm/lib/container/ng-flow/ng-flow.component.js.map +1 -1
  110. package/dist/esm/lib/container/node-renderer/node-renderer.component.d.ts +2 -0
  111. package/dist/esm/lib/container/node-renderer/node-renderer.component.d.ts.map +1 -1
  112. package/dist/esm/lib/container/node-renderer/node-renderer.component.js +40 -2
  113. package/dist/esm/lib/container/node-renderer/node-renderer.component.js.map +1 -1
  114. package/dist/esm/lib/container/pane/pane.component.d.ts +0 -1
  115. package/dist/esm/lib/container/pane/pane.component.d.ts.map +1 -1
  116. package/dist/esm/lib/container/pane/pane.component.js +18 -25
  117. package/dist/esm/lib/container/pane/pane.component.js.map +1 -1
  118. package/dist/esm/lib/container/viewport/viewport.component.d.ts +4 -0
  119. package/dist/esm/lib/container/viewport/viewport.component.d.ts.map +1 -1
  120. package/dist/esm/lib/container/viewport/viewport.component.js +4 -0
  121. package/dist/esm/lib/container/viewport/viewport.component.js.map +1 -1
  122. package/dist/esm/lib/directives/drag.directive.d.ts +17 -0
  123. package/dist/esm/lib/directives/drag.directive.d.ts.map +1 -1
  124. package/dist/esm/lib/directives/drag.directive.js +17 -0
  125. package/dist/esm/lib/directives/drag.directive.js.map +1 -1
  126. package/dist/esm/lib/directives/key-handler.directive.d.ts +13 -0
  127. package/dist/esm/lib/directives/key-handler.directive.d.ts.map +1 -1
  128. package/dist/esm/lib/directives/key-handler.directive.js +13 -0
  129. package/dist/esm/lib/directives/key-handler.directive.js.map +1 -1
  130. package/dist/esm/lib/public-api.d.ts +1 -0
  131. package/dist/esm/lib/public-api.d.ts.map +1 -1
  132. package/dist/esm/lib/public-api.js +2 -0
  133. package/dist/esm/lib/public-api.js.map +1 -1
  134. package/dist/esm/lib/services/flow-store.service.d.ts +3 -0
  135. package/dist/esm/lib/services/flow-store.service.d.ts.map +1 -1
  136. package/dist/esm/lib/services/flow-store.service.js +3 -0
  137. package/dist/esm/lib/services/flow-store.service.js.map +1 -1
  138. package/dist/esm/lib/services/ng-flow.service.d.ts +82 -0
  139. package/dist/esm/lib/services/ng-flow.service.d.ts.map +1 -1
  140. package/dist/esm/lib/services/ng-flow.service.js +82 -0
  141. package/dist/esm/lib/services/ng-flow.service.js.map +1 -1
  142. package/dist/esm/lib/services/tokens.d.ts +23 -0
  143. package/dist/esm/lib/services/tokens.d.ts.map +1 -1
  144. package/dist/esm/lib/services/tokens.js +22 -0
  145. package/dist/esm/lib/services/tokens.js.map +1 -1
  146. package/dist/esm/lib/types/nodes.d.ts +36 -2
  147. package/dist/esm/lib/types/nodes.d.ts.map +1 -1
  148. package/dist/esm/lib/utils/changes.d.ts +20 -0
  149. package/dist/esm/lib/utils/changes.d.ts.map +1 -1
  150. package/dist/esm/lib/utils/changes.js +20 -0
  151. package/dist/esm/lib/utils/changes.js.map +1 -1
  152. package/dist/esm/lib/utils/index.d.ts +1 -0
  153. package/dist/esm/lib/utils/index.d.ts.map +1 -1
  154. package/dist/esm/lib/utils/index.js +1 -0
  155. package/dist/esm/lib/utils/index.js.map +1 -1
  156. package/dist/esm/lib/utils/inject-ng-flow-node.d.ts +20 -0
  157. package/dist/esm/lib/utils/inject-ng-flow-node.d.ts.map +1 -0
  158. package/dist/esm/lib/utils/inject-ng-flow-node.js +28 -0
  159. package/dist/esm/lib/utils/inject-ng-flow-node.js.map +1 -0
  160. package/dist/style.css +416 -411
  161. package/package.json +6 -6
package/dist/base.css CHANGED
@@ -717,489 +717,494 @@ svg.xy-flow__connectionline {
717
717
 
718
718
 
719
719
 
720
- /*
721
- * @angflow/angular — Complete stylesheet
722
- *
723
- * Import this once in your app's global styles:
724
- * @import '@angflow/angular/styles/ng-flow.css';
725
- *
726
- * Or in angular.json:
727
- * "styles": ["node_modules/@angflow/angular/styles/ng-flow.css"]
728
- */
729
-
730
- /* ── CSS Custom Properties (theme defaults) ─────────────────────── */
731
- .xy-flow {
732
- direction: ltr;
733
-
734
- /* Edges */
735
- --xy-edge-stroke-default: #999;
736
- --xy-edge-stroke-width-default: 1.5;
737
- --xy-edge-stroke-selected-default: #555;
738
-
739
- /* Connection line */
740
- --xy-connectionline-stroke-default: #555;
741
- --xy-connectionline-stroke-width-default: 2;
742
-
743
- /* Attribution */
744
- --xy-attribution-background-color-default: rgba(255, 255, 255, 0.5);
745
-
746
- /* Minimap */
747
- --xy-minimap-background-color-default: #fff;
748
- --xy-minimap-mask-background-color-default: rgba(240, 240, 240, 0.6);
749
- --xy-minimap-mask-stroke-color-default: transparent;
750
- --xy-minimap-mask-stroke-width-default: 1;
751
- --xy-minimap-node-background-color-default: #e2e2e2;
752
- --xy-minimap-node-stroke-color-default: transparent;
753
- --xy-minimap-node-stroke-width-default: 2;
754
-
755
- /* Background */
756
- --xy-background-color-default: #fafafa;
757
- --xy-background-pattern-dots-color-default: #91919a;
758
- --xy-background-pattern-lines-color-default: #eee;
759
- --xy-background-pattern-cross-color-default: #e2e2e2;
760
-
761
- /* Nodes */
762
- --xy-node-color-default: inherit;
763
- --xy-node-border-default: 1px solid #1a192b;
764
- --xy-node-background-color-default: #fff;
765
- --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25);
766
- --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, 0.08);
767
- --xy-node-boxshadow-selected-default: 0 0 0 0.5px #1a192b;
768
- --xy-node-border-radius-default: 3px;
769
-
770
- /* Handles */
771
- --xy-handle-background-color-default: #1a192b;
772
- --xy-handle-border-color-default: #fff;
773
-
774
- /* Selection */
775
- --xy-selection-background-color-default: rgba(0, 89, 220, 0.08);
776
- --xy-selection-border-default: 1px dotted rgba(0, 89, 220, 0.8);
777
-
778
- /* Controls */
779
- --xy-controls-button-background-color-default: #fefefe;
780
- --xy-controls-button-background-color-hover-default: #f4f4f4;
781
- --xy-controls-button-color-default: inherit;
782
- --xy-controls-button-border-color-default: #eee;
783
- --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08);
784
-
785
- /* Edge labels */
786
- --xy-edge-label-background-color-default: #ffffff;
787
- --xy-edge-label-color-default: inherit;
788
-
789
- background-color: var(--xy-background-color, var(--xy-background-color-default));
720
+ /*
721
+ * @angflow/angular — Complete stylesheet
722
+ *
723
+ * Import this once in your app's global styles:
724
+ * @import '@angflow/angular/styles/ng-flow.css';
725
+ *
726
+ * Or in angular.json:
727
+ * "styles": ["node_modules/@angflow/angular/styles/ng-flow.css"]
728
+ */
729
+
730
+ /* ── CSS Custom Properties (theme defaults) ─────────────────────── */
731
+ .xy-flow {
732
+ direction: ltr;
733
+
734
+ /* Edges */
735
+ --xy-edge-stroke-default: #999;
736
+ --xy-edge-stroke-width-default: 1.5;
737
+ --xy-edge-stroke-selected-default: #555;
738
+
739
+ /* Connection line */
740
+ --xy-connectionline-stroke-default: #555;
741
+ --xy-connectionline-stroke-width-default: 2;
742
+
743
+ /* Attribution */
744
+ --xy-attribution-background-color-default: rgba(255, 255, 255, 0.5);
745
+
746
+ /* Minimap */
747
+ --xy-minimap-background-color-default: #fff;
748
+ --xy-minimap-mask-background-color-default: rgba(240, 240, 240, 0.6);
749
+ --xy-minimap-mask-stroke-color-default: transparent;
750
+ --xy-minimap-mask-stroke-width-default: 1;
751
+ --xy-minimap-node-background-color-default: #e2e2e2;
752
+ --xy-minimap-node-stroke-color-default: transparent;
753
+ --xy-minimap-node-stroke-width-default: 2;
754
+
755
+ /* Background */
756
+ --xy-background-color-default: #fafafa;
757
+ --xy-background-pattern-dots-color-default: #91919a;
758
+ --xy-background-pattern-lines-color-default: #eee;
759
+ --xy-background-pattern-cross-color-default: #e2e2e2;
760
+
761
+ /* Nodes */
762
+ --xy-node-color-default: inherit;
763
+ --xy-node-border-default: 1px solid #1a192b;
764
+ --xy-node-background-color-default: #fff;
765
+ --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25);
766
+ --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, 0.08);
767
+ --xy-node-boxshadow-selected-default: 0 0 0 0.5px #1a192b;
768
+ --xy-node-border-radius-default: 3px;
769
+
770
+ /* Handles */
771
+ --xy-handle-background-color-default: #1a192b;
772
+ --xy-handle-border-color-default: #fff;
773
+
774
+ /* Selection */
775
+ --xy-selection-background-color-default: rgba(0, 89, 220, 0.08);
776
+ --xy-selection-border-default: 1px dotted rgba(0, 89, 220, 0.8);
777
+
778
+ /* Controls */
779
+ --xy-controls-button-background-color-default: #fefefe;
780
+ --xy-controls-button-background-color-hover-default: #f4f4f4;
781
+ --xy-controls-button-color-default: inherit;
782
+ --xy-controls-button-border-color-default: #eee;
783
+ --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08);
784
+
785
+ /* Edge labels */
786
+ --xy-edge-label-background-color-default: #ffffff;
787
+ --xy-edge-label-color-default: inherit;
788
+
789
+ background-color: var(--xy-background-color, var(--xy-background-color-default));
790
790
  }
791
-
792
-
793
- /* Dark mode */
794
- .xy-flow.dark {
795
- --xy-edge-stroke-default: #3e3e3e;
796
- --xy-edge-stroke-selected-default: #727272;
797
- --xy-node-color-default: #f8f8f8;
798
- --xy-node-border-default: 1px solid #3c3c3c;
799
- --xy-node-background-color-default: #1e1e1e;
800
- --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, 0.08);
801
- --xy-node-boxshadow-selected-default: 0 0 0 0.5px #999;
802
- --xy-handle-background-color-default: #bebebe;
803
- --xy-handle-border-color-default: #1e1e1e;
804
- --xy-background-color-default: #141414;
805
- --xy-background-pattern-dots-color-default: #777;
806
- --xy-background-pattern-lines-color-default: #777;
807
- --xy-background-pattern-cross-color-default: #777;
808
- --xy-minimap-background-color-default: #141414;
809
- --xy-minimap-mask-background-color-default: rgba(60, 60, 60, 0.6);
810
- --xy-minimap-node-background-color-default: #2b2b2b;
811
- --xy-controls-button-background-color-default: #2b2b2b;
812
- --xy-controls-button-background-color-hover-default: #3e3e3e;
813
- --xy-controls-button-color-default: #f8f8f8;
814
- --xy-controls-button-border-color-default: #5b5b5b;
815
- --xy-edge-label-background-color-default: #141414;
816
- --xy-edge-label-color-default: #f8f8f8;
791
+
792
+
793
+ /* Dark mode */
794
+ .xy-flow.dark {
795
+ --xy-edge-stroke-default: #3e3e3e;
796
+ --xy-edge-stroke-selected-default: #727272;
797
+ --xy-node-color-default: #f8f8f8;
798
+ --xy-node-border-default: 1px solid #3c3c3c;
799
+ --xy-node-background-color-default: #1e1e1e;
800
+ --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, 0.08);
801
+ --xy-node-boxshadow-selected-default: 0 0 0 0.5px #999;
802
+ --xy-handle-background-color-default: #bebebe;
803
+ --xy-handle-border-color-default: #1e1e1e;
804
+ --xy-background-color-default: #141414;
805
+ --xy-background-pattern-dots-color-default: #777;
806
+ --xy-background-pattern-lines-color-default: #777;
807
+ --xy-background-pattern-cross-color-default: #777;
808
+ --xy-minimap-background-color-default: #141414;
809
+ --xy-minimap-mask-background-color-default: rgba(60, 60, 60, 0.6);
810
+ --xy-minimap-node-background-color-default: #2b2b2b;
811
+ --xy-controls-button-background-color-default: #2b2b2b;
812
+ --xy-controls-button-background-color-hover-default: #3e3e3e;
813
+ --xy-controls-button-color-default: #f8f8f8;
814
+ --xy-controls-button-border-color-default: #5b5b5b;
815
+ --xy-edge-label-background-color-default: #141414;
816
+ --xy-edge-label-color-default: #f8f8f8;
817
817
  }
818
-
819
-
820
- /* ── Layout ─────────────────────────────────────────────────────── */
821
- .xy-flow__container {
822
- position: absolute;
823
- width: 100%;
824
- height: 100%;
825
- top: 0;
826
- left: 0;
818
+
819
+
820
+ /* ── Layout ─────────────────────────────────────────────────────── */
821
+ .xy-flow__container {
822
+ position: absolute;
823
+ width: 100%;
824
+ height: 100%;
825
+ top: 0;
826
+ left: 0;
827
827
  }
828
-
829
-
830
- .xy-flow__pane {
831
- z-index: 1;
832
- cursor: default;
828
+
829
+
830
+ .xy-flow__pane {
831
+ z-index: 1;
832
+ cursor: default;
833
833
  }
834
-
834
+
835
835
  .xy-flow__pane.selection { cursor: pointer; }
836
-
837
-
838
- .xy-flow__viewport {
839
- transform-origin: 0 0;
840
- z-index: 2;
841
- pointer-events: none;
836
+
837
+
838
+ .xy-flow__viewport {
839
+ transform-origin: 0 0;
840
+ z-index: 2;
841
+ pointer-events: none;
842
842
  }
843
-
844
-
843
+
844
+
845
845
  .xy-flow__renderer { z-index: 4; }
846
-
846
+
847
847
  .xy-flow__selection { z-index: 6; }
848
-
849
-
850
- /* ── Edges ──────────────────────────────────────────────────────── */
851
- .xy-flow__edge-path {
852
- stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default));
853
- stroke-width: var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));
854
- fill: none;
848
+
849
+
850
+ /* ── Edges ──────────────────────────────────────────────────────── */
851
+ .xy-flow__edge-path {
852
+ stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default));
853
+ stroke-width: var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));
854
+ fill: none;
855
855
  }
856
-
857
-
858
- .xy-flow__connection-path {
859
- stroke: var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));
860
- stroke-width: var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));
861
- fill: none;
856
+
857
+
858
+ .xy-flow__connection-path {
859
+ stroke: var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));
860
+ stroke-width: var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));
861
+ fill: none;
862
862
  }
863
-
864
-
863
+
864
+
865
865
  .xy-flow .xy-flow__edges { position: absolute; }
866
-
867
- .xy-flow .xy-flow__edges svg {
868
- overflow: visible;
869
- position: absolute;
870
- pointer-events: none;
866
+
867
+ .xy-flow .xy-flow__edges svg {
868
+ overflow: visible;
869
+ position: absolute;
870
+ pointer-events: none;
871
871
  }
872
-
873
-
872
+
873
+
874
874
  .xy-flow__edge { pointer-events: visibleStroke; }
875
-
875
+
876
876
  .xy-flow__edge.selectable { cursor: pointer; }
877
-
878
- .xy-flow__edge.animated path {
879
- stroke-dasharray: 5;
880
- animation: xy-flow-dashdraw 0.5s linear infinite;
877
+
878
+ .xy-flow__edge.animated path {
879
+ stroke-dasharray: 5;
880
+ animation: xy-flow-dashdraw 0.5s linear infinite;
881
881
  }
882
-
883
- .xy-flow__edge.animated path.xy-flow__edge-interaction {
884
- stroke-dasharray: none;
885
- animation: none;
882
+
883
+ .xy-flow__edge.animated path.xy-flow__edge-interaction {
884
+ stroke-dasharray: none;
885
+ animation: none;
886
886
  }
887
-
888
- .xy-flow__edge.selected .xy-flow__edge-path,
889
- .xy-flow__edge.selectable:focus .xy-flow__edge-path,
890
- .xy-flow__edge.selectable:focus-visible .xy-flow__edge-path {
891
- stroke: var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default));
887
+
888
+ .xy-flow__edge.selected .xy-flow__edge-path,
889
+ .xy-flow__edge.selectable:focus .xy-flow__edge-path,
890
+ .xy-flow__edge.selectable:focus-visible .xy-flow__edge-path {
891
+ stroke: var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default));
892
892
  }
893
-
894
-
893
+
894
+
895
895
  .xy-flow__edge-textwrapper { pointer-events: all; }
896
-
896
+
897
897
  .xy-flow__edge-text { pointer-events: none; user-select: none; }
898
-
899
-
900
- .xy-flow__arrowhead polyline {
901
- stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default));
898
+
899
+
900
+ .xy-flow__arrowhead polyline {
901
+ stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default));
902
902
  }
903
-
904
- .xy-flow__arrowhead polyline.arrowclosed {
905
- fill: var(--xy-edge-stroke, var(--xy-edge-stroke-default));
903
+
904
+ .xy-flow__arrowhead polyline.arrowclosed {
905
+ fill: var(--xy-edge-stroke, var(--xy-edge-stroke-default));
906
906
  }
907
-
908
-
907
+
908
+
909
909
  .xy-flow__connection { pointer-events: none; }
910
-
911
- svg.xy-flow__connectionline {
912
- z-index: 1001;
913
- overflow: visible;
914
- position: absolute;
910
+
911
+ svg.xy-flow__connectionline {
912
+ z-index: 1001;
913
+ overflow: visible;
914
+ position: absolute;
915
915
  }
916
-
917
-
918
- @keyframes xy-flow-dashdraw {
919
- from { stroke-dashoffset: 10; }
916
+
917
+
918
+ @keyframes xy-flow-dashdraw {
919
+ from { stroke-dashoffset: 10; }
920
920
  }
921
-
922
-
923
- /* ── Nodes ──────────────────────────────────────────────────────── */
924
- .xy-flow__nodes {
925
- pointer-events: none;
926
- transform-origin: 0 0;
921
+
922
+
923
+ /* ── Nodes ──────────────────────────────────────────────────────── */
924
+ .xy-flow__nodes {
925
+ pointer-events: none;
926
+ transform-origin: 0 0;
927
927
  }
928
-
929
-
930
- .xy-flow__node {
931
- position: absolute;
932
- user-select: none;
933
- pointer-events: all;
934
- transform-origin: 0 0;
935
- box-sizing: border-box;
936
- cursor: default;
928
+
929
+
930
+ .xy-flow__node {
931
+ position: absolute;
932
+ user-select: none;
933
+ pointer-events: all;
934
+ transform-origin: 0 0;
935
+ box-sizing: border-box;
936
+ cursor: default;
937
937
  }
938
-
938
+
939
939
  .xy-flow__node.selectable { cursor: pointer; }
940
-
941
- .xy-flow__node.selectable:hover {
942
- box-shadow: var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default));
940
+
941
+ .xy-flow__node.connection-target {
942
+ outline: 2px dashed var(--xy-connection-target-outline-color, #3b82f6);
943
+ outline-offset: 4px;
943
944
  }
944
-
945
- .xy-flow__node.selectable.selected,
946
- .xy-flow__node.selectable:focus,
947
- .xy-flow__node.selectable:focus-visible {
948
- box-shadow: var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default));
949
- outline: none;
945
+
946
+ .xy-flow__node.selectable:hover {
947
+ box-shadow: var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default));
950
948
  }
951
-
952
-
953
- .xy-flow__node-input,
954
- .xy-flow__node-default,
955
- .xy-flow__node-output,
956
- .xy-flow__node-group {
957
- padding: 10px;
958
- border-radius: var(--xy-node-border-radius, var(--xy-node-border-radius-default));
959
- width: 150px;
960
- font-size: 12px;
961
- color: var(--xy-node-color, var(--xy-node-color-default));
962
- text-align: center;
963
- border: var(--xy-node-border, var(--xy-node-border-default));
964
- background-color: var(--xy-node-background-color, var(--xy-node-background-color-default));
949
+
950
+ .xy-flow__node.selectable.selected,
951
+ .xy-flow__node.selectable:focus,
952
+ .xy-flow__node.selectable:focus-visible {
953
+ box-shadow: var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default));
954
+ outline: none;
965
955
  }
966
-
967
-
968
- .xy-flow__node-group {
969
- background-color: var(--xy-node-group-background-color, var(--xy-node-group-background-color-default));
956
+
957
+
958
+ .xy-flow__node-input,
959
+ .xy-flow__node-default,
960
+ .xy-flow__node-output,
961
+ .xy-flow__node-group {
962
+ padding: 10px;
963
+ border-radius: var(--xy-node-border-radius, var(--xy-node-border-radius-default));
964
+ width: 150px;
965
+ font-size: 12px;
966
+ color: var(--xy-node-color, var(--xy-node-color-default));
967
+ text-align: center;
968
+ border: var(--xy-node-border, var(--xy-node-border-default));
969
+ background-color: var(--xy-node-background-color, var(--xy-node-background-color-default));
970
970
  }
971
-
972
-
973
- .xy-flow__nodesselection {
974
- z-index: 3;
975
- transform-origin: left top;
976
- pointer-events: none;
971
+
972
+
973
+ .xy-flow__node-group {
974
+ background-color: var(--xy-node-group-background-color, var(--xy-node-group-background-color-default));
977
975
  }
978
-
979
- .xy-flow__nodesselection-rect {
980
- position: absolute;
981
- pointer-events: all;
982
- cursor: grab;
976
+
977
+
978
+ .xy-flow__nodesselection {
979
+ z-index: 3;
980
+ transform-origin: left top;
981
+ pointer-events: none;
983
982
  }
984
-
985
-
986
- /* ── Handles ────────────────────────────────────────────────────── */
987
- .xy-flow__handle {
988
- position: absolute;
989
- pointer-events: none;
990
- min-width: 5px;
991
- min-height: 5px;
992
- width: 8px;
993
- height: 8px;
994
- background-color: var(--xy-handle-background-color, var(--xy-handle-background-color-default));
995
- border: 1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));
996
- border-radius: 100%;
983
+
984
+ .xy-flow__nodesselection-rect {
985
+ position: absolute;
986
+ pointer-events: all;
987
+ cursor: grab;
997
988
  }
998
-
989
+
990
+
991
+ /* ── Handles ────────────────────────────────────────────────────── */
992
+ .xy-flow__handle {
993
+ position: absolute;
994
+ pointer-events: none;
995
+ min-width: 5px;
996
+ min-height: 5px;
997
+ width: 8px;
998
+ height: 8px;
999
+ background-color: var(--xy-handle-background-color, var(--xy-handle-background-color-default));
1000
+ border: 1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));
1001
+ border-radius: 100%;
1002
+ }
1003
+
999
1004
  .xy-flow__handle.connectingfrom { pointer-events: all; }
1000
-
1005
+
1001
1006
  .xy-flow__handle.connectionindicator { pointer-events: all; }
1002
-
1007
+
1003
1008
  .xy-flow__handle-bottom { top: auto; left: 50%; bottom: 0; transform: translate(-50%, 50%); }
1004
-
1009
+
1005
1010
  .xy-flow__handle-top { top: 0; left: 50%; transform: translate(-50%, -50%); }
1006
-
1011
+
1007
1012
  .xy-flow__handle-left { top: 50%; left: 0; transform: translate(-50%, -50%); }
1008
-
1013
+
1009
1014
  .xy-flow__handle-right { top: 50%; right: 0; transform: translate(50%, -50%); }
1010
-
1011
-
1012
- /* ── Selection box ──────────────────────────────────────────────── */
1013
- .xy-flow__selection,
1014
- .xy-flow__nodesselection-rect {
1015
- background: var(--xy-selection-background-color, var(--xy-selection-background-color-default));
1016
- border: var(--xy-selection-border, var(--xy-selection-border-default));
1015
+
1016
+
1017
+ /* ── Selection box ──────────────────────────────────────────────── */
1018
+ .xy-flow__selection,
1019
+ .xy-flow__nodesselection-rect {
1020
+ background: var(--xy-selection-background-color, var(--xy-selection-background-color-default));
1021
+ border: var(--xy-selection-border, var(--xy-selection-border-default));
1017
1022
  }
1018
-
1019
- .xy-flow__nodesselection-rect:focus,
1023
+
1024
+ .xy-flow__nodesselection-rect:focus,
1020
1025
  .xy-flow__nodesselection-rect:focus-visible { outline: none; }
1021
-
1022
-
1023
- /* ── Panels ─────────────────────────────────────────────────────── */
1024
- .xy-flow__panel {
1025
- position: absolute;
1026
- z-index: 5;
1027
- margin: 15px;
1026
+
1027
+
1028
+ /* ── Panels ─────────────────────────────────────────────────────── */
1029
+ .xy-flow__panel {
1030
+ position: absolute;
1031
+ z-index: 5;
1032
+ margin: 15px;
1028
1033
  }
1029
-
1034
+
1030
1035
  .xy-flow__panel.top { top: 0; }
1031
-
1036
+
1032
1037
  .xy-flow__panel.bottom { bottom: 0; }
1033
-
1038
+
1034
1039
  .xy-flow__panel.left { left: 0; }
1035
-
1040
+
1036
1041
  .xy-flow__panel.right { right: 0; }
1037
-
1038
- .xy-flow__panel.top.center, .xy-flow__panel.bottom.center {
1039
- left: 50%;
1040
- transform: translateX(-15px) translateX(-50%);
1042
+
1043
+ .xy-flow__panel.top.center, .xy-flow__panel.bottom.center {
1044
+ left: 50%;
1045
+ transform: translateX(-15px) translateX(-50%);
1041
1046
  }
1042
-
1043
- .xy-flow__panel.left.center, .xy-flow__panel.right.center {
1044
- top: 50%;
1045
- transform: translateY(-15px) translateY(-50%);
1047
+
1048
+ .xy-flow__panel.left.center, .xy-flow__panel.right.center {
1049
+ top: 50%;
1050
+ transform: translateY(-15px) translateY(-50%);
1046
1051
  }
1047
-
1048
-
1052
+
1053
+
1049
1054
  .xy-flow__pane.selection .xy-flow__panel { pointer-events: none; }
1050
-
1051
-
1052
- /* ── Controls ───────────────────────────────────────────────────── */
1053
- .xy-flow__controls {
1054
- display: flex;
1055
- flex-direction: column;
1056
- box-shadow: var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default));
1055
+
1056
+
1057
+ /* ── Controls ───────────────────────────────────────────────────── */
1058
+ .xy-flow__controls {
1059
+ display: flex;
1060
+ flex-direction: column;
1061
+ box-shadow: var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default));
1057
1062
  }
1058
-
1059
- .xy-flow__controls-button {
1060
- display: flex;
1061
- justify-content: center;
1062
- align-items: center;
1063
- height: 26px;
1064
- width: 26px;
1065
- padding: 4px;
1066
- border: none;
1067
- background: var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));
1068
- border-bottom: 1px solid var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default));
1069
- color: var(--xy-controls-button-color, var(--xy-controls-button-color-default));
1070
- cursor: pointer;
1071
- user-select: none;
1063
+
1064
+ .xy-flow__controls-button {
1065
+ display: flex;
1066
+ justify-content: center;
1067
+ align-items: center;
1068
+ height: 26px;
1069
+ width: 26px;
1070
+ padding: 4px;
1071
+ border: none;
1072
+ background: var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));
1073
+ border-bottom: 1px solid var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default));
1074
+ color: var(--xy-controls-button-color, var(--xy-controls-button-color-default));
1075
+ cursor: pointer;
1076
+ user-select: none;
1072
1077
  }
1073
-
1074
- .xy-flow__controls-button:hover {
1075
- background: var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default));
1078
+
1079
+ .xy-flow__controls-button:hover {
1080
+ background: var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default));
1076
1081
  }
1077
-
1082
+
1078
1083
  .xy-flow__controls-button:disabled { pointer-events: none; }
1079
-
1084
+
1080
1085
  .xy-flow__controls-button:disabled svg { fill-opacity: 0.4; }
1081
-
1082
- .xy-flow__controls-button svg {
1083
- width: 100%;
1084
- max-width: 12px;
1085
- max-height: 12px;
1086
- fill: currentColor;
1086
+
1087
+ .xy-flow__controls-button svg {
1088
+ width: 100%;
1089
+ max-width: 12px;
1090
+ max-height: 12px;
1091
+ fill: currentColor;
1087
1092
  }
1088
-
1093
+
1089
1094
  .xy-flow__controls-button:last-child { border-bottom: none; }
1090
-
1091
-
1092
- /* ── Minimap ────────────────────────────────────────────────────── */
1093
- .xy-flow__minimap {
1094
- background: var(--xy-minimap-background-color, var(--xy-minimap-background-color-default));
1095
+
1096
+
1097
+ /* ── Minimap ────────────────────────────────────────────────────── */
1098
+ .xy-flow__minimap {
1099
+ background: var(--xy-minimap-background-color, var(--xy-minimap-background-color-default));
1095
1100
  }
1096
-
1101
+
1097
1102
  .xy-flow__minimap-svg { display: block; }
1098
-
1099
- .xy-flow__minimap-mask {
1100
- fill: var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default));
1101
- stroke: var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default));
1102
- stroke-width: var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default));
1103
+
1104
+ .xy-flow__minimap-mask {
1105
+ fill: var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default));
1106
+ stroke: var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default));
1107
+ stroke-width: var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default));
1103
1108
  }
1104
-
1105
- .xy-flow__minimap-node {
1106
- fill: var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default));
1107
- stroke: var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default));
1108
- stroke-width: var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default));
1109
+
1110
+ .xy-flow__minimap-node {
1111
+ fill: var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default));
1112
+ stroke: var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default));
1113
+ stroke-width: var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default));
1109
1114
  }
1110
-
1111
-
1112
- /* ── Background ─────────────────────────────────────────────────── */
1115
+
1116
+
1117
+ /* ── Background ─────────────────────────────────────────────────── */
1113
1118
  .xy-flow__background { pointer-events: none; z-index: -1; }
1114
-
1115
- .xy-flow__background-pattern.dots {
1116
- fill: var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default));
1119
+
1120
+ .xy-flow__background-pattern.dots {
1121
+ fill: var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default));
1117
1122
  }
1118
-
1119
- .xy-flow__background-pattern.lines {
1120
- stroke: var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default));
1123
+
1124
+ .xy-flow__background-pattern.lines {
1125
+ stroke: var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default));
1121
1126
  }
1122
-
1123
- .xy-flow__background-pattern.cross {
1124
- stroke: var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default));
1127
+
1128
+ .xy-flow__background-pattern.cross {
1129
+ stroke: var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default));
1125
1130
  }
1126
-
1127
-
1128
- /* ── Edge labels / portals ──────────────────────────────────────── */
1129
- .ng-flow__edge-textbg {
1130
- fill: var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default));
1131
+
1132
+
1133
+ /* ── Edge labels / portals ──────────────────────────────────────── */
1134
+ .ng-flow__edge-textbg {
1135
+ fill: var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default));
1131
1136
  }
1132
-
1133
- .ng-flow__edge-text {
1134
- fill: var(--xy-edge-label-color, var(--xy-edge-label-color-default));
1137
+
1138
+ .ng-flow__edge-text {
1139
+ fill: var(--xy-edge-label-color, var(--xy-edge-label-color-default));
1135
1140
  }
1136
-
1137
-
1138
- .xy-flow__edgelabel-renderer {
1139
- position: absolute;
1140
- width: 100%;
1141
- height: 100%;
1142
- pointer-events: none;
1143
- user-select: none;
1144
- left: 0;
1145
- top: 0;
1141
+
1142
+
1143
+ .xy-flow__edgelabel-renderer {
1144
+ position: absolute;
1145
+ width: 100%;
1146
+ height: 100%;
1147
+ pointer-events: none;
1148
+ user-select: none;
1149
+ left: 0;
1150
+ top: 0;
1146
1151
  }
1147
-
1148
-
1149
- .xy-flow__viewport-portal {
1150
- position: absolute;
1151
- width: 100%;
1152
- height: 100%;
1153
- left: 0;
1154
- top: 0;
1155
- user-select: none;
1152
+
1153
+
1154
+ .xy-flow__viewport-portal {
1155
+ position: absolute;
1156
+ width: 100%;
1157
+ height: 100%;
1158
+ left: 0;
1159
+ top: 0;
1160
+ user-select: none;
1156
1161
  }
1157
-
1158
-
1159
- /* ── Edge reconnect anchors ─────────────────────────────────────── */
1160
- .xy-flow__edgeupdater {
1161
- cursor: move;
1162
- pointer-events: all;
1162
+
1163
+
1164
+ /* ── Edge reconnect anchors ─────────────────────────────────────── */
1165
+ .xy-flow__edgeupdater {
1166
+ cursor: move;
1167
+ pointer-events: all;
1163
1168
  }
1164
-
1165
-
1166
- /* ── Attribution ────────────────────────────────────────────────── */
1167
- .xy-flow__attribution {
1168
- font-size: 10px;
1169
- background: var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));
1170
- padding: 2px 3px;
1171
- margin: 0;
1169
+
1170
+
1171
+ /* ── Attribution ────────────────────────────────────────────────── */
1172
+ .xy-flow__attribution {
1173
+ font-size: 10px;
1174
+ background: var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));
1175
+ padding: 2px 3px;
1176
+ margin: 0;
1172
1177
  }
1173
-
1178
+
1174
1179
  .xy-flow__attribution a { text-decoration: none; color: #999; }
1175
-
1176
-
1177
- /*
1178
- * ── Cursor overrides ───────────────────────────────────────────────
1179
- *
1180
- * Native CSS cursors (grab, grabbing, crosshair) render as invisible white
1181
- * on some Windows setups with a white pointer scheme. We ship custom SVG
1182
- * cursors (white fill + black outline) that always work on any OS/theme,
1183
- * with native cursors as fallback.
1184
- */
1185
-
1186
- /* Open hand — pane & draggable nodes */
1187
- .xy-flow__pane.draggable,
1188
- .xy-flow__node.draggable {
1189
- 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;
1190
- pointer-events: all;
1180
+
1181
+
1182
+ /*
1183
+ * ── Cursor overrides ───────────────────────────────────────────────
1184
+ *
1185
+ * Native CSS cursors (grab, grabbing, crosshair) render as invisible white
1186
+ * on some Windows setups with a white pointer scheme. We ship custom SVG
1187
+ * cursors (white fill + black outline) that always work on any OS/theme,
1188
+ * with native cursors as fallback.
1189
+ */
1190
+
1191
+ /* Open hand — pane & draggable nodes */
1192
+ .xy-flow__pane.draggable,
1193
+ .xy-flow__node.draggable {
1194
+ 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;
1195
+ pointer-events: all;
1191
1196
  }
1192
-
1193
-
1194
- /* Closed hand — while dragging */
1195
- .xy-flow__pane.dragging,
1196
- .xy-flow__node.draggable.dragging {
1197
- 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
+ /* Closed hand — while dragging */
1200
+ .xy-flow__pane.dragging,
1201
+ .xy-flow__node.draggable.dragging {
1202
+ 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;
1198
1203
  }
1199
-
1200
-
1201
- /* Crosshair — connection handles */
1202
- .xy-flow__handle.connectionindicator {
1203
- 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;
1204
+
1205
+
1206
+ /* Crosshair — connection handles */
1207
+ .xy-flow__handle.connectionindicator {
1208
+ 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;
1204
1209
  }
1205
-
1210
+