@elementor/editor-interactions 4.0.0-537 → 4.0.0-539

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/dist/index.mjs CHANGED
@@ -92,7 +92,7 @@ var PopupStateProvider = ({ children }) => {
92
92
 
93
93
  // src/components/interactions-list.tsx
94
94
  import * as React12 from "react";
95
- import { useCallback as useCallback5, useEffect as useEffect2, useMemo as useMemo4, useRef } from "react";
95
+ import { useCallback as useCallback5, useEffect as useEffect2, useMemo as useMemo4, useRef as useRef2 } from "react";
96
96
  import { Repeater } from "@elementor/editor-controls";
97
97
  import { InfoCircleFilledIcon, PlayerPlayIcon } from "@elementor/icons";
98
98
  import { Alert, AlertTitle, Box, IconButton, Tooltip } from "@elementor/ui";
@@ -116,6 +116,56 @@ function useInteractionItemContext() {
116
116
  return context;
117
117
  }
118
118
 
119
+ // src/utils/prop-value-utils.ts
120
+ import { sizePropTypeUtil } from "@elementor/editor-props";
121
+
122
+ // src/configs/time-constants.ts
123
+ var TIME_UNITS = ["s", "ms"];
124
+ var DEFAULT_TIME_UNIT = "ms";
125
+
126
+ // src/utils/size-transform-utils.ts
127
+ var SIZE_REGEX = /^(?:(-?\d*\.?\d+)([a-z%]+)|([a-z%]+))$/i;
128
+ var parseSizeValue = (value, allowedUnits, defaultValue, defaultUnit) => {
129
+ if (typeof value === "number") {
130
+ return {
131
+ size: value,
132
+ unit: defaultUnit
133
+ };
134
+ }
135
+ const sizeValue = tryParse(value, allowedUnits, defaultUnit);
136
+ if (sizeValue) {
137
+ return sizeValue;
138
+ }
139
+ if (defaultValue) {
140
+ const fallbackSize = tryParse(defaultValue, allowedUnits, defaultUnit);
141
+ if (fallbackSize) {
142
+ return fallbackSize;
143
+ }
144
+ }
145
+ return createSizeValue(null, defaultUnit);
146
+ };
147
+ var tryParse = (value, allowedUnits, defaultUnit) => {
148
+ if (typeof value === "number") {
149
+ return createSizeValue(value, defaultUnit);
150
+ }
151
+ const match = value && value.match(SIZE_REGEX);
152
+ if (!match) {
153
+ return null;
154
+ }
155
+ const size = match[1] ? parseFloat(match[1]) : null;
156
+ const unit = match[2] || match[3];
157
+ if (!allowedUnits.includes(unit)) {
158
+ return null;
159
+ }
160
+ return createSizeValue(size, unit);
161
+ };
162
+ var formatSizeValue = ({ size, unit }) => {
163
+ return `${size ?? ""}${unit}`;
164
+ };
165
+ var createSizeValue = (size, unit) => {
166
+ return { size, unit };
167
+ };
168
+
119
169
  // src/utils/temp-id-utils.ts
120
170
  var TEMP_ID_PREFIX = "temp-";
121
171
  function generateTempInteractionId() {
@@ -134,8 +184,8 @@ var createNumber = (value) => ({
134
184
  var createTimingConfig = (duration, delay) => ({
135
185
  $$type: "timing-config",
136
186
  value: {
137
- duration: createNumber(duration),
138
- delay: createNumber(delay)
187
+ duration: sizePropTypeUtil.create(parseSizeValue(duration, TIME_UNITS, void 0, DEFAULT_TIME_UNIT)),
188
+ delay: sizePropTypeUtil.create(parseSizeValue(delay, TIME_UNITS, void 0, DEFAULT_TIME_UNIT))
139
189
  }
140
190
  });
141
191
  var createBoolean = (value) => ({
@@ -252,6 +302,9 @@ var createDefaultInteractionItem = () => {
252
302
  var extractString = (prop, fallback = "") => {
253
303
  return prop?.value ?? fallback;
254
304
  };
305
+ var extractSize = (prop) => {
306
+ return formatSizeValue(prop?.value);
307
+ };
255
308
  var extractNumber = (prop, fallback = 0) => {
256
309
  return prop?.value ?? fallback;
257
310
  };
@@ -389,30 +442,47 @@ function EffectType({ value, onChange }) {
389
442
 
390
443
  // src/components/controls/time-frame-indicator.tsx
391
444
  import * as React8 from "react";
392
- import { useCallback as useCallback2 } from "react";
445
+ import { useCallback as useCallback2, useRef } from "react";
393
446
  import { UnstableSizeField } from "@elementor/editor-controls";
394
- import { sizePropTypeUtil } from "@elementor/editor-props";
395
- var DEFAULT_UNIT = "ms";
447
+
448
+ // src/utils/time-conversion.ts
449
+ var UNIT_TO_MS = {
450
+ ms: 1,
451
+ s: 1e3
452
+ };
453
+ var convertTimeUnit = (value, from, to) => {
454
+ return value * UNIT_TO_MS[from] / UNIT_TO_MS[to];
455
+ };
456
+
457
+ // src/components/controls/time-frame-indicator.tsx
396
458
  function TimeFrameIndicator({ value, onChange, defaultValue }) {
397
- const sizeValue = toSizeValue(value ?? defaultValue);
459
+ const sizeValue = parseSizeValue(value, TIME_UNITS, defaultValue, DEFAULT_TIME_UNIT);
460
+ const prevUnitRef = useRef(sizeValue.unit);
398
461
  const setValue = useCallback2(
399
462
  (size) => {
400
- onChange(String(size));
463
+ const unitChanged = prevUnitRef.current !== size.unit;
464
+ if (unitChanged) {
465
+ const fromUnit = prevUnitRef.current;
466
+ const toUnit = size.unit;
467
+ size.size = convertTimeUnit(Number(size.size), fromUnit, toUnit);
468
+ prevUnitRef.current = toUnit;
469
+ }
470
+ onChange(formatSizeValue(size));
401
471
  },
402
472
  [onChange]
403
473
  );
404
474
  const handleChange = (newValue) => {
405
- setValue(newValue.size);
475
+ setValue(newValue);
406
476
  };
407
477
  const handleBlur = () => {
408
478
  if (!sizeValue.size) {
409
- setValue(defaultValue);
479
+ setValue(parseSizeValue(defaultValue, TIME_UNITS, void 0, DEFAULT_TIME_UNIT));
410
480
  }
411
481
  };
412
482
  return /* @__PURE__ */ React8.createElement(
413
483
  UnstableSizeField,
414
484
  {
415
- units: [DEFAULT_UNIT],
485
+ units: TIME_UNITS,
416
486
  value: sizeValue,
417
487
  onChange: handleChange,
418
488
  onBlur: handleBlur,
@@ -424,12 +494,6 @@ function TimeFrameIndicator({ value, onChange, defaultValue }) {
424
494
  }
425
495
  );
426
496
  }
427
- var toSizeValue = (value) => {
428
- return sizePropTypeUtil.create({
429
- size: Number(value),
430
- unit: DEFAULT_UNIT
431
- }).value;
432
- };
433
497
 
434
498
  // src/components/interaction-details.tsx
435
499
  var DEFAULT_VALUES = {
@@ -473,8 +537,8 @@ var InteractionDetails = ({ interaction, onChange, onPlayInteraction }) => {
473
537
  const effect = extractString(interaction.animation.value.effect, DEFAULT_VALUES.effect);
474
538
  const type = extractString(interaction.animation.value.type, DEFAULT_VALUES.type);
475
539
  const direction = extractString(interaction.animation.value.direction, DEFAULT_VALUES.direction);
476
- const duration = extractNumber(interaction.animation.value.timing_config.value.duration, DEFAULT_VALUES.duration);
477
- const delay = extractNumber(interaction.animation.value.timing_config.value.delay, DEFAULT_VALUES.delay);
540
+ const duration = extractSize(interaction.animation.value.timing_config.value.duration);
541
+ const delay = extractSize(interaction.animation.value.timing_config.value.delay);
478
542
  const replay = extractBoolean(interaction.animation.value.config?.value.replay, DEFAULT_VALUES.replay);
479
543
  const easing = extractString(interaction.animation.value.config?.value.easing, DEFAULT_VALUES.easing);
480
544
  const relativeTo = extractString(interaction.animation.value.config?.value.relativeTo, DEFAULT_VALUES.relativeTo);
@@ -560,14 +624,14 @@ var InteractionDetails = ({ interaction, onChange, onPlayInteraction }) => {
560
624
  TimeFrameIndicator,
561
625
  {
562
626
  value: String(duration),
563
- onChange: (v) => updateInteraction({ duration: parseInt(v, 10) }),
627
+ onChange: (v) => updateInteraction({ duration: v }),
564
628
  defaultValue: DEFAULT_VALUES.duration
565
629
  }
566
630
  )), controlVisibilityConfig.delay(interactionValues) && /* @__PURE__ */ React9.createElement(Field, { label: __5("Delay", "elementor") }, /* @__PURE__ */ React9.createElement(
567
631
  TimeFrameIndicator,
568
632
  {
569
633
  value: String(delay),
570
- onChange: (v) => updateInteraction({ delay: parseInt(v, 10) }),
634
+ onChange: (v) => updateInteraction({ delay: v }),
571
635
  defaultValue: DEFAULT_VALUES.delay
572
636
  }
573
637
  ))), controlVisibilityConfig.relativeTo(interactionValues) && RelativeToControl && /* @__PURE__ */ React9.createElement(React9.Fragment, null, /* @__PURE__ */ React9.createElement(Divider, null), /* @__PURE__ */ React9.createElement(Grid, { container: true, spacing: 1.5 }, /* @__PURE__ */ React9.createElement(Field, { label: __5("Relative To", "elementor") }, /* @__PURE__ */ React9.createElement(
@@ -701,7 +765,7 @@ var InteractionsListItem = ({ index, value }) => {
701
765
  var MAX_NUMBER_OF_INTERACTIONS = 5;
702
766
  function InteractionsList(props) {
703
767
  const { interactions, onSelectInteractions, onPlayInteraction, triggerCreateOnShowEmpty } = props;
704
- const hasInitializedRef = useRef(false);
768
+ const hasInitializedRef = useRef2(false);
705
769
  const handleUpdateInteractions = useCallback5(
706
770
  (newInteractions) => {
707
771
  onSelectInteractions(newInteractions);
@@ -907,6 +971,54 @@ function createInteractionsProvider({
907
971
  // src/providers/document-elements-interactions-provider.ts
908
972
  import { getCurrentDocumentId, getElementInteractions, getElements } from "@elementor/editor-elements";
909
973
  import { __privateListenTo as listenTo, windowEvent } from "@elementor/editor-v1-adapters";
974
+
975
+ // src/providers/utils/normalize-interactions.ts
976
+ import {
977
+ isTransformable,
978
+ numberPropTypeUtil
979
+ } from "@elementor/editor-props";
980
+ var FIELD_NORMALIZERS = {
981
+ size: (value) => {
982
+ const sizeProp = value;
983
+ const { size, unit } = sizeProp.value;
984
+ const numberPropValue = convertTimeUnit(size, unit, "ms");
985
+ return numberPropTypeUtil.create(numberPropValue);
986
+ }
987
+ };
988
+ var normalizeInteractions = (interactions) => {
989
+ if (!interactions) {
990
+ return;
991
+ }
992
+ if (interactions.items.length === 0) {
993
+ return interactions;
994
+ }
995
+ return {
996
+ ...interactions,
997
+ items: interactions.items.map(normalizeNode)
998
+ };
999
+ };
1000
+ var normalizeNode = (node) => {
1001
+ if (Array.isArray(node)) {
1002
+ return node.map(normalizeNode);
1003
+ }
1004
+ if (node !== null && typeof node === "object") {
1005
+ if (isTransformable(node) && node.value !== void 0) {
1006
+ const normalizer = FIELD_NORMALIZERS[node.$$type];
1007
+ if (normalizer) {
1008
+ return normalizer(node);
1009
+ }
1010
+ }
1011
+ const typedNode = node;
1012
+ const out = {};
1013
+ for (const k in typedNode) {
1014
+ out[k] = normalizeNode(typedNode[k]);
1015
+ }
1016
+ return out;
1017
+ }
1018
+ return node;
1019
+ };
1020
+
1021
+ // src/providers/document-elements-interactions-provider.ts
910
1022
  var ELEMENTS_INTERACTIONS_PROVIDER_KEY_PREFIX = "document-elements-interactions-";
911
1023
  var documentElementsInteractionsProvider = createInteractionsProvider({
912
1024
  key: () => {
@@ -934,10 +1046,11 @@ var documentElementsInteractionsProvider = createInteractionsProvider({
934
1046
  });
935
1047
  return filtered.map((element) => {
936
1048
  const interactions = getElementInteractions(element.id);
1049
+ const normalizedInteractions = normalizeInteractions(interactions);
937
1050
  return {
938
1051
  elementId: element.id,
939
1052
  dataId: element.id,
940
- interactions: interactions || { version: 1, items: [] }
1053
+ interactions: normalizedInteractions || { version: 1, items: [] }
941
1054
  };
942
1055
  });
943
1056
  }