@elementor/editor-components 3.33.0-215 → 3.33.0-217

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -42,7 +42,7 @@ var import_editor_elements_panel = require("@elementor/editor-elements-panel");
42
42
  var import_editor_styles_repository2 = require("@elementor/editor-styles-repository");
43
43
  var import_editor_v1_adapters3 = require("@elementor/editor-v1-adapters");
44
44
  var import_store18 = require("@elementor/store");
45
- var import_i18n6 = require("@wordpress/i18n");
45
+ var import_i18n7 = require("@wordpress/i18n");
46
46
 
47
47
  // src/component-id-transformer.ts
48
48
  var import_editor_canvas = require("@elementor/editor-canvas");
@@ -58,6 +58,9 @@ var import_store = require("@elementor/store");
58
58
  var import_editor_v1_adapters = require("@elementor/editor-v1-adapters");
59
59
  var import_http_client = require("@elementor/http-client");
60
60
  var BASE_URL = "elementor/v1/components";
61
+ var LOCK_COMPONENT = `${BASE_URL}/lock`;
62
+ var UNLOCK_COMPONENT = `${BASE_URL}/unlock`;
63
+ var BASE_URL_LOCK_STATUS = `${BASE_URL}/lock-status`;
61
64
  var getParams = (id) => ({
62
65
  action: "get_document_config",
63
66
  unique_id: `document-config-${id}`,
@@ -67,7 +70,21 @@ var apiClient = {
67
70
  get: () => (0, import_http_client.httpService)().get(`${BASE_URL}`).then((res) => res.data.data),
68
71
  create: (payload) => (0, import_http_client.httpService)().post(`${BASE_URL}`, payload).then((res) => res.data.data),
69
72
  getComponentConfig: (id) => import_editor_v1_adapters.ajax.load(getParams(id)),
70
- invalidateComponentConfigCache: (id) => import_editor_v1_adapters.ajax.invalidateCache(getParams(id))
73
+ invalidateComponentConfigCache: (id) => import_editor_v1_adapters.ajax.invalidateCache(getParams(id)),
74
+ getComponentLockStatus: async (componentId) => await (0, import_http_client.httpService)().get(`${BASE_URL_LOCK_STATUS}`, {
75
+ params: {
76
+ componentId
77
+ }
78
+ }).then((res) => {
79
+ const { is_current_user_allow_to_edit: isAllowedToSwitchDocument, locked_by: lockedBy } = res.data.data;
80
+ return { isAllowedToSwitchDocument, lockedBy: lockedBy || "" };
81
+ }),
82
+ lockComponent: async (componentId) => await (0, import_http_client.httpService)().post(LOCK_COMPONENT, {
83
+ componentId
84
+ }).then((res) => res.data),
85
+ unlockComponent: async (componentId) => await (0, import_http_client.httpService)().post(UNLOCK_COMPONENT, {
86
+ componentId
87
+ }).then((res) => res.data)
71
88
  };
72
89
 
73
90
  // src/store/thunks.ts
@@ -716,10 +733,29 @@ var generateTempId = () => {
716
733
  return Date.now() + Math.floor(Math.random() * 1e6);
717
734
  };
718
735
 
736
+ // src/components/in-edit-mode.tsx
737
+ var React8 = __toESM(require("react"));
738
+ var import_editor_ui3 = require("@elementor/editor-ui");
739
+ var import_icons5 = require("@elementor/icons");
740
+ var import_ui6 = require("@elementor/ui");
741
+ var import_i18n5 = require("@wordpress/i18n");
742
+ var openEditModeDialog = (lockedBy) => {
743
+ (0, import_editor_ui3.openDialog)({
744
+ component: /* @__PURE__ */ React8.createElement(EditModeDialog, { lockedBy })
745
+ });
746
+ };
747
+ var EditModeDialog = ({ lockedBy }) => {
748
+ const content = (0, import_i18n5.__)("%s is currently editing this document", "elementor").replace("%s", lockedBy);
749
+ return /* @__PURE__ */ React8.createElement(React8.Fragment, null, /* @__PURE__ */ React8.createElement(import_ui6.DialogHeader, { logo: false }, /* @__PURE__ */ React8.createElement(import_ui6.Box, { display: "flex", alignItems: "center", gap: 1 }, /* @__PURE__ */ React8.createElement(import_ui6.Icon, { color: "secondary" }, /* @__PURE__ */ React8.createElement(import_icons5.InfoCircleFilledIcon, { fontSize: "medium" })), /* @__PURE__ */ React8.createElement(import_ui6.Typography, { variant: "subtitle1" }, content))), /* @__PURE__ */ React8.createElement(import_ui6.DialogContent, null, /* @__PURE__ */ React8.createElement(import_ui6.Stack, { spacing: 2, direction: "column" }, /* @__PURE__ */ React8.createElement(import_ui6.Typography, { variant: "body2" }, (0, import_i18n5.__)(
750
+ "You can wait for them to finish or reach out to coordinate your changes together.",
751
+ "elementor"
752
+ )), /* @__PURE__ */ React8.createElement(import_ui6.DialogActions, null, /* @__PURE__ */ React8.createElement(import_ui6.Button, { color: "secondary", variant: "contained", onClick: import_editor_ui3.closeDialog }, (0, import_i18n5.__)("Close", "elementor"))))));
753
+ };
754
+
719
755
  // src/create-component-type.ts
720
756
  var import_editor_canvas3 = require("@elementor/editor-canvas");
721
757
  var import_editor_v1_adapters2 = require("@elementor/editor-v1-adapters");
722
- var import_i18n5 = require("@wordpress/i18n");
758
+ var import_i18n6 = require("@wordpress/i18n");
723
759
  var TYPE = "e-component";
724
760
  function createComponentType(options) {
725
761
  const legacyWindow = window;
@@ -759,26 +795,36 @@ function createComponentView(options) {
759
795
  if (!componentId) {
760
796
  return filteredGroups;
761
797
  }
762
- const newGroup = {
763
- name: "edit component",
764
- actions: [
765
- {
766
- name: "edit component",
767
- icon: "eicon-edit",
768
- title: () => (0, import_i18n5.__)("Edit Component", "elementor"),
769
- isEnabled: () => true,
770
- callback: () => this.switchDocument()
771
- }
772
- ]
773
- };
774
- return [...filteredGroups, newGroup];
798
+ const newGroup = [
799
+ {
800
+ name: "edit component",
801
+ actions: [
802
+ {
803
+ name: "edit component",
804
+ icon: "eicon-edit",
805
+ title: () => (0, import_i18n6.__)("Edit Component", "elementor"),
806
+ isEnabled: () => true,
807
+ callback: () => this.switchDocument()
808
+ }
809
+ ]
810
+ }
811
+ ];
812
+ return [...filteredGroups, ...newGroup];
775
813
  }
776
- switchDocument() {
777
- (0, import_editor_v1_adapters2.__privateRunCommand)("editor/documents/switch", {
778
- id: this.getComponentId().value,
779
- selector: `[data-id="${this.model.get("id")}"]`,
780
- mode: "autosave"
781
- });
814
+ async switchDocument() {
815
+ const { isAllowedToSwitchDocument, lockedBy } = await apiClient.getComponentLockStatus(
816
+ this.getComponentId()?.value
817
+ );
818
+ if (!isAllowedToSwitchDocument) {
819
+ options.showLockedByModal?.(lockedBy || "");
820
+ } else {
821
+ (0, import_editor_v1_adapters2.__privateRunCommand)("editor/documents/switch", {
822
+ id: this.getComponentId()?.value,
823
+ mode: "autosave",
824
+ selector: `[data-id="${this.model.get("id")}"]`
825
+ });
826
+ apiClient.lockComponent(this.getComponentId()?.value);
827
+ }
782
828
  }
783
829
  ui() {
784
830
  return {
@@ -964,7 +1010,10 @@ var COMPONENT_DOCUMENT_TYPE = "elementor_component";
964
1010
  function init() {
965
1011
  import_editor_styles_repository2.stylesRepository.register(componentsStylesProvider);
966
1012
  (0, import_store18.__registerSlice)(slice);
967
- (0, import_editor_canvas4.registerElementType)(TYPE, createComponentType);
1013
+ (0, import_editor_canvas4.registerElementType)(
1014
+ TYPE,
1015
+ (options) => createComponentType({ ...options, showLockedByModal: openEditModeDialog })
1016
+ );
968
1017
  (0, import_editor_v1_adapters3.registerDataHook)("dependency", "editor/documents/close", (args) => {
969
1018
  const document = (0, import_editor_documents.getV1CurrentDocument)();
970
1019
  if (document.config.type === COMPONENT_DOCUMENT_TYPE) {
@@ -975,7 +1024,7 @@ function init() {
975
1024
  window.elementorCommon.__beforeSave = beforeSave;
976
1025
  (0, import_editor_elements_panel.injectTab)({
977
1026
  id: "components",
978
- label: (0, import_i18n6.__)("Components", "elementor"),
1027
+ label: (0, import_i18n7.__)("Components", "elementor"),
979
1028
  component: Components
980
1029
  });
981
1030
  (0, import_editor.injectIntoTop)({
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/init.ts","../src/component-id-transformer.ts","../src/store/store.ts","../src/store/thunks.ts","../src/api.ts","../src/components/components-tab/components.tsx","../src/components/components-tab/component-search.tsx","../src/components/components-tab/search-provider.tsx","../src/components/components-tab/components-list.tsx","../src/hooks/use-components.ts","../src/components/components-tab/components-item.tsx","../src/utils/get-container-for-new-element.ts","../src/components/create-component-form/utils/replace-element-with-component.ts","../src/components/components-tab/loading-components.tsx","../src/components/create-component-form/create-component-form.tsx","../src/components/create-component-form/hooks/use-form.ts","../src/components/create-component-form/utils/component-form-schema.ts","../src/create-component-type.ts","../src/populate-store.ts","../src/store/components-styles-provider.ts","../src/store/load-components-styles.ts","../src/utils/get-component-ids.ts","../src/store/remove-component-styles.ts","../src/utils/before-save.ts"],"sourcesContent":["export { init } from './init';\n","import { injectIntoLogic, injectIntoTop } from '@elementor/editor';\nimport { registerElementType, settingsTransformersRegistry } from '@elementor/editor-canvas';\nimport { getV1CurrentDocument } from '@elementor/editor-documents';\nimport { injectTab } from '@elementor/editor-elements-panel';\nimport { stylesRepository } from '@elementor/editor-styles-repository';\nimport { __privateListenTo as listenTo, commandStartEvent, registerDataHook } from '@elementor/editor-v1-adapters';\nimport { __registerSlice as registerSlice } from '@elementor/store';\nimport { __ } from '@wordpress/i18n';\n\nimport { componentIdTransformer } from './component-id-transformer';\nimport { Components } from './components/components-tab/components';\nimport { CreateComponentForm } from './components/create-component-form/create-component-form';\nimport { createComponentType, TYPE } from './create-component-type';\nimport { PopulateStore } from './populate-store';\nimport { componentsStylesProvider } from './store/components-styles-provider';\nimport { loadComponentsStyles } from './store/load-components-styles';\nimport { removeComponentStyles } from './store/remove-component-styles';\nimport { slice } from './store/store';\nimport { type Element, type ExtendedWindow } from './types';\nimport { beforeSave } from './utils/before-save';\n\nconst COMPONENT_DOCUMENT_TYPE = 'elementor_component';\n\nexport function init() {\n\tstylesRepository.register( componentsStylesProvider );\n\tregisterSlice( slice );\n\tregisterElementType( TYPE, createComponentType );\n\tregisterDataHook( 'dependency', 'editor/documents/close', ( args ) => {\n\t\tconst document = getV1CurrentDocument();\n\t\tif ( document.config.type === COMPONENT_DOCUMENT_TYPE ) {\n\t\t\targs.mode = 'autosave';\n\t\t}\n\t\treturn true;\n\t} );\n\n\t( window as unknown as ExtendedWindow ).elementorCommon.__beforeSave = beforeSave;\n\n\tinjectTab( {\n\t\tid: 'components',\n\t\tlabel: __( 'Components', 'elementor' ),\n\t\tcomponent: Components,\n\t} );\n\n\tinjectIntoTop( {\n\t\tid: 'create-component-popup',\n\t\tcomponent: CreateComponentForm,\n\t} );\n\n\tinjectIntoLogic( {\n\t\tid: 'components-populate-store',\n\t\tcomponent: PopulateStore,\n\t} );\n\n\tlistenTo( commandStartEvent( 'editor/documents/attach-preview' ), () => {\n\t\tconst { id, config } = getV1CurrentDocument();\n\n\t\tif ( id ) {\n\t\t\tremoveComponentStyles( id );\n\t\t}\n\n\t\tloadComponentsStyles( ( config?.elements as Element[] ) ?? [] );\n\t} );\n\n\tsettingsTransformersRegistry.register( 'component-id', componentIdTransformer );\n}\n","import { createTransformer } from '@elementor/editor-canvas';\nimport { __getState as getState } from '@elementor/store';\n\nimport { selectUnpublishedComponents } from './store/store';\n\ntype ComponentIdTransformerWindow = Window & {\n\telementor?: {\n\t\tdocuments?: {\n\t\t\trequest: ( id: number ) => Promise< { elements?: unknown[] } >;\n\t\t};\n\t};\n};\n\nexport const componentIdTransformer = createTransformer( async ( id: number ) => {\n\tconst unpublishedComponents = selectUnpublishedComponents( getState() );\n\n\tconst unpublishedComponent = unpublishedComponents.find( ( component ) => component.id === id );\n\tif ( unpublishedComponent ) {\n\t\treturn structuredClone( unpublishedComponent.elements );\n\t}\n\n\tconst extendedWindow = window as unknown as ComponentIdTransformerWindow;\n\n\tconst documentManager = extendedWindow.elementor?.documents;\n\n\tif ( ! documentManager ) {\n\t\tthrow new Error( 'Elementor documents manager not found' );\n\t}\n\n\tconst data = await documentManager.request( id );\n\n\treturn data.elements ?? [];\n} );\n","import { type V1ElementData } from '@elementor/editor-elements';\nimport {\n\t__createSelector as createSelector,\n\t__createSlice as createSlice,\n\ttype PayloadAction,\n\ttype SliceState,\n} from '@elementor/store';\n\nimport { type Component, type ComponentId, type StylesDefinition } from '../types';\nimport { loadComponents } from './thunks';\n\ntype GetComponentResponse = Component[];\n\nexport type UnpublishedComponent = Component & {\n\telements: V1ElementData[];\n};\n\ntype Status = 'idle' | 'pending' | 'error';\n\ntype ComponentsState = {\n\tdata: Component[];\n\tunpublishedData: UnpublishedComponent[];\n\tloadStatus: Status;\n\tstyles: StylesDefinition;\n};\n\ntype ComponentsSlice = SliceState< typeof slice >;\n\nexport const initialState: ComponentsState = {\n\tdata: [],\n\tunpublishedData: [],\n\tloadStatus: 'idle',\n\tstyles: {},\n};\n\nexport const SLICE_NAME = 'components';\nexport const slice = createSlice( {\n\tname: SLICE_NAME,\n\tinitialState,\n\treducers: {\n\t\tadd: ( state, { payload }: PayloadAction< Component | Component[] > ) => {\n\t\t\tif ( Array.isArray( payload ) ) {\n\t\t\t\tstate.data = [ ...state.data, ...payload ];\n\t\t\t} else {\n\t\t\t\tstate.data.unshift( payload );\n\t\t\t}\n\t\t},\n\t\tload: ( state, { payload }: PayloadAction< Component[] > ) => {\n\t\t\tstate.data = payload;\n\t\t},\n\t\taddUnpublished: ( state, { payload } ) => {\n\t\t\tstate.unpublishedData.unshift( payload );\n\t\t},\n\t\tresetUnpublished: ( state ) => {\n\t\t\tstate.unpublishedData = [];\n\t\t},\n\t\tremoveStyles( state, { payload }: PayloadAction< { id: ComponentId } > ) {\n\t\t\tconst { [ payload.id ]: _, ...rest } = state.styles;\n\n\t\t\tstate.styles = rest;\n\t\t},\n\t\taddStyles: ( state, { payload } ) => {\n\t\t\tstate.styles = { ...state.styles, ...payload };\n\t\t},\n\t},\n\textraReducers: ( builder ) => {\n\t\tbuilder.addCase( loadComponents.fulfilled, ( state, { payload }: PayloadAction< GetComponentResponse > ) => {\n\t\t\tstate.data = payload;\n\t\t\tstate.loadStatus = 'idle';\n\t\t} );\n\t\tbuilder.addCase( loadComponents.pending, ( state ) => {\n\t\t\tstate.loadStatus = 'pending';\n\t\t} );\n\t\tbuilder.addCase( loadComponents.rejected, ( state ) => {\n\t\t\tstate.loadStatus = 'error';\n\t\t} );\n\t},\n} );\n\nconst selectData = ( state: ComponentsSlice ) => state[ SLICE_NAME ].data;\nconst selectLoadStatus = ( state: ComponentsSlice ) => state[ SLICE_NAME ].loadStatus;\nconst selectStylesDefinitions = ( state: ComponentsSlice ) => state[ SLICE_NAME ].styles ?? {};\nconst selectUnpublishedData = ( state: ComponentsSlice ) => state[ SLICE_NAME ].unpublishedData;\n\nexport const selectComponents = createSelector(\n\tselectData,\n\tselectUnpublishedData,\n\t( data: Component[], unpublishedData: UnpublishedComponent[] ) => [\n\t\t...unpublishedData.map( ( item ) => ( { id: item.id, name: item.name } ) ),\n\t\t...data,\n\t]\n);\nexport const selectUnpublishedComponents = createSelector(\n\tselectUnpublishedData,\n\t( unpublishedData: UnpublishedComponent[] ) => unpublishedData\n);\nexport const selectLoadIsPending = createSelector( selectLoadStatus, ( status ) => status === 'pending' );\nexport const selectLoadIsError = createSelector( selectLoadStatus, ( status ) => status === 'error' );\nexport const selectStyles = ( state: ComponentsSlice ) => state[ SLICE_NAME ].styles ?? {};\nexport const selectFlatStyles = createSelector( selectStylesDefinitions, ( data ) => Object.values( data ).flat() );\n","import { __createAsyncThunk as createAsyncThunk } from '@elementor/store';\n\nimport { apiClient } from '../api';\n\nconst loadComponents = createAsyncThunk( 'components/load', async () => {\n\tconst response = await apiClient.get();\n\treturn response;\n} );\n\nexport { loadComponents };\n","import { type V1ElementData } from '@elementor/editor-elements';\nimport { ajax } from '@elementor/editor-v1-adapters';\nimport { type HttpResponse, httpService } from '@elementor/http-client';\n\nimport { type Component, type DocumentStatus } from './types';\n\nconst BASE_URL = 'elementor/v1/components';\n\nexport type CreateComponentPayload = {\n\tstatus: DocumentStatus;\n\titems: Array< {\n\t\ttemp_id: number;\n\t\ttitle: string;\n\t\telements: V1ElementData[];\n\t} >;\n};\n\ntype GetComponentResponse = Array< Component >;\n\nexport type CreateComponentResponse = Record< number, number >;\n\nexport const getParams = ( id: number ) => ( {\n\taction: 'get_document_config',\n\tunique_id: `document-config-${ id }`,\n\tdata: { id },\n} );\n\nexport const apiClient = {\n\tget: () =>\n\t\thttpService()\n\t\t\t.get< HttpResponse< GetComponentResponse > >( `${ BASE_URL }` )\n\t\t\t.then( ( res ) => res.data.data ),\n\tcreate: ( payload: CreateComponentPayload ) =>\n\t\thttpService()\n\t\t\t.post< HttpResponse< CreateComponentResponse > >( `${ BASE_URL }`, payload )\n\t\t\t.then( ( res ) => res.data.data ),\n\tgetComponentConfig: ( id: number ) => ajax.load< { id: number }, V1ElementData >( getParams( id ) ),\n\tinvalidateComponentConfigCache: ( id: number ) => ajax.invalidateCache< { id: number } >( getParams( id ) ),\n};\n","import * as React from 'react';\nimport { ThemeProvider } from '@elementor/editor-ui';\n\nimport { ComponentSearch } from './component-search';\nimport { ComponentsList } from './components-list';\nimport { SearchProvider } from './search-provider';\n\nexport const Components = () => {\n\treturn (\n\t\t<ThemeProvider>\n\t\t\t<SearchProvider localStorageKey=\"elementor-components-search\">\n\t\t\t\t<ComponentSearch />\n\t\t\t\t<ComponentsList />\n\t\t\t</SearchProvider>\n\t\t</ThemeProvider>\n\t);\n};\n","import * as React from 'react';\nimport { SearchIcon } from '@elementor/icons';\nimport { Box, InputAdornment, Stack, TextField } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { useSearch } from './search-provider';\n\nexport const ComponentSearch = () => {\n\tconst { inputValue, handleChange } = useSearch();\n\n\treturn (\n\t\t<Stack direction=\"row\" gap={ 0.5 } sx={ { width: '100%', px: 2, py: 1.5 } }>\n\t\t\t<Box sx={ { flexGrow: 1 } }>\n\t\t\t\t<TextField\n\t\t\t\t\trole={ 'search' }\n\t\t\t\t\tfullWidth\n\t\t\t\t\tsize={ 'tiny' }\n\t\t\t\t\tvalue={ inputValue }\n\t\t\t\t\tplaceholder={ __( 'Search', 'elementor' ) }\n\t\t\t\t\tonChange={ ( e: React.ChangeEvent< HTMLInputElement > ) => handleChange( e.target.value ) }\n\t\t\t\t\tInputProps={ {\n\t\t\t\t\t\tstartAdornment: (\n\t\t\t\t\t\t\t<InputAdornment position=\"start\">\n\t\t\t\t\t\t\t\t<SearchIcon fontSize={ 'tiny' } />\n\t\t\t\t\t\t\t</InputAdornment>\n\t\t\t\t\t\t),\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t</Box>\n\t\t</Stack>\n\t);\n};\n","import * as React from 'react';\nimport { createContext, useContext } from 'react';\nimport { useSearchState, type UseSearchStateResult } from '@elementor/utils';\n\ntype SearchContextType = Pick< UseSearchStateResult, 'handleChange' | 'inputValue' > & {\n\tsearchValue: UseSearchStateResult[ 'debouncedValue' ];\n\tclearSearch: () => void;\n};\n\nconst SearchContext = createContext< SearchContextType | undefined >( undefined );\n\nexport const SearchProvider = ( {\n\tchildren,\n\tlocalStorageKey,\n}: {\n\tchildren: React.ReactNode;\n\tlocalStorageKey: string;\n} ) => {\n\tconst { debouncedValue, handleChange, inputValue } = useSearchState( { localStorageKey } );\n\n\tconst clearSearch = () => {\n\t\thandleChange( '' );\n\t};\n\n\treturn (\n\t\t<SearchContext.Provider value={ { handleChange, clearSearch, searchValue: debouncedValue, inputValue } }>\n\t\t\t{ children }\n\t\t</SearchContext.Provider>\n\t);\n};\n\nexport const useSearch = () => {\n\tconst context = useContext( SearchContext );\n\tif ( ! context ) {\n\t\tthrow new Error( 'useSearch must be used within a SearchProvider' );\n\t}\n\treturn context;\n};\n","import * as React from 'react';\nimport { ComponentsIcon, EyeIcon } from '@elementor/icons';\nimport { Box, Divider, Icon, Link, List, Stack, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { useComponents } from '../../hooks/use-components';\nimport { ComponentItem } from './components-item';\nimport { LoadingComponents } from './loading-components';\nimport { useSearch } from './search-provider';\n\nexport function ComponentsList() {\n\tconst { components, isLoading, searchValue } = useFilteredComponents();\n\n\tif ( isLoading ) {\n\t\treturn <LoadingComponents />;\n\t}\n\tconst isEmpty = ! components || components.length === 0;\n\tif ( isEmpty ) {\n\t\tif ( searchValue.length > 0 ) {\n\t\t\treturn <EmptySearchResult />;\n\t\t}\n\t\treturn <EmptyState />;\n\t}\n\n\treturn (\n\t\t<List sx={ { display: 'flex', flexDirection: 'column', gap: 1, px: 2 } }>\n\t\t\t{ components.map( ( component ) => (\n\t\t\t\t<ComponentItem key={ component.id } component={ component } />\n\t\t\t) ) }\n\t\t</List>\n\t);\n}\n\nconst EmptyState = () => {\n\treturn (\n\t\t<Stack\n\t\t\talignItems=\"center\"\n\t\t\tjustifyContent=\"center\"\n\t\t\theight=\"100%\"\n\t\t\tsx={ { px: 2.5, pt: 10 } }\n\t\t\tgap={ 1.75 }\n\t\t\toverflow=\"hidden\"\n\t\t>\n\t\t\t<Icon fontSize=\"large\">\n\t\t\t\t<EyeIcon fontSize=\"large\" />\n\t\t\t</Icon>\n\t\t\t<Typography align=\"center\" variant=\"subtitle2\" color=\"text.secondary\" fontWeight=\"bold\">\n\t\t\t\t{ __( 'Text that explains that there are no Components yet.', 'elementor' ) }\n\t\t\t</Typography>\n\t\t\t<Typography variant=\"caption\" align=\"center\" color=\"text.secondary\">\n\t\t\t\t{ __(\n\t\t\t\t\t'Once you have Components, this is where you can manage them—rearrange, duplicate, rename and delete irrelevant classes.',\n\t\t\t\t\t'elementor'\n\t\t\t\t) }\n\t\t\t</Typography>\n\t\t\t<Divider sx={ { width: '100%' } } color=\"text.secondary\" />\n\t\t\t<Typography align=\"left\" variant=\"caption\" color=\"text.secondary\">\n\t\t\t\t{ __( 'To create a component, first design it, then choose one of three options:', 'elementor' ) }\n\t\t\t</Typography>\n\t\t\t<Typography\n\t\t\t\talign=\"left\"\n\t\t\t\tvariant=\"caption\"\n\t\t\t\tcolor=\"text.secondary\"\n\t\t\t\tsx={ { display: 'flex', flexDirection: 'column' } }\n\t\t\t>\n\t\t\t\t<span>{ __( '1. Right-click and select Create Component', 'elementor' ) }</span>\n\t\t\t\t<span>{ __( '2. Use the component icon in the Structure panel', 'elementor' ) }</span>\n\t\t\t\t<span>{ __( '3. Use the component icon in the Edit panel header', 'elementor' ) }</span>\n\t\t\t</Typography>\n\t\t</Stack>\n\t);\n};\n\nconst EmptySearchResult = () => {\n\tconst { searchValue, clearSearch } = useSearch();\n\treturn (\n\t\t<Stack\n\t\t\tcolor={ 'text.secondary' }\n\t\t\tpt={ 5 }\n\t\t\talignItems=\"center\"\n\t\t\tgap={ 1 }\n\t\t\toverflow={ 'hidden' }\n\t\t\tjustifySelf={ 'center' }\n\t\t>\n\t\t\t<ComponentsIcon />\n\t\t\t<Box\n\t\t\t\tsx={ {\n\t\t\t\t\twidth: '100%',\n\t\t\t\t} }\n\t\t\t>\n\t\t\t\t<Typography align=\"center\" variant=\"subtitle2\" color=\"inherit\">\n\t\t\t\t\t{ __( 'Sorry, nothing matched', 'elementor' ) }\n\t\t\t\t</Typography>\n\t\t\t\t{ searchValue && (\n\t\t\t\t\t<Typography\n\t\t\t\t\t\tvariant=\"subtitle2\"\n\t\t\t\t\t\tcolor=\"inherit\"\n\t\t\t\t\t\tsx={ {\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t\t\t} }\n\t\t\t\t\t>\n\t\t\t\t\t\t<span>&ldquo;</span>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tstyle={ {\n\t\t\t\t\t\t\t\tmaxWidth: '80%',\n\t\t\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\t\t\ttextOverflow: 'ellipsis',\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ searchValue }\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span>&rdquo;.</span>\n\t\t\t\t\t</Typography>\n\t\t\t\t) }\n\t\t\t</Box>\n\t\t\t<Typography align=\"center\" variant=\"caption\" color=\"inherit\">\n\t\t\t\t{ __( 'Try something else.', 'elementor' ) }\n\t\t\t</Typography>\n\t\t\t<Typography align=\"center\" variant=\"caption\" color=\"inherit\">\n\t\t\t\t<Link color=\"secondary\" variant=\"caption\" component=\"button\" onClick={ clearSearch }>\n\t\t\t\t\t{ __( 'Clear & try again', 'elementor' ) }\n\t\t\t\t</Link>\n\t\t\t</Typography>\n\t\t</Stack>\n\t);\n};\n\nconst useFilteredComponents = () => {\n\tconst { components, isLoading } = useComponents();\n\tconst { searchValue } = useSearch();\n\n\treturn {\n\t\tcomponents: components.filter( ( component ) =>\n\t\t\tcomponent.name.toLowerCase().includes( searchValue.toLowerCase() )\n\t\t),\n\t\tisLoading,\n\t\tsearchValue,\n\t};\n};\n","import { __useSelector as useSelector } from '@elementor/store';\n\nimport { selectComponents, selectLoadIsPending } from '../store/store';\n\nexport const useComponents = () => {\n\tconst components = useSelector( selectComponents );\n\tconst isLoading = useSelector( selectLoadIsPending );\n\n\treturn { components, isLoading };\n};\n","import * as React from 'react';\nimport { endDragElementFromPanel, startDragElementFromPanel } from '@elementor/editor-canvas';\nimport { dropElement, type DropElementParams } from '@elementor/editor-elements';\nimport { ComponentsIcon } from '@elementor/icons';\nimport { Box, ListItemButton, ListItemIcon, ListItemText, Typography } from '@elementor/ui';\n\nimport { type Component } from '../../types';\nimport { getContainerForNewElement } from '../../utils/get-container-for-new-element';\nimport { createComponentModel } from '../create-component-form/utils/replace-element-with-component';\n\nexport const ComponentItem = ( { component }: { component: Component } ) => {\n\tconst componentModel = createComponentModel( { id: component.id, name: component.name } );\n\n\tconst handleClick = () => {\n\t\taddComponentToPage( componentModel );\n\t};\n\n\treturn (\n\t\t<ListItemButton\n\t\t\tdraggable\n\t\t\tonDragStart={ () => startDragElementFromPanel( componentModel ) }\n\t\t\tonDragEnd={ endDragElementFromPanel }\n\t\t\tshape=\"rounded\"\n\t\t\tsx={ { border: 'solid 1px', borderColor: 'divider', py: 0.5, px: 1 } }\n\t\t>\n\t\t\t<Box sx={ { display: 'flex', width: '100%', alignItems: 'center', gap: 1 } } onClick={ handleClick }>\n\t\t\t\t<ListItemIcon size=\"tiny\">\n\t\t\t\t\t<ComponentsIcon fontSize=\"tiny\" />\n\t\t\t\t</ListItemIcon>\n\t\t\t\t<ListItemText\n\t\t\t\t\tprimary={\n\t\t\t\t\t\t<Typography variant=\"caption\" sx={ { color: 'text.primary' } }>\n\t\t\t\t\t\t\t{ component.name }\n\t\t\t\t\t\t</Typography>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</Box>\n\t\t</ListItemButton>\n\t);\n};\n\nconst addComponentToPage = ( model: DropElementParams[ 'model' ] ) => {\n\tconst { container, options } = getContainerForNewElement();\n\n\tif ( ! container ) {\n\t\tthrow new Error( `Can't find container to drop new component instance at` );\n\t}\n\n\tdropElement( {\n\t\tcontainerId: container.id,\n\t\tmodel,\n\t\toptions: { ...options, useHistory: false, scrollIntoView: true },\n\t} );\n};\n","import {\n\tgetContainer,\n\tgetCurrentDocumentContainer,\n\tgetSelectedElements,\n\ttype V1Element,\n} from '@elementor/editor-elements';\n\nexport const getContainerForNewElement = (): { container: V1Element | null; options?: { at: number } } => {\n\tconst currentDocumentContainer = getCurrentDocumentContainer();\n\tconst selectedElement = getSelectedElementContainer();\n\n\tlet container, options;\n\n\tif ( selectedElement ) {\n\t\tswitch ( selectedElement.model.get( 'elType' ) ) {\n\t\t\tcase 'widget': {\n\t\t\t\tcontainer = selectedElement?.parent;\n\n\t\t\t\tconst selectedElIndex = selectedElement.view?._index ?? -1;\n\n\t\t\t\tif ( selectedElIndex > -1 ) {\n\t\t\t\t\toptions = { at: selectedElIndex + 1 };\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'section': {\n\t\t\t\tcontainer = selectedElement?.children?.[ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tcontainer = selectedElement;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { container: container ?? currentDocumentContainer, options };\n};\n\nfunction getSelectedElementContainer() {\n\tconst selectedElements = getSelectedElements();\n\n\tif ( selectedElements.length !== 1 ) {\n\t\treturn undefined;\n\t}\n\n\treturn getContainer( selectedElements[ 0 ].id );\n}\n","import { replaceElement, type V1Element } from '@elementor/editor-elements';\n\nimport { type Component } from '../../../types';\n\nexport const replaceElementWithComponent = ( element: V1Element, component: Component ) => {\n\treplaceElement( {\n\t\tcurrentElement: element,\n\t\tnewElement: createComponentModel( component ),\n\t\twithHistory: false,\n\t} );\n};\n\nexport const createComponentModel = ( component: Component ) => {\n\treturn {\n\t\telType: 'widget',\n\t\twidgetType: 'e-component',\n\t\tsettings: {\n\t\t\tcomponent: {\n\t\t\t\t$$type: 'component-id',\n\t\t\t\tvalue: component.id,\n\t\t\t},\n\t\t},\n\t\teditor_settings: {\n\t\t\ttitle: component.name,\n\t\t},\n\t};\n};\n","import * as React from 'react';\nimport { Box, ListItemButton, Skeleton, Stack } from '@elementor/ui';\nconst ROWS_COUNT = 6;\n\nconst rows = Array.from( { length: ROWS_COUNT }, ( _, index ) => index );\n\nexport const LoadingComponents = () => {\n\treturn (\n\t\t<Stack\n\t\t\taria-label=\"Loading components\"\n\t\t\tgap={ 1 }\n\t\t\tsx={ {\n\t\t\t\tpointerEvents: 'none',\n\t\t\t\tposition: 'relative',\n\t\t\t\tmaxHeight: '300px',\n\t\t\t\toverflow: 'hidden',\n\t\t\t\t'&:after': {\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tcontent: '\"\"',\n\t\t\t\t\tleft: 0,\n\t\t\t\t\twidth: '100%',\n\t\t\t\t\theight: '300px',\n\t\t\t\t\tbackground: 'linear-gradient(to top, white, transparent)',\n\t\t\t\t\tpointerEvents: 'none',\n\t\t\t\t},\n\t\t\t} }\n\t\t>\n\t\t\t{ rows.map( ( row ) => (\n\t\t\t\t<ListItemButton\n\t\t\t\t\tkey={ row }\n\t\t\t\t\tsx={ { border: 'solid 1px', borderColor: 'divider', py: 0.5, px: 1 } }\n\t\t\t\t\tshape=\"rounded\"\n\t\t\t\t>\n\t\t\t\t\t<Box display=\"flex\" gap={ 1 } width=\"100%\">\n\t\t\t\t\t\t<Skeleton variant=\"text\" width={ '24px' } height={ '36px' } />\n\t\t\t\t\t\t<Skeleton variant=\"text\" width={ '100%' } height={ '36px' } />\n\t\t\t\t\t</Box>\n\t\t\t\t</ListItemButton>\n\t\t\t) ) }\n\t\t</Stack>\n\t);\n};\n","import * as React from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { getElementLabel, type V1Element } from '@elementor/editor-elements';\nimport { ThemeProvider } from '@elementor/editor-ui';\nimport { StarIcon } from '@elementor/icons';\nimport { __useDispatch as useDispatch } from '@elementor/store';\nimport { Alert, Button, FormLabel, Grid, Popover, Snackbar, Stack, TextField, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { useComponents } from '../../hooks/use-components';\nimport { slice } from '../../store/store';\nimport { type ComponentFormValues } from '../../types';\nimport { useForm } from './hooks/use-form';\nimport { createBaseComponentSchema, createSubmitComponentSchema } from './utils/component-form-schema';\nimport { replaceElementWithComponent } from './utils/replace-element-with-component';\n\ntype SaveAsComponentEventData = {\n\telement: V1Element;\n\tanchorPosition: { top: number; left: number };\n};\n\ntype ResultNotification = {\n\tshow: boolean;\n\tmessage: string;\n\ttype: 'success' | 'error';\n};\n\nexport function CreateComponentForm() {\n\tconst [ element, setElement ] = useState< {\n\t\telement: V1Element;\n\t\telementLabel: string;\n\t} | null >( null );\n\n\tconst [ anchorPosition, setAnchorPosition ] = useState< { top: number; left: number } >();\n\n\tconst [ resultNotification, setResultNotification ] = useState< ResultNotification | null >( null );\n\n\tconst dispatch = useDispatch();\n\n\tuseEffect( () => {\n\t\tconst OPEN_SAVE_AS_COMPONENT_FORM_EVENT = 'elementor/editor/open-save-as-component-form';\n\n\t\tconst openPopup = ( event: CustomEvent< SaveAsComponentEventData > ) => {\n\t\t\tsetElement( { element: event.detail.element, elementLabel: getElementLabel( event.detail.element.id ) } );\n\t\t\tsetAnchorPosition( event.detail.anchorPosition );\n\t\t};\n\n\t\twindow.addEventListener( OPEN_SAVE_AS_COMPONENT_FORM_EVENT, openPopup as EventListener );\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener( OPEN_SAVE_AS_COMPONENT_FORM_EVENT, openPopup as EventListener );\n\t\t};\n\t}, [] );\n\n\tconst handleSave = async ( values: ComponentFormValues ) => {\n\t\ttry {\n\t\t\tif ( ! element ) {\n\t\t\t\tthrow new Error( `Can't save element as component: element not found` );\n\t\t\t}\n\n\t\t\tconst tempId = generateTempId();\n\n\t\t\tdispatch(\n\t\t\t\tslice.actions.addUnpublished( {\n\t\t\t\t\tid: tempId,\n\t\t\t\t\tname: values.componentName,\n\t\t\t\t\telements: [ element.element.model.toJSON( { remove: [ 'default' ] } ) ],\n\t\t\t\t} )\n\t\t\t);\n\n\t\t\treplaceElementWithComponent( element.element, {\n\t\t\t\tid: tempId,\n\t\t\t\tname: values.componentName,\n\t\t\t} );\n\n\t\t\tsetResultNotification( {\n\t\t\t\tshow: true,\n\t\t\t\t// Translators: %1$s: Component name, %2$s: Component temp ID\n\t\t\t\tmessage: __( 'Component saved successfully as: %1$s (temp ID: %2$s)', 'elementor' )\n\t\t\t\t\t.replace( '%1$s', values.componentName )\n\t\t\t\t\t.replace( '%2$s', tempId.toString() ),\n\t\t\t\ttype: 'success',\n\t\t\t} );\n\n\t\t\tresetAndClosePopup();\n\t\t} catch {\n\t\t\tconst errorMessage = __( 'Failed to save component. Please try again.', 'elementor' );\n\t\t\tsetResultNotification( {\n\t\t\t\tshow: true,\n\t\t\t\tmessage: errorMessage,\n\t\t\t\ttype: 'error',\n\t\t\t} );\n\t\t}\n\t};\n\n\tconst resetAndClosePopup = () => {\n\t\tsetElement( null );\n\t\tsetAnchorPosition( undefined );\n\t};\n\n\treturn (\n\t\t<ThemeProvider>\n\t\t\t<Popover\n\t\t\t\topen={ element !== null }\n\t\t\t\tonClose={ resetAndClosePopup }\n\t\t\t\tanchorReference=\"anchorPosition\"\n\t\t\t\tanchorPosition={ anchorPosition }\n\t\t\t>\n\t\t\t\t{ element !== null && (\n\t\t\t\t\t<Form\n\t\t\t\t\t\tinitialValues={ { componentName: element.elementLabel } }\n\t\t\t\t\t\thandleSave={ handleSave }\n\t\t\t\t\t\tclosePopup={ resetAndClosePopup }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t</Popover>\n\t\t\t<Snackbar open={ resultNotification?.show } onClose={ () => setResultNotification( null ) }>\n\t\t\t\t<Alert\n\t\t\t\t\tonClose={ () => setResultNotification( null ) }\n\t\t\t\t\tseverity={ resultNotification?.type }\n\t\t\t\t\tsx={ { width: '100%' } }\n\t\t\t\t>\n\t\t\t\t\t{ resultNotification?.message }\n\t\t\t\t</Alert>\n\t\t\t</Snackbar>\n\t\t</ThemeProvider>\n\t);\n}\n\nconst FONT_SIZE = 'tiny';\n\nconst Form = ( {\n\tinitialValues,\n\thandleSave,\n\tclosePopup,\n}: {\n\tinitialValues: ComponentFormValues;\n\thandleSave: ( values: ComponentFormValues ) => void;\n\tclosePopup: () => void;\n} ) => {\n\tconst { values, errors, isValid, handleChange, validateForm } = useForm< ComponentFormValues >( initialValues );\n\n\tconst { components } = useComponents();\n\n\tconst existingComponentNames = useMemo( () => {\n\t\treturn components?.map( ( component ) => component.name ) ?? [];\n\t}, [ components ] );\n\n\tconst changeValidationSchema = useMemo(\n\t\t() => createBaseComponentSchema( existingComponentNames ),\n\t\t[ existingComponentNames ]\n\t);\n\tconst submitValidationSchema = useMemo(\n\t\t() => createSubmitComponentSchema( existingComponentNames ),\n\t\t[ existingComponentNames ]\n\t);\n\n\tconst handleSubmit = () => {\n\t\tconst { success, parsedValues } = validateForm( submitValidationSchema );\n\n\t\tif ( success ) {\n\t\t\thandleSave( parsedValues );\n\t\t}\n\t};\n\n\treturn (\n\t\t<Stack alignItems=\"start\" width=\"268px\">\n\t\t\t<Stack\n\t\t\t\tdirection=\"row\"\n\t\t\t\talignItems=\"center\"\n\t\t\t\tpy={ 1 }\n\t\t\t\tpx={ 1.5 }\n\t\t\t\tsx={ { columnGap: 0.5, borderBottom: '1px solid', borderColor: 'divider', width: '100%' } }\n\t\t\t>\n\t\t\t\t<StarIcon fontSize={ FONT_SIZE } />\n\t\t\t\t<Typography variant=\"caption\" sx={ { color: 'text.primary', fontWeight: '500', lineHeight: 1 } }>\n\t\t\t\t\t{ __( 'Save as a component', 'elementor' ) }\n\t\t\t\t</Typography>\n\t\t\t</Stack>\n\t\t\t<Grid container gap={ 0.75 } alignItems=\"start\" p={ 1.5 }>\n\t\t\t\t<Grid item xs={ 12 }>\n\t\t\t\t\t<FormLabel htmlFor={ 'component-name' } size=\"tiny\">\n\t\t\t\t\t\t{ __( 'Name', 'elementor' ) }\n\t\t\t\t\t</FormLabel>\n\t\t\t\t</Grid>\n\t\t\t\t<Grid item xs={ 12 }>\n\t\t\t\t\t<TextField\n\t\t\t\t\t\tid={ 'component-name' }\n\t\t\t\t\t\tsize={ FONT_SIZE }\n\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\tvalue={ values.componentName }\n\t\t\t\t\t\tonChange={ ( e: React.ChangeEvent< HTMLInputElement > ) =>\n\t\t\t\t\t\t\thandleChange( e, 'componentName', changeValidationSchema )\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinputProps={ { style: { color: 'text.primary', fontWeight: '600' } } }\n\t\t\t\t\t\terror={ Boolean( errors.componentName ) }\n\t\t\t\t\t\thelperText={ errors.componentName }\n\t\t\t\t\t/>\n\t\t\t\t</Grid>\n\t\t\t</Grid>\n\t\t\t<Stack direction=\"row\" justifyContent=\"flex-end\" alignSelf=\"end\" py={ 1 } px={ 1.5 }>\n\t\t\t\t<Button onClick={ closePopup } color=\"secondary\" variant=\"text\" size=\"small\">\n\t\t\t\t\t{ __( 'Cancel', 'elementor' ) }\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\tonClick={ handleSubmit }\n\t\t\t\t\tdisabled={ ! isValid }\n\t\t\t\t\tvariant=\"contained\"\n\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t>\n\t\t\t\t\t{ __( 'Create', 'elementor' ) }\n\t\t\t\t</Button>\n\t\t\t</Stack>\n\t\t</Stack>\n\t);\n};\n\nexport const generateTempId = () => {\n\treturn Date.now() + Math.floor( Math.random() * 1000000 );\n};\n","import { useMemo, useState } from 'react';\nimport { type z } from '@elementor/schema';\n\nexport const useForm = < TValues extends Record< string, unknown > >( initialValues: TValues ) => {\n\tconst [ values, setValues ] = useState< TValues >( initialValues );\n\tconst [ errors, setErrors ] = useState< Partial< Record< keyof TValues, string > > >( {} );\n\n\tconst isValid = useMemo( () => {\n\t\treturn ! Object.values( errors ).some( ( error ) => error );\n\t}, [ errors ] );\n\n\tconst handleChange = (\n\t\te: React.ChangeEvent< HTMLInputElement >,\n\t\tfield: keyof TValues,\n\t\tvalidationSchema: z.ZodType< TValues >\n\t) => {\n\t\tconst updated = { ...values, [ field ]: e.target.value };\n\t\tsetValues( updated );\n\n\t\tconst { success, errors: validationErrors } = validateForm( updated, validationSchema );\n\n\t\tif ( ! success ) {\n\t\t\tsetErrors( validationErrors );\n\t\t} else {\n\t\t\tsetErrors( {} );\n\t\t}\n\t};\n\n\tconst validate = (\n\t\tvalidationSchema: z.ZodType< TValues >\n\t): { success: true; parsedValues: TValues } | { success: false; parsedValues?: never } => {\n\t\tconst { success, errors: validationErrors, parsedValues } = validateForm( values, validationSchema );\n\n\t\tif ( ! success ) {\n\t\t\tsetErrors( validationErrors );\n\t\t\treturn { success };\n\t\t}\n\t\tsetErrors( {} );\n\t\treturn { success, parsedValues };\n\t};\n\n\treturn {\n\t\tvalues,\n\t\terrors,\n\t\tisValid,\n\t\thandleChange,\n\t\tvalidateForm: validate,\n\t};\n};\n\nconst validateForm = < TValues extends Record< string, unknown > >(\n\tvalues: TValues,\n\tschema: z.ZodType< TValues >\n):\n\t| { success: false; parsedValues?: never; errors: Partial< Record< keyof TValues, string > > }\n\t| { success: true; parsedValues: TValues; errors?: never } => {\n\tconst result = schema.safeParse( values );\n\n\tif ( result.success ) {\n\t\treturn { success: true, parsedValues: result.data };\n\t}\n\n\tconst errors = {} as Partial< Record< keyof TValues, string > >;\n\n\t( Object.entries( result.error.formErrors.fieldErrors ) as Array< [ keyof TValues, string[] ] > ).forEach(\n\t\t( [ field, error ] ) => {\n\t\t\terrors[ field ] = error[ 0 ];\n\t\t}\n\t);\n\n\treturn { success: false, errors };\n};\n","import { z } from '@elementor/schema';\nimport { __ } from '@wordpress/i18n';\n\nconst MIN_NAME_LENGTH = 2;\nconst MAX_NAME_LENGTH = 50;\n\nexport const createBaseComponentSchema = ( existingNames: string[] ) => {\n\treturn z.object( {\n\t\tcomponentName: z\n\t\t\t.string()\n\t\t\t.trim()\n\t\t\t.max(\n\t\t\t\tMAX_NAME_LENGTH,\n\t\t\t\t__( 'Component name is too long. Please keep it under 50 characters.', 'elementor' )\n\t\t\t)\n\t\t\t.refine( ( value ) => ! existingNames.includes( value ), {\n\t\t\t\tmessage: __( 'Component name already exists', 'elementor' ),\n\t\t\t} ),\n\t} );\n};\n\nexport const createSubmitComponentSchema = ( existingNames: string[] ) => {\n\tconst baseSchema = createBaseComponentSchema( existingNames );\n\n\treturn baseSchema.extend( {\n\t\tcomponentName: baseSchema.shape.componentName\n\t\t\t.refine( ( value ) => value.length > 0, {\n\t\t\t\tmessage: __( 'Component name is required.', 'elementor' ),\n\t\t\t} )\n\t\t\t.refine( ( value ) => value.length >= MIN_NAME_LENGTH, {\n\t\t\t\tmessage: __( 'Component name is too short. Please enter at least 2 characters.', 'elementor' ),\n\t\t\t} ),\n\t} );\n};\n","import {\n\ttype CreateTemplatedElementTypeOptions,\n\tcreateTemplatedElementView,\n\ttype ElementType,\n\ttype ElementView,\n\ttype LegacyWindow,\n} from '@elementor/editor-canvas';\nimport { type NumberPropValue } from '@elementor/editor-props';\nimport { __privateRunCommand as runCommand } from '@elementor/editor-v1-adapters';\nimport { __ } from '@wordpress/i18n';\n\nexport const TYPE = 'e-component';\n\nexport function createComponentType( options: CreateTemplatedElementTypeOptions ): typeof ElementType {\n\tconst legacyWindow = window as unknown as LegacyWindow;\n\n\treturn class extends legacyWindow.elementor.modules.elements.types.Widget {\n\t\tgetType() {\n\t\t\treturn options.type;\n\t\t}\n\n\t\tgetView() {\n\t\t\treturn createComponentView( options );\n\t\t}\n\t};\n}\n\nfunction createComponentView( options: CreateTemplatedElementTypeOptions ): typeof ElementView {\n\treturn class extends createTemplatedElementView( options ) {\n\t\tlegacyWindow = window as unknown as LegacyWindow;\n\n\t\tafterSettingsResolve( settings: { [ key: string ]: unknown } ) {\n\t\t\tif ( settings.component ) {\n\t\t\t\tthis.collection = this.legacyWindow.elementor.createBackboneElementsCollection( settings.component );\n\n\t\t\t\tsettings.component = '<template data-children-placeholder></template>';\n\t\t\t}\n\n\t\t\treturn settings;\n\t\t}\n\n\t\tattachBuffer( collectionView: this, buffer: DocumentFragment ): void {\n\t\t\tconst childrenPlaceholder = collectionView.$el.find( '[data-children-placeholder]' ).get( 0 );\n\n\t\t\tif ( ! childrenPlaceholder ) {\n\t\t\t\tsuper.attachBuffer( collectionView, buffer );\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tchildrenPlaceholder.replaceWith( buffer );\n\t\t}\n\n\t\tgetComponentId() {\n\t\t\treturn this.options?.model?.get( 'settings' )?.get( 'component' ) as NumberPropValue;\n\t\t}\n\n\t\tgetContextMenuGroups() {\n\t\t\tconst filteredGroups = super.getContextMenuGroups().filter( ( group ) => group.name !== 'save' );\n\t\t\tconst componentId = this.getComponentId()?.value;\n\n\t\t\tif ( ! componentId ) {\n\t\t\t\treturn filteredGroups;\n\t\t\t}\n\n\t\t\tconst newGroup = {\n\t\t\t\tname: 'edit component',\n\t\t\t\tactions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'edit component',\n\t\t\t\t\t\ticon: 'eicon-edit',\n\t\t\t\t\t\ttitle: () => __( 'Edit Component', 'elementor' ),\n\t\t\t\t\t\tisEnabled: () => true,\n\t\t\t\t\t\tcallback: () => this.switchDocument(),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t\treturn [ ...filteredGroups, newGroup ];\n\t\t}\n\n\t\tswitchDocument() {\n\t\t\trunCommand( 'editor/documents/switch', {\n\t\t\t\tid: this.getComponentId().value,\n\t\t\t\tselector: `[data-id=\"${ this.model.get( 'id' ) }\"]`,\n\t\t\t\tmode: 'autosave',\n\t\t\t} );\n\t\t}\n\n\t\tui() {\n\t\t\treturn {\n\t\t\t\t...super.ui(),\n\t\t\t\tdoubleClick: '.e-component:not(:has(.elementor-edit-area))',\n\t\t\t};\n\t\t}\n\n\t\tevents() {\n\t\t\treturn {\n\t\t\t\t...super.events(),\n\t\t\t\t'dblclick @ui.doubleClick': this.switchDocument,\n\t\t\t};\n\t\t}\n\t};\n}\n","import { useEffect } from 'react';\nimport { __dispatch as dispatch } from '@elementor/store';\n\nimport { loadComponents } from './store/thunks';\n\nexport function PopulateStore() {\n\tuseEffect( () => {\n\t\tdispatch( loadComponents() );\n\t}, [] );\n\n\treturn null;\n}\n","import { createStylesProvider } from '@elementor/editor-styles-repository';\nimport { __getState as getState, __subscribeWithSelector as subscribeWithSelector } from '@elementor/store';\n\nimport { selectFlatStyles, SLICE_NAME } from './store';\n\nexport const componentsStylesProvider = createStylesProvider( {\n\tkey: 'components-styles',\n\tpriority: 100,\n\tsubscribe: ( cb ) =>\n\t\tsubscribeWithSelector(\n\t\t\t( state ) => state[ SLICE_NAME ],\n\t\t\t() => {\n\t\t\t\tcb();\n\t\t\t}\n\t\t),\n\tactions: {\n\t\tall: () => {\n\t\t\treturn selectFlatStyles( getState() );\n\t\t},\n\t\tget: ( id ) => {\n\t\t\treturn selectFlatStyles( getState() ).find( ( style ) => style.id === id ) ?? null;\n\t\t},\n\t},\n} );\n","import { type V1ElementData } from '@elementor/editor-elements';\nimport { type StyleDefinition } from '@elementor/editor-styles';\nimport { __dispatch as dispatch, __getState as getState } from '@elementor/store';\n\nimport { apiClient } from '../api';\nimport { type ComponentId, type Element } from '../types';\nimport { getComponentIds } from '../utils/get-component-ids';\nimport { selectStyles, slice } from './store';\n\nexport async function loadComponentsStyles( elements: Element[] ) {\n\tconst componentIds = Array.from( new Set( getComponentIds( elements ) ) );\n\n\tif ( ! componentIds.length ) {\n\t\treturn;\n\t}\n\n\tconst knownComponents = selectStyles( getState() );\n\tconst unknownComponentIds = componentIds.filter( ( id ) => ! knownComponents[ id ] );\n\n\tif ( ! unknownComponentIds.length ) {\n\t\treturn;\n\t}\n\n\taddComponentStyles( unknownComponentIds );\n}\n\nasync function addComponentStyles( ids: ComponentId[] ) {\n\tconst newComponents = await loadStyles( ids );\n\n\taddStyles( newComponents );\n\n\tObject.values( newComponents ).forEach( ( [ , data ] ) => {\n\t\tloadComponentsStyles( data.elements as Element[] );\n\t} );\n}\n\nasync function loadStyles( ids: number[] ): Promise< [ number, V1ElementData ][] > {\n\treturn Promise.all( ids.map( async ( id ) => [ id, await apiClient.getComponentConfig( id ) ] ) );\n}\n\nfunction addStyles( data: ( readonly [ ComponentId, V1ElementData ] )[] ) {\n\tconst styles = Object.fromEntries(\n\t\tdata.map( ( [ componentId, componentData ] ) => [ componentId, extractStyles( componentData ) ] )\n\t);\n\n\tdispatch( slice.actions.addStyles( styles ) );\n}\n\nfunction extractStyles( element: V1ElementData ): Array< StyleDefinition > {\n\treturn [ ...Object.values( element.styles ?? {} ), ...( element.elements ?? [] ).flatMap( extractStyles ) ];\n}\n","import { type V1ElementData } from '@elementor/editor-elements';\nimport { isTransformable } from '@elementor/editor-props';\n\nexport const getComponentIds = ( elements: V1ElementData[] ) => {\n\treturn elements.flatMap( ( element ) => {\n\t\tconst ids: number[] = [];\n\n\t\tconst type = element.widgetType || element.elType;\n\n\t\tif ( type === 'e-component' && element.settings?.component && isTransformable( element.settings?.component ) ) {\n\t\t\tids.push( element.settings.component.value );\n\t\t}\n\n\t\tif ( element.elements ) {\n\t\t\tids.push( ...getComponentIds( element.elements ) );\n\t\t}\n\n\t\treturn ids;\n\t} );\n};\n","import { __dispatch as dispatch } from '@elementor/store';\n\nimport { apiClient } from '../api';\nimport { slice } from './store';\n\nexport function removeComponentStyles( id: number ) {\n\tapiClient.invalidateComponentConfigCache( id );\n\tdispatch( slice.actions.removeStyles( { id } ) );\n}\n","import { updateElementSettings, type V1ElementData } from '@elementor/editor-elements';\nimport { type TransformablePropValue } from '@elementor/editor-props';\nimport { __dispatch as dispatch, __getState as getState } from '@elementor/store';\n\nimport { apiClient } from '../api';\nimport { selectUnpublishedComponents, slice, type UnpublishedComponent } from '../store/store';\nimport { type DocumentStatus } from '../types';\n\ntype Container = {\n\tmodel: {\n\t\tget: ( key: 'elements' ) => {\n\t\t\ttoJSON: () => V1ElementData[];\n\t\t};\n\t};\n};\n\nexport const beforeSave = async ( { container, status }: { container: Container; status: DocumentStatus } ) => {\n\tconst unpublishedComponents = selectUnpublishedComponents( getState() );\n\n\tif ( ! unpublishedComponents.length ) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst tempIdToComponentId = await createComponents( unpublishedComponents, status );\n\n\t\tconst elements = container.model.get( 'elements' ).toJSON();\n\t\tupdateComponentInstances( elements, tempIdToComponentId );\n\n\t\tdispatch(\n\t\t\tslice.actions.add(\n\t\t\t\tunpublishedComponents.map( ( component ) => ( {\n\t\t\t\t\tid: tempIdToComponentId.get( component.id ) as number,\n\t\t\t\t\tname: component.name,\n\t\t\t\t} ) )\n\t\t\t)\n\t\t);\n\t\tdispatch( slice.actions.resetUnpublished() );\n\t} catch ( error ) {\n\t\tthrow new Error( `Failed to publish components and update component instances: ${ error }` );\n\t}\n};\n\nasync function createComponents(\n\tcomponents: UnpublishedComponent[],\n\tstatus: DocumentStatus\n): Promise< Map< number, number > > {\n\tconst response = await apiClient.create( {\n\t\tstatus,\n\t\titems: components.map( ( component ) => ( {\n\t\t\ttemp_id: component.id,\n\t\t\ttitle: component.name,\n\t\t\telements: component.elements,\n\t\t} ) ),\n\t} );\n\n\tconst map = new Map< number, number >();\n\n\tObject.entries( response ).forEach( ( [ key, value ] ) => {\n\t\tmap.set( Number( key ), value );\n\t} );\n\n\treturn map;\n}\n\nfunction updateComponentInstances( elements: V1ElementData[], tempIdToComponentId: Map< number, number > ): void {\n\telements.forEach( ( element ) => {\n\t\tconst { shouldUpdate, newComponentId } = shouldUpdateElement( element, tempIdToComponentId );\n\t\tif ( shouldUpdate ) {\n\t\t\tupdateElementComponentId( element.id, newComponentId );\n\t\t}\n\n\t\tif ( element.elements ) {\n\t\t\tupdateComponentInstances( element.elements, tempIdToComponentId );\n\t\t}\n\t} );\n}\n\nfunction shouldUpdateElement(\n\telement: V1ElementData,\n\ttempIdToComponentId: Map< number, number >\n): { shouldUpdate: true; newComponentId: number } | { shouldUpdate: false; newComponentId: null } {\n\tif ( element.widgetType === 'e-component' ) {\n\t\tconst currentComponentId = ( element.settings?.component as TransformablePropValue< 'component-id', number > )\n\t\t\t?.value;\n\t\tif ( currentComponentId && tempIdToComponentId.has( currentComponentId ) ) {\n\t\t\treturn { shouldUpdate: true, newComponentId: tempIdToComponentId.get( currentComponentId ) as number };\n\t\t}\n\t}\n\treturn { shouldUpdate: false, newComponentId: null };\n}\n\nfunction updateElementComponentId( elementId: string, componentId: number ): void {\n\tupdateElementSettings( {\n\t\tid: elementId,\n\t\tprops: {\n\t\t\tcomponent: {\n\t\t\t\t$$type: 'component-id',\n\t\t\t\tvalue: componentId,\n\t\t\t},\n\t\t},\n\t\twithHistory: false,\n\t} );\n}\n"],"mappings":"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","names":["import_editor_canvas","import_editor_styles_repository","import_editor_v1_adapters","import_store","import_i18n","import_store","import_store","createAsyncThunk","createSlice","createSelector","getState","React","React","React","import_icons","import_ui","import_i18n","import_store","useSelector","React","import_editor_canvas","import_editor_elements","import_icons","import_ui","import_editor_elements","React","import_ui","React","import_react","import_editor_elements","import_editor_ui","import_icons","import_store","import_ui","import_i18n","import_react","import_i18n","dispatch","useDispatch","validateForm","import_editor_canvas","import_editor_v1_adapters","import_i18n","runCommand","import_react","import_store","dispatch","import_store","subscribeWithSelector","getState","import_store","getState","dispatch","import_store","dispatch","import_editor_elements","import_store","getState","dispatch","registerSlice","listenTo"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/init.ts","../src/component-id-transformer.ts","../src/store/store.ts","../src/store/thunks.ts","../src/api.ts","../src/components/components-tab/components.tsx","../src/components/components-tab/component-search.tsx","../src/components/components-tab/search-provider.tsx","../src/components/components-tab/components-list.tsx","../src/hooks/use-components.ts","../src/components/components-tab/components-item.tsx","../src/utils/get-container-for-new-element.ts","../src/components/create-component-form/utils/replace-element-with-component.ts","../src/components/components-tab/loading-components.tsx","../src/components/create-component-form/create-component-form.tsx","../src/components/create-component-form/hooks/use-form.ts","../src/components/create-component-form/utils/component-form-schema.ts","../src/components/in-edit-mode.tsx","../src/create-component-type.ts","../src/populate-store.ts","../src/store/components-styles-provider.ts","../src/store/load-components-styles.ts","../src/utils/get-component-ids.ts","../src/store/remove-component-styles.ts","../src/utils/before-save.ts"],"sourcesContent":["export { init } from './init';\n","import { injectIntoLogic, injectIntoTop } from '@elementor/editor';\nimport {\n\ttype CreateTemplatedElementTypeOptions,\n\tregisterElementType,\n\tsettingsTransformersRegistry,\n} from '@elementor/editor-canvas';\nimport { getV1CurrentDocument } from '@elementor/editor-documents';\nimport { injectTab } from '@elementor/editor-elements-panel';\nimport { stylesRepository } from '@elementor/editor-styles-repository';\nimport { __privateListenTo as listenTo, commandStartEvent, registerDataHook } from '@elementor/editor-v1-adapters';\nimport { __registerSlice as registerSlice } from '@elementor/store';\nimport { __ } from '@wordpress/i18n';\n\nimport { componentIdTransformer } from './component-id-transformer';\nimport { Components } from './components/components-tab/components';\nimport { CreateComponentForm } from './components/create-component-form/create-component-form';\nimport { openEditModeDialog } from './components/in-edit-mode';\nimport { createComponentType, TYPE } from './create-component-type';\nimport { PopulateStore } from './populate-store';\nimport { componentsStylesProvider } from './store/components-styles-provider';\nimport { loadComponentsStyles } from './store/load-components-styles';\nimport { removeComponentStyles } from './store/remove-component-styles';\nimport { slice } from './store/store';\nimport { type Element, type ExtendedWindow } from './types';\nimport { beforeSave } from './utils/before-save';\n\nconst COMPONENT_DOCUMENT_TYPE = 'elementor_component';\n\nexport function init() {\n\tstylesRepository.register( componentsStylesProvider );\n\tregisterSlice( slice );\n\tregisterElementType( TYPE, ( options: CreateTemplatedElementTypeOptions ) =>\n\t\tcreateComponentType( { ...options, showLockedByModal: openEditModeDialog } )\n\t);\n\tregisterDataHook( 'dependency', 'editor/documents/close', ( args ) => {\n\t\tconst document = getV1CurrentDocument();\n\t\tif ( document.config.type === COMPONENT_DOCUMENT_TYPE ) {\n\t\t\targs.mode = 'autosave';\n\t\t}\n\t\treturn true;\n\t} );\n\n\t( window as unknown as ExtendedWindow ).elementorCommon.__beforeSave = beforeSave;\n\n\tinjectTab( {\n\t\tid: 'components',\n\t\tlabel: __( 'Components', 'elementor' ),\n\t\tcomponent: Components,\n\t} );\n\n\tinjectIntoTop( {\n\t\tid: 'create-component-popup',\n\t\tcomponent: CreateComponentForm,\n\t} );\n\n\tinjectIntoLogic( {\n\t\tid: 'components-populate-store',\n\t\tcomponent: PopulateStore,\n\t} );\n\n\tlistenTo( commandStartEvent( 'editor/documents/attach-preview' ), () => {\n\t\tconst { id, config } = getV1CurrentDocument();\n\n\t\tif ( id ) {\n\t\t\tremoveComponentStyles( id );\n\t\t}\n\n\t\tloadComponentsStyles( ( config?.elements as Element[] ) ?? [] );\n\t} );\n\n\tsettingsTransformersRegistry.register( 'component-id', componentIdTransformer );\n}\n","import { createTransformer } from '@elementor/editor-canvas';\nimport { __getState as getState } from '@elementor/store';\n\nimport { selectUnpublishedComponents } from './store/store';\n\ntype ComponentIdTransformerWindow = Window & {\n\telementor?: {\n\t\tdocuments?: {\n\t\t\trequest: ( id: number ) => Promise< { elements?: unknown[] } >;\n\t\t};\n\t};\n};\n\nexport const componentIdTransformer = createTransformer( async ( id: number ) => {\n\tconst unpublishedComponents = selectUnpublishedComponents( getState() );\n\n\tconst unpublishedComponent = unpublishedComponents.find( ( component ) => component.id === id );\n\tif ( unpublishedComponent ) {\n\t\treturn structuredClone( unpublishedComponent.elements );\n\t}\n\n\tconst extendedWindow = window as unknown as ComponentIdTransformerWindow;\n\n\tconst documentManager = extendedWindow.elementor?.documents;\n\n\tif ( ! documentManager ) {\n\t\tthrow new Error( 'Elementor documents manager not found' );\n\t}\n\n\tconst data = await documentManager.request( id );\n\n\treturn data.elements ?? [];\n} );\n","import { type V1ElementData } from '@elementor/editor-elements';\nimport {\n\t__createSelector as createSelector,\n\t__createSlice as createSlice,\n\ttype PayloadAction,\n\ttype SliceState,\n} from '@elementor/store';\n\nimport { type Component, type ComponentId, type StylesDefinition } from '../types';\nimport { loadComponents } from './thunks';\n\ntype GetComponentResponse = Component[];\n\nexport type UnpublishedComponent = Component & {\n\telements: V1ElementData[];\n};\n\ntype Status = 'idle' | 'pending' | 'error';\n\ntype ComponentsState = {\n\tdata: Component[];\n\tunpublishedData: UnpublishedComponent[];\n\tloadStatus: Status;\n\tstyles: StylesDefinition;\n};\n\ntype ComponentsSlice = SliceState< typeof slice >;\n\nexport const initialState: ComponentsState = {\n\tdata: [],\n\tunpublishedData: [],\n\tloadStatus: 'idle',\n\tstyles: {},\n};\n\nexport const SLICE_NAME = 'components';\nexport const slice = createSlice( {\n\tname: SLICE_NAME,\n\tinitialState,\n\treducers: {\n\t\tadd: ( state, { payload }: PayloadAction< Component | Component[] > ) => {\n\t\t\tif ( Array.isArray( payload ) ) {\n\t\t\t\tstate.data = [ ...state.data, ...payload ];\n\t\t\t} else {\n\t\t\t\tstate.data.unshift( payload );\n\t\t\t}\n\t\t},\n\t\tload: ( state, { payload }: PayloadAction< Component[] > ) => {\n\t\t\tstate.data = payload;\n\t\t},\n\t\taddUnpublished: ( state, { payload } ) => {\n\t\t\tstate.unpublishedData.unshift( payload );\n\t\t},\n\t\tresetUnpublished: ( state ) => {\n\t\t\tstate.unpublishedData = [];\n\t\t},\n\t\tremoveStyles( state, { payload }: PayloadAction< { id: ComponentId } > ) {\n\t\t\tconst { [ payload.id ]: _, ...rest } = state.styles;\n\n\t\t\tstate.styles = rest;\n\t\t},\n\t\taddStyles: ( state, { payload } ) => {\n\t\t\tstate.styles = { ...state.styles, ...payload };\n\t\t},\n\t},\n\textraReducers: ( builder ) => {\n\t\tbuilder.addCase( loadComponents.fulfilled, ( state, { payload }: PayloadAction< GetComponentResponse > ) => {\n\t\t\tstate.data = payload;\n\t\t\tstate.loadStatus = 'idle';\n\t\t} );\n\t\tbuilder.addCase( loadComponents.pending, ( state ) => {\n\t\t\tstate.loadStatus = 'pending';\n\t\t} );\n\t\tbuilder.addCase( loadComponents.rejected, ( state ) => {\n\t\t\tstate.loadStatus = 'error';\n\t\t} );\n\t},\n} );\n\nconst selectData = ( state: ComponentsSlice ) => state[ SLICE_NAME ].data;\nconst selectLoadStatus = ( state: ComponentsSlice ) => state[ SLICE_NAME ].loadStatus;\nconst selectStylesDefinitions = ( state: ComponentsSlice ) => state[ SLICE_NAME ].styles ?? {};\nconst selectUnpublishedData = ( state: ComponentsSlice ) => state[ SLICE_NAME ].unpublishedData;\n\nexport const selectComponents = createSelector(\n\tselectData,\n\tselectUnpublishedData,\n\t( data: Component[], unpublishedData: UnpublishedComponent[] ) => [\n\t\t...unpublishedData.map( ( item ) => ( { id: item.id, name: item.name } ) ),\n\t\t...data,\n\t]\n);\nexport const selectUnpublishedComponents = createSelector(\n\tselectUnpublishedData,\n\t( unpublishedData: UnpublishedComponent[] ) => unpublishedData\n);\nexport const selectLoadIsPending = createSelector( selectLoadStatus, ( status ) => status === 'pending' );\nexport const selectLoadIsError = createSelector( selectLoadStatus, ( status ) => status === 'error' );\nexport const selectStyles = ( state: ComponentsSlice ) => state[ SLICE_NAME ].styles ?? {};\nexport const selectFlatStyles = createSelector( selectStylesDefinitions, ( data ) => Object.values( data ).flat() );\n","import { __createAsyncThunk as createAsyncThunk } from '@elementor/store';\n\nimport { apiClient } from '../api';\n\nconst loadComponents = createAsyncThunk( 'components/load', async () => {\n\tconst response = await apiClient.get();\n\treturn response;\n} );\n\nexport { loadComponents };\n","import { type V1ElementData } from '@elementor/editor-elements';\nimport { ajax } from '@elementor/editor-v1-adapters';\nimport { type HttpResponse, httpService } from '@elementor/http-client';\n\nimport { type Component, type DocumentStatus } from './types';\n\nconst BASE_URL = 'elementor/v1/components';\nconst LOCK_COMPONENT = `${ BASE_URL }/lock`;\nconst UNLOCK_COMPONENT = `${ BASE_URL }/unlock`;\nconst BASE_URL_LOCK_STATUS = `${ BASE_URL }/lock-status`;\n\nexport type CreateComponentPayload = {\n\tstatus: DocumentStatus;\n\titems: Array< {\n\t\ttemp_id: number;\n\t\ttitle: string;\n\t\telements: V1ElementData[];\n\t} >;\n};\n\ntype ComponentLockStatusResponse = {\n\tis_current_user_allow_to_edit: boolean;\n\tlocked_by: string;\n};\n\ntype GetComponentResponse = Array< Component >;\n\nexport type CreateComponentResponse = Record< number, number >;\n\nexport const getParams = ( id: number ) => ( {\n\taction: 'get_document_config',\n\tunique_id: `document-config-${ id }`,\n\tdata: { id },\n} );\n\nexport const apiClient = {\n\tget: () =>\n\t\thttpService()\n\t\t\t.get< HttpResponse< GetComponentResponse > >( `${ BASE_URL }` )\n\t\t\t.then( ( res ) => res.data.data ),\n\tcreate: ( payload: CreateComponentPayload ) =>\n\t\thttpService()\n\t\t\t.post< HttpResponse< CreateComponentResponse > >( `${ BASE_URL }`, payload )\n\t\t\t.then( ( res ) => res.data.data ),\n\tgetComponentConfig: ( id: number ) => ajax.load< { id: number }, V1ElementData >( getParams( id ) ),\n\tinvalidateComponentConfigCache: ( id: number ) => ajax.invalidateCache< { id: number } >( getParams( id ) ),\n\tgetComponentLockStatus: async ( componentId: number ) =>\n\t\tawait httpService()\n\t\t\t.get< { data: ComponentLockStatusResponse } >( `${ BASE_URL_LOCK_STATUS }`, {\n\t\t\t\tparams: {\n\t\t\t\t\tcomponentId,\n\t\t\t\t},\n\t\t\t} )\n\t\t\t.then( ( res ) => {\n\t\t\t\tconst { is_current_user_allow_to_edit: isAllowedToSwitchDocument, locked_by: lockedBy } = res.data.data;\n\t\t\t\treturn { isAllowedToSwitchDocument, lockedBy: lockedBy || '' };\n\t\t\t} ),\n\tlockComponent: async ( componentId: number ) =>\n\t\tawait httpService()\n\t\t\t.post< { success: boolean } >( LOCK_COMPONENT, {\n\t\t\t\tcomponentId,\n\t\t\t} )\n\t\t\t.then( ( res ) => res.data ),\n\tunlockComponent: async ( componentId: number ) =>\n\t\tawait httpService()\n\t\t\t.post< { success: boolean } >( UNLOCK_COMPONENT, {\n\t\t\t\tcomponentId,\n\t\t\t} )\n\t\t\t.then( ( res ) => res.data ),\n};\n","import * as React from 'react';\nimport { ThemeProvider } from '@elementor/editor-ui';\n\nimport { ComponentSearch } from './component-search';\nimport { ComponentsList } from './components-list';\nimport { SearchProvider } from './search-provider';\n\nexport const Components = () => {\n\treturn (\n\t\t<ThemeProvider>\n\t\t\t<SearchProvider localStorageKey=\"elementor-components-search\">\n\t\t\t\t<ComponentSearch />\n\t\t\t\t<ComponentsList />\n\t\t\t</SearchProvider>\n\t\t</ThemeProvider>\n\t);\n};\n","import * as React from 'react';\nimport { SearchIcon } from '@elementor/icons';\nimport { Box, InputAdornment, Stack, TextField } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { useSearch } from './search-provider';\n\nexport const ComponentSearch = () => {\n\tconst { inputValue, handleChange } = useSearch();\n\n\treturn (\n\t\t<Stack direction=\"row\" gap={ 0.5 } sx={ { width: '100%', px: 2, py: 1.5 } }>\n\t\t\t<Box sx={ { flexGrow: 1 } }>\n\t\t\t\t<TextField\n\t\t\t\t\trole={ 'search' }\n\t\t\t\t\tfullWidth\n\t\t\t\t\tsize={ 'tiny' }\n\t\t\t\t\tvalue={ inputValue }\n\t\t\t\t\tplaceholder={ __( 'Search', 'elementor' ) }\n\t\t\t\t\tonChange={ ( e: React.ChangeEvent< HTMLInputElement > ) => handleChange( e.target.value ) }\n\t\t\t\t\tInputProps={ {\n\t\t\t\t\t\tstartAdornment: (\n\t\t\t\t\t\t\t<InputAdornment position=\"start\">\n\t\t\t\t\t\t\t\t<SearchIcon fontSize={ 'tiny' } />\n\t\t\t\t\t\t\t</InputAdornment>\n\t\t\t\t\t\t),\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t</Box>\n\t\t</Stack>\n\t);\n};\n","import * as React from 'react';\nimport { createContext, useContext } from 'react';\nimport { useSearchState, type UseSearchStateResult } from '@elementor/utils';\n\ntype SearchContextType = Pick< UseSearchStateResult, 'handleChange' | 'inputValue' > & {\n\tsearchValue: UseSearchStateResult[ 'debouncedValue' ];\n\tclearSearch: () => void;\n};\n\nconst SearchContext = createContext< SearchContextType | undefined >( undefined );\n\nexport const SearchProvider = ( {\n\tchildren,\n\tlocalStorageKey,\n}: {\n\tchildren: React.ReactNode;\n\tlocalStorageKey: string;\n} ) => {\n\tconst { debouncedValue, handleChange, inputValue } = useSearchState( { localStorageKey } );\n\n\tconst clearSearch = () => {\n\t\thandleChange( '' );\n\t};\n\n\treturn (\n\t\t<SearchContext.Provider value={ { handleChange, clearSearch, searchValue: debouncedValue, inputValue } }>\n\t\t\t{ children }\n\t\t</SearchContext.Provider>\n\t);\n};\n\nexport const useSearch = () => {\n\tconst context = useContext( SearchContext );\n\tif ( ! context ) {\n\t\tthrow new Error( 'useSearch must be used within a SearchProvider' );\n\t}\n\treturn context;\n};\n","import * as React from 'react';\nimport { ComponentsIcon, EyeIcon } from '@elementor/icons';\nimport { Box, Divider, Icon, Link, List, Stack, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { useComponents } from '../../hooks/use-components';\nimport { ComponentItem } from './components-item';\nimport { LoadingComponents } from './loading-components';\nimport { useSearch } from './search-provider';\n\nexport function ComponentsList() {\n\tconst { components, isLoading, searchValue } = useFilteredComponents();\n\n\tif ( isLoading ) {\n\t\treturn <LoadingComponents />;\n\t}\n\tconst isEmpty = ! components || components.length === 0;\n\tif ( isEmpty ) {\n\t\tif ( searchValue.length > 0 ) {\n\t\t\treturn <EmptySearchResult />;\n\t\t}\n\t\treturn <EmptyState />;\n\t}\n\n\treturn (\n\t\t<List sx={ { display: 'flex', flexDirection: 'column', gap: 1, px: 2 } }>\n\t\t\t{ components.map( ( component ) => (\n\t\t\t\t<ComponentItem key={ component.id } component={ component } />\n\t\t\t) ) }\n\t\t</List>\n\t);\n}\n\nconst EmptyState = () => {\n\treturn (\n\t\t<Stack\n\t\t\talignItems=\"center\"\n\t\t\tjustifyContent=\"center\"\n\t\t\theight=\"100%\"\n\t\t\tsx={ { px: 2.5, pt: 10 } }\n\t\t\tgap={ 1.75 }\n\t\t\toverflow=\"hidden\"\n\t\t>\n\t\t\t<Icon fontSize=\"large\">\n\t\t\t\t<EyeIcon fontSize=\"large\" />\n\t\t\t</Icon>\n\t\t\t<Typography align=\"center\" variant=\"subtitle2\" color=\"text.secondary\" fontWeight=\"bold\">\n\t\t\t\t{ __( 'Text that explains that there are no Components yet.', 'elementor' ) }\n\t\t\t</Typography>\n\t\t\t<Typography variant=\"caption\" align=\"center\" color=\"text.secondary\">\n\t\t\t\t{ __(\n\t\t\t\t\t'Once you have Components, this is where you can manage them—rearrange, duplicate, rename and delete irrelevant classes.',\n\t\t\t\t\t'elementor'\n\t\t\t\t) }\n\t\t\t</Typography>\n\t\t\t<Divider sx={ { width: '100%' } } color=\"text.secondary\" />\n\t\t\t<Typography align=\"left\" variant=\"caption\" color=\"text.secondary\">\n\t\t\t\t{ __( 'To create a component, first design it, then choose one of three options:', 'elementor' ) }\n\t\t\t</Typography>\n\t\t\t<Typography\n\t\t\t\talign=\"left\"\n\t\t\t\tvariant=\"caption\"\n\t\t\t\tcolor=\"text.secondary\"\n\t\t\t\tsx={ { display: 'flex', flexDirection: 'column' } }\n\t\t\t>\n\t\t\t\t<span>{ __( '1. Right-click and select Create Component', 'elementor' ) }</span>\n\t\t\t\t<span>{ __( '2. Use the component icon in the Structure panel', 'elementor' ) }</span>\n\t\t\t\t<span>{ __( '3. Use the component icon in the Edit panel header', 'elementor' ) }</span>\n\t\t\t</Typography>\n\t\t</Stack>\n\t);\n};\n\nconst EmptySearchResult = () => {\n\tconst { searchValue, clearSearch } = useSearch();\n\treturn (\n\t\t<Stack\n\t\t\tcolor={ 'text.secondary' }\n\t\t\tpt={ 5 }\n\t\t\talignItems=\"center\"\n\t\t\tgap={ 1 }\n\t\t\toverflow={ 'hidden' }\n\t\t\tjustifySelf={ 'center' }\n\t\t>\n\t\t\t<ComponentsIcon />\n\t\t\t<Box\n\t\t\t\tsx={ {\n\t\t\t\t\twidth: '100%',\n\t\t\t\t} }\n\t\t\t>\n\t\t\t\t<Typography align=\"center\" variant=\"subtitle2\" color=\"inherit\">\n\t\t\t\t\t{ __( 'Sorry, nothing matched', 'elementor' ) }\n\t\t\t\t</Typography>\n\t\t\t\t{ searchValue && (\n\t\t\t\t\t<Typography\n\t\t\t\t\t\tvariant=\"subtitle2\"\n\t\t\t\t\t\tcolor=\"inherit\"\n\t\t\t\t\t\tsx={ {\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t\t\t} }\n\t\t\t\t\t>\n\t\t\t\t\t\t<span>&ldquo;</span>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tstyle={ {\n\t\t\t\t\t\t\t\tmaxWidth: '80%',\n\t\t\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\t\t\ttextOverflow: 'ellipsis',\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ searchValue }\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span>&rdquo;.</span>\n\t\t\t\t\t</Typography>\n\t\t\t\t) }\n\t\t\t</Box>\n\t\t\t<Typography align=\"center\" variant=\"caption\" color=\"inherit\">\n\t\t\t\t{ __( 'Try something else.', 'elementor' ) }\n\t\t\t</Typography>\n\t\t\t<Typography align=\"center\" variant=\"caption\" color=\"inherit\">\n\t\t\t\t<Link color=\"secondary\" variant=\"caption\" component=\"button\" onClick={ clearSearch }>\n\t\t\t\t\t{ __( 'Clear & try again', 'elementor' ) }\n\t\t\t\t</Link>\n\t\t\t</Typography>\n\t\t</Stack>\n\t);\n};\n\nconst useFilteredComponents = () => {\n\tconst { components, isLoading } = useComponents();\n\tconst { searchValue } = useSearch();\n\n\treturn {\n\t\tcomponents: components.filter( ( component ) =>\n\t\t\tcomponent.name.toLowerCase().includes( searchValue.toLowerCase() )\n\t\t),\n\t\tisLoading,\n\t\tsearchValue,\n\t};\n};\n","import { __useSelector as useSelector } from '@elementor/store';\n\nimport { selectComponents, selectLoadIsPending } from '../store/store';\n\nexport const useComponents = () => {\n\tconst components = useSelector( selectComponents );\n\tconst isLoading = useSelector( selectLoadIsPending );\n\n\treturn { components, isLoading };\n};\n","import * as React from 'react';\nimport { endDragElementFromPanel, startDragElementFromPanel } from '@elementor/editor-canvas';\nimport { dropElement, type DropElementParams } from '@elementor/editor-elements';\nimport { ComponentsIcon } from '@elementor/icons';\nimport { Box, ListItemButton, ListItemIcon, ListItemText, Typography } from '@elementor/ui';\n\nimport { type Component } from '../../types';\nimport { getContainerForNewElement } from '../../utils/get-container-for-new-element';\nimport { createComponentModel } from '../create-component-form/utils/replace-element-with-component';\n\nexport const ComponentItem = ( { component }: { component: Component } ) => {\n\tconst componentModel = createComponentModel( { id: component.id, name: component.name } );\n\n\tconst handleClick = () => {\n\t\taddComponentToPage( componentModel );\n\t};\n\n\treturn (\n\t\t<ListItemButton\n\t\t\tdraggable\n\t\t\tonDragStart={ () => startDragElementFromPanel( componentModel ) }\n\t\t\tonDragEnd={ endDragElementFromPanel }\n\t\t\tshape=\"rounded\"\n\t\t\tsx={ { border: 'solid 1px', borderColor: 'divider', py: 0.5, px: 1 } }\n\t\t>\n\t\t\t<Box sx={ { display: 'flex', width: '100%', alignItems: 'center', gap: 1 } } onClick={ handleClick }>\n\t\t\t\t<ListItemIcon size=\"tiny\">\n\t\t\t\t\t<ComponentsIcon fontSize=\"tiny\" />\n\t\t\t\t</ListItemIcon>\n\t\t\t\t<ListItemText\n\t\t\t\t\tprimary={\n\t\t\t\t\t\t<Typography variant=\"caption\" sx={ { color: 'text.primary' } }>\n\t\t\t\t\t\t\t{ component.name }\n\t\t\t\t\t\t</Typography>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</Box>\n\t\t</ListItemButton>\n\t);\n};\n\nconst addComponentToPage = ( model: DropElementParams[ 'model' ] ) => {\n\tconst { container, options } = getContainerForNewElement();\n\n\tif ( ! container ) {\n\t\tthrow new Error( `Can't find container to drop new component instance at` );\n\t}\n\n\tdropElement( {\n\t\tcontainerId: container.id,\n\t\tmodel,\n\t\toptions: { ...options, useHistory: false, scrollIntoView: true },\n\t} );\n};\n","import {\n\tgetContainer,\n\tgetCurrentDocumentContainer,\n\tgetSelectedElements,\n\ttype V1Element,\n} from '@elementor/editor-elements';\n\nexport const getContainerForNewElement = (): { container: V1Element | null; options?: { at: number } } => {\n\tconst currentDocumentContainer = getCurrentDocumentContainer();\n\tconst selectedElement = getSelectedElementContainer();\n\n\tlet container, options;\n\n\tif ( selectedElement ) {\n\t\tswitch ( selectedElement.model.get( 'elType' ) ) {\n\t\t\tcase 'widget': {\n\t\t\t\tcontainer = selectedElement?.parent;\n\n\t\t\t\tconst selectedElIndex = selectedElement.view?._index ?? -1;\n\n\t\t\t\tif ( selectedElIndex > -1 ) {\n\t\t\t\t\toptions = { at: selectedElIndex + 1 };\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'section': {\n\t\t\t\tcontainer = selectedElement?.children?.[ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tcontainer = selectedElement;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { container: container ?? currentDocumentContainer, options };\n};\n\nfunction getSelectedElementContainer() {\n\tconst selectedElements = getSelectedElements();\n\n\tif ( selectedElements.length !== 1 ) {\n\t\treturn undefined;\n\t}\n\n\treturn getContainer( selectedElements[ 0 ].id );\n}\n","import { replaceElement, type V1Element } from '@elementor/editor-elements';\n\nimport { type Component } from '../../../types';\n\nexport const replaceElementWithComponent = ( element: V1Element, component: Component ) => {\n\treplaceElement( {\n\t\tcurrentElement: element,\n\t\tnewElement: createComponentModel( component ),\n\t\twithHistory: false,\n\t} );\n};\n\nexport const createComponentModel = ( component: Component ) => {\n\treturn {\n\t\telType: 'widget',\n\t\twidgetType: 'e-component',\n\t\tsettings: {\n\t\t\tcomponent: {\n\t\t\t\t$$type: 'component-id',\n\t\t\t\tvalue: component.id,\n\t\t\t},\n\t\t},\n\t\teditor_settings: {\n\t\t\ttitle: component.name,\n\t\t},\n\t};\n};\n","import * as React from 'react';\nimport { Box, ListItemButton, Skeleton, Stack } from '@elementor/ui';\nconst ROWS_COUNT = 6;\n\nconst rows = Array.from( { length: ROWS_COUNT }, ( _, index ) => index );\n\nexport const LoadingComponents = () => {\n\treturn (\n\t\t<Stack\n\t\t\taria-label=\"Loading components\"\n\t\t\tgap={ 1 }\n\t\t\tsx={ {\n\t\t\t\tpointerEvents: 'none',\n\t\t\t\tposition: 'relative',\n\t\t\t\tmaxHeight: '300px',\n\t\t\t\toverflow: 'hidden',\n\t\t\t\t'&:after': {\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tcontent: '\"\"',\n\t\t\t\t\tleft: 0,\n\t\t\t\t\twidth: '100%',\n\t\t\t\t\theight: '300px',\n\t\t\t\t\tbackground: 'linear-gradient(to top, white, transparent)',\n\t\t\t\t\tpointerEvents: 'none',\n\t\t\t\t},\n\t\t\t} }\n\t\t>\n\t\t\t{ rows.map( ( row ) => (\n\t\t\t\t<ListItemButton\n\t\t\t\t\tkey={ row }\n\t\t\t\t\tsx={ { border: 'solid 1px', borderColor: 'divider', py: 0.5, px: 1 } }\n\t\t\t\t\tshape=\"rounded\"\n\t\t\t\t>\n\t\t\t\t\t<Box display=\"flex\" gap={ 1 } width=\"100%\">\n\t\t\t\t\t\t<Skeleton variant=\"text\" width={ '24px' } height={ '36px' } />\n\t\t\t\t\t\t<Skeleton variant=\"text\" width={ '100%' } height={ '36px' } />\n\t\t\t\t\t</Box>\n\t\t\t\t</ListItemButton>\n\t\t\t) ) }\n\t\t</Stack>\n\t);\n};\n","import * as React from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { getElementLabel, type V1Element } from '@elementor/editor-elements';\nimport { ThemeProvider } from '@elementor/editor-ui';\nimport { StarIcon } from '@elementor/icons';\nimport { __useDispatch as useDispatch } from '@elementor/store';\nimport { Alert, Button, FormLabel, Grid, Popover, Snackbar, Stack, TextField, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { useComponents } from '../../hooks/use-components';\nimport { slice } from '../../store/store';\nimport { type ComponentFormValues } from '../../types';\nimport { useForm } from './hooks/use-form';\nimport { createBaseComponentSchema, createSubmitComponentSchema } from './utils/component-form-schema';\nimport { replaceElementWithComponent } from './utils/replace-element-with-component';\n\ntype SaveAsComponentEventData = {\n\telement: V1Element;\n\tanchorPosition: { top: number; left: number };\n};\n\ntype ResultNotification = {\n\tshow: boolean;\n\tmessage: string;\n\ttype: 'success' | 'error';\n};\n\nexport function CreateComponentForm() {\n\tconst [ element, setElement ] = useState< {\n\t\telement: V1Element;\n\t\telementLabel: string;\n\t} | null >( null );\n\n\tconst [ anchorPosition, setAnchorPosition ] = useState< { top: number; left: number } >();\n\n\tconst [ resultNotification, setResultNotification ] = useState< ResultNotification | null >( null );\n\n\tconst dispatch = useDispatch();\n\n\tuseEffect( () => {\n\t\tconst OPEN_SAVE_AS_COMPONENT_FORM_EVENT = 'elementor/editor/open-save-as-component-form';\n\n\t\tconst openPopup = ( event: CustomEvent< SaveAsComponentEventData > ) => {\n\t\t\tsetElement( { element: event.detail.element, elementLabel: getElementLabel( event.detail.element.id ) } );\n\t\t\tsetAnchorPosition( event.detail.anchorPosition );\n\t\t};\n\n\t\twindow.addEventListener( OPEN_SAVE_AS_COMPONENT_FORM_EVENT, openPopup as EventListener );\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener( OPEN_SAVE_AS_COMPONENT_FORM_EVENT, openPopup as EventListener );\n\t\t};\n\t}, [] );\n\n\tconst handleSave = async ( values: ComponentFormValues ) => {\n\t\ttry {\n\t\t\tif ( ! element ) {\n\t\t\t\tthrow new Error( `Can't save element as component: element not found` );\n\t\t\t}\n\n\t\t\tconst tempId = generateTempId();\n\n\t\t\tdispatch(\n\t\t\t\tslice.actions.addUnpublished( {\n\t\t\t\t\tid: tempId,\n\t\t\t\t\tname: values.componentName,\n\t\t\t\t\telements: [ element.element.model.toJSON( { remove: [ 'default' ] } ) ],\n\t\t\t\t} )\n\t\t\t);\n\n\t\t\treplaceElementWithComponent( element.element, {\n\t\t\t\tid: tempId,\n\t\t\t\tname: values.componentName,\n\t\t\t} );\n\n\t\t\tsetResultNotification( {\n\t\t\t\tshow: true,\n\t\t\t\t// Translators: %1$s: Component name, %2$s: Component temp ID\n\t\t\t\tmessage: __( 'Component saved successfully as: %1$s (temp ID: %2$s)', 'elementor' )\n\t\t\t\t\t.replace( '%1$s', values.componentName )\n\t\t\t\t\t.replace( '%2$s', tempId.toString() ),\n\t\t\t\ttype: 'success',\n\t\t\t} );\n\n\t\t\tresetAndClosePopup();\n\t\t} catch {\n\t\t\tconst errorMessage = __( 'Failed to save component. Please try again.', 'elementor' );\n\t\t\tsetResultNotification( {\n\t\t\t\tshow: true,\n\t\t\t\tmessage: errorMessage,\n\t\t\t\ttype: 'error',\n\t\t\t} );\n\t\t}\n\t};\n\n\tconst resetAndClosePopup = () => {\n\t\tsetElement( null );\n\t\tsetAnchorPosition( undefined );\n\t};\n\n\treturn (\n\t\t<ThemeProvider>\n\t\t\t<Popover\n\t\t\t\topen={ element !== null }\n\t\t\t\tonClose={ resetAndClosePopup }\n\t\t\t\tanchorReference=\"anchorPosition\"\n\t\t\t\tanchorPosition={ anchorPosition }\n\t\t\t>\n\t\t\t\t{ element !== null && (\n\t\t\t\t\t<Form\n\t\t\t\t\t\tinitialValues={ { componentName: element.elementLabel } }\n\t\t\t\t\t\thandleSave={ handleSave }\n\t\t\t\t\t\tclosePopup={ resetAndClosePopup }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t</Popover>\n\t\t\t<Snackbar open={ resultNotification?.show } onClose={ () => setResultNotification( null ) }>\n\t\t\t\t<Alert\n\t\t\t\t\tonClose={ () => setResultNotification( null ) }\n\t\t\t\t\tseverity={ resultNotification?.type }\n\t\t\t\t\tsx={ { width: '100%' } }\n\t\t\t\t>\n\t\t\t\t\t{ resultNotification?.message }\n\t\t\t\t</Alert>\n\t\t\t</Snackbar>\n\t\t</ThemeProvider>\n\t);\n}\n\nconst FONT_SIZE = 'tiny';\n\nconst Form = ( {\n\tinitialValues,\n\thandleSave,\n\tclosePopup,\n}: {\n\tinitialValues: ComponentFormValues;\n\thandleSave: ( values: ComponentFormValues ) => void;\n\tclosePopup: () => void;\n} ) => {\n\tconst { values, errors, isValid, handleChange, validateForm } = useForm< ComponentFormValues >( initialValues );\n\n\tconst { components } = useComponents();\n\n\tconst existingComponentNames = useMemo( () => {\n\t\treturn components?.map( ( component ) => component.name ) ?? [];\n\t}, [ components ] );\n\n\tconst changeValidationSchema = useMemo(\n\t\t() => createBaseComponentSchema( existingComponentNames ),\n\t\t[ existingComponentNames ]\n\t);\n\tconst submitValidationSchema = useMemo(\n\t\t() => createSubmitComponentSchema( existingComponentNames ),\n\t\t[ existingComponentNames ]\n\t);\n\n\tconst handleSubmit = () => {\n\t\tconst { success, parsedValues } = validateForm( submitValidationSchema );\n\n\t\tif ( success ) {\n\t\t\thandleSave( parsedValues );\n\t\t}\n\t};\n\n\treturn (\n\t\t<Stack alignItems=\"start\" width=\"268px\">\n\t\t\t<Stack\n\t\t\t\tdirection=\"row\"\n\t\t\t\talignItems=\"center\"\n\t\t\t\tpy={ 1 }\n\t\t\t\tpx={ 1.5 }\n\t\t\t\tsx={ { columnGap: 0.5, borderBottom: '1px solid', borderColor: 'divider', width: '100%' } }\n\t\t\t>\n\t\t\t\t<StarIcon fontSize={ FONT_SIZE } />\n\t\t\t\t<Typography variant=\"caption\" sx={ { color: 'text.primary', fontWeight: '500', lineHeight: 1 } }>\n\t\t\t\t\t{ __( 'Save as a component', 'elementor' ) }\n\t\t\t\t</Typography>\n\t\t\t</Stack>\n\t\t\t<Grid container gap={ 0.75 } alignItems=\"start\" p={ 1.5 }>\n\t\t\t\t<Grid item xs={ 12 }>\n\t\t\t\t\t<FormLabel htmlFor={ 'component-name' } size=\"tiny\">\n\t\t\t\t\t\t{ __( 'Name', 'elementor' ) }\n\t\t\t\t\t</FormLabel>\n\t\t\t\t</Grid>\n\t\t\t\t<Grid item xs={ 12 }>\n\t\t\t\t\t<TextField\n\t\t\t\t\t\tid={ 'component-name' }\n\t\t\t\t\t\tsize={ FONT_SIZE }\n\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\tvalue={ values.componentName }\n\t\t\t\t\t\tonChange={ ( e: React.ChangeEvent< HTMLInputElement > ) =>\n\t\t\t\t\t\t\thandleChange( e, 'componentName', changeValidationSchema )\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinputProps={ { style: { color: 'text.primary', fontWeight: '600' } } }\n\t\t\t\t\t\terror={ Boolean( errors.componentName ) }\n\t\t\t\t\t\thelperText={ errors.componentName }\n\t\t\t\t\t/>\n\t\t\t\t</Grid>\n\t\t\t</Grid>\n\t\t\t<Stack direction=\"row\" justifyContent=\"flex-end\" alignSelf=\"end\" py={ 1 } px={ 1.5 }>\n\t\t\t\t<Button onClick={ closePopup } color=\"secondary\" variant=\"text\" size=\"small\">\n\t\t\t\t\t{ __( 'Cancel', 'elementor' ) }\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\tonClick={ handleSubmit }\n\t\t\t\t\tdisabled={ ! isValid }\n\t\t\t\t\tvariant=\"contained\"\n\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t>\n\t\t\t\t\t{ __( 'Create', 'elementor' ) }\n\t\t\t\t</Button>\n\t\t\t</Stack>\n\t\t</Stack>\n\t);\n};\n\nexport const generateTempId = () => {\n\treturn Date.now() + Math.floor( Math.random() * 1000000 );\n};\n","import { useMemo, useState } from 'react';\nimport { type z } from '@elementor/schema';\n\nexport const useForm = < TValues extends Record< string, unknown > >( initialValues: TValues ) => {\n\tconst [ values, setValues ] = useState< TValues >( initialValues );\n\tconst [ errors, setErrors ] = useState< Partial< Record< keyof TValues, string > > >( {} );\n\n\tconst isValid = useMemo( () => {\n\t\treturn ! Object.values( errors ).some( ( error ) => error );\n\t}, [ errors ] );\n\n\tconst handleChange = (\n\t\te: React.ChangeEvent< HTMLInputElement >,\n\t\tfield: keyof TValues,\n\t\tvalidationSchema: z.ZodType< TValues >\n\t) => {\n\t\tconst updated = { ...values, [ field ]: e.target.value };\n\t\tsetValues( updated );\n\n\t\tconst { success, errors: validationErrors } = validateForm( updated, validationSchema );\n\n\t\tif ( ! success ) {\n\t\t\tsetErrors( validationErrors );\n\t\t} else {\n\t\t\tsetErrors( {} );\n\t\t}\n\t};\n\n\tconst validate = (\n\t\tvalidationSchema: z.ZodType< TValues >\n\t): { success: true; parsedValues: TValues } | { success: false; parsedValues?: never } => {\n\t\tconst { success, errors: validationErrors, parsedValues } = validateForm( values, validationSchema );\n\n\t\tif ( ! success ) {\n\t\t\tsetErrors( validationErrors );\n\t\t\treturn { success };\n\t\t}\n\t\tsetErrors( {} );\n\t\treturn { success, parsedValues };\n\t};\n\n\treturn {\n\t\tvalues,\n\t\terrors,\n\t\tisValid,\n\t\thandleChange,\n\t\tvalidateForm: validate,\n\t};\n};\n\nconst validateForm = < TValues extends Record< string, unknown > >(\n\tvalues: TValues,\n\tschema: z.ZodType< TValues >\n):\n\t| { success: false; parsedValues?: never; errors: Partial< Record< keyof TValues, string > > }\n\t| { success: true; parsedValues: TValues; errors?: never } => {\n\tconst result = schema.safeParse( values );\n\n\tif ( result.success ) {\n\t\treturn { success: true, parsedValues: result.data };\n\t}\n\n\tconst errors = {} as Partial< Record< keyof TValues, string > >;\n\n\t( Object.entries( result.error.formErrors.fieldErrors ) as Array< [ keyof TValues, string[] ] > ).forEach(\n\t\t( [ field, error ] ) => {\n\t\t\terrors[ field ] = error[ 0 ];\n\t\t}\n\t);\n\n\treturn { success: false, errors };\n};\n","import { z } from '@elementor/schema';\nimport { __ } from '@wordpress/i18n';\n\nconst MIN_NAME_LENGTH = 2;\nconst MAX_NAME_LENGTH = 50;\n\nexport const createBaseComponentSchema = ( existingNames: string[] ) => {\n\treturn z.object( {\n\t\tcomponentName: z\n\t\t\t.string()\n\t\t\t.trim()\n\t\t\t.max(\n\t\t\t\tMAX_NAME_LENGTH,\n\t\t\t\t__( 'Component name is too long. Please keep it under 50 characters.', 'elementor' )\n\t\t\t)\n\t\t\t.refine( ( value ) => ! existingNames.includes( value ), {\n\t\t\t\tmessage: __( 'Component name already exists', 'elementor' ),\n\t\t\t} ),\n\t} );\n};\n\nexport const createSubmitComponentSchema = ( existingNames: string[] ) => {\n\tconst baseSchema = createBaseComponentSchema( existingNames );\n\n\treturn baseSchema.extend( {\n\t\tcomponentName: baseSchema.shape.componentName\n\t\t\t.refine( ( value ) => value.length > 0, {\n\t\t\t\tmessage: __( 'Component name is required.', 'elementor' ),\n\t\t\t} )\n\t\t\t.refine( ( value ) => value.length >= MIN_NAME_LENGTH, {\n\t\t\t\tmessage: __( 'Component name is too short. Please enter at least 2 characters.', 'elementor' ),\n\t\t\t} ),\n\t} );\n};\n","import * as React from 'react';\nimport { closeDialog, openDialog } from '@elementor/editor-ui';\nimport { InfoCircleFilledIcon } from '@elementor/icons';\nimport { Box, Button, DialogActions, DialogContent, DialogHeader, Icon, Stack, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nexport const openEditModeDialog = ( lockedBy: string ) => {\n\topenDialog( {\n\t\tcomponent: <EditModeDialog lockedBy={ lockedBy } />,\n\t} );\n};\n\nconst EditModeDialog = ( { lockedBy }: { lockedBy: string } ) => {\n\t/* translators: %s is the name of the user who is currently editing the document */\n\tconst content = __( '%s is currently editing this document', 'elementor' ).replace( '%s', lockedBy );\n\treturn (\n\t\t<>\n\t\t\t<DialogHeader logo={ false }>\n\t\t\t\t<Box display=\"flex\" alignItems=\"center\" gap={ 1 }>\n\t\t\t\t\t<Icon color=\"secondary\">\n\t\t\t\t\t\t<InfoCircleFilledIcon fontSize=\"medium\" />\n\t\t\t\t\t</Icon>\n\t\t\t\t\t<Typography variant=\"subtitle1\">{ content }</Typography>\n\t\t\t\t</Box>\n\t\t\t</DialogHeader>\n\t\t\t<DialogContent>\n\t\t\t\t<Stack spacing={ 2 } direction=\"column\">\n\t\t\t\t\t<Typography variant=\"body2\">\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'You can wait for them to finish or reach out to coordinate your changes together.',\n\t\t\t\t\t\t\t'elementor'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</Typography>\n\t\t\t\t\t<DialogActions>\n\t\t\t\t\t\t<Button color=\"secondary\" variant=\"contained\" onClick={ closeDialog }>\n\t\t\t\t\t\t\t{ __( 'Close', 'elementor' ) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</DialogActions>\n\t\t\t\t</Stack>\n\t\t\t</DialogContent>\n\t\t</>\n\t);\n};\n","import {\n\ttype CreateTemplatedElementTypeOptions,\n\tcreateTemplatedElementView,\n\ttype ElementType,\n\ttype ElementView,\n\ttype LegacyWindow,\n} from '@elementor/editor-canvas';\nimport { type NumberPropValue } from '@elementor/editor-props';\nimport { __privateRunCommand as runCommand } from '@elementor/editor-v1-adapters';\nimport { __ } from '@wordpress/i18n';\n\nimport { apiClient } from './api';\n\nexport const TYPE = 'e-component';\n\nexport function createComponentType(\n\toptions: CreateTemplatedElementTypeOptions & { showLockedByModal?: ( lockedBy: string ) => void }\n): typeof ElementType {\n\tconst legacyWindow = window as unknown as LegacyWindow;\n\n\treturn class extends legacyWindow.elementor.modules.elements.types.Widget {\n\t\tgetType() {\n\t\t\treturn options.type;\n\t\t}\n\n\t\tgetView() {\n\t\t\treturn createComponentView( options );\n\t\t}\n\t};\n}\n\nfunction createComponentView(\n\toptions: CreateTemplatedElementTypeOptions & { showLockedByModal?: ( lockedBy: string ) => void }\n): typeof ElementView {\n\treturn class extends createTemplatedElementView( options ) {\n\t\tlegacyWindow = window as unknown as LegacyWindow;\n\n\t\tafterSettingsResolve( settings: { [ key: string ]: unknown } ) {\n\t\t\tif ( settings.component ) {\n\t\t\t\tthis.collection = this.legacyWindow.elementor.createBackboneElementsCollection( settings.component );\n\n\t\t\t\tsettings.component = '<template data-children-placeholder></template>';\n\t\t\t}\n\n\t\t\treturn settings;\n\t\t}\n\n\t\tattachBuffer( collectionView: this, buffer: DocumentFragment ): void {\n\t\t\tconst childrenPlaceholder = collectionView.$el.find( '[data-children-placeholder]' ).get( 0 );\n\n\t\t\tif ( ! childrenPlaceholder ) {\n\t\t\t\tsuper.attachBuffer( collectionView, buffer );\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tchildrenPlaceholder.replaceWith( buffer );\n\t\t}\n\n\t\tgetComponentId() {\n\t\t\treturn this.options?.model?.get( 'settings' )?.get( 'component' ) as NumberPropValue;\n\t\t}\n\n\t\tgetContextMenuGroups() {\n\t\t\tconst filteredGroups = super.getContextMenuGroups().filter( ( group ) => group.name !== 'save' );\n\t\t\tconst componentId = this.getComponentId()?.value as number;\n\t\t\tif ( ! componentId ) {\n\t\t\t\treturn filteredGroups;\n\t\t\t}\n\n\t\t\tconst newGroup = [\n\t\t\t\t{\n\t\t\t\t\tname: 'edit component',\n\t\t\t\t\tactions: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: 'edit component',\n\t\t\t\t\t\t\ticon: 'eicon-edit',\n\t\t\t\t\t\t\ttitle: () => __( 'Edit Component', 'elementor' ),\n\t\t\t\t\t\t\tisEnabled: () => true,\n\t\t\t\t\t\t\tcallback: () => this.switchDocument(),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t];\n\t\t\treturn [ ...filteredGroups, ...newGroup ];\n\t\t}\n\n\t\tasync switchDocument() {\n\t\t\tconst { isAllowedToSwitchDocument, lockedBy } = await apiClient.getComponentLockStatus(\n\t\t\t\tthis.getComponentId()?.value as number\n\t\t\t);\n\n\t\t\tif ( ! isAllowedToSwitchDocument ) {\n\t\t\t\toptions.showLockedByModal?.( lockedBy || '' );\n\t\t\t} else {\n\t\t\t\trunCommand( 'editor/documents/switch', {\n\t\t\t\t\tid: this.getComponentId()?.value as number,\n\t\t\t\t\tmode: 'autosave',\n\t\t\t\t\tselector: `[data-id=\"${ this.model.get( 'id' ) }\"]`,\n\t\t\t\t} );\n\t\t\t\tapiClient.lockComponent( this.getComponentId()?.value as number );\n\t\t\t}\n\t\t}\n\n\t\tui() {\n\t\t\treturn {\n\t\t\t\t...super.ui(),\n\t\t\t\tdoubleClick: '.e-component:not(:has(.elementor-edit-area))',\n\t\t\t};\n\t\t}\n\n\t\tevents() {\n\t\t\treturn {\n\t\t\t\t...super.events(),\n\t\t\t\t'dblclick @ui.doubleClick': this.switchDocument,\n\t\t\t};\n\t\t}\n\t};\n}\n","import { useEffect } from 'react';\nimport { __dispatch as dispatch } from '@elementor/store';\n\nimport { loadComponents } from './store/thunks';\n\nexport function PopulateStore() {\n\tuseEffect( () => {\n\t\tdispatch( loadComponents() );\n\t}, [] );\n\n\treturn null;\n}\n","import { createStylesProvider } from '@elementor/editor-styles-repository';\nimport { __getState as getState, __subscribeWithSelector as subscribeWithSelector } from '@elementor/store';\n\nimport { selectFlatStyles, SLICE_NAME } from './store';\n\nexport const componentsStylesProvider = createStylesProvider( {\n\tkey: 'components-styles',\n\tpriority: 100,\n\tsubscribe: ( cb ) =>\n\t\tsubscribeWithSelector(\n\t\t\t( state ) => state[ SLICE_NAME ],\n\t\t\t() => {\n\t\t\t\tcb();\n\t\t\t}\n\t\t),\n\tactions: {\n\t\tall: () => {\n\t\t\treturn selectFlatStyles( getState() );\n\t\t},\n\t\tget: ( id ) => {\n\t\t\treturn selectFlatStyles( getState() ).find( ( style ) => style.id === id ) ?? null;\n\t\t},\n\t},\n} );\n","import { type V1ElementData } from '@elementor/editor-elements';\nimport { type StyleDefinition } from '@elementor/editor-styles';\nimport { __dispatch as dispatch, __getState as getState } from '@elementor/store';\n\nimport { apiClient } from '../api';\nimport { type ComponentId, type Element } from '../types';\nimport { getComponentIds } from '../utils/get-component-ids';\nimport { selectStyles, slice } from './store';\n\nexport async function loadComponentsStyles( elements: Element[] ) {\n\tconst componentIds = Array.from( new Set( getComponentIds( elements ) ) );\n\n\tif ( ! componentIds.length ) {\n\t\treturn;\n\t}\n\n\tconst knownComponents = selectStyles( getState() );\n\tconst unknownComponentIds = componentIds.filter( ( id ) => ! knownComponents[ id ] );\n\n\tif ( ! unknownComponentIds.length ) {\n\t\treturn;\n\t}\n\n\taddComponentStyles( unknownComponentIds );\n}\n\nasync function addComponentStyles( ids: ComponentId[] ) {\n\tconst newComponents = await loadStyles( ids );\n\n\taddStyles( newComponents );\n\n\tObject.values( newComponents ).forEach( ( [ , data ] ) => {\n\t\tloadComponentsStyles( data.elements as Element[] );\n\t} );\n}\n\nasync function loadStyles( ids: number[] ): Promise< [ number, V1ElementData ][] > {\n\treturn Promise.all( ids.map( async ( id ) => [ id, await apiClient.getComponentConfig( id ) ] ) );\n}\n\nfunction addStyles( data: ( readonly [ ComponentId, V1ElementData ] )[] ) {\n\tconst styles = Object.fromEntries(\n\t\tdata.map( ( [ componentId, componentData ] ) => [ componentId, extractStyles( componentData ) ] )\n\t);\n\n\tdispatch( slice.actions.addStyles( styles ) );\n}\n\nfunction extractStyles( element: V1ElementData ): Array< StyleDefinition > {\n\treturn [ ...Object.values( element.styles ?? {} ), ...( element.elements ?? [] ).flatMap( extractStyles ) ];\n}\n","import { type V1ElementData } from '@elementor/editor-elements';\nimport { isTransformable } from '@elementor/editor-props';\n\nexport const getComponentIds = ( elements: V1ElementData[] ) => {\n\treturn elements.flatMap( ( element ) => {\n\t\tconst ids: number[] = [];\n\n\t\tconst type = element.widgetType || element.elType;\n\n\t\tif ( type === 'e-component' && element.settings?.component && isTransformable( element.settings?.component ) ) {\n\t\t\tids.push( element.settings.component.value );\n\t\t}\n\n\t\tif ( element.elements ) {\n\t\t\tids.push( ...getComponentIds( element.elements ) );\n\t\t}\n\n\t\treturn ids;\n\t} );\n};\n","import { __dispatch as dispatch } from '@elementor/store';\n\nimport { apiClient } from '../api';\nimport { slice } from './store';\n\nexport function removeComponentStyles( id: number ) {\n\tapiClient.invalidateComponentConfigCache( id );\n\tdispatch( slice.actions.removeStyles( { id } ) );\n}\n","import { updateElementSettings, type V1ElementData } from '@elementor/editor-elements';\nimport { type TransformablePropValue } from '@elementor/editor-props';\nimport { __dispatch as dispatch, __getState as getState } from '@elementor/store';\n\nimport { apiClient } from '../api';\nimport { selectUnpublishedComponents, slice, type UnpublishedComponent } from '../store/store';\nimport { type DocumentStatus } from '../types';\n\ntype Container = {\n\tmodel: {\n\t\tget: ( key: 'elements' ) => {\n\t\t\ttoJSON: () => V1ElementData[];\n\t\t};\n\t};\n};\n\nexport const beforeSave = async ( { container, status }: { container: Container; status: DocumentStatus } ) => {\n\tconst unpublishedComponents = selectUnpublishedComponents( getState() );\n\n\tif ( ! unpublishedComponents.length ) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst tempIdToComponentId = await createComponents( unpublishedComponents, status );\n\n\t\tconst elements = container.model.get( 'elements' ).toJSON();\n\t\tupdateComponentInstances( elements, tempIdToComponentId );\n\n\t\tdispatch(\n\t\t\tslice.actions.add(\n\t\t\t\tunpublishedComponents.map( ( component ) => ( {\n\t\t\t\t\tid: tempIdToComponentId.get( component.id ) as number,\n\t\t\t\t\tname: component.name,\n\t\t\t\t} ) )\n\t\t\t)\n\t\t);\n\t\tdispatch( slice.actions.resetUnpublished() );\n\t} catch ( error ) {\n\t\tthrow new Error( `Failed to publish components and update component instances: ${ error }` );\n\t}\n};\n\nasync function createComponents(\n\tcomponents: UnpublishedComponent[],\n\tstatus: DocumentStatus\n): Promise< Map< number, number > > {\n\tconst response = await apiClient.create( {\n\t\tstatus,\n\t\titems: components.map( ( component ) => ( {\n\t\t\ttemp_id: component.id,\n\t\t\ttitle: component.name,\n\t\t\telements: component.elements,\n\t\t} ) ),\n\t} );\n\n\tconst map = new Map< number, number >();\n\n\tObject.entries( response ).forEach( ( [ key, value ] ) => {\n\t\tmap.set( Number( key ), value );\n\t} );\n\n\treturn map;\n}\n\nfunction updateComponentInstances( elements: V1ElementData[], tempIdToComponentId: Map< number, number > ): void {\n\telements.forEach( ( element ) => {\n\t\tconst { shouldUpdate, newComponentId } = shouldUpdateElement( element, tempIdToComponentId );\n\t\tif ( shouldUpdate ) {\n\t\t\tupdateElementComponentId( element.id, newComponentId );\n\t\t}\n\n\t\tif ( element.elements ) {\n\t\t\tupdateComponentInstances( element.elements, tempIdToComponentId );\n\t\t}\n\t} );\n}\n\nfunction shouldUpdateElement(\n\telement: V1ElementData,\n\ttempIdToComponentId: Map< number, number >\n): { shouldUpdate: true; newComponentId: number } | { shouldUpdate: false; newComponentId: null } {\n\tif ( element.widgetType === 'e-component' ) {\n\t\tconst currentComponentId = ( element.settings?.component as TransformablePropValue< 'component-id', number > )\n\t\t\t?.value;\n\t\tif ( currentComponentId && tempIdToComponentId.has( currentComponentId ) ) {\n\t\t\treturn { shouldUpdate: true, newComponentId: tempIdToComponentId.get( currentComponentId ) as number };\n\t\t}\n\t}\n\treturn { shouldUpdate: false, newComponentId: null };\n}\n\nfunction updateElementComponentId( elementId: string, componentId: number ): void {\n\tupdateElementSettings( {\n\t\tid: elementId,\n\t\tprops: {\n\t\t\tcomponent: {\n\t\t\t\t$$type: 'component-id',\n\t\t\t\tvalue: componentId,\n\t\t\t},\n\t\t},\n\t\twithHistory: false,\n\t} );\n}\n"],"mappings":"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","names":["import_editor_canvas","import_editor_styles_repository","import_editor_v1_adapters","import_store","import_i18n","import_store","import_store","createAsyncThunk","createSlice","createSelector","getState","React","React","React","import_icons","import_ui","import_i18n","import_store","useSelector","React","import_editor_canvas","import_editor_elements","import_icons","import_ui","import_editor_elements","React","import_ui","React","import_react","import_editor_elements","import_editor_ui","import_icons","import_store","import_ui","import_i18n","import_react","import_i18n","dispatch","useDispatch","validateForm","React","import_editor_ui","import_icons","import_ui","import_i18n","import_editor_canvas","import_editor_v1_adapters","import_i18n","runCommand","import_react","import_store","dispatch","import_store","subscribeWithSelector","getState","import_store","getState","dispatch","import_store","dispatch","import_editor_elements","import_store","getState","dispatch","registerSlice","listenTo"]}