@odigos/ui-kit 0.0.83 → 0.0.85

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.85](https://github.com/odigos-io/ui-kit/compare/ui-kit-v0.0.84...ui-kit-v0.0.85) (2025-08-18)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * override existing toggle for addclusterinfo action ([#326](https://github.com/odigos-io/ui-kit/issues/326)) ([4080e83](https://github.com/odigos-io/ui-kit/commit/4080e83910fa50790d6bd55b0153dc6897f8c32d))
9
+
10
+ ## [0.0.84](https://github.com/odigos-io/ui-kit/compare/ui-kit-v0.0.83...ui-kit-v0.0.84) (2025-08-18)
11
+
12
+
13
+ ### Features
14
+
15
+ * 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))
16
+
3
17
  ## [0.0.83](https://github.com/odigos-io/ui-kit/compare/ui-kit-v0.0.82...ui-kit-v0.0.83) (2025-08-13)
4
18
 
5
19
 
package/lib/components.js CHANGED
@@ -1,6 +1,6 @@
1
- import { B as Button } from './index-dcb15a56.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-dcb15a56.js';
3
- export { C as CancelWarning, D as DeleteWarning } from './index-b980f6ea.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-dcb15a56.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-b980f6ea.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';
@@ -19,7 +19,7 @@ import { a6 as RulesIcon, a3 as SourcesIcon, a5 as ActionsIcon, a4 as Destinatio
19
19
  import 'react-dom';
20
20
 
21
21
  const buildCard$3 = (action) => {
22
- const { type, spec: { actionName, notes, signals, disabled, collectContainerAttributes, collectReplicaSetAttributes, collectWorkloadId, collectClusterId, labelsAttributes, annotationsAttributes, clusterAttributes, attributeNamesToDelete, renames, piiCategories, fallbackSamplingRatio, samplingPercentage, endpointsFilters, servicesNameFilters, attributeFilters, }, } = action;
22
+ const { type, spec: { actionName, notes, signals, disabled, collectContainerAttributes, collectReplicaSetAttributes, collectWorkloadId, collectClusterId, labelsAttributes, annotationsAttributes, clusterAttributes, overwriteExistingValues, attributeNamesToDelete, renames, piiCategories, fallbackSamplingRatio, samplingPercentage, endpointsFilters, servicesNameFilters, attributeFilters, }, } = action;
23
23
  const arr = [
24
24
  { title: DISPLAY_TITLES.TYPE, value: type },
25
25
  { type: DataCardFieldTypes.ActiveStatus, title: DISPLAY_TITLES.STATUS, value: String(!disabled) },
@@ -51,6 +51,7 @@ const buildCard$3 = (action) => {
51
51
  });
52
52
  }
53
53
  if (type === ActionType.AddClusterInfo) {
54
+ arr.push({ title: 'Overwrite Existing Values', value: String(overwriteExistingValues || false) });
54
55
  let str = '';
55
56
  clusterAttributes?.forEach(({ attributeName, attributeStringValue }, idx) => {
56
57
  str += `${attributeName}: ${attributeStringValue}`;
@@ -131,7 +132,7 @@ const buildCard$3 = (action) => {
131
132
  return arr;
132
133
  };
133
134
 
134
- const KEY$8 = ActionKeyTypes.PiiCategories;
135
+ const KEY$7 = ActionKeyTypes.PiiCategories;
135
136
  const ListContainer$2 = styled.div `
136
137
  display: flex;
137
138
  flex-direction: row;
@@ -150,18 +151,18 @@ const PII_OPTIONS = [
150
151
  },
151
152
  ];
152
153
  const PiiMasking = ({ value, setValue, formErrors }) => {
153
- const errorMessage = formErrors[KEY$8];
154
- const mappedValue = value[KEY$8] || [];
154
+ const errorMessage = formErrors[KEY$7];
155
+ const mappedValue = value[KEY$7] || [];
155
156
  const [isLastSelection, setIsLastSelection] = useState(mappedValue.length === 1);
156
157
  const handleChange = (id, isAdd) => {
157
158
  const arr = isAdd ? [...mappedValue, id] : mappedValue.filter((str) => str !== id);
158
- setValue(KEY$8, arr);
159
+ setValue(KEY$7, arr);
159
160
  setIsLastSelection(arr.length === 1);
160
161
  };
161
162
  useEffect(() => {
162
163
  if (!mappedValue.length) {
163
164
  const arr = PII_OPTIONS.map(({ id }) => id);
164
- setValue(KEY$8, arr);
165
+ setValue(KEY$7, arr);
165
166
  setIsLastSelection(PII_OPTIONS.length === 1);
166
167
  }
167
168
  // eslint-disable-next-line
@@ -172,11 +173,11 @@ const PiiMasking = ({ value, setValue, formErrors }) => {
172
173
  !!errorMessage && React.createElement(FieldError, null, errorMessage)));
173
174
  };
174
175
 
175
- const KEY$7 = ActionKeyTypes.FallbackSamplingRatio, MIN$1 = 0, MAX$1 = 100;
176
+ const KEY$6 = ActionKeyTypes.FallbackSamplingRatio, MIN$1 = 0, MAX$1 = 100;
176
177
  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);
178
+ const errorMessage = formErrors[KEY$6];
179
+ const mappedValue = value[KEY$6];
180
+ const handleChange = (val) => setValue(KEY$6, Math.max(MIN$1, Math.min(Number(val), MAX$1)) || MIN$1);
180
181
  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
182
  };
182
183
 
@@ -234,7 +235,7 @@ const K8sAttributes = ({ value, setValue, formErrors }) => {
234
235
  React.createElement(InputTable, { columns: ANNOTATION_COLUMNS, value: value[ActionKeyTypes.AnnotationsAttributes] || [], onChange: (arr) => setValue(ActionKeyTypes.AnnotationsAttributes, arr), errorMessage: formErrors[ActionKeyTypes.AnnotationsAttributes] })));
235
236
  };
236
237
 
237
- const KEY$6 = ActionKeyTypes.EndpointsFilters;
238
+ const KEY$5 = ActionKeyTypes.EndpointsFilters;
238
239
  const COLUMNS$2 = [
239
240
  {
240
241
  title: 'Service',
@@ -268,8 +269,8 @@ const COLUMNS$2 = [
268
269
  },
269
270
  ];
270
271
  const LatencySampler = ({ value, setValue, formErrors }) => {
271
- const errorMessage = formErrors[KEY$6];
272
- const mappedValue = value[KEY$6] || [];
272
+ const errorMessage = formErrors[KEY$5];
273
+ const mappedValue = value[KEY$5] || [];
273
274
  const handleChange = (arr) => {
274
275
  const mapped = arr.map(({ serviceName, httpRoute, minimumLatencyThreshold, fallbackSamplingRatio }) => {
275
276
  const row = {
@@ -280,23 +281,21 @@ const LatencySampler = ({ value, setValue, formErrors }) => {
280
281
  };
281
282
  return row;
282
283
  });
283
- setValue(KEY$6, mapped);
284
+ setValue(KEY$5, mapped);
284
285
  };
285
286
  return React.createElement(InputTable, { columns: COLUMNS$2, value: mappedValue, onChange: handleChange, errorMessage: errorMessage });
286
287
  };
287
288
 
288
- const KEY$5 = ActionKeyTypes.ClusterAttributes;
289
289
  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 });
290
+ return (React.createElement(React.Fragment, null,
291
+ 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) }),
292
+ React.createElement(KeyValueInputsList, { title: 'Resource Attributes', value: value[ActionKeyTypes.ClusterAttributes]?.map((obj) => ({
293
+ key: obj.attributeName,
294
+ value: obj.attributeStringValue,
295
+ })) || [], onChange: (arr) => setValue(ActionKeyTypes.ClusterAttributes, arr.map((obj) => ({
296
+ attributeName: obj.key,
297
+ attributeStringValue: obj.value,
298
+ }))), required: true, errorMessage: formErrors[ActionKeyTypes.ClusterAttributes] })));
300
299
  };
301
300
 
302
301
  const KEY$4 = ActionKeyTypes.AttributeNamesToDelete;
@@ -783,7 +782,7 @@ const ActionModal = ({ createAction }) => {
783
782
  };
784
783
 
785
784
  const buildSpecCell$1 = (action) => {
786
- const { type, spec: { collectContainerAttributes, collectReplicaSetAttributes, collectWorkloadId, collectClusterId, labelsAttributes, annotationsAttributes, clusterAttributes, attributeNamesToDelete, renames, piiCategories, fallbackSamplingRatio, samplingPercentage, endpointsFilters, }, } = action;
785
+ const { type, spec: { collectContainerAttributes, collectReplicaSetAttributes, collectWorkloadId, collectClusterId, labelsAttributes, annotationsAttributes, clusterAttributes, overwriteExistingValues, attributeNamesToDelete, renames, piiCategories, fallbackSamplingRatio, samplingPercentage, endpointsFilters, attributeFilters, servicesNameFilters, }, } = action;
787
786
  let str = '';
788
787
  if (type === ActionType.K8sAttributes) {
789
788
  if (collectContainerAttributes)
@@ -806,6 +805,7 @@ const buildSpecCell$1 = (action) => {
806
805
  });
807
806
  }
808
807
  if (type === ActionType.AddClusterInfo) {
808
+ str += `Overwrite Existing: ${overwriteExistingValues}\n`;
809
809
  clusterAttributes?.forEach(({ attributeName, attributeStringValue }, idx) => {
810
810
  str += `${attributeName}: ${attributeStringValue}`;
811
811
  if (idx < clusterAttributes.length - 1)
@@ -843,13 +843,27 @@ const buildSpecCell$1 = (action) => {
843
843
  }
844
844
  if (type === ActionType.LatencySampler) {
845
845
  endpointsFilters?.forEach(({ serviceName, httpRoute, minimumLatencyThreshold, fallbackSamplingRatio }, idx) => {
846
- str += `Endpoint${endpointsFilters.length > 1 ? ` #${idx + 1}` : ''}=${serviceName}${httpRoute}`;
846
+ str += `Endpoint${endpointsFilters.length > 1 ? ` #${idx + 1}` : ''}=${serviceName}${httpRoute}\n`;
847
847
  str += ` Latency=${minimumLatencyThreshold}`;
848
848
  str += ` Sampling=${fallbackSamplingRatio}`;
849
849
  if (idx < endpointsFilters.length - 1)
850
850
  str += ', ';
851
851
  });
852
852
  }
853
+ if (type === ActionType.ServiceNameSampler) {
854
+ servicesNameFilters?.forEach(({ serviceName, samplingRatio, fallbackSamplingRatio }) => {
855
+ str += `Service Name: ${serviceName}, `;
856
+ str += `Sampling Ratio: ${samplingRatio}, `;
857
+ str += `Fallback Sampling Ratio: ${fallbackSamplingRatio}\n`;
858
+ });
859
+ }
860
+ if (type === ActionType.SpanAttributeSampler) {
861
+ attributeFilters?.forEach(({ serviceName, attributeKey, fallbackSamplingRatio }) => {
862
+ str += `Service Name: ${serviceName}, `;
863
+ str += `Attribute Key: ${attributeKey}, `;
864
+ str += `Fallback Sampling Ratio: ${fallbackSamplingRatio}\n`;
865
+ });
866
+ }
853
867
  return str;
854
868
  };
855
869
 
@@ -1871,12 +1885,14 @@ const PushRight = styled.div `
1871
1885
  `;
1872
1886
  const getFilterCount = (params) => {
1873
1887
  let count = 0;
1874
- count += params.namespaces?.length || 0;
1875
- count += params.kinds?.length || 0;
1876
- count += params.monitors?.length || 0;
1877
- count += params.languages?.length || 0;
1878
- count += params.errors?.length || 0;
1879
- if (!!params.onlyErrors)
1888
+ Object.values(params).forEach((value) => {
1889
+ if (value && Array.isArray(value) && value.length > 0) {
1890
+ count += value.length;
1891
+ }
1892
+ });
1893
+ if (params.onlyErrors)
1894
+ count++;
1895
+ if (params.searchText)
1880
1896
  count++;
1881
1897
  return count;
1882
1898
  };
package/lib/hooks.js CHANGED
@@ -15,6 +15,7 @@ const INITIAL$2 = {
15
15
  signals: [],
16
16
  disabled: false,
17
17
  clusterAttributes: null,
18
+ overwriteExistingValues: false,
18
19
  renames: null,
19
20
  attributeNamesToDelete: null,
20
21
  piiCategories: null,
@@ -122,6 +123,7 @@ const useActionFormData = () => {
122
123
  case ActionKeyTypes.LabelsAttributes:
123
124
  case ActionKeyTypes.AnnotationsAttributes:
124
125
  case ActionKeyTypes.ClusterAttributes:
126
+ case ActionKeyTypes.OverwriteExistingValues:
125
127
  case ActionKeyTypes.AttributeNamesToDelete:
126
128
  case ActionKeyTypes.Renames:
127
129
  case ActionKeyTypes.PiiCategories:
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { a6 as WarningModal } from './index-dcb15a56.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);
package/lib/snippets.js CHANGED
@@ -1,5 +1,5 @@
1
- import { B as Button, _ as Text, L as NotificationNote } from './index-dcb15a56.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-dcb15a56.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';
@@ -32,7 +32,7 @@ interface StoreState {
32
32
  setErrors: (metrics: FiltersState['errors']) => void;
33
33
  onlyErrors: FiltersState['onlyErrors'];
34
34
  setOnlyErrors: (onlyErrors: FiltersState['onlyErrors']) => void;
35
- setAll: (params: FiltersState) => void;
35
+ setAll: (params: Partial<FiltersState>) => void;
36
36
  clearAll: () => void;
37
37
  getEmptyState: () => FiltersState;
38
38
  }
@@ -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.83",
3
+ "version": "0.0.85",
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
  }