]*>/gi, "\n"); return new DOMParser().parseFromString(normalizedHtml, "text/html").body.textContent ?? ""; } function extractInlineHtmlContent(propValue) { if (_elementor_editor_props.escapedHtmlPropTypeUtil.isValid(propValue)) return _elementor_editor_props.escapedHtmlPropTypeUtil.extract(propValue) ?? ""; const htmlV3 = _elementor_editor_props.htmlV3PropTypeUtil.extract(propValue); return _elementor_editor_props.stringPropTypeUtil.extract(htmlV3?.content ?? null) ?? ""; } //#endregion //#region packages/packages/libs/editor-controls/src/components/inline-editor.tsx var ITALIC_KEYBOARD_SHORTCUT = "i"; var BOLD_KEYBOARD_SHORTCUT = "b"; var UNDERLINE_KEYBOARD_SHORTCUT = "u"; var InlineEditor = react.forwardRef((props, ref) => { const { value, setValue, placeholder = null, editorProps = {}, elementClasses = "", autofocus = false, sx = {}, onBlur = void 0, expectedTag = null, onEditorCreate, onEditorDestroy, wrapperClassName, onSelectionEnd, mountElement = null } = props; const containerRef = (0, react.useRef)(null); const onBlurRef = (0, react.useRef)(onBlur); onBlurRef.current = onBlur; const documentContentSettings = !!expectedTag ? "block+" : "inline*"; const onUpdate = ({ editor: updatedEditor }) => { const newValue = updatedEditor.getHTML(); setValue(isEmpty(newValue) ? null : newValue); }; const onKeyDown = (_, event) => { if (event.key === "Escape") onBlurRef.current?.(); if (!event.metaKey && !event.ctrlKey || event.altKey) return; if ([ ITALIC_KEYBOARD_SHORTCUT, BOLD_KEYBOARD_SHORTCUT, UNDERLINE_KEYBOARD_SHORTCUT ].includes(event.key)) event.stopPropagation(); }; const editedElementAttributes = (HTMLAttributes) => ({ ...HTMLAttributes, class: elementClasses }); const editor = useEditor({ ...mountElement ? { element: mountElement } : {}, extensions: [ index_default$10.extend({ content: documentContentSettings }), index_default$5.extend({ renderHTML({ HTMLAttributes }) { return [ expectedTag ?? "p", editedElementAttributes(HTMLAttributes), 0 ]; } }), index_default$8.extend({ renderHTML({ node, HTMLAttributes }) { if (expectedTag) return [ expectedTag, editedElementAttributes(HTMLAttributes), 0 ]; return [ `h${this.options.levels.includes(node.attrs.level) ? node.attrs.level : this.options.levels[0]}`, editedElementAttributes(HTMLAttributes), 0 ]; } }).configure({ levels: [ 1, 2, 3, 4, 5, 6 ] }), index_default$6.configure({ openOnClick: false }), index_default$1, index_default$11, index_default$7, index_default$4, index_default$2, index_default$3, index_default, index_default$9.extend({ addKeyboardShortcuts() { return { Enter: () => this.editor.commands.setHardBreak() }; } }) ], content: value, onUpdate, autofocus, editorProps: { ...editorProps, handleDOMEvents: { keydown: onKeyDown }, attributes: { ...editorProps.attributes ?? {}, role: "textbox", ...placeholder ? { "data-placeholder": htmlToPlainText(placeholder) } : {}, ...value === null || value === "" ? { class: "is-empty" } : {} } }, onCreate: onEditorCreate ? ({ editor: mountedEditor }) => onEditorCreate(mountedEditor) : void 0, onDestroy: onEditorDestroy ? () => onEditorDestroy() : void 0, onBlur: mountElement ? void 0 : () => onBlurRef.current?.(), onSelectionUpdate: onSelectionEnd ? ({ editor: updatedEditor }) => onSelectionEnd(updatedEditor.view) : void 0 }); useOnUpdate(() => { if (!editor) return; if (editor.getHTML() !== value) editor.commands.setContent(value, { emitUpdate: false }); }, [editor, value]); if (mountElement) return null; return /* @__PURE__ */ react.createElement(_elementor_ui.Box, { ref: containerRef, sx, className: wrapperClassName }, /* @__PURE__ */ react.createElement(EditorContent, { ref, editor })); }); var useOnUpdate = (callback, dependencies) => { const hasMounted = (0, react.useRef)(false); (0, react.useEffect)(() => { if (hasMounted.current) callback(); else hasMounted.current = true; }, dependencies); }; //#endregion //#region packages/packages/libs/editor-controls/src/components/url-popover.tsx var UrlPopover = ({ popupState, restoreValue, anchorRef, value, onChange, openInNewTab, onToggleNewTab }) => { const inputRef = (0, react.useRef)(null); (0, react.useEffect)(() => { if (popupState.isOpen) requestAnimationFrame(() => inputRef.current?.focus()); }, [popupState.isOpen]); const handleClose = () => { restoreValue(); popupState.close(); }; return /* @__PURE__ */ react.createElement(_elementor_ui.Popover, { slotProps: { paper: { sx: { borderRadius: "16px", width: anchorRef.current?.offsetWidth + "px", marginTop: -1 } } }, ...(0, _elementor_ui.bindPopover)(popupState), anchorOrigin: { vertical: "top", horizontal: "left" }, transformOrigin: { vertical: "top", horizontal: "left" }, onClose: handleClose }, /* @__PURE__ */ react.createElement(_elementor_ui.Stack, { direction: "row", alignItems: "center", gap: 1, sx: { p: 1.5 } }, /* @__PURE__ */ react.createElement(_elementor_ui.TextField, { value, onChange, size: "tiny", fullWidth: true, placeholder: (0, _wordpress_i18n.__)("Type a URL", "elementor"), inputProps: { ref: inputRef }, color: "secondary", InputProps: { sx: { borderRadius: "8px" } }, onKeyUp: (event) => event.key === "Enter" && handleClose() }), /* @__PURE__ */ react.createElement(_elementor_ui.Tooltip, { title: (0, _wordpress_i18n.__)("Open in a new tab", "elementor") }, /* @__PURE__ */ react.createElement(_elementor_ui.ToggleButton, { size: "tiny", value: "newTab", selected: openInNewTab, onClick: onToggleNewTab, "aria-label": (0, _wordpress_i18n.__)("Open in a new tab", "elementor"), sx: { borderRadius: "8px" } }, /* @__PURE__ */ react.createElement(_elementor_icons.ExternalLinkIcon, { fontSize: "tiny" }))))); }; //#endregion //#region packages/packages/libs/editor-controls/src/components/inline-editor-toolbar.tsx var InlineEditorToolbar = ({ editor, elementId, sx = {}, inControlPanel = false }) => { const [urlValue, setUrlValue] = (0, react.useState)(""); const [openInNewTab, setOpenInNewTab] = (0, react.useState)(false); const toolbarRef = (0, react.useRef)(null); const linkPopupState = (0, _elementor_ui.usePopupState)({ variant: "popover" }); const isElementClickable = elementId ? checkIfElementIsClickable(elementId) : false; const editorState = useEditorState({ editor, selector: (ctx) => possibleFormats.filter((format) => ctx.editor.isActive(format)) }); const formatButtonsList = (0, react.useMemo)(() => { const buttons = Object.values(formatButtons); if (isElementClickable) return buttons.filter((button) => button.action !== "link"); return buttons; }, [isElementClickable]); const handleLinkClick = () => { const linkAttrs = editor.getAttributes("link"); setUrlValue(linkAttrs.href || ""); setOpenInNewTab(linkAttrs.target === "_blank"); linkPopupState.open(toolbarRef.current); }; const handleUrlChange = (event) => { setUrlValue(event.target.value); }; const handleToggleNewTab = () => { setOpenInNewTab(!openInNewTab); }; const handleUrlSubmit = () => { if (urlValue) editor.chain().focus().setLink({ href: urlValue, target: openInNewTab ? "_blank" : "_self" }).run(); else editor.chain().focus().unsetLink().run(); if (elementId) window.dispatchEvent(new CustomEvent("elementor:inline-link-changed", { detail: { elementId } })); linkPopupState.close(); }; (0, react.useEffect)(() => { if (!inControlPanel) editor?.commands?.focus(); }, [editor, inControlPanel]); return /* @__PURE__ */ react.createElement(_elementor_ui.Box, { ref: toolbarRef, sx: { display: "inline-flex", gap: .5, padding: .5, borderRadius: "8px", backgroundColor: "background.paper", boxShadow: "0 2px 8px rgba(0, 0, 0, 0.2)", alignItems: "center", visibility: linkPopupState.isOpen ? "hidden" : "visible", pointerEvents: linkPopupState.isOpen ? "none" : "all", ...sx, ...inControlPanel && { width: "100%", justifyContent: "center", flexDirection: "row", backgroundColor: "transparent", boxShadow: "none", borderWidth: "0", borderBottom: "1px solid", borderBottomColor: (theme) => theme.palette.text.secondary, borderRadius: "0", position: "absolute", top: "0", left: "0", "&, & .MuiIconButton-root, & .MuiToggleButton-root": { color: (theme) => theme.palette.text.primary } } } }, /* @__PURE__ */ react.createElement(_elementor_ui.Tooltip, { title: clearButton.label, placement: "top", sx: { borderRadius: "8px" } }, /* @__PURE__ */ react.createElement(_elementor_ui.IconButton, { "aria-label": clearButton.label, onClick: () => clearButton.method(editor), size: "tiny" }, clearButton.icon)), /* @__PURE__ */ react.createElement(_elementor_ui.ToggleButtonGroup, { value: editorState, size: "tiny", sx: { display: "flex", gap: .5, border: "none", [`& .${_elementor_ui.toggleButtonGroupClasses.firstButton}, & .${_elementor_ui.toggleButtonGroupClasses.middleButton}, & .${_elementor_ui.toggleButtonGroupClasses.lastButton}`]: { borderRadius: "8px", border: "none", marginLeft: 0, "&.Mui-selected": { marginLeft: 0 }, "& + &.Mui-selected": { marginLeft: 0 } }, ...inControlPanel && { justifyContent: "space-between", width: "100%", "& svg": { width: "0.7rem", height: "0.7rem" } } } }, formatButtonsList.map((button) => /* @__PURE__ */ react.createElement(_elementor_ui.Tooltip, { title: button.label, key: button.action, placement: "top" }, /* @__PURE__ */ react.createElement(_elementor_ui.ToggleButton, { value: button.action, "aria-label": button.label, size: "tiny", onClick: () => { if (button.action === "link") handleLinkClick(); else button.method?.(editor); editor?.commands?.focus(); } }, button.icon)))), /* @__PURE__ */ react.createElement(UrlPopover, { popupState: linkPopupState, anchorRef: toolbarRef, restoreValue: handleUrlSubmit, value: urlValue, onChange: handleUrlChange, openInNewTab, onToggleNewTab: handleToggleNewTab })); }; var checkIfElementIsClickable = (elementId) => { const isButton = (0, _elementor_editor_elements.getContainer)(elementId)?.model.get("widgetType") === "e-button"; const hasLink = !!(0, _elementor_editor_elements.getElementSetting)(elementId, "link")?.value?.destination; return isButton || hasLink; }; var { clear: clearButton, ...formatButtons } = { clear: { label: (0, _wordpress_i18n.__)("Clear", "elementor"), icon: /* @__PURE__ */ react.createElement(_elementor_icons.MinusIcon, { fontSize: "tiny" }), action: "clear", method: (editor) => { editor.chain().focus().clearNodes().unsetAllMarks().run(); } }, bold: { label: (0, _wordpress_i18n.__)("Bold", "elementor"), icon: /* @__PURE__ */ react.createElement(_elementor_icons.BoldIcon, { fontSize: "tiny" }), action: "bold", method: (editor) => { editor.chain().focus().toggleBold().run(); } }, italic: { label: (0, _wordpress_i18n.__)("Italic", "elementor"), icon: /* @__PURE__ */ react.createElement(_elementor_icons.ItalicIcon, { fontSize: "tiny" }), action: "italic", method: (editor) => { editor.chain().focus().toggleItalic().run(); } }, underline: { label: (0, _wordpress_i18n.__)("Underline", "elementor"), icon: /* @__PURE__ */ react.createElement(_elementor_icons.UnderlineIcon, { fontSize: "tiny" }), action: "underline", method: (editor) => { editor.chain().focus().toggleUnderline().run(); } }, strike: { label: (0, _wordpress_i18n.__)("Strikethrough", "elementor"), icon: /* @__PURE__ */ react.createElement(_elementor_icons.StrikethroughIcon, { fontSize: "tiny" }), action: "strike", method: (editor) => { editor.chain().focus().toggleStrike().run(); } }, superscript: { label: (0, _wordpress_i18n.__)("Superscript", "elementor"), icon: /* @__PURE__ */ react.createElement(_elementor_icons.SuperscriptIcon, { fontSize: "tiny" }), action: "superscript", method: (editor) => { editor.chain().focus().toggleSuperscript().run(); } }, subscript: { label: (0, _wordpress_i18n.__)("Subscript", "elementor"), icon: /* @__PURE__ */ react.createElement(_elementor_icons.SubscriptIcon, { fontSize: "tiny" }), action: "subscript", method: (editor) => { editor.chain().focus().toggleSubscript().run(); } }, link: { label: (0, _wordpress_i18n.__)("Link", "elementor"), icon: /* @__PURE__ */ react.createElement(_elementor_icons.LinkIcon, { fontSize: "tiny" }), action: "link", method: null } }; var possibleFormats = Object.keys(formatButtons); //#endregion //#region packages/packages/libs/editor-controls/src/controls/inline-editing-control.tsx var InlineEditingControl = createControl(({ sx, attributes, props, context: { elementId } }) => { const { setValue, placeholder, value } = useBoundProp(_elementor_editor_props.escapedHtmlPropTypeUtil); const { value: rawValue } = usePropKeyContext(); const content = value ?? extractInlineHtmlContent(rawValue); const [editor, setEditor] = (0, react.useState)(null); const handleChange = (0, react.useCallback)((newValue) => { setValue(newValue ?? ""); }, [setValue]); return /* @__PURE__ */ react.createElement(ControlActions, null, /* @__PURE__ */ react.createElement(_elementor_ui.Box, { sx: { position: "relative" } }, editor && editor.isEditable && /* @__PURE__ */ react.createElement(InlineEditorToolbar, { editor, elementId, sx: (theme) => ({ boxShadow: "none", border: "1px solid", borderColor: theme.palette.text.secondary, mb: .5 }), inControlPanel: true }), /* @__PURE__ */ react.createElement(_elementor_ui.Box, { sx: (theme) => ({ p: .8, border: "1px solid", borderColor: theme.palette.text.secondary, borderRadius: "8px", transition: "border-color .2s ease, box-shadow .2s ease", "&:hover": { borderColor: theme.palette.text.primary }, "&:focus-within": { borderColor: theme.palette.text.primary, boxShadow: `0 0 0 1px ${theme.palette.text.primary}` }, "& .ProseMirror:focus": { outline: "none" }, "& .ProseMirror": { minHeight: "100px", fontSize: "12px", "& a": { color: "inherit" }, "& .elementor-inline-editor-reset": { margin: 0, padding: 0 }, "&.is-empty::before": { content: "attr(data-placeholder)", color: "text.tertiary", pointerEvents: "none", position: "absolute", opacity: .6 } }, ".strip-styles *": { all: "unset" }, ...sx }), ...attributes, ...props }, /* @__PURE__ */ react.createElement(InlineEditor, { value: content, setValue: handleChange, placeholder: placeholder ?? null, onEditorCreate: setEditor, onEditorDestroy: () => setEditor(null), sx: { paddingBlockStart: 5 } })))); }); //#endregion //#region packages/packages/libs/editor-controls/src/hooks/use-form-field-suggestions.ts var FORM_FIELD_WIDGET_TYPES = [ "e-form-input", "e-form-textarea", "e-form-checkbox", "e-form-radio-button", "e-form-select", "e-form-date-picker", "e-form-time-picker" ]; var FORM_ELEMENT_TYPE = "e-form"; var CSS_ID_PROP_KEY = "_cssid"; function isFormFieldWidgetType(widgetType) { return FORM_FIELD_WIDGET_TYPES.includes(widgetType); } function extractStringPropValue(value) { return _elementor_editor_props.stringPropTypeUtil.extract(value); } function getSettingWithDefault(child, widgetType, key) { const fromGet = child.settings.get(key); if (fromGet !== null && fromGet !== void 0) return fromGet; return ((0, _elementor_editor_elements.getWidgetsCache)()?.[widgetType]?.atomic_props_schema)?.[key]?.default ?? null; } function getFieldCssId(child, widgetType) { return extractStringPropValue(getSettingWithDefault(child, widgetType, CSS_ID_PROP_KEY)); } function getFormContainer(elementId) { let container = (0, _elementor_editor_elements.getContainer)(elementId); while (container) { if (container.model.get("elType") === FORM_ELEMENT_TYPE) return container; container = container.parent ?? null; } return null; } function useFormFieldSuggestions(options) { return (0, _elementor_editor_v1_adapters.__privateUseListenTo)([ (0, _elementor_editor_v1_adapters.v1ReadyEvent)(), (0, _elementor_editor_v1_adapters.commandEndEvent)("document/elements/create"), (0, _elementor_editor_v1_adapters.commandEndEvent)("document/elements/delete"), (0, _elementor_editor_v1_adapters.commandEndEvent)("document/elements/set-settings") ], () => { const selectedElement = (0, _elementor_editor_elements.getSelectedElements)()[0]; if (!selectedElement) return []; const formContainer = getFormContainer(selectedElement.id); if (!formContainer?.children) return []; const suggestions = []; const seenCssIds = /* @__PURE__ */ new Set(); formContainer.children.forEachRecursive?.((child) => { const widgetType = child.model.get("widgetType"); if (!widgetType || !isFormFieldWidgetType(widgetType)) return; if (options?.inputType) { if (extractStringPropValue(getSettingWithDefault(child, widgetType, "type")) !== options.inputType) return; } const cssId = getFieldCssId(child, widgetType); if (!cssId || seenCssIds.has(cssId)) return; seenCssIds.add(cssId); suggestions.push({ label: cssId, value: cssId }); }); return suggestions; }, []); } //#endregion //#region packages/packages/libs/editor-controls/src/controls/email-form-action-control/utils.ts var MIN_PRO_VERSION_FOR_MENTIONS = "4.1.0"; var CHIP_TRIGGER_KEYS = /* @__PURE__ */ new Set([" ", ","]); function isValidEmail(email) { return _elementor_schema.z.string().email().safeParse(email).success; } var FORM_FIELD_SHORTCODE_PATTERN = /^\[[^[\]]+]$/; function isFormFieldShortcode(value) { return FORM_FIELD_SHORTCODE_PATTERN.test(value); } var shouldShowMentionsInfo = () => { if (!(0, _elementor_utils.hasProInstalled)()) return true; const proVersion = window.elementorPro?.config?.version; if (!proVersion) return false; return (0, _elementor_utils.isVersionGreaterOrEqual)(proVersion, MIN_PRO_VERSION_FOR_MENTIONS); }; //#endregion //#region packages/packages/libs/editor-controls/src/controls/email-form-action-control/email-chips-field.tsx var isValidRecipient = (address) => isValidEmail(address) || isFormFieldShortcode(address); function resolveMention(raw, suggestions) { if (!raw.startsWith("@")) return raw; const match = suggestions.find((suggestion) => createMentionPattern(suggestion.value, "start").test(raw)); return match ? `[${match.value}]` : raw; } var EmailChipsControl = createControl(({ placeholder, suggestions = [] }) => { const { value, setValue, disabled } = useBoundProp(_elementor_editor_props.stringArrayPropTypeUtil); const [inputValue, setInputValue] = (0, react.useState)(""); const items = value || []; const selectedValues = items.map((item) => _elementor_editor_props.stringPropTypeUtil.extract(item)).filter((val) => val !== null); const suggestionOptions = (0, react.useMemo)(() => suggestions.map((suggestion) => `[${suggestion.value}]`), [suggestions]); const tryAddChip = (raw) => { const address = resolveMention(raw.trim(), suggestions); if (!address || selectedValues.includes(address) || !isValidRecipient(address)) return; setValue([...items, _elementor_editor_props.stringPropTypeUtil.create(address)]); setInputValue(""); }; const handleChange = (_, newValue) => { const updated = []; for (const entry of newValue) { const address = resolveMention(entry.trim(), suggestions); if (!address || !isValidRecipient(address)) continue; updated.push(_elementor_editor_props.stringPropTypeUtil.create(address)); } setValue(updated); setInputValue(""); }; const handleBlur = (event) => { const target = event.target; tryAddChip(target.value); setInputValue(""); }; const handleKeyDown = (event) => { if (CHIP_TRIGGER_KEYS.has(event.key) && inputValue.trim()) { event.preventDefault(); tryAddChip(inputValue); } }; return /* @__PURE__ */ react.createElement(ControlActions, null, /* @__PURE__ */ react.createElement(_elementor_ui.Autocomplete, { fullWidth: true, multiple: true, freeSolo: true, size: "tiny", disabled, inputValue, onInputChange: (_, val, reason) => { if (reason !== "reset") setInputValue(val); }, value: selectedValues, onChange: handleChange, options: suggestionOptions, filterOptions: (options, state) => { const query = state.inputValue.trim().replace(/^@/, "").toLowerCase(); return query ? options.filter((option) => option.toLowerCase().includes(query)) : options; }, filterSelectedOptions: true, onBlur: handleBlur, getOptionLabel: (option) => option, isOptionEqualToValue: (option, val) => option === val, renderInput: (params) => /* @__PURE__ */ react.createElement(_elementor_ui.TextField, { ...params, placeholder, onKeyDown: handleKeyDown }), renderTags: (tagValues, getTagProps) => /* @__PURE__ */ react.createElement(ChipsList, { getLabel: (option) => option, getTagProps, values: tagValues }) })); }); var EmailChipsField = ({ fieldLabel, placeholder, suggestions }) => /* @__PURE__ */ react.createElement(_elementor_ui.Grid, { container: true, direction: "column", gap: .5 }, /* @__PURE__ */ react.createElement(_elementor_ui.Grid, { item: true }, /* @__PURE__ */ react.createElement(ControlFormLabel, null, fieldLabel)), /* @__PURE__ */ react.createElement(_elementor_ui.Grid, { item: true }, /* @__PURE__ */ react.createElement(EmailChipsControl, { placeholder, suggestions }))); //#endregion //#region packages/packages/libs/editor-controls/src/controls/email-form-action-control/email-field.tsx var EmailField = ({ bind, label, placeholder }) => /* @__PURE__ */ react.createElement(PropKeyProvider, { bind }, /* @__PURE__ */ react.createElement(_elementor_ui.Grid, { container: true, direction: "column", gap: .5 }, /* @__PURE__ */ react.createElement(_elementor_ui.Grid, { item: true }, /* @__PURE__ */ react.createElement(ControlFormLabel, null, label)), /* @__PURE__ */ react.createElement(_elementor_ui.Grid, { item: true }, /* @__PURE__ */ react.createElement(TextControl, { placeholder })))); //#endregion //#region packages/packages/libs/editor-controls/src/controls/email-form-action-control/fields.tsx var SendToField = ({ placeholder }) => { const suggestions = useFormFieldSuggestions({ inputType: "email" }); return /* @__PURE__ */ react.createElement(PropKeyProvider, { bind: "to" }, /* @__PURE__ */ react.createElement(_elementor_ui.Stack, { gap: .5 }, /* @__PURE__ */ react.createElement(EmailChipsField, { fieldLabel: (0, _wordpress_i18n.__)("Send to", "elementor"), placeholder, suggestions }), shouldShowMentionsInfo() && /* @__PURE__ */ react.createElement(_elementor_editor_ui.InfoAlert, null, (0, _wordpress_i18n.__)("Type @ or an email field name to insert its submitted value.", "elementor")))); }; var SubjectField = () => /* @__PURE__ */ react.createElement(EmailField, { bind: "subject", label: (0, _wordpress_i18n.__)("Email subject", "elementor"), placeholder: (0, _wordpress_i18n.__)("New form submission", "elementor") }); var MessageField = () => { const suggestions = useFormFieldSuggestions(); return /* @__PURE__ */ react.createElement(PropKeyProvider, { bind: "message" }, /* @__PURE__ */ react.createElement(_elementor_ui.Grid, { container: true, direction: "column", gap: .5 }, /* @__PURE__ */ react.createElement(_elementor_ui.Grid, { item: true }, /* @__PURE__ */ react.createElement(ControlFormLabel, null, (0, _wordpress_i18n.__)("Message", "elementor"))), /* @__PURE__ */ react.createElement(_elementor_ui.Grid, { item: true }, /* @__PURE__ */ react.createElement(MentionTextAreaControl, { suggestions })), /* @__PURE__ */ react.createElement(_elementor_ui.Grid, { item: true }, /* @__PURE__ */ react.createElement(_elementor_editor_ui.InfoAlert, null, shouldShowMentionsInfo() ? (0, _wordpress_i18n.__)("[all-fields] shortcode sends all fields. Type @ to insert specific fields and customize your message.", "elementor") : (0, _wordpress_i18n.__)("[all-fields] shortcode sends all fields.", "elementor"))))); }; var FromEmailField = () => /* @__PURE__ */ react.createElement(EmailField, { bind: "from", label: (0, _wordpress_i18n.__)("From email", "elementor"), placeholder: (0, _wordpress_i18n.__)("What email should appear as the sender?", "elementor") }); var FromNameField = () => /* @__PURE__ */ react.createElement(EmailField, { bind: "from-name", label: (0, _wordpress_i18n.__)("From name", "elementor"), placeholder: (0, _wordpress_i18n.__)("What name should appear as the sender?", "elementor") }); var ReplyToField = () => { const emailSuggestions = useFormFieldSuggestions({ inputType: "email" }); return /* @__PURE__ */ react.createElement(PropKeyProvider, { bind: "reply-to" }, /* @__PURE__ */ react.createElement(_elementor_ui.Grid, { container: true, direction: "column", gap: .5 }, /* @__PURE__ */ react.createElement(_elementor_ui.Grid, { item: true }, /* @__PURE__ */ react.createElement(ControlFormLabel, null, (0, _wordpress_i18n.__)("Reply-to", "elementor"))), /* @__PURE__ */ react.createElement(_elementor_ui.Grid, { item: true }, /* @__PURE__ */ react.createElement(MentionTextAreaControl, { suggestions: emailSuggestions, rows: 1, triggerPosition: "start", placeholder: (0, _wordpress_i18n.__)("You can type @ to insert an email field", "elementor") })))); }; var CcField = () => { const suggestions = useFormFieldSuggestions({ inputType: "email" }); return /* @__PURE__ */ react.createElement(PropKeyProvider, { bind: "cc" }, /* @__PURE__ */ react.createElement(EmailChipsField, { fieldLabel: (0, _wordpress_i18n.__)("Cc", "elementor"), suggestions })); }; var BccField = () => { const suggestions = useFormFieldSuggestions({ inputType: "email" }); return /* @__PURE__ */ react.createElement(PropKeyProvider, { bind: "bcc" }, /* @__PURE__ */ react.createElement(EmailChipsField, { fieldLabel: (0, _wordpress_i18n.__)("Bcc", "elementor"), suggestions })); }; var MetaDataField = () => /* @__PURE__ */ react.createElement(PropKeyProvider, { bind: "meta-data" }, /* @__PURE__ */ react.createElement(_elementor_ui.Stack, { gap: .5 }, /* @__PURE__ */ react.createElement(ControlFormLabel, null, (0, _wordpress_i18n.__)("Metadata", "elementor")), /* @__PURE__ */ react.createElement(ChipsControl, { options: [ { label: (0, _wordpress_i18n.__)("Date", "elementor"), value: "date" }, { label: (0, _wordpress_i18n.__)("Time", "elementor"), value: "time" }, { label: (0, _wordpress_i18n.__)("Page URL", "elementor"), value: "page-url" }, { label: (0, _wordpress_i18n.__)("User agent", "elementor"), value: "user-agent" }, { label: (0, _wordpress_i18n.__)("Credit", "elementor"), value: "credit" } ] }))); var SendAsField = () => /* @__PURE__ */ react.createElement(PropKeyProvider, { bind: "send-as" }, /* @__PURE__ */ react.createElement(_elementor_ui.Grid, { container: true, direction: "column", gap: .5 }, /* @__PURE__ */ react.createElement(_elementor_ui.Grid, { item: true }, /* @__PURE__ */ react.createElement(ControlFormLabel, null, (0, _wordpress_i18n.__)("Send as", "elementor"))), /* @__PURE__ */ react.createElement(_elementor_ui.Grid, { item: true }, /* @__PURE__ */ react.createElement(SelectControl, { options: [{ label: (0, _wordpress_i18n.__)("HTML", "elementor"), value: "html" }, { label: (0, _wordpress_i18n.__)("Plain Text", "elementor"), value: "plain" }] })))); //#endregion //#region packages/packages/libs/editor-controls/src/controls/email-form-action-control/index.tsx var EmailFormActionControl = createControl(({ toPlaceholder, label }) => { const { value, setValue, ...propContext } = useBoundProp(_elementor_editor_props.emailsPropTypeUtil); return /* @__PURE__ */ react.createElement(PropProvider, { ...propContext, value, setValue }, /* @__PURE__ */ react.createElement(_elementor_ui.Stack, { gap: 2 }, /* @__PURE__ */ react.createElement(ControlLabel, null, label ? label + " " + (0, _wordpress_i18n.__)("settings", "elementor") : (0, _wordpress_i18n.__)("Email settings", "elementor")), /* @__PURE__ */ react.createElement(SendToField, { placeholder: toPlaceholder }), /* @__PURE__ */ react.createElement(SubjectField, null), /* @__PURE__ */ react.createElement(MessageField, null), /* @__PURE__ */ react.createElement(FromEmailField, null), /* @__PURE__ */ react.createElement(AdvancedSettings, null))); }); var AdvancedSettings = () => /* @__PURE__ */ react.createElement(_elementor_editor_ui.CollapsibleContent, { defaultOpen: false }, /* @__PURE__ */ react.createElement(_elementor_ui.Box, { sx: { pt: 2 } }, /* @__PURE__ */ react.createElement(_elementor_ui.Stack, { gap: 2 }, /* @__PURE__ */ react.createElement(FromNameField, null), /* @__PURE__ */ react.createElement(ReplyToField, null), /* @__PURE__ */ react.createElement(CcField, null), /* @__PURE__ */ react.createElement(BccField, null), /* @__PURE__ */ react.createElement(_elementor_ui.Divider, null), /* @__PURE__ */ react.createElement(MetaDataField, null), /* @__PURE__ */ react.createElement(SendAsField, null)))); //#endregion //#region packages/packages/libs/editor-controls/src/controls/attachment-type-control.tsx var AttachmentTypeControl = createControl(({ label, options }) => { return /* @__PURE__ */ react.createElement(_elementor_ui.Grid, { container: true, direction: "column", gap: 1 }, label && /* @__PURE__ */ react.createElement(_elementor_ui.Grid, { item: true }, /* @__PURE__ */ react.createElement(ControlFormLabel, null, label)), /* @__PURE__ */ react.createElement(_elementor_ui.Grid, { item: true }, /* @__PURE__ */ react.createElement(SelectControl, { options })), /* @__PURE__ */ react.createElement(_elementor_ui.Grid, { item: true }, /* @__PURE__ */ react.createElement(_elementor_editor_ui.InfoAlert, null, (0, _wordpress_i18n.__)("Linked uploads are saved to the server. Direct attachments will not appear under Submissions.", "elementor")))); }); //#endregion //#region packages/packages/libs/editor-controls/src/controls/grid-span-control.tsx var GridSpanControl = createControl(({ placeholder: propPlaceholder, error, inputValue, inputDisabled, helperText, sx, ariaLabel }) => { const { value, setValue, disabled, placeholder: boundPlaceholder } = useBoundProp(_elementor_editor_props.spanPropTypeUtil); const handleChange = (event) => { const next = event.target.value; setValue(next === "" ? null : next); }; const placeholder = propPlaceholder ?? boundPlaceholder ?? `e.g: 'span 2' or '1 / 3'`; return /* @__PURE__ */ react.createElement(ControlActions, null, /* @__PURE__ */ react.createElement(_elementor_ui.TextField, { size: "tiny", fullWidth: true, disabled: inputDisabled ?? disabled, value: inputValue ?? value ?? "", onChange: handleChange, placeholder, error, helperText, sx, inputProps: { ...ariaLabel ? { "aria-label": ariaLabel } : {} } })); }); //#endregion //#region packages/packages/libs/editor-controls/src/components/promotions/promotion-trigger.tsx function getV4Promotion(key) { return window.elementor?.config?.v4Promotions?.[key]; } var PromotionTrigger = (0, react.forwardRef)(({ promotionKey, children, trackingData }, ref) => { const [isOpen, setIsOpen] = (0, react.useState)(false); const promotion = getV4Promotion(promotionKey); const toggle = (0, react.useCallback)(() => { setIsOpen((prev) => { if (!prev) trackViewPromotion(trackingData); return !prev; }); }, [trackingData]); (0, react.useImperativeHandle)(ref, () => ({ toggle }), [toggle]); return /* @__PURE__ */ react.createElement(react.Fragment, null, promotion && /* @__PURE__ */ react.createElement(_elementor_editor_ui.PromotionInfotip, { title: promotion.title, content: promotion.content, assetUrl: promotion.image, ctaUrl: promotion.ctaUrl, open: isOpen, onClose: (e) => { e.stopPropagation(); setIsOpen(false); }, onCtaClick: () => trackUpgradePromotionClick(trackingData) }, /* @__PURE__ */ react.createElement(_elementor_ui.Box, { onClick: (e) => { e.stopPropagation(); toggle(); }, sx: { cursor: "pointer", display: "inline-flex" } }, children ?? /* @__PURE__ */ react.createElement(_elementor_editor_ui.PromotionChip, null)))); }); //#endregion //#region packages/packages/libs/editor-controls/src/components/promotions/display-conditions-control.tsx var ARIA_LABEL$1 = (0, _wordpress_i18n.__)("Display Conditions", "elementor"); var TRACKING_DATA$1 = { target_name: "display_conditions", location_l2: "general" }; var DisplayConditionsControl = createControl(() => { const triggerRef = (0, react.useRef)(null); return /* @__PURE__ */ react.createElement(_elementor_ui.Stack, { direction: "row", spacing: 2, sx: { justifyContent: "flex-end", alignItems: "center" } }, /* @__PURE__ */ react.createElement(PromotionTrigger, { ref: triggerRef, promotionKey: "displayConditions", trackingData: TRACKING_DATA$1 }), /* @__PURE__ */ react.createElement(_elementor_ui.Tooltip, { title: ARIA_LABEL$1, placement: "top" }, /* @__PURE__ */ react.createElement(_elementor_ui.IconButton, { size: "tiny", "aria-label": ARIA_LABEL$1, "data-behavior": "display-conditions", onClick: () => triggerRef.current?.toggle(), sx: { border: "1px solid", borderColor: "divider", borderRadius: 1 } }, /* @__PURE__ */ react.createElement(_elementor_icons.SitemapIcon, { fontSize: "tiny", color: "disabled" })))); }); //#endregion //#region packages/packages/libs/editor-controls/src/components/promotions/attributes-control.tsx var ARIA_LABEL = (0, _wordpress_i18n.__)("Attributes", "elementor"); var TRACKING_DATA = { target_name: "attributes", location_l2: "general" }; var AttributesControl = createControl(() => { const triggerRef = (0, react.useRef)(null); return /* @__PURE__ */ react.createElement(_elementor_ui.Stack, { direction: "row", spacing: 2, sx: { justifyContent: "flex-end", alignItems: "center" } }, /* @__PURE__ */ react.createElement(PromotionTrigger, { ref: triggerRef, promotionKey: "attributes", trackingData: TRACKING_DATA }), /* @__PURE__ */ react.createElement(_elementor_ui.Tooltip, { title: ARIA_LABEL, placement: "top" }, /* @__PURE__ */ react.createElement(_elementor_icons.PlusIcon, { "aria-label": ARIA_LABEL, fontSize: "tiny", color: "disabled", onClick: () => triggerRef.current?.toggle(), sx: { cursor: "pointer" } }))); }); //#endregion //#region packages/packages/libs/editor-controls/src/components/icon-buttons/clear-icon-button.tsx var CustomIconButton = (0, _elementor_ui.styled)(_elementor_ui.IconButton)(({ theme }) => ({ width: theme.spacing(2.5), height: theme.spacing(2.5) })); var ClearIconButton = ({ tooltipText, onClick, disabled, size = "tiny" }) => /* @__PURE__ */ react.createElement(_elementor_ui.Tooltip, { title: tooltipText, placement: "top", disableInteractive: true }, /* @__PURE__ */ react.createElement(CustomIconButton, { "aria-label": tooltipText, size, onClick, disabled }, /* @__PURE__ */ react.createElement(_elementor_icons.BrushBigIcon, { fontSize: size }))); //#endregion //#region packages/packages/libs/editor-controls/src/components/repeater/repeater.tsx var SIZE = "tiny"; var EMPTY_OPEN_ITEM = -1; var Repeater = ({ label, itemSettings, disabled = false, openOnAdd = false, values: items = [], setValues: setItems, showDuplicate = true, showToggle = true, showRemove = true, disableAddItemButton = false, addButtonInfotipContent, openItem: initialOpenItem = EMPTY_OPEN_ITEM, isSortable = true, adornment = ControlAdornments }) => { const [openItem, setOpenItem] = (0, react.useState)(initialOpenItem); const uniqueKeys = items.map((item, index) => isSortable && "getId" in itemSettings ? itemSettings.getId({ item, index }) : String(index)); const addRepeaterItem = () => { const newItem = structuredClone(itemSettings.initialValues); const newIndex = items.length; setItems([...items, newItem], {}, { action: { type: "add", payload: [{ index: newIndex, item: newItem }] } }); if (openOnAdd) setOpenItem(newIndex); }; const duplicateRepeaterItem = (index) => { const newItem = structuredClone(items[index]); const atPosition = 1 + index; setItems([ ...items.slice(0, atPosition), newItem, ...items.slice(atPosition) ], {}, { action: { type: "duplicate", payload: [{ index, item: newItem }] } }); }; const removeRepeaterItem = (index) => { const removedItem = items[index]; setItems(items.filter((_, pos) => { return pos !== index; }), {}, { action: { type: "remove", payload: [{ index, item: removedItem }] } }); }; const toggleDisableRepeaterItem = (index) => { setItems(items.map((value, pos) => { if (pos === index) { const { disabled: propDisabled, ...rest } = value; return { ...rest, ...propDisabled ? {} : { disabled: true } }; } return value; }), {}, { action: { type: "toggle-disable" } }); }; const onChangeOrder = (reorderedKeys, meta) => { setItems(reorderedKeys.map((id) => { return items[uniqueKeys.indexOf(id)]; }), {}, { action: { type: "reorder", payload: { ...meta } } }); }; const isButtonDisabled = disabled || disableAddItemButton; const shouldShowInfotip = isButtonDisabled && addButtonInfotipContent; const addButton = /* @__PURE__ */ react.createElement(_elementor_ui.IconButton, { size: SIZE, sx: { ml: "auto" }, disabled: isButtonDisabled, onClick: addRepeaterItem, "aria-label": (0, _wordpress_i18n.__)("Add item", "elementor") }, /* @__PURE__ */ react.createElement(_elementor_icons.PlusIcon, { fontSize: SIZE })); return /* @__PURE__ */ react.createElement(SectionContent, { gap: 2 }, /* @__PURE__ */ react.createElement(RepeaterHeader, { label, adornment }, shouldShowInfotip ? /* @__PURE__ */ react.createElement(_elementor_ui.Infotip, { placement: "right", content: addButtonInfotipContent, color: "secondary", slotProps: { popper: { sx: { width: 300 } } } }, /* @__PURE__ */ react.createElement(_elementor_ui.Box, { sx: { ...isButtonDisabled ? { cursor: "not-allowed" } : {} } }, addButton)) : addButton), 0 < uniqueKeys.length && /* @__PURE__ */ react.createElement(SortableProvider, { value: uniqueKeys, onChange: onChangeOrder }, uniqueKeys.map((key) => { const index = uniqueKeys.indexOf(key); const value = items[index]; if (!value) return null; return /* @__PURE__ */ react.createElement(SortableItem, { id: key, key: `sortable-${key}`, disabled: !isSortable }, /* @__PURE__ */ react.createElement(RepeaterItem, { disabled, propDisabled: value?.disabled, label: /* @__PURE__ */ react.createElement(RepeaterItemLabelSlot, { value }, /* @__PURE__ */ react.createElement(itemSettings.Label, { value, index })), startIcon: /* @__PURE__ */ react.createElement(RepeaterItemIconSlot, { value }, /* @__PURE__ */ react.createElement(itemSettings.Icon, { value })), removeItem: () => removeRepeaterItem(index), duplicateItem: () => duplicateRepeaterItem(index), toggleDisableItem: () => toggleDisableRepeaterItem(index), openOnMount: openOnAdd && openItem === index, onOpen: () => setOpenItem(EMPTY_OPEN_ITEM), onPopoverOpen: itemSettings.onPopoverOpen, onPopoverClose: itemSettings.onPopoverClose, showDuplicate, showToggle, showRemove, actions: itemSettings.actions, value }, (props) => /* @__PURE__ */ react.createElement(itemSettings.Content, { ...props, value, bind: String(index), index }))); }))); }; var RepeaterItem = ({ label, propDisabled, startIcon, children, removeItem, duplicateItem, toggleDisableItem, openOnMount, onOpen, onPopoverOpen, onPopoverClose, showDuplicate, showToggle, showRemove, disabled, actions, value }) => { const { popoverState, popoverProps, ref, setRef } = usePopover(openOnMount, () => { onOpen(); onPopoverOpen?.(value); }, onPopoverClose ? () => onPopoverClose(value) : void 0); const triggerProps = (0, _elementor_ui.bindTrigger)(popoverState); usePopoverDismiss({ isOpen: popoverState.isOpen, onClose: popoverProps.onClose }); const duplicateLabel = (0, _wordpress_i18n.__)("Duplicate", "elementor"); const toggleLabel = propDisabled ? (0, _wordpress_i18n.__)("Show", "elementor") : (0, _wordpress_i18n.__)("Hide", "elementor"); const removeLabel = (0, _wordpress_i18n.__)("Remove", "elementor"); return /* @__PURE__ */ react.createElement(_elementor_ui.Box, { sx: { display: "contents" } }, /* @__PURE__ */ react.createElement(RepeaterTag, { disabled, label, ref: setRef, "aria-label": (0, _wordpress_i18n.__)("Open item", "elementor"), ...triggerProps, onClick: (e) => { triggerProps.onClick(e); if (!popoverState.isOpen) onPopoverOpen?.(value); }, startIcon, actions: /* @__PURE__ */ react.createElement(react.Fragment, null, showDuplicate && /* @__PURE__ */ react.createElement(_elementor_ui.Tooltip, { title: duplicateLabel, placement: "top" }, /* @__PURE__ */ react.createElement(_elementor_ui.IconButton, { size: SIZE, onClick: duplicateItem, "aria-label": duplicateLabel }, /* @__PURE__ */ react.createElement(_elementor_icons.CopyIcon, { fontSize: SIZE }))), showToggle && /* @__PURE__ */ react.createElement(_elementor_ui.Tooltip, { title: toggleLabel, placement: "top" }, /* @__PURE__ */ react.createElement(_elementor_ui.IconButton, { size: SIZE, onClick: toggleDisableItem, "aria-label": toggleLabel }, propDisabled ? /* @__PURE__ */ react.createElement(_elementor_icons.EyeOffIcon, { fontSize: SIZE }) : /* @__PURE__ */ react.createElement(_elementor_icons.EyeIcon, { fontSize: SIZE }))), actions?.(value), showRemove && /* @__PURE__ */ react.createElement(_elementor_ui.Tooltip, { title: removeLabel, placement: "top" }, /* @__PURE__ */ react.createElement(_elementor_ui.IconButton, { size: SIZE, onClick: removeItem, "aria-label": removeLabel }, /* @__PURE__ */ react.createElement(_elementor_icons.XIcon, { fontSize: SIZE })))) }), /* @__PURE__ */ react.createElement(RepeaterPopover, { width: ref?.getBoundingClientRect().width, ...popoverProps, anchorEl: ref }, /* @__PURE__ */ react.createElement(_elementor_ui.Box, null, children({ anchorEl: ref })))); }; var usePopover = (openOnMount, onOpen, onPopoverClose) => { const [ref, setRef] = (0, react.useState)(null); const popoverState = (0, _elementor_ui.usePopupState)({ variant: "popover" }); const popoverProps = (0, _elementor_ui.bindPopover)(popoverState); (0, react.useEffect)(() => { if (openOnMount && ref) { popoverState.open(ref); onOpen?.(); } }, [ref]); const onClose = () => { popoverProps.onClose?.(); onPopoverClose?.(); }; return { popoverState, ref, setRef, popoverProps: { ...popoverProps, onClose } }; }; //#endregion //#region packages/packages/libs/editor-controls/src/hooks/use-size-value.ts var DEFAULT_UNIT = "px"; var DEFAULT_SIZE = ""; var useSizeValue = (externalValue, onChange, defaultUnit) => { const [sizeValue, setSizeValue] = useSyncExternalState({ external: externalValue, setExternal: (newState) => { if (newState !== null) onChange(newState); }, persistWhen: (newState) => differsFromExternal(newState, externalValue), fallback: () => ({ size: DEFAULT_SIZE, unit: defaultUnit ?? DEFAULT_UNIT }) }); const setSize = (value) => { const newState = { ...sizeValue, size: value.trim() === "" ? null : Number(value) }; setSizeValue(newState); }; const setUnit = (unit) => { const newState = { ...sizeValue, unit }; setSizeValue(newState); }; return { size: sizeValue.size, unit: sizeValue.unit, setSize, setUnit }; }; var differsFromExternal = (newState, externalState) => { return newState?.size !== externalState?.size || newState?.unit !== externalState?.unit; }; //#endregion //#region packages/packages/libs/editor-controls/src/components/size/unit-select.tsx var menuItemContentStyles = { display: "flex", flexDirection: "column", justifyContent: "center" }; var UnitSelect = ({ value, showPrimaryColor, onClick, options }) => { const popupState = (0, _elementor_ui.usePopupState)({ variant: "popover", popupId: (0, react.useId)() }); const handleMenuItemClick = (index) => { onClick(options[index]); popupState.close(); }; return /* @__PURE__ */ react.createElement(react.Fragment, null, /* @__PURE__ */ react.createElement(StyledButton, { isPrimaryColor: showPrimaryColor, size: "small", ...(0, _elementor_ui.bindTrigger)(popupState) }, value), /* @__PURE__ */ react.createElement(_elementor_ui.Menu, { MenuListProps: { dense: true }, ...(0, _elementor_ui.bindMenu)(popupState) }, options.map((option, index) => /* @__PURE__ */ react.createElement(_elementor_editor_ui.MenuListItem, { key: option, onClick: () => handleMenuItemClick(index), primaryTypographyProps: { variant: "caption", sx: { ...menuItemContentStyles, lineHeight: "1" } }, menuItemTextProps: { sx: menuItemContentStyles } }, option.toUpperCase())))); }; var StyledButton = (0, _elementor_ui.styled)(_elementor_ui.Button, { shouldForwardProp: (prop) => prop !== "isPrimaryColor" })(({ isPrimaryColor, theme }) => ({ color: isPrimaryColor ? theme.palette.text.primary : theme.palette.text.tertiary, font: "inherit", minWidth: "initial", textTransform: "uppercase" })); //#endregion //#region packages/packages/libs/editor-controls/src/components/size/unstable-size-input.tsx var UnstableSizeInput = (0, react.forwardRef)(({ type, value, onChange, onKeyDown, onKeyUp, InputProps, onBlur, focused, disabled }, ref) => { return /* @__PURE__ */ react.createElement(NumberInput, { ref, size: "tiny", fullWidth: true, type, value, onKeyUp, focused, disabled, onKeyDown, onInput: onChange, onBlur, InputProps, sx: getCursorStyle(InputProps?.readOnly ?? false) }); }); var getCursorStyle = (readOnly) => ({ input: { cursor: readOnly ? "default !important" : void 0 } }); //#endregion //#region packages/packages/libs/editor-controls/src/components/size/unstable-size-field.tsx var UnstableSizeField = ({ value, InputProps, onChange, onBlur, units, defaultUnit, startIcon }) => { const { size, unit, setSize, setUnit } = useSizeValue(value, onChange, defaultUnit); const shouldHighlightUnit = () => { return hasValue(size); }; return /* @__PURE__ */ react.createElement(UnstableSizeInput, { type: "number", value: size ?? "", onBlur, onChange: (event) => setSize(event.target.value), InputProps: { ...InputProps, startAdornment: startIcon && /* @__PURE__ */ react.createElement(_elementor_ui.InputAdornment, { position: "start" }, startIcon), endAdornment: /* @__PURE__ */ react.createElement(_elementor_ui.InputAdornment, { position: "end" }, /* @__PURE__ */ react.createElement(UnitSelect, { options: units, value: unit, onClick: setUnit, showPrimaryColor: shouldHighlightUnit() })) } }); }; var hasValue = (value) => { return value !== null && value !== ""; }; //#endregion //#region packages/packages/libs/editor-controls/src/hooks/use-font-families.ts var getFontControlConfig = () => { const { controls } = (0, _elementor_editor_v1_adapters.getElementorConfig)(); return controls?.font ?? {}; }; var useFontFamilies = () => { const { groups, options } = getFontControlConfig(); return (0, react.useMemo)(() => { if (!groups || !options) return []; const groupKeys = Object.keys(groups); const groupIndexMap = new Map(groupKeys.map((key, index) => [key, index])); return Object.entries(options).reduce((acc, [font, category]) => { const groupIndex = groupIndexMap.get(category); if (groupIndex === void 0) return acc; if (!acc[groupIndex]) acc[groupIndex] = { label: groups[category], fonts: [] }; acc[groupIndex].fonts.push(font); return acc; }, []).filter(Boolean); }, [groups, options]); }; //#endregion //#region packages/packages/libs/editor-controls/src/index.ts var src_exports = /* @__PURE__ */ __exportAll({ AspectRatioControl: () => AspectRatioControl, AttachmentTypeControl: () => AttachmentTypeControl, AttributesControl: () => AttributesControl, BackgroundControl: () => BackgroundControl, BoxShadowRepeaterControl: () => BoxShadowRepeaterControl, ChipsControl: () => ChipsControl, ClearIconButton: () => ClearIconButton, ColorControl: () => ColorControl, ControlActions: () => ControlActions, ControlActionsProvider: () => ControlActionsProvider, ControlAdornments: () => ControlAdornments, ControlAdornmentsProvider: () => ControlAdornmentsProvider, ControlFormLabel: () => ControlFormLabel, ControlReplacementsProvider: () => ControlReplacementsProvider, ControlToggleButtonGroup: () => ControlToggleButtonGroup, DateRangeControl: () => DateRangeControl, DateTimeControl: () => DateTimeControl, DisplayConditionsControl: () => DisplayConditionsControl, EmailFormActionControl: () => EmailFormActionControl, EqualUnequalSizesControl: () => EqualUnequalSizesControl, FilterRepeaterControl: () => FilterRepeaterControl, FontFamilyControl: () => FontFamilyControl, GapControl: () => GapControl, GridSpanControl: () => GridSpanControl, HtmlTagControl: () => HtmlTagControl, ImageControl: () => ImageControl, InlineEditingControl: () => InlineEditingControl, InlineEditor: () => InlineEditor, InlineEditorToolbar: () => InlineEditorToolbar, ItemSelector: () => ItemSelector, KeyValueControl: () => KeyValueControl, LinkControl: () => LinkControl, LinkedDimensionsControl: () => LinkedDimensionsControl, MentionTextAreaControl: () => MentionTextAreaControl, NumberControl: () => NumberControl, NumberInput: () => NumberInput, PopoverContent: () => PopoverContent, PopoverGridContainer: () => PopoverGridContainer, PositionControl: () => PositionControl, PromotionTrigger: () => PromotionTrigger, PropKeyProvider: () => PropKeyProvider, PropProvider: () => PropProvider, QueryChipsControl: () => QueryChipsControl, QueryControl: () => QueryControl, QueryFilterRepeaterControl: () => QueryFilterRepeaterControl, RepeatableControl: () => RepeatableControl, Repeater: () => Repeater, SelectControl: () => SelectControl, SelectControlWrapper: () => SelectControlWrapper, SizeComponent: () => SizeComponent, SizeControl: () => SizeControl, StrokeControl: () => StrokeControl, StyledToggleButton: () => StyledToggleButton, StyledToggleButtonGroup: () => StyledToggleButtonGroup, SvgMediaControl: () => SvgMediaControl, SwitchControl: () => SwitchControl, TextAreaControl: () => TextAreaControl, TextControl: () => TextControl, TimeRangeControl: () => TimeRangeControl, TimeStringControl: () => TimeStringControl, ToggleButtonGroupUi: () => ToggleButtonGroupUi, ToggleControl: () => ToggleControl, TransformRepeaterControl: () => TransformRepeaterControl, TransformSettingsControl: () => TransformSettingsControl, TransitionRepeaterControl: () => TransitionRepeaterControl, UnstableSizeControl: () => UnstableSizeControl, UnstableSizeField: () => UnstableSizeField, UrlControl: () => UrlControl, VideoMediaControl: () => VideoMediaControl, createControl: () => createControl, createControlReplacementsRegistry: () => createControlReplacementsRegistry, enqueueFont: () => enqueueFont, getControlReplacements: () => getControlReplacements, injectIntoRepeaterItemActions: () => injectIntoRepeaterItemActions, injectIntoRepeaterItemIcon: () => injectIntoRepeaterItemIcon, injectIntoRepeaterItemLabel: () => injectIntoRepeaterItemLabel, isUnitExtendedOption: () => isUnitExtendedOption, registerControlReplacement: () => registerControlReplacement, trackUpgradePromotionClick: () => trackUpgradePromotionClick, trackViewPromotion: () => trackViewPromotion, transitionProperties: () => transitionProperties, transitionsItemsList: () => transitionsItemsList, useBoundProp: () => useBoundProp, useControlActions: () => useControlActions, useControlReplacement: () => useControlReplacement, useFontFamilies: () => useFontFamilies, useSyncExternalState: () => useSyncExternalState, useTypingBuffer: () => useTypingBuffer }); //#endregion //#region \0elementor-package-library-entry (window.elementorV2 = window.elementorV2 || {}).editorControls = src_exports; //#endregion })(React, elementorV2.editorProps, elementorV2.ui, wp.i18n, elementorV2.utils, elementorV2.query, elementorV2.httpClient, elementorV2.icons, elementorV2.wpMedia, elementorV2.editorUi, ReactDOM, elementorV2.editorResponsive, elementorV2.locations, elementorV2.editorElements, elementorV2.editorV1Adapters, elementorV2.session, elementorV2.editorCurrentUser, elementorV2.env, elementorV2.events, elementorV2.schema); window.elementorV2.editorControls?.init?.(); //# sourceMappingURL=editor-controls.js.map