@elementor/editor-interactions 3.35.0-484 → 3.35.0-486

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 CHANGED
@@ -79,7 +79,7 @@ declare const ELEMENTS_INTERACTIONS_PROVIDER_KEY_PREFIX = "document-elements-int
79
79
 
80
80
  declare function init(): void;
81
81
 
82
- type InteractionsControlType = 'trigger' | 'effect' | 'effectType' | 'direction' | 'duration' | 'delay' | 'replay';
82
+ type InteractionsControlType = 'trigger' | 'effect' | 'effectType' | 'direction' | 'duration' | 'delay' | 'replay' | 'relativeTo' | 'offsetTop' | 'offsetBottom';
83
83
  type InteractionsControlPropsMap = {
84
84
  trigger: FieldProps;
85
85
  effect: FieldProps;
@@ -88,6 +88,9 @@ type InteractionsControlPropsMap = {
88
88
  duration: FieldProps;
89
89
  delay: FieldProps;
90
90
  replay: ReplayFieldProps;
91
+ relativeTo: FieldProps;
92
+ offsetTop: FieldProps;
93
+ offsetBottom: FieldProps;
91
94
  };
92
95
  type ControlOptions<T extends InteractionsControlType> = {
93
96
  type: T;
package/dist/index.d.ts CHANGED
@@ -79,7 +79,7 @@ declare const ELEMENTS_INTERACTIONS_PROVIDER_KEY_PREFIX = "document-elements-int
79
79
 
80
80
  declare function init(): void;
81
81
 
82
- type InteractionsControlType = 'trigger' | 'effect' | 'effectType' | 'direction' | 'duration' | 'delay' | 'replay';
82
+ type InteractionsControlType = 'trigger' | 'effect' | 'effectType' | 'direction' | 'duration' | 'delay' | 'replay' | 'relativeTo' | 'offsetTop' | 'offsetBottom';
83
83
  type InteractionsControlPropsMap = {
84
84
  trigger: FieldProps;
85
85
  effect: FieldProps;
@@ -88,6 +88,9 @@ type InteractionsControlPropsMap = {
88
88
  duration: FieldProps;
89
89
  delay: FieldProps;
90
90
  replay: ReplayFieldProps;
91
+ relativeTo: FieldProps;
92
+ offsetTop: FieldProps;
93
+ offsetBottom: FieldProps;
91
94
  };
92
95
  type ControlOptions<T extends InteractionsControlType> = {
93
96
  type: T;
package/dist/index.js CHANGED
@@ -163,10 +163,13 @@ var createBoolean = (value) => ({
163
163
  $$type: "boolean",
164
164
  value
165
165
  });
166
- var createConfig = (replay) => ({
166
+ var createConfig = (replay, relativeTo, offsetTop, offsetBottom) => ({
167
167
  $$type: "config",
168
168
  value: {
169
- replay: createBoolean(replay)
169
+ replay: createBoolean(replay),
170
+ relativeTo: createString(relativeTo ?? ""),
171
+ offsetTop: createNumber(offsetTop ?? 0),
172
+ offsetBottom: createNumber(offsetBottom ?? 100)
170
173
  }
171
174
  });
172
175
  var extractBoolean = (prop, fallback = false) => {
@@ -178,7 +181,10 @@ var createAnimationPreset = ({
178
181
  direction,
179
182
  duration,
180
183
  delay,
181
- replay = false
184
+ replay = false,
185
+ relativeTo,
186
+ offsetTop,
187
+ offsetBottom
182
188
  }) => ({
183
189
  $$type: "animation-preset-props",
184
190
  value: {
@@ -186,7 +192,7 @@ var createAnimationPreset = ({
186
192
  type: createString(type),
187
193
  direction: createString(direction ?? ""),
188
194
  timing_config: createTimingConfig(duration, delay),
189
- config: createConfig(replay)
195
+ config: createConfig(replay, relativeTo, offsetTop, offsetBottom)
190
196
  }
191
197
  });
192
198
  var createInteractionItem = ({
@@ -197,13 +203,26 @@ var createInteractionItem = ({
197
203
  duration,
198
204
  delay,
199
205
  interactionId,
200
- replay = false
206
+ replay = false,
207
+ relativeTo,
208
+ offsetTop,
209
+ offsetBottom
201
210
  }) => ({
202
211
  $$type: "interaction-item",
203
212
  value: {
204
213
  ...interactionId && { interaction_id: createString(interactionId) },
205
214
  trigger: createString(trigger),
206
- animation: createAnimationPreset({ effect, type, direction, duration, delay, replay })
215
+ animation: createAnimationPreset({
216
+ effect,
217
+ type,
218
+ direction,
219
+ duration,
220
+ delay,
221
+ replay,
222
+ relativeTo,
223
+ offsetTop,
224
+ offsetBottom
225
+ })
207
226
  }
208
227
  });
209
228
  var createDefaultInteractionItem = () => {
@@ -385,7 +404,10 @@ var DEFAULT_VALUES = {
385
404
  direction: "",
386
405
  duration: 300,
387
406
  delay: 0,
388
- replay: false
407
+ replay: false,
408
+ relativeTo: "viewport",
409
+ offsetTop: 15,
410
+ offsetBottom: 85
389
411
  };
390
412
  var TRIGGERS_WITH_REPLAY = ["scrollIn", "scrollOut"];
391
413
  var InteractionDetails = ({ interaction, onChange, onPlayInteraction }) => {
@@ -396,7 +418,14 @@ var InteractionDetails = ({ interaction, onChange, onPlayInteraction }) => {
396
418
  const duration = extractNumber(interaction.animation.value.timing_config.value.duration, DEFAULT_VALUES.duration);
397
419
  const delay = extractNumber(interaction.animation.value.timing_config.value.delay, DEFAULT_VALUES.delay);
398
420
  const replay = extractBoolean(interaction.animation.value.config?.value.replay, DEFAULT_VALUES.replay);
421
+ const relativeTo = extractString(interaction.animation.value.config?.value.relativeTo, DEFAULT_VALUES.relativeTo);
422
+ const offsetTop = extractNumber(interaction.animation.value.config?.value.offsetTop, DEFAULT_VALUES.offsetTop);
423
+ const offsetBottom = extractNumber(
424
+ interaction.animation.value.config?.value.offsetBottom,
425
+ DEFAULT_VALUES.offsetBottom
426
+ );
399
427
  const shouldShowReplay = TRIGGERS_WITH_REPLAY.includes(trigger);
428
+ const shouldShowRelativeTo = trigger === "scrollOn";
400
429
  const TriggerControl = (0, import_react4.useMemo)(() => {
401
430
  return getInteractionsControl("trigger")?.component ?? null;
402
431
  }, []);
@@ -406,6 +435,24 @@ var InteractionDetails = ({ interaction, onChange, onPlayInteraction }) => {
406
435
  }
407
436
  return getInteractionsControl("replay")?.component ?? null;
408
437
  }, [shouldShowReplay]);
438
+ const RelativeToControl = (0, import_react4.useMemo)(() => {
439
+ if (!shouldShowRelativeTo) {
440
+ return null;
441
+ }
442
+ return getInteractionsControl("relativeTo")?.component ?? null;
443
+ }, [shouldShowRelativeTo]);
444
+ const OffsetTopControl = (0, import_react4.useMemo)(() => {
445
+ if (!shouldShowRelativeTo) {
446
+ return null;
447
+ }
448
+ return getInteractionsControl("offsetTop")?.component ?? null;
449
+ }, [shouldShowRelativeTo]);
450
+ const OffsetBottomControl = (0, import_react4.useMemo)(() => {
451
+ if (!shouldShowRelativeTo) {
452
+ return null;
453
+ }
454
+ return getInteractionsControl("offsetBottom")?.component ?? null;
455
+ }, [shouldShowRelativeTo]);
409
456
  const resolveDirection = (hasDirection, newEffect, newDirection) => {
410
457
  if (newEffect === "slide" && !newDirection) {
411
458
  return "top";
@@ -428,7 +475,10 @@ var InteractionDetails = ({ interaction, onChange, onPlayInteraction }) => {
428
475
  direction: resolvedDirectionValue,
429
476
  duration: updates.duration ?? duration,
430
477
  delay: updates.delay ?? delay,
431
- replay: newReplay
478
+ replay: newReplay,
479
+ relativeTo: updates.relativeTo ?? relativeTo,
480
+ offsetTop: updates.offsetTop ?? offsetTop,
481
+ offsetBottom: updates.offsetBottom ?? offsetBottom
432
482
  })
433
483
  };
434
484
  onChange(updatedInteraction);
@@ -463,7 +513,25 @@ var InteractionDetails = ({ interaction, onChange, onPlayInteraction }) => {
463
513
  value: String(delay),
464
514
  onChange: (v) => updateInteraction({ delay: parseInt(v, 10) })
465
515
  }
466
- ))));
516
+ ))), shouldShowRelativeTo && RelativeToControl && /* @__PURE__ */ React8.createElement(React8.Fragment, null, /* @__PURE__ */ React8.createElement(import_ui4.Divider, null), /* @__PURE__ */ React8.createElement(import_ui4.Grid, { container: true, spacing: 1.5 }, /* @__PURE__ */ React8.createElement(Field, { label: (0, import_i18n6.__)("Relative To", "elementor") }, /* @__PURE__ */ React8.createElement(
517
+ RelativeToControl,
518
+ {
519
+ value: relativeTo,
520
+ onChange: (v) => updateInteraction({ relativeTo: v })
521
+ }
522
+ )), OffsetTopControl && /* @__PURE__ */ React8.createElement(Field, { label: (0, import_i18n6.__)("Offset Top", "elementor") }, /* @__PURE__ */ React8.createElement(
523
+ OffsetTopControl,
524
+ {
525
+ value: String(offsetTop),
526
+ onChange: (v) => updateInteraction({ offsetTop: parseInt(v, 10) })
527
+ }
528
+ )), OffsetBottomControl && /* @__PURE__ */ React8.createElement(Field, { label: (0, import_i18n6.__)("Offset Bottom", "elementor") }, /* @__PURE__ */ React8.createElement(
529
+ OffsetBottomControl,
530
+ {
531
+ value: String(offsetBottom),
532
+ onChange: (v) => updateInteraction({ offsetBottom: parseInt(v, 10) })
533
+ }
534
+ ))), /* @__PURE__ */ React8.createElement(import_ui4.Divider, null)));
467
535
  };
468
536
  function Field({ label, children }) {
469
537
  return /* @__PURE__ */ React8.createElement(import_ui4.Grid, { item: true, xs: 12 }, /* @__PURE__ */ React8.createElement(import_editor_controls3.PopoverGridContainer, null, /* @__PURE__ */ React8.createElement(import_ui4.Grid, { item: true, xs: 6 }, /* @__PURE__ */ React8.createElement(import_editor_controls3.ControlFormLabel, null, label)), /* @__PURE__ */ React8.createElement(import_ui4.Grid, { item: true, xs: 6 }, children)));
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../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":["export * from './components/empty-state';\nexport * from './components/interactions-tab';\nexport * from './types';\nexport * from './utils/get-interactions-config';\n\nexport { interactionsRepository } from './interactions-repository';\nexport {\n\tcreateInteractionsProvider,\n\ttype CreateInteractionsProviderOptions,\n} from './utils/create-interactions-provider';\n\nexport { ELEMENTS_INTERACTIONS_PROVIDER_KEY_PREFIX } from './providers/document-elements-interactions-provider';\nexport { init } from './init';\nexport { registerInteractionsControl } from './interactions-controls-registry';\n","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 { useCallback, 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\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\treturn (\n\t\t<Repeater\n\t\t\topenOnAdd\n\t\t\topenItem={ triggerCreateOnShowEmpty ? 0 : undefined }\n\t\t\tlabel={ __( 'Interactions', 'elementor' ) }\n\t\t\tvalues={ interactions.items }\n\t\t\tsetValues={ handleRepeaterChange }\n\t\t\tshowDuplicate={ false }\n\t\t\tshowToggle={ false }\n\t\t\tisSortable={ false }\n\t\t\tdisableAddItemButton={ isMaxNumberOfInteractionsReached }\n\t\t\taddButtonInfotipContent={ infotipContent }\n\t\t\titemSettings={ {\n\t\t\t\tinitialValues: createDefaultInteractionItem(),\n\t\t\t\tLabel: ( { value }: { value: InteractionItemPropValue } ) => buildDisplayLabel( value.value ),\n\t\t\t\tIcon: () => null,\n\t\t\t\tContent: ( { index, value }: { index: number; value: InteractionItemPropValue } ) => (\n\t\t\t\t\t<InteractionDetails\n\t\t\t\t\t\tkey={ index }\n\t\t\t\t\t\tinteraction={ value.value }\n\t\t\t\t\t\tonChange={ ( newInteractionValue: InteractionItemValue ) => {\n\t\t\t\t\t\t\thandleInteractionChange( index, newInteractionValue );\n\t\t\t\t\t\t} }\n\t\t\t\t\t\tonPlayInteraction={ onPlayInteraction }\n\t\t\t\t\t/>\n\t\t\t\t),\n\t\t\t\tactions: ( value: InteractionItemPropValue ) => (\n\t\t\t\t\t<Tooltip key=\"preview\" placement=\"top\" title={ __( 'Preview', 'elementor' ) }>\n\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\taria-label={ __( 'Play interaction', 'elementor' ) }\n\t\t\t\t\t\t\tsize=\"tiny\"\n\t\t\t\t\t\t\tonClick={ () => onPlayInteraction( extractString( value.value.interaction_id ) ) }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<PlayerPlayIcon fontSize=\"tiny\" />\n\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t),\n\t\t\t} }\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 = ( replay: boolean ): ConfigPropValue => ( {\n\t$$type: 'config',\n\tvalue: {\n\t\treplay: createBoolean( replay ),\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}: {\n\teffect: string;\n\ttype: string;\n\tdirection?: string;\n\tduration: number;\n\tdelay: number;\n\treplay: boolean;\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 ),\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}: {\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} ): 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( { effect, type, direction, duration, delay, replay } ),\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: 300,\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\nexport const buildAnimationIdString = ( 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\tconst direction = extractString( item.animation.value.direction );\n\tconst duration = extractNumber( item.animation.value.timing_config.value.duration );\n\tconst delay = extractNumber( item.animation.value.timing_config.value.delay );\n\n\treturn [ trigger, effect, type, direction, duration, delay ].join( '-' );\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: 300,\n\tdelay: 0,\n\treplay: false,\n};\n\nconst TRIGGERS_WITH_REPLAY = [ 'scrollIn', 'scrollOut' ];\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\n\tconst shouldShowReplay = TRIGGERS_WITH_REPLAY.includes( trigger );\n\n\tconst TriggerControl = useMemo( () => {\n\t\treturn getInteractionsControl( 'trigger' )?.component ?? null;\n\t}, [] );\n\n\tconst ReplayControl = useMemo( () => {\n\t\tif ( ! shouldShowReplay ) {\n\t\t\treturn null;\n\t\t}\n\t\treturn getInteractionsControl( 'replay' )?.component ?? null;\n\t}, [ shouldShowReplay ] );\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} >\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} ),\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<Field label={ __( 'Duration', 'elementor' ) }>\n\t\t\t\t\t<TimeFrameIndicator\n\t\t\t\t\t\tvalue={ String( duration ) }\n\t\t\t\t\t\tonChange={ ( v ) => updateInteraction( { duration: parseInt( v, 10 ) } ) }\n\t\t\t\t\t/>\n\t\t\t\t</Field>\n\n\t\t\t\t<Field label={ __( 'Delay', 'elementor' ) }>\n\t\t\t\t\t<TimeFrameIndicator\n\t\t\t\t\t\tvalue={ String( delay ) }\n\t\t\t\t\t\tonChange={ ( v ) => updateInteraction( { delay: parseInt( v, 10 ) } ) }\n\t\t\t\t\t/>\n\t\t\t\t</Field>\n\t\t\t</Grid>\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 = 'trigger' | 'effect' | 'effectType' | 'direction' | 'duration' | 'delay' | 'replay';\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};\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 { 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 TimeFrameIndicator( { value, onChange }: FieldProps ) {\n\tconst availableTimeFrames = [ '0', '100', '200', '300', '400', '500', '750', '1000', '1250', '1500' ].map(\n\t\t( key ) => ( {\n\t\t\tkey,\n\t\t\t// translators: %s: time in milliseconds\n\t\t\tlabel: __( '%s MS', 'elementor' ).replace( '%s', key ),\n\t\t} )\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{ availableTimeFrames.map( ( timeFrame ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<MenuListItem key={ timeFrame.key } value={ timeFrame.key }>\n\t\t\t\t\t\t{ timeFrame.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 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","import_react","import_editor_elements","import_ui","React","React","import_react","React","import_react","import_editor_controls","import_icons","import_ui","import_i18n","React","import_react","import_editor_controls","import_ui","import_i18n","React","import_react","import_icons","import_i18n","React","import_ui","import_i18n","React","import_editor_controls","import_i18n","React","import_editor_ui","import_ui","import_i18n","import_editor_elements","listenTo","React","import_editor_ui","import_ui","import_i18n","import_editor_elements","import_editor_v1_adapters"]}
1
+ {"version":3,"sources":["../src/index.ts","../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":["export * from './components/empty-state';\nexport * from './components/interactions-tab';\nexport * from './types';\nexport * from './utils/get-interactions-config';\n\nexport { interactionsRepository } from './interactions-repository';\nexport {\n\tcreateInteractionsProvider,\n\ttype CreateInteractionsProviderOptions,\n} from './utils/create-interactions-provider';\n\nexport { ELEMENTS_INTERACTIONS_PROVIDER_KEY_PREFIX } from './providers/document-elements-interactions-provider';\nexport { init } from './init';\nexport { registerInteractionsControl } from './interactions-controls-registry';\n","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 { useCallback, 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\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\treturn (\n\t\t<Repeater\n\t\t\topenOnAdd\n\t\t\topenItem={ triggerCreateOnShowEmpty ? 0 : undefined }\n\t\t\tlabel={ __( 'Interactions', 'elementor' ) }\n\t\t\tvalues={ interactions.items }\n\t\t\tsetValues={ handleRepeaterChange }\n\t\t\tshowDuplicate={ false }\n\t\t\tshowToggle={ false }\n\t\t\tisSortable={ false }\n\t\t\tdisableAddItemButton={ isMaxNumberOfInteractionsReached }\n\t\t\taddButtonInfotipContent={ infotipContent }\n\t\t\titemSettings={ {\n\t\t\t\tinitialValues: createDefaultInteractionItem(),\n\t\t\t\tLabel: ( { value }: { value: InteractionItemPropValue } ) => buildDisplayLabel( value.value ),\n\t\t\t\tIcon: () => null,\n\t\t\t\tContent: ( { index, value }: { index: number; value: InteractionItemPropValue } ) => (\n\t\t\t\t\t<InteractionDetails\n\t\t\t\t\t\tkey={ index }\n\t\t\t\t\t\tinteraction={ value.value }\n\t\t\t\t\t\tonChange={ ( newInteractionValue: InteractionItemValue ) => {\n\t\t\t\t\t\t\thandleInteractionChange( index, newInteractionValue );\n\t\t\t\t\t\t} }\n\t\t\t\t\t\tonPlayInteraction={ onPlayInteraction }\n\t\t\t\t\t/>\n\t\t\t\t),\n\t\t\t\tactions: ( value: InteractionItemPropValue ) => (\n\t\t\t\t\t<Tooltip key=\"preview\" placement=\"top\" title={ __( 'Preview', 'elementor' ) }>\n\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\taria-label={ __( 'Play interaction', 'elementor' ) }\n\t\t\t\t\t\t\tsize=\"tiny\"\n\t\t\t\t\t\t\tonClick={ () => onPlayInteraction( extractString( value.value.interaction_id ) ) }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<PlayerPlayIcon fontSize=\"tiny\" />\n\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t),\n\t\t\t} }\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: 300,\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\nexport const buildAnimationIdString = ( 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\tconst direction = extractString( item.animation.value.direction );\n\tconst duration = extractNumber( item.animation.value.timing_config.value.duration );\n\tconst delay = extractNumber( item.animation.value.timing_config.value.delay );\n\n\treturn [ trigger, effect, type, direction, duration, delay ].join( '-' );\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: 300,\n\tdelay: 0,\n\treplay: false,\n\trelativeTo: 'viewport',\n\toffsetTop: 15,\n\toffsetBottom: 85,\n};\n\nconst TRIGGERS_WITH_REPLAY = [ 'scrollIn', 'scrollOut' ];\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 shouldShowReplay = TRIGGERS_WITH_REPLAY.includes( trigger );\n\tconst shouldShowRelativeTo = trigger === 'scrollOn';\n\n\tconst TriggerControl = useMemo( () => {\n\t\treturn getInteractionsControl( 'trigger' )?.component ?? null;\n\t}, [] );\n\n\tconst ReplayControl = useMemo( () => {\n\t\tif ( ! shouldShowReplay ) {\n\t\t\treturn null;\n\t\t}\n\t\treturn getInteractionsControl( 'replay' )?.component ?? null;\n\t}, [ shouldShowReplay ] );\n\n\tconst RelativeToControl = useMemo( () => {\n\t\tif ( ! shouldShowRelativeTo ) {\n\t\t\treturn null;\n\t\t}\n\t\treturn getInteractionsControl( 'relativeTo' )?.component ?? null;\n\t}, [ shouldShowRelativeTo ] );\n\n\tconst OffsetTopControl = useMemo( () => {\n\t\tif ( ! shouldShowRelativeTo ) {\n\t\t\treturn null;\n\t\t}\n\t\treturn getInteractionsControl( 'offsetTop' )?.component ?? null;\n\t}, [ shouldShowRelativeTo ] );\n\n\tconst OffsetBottomControl = useMemo( () => {\n\t\tif ( ! shouldShowRelativeTo ) {\n\t\t\treturn null;\n\t\t}\n\t\treturn getInteractionsControl( 'offsetBottom' )?.component ?? null;\n\t}, [ shouldShowRelativeTo ] );\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<Field label={ __( 'Duration', 'elementor' ) }>\n\t\t\t\t\t<TimeFrameIndicator\n\t\t\t\t\t\tvalue={ String( duration ) }\n\t\t\t\t\t\tonChange={ ( v ) => updateInteraction( { duration: parseInt( v, 10 ) } ) }\n\t\t\t\t\t/>\n\t\t\t\t</Field>\n\n\t\t\t\t<Field label={ __( 'Delay', 'elementor' ) }>\n\t\t\t\t\t<TimeFrameIndicator\n\t\t\t\t\t\tvalue={ String( delay ) }\n\t\t\t\t\t\tonChange={ ( v ) => updateInteraction( { delay: parseInt( v, 10 ) } ) }\n\t\t\t\t\t/>\n\t\t\t\t</Field>\n\t\t\t</Grid>\n\t\t\t{ shouldShowRelativeTo && 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 { 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 TimeFrameIndicator( { value, onChange }: FieldProps ) {\n\tconst availableTimeFrames = [ '0', '100', '200', '300', '400', '500', '750', '1000', '1250', '1500' ].map(\n\t\t( key ) => ( {\n\t\t\tkey,\n\t\t\t// translators: %s: time in milliseconds\n\t\t\tlabel: __( '%s MS', 'elementor' ).replace( '%s', key ),\n\t\t} )\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{ availableTimeFrames.map( ( timeFrame ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<MenuListItem key={ timeFrame.key } value={ timeFrame.key }>\n\t\t\t\t\t\t{ timeFrame.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 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","import_react","import_editor_elements","import_ui","React","React","import_react","React","import_react","import_editor_controls","import_icons","import_ui","import_i18n","React","import_react","import_editor_controls","import_ui","import_i18n","React","import_react","import_icons","import_i18n","React","import_ui","import_i18n","React","import_editor_controls","import_i18n","React","import_editor_ui","import_ui","import_i18n","import_editor_elements","listenTo","React","import_editor_ui","import_ui","import_i18n","import_editor_elements","import_editor_v1_adapters"]}
package/dist/index.mjs CHANGED
@@ -124,10 +124,13 @@ var createBoolean = (value) => ({
124
124
  $$type: "boolean",
125
125
  value
126
126
  });
127
- var createConfig = (replay) => ({
127
+ var createConfig = (replay, relativeTo, offsetTop, offsetBottom) => ({
128
128
  $$type: "config",
129
129
  value: {
130
- replay: createBoolean(replay)
130
+ replay: createBoolean(replay),
131
+ relativeTo: createString(relativeTo ?? ""),
132
+ offsetTop: createNumber(offsetTop ?? 0),
133
+ offsetBottom: createNumber(offsetBottom ?? 100)
131
134
  }
132
135
  });
133
136
  var extractBoolean = (prop, fallback = false) => {
@@ -139,7 +142,10 @@ var createAnimationPreset = ({
139
142
  direction,
140
143
  duration,
141
144
  delay,
142
- replay = false
145
+ replay = false,
146
+ relativeTo,
147
+ offsetTop,
148
+ offsetBottom
143
149
  }) => ({
144
150
  $$type: "animation-preset-props",
145
151
  value: {
@@ -147,7 +153,7 @@ var createAnimationPreset = ({
147
153
  type: createString(type),
148
154
  direction: createString(direction ?? ""),
149
155
  timing_config: createTimingConfig(duration, delay),
150
- config: createConfig(replay)
156
+ config: createConfig(replay, relativeTo, offsetTop, offsetBottom)
151
157
  }
152
158
  });
153
159
  var createInteractionItem = ({
@@ -158,13 +164,26 @@ var createInteractionItem = ({
158
164
  duration,
159
165
  delay,
160
166
  interactionId,
161
- replay = false
167
+ replay = false,
168
+ relativeTo,
169
+ offsetTop,
170
+ offsetBottom
162
171
  }) => ({
163
172
  $$type: "interaction-item",
164
173
  value: {
165
174
  ...interactionId && { interaction_id: createString(interactionId) },
166
175
  trigger: createString(trigger),
167
- animation: createAnimationPreset({ effect, type, direction, duration, delay, replay })
176
+ animation: createAnimationPreset({
177
+ effect,
178
+ type,
179
+ direction,
180
+ duration,
181
+ delay,
182
+ replay,
183
+ relativeTo,
184
+ offsetTop,
185
+ offsetBottom
186
+ })
168
187
  }
169
188
  });
170
189
  var createDefaultInteractionItem = () => {
@@ -346,7 +365,10 @@ var DEFAULT_VALUES = {
346
365
  direction: "",
347
366
  duration: 300,
348
367
  delay: 0,
349
- replay: false
368
+ replay: false,
369
+ relativeTo: "viewport",
370
+ offsetTop: 15,
371
+ offsetBottom: 85
350
372
  };
351
373
  var TRIGGERS_WITH_REPLAY = ["scrollIn", "scrollOut"];
352
374
  var InteractionDetails = ({ interaction, onChange, onPlayInteraction }) => {
@@ -357,7 +379,14 @@ var InteractionDetails = ({ interaction, onChange, onPlayInteraction }) => {
357
379
  const duration = extractNumber(interaction.animation.value.timing_config.value.duration, DEFAULT_VALUES.duration);
358
380
  const delay = extractNumber(interaction.animation.value.timing_config.value.delay, DEFAULT_VALUES.delay);
359
381
  const replay = extractBoolean(interaction.animation.value.config?.value.replay, DEFAULT_VALUES.replay);
382
+ const relativeTo = extractString(interaction.animation.value.config?.value.relativeTo, DEFAULT_VALUES.relativeTo);
383
+ const offsetTop = extractNumber(interaction.animation.value.config?.value.offsetTop, DEFAULT_VALUES.offsetTop);
384
+ const offsetBottom = extractNumber(
385
+ interaction.animation.value.config?.value.offsetBottom,
386
+ DEFAULT_VALUES.offsetBottom
387
+ );
360
388
  const shouldShowReplay = TRIGGERS_WITH_REPLAY.includes(trigger);
389
+ const shouldShowRelativeTo = trigger === "scrollOn";
361
390
  const TriggerControl = useMemo2(() => {
362
391
  return getInteractionsControl("trigger")?.component ?? null;
363
392
  }, []);
@@ -367,6 +396,24 @@ var InteractionDetails = ({ interaction, onChange, onPlayInteraction }) => {
367
396
  }
368
397
  return getInteractionsControl("replay")?.component ?? null;
369
398
  }, [shouldShowReplay]);
399
+ const RelativeToControl = useMemo2(() => {
400
+ if (!shouldShowRelativeTo) {
401
+ return null;
402
+ }
403
+ return getInteractionsControl("relativeTo")?.component ?? null;
404
+ }, [shouldShowRelativeTo]);
405
+ const OffsetTopControl = useMemo2(() => {
406
+ if (!shouldShowRelativeTo) {
407
+ return null;
408
+ }
409
+ return getInteractionsControl("offsetTop")?.component ?? null;
410
+ }, [shouldShowRelativeTo]);
411
+ const OffsetBottomControl = useMemo2(() => {
412
+ if (!shouldShowRelativeTo) {
413
+ return null;
414
+ }
415
+ return getInteractionsControl("offsetBottom")?.component ?? null;
416
+ }, [shouldShowRelativeTo]);
370
417
  const resolveDirection = (hasDirection, newEffect, newDirection) => {
371
418
  if (newEffect === "slide" && !newDirection) {
372
419
  return "top";
@@ -389,7 +436,10 @@ var InteractionDetails = ({ interaction, onChange, onPlayInteraction }) => {
389
436
  direction: resolvedDirectionValue,
390
437
  duration: updates.duration ?? duration,
391
438
  delay: updates.delay ?? delay,
392
- replay: newReplay
439
+ replay: newReplay,
440
+ relativeTo: updates.relativeTo ?? relativeTo,
441
+ offsetTop: updates.offsetTop ?? offsetTop,
442
+ offsetBottom: updates.offsetBottom ?? offsetBottom
393
443
  })
394
444
  };
395
445
  onChange(updatedInteraction);
@@ -424,7 +474,25 @@ var InteractionDetails = ({ interaction, onChange, onPlayInteraction }) => {
424
474
  value: String(delay),
425
475
  onChange: (v) => updateInteraction({ delay: parseInt(v, 10) })
426
476
  }
427
- ))));
477
+ ))), shouldShowRelativeTo && RelativeToControl && /* @__PURE__ */ React8.createElement(React8.Fragment, null, /* @__PURE__ */ React8.createElement(Divider, null), /* @__PURE__ */ React8.createElement(Grid, { container: true, spacing: 1.5 }, /* @__PURE__ */ React8.createElement(Field, { label: __6("Relative To", "elementor") }, /* @__PURE__ */ React8.createElement(
478
+ RelativeToControl,
479
+ {
480
+ value: relativeTo,
481
+ onChange: (v) => updateInteraction({ relativeTo: v })
482
+ }
483
+ )), OffsetTopControl && /* @__PURE__ */ React8.createElement(Field, { label: __6("Offset Top", "elementor") }, /* @__PURE__ */ React8.createElement(
484
+ OffsetTopControl,
485
+ {
486
+ value: String(offsetTop),
487
+ onChange: (v) => updateInteraction({ offsetTop: parseInt(v, 10) })
488
+ }
489
+ )), OffsetBottomControl && /* @__PURE__ */ React8.createElement(Field, { label: __6("Offset Bottom", "elementor") }, /* @__PURE__ */ React8.createElement(
490
+ OffsetBottomControl,
491
+ {
492
+ value: String(offsetBottom),
493
+ onChange: (v) => updateInteraction({ offsetBottom: parseInt(v, 10) })
494
+ }
495
+ ))), /* @__PURE__ */ React8.createElement(Divider, null)));
428
496
  };
429
497
  function Field({ label, children }) {
430
498
  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)));
@@ -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 { useCallback, 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\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\treturn (\n\t\t<Repeater\n\t\t\topenOnAdd\n\t\t\topenItem={ triggerCreateOnShowEmpty ? 0 : undefined }\n\t\t\tlabel={ __( 'Interactions', 'elementor' ) }\n\t\t\tvalues={ interactions.items }\n\t\t\tsetValues={ handleRepeaterChange }\n\t\t\tshowDuplicate={ false }\n\t\t\tshowToggle={ false }\n\t\t\tisSortable={ false }\n\t\t\tdisableAddItemButton={ isMaxNumberOfInteractionsReached }\n\t\t\taddButtonInfotipContent={ infotipContent }\n\t\t\titemSettings={ {\n\t\t\t\tinitialValues: createDefaultInteractionItem(),\n\t\t\t\tLabel: ( { value }: { value: InteractionItemPropValue } ) => buildDisplayLabel( value.value ),\n\t\t\t\tIcon: () => null,\n\t\t\t\tContent: ( { index, value }: { index: number; value: InteractionItemPropValue } ) => (\n\t\t\t\t\t<InteractionDetails\n\t\t\t\t\t\tkey={ index }\n\t\t\t\t\t\tinteraction={ value.value }\n\t\t\t\t\t\tonChange={ ( newInteractionValue: InteractionItemValue ) => {\n\t\t\t\t\t\t\thandleInteractionChange( index, newInteractionValue );\n\t\t\t\t\t\t} }\n\t\t\t\t\t\tonPlayInteraction={ onPlayInteraction }\n\t\t\t\t\t/>\n\t\t\t\t),\n\t\t\t\tactions: ( value: InteractionItemPropValue ) => (\n\t\t\t\t\t<Tooltip key=\"preview\" placement=\"top\" title={ __( 'Preview', 'elementor' ) }>\n\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\taria-label={ __( 'Play interaction', 'elementor' ) }\n\t\t\t\t\t\t\tsize=\"tiny\"\n\t\t\t\t\t\t\tonClick={ () => onPlayInteraction( extractString( value.value.interaction_id ) ) }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<PlayerPlayIcon fontSize=\"tiny\" />\n\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t),\n\t\t\t} }\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 = ( replay: boolean ): ConfigPropValue => ( {\n\t$$type: 'config',\n\tvalue: {\n\t\treplay: createBoolean( replay ),\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}: {\n\teffect: string;\n\ttype: string;\n\tdirection?: string;\n\tduration: number;\n\tdelay: number;\n\treplay: boolean;\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 ),\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}: {\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} ): 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( { effect, type, direction, duration, delay, replay } ),\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: 300,\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\nexport const buildAnimationIdString = ( 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\tconst direction = extractString( item.animation.value.direction );\n\tconst duration = extractNumber( item.animation.value.timing_config.value.duration );\n\tconst delay = extractNumber( item.animation.value.timing_config.value.delay );\n\n\treturn [ trigger, effect, type, direction, duration, delay ].join( '-' );\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: 300,\n\tdelay: 0,\n\treplay: false,\n};\n\nconst TRIGGERS_WITH_REPLAY = [ 'scrollIn', 'scrollOut' ];\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\n\tconst shouldShowReplay = TRIGGERS_WITH_REPLAY.includes( trigger );\n\n\tconst TriggerControl = useMemo( () => {\n\t\treturn getInteractionsControl( 'trigger' )?.component ?? null;\n\t}, [] );\n\n\tconst ReplayControl = useMemo( () => {\n\t\tif ( ! shouldShowReplay ) {\n\t\t\treturn null;\n\t\t}\n\t\treturn getInteractionsControl( 'replay' )?.component ?? null;\n\t}, [ shouldShowReplay ] );\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} >\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} ),\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<Field label={ __( 'Duration', 'elementor' ) }>\n\t\t\t\t\t<TimeFrameIndicator\n\t\t\t\t\t\tvalue={ String( duration ) }\n\t\t\t\t\t\tonChange={ ( v ) => updateInteraction( { duration: parseInt( v, 10 ) } ) }\n\t\t\t\t\t/>\n\t\t\t\t</Field>\n\n\t\t\t\t<Field label={ __( 'Delay', 'elementor' ) }>\n\t\t\t\t\t<TimeFrameIndicator\n\t\t\t\t\t\tvalue={ String( delay ) }\n\t\t\t\t\t\tonChange={ ( v ) => updateInteraction( { delay: parseInt( v, 10 ) } ) }\n\t\t\t\t\t/>\n\t\t\t\t</Field>\n\t\t\t</Grid>\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 = 'trigger' | 'effect' | 'effectType' | 'direction' | 'duration' | 'delay' | 'replay';\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};\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 { 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 TimeFrameIndicator( { value, onChange }: FieldProps ) {\n\tconst availableTimeFrames = [ '0', '100', '200', '300', '400', '500', '750', '1000', '1250', '1500' ].map(\n\t\t( key ) => ( {\n\t\t\tkey,\n\t\t\t// translators: %s: time in milliseconds\n\t\t\tlabel: __( '%s MS', 'elementor' ).replace( '%s', key ),\n\t\t} )\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{ availableTimeFrames.map( ( timeFrame ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<MenuListItem key={ timeFrame.key } value={ timeFrame.key }>\n\t\t\t\t\t\t{ timeFrame.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 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","useCallback","useEffect","useMemo","__","React","useMemo","__","React","__","React","__","React","ToggleButtonGroupUi","__","React","MenuListItem","Select","__","useMemo","__","useCallback","useEffect","useMemo","__","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/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 { useCallback, 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\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\treturn (\n\t\t<Repeater\n\t\t\topenOnAdd\n\t\t\topenItem={ triggerCreateOnShowEmpty ? 0 : undefined }\n\t\t\tlabel={ __( 'Interactions', 'elementor' ) }\n\t\t\tvalues={ interactions.items }\n\t\t\tsetValues={ handleRepeaterChange }\n\t\t\tshowDuplicate={ false }\n\t\t\tshowToggle={ false }\n\t\t\tisSortable={ false }\n\t\t\tdisableAddItemButton={ isMaxNumberOfInteractionsReached }\n\t\t\taddButtonInfotipContent={ infotipContent }\n\t\t\titemSettings={ {\n\t\t\t\tinitialValues: createDefaultInteractionItem(),\n\t\t\t\tLabel: ( { value }: { value: InteractionItemPropValue } ) => buildDisplayLabel( value.value ),\n\t\t\t\tIcon: () => null,\n\t\t\t\tContent: ( { index, value }: { index: number; value: InteractionItemPropValue } ) => (\n\t\t\t\t\t<InteractionDetails\n\t\t\t\t\t\tkey={ index }\n\t\t\t\t\t\tinteraction={ value.value }\n\t\t\t\t\t\tonChange={ ( newInteractionValue: InteractionItemValue ) => {\n\t\t\t\t\t\t\thandleInteractionChange( index, newInteractionValue );\n\t\t\t\t\t\t} }\n\t\t\t\t\t\tonPlayInteraction={ onPlayInteraction }\n\t\t\t\t\t/>\n\t\t\t\t),\n\t\t\t\tactions: ( value: InteractionItemPropValue ) => (\n\t\t\t\t\t<Tooltip key=\"preview\" placement=\"top\" title={ __( 'Preview', 'elementor' ) }>\n\t\t\t\t\t\t<IconButton\n\t\t\t\t\t\t\taria-label={ __( 'Play interaction', 'elementor' ) }\n\t\t\t\t\t\t\tsize=\"tiny\"\n\t\t\t\t\t\t\tonClick={ () => onPlayInteraction( extractString( value.value.interaction_id ) ) }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<PlayerPlayIcon fontSize=\"tiny\" />\n\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t),\n\t\t\t} }\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: 300,\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\nexport const buildAnimationIdString = ( 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\tconst direction = extractString( item.animation.value.direction );\n\tconst duration = extractNumber( item.animation.value.timing_config.value.duration );\n\tconst delay = extractNumber( item.animation.value.timing_config.value.delay );\n\n\treturn [ trigger, effect, type, direction, duration, delay ].join( '-' );\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: 300,\n\tdelay: 0,\n\treplay: false,\n\trelativeTo: 'viewport',\n\toffsetTop: 15,\n\toffsetBottom: 85,\n};\n\nconst TRIGGERS_WITH_REPLAY = [ 'scrollIn', 'scrollOut' ];\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 shouldShowReplay = TRIGGERS_WITH_REPLAY.includes( trigger );\n\tconst shouldShowRelativeTo = trigger === 'scrollOn';\n\n\tconst TriggerControl = useMemo( () => {\n\t\treturn getInteractionsControl( 'trigger' )?.component ?? null;\n\t}, [] );\n\n\tconst ReplayControl = useMemo( () => {\n\t\tif ( ! shouldShowReplay ) {\n\t\t\treturn null;\n\t\t}\n\t\treturn getInteractionsControl( 'replay' )?.component ?? null;\n\t}, [ shouldShowReplay ] );\n\n\tconst RelativeToControl = useMemo( () => {\n\t\tif ( ! shouldShowRelativeTo ) {\n\t\t\treturn null;\n\t\t}\n\t\treturn getInteractionsControl( 'relativeTo' )?.component ?? null;\n\t}, [ shouldShowRelativeTo ] );\n\n\tconst OffsetTopControl = useMemo( () => {\n\t\tif ( ! shouldShowRelativeTo ) {\n\t\t\treturn null;\n\t\t}\n\t\treturn getInteractionsControl( 'offsetTop' )?.component ?? null;\n\t}, [ shouldShowRelativeTo ] );\n\n\tconst OffsetBottomControl = useMemo( () => {\n\t\tif ( ! shouldShowRelativeTo ) {\n\t\t\treturn null;\n\t\t}\n\t\treturn getInteractionsControl( 'offsetBottom' )?.component ?? null;\n\t}, [ shouldShowRelativeTo ] );\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<Field label={ __( 'Duration', 'elementor' ) }>\n\t\t\t\t\t<TimeFrameIndicator\n\t\t\t\t\t\tvalue={ String( duration ) }\n\t\t\t\t\t\tonChange={ ( v ) => updateInteraction( { duration: parseInt( v, 10 ) } ) }\n\t\t\t\t\t/>\n\t\t\t\t</Field>\n\n\t\t\t\t<Field label={ __( 'Delay', 'elementor' ) }>\n\t\t\t\t\t<TimeFrameIndicator\n\t\t\t\t\t\tvalue={ String( delay ) }\n\t\t\t\t\t\tonChange={ ( v ) => updateInteraction( { delay: parseInt( v, 10 ) } ) }\n\t\t\t\t\t/>\n\t\t\t\t</Field>\n\t\t\t</Grid>\n\t\t\t{ shouldShowRelativeTo && 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 { 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 TimeFrameIndicator( { value, onChange }: FieldProps ) {\n\tconst availableTimeFrames = [ '0', '100', '200', '300', '400', '500', '750', '1000', '1250', '1500' ].map(\n\t\t( key ) => ( {\n\t\t\tkey,\n\t\t\t// translators: %s: time in milliseconds\n\t\t\tlabel: __( '%s MS', 'elementor' ).replace( '%s', key ),\n\t\t} )\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{ availableTimeFrames.map( ( timeFrame ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<MenuListItem key={ timeFrame.key } value={ timeFrame.key }>\n\t\t\t\t\t\t{ timeFrame.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 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","useCallback","useEffect","useMemo","__","React","useMemo","__","React","__","React","__","React","ToggleButtonGroupUi","__","React","MenuListItem","Select","__","useMemo","__","useCallback","useEffect","useMemo","__","useElementInteractions","useState","useCallback","Stack","React","MenuListItem","Select","__"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elementor/editor-interactions",
3
- "version": "3.35.0-484",
3
+ "version": "3.35.0-486",
4
4
  "private": false,
5
5
  "author": "Elementor Team",
6
6
  "homepage": "https://elementor.com/",
@@ -39,13 +39,13 @@
39
39
  "dev": "tsup --config=../../tsup.dev.ts"
40
40
  },
41
41
  "dependencies": {
42
- "@elementor/editor-controls": "3.35.0-484",
43
- "@elementor/editor-elements": "3.35.0-484",
44
- "@elementor/editor-ui": "3.35.0-484",
42
+ "@elementor/editor-controls": "3.35.0-486",
43
+ "@elementor/editor-elements": "3.35.0-486",
44
+ "@elementor/editor-ui": "3.35.0-486",
45
45
  "@elementor/icons": "^1.63.0",
46
- "@elementor/editor-v1-adapters": "3.35.0-484",
47
- "@elementor/utils": "3.35.0-484",
48
- "@elementor/session": "3.35.0-484",
46
+ "@elementor/editor-v1-adapters": "3.35.0-486",
47
+ "@elementor/utils": "3.35.0-486",
48
+ "@elementor/session": "3.35.0-486",
49
49
  "@elementor/ui": "1.36.17",
50
50
  "@wordpress/i18n": "^5.13.0"
51
51
  },
@@ -32,6 +32,9 @@ const DEFAULT_VALUES = {
32
32
  duration: 300,
33
33
  delay: 0,
34
34
  replay: false,
35
+ relativeTo: 'viewport',
36
+ offsetTop: 15,
37
+ offsetBottom: 85,
35
38
  };
36
39
 
37
40
  const TRIGGERS_WITH_REPLAY = [ 'scrollIn', 'scrollOut' ];
@@ -44,8 +47,15 @@ export const InteractionDetails = ( { interaction, onChange, onPlayInteraction }
44
47
  const duration = extractNumber( interaction.animation.value.timing_config.value.duration, DEFAULT_VALUES.duration );
45
48
  const delay = extractNumber( interaction.animation.value.timing_config.value.delay, DEFAULT_VALUES.delay );
46
49
  const replay = extractBoolean( interaction.animation.value.config?.value.replay, DEFAULT_VALUES.replay );
50
+ const relativeTo = extractString( interaction.animation.value.config?.value.relativeTo, DEFAULT_VALUES.relativeTo );
51
+ const offsetTop = extractNumber( interaction.animation.value.config?.value.offsetTop, DEFAULT_VALUES.offsetTop );
52
+ const offsetBottom = extractNumber(
53
+ interaction.animation.value.config?.value.offsetBottom,
54
+ DEFAULT_VALUES.offsetBottom
55
+ );
47
56
 
48
57
  const shouldShowReplay = TRIGGERS_WITH_REPLAY.includes( trigger );
58
+ const shouldShowRelativeTo = trigger === 'scrollOn';
49
59
 
50
60
  const TriggerControl = useMemo( () => {
51
61
  return getInteractionsControl( 'trigger' )?.component ?? null;
@@ -58,6 +68,27 @@ export const InteractionDetails = ( { interaction, onChange, onPlayInteraction }
58
68
  return getInteractionsControl( 'replay' )?.component ?? null;
59
69
  }, [ shouldShowReplay ] );
60
70
 
71
+ const RelativeToControl = useMemo( () => {
72
+ if ( ! shouldShowRelativeTo ) {
73
+ return null;
74
+ }
75
+ return getInteractionsControl( 'relativeTo' )?.component ?? null;
76
+ }, [ shouldShowRelativeTo ] );
77
+
78
+ const OffsetTopControl = useMemo( () => {
79
+ if ( ! shouldShowRelativeTo ) {
80
+ return null;
81
+ }
82
+ return getInteractionsControl( 'offsetTop' )?.component ?? null;
83
+ }, [ shouldShowRelativeTo ] );
84
+
85
+ const OffsetBottomControl = useMemo( () => {
86
+ if ( ! shouldShowRelativeTo ) {
87
+ return null;
88
+ }
89
+ return getInteractionsControl( 'offsetBottom' )?.component ?? null;
90
+ }, [ shouldShowRelativeTo ] );
91
+
61
92
  const resolveDirection = ( hasDirection: boolean, newEffect?: string, newDirection?: string ) => {
62
93
  if ( newEffect === 'slide' && ! newDirection ) {
63
94
  return 'top';
@@ -78,6 +109,9 @@ export const InteractionDetails = ( { interaction, onChange, onPlayInteraction }
78
109
  duration: number;
79
110
  delay: number;
80
111
  replay: boolean;
112
+ relativeTo: string;
113
+ offsetTop: number;
114
+ offsetBottom: number;
81
115
  } >
82
116
  ): void => {
83
117
  const resolvedDirectionValue = resolveDirection( 'direction' in updates, updates.effect, updates.direction );
@@ -94,6 +128,9 @@ export const InteractionDetails = ( { interaction, onChange, onPlayInteraction }
94
128
  duration: updates.duration ?? duration,
95
129
  delay: updates.delay ?? delay,
96
130
  replay: newReplay,
131
+ relativeTo: updates.relativeTo ?? relativeTo,
132
+ offsetTop: updates.offsetTop ?? offsetTop,
133
+ offsetBottom: updates.offsetBottom ?? offsetBottom,
97
134
  } ),
98
135
  };
99
136
 
@@ -159,6 +196,38 @@ export const InteractionDetails = ( { interaction, onChange, onPlayInteraction }
159
196
  />
160
197
  </Field>
161
198
  </Grid>
199
+ { shouldShowRelativeTo && RelativeToControl && (
200
+ <>
201
+ <Divider />
202
+ <Grid container spacing={ 1.5 }>
203
+ <Field label={ __( 'Relative To', 'elementor' ) }>
204
+ <RelativeToControl
205
+ value={ relativeTo }
206
+ onChange={ ( v ) => updateInteraction( { relativeTo: v } ) }
207
+ />
208
+ </Field>
209
+ { OffsetTopControl && (
210
+ <Field label={ __( 'Offset Top', 'elementor' ) }>
211
+ <OffsetTopControl
212
+ value={ String( offsetTop ) }
213
+ onChange={ ( v: string ) => updateInteraction( { offsetTop: parseInt( v, 10 ) } ) }
214
+ />
215
+ </Field>
216
+ ) }
217
+ { OffsetBottomControl && (
218
+ <Field label={ __( 'Offset Bottom', 'elementor' ) }>
219
+ <OffsetBottomControl
220
+ value={ String( offsetBottom ) }
221
+ onChange={ ( v: string ) =>
222
+ updateInteraction( { offsetBottom: parseInt( v, 10 ) } )
223
+ }
224
+ />
225
+ </Field>
226
+ ) }
227
+ </Grid>
228
+ <Divider />
229
+ </>
230
+ ) }
162
231
  </PopoverContent>
163
232
  );
164
233
  };
@@ -2,7 +2,17 @@ import { type ComponentType } from 'react';
2
2
 
3
3
  import { type DirectionFieldProps, type FieldProps, type ReplayFieldProps } from './types';
4
4
 
5
- type InteractionsControlType = 'trigger' | 'effect' | 'effectType' | 'direction' | 'duration' | 'delay' | 'replay';
5
+ type InteractionsControlType =
6
+ | 'trigger'
7
+ | 'effect'
8
+ | 'effectType'
9
+ | 'direction'
10
+ | 'duration'
11
+ | 'delay'
12
+ | 'replay'
13
+ | 'relativeTo'
14
+ | 'offsetTop'
15
+ | 'offsetBottom';
6
16
 
7
17
  type InteractionsControlPropsMap = {
8
18
  trigger: FieldProps;
@@ -12,6 +22,9 @@ type InteractionsControlPropsMap = {
12
22
  duration: FieldProps;
13
23
  delay: FieldProps;
14
24
  replay: ReplayFieldProps;
25
+ relativeTo: FieldProps;
26
+ offsetTop: FieldProps;
27
+ offsetBottom: FieldProps;
15
28
  };
16
29
 
17
30
  type ControlOptions< T extends InteractionsControlType > = {
@@ -34,10 +34,18 @@ export const createBoolean = ( value: boolean ): BooleanPropValue => ( {
34
34
  value,
35
35
  } );
36
36
 
37
- export const createConfig = ( replay: boolean ): ConfigPropValue => ( {
37
+ export const createConfig = (
38
+ replay: boolean,
39
+ relativeTo?: string,
40
+ offsetTop?: number,
41
+ offsetBottom?: number
42
+ ): ConfigPropValue => ( {
38
43
  $$type: 'config',
39
44
  value: {
40
45
  replay: createBoolean( replay ),
46
+ relativeTo: createString( relativeTo ?? '' ),
47
+ offsetTop: createNumber( offsetTop ?? 0 ),
48
+ offsetBottom: createNumber( offsetBottom ?? 100 ),
41
49
  },
42
50
  } );
43
51
 
@@ -52,6 +60,9 @@ export const createAnimationPreset = ( {
52
60
  duration,
53
61
  delay,
54
62
  replay = false,
63
+ relativeTo,
64
+ offsetTop,
65
+ offsetBottom,
55
66
  }: {
56
67
  effect: string;
57
68
  type: string;
@@ -59,6 +70,9 @@ export const createAnimationPreset = ( {
59
70
  duration: number;
60
71
  delay: number;
61
72
  replay: boolean;
73
+ relativeTo?: string;
74
+ offsetTop?: number;
75
+ offsetBottom?: number;
62
76
  } ): AnimationPresetPropValue => ( {
63
77
  $$type: 'animation-preset-props',
64
78
  value: {
@@ -66,7 +80,7 @@ export const createAnimationPreset = ( {
66
80
  type: createString( type ),
67
81
  direction: createString( direction ?? '' ),
68
82
  timing_config: createTimingConfig( duration, delay ),
69
- config: createConfig( replay ),
83
+ config: createConfig( replay, relativeTo, offsetTop, offsetBottom ),
70
84
  },
71
85
  } );
72
86
 
@@ -79,6 +93,9 @@ export const createInteractionItem = ( {
79
93
  delay,
80
94
  interactionId,
81
95
  replay = false,
96
+ relativeTo,
97
+ offsetTop,
98
+ offsetBottom,
82
99
  }: {
83
100
  trigger: string;
84
101
  effect: string;
@@ -88,12 +105,25 @@ export const createInteractionItem = ( {
88
105
  delay: number;
89
106
  interactionId?: string;
90
107
  replay: boolean;
108
+ relativeTo?: string;
109
+ offsetTop?: number;
110
+ offsetBottom?: number;
91
111
  } ): InteractionItemPropValue => ( {
92
112
  $$type: 'interaction-item',
93
113
  value: {
94
114
  ...( interactionId && { interaction_id: createString( interactionId ) } ),
95
115
  trigger: createString( trigger ),
96
- animation: createAnimationPreset( { effect, type, direction, duration, delay, replay } ),
116
+ animation: createAnimationPreset( {
117
+ effect,
118
+ type,
119
+ direction,
120
+ duration,
121
+ delay,
122
+ replay,
123
+ relativeTo,
124
+ offsetTop,
125
+ offsetBottom,
126
+ } ),
97
127
  },
98
128
  } );
99
129