@elementor/editor-interactions 4.0.0-499 → 4.0.0-500
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.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +75 -14
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +75 -14
- package/dist/index.mjs.map +1 -1
- package/package.json +8 -8
- package/src/components/controls/easing.tsx +38 -0
- package/src/components/interaction-details.tsx +24 -2
- package/src/init.ts +7 -0
- package/src/interactions-controls-registry.ts +2 -0
- package/src/utils/prop-value-utils.ts +30 -10
package/dist/index.mjs
CHANGED
|
@@ -124,13 +124,20 @@ var createBoolean = (value) => ({
|
|
|
124
124
|
$$type: "boolean",
|
|
125
125
|
value
|
|
126
126
|
});
|
|
127
|
-
var createConfig = (
|
|
127
|
+
var createConfig = ({
|
|
128
|
+
replay,
|
|
129
|
+
easing = "easeIn",
|
|
130
|
+
relativeTo = "",
|
|
131
|
+
offsetTop = 0,
|
|
132
|
+
offsetBottom = 100
|
|
133
|
+
}) => ({
|
|
128
134
|
$$type: "config",
|
|
129
135
|
value: {
|
|
130
136
|
replay: createBoolean(replay),
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
137
|
+
easing: createString(easing),
|
|
138
|
+
relativeTo: createString(relativeTo),
|
|
139
|
+
offsetTop: createNumber(offsetTop),
|
|
140
|
+
offsetBottom: createNumber(offsetBottom)
|
|
134
141
|
}
|
|
135
142
|
});
|
|
136
143
|
var extractBoolean = (prop, fallback = false) => {
|
|
@@ -143,6 +150,7 @@ var createAnimationPreset = ({
|
|
|
143
150
|
duration,
|
|
144
151
|
delay,
|
|
145
152
|
replay = false,
|
|
153
|
+
easing = "easeIn",
|
|
146
154
|
relativeTo,
|
|
147
155
|
offsetTop,
|
|
148
156
|
offsetBottom
|
|
@@ -153,7 +161,13 @@ var createAnimationPreset = ({
|
|
|
153
161
|
type: createString(type),
|
|
154
162
|
direction: createString(direction ?? ""),
|
|
155
163
|
timing_config: createTimingConfig(duration, delay),
|
|
156
|
-
config: createConfig(
|
|
164
|
+
config: createConfig({
|
|
165
|
+
replay,
|
|
166
|
+
easing,
|
|
167
|
+
relativeTo,
|
|
168
|
+
offsetTop,
|
|
169
|
+
offsetBottom
|
|
170
|
+
})
|
|
157
171
|
}
|
|
158
172
|
});
|
|
159
173
|
var createInteractionItem = ({
|
|
@@ -165,6 +179,7 @@ var createInteractionItem = ({
|
|
|
165
179
|
delay,
|
|
166
180
|
interactionId,
|
|
167
181
|
replay = false,
|
|
182
|
+
easing = "easeIn",
|
|
168
183
|
relativeTo,
|
|
169
184
|
offsetTop,
|
|
170
185
|
offsetBottom
|
|
@@ -180,6 +195,7 @@ var createInteractionItem = ({
|
|
|
180
195
|
duration,
|
|
181
196
|
delay,
|
|
182
197
|
replay,
|
|
198
|
+
easing,
|
|
183
199
|
relativeTo,
|
|
184
200
|
offsetTop,
|
|
185
201
|
offsetBottom
|
|
@@ -194,6 +210,7 @@ var createDefaultInteractionItem = () => {
|
|
|
194
210
|
duration: 600,
|
|
195
211
|
delay: 0,
|
|
196
212
|
replay: false,
|
|
213
|
+
easing: "easeIn",
|
|
197
214
|
interactionId: generateTempInteractionId()
|
|
198
215
|
});
|
|
199
216
|
};
|
|
@@ -377,6 +394,7 @@ var DEFAULT_VALUES = {
|
|
|
377
394
|
duration: 600,
|
|
378
395
|
delay: 0,
|
|
379
396
|
replay: false,
|
|
397
|
+
easing: "easeIn",
|
|
380
398
|
relativeTo: "viewport",
|
|
381
399
|
offsetTop: 15,
|
|
382
400
|
offsetBottom: 85
|
|
@@ -412,6 +430,7 @@ var InteractionDetails = ({ interaction, onChange, onPlayInteraction }) => {
|
|
|
412
430
|
const duration = extractNumber(interaction.animation.value.timing_config.value.duration, DEFAULT_VALUES.duration);
|
|
413
431
|
const delay = extractNumber(interaction.animation.value.timing_config.value.delay, DEFAULT_VALUES.delay);
|
|
414
432
|
const replay = extractBoolean(interaction.animation.value.config?.value.replay, DEFAULT_VALUES.replay);
|
|
433
|
+
const easing = extractString(interaction.animation.value.config?.value.easing, DEFAULT_VALUES.easing);
|
|
415
434
|
const relativeTo = extractString(interaction.animation.value.config?.value.relativeTo, DEFAULT_VALUES.relativeTo);
|
|
416
435
|
const offsetTop = extractNumber(interaction.animation.value.config?.value.offsetTop, DEFAULT_VALUES.offsetTop);
|
|
417
436
|
const offsetBottom = extractNumber(
|
|
@@ -425,6 +444,7 @@ var InteractionDetails = ({ interaction, onChange, onPlayInteraction }) => {
|
|
|
425
444
|
direction,
|
|
426
445
|
duration,
|
|
427
446
|
delay,
|
|
447
|
+
easing,
|
|
428
448
|
replay,
|
|
429
449
|
relativeTo,
|
|
430
450
|
offsetTop,
|
|
@@ -441,6 +461,7 @@ var InteractionDetails = ({ interaction, onChange, onPlayInteraction }) => {
|
|
|
441
461
|
"offsetBottom",
|
|
442
462
|
controlVisibilityConfig.offsetBottom(interactionValues)
|
|
443
463
|
);
|
|
464
|
+
const EasingControl = useControlComponent("easing");
|
|
444
465
|
const resolveDirection = (hasDirection, newEffect, newDirection) => {
|
|
445
466
|
if (newEffect === "slide" && !newDirection) {
|
|
446
467
|
return "top";
|
|
@@ -452,7 +473,6 @@ var InteractionDetails = ({ interaction, onChange, onPlayInteraction }) => {
|
|
|
452
473
|
};
|
|
453
474
|
const updateInteraction = (updates) => {
|
|
454
475
|
const resolvedDirectionValue = resolveDirection("direction" in updates, updates.effect, updates.direction);
|
|
455
|
-
const newReplay = updates.replay !== void 0 ? updates.replay : replay;
|
|
456
476
|
const updatedInteraction = {
|
|
457
477
|
...interaction,
|
|
458
478
|
interaction_id: interaction.interaction_id,
|
|
@@ -463,7 +483,8 @@ var InteractionDetails = ({ interaction, onChange, onPlayInteraction }) => {
|
|
|
463
483
|
direction: resolvedDirectionValue,
|
|
464
484
|
duration: updates.duration ?? duration,
|
|
465
485
|
delay: updates.delay ?? delay,
|
|
466
|
-
replay:
|
|
486
|
+
replay: updates.replay ?? replay,
|
|
487
|
+
easing: updates.easing ?? easing,
|
|
467
488
|
relativeTo: updates.relativeTo ?? relativeTo,
|
|
468
489
|
offsetTop: updates.offsetTop ?? offsetTop,
|
|
469
490
|
offsetBottom: updates.offsetBottom ?? offsetBottom
|
|
@@ -521,7 +542,15 @@ var InteractionDetails = ({ interaction, onChange, onPlayInteraction }) => {
|
|
|
521
542
|
value: String(offsetBottom),
|
|
522
543
|
onChange: (v) => updateInteraction({ offsetBottom: parseInt(v, 10) })
|
|
523
544
|
}
|
|
524
|
-
))), /* @__PURE__ */ React8.createElement(Divider, null)))
|
|
545
|
+
))), /* @__PURE__ */ React8.createElement(Divider, null)), EasingControl && /* @__PURE__ */ React8.createElement(Grid, { container: true, spacing: 1.5 }, /* @__PURE__ */ React8.createElement(Field, { label: __5("Easing", "elementor") }, /* @__PURE__ */ React8.createElement(
|
|
546
|
+
EasingControl,
|
|
547
|
+
{
|
|
548
|
+
value: easing,
|
|
549
|
+
onChange: (v) => {
|
|
550
|
+
updateInteraction({ easing: v });
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
))));
|
|
525
554
|
};
|
|
526
555
|
function Field({ label, children }) {
|
|
527
556
|
return /* @__PURE__ */ React8.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React8.createElement(PopoverGridContainer, null, /* @__PURE__ */ React8.createElement(Grid, { item: true, xs: 6 }, /* @__PURE__ */ React8.createElement(ControlFormLabel, null, label)), /* @__PURE__ */ React8.createElement(Grid, { item: true, xs: 6 }, children)));
|
|
@@ -799,21 +828,48 @@ var documentElementsInteractionsProvider = createInteractionsProvider({
|
|
|
799
828
|
}
|
|
800
829
|
});
|
|
801
830
|
|
|
802
|
-
// src/components/controls/
|
|
831
|
+
// src/components/controls/easing.tsx
|
|
803
832
|
import * as React11 from "react";
|
|
804
833
|
import { MenuListItem as MenuListItem2 } from "@elementor/editor-ui";
|
|
805
834
|
import { Select as Select2 } from "@elementor/ui";
|
|
806
835
|
import { __ as __7 } from "@wordpress/i18n";
|
|
836
|
+
var EASING_OPTIONS = {
|
|
837
|
+
easeIn: __7("Ease In", "elementor"),
|
|
838
|
+
easeInOut: __7("Ease In Out", "elementor"),
|
|
839
|
+
easeOut: __7("Ease Out", "elementor"),
|
|
840
|
+
backIn: __7("Back In", "elementor"),
|
|
841
|
+
backInOut: __7("Back In Out", "elementor"),
|
|
842
|
+
backOut: __7("Back Out", "elementor"),
|
|
843
|
+
linear: __7("Linear", "elementor")
|
|
844
|
+
};
|
|
845
|
+
var DEFAULT_EASING = "easeIn";
|
|
846
|
+
function Easing({}) {
|
|
847
|
+
const availableOptions = Object.entries(EASING_OPTIONS).map(([key, label]) => ({
|
|
848
|
+
key,
|
|
849
|
+
label
|
|
850
|
+
}));
|
|
851
|
+
return /* @__PURE__ */ React11.createElement(Select2, { value: DEFAULT_EASING, onChange: () => {
|
|
852
|
+
}, fullWidth: true, displayEmpty: true, size: "tiny" }, availableOptions.map((option) => {
|
|
853
|
+
const isDisabled = DEFAULT_EASING !== option.key;
|
|
854
|
+
return /* @__PURE__ */ React11.createElement(MenuListItem2, { key: option.key, value: option.key, disabled: isDisabled }, option.label);
|
|
855
|
+
}));
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
// src/components/controls/trigger.tsx
|
|
859
|
+
import * as React12 from "react";
|
|
860
|
+
import { MenuListItem as MenuListItem3 } from "@elementor/editor-ui";
|
|
861
|
+
import { Select as Select3 } from "@elementor/ui";
|
|
862
|
+
import { __ as __8 } from "@wordpress/i18n";
|
|
807
863
|
function Trigger({ value, onChange }) {
|
|
808
864
|
const availableTriggers = Object.entries({
|
|
809
|
-
load:
|
|
810
|
-
scrollIn:
|
|
865
|
+
load: __8("Page load", "elementor"),
|
|
866
|
+
scrollIn: __8("Scroll into view", "elementor")
|
|
811
867
|
}).map(([key, label]) => ({
|
|
812
868
|
key,
|
|
813
869
|
label
|
|
814
870
|
}));
|
|
815
|
-
return /* @__PURE__ */
|
|
816
|
-
|
|
871
|
+
return /* @__PURE__ */ React12.createElement(
|
|
872
|
+
Select3,
|
|
817
873
|
{
|
|
818
874
|
fullWidth: true,
|
|
819
875
|
displayEmpty: true,
|
|
@@ -822,7 +878,7 @@ function Trigger({ value, onChange }) {
|
|
|
822
878
|
value
|
|
823
879
|
},
|
|
824
880
|
availableTriggers.map((trigger) => {
|
|
825
|
-
return /* @__PURE__ */
|
|
881
|
+
return /* @__PURE__ */ React12.createElement(MenuListItem3, { key: trigger.key, value: trigger.key }, trigger.label);
|
|
826
882
|
})
|
|
827
883
|
);
|
|
828
884
|
}
|
|
@@ -875,6 +931,11 @@ function init() {
|
|
|
875
931
|
component: Trigger,
|
|
876
932
|
options: ["load", "scrollIn"]
|
|
877
933
|
});
|
|
934
|
+
registerInteractionsControl({
|
|
935
|
+
type: "easing",
|
|
936
|
+
component: Easing,
|
|
937
|
+
options: ["easeIn"]
|
|
938
|
+
});
|
|
878
939
|
} catch (error) {
|
|
879
940
|
throw error;
|
|
880
941
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/empty-state.tsx","../src/components/interactions-tab.tsx","../src/contexts/interactions-context.tsx","../src/contexts/popup-state-context.tsx","../src/components/interactions-list.tsx","../src/utils/temp-id-utils.ts","../src/utils/prop-value-utils.ts","../src/components/interaction-details.tsx","../src/interactions-controls-registry.ts","../src/components/controls/direction.tsx","../src/components/controls/effect.tsx","../src/components/controls/effect-type.tsx","../src/components/controls/time-frame-indicator.tsx","../src/utils/get-interactions-config.ts","../src/utils/create-interactions-repository.ts","../src/interactions-repository.ts","../src/utils/create-interactions-provider.ts","../src/providers/document-elements-interactions-provider.ts","../src/components/controls/trigger.tsx","../src/hooks/on-duplicate.ts","../src/init.ts"],"sourcesContent":["import * as React from 'react';\nimport { SwipeIcon } from '@elementor/icons';\nimport { Button, Stack, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nexport const EmptyState = ( { onCreateInteraction }: { onCreateInteraction: () => void } ) => {\n\treturn (\n\t\t<Stack\n\t\t\talignItems=\"center\"\n\t\t\tjustifyContent=\"center\"\n\t\t\theight=\"100%\"\n\t\t\tcolor=\"text.secondary\"\n\t\t\tsx={ { p: 2.5, pt: 8, pb: 5.5 } }\n\t\t\tgap={ 1.5 }\n\t\t>\n\t\t\t<SwipeIcon fontSize=\"large\" />\n\n\t\t\t<Typography align=\"center\" variant=\"subtitle2\">\n\t\t\t\t{ __( 'Animate elements with Interactions', 'elementor' ) }\n\t\t\t</Typography>\n\n\t\t\t<Typography align=\"center\" variant=\"caption\" maxWidth=\"170px\">\n\t\t\t\t{ __(\n\t\t\t\t\t'Add entrance animations and effects triggered by user interactions such as page load or scroll.',\n\t\t\t\t\t'elementor'\n\t\t\t\t) }\n\t\t\t</Typography>\n\n\t\t\t<Button variant=\"outlined\" color=\"secondary\" size=\"small\" sx={ { mt: 1 } } onClick={ onCreateInteraction }>\n\t\t\t\t{ __( 'Create an interaction', 'elementor' ) }\n\t\t\t</Button>\n\t\t</Stack>\n\t);\n};\n","import * as React from 'react';\nimport { useCallback, useState } from 'react';\nimport { useElementInteractions } from '@elementor/editor-elements';\nimport { SessionStorageProvider } from '@elementor/session';\nimport { Stack } from '@elementor/ui';\n\nimport { InteractionsProvider, useInteractionsContext } from '../contexts/interactions-context';\nimport { PopupStateProvider } from '../contexts/popup-state-context';\nimport type { ElementInteractions } from '../types';\nimport { EmptyState } from './empty-state';\nimport { InteractionsList } from './interactions-list';\n\nexport const InteractionsTab = ( { elementId }: { elementId: string } ) => {\n\treturn (\n\t\t<PopupStateProvider>\n\t\t\t<InteractionsTabContent elementId={ elementId } />\n\t\t</PopupStateProvider>\n\t);\n};\n\nfunction InteractionsTabContent( { elementId }: { elementId: string } ) {\n\tconst existingInteractions = useElementInteractions( elementId ) as unknown as ElementInteractions | undefined;\n\tconst firstInteractionState = useState< boolean >( false );\n\tconst hasInteractions = existingInteractions?.items?.length || firstInteractionState[ 0 ];\n\n\treturn (\n\t\t<SessionStorageProvider prefix={ elementId }>\n\t\t\t{ hasInteractions ? (\n\t\t\t\t<InteractionsProvider elementId={ elementId }>\n\t\t\t\t\t<InteractionsContent firstInteractionState={ firstInteractionState } />\n\t\t\t\t</InteractionsProvider>\n\t\t\t) : (\n\t\t\t\t<EmptyState\n\t\t\t\t\tonCreateInteraction={ () => {\n\t\t\t\t\t\tfirstInteractionState[ 1 ]( true );\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</SessionStorageProvider>\n\t);\n}\n\nfunction InteractionsContent( {\n\tfirstInteractionState,\n}: {\n\tfirstInteractionState: [ boolean, ( value: boolean ) => void ];\n} ) {\n\tconst { interactions, setInteractions, playInteractions } = useInteractionsContext();\n\n\tconst applyInteraction = useCallback(\n\t\t( newInteractions: ElementInteractions ) => {\n\t\t\tfirstInteractionState[ 1 ]( false );\n\t\t\tif ( ! newInteractions ) {\n\t\t\t\tsetInteractions( undefined );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetInteractions( newInteractions );\n\t\t},\n\t\t[ setInteractions, firstInteractionState ]\n\t);\n\n\treturn (\n\t\t<Stack sx={ { m: 1, p: 1.5 } } gap={ 2 }>\n\t\t\t<InteractionsList\n\t\t\t\ttriggerCreateOnShowEmpty={ firstInteractionState[ 0 ] }\n\t\t\t\tinteractions={ interactions }\n\t\t\t\tonSelectInteractions={ applyInteraction }\n\t\t\t\tonPlayInteraction={ playInteractions }\n\t\t\t/>\n\t\t</Stack>\n\t);\n}\n","import * as React from 'react';\nimport { createContext, type ReactNode, useContext, useEffect } from 'react';\nimport {\n\ttype ElementInteractions,\n\tplayElementInteractions,\n\tupdateElementInteractions,\n\tuseElementInteractions,\n} from '@elementor/editor-elements';\n\ntype InteractionsContextValue = {\n\tinteractions: ElementInteractions;\n\tsetInteractions: ( value: ElementInteractions | undefined ) => void;\n\tplayInteractions: ( interactionId: string ) => void;\n};\n\nconst InteractionsContext = createContext< InteractionsContextValue | null >( null );\n\nconst DEFAULT_INTERACTIONS: ElementInteractions = {\n\tversion: 1,\n\titems: [],\n};\n\nexport const InteractionsProvider = ( { children, elementId }: { children: ReactNode; elementId: string } ) => {\n\tconst rawInteractions = useElementInteractions( elementId );\n\n\tuseEffect( () => {\n\t\twindow.dispatchEvent( new CustomEvent( 'elementor/element/update_interactions' ) );\n\t}, [] );\n\n\tconst interactions: ElementInteractions =\n\t\t( rawInteractions as unknown as ElementInteractions ) ?? DEFAULT_INTERACTIONS;\n\n\tconst setInteractions = ( value: ElementInteractions | undefined ) => {\n\t\tconst normalizedValue = value && value.items?.length === 0 ? undefined : value;\n\n\t\tupdateElementInteractions( {\n\t\t\telementId,\n\t\t\tinteractions: normalizedValue,\n\t\t} );\n\t};\n\n\tconst playInteractions = ( interactionId: string ) => {\n\t\tplayElementInteractions( elementId, interactionId );\n\t};\n\n\tconst contextValue: InteractionsContextValue = {\n\t\tinteractions,\n\t\tsetInteractions,\n\t\tplayInteractions,\n\t};\n\n\treturn <InteractionsContext.Provider value={ contextValue }>{ children }</InteractionsContext.Provider>;\n};\n\nexport const useInteractionsContext = () => {\n\tconst context = useContext( InteractionsContext );\n\tif ( ! context ) {\n\t\tthrow new Error( 'useInteractionsContext must be used within InteractionsProvider' );\n\t}\n\treturn context;\n};\n","import * as React from 'react';\nimport { createContext, useCallback, useContext, useState } from 'react';\n\ntype PopupStateContextType = {\n\topenByDefault: boolean;\n\ttriggerDefaultOpen: () => void;\n\tresetDefaultOpen: () => void;\n};\n\nconst PopupStateContext = createContext< PopupStateContextType | undefined >( undefined );\n\nexport const PopupStateProvider = ( { children }: { children: React.ReactNode } ) => {\n\tconst [ openByDefault, setOpenByDefault ] = useState( false );\n\n\tconst triggerDefaultOpen = useCallback( () => {\n\t\tsetOpenByDefault( true );\n\t}, [] );\n\n\tconst resetDefaultOpen = useCallback( () => {\n\t\tsetOpenByDefault( false );\n\t}, [] );\n\n\treturn (\n\t\t<PopupStateContext.Provider value={ { openByDefault, triggerDefaultOpen, resetDefaultOpen } }>\n\t\t\t{ children }\n\t\t</PopupStateContext.Provider>\n\t);\n};\n\nexport const usePopupStateContext = () => {\n\tconst context = useContext( PopupStateContext );\n\tif ( ! context ) {\n\t\tthrow new Error( 'usePopupStateContext must be used within PopupStateProvider' );\n\t}\n\treturn context;\n};\n","import * as React from 'react';\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef } from 'react';\nimport { Repeater } from '@elementor/editor-controls';\nimport { InfoCircleFilledIcon, PlayerPlayIcon } from '@elementor/icons';\nimport { Alert, AlertTitle, Box, IconButton, Tooltip } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport type { ElementInteractions, InteractionItemPropValue, InteractionItemValue } from '../types';\nimport { buildDisplayLabel, createDefaultInteractionItem, extractString } from '../utils/prop-value-utils';\nimport { InteractionDetails } from './interaction-details';\nexport const MAX_NUMBER_OF_INTERACTIONS = 5;\n\nexport type InteractionListProps = {\n\tonSelectInteractions: ( interactions: ElementInteractions ) => void;\n\tinteractions: ElementInteractions;\n\tonPlayInteraction: ( interactionId: string ) => void;\n\ttriggerCreateOnShowEmpty?: boolean;\n};\n\ntype InteractionItemContextValue = {\n\tonInteractionChange: ( index: number, newInteractionValue: InteractionItemValue ) => void;\n\tonPlayInteraction: ( interactionId: string ) => void;\n};\n\nconst InteractionItemContext = createContext< InteractionItemContextValue | null >( null );\n\nexport function InteractionsList( props: InteractionListProps ) {\n\tconst { interactions, onSelectInteractions, onPlayInteraction, triggerCreateOnShowEmpty } = props;\n\n\tconst hasInitializedRef = useRef( false );\n\n\tconst handleUpdateInteractions = useCallback(\n\t\t( newInteractions: ElementInteractions ) => {\n\t\t\tonSelectInteractions( newInteractions );\n\t\t},\n\t\t[ onSelectInteractions ]\n\t);\n\n\tuseEffect( () => {\n\t\tif (\n\t\t\ttriggerCreateOnShowEmpty &&\n\t\t\t! hasInitializedRef.current &&\n\t\t\t( ! interactions.items || interactions.items?.length === 0 )\n\t\t) {\n\t\t\thasInitializedRef.current = true;\n\t\t\tconst newState: ElementInteractions = {\n\t\t\t\tversion: 1,\n\t\t\t\titems: [ createDefaultInteractionItem() ],\n\t\t\t};\n\t\t\thandleUpdateInteractions( newState );\n\t\t}\n\t}, [ triggerCreateOnShowEmpty, interactions.items, handleUpdateInteractions ] );\n\n\tconst isMaxNumberOfInteractionsReached = useMemo( () => {\n\t\treturn interactions.items?.length >= MAX_NUMBER_OF_INTERACTIONS;\n\t}, [ interactions.items?.length ] );\n\n\tconst infotipContent = isMaxNumberOfInteractionsReached ? (\n\t\t<Alert color=\"secondary\" icon={ <InfoCircleFilledIcon /> } size=\"small\">\n\t\t\t<AlertTitle>{ __( 'Interactions', 'elementor' ) }</AlertTitle>\n\t\t\t<Box component=\"span\">\n\t\t\t\t{ __(\n\t\t\t\t\t\"You've reached the limit of 5 interactions for this element. Please remove an interaction before creating a new one.\",\n\t\t\t\t\t'elementor'\n\t\t\t\t) }\n\t\t\t</Box>\n\t\t</Alert>\n\t) : undefined;\n\n\tconst handleRepeaterChange = useCallback(\n\t\t( newItems: ElementInteractions[ 'items' ] ) => {\n\t\t\thandleUpdateInteractions( {\n\t\t\t\t...interactions,\n\t\t\t\titems: newItems,\n\t\t\t} );\n\t\t},\n\t\t[ interactions, handleUpdateInteractions ]\n\t);\n\n\tconst handleInteractionChange = useCallback(\n\t\t( index: number, newInteractionValue: InteractionItemValue ) => {\n\t\t\tconst newItems = structuredClone( interactions.items );\n\t\t\tnewItems[ index ] = {\n\t\t\t\t$$type: 'interaction-item',\n\t\t\t\tvalue: newInteractionValue,\n\t\t\t};\n\t\t\thandleUpdateInteractions( {\n\t\t\t\t...interactions,\n\t\t\t\titems: newItems,\n\t\t\t} );\n\t\t},\n\t\t[ interactions, handleUpdateInteractions ]\n\t);\n\n\tconst contextValue = useMemo(\n\t\t() => ( {\n\t\t\tonInteractionChange: handleInteractionChange,\n\t\t\tonPlayInteraction,\n\t\t} ),\n\t\t[ handleInteractionChange, onPlayInteraction ]\n\t);\n\n\treturn (\n\t\t<InteractionItemContext.Provider value={ contextValue }>\n\t\t\t<Repeater\n\t\t\t\topenOnAdd\n\t\t\t\topenItem={ triggerCreateOnShowEmpty ? 0 : undefined }\n\t\t\t\tlabel={ __( 'Interactions', 'elementor' ) }\n\t\t\t\tvalues={ interactions.items }\n\t\t\t\tsetValues={ handleRepeaterChange }\n\t\t\t\tshowDuplicate={ false }\n\t\t\t\tshowToggle={ false }\n\t\t\t\tisSortable={ false }\n\t\t\t\tdisableAddItemButton={ isMaxNumberOfInteractionsReached }\n\t\t\t\taddButtonInfotipContent={ infotipContent }\n\t\t\t\titemSettings={ {\n\t\t\t\t\tinitialValues: createDefaultInteractionItem(),\n\t\t\t\t\tLabel: ( { value }: { value: InteractionItemPropValue } ) => buildDisplayLabel( value.value ),\n\t\t\t\t\tIcon: () => null,\n\t\t\t\t\tContent,\n\t\t\t\t\tactions: ( value: InteractionItemPropValue ) => (\n\t\t\t\t\t\t<Tooltip key=\"preview\" placement=\"top\" title={ __( 'Preview', 'elementor' ) }>\n\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\taria-label={ __( 'Play interaction', 'elementor' ) }\n\t\t\t\t\t\t\t\tsize=\"tiny\"\n\t\t\t\t\t\t\t\tonClick={ () => onPlayInteraction( extractString( value.value.interaction_id ) ) }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<PlayerPlayIcon fontSize=\"tiny\" />\n\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t),\n\t\t\t\t} }\n\t\t\t/>\n\t\t</InteractionItemContext.Provider>\n\t);\n}\n\nconst Content = ( { index, value }: { index: number; value: InteractionItemPropValue } ) => {\n\tconst context = useContext( InteractionItemContext );\n\n\tconst handleChange = useCallback(\n\t\t( newInteractionValue: InteractionItemValue ) => {\n\t\t\tcontext?.onInteractionChange( index, newInteractionValue );\n\t\t},\n\t\t[ context, index ]\n\t);\n\n\tconst handlePlayInteraction = useCallback(\n\t\t( interactionId: string ) => {\n\t\t\tcontext?.onPlayInteraction( interactionId );\n\t\t},\n\t\t[ context ]\n\t);\n\n\treturn (\n\t\t<InteractionDetails\n\t\t\tkey={ index }\n\t\t\tinteraction={ value.value }\n\t\t\tonChange={ handleChange }\n\t\t\tonPlayInteraction={ handlePlayInteraction }\n\t\t/>\n\t);\n};\n","const TEMP_ID_PREFIX = 'temp-';\nconst TEMP_ID_REGEX = /^temp-[a-z0-9]+$/i;\n\nexport function generateTempInteractionId(): string {\n\treturn `${ TEMP_ID_PREFIX }${ Math.random().toString( 36 ).substring( 2, 11 ) }`;\n}\n\nexport function isTempId( id: string | undefined ): boolean {\n\treturn !! id && TEMP_ID_REGEX.test( id );\n}\n","import type {\n\tAnimationPresetPropValue,\n\tBooleanPropValue,\n\tConfigPropValue,\n\tElementInteractions,\n\tInteractionItemPropValue,\n\tInteractionItemValue,\n\tNumberPropValue,\n\tStringPropValue,\n\tTimingConfigPropValue,\n} from '../types';\nimport { generateTempInteractionId } from './temp-id-utils';\n\nexport const createString = ( value: string ): StringPropValue => ( {\n\t$$type: 'string',\n\tvalue,\n} );\n\nexport const createNumber = ( value: number ): NumberPropValue => ( {\n\t$$type: 'number',\n\tvalue,\n} );\n\nexport const createTimingConfig = ( duration: number, delay: number ): TimingConfigPropValue => ( {\n\t$$type: 'timing-config',\n\tvalue: {\n\t\tduration: createNumber( duration ),\n\t\tdelay: createNumber( delay ),\n\t},\n} );\n\nexport const createBoolean = ( value: boolean ): BooleanPropValue => ( {\n\t$$type: 'boolean',\n\tvalue,\n} );\n\nexport const createConfig = (\n\treplay: boolean,\n\trelativeTo?: string,\n\toffsetTop?: number,\n\toffsetBottom?: number\n): ConfigPropValue => ( {\n\t$$type: 'config',\n\tvalue: {\n\t\treplay: createBoolean( replay ),\n\t\trelativeTo: createString( relativeTo ?? '' ),\n\t\toffsetTop: createNumber( offsetTop ?? 0 ),\n\t\toffsetBottom: createNumber( offsetBottom ?? 100 ),\n\t},\n} );\n\nexport const extractBoolean = ( prop: BooleanPropValue | undefined, fallback = false ): boolean => {\n\treturn prop?.value ?? fallback;\n};\n\nexport const createAnimationPreset = ( {\n\teffect,\n\ttype,\n\tdirection,\n\tduration,\n\tdelay,\n\treplay = false,\n\trelativeTo,\n\toffsetTop,\n\toffsetBottom,\n}: {\n\teffect: string;\n\ttype: string;\n\tdirection?: string;\n\tduration: number;\n\tdelay: number;\n\treplay: boolean;\n\trelativeTo?: string;\n\toffsetTop?: number;\n\toffsetBottom?: number;\n} ): AnimationPresetPropValue => ( {\n\t$$type: 'animation-preset-props',\n\tvalue: {\n\t\teffect: createString( effect ),\n\t\ttype: createString( type ),\n\t\tdirection: createString( direction ?? '' ),\n\t\ttiming_config: createTimingConfig( duration, delay ),\n\t\tconfig: createConfig( replay, relativeTo, offsetTop, offsetBottom ),\n\t},\n} );\n\nexport const createInteractionItem = ( {\n\ttrigger,\n\teffect,\n\ttype,\n\tdirection,\n\tduration,\n\tdelay,\n\tinteractionId,\n\treplay = false,\n\trelativeTo,\n\toffsetTop,\n\toffsetBottom,\n}: {\n\ttrigger: string;\n\teffect: string;\n\ttype: string;\n\tdirection?: string;\n\tduration: number;\n\tdelay: number;\n\tinteractionId?: string;\n\treplay: boolean;\n\trelativeTo?: string;\n\toffsetTop?: number;\n\toffsetBottom?: number;\n} ): InteractionItemPropValue => ( {\n\t$$type: 'interaction-item',\n\tvalue: {\n\t\t...( interactionId && { interaction_id: createString( interactionId ) } ),\n\t\ttrigger: createString( trigger ),\n\t\tanimation: createAnimationPreset( {\n\t\t\teffect,\n\t\t\ttype,\n\t\t\tdirection,\n\t\t\tduration,\n\t\t\tdelay,\n\t\t\treplay,\n\t\t\trelativeTo,\n\t\t\toffsetTop,\n\t\t\toffsetBottom,\n\t\t} ),\n\t},\n} );\n\nexport const createDefaultInteractionItem = (): InteractionItemPropValue => {\n\treturn createInteractionItem( {\n\t\ttrigger: 'load',\n\t\teffect: 'fade',\n\t\ttype: 'in',\n\t\tduration: 600,\n\t\tdelay: 0,\n\t\treplay: false,\n\t\tinteractionId: generateTempInteractionId(),\n\t} );\n};\n\nexport const createDefaultInteractions = (): ElementInteractions => ( {\n\tversion: 1,\n\titems: [ createDefaultInteractionItem() ],\n} );\n\nexport const extractString = ( prop: StringPropValue | undefined, fallback = '' ): string => {\n\treturn prop?.value ?? fallback;\n};\n\nexport const extractNumber = ( prop: NumberPropValue | undefined, fallback = 0 ): number => {\n\treturn prop?.value ?? fallback;\n};\n\nconst TRIGGER_LABELS: Record< string, string > = {\n\tload: 'On page load',\n\tscrollIn: 'Scroll into view',\n\tscrollOut: 'Scroll out of view',\n\tscrollOn: 'While scrolling',\n};\n\nconst capitalize = ( str: string ): string => {\n\treturn str.charAt( 0 ).toUpperCase() + str.slice( 1 );\n};\n\nexport const buildDisplayLabel = ( item: InteractionItemValue ): string => {\n\tconst trigger = extractString( item.trigger );\n\tconst effect = extractString( item.animation.value.effect );\n\tconst type = extractString( item.animation.value.type );\n\n\tconst triggerLabel = TRIGGER_LABELS[ trigger ] || capitalize( trigger );\n\tconst effectLabel = capitalize( effect );\n\tconst typeLabel = capitalize( type );\n\n\treturn `${ triggerLabel }: ${ effectLabel } ${ typeLabel }`;\n};\n","import * as React from 'react';\nimport { type PropsWithChildren, useMemo } from 'react';\nimport { ControlFormLabel, PopoverContent, PopoverGridContainer } from '@elementor/editor-controls';\nimport { Divider, Grid } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { getInteractionsControl } from '../interactions-controls-registry';\nimport type { InteractionItemValue } from '../types';\nimport {\n\tcreateAnimationPreset,\n\tcreateString,\n\textractBoolean,\n\textractNumber,\n\textractString,\n} from '../utils/prop-value-utils';\nimport { Direction } from './controls/direction';\nimport { Effect } from './controls/effect';\nimport { EffectType } from './controls/effect-type';\nimport { TimeFrameIndicator } from './controls/time-frame-indicator';\n\ntype InteractionDetailsProps = {\n\tinteraction: InteractionItemValue;\n\tonChange: ( interaction: InteractionItemValue ) => void;\n\tonPlayInteraction: ( interactionId: string ) => void;\n};\n\nconst DEFAULT_VALUES = {\n\ttrigger: 'load',\n\teffect: 'fade',\n\ttype: 'in',\n\tdirection: '',\n\tduration: 600,\n\tdelay: 0,\n\treplay: false,\n\trelativeTo: 'viewport',\n\toffsetTop: 15,\n\toffsetBottom: 85,\n};\n\nconst TRIGGERS_WITHOUT_REPLAY = [ 'load', 'scrollOn' ];\n\ntype InteractionsControlType =\n\t| 'trigger'\n\t| 'effect'\n\t| 'effectType'\n\t| 'direction'\n\t| 'duration'\n\t| 'delay'\n\t| 'replay'\n\t| 'relativeTo'\n\t| 'offsetTop'\n\t| 'offsetBottom';\n\ntype InteractionValues = {\n\ttrigger: string;\n\teffect: string;\n\ttype: string;\n\tdirection: string;\n\tduration: number;\n\tdelay: number;\n\treplay: boolean;\n\trelativeTo: string;\n\toffsetTop: number;\n\toffsetBottom: number;\n};\n\ntype ControlVisibilityConfig = {\n\t[ key: string ]: ( values: InteractionValues ) => boolean;\n};\n\nconst controlVisibilityConfig: ControlVisibilityConfig = {\n\treplay: ( values ) => ! TRIGGERS_WITHOUT_REPLAY.includes( values.trigger ),\n\n\trelativeTo: ( values ) => values.trigger === 'scrollOn',\n\toffsetTop: ( values ) => values.trigger === 'scrollOn',\n\toffsetBottom: ( values ) => values.trigger === 'scrollOn',\n\n\tduration: ( values ) => {\n\t\tconst isRelativeToVisible = values.trigger === 'scrollOn';\n\t\treturn ! isRelativeToVisible;\n\t},\n\tdelay: ( values ) => {\n\t\tconst isRelativeToVisible = values.trigger === 'scrollOn';\n\t\treturn ! isRelativeToVisible;\n\t},\n};\n\nfunction useControlComponent( controlName: InteractionsControlType, isVisible: boolean = true ) {\n\treturn useMemo( () => {\n\t\tif ( ! isVisible ) {\n\t\t\treturn null;\n\t\t}\n\t\treturn getInteractionsControl( controlName )?.component ?? null;\n\t}, [ controlName, isVisible ] );\n}\n\nexport const InteractionDetails = ( { interaction, onChange, onPlayInteraction }: InteractionDetailsProps ) => {\n\tconst trigger = extractString( interaction.trigger, DEFAULT_VALUES.trigger );\n\tconst effect = extractString( interaction.animation.value.effect, DEFAULT_VALUES.effect );\n\tconst type = extractString( interaction.animation.value.type, DEFAULT_VALUES.type );\n\tconst direction = extractString( interaction.animation.value.direction, DEFAULT_VALUES.direction );\n\tconst duration = extractNumber( interaction.animation.value.timing_config.value.duration, DEFAULT_VALUES.duration );\n\tconst delay = extractNumber( interaction.animation.value.timing_config.value.delay, DEFAULT_VALUES.delay );\n\tconst replay = extractBoolean( interaction.animation.value.config?.value.replay, DEFAULT_VALUES.replay );\n\tconst relativeTo = extractString( interaction.animation.value.config?.value.relativeTo, DEFAULT_VALUES.relativeTo );\n\tconst offsetTop = extractNumber( interaction.animation.value.config?.value.offsetTop, DEFAULT_VALUES.offsetTop );\n\tconst offsetBottom = extractNumber(\n\t\tinteraction.animation.value.config?.value.offsetBottom,\n\t\tDEFAULT_VALUES.offsetBottom\n\t);\n\n\tconst interactionValues = {\n\t\ttrigger,\n\t\teffect,\n\t\ttype,\n\t\tdirection,\n\t\tduration,\n\t\tdelay,\n\t\treplay,\n\t\trelativeTo,\n\t\toffsetTop,\n\t\toffsetBottom,\n\t};\n\n\tconst TriggerControl = useControlComponent( 'trigger', true );\n\tconst ReplayControl = useControlComponent( 'replay', controlVisibilityConfig.replay( interactionValues ) );\n\tconst RelativeToControl = useControlComponent(\n\t\t'relativeTo',\n\t\tcontrolVisibilityConfig.relativeTo( interactionValues )\n\t);\n\tconst OffsetTopControl = useControlComponent( 'offsetTop', controlVisibilityConfig.offsetTop( interactionValues ) );\n\tconst OffsetBottomControl = useControlComponent(\n\t\t'offsetBottom',\n\t\tcontrolVisibilityConfig.offsetBottom( interactionValues )\n\t);\n\n\tconst resolveDirection = ( hasDirection: boolean, newEffect?: string, newDirection?: string ) => {\n\t\tif ( newEffect === 'slide' && ! newDirection ) {\n\t\t\treturn 'top';\n\t\t}\n\t\t// Why? - New direction can be undefined when the effect is not slide, so if the updates object includes direction, we take it always!\n\t\tif ( hasDirection ) {\n\t\t\treturn newDirection;\n\t\t}\n\t\treturn direction;\n\t};\n\n\tconst updateInteraction = (\n\t\tupdates: Partial< {\n\t\t\ttrigger: string;\n\t\t\teffect: string;\n\t\t\ttype: string;\n\t\t\tdirection: string;\n\t\t\tduration: number;\n\t\t\tdelay: number;\n\t\t\treplay: boolean;\n\t\t\trelativeTo: string;\n\t\t\toffsetTop: number;\n\t\t\toffsetBottom: number;\n\t\t} >\n\t): void => {\n\t\tconst resolvedDirectionValue = resolveDirection( 'direction' in updates, updates.effect, updates.direction );\n\t\tconst newReplay = updates.replay !== undefined ? updates.replay : replay;\n\n\t\tconst updatedInteraction = {\n\t\t\t...interaction,\n\t\t\tinteraction_id: interaction.interaction_id,\n\t\t\ttrigger: createString( updates.trigger ?? trigger ),\n\t\t\tanimation: createAnimationPreset( {\n\t\t\t\teffect: updates.effect ?? effect,\n\t\t\t\ttype: updates.type ?? type,\n\t\t\t\tdirection: resolvedDirectionValue,\n\t\t\t\tduration: updates.duration ?? duration,\n\t\t\t\tdelay: updates.delay ?? delay,\n\t\t\t\treplay: newReplay,\n\t\t\t\trelativeTo: updates.relativeTo ?? relativeTo,\n\t\t\t\toffsetTop: updates.offsetTop ?? offsetTop,\n\t\t\t\toffsetBottom: updates.offsetBottom ?? offsetBottom,\n\t\t\t} ),\n\t\t};\n\n\t\tonChange( updatedInteraction );\n\n\t\tconst interactionId = extractString( updatedInteraction.interaction_id );\n\n\t\tsetTimeout( () => {\n\t\t\tonPlayInteraction( interactionId );\n\t\t}, 0 );\n\t};\n\n\treturn (\n\t\t<PopoverContent p={ 1.5 }>\n\t\t\t<Grid container spacing={ 1.5 }>\n\t\t\t\t{ TriggerControl && (\n\t\t\t\t\t<Field label={ __( 'Trigger', 'elementor' ) }>\n\t\t\t\t\t\t<TriggerControl value={ trigger } onChange={ ( v ) => updateInteraction( { trigger: v } ) } />\n\t\t\t\t\t</Field>\n\t\t\t\t) }\n\n\t\t\t\t{ ReplayControl && (\n\t\t\t\t\t<Field label={ __( 'Replay', 'elementor' ) }>\n\t\t\t\t\t\t<ReplayControl\n\t\t\t\t\t\t\tvalue={ replay }\n\t\t\t\t\t\t\tonChange={ ( v ) => updateInteraction( { replay: v } ) }\n\t\t\t\t\t\t\tdisabled={ true }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Field>\n\t\t\t\t) }\n\t\t\t</Grid>\n\n\t\t\t<Divider />\n\n\t\t\t<Grid container spacing={ 1.5 }>\n\t\t\t\t<Field label={ __( 'Effect', 'elementor' ) }>\n\t\t\t\t\t<Effect value={ effect } onChange={ ( v ) => updateInteraction( { effect: v } ) } />\n\t\t\t\t</Field>\n\n\t\t\t\t<Field label={ __( 'Type', 'elementor' ) }>\n\t\t\t\t\t<EffectType value={ type } onChange={ ( v ) => updateInteraction( { type: v } ) } />\n\t\t\t\t</Field>\n\n\t\t\t\t<Field label={ __( 'Direction', 'elementor' ) }>\n\t\t\t\t\t<Direction\n\t\t\t\t\t\tvalue={ direction }\n\t\t\t\t\t\tonChange={ ( v ) => updateInteraction( { direction: v } ) }\n\t\t\t\t\t\tinteractionType={ type }\n\t\t\t\t\t/>\n\t\t\t\t</Field>\n\n\t\t\t\t{ controlVisibilityConfig.duration( interactionValues ) && (\n\t\t\t\t\t<Field label={ __( 'Duration', 'elementor' ) }>\n\t\t\t\t\t\t<TimeFrameIndicator\n\t\t\t\t\t\t\tvalue={ String( duration ) }\n\t\t\t\t\t\t\tonChange={ ( v ) => updateInteraction( { duration: parseInt( v, 10 ) } ) }\n\t\t\t\t\t\t\tdefaultValue={ DEFAULT_VALUES.duration }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Field>\n\t\t\t\t) }\n\n\t\t\t\t{ controlVisibilityConfig.delay( interactionValues ) && (\n\t\t\t\t\t<Field label={ __( 'Delay', 'elementor' ) }>\n\t\t\t\t\t\t<TimeFrameIndicator\n\t\t\t\t\t\t\tvalue={ String( delay ) }\n\t\t\t\t\t\t\tonChange={ ( v ) => updateInteraction( { delay: parseInt( v, 10 ) } ) }\n\t\t\t\t\t\t\tdefaultValue={ DEFAULT_VALUES.delay }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Field>\n\t\t\t\t) }\n\t\t\t</Grid>\n\t\t\t{ controlVisibilityConfig.relativeTo( interactionValues ) && RelativeToControl && (\n\t\t\t\t<>\n\t\t\t\t\t<Divider />\n\t\t\t\t\t<Grid container spacing={ 1.5 }>\n\t\t\t\t\t\t<Field label={ __( 'Relative To', 'elementor' ) }>\n\t\t\t\t\t\t\t<RelativeToControl\n\t\t\t\t\t\t\t\tvalue={ relativeTo }\n\t\t\t\t\t\t\t\tonChange={ ( v ) => updateInteraction( { relativeTo: v } ) }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t{ OffsetTopControl && (\n\t\t\t\t\t\t\t<Field label={ __( 'Offset Top', 'elementor' ) }>\n\t\t\t\t\t\t\t\t<OffsetTopControl\n\t\t\t\t\t\t\t\t\tvalue={ String( offsetTop ) }\n\t\t\t\t\t\t\t\t\tonChange={ ( v: string ) => updateInteraction( { offsetTop: parseInt( v, 10 ) } ) }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t) }\n\t\t\t\t\t\t{ OffsetBottomControl && (\n\t\t\t\t\t\t\t<Field label={ __( 'Offset Bottom', 'elementor' ) }>\n\t\t\t\t\t\t\t\t<OffsetBottomControl\n\t\t\t\t\t\t\t\t\tvalue={ String( offsetBottom ) }\n\t\t\t\t\t\t\t\t\tonChange={ ( v: string ) =>\n\t\t\t\t\t\t\t\t\t\tupdateInteraction( { offsetBottom: parseInt( v, 10 ) } )\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t) }\n\t\t\t\t\t</Grid>\n\t\t\t\t\t<Divider />\n\t\t\t\t</>\n\t\t\t) }\n\t\t</PopoverContent>\n\t);\n};\n\ntype FieldProps = {\n\tlabel: string;\n} & PropsWithChildren;\n\nfunction Field( { label, children }: FieldProps ) {\n\treturn (\n\t\t<Grid item xs={ 12 }>\n\t\t\t<PopoverGridContainer>\n\t\t\t\t<Grid item xs={ 6 }>\n\t\t\t\t\t<ControlFormLabel>{ label }</ControlFormLabel>\n\t\t\t\t</Grid>\n\t\t\t\t<Grid item xs={ 6 }>\n\t\t\t\t\t{ children }\n\t\t\t\t</Grid>\n\t\t\t</PopoverGridContainer>\n\t\t</Grid>\n\t);\n}\n","import { type ComponentType } from 'react';\n\nimport { type DirectionFieldProps, type FieldProps, type ReplayFieldProps } from './types';\n\ntype InteractionsControlType =\n\t| 'trigger'\n\t| 'effect'\n\t| 'effectType'\n\t| 'direction'\n\t| 'duration'\n\t| 'delay'\n\t| 'replay'\n\t| 'relativeTo'\n\t| 'offsetTop'\n\t| 'offsetBottom';\n\ntype InteractionsControlPropsMap = {\n\ttrigger: FieldProps;\n\teffect: FieldProps;\n\teffectType: FieldProps;\n\tdirection: DirectionFieldProps;\n\tduration: FieldProps;\n\tdelay: FieldProps;\n\treplay: ReplayFieldProps;\n\trelativeTo: FieldProps;\n\toffsetTop: FieldProps;\n\toffsetBottom: FieldProps;\n};\n\ntype ControlOptions< T extends InteractionsControlType > = {\n\ttype: T;\n\tcomponent: ComponentType< InteractionsControlPropsMap[ T ] >;\n\toptions?: string[];\n};\n\ntype StoredControlOptions = {\n\ttype: InteractionsControlType;\n\tcomponent: ComponentType< FieldProps | DirectionFieldProps | ReplayFieldProps >;\n\toptions?: string[];\n};\n\nconst controlsRegistry = new Map< InteractionsControlType, StoredControlOptions >();\n\nexport function registerInteractionsControl< T extends InteractionsControlType >( {\n\ttype,\n\tcomponent,\n\toptions,\n}: ControlOptions< T > ) {\n\tcontrolsRegistry.set( type, { type, component: component as StoredControlOptions[ 'component' ], options } );\n}\n\nexport function getInteractionsControl( type: InteractionsControlType ) {\n\treturn controlsRegistry.get( type );\n}\n\nexport function getInteractionsControlOptions( type: InteractionsControlType ) {\n\treturn controlsRegistry.get( type )?.options ?? [];\n}\n","import * as React from 'react';\nimport { useMemo } from 'react';\nimport { type ToggleButtonGroupItem, ToggleButtonGroupUi } from '@elementor/editor-controls';\nimport { ArrowDownSmallIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpSmallIcon } from '@elementor/icons';\nimport { __ } from '@wordpress/i18n';\n\nimport { type DirectionFieldProps } from '../../types';\n\ntype Direction = 'top' | 'bottom' | 'left' | 'right';\n\nexport function Direction( { value, onChange, interactionType }: DirectionFieldProps ) {\n\tconst options: ToggleButtonGroupItem< Direction >[] = useMemo( () => {\n\t\tconst isIn = interactionType === 'in';\n\n\t\treturn [\n\t\t\t{\n\t\t\t\tvalue: 'top',\n\t\t\t\tlabel: isIn ? __( 'From top', 'elementor' ) : __( 'To top', 'elementor' ),\n\t\t\t\trenderContent: ( { size } ) =>\n\t\t\t\t\tisIn ? <ArrowDownSmallIcon fontSize={ size } /> : <ArrowUpSmallIcon fontSize={ size } />,\n\t\t\t\tshowTooltip: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tvalue: 'bottom',\n\t\t\t\tlabel: interactionType === 'in' ? __( 'From bottom', 'elementor' ) : __( 'To bottom', 'elementor' ),\n\t\t\t\trenderContent: ( { size } ) =>\n\t\t\t\t\tisIn ? <ArrowUpSmallIcon fontSize={ size } /> : <ArrowDownSmallIcon fontSize={ size } />,\n\t\t\t\tshowTooltip: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tvalue: 'left',\n\t\t\t\tlabel: interactionType === 'in' ? __( 'From left', 'elementor' ) : __( 'To left', 'elementor' ),\n\t\t\t\trenderContent: ( { size } ) =>\n\t\t\t\t\tisIn ? <ArrowRightIcon fontSize={ size } /> : <ArrowLeftIcon fontSize={ size } />,\n\t\t\t\tshowTooltip: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tvalue: 'right',\n\t\t\t\tlabel: interactionType === 'in' ? __( 'From right', 'elementor' ) : __( 'To right', 'elementor' ),\n\t\t\t\trenderContent: ( { size } ) =>\n\t\t\t\t\tisIn ? <ArrowLeftIcon fontSize={ size } /> : <ArrowRightIcon fontSize={ size } />,\n\t\t\t\tshowTooltip: true,\n\t\t\t},\n\t\t];\n\t}, [ interactionType ] );\n\n\treturn <ToggleButtonGroupUi items={ options } exclusive onChange={ onChange } value={ value } />;\n}\n","import * as React from 'react';\nimport { MenuListItem } from '@elementor/editor-ui';\nimport { Select, type SelectChangeEvent } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { type FieldProps } from '../../types';\n\nexport function Effect( { value, onChange }: FieldProps ) {\n\tconst availableEffects = [\n\t\t{ key: 'fade', label: __( 'Fade', 'elementor' ) },\n\t\t{ key: 'slide', label: __( 'Slide', 'elementor' ) },\n\t\t{ key: 'scale', label: __( 'Scale', 'elementor' ) },\n\t];\n\n\treturn (\n\t\t<Select\n\t\t\tfullWidth\n\t\t\tdisplayEmpty\n\t\t\tsize=\"tiny\"\n\t\t\tvalue={ value }\n\t\t\tonChange={ ( event: SelectChangeEvent< string > ) => onChange( event.target.value ) }\n\t\t>\n\t\t\t{ availableEffects.map( ( effect ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<MenuListItem key={ effect.key } value={ effect.key }>\n\t\t\t\t\t\t{ effect.label }\n\t\t\t\t\t</MenuListItem>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t</Select>\n\t);\n}\n","import * as React from 'react';\nimport { type ToggleButtonGroupItem, ToggleButtonGroupUi } from '@elementor/editor-controls';\nimport { __ } from '@wordpress/i18n';\n\nimport { type FieldProps } from '../../types';\n\ntype EffectType = 'in' | 'out';\n\nexport function EffectType( { value, onChange }: FieldProps ) {\n\tconst options: ToggleButtonGroupItem< EffectType >[] = [\n\t\t{\n\t\t\tvalue: 'in',\n\t\t\tlabel: __( 'In', 'elementor' ),\n\t\t\trenderContent: () => __( 'In', 'elementor' ),\n\t\t\tshowTooltip: true,\n\t\t},\n\t\t{\n\t\t\tvalue: 'out',\n\t\t\tlabel: __( 'Out', 'elementor' ),\n\t\t\trenderContent: () => __( 'Out', 'elementor' ),\n\t\t\tshowTooltip: true,\n\t\t},\n\t];\n\n\treturn <ToggleButtonGroupUi items={ options } exclusive onChange={ onChange } value={ value } />;\n}\n","import * as React from 'react';\nimport { useCallback } from 'react';\nimport { UnstableSizeField } from '@elementor/editor-controls';\nimport { sizePropTypeUtil, type SizePropValue } from '@elementor/editor-props';\n\nimport { type FieldProps } from '../../types';\n\nconst DEFAULT_UNIT = 'ms';\n\nexport function TimeFrameIndicator( { value, onChange, defaultValue }: FieldProps & { defaultValue: number } ) {\n\tconst sizeValue = toSizeValue( value ?? defaultValue );\n\n\tconst setValue = useCallback(\n\t\t( size: number ) => {\n\t\t\tonChange( String( size ) );\n\t\t},\n\t\t[ onChange ]\n\t);\n\n\tconst handleChange = ( newValue: SizePropValue[ 'value' ] ) => {\n\t\tsetValue( newValue.size as number );\n\t};\n\n\tconst handleBlur = () => {\n\t\tif ( ! sizeValue.size ) {\n\t\t\tsetValue( defaultValue );\n\t\t}\n\t};\n\n\treturn (\n\t\t<UnstableSizeField\n\t\t\tunits={ [ DEFAULT_UNIT ] }\n\t\t\tvalue={ sizeValue }\n\t\t\tonChange={ handleChange }\n\t\t\tonBlur={ handleBlur }\n\t\t/>\n\t);\n}\n\nconst toSizeValue = ( value: string ): SizePropValue[ 'value' ] => {\n\treturn sizePropTypeUtil.create( {\n\t\tsize: Number( value ),\n\t\tunit: DEFAULT_UNIT,\n\t} ).value;\n};\n","import { type InteractionsConfig } from '../types';\n\nconst DEFAULT_CONFIG: InteractionsConfig = {\n\tconstants: {\n\t\tdefaultDuration: 300,\n\t\tdefaultDelay: 0,\n\t\tslideDistance: 100,\n\t\tscaleStart: 0.5,\n\t\teasing: 'linear',\n\t},\n\tanimationOptions: [],\n};\n\nexport function getInteractionsConfig(): InteractionsConfig {\n\treturn window.ElementorInteractionsConfig || DEFAULT_CONFIG;\n}\n","import { type InteractionsProvider } from '../types';\n\nexport const createInteractionsRepository = () => {\n\tconst providers: InteractionsProvider[] = [];\n\n\tconst getProviders = () => {\n\t\tconst sorted = providers.slice( 0 ).sort( ( a, b ) => ( a.priority > b.priority ? -1 : 1 ) );\n\t\treturn sorted;\n\t};\n\n\tconst register = ( provider: InteractionsProvider ) => {\n\t\tproviders.push( provider );\n\t};\n\n\tconst all = () => {\n\t\treturn getProviders().flatMap( ( provider ) => provider.actions.all() );\n\t};\n\n\tconst subscribe = ( cb: () => void ) => {\n\t\tconst unsubscribes = providers.map( ( provider ) => provider.subscribe( cb ) );\n\n\t\treturn () => {\n\t\t\tunsubscribes.forEach( ( unsubscribe ) => unsubscribe() );\n\t\t};\n\t};\n\n\tconst getProviderByKey = ( key: string ) => {\n\t\treturn providers.find( ( provider ) => {\n\t\t\ttry {\n\t\t\t\treturn provider.getKey() === key;\n\t\t\t} catch {\n\t\t\t\t// Provider might not be ready yet (e.g., no document loaded)\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} );\n\t};\n\n\treturn {\n\t\tall,\n\t\tregister,\n\t\tsubscribe,\n\t\tgetProviders,\n\t\tgetProviderByKey,\n\t};\n};\n","import { createInteractionsRepository } from './utils/create-interactions-repository';\n\nexport const interactionsRepository = createInteractionsRepository();\n","import { type InteractionsProvider } from '../types';\n\nexport type CreateInteractionsProviderOptions = {\n\tkey: string | ( () => string );\n\tpriority?: number;\n\tsubscribe?: ( callback: () => void ) => () => void;\n\tactions: {\n\t\tall: InteractionsProvider[ 'actions' ][ 'all' ];\n\t};\n};\n\nconst DEFAULT_PRIORITY = 10;\n\nexport function createInteractionsProvider( {\n\tkey,\n\tpriority = DEFAULT_PRIORITY,\n\tsubscribe = () => () => {},\n\tactions,\n}: CreateInteractionsProviderOptions ): InteractionsProvider {\n\treturn {\n\t\tgetKey: typeof key === 'string' ? () => key : key,\n\t\tpriority,\n\t\tsubscribe,\n\t\tactions: {\n\t\t\tall: actions.all,\n\t\t},\n\t};\n}\n","import { getCurrentDocumentId, getElementInteractions, getElements } from '@elementor/editor-elements';\nimport { __privateListenTo as listenTo, windowEvent } from '@elementor/editor-v1-adapters';\n\nimport { createInteractionsProvider } from '../utils/create-interactions-provider';\n\nexport const ELEMENTS_INTERACTIONS_PROVIDER_KEY_PREFIX = 'document-elements-interactions-';\n\nexport const documentElementsInteractionsProvider = createInteractionsProvider( {\n\tkey: () => {\n\t\tconst documentId = getCurrentDocumentId();\n\n\t\tif ( ! documentId ) {\n\t\t\tconst pendingKey = `${ ELEMENTS_INTERACTIONS_PROVIDER_KEY_PREFIX }pending`;\n\t\t\treturn pendingKey;\n\t\t}\n\n\t\tconst key = `${ ELEMENTS_INTERACTIONS_PROVIDER_KEY_PREFIX }${ documentId }`;\n\t\treturn key;\n\t},\n\tpriority: 50,\n\tsubscribe: ( cb ) => {\n\t\treturn listenTo( [ windowEvent( 'elementor/element/update_interactions' ) ], () => cb() );\n\t},\n\tactions: {\n\t\tall: () => {\n\t\t\tconst elements = getElements();\n\n\t\t\tconst filtered = elements.filter( ( element ) => {\n\t\t\t\tconst interactions = getElementInteractions( element.id );\n\t\t\t\tif ( ! interactions ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn interactions?.items?.length > 0;\n\t\t\t} );\n\n\t\t\treturn filtered.map( ( element ) => {\n\t\t\t\tconst interactions = getElementInteractions( element.id );\n\t\t\t\treturn {\n\t\t\t\t\telementId: element.id,\n\t\t\t\t\tdataId: element.id,\n\t\t\t\t\tinteractions: interactions || { version: 1, items: [] },\n\t\t\t\t};\n\t\t\t} );\n\t\t},\n\t},\n} );\n","import * as React from 'react';\nimport { MenuListItem } from '@elementor/editor-ui';\nimport { Select, type SelectChangeEvent } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { type FieldProps } from '../../types';\n\nexport function Trigger( { value, onChange }: FieldProps ) {\n\tconst availableTriggers = Object.entries( {\n\t\tload: __( 'Page load', 'elementor' ),\n\t\tscrollIn: __( 'Scroll into view', 'elementor' ),\n\t} ).map( ( [ key, label ] ) => ( {\n\t\tkey,\n\t\tlabel,\n\t} ) );\n\n\treturn (\n\t\t<Select\n\t\t\tfullWidth\n\t\t\tdisplayEmpty\n\t\t\tsize=\"tiny\"\n\t\t\tonChange={ ( event: SelectChangeEvent< string > ) => onChange( event.target.value ) }\n\t\t\tvalue={ value }\n\t\t>\n\t\t\t{ availableTriggers.map( ( trigger ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<MenuListItem key={ trigger.key } value={ trigger.key }>\n\t\t\t\t\t\t{ trigger.label }\n\t\t\t\t\t</MenuListItem>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t</Select>\n\t);\n}\n","import { type ElementID, getAllDescendants, getContainer, type V1Element } from '@elementor/editor-elements';\nimport { registerDataHook } from '@elementor/editor-v1-adapters';\n\nimport type { ElementInteractions } from '../types';\nimport { createString } from '../utils/prop-value-utils';\nimport { generateTempInteractionId } from '../utils/temp-id-utils';\n\nexport function initCleanInteractionIdsOnDuplicate() {\n\tregisterDataHook( 'after', 'document/elements/duplicate', ( _args, result: V1Element | V1Element[] ) => {\n\t\tconst containers = Array.isArray( result ) ? result : [ result ];\n\n\t\tcontainers.forEach( ( container ) => {\n\t\t\tcleanInteractionIdsRecursive( container.id );\n\t\t} );\n\t} );\n}\n\nfunction cleanInteractionIdsRecursive( elementId: ElementID ) {\n\tconst container = getContainer( elementId );\n\n\tif ( ! container ) {\n\t\treturn;\n\t}\n\n\tgetAllDescendants( container ).forEach( ( element: V1Element ) => {\n\t\tcleanInteractionIds( element.id as ElementID );\n\t} );\n}\n\nfunction cleanInteractionIds( elementId: ElementID ) {\n\tconst container = getContainer( elementId );\n\n\tif ( ! container ) {\n\t\treturn;\n\t}\n\n\tconst interactions = container.model.get( 'interactions' ) as ElementInteractions;\n\n\tif ( ! interactions || ! interactions.items ) {\n\t\treturn;\n\t}\n\n\tconst updatedInteractions = structuredClone( interactions ) as ElementInteractions;\n\n\tupdatedInteractions?.items?.forEach( ( interaction ) => {\n\t\tif ( interaction.$$type === 'interaction-item' && interaction.value ) {\n\t\t\tinteraction.value.interaction_id = createString( generateTempInteractionId() );\n\t\t}\n\t} );\n\n\tcontainer.model.set( 'interactions', updatedInteractions );\n}\n","import { Trigger } from './components/controls/trigger';\nimport { initCleanInteractionIdsOnDuplicate } from './hooks/on-duplicate';\nimport { registerInteractionsControl } from './interactions-controls-registry';\nimport { interactionsRepository } from './interactions-repository';\nimport { documentElementsInteractionsProvider } from './providers/document-elements-interactions-provider';\n\nexport function init() {\n\ttry {\n\t\tinteractionsRepository.register( documentElementsInteractionsProvider );\n\t\tinitCleanInteractionIdsOnDuplicate();\n\t\tregisterInteractionsControl( {\n\t\t\ttype: 'trigger',\n\t\t\tcomponent: Trigger,\n\t\t\toptions: [ 'load', 'scrollIn' ],\n\t\t} );\n\t} catch ( error ) {\n\t\tthrow error;\n\t}\n}\n"],"mappings":"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","names":["React","useCallback","useState","useElementInteractions","Stack","React","React","createContext","useContext","React","createContext","useCallback","useContext","useEffect","useMemo","__","React","useMemo","__","React","__","React","__","React","ToggleButtonGroupUi","__","React","useCallback","useMemo","__","createContext","useCallback","useEffect","useMemo","__","useContext","useElementInteractions","useState","useCallback","Stack","React","MenuListItem","Select","__"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/empty-state.tsx","../src/components/interactions-tab.tsx","../src/contexts/interactions-context.tsx","../src/contexts/popup-state-context.tsx","../src/components/interactions-list.tsx","../src/utils/temp-id-utils.ts","../src/utils/prop-value-utils.ts","../src/components/interaction-details.tsx","../src/interactions-controls-registry.ts","../src/components/controls/direction.tsx","../src/components/controls/effect.tsx","../src/components/controls/effect-type.tsx","../src/components/controls/time-frame-indicator.tsx","../src/utils/get-interactions-config.ts","../src/utils/create-interactions-repository.ts","../src/interactions-repository.ts","../src/utils/create-interactions-provider.ts","../src/providers/document-elements-interactions-provider.ts","../src/components/controls/easing.tsx","../src/components/controls/trigger.tsx","../src/hooks/on-duplicate.ts","../src/init.ts"],"sourcesContent":["import * as React from 'react';\nimport { SwipeIcon } from '@elementor/icons';\nimport { Button, Stack, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nexport const EmptyState = ( { onCreateInteraction }: { onCreateInteraction: () => void } ) => {\n\treturn (\n\t\t<Stack\n\t\t\talignItems=\"center\"\n\t\t\tjustifyContent=\"center\"\n\t\t\theight=\"100%\"\n\t\t\tcolor=\"text.secondary\"\n\t\t\tsx={ { p: 2.5, pt: 8, pb: 5.5 } }\n\t\t\tgap={ 1.5 }\n\t\t>\n\t\t\t<SwipeIcon fontSize=\"large\" />\n\n\t\t\t<Typography align=\"center\" variant=\"subtitle2\">\n\t\t\t\t{ __( 'Animate elements with Interactions', 'elementor' ) }\n\t\t\t</Typography>\n\n\t\t\t<Typography align=\"center\" variant=\"caption\" maxWidth=\"170px\">\n\t\t\t\t{ __(\n\t\t\t\t\t'Add entrance animations and effects triggered by user interactions such as page load or scroll.',\n\t\t\t\t\t'elementor'\n\t\t\t\t) }\n\t\t\t</Typography>\n\n\t\t\t<Button variant=\"outlined\" color=\"secondary\" size=\"small\" sx={ { mt: 1 } } onClick={ onCreateInteraction }>\n\t\t\t\t{ __( 'Create an interaction', 'elementor' ) }\n\t\t\t</Button>\n\t\t</Stack>\n\t);\n};\n","import * as React from 'react';\nimport { useCallback, useState } from 'react';\nimport { useElementInteractions } from '@elementor/editor-elements';\nimport { SessionStorageProvider } from '@elementor/session';\nimport { Stack } from '@elementor/ui';\n\nimport { InteractionsProvider, useInteractionsContext } from '../contexts/interactions-context';\nimport { PopupStateProvider } from '../contexts/popup-state-context';\nimport type { ElementInteractions } from '../types';\nimport { EmptyState } from './empty-state';\nimport { InteractionsList } from './interactions-list';\n\nexport const InteractionsTab = ( { elementId }: { elementId: string } ) => {\n\treturn (\n\t\t<PopupStateProvider>\n\t\t\t<InteractionsTabContent elementId={ elementId } />\n\t\t</PopupStateProvider>\n\t);\n};\n\nfunction InteractionsTabContent( { elementId }: { elementId: string } ) {\n\tconst existingInteractions = useElementInteractions( elementId ) as unknown as ElementInteractions | undefined;\n\tconst firstInteractionState = useState< boolean >( false );\n\tconst hasInteractions = existingInteractions?.items?.length || firstInteractionState[ 0 ];\n\n\treturn (\n\t\t<SessionStorageProvider prefix={ elementId }>\n\t\t\t{ hasInteractions ? (\n\t\t\t\t<InteractionsProvider elementId={ elementId }>\n\t\t\t\t\t<InteractionsContent firstInteractionState={ firstInteractionState } />\n\t\t\t\t</InteractionsProvider>\n\t\t\t) : (\n\t\t\t\t<EmptyState\n\t\t\t\t\tonCreateInteraction={ () => {\n\t\t\t\t\t\tfirstInteractionState[ 1 ]( true );\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</SessionStorageProvider>\n\t);\n}\n\nfunction InteractionsContent( {\n\tfirstInteractionState,\n}: {\n\tfirstInteractionState: [ boolean, ( value: boolean ) => void ];\n} ) {\n\tconst { interactions, setInteractions, playInteractions } = useInteractionsContext();\n\n\tconst applyInteraction = useCallback(\n\t\t( newInteractions: ElementInteractions ) => {\n\t\t\tfirstInteractionState[ 1 ]( false );\n\t\t\tif ( ! newInteractions ) {\n\t\t\t\tsetInteractions( undefined );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetInteractions( newInteractions );\n\t\t},\n\t\t[ setInteractions, firstInteractionState ]\n\t);\n\n\treturn (\n\t\t<Stack sx={ { m: 1, p: 1.5 } } gap={ 2 }>\n\t\t\t<InteractionsList\n\t\t\t\ttriggerCreateOnShowEmpty={ firstInteractionState[ 0 ] }\n\t\t\t\tinteractions={ interactions }\n\t\t\t\tonSelectInteractions={ applyInteraction }\n\t\t\t\tonPlayInteraction={ playInteractions }\n\t\t\t/>\n\t\t</Stack>\n\t);\n}\n","import * as React from 'react';\nimport { createContext, type ReactNode, useContext, useEffect } from 'react';\nimport {\n\ttype ElementInteractions,\n\tplayElementInteractions,\n\tupdateElementInteractions,\n\tuseElementInteractions,\n} from '@elementor/editor-elements';\n\ntype InteractionsContextValue = {\n\tinteractions: ElementInteractions;\n\tsetInteractions: ( value: ElementInteractions | undefined ) => void;\n\tplayInteractions: ( interactionId: string ) => void;\n};\n\nconst InteractionsContext = createContext< InteractionsContextValue | null >( null );\n\nconst DEFAULT_INTERACTIONS: ElementInteractions = {\n\tversion: 1,\n\titems: [],\n};\n\nexport const InteractionsProvider = ( { children, elementId }: { children: ReactNode; elementId: string } ) => {\n\tconst rawInteractions = useElementInteractions( elementId );\n\n\tuseEffect( () => {\n\t\twindow.dispatchEvent( new CustomEvent( 'elementor/element/update_interactions' ) );\n\t}, [] );\n\n\tconst interactions: ElementInteractions =\n\t\t( rawInteractions as unknown as ElementInteractions ) ?? DEFAULT_INTERACTIONS;\n\n\tconst setInteractions = ( value: ElementInteractions | undefined ) => {\n\t\tconst normalizedValue = value && value.items?.length === 0 ? undefined : value;\n\n\t\tupdateElementInteractions( {\n\t\t\telementId,\n\t\t\tinteractions: normalizedValue,\n\t\t} );\n\t};\n\n\tconst playInteractions = ( interactionId: string ) => {\n\t\tplayElementInteractions( elementId, interactionId );\n\t};\n\n\tconst contextValue: InteractionsContextValue = {\n\t\tinteractions,\n\t\tsetInteractions,\n\t\tplayInteractions,\n\t};\n\n\treturn <InteractionsContext.Provider value={ contextValue }>{ children }</InteractionsContext.Provider>;\n};\n\nexport const useInteractionsContext = () => {\n\tconst context = useContext( InteractionsContext );\n\tif ( ! context ) {\n\t\tthrow new Error( 'useInteractionsContext must be used within InteractionsProvider' );\n\t}\n\treturn context;\n};\n","import * as React from 'react';\nimport { createContext, useCallback, useContext, useState } from 'react';\n\ntype PopupStateContextType = {\n\topenByDefault: boolean;\n\ttriggerDefaultOpen: () => void;\n\tresetDefaultOpen: () => void;\n};\n\nconst PopupStateContext = createContext< PopupStateContextType | undefined >( undefined );\n\nexport const PopupStateProvider = ( { children }: { children: React.ReactNode } ) => {\n\tconst [ openByDefault, setOpenByDefault ] = useState( false );\n\n\tconst triggerDefaultOpen = useCallback( () => {\n\t\tsetOpenByDefault( true );\n\t}, [] );\n\n\tconst resetDefaultOpen = useCallback( () => {\n\t\tsetOpenByDefault( false );\n\t}, [] );\n\n\treturn (\n\t\t<PopupStateContext.Provider value={ { openByDefault, triggerDefaultOpen, resetDefaultOpen } }>\n\t\t\t{ children }\n\t\t</PopupStateContext.Provider>\n\t);\n};\n\nexport const usePopupStateContext = () => {\n\tconst context = useContext( PopupStateContext );\n\tif ( ! context ) {\n\t\tthrow new Error( 'usePopupStateContext must be used within PopupStateProvider' );\n\t}\n\treturn context;\n};\n","import * as React from 'react';\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef } from 'react';\nimport { Repeater } from '@elementor/editor-controls';\nimport { InfoCircleFilledIcon, PlayerPlayIcon } from '@elementor/icons';\nimport { Alert, AlertTitle, Box, IconButton, Tooltip } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport type { ElementInteractions, InteractionItemPropValue, InteractionItemValue } from '../types';\nimport { buildDisplayLabel, createDefaultInteractionItem, extractString } from '../utils/prop-value-utils';\nimport { InteractionDetails } from './interaction-details';\nexport const MAX_NUMBER_OF_INTERACTIONS = 5;\n\nexport type InteractionListProps = {\n\tonSelectInteractions: ( interactions: ElementInteractions ) => void;\n\tinteractions: ElementInteractions;\n\tonPlayInteraction: ( interactionId: string ) => void;\n\ttriggerCreateOnShowEmpty?: boolean;\n};\n\ntype InteractionItemContextValue = {\n\tonInteractionChange: ( index: number, newInteractionValue: InteractionItemValue ) => void;\n\tonPlayInteraction: ( interactionId: string ) => void;\n};\n\nconst InteractionItemContext = createContext< InteractionItemContextValue | null >( null );\n\nexport function InteractionsList( props: InteractionListProps ) {\n\tconst { interactions, onSelectInteractions, onPlayInteraction, triggerCreateOnShowEmpty } = props;\n\n\tconst hasInitializedRef = useRef( false );\n\n\tconst handleUpdateInteractions = useCallback(\n\t\t( newInteractions: ElementInteractions ) => {\n\t\t\tonSelectInteractions( newInteractions );\n\t\t},\n\t\t[ onSelectInteractions ]\n\t);\n\n\tuseEffect( () => {\n\t\tif (\n\t\t\ttriggerCreateOnShowEmpty &&\n\t\t\t! hasInitializedRef.current &&\n\t\t\t( ! interactions.items || interactions.items?.length === 0 )\n\t\t) {\n\t\t\thasInitializedRef.current = true;\n\t\t\tconst newState: ElementInteractions = {\n\t\t\t\tversion: 1,\n\t\t\t\titems: [ createDefaultInteractionItem() ],\n\t\t\t};\n\t\t\thandleUpdateInteractions( newState );\n\t\t}\n\t}, [ triggerCreateOnShowEmpty, interactions.items, handleUpdateInteractions ] );\n\n\tconst isMaxNumberOfInteractionsReached = useMemo( () => {\n\t\treturn interactions.items?.length >= MAX_NUMBER_OF_INTERACTIONS;\n\t}, [ interactions.items?.length ] );\n\n\tconst infotipContent = isMaxNumberOfInteractionsReached ? (\n\t\t<Alert color=\"secondary\" icon={ <InfoCircleFilledIcon /> } size=\"small\">\n\t\t\t<AlertTitle>{ __( 'Interactions', 'elementor' ) }</AlertTitle>\n\t\t\t<Box component=\"span\">\n\t\t\t\t{ __(\n\t\t\t\t\t\"You've reached the limit of 5 interactions for this element. Please remove an interaction before creating a new one.\",\n\t\t\t\t\t'elementor'\n\t\t\t\t) }\n\t\t\t</Box>\n\t\t</Alert>\n\t) : undefined;\n\n\tconst handleRepeaterChange = useCallback(\n\t\t( newItems: ElementInteractions[ 'items' ] ) => {\n\t\t\thandleUpdateInteractions( {\n\t\t\t\t...interactions,\n\t\t\t\titems: newItems,\n\t\t\t} );\n\t\t},\n\t\t[ interactions, handleUpdateInteractions ]\n\t);\n\n\tconst handleInteractionChange = useCallback(\n\t\t( index: number, newInteractionValue: InteractionItemValue ) => {\n\t\t\tconst newItems = structuredClone( interactions.items );\n\t\t\tnewItems[ index ] = {\n\t\t\t\t$$type: 'interaction-item',\n\t\t\t\tvalue: newInteractionValue,\n\t\t\t};\n\t\t\thandleUpdateInteractions( {\n\t\t\t\t...interactions,\n\t\t\t\titems: newItems,\n\t\t\t} );\n\t\t},\n\t\t[ interactions, handleUpdateInteractions ]\n\t);\n\n\tconst contextValue = useMemo(\n\t\t() => ( {\n\t\t\tonInteractionChange: handleInteractionChange,\n\t\t\tonPlayInteraction,\n\t\t} ),\n\t\t[ handleInteractionChange, onPlayInteraction ]\n\t);\n\n\treturn (\n\t\t<InteractionItemContext.Provider value={ contextValue }>\n\t\t\t<Repeater\n\t\t\t\topenOnAdd\n\t\t\t\topenItem={ triggerCreateOnShowEmpty ? 0 : undefined }\n\t\t\t\tlabel={ __( 'Interactions', 'elementor' ) }\n\t\t\t\tvalues={ interactions.items }\n\t\t\t\tsetValues={ handleRepeaterChange }\n\t\t\t\tshowDuplicate={ false }\n\t\t\t\tshowToggle={ false }\n\t\t\t\tisSortable={ false }\n\t\t\t\tdisableAddItemButton={ isMaxNumberOfInteractionsReached }\n\t\t\t\taddButtonInfotipContent={ infotipContent }\n\t\t\t\titemSettings={ {\n\t\t\t\t\tinitialValues: createDefaultInteractionItem(),\n\t\t\t\t\tLabel: ( { value }: { value: InteractionItemPropValue } ) => buildDisplayLabel( value.value ),\n\t\t\t\t\tIcon: () => null,\n\t\t\t\t\tContent,\n\t\t\t\t\tactions: ( value: InteractionItemPropValue ) => (\n\t\t\t\t\t\t<Tooltip key=\"preview\" placement=\"top\" title={ __( 'Preview', 'elementor' ) }>\n\t\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\t\taria-label={ __( 'Play interaction', 'elementor' ) }\n\t\t\t\t\t\t\t\tsize=\"tiny\"\n\t\t\t\t\t\t\t\tonClick={ () => onPlayInteraction( extractString( value.value.interaction_id ) ) }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<PlayerPlayIcon fontSize=\"tiny\" />\n\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t),\n\t\t\t\t} }\n\t\t\t/>\n\t\t</InteractionItemContext.Provider>\n\t);\n}\n\nconst Content = ( { index, value }: { index: number; value: InteractionItemPropValue } ) => {\n\tconst context = useContext( InteractionItemContext );\n\n\tconst handleChange = useCallback(\n\t\t( newInteractionValue: InteractionItemValue ) => {\n\t\t\tcontext?.onInteractionChange( index, newInteractionValue );\n\t\t},\n\t\t[ context, index ]\n\t);\n\n\tconst handlePlayInteraction = useCallback(\n\t\t( interactionId: string ) => {\n\t\t\tcontext?.onPlayInteraction( interactionId );\n\t\t},\n\t\t[ context ]\n\t);\n\n\treturn (\n\t\t<InteractionDetails\n\t\t\tkey={ index }\n\t\t\tinteraction={ value.value }\n\t\t\tonChange={ handleChange }\n\t\t\tonPlayInteraction={ handlePlayInteraction }\n\t\t/>\n\t);\n};\n","const TEMP_ID_PREFIX = 'temp-';\nconst TEMP_ID_REGEX = /^temp-[a-z0-9]+$/i;\n\nexport function generateTempInteractionId(): string {\n\treturn `${ TEMP_ID_PREFIX }${ Math.random().toString( 36 ).substring( 2, 11 ) }`;\n}\n\nexport function isTempId( id: string | undefined ): boolean {\n\treturn !! id && TEMP_ID_REGEX.test( id );\n}\n","import type {\n\tAnimationPresetPropValue,\n\tBooleanPropValue,\n\tConfigPropValue,\n\tElementInteractions,\n\tInteractionItemPropValue,\n\tInteractionItemValue,\n\tNumberPropValue,\n\tStringPropValue,\n\tTimingConfigPropValue,\n} from '../types';\nimport { generateTempInteractionId } from './temp-id-utils';\n\nexport const createString = ( value: string ): StringPropValue => ( {\n\t$$type: 'string',\n\tvalue,\n} );\n\nexport const createNumber = ( value: number ): NumberPropValue => ( {\n\t$$type: 'number',\n\tvalue,\n} );\n\nexport const createTimingConfig = ( duration: number, delay: number ): TimingConfigPropValue => ( {\n\t$$type: 'timing-config',\n\tvalue: {\n\t\tduration: createNumber( duration ),\n\t\tdelay: createNumber( delay ),\n\t},\n} );\n\nexport const createBoolean = ( value: boolean ): BooleanPropValue => ( {\n\t$$type: 'boolean',\n\tvalue,\n} );\n\nexport const createConfig = ( {\n\treplay,\n\teasing = 'easeIn',\n\trelativeTo = '',\n\toffsetTop = 0,\n\toffsetBottom = 100,\n}: {\n\treplay: boolean;\n\teasing?: string;\n\trelativeTo?: string;\n\toffsetTop?: number;\n\toffsetBottom?: number;\n} ): ConfigPropValue => ( {\n\t$$type: 'config',\n\tvalue: {\n\t\treplay: createBoolean( replay ),\n\t\teasing: createString( easing ),\n\t\trelativeTo: createString( relativeTo ),\n\t\toffsetTop: createNumber( offsetTop ),\n\t\toffsetBottom: createNumber( offsetBottom ),\n\t},\n} );\n\nexport const extractBoolean = ( prop: BooleanPropValue | undefined, fallback = false ): boolean => {\n\treturn prop?.value ?? fallback;\n};\n\nexport const createAnimationPreset = ( {\n\teffect,\n\ttype,\n\tdirection,\n\tduration,\n\tdelay,\n\treplay = false,\n\teasing = 'easeIn',\n\trelativeTo,\n\toffsetTop,\n\toffsetBottom,\n}: {\n\teffect: string;\n\ttype: string;\n\tdirection?: string;\n\tduration: number;\n\tdelay: number;\n\treplay: boolean;\n\teasing?: string;\n\trelativeTo?: string;\n\toffsetTop?: number;\n\toffsetBottom?: number;\n} ): AnimationPresetPropValue => ( {\n\t$$type: 'animation-preset-props',\n\tvalue: {\n\t\teffect: createString( effect ),\n\t\ttype: createString( type ),\n\t\tdirection: createString( direction ?? '' ),\n\t\ttiming_config: createTimingConfig( duration, delay ),\n\t\tconfig: createConfig( {\n\t\t\treplay,\n\t\t\teasing,\n\t\t\trelativeTo,\n\t\t\toffsetTop,\n\t\t\toffsetBottom,\n\t\t} ),\n\t},\n} );\n\nexport const createInteractionItem = ( {\n\ttrigger,\n\teffect,\n\ttype,\n\tdirection,\n\tduration,\n\tdelay,\n\tinteractionId,\n\treplay = false,\n\teasing = 'easeIn',\n\trelativeTo,\n\toffsetTop,\n\toffsetBottom,\n}: {\n\ttrigger: string;\n\teffect: string;\n\ttype: string;\n\tdirection?: string;\n\tduration: number;\n\tdelay: number;\n\tinteractionId?: string;\n\treplay: boolean;\n\teasing?: string;\n\trelativeTo?: string;\n\toffsetTop?: number;\n\toffsetBottom?: number;\n} ): InteractionItemPropValue => ( {\n\t$$type: 'interaction-item',\n\tvalue: {\n\t\t...( interactionId && { interaction_id: createString( interactionId ) } ),\n\t\ttrigger: createString( trigger ),\n\t\tanimation: createAnimationPreset( {\n\t\t\teffect,\n\t\t\ttype,\n\t\t\tdirection,\n\t\t\tduration,\n\t\t\tdelay,\n\t\t\treplay,\n\t\t\teasing,\n\t\t\trelativeTo,\n\t\t\toffsetTop,\n\t\t\toffsetBottom,\n\t\t} ),\n\t},\n} );\n\nexport const createDefaultInteractionItem = (): InteractionItemPropValue => {\n\treturn createInteractionItem( {\n\t\ttrigger: 'load',\n\t\teffect: 'fade',\n\t\ttype: 'in',\n\t\tduration: 600,\n\t\tdelay: 0,\n\t\treplay: false,\n\t\teasing: 'easeIn',\n\t\tinteractionId: generateTempInteractionId(),\n\t} );\n};\n\nexport const createDefaultInteractions = (): ElementInteractions => ( {\n\tversion: 1,\n\titems: [ createDefaultInteractionItem() ],\n} );\n\nexport const extractString = ( prop: StringPropValue | undefined, fallback = '' ): string => {\n\treturn prop?.value ?? fallback;\n};\n\nexport const extractNumber = ( prop: NumberPropValue | undefined, fallback = 0 ): number => {\n\treturn prop?.value ?? fallback;\n};\n\nconst TRIGGER_LABELS: Record< string, string > = {\n\tload: 'On page load',\n\tscrollIn: 'Scroll into view',\n\tscrollOut: 'Scroll out of view',\n\tscrollOn: 'While scrolling',\n};\n\nconst capitalize = ( str: string ): string => {\n\treturn str.charAt( 0 ).toUpperCase() + str.slice( 1 );\n};\n\nexport const buildDisplayLabel = ( item: InteractionItemValue ): string => {\n\tconst trigger = extractString( item.trigger );\n\tconst effect = extractString( item.animation.value.effect );\n\tconst type = extractString( item.animation.value.type );\n\n\tconst triggerLabel = TRIGGER_LABELS[ trigger ] || capitalize( trigger );\n\tconst effectLabel = capitalize( effect );\n\tconst typeLabel = capitalize( type );\n\n\treturn `${ triggerLabel }: ${ effectLabel } ${ typeLabel }`;\n};\n","import * as React from 'react';\nimport { type PropsWithChildren, useMemo } from 'react';\nimport { ControlFormLabel, PopoverContent, PopoverGridContainer } from '@elementor/editor-controls';\nimport { Divider, Grid } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { getInteractionsControl } from '../interactions-controls-registry';\nimport type { InteractionItemValue } from '../types';\nimport {\n\tcreateAnimationPreset,\n\tcreateString,\n\textractBoolean,\n\textractNumber,\n\textractString,\n} from '../utils/prop-value-utils';\nimport { Direction } from './controls/direction';\nimport { Effect } from './controls/effect';\nimport { EffectType } from './controls/effect-type';\nimport { TimeFrameIndicator } from './controls/time-frame-indicator';\n\ntype InteractionDetailsProps = {\n\tinteraction: InteractionItemValue;\n\tonChange: ( interaction: InteractionItemValue ) => void;\n\tonPlayInteraction: ( interactionId: string ) => void;\n};\n\nconst DEFAULT_VALUES = {\n\ttrigger: 'load',\n\teffect: 'fade',\n\ttype: 'in',\n\tdirection: '',\n\tduration: 600,\n\tdelay: 0,\n\treplay: false,\n\teasing: 'easeIn',\n\trelativeTo: 'viewport',\n\toffsetTop: 15,\n\toffsetBottom: 85,\n};\n\nconst TRIGGERS_WITHOUT_REPLAY = [ 'load', 'scrollOn' ];\n\ntype InteractionsControlType =\n\t| 'trigger'\n\t| 'effect'\n\t| 'effectType'\n\t| 'direction'\n\t| 'duration'\n\t| 'delay'\n\t| 'replay'\n\t| 'easing'\n\t| 'relativeTo'\n\t| 'offsetTop'\n\t| 'offsetBottom';\n\ntype InteractionValues = {\n\ttrigger: string;\n\teffect: string;\n\ttype: string;\n\tdirection: string;\n\tduration: number;\n\tdelay: number;\n\treplay: boolean;\n\teasing: string;\n\trelativeTo: string;\n\toffsetTop: number;\n\toffsetBottom: number;\n};\n\ntype ControlVisibilityConfig = {\n\t[ key: string ]: ( values: InteractionValues ) => boolean;\n};\n\nconst controlVisibilityConfig: ControlVisibilityConfig = {\n\treplay: ( values ) => ! TRIGGERS_WITHOUT_REPLAY.includes( values.trigger ),\n\n\trelativeTo: ( values ) => values.trigger === 'scrollOn',\n\toffsetTop: ( values ) => values.trigger === 'scrollOn',\n\toffsetBottom: ( values ) => values.trigger === 'scrollOn',\n\n\tduration: ( values ) => {\n\t\tconst isRelativeToVisible = values.trigger === 'scrollOn';\n\t\treturn ! isRelativeToVisible;\n\t},\n\tdelay: ( values ) => {\n\t\tconst isRelativeToVisible = values.trigger === 'scrollOn';\n\t\treturn ! isRelativeToVisible;\n\t},\n};\n\nfunction useControlComponent( controlName: InteractionsControlType, isVisible: boolean = true ) {\n\treturn useMemo( () => {\n\t\tif ( ! isVisible ) {\n\t\t\treturn null;\n\t\t}\n\t\treturn getInteractionsControl( controlName )?.component ?? null;\n\t}, [ controlName, isVisible ] );\n}\n\nexport const InteractionDetails = ( { interaction, onChange, onPlayInteraction }: InteractionDetailsProps ) => {\n\tconst trigger = extractString( interaction.trigger, DEFAULT_VALUES.trigger );\n\tconst effect = extractString( interaction.animation.value.effect, DEFAULT_VALUES.effect );\n\tconst type = extractString( interaction.animation.value.type, DEFAULT_VALUES.type );\n\tconst direction = extractString( interaction.animation.value.direction, DEFAULT_VALUES.direction );\n\tconst duration = extractNumber( interaction.animation.value.timing_config.value.duration, DEFAULT_VALUES.duration );\n\tconst delay = extractNumber( interaction.animation.value.timing_config.value.delay, DEFAULT_VALUES.delay );\n\tconst replay = extractBoolean( interaction.animation.value.config?.value.replay, DEFAULT_VALUES.replay );\n\tconst easing = extractString( interaction.animation.value.config?.value.easing, DEFAULT_VALUES.easing );\n\tconst relativeTo = extractString( interaction.animation.value.config?.value.relativeTo, DEFAULT_VALUES.relativeTo );\n\tconst offsetTop = extractNumber( interaction.animation.value.config?.value.offsetTop, DEFAULT_VALUES.offsetTop );\n\tconst offsetBottom = extractNumber(\n\t\tinteraction.animation.value.config?.value.offsetBottom,\n\t\tDEFAULT_VALUES.offsetBottom\n\t);\n\n\tconst interactionValues = {\n\t\ttrigger,\n\t\teffect,\n\t\ttype,\n\t\tdirection,\n\t\tduration,\n\t\tdelay,\n\t\teasing,\n\t\treplay,\n\t\trelativeTo,\n\t\toffsetTop,\n\t\toffsetBottom,\n\t};\n\n\tconst TriggerControl = useControlComponent( 'trigger', true );\n\tconst ReplayControl = useControlComponent( 'replay', controlVisibilityConfig.replay( interactionValues ) );\n\tconst RelativeToControl = useControlComponent(\n\t\t'relativeTo',\n\t\tcontrolVisibilityConfig.relativeTo( interactionValues )\n\t);\n\tconst OffsetTopControl = useControlComponent( 'offsetTop', controlVisibilityConfig.offsetTop( interactionValues ) );\n\tconst OffsetBottomControl = useControlComponent(\n\t\t'offsetBottom',\n\t\tcontrolVisibilityConfig.offsetBottom( interactionValues )\n\t);\n\n\tconst EasingControl = useControlComponent( 'easing' );\n\n\tconst resolveDirection = ( hasDirection: boolean, newEffect?: string, newDirection?: string ) => {\n\t\tif ( newEffect === 'slide' && ! newDirection ) {\n\t\t\treturn 'top';\n\t\t}\n\t\t// Why? - New direction can be undefined when the effect is not slide, so if the updates object includes direction, we take it always!\n\t\tif ( hasDirection ) {\n\t\t\treturn newDirection;\n\t\t}\n\t\treturn direction;\n\t};\n\n\tconst updateInteraction = (\n\t\tupdates: Partial< {\n\t\t\ttrigger: string;\n\t\t\teffect: string;\n\t\t\ttype: string;\n\t\t\tdirection: string;\n\t\t\tduration: number;\n\t\t\tdelay: number;\n\t\t\treplay: boolean;\n\t\t\teasing?: string;\n\t\t\trelativeTo: string;\n\t\t\toffsetTop: number;\n\t\t\toffsetBottom: number;\n\t\t} >\n\t): void => {\n\t\tconst resolvedDirectionValue = resolveDirection( 'direction' in updates, updates.effect, updates.direction );\n\n\t\tconst updatedInteraction = {\n\t\t\t...interaction,\n\t\t\tinteraction_id: interaction.interaction_id,\n\t\t\ttrigger: createString( updates.trigger ?? trigger ),\n\t\t\tanimation: createAnimationPreset( {\n\t\t\t\teffect: updates.effect ?? effect,\n\t\t\t\ttype: updates.type ?? type,\n\t\t\t\tdirection: resolvedDirectionValue,\n\t\t\t\tduration: updates.duration ?? duration,\n\t\t\t\tdelay: updates.delay ?? delay,\n\t\t\t\treplay: updates.replay ?? replay,\n\t\t\t\teasing: updates.easing ?? easing,\n\t\t\t\trelativeTo: updates.relativeTo ?? relativeTo,\n\t\t\t\toffsetTop: updates.offsetTop ?? offsetTop,\n\t\t\t\toffsetBottom: updates.offsetBottom ?? offsetBottom,\n\t\t\t} ),\n\t\t};\n\n\t\tonChange( updatedInteraction );\n\n\t\tconst interactionId = extractString( updatedInteraction.interaction_id );\n\n\t\tsetTimeout( () => {\n\t\t\tonPlayInteraction( interactionId );\n\t\t}, 0 );\n\t};\n\n\treturn (\n\t\t<PopoverContent p={ 1.5 }>\n\t\t\t<Grid container spacing={ 1.5 }>\n\t\t\t\t{ TriggerControl && (\n\t\t\t\t\t<Field label={ __( 'Trigger', 'elementor' ) }>\n\t\t\t\t\t\t<TriggerControl value={ trigger } onChange={ ( v ) => updateInteraction( { trigger: v } ) } />\n\t\t\t\t\t</Field>\n\t\t\t\t) }\n\n\t\t\t\t{ ReplayControl && (\n\t\t\t\t\t<Field label={ __( 'Replay', 'elementor' ) }>\n\t\t\t\t\t\t<ReplayControl\n\t\t\t\t\t\t\tvalue={ replay }\n\t\t\t\t\t\t\tonChange={ ( v ) => updateInteraction( { replay: v } ) }\n\t\t\t\t\t\t\tdisabled={ true }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Field>\n\t\t\t\t) }\n\t\t\t</Grid>\n\n\t\t\t<Divider />\n\n\t\t\t<Grid container spacing={ 1.5 }>\n\t\t\t\t<Field label={ __( 'Effect', 'elementor' ) }>\n\t\t\t\t\t<Effect value={ effect } onChange={ ( v ) => updateInteraction( { effect: v } ) } />\n\t\t\t\t</Field>\n\n\t\t\t\t<Field label={ __( 'Type', 'elementor' ) }>\n\t\t\t\t\t<EffectType value={ type } onChange={ ( v ) => updateInteraction( { type: v } ) } />\n\t\t\t\t</Field>\n\n\t\t\t\t<Field label={ __( 'Direction', 'elementor' ) }>\n\t\t\t\t\t<Direction\n\t\t\t\t\t\tvalue={ direction }\n\t\t\t\t\t\tonChange={ ( v ) => updateInteraction( { direction: v } ) }\n\t\t\t\t\t\tinteractionType={ type }\n\t\t\t\t\t/>\n\t\t\t\t</Field>\n\n\t\t\t\t{ controlVisibilityConfig.duration( interactionValues ) && (\n\t\t\t\t\t<Field label={ __( 'Duration', 'elementor' ) }>\n\t\t\t\t\t\t<TimeFrameIndicator\n\t\t\t\t\t\t\tvalue={ String( duration ) }\n\t\t\t\t\t\t\tonChange={ ( v ) => updateInteraction( { duration: parseInt( v, 10 ) } ) }\n\t\t\t\t\t\t\tdefaultValue={ DEFAULT_VALUES.duration }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Field>\n\t\t\t\t) }\n\n\t\t\t\t{ controlVisibilityConfig.delay( interactionValues ) && (\n\t\t\t\t\t<Field label={ __( 'Delay', 'elementor' ) }>\n\t\t\t\t\t\t<TimeFrameIndicator\n\t\t\t\t\t\t\tvalue={ String( delay ) }\n\t\t\t\t\t\t\tonChange={ ( v ) => updateInteraction( { delay: parseInt( v, 10 ) } ) }\n\t\t\t\t\t\t\tdefaultValue={ DEFAULT_VALUES.delay }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Field>\n\t\t\t\t) }\n\t\t\t</Grid>\n\n\t\t\t{ controlVisibilityConfig.relativeTo( interactionValues ) && RelativeToControl && (\n\t\t\t\t<>\n\t\t\t\t\t<Divider />\n\t\t\t\t\t<Grid container spacing={ 1.5 }>\n\t\t\t\t\t\t<Field label={ __( 'Relative To', 'elementor' ) }>\n\t\t\t\t\t\t\t<RelativeToControl\n\t\t\t\t\t\t\t\tvalue={ relativeTo }\n\t\t\t\t\t\t\t\tonChange={ ( v ) => updateInteraction( { relativeTo: v } ) }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t{ OffsetTopControl && (\n\t\t\t\t\t\t\t<Field label={ __( 'Offset Top', 'elementor' ) }>\n\t\t\t\t\t\t\t\t<OffsetTopControl\n\t\t\t\t\t\t\t\t\tvalue={ String( offsetTop ) }\n\t\t\t\t\t\t\t\t\tonChange={ ( v: string ) => updateInteraction( { offsetTop: parseInt( v, 10 ) } ) }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t) }\n\t\t\t\t\t\t{ OffsetBottomControl && (\n\t\t\t\t\t\t\t<Field label={ __( 'Offset Bottom', 'elementor' ) }>\n\t\t\t\t\t\t\t\t<OffsetBottomControl\n\t\t\t\t\t\t\t\t\tvalue={ String( offsetBottom ) }\n\t\t\t\t\t\t\t\t\tonChange={ ( v: string ) =>\n\t\t\t\t\t\t\t\t\t\tupdateInteraction( { offsetBottom: parseInt( v, 10 ) } )\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t) }\n\t\t\t\t\t</Grid>\n\t\t\t\t\t<Divider />\n\t\t\t\t</>\n\t\t\t) }\n\n\t\t\t{ EasingControl && (\n\t\t\t\t<Grid container spacing={ 1.5 }>\n\t\t\t\t\t<Field label={ __( 'Easing', 'elementor' ) }>\n\t\t\t\t\t\t<EasingControl\n\t\t\t\t\t\t\tvalue={ easing }\n\t\t\t\t\t\t\tonChange={ ( v ) => {\n\t\t\t\t\t\t\t\tupdateInteraction( { easing: v } );\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Field>\n\t\t\t\t</Grid>\n\t\t\t) }\n\t\t</PopoverContent>\n\t);\n};\n\ntype FieldProps = {\n\tlabel: string;\n} & PropsWithChildren;\n\nfunction Field( { label, children }: FieldProps ) {\n\treturn (\n\t\t<Grid item xs={ 12 }>\n\t\t\t<PopoverGridContainer>\n\t\t\t\t<Grid item xs={ 6 }>\n\t\t\t\t\t<ControlFormLabel>{ label }</ControlFormLabel>\n\t\t\t\t</Grid>\n\t\t\t\t<Grid item xs={ 6 }>\n\t\t\t\t\t{ children }\n\t\t\t\t</Grid>\n\t\t\t</PopoverGridContainer>\n\t\t</Grid>\n\t);\n}\n","import { type ComponentType } from 'react';\n\nimport { type DirectionFieldProps, type FieldProps, type ReplayFieldProps } from './types';\n\ntype InteractionsControlType =\n\t| 'trigger'\n\t| 'effect'\n\t| 'effectType'\n\t| 'direction'\n\t| 'duration'\n\t| 'delay'\n\t| 'replay'\n\t| 'easing'\n\t| 'relativeTo'\n\t| 'offsetTop'\n\t| 'offsetBottom';\n\ntype InteractionsControlPropsMap = {\n\ttrigger: FieldProps;\n\teffect: FieldProps;\n\teffectType: FieldProps;\n\tdirection: DirectionFieldProps;\n\tduration: FieldProps;\n\tdelay: FieldProps;\n\treplay: ReplayFieldProps;\n\teasing: FieldProps;\n\trelativeTo: FieldProps;\n\toffsetTop: FieldProps;\n\toffsetBottom: FieldProps;\n};\n\ntype ControlOptions< T extends InteractionsControlType > = {\n\ttype: T;\n\tcomponent: ComponentType< InteractionsControlPropsMap[ T ] >;\n\toptions?: string[];\n};\n\ntype StoredControlOptions = {\n\ttype: InteractionsControlType;\n\tcomponent: ComponentType< FieldProps | DirectionFieldProps | ReplayFieldProps >;\n\toptions?: string[];\n};\n\nconst controlsRegistry = new Map< InteractionsControlType, StoredControlOptions >();\n\nexport function registerInteractionsControl< T extends InteractionsControlType >( {\n\ttype,\n\tcomponent,\n\toptions,\n}: ControlOptions< T > ) {\n\tcontrolsRegistry.set( type, { type, component: component as StoredControlOptions[ 'component' ], options } );\n}\n\nexport function getInteractionsControl( type: InteractionsControlType ) {\n\treturn controlsRegistry.get( type );\n}\n\nexport function getInteractionsControlOptions( type: InteractionsControlType ) {\n\treturn controlsRegistry.get( type )?.options ?? [];\n}\n","import * as React from 'react';\nimport { useMemo } from 'react';\nimport { type ToggleButtonGroupItem, ToggleButtonGroupUi } from '@elementor/editor-controls';\nimport { ArrowDownSmallIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpSmallIcon } from '@elementor/icons';\nimport { __ } from '@wordpress/i18n';\n\nimport { type DirectionFieldProps } from '../../types';\n\ntype Direction = 'top' | 'bottom' | 'left' | 'right';\n\nexport function Direction( { value, onChange, interactionType }: DirectionFieldProps ) {\n\tconst options: ToggleButtonGroupItem< Direction >[] = useMemo( () => {\n\t\tconst isIn = interactionType === 'in';\n\n\t\treturn [\n\t\t\t{\n\t\t\t\tvalue: 'top',\n\t\t\t\tlabel: isIn ? __( 'From top', 'elementor' ) : __( 'To top', 'elementor' ),\n\t\t\t\trenderContent: ( { size } ) =>\n\t\t\t\t\tisIn ? <ArrowDownSmallIcon fontSize={ size } /> : <ArrowUpSmallIcon fontSize={ size } />,\n\t\t\t\tshowTooltip: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tvalue: 'bottom',\n\t\t\t\tlabel: interactionType === 'in' ? __( 'From bottom', 'elementor' ) : __( 'To bottom', 'elementor' ),\n\t\t\t\trenderContent: ( { size } ) =>\n\t\t\t\t\tisIn ? <ArrowUpSmallIcon fontSize={ size } /> : <ArrowDownSmallIcon fontSize={ size } />,\n\t\t\t\tshowTooltip: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tvalue: 'left',\n\t\t\t\tlabel: interactionType === 'in' ? __( 'From left', 'elementor' ) : __( 'To left', 'elementor' ),\n\t\t\t\trenderContent: ( { size } ) =>\n\t\t\t\t\tisIn ? <ArrowRightIcon fontSize={ size } /> : <ArrowLeftIcon fontSize={ size } />,\n\t\t\t\tshowTooltip: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tvalue: 'right',\n\t\t\t\tlabel: interactionType === 'in' ? __( 'From right', 'elementor' ) : __( 'To right', 'elementor' ),\n\t\t\t\trenderContent: ( { size } ) =>\n\t\t\t\t\tisIn ? <ArrowLeftIcon fontSize={ size } /> : <ArrowRightIcon fontSize={ size } />,\n\t\t\t\tshowTooltip: true,\n\t\t\t},\n\t\t];\n\t}, [ interactionType ] );\n\n\treturn <ToggleButtonGroupUi items={ options } exclusive onChange={ onChange } value={ value } />;\n}\n","import * as React from 'react';\nimport { MenuListItem } from '@elementor/editor-ui';\nimport { Select, type SelectChangeEvent } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { type FieldProps } from '../../types';\n\nexport function Effect( { value, onChange }: FieldProps ) {\n\tconst availableEffects = [\n\t\t{ key: 'fade', label: __( 'Fade', 'elementor' ) },\n\t\t{ key: 'slide', label: __( 'Slide', 'elementor' ) },\n\t\t{ key: 'scale', label: __( 'Scale', 'elementor' ) },\n\t];\n\n\treturn (\n\t\t<Select\n\t\t\tfullWidth\n\t\t\tdisplayEmpty\n\t\t\tsize=\"tiny\"\n\t\t\tvalue={ value }\n\t\t\tonChange={ ( event: SelectChangeEvent< string > ) => onChange( event.target.value ) }\n\t\t>\n\t\t\t{ availableEffects.map( ( effect ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<MenuListItem key={ effect.key } value={ effect.key }>\n\t\t\t\t\t\t{ effect.label }\n\t\t\t\t\t</MenuListItem>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t</Select>\n\t);\n}\n","import * as React from 'react';\nimport { type ToggleButtonGroupItem, ToggleButtonGroupUi } from '@elementor/editor-controls';\nimport { __ } from '@wordpress/i18n';\n\nimport { type FieldProps } from '../../types';\n\ntype EffectType = 'in' | 'out';\n\nexport function EffectType( { value, onChange }: FieldProps ) {\n\tconst options: ToggleButtonGroupItem< EffectType >[] = [\n\t\t{\n\t\t\tvalue: 'in',\n\t\t\tlabel: __( 'In', 'elementor' ),\n\t\t\trenderContent: () => __( 'In', 'elementor' ),\n\t\t\tshowTooltip: true,\n\t\t},\n\t\t{\n\t\t\tvalue: 'out',\n\t\t\tlabel: __( 'Out', 'elementor' ),\n\t\t\trenderContent: () => __( 'Out', 'elementor' ),\n\t\t\tshowTooltip: true,\n\t\t},\n\t];\n\n\treturn <ToggleButtonGroupUi items={ options } exclusive onChange={ onChange } value={ value } />;\n}\n","import * as React from 'react';\nimport { useCallback } from 'react';\nimport { UnstableSizeField } from '@elementor/editor-controls';\nimport { sizePropTypeUtil, type SizePropValue } from '@elementor/editor-props';\n\nimport { type FieldProps } from '../../types';\n\nconst DEFAULT_UNIT = 'ms';\n\nexport function TimeFrameIndicator( { value, onChange, defaultValue }: FieldProps & { defaultValue: number } ) {\n\tconst sizeValue = toSizeValue( value ?? defaultValue );\n\n\tconst setValue = useCallback(\n\t\t( size: number ) => {\n\t\t\tonChange( String( size ) );\n\t\t},\n\t\t[ onChange ]\n\t);\n\n\tconst handleChange = ( newValue: SizePropValue[ 'value' ] ) => {\n\t\tsetValue( newValue.size as number );\n\t};\n\n\tconst handleBlur = () => {\n\t\tif ( ! sizeValue.size ) {\n\t\t\tsetValue( defaultValue );\n\t\t}\n\t};\n\n\treturn (\n\t\t<UnstableSizeField\n\t\t\tunits={ [ DEFAULT_UNIT ] }\n\t\t\tvalue={ sizeValue }\n\t\t\tonChange={ handleChange }\n\t\t\tonBlur={ handleBlur }\n\t\t/>\n\t);\n}\n\nconst toSizeValue = ( value: string ): SizePropValue[ 'value' ] => {\n\treturn sizePropTypeUtil.create( {\n\t\tsize: Number( value ),\n\t\tunit: DEFAULT_UNIT,\n\t} ).value;\n};\n","import { type InteractionsConfig } from '../types';\n\nconst DEFAULT_CONFIG: InteractionsConfig = {\n\tconstants: {\n\t\tdefaultDuration: 300,\n\t\tdefaultDelay: 0,\n\t\tslideDistance: 100,\n\t\tscaleStart: 0.5,\n\t\teasing: 'linear',\n\t},\n\tanimationOptions: [],\n};\n\nexport function getInteractionsConfig(): InteractionsConfig {\n\treturn window.ElementorInteractionsConfig || DEFAULT_CONFIG;\n}\n","import { type InteractionsProvider } from '../types';\n\nexport const createInteractionsRepository = () => {\n\tconst providers: InteractionsProvider[] = [];\n\n\tconst getProviders = () => {\n\t\tconst sorted = providers.slice( 0 ).sort( ( a, b ) => ( a.priority > b.priority ? -1 : 1 ) );\n\t\treturn sorted;\n\t};\n\n\tconst register = ( provider: InteractionsProvider ) => {\n\t\tproviders.push( provider );\n\t};\n\n\tconst all = () => {\n\t\treturn getProviders().flatMap( ( provider ) => provider.actions.all() );\n\t};\n\n\tconst subscribe = ( cb: () => void ) => {\n\t\tconst unsubscribes = providers.map( ( provider ) => provider.subscribe( cb ) );\n\n\t\treturn () => {\n\t\t\tunsubscribes.forEach( ( unsubscribe ) => unsubscribe() );\n\t\t};\n\t};\n\n\tconst getProviderByKey = ( key: string ) => {\n\t\treturn providers.find( ( provider ) => {\n\t\t\ttry {\n\t\t\t\treturn provider.getKey() === key;\n\t\t\t} catch {\n\t\t\t\t// Provider might not be ready yet (e.g., no document loaded)\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} );\n\t};\n\n\treturn {\n\t\tall,\n\t\tregister,\n\t\tsubscribe,\n\t\tgetProviders,\n\t\tgetProviderByKey,\n\t};\n};\n","import { createInteractionsRepository } from './utils/create-interactions-repository';\n\nexport const interactionsRepository = createInteractionsRepository();\n","import { type InteractionsProvider } from '../types';\n\nexport type CreateInteractionsProviderOptions = {\n\tkey: string | ( () => string );\n\tpriority?: number;\n\tsubscribe?: ( callback: () => void ) => () => void;\n\tactions: {\n\t\tall: InteractionsProvider[ 'actions' ][ 'all' ];\n\t};\n};\n\nconst DEFAULT_PRIORITY = 10;\n\nexport function createInteractionsProvider( {\n\tkey,\n\tpriority = DEFAULT_PRIORITY,\n\tsubscribe = () => () => {},\n\tactions,\n}: CreateInteractionsProviderOptions ): InteractionsProvider {\n\treturn {\n\t\tgetKey: typeof key === 'string' ? () => key : key,\n\t\tpriority,\n\t\tsubscribe,\n\t\tactions: {\n\t\t\tall: actions.all,\n\t\t},\n\t};\n}\n","import { getCurrentDocumentId, getElementInteractions, getElements } from '@elementor/editor-elements';\nimport { __privateListenTo as listenTo, windowEvent } from '@elementor/editor-v1-adapters';\n\nimport { createInteractionsProvider } from '../utils/create-interactions-provider';\n\nexport const ELEMENTS_INTERACTIONS_PROVIDER_KEY_PREFIX = 'document-elements-interactions-';\n\nexport const documentElementsInteractionsProvider = createInteractionsProvider( {\n\tkey: () => {\n\t\tconst documentId = getCurrentDocumentId();\n\n\t\tif ( ! documentId ) {\n\t\t\tconst pendingKey = `${ ELEMENTS_INTERACTIONS_PROVIDER_KEY_PREFIX }pending`;\n\t\t\treturn pendingKey;\n\t\t}\n\n\t\tconst key = `${ ELEMENTS_INTERACTIONS_PROVIDER_KEY_PREFIX }${ documentId }`;\n\t\treturn key;\n\t},\n\tpriority: 50,\n\tsubscribe: ( cb ) => {\n\t\treturn listenTo( [ windowEvent( 'elementor/element/update_interactions' ) ], () => cb() );\n\t},\n\tactions: {\n\t\tall: () => {\n\t\t\tconst elements = getElements();\n\n\t\t\tconst filtered = elements.filter( ( element ) => {\n\t\t\t\tconst interactions = getElementInteractions( element.id );\n\t\t\t\tif ( ! interactions ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn interactions?.items?.length > 0;\n\t\t\t} );\n\n\t\t\treturn filtered.map( ( element ) => {\n\t\t\t\tconst interactions = getElementInteractions( element.id );\n\t\t\t\treturn {\n\t\t\t\t\telementId: element.id,\n\t\t\t\t\tdataId: element.id,\n\t\t\t\t\tinteractions: interactions || { version: 1, items: [] },\n\t\t\t\t};\n\t\t\t} );\n\t\t},\n\t},\n} );\n","import * as React from 'react';\nimport { MenuListItem } from '@elementor/editor-ui';\nimport { Select } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { type FieldProps } from '../../types';\n\nconst EASING_OPTIONS = {\n\teaseIn: __( 'Ease In', 'elementor' ),\n\teaseInOut: __( 'Ease In Out', 'elementor' ),\n\teaseOut: __( 'Ease Out', 'elementor' ),\n\tbackIn: __( 'Back In', 'elementor' ),\n\tbackInOut: __( 'Back In Out', 'elementor' ),\n\tbackOut: __( 'Back Out', 'elementor' ),\n\tlinear: __( 'Linear', 'elementor' ),\n};\n\nconst DEFAULT_EASING = 'easeIn';\n\nexport function Easing( {}: FieldProps ) {\n\tconst availableOptions = Object.entries( EASING_OPTIONS ).map( ( [ key, label ] ) => ( {\n\t\tkey,\n\t\tlabel,\n\t} ) );\n\n\treturn (\n\t\t<Select value={ DEFAULT_EASING } onChange={ () => {} } fullWidth displayEmpty size=\"tiny\">\n\t\t\t{ availableOptions.map( ( option ) => {\n\t\t\t\tconst isDisabled = DEFAULT_EASING !== option.key;\n\t\t\t\treturn (\n\t\t\t\t\t<MenuListItem key={ option.key } value={ option.key } disabled={ isDisabled }>\n\t\t\t\t\t\t{ option.label }\n\t\t\t\t\t</MenuListItem>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t</Select>\n\t);\n}\n","import * as React from 'react';\nimport { MenuListItem } from '@elementor/editor-ui';\nimport { Select, type SelectChangeEvent } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { type FieldProps } from '../../types';\n\nexport function Trigger( { value, onChange }: FieldProps ) {\n\tconst availableTriggers = Object.entries( {\n\t\tload: __( 'Page load', 'elementor' ),\n\t\tscrollIn: __( 'Scroll into view', 'elementor' ),\n\t} ).map( ( [ key, label ] ) => ( {\n\t\tkey,\n\t\tlabel,\n\t} ) );\n\n\treturn (\n\t\t<Select\n\t\t\tfullWidth\n\t\t\tdisplayEmpty\n\t\t\tsize=\"tiny\"\n\t\t\tonChange={ ( event: SelectChangeEvent< string > ) => onChange( event.target.value ) }\n\t\t\tvalue={ value }\n\t\t>\n\t\t\t{ availableTriggers.map( ( trigger ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<MenuListItem key={ trigger.key } value={ trigger.key }>\n\t\t\t\t\t\t{ trigger.label }\n\t\t\t\t\t</MenuListItem>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t</Select>\n\t);\n}\n","import { type ElementID, getAllDescendants, getContainer, type V1Element } from '@elementor/editor-elements';\nimport { registerDataHook } from '@elementor/editor-v1-adapters';\n\nimport type { ElementInteractions } from '../types';\nimport { createString } from '../utils/prop-value-utils';\nimport { generateTempInteractionId } from '../utils/temp-id-utils';\n\nexport function initCleanInteractionIdsOnDuplicate() {\n\tregisterDataHook( 'after', 'document/elements/duplicate', ( _args, result: V1Element | V1Element[] ) => {\n\t\tconst containers = Array.isArray( result ) ? result : [ result ];\n\n\t\tcontainers.forEach( ( container ) => {\n\t\t\tcleanInteractionIdsRecursive( container.id );\n\t\t} );\n\t} );\n}\n\nfunction cleanInteractionIdsRecursive( elementId: ElementID ) {\n\tconst container = getContainer( elementId );\n\n\tif ( ! container ) {\n\t\treturn;\n\t}\n\n\tgetAllDescendants( container ).forEach( ( element: V1Element ) => {\n\t\tcleanInteractionIds( element.id as ElementID );\n\t} );\n}\n\nfunction cleanInteractionIds( elementId: ElementID ) {\n\tconst container = getContainer( elementId );\n\n\tif ( ! container ) {\n\t\treturn;\n\t}\n\n\tconst interactions = container.model.get( 'interactions' ) as ElementInteractions;\n\n\tif ( ! interactions || ! interactions.items ) {\n\t\treturn;\n\t}\n\n\tconst updatedInteractions = structuredClone( interactions ) as ElementInteractions;\n\n\tupdatedInteractions?.items?.forEach( ( interaction ) => {\n\t\tif ( interaction.$$type === 'interaction-item' && interaction.value ) {\n\t\t\tinteraction.value.interaction_id = createString( generateTempInteractionId() );\n\t\t}\n\t} );\n\n\tcontainer.model.set( 'interactions', updatedInteractions );\n}\n","import { Easing } from './components/controls/easing';\nimport { Trigger } from './components/controls/trigger';\nimport { initCleanInteractionIdsOnDuplicate } from './hooks/on-duplicate';\nimport { registerInteractionsControl } from './interactions-controls-registry';\nimport { interactionsRepository } from './interactions-repository';\nimport { documentElementsInteractionsProvider } from './providers/document-elements-interactions-provider';\n\nexport function init() {\n\ttry {\n\t\tinteractionsRepository.register( documentElementsInteractionsProvider );\n\t\tinitCleanInteractionIdsOnDuplicate();\n\t\tregisterInteractionsControl( {\n\t\t\ttype: 'trigger',\n\t\t\tcomponent: Trigger,\n\t\t\toptions: [ 'load', 'scrollIn' ],\n\t\t} );\n\n\t\tregisterInteractionsControl( {\n\t\t\ttype: 'easing',\n\t\t\tcomponent: Easing,\n\t\t\toptions: [ 'easeIn' ],\n\t\t} );\n\t} catch ( error ) {\n\t\tthrow error;\n\t}\n}\n"],"mappings":"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","names":["React","useCallback","useState","useElementInteractions","Stack","React","React","createContext","useContext","React","createContext","useCallback","useContext","useEffect","useMemo","__","React","useMemo","__","React","__","React","__","React","ToggleButtonGroupUi","__","React","useCallback","useMemo","__","createContext","useCallback","useEffect","useMemo","__","useContext","useElementInteractions","useState","useCallback","Stack","React","MenuListItem","Select","__","React","MenuListItem","Select","__"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elementor/editor-interactions",
|
|
3
|
-
"version": "4.0.0-
|
|
3
|
+
"version": "4.0.0-500",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": "Elementor Team",
|
|
6
6
|
"homepage": "https://elementor.com/",
|
|
@@ -39,15 +39,15 @@
|
|
|
39
39
|
"dev": "tsup --config=../../tsup.dev.ts"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@elementor/editor-controls": "4.0.0-
|
|
43
|
-
"@elementor/editor-elements": "4.0.0-
|
|
44
|
-
"@elementor/editor-props": "4.0.0-
|
|
45
|
-
"@elementor/editor-ui": "4.0.0-
|
|
46
|
-
"@elementor/editor-v1-adapters": "4.0.0-
|
|
42
|
+
"@elementor/editor-controls": "4.0.0-500",
|
|
43
|
+
"@elementor/editor-elements": "4.0.0-500",
|
|
44
|
+
"@elementor/editor-props": "4.0.0-500",
|
|
45
|
+
"@elementor/editor-ui": "4.0.0-500",
|
|
46
|
+
"@elementor/editor-v1-adapters": "4.0.0-500",
|
|
47
47
|
"@elementor/icons": "^1.63.0",
|
|
48
|
-
"@elementor/session": "4.0.0-
|
|
48
|
+
"@elementor/session": "4.0.0-500",
|
|
49
49
|
"@elementor/ui": "1.36.17",
|
|
50
|
-
"@elementor/utils": "4.0.0-
|
|
50
|
+
"@elementor/utils": "4.0.0-500",
|
|
51
51
|
"@wordpress/i18n": "^5.13.0"
|
|
52
52
|
},
|
|
53
53
|
"peerDependencies": {
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { MenuListItem } from '@elementor/editor-ui';
|
|
3
|
+
import { Select } from '@elementor/ui';
|
|
4
|
+
import { __ } from '@wordpress/i18n';
|
|
5
|
+
|
|
6
|
+
import { type FieldProps } from '../../types';
|
|
7
|
+
|
|
8
|
+
const EASING_OPTIONS = {
|
|
9
|
+
easeIn: __( 'Ease In', 'elementor' ),
|
|
10
|
+
easeInOut: __( 'Ease In Out', 'elementor' ),
|
|
11
|
+
easeOut: __( 'Ease Out', 'elementor' ),
|
|
12
|
+
backIn: __( 'Back In', 'elementor' ),
|
|
13
|
+
backInOut: __( 'Back In Out', 'elementor' ),
|
|
14
|
+
backOut: __( 'Back Out', 'elementor' ),
|
|
15
|
+
linear: __( 'Linear', 'elementor' ),
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const DEFAULT_EASING = 'easeIn';
|
|
19
|
+
|
|
20
|
+
export function Easing( {}: FieldProps ) {
|
|
21
|
+
const availableOptions = Object.entries( EASING_OPTIONS ).map( ( [ key, label ] ) => ( {
|
|
22
|
+
key,
|
|
23
|
+
label,
|
|
24
|
+
} ) );
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<Select value={ DEFAULT_EASING } onChange={ () => {} } fullWidth displayEmpty size="tiny">
|
|
28
|
+
{ availableOptions.map( ( option ) => {
|
|
29
|
+
const isDisabled = DEFAULT_EASING !== option.key;
|
|
30
|
+
return (
|
|
31
|
+
<MenuListItem key={ option.key } value={ option.key } disabled={ isDisabled }>
|
|
32
|
+
{ option.label }
|
|
33
|
+
</MenuListItem>
|
|
34
|
+
);
|
|
35
|
+
} ) }
|
|
36
|
+
</Select>
|
|
37
|
+
);
|
|
38
|
+
}
|