@odigos/ui-kit 0.0.82 → 0.0.84

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.0.84](https://github.com/odigos-io/ui-kit/compare/ui-kit-v0.0.83...ui-kit-v0.0.84) (2025-08-18)
4
+
5
+
6
+ ### Features
7
+
8
+ * add toggle for overwriting existing cluster attributes in AddClusterInfo component ([#324](https://github.com/odigos-io/ui-kit/issues/324)) ([ef2ef11](https://github.com/odigos-io/ui-kit/commit/ef2ef11a3392fda77f2f302c0e55ae6c2f24a99e))
9
+
10
+ ## [0.0.83](https://github.com/odigos-io/ui-kit/compare/ui-kit-v0.0.82...ui-kit-v0.0.83) (2025-08-13)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * action prop for text ([#320](https://github.com/odigos-io/ui-kit/issues/320)) ([39ae91c](https://github.com/odigos-io/ui-kit/commit/39ae91c9bfeee6f66be61b2b196e3b0ebdb5e8d8))
16
+
3
17
  ## [0.0.82](https://github.com/odigos-io/ui-kit/compare/ui-kit-v0.0.81...ui-kit-v0.0.82) (2025-08-13)
4
18
 
5
19
 
package/lib/components.js CHANGED
@@ -1,6 +1,6 @@
1
- import { B as Button } from './index-8b8d8883.js';
2
- export { A as AutocompleteInput, a as Badge, a9 as CenterThis, C as Checkbox, b as Code, c as ConditionDetails, D as DataCard, e as DataCardFieldTypes, d as DataCardFields, f as DataFinger, g as DataTab, h as DescribeRow, i as Divider, j as DocsButton, k as Drawer, m as DrawerFooter, l as DrawerHeader, n as Dropdown, E as ExtendArrow, F as FadeLoader, o as FieldError, p as FieldLabel, a8 as FlexColumn, a7 as FlexRow, H as Header, I as IconButton, q as IconGroup, r as IconTitleBadge, s as IconWrapped, t as IconsNav, u as ImageControlled, v as Input, w as InputList, x as InputTable, y as InteractiveTable, K as KeyValueInputsList, M as Modal, ac as ModalBody, z as MonitorsCheckboxes, G as MonitorsIcons, N as NavigationButtons, J as NoDataFound, L as NotificationNote, ab as Overlay, P as Popup, O as PopupForm, S as ScrollX, Q as SectionTitle, R as Segment, U as SelectionButton, V as SkeletonLoader, W as Status, X as Stepper, Y as TabList, ad as TableContainer, ae as TableTitleWrap, af as TableWrap, Z as Tag, _ as Text, a2 as TextArea, a3 as Toggle, T as ToggleCodeComponent, a4 as Tooltip, a5 as TraceLoader, aa as VerticalScroll, a6 as WarningModal, $ as getLinksFromText, a0 as getStrongsFromText, a1 as renderText } from './index-8b8d8883.js';
3
- export { C as CancelWarning, D as DeleteWarning } from './index-6cc9ec6b.js';
1
+ import { B as Button } from './index-90161559.js';
2
+ export { A as AutocompleteInput, a as Badge, a9 as CenterThis, C as Checkbox, b as Code, c as ConditionDetails, D as DataCard, e as DataCardFieldTypes, d as DataCardFields, f as DataFinger, g as DataTab, h as DescribeRow, i as Divider, j as DocsButton, k as Drawer, m as DrawerFooter, l as DrawerHeader, n as Dropdown, E as ExtendArrow, F as FadeLoader, o as FieldError, p as FieldLabel, a8 as FlexColumn, a7 as FlexRow, H as Header, I as IconButton, q as IconGroup, r as IconTitleBadge, s as IconWrapped, t as IconsNav, u as ImageControlled, v as Input, w as InputList, x as InputTable, y as InteractiveTable, K as KeyValueInputsList, M as Modal, ac as ModalBody, z as MonitorsCheckboxes, G as MonitorsIcons, N as NavigationButtons, J as NoDataFound, L as NotificationNote, ab as Overlay, P as Popup, O as PopupForm, S as ScrollX, Q as SectionTitle, R as Segment, U as SelectionButton, V as SkeletonLoader, W as Status, X as Stepper, Y as TabList, ad as TableContainer, ae as TableTitleWrap, af as TableWrap, Z as Tag, _ as Text, a2 as TextArea, a3 as Toggle, T as ToggleCodeComponent, a4 as Tooltip, a5 as TraceLoader, aa as VerticalScroll, a6 as WarningModal, $ as getLinksFromText, a0 as getStrongsFromText, a1 as renderText } from './index-90161559.js';
3
+ export { C as CancelWarning, D as DeleteWarning } from './index-8e9ad0b4.js';
4
4
  import React, { createContext, Component, createElement } from 'react';
5
5
  import { T as Theme } from './index-86030474.js';
6
6
  import 'styled-components';
package/lib/containers.js CHANGED
@@ -2,14 +2,14 @@ import React, { useState, useEffect, forwardRef, useRef, useImperativeHandle, us
2
2
  import styled, { css } from 'styled-components';
3
3
  import { b as DISPLAY_TITLES, T as Theme, U as usePendingStore, V as useNotificationStore, O as useDrawerStore, B as BUTTON_TEXTS, W as useEntityStore, A as ACTION_OPTIONS, g as getActionIcon, z as useModalStore, F as FORM_ALERTS, X as useFilterStore, d as getInstrumentationRuleIcon, Y as useDataStreamStore, Z as useInstrumentStore, c as getEntityId, D as DISPLAY_LANGUAGES, M as MONITORS_OPTIONS, S as STORAGE_KEYS, a as DEFAULT_DATA_STREAM_NAME, _ as useSetupStore, e as getProgrammingLanguageIcon, I as INSTRUMENTATION_RULE_OPTIONS, $ as useSelectedStore, k as ImageErrorIcon, a0 as useDarkMode } from './index-86030474.js';
4
4
  import { ActionType, ActionKeyTypes, InputTypes, FieldTypes, EntityTypes, StatusType, Crud, OtherStatus, NodeTypes, EdgeTypes, AddNodeTypes, SignalType, HeadersCollectionKeyTypes, CustomInstrumentationsKeyTypes, CodeAttributesKeyTypes, PayloadCollectionKeyTypes, InstrumentationRuleType, K8sResourceKind, ProgrammingLanguages, MountMethod, AgentEnvVarsInjectionMethod, Profile, InstallationMethod } from './types.js';
5
- import { e as DataCardFieldTypes, p as FieldLabel, C as Checkbox, o as FieldError, v as Input, x as InputTable, K as KeyValueInputsList, w as InputList, _ as Text, R as Segment, Q as SectionTitle, j as DocsButton, z as MonitorsCheckboxes, a2 as TextArea, k as Drawer, c as ConditionDetails, D as DataCard, a8 as FlexColumn, M as Modal, N as NavigationButtons, ac as ModalBody, L as NotificationNote, A as AutocompleteInput, i as Divider, W as Status, a7 as FlexRow, a4 as Tooltip, s as IconWrapped, G as MonitorsIcons, ad as TableContainer, ae as TableTitleWrap, r as IconTitleBadge, af as TableWrap, y as InteractiveTable, a9 as CenterThis, J as NoDataFound, a5 as TraceLoader, a as Badge, ag as nodeConfig, ah as useNodesState, ai as useEdgesState, aj as Flow, ak as applyNodeChanges, P as Popup, U as SelectionButton, aa as VerticalScroll, n as Dropdown, B as Button, a3 as Toggle, I as IconButton, E as ExtendArrow, al as AddButton, F as FadeLoader, g as DataTab, X as Stepper, d as DataCardFields, Z as Tag, am as MarkerType, t as IconsNav, an as CopyText, h as DescribeRow, ao as PodContainer, ap as SourceContainer, q as IconGroup, O as PopupForm } from './index-8b8d8883.js';
5
+ import { e as DataCardFieldTypes, p as FieldLabel, C as Checkbox, o as FieldError, v as Input, x as InputTable, a3 as Toggle, K as KeyValueInputsList, w as InputList, _ as Text, R as Segment, Q as SectionTitle, j as DocsButton, z as MonitorsCheckboxes, a2 as TextArea, k as Drawer, c as ConditionDetails, D as DataCard, a8 as FlexColumn, M as Modal, N as NavigationButtons, ac as ModalBody, L as NotificationNote, A as AutocompleteInput, i as Divider, W as Status, a7 as FlexRow, a4 as Tooltip, s as IconWrapped, G as MonitorsIcons, ad as TableContainer, ae as TableTitleWrap, r as IconTitleBadge, af as TableWrap, y as InteractiveTable, a9 as CenterThis, J as NoDataFound, a5 as TraceLoader, a as Badge, ag as nodeConfig, ah as useNodesState, ai as useEdgesState, aj as Flow, ak as applyNodeChanges, P as Popup, U as SelectionButton, aa as VerticalScroll, n as Dropdown, B as Button, I as IconButton, E as ExtendArrow, al as AddButton, F as FadeLoader, g as DataTab, X as Stepper, d as DataCardFields, Z as Tag, am as MarkerType, t as IconsNav, an as CopyText, h as DescribeRow, ao as PodContainer, ap as SourceContainer, q as IconGroup, O as PopupForm } from './index-90161559.js';
6
6
  import { i as isEmpty, s as safeJsonParse, d as deepClone } from './index-5e5f7bda.js';
7
7
  import { C as CheckCircledIcon, O as OdigosLogo } from './index-4dfaeaab.js';
8
8
  import { C as CrossCircledIcon, O as OdigosLogoText, F as FilterIcon, D as DataStreamsIcon, A as ArrowIcon, R as RefreshLeftArrowIcon, N as NotificationIcon, U as UserIcon, a as OverviewIcon, S as SlackLogo, K as KeyIcon, T as TerminalIcon, G as GearIcon } from './index-c1a8e92c.js';
9
9
  import { useActionFormData, useSessionStorage, useDataStreamFormData, useDestinationFormData, useClickNotification, useSourceFormData, useSourceSelectionFormData } from './hooks.js';
10
10
  import { u as useKeyDown, a as useContainerSize, b as useClickNode, c as usePopup, d as useOnClickOutside, e as useInstrumentationRuleFormData, f as useTransition, g as useTimeAgo, h as useCopy, i as useGenericForm } from './useTransition-cac1649d.js';
11
11
  import { E as EditIcon, T as TrashIcon, S as SearchIcon, h as CheckIcon, P as PlusIcon, a as CopyIcon } from './index-72089d6e.js';
12
- import { D as DeleteWarning, C as CancelWarning } from './index-6cc9ec6b.js';
12
+ import { D as DeleteWarning, C as CancelWarning } from './index-8e9ad0b4.js';
13
13
  import { g as getConditionsBooleans, m as mapConditions, b as getStatusIcon, h as splitCamelString, c as capitalizeFirstLetter, i as isStringABoolean, p as parseBooleanFromString } from './index-f22371cb.js';
14
14
  import { f as filterActions, l as getEntityLabel, k as getEntityIcon, t as sleep, g as formatBytes, i as getContainersIcons, n as getValueForRange, j as getDestinationIcon, e as filterSourcesByStream, d as filterSources, b as filterDestinationsByStream, a as filterDestinations, s as mapDestinationFieldsForDisplay, c as compareCondition, p as getYamlFieldsForDestination, m as getMetricForEntity, o as getWorkloadId, q as hasUnhealthyInstances, h as getContainersInstrumentedCount, r as isOverTime } from './index-8b736e84.js';
15
15
  import { m as mapExportedSignals } from './index-6a6bea6e.js';
@@ -131,7 +131,7 @@ const buildCard$3 = (action) => {
131
131
  return arr;
132
132
  };
133
133
 
134
- const KEY$8 = ActionKeyTypes.PiiCategories;
134
+ const KEY$7 = ActionKeyTypes.PiiCategories;
135
135
  const ListContainer$2 = styled.div `
136
136
  display: flex;
137
137
  flex-direction: row;
@@ -150,18 +150,18 @@ const PII_OPTIONS = [
150
150
  },
151
151
  ];
152
152
  const PiiMasking = ({ value, setValue, formErrors }) => {
153
- const errorMessage = formErrors[KEY$8];
154
- const mappedValue = value[KEY$8] || [];
153
+ const errorMessage = formErrors[KEY$7];
154
+ const mappedValue = value[KEY$7] || [];
155
155
  const [isLastSelection, setIsLastSelection] = useState(mappedValue.length === 1);
156
156
  const handleChange = (id, isAdd) => {
157
157
  const arr = isAdd ? [...mappedValue, id] : mappedValue.filter((str) => str !== id);
158
- setValue(KEY$8, arr);
158
+ setValue(KEY$7, arr);
159
159
  setIsLastSelection(arr.length === 1);
160
160
  };
161
161
  useEffect(() => {
162
162
  if (!mappedValue.length) {
163
163
  const arr = PII_OPTIONS.map(({ id }) => id);
164
- setValue(KEY$8, arr);
164
+ setValue(KEY$7, arr);
165
165
  setIsLastSelection(PII_OPTIONS.length === 1);
166
166
  }
167
167
  // eslint-disable-next-line
@@ -172,11 +172,11 @@ const PiiMasking = ({ value, setValue, formErrors }) => {
172
172
  !!errorMessage && React.createElement(FieldError, null, errorMessage)));
173
173
  };
174
174
 
175
- const KEY$7 = ActionKeyTypes.FallbackSamplingRatio, MIN$1 = 0, MAX$1 = 100;
175
+ const KEY$6 = ActionKeyTypes.FallbackSamplingRatio, MIN$1 = 0, MAX$1 = 100;
176
176
  const ErrorSampler = ({ value, setValue, formErrors }) => {
177
- const errorMessage = formErrors[KEY$7];
178
- const mappedValue = value[KEY$7];
179
- const handleChange = (val) => setValue(KEY$7, Math.max(MIN$1, Math.min(Number(val), MAX$1)) || MIN$1);
177
+ const errorMessage = formErrors[KEY$6];
178
+ const mappedValue = value[KEY$6];
179
+ const handleChange = (val) => setValue(KEY$6, Math.max(MIN$1, Math.min(Number(val), MAX$1)) || MIN$1);
180
180
  return (React.createElement(Input, { title: 'Fallback sampling ratio', required: true, type: InputTypes.Number, min: MIN$1, max: MAX$1, value: !isEmpty(mappedValue) ? String(mappedValue) : '', onChange: ({ target: { value: v } }) => handleChange(v), errorMessage: errorMessage }));
181
181
  };
182
182
 
@@ -234,7 +234,7 @@ const K8sAttributes = ({ value, setValue, formErrors }) => {
234
234
  React.createElement(InputTable, { columns: ANNOTATION_COLUMNS, value: value[ActionKeyTypes.AnnotationsAttributes] || [], onChange: (arr) => setValue(ActionKeyTypes.AnnotationsAttributes, arr), errorMessage: formErrors[ActionKeyTypes.AnnotationsAttributes] })));
235
235
  };
236
236
 
237
- const KEY$6 = ActionKeyTypes.EndpointsFilters;
237
+ const KEY$5 = ActionKeyTypes.EndpointsFilters;
238
238
  const COLUMNS$2 = [
239
239
  {
240
240
  title: 'Service',
@@ -268,8 +268,8 @@ const COLUMNS$2 = [
268
268
  },
269
269
  ];
270
270
  const LatencySampler = ({ value, setValue, formErrors }) => {
271
- const errorMessage = formErrors[KEY$6];
272
- const mappedValue = value[KEY$6] || [];
271
+ const errorMessage = formErrors[KEY$5];
272
+ const mappedValue = value[KEY$5] || [];
273
273
  const handleChange = (arr) => {
274
274
  const mapped = arr.map(({ serviceName, httpRoute, minimumLatencyThreshold, fallbackSamplingRatio }) => {
275
275
  const row = {
@@ -280,23 +280,21 @@ const LatencySampler = ({ value, setValue, formErrors }) => {
280
280
  };
281
281
  return row;
282
282
  });
283
- setValue(KEY$6, mapped);
283
+ setValue(KEY$5, mapped);
284
284
  };
285
285
  return React.createElement(InputTable, { columns: COLUMNS$2, value: mappedValue, onChange: handleChange, errorMessage: errorMessage });
286
286
  };
287
287
 
288
- const KEY$5 = ActionKeyTypes.ClusterAttributes;
289
288
  const AddClusterInfo = ({ value, setValue, formErrors }) => {
290
- const errorMessage = formErrors[KEY$5];
291
- const mappedValue = value[KEY$5]?.map((obj) => ({
292
- key: obj.attributeName,
293
- value: obj.attributeStringValue,
294
- })) || [];
295
- const handleChange = (arr) => setValue(KEY$5, arr.map((obj) => ({
296
- attributeName: obj.key,
297
- attributeStringValue: obj.value,
298
- })));
299
- return React.createElement(KeyValueInputsList, { title: 'Resource Attributes', value: mappedValue, onChange: handleChange, required: true, errorMessage: errorMessage });
289
+ return (React.createElement(React.Fragment, null,
290
+ React.createElement(Toggle, { title: 'Overwrite Existing Values', tooltip: 'If enabled, the resource attributes will overwrite any existing attributes with the same name.', initialValue: value[ActionKeyTypes.OverwriteExistingValues] || false, onChange: (bool) => setValue(ActionKeyTypes.OverwriteExistingValues, bool) }),
291
+ React.createElement(KeyValueInputsList, { title: 'Resource Attributes', value: value[ActionKeyTypes.ClusterAttributes]?.map((obj) => ({
292
+ key: obj.attributeName,
293
+ value: obj.attributeStringValue,
294
+ })) || [], onChange: (arr) => setValue(ActionKeyTypes.ClusterAttributes, arr.map((obj) => ({
295
+ attributeName: obj.key,
296
+ attributeStringValue: obj.value,
297
+ }))), required: true, errorMessage: formErrors[ActionKeyTypes.ClusterAttributes] })));
300
298
  };
301
299
 
302
300
  const KEY$4 = ActionKeyTypes.AttributeNamesToDelete;
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { a6 as WarningModal } from './index-8b8d8883.js';
2
+ import { a6 as WarningModal } from './index-90161559.js';
3
3
  import { StatusType, EntityTypes } from './types.js';
4
4
  import './index-86030474.js';
5
5
  import 'styled-components';
@@ -4549,7 +4549,7 @@ const nodeConfig = {
4549
4549
  framePadding: 12,
4550
4550
  };
4551
4551
 
4552
- var css_248z = "/* this gets exported as style.css and can be used for the default theming */\n/* these are the necessary styles for React/Svelte Flow, they get used by base.css and style.css */\n.react-flow {\n direction: ltr;\n\n --xy-edge-stroke-default: #b1b1b7;\n --xy-edge-stroke-width-default: 1;\n --xy-edge-stroke-selected-default: #555;\n\n --xy-connectionline-stroke-default: #b1b1b7;\n --xy-connectionline-stroke-width-default: 1;\n\n --xy-attribution-background-color-default: rgba(255, 255, 255, 0.5);\n\n --xy-minimap-background-color-default: #fff;\n --xy-minimap-mask-background-color-default: rgba(240, 240, 240, 0.6);\n --xy-minimap-mask-stroke-color-default: transparent;\n --xy-minimap-mask-stroke-width-default: 1;\n --xy-minimap-node-background-color-default: #e2e2e2;\n --xy-minimap-node-stroke-color-default: transparent;\n --xy-minimap-node-stroke-width-default: 2;\n\n --xy-background-color-default: transparent;\n --xy-background-pattern-dots-color-default: #91919a;\n --xy-background-pattern-lines-color-default: #eee;\n --xy-background-pattern-cross-color-default: #e2e2e2;\n background-color: var(--xy-background-color, var(--xy-background-color-default));\n --xy-node-color-default: inherit;\n --xy-node-border-default: 1px solid #1a192b;\n --xy-node-background-color-default: #fff;\n --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25);\n --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, 0.08);\n --xy-node-boxshadow-selected-default: 0 0 0 0.5px #1a192b;\n --xy-node-border-radius-default: 3px;\n\n --xy-handle-background-color-default: #1a192b;\n --xy-handle-border-color-default: #fff;\n\n --xy-selection-background-color-default: rgba(0, 89, 220, 0.08);\n --xy-selection-border-default: 1px dotted rgba(0, 89, 220, 0.8);\n\n --xy-controls-button-background-color-default: #fefefe;\n --xy-controls-button-background-color-hover-default: #f4f4f4;\n --xy-controls-button-color-default: inherit;\n --xy-controls-button-color-hover-default: inherit;\n --xy-controls-button-border-color-default: #eee;\n --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08);\n\n --xy-edge-label-background-color-default: #ffffff;\n --xy-edge-label-color-default: inherit;\n --xy-resize-background-color-default: #3367d9;\n}\n.react-flow.dark {\n --xy-edge-stroke-default: #3e3e3e;\n --xy-edge-stroke-width-default: 1;\n --xy-edge-stroke-selected-default: #727272;\n\n --xy-connectionline-stroke-default: #b1b1b7;\n --xy-connectionline-stroke-width-default: 1;\n\n --xy-attribution-background-color-default: rgba(150, 150, 150, 0.25);\n\n --xy-minimap-background-color-default: #141414;\n --xy-minimap-mask-background-color-default: rgba(60, 60, 60, 0.6);\n --xy-minimap-mask-stroke-color-default: transparent;\n --xy-minimap-mask-stroke-width-default: 1;\n --xy-minimap-node-background-color-default: #2b2b2b;\n --xy-minimap-node-stroke-color-default: transparent;\n --xy-minimap-node-stroke-width-default: 2;\n\n --xy-background-color-default: #141414;\n --xy-background-pattern-dots-color-default: #777;\n --xy-background-pattern-lines-color-default: #777;\n --xy-background-pattern-cross-color-default: #777;\n --xy-node-color-default: #f8f8f8;\n --xy-node-border-default: 1px solid #3c3c3c;\n --xy-node-background-color-default: #1e1e1e;\n --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25);\n --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, 0.08);\n --xy-node-boxshadow-selected-default: 0 0 0 0.5px #999;\n\n --xy-handle-background-color-default: #bebebe;\n --xy-handle-border-color-default: #1e1e1e;\n\n --xy-selection-background-color-default: rgba(200, 200, 220, 0.08);\n --xy-selection-border-default: 1px dotted rgba(200, 200, 220, 0.8);\n\n --xy-controls-button-background-color-default: #2b2b2b;\n --xy-controls-button-background-color-hover-default: #3e3e3e;\n --xy-controls-button-color-default: #f8f8f8;\n --xy-controls-button-color-hover-default: #fff;\n --xy-controls-button-border-color-default: #5b5b5b;\n --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08);\n\n --xy-edge-label-background-color-default: #141414;\n --xy-edge-label-color-default: #f8f8f8;\n}\n.react-flow__background {\n background-color: var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));\n pointer-events: none;\n z-index: -1;\n}\n.react-flow__container {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n}\n.react-flow__pane {\n z-index: 1;\n}\n.react-flow__pane.draggable {\n cursor: grab;\n }\n.react-flow__pane.dragging {\n cursor: grabbing;\n }\n.react-flow__pane.selection {\n cursor: pointer;\n }\n.react-flow__viewport {\n transform-origin: 0 0;\n z-index: 2;\n pointer-events: none;\n}\n.react-flow__renderer {\n z-index: 4;\n}\n.react-flow__selection {\n z-index: 6;\n}\n.react-flow__nodesselection-rect:focus,\n.react-flow__nodesselection-rect:focus-visible {\n outline: none;\n}\n.react-flow__edge-path {\n stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default));\n stroke-width: var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));\n fill: none;\n}\n.react-flow__connection-path {\n stroke: var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));\n stroke-width: var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));\n fill: none;\n}\n.react-flow .react-flow__edges {\n position: absolute;\n}\n.react-flow .react-flow__edges svg {\n overflow: visible;\n position: absolute;\n pointer-events: none;\n }\n.react-flow__edge {\n pointer-events: visibleStroke;\n}\n.react-flow__edge.selectable {\n cursor: pointer;\n }\n.react-flow__edge.animated path {\n stroke-dasharray: 5;\n animation: dashdraw 0.5s linear infinite;\n }\n.react-flow__edge.animated path.react-flow__edge-interaction {\n stroke-dasharray: none;\n animation: none;\n }\n.react-flow__edge.inactive {\n pointer-events: none;\n }\n.react-flow__edge.selected,\n .react-flow__edge:focus,\n .react-flow__edge:focus-visible {\n outline: none;\n }\n.react-flow__edge.selected .react-flow__edge-path,\n .react-flow__edge.selectable:focus .react-flow__edge-path,\n .react-flow__edge.selectable:focus-visible .react-flow__edge-path {\n stroke: var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default));\n }\n.react-flow__edge-textwrapper {\n pointer-events: all;\n }\n.react-flow__edge .react-flow__edge-text {\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n.react-flow__connection {\n pointer-events: none;\n}\n.react-flow__connection .animated {\n stroke-dasharray: 5;\n animation: dashdraw 0.5s linear infinite;\n }\nsvg.react-flow__connectionline {\n z-index: 1001;\n overflow: visible;\n position: absolute;\n}\n.react-flow__nodes {\n pointer-events: none;\n transform-origin: 0 0;\n}\n.react-flow__node {\n position: absolute;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n pointer-events: all;\n transform-origin: 0 0;\n box-sizing: border-box;\n cursor: default;\n}\n.react-flow__node.selectable {\n cursor: pointer;\n }\n.react-flow__node.draggable {\n cursor: grab;\n pointer-events: all;\n }\n.react-flow__node.draggable.dragging {\n cursor: grabbing;\n }\n.react-flow__nodesselection {\n z-index: 3;\n transform-origin: left top;\n pointer-events: none;\n}\n.react-flow__nodesselection-rect {\n position: absolute;\n pointer-events: all;\n cursor: grab;\n }\n.react-flow__handle {\n position: absolute;\n pointer-events: none;\n min-width: 5px;\n min-height: 5px;\n width: 6px;\n height: 6px;\n background-color: var(--xy-handle-background-color, var(--xy-handle-background-color-default));\n border: 1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));\n border-radius: 100%;\n}\n.react-flow__handle.connectingfrom {\n pointer-events: all;\n }\n.react-flow__handle.connectionindicator {\n pointer-events: all;\n cursor: crosshair;\n }\n.react-flow__handle-bottom {\n top: auto;\n left: 50%;\n bottom: 0;\n transform: translate(-50%, 50%);\n }\n.react-flow__handle-top {\n top: 0;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n.react-flow__handle-left {\n top: 50%;\n left: 0;\n transform: translate(-50%, -50%);\n }\n.react-flow__handle-right {\n top: 50%;\n right: 0;\n transform: translate(50%, -50%);\n }\n.react-flow__edgeupdater {\n cursor: move;\n pointer-events: all;\n}\n.react-flow__pane.selection .react-flow__panel {\n pointer-events: none;\n}\n.react-flow__panel {\n position: absolute;\n z-index: 5;\n margin: 15px;\n}\n.react-flow__panel.top {\n top: 0;\n }\n.react-flow__panel.bottom {\n bottom: 0;\n }\n.react-flow__panel.top.center, .react-flow__panel.bottom.center {\n left: 50%;\n transform: translateX(-15px) translateX(-50%);\n }\n.react-flow__panel.left {\n left: 0;\n }\n.react-flow__panel.right {\n right: 0;\n }\n.react-flow__panel.left.center, .react-flow__panel.right.center {\n top: 50%;\n transform: translateY(-15px) translateY(-50%);\n }\n.react-flow__attribution {\n font-size: 10px;\n background: var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));\n padding: 2px 3px;\n margin: 0;\n}\n.react-flow__attribution a {\n text-decoration: none;\n color: #999;\n }\n@keyframes dashdraw {\n from {\n stroke-dashoffset: 10;\n }\n}\n.react-flow__edgelabel-renderer {\n position: absolute;\n width: 100%;\n height: 100%;\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n left: 0;\n top: 0;\n}\n.react-flow__viewport-portal {\n position: absolute;\n width: 100%;\n height: 100%;\n left: 0;\n top: 0;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.react-flow__minimap {\n background: var(\n --xy-minimap-background-color-props,\n var(--xy-minimap-background-color, var(--xy-minimap-background-color-default))\n );\n}\n.react-flow__minimap-svg {\n display: block;\n }\n.react-flow__minimap-mask {\n fill: var(\n --xy-minimap-mask-background-color-props,\n var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default))\n );\n stroke: var(\n --xy-minimap-mask-stroke-color-props,\n var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default))\n );\n stroke-width: var(\n --xy-minimap-mask-stroke-width-props,\n var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default))\n );\n }\n.react-flow__minimap-node {\n fill: var(\n --xy-minimap-node-background-color-props,\n var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default))\n );\n stroke: var(\n --xy-minimap-node-stroke-color-props,\n var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default))\n );\n stroke-width: var(\n --xy-minimap-node-stroke-width-props,\n var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default))\n );\n }\n.react-flow__background-pattern.dots {\n fill: var(\n --xy-background-pattern-color-props,\n var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default))\n );\n }\n.react-flow__background-pattern.lines {\n stroke: var(\n --xy-background-pattern-color-props,\n var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default))\n );\n }\n.react-flow__background-pattern.cross {\n stroke: var(\n --xy-background-pattern-color-props,\n var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default))\n );\n }\n.react-flow__controls {\n display: flex;\n flex-direction: column;\n box-shadow: var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default));\n}\n.react-flow__controls.horizontal {\n flex-direction: row;\n }\n.react-flow__controls-button {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 26px;\n width: 26px;\n padding: 4px;\n border: none;\n background: var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));\n border-bottom: 1px solid\n var(\n --xy-controls-button-border-color-props,\n var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default))\n );\n color: var(\n --xy-controls-button-color-props,\n var(--xy-controls-button-color, var(--xy-controls-button-color-default))\n );\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n.react-flow__controls-button svg {\n width: 100%;\n max-width: 12px;\n max-height: 12px;\n fill: currentColor;\n }\n.react-flow__edge.updating .react-flow__edge-path {\n stroke: #777;\n }\n.react-flow__edge-text {\n font-size: 10px;\n }\n.react-flow__node.selectable:focus,\n .react-flow__node.selectable:focus-visible {\n outline: none;\n }\n.react-flow__node-input,\n.react-flow__node-default,\n.react-flow__node-output,\n.react-flow__node-group {\n padding: 10px;\n border-radius: var(--xy-node-border-radius, var(--xy-node-border-radius-default));\n width: 150px;\n font-size: 12px;\n color: var(--xy-node-color, var(--xy-node-color-default));\n text-align: center;\n border: var(--xy-node-border, var(--xy-node-border-default));\n background-color: var(--xy-node-background-color, var(--xy-node-background-color-default));\n}\n.react-flow__node-input.selectable:hover, .react-flow__node-default.selectable:hover, .react-flow__node-output.selectable:hover, .react-flow__node-group.selectable:hover {\n box-shadow: var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default));\n }\n.react-flow__node-input.selectable.selected,\n .react-flow__node-input.selectable:focus,\n .react-flow__node-input.selectable:focus-visible,\n .react-flow__node-default.selectable.selected,\n .react-flow__node-default.selectable:focus,\n .react-flow__node-default.selectable:focus-visible,\n .react-flow__node-output.selectable.selected,\n .react-flow__node-output.selectable:focus,\n .react-flow__node-output.selectable:focus-visible,\n .react-flow__node-group.selectable.selected,\n .react-flow__node-group.selectable:focus,\n .react-flow__node-group.selectable:focus-visible {\n box-shadow: var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default));\n }\n.react-flow__node-group {\n background-color: var(--xy-node-group-background-color, var(--xy-node-group-background-color-default));\n}\n.react-flow__nodesselection-rect,\n.react-flow__selection {\n background: var(--xy-selection-background-color, var(--xy-selection-background-color-default));\n border: var(--xy-selection-border, var(--xy-selection-border-default));\n}\n.react-flow__nodesselection-rect:focus,\n .react-flow__nodesselection-rect:focus-visible,\n .react-flow__selection:focus,\n .react-flow__selection:focus-visible {\n outline: none;\n }\n.react-flow__controls-button:hover {\n background: var(\n --xy-controls-button-background-color-hover-props,\n var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default))\n );\n color: var(\n --xy-controls-button-color-hover-props,\n var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default))\n );\n }\n.react-flow__controls-button:disabled {\n pointer-events: none;\n }\n.react-flow__controls-button:disabled svg {\n fill-opacity: 0.4;\n }\n.react-flow__controls-button:last-child {\n border-bottom: none;\n }\n.react-flow__controls.horizontal .react-flow__controls-button {\n border-bottom: none;\n border-right: 1px solid\n var(\n --xy-controls-button-border-color-props,\n var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default))\n );\n }\n.react-flow__controls.horizontal .react-flow__controls-button:last-child {\n border-right: none;\n }\n.react-flow__resize-control {\n position: absolute;\n}\n.react-flow__resize-control.left,\n.react-flow__resize-control.right {\n cursor: ew-resize;\n}\n.react-flow__resize-control.top,\n.react-flow__resize-control.bottom {\n cursor: ns-resize;\n}\n.react-flow__resize-control.top.left,\n.react-flow__resize-control.bottom.right {\n cursor: nwse-resize;\n}\n.react-flow__resize-control.bottom.left,\n.react-flow__resize-control.top.right {\n cursor: nesw-resize;\n}\n/* handle styles */\n.react-flow__resize-control.handle {\n width: 5px;\n height: 5px;\n border: 1px solid #fff;\n border-radius: 1px;\n background-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default));\n translate: -50% -50%;\n}\n.react-flow__resize-control.handle.left {\n left: 0;\n top: 50%;\n}\n.react-flow__resize-control.handle.right {\n left: 100%;\n top: 50%;\n}\n.react-flow__resize-control.handle.top {\n left: 50%;\n top: 0;\n}\n.react-flow__resize-control.handle.bottom {\n left: 50%;\n top: 100%;\n}\n.react-flow__resize-control.handle.top.left {\n left: 0;\n}\n.react-flow__resize-control.handle.bottom.left {\n left: 0;\n}\n.react-flow__resize-control.handle.top.right {\n left: 100%;\n}\n.react-flow__resize-control.handle.bottom.right {\n left: 100%;\n}\n/* line styles */\n.react-flow__resize-control.line {\n border-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default));\n border-width: 0;\n border-style: solid;\n}\n.react-flow__resize-control.line.left,\n.react-flow__resize-control.line.right {\n width: 1px;\n transform: translate(-50%, 0);\n top: 0;\n height: 100%;\n}\n.react-flow__resize-control.line.left {\n left: 0;\n border-left-width: 1px;\n}\n.react-flow__resize-control.line.right {\n left: 100%;\n border-right-width: 1px;\n}\n.react-flow__resize-control.line.top,\n.react-flow__resize-control.line.bottom {\n height: 1px;\n transform: translate(0, -50%);\n left: 0;\n width: 100%;\n}\n.react-flow__resize-control.line.top {\n top: 0;\n border-top-width: 1px;\n}\n.react-flow__resize-control.line.bottom {\n border-bottom-width: 1px;\n top: 100%;\n}\n.react-flow__edge-textbg {\n fill: var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default));\n}\n.react-flow__edge-text {\n fill: var(--xy-edge-label-color, var(--xy-edge-label-color-default));\n}\n";
4552
+ var css_248z = "/* this gets exported as style.css and can be used for the default theming */\n/* these are the necessary styles for React/Svelte Flow, they get used by base.css and style.css */\n.react-flow {\n direction: ltr;\n\n --xy-edge-stroke-default: #b1b1b7;\n --xy-edge-stroke-width-default: 1;\n --xy-edge-stroke-selected-default: #555;\n\n --xy-connectionline-stroke-default: #b1b1b7;\n --xy-connectionline-stroke-width-default: 1;\n\n --xy-attribution-background-color-default: rgba(255, 255, 255, 0.5);\n\n --xy-minimap-background-color-default: #fff;\n --xy-minimap-mask-background-color-default: rgba(240, 240, 240, 0.6);\n --xy-minimap-mask-stroke-color-default: transparent;\n --xy-minimap-mask-stroke-width-default: 1;\n --xy-minimap-node-background-color-default: #e2e2e2;\n --xy-minimap-node-stroke-color-default: transparent;\n --xy-minimap-node-stroke-width-default: 2;\n\n --xy-background-color-default: transparent;\n --xy-background-pattern-dots-color-default: #91919a;\n --xy-background-pattern-lines-color-default: #eee;\n --xy-background-pattern-cross-color-default: #e2e2e2;\n background-color: var(--xy-background-color, var(--xy-background-color-default));\n --xy-node-color-default: inherit;\n --xy-node-border-default: 1px solid #1a192b;\n --xy-node-background-color-default: #fff;\n --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25);\n --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, 0.08);\n --xy-node-boxshadow-selected-default: 0 0 0 0.5px #1a192b;\n --xy-node-border-radius-default: 3px;\n\n --xy-handle-background-color-default: #1a192b;\n --xy-handle-border-color-default: #fff;\n\n --xy-selection-background-color-default: rgba(0, 89, 220, 0.08);\n --xy-selection-border-default: 1px dotted rgba(0, 89, 220, 0.8);\n\n --xy-controls-button-background-color-default: #fefefe;\n --xy-controls-button-background-color-hover-default: #f4f4f4;\n --xy-controls-button-color-default: inherit;\n --xy-controls-button-color-hover-default: inherit;\n --xy-controls-button-border-color-default: #eee;\n --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08);\n\n --xy-edge-label-background-color-default: #ffffff;\n --xy-edge-label-color-default: inherit;\n --xy-resize-background-color-default: #3367d9;\n}\n.react-flow.dark {\n --xy-edge-stroke-default: #3e3e3e;\n --xy-edge-stroke-width-default: 1;\n --xy-edge-stroke-selected-default: #727272;\n\n --xy-connectionline-stroke-default: #b1b1b7;\n --xy-connectionline-stroke-width-default: 1;\n\n --xy-attribution-background-color-default: rgba(150, 150, 150, 0.25);\n\n --xy-minimap-background-color-default: #141414;\n --xy-minimap-mask-background-color-default: rgba(60, 60, 60, 0.6);\n --xy-minimap-mask-stroke-color-default: transparent;\n --xy-minimap-mask-stroke-width-default: 1;\n --xy-minimap-node-background-color-default: #2b2b2b;\n --xy-minimap-node-stroke-color-default: transparent;\n --xy-minimap-node-stroke-width-default: 2;\n\n --xy-background-color-default: #141414;\n --xy-background-pattern-dots-color-default: #777;\n --xy-background-pattern-lines-color-default: #777;\n --xy-background-pattern-cross-color-default: #777;\n --xy-node-color-default: #f8f8f8;\n --xy-node-border-default: 1px solid #3c3c3c;\n --xy-node-background-color-default: #1e1e1e;\n --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25);\n --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, 0.08);\n --xy-node-boxshadow-selected-default: 0 0 0 0.5px #999;\n\n --xy-handle-background-color-default: #bebebe;\n --xy-handle-border-color-default: #1e1e1e;\n\n --xy-selection-background-color-default: rgba(200, 200, 220, 0.08);\n --xy-selection-border-default: 1px dotted rgba(200, 200, 220, 0.8);\n\n --xy-controls-button-background-color-default: #2b2b2b;\n --xy-controls-button-background-color-hover-default: #3e3e3e;\n --xy-controls-button-color-default: #f8f8f8;\n --xy-controls-button-color-hover-default: #fff;\n --xy-controls-button-border-color-default: #5b5b5b;\n --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08);\n\n --xy-edge-label-background-color-default: #141414;\n --xy-edge-label-color-default: #f8f8f8;\n}\n.react-flow__background {\n background-color: var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));\n pointer-events: none;\n z-index: -1;\n}\n.react-flow__container {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n}\n.react-flow__pane {\n z-index: 1;\n}\n.react-flow__pane.draggable {\n cursor: grab;\n }\n.react-flow__pane.dragging {\n cursor: grabbing;\n }\n.react-flow__pane.selection {\n cursor: pointer;\n }\n.react-flow__viewport {\n transform-origin: 0 0;\n z-index: 2;\n pointer-events: none;\n}\n.react-flow__renderer {\n z-index: 4;\n}\n.react-flow__selection {\n z-index: 6;\n}\n.react-flow__nodesselection-rect:focus,\n.react-flow__nodesselection-rect:focus-visible {\n outline: none;\n}\n.react-flow__edge-path {\n stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default));\n stroke-width: var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));\n fill: none;\n}\n.react-flow__connection-path {\n stroke: var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));\n stroke-width: var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));\n fill: none;\n}\n.react-flow .react-flow__edges {\n position: absolute;\n}\n.react-flow .react-flow__edges svg {\n overflow: visible;\n position: absolute;\n pointer-events: none;\n }\n.react-flow__edge {\n pointer-events: visibleStroke;\n}\n.react-flow__edge.selectable {\n cursor: pointer;\n }\n.react-flow__edge.animated path {\n stroke-dasharray: 5;\n animation: dashdraw 0.5s linear infinite;\n }\n.react-flow__edge.animated path.react-flow__edge-interaction {\n stroke-dasharray: none;\n animation: none;\n }\n.react-flow__edge.inactive {\n pointer-events: none;\n }\n.react-flow__edge.selected,\n .react-flow__edge:focus,\n .react-flow__edge:focus-visible {\n outline: none;\n }\n.react-flow__edge.selected .react-flow__edge-path,\n .react-flow__edge.selectable:focus .react-flow__edge-path,\n .react-flow__edge.selectable:focus-visible .react-flow__edge-path {\n stroke: var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default));\n }\n.react-flow__edge-textwrapper {\n pointer-events: all;\n }\n.react-flow__edge .react-flow__edge-text {\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n/* Arrowhead marker styles - use CSS custom properties as default */\n.react-flow__arrowhead polyline {\n fill: var(--xy-edge-stroke, var(--xy-edge-stroke-default));\n stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default));\n}\n.react-flow__connection {\n pointer-events: none;\n}\n.react-flow__connection .animated {\n stroke-dasharray: 5;\n animation: dashdraw 0.5s linear infinite;\n }\nsvg.react-flow__connectionline {\n z-index: 1001;\n overflow: visible;\n position: absolute;\n}\n.react-flow__nodes {\n pointer-events: none;\n transform-origin: 0 0;\n}\n.react-flow__node {\n position: absolute;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n pointer-events: all;\n transform-origin: 0 0;\n box-sizing: border-box;\n cursor: default;\n}\n.react-flow__node.selectable {\n cursor: pointer;\n }\n.react-flow__node.draggable {\n cursor: grab;\n pointer-events: all;\n }\n.react-flow__node.draggable.dragging {\n cursor: grabbing;\n }\n.react-flow__nodesselection {\n z-index: 3;\n transform-origin: left top;\n pointer-events: none;\n}\n.react-flow__nodesselection-rect {\n position: absolute;\n pointer-events: all;\n cursor: grab;\n }\n.react-flow__handle {\n position: absolute;\n pointer-events: none;\n min-width: 5px;\n min-height: 5px;\n width: 6px;\n height: 6px;\n background-color: var(--xy-handle-background-color, var(--xy-handle-background-color-default));\n border: 1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));\n border-radius: 100%;\n}\n.react-flow__handle.connectingfrom {\n pointer-events: all;\n }\n.react-flow__handle.connectionindicator {\n pointer-events: all;\n cursor: crosshair;\n }\n.react-flow__handle-bottom {\n top: auto;\n left: 50%;\n bottom: 0;\n transform: translate(-50%, 50%);\n }\n.react-flow__handle-top {\n top: 0;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n.react-flow__handle-left {\n top: 50%;\n left: 0;\n transform: translate(-50%, -50%);\n }\n.react-flow__handle-right {\n top: 50%;\n right: 0;\n transform: translate(50%, -50%);\n }\n.react-flow__edgeupdater {\n cursor: move;\n pointer-events: all;\n}\n.react-flow__pane.selection .react-flow__panel {\n pointer-events: none;\n}\n.react-flow__panel {\n position: absolute;\n z-index: 5;\n margin: 15px;\n}\n.react-flow__panel.top {\n top: 0;\n }\n.react-flow__panel.bottom {\n bottom: 0;\n }\n.react-flow__panel.top.center, .react-flow__panel.bottom.center {\n left: 50%;\n transform: translateX(-15px) translateX(-50%);\n }\n.react-flow__panel.left {\n left: 0;\n }\n.react-flow__panel.right {\n right: 0;\n }\n.react-flow__panel.left.center, .react-flow__panel.right.center {\n top: 50%;\n transform: translateY(-15px) translateY(-50%);\n }\n.react-flow__attribution {\n font-size: 10px;\n background: var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));\n padding: 2px 3px;\n margin: 0;\n}\n.react-flow__attribution a {\n text-decoration: none;\n color: #999;\n }\n@keyframes dashdraw {\n from {\n stroke-dashoffset: 10;\n }\n}\n.react-flow__edgelabel-renderer {\n position: absolute;\n width: 100%;\n height: 100%;\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n left: 0;\n top: 0;\n}\n.react-flow__viewport-portal {\n position: absolute;\n width: 100%;\n height: 100%;\n left: 0;\n top: 0;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.react-flow__minimap {\n background: var(\n --xy-minimap-background-color-props,\n var(--xy-minimap-background-color, var(--xy-minimap-background-color-default))\n );\n}\n.react-flow__minimap-svg {\n display: block;\n }\n.react-flow__minimap-mask {\n fill: var(\n --xy-minimap-mask-background-color-props,\n var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default))\n );\n stroke: var(\n --xy-minimap-mask-stroke-color-props,\n var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default))\n );\n stroke-width: var(\n --xy-minimap-mask-stroke-width-props,\n var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default))\n );\n }\n.react-flow__minimap-node {\n fill: var(\n --xy-minimap-node-background-color-props,\n var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default))\n );\n stroke: var(\n --xy-minimap-node-stroke-color-props,\n var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default))\n );\n stroke-width: var(\n --xy-minimap-node-stroke-width-props,\n var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default))\n );\n }\n.react-flow__background-pattern.dots {\n fill: var(\n --xy-background-pattern-color-props,\n var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default))\n );\n }\n.react-flow__background-pattern.lines {\n stroke: var(\n --xy-background-pattern-color-props,\n var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default))\n );\n }\n.react-flow__background-pattern.cross {\n stroke: var(\n --xy-background-pattern-color-props,\n var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default))\n );\n }\n.react-flow__controls {\n display: flex;\n flex-direction: column;\n box-shadow: var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default));\n}\n.react-flow__controls.horizontal {\n flex-direction: row;\n }\n.react-flow__controls-button {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 26px;\n width: 26px;\n padding: 4px;\n border: none;\n background: var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));\n border-bottom: 1px solid\n var(\n --xy-controls-button-border-color-props,\n var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default))\n );\n color: var(\n --xy-controls-button-color-props,\n var(--xy-controls-button-color, var(--xy-controls-button-color-default))\n );\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n.react-flow__controls-button svg {\n width: 100%;\n max-width: 12px;\n max-height: 12px;\n fill: currentColor;\n }\n.react-flow__edge.updating .react-flow__edge-path {\n stroke: #777;\n }\n.react-flow__edge-text {\n font-size: 10px;\n }\n.react-flow__node.selectable:focus,\n .react-flow__node.selectable:focus-visible {\n outline: none;\n }\n.react-flow__node-input,\n.react-flow__node-default,\n.react-flow__node-output,\n.react-flow__node-group {\n padding: 10px;\n border-radius: var(--xy-node-border-radius, var(--xy-node-border-radius-default));\n width: 150px;\n font-size: 12px;\n color: var(--xy-node-color, var(--xy-node-color-default));\n text-align: center;\n border: var(--xy-node-border, var(--xy-node-border-default));\n background-color: var(--xy-node-background-color, var(--xy-node-background-color-default));\n}\n.react-flow__node-input.selectable:hover, .react-flow__node-default.selectable:hover, .react-flow__node-output.selectable:hover, .react-flow__node-group.selectable:hover {\n box-shadow: var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default));\n }\n.react-flow__node-input.selectable.selected,\n .react-flow__node-input.selectable:focus,\n .react-flow__node-input.selectable:focus-visible,\n .react-flow__node-default.selectable.selected,\n .react-flow__node-default.selectable:focus,\n .react-flow__node-default.selectable:focus-visible,\n .react-flow__node-output.selectable.selected,\n .react-flow__node-output.selectable:focus,\n .react-flow__node-output.selectable:focus-visible,\n .react-flow__node-group.selectable.selected,\n .react-flow__node-group.selectable:focus,\n .react-flow__node-group.selectable:focus-visible {\n box-shadow: var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default));\n }\n.react-flow__node-group {\n background-color: var(--xy-node-group-background-color, var(--xy-node-group-background-color-default));\n}\n.react-flow__nodesselection-rect,\n.react-flow__selection {\n background: var(--xy-selection-background-color, var(--xy-selection-background-color-default));\n border: var(--xy-selection-border, var(--xy-selection-border-default));\n}\n.react-flow__nodesselection-rect:focus,\n .react-flow__nodesselection-rect:focus-visible,\n .react-flow__selection:focus,\n .react-flow__selection:focus-visible {\n outline: none;\n }\n.react-flow__controls-button:hover {\n background: var(\n --xy-controls-button-background-color-hover-props,\n var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default))\n );\n color: var(\n --xy-controls-button-color-hover-props,\n var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default))\n );\n }\n.react-flow__controls-button:disabled {\n pointer-events: none;\n }\n.react-flow__controls-button:disabled svg {\n fill-opacity: 0.4;\n }\n.react-flow__controls-button:last-child {\n border-bottom: none;\n }\n.react-flow__controls.horizontal .react-flow__controls-button {\n border-bottom: none;\n border-right: 1px solid\n var(\n --xy-controls-button-border-color-props,\n var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default))\n );\n }\n.react-flow__controls.horizontal .react-flow__controls-button:last-child {\n border-right: none;\n }\n.react-flow__resize-control {\n position: absolute;\n}\n.react-flow__resize-control.left,\n.react-flow__resize-control.right {\n cursor: ew-resize;\n}\n.react-flow__resize-control.top,\n.react-flow__resize-control.bottom {\n cursor: ns-resize;\n}\n.react-flow__resize-control.top.left,\n.react-flow__resize-control.bottom.right {\n cursor: nwse-resize;\n}\n.react-flow__resize-control.bottom.left,\n.react-flow__resize-control.top.right {\n cursor: nesw-resize;\n}\n/* handle styles */\n.react-flow__resize-control.handle {\n width: 5px;\n height: 5px;\n border: 1px solid #fff;\n border-radius: 1px;\n background-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default));\n translate: -50% -50%;\n}\n.react-flow__resize-control.handle.left {\n left: 0;\n top: 50%;\n}\n.react-flow__resize-control.handle.right {\n left: 100%;\n top: 50%;\n}\n.react-flow__resize-control.handle.top {\n left: 50%;\n top: 0;\n}\n.react-flow__resize-control.handle.bottom {\n left: 50%;\n top: 100%;\n}\n.react-flow__resize-control.handle.top.left {\n left: 0;\n}\n.react-flow__resize-control.handle.bottom.left {\n left: 0;\n}\n.react-flow__resize-control.handle.top.right {\n left: 100%;\n}\n.react-flow__resize-control.handle.bottom.right {\n left: 100%;\n}\n/* line styles */\n.react-flow__resize-control.line {\n border-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default));\n border-width: 0;\n border-style: solid;\n}\n.react-flow__resize-control.line.left,\n.react-flow__resize-control.line.right {\n width: 1px;\n transform: translate(-50%, 0);\n top: 0;\n height: 100%;\n}\n.react-flow__resize-control.line.left {\n left: 0;\n border-left-width: 1px;\n}\n.react-flow__resize-control.line.right {\n left: 100%;\n border-right-width: 1px;\n}\n.react-flow__resize-control.line.top,\n.react-flow__resize-control.line.bottom {\n height: 1px;\n transform: translate(0, -50%);\n left: 0;\n width: 100%;\n}\n.react-flow__resize-control.line.top {\n top: 0;\n border-top-width: 1px;\n}\n.react-flow__resize-control.line.bottom {\n border-bottom-width: 1px;\n top: 100%;\n}\n.react-flow__edge-textbg {\n fill: var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default));\n}\n.react-flow__edge-text {\n fill: var(--xy-edge-label-color, var(--xy-edge-label-color-default));\n}\n";
4553
4553
  styleInject(css_248z);
4554
4554
 
4555
4555
  function getDefaultExportFromCjs (x) {
@@ -10325,6 +10325,25 @@ function getEventHandlerParams({ nodeId, dragItems, nodeLookup, dragging = true,
10325
10325
  nodesFromDragItems,
10326
10326
  ];
10327
10327
  }
10328
+ /**
10329
+ * If a selection is being dragged we want to apply the same snap offset to all nodes in the selection.
10330
+ * This function calculates the snap offset based on the first node in the selection.
10331
+ */
10332
+ function calculateSnapOffset({ dragItems, snapGrid, x, y, }) {
10333
+ const refDragItem = dragItems.values().next().value;
10334
+ if (!refDragItem) {
10335
+ return null;
10336
+ }
10337
+ const refPos = {
10338
+ x: x - refDragItem.distance.x,
10339
+ y: y - refDragItem.distance.y,
10340
+ };
10341
+ const refPosSnapped = snapPosition(refPos, snapGrid);
10342
+ return {
10343
+ x: refPosSnapped.x - refPos.x,
10344
+ y: refPosSnapped.y - refPos.y,
10345
+ };
10346
+ }
10328
10347
 
10329
10348
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
10330
10349
  function XYDrag({ onNodeMouseDown, getStoreItems, onDragStart, onDrag, onDragStop, }) {
@@ -10338,39 +10357,43 @@ function XYDrag({ onNodeMouseDown, getStoreItems, onDragStart, onDrag, onDragSto
10338
10357
  let d3Selection = null;
10339
10358
  let abortDrag = false; // prevents unintentional dragging on multitouch
10340
10359
  let nodePositionsChanged = false;
10360
+ // we store the last drag event to be able to use it in the update function
10361
+ let dragEvent = null;
10341
10362
  // public functions
10342
10363
  function update({ noDragClassName, handleSelector, domNode, isSelectable, nodeId, nodeClickDistance = 0, }) {
10343
10364
  d3Selection = select(domNode);
10344
- function updateNodes({ x, y }, dragEvent) {
10365
+ function updateNodes({ x, y }) {
10345
10366
  const { nodeLookup, nodeExtent, snapGrid, snapToGrid, nodeOrigin, onNodeDrag, onSelectionDrag, onError, updateNodePositions, } = getStoreItems();
10346
10367
  lastPos = { x, y };
10347
10368
  let hasChange = false;
10348
- let nodesBox = { x: 0, y: 0, x2: 0, y2: 0 };
10349
- if (dragItems.size > 1 && nodeExtent) {
10350
- const rect = getInternalNodesBounds(dragItems);
10351
- nodesBox = rectToBox(rect);
10352
- }
10369
+ const isMultiDrag = dragItems.size > 1;
10370
+ const nodesBox = isMultiDrag && nodeExtent ? rectToBox(getInternalNodesBounds(dragItems)) : null;
10371
+ const multiDragSnapOffset = isMultiDrag && snapToGrid
10372
+ ? calculateSnapOffset({
10373
+ dragItems,
10374
+ snapGrid,
10375
+ x,
10376
+ y,
10377
+ })
10378
+ : null;
10353
10379
  for (const [id, dragItem] of dragItems) {
10380
+ /*
10381
+ * if the node is not in the nodeLookup anymore, it was probably deleted while dragging
10382
+ */
10354
10383
  if (!nodeLookup.has(id)) {
10355
- /*
10356
- * if the node is not in the nodeLookup anymore, it was probably deleted while dragging
10357
- * and we don't need to update it anymore
10358
- */
10359
10384
  continue;
10360
10385
  }
10361
10386
  let nextPosition = { x: x - dragItem.distance.x, y: y - dragItem.distance.y };
10362
10387
  if (snapToGrid) {
10363
- nextPosition = snapPosition(nextPosition, snapGrid);
10388
+ nextPosition = multiDragSnapOffset
10389
+ ? {
10390
+ x: nextPosition.x + multiDragSnapOffset.x,
10391
+ y: nextPosition.y + multiDragSnapOffset.y,
10392
+ }
10393
+ : snapPosition(nextPosition, snapGrid);
10364
10394
  }
10365
- /*
10366
- * if there is selection with multiple nodes and a node extent is set, we need to adjust the node extent for each node
10367
- * based on its position so that the node stays at it's position relative to the selection.
10368
- */
10369
- let adjustedNodeExtent = [
10370
- [nodeExtent[0][0], nodeExtent[0][1]],
10371
- [nodeExtent[1][0], nodeExtent[1][1]],
10372
- ];
10373
- if (dragItems.size > 1 && nodeExtent && !dragItem.extent) {
10395
+ let adjustedNodeExtent = null;
10396
+ if (isMultiDrag && nodeExtent && !dragItem.extent && nodesBox) {
10374
10397
  const { positionAbsolute } = dragItem.internals;
10375
10398
  const x1 = positionAbsolute.x - nodesBox.x + nodeExtent[0][0];
10376
10399
  const x2 = positionAbsolute.x + dragItem.measured.width - nodesBox.x2 + nodeExtent[1][0];
@@ -10385,7 +10408,7 @@ function XYDrag({ onNodeMouseDown, getStoreItems, onDragStart, onDrag, onDragSto
10385
10408
  nodeId: id,
10386
10409
  nextPosition,
10387
10410
  nodeLookup,
10388
- nodeExtent: adjustedNodeExtent,
10411
+ nodeExtent: adjustedNodeExtent ? adjustedNodeExtent : nodeExtent,
10389
10412
  nodeOrigin,
10390
10413
  onError,
10391
10414
  });
@@ -10427,7 +10450,7 @@ function XYDrag({ onNodeMouseDown, getStoreItems, onDragStart, onDrag, onDragSto
10427
10450
  lastPos.x = (lastPos.x ?? 0) - xMovement / transform[2];
10428
10451
  lastPos.y = (lastPos.y ?? 0) - yMovement / transform[2];
10429
10452
  if (await panBy({ x: xMovement, y: yMovement })) {
10430
- updateNodes(lastPos, null);
10453
+ updateNodes(lastPos);
10431
10454
  }
10432
10455
  }
10433
10456
  autoPanId = requestAnimationFrame(autoPan);
@@ -10467,6 +10490,7 @@ function XYDrag({ onNodeMouseDown, getStoreItems, onDragStart, onDrag, onDragSto
10467
10490
  containerBounds = domNode?.getBoundingClientRect() || null;
10468
10491
  abortDrag = false;
10469
10492
  nodePositionsChanged = false;
10493
+ dragEvent = event.sourceEvent;
10470
10494
  if (nodeDragThreshold === 0) {
10471
10495
  startDrag(event);
10472
10496
  }
@@ -10477,6 +10501,7 @@ function XYDrag({ onNodeMouseDown, getStoreItems, onDragStart, onDrag, onDragSto
10477
10501
  .on('drag', (event) => {
10478
10502
  const { autoPanOnNodeDrag, transform, snapGrid, snapToGrid, nodeDragThreshold, nodeLookup } = getStoreItems();
10479
10503
  const pointerPos = getPointerPosition(event.sourceEvent, { transform, snapGrid, snapToGrid, containerBounds });
10504
+ dragEvent = event.sourceEvent;
10480
10505
  if ((event.sourceEvent.type === 'touchmove' && event.sourceEvent.touches.length > 1) ||
10481
10506
  // if user deletes a node while dragging, we need to abort the drag to prevent errors
10482
10507
  (nodeId && !nodeLookup.has(nodeId))) {
@@ -10499,9 +10524,8 @@ function XYDrag({ onNodeMouseDown, getStoreItems, onDragStart, onDrag, onDragSto
10499
10524
  }
10500
10525
  // skip events without movement
10501
10526
  if ((lastPos.x !== pointerPos.xSnapped || lastPos.y !== pointerPos.ySnapped) && dragItems && dragStarted) {
10502
- // dragEvent = event.sourceEvent as MouseEvent;
10503
10527
  mousePosition = getEventPosition(event.sourceEvent, containerBounds);
10504
- updateNodes(pointerPos, event.sourceEvent);
10528
+ updateNodes(pointerPos);
10505
10529
  }
10506
10530
  })
10507
10531
  .on('end', (event) => {
@@ -10644,14 +10668,13 @@ function isConnectionValid(isInsideConnectionRadius, isHandleValid) {
10644
10668
  }
10645
10669
 
10646
10670
  const alwaysValid = () => true;
10647
- function onPointerDown(event, { connectionMode, connectionRadius, handleId, nodeId, edgeUpdaterType, isTarget, domNode, nodeLookup, lib, autoPanOnConnect, flowId, panBy, cancelConnection, onConnectStart, onConnect, onConnectEnd, isValidConnection = alwaysValid, onReconnectEnd, updateConnection, getTransform, getFromHandle, autoPanSpeed, dragThreshold = 1, }) {
10671
+ function onPointerDown(event, { connectionMode, connectionRadius, handleId, nodeId, edgeUpdaterType, isTarget, domNode, nodeLookup, lib, autoPanOnConnect, flowId, panBy, cancelConnection, onConnectStart, onConnect, onConnectEnd, isValidConnection = alwaysValid, onReconnectEnd, updateConnection, getTransform, getFromHandle, autoPanSpeed, dragThreshold = 1, handleDomNode, }) {
10648
10672
  // when xyflow is used inside a shadow root we can't use document
10649
10673
  const doc = getHostForElement(event.target);
10650
10674
  let autoPanId = 0;
10651
10675
  let closestHandle;
10652
10676
  const { x, y } = getEventPosition(event);
10653
- const clickedHandle = doc?.elementFromPoint(x, y);
10654
- const handleType = getHandleType(edgeUpdaterType, clickedHandle);
10677
+ const handleType = getHandleType(edgeUpdaterType, handleDomNode);
10655
10678
  const containerBounds = domNode?.getBoundingClientRect();
10656
10679
  let connectionStarted = false;
10657
10680
  if (!containerBounds || !handleType) {
@@ -10665,7 +10688,7 @@ function onPointerDown(event, { connectionMode, connectionRadius, handleId, node
10665
10688
  let autoPanStarted = false;
10666
10689
  let connection = null;
10667
10690
  let isValid = false;
10668
- let handleDomNode = null;
10691
+ let resultHandleDomNode = null;
10669
10692
  // when the user is moving the mouse close to the edge of the canvas while connecting we move the canvas
10670
10693
  function autoPan() {
10671
10694
  if (!autoPanOnConnect || !containerBounds) {
@@ -10738,7 +10761,7 @@ function onPointerDown(event, { connectionMode, connectionRadius, handleId, node
10738
10761
  flowId,
10739
10762
  nodeLookup,
10740
10763
  });
10741
- handleDomNode = result.handleDomNode;
10764
+ resultHandleDomNode = result.handleDomNode;
10742
10765
  connection = result.connection;
10743
10766
  isValid = isConnectionValid(!!closestHandle, result.isValid);
10744
10767
  const newConnection = {
@@ -10772,7 +10795,7 @@ function onPointerDown(event, { connectionMode, connectionRadius, handleId, node
10772
10795
  }
10773
10796
  function onPointerUp(event) {
10774
10797
  if (connectionStarted) {
10775
- if ((closestHandle || handleDomNode) && connection && isValid) {
10798
+ if ((closestHandle || resultHandleDomNode) && connection && isValid) {
10776
10799
  onConnect?.(connection);
10777
10800
  }
10778
10801
  /*
@@ -10795,7 +10818,7 @@ function onPointerDown(event, { connectionMode, connectionRadius, handleId, node
10795
10818
  autoPanStarted = false;
10796
10819
  isValid = false;
10797
10820
  connection = null;
10798
- handleDomNode = null;
10821
+ resultHandleDomNode = null;
10799
10822
  doc.removeEventListener('mousemove', onPointerMove);
10800
10823
  doc.removeEventListener('mouseup', onPointerUp);
10801
10824
  doc.removeEventListener('touchmove', onPointerMove);
@@ -10859,17 +10882,18 @@ const XYHandle = {
10859
10882
 
10860
10883
  function XYMinimap({ domNode, panZoom, getTransform, getViewScale }) {
10861
10884
  const selection = select(domNode);
10862
- function update({ translateExtent, width, height, zoomStep = 10, pannable = true, zoomable = true, inversePan = false, }) {
10885
+ function update({ translateExtent, width, height, zoomStep = 1, pannable = true, zoomable = true, inversePan = false, }) {
10863
10886
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
10864
10887
  const zoomHandler = (event) => {
10865
- const transform = getTransform();
10866
10888
  if (event.sourceEvent.type !== 'wheel' || !panZoom) {
10867
10889
  return;
10868
10890
  }
10891
+ const transform = getTransform();
10892
+ const factor = event.sourceEvent.ctrlKey && isMacOs() ? 10 : 1;
10869
10893
  const pinchDelta = -event.sourceEvent.deltaY *
10870
10894
  (event.sourceEvent.deltaMode === 1 ? 0.05 : event.sourceEvent.deltaMode ? 1 : 0.002) *
10871
10895
  zoomStep;
10872
- const nextZoom = transform[2] * Math.pow(2, pinchDelta);
10896
+ const nextZoom = transform[2] * Math.pow(2, pinchDelta * factor);
10873
10897
  panZoom.scaleTo(nextZoom);
10874
10898
  };
10875
10899
  let panStart = [0, 0];
@@ -13974,6 +13998,7 @@ function HandleComponent({ type = 'source', position = Position.Top, isValidConn
13974
13998
  ((isMouseTriggered && event.button === 0) || !isMouseTriggered)) {
13975
13999
  const currentStore = store.getState();
13976
14000
  XYHandle.onPointerDown(event.nativeEvent, {
14001
+ handleDomNode: event.currentTarget,
13977
14002
  autoPanOnConnect: currentStore.autoPanOnConnect,
13978
14003
  connectionMode: currentStore.connectionMode,
13979
14004
  connectionRadius: currentStore.connectionRadius,
@@ -14525,17 +14550,18 @@ function useVisibleEdgeIds(onlyRenderVisible) {
14525
14550
  }
14526
14551
 
14527
14552
  const ArrowSymbol = ({ color = 'none', strokeWidth = 1 }) => {
14528
- return (jsxRuntimeExports.jsx("polyline", { style: {
14529
- stroke: color,
14530
- strokeWidth,
14531
- }, strokeLinecap: "round", strokeLinejoin: "round", fill: "none", points: "-5,-4 0,0 -5,4" }));
14553
+ const style = {
14554
+ strokeWidth,
14555
+ ...(color && { stroke: color }),
14556
+ };
14557
+ return jsxRuntimeExports.jsx("polyline", { style: style, strokeLinecap: "round", strokeLinejoin: "round", fill: "none", points: "-5,-4 0,0 -5,4" });
14532
14558
  };
14533
14559
  const ArrowClosedSymbol = ({ color = 'none', strokeWidth = 1 }) => {
14534
- return (jsxRuntimeExports.jsx("polyline", { style: {
14535
- stroke: color,
14536
- fill: color,
14537
- strokeWidth,
14538
- }, strokeLinecap: "round", strokeLinejoin: "round", points: "-5,-4 0,0 -5,4 -5,-4" }));
14560
+ const style = {
14561
+ strokeWidth,
14562
+ ...(color && { stroke: color, fill: color }),
14563
+ };
14564
+ return jsxRuntimeExports.jsx("polyline", { style: style, strokeLinecap: "round", strokeLinejoin: "round", points: "-5,-4 0,0 -5,4 -5,-4" });
14539
14565
  };
14540
14566
  const MarkerSymbols = {
14541
14567
  [MarkerType.Arrow]: ArrowSymbol,
@@ -14663,7 +14689,7 @@ const EdgeText = memo(EdgeTextComponent);
14663
14689
  * You can see all the props passed to a custom edge by looking at the [`EdgeProps`](/api-reference/types/edge-props) type.
14664
14690
  */
14665
14691
  function BaseEdge({ path, labelX, labelY, label, labelStyle, labelShowBg, labelBgStyle, labelBgPadding, labelBgBorderRadius, interactionWidth = 20, ...props }) {
14666
- return (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx("path", { ...props, d: path, fill: "none", className: cc(['react-flow__edge-path', props.className]) }), interactionWidth && (jsxRuntimeExports.jsx("path", { d: path, fill: "none", strokeOpacity: 0, strokeWidth: interactionWidth, className: "react-flow__edge-interaction" })), label && isNumeric(labelX) && isNumeric(labelY) ? (jsxRuntimeExports.jsx(EdgeText, { x: labelX, y: labelY, label: label, labelStyle: labelStyle, labelShowBg: labelShowBg, labelBgStyle: labelBgStyle, labelBgPadding: labelBgPadding, labelBgBorderRadius: labelBgBorderRadius })) : null] }));
14692
+ return (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx("path", { ...props, d: path, fill: "none", className: cc(['react-flow__edge-path', props.className]) }), interactionWidth ? (jsxRuntimeExports.jsx("path", { d: path, fill: "none", strokeOpacity: 0, strokeWidth: interactionWidth, className: "react-flow__edge-interaction" })) : null, label && isNumeric(labelX) && isNumeric(labelY) ? (jsxRuntimeExports.jsx(EdgeText, { x: labelX, y: labelY, label: label, labelStyle: labelStyle, labelShowBg: labelShowBg, labelBgStyle: labelBgStyle, labelBgPadding: labelBgPadding, labelBgBorderRadius: labelBgBorderRadius })) : null] }));
14667
14693
  }
14668
14694
 
14669
14695
  function getControl({ pos, x1, y1, x2, y2 }) {
@@ -14989,6 +15015,7 @@ function EdgeUpdateAnchors({ isReconnectable, reconnectRadius, edge, sourceX, so
14989
15015
  getTransform: () => store.getState().transform,
14990
15016
  getFromHandle: () => store.getState().connection.fromHandle,
14991
15017
  dragThreshold: store.getState().connectionDragThreshold,
15018
+ handleDomNode: event.currentTarget,
14992
15019
  });
14993
15020
  };
14994
15021
  const onReconnectSourceMouseDown = (event) => handleEdgeUpdater(event, { nodeId: edge.target, id: edge.targetHandle ?? null, type: 'target' });
@@ -16250,7 +16277,7 @@ function MiniMapComponent({ style, className, nodeStrokeColor, nodeColor, nodeCl
16250
16277
  * We need to rename the prop to be `CapitalCase` so that JSX will render it as
16251
16278
  * a component properly.
16252
16279
  */
16253
- nodeComponent, bgColor, maskColor, maskStrokeColor, maskStrokeWidth, position = 'bottom-right', onClick, onNodeClick, pannable = false, zoomable = false, ariaLabel, inversePan, zoomStep = 10, offsetScale = 5, }) {
16280
+ nodeComponent, bgColor, maskColor, maskStrokeColor, maskStrokeWidth, position = 'bottom-right', onClick, onNodeClick, pannable = false, zoomable = false, ariaLabel, inversePan, zoomStep = 1, offsetScale = 5, }) {
16254
16281
  const store = useStoreApi();
16255
16282
  const svg = useRef(null);
16256
16283
  const { boundingRect, viewBB, rfId, panZoom, translateExtent, flowWidth, flowHeight, ariaLabelConfig } = useStore(selector$1, shallow$1);
@@ -17335,12 +17362,13 @@ const DataCard = ({ title = 'Details', titleBadge, description, action: Action,
17335
17362
  const [hovered, setHovered] = useState(false);
17336
17363
  return (React.createElement(CardContainer, { "$hovered": hovered },
17337
17364
  !!title || !!description || !!Action ? (React.createElement(Header$1, { "$clickable": withExtend || false, onClick: () => withExtend && setExtend((prev) => !prev), onMouseEnter: () => withExtend && setHovered(true), onMouseLeave: () => withExtend && setHovered(false) },
17338
- (!!title || !!Action) && (React.createElement(Title$7, null,
17339
- title,
17340
- titleBadge === OtherStatus.Loading ? React.createElement(FadeLoader, null) : titleBadge !== undefined && React.createElement(Badge, { label: titleBadge }),
17341
- React.createElement(ActionWrapper, null,
17365
+ React.createElement(FlexRow, null,
17366
+ !!title && (React.createElement(Title$7, null,
17367
+ title,
17368
+ titleBadge === OtherStatus.Loading ? React.createElement(FadeLoader, null) : titleBadge !== undefined && React.createElement(Badge, { label: titleBadge }))),
17369
+ (!!Action || withExtend) && (React.createElement(ActionWrapper, null,
17342
17370
  typeof Action === 'function' ? React.createElement(Action, null) : Action,
17343
- withExtend && React.createElement(ExtendArrow, { extend: false })))),
17371
+ withExtend && React.createElement(ExtendArrow, { extend: extend })))),
17344
17372
  !!description && React.createElement(Description$2, null, description))) : null,
17345
17373
  (!withExtend || (withExtend && extend)) && (children || React.createElement(DataCardFields, { data: data }))));
17346
17374
  };
package/lib/snippets.js CHANGED
@@ -1,5 +1,5 @@
1
- import { B as Button, _ as Text, L as NotificationNote } from './index-8b8d8883.js';
2
- export { al as AddButton, aq as AddNode, ar as BaseNode, an as CopyText, as as EdgedNode, aj as Flow, at as FrameNode, au as HeaderNode, az as LabeledEdge, av as MapItemNode, aw as NoDataNode, ao as PodContainer, ax as ScrollNode, ay as SkeletonNode, ap as SourceContainer, ag as nodeConfig } from './index-8b8d8883.js';
1
+ import { B as Button, _ as Text, L as NotificationNote } from './index-90161559.js';
2
+ export { al as AddButton, aq as AddNode, ar as BaseNode, an as CopyText, as as EdgedNode, aj as Flow, at as FrameNode, au as HeaderNode, az as LabeledEdge, av as MapItemNode, aw as NoDataNode, ao as PodContainer, ax as ScrollNode, ay as SkeletonNode, ap as SourceContainer, ag as nodeConfig } from './index-90161559.js';
3
3
  import React from 'react';
4
4
  import { T as Theme, B as BUTTON_TEXTS, b as DISPLAY_TITLES } from './index-86030474.js';
5
5
  import { E as EditIcon } from './index-72089d6e.js';
@@ -24,6 +24,7 @@ export declare enum ActionKeyTypes {
24
24
  LabelsAttributes = "labelsAttributes",
25
25
  AnnotationsAttributes = "annotationsAttributes",
26
26
  ClusterAttributes = "clusterAttributes",
27
+ OverwriteExistingValues = "overwriteExistingValues",
27
28
  AttributeNamesToDelete = "attributeNamesToDelete",
28
29
  Renames = "renames",
29
30
  PiiCategories = "piiCategories",
@@ -49,6 +50,7 @@ export interface Action {
49
50
  [ActionKeyTypes.LabelsAttributes]?: LabelsAttributes[] | null;
50
51
  [ActionKeyTypes.AnnotationsAttributes]?: AnnotationsAttributes[] | null;
51
52
  [ActionKeyTypes.ClusterAttributes]?: ClusterAttributes[] | null;
53
+ [ActionKeyTypes.OverwriteExistingValues]?: boolean | null;
52
54
  [ActionKeyTypes.AttributeNamesToDelete]?: string[] | null;
53
55
  [ActionKeyTypes.Renames]?: {
54
56
  [oldKey: string]: string;
@@ -84,6 +86,7 @@ export interface ActionFormData {
84
86
  [ActionKeyTypes.LabelsAttributes]: Action['spec'][ActionKeyTypes.LabelsAttributes];
85
87
  [ActionKeyTypes.AnnotationsAttributes]: Action['spec'][ActionKeyTypes.AnnotationsAttributes];
86
88
  [ActionKeyTypes.ClusterAttributes]: Action['spec'][ActionKeyTypes.ClusterAttributes];
89
+ [ActionKeyTypes.OverwriteExistingValues]: Action['spec'][ActionKeyTypes.OverwriteExistingValues];
87
90
  [ActionKeyTypes.AttributeNamesToDelete]: Action['spec'][ActionKeyTypes.AttributeNamesToDelete];
88
91
  [ActionKeyTypes.Renames]: Action['spec'][ActionKeyTypes.Renames];
89
92
  [ActionKeyTypes.PiiCategories]: Action['spec'][ActionKeyTypes.PiiCategories];
package/lib/types.js CHANGED
@@ -27,6 +27,7 @@ var ActionKeyTypes;
27
27
  ActionKeyTypes["AnnotationsAttributes"] = "annotationsAttributes";
28
28
  // AddClusterInfo
29
29
  ActionKeyTypes["ClusterAttributes"] = "clusterAttributes";
30
+ ActionKeyTypes["OverwriteExistingValues"] = "overwriteExistingValues";
30
31
  // DeleteAttributes
31
32
  ActionKeyTypes["AttributeNamesToDelete"] = "attributeNamesToDelete";
32
33
  // RenameAttributes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@odigos/ui-kit",
3
- "version": "0.0.82",
3
+ "version": "0.0.84",
4
4
  "author": "Odigos",
5
5
  "repository": {
6
6
  "type": "git",
@@ -85,7 +85,7 @@
85
85
  "zustand": "^5.0.6"
86
86
  },
87
87
  "dependencies": {
88
- "@xyflow/react": "^12.8.2",
88
+ "@xyflow/react": "^12.8.3",
89
89
  "javascript-time-ago": "^2.5.11",
90
90
  "lottie-react": "^2.4.1",
91
91
  "prism-react-renderer": "^2.4.1",
@@ -96,8 +96,8 @@
96
96
  "zustand": "^5.0.7"
97
97
  },
98
98
  "devDependencies": {
99
- "@babel/core": "^7.28.0",
100
- "@babel/preset-env": "^7.28.0",
99
+ "@babel/core": "^7.28.3",
100
+ "@babel/preset-env": "^7.28.3",
101
101
  "@babel/preset-react": "^7.27.1",
102
102
  "@babel/preset-typescript": "^7.27.1",
103
103
  "@eslint/eslintrc": "^3.3.1",
@@ -105,22 +105,22 @@
105
105
  "@rollup/plugin-json": "^6.1.0",
106
106
  "@rollup/plugin-node-resolve": "^16.0.1",
107
107
  "@rollup/plugin-typescript": "^12.1.4",
108
- "@storybook/addon-docs": "^9.1.1",
108
+ "@storybook/addon-docs": "^9.1.2",
109
109
  "@storybook/addon-webpack5-compiler-babel": "^3.0.6",
110
- "@storybook/react-webpack5": "9.1.1",
111
- "@types/node": "^24.2.1",
112
- "@types/react": "^19.1.9",
110
+ "@storybook/react-webpack5": "9.1.2",
111
+ "@types/node": "^24.3.0",
112
+ "@types/react": "^19.1.10",
113
113
  "@types/react-dom": "^19.1.7",
114
114
  "babel-loader": "^10.0.0",
115
115
  "babel-plugin-styled-components": "^2.1.4",
116
- "eslint": "^9.32.0",
117
- "eslint-config-next": "^15.4.5",
118
- "eslint-plugin-storybook": "9.1.1",
119
- "next": "^15.4.5",
116
+ "eslint": "^9.33.0",
117
+ "eslint-config-next": "^15.4.6",
118
+ "eslint-plugin-storybook": "9.1.2",
119
+ "next": "^15.4.6",
120
120
  "postcss": "^8.5.6",
121
121
  "rollup": "^3.29.4",
122
122
  "rollup-plugin-postcss": "^4.0.2",
123
- "storybook": "9.1.1",
123
+ "storybook": "9.1.2",
124
124
  "typescript": "^5.9.2"
125
125
  }
126
126
  }