@elementor/editor-editing-panel 0.17.0 → 0.18.0

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.
Files changed (55) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/index.d.mts +26 -9
  3. package/dist/index.d.ts +26 -9
  4. package/dist/index.js +859 -367
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.mjs +830 -329
  7. package/dist/index.mjs.map +1 -1
  8. package/package.json +8 -7
  9. package/src/components/settings-tab.tsx +5 -2
  10. package/src/components/style-sections/effects-section/box-shadow-repeater.tsx +224 -0
  11. package/src/components/style-sections/effects-section/effects-section.tsx +18 -0
  12. package/src/components/style-sections/position-section/z-index-control.tsx +11 -7
  13. package/src/components/style-sections/size-section.tsx +23 -20
  14. package/src/components/style-sections/spacing-section/linked-dimensions-control.tsx +62 -47
  15. package/src/components/style-sections/typography-section/font-size-control.tsx +10 -6
  16. package/src/components/style-sections/typography-section/font-weight-control.tsx +16 -12
  17. package/src/components/style-sections/typography-section/letter-spacing-control.tsx +10 -6
  18. package/src/components/style-sections/typography-section/text-alignment-control.tsx +12 -8
  19. package/src/components/style-sections/typography-section/text-color-control.tsx +10 -6
  20. package/src/components/style-sections/typography-section/text-direction-control.tsx +37 -0
  21. package/src/components/style-sections/typography-section/text-style-control.tsx +37 -34
  22. package/src/components/style-sections/typography-section/transform-control.tsx +14 -12
  23. package/src/components/style-sections/typography-section/typography-section.tsx +2 -0
  24. package/src/components/style-sections/typography-section/word-spacing-control.tsx +10 -6
  25. package/src/components/style-tab.tsx +5 -1
  26. package/src/controls/components/control-type-container.tsx +28 -0
  27. package/src/controls/components/repeater.tsx +197 -0
  28. package/src/controls/control-actions/actions/popover-action.tsx +58 -0
  29. package/src/controls/control-actions/control-actions-menu.ts +8 -0
  30. package/src/controls/control-actions/control-actions.tsx +43 -0
  31. package/src/controls/control-replacement.ts +15 -7
  32. package/src/controls/control-types/color-control.tsx +21 -18
  33. package/src/controls/control-types/image-control.tsx +56 -59
  34. package/src/controls/control-types/image-media-control.tsx +73 -0
  35. package/src/controls/control-types/number-control.tsx +13 -9
  36. package/src/controls/control-types/select-control.tsx +13 -9
  37. package/src/controls/control-types/size-control.tsx +17 -13
  38. package/src/controls/control-types/text-area-control.tsx +15 -11
  39. package/src/controls/control-types/text-control.tsx +9 -3
  40. package/src/controls/control-types/toggle-control.tsx +3 -2
  41. package/src/controls/control.tsx +1 -7
  42. package/src/controls/controls-registry.tsx +19 -10
  43. package/src/controls/create-control.tsx +31 -0
  44. package/src/controls/settings-control.tsx +2 -9
  45. package/src/dynamics/components/dynamic-selection-control.tsx +1 -1
  46. package/src/dynamics/components/dynamic-selection.tsx +1 -1
  47. package/src/dynamics/dynamic-control.tsx +1 -1
  48. package/src/dynamics/hooks/use-prop-dynamic-action.tsx +23 -0
  49. package/src/dynamics/hooks/use-prop-dynamic-tags.ts +4 -4
  50. package/src/dynamics/init.ts +9 -0
  51. package/src/dynamics/types.ts +6 -3
  52. package/src/dynamics/utils.ts +16 -3
  53. package/src/index.ts +2 -0
  54. package/src/types.ts +35 -14
  55. package/src/controls/components/control-container.tsx +0 -18
package/dist/index.mjs CHANGED
@@ -1,34 +1,82 @@
1
+ // src/controls/control-context.tsx
2
+ import { createContext, useContext } from "react";
3
+ var ControlContext = createContext(null);
4
+ function useControl(defaultValue) {
5
+ const controlContext = useContext(ControlContext);
6
+ if (!controlContext) {
7
+ throw new Error("useControl must be used within a ControlContext");
8
+ }
9
+ return { ...controlContext, value: controlContext.value ?? defaultValue };
10
+ }
11
+
1
12
  // src/controls/control-replacement.ts
2
13
  var controlReplacement;
3
- var replaceControl = ({ component, condition }) => {
4
- controlReplacement = { component, condition };
5
- };
6
14
  var getControlReplacement = ({ value }) => {
7
15
  let shouldReplace = false;
8
16
  try {
9
- shouldReplace = !!controlReplacement?.condition({ value });
17
+ shouldReplace = !!controlReplacement?.condition({ value }) && !!controlReplacement?.component;
10
18
  } catch {
11
19
  }
12
20
  return shouldReplace ? controlReplacement?.component : void 0;
13
21
  };
22
+ function replaceControl({ component, condition }) {
23
+ controlReplacement = { component, condition };
24
+ }
25
+ function useControlReplacement() {
26
+ const { value } = useControl();
27
+ return getControlReplacement({ value });
28
+ }
14
29
 
15
- // src/controls/control-context.tsx
16
- import { createContext, useContext } from "react";
17
- var ControlContext = createContext(null);
18
- function useControl(defaultValue) {
19
- const controlContext = useContext(ControlContext);
20
- if (!controlContext) {
21
- throw new Error("useControl must be used within a ControlContext");
30
+ // src/controls/control-actions/actions/popover-action.tsx
31
+ import * as React from "react";
32
+ import { bindPopover, bindToggle, IconButton, Popover, Stack, Tooltip, Typography, usePopupState } from "@elementor/ui";
33
+ import { useId } from "react";
34
+ import { XIcon } from "@elementor/icons";
35
+ var SIZE = "tiny";
36
+ function PopoverAction({
37
+ title,
38
+ visible = true,
39
+ icon: Icon,
40
+ popoverContent: PopoverContent
41
+ }) {
42
+ const id = useId();
43
+ const popupState = usePopupState({
44
+ variant: "popover",
45
+ popupId: `elementor-popover-action-${id}`
46
+ });
47
+ if (!visible) {
48
+ return null;
22
49
  }
23
- return { ...controlContext, value: controlContext.value ?? defaultValue };
50
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Tooltip, { placement: "top", title }, /* @__PURE__ */ React.createElement(IconButton, { "aria-label": title, key: id, size: SIZE, ...bindToggle(popupState) }, /* @__PURE__ */ React.createElement(Icon, { fontSize: SIZE }))), /* @__PURE__ */ React.createElement(
51
+ Popover,
52
+ {
53
+ disablePortal: true,
54
+ disableScrollLock: true,
55
+ anchorOrigin: {
56
+ vertical: "bottom",
57
+ horizontal: "center"
58
+ },
59
+ ...bindPopover(popupState)
60
+ },
61
+ /* @__PURE__ */ React.createElement(Stack, { direction: "row", alignItems: "center", pl: 1.5, pr: 0.5, py: 1.5 }, /* @__PURE__ */ React.createElement(Icon, { fontSize: SIZE, sx: { mr: 0.5 } }), /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle2" }, title), /* @__PURE__ */ React.createElement(IconButton, { sx: { ml: "auto" }, size: SIZE, onClick: popupState.close }, /* @__PURE__ */ React.createElement(XIcon, { fontSize: SIZE }))),
62
+ /* @__PURE__ */ React.createElement(PopoverContent, { closePopover: popupState.close })
63
+ ));
24
64
  }
25
65
 
66
+ // src/controls/control-actions/control-actions-menu.ts
67
+ import { createMenu } from "@elementor/menus";
68
+ var controlActionsMenu = createMenu({
69
+ components: {
70
+ PopoverAction
71
+ }
72
+ });
73
+
26
74
  // src/panel.ts
27
75
  import { __createPanel as createPanel } from "@elementor/editor-panels";
28
76
 
29
77
  // src/components/editing-panel.tsx
30
- import * as React37 from "react";
31
- import { __ as __18 } from "@wordpress/i18n";
78
+ import * as React45 from "react";
79
+ import { __ as __23 } from "@wordpress/i18n";
32
80
 
33
81
  // src/hooks/use-selected-elements.ts
34
82
  import { __privateUseListenTo as useListenTo, commandEndEvent } from "@elementor/editor-v1-adapters";
@@ -97,11 +145,11 @@ function useElementType(type) {
97
145
  import { Panel, PanelBody, PanelHeader, PanelHeaderTitle } from "@elementor/editor-panels";
98
146
 
99
147
  // src/contexts/element-context.tsx
100
- import * as React from "react";
148
+ import * as React2 from "react";
101
149
  import { createContext as createContext2, useContext as useContext2 } from "react";
102
150
  var Context = createContext2(null);
103
151
  function ElementContext({ children, element, elementType }) {
104
- return /* @__PURE__ */ React.createElement(Context.Provider, { value: { element, elementType } }, children);
152
+ return /* @__PURE__ */ React2.createElement(Context.Provider, { value: { element, elementType } }, children);
105
153
  }
106
154
  function useElementContext() {
107
155
  const context = useContext2(Context);
@@ -112,13 +160,13 @@ function useElementContext() {
112
160
  }
113
161
 
114
162
  // src/components/editing-panel-tabs.tsx
115
- import { Stack as Stack11, Tabs, Tab, TabPanel, useTabs } from "@elementor/ui";
116
- import * as React36 from "react";
117
- import { __ as __17 } from "@wordpress/i18n";
163
+ import { Stack as Stack16, Tabs, Tab, TabPanel, useTabs } from "@elementor/ui";
164
+ import * as React44 from "react";
165
+ import { __ as __22 } from "@wordpress/i18n";
118
166
 
119
167
  // src/components/settings-tab.tsx
120
- import * as React13 from "react";
121
- import { Stack as Stack3 } from "@elementor/ui";
168
+ import * as React17 from "react";
169
+ import { Stack as Stack5 } from "@elementor/ui";
122
170
 
123
171
  // src/controls/settings-control.tsx
124
172
  import * as React4 from "react";
@@ -159,32 +207,16 @@ var updateSettings = ({ id, props }) => {
159
207
  };
160
208
 
161
209
  // src/components/control-label.tsx
162
- import * as React2 from "react";
163
- import { Typography } from "@elementor/ui";
210
+ import * as React3 from "react";
211
+ import { Typography as Typography2 } from "@elementor/ui";
164
212
  var ControlLabel = ({ children }) => {
165
- return /* @__PURE__ */ React2.createElement(Typography, { component: "label", variant: "caption", color: "text.secondary" }, children);
213
+ return /* @__PURE__ */ React3.createElement(Typography2, { component: "label", variant: "caption", color: "text.secondary" }, children);
166
214
  };
167
215
 
168
- // src/controls/components/control-container.tsx
169
- import * as React3 from "react";
170
- import { Stack, styled } from "@elementor/ui";
171
- var StyledStack = styled(Stack)(({ theme, gap, direction }) => ({
172
- "> :only-child": {
173
- width: "100%"
174
- },
175
- "&:where( :has( > :nth-child( 2 ):last-child ) ) > :where( * )": {
176
- width: direction === "column" ? "100%" : `calc( 50% - ${theme.spacing(gap / 2)})`
177
- },
178
- "&:where( :has( > :nth-child( 3 ):last-child ) ) > :where( * )": {
179
- width: direction === "column" ? "100%" : `calc( 33.3333% - ${theme.spacing(gap * 2)} / 3)`
180
- }
181
- }));
182
- var ControlContainer = (props) => /* @__PURE__ */ React3.createElement(StyledStack, { gap: 1, direction: "row", alignItems: "center", justifyContent: "space-between", ...props });
183
-
184
216
  // src/controls/settings-control.tsx
185
- var SettingsControlProvider = ({ bind, children }) => {
217
+ var SettingsControl = ({ bind, children }) => {
186
218
  const { element, elementType } = useElementContext();
187
- const defaultValue = elementType.propsSchema[bind]?.type.default;
219
+ const defaultValue = elementType.propsSchema[bind]?.default;
188
220
  const settingsValue = useWidgetSettings({ id: element.id, bind });
189
221
  const value = settingsValue ?? defaultValue ?? null;
190
222
  const setValue = (newValue) => {
@@ -197,91 +229,177 @@ var SettingsControlProvider = ({ bind, children }) => {
197
229
  };
198
230
  return /* @__PURE__ */ React4.createElement(ControlContext.Provider, { value: { setValue, value, bind } }, children);
199
231
  };
200
- var SettingsControl = ({ children, bind }) => /* @__PURE__ */ React4.createElement(SettingsControlProvider, { bind }, /* @__PURE__ */ React4.createElement(ControlContainer, { flexWrap: "wrap" }, children));
201
232
  SettingsControl.Label = ControlLabel;
202
233
 
203
234
  // src/components/accordion-section.tsx
204
235
  import * as React5 from "react";
205
- import { useId } from "react";
236
+ import { useId as useId2 } from "react";
206
237
  import { Accordion, AccordionSummary, AccordionDetails, AccordionSummaryText, Stack as Stack2 } from "@elementor/ui";
207
238
  var AccordionSection = ({ title, children }) => {
208
- const uid = useId();
239
+ const uid = useId2();
209
240
  const labelId = `label-${uid}`;
210
241
  const contentId = `content-${uid}`;
211
242
  return /* @__PURE__ */ React5.createElement(Accordion, { disableGutters: true, defaultExpanded: true }, /* @__PURE__ */ React5.createElement(AccordionSummary, { "aria-controls": contentId, id: labelId }, /* @__PURE__ */ React5.createElement(AccordionSummaryText, { primaryTypographyProps: { variant: "caption" } }, title)), /* @__PURE__ */ React5.createElement(AccordionDetails, { id: contentId, "aria-labelledby": labelId }, /* @__PURE__ */ React5.createElement(Stack2, { gap: 2.5 }, children)));
212
243
  };
213
244
 
214
245
  // src/controls/control.tsx
215
- import * as React12 from "react";
246
+ import * as React15 from "react";
216
247
  import { createError } from "@elementor/utils";
217
248
 
218
249
  // src/controls/control-types/image-control.tsx
219
- import * as React6 from "react";
220
- import { Button, Card, CardMedia, CardOverlay } from "@elementor/ui";
250
+ import * as React10 from "react";
251
+ import { Grid, Stack as Stack4 } from "@elementor/ui";
252
+ import { __ as __2 } from "@wordpress/i18n";
253
+
254
+ // src/controls/control-types/image-media-control.tsx
255
+ import * as React8 from "react";
256
+ import { Button, Card, CardMedia, CardOverlay, Stack as Stack3 } from "@elementor/ui";
221
257
  import { UploadIcon } from "@elementor/icons";
222
- import { __ } from "@wordpress/i18n";
223
258
  import { useWpMediaAttachment, useWpMediaFrame } from "@elementor/wp-media";
224
- var ImageControl = () => {
259
+ import { __ } from "@wordpress/i18n";
260
+
261
+ // src/controls/control-actions/control-actions.tsx
262
+ import * as React6 from "react";
263
+ import { styled, UnstableFloatingActionBar } from "@elementor/ui";
264
+ var { useMenuItems } = controlActionsMenu;
265
+ var FloatingBar = styled(UnstableFloatingActionBar)`
266
+ & .MuiPaper-root:empty {
267
+ display: none;
268
+ }
269
+
270
+ // this is for a fix which would be added later on - to force the width externally
271
+ width: 100%;
272
+ & > :first-of-type {
273
+ width: 100%;
274
+ }
275
+ `;
276
+ function ControlActions({ fullWidth = false, children }) {
277
+ const items = useMenuItems().default;
278
+ if (items.length === 0) {
279
+ return children;
280
+ }
281
+ return /* @__PURE__ */ React6.createElement(
282
+ FloatingBar,
283
+ {
284
+ actions: items.map(({ MenuItem: MenuItem4, id }) => /* @__PURE__ */ React6.createElement(MenuItem4, { key: id })),
285
+ sx: fullWidth ? { width: "100%" } : void 0
286
+ },
287
+ children
288
+ );
289
+ }
290
+
291
+ // src/controls/create-control.tsx
292
+ import * as React7 from "react";
293
+ var brandSymbol = Symbol("control");
294
+ function createControl(Component, { supportsReplacements = true } = {}) {
295
+ return (props) => {
296
+ const ControlReplacement = useControlReplacement();
297
+ if (ControlReplacement && supportsReplacements) {
298
+ return /* @__PURE__ */ React7.createElement(ControlReplacement, { ...props });
299
+ }
300
+ return /* @__PURE__ */ React7.createElement(Component, { ...props });
301
+ };
302
+ }
303
+
304
+ // src/controls/control-types/image-media-control.tsx
305
+ var ImageMediaControl = createControl(() => {
225
306
  const { value, setValue } = useControl();
226
- const { data: attachment } = useWpMediaAttachment(value?.value?.attachmentId);
227
- const src = attachment?.url ?? value?.value?.url;
307
+ const { id, url } = value?.value ?? {};
308
+ const { data: attachment } = useWpMediaAttachment(id?.value || null);
309
+ const src = attachment?.url ?? url;
228
310
  const { open } = useWpMediaFrame({
229
311
  types: ["image"],
230
312
  multiple: false,
231
- selected: value?.value?.attachmentId,
313
+ selected: id?.value || null,
232
314
  onSelect: (selectedAttachment) => {
233
315
  setValue({
234
- $$type: "image",
316
+ $$type: "image-src",
235
317
  value: {
236
- attachmentId: selectedAttachment.id
318
+ id: {
319
+ $$type: "image-attachment-id",
320
+ value: selectedAttachment.id
321
+ },
322
+ url: null
237
323
  }
238
324
  });
239
325
  }
240
326
  });
241
- return /* @__PURE__ */ React6.createElement(Card, { variant: "outlined" }, /* @__PURE__ */ React6.createElement(CardMedia, { image: src, sx: { height: 150 } }), /* @__PURE__ */ React6.createElement(CardOverlay, null, /* @__PURE__ */ React6.createElement(
327
+ return /* @__PURE__ */ React8.createElement(Card, { variant: "outlined" }, /* @__PURE__ */ React8.createElement(CardMedia, { image: src, sx: { height: 150 } }), /* @__PURE__ */ React8.createElement(CardOverlay, null, /* @__PURE__ */ React8.createElement(ControlActions, null, /* @__PURE__ */ React8.createElement(Stack3, { gap: 0.5 }, /* @__PURE__ */ React8.createElement(
242
328
  Button,
243
329
  {
330
+ size: "tiny",
244
331
  color: "inherit",
245
- size: "small",
246
332
  variant: "outlined",
247
- onClick: () => {
248
- open({ mode: "browse" });
249
- }
333
+ onClick: () => open({ mode: "browse" })
250
334
  },
251
335
  __("Select Image", "elementor")
252
- ), /* @__PURE__ */ React6.createElement(
336
+ ), /* @__PURE__ */ React8.createElement(
253
337
  Button,
254
338
  {
255
- color: "inherit",
256
- size: "small",
339
+ size: "tiny",
257
340
  variant: "text",
258
- startIcon: /* @__PURE__ */ React6.createElement(UploadIcon, null),
259
- onClick: () => {
260
- open({ mode: "upload" });
261
- }
341
+ color: "inherit",
342
+ startIcon: /* @__PURE__ */ React8.createElement(UploadIcon, null),
343
+ onClick: () => open({ mode: "upload" })
262
344
  },
263
345
  __("Upload Image", "elementor")
264
- )));
265
- };
346
+ )))));
347
+ });
348
+
349
+ // src/controls/control-types/select-control.tsx
350
+ import * as React9 from "react";
351
+ import { MenuItem, Select } from "@elementor/ui";
352
+ var SelectControl = createControl(({ options: options4 }) => {
353
+ const { value, setValue } = useControl();
354
+ const handleChange = (event) => {
355
+ setValue(event.target.value);
356
+ };
357
+ return /* @__PURE__ */ React9.createElement(ControlActions, null, /* @__PURE__ */ React9.createElement(Select, { size: "tiny", value: value ?? "", onChange: handleChange }, options4.map(({ label, ...props }) => /* @__PURE__ */ React9.createElement(MenuItem, { key: props.value, ...props }, label))));
358
+ });
359
+
360
+ // src/controls/control-types/image-control.tsx
361
+ var ImageControl = createControl((props) => {
362
+ const { value, setValue } = useControl();
363
+ const { src, size } = value?.value || {};
364
+ const setImageSrc = (newValue) => {
365
+ setValue({
366
+ $$type: "image",
367
+ value: {
368
+ src: newValue,
369
+ size
370
+ }
371
+ });
372
+ };
373
+ const setImageSize = (newValue) => {
374
+ setValue({
375
+ $$type: "image",
376
+ value: {
377
+ src,
378
+ size: newValue
379
+ }
380
+ });
381
+ };
382
+ return /* @__PURE__ */ React10.createElement(Stack4, { gap: 2 }, /* @__PURE__ */ React10.createElement(ControlContext.Provider, { value: { setValue: setImageSrc, value: src, bind: "src" } }, /* @__PURE__ */ React10.createElement(ImageMediaControl, null)), /* @__PURE__ */ React10.createElement(ControlContext.Provider, { value: { setValue: setImageSize, value: size, bind: "size" } }, /* @__PURE__ */ React10.createElement(Grid, { container: true, spacing: 1, alignItems: "center" }, /* @__PURE__ */ React10.createElement(Grid, { item: true, xs: 6 }, /* @__PURE__ */ React10.createElement(SettingsControl.Label, null, " ", __2("Image Resolution", "elementor"))), /* @__PURE__ */ React10.createElement(Grid, { item: true, xs: 6 }, /* @__PURE__ */ React10.createElement(SelectControl, { options: props.sizes })))));
383
+ });
266
384
 
267
385
  // src/controls/control-types/text-control.tsx
268
- import * as React7 from "react";
386
+ import * as React11 from "react";
269
387
  import { TextField } from "@elementor/ui";
270
- var TextControl = ({ placeholder }) => {
388
+ var TextControl = createControl(({ placeholder }) => {
271
389
  const { value, setValue } = useControl("");
272
390
  const handleChange = (event) => setValue(event.target.value);
273
- return /* @__PURE__ */ React7.createElement(TextField, { type: "text", size: "tiny", value, onChange: handleChange, placeholder });
274
- };
391
+ return /* @__PURE__ */ React11.createElement(ControlActions, { fullWidth: true }, /* @__PURE__ */ React11.createElement(TextField, { type: "text", size: "tiny", value, onChange: handleChange, placeholder }));
392
+ });
275
393
 
276
394
  // src/controls/control-types/text-area-control.tsx
277
- import * as React8 from "react";
395
+ import * as React12 from "react";
278
396
  import { TextField as TextField2 } from "@elementor/ui";
279
- var TextAreaControl = ({ placeholder }) => {
397
+ var TextAreaControl = createControl(({ placeholder }) => {
280
398
  const { value, setValue } = useControl();
281
399
  const handleChange = (event) => {
282
400
  setValue(event.target.value);
283
401
  };
284
- return /* @__PURE__ */ React8.createElement(
402
+ return /* @__PURE__ */ React12.createElement(ControlActions, { fullWidth: true }, /* @__PURE__ */ React12.createElement(
285
403
  TextField2,
286
404
  {
287
405
  size: "tiny",
@@ -292,11 +410,11 @@ var TextAreaControl = ({ placeholder }) => {
292
410
  onChange: handleChange,
293
411
  placeholder
294
412
  }
295
- );
296
- };
413
+ ));
414
+ });
297
415
 
298
416
  // src/controls/control-types/size-control.tsx
299
- import * as React10 from "react";
417
+ import * as React14 from "react";
300
418
  import { InputAdornment as InputAdornment2 } from "@elementor/ui";
301
419
 
302
420
  // src/controls/hooks/use-sync-external-state.tsx
@@ -333,9 +451,9 @@ var useSyncExternalState = ({
333
451
  };
334
452
 
335
453
  // src/controls/components/text-field-inner-selection.tsx
336
- import * as React9 from "react";
337
- import { bindMenu, bindTrigger, Button as Button2, InputAdornment, Menu, MenuItem, TextField as TextField3, usePopupState } from "@elementor/ui";
338
- import { useId as useId2 } from "react";
454
+ import * as React13 from "react";
455
+ import { bindMenu, bindTrigger, Button as Button2, InputAdornment, Menu, MenuItem as MenuItem2, TextField as TextField3, usePopupState as usePopupState2 } from "@elementor/ui";
456
+ import { useId as useId3 } from "react";
339
457
  var TextFieldInnerSelection = ({
340
458
  placeholder,
341
459
  type,
@@ -344,7 +462,7 @@ var TextFieldInnerSelection = ({
344
462
  endAdornment,
345
463
  startAdornment
346
464
  }) => {
347
- return /* @__PURE__ */ React9.createElement(
465
+ return /* @__PURE__ */ React13.createElement(
348
466
  TextField3,
349
467
  {
350
468
  size: "tiny",
@@ -360,19 +478,19 @@ var TextFieldInnerSelection = ({
360
478
  );
361
479
  };
362
480
  var SelectionEndAdornment = ({
363
- options: options3,
481
+ options: options4,
364
482
  onClick,
365
483
  value
366
484
  }) => {
367
- const popupState = usePopupState({
485
+ const popupState = usePopupState2({
368
486
  variant: "popover",
369
- popupId: useId2()
487
+ popupId: useId3()
370
488
  });
371
489
  const handleMenuItemClick = (index) => {
372
- onClick(options3[index]);
490
+ onClick(options4[index]);
373
491
  popupState.close();
374
492
  };
375
- return /* @__PURE__ */ React9.createElement(InputAdornment, { position: "end" }, /* @__PURE__ */ React9.createElement(
493
+ return /* @__PURE__ */ React13.createElement(InputAdornment, { position: "end" }, /* @__PURE__ */ React13.createElement(
376
494
  Button2,
377
495
  {
378
496
  size: "small",
@@ -381,12 +499,12 @@ var SelectionEndAdornment = ({
381
499
  ...bindTrigger(popupState)
382
500
  },
383
501
  value.toUpperCase()
384
- ), /* @__PURE__ */ React9.createElement(Menu, { MenuListProps: { dense: true }, ...bindMenu(popupState) }, options3.map((option, index) => /* @__PURE__ */ React9.createElement(MenuItem, { key: option, onClick: () => handleMenuItemClick(index) }, option.toUpperCase()))));
502
+ ), /* @__PURE__ */ React13.createElement(Menu, { MenuListProps: { dense: true }, ...bindMenu(popupState) }, options4.map((option, index) => /* @__PURE__ */ React13.createElement(MenuItem2, { key: option, onClick: () => handleMenuItemClick(index) }, option.toUpperCase()))));
385
503
  };
386
504
 
387
505
  // src/controls/control-types/size-control.tsx
388
506
  var defaultUnits = ["px", "%", "em", "rem", "vw"];
389
- var SizeControl = ({ units = defaultUnits, placeholder, startIcon }) => {
507
+ var SizeControl = createControl(({ units = defaultUnits, placeholder, startIcon }) => {
390
508
  const { value, setValue } = useControl();
391
509
  const [state, setState] = useSyncExternalState({
392
510
  external: value,
@@ -416,39 +534,29 @@ var SizeControl = ({ units = defaultUnits, placeholder, startIcon }) => {
416
534
  }
417
535
  }));
418
536
  };
419
- return /* @__PURE__ */ React10.createElement(
537
+ return /* @__PURE__ */ React14.createElement(ControlActions, null, /* @__PURE__ */ React14.createElement(
420
538
  TextFieldInnerSelection,
421
539
  {
422
- endAdornment: /* @__PURE__ */ React10.createElement(SelectionEndAdornment, { options: units, onClick: handleUnitChange, value: state.value.unit }),
540
+ endAdornment: /* @__PURE__ */ React14.createElement(SelectionEndAdornment, { options: units, onClick: handleUnitChange, value: state.value.unit }),
423
541
  placeholder,
424
- startAdornment: startIcon ?? /* @__PURE__ */ React10.createElement(InputAdornment2, { position: "start" }, startIcon),
542
+ startAdornment: startIcon ?? /* @__PURE__ */ React14.createElement(InputAdornment2, { position: "start" }, startIcon),
425
543
  type: "number",
426
544
  value: Number.isNaN(state.value.size) ? "" : state.value.size,
427
545
  onChange: handleSizeChange
428
546
  }
429
- );
430
- };
431
-
432
- // src/controls/control-types/select-control.tsx
433
- import * as React11 from "react";
434
- import { MenuItem as MenuItem2, Select } from "@elementor/ui";
435
- var SelectControl = ({ options: options3 }) => {
436
- const { value, setValue } = useControl();
437
- const handleChange = (event) => {
438
- setValue(event.target.value);
439
- };
440
- return /* @__PURE__ */ React11.createElement(Select, { size: "tiny", value: value ?? "", onChange: handleChange }, options3.map(({ label, ...props }) => /* @__PURE__ */ React11.createElement(MenuItem2, { key: props.value, ...props }, label)));
441
- };
547
+ ));
548
+ });
442
549
 
443
550
  // src/controls/controls-registry.tsx
444
551
  var controlTypes = {
445
- image: ImageControl,
446
- text: TextControl,
447
- textarea: TextAreaControl,
448
- size: SizeControl,
449
- select: SelectControl
552
+ image: { component: ImageControl, layout: "full" },
553
+ text: { component: TextControl, layout: "two-columns" },
554
+ textarea: { component: TextAreaControl, layout: "full" },
555
+ size: { component: SizeControl, layout: "two-columns" },
556
+ select: { component: SelectControl, layout: "two-columns" }
450
557
  };
451
- var getControlByType = (type) => controlTypes[type];
558
+ var getControlByType = (type) => controlTypes[type]?.component;
559
+ var getLayoutByType = (type) => controlTypes[type].layout;
452
560
 
453
561
  // src/controls/control.tsx
454
562
  var ControlTypeError = createError({
@@ -456,28 +564,51 @@ var ControlTypeError = createError({
456
564
  message: `Control type not found.`
457
565
  });
458
566
  var Control = ({ props, type }) => {
459
- const { value } = useControl();
460
567
  const ControlByType = getControlByType(type);
461
568
  if (!ControlByType) {
462
569
  throw new ControlTypeError({
463
570
  context: { type }
464
571
  });
465
572
  }
466
- const ControlComponent = getControlReplacement({ value }) || ControlByType;
467
- return /* @__PURE__ */ React12.createElement(ControlComponent, { ...props });
573
+ return /* @__PURE__ */ React15.createElement(ControlByType, { ...props });
468
574
  };
469
575
 
576
+ // src/controls/components/control-type-container.tsx
577
+ import * as React16 from "react";
578
+ import { styled as styled2, Box } from "@elementor/ui";
579
+ var ControlTypeContainer = ({
580
+ controlType,
581
+ children
582
+ }) => {
583
+ const layout = getLayoutByType(controlType);
584
+ return /* @__PURE__ */ React16.createElement(StyledContainer, { layout }, children);
585
+ };
586
+ var StyledContainer = styled2(Box, {
587
+ shouldForwardProp: (prop) => !["layout"].includes(prop)
588
+ })(({ layout, theme }) => ({
589
+ display: "grid",
590
+ gridGap: theme.spacing(1),
591
+ ...getGridLayout(layout)
592
+ }));
593
+ var getGridLayout = (layout) => ({
594
+ justifyContent: "space-between",
595
+ gridTemplateColumns: {
596
+ full: "1fr",
597
+ "two-columns": "repeat(2, 1fr)"
598
+ }[layout]
599
+ });
600
+
470
601
  // src/components/settings-tab.tsx
471
602
  var SettingsTab = () => {
472
603
  const { elementType } = useElementContext();
473
- return /* @__PURE__ */ React13.createElement(Stack3, null, elementType.controls.map(({ type, value }, index) => {
604
+ return /* @__PURE__ */ React17.createElement(Stack5, null, elementType.controls.map(({ type, value }, index) => {
474
605
  if (type === "control") {
475
- return /* @__PURE__ */ React13.createElement(Control2, { key: value.bind, control: value });
606
+ return /* @__PURE__ */ React17.createElement(Control2, { key: value.bind, control: value });
476
607
  }
477
608
  if (type === "section") {
478
- return /* @__PURE__ */ React13.createElement(AccordionSection, { key: type + "." + index, title: value.label }, value.items?.map((item) => {
609
+ return /* @__PURE__ */ React17.createElement(AccordionSection, { key: type + "." + index, title: value.label }, value.items?.map((item) => {
479
610
  if (item.type === "control") {
480
- return /* @__PURE__ */ React13.createElement(Control2, { key: item.value.bind, control: item.value });
611
+ return /* @__PURE__ */ React17.createElement(Control2, { key: item.value.bind, control: item.value });
481
612
  }
482
613
  return null;
483
614
  }));
@@ -489,21 +620,21 @@ var Control2 = ({ control }) => {
489
620
  if (!getControlByType(control.type)) {
490
621
  return null;
491
622
  }
492
- return /* @__PURE__ */ React13.createElement(SettingsControl, { bind: control.bind }, control.label ? /* @__PURE__ */ React13.createElement(SettingsControl.Label, null, control.label) : null, /* @__PURE__ */ React13.createElement(Control, { type: control.type, props: control.props }));
623
+ return /* @__PURE__ */ React17.createElement(SettingsControl, { bind: control.bind }, /* @__PURE__ */ React17.createElement(ControlTypeContainer, { controlType: control.type }, control.label ? /* @__PURE__ */ React17.createElement(SettingsControl.Label, null, control.label) : null, /* @__PURE__ */ React17.createElement(Control, { type: control.type, props: control.props })));
493
624
  };
494
625
 
495
626
  // src/components/style-tab.tsx
496
- import * as React35 from "react";
627
+ import * as React43 from "react";
497
628
 
498
629
  // src/contexts/style-context.tsx
499
- import * as React14 from "react";
630
+ import * as React18 from "react";
500
631
  import { createContext as createContext3, useContext as useContext3 } from "react";
501
632
  import { useActiveBreakpoint } from "@elementor/editor-responsive";
502
633
  var Context2 = createContext3(null);
503
634
  function StyleContext({ children, selectedStyleDef, selectedClassesProp }) {
504
635
  const breakpoint = useActiveBreakpoint();
505
636
  const selectedMeta = { breakpoint, state: null };
506
- return /* @__PURE__ */ React14.createElement(Context2.Provider, { value: { selectedStyleDef, selectedMeta, selectedClassesProp } }, children);
637
+ return /* @__PURE__ */ React18.createElement(Context2.Provider, { value: { selectedStyleDef, selectedMeta, selectedClassesProp } }, children);
507
638
  }
508
639
  function useStyleContext() {
509
640
  const context = useContext3(Context2);
@@ -534,13 +665,13 @@ var useElementStyles = (elementID) => {
534
665
  };
535
666
 
536
667
  // src/components/style-tab.tsx
537
- import { Stack as Stack10 } from "@elementor/ui";
668
+ import { Stack as Stack15 } from "@elementor/ui";
538
669
 
539
670
  // src/components/style-sections/size-section.tsx
540
- import * as React16 from "react";
671
+ import * as React20 from "react";
541
672
 
542
673
  // src/controls/style-control.tsx
543
- import * as React15 from "react";
674
+ import * as React19 from "react";
544
675
 
545
676
  // src/hooks/use-element-style-prop.ts
546
677
  import { commandEndEvent as commandEndEvent5, __privateUseListenTo as useListenTo5 } from "@elementor/editor-v1-adapters";
@@ -610,35 +741,35 @@ var useStyleControl = (propName) => {
610
741
  // src/controls/style-control.tsx
611
742
  var StyleControl = ({ bind, children }) => {
612
743
  const [value, setValue] = useStyleControl(bind);
613
- return /* @__PURE__ */ React15.createElement(ControlContext.Provider, { value: { bind, value, setValue } }, children);
744
+ return /* @__PURE__ */ React19.createElement(ControlContext.Provider, { value: { bind, value, setValue } }, children);
614
745
  };
615
746
  StyleControl.Label = ControlLabel;
616
747
 
617
748
  // src/components/style-sections/size-section.tsx
618
- import { Stack as Stack4 } from "@elementor/ui";
619
- import { __ as __2 } from "@wordpress/i18n";
749
+ import { Grid as Grid2, Stack as Stack6 } from "@elementor/ui";
750
+ import { __ as __3 } from "@wordpress/i18n";
620
751
  var SizeSection = () => {
621
- return /* @__PURE__ */ React16.createElement(AccordionSection, { title: __2("Size", "elementor") }, /* @__PURE__ */ React16.createElement(Stack4, { gap: 1.5 }, /* @__PURE__ */ React16.createElement(Stack4, { direction: "row", gap: 2 }, /* @__PURE__ */ React16.createElement(Control3, { bind: "width", label: __2("Width", "elementor") }), /* @__PURE__ */ React16.createElement(Control3, { bind: "height", label: __2("Height", "elementor") })), /* @__PURE__ */ React16.createElement(Stack4, { gap: 1.5, sx: { pt: 1.5 } }, /* @__PURE__ */ React16.createElement(Stack4, { direction: "row", gap: 2 }, /* @__PURE__ */ React16.createElement(Control3, { bind: "minWidth", label: __2("Min. Width", "elementor") }), /* @__PURE__ */ React16.createElement(Control3, { bind: "minHeight", label: __2("Min. Height", "elementor") })), /* @__PURE__ */ React16.createElement(Stack4, { direction: "row", gap: 2 }, /* @__PURE__ */ React16.createElement(Control3, { bind: "maxWidth", label: __2("Max. Width", "elementor") }), /* @__PURE__ */ React16.createElement(Control3, { bind: "maxHeight", label: __2("Max. Height", "elementor") })))));
752
+ return /* @__PURE__ */ React20.createElement(AccordionSection, { title: __3("Size", "elementor") }, /* @__PURE__ */ React20.createElement(Stack6, { gap: 1.5 }, /* @__PURE__ */ React20.createElement(Grid2, { container: true, spacing: 2 }, /* @__PURE__ */ React20.createElement(Control3, { bind: "width", label: __3("Width", "elementor") }), /* @__PURE__ */ React20.createElement(Control3, { bind: "height", label: __3("Height", "elementor") })), /* @__PURE__ */ React20.createElement(Grid2, { container: true, spacing: 2 }, /* @__PURE__ */ React20.createElement(Control3, { bind: "min-width", label: __3("Min. Width", "elementor") }), /* @__PURE__ */ React20.createElement(Control3, { bind: "min-height", label: __3("Min. Height", "elementor") })), /* @__PURE__ */ React20.createElement(Grid2, { container: true, spacing: 2 }, /* @__PURE__ */ React20.createElement(Control3, { bind: "max-width", label: __3("Max. Width", "elementor") }), /* @__PURE__ */ React20.createElement(Control3, { bind: "max-height", label: __3("Max. Height", "elementor") }))));
622
753
  };
623
754
  var Control3 = ({ label, bind }) => {
624
- return /* @__PURE__ */ React16.createElement(StyleControl, { bind }, /* @__PURE__ */ React16.createElement(ControlContainer, { direction: "column" }, /* @__PURE__ */ React16.createElement(StyleControl.Label, null, label), /* @__PURE__ */ React16.createElement(Control, { type: "size" })));
755
+ return /* @__PURE__ */ React20.createElement(Grid2, { item: true, xs: 6 }, /* @__PURE__ */ React20.createElement(StyleControl, { bind }, /* @__PURE__ */ React20.createElement(Grid2, { container: true, spacing: 1, alignItems: "center" }, /* @__PURE__ */ React20.createElement(Grid2, { item: true, xs: 12 }, /* @__PURE__ */ React20.createElement(StyleControl.Label, null, label)), /* @__PURE__ */ React20.createElement(Grid2, { item: true, xs: 12 }, /* @__PURE__ */ React20.createElement(Control, { type: "size" })))));
625
756
  };
626
757
 
627
758
  // src/components/style-sections/typography-section/typography-section.tsx
628
- import * as React29 from "react";
629
- import { Divider, Stack as Stack6 } from "@elementor/ui";
759
+ import * as React34 from "react";
760
+ import { Divider, Stack as Stack8 } from "@elementor/ui";
630
761
 
631
762
  // src/components/style-sections/typography-section/text-style-control.tsx
632
- import * as React17 from "react";
633
- import { ToggleButton as ToggleButtonBase, ToggleButtonGroup } from "@elementor/ui";
763
+ import * as React21 from "react";
764
+ import { __ as __4 } from "@wordpress/i18n";
765
+ import { Grid as Grid3, ToggleButton as ToggleButtonBase, ToggleButtonGroup } from "@elementor/ui";
634
766
  import { ItalicIcon, StrikethroughIcon, UnderlineIcon } from "@elementor/icons";
635
- import { __ as __3 } from "@wordpress/i18n";
636
767
  var buttonSize = "tiny";
637
768
  var TextStyleControl = () => {
638
- const [fontStyle, setFontStyle] = useStyleControl("fontStyle");
639
- const [textDecoration, setTextDecoration] = useStyleControl("textDecoration");
769
+ const [fontStyle, setFontStyle] = useStyleControl("font-style");
770
+ const [textDecoration, setTextDecoration] = useStyleControl("text-decoration");
640
771
  const formats = [fontStyle, ...(textDecoration || "").split(" ")];
641
- return /* @__PURE__ */ React17.createElement(ControlContainer, null, /* @__PURE__ */ React17.createElement(ControlLabel, null, __3("Style", "elementor")), /* @__PURE__ */ React17.createElement(ToggleButtonGroup, { value: formats }, /* @__PURE__ */ React17.createElement(
772
+ return /* @__PURE__ */ React21.createElement(Grid3, { container: true, spacing: 1, alignItems: "center" }, /* @__PURE__ */ React21.createElement(Grid3, { item: true, xs: 6 }, /* @__PURE__ */ React21.createElement(ControlLabel, null, __4("Style", "elementor"))), /* @__PURE__ */ React21.createElement(Grid3, { item: true, xs: 6 }, /* @__PURE__ */ React21.createElement(ToggleButtonGroup, { value: formats }, /* @__PURE__ */ React21.createElement(
642
773
  ToggleButton,
643
774
  {
644
775
  value: "italic",
@@ -646,8 +777,8 @@ var TextStyleControl = () => {
646
777
  "aria-label": "italic",
647
778
  sx: { marginLeft: "auto" }
648
779
  },
649
- /* @__PURE__ */ React17.createElement(ItalicIcon, { fontSize: buttonSize })
650
- ), /* @__PURE__ */ React17.createElement(
780
+ /* @__PURE__ */ React21.createElement(ItalicIcon, { fontSize: buttonSize })
781
+ ), /* @__PURE__ */ React21.createElement(
651
782
  ShorthandControl,
652
783
  {
653
784
  value: "line-through",
@@ -655,8 +786,8 @@ var TextStyleControl = () => {
655
786
  updateValues: setTextDecoration,
656
787
  "aria-label": "line-through"
657
788
  },
658
- /* @__PURE__ */ React17.createElement(StrikethroughIcon, { fontSize: buttonSize })
659
- ), /* @__PURE__ */ React17.createElement(
789
+ /* @__PURE__ */ React21.createElement(StrikethroughIcon, { fontSize: buttonSize })
790
+ ), /* @__PURE__ */ React21.createElement(
660
791
  ShorthandControl,
661
792
  {
662
793
  value: "underline",
@@ -664,8 +795,8 @@ var TextStyleControl = () => {
664
795
  updateValues: setTextDecoration,
665
796
  "aria-label": "underline"
666
797
  },
667
- /* @__PURE__ */ React17.createElement(UnderlineIcon, { fontSize: buttonSize })
668
- )));
798
+ /* @__PURE__ */ React21.createElement(UnderlineIcon, { fontSize: buttonSize })
799
+ ))));
669
800
  };
670
801
  var ShorthandControl = ({
671
802
  children,
@@ -683,92 +814,95 @@ var ShorthandControl = ({
683
814
  updateValues([...valuesArr, newValue].join(" "));
684
815
  }
685
816
  };
686
- return /* @__PURE__ */ React17.createElement(ToggleButton, { value, onChange: toggleValue, selected, "aria-label": ariaLabel }, children);
817
+ return /* @__PURE__ */ React21.createElement(ToggleButton, { value, onChange: toggleValue, selected, "aria-label": ariaLabel }, children);
687
818
  };
688
819
  var ToggleButton = ({ onChange, ...props }) => {
689
820
  const handleChange = (_e, newValue) => {
690
821
  onChange(newValue);
691
822
  };
692
- return /* @__PURE__ */ React17.createElement(ToggleButtonBase, { ...props, onChange: handleChange, size: buttonSize });
823
+ return /* @__PURE__ */ React21.createElement(ToggleButtonBase, { ...props, onChange: handleChange, size: buttonSize });
693
824
  };
694
825
 
695
826
  // src/components/style-sections/typography-section/typography-section.tsx
696
- import { __ as __12 } from "@wordpress/i18n";
827
+ import { __ as __14 } from "@wordpress/i18n";
697
828
 
698
829
  // src/components/style-sections/typography-section/font-size-control.tsx
699
- import * as React18 from "react";
700
- import { __ as __4 } from "@wordpress/i18n";
830
+ import * as React22 from "react";
831
+ import { __ as __5 } from "@wordpress/i18n";
832
+ import { Grid as Grid4 } from "@elementor/ui";
701
833
  var FontSizeControl = () => {
702
- return /* @__PURE__ */ React18.createElement(StyleControl, { bind: "font-size" }, /* @__PURE__ */ React18.createElement(ControlContainer, null, /* @__PURE__ */ React18.createElement(StyleControl.Label, null, __4("Font Size", "elementor")), /* @__PURE__ */ React18.createElement(SizeControl, null)));
834
+ return /* @__PURE__ */ React22.createElement(StyleControl, { bind: "font-size" }, /* @__PURE__ */ React22.createElement(Grid4, { container: true, spacing: 1, alignItems: "center" }, /* @__PURE__ */ React22.createElement(Grid4, { item: true, xs: 6 }, /* @__PURE__ */ React22.createElement(StyleControl.Label, null, __5("Font Size", "elementor"))), /* @__PURE__ */ React22.createElement(Grid4, { item: true, xs: 6 }, /* @__PURE__ */ React22.createElement(SizeControl, null))));
703
835
  };
704
836
 
705
837
  // src/components/style-sections/typography-section/font-weight-control.tsx
706
- import * as React19 from "react";
707
- import { __ as __5 } from "@wordpress/i18n";
838
+ import * as React23 from "react";
839
+ import { __ as __6 } from "@wordpress/i18n";
840
+ import { Grid as Grid5 } from "@elementor/ui";
708
841
  var fontWeightOptions = [
709
- { label: __5("Light - 400", "elementor"), value: 400 },
710
- { label: __5("Regular - 500", "elementor"), value: 500 },
711
- { label: __5("Semi Bold - 600", "elementor"), value: 600 },
712
- { label: __5("Bold - 700", "elementor"), value: 700 },
713
- { label: __5("Black - 900", "elementor"), value: 900 }
842
+ { label: __6("Light - 400", "elementor"), value: "400" },
843
+ { label: __6("Regular - 500", "elementor"), value: "500" },
844
+ { label: __6("Semi Bold - 600", "elementor"), value: "600" },
845
+ { label: __6("Bold - 700", "elementor"), value: "700" },
846
+ { label: __6("Black - 900", "elementor"), value: "900" }
714
847
  ];
715
848
  var FontWeightControl = () => {
716
- return /* @__PURE__ */ React19.createElement(StyleControl, { bind: "fontWeight" }, /* @__PURE__ */ React19.createElement(ControlContainer, null, /* @__PURE__ */ React19.createElement(StyleControl.Label, null, __5("Font Weight", "elementor")), /* @__PURE__ */ React19.createElement(SelectControl, { options: fontWeightOptions })));
849
+ return /* @__PURE__ */ React23.createElement(StyleControl, { bind: "font-weight" }, /* @__PURE__ */ React23.createElement(Grid5, { container: true, spacing: 1, alignItems: "center" }, /* @__PURE__ */ React23.createElement(Grid5, { item: true, xs: 6 }, /* @__PURE__ */ React23.createElement(StyleControl.Label, null, __6("Font Weight", "elementor"))), /* @__PURE__ */ React23.createElement(Grid5, { item: true, xs: 6 }, /* @__PURE__ */ React23.createElement(SelectControl, { options: fontWeightOptions }))));
717
850
  };
718
851
 
719
852
  // src/components/style-sections/typography-section/text-color-control.tsx
720
- import * as React21 from "react";
721
- import { __ as __6 } from "@wordpress/i18n";
853
+ import * as React25 from "react";
854
+ import { __ as __7 } from "@wordpress/i18n";
855
+ import { Grid as Grid6 } from "@elementor/ui";
722
856
 
723
857
  // src/controls/control-types/color-control.tsx
724
- import * as React20 from "react";
858
+ import * as React24 from "react";
725
859
  import { UnstableColorPicker } from "@elementor/ui";
726
- var ColorControl = () => {
727
- const { value, setValue } = useControl();
728
- const handleChange = debounce((selectedColor) => {
729
- setValue(selectedColor);
730
- });
731
- return /* @__PURE__ */ React20.createElement(UnstableColorPicker, { value, onChange: handleChange });
732
- };
733
- var debounce = (func, wait = 300) => {
734
- let timer;
735
- return (...args) => {
736
- clearTimeout(timer);
737
- timer = setTimeout(() => func(...args), wait);
738
- };
739
- };
860
+ var ColorControl = createControl(
861
+ (props) => {
862
+ const { value, setValue } = useControl();
863
+ const handleChange = (selectedColor) => {
864
+ setValue({
865
+ $$type: "color",
866
+ value: selectedColor
867
+ });
868
+ };
869
+ return /* @__PURE__ */ React24.createElement(ControlActions, null, /* @__PURE__ */ React24.createElement(UnstableColorPicker, { size: "tiny", ...props, value: value?.value, onChange: handleChange }));
870
+ }
871
+ );
740
872
 
741
873
  // src/components/style-sections/typography-section/text-color-control.tsx
742
874
  var TextColorControl = () => {
743
- return /* @__PURE__ */ React21.createElement(StyleControl, { bind: "color" }, /* @__PURE__ */ React21.createElement(ControlContainer, null, /* @__PURE__ */ React21.createElement(StyleControl.Label, null, __6("Text Color", "elementor")), /* @__PURE__ */ React21.createElement(ColorControl, null)));
875
+ return /* @__PURE__ */ React25.createElement(StyleControl, { bind: "color" }, /* @__PURE__ */ React25.createElement(Grid6, { container: true, spacing: 1, alignItems: "center" }, /* @__PURE__ */ React25.createElement(Grid6, { item: true, xs: 6 }, /* @__PURE__ */ React25.createElement(StyleControl.Label, null, __7("Text Color", "elementor"))), /* @__PURE__ */ React25.createElement(Grid6, { item: true, xs: 6 }, /* @__PURE__ */ React25.createElement(ColorControl, null))));
744
876
  };
745
877
 
746
878
  // src/components/style-sections/typography-section/letter-spacing-control.tsx
747
- import * as React22 from "react";
748
- import { __ as __7 } from "@wordpress/i18n";
879
+ import * as React26 from "react";
880
+ import { __ as __8 } from "@wordpress/i18n";
881
+ import { Grid as Grid7 } from "@elementor/ui";
749
882
  var LetterSpacingControl = () => {
750
- return /* @__PURE__ */ React22.createElement(StyleControl, { bind: "letter-spacing" }, /* @__PURE__ */ React22.createElement(ControlContainer, null, /* @__PURE__ */ React22.createElement(StyleControl.Label, null, __7("Letter Spacing", "elementor")), /* @__PURE__ */ React22.createElement(SizeControl, null)));
883
+ return /* @__PURE__ */ React26.createElement(StyleControl, { bind: "letter-spacing" }, /* @__PURE__ */ React26.createElement(Grid7, { container: true, spacing: 1, alignItems: "center" }, /* @__PURE__ */ React26.createElement(Grid7, { item: true, xs: 6 }, /* @__PURE__ */ React26.createElement(StyleControl.Label, null, __8("Letter Spacing", "elementor"))), /* @__PURE__ */ React26.createElement(Grid7, { item: true, xs: 6 }, /* @__PURE__ */ React26.createElement(SizeControl, null))));
751
884
  };
752
885
 
753
886
  // src/components/style-sections/typography-section/word-spacing-control.tsx
754
- import * as React23 from "react";
755
- import { __ as __8 } from "@wordpress/i18n";
887
+ import * as React27 from "react";
888
+ import { __ as __9 } from "@wordpress/i18n";
889
+ import { Grid as Grid8 } from "@elementor/ui";
756
890
  var WordSpacingControl = () => {
757
- return /* @__PURE__ */ React23.createElement(StyleControl, { bind: "word-spacing" }, /* @__PURE__ */ React23.createElement(ControlContainer, null, /* @__PURE__ */ React23.createElement(StyleControl.Label, null, __8("Word Spacing", "elementor")), /* @__PURE__ */ React23.createElement(SizeControl, null)));
891
+ return /* @__PURE__ */ React27.createElement(StyleControl, { bind: "word-spacing" }, /* @__PURE__ */ React27.createElement(Grid8, { container: true, spacing: 1, alignItems: "center" }, /* @__PURE__ */ React27.createElement(Grid8, { item: true, xs: 6 }, /* @__PURE__ */ React27.createElement(StyleControl.Label, null, __9("Word Spacing", "elementor"))), /* @__PURE__ */ React27.createElement(Grid8, { item: true, xs: 6 }, /* @__PURE__ */ React27.createElement(SizeControl, null))));
758
892
  };
759
893
 
760
894
  // src/components/collapsible-content.tsx
761
- import * as React24 from "react";
895
+ import * as React28 from "react";
762
896
  import { useState as useState2 } from "react";
763
897
  import { ChevronDownIcon } from "@elementor/icons";
764
- import { Button as Button3, Collapse, Stack as Stack5, styled as styled2 } from "@elementor/ui";
765
- import { __ as __9 } from "@wordpress/i18n";
898
+ import { Button as Button3, Collapse, Stack as Stack7, styled as styled3 } from "@elementor/ui";
899
+ import { __ as __10 } from "@wordpress/i18n";
766
900
  var CollapsibleContent = ({ children, defaultOpen = false }) => {
767
901
  const [open, setOpen] = useState2(defaultOpen);
768
902
  const handleToggle = () => {
769
903
  setOpen((prevOpen) => !prevOpen);
770
904
  };
771
- return /* @__PURE__ */ React24.createElement(Stack5, { sx: { py: 0.5 } }, /* @__PURE__ */ React24.createElement(
905
+ return /* @__PURE__ */ React28.createElement(Stack7, { sx: { py: 0.5 } }, /* @__PURE__ */ React28.createElement(
772
906
  Button3,
773
907
  {
774
908
  fullWidth: true,
@@ -776,12 +910,12 @@ var CollapsibleContent = ({ children, defaultOpen = false }) => {
776
910
  color: "secondary",
777
911
  variant: "outlined",
778
912
  onClick: handleToggle,
779
- endIcon: /* @__PURE__ */ React24.createElement(ChevronIcon, { open })
913
+ endIcon: /* @__PURE__ */ React28.createElement(ChevronIcon, { open })
780
914
  },
781
- open ? __9("Show less", "elementor") : __9("Show more", "elementor")
782
- ), /* @__PURE__ */ React24.createElement(Collapse, { in: open, timeout: "auto" }, children));
915
+ open ? __10("Show less", "elementor") : __10("Show more", "elementor")
916
+ ), /* @__PURE__ */ React28.createElement(Collapse, { in: open, timeout: "auto" }, children));
783
917
  };
784
- var ChevronIcon = styled2(ChevronDownIcon, {
918
+ var ChevronIcon = styled3(ChevronDownIcon, {
785
919
  shouldForwardProp: (prop) => prop !== "open"
786
920
  })(({ theme, open }) => ({
787
921
  transform: open ? "rotate(180deg)" : "rotate(0)",
@@ -791,16 +925,18 @@ var ChevronIcon = styled2(ChevronDownIcon, {
791
925
  }));
792
926
 
793
927
  // src/components/style-sections/typography-section/transform-control.tsx
794
- import * as React27 from "react";
795
- import { __ as __10 } from "@wordpress/i18n";
928
+ import * as React31 from "react";
929
+ import { __ as __11 } from "@wordpress/i18n";
930
+ import { Grid as Grid9 } from "@elementor/ui";
931
+ import { LetterCaseIcon, LetterCaseLowerIcon, LetterCaseUpperIcon } from "@elementor/icons";
796
932
 
797
933
  // src/controls/control-types/toggle-control.tsx
798
- import * as React26 from "react";
934
+ import * as React30 from "react";
799
935
 
800
936
  // src/controls/components/control-toggle-button-group.tsx
801
- import * as React25 from "react";
802
- import { styled as styled3, ToggleButton as ToggleButton2, ToggleButtonGroup as ToggleButtonGroup2 } from "@elementor/ui";
803
- var StyledToggleButtonGroup = styled3(ToggleButtonGroup2)`
937
+ import * as React29 from "react";
938
+ import { styled as styled4, ToggleButton as ToggleButton2, ToggleButtonGroup as ToggleButtonGroup2 } from "@elementor/ui";
939
+ var StyledToggleButtonGroup = styled4(ToggleButtonGroup2)`
804
940
  ${({ justify }) => `justify-content: ${justify};`}
805
941
  `;
806
942
  var ControlToggleButtonGroup = ({
@@ -814,91 +950,111 @@ var ControlToggleButtonGroup = ({
814
950
  const handleChange = (_, newValue) => {
815
951
  onChange(newValue);
816
952
  };
817
- return /* @__PURE__ */ React25.createElement(StyledToggleButtonGroup, { justify, value, onChange: handleChange, exclusive }, items.map(({ label, value: buttonValue, icon: Icon }) => /* @__PURE__ */ React25.createElement(ToggleButton2, { key: buttonValue, value: buttonValue, "aria-label": label, size }, /* @__PURE__ */ React25.createElement(Icon, { fontSize: size }))));
953
+ return /* @__PURE__ */ React29.createElement(StyledToggleButtonGroup, { justify, value, onChange: handleChange, exclusive }, items.map(({ label, value: buttonValue, icon: Icon }) => /* @__PURE__ */ React29.createElement(ToggleButton2, { key: buttonValue, value: buttonValue, "aria-label": label, size }, /* @__PURE__ */ React29.createElement(Icon, { fontSize: size }))));
818
954
  };
819
955
 
820
956
  // src/controls/control-types/toggle-control.tsx
821
- var ToggleControl = ({ options: options3 }) => {
957
+ var ToggleControl = createControl(({ options: options4 }) => {
822
958
  const { value, setValue } = useControl();
823
959
  const handleToggle = (option) => {
824
960
  setValue(option || void 0);
825
961
  };
826
- return /* @__PURE__ */ React26.createElement(
962
+ return /* @__PURE__ */ React30.createElement(
827
963
  ControlToggleButtonGroup,
828
964
  {
829
- items: options3,
965
+ items: options4,
830
966
  value: value || null,
831
967
  onChange: handleToggle,
832
968
  exclusive: true
833
969
  }
834
970
  );
835
- };
971
+ });
836
972
 
837
973
  // src/components/style-sections/typography-section/transform-control.tsx
838
- import { LetterCaseIcon, LetterCaseLowerIcon, LetterCaseUpperIcon } from "@elementor/icons";
839
974
  var options = [
840
- { value: "capitalize", label: __10("Capitalize", "elementor"), icon: LetterCaseIcon },
841
- { value: "uppercase", label: __10("Uppercase", "elementor"), icon: LetterCaseUpperIcon },
842
- { value: "lowercase", label: __10("Lowercase", "elementor"), icon: LetterCaseLowerIcon }
975
+ { value: "capitalize", label: __11("Capitalize", "elementor"), icon: LetterCaseIcon },
976
+ { value: "uppercase", label: __11("Uppercase", "elementor"), icon: LetterCaseUpperIcon },
977
+ { value: "lowercase", label: __11("Lowercase", "elementor"), icon: LetterCaseLowerIcon }
843
978
  ];
844
- var TransformControl = () => {
845
- return /* @__PURE__ */ React27.createElement(ControlContainer, null, /* @__PURE__ */ React27.createElement(StyleControl.Label, null, __10("Transform", "elementor")), /* @__PURE__ */ React27.createElement(StyleControl, { bind: "text-transform" }, /* @__PURE__ */ React27.createElement(ToggleControl, { options })));
846
- };
979
+ var TransformControl = () => /* @__PURE__ */ React31.createElement(StyleControl, { bind: "text-transform" }, /* @__PURE__ */ React31.createElement(Grid9, { container: true, spacing: 1, alignItems: "center" }, /* @__PURE__ */ React31.createElement(Grid9, { item: true, xs: 6 }, /* @__PURE__ */ React31.createElement(StyleControl.Label, null, __11("Transform", "elementor"))), /* @__PURE__ */ React31.createElement(Grid9, { item: true, xs: 6 }, /* @__PURE__ */ React31.createElement(ToggleControl, { options }))));
847
980
 
848
981
  // src/components/style-sections/typography-section/text-alignment-control.tsx
849
- import * as React28 from "react";
982
+ import * as React32 from "react";
983
+ import { __ as __12 } from "@wordpress/i18n";
984
+ import { Grid as Grid10 } from "@elementor/ui";
850
985
  import { AlignLeftIcon, AlignCenterIcon, AlignRightIcon, AlignJustifiedIcon } from "@elementor/icons";
851
- import { __ as __11 } from "@wordpress/i18n";
852
986
  var options2 = [
853
987
  {
854
988
  value: "left",
855
- label: __11("Left", "elementor"),
989
+ label: __12("Left", "elementor"),
856
990
  icon: AlignLeftIcon
857
991
  },
858
992
  {
859
993
  value: "center",
860
- label: __11("Center", "elementor"),
994
+ label: __12("Center", "elementor"),
861
995
  icon: AlignCenterIcon
862
996
  },
863
997
  {
864
998
  value: "right",
865
- label: __11("Right", "elementor"),
999
+ label: __12("Right", "elementor"),
866
1000
  icon: AlignRightIcon
867
1001
  },
868
1002
  {
869
1003
  value: "justify",
870
- label: __11("Justify", "elementor"),
1004
+ label: __12("Justify", "elementor"),
871
1005
  icon: AlignJustifiedIcon
872
1006
  }
873
1007
  ];
874
1008
  var TextAlignmentControl = () => {
875
- return /* @__PURE__ */ React28.createElement(ControlContainer, null, /* @__PURE__ */ React28.createElement(StyleControl.Label, null, __11("Alignment", "elementor")), /* @__PURE__ */ React28.createElement(StyleControl, { bind: "text-align" }, /* @__PURE__ */ React28.createElement(ToggleControl, { options: options2 })));
1009
+ return /* @__PURE__ */ React32.createElement(StyleControl, { bind: "text-align" }, /* @__PURE__ */ React32.createElement(Grid10, { container: true, spacing: 1, alignItems: "center" }, /* @__PURE__ */ React32.createElement(Grid10, { item: true, xs: 6 }, /* @__PURE__ */ React32.createElement(StyleControl.Label, null, __12("Alignment", "elementor"))), /* @__PURE__ */ React32.createElement(Grid10, { item: true, xs: 6 }, /* @__PURE__ */ React32.createElement(ToggleControl, { options: options2 }))));
1010
+ };
1011
+
1012
+ // src/components/style-sections/typography-section/text-direction-control.tsx
1013
+ import * as React33 from "react";
1014
+ import { __ as __13 } from "@wordpress/i18n";
1015
+ import { Grid as Grid11 } from "@elementor/ui";
1016
+ import { TextDirectionLtrIcon, TextDirectionRtlIcon } from "@elementor/icons";
1017
+ var options3 = [
1018
+ {
1019
+ value: "ltr",
1020
+ label: __13("Left to Right", "elementor"),
1021
+ icon: TextDirectionLtrIcon
1022
+ },
1023
+ {
1024
+ value: "rtl",
1025
+ label: __13("Right to Left", "elementor"),
1026
+ icon: TextDirectionRtlIcon
1027
+ }
1028
+ ];
1029
+ var TextDirectionControl = () => {
1030
+ return /* @__PURE__ */ React33.createElement(StyleControl, { bind: "direction" }, /* @__PURE__ */ React33.createElement(Grid11, { container: true, spacing: 1, alignItems: "center" }, /* @__PURE__ */ React33.createElement(Grid11, { item: true, xs: 6 }, /* @__PURE__ */ React33.createElement(StyleControl.Label, null, __13("Direction", "elementor"))), /* @__PURE__ */ React33.createElement(Grid11, { item: true, xs: 6 }, /* @__PURE__ */ React33.createElement(ToggleControl, { options: options3 }))));
876
1031
  };
877
1032
 
878
1033
  // src/components/style-sections/typography-section/typography-section.tsx
879
1034
  var TypographySection = () => {
880
- return /* @__PURE__ */ React29.createElement(AccordionSection, { title: __12("Typography", "elementor") }, /* @__PURE__ */ React29.createElement(Stack6, { gap: 1.5 }, /* @__PURE__ */ React29.createElement(FontWeightControl, null), /* @__PURE__ */ React29.createElement(FontSizeControl, null), /* @__PURE__ */ React29.createElement(Divider, null), /* @__PURE__ */ React29.createElement(TextColorControl, null), /* @__PURE__ */ React29.createElement(CollapsibleContent, null, /* @__PURE__ */ React29.createElement(Stack6, { gap: 1.5, sx: { pt: 1.5 } }, /* @__PURE__ */ React29.createElement(LetterSpacingControl, null), /* @__PURE__ */ React29.createElement(WordSpacingControl, null), /* @__PURE__ */ React29.createElement(Divider, null), /* @__PURE__ */ React29.createElement(TextAlignmentControl, null), /* @__PURE__ */ React29.createElement(TextStyleControl, null), /* @__PURE__ */ React29.createElement(TransformControl, null)))));
1035
+ return /* @__PURE__ */ React34.createElement(AccordionSection, { title: __14("Typography", "elementor") }, /* @__PURE__ */ React34.createElement(Stack8, { gap: 1.5 }, /* @__PURE__ */ React34.createElement(FontWeightControl, null), /* @__PURE__ */ React34.createElement(FontSizeControl, null), /* @__PURE__ */ React34.createElement(Divider, null), /* @__PURE__ */ React34.createElement(TextColorControl, null), /* @__PURE__ */ React34.createElement(CollapsibleContent, null, /* @__PURE__ */ React34.createElement(Stack8, { gap: 1.5, sx: { pt: 1.5 } }, /* @__PURE__ */ React34.createElement(LetterSpacingControl, null), /* @__PURE__ */ React34.createElement(WordSpacingControl, null), /* @__PURE__ */ React34.createElement(Divider, null), /* @__PURE__ */ React34.createElement(TextAlignmentControl, null), /* @__PURE__ */ React34.createElement(TextStyleControl, null), /* @__PURE__ */ React34.createElement(TransformControl, null), /* @__PURE__ */ React34.createElement(TextDirectionControl, null)))));
881
1036
  };
882
1037
 
883
1038
  // src/components/style-sections/position-section/position-section.tsx
884
- import * as React32 from "react";
885
- import { Stack as Stack7 } from "@elementor/ui";
1039
+ import * as React37 from "react";
1040
+ import { Stack as Stack9 } from "@elementor/ui";
886
1041
 
887
1042
  // src/components/style-sections/position-section/z-index-control.tsx
888
- import * as React31 from "react";
889
- import { __ as __13 } from "@wordpress/i18n";
1043
+ import * as React36 from "react";
1044
+ import { __ as __15 } from "@wordpress/i18n";
1045
+ import { Grid as Grid12 } from "@elementor/ui";
890
1046
 
891
1047
  // src/controls/control-types/number-control.tsx
892
- import * as React30 from "react";
1048
+ import * as React35 from "react";
893
1049
  import { TextField as TextField4 } from "@elementor/ui";
894
1050
  var isEmptyOrNaN = (value) => value === void 0 || value === "" || Number.isNaN(Number(value));
895
- var NumberControl = ({ placeholder }) => {
1051
+ var NumberControl = createControl(({ placeholder }) => {
896
1052
  const { value, setValue } = useControl();
897
1053
  const handleChange = (event) => {
898
1054
  const eventValue = event.target.value;
899
1055
  setValue(isEmptyOrNaN(eventValue) ? void 0 : Number(eventValue));
900
1056
  };
901
- return /* @__PURE__ */ React30.createElement(
1057
+ return /* @__PURE__ */ React35.createElement(ControlActions, null, /* @__PURE__ */ React35.createElement(
902
1058
  TextField4,
903
1059
  {
904
1060
  size: "tiny",
@@ -907,33 +1063,33 @@ var NumberControl = ({ placeholder }) => {
907
1063
  onChange: handleChange,
908
1064
  placeholder
909
1065
  }
910
- );
911
- };
1066
+ ));
1067
+ });
912
1068
 
913
1069
  // src/components/style-sections/position-section/z-index-control.tsx
914
1070
  var ZIndexControl = () => {
915
- return /* @__PURE__ */ React31.createElement(StyleControl, { bind: "zIndex" }, /* @__PURE__ */ React31.createElement(ControlContainer, null, /* @__PURE__ */ React31.createElement(StyleControl.Label, null, __13("Z-Index", "elementor")), /* @__PURE__ */ React31.createElement(NumberControl, null)));
1071
+ return /* @__PURE__ */ React36.createElement(StyleControl, { bind: "z-index" }, /* @__PURE__ */ React36.createElement(Grid12, { container: true, spacing: 1, alignItems: "center" }, /* @__PURE__ */ React36.createElement(Grid12, { item: true, xs: 6 }, /* @__PURE__ */ React36.createElement(StyleControl.Label, null, __15("Z-Index", "elementor"))), /* @__PURE__ */ React36.createElement(Grid12, { item: true, xs: 6 }, /* @__PURE__ */ React36.createElement(NumberControl, null))));
916
1072
  };
917
1073
 
918
1074
  // src/components/style-sections/position-section/position-section.tsx
919
- import { __ as __14 } from "@wordpress/i18n";
1075
+ import { __ as __16 } from "@wordpress/i18n";
920
1076
  var PositionSection = () => {
921
- return /* @__PURE__ */ React32.createElement(AccordionSection, { title: __14("Position", "elementor") }, /* @__PURE__ */ React32.createElement(Stack7, { gap: 1.5 }, /* @__PURE__ */ React32.createElement(ZIndexControl, null)));
1077
+ return /* @__PURE__ */ React37.createElement(AccordionSection, { title: __16("Position", "elementor") }, /* @__PURE__ */ React37.createElement(Stack9, { gap: 1.5 }, /* @__PURE__ */ React37.createElement(ZIndexControl, null)));
922
1078
  };
923
1079
 
924
1080
  // src/components/style-sections/spacing-section/spacing-section.tsx
925
- import * as React34 from "react";
926
- import { Divider as Divider2, Stack as Stack9 } from "@elementor/ui";
927
- import { __ as __16 } from "@wordpress/i18n";
1081
+ import * as React39 from "react";
1082
+ import { Divider as Divider2, Stack as Stack11 } from "@elementor/ui";
1083
+ import { __ as __18 } from "@wordpress/i18n";
928
1084
 
929
1085
  // src/components/style-sections/spacing-section/linked-dimensions-control.tsx
930
- import * as React33 from "react";
931
- import { Stack as Stack8, ToggleButton as ToggleButton3 } from "@elementor/ui";
1086
+ import * as React38 from "react";
1087
+ import { __ as __17 } from "@wordpress/i18n";
1088
+ import { Grid as Grid13, Stack as Stack10, ToggleButton as ToggleButton3 } from "@elementor/ui";
932
1089
  import { DetachIcon, LinkIcon, SideBottomIcon, SideLeftIcon, SideRightIcon, SideTopIcon } from "@elementor/icons";
933
- import { __ as __15 } from "@wordpress/i18n";
934
1090
  var LinkedDimensionsControl = ({ label }) => {
935
1091
  const { value, setValue } = useControl();
936
- const { top, right, bottom, left, isLinked = false } = value?.value || {};
1092
+ const { top, right, bottom, left, isLinked = true } = value?.value || {};
937
1093
  const setLinkedValue = (position, newValue) => {
938
1094
  const updatedValue = {
939
1095
  isLinked,
@@ -962,57 +1118,57 @@ var LinkedDimensionsControl = ({ label }) => {
962
1118
  });
963
1119
  };
964
1120
  const LinkedIcon = isLinked ? LinkIcon : DetachIcon;
965
- return /* @__PURE__ */ React33.createElement(React33.Fragment, null, /* @__PURE__ */ React33.createElement(Stack8, { direction: "row", gap: 2 }, /* @__PURE__ */ React33.createElement(ControlLabel, null, label), /* @__PURE__ */ React33.createElement(
1121
+ return /* @__PURE__ */ React38.createElement(React38.Fragment, null, /* @__PURE__ */ React38.createElement(Stack10, { direction: "row", gap: 2 }, /* @__PURE__ */ React38.createElement(ControlLabel, null, label), /* @__PURE__ */ React38.createElement(
966
1122
  ToggleButton3,
967
1123
  {
968
- "aria-label": __15("Link Inputs", "elementor"),
1124
+ "aria-label": __17("Link Inputs", "elementor"),
969
1125
  size: "tiny",
970
1126
  value: "check",
971
1127
  selected: isLinked,
972
1128
  sx: { marginLeft: "auto" },
973
1129
  onChange: toggleLinked
974
1130
  },
975
- /* @__PURE__ */ React33.createElement(LinkedIcon, { fontSize: "tiny" })
976
- )), /* @__PURE__ */ React33.createElement(Stack8, { direction: "row", gap: 2 }, /* @__PURE__ */ React33.createElement(ControlContainer, { direction: "column" }, /* @__PURE__ */ React33.createElement(ControlLabel, null, __15("Top", "elementor")), /* @__PURE__ */ React33.createElement(
1131
+ /* @__PURE__ */ React38.createElement(LinkedIcon, { fontSize: "tiny" })
1132
+ )), /* @__PURE__ */ React38.createElement(Stack10, { direction: "row", gap: 2 }, /* @__PURE__ */ React38.createElement(Grid13, { container: true, spacing: 1, alignItems: "center" }, /* @__PURE__ */ React38.createElement(Grid13, { item: true, xs: 12 }, /* @__PURE__ */ React38.createElement(ControlLabel, null, __17("Top", "elementor"))), /* @__PURE__ */ React38.createElement(Grid13, { item: true, xs: 12 }, /* @__PURE__ */ React38.createElement(
977
1133
  Control4,
978
1134
  {
979
1135
  bind: "top",
980
1136
  value: top,
981
1137
  setValue: setLinkedValue,
982
- startIcon: /* @__PURE__ */ React33.createElement(SideTopIcon, { fontSize: "tiny" })
1138
+ startIcon: /* @__PURE__ */ React38.createElement(SideTopIcon, { fontSize: "tiny" })
983
1139
  }
984
- )), /* @__PURE__ */ React33.createElement(ControlContainer, { direction: "column" }, /* @__PURE__ */ React33.createElement(ControlLabel, null, __15("Right", "elementor")), /* @__PURE__ */ React33.createElement(
1140
+ ))), /* @__PURE__ */ React38.createElement(Grid13, { container: true, spacing: 1, alignItems: "center" }, /* @__PURE__ */ React38.createElement(Grid13, { item: true, xs: 12 }, /* @__PURE__ */ React38.createElement(ControlLabel, null, __17("Right", "elementor"))), /* @__PURE__ */ React38.createElement(Grid13, { item: true, xs: 12 }, /* @__PURE__ */ React38.createElement(
985
1141
  Control4,
986
1142
  {
987
1143
  bind: "right",
988
1144
  value: right,
989
1145
  setValue: setLinkedValue,
990
- startIcon: /* @__PURE__ */ React33.createElement(SideRightIcon, { fontSize: "tiny" })
1146
+ startIcon: /* @__PURE__ */ React38.createElement(SideRightIcon, { fontSize: "tiny" })
991
1147
  }
992
- ))), /* @__PURE__ */ React33.createElement(Stack8, { direction: "row", gap: 2 }, /* @__PURE__ */ React33.createElement(ControlContainer, { direction: "column" }, /* @__PURE__ */ React33.createElement(ControlLabel, null, __15("Bottom", "elementor")), /* @__PURE__ */ React33.createElement(
1148
+ )))), /* @__PURE__ */ React38.createElement(Stack10, { direction: "row", gap: 2 }, /* @__PURE__ */ React38.createElement(Grid13, { container: true, spacing: 1, alignItems: "center" }, /* @__PURE__ */ React38.createElement(Grid13, { item: true, xs: 12 }, /* @__PURE__ */ React38.createElement(ControlLabel, null, __17("Bottom", "elementor"))), /* @__PURE__ */ React38.createElement(Grid13, { item: true, xs: 12 }, /* @__PURE__ */ React38.createElement(
993
1149
  Control4,
994
1150
  {
995
1151
  bind: "bottom",
996
1152
  value: bottom,
997
1153
  setValue: setLinkedValue,
998
- startIcon: /* @__PURE__ */ React33.createElement(SideBottomIcon, { fontSize: "tiny" })
1154
+ startIcon: /* @__PURE__ */ React38.createElement(SideBottomIcon, { fontSize: "tiny" })
999
1155
  }
1000
- )), /* @__PURE__ */ React33.createElement(ControlContainer, { direction: "column" }, /* @__PURE__ */ React33.createElement(ControlLabel, null, __15("Left", "elementor")), /* @__PURE__ */ React33.createElement(
1156
+ ))), /* @__PURE__ */ React38.createElement(Grid13, { container: true, spacing: 1, alignItems: "center" }, /* @__PURE__ */ React38.createElement(Grid13, { item: true, xs: 12 }, /* @__PURE__ */ React38.createElement(ControlLabel, null, __17("Left", "elementor"))), /* @__PURE__ */ React38.createElement(Grid13, { item: true, xs: 12 }, /* @__PURE__ */ React38.createElement(
1001
1157
  Control4,
1002
1158
  {
1003
1159
  bind: "left",
1004
1160
  value: left,
1005
1161
  setValue: setLinkedValue,
1006
- startIcon: /* @__PURE__ */ React33.createElement(SideLeftIcon, { fontSize: "tiny" })
1162
+ startIcon: /* @__PURE__ */ React38.createElement(SideLeftIcon, { fontSize: "tiny" })
1007
1163
  }
1008
- ))));
1164
+ )))));
1009
1165
  };
1010
1166
  var Control4 = ({
1011
1167
  bind,
1012
1168
  startIcon,
1013
1169
  value,
1014
1170
  setValue
1015
- }) => /* @__PURE__ */ React33.createElement(
1171
+ }) => /* @__PURE__ */ React38.createElement(
1016
1172
  ControlContext.Provider,
1017
1173
  {
1018
1174
  value: {
@@ -1021,12 +1177,324 @@ var Control4 = ({
1021
1177
  value
1022
1178
  }
1023
1179
  },
1024
- /* @__PURE__ */ React33.createElement(SizeControl, { startIcon })
1180
+ /* @__PURE__ */ React38.createElement(SizeControl, { startIcon })
1025
1181
  );
1026
1182
 
1027
1183
  // src/components/style-sections/spacing-section/spacing-section.tsx
1028
1184
  var SpacingSection = () => {
1029
- return /* @__PURE__ */ React34.createElement(AccordionSection, { title: __16("Spacing", "elementor") }, /* @__PURE__ */ React34.createElement(Stack9, { gap: 1.5 }, /* @__PURE__ */ React34.createElement(StyleControl, { bind: "padding" }, /* @__PURE__ */ React34.createElement(LinkedDimensionsControl, { label: __16("Padding", "elementor") })), /* @__PURE__ */ React34.createElement(Divider2, null), /* @__PURE__ */ React34.createElement(StyleControl, { bind: "margin" }, /* @__PURE__ */ React34.createElement(LinkedDimensionsControl, { label: __16("Margin", "elementor") }))));
1185
+ return /* @__PURE__ */ React39.createElement(AccordionSection, { title: __18("Spacing", "elementor") }, /* @__PURE__ */ React39.createElement(Stack11, { gap: 1.5 }, /* @__PURE__ */ React39.createElement(StyleControl, { bind: "padding" }, /* @__PURE__ */ React39.createElement(LinkedDimensionsControl, { label: __18("Padding", "elementor") })), /* @__PURE__ */ React39.createElement(Divider2, null), /* @__PURE__ */ React39.createElement(StyleControl, { bind: "margin" }, /* @__PURE__ */ React39.createElement(LinkedDimensionsControl, { label: __18("Margin", "elementor") }))));
1186
+ };
1187
+
1188
+ // src/components/style-sections/effects-section/effects-section.tsx
1189
+ import * as React42 from "react";
1190
+ import { __ as __21 } from "@wordpress/i18n";
1191
+ import { Stack as Stack14 } from "@elementor/ui";
1192
+
1193
+ // src/components/style-sections/effects-section/box-shadow-repeater.tsx
1194
+ import * as React41 from "react";
1195
+ import { __ as __20 } from "@wordpress/i18n";
1196
+ import { Grid as Grid14, Stack as Stack13, UnstableColorIndicator } from "@elementor/ui";
1197
+
1198
+ // src/controls/components/repeater.tsx
1199
+ import * as React40 from "react";
1200
+ import { useId as useId4, useRef, useState as useState3 } from "react";
1201
+ import { __ as __19 } from "@wordpress/i18n";
1202
+ import { PlusIcon, XIcon as XIcon2, CopyIcon, EyeIcon, EyeOffIcon } from "@elementor/icons";
1203
+ import {
1204
+ Box as Box2,
1205
+ Stack as Stack12,
1206
+ Popover as Popover2,
1207
+ IconButton as IconButton2,
1208
+ bindTrigger as bindTrigger2,
1209
+ bindPopover as bindPopover2,
1210
+ usePopupState as usePopupState3,
1211
+ UnstableTag,
1212
+ Typography as Typography3
1213
+ } from "@elementor/ui";
1214
+ var SIZE2 = "tiny";
1215
+ var Repeater = ({
1216
+ label,
1217
+ itemSettings,
1218
+ values: repeaterValues = [],
1219
+ setValues: setRepeaterValues
1220
+ }) => {
1221
+ const addRepeaterItem = () => {
1222
+ const newItem = structuredClone(itemSettings.initialValues);
1223
+ setRepeaterValues([...repeaterValues, newItem]);
1224
+ };
1225
+ const duplicateRepeaterItem = (index) => {
1226
+ setRepeaterValues([
1227
+ ...repeaterValues.slice(0, index),
1228
+ structuredClone(repeaterValues[index]),
1229
+ ...repeaterValues.slice(index)
1230
+ ]);
1231
+ };
1232
+ const removeRepeaterItem = (index) => {
1233
+ setRepeaterValues(repeaterValues.filter((_, i) => i !== index));
1234
+ };
1235
+ const toggleDisableRepeaterItem = (index) => {
1236
+ setRepeaterValues(
1237
+ repeaterValues.map((value, i) => {
1238
+ if (i === index) {
1239
+ const { disabled, ...rest } = value;
1240
+ return { ...rest, ...disabled ? {} : { disabled: true } };
1241
+ }
1242
+ return value;
1243
+ })
1244
+ );
1245
+ };
1246
+ return /* @__PURE__ */ React40.createElement(Stack12, null, /* @__PURE__ */ React40.createElement(Stack12, { direction: "row", justifyContent: "space-between", sx: { py: 0.5 } }, /* @__PURE__ */ React40.createElement(Typography3, { component: "label", variant: "caption", color: "text.secondary" }, label), /* @__PURE__ */ React40.createElement(IconButton2, { size: SIZE2, onClick: addRepeaterItem, "aria-label": __19("Add item", "elementor") }, /* @__PURE__ */ React40.createElement(PlusIcon, { fontSize: SIZE2 }))), /* @__PURE__ */ React40.createElement(Stack12, { gap: 1 }, repeaterValues.map((value, index) => /* @__PURE__ */ React40.createElement(
1247
+ RepeaterItem,
1248
+ {
1249
+ key: index,
1250
+ disabled: value.disabled,
1251
+ label: /* @__PURE__ */ React40.createElement(itemSettings.Label, { value }),
1252
+ startIcon: /* @__PURE__ */ React40.createElement(itemSettings.Icon, { value }),
1253
+ removeItem: () => removeRepeaterItem(index),
1254
+ duplicateItem: () => duplicateRepeaterItem(index),
1255
+ toggleDisableItem: () => toggleDisableRepeaterItem(index)
1256
+ },
1257
+ (props) => /* @__PURE__ */ React40.createElement(
1258
+ itemSettings.Content,
1259
+ {
1260
+ ...props,
1261
+ value,
1262
+ setValue: (newValue) => setRepeaterValues(
1263
+ repeaterValues.map((item, i) => i === index ? newValue : item)
1264
+ )
1265
+ }
1266
+ )
1267
+ ))));
1268
+ };
1269
+ var RepeaterItem = ({
1270
+ label,
1271
+ disabled,
1272
+ startIcon,
1273
+ children,
1274
+ removeItem,
1275
+ duplicateItem,
1276
+ toggleDisableItem
1277
+ }) => {
1278
+ const popupId = useId4();
1279
+ const tagRef = useRef(null);
1280
+ const [anchorEl, setAnchorEl] = useState3(null);
1281
+ const popoverState = usePopupState3({ popupId, variant: "popover" });
1282
+ const popoverProps = bindPopover2(popoverState);
1283
+ return /* @__PURE__ */ React40.createElement(React40.Fragment, null, /* @__PURE__ */ React40.createElement(
1284
+ UnstableTag,
1285
+ {
1286
+ ref: tagRef,
1287
+ label,
1288
+ showActionsOnHover: true,
1289
+ variant: "outlined",
1290
+ "aria-label": __19("Open item", "elementor"),
1291
+ ...bindTrigger2(popoverState),
1292
+ startIcon,
1293
+ actions: /* @__PURE__ */ React40.createElement(React40.Fragment, null, /* @__PURE__ */ React40.createElement(
1294
+ IconButton2,
1295
+ {
1296
+ size: SIZE2,
1297
+ onClick: duplicateItem,
1298
+ "aria-label": __19("Duplicate item", "elementor")
1299
+ },
1300
+ /* @__PURE__ */ React40.createElement(CopyIcon, { fontSize: SIZE2 })
1301
+ ), /* @__PURE__ */ React40.createElement(
1302
+ IconButton2,
1303
+ {
1304
+ size: SIZE2,
1305
+ onClick: toggleDisableItem,
1306
+ "aria-label": disabled ? __19("Enable item", "elementor") : __19("Disable item", "elementor")
1307
+ },
1308
+ disabled ? /* @__PURE__ */ React40.createElement(EyeOffIcon, { fontSize: SIZE2 }) : /* @__PURE__ */ React40.createElement(EyeIcon, { fontSize: SIZE2 })
1309
+ ), /* @__PURE__ */ React40.createElement(
1310
+ IconButton2,
1311
+ {
1312
+ size: SIZE2,
1313
+ onClick: removeItem,
1314
+ "aria-label": __19("Remove item", "elementor")
1315
+ },
1316
+ /* @__PURE__ */ React40.createElement(XIcon2, { fontSize: SIZE2 })
1317
+ ))
1318
+ }
1319
+ ), /* @__PURE__ */ React40.createElement(
1320
+ Popover2,
1321
+ {
1322
+ disablePortal: true,
1323
+ slotProps: {
1324
+ paper: { ref: setAnchorEl, sx: { width: tagRef.current?.getBoundingClientRect().width } }
1325
+ },
1326
+ anchorOrigin: { vertical: "bottom", horizontal: "left" },
1327
+ ...popoverProps
1328
+ },
1329
+ /* @__PURE__ */ React40.createElement(Box2, { p: 2 }, children({ anchorEl }))
1330
+ ));
1331
+ };
1332
+
1333
+ // src/components/style-sections/effects-section/box-shadow-repeater.tsx
1334
+ var BoxShadowRepeater = () => {
1335
+ const { value, setValue } = useControl();
1336
+ const boxShadowValues = value?.value;
1337
+ const setBoxShadow = (newValue) => {
1338
+ setValue({
1339
+ $$type: "box-shadow",
1340
+ value: newValue
1341
+ });
1342
+ };
1343
+ return /* @__PURE__ */ React41.createElement(
1344
+ Repeater,
1345
+ {
1346
+ values: boxShadowValues,
1347
+ setValues: setBoxShadow,
1348
+ label: __20("Box shadow", "elementor"),
1349
+ itemSettings: {
1350
+ Icon: ItemIcon,
1351
+ Label: ItemLabel,
1352
+ Content: ItemContent,
1353
+ initialValues: initialShadow
1354
+ }
1355
+ }
1356
+ );
1357
+ };
1358
+ var ItemIcon = ({ value }) => /* @__PURE__ */ React41.createElement(UnstableColorIndicator, { size: "inherit", component: "span", value: value.value.color.value });
1359
+ var ItemContent = ({
1360
+ anchorEl,
1361
+ value,
1362
+ setValue
1363
+ }) => {
1364
+ const setShadow = (newValue) => {
1365
+ setValue({
1366
+ $$type: "shadow",
1367
+ value: newValue
1368
+ });
1369
+ };
1370
+ return /* @__PURE__ */ React41.createElement(Stack13, { gap: 1.5 }, /* @__PURE__ */ React41.createElement(Grid14, { container: true, spacing: 1 }, /* @__PURE__ */ React41.createElement(
1371
+ Control5,
1372
+ {
1373
+ bind: "color",
1374
+ value: value.value.color,
1375
+ label: __20("Color", "elementor"),
1376
+ setValue: (v) => setShadow({ ...value.value, color: v })
1377
+ },
1378
+ /* @__PURE__ */ React41.createElement(
1379
+ ColorControl,
1380
+ {
1381
+ anchorEl,
1382
+ anchorOrigin: {
1383
+ vertical: "top",
1384
+ horizontal: "right"
1385
+ },
1386
+ transformOrigin: {
1387
+ vertical: "top",
1388
+ horizontal: -10
1389
+ }
1390
+ }
1391
+ )
1392
+ ), /* @__PURE__ */ React41.createElement(
1393
+ Control5,
1394
+ {
1395
+ bind: "position",
1396
+ value: value.value.position,
1397
+ label: __20("Position", "elementor"),
1398
+ setValue: (v) => setShadow({ ...value.value, position: v })
1399
+ },
1400
+ /* @__PURE__ */ React41.createElement(
1401
+ SelectControl,
1402
+ {
1403
+ options: [
1404
+ { label: "Inset", value: "inset" },
1405
+ { label: "Outset", value: "outset" }
1406
+ ]
1407
+ }
1408
+ )
1409
+ )), /* @__PURE__ */ React41.createElement(Grid14, { container: true, spacing: 1 }, /* @__PURE__ */ React41.createElement(
1410
+ Control5,
1411
+ {
1412
+ bind: "hOffset",
1413
+ label: __20("Horizontal", "elementor"),
1414
+ value: value.value.hOffset,
1415
+ setValue: (v) => setShadow({ ...value.value, hOffset: v })
1416
+ },
1417
+ /* @__PURE__ */ React41.createElement(SizeControl, null)
1418
+ ), /* @__PURE__ */ React41.createElement(
1419
+ Control5,
1420
+ {
1421
+ label: __20("Vertical", "elementor"),
1422
+ bind: "vOffset",
1423
+ value: value.value.vOffset,
1424
+ setValue: (v) => setShadow({ ...value.value, vOffset: v })
1425
+ },
1426
+ /* @__PURE__ */ React41.createElement(SizeControl, null)
1427
+ )), /* @__PURE__ */ React41.createElement(Grid14, { container: true, spacing: 1 }, /* @__PURE__ */ React41.createElement(
1428
+ Control5,
1429
+ {
1430
+ bind: "blur",
1431
+ value: value.value.blur,
1432
+ label: __20("Blur", "elementor"),
1433
+ setValue: (v) => setShadow({ ...value.value, blur: v })
1434
+ },
1435
+ /* @__PURE__ */ React41.createElement(SizeControl, null)
1436
+ ), /* @__PURE__ */ React41.createElement(
1437
+ Control5,
1438
+ {
1439
+ bind: "spread",
1440
+ label: __20("Spread", "elementor"),
1441
+ value: value.value.spread,
1442
+ setValue: (v) => setShadow({ ...value.value, spread: v })
1443
+ },
1444
+ /* @__PURE__ */ React41.createElement(SizeControl, null)
1445
+ )));
1446
+ };
1447
+ var Control5 = ({
1448
+ value,
1449
+ setValue,
1450
+ label,
1451
+ bind,
1452
+ children
1453
+ }) => /* @__PURE__ */ React41.createElement(ControlContext.Provider, { value: { value, setValue, bind } }, /* @__PURE__ */ React41.createElement(Grid14, { item: true, xs: 6 }, /* @__PURE__ */ React41.createElement(Grid14, { container: true, spacing: 1, alignItems: "center" }, /* @__PURE__ */ React41.createElement(Grid14, { item: true, xs: 12 }, /* @__PURE__ */ React41.createElement(ControlLabel, null, label)), /* @__PURE__ */ React41.createElement(Grid14, { item: true, xs: 12 }, children))));
1454
+ var ItemLabel = ({ value }) => {
1455
+ const { position, hOffset, vOffset, blur, spread } = value.value;
1456
+ const { size: hOffsetSize, unit: hOffsetUnit } = hOffset.value;
1457
+ const { size: vOffsetSize, unit: vOffsetUnit } = vOffset.value;
1458
+ const { size: blurSize, unit: blurUnit } = blur.value;
1459
+ const { size: spreadSize, unit: spreadUnit } = spread.value;
1460
+ const sizes = [
1461
+ hOffsetSize + hOffsetUnit,
1462
+ vOffsetSize + vOffsetUnit,
1463
+ blurSize + blurUnit,
1464
+ spreadSize + spreadUnit
1465
+ ].join(" ");
1466
+ return /* @__PURE__ */ React41.createElement("span", { style: { textTransform: "capitalize" } }, position, ": ", sizes);
1467
+ };
1468
+ var initialShadow = {
1469
+ $$type: "shadow",
1470
+ value: {
1471
+ hOffset: {
1472
+ $$type: "size",
1473
+ value: { unit: "px", size: 0 }
1474
+ },
1475
+ vOffset: {
1476
+ $$type: "size",
1477
+ value: { unit: "px", size: 0 }
1478
+ },
1479
+ blur: {
1480
+ $$type: "size",
1481
+ value: { unit: "px", size: 0 }
1482
+ },
1483
+ spread: {
1484
+ $$type: "size",
1485
+ value: { unit: "px", size: 0 }
1486
+ },
1487
+ color: {
1488
+ $$type: "color",
1489
+ value: "rgba(0, 0, 0, 0)"
1490
+ },
1491
+ position: "inset"
1492
+ }
1493
+ };
1494
+
1495
+ // src/components/style-sections/effects-section/effects-section.tsx
1496
+ var EffectsSection = () => {
1497
+ return /* @__PURE__ */ React42.createElement(AccordionSection, { title: __21("Effects", "elementor") }, /* @__PURE__ */ React42.createElement(Stack14, { gap: 1.5 }, /* @__PURE__ */ React42.createElement(StyleControl, { bind: "box-shadow" }, /* @__PURE__ */ React42.createElement(BoxShadowRepeater, null))));
1030
1498
  };
1031
1499
 
1032
1500
  // src/components/style-tab.tsx
@@ -1034,11 +1502,13 @@ var CLASSES_PROP_KEY = "classes";
1034
1502
  var StyleTab = () => {
1035
1503
  const styleDefinition = useStyleDefinition();
1036
1504
  const classesProp = useClassesProp();
1037
- return /* @__PURE__ */ React35.createElement(StyleContext, { selectedStyleDef: styleDefinition, selectedClassesProp: classesProp }, /* @__PURE__ */ React35.createElement(Stack10, null, /* @__PURE__ */ React35.createElement(SizeSection, null), /* @__PURE__ */ React35.createElement(PositionSection, null), /* @__PURE__ */ React35.createElement(TypographySection, null), /* @__PURE__ */ React35.createElement(SpacingSection, null)));
1505
+ return /* @__PURE__ */ React43.createElement(StyleContext, { selectedStyleDef: styleDefinition, selectedClassesProp: classesProp }, /* @__PURE__ */ React43.createElement(Stack15, null, /* @__PURE__ */ React43.createElement(SizeSection, null), /* @__PURE__ */ React43.createElement(PositionSection, null), /* @__PURE__ */ React43.createElement(TypographySection, null), /* @__PURE__ */ React43.createElement(SpacingSection, null), /* @__PURE__ */ React43.createElement(EffectsSection, null)));
1038
1506
  };
1039
1507
  function useClassesProp() {
1040
1508
  const { elementType } = useElementContext();
1041
- const prop = Object.entries(elementType.propsSchema).find(([, { type }]) => type.key === CLASSES_PROP_KEY);
1509
+ const prop = Object.entries(elementType.propsSchema).find(
1510
+ ([, propType]) => propType.kind === "array" && propType.key === CLASSES_PROP_KEY
1511
+ );
1042
1512
  if (!prop) {
1043
1513
  throw new Error("Element does not have a classes prop");
1044
1514
  }
@@ -1053,7 +1523,7 @@ function useStyleDefinition() {
1053
1523
  // src/components/editing-panel-tabs.tsx
1054
1524
  var EditingPanelTabs = () => {
1055
1525
  const { getTabProps, getTabPanelProps, getTabsProps } = useTabs("settings");
1056
- return /* @__PURE__ */ React36.createElement(Stack11, { direction: "column", sx: { width: "100%" } }, /* @__PURE__ */ React36.createElement(Tabs, { variant: "fullWidth", indicatorColor: "secondary", textColor: "inherit", ...getTabsProps() }, /* @__PURE__ */ React36.createElement(Tab, { label: __17("General", "elementor"), ...getTabProps("settings") }), /* @__PURE__ */ React36.createElement(Tab, { label: __17("Style", "elementor"), ...getTabProps("style") })), /* @__PURE__ */ React36.createElement(TabPanel, { ...getTabPanelProps("settings"), disablePadding: true }, /* @__PURE__ */ React36.createElement(SettingsTab, null)), /* @__PURE__ */ React36.createElement(TabPanel, { ...getTabPanelProps("style"), disablePadding: true }, /* @__PURE__ */ React36.createElement(StyleTab, null)));
1526
+ return /* @__PURE__ */ React44.createElement(Stack16, { direction: "column", sx: { width: "100%" } }, /* @__PURE__ */ React44.createElement(Tabs, { variant: "fullWidth", indicatorColor: "secondary", textColor: "inherit", ...getTabsProps() }, /* @__PURE__ */ React44.createElement(Tab, { label: __22("General", "elementor"), ...getTabProps("settings") }), /* @__PURE__ */ React44.createElement(Tab, { label: __22("Style", "elementor"), ...getTabProps("style") })), /* @__PURE__ */ React44.createElement(TabPanel, { ...getTabPanelProps("settings"), disablePadding: true }, /* @__PURE__ */ React44.createElement(SettingsTab, null)), /* @__PURE__ */ React44.createElement(TabPanel, { ...getTabPanelProps("style"), disablePadding: true }, /* @__PURE__ */ React44.createElement(StyleTab, null)));
1057
1527
  };
1058
1528
 
1059
1529
  // src/components/editing-panel.tsx
@@ -1064,8 +1534,8 @@ var EditingPanel = () => {
1064
1534
  if (elements.length !== 1 || !elementType) {
1065
1535
  return null;
1066
1536
  }
1067
- const panelTitle = __18("Edit %s", "elementor").replace("%s", elementType.title);
1068
- return /* @__PURE__ */ React37.createElement(Panel, null, /* @__PURE__ */ React37.createElement(PanelHeader, null, /* @__PURE__ */ React37.createElement(PanelHeaderTitle, null, panelTitle)), /* @__PURE__ */ React37.createElement(PanelBody, null, /* @__PURE__ */ React37.createElement(ElementContext, { element: selectedElement, elementType }, /* @__PURE__ */ React37.createElement(EditingPanelTabs, null))));
1537
+ const panelTitle = __23("Edit %s", "elementor").replace("%s", elementType.title);
1538
+ return /* @__PURE__ */ React45.createElement(Panel, null, /* @__PURE__ */ React45.createElement(PanelHeader, null, /* @__PURE__ */ React45.createElement(PanelHeaderTitle, null, panelTitle)), /* @__PURE__ */ React45.createElement(PanelBody, null, /* @__PURE__ */ React45.createElement(ElementContext, { element: selectedElement, elementType }, /* @__PURE__ */ React45.createElement(EditingPanelTabs, null))));
1069
1539
  };
1070
1540
 
1071
1541
  // src/panel.ts
@@ -1112,11 +1582,11 @@ import { __registerPanel as registerPanel } from "@elementor/editor-panels";
1112
1582
  import { __privateBlockDataCommand as blockDataCommand } from "@elementor/editor-v1-adapters";
1113
1583
 
1114
1584
  // src/dynamics/components/dynamic-selection-control.tsx
1115
- import * as React40 from "react";
1116
- import { useId as useId3 } from "react";
1585
+ import * as React48 from "react";
1586
+ import { useId as useId5 } from "react";
1117
1587
 
1118
1588
  // src/dynamics/dynamic-control.tsx
1119
- import * as React38 from "react";
1589
+ import * as React46 from "react";
1120
1590
 
1121
1591
  // src/dynamics/hooks/use-prop-dynamic-tags.ts
1122
1592
  import { useMemo } from "react";
@@ -1150,18 +1620,26 @@ var isTransformable = (value) => {
1150
1620
  };
1151
1621
 
1152
1622
  // src/dynamics/utils.ts
1153
- var isDynamicType = (prop) => prop.key === "dynamic";
1623
+ var DYNAMIC_PROP_TYPE_KEY = "dynamic";
1624
+ var isDynamicPropType = (prop) => prop.key === DYNAMIC_PROP_TYPE_KEY;
1625
+ var getDynamicPropType = (propType) => {
1626
+ const dynamicPropType = propType.kind === "union" && propType.prop_types[DYNAMIC_PROP_TYPE_KEY];
1627
+ return dynamicPropType && isDynamicPropType(dynamicPropType) ? dynamicPropType : null;
1628
+ };
1154
1629
  var isDynamicPropValue = (prop) => {
1155
- return isTransformable(prop) && prop.$$type === "dynamic";
1630
+ return isTransformable(prop) && prop.$$type === DYNAMIC_PROP_TYPE_KEY;
1631
+ };
1632
+ var supportsDynamic = (propType) => {
1633
+ return !!getDynamicPropType(propType);
1156
1634
  };
1157
1635
 
1158
1636
  // src/dynamics/hooks/use-prop-dynamic-tags.ts
1159
1637
  var usePropDynamicTags = (propName) => {
1160
1638
  let categories = [];
1161
1639
  const { elementType } = useElementContext();
1162
- const propSchema = elementType.propsSchema?.[propName];
1163
- if (propSchema) {
1164
- const propDynamicType = propSchema.additional_types.find(isDynamicType);
1640
+ const propType = elementType.propsSchema?.[propName];
1641
+ if (propType) {
1642
+ const propDynamicType = getDynamicPropType(propType);
1165
1643
  categories = propDynamicType?.settings.categories || [];
1166
1644
  }
1167
1645
  return useMemo(() => getDynamicTagsByCategories(categories), [categories.join()]);
@@ -1192,7 +1670,7 @@ var DynamicControl = ({ bind, children }) => {
1192
1670
  if (!dynamicTag) {
1193
1671
  throw new Error(`Dynamic tag ${name} not found`);
1194
1672
  }
1195
- const defaultValue = dynamicTag.props_schema[bind]?.type.default;
1673
+ const defaultValue = dynamicTag.props_schema[bind]?.default;
1196
1674
  const dynamicValue = settings?.[bind] ?? defaultValue;
1197
1675
  const setDynamicValue = (newValue) => {
1198
1676
  setValue({
@@ -1206,29 +1684,29 @@ var DynamicControl = ({ bind, children }) => {
1206
1684
  }
1207
1685
  });
1208
1686
  };
1209
- return /* @__PURE__ */ React38.createElement(ControlContext.Provider, { value: { setValue: setDynamicValue, value: dynamicValue, bind } }, children);
1687
+ return /* @__PURE__ */ React46.createElement(ControlContext.Provider, { value: { setValue: setDynamicValue, value: dynamicValue, bind } }, children);
1210
1688
  };
1211
1689
 
1212
1690
  // src/dynamics/components/dynamic-selection-control.tsx
1213
- import { DatabaseIcon, SettingsIcon, XIcon } from "@elementor/icons";
1691
+ import { DatabaseIcon, SettingsIcon, XIcon as XIcon3 } from "@elementor/icons";
1214
1692
 
1215
1693
  // src/dynamics/components/dynamic-selection.tsx
1216
- import * as React39 from "react";
1217
- import { useState as useState3, Fragment as Fragment2 } from "react";
1694
+ import * as React47 from "react";
1695
+ import { useState as useState4, Fragment as Fragment4 } from "react";
1218
1696
  import { SearchIcon, PhotoIcon } from "@elementor/icons";
1219
1697
  import {
1220
- Box,
1698
+ Box as Box3,
1221
1699
  Divider as Divider3,
1222
1700
  InputAdornment as InputAdornment3,
1223
1701
  Link,
1224
1702
  ListSubheader,
1225
1703
  MenuItem as MenuItem3,
1226
1704
  MenuList,
1227
- Stack as Stack12,
1705
+ Stack as Stack17,
1228
1706
  TextField as TextField5,
1229
- Typography as Typography2
1707
+ Typography as Typography4
1230
1708
  } from "@elementor/ui";
1231
- import { __ as __19 } from "@wordpress/i18n";
1709
+ import { __ as __24 } from "@wordpress/i18n";
1232
1710
 
1233
1711
  // src/dynamics/hooks/use-prop-value-history.ts
1234
1712
  var PROPS_VALUES_HISTORY_KEY = "elementor/dynamic/non-dynamic-values-history";
@@ -1250,14 +1728,14 @@ var setValues = (values) => {
1250
1728
  };
1251
1729
 
1252
1730
  // src/dynamics/components/dynamic-selection.tsx
1253
- var SIZE = "tiny";
1731
+ var SIZE3 = "tiny";
1254
1732
  var DynamicSelection = ({ onSelect }) => {
1255
- const [searchValue, setSearchValue] = useState3("");
1733
+ const [searchValue, setSearchValue] = useState4("");
1256
1734
  const { groups: dynamicGroups } = getAtomicDynamicTags() || {};
1257
1735
  const { bind, value: currentValue, setValue } = useControl();
1258
1736
  const [, updatePropValueHistory] = usePropValueHistory(bind);
1259
1737
  const isCurrentValueDynamic = isDynamicPropValue(currentValue);
1260
- const options3 = useFilteredOptions(bind, searchValue);
1738
+ const options4 = useFilteredOptions(bind, searchValue);
1261
1739
  const handleSearch = (event) => {
1262
1740
  setSearchValue(event.target.value);
1263
1741
  };
@@ -1265,24 +1743,24 @@ var DynamicSelection = ({ onSelect }) => {
1265
1743
  if (!isCurrentValueDynamic) {
1266
1744
  updatePropValueHistory(currentValue);
1267
1745
  }
1268
- setValue({ $$type: "dynamic", value: { name: value } });
1746
+ setValue({ $$type: "dynamic", value: { name: value, settings: {} } });
1269
1747
  onSelect?.();
1270
1748
  };
1271
- return /* @__PURE__ */ React39.createElement(Stack12, null, /* @__PURE__ */ React39.createElement(Box, { px: 1.5, pb: 1 }, /* @__PURE__ */ React39.createElement(
1749
+ return /* @__PURE__ */ React47.createElement(Stack17, null, /* @__PURE__ */ React47.createElement(Box3, { px: 1.5, pb: 1 }, /* @__PURE__ */ React47.createElement(
1272
1750
  TextField5,
1273
1751
  {
1274
1752
  fullWidth: true,
1275
- size: SIZE,
1753
+ size: SIZE3,
1276
1754
  value: searchValue,
1277
1755
  onChange: handleSearch,
1278
- placeholder: __19("Search dynamic tag", "elementor"),
1756
+ placeholder: __24("Search dynamic tag", "elementor"),
1279
1757
  InputProps: {
1280
- startAdornment: /* @__PURE__ */ React39.createElement(InputAdornment3, { position: "start" }, /* @__PURE__ */ React39.createElement(SearchIcon, { fontSize: SIZE }))
1758
+ startAdornment: /* @__PURE__ */ React47.createElement(InputAdornment3, { position: "start" }, /* @__PURE__ */ React47.createElement(SearchIcon, { fontSize: SIZE3 }))
1281
1759
  }
1282
1760
  }
1283
- )), /* @__PURE__ */ React39.createElement(Divider3, null), /* @__PURE__ */ React39.createElement(Box, { sx: { overflowY: "auto", height: 260, width: 220 } }, options3.length > 0 ? /* @__PURE__ */ React39.createElement(MenuList, { role: "listbox", tabIndex: 0 }, options3.map(([category, items], index) => /* @__PURE__ */ React39.createElement(Fragment2, { key: index }, /* @__PURE__ */ React39.createElement(ListSubheader, { sx: { typography: "caption", color: "text.tertiary" } }, dynamicGroups?.[category]?.title || category), items.map(({ value, label: tagLabel }) => {
1761
+ )), /* @__PURE__ */ React47.createElement(Divider3, null), /* @__PURE__ */ React47.createElement(Box3, { sx: { overflowY: "auto", height: 260, width: 220 } }, options4.length > 0 ? /* @__PURE__ */ React47.createElement(MenuList, { role: "listbox", tabIndex: 0 }, options4.map(([category, items], index) => /* @__PURE__ */ React47.createElement(Fragment4, { key: index }, /* @__PURE__ */ React47.createElement(ListSubheader, { sx: { typography: "caption", color: "text.tertiary" } }, dynamicGroups?.[category]?.title || category), items.map(({ value, label: tagLabel }) => {
1284
1762
  const isSelected = isCurrentValueDynamic && value === currentValue?.value?.name;
1285
- return /* @__PURE__ */ React39.createElement(
1763
+ return /* @__PURE__ */ React47.createElement(
1286
1764
  MenuItem3,
1287
1765
  {
1288
1766
  key: value,
@@ -1293,7 +1771,7 @@ var DynamicSelection = ({ onSelect }) => {
1293
1771
  },
1294
1772
  tagLabel
1295
1773
  );
1296
- })))) : /* @__PURE__ */ React39.createElement(Stack12, { alignItems: "center", p: 2.5, gap: 1.5 }, /* @__PURE__ */ React39.createElement(PhotoIcon, { fontSize: "large" }), /* @__PURE__ */ React39.createElement(Typography2, { align: "center", variant: "caption", color: "text.secondary" }, __19("Sorry, nothing matched", "elementor"), /* @__PURE__ */ React39.createElement("br", null), "\u201C", searchValue, "\u201D."), /* @__PURE__ */ React39.createElement(Typography2, { align: "center", variant: "caption", color: "text.secondary" }, /* @__PURE__ */ React39.createElement(
1774
+ })))) : /* @__PURE__ */ React47.createElement(Stack17, { alignItems: "center", p: 2.5, gap: 1.5 }, /* @__PURE__ */ React47.createElement(PhotoIcon, { fontSize: "large" }), /* @__PURE__ */ React47.createElement(Typography4, { align: "center", variant: "caption", color: "text.secondary" }, __24("Sorry, nothing matched", "elementor"), /* @__PURE__ */ React47.createElement("br", null), "\u201C", searchValue, "\u201D."), /* @__PURE__ */ React47.createElement(Typography4, { align: "center", variant: "caption", color: "text.secondary" }, /* @__PURE__ */ React47.createElement(
1297
1775
  Link,
1298
1776
  {
1299
1777
  color: "secondary",
@@ -1301,12 +1779,12 @@ var DynamicSelection = ({ onSelect }) => {
1301
1779
  component: "button",
1302
1780
  onClick: () => setSearchValue("")
1303
1781
  },
1304
- __19("Clear the filters", "elementor")
1305
- ), "\xA0", __19("and try again.", "elementor")))));
1782
+ __24("Clear the filters", "elementor")
1783
+ ), "\xA0", __24("and try again.", "elementor")))));
1306
1784
  };
1307
1785
  var useFilteredOptions = (bind, searchValue) => {
1308
1786
  const dynamicTags = usePropDynamicTags(bind);
1309
- const options3 = dynamicTags.reduce((categories, { name, label, group }) => {
1787
+ const options4 = dynamicTags.reduce((categories, { name, label, group }) => {
1310
1788
  const isVisible = label.toLowerCase().includes(searchValue.trim().toLowerCase());
1311
1789
  if (!isVisible) {
1312
1790
  return categories;
@@ -1317,35 +1795,35 @@ var useFilteredOptions = (bind, searchValue) => {
1317
1795
  categories.get(group)?.push({ label, value: name });
1318
1796
  return categories;
1319
1797
  }, /* @__PURE__ */ new Map());
1320
- return [...options3];
1798
+ return [...options4];
1321
1799
  };
1322
1800
 
1323
1801
  // src/dynamics/components/dynamic-selection-control.tsx
1324
1802
  import {
1325
- bindPopover,
1326
- bindTrigger as bindTrigger2,
1327
- Box as Box2,
1328
- IconButton,
1803
+ bindPopover as bindPopover3,
1804
+ bindTrigger as bindTrigger3,
1805
+ Box as Box4,
1806
+ IconButton as IconButton3,
1329
1807
  Paper,
1330
- Popover,
1331
- Stack as Stack13,
1332
- Typography as Typography3,
1808
+ Popover as Popover3,
1809
+ Stack as Stack18,
1810
+ Typography as Typography5,
1333
1811
  UnstableTag as Tag,
1334
- usePopupState as usePopupState2,
1812
+ usePopupState as usePopupState4,
1335
1813
  Tabs as Tabs2,
1336
1814
  Divider as Divider4,
1337
1815
  useTabs as useTabs2,
1338
1816
  Tab as Tab2,
1339
1817
  TabPanel as TabPanel2
1340
1818
  } from "@elementor/ui";
1341
- import { __ as __20 } from "@wordpress/i18n";
1342
- var SIZE2 = "tiny";
1819
+ import { __ as __25 } from "@wordpress/i18n";
1820
+ var SIZE4 = "tiny";
1343
1821
  var DynamicSelectionControl = () => {
1344
1822
  const { bind, value, setValue } = useControl();
1345
1823
  const [propValueFromHistory] = usePropValueHistory(bind);
1346
1824
  const { name: tagName = "" } = value?.value || {};
1347
- const selectionPopoverId = useId3();
1348
- const selectionPopoverState = usePopupState2({ variant: "popover", popupId: selectionPopoverId });
1825
+ const selectionPopoverId = useId5();
1826
+ const selectionPopoverState = usePopupState4({ variant: "popover", popupId: selectionPopoverId });
1349
1827
  const dynamicTag = useDynamicTag(bind, tagName);
1350
1828
  const removeDynamicTag = () => {
1351
1829
  setValue(propValueFromHistory ?? null);
@@ -1353,58 +1831,58 @@ var DynamicSelectionControl = () => {
1353
1831
  if (!dynamicTag) {
1354
1832
  throw new Error(`Dynamic tag ${tagName} not found`);
1355
1833
  }
1356
- return /* @__PURE__ */ React40.createElement(Box2, { sx: { width: "100%" } }, /* @__PURE__ */ React40.createElement(
1834
+ return /* @__PURE__ */ React48.createElement(Box4, null, /* @__PURE__ */ React48.createElement(
1357
1835
  Tag,
1358
1836
  {
1359
1837
  fullWidth: true,
1360
1838
  showActionsOnHover: true,
1361
1839
  label: dynamicTag.label,
1362
- startIcon: /* @__PURE__ */ React40.createElement(DatabaseIcon, { fontSize: SIZE2 }),
1363
- ...bindTrigger2(selectionPopoverState),
1364
- actions: /* @__PURE__ */ React40.createElement(React40.Fragment, null, /* @__PURE__ */ React40.createElement(DynamicSettingsPopover, { dynamicTag }), /* @__PURE__ */ React40.createElement(
1365
- IconButton,
1840
+ startIcon: /* @__PURE__ */ React48.createElement(DatabaseIcon, { fontSize: SIZE4 }),
1841
+ ...bindTrigger3(selectionPopoverState),
1842
+ actions: /* @__PURE__ */ React48.createElement(React48.Fragment, null, /* @__PURE__ */ React48.createElement(DynamicSettingsPopover, { dynamicTag }), /* @__PURE__ */ React48.createElement(
1843
+ IconButton3,
1366
1844
  {
1367
- size: SIZE2,
1845
+ size: SIZE4,
1368
1846
  onClick: removeDynamicTag,
1369
- "aria-label": __20("Remove dynamic value", "elementor")
1847
+ "aria-label": __25("Remove dynamic value", "elementor")
1370
1848
  },
1371
- /* @__PURE__ */ React40.createElement(XIcon, { fontSize: SIZE2 })
1849
+ /* @__PURE__ */ React48.createElement(XIcon3, { fontSize: SIZE4 })
1372
1850
  ))
1373
1851
  }
1374
- ), /* @__PURE__ */ React40.createElement(
1375
- Popover,
1852
+ ), /* @__PURE__ */ React48.createElement(
1853
+ Popover3,
1376
1854
  {
1377
1855
  disablePortal: true,
1378
1856
  disableScrollLock: true,
1379
1857
  anchorOrigin: { vertical: "bottom", horizontal: "left" },
1380
- ...bindPopover(selectionPopoverState)
1858
+ ...bindPopover3(selectionPopoverState)
1381
1859
  },
1382
- /* @__PURE__ */ React40.createElement(Stack13, null, /* @__PURE__ */ React40.createElement(Stack13, { direction: "row", alignItems: "center", pl: 1.5, pr: 0.5, py: 1.5 }, /* @__PURE__ */ React40.createElement(DatabaseIcon, { fontSize: SIZE2, sx: { mr: 0.5 } }), /* @__PURE__ */ React40.createElement(Typography3, { variant: "subtitle2" }, __20("Dynamic Tags", "elementor")), /* @__PURE__ */ React40.createElement(IconButton, { size: SIZE2, sx: { ml: "auto" }, onClick: selectionPopoverState.close }, /* @__PURE__ */ React40.createElement(XIcon, { fontSize: SIZE2 }))), /* @__PURE__ */ React40.createElement(DynamicSelection, { onSelect: selectionPopoverState.close }))
1860
+ /* @__PURE__ */ React48.createElement(Stack18, null, /* @__PURE__ */ React48.createElement(Stack18, { direction: "row", alignItems: "center", pl: 1.5, pr: 0.5, py: 1.5 }, /* @__PURE__ */ React48.createElement(DatabaseIcon, { fontSize: SIZE4, sx: { mr: 0.5 } }), /* @__PURE__ */ React48.createElement(Typography5, { variant: "subtitle2" }, __25("Dynamic Tags", "elementor")), /* @__PURE__ */ React48.createElement(IconButton3, { size: SIZE4, sx: { ml: "auto" }, onClick: selectionPopoverState.close }, /* @__PURE__ */ React48.createElement(XIcon3, { fontSize: SIZE4 }))), /* @__PURE__ */ React48.createElement(DynamicSelection, { onSelect: selectionPopoverState.close }))
1383
1861
  ));
1384
1862
  };
1385
1863
  var DynamicSettingsPopover = ({ dynamicTag }) => {
1386
- const popupId = useId3();
1387
- const settingsPopupState = usePopupState2({ variant: "popover", popupId });
1864
+ const popupId = useId5();
1865
+ const settingsPopupState = usePopupState4({ variant: "popover", popupId });
1388
1866
  const hasDynamicSettings = !!dynamicTag.atomic_controls.length;
1389
1867
  if (!hasDynamicSettings) {
1390
1868
  return null;
1391
1869
  }
1392
- return /* @__PURE__ */ React40.createElement(React40.Fragment, null, /* @__PURE__ */ React40.createElement(
1393
- IconButton,
1870
+ return /* @__PURE__ */ React48.createElement(React48.Fragment, null, /* @__PURE__ */ React48.createElement(
1871
+ IconButton3,
1394
1872
  {
1395
- size: SIZE2,
1396
- ...bindTrigger2(settingsPopupState),
1397
- "aria-label": __20("Settings", "elementor")
1873
+ size: SIZE4,
1874
+ ...bindTrigger3(settingsPopupState),
1875
+ "aria-label": __25("Settings", "elementor")
1398
1876
  },
1399
- /* @__PURE__ */ React40.createElement(SettingsIcon, { fontSize: SIZE2 })
1400
- ), /* @__PURE__ */ React40.createElement(
1401
- Popover,
1877
+ /* @__PURE__ */ React48.createElement(SettingsIcon, { fontSize: SIZE4 })
1878
+ ), /* @__PURE__ */ React48.createElement(
1879
+ Popover3,
1402
1880
  {
1403
1881
  disableScrollLock: true,
1404
1882
  anchorOrigin: { vertical: "bottom", horizontal: "center" },
1405
- ...bindPopover(settingsPopupState)
1883
+ ...bindPopover3(settingsPopupState)
1406
1884
  },
1407
- /* @__PURE__ */ React40.createElement(Paper, { component: Stack13, sx: { minHeight: "300px", width: "220px" } }, /* @__PURE__ */ React40.createElement(Stack13, { direction: "row", alignItems: "center", px: 1.5, pt: 2, pb: 1 }, /* @__PURE__ */ React40.createElement(DatabaseIcon, { fontSize: SIZE2, sx: { mr: 0.5 } }), /* @__PURE__ */ React40.createElement(Typography3, { variant: "subtitle2" }, dynamicTag.label), /* @__PURE__ */ React40.createElement(IconButton, { sx: { ml: "auto" }, size: SIZE2, onClick: settingsPopupState.close }, /* @__PURE__ */ React40.createElement(XIcon, { fontSize: SIZE2 }))), /* @__PURE__ */ React40.createElement(DynamicSettings, { controls: dynamicTag.atomic_controls }))
1885
+ /* @__PURE__ */ React48.createElement(Paper, { component: Stack18, sx: { minHeight: "300px", width: "220px" } }, /* @__PURE__ */ React48.createElement(Stack18, { direction: "row", alignItems: "center", px: 1.5, pt: 2, pb: 1 }, /* @__PURE__ */ React48.createElement(DatabaseIcon, { fontSize: SIZE4, sx: { mr: 0.5 } }), /* @__PURE__ */ React48.createElement(Typography5, { variant: "subtitle2" }, dynamicTag.label), /* @__PURE__ */ React48.createElement(IconButton3, { sx: { ml: "auto" }, size: SIZE4, onClick: settingsPopupState.close }, /* @__PURE__ */ React48.createElement(XIcon3, { fontSize: SIZE4 }))), /* @__PURE__ */ React48.createElement(DynamicSettings, { controls: dynamicTag.atomic_controls }))
1408
1886
  ));
1409
1887
  };
1410
1888
  var DynamicSettings = ({ controls }) => {
@@ -1413,28 +1891,50 @@ var DynamicSettings = ({ controls }) => {
1413
1891
  if (!tabs.length) {
1414
1892
  return null;
1415
1893
  }
1416
- return /* @__PURE__ */ React40.createElement(React40.Fragment, null, /* @__PURE__ */ React40.createElement(Tabs2, { indicatorColor: "secondary", textColor: "secondary", ...getTabsProps() }, tabs.map(({ value }, index) => /* @__PURE__ */ React40.createElement(Tab2, { key: index, label: value.label, sx: { px: 1, py: 0.5 }, ...getTabProps(index) }))), /* @__PURE__ */ React40.createElement(Divider4, null), tabs.map(({ value }, index) => {
1417
- return /* @__PURE__ */ React40.createElement(TabPanel2, { key: index, sx: { flexGrow: 1 }, ...getTabPanelProps(index) }, /* @__PURE__ */ React40.createElement(Stack13, { gap: 1, px: 2 }, value.items.map((item) => {
1894
+ return /* @__PURE__ */ React48.createElement(React48.Fragment, null, /* @__PURE__ */ React48.createElement(Tabs2, { indicatorColor: "secondary", textColor: "secondary", ...getTabsProps() }, tabs.map(({ value }, index) => /* @__PURE__ */ React48.createElement(Tab2, { key: index, label: value.label, sx: { px: 1, py: 0.5 }, ...getTabProps(index) }))), /* @__PURE__ */ React48.createElement(Divider4, null), tabs.map(({ value }, index) => {
1895
+ return /* @__PURE__ */ React48.createElement(TabPanel2, { key: index, sx: { flexGrow: 1 }, ...getTabPanelProps(index) }, /* @__PURE__ */ React48.createElement(Stack18, { gap: 1, px: 2 }, value.items.map((item) => {
1418
1896
  if (item.type === "control") {
1419
- return /* @__PURE__ */ React40.createElement(Control5, { key: item.value.bind, control: item.value });
1897
+ return /* @__PURE__ */ React48.createElement(Control6, { key: item.value.bind, control: item.value });
1420
1898
  }
1421
1899
  return null;
1422
1900
  })));
1423
1901
  }));
1424
1902
  };
1425
- var Control5 = ({ control }) => {
1903
+ var Control6 = ({ control }) => {
1426
1904
  if (!getControlByType(control.type)) {
1427
1905
  return null;
1428
1906
  }
1429
- return /* @__PURE__ */ React40.createElement(DynamicControl, { bind: control.bind }, control.label ? /* @__PURE__ */ React40.createElement(ControlLabel, null, control.label) : null, /* @__PURE__ */ React40.createElement(Control, { type: control.type, props: control.props }));
1907
+ return /* @__PURE__ */ React48.createElement(DynamicControl, { bind: control.bind }, control.label ? /* @__PURE__ */ React48.createElement(ControlLabel, null, control.label) : null, /* @__PURE__ */ React48.createElement(Control, { type: control.type, props: control.props }));
1908
+ };
1909
+
1910
+ // src/dynamics/hooks/use-prop-dynamic-action.tsx
1911
+ import * as React49 from "react";
1912
+ import { DatabaseIcon as DatabaseIcon2 } from "@elementor/icons";
1913
+ import { __ as __26 } from "@wordpress/i18n";
1914
+ var usePropDynamicAction = () => {
1915
+ const { bind } = useControl();
1916
+ const { elementType } = useElementContext();
1917
+ const propType = elementType.propsSchema[bind];
1918
+ const visible = !!propType && supportsDynamic(propType);
1919
+ return {
1920
+ visible,
1921
+ icon: DatabaseIcon2,
1922
+ title: __26("Dynamic Tags", "elementor"),
1923
+ popoverContent: ({ closePopover }) => /* @__PURE__ */ React49.createElement(DynamicSelection, { onSelect: closePopover })
1924
+ };
1430
1925
  };
1431
1926
 
1432
1927
  // src/dynamics/init.ts
1928
+ var { registerPopoverAction } = controlActionsMenu;
1433
1929
  var init = () => {
1434
1930
  replaceControl({
1435
1931
  component: DynamicSelectionControl,
1436
1932
  condition: ({ value }) => isDynamicPropValue(value)
1437
1933
  });
1934
+ registerPopoverAction({
1935
+ id: "dynamic-tags",
1936
+ useProps: usePropDynamicAction
1937
+ });
1438
1938
  };
1439
1939
 
1440
1940
  // src/init.ts
@@ -1457,6 +1957,7 @@ var blockV1Panel = () => {
1457
1957
  // src/index.ts
1458
1958
  init2();
1459
1959
  export {
1960
+ controlActionsMenu,
1460
1961
  replaceControl,
1461
1962
  useControl
1462
1963
  };