@elementor/editor-panels 4.3.0-998 → 4.4.0-1064
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +5 -3
- package/dist/index.d.ts +5 -3
- package/dist/index.js +73 -32
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +64 -25
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
- package/src/api.ts +9 -1
- package/src/components/internal/panels.tsx +15 -5
- package/src/components/internal/portal.tsx +25 -4
- package/src/index.ts +1 -0
- package/src/location.ts +46 -2
package/dist/index.d.mts
CHANGED
|
@@ -9,11 +9,13 @@ type PanelDeclaration<TOnOpenReturn = unknown> = {
|
|
|
9
9
|
id: string;
|
|
10
10
|
component: ComponentType;
|
|
11
11
|
isOpenPreviousElement?: boolean;
|
|
12
|
+
keepMounted?: boolean;
|
|
12
13
|
} & UseActionsOptions<TOnOpenReturn> & UseRouteStatusOptions;
|
|
13
|
-
declare function createPanel<TOnOpenReturn>({ id, component, onOpen, onClose, allowedEditModes, blockOnKitRoutes, isOpenPreviousElement, }: PanelDeclaration<TOnOpenReturn>): {
|
|
14
|
+
declare function createPanel<TOnOpenReturn>({ id, component, onOpen, onClose, allowedEditModes, blockOnKitRoutes, isOpenPreviousElement, keepMounted, }: PanelDeclaration<TOnOpenReturn>): {
|
|
14
15
|
panel: {
|
|
15
16
|
id: string;
|
|
16
17
|
component: ComponentType;
|
|
18
|
+
keepMounted: boolean;
|
|
17
19
|
};
|
|
18
20
|
usePanelStatus: UseStatus;
|
|
19
21
|
usePanelActions: () => {
|
|
@@ -21,7 +23,7 @@ declare function createPanel<TOnOpenReturn>({ id, component, onOpen, onClose, al
|
|
|
21
23
|
close: () => Promise<void>;
|
|
22
24
|
};
|
|
23
25
|
};
|
|
24
|
-
declare function registerPanel({ id, component }: Pick<PanelDeclaration, 'id' | 'component'>): void;
|
|
26
|
+
declare function registerPanel({ id, component, keepMounted, }: Pick<PanelDeclaration, 'id' | 'component' | 'keepMounted'>): void;
|
|
25
27
|
type UseStatus = () => {
|
|
26
28
|
isOpen: boolean;
|
|
27
29
|
isBlocked: boolean;
|
|
@@ -41,4 +43,4 @@ declare function PanelBody({ children, sx, ...props }: BoxProps): React.JSX.Elem
|
|
|
41
43
|
|
|
42
44
|
declare function PanelFooter({ children, sx, ...props }: BoxProps): React.JSX.Element;
|
|
43
45
|
|
|
44
|
-
export { Panel, PanelBody, PanelFooter, PanelHeader, PanelHeaderTitle, createPanel as __createPanel, registerPanel as __registerPanel, init };
|
|
46
|
+
export { Panel, PanelBody, PanelFooter, PanelHeader, PanelHeaderTitle, createPanel as __createPanel, registerPanel as __registerPanel, createPanel, init, registerPanel };
|
package/dist/index.d.ts
CHANGED
|
@@ -9,11 +9,13 @@ type PanelDeclaration<TOnOpenReturn = unknown> = {
|
|
|
9
9
|
id: string;
|
|
10
10
|
component: ComponentType;
|
|
11
11
|
isOpenPreviousElement?: boolean;
|
|
12
|
+
keepMounted?: boolean;
|
|
12
13
|
} & UseActionsOptions<TOnOpenReturn> & UseRouteStatusOptions;
|
|
13
|
-
declare function createPanel<TOnOpenReturn>({ id, component, onOpen, onClose, allowedEditModes, blockOnKitRoutes, isOpenPreviousElement, }: PanelDeclaration<TOnOpenReturn>): {
|
|
14
|
+
declare function createPanel<TOnOpenReturn>({ id, component, onOpen, onClose, allowedEditModes, blockOnKitRoutes, isOpenPreviousElement, keepMounted, }: PanelDeclaration<TOnOpenReturn>): {
|
|
14
15
|
panel: {
|
|
15
16
|
id: string;
|
|
16
17
|
component: ComponentType;
|
|
18
|
+
keepMounted: boolean;
|
|
17
19
|
};
|
|
18
20
|
usePanelStatus: UseStatus;
|
|
19
21
|
usePanelActions: () => {
|
|
@@ -21,7 +23,7 @@ declare function createPanel<TOnOpenReturn>({ id, component, onOpen, onClose, al
|
|
|
21
23
|
close: () => Promise<void>;
|
|
22
24
|
};
|
|
23
25
|
};
|
|
24
|
-
declare function registerPanel({ id, component }: Pick<PanelDeclaration, 'id' | 'component'>): void;
|
|
26
|
+
declare function registerPanel({ id, component, keepMounted, }: Pick<PanelDeclaration, 'id' | 'component' | 'keepMounted'>): void;
|
|
25
27
|
type UseStatus = () => {
|
|
26
28
|
isOpen: boolean;
|
|
27
29
|
isBlocked: boolean;
|
|
@@ -41,4 +43,4 @@ declare function PanelBody({ children, sx, ...props }: BoxProps): React.JSX.Elem
|
|
|
41
43
|
|
|
42
44
|
declare function PanelFooter({ children, sx, ...props }: BoxProps): React.JSX.Element;
|
|
43
45
|
|
|
44
|
-
export { Panel, PanelBody, PanelFooter, PanelHeader, PanelHeaderTitle, createPanel as __createPanel, registerPanel as __registerPanel, init };
|
|
46
|
+
export { Panel, PanelBody, PanelFooter, PanelHeader, PanelHeaderTitle, createPanel as __createPanel, registerPanel as __registerPanel, createPanel, init, registerPanel };
|
package/dist/index.js
CHANGED
|
@@ -37,7 +37,9 @@ __export(index_exports, {
|
|
|
37
37
|
PanelHeaderTitle: () => panel_header_title_default,
|
|
38
38
|
__createPanel: () => createPanel,
|
|
39
39
|
__registerPanel: () => registerPanel,
|
|
40
|
-
|
|
40
|
+
createPanel: () => createPanel,
|
|
41
|
+
init: () => init,
|
|
42
|
+
registerPanel: () => registerPanel
|
|
41
43
|
});
|
|
42
44
|
module.exports = __toCommonJS(index_exports);
|
|
43
45
|
|
|
@@ -47,14 +49,33 @@ var import_store6 = require("@elementor/store");
|
|
|
47
49
|
|
|
48
50
|
// src/components/internal/panels.tsx
|
|
49
51
|
var React2 = __toESM(require("react"));
|
|
50
|
-
|
|
51
|
-
// src/hooks/use-open-panel-injection.ts
|
|
52
|
-
var import_react = require("react");
|
|
53
|
-
var import_store2 = require("@elementor/store");
|
|
52
|
+
var import_store4 = require("@elementor/store");
|
|
54
53
|
|
|
55
54
|
// src/location.ts
|
|
56
55
|
var import_locations = require("@elementor/locations");
|
|
57
|
-
var
|
|
56
|
+
var panelsMeta = /* @__PURE__ */ new Map();
|
|
57
|
+
var { inject: baseInject, useInjections: baseUseInjections, getInjections } = (0, import_locations.createLocation)();
|
|
58
|
+
(0, import_locations.__registerFlushInjections)(() => {
|
|
59
|
+
panelsMeta.clear();
|
|
60
|
+
});
|
|
61
|
+
function injectIntoPanels({
|
|
62
|
+
id,
|
|
63
|
+
component,
|
|
64
|
+
keepMounted
|
|
65
|
+
}) {
|
|
66
|
+
const existedBefore = getInjections().some((injection) => injection.id === id);
|
|
67
|
+
baseInject({ id, component });
|
|
68
|
+
if (!existedBefore) {
|
|
69
|
+
panelsMeta.set(id, { keepMounted });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function usePanelsInjections() {
|
|
73
|
+
const injections = baseUseInjections();
|
|
74
|
+
return injections.map((injection) => ({
|
|
75
|
+
...injection,
|
|
76
|
+
keepMounted: panelsMeta.get(injection.id)?.keepMounted ?? false
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
58
79
|
|
|
59
80
|
// src/store/selectors.ts
|
|
60
81
|
var selectOpenId = (state) => state.panels.openId;
|
|
@@ -79,21 +100,14 @@ var slice_default = (0, import_store.__createSlice)({
|
|
|
79
100
|
}
|
|
80
101
|
});
|
|
81
102
|
|
|
82
|
-
// src/hooks/use-open-panel-injection.ts
|
|
83
|
-
function useOpenPanelInjection() {
|
|
84
|
-
const injections = usePanelsInjections();
|
|
85
|
-
const openId = (0, import_store2.__useSelector)(selectOpenId);
|
|
86
|
-
return (0, import_react.useMemo)(() => injections.find((injection) => openId === injection.id), [injections, openId]);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
103
|
// src/components/internal/portal.tsx
|
|
90
104
|
var React = __toESM(require("react"));
|
|
91
|
-
var
|
|
105
|
+
var import_react = require("react");
|
|
92
106
|
var import_ui = require("@elementor/ui");
|
|
93
107
|
|
|
94
108
|
// src/sync.ts
|
|
95
109
|
var import_editor_v1_adapters = require("@elementor/editor-v1-adapters");
|
|
96
|
-
var
|
|
110
|
+
var import_store2 = require("@elementor/store");
|
|
97
111
|
var V2_PANEL = "panel/v2";
|
|
98
112
|
function getPortalContainer() {
|
|
99
113
|
return document.querySelector("#elementor-panel-inner");
|
|
@@ -106,7 +120,7 @@ function sync() {
|
|
|
106
120
|
el.setAttribute("inert", "true");
|
|
107
121
|
});
|
|
108
122
|
});
|
|
109
|
-
(0, import_editor_v1_adapters.__privateListenTo)((0, import_editor_v1_adapters.routeCloseEvent)(V2_PANEL), () => selectOpenId((0,
|
|
123
|
+
(0, import_editor_v1_adapters.__privateListenTo)((0, import_editor_v1_adapters.routeCloseEvent)(V2_PANEL), () => selectOpenId((0, import_store2.__getState)()) && (0, import_store2.__dispatch)(slice_default.actions.close()));
|
|
110
124
|
(0, import_editor_v1_adapters.__privateListenTo)((0, import_editor_v1_adapters.routeCloseEvent)(V2_PANEL), () => {
|
|
111
125
|
getV1PanelElements().forEach((el) => {
|
|
112
126
|
el.removeAttribute("hidden");
|
|
@@ -150,8 +164,8 @@ function subscribe({
|
|
|
150
164
|
callback
|
|
151
165
|
}) {
|
|
152
166
|
let prev;
|
|
153
|
-
(0,
|
|
154
|
-
const current = on((0,
|
|
167
|
+
(0, import_store2.__subscribe)(() => {
|
|
168
|
+
const current = on((0, import_store2.__getState)());
|
|
155
169
|
if (when({ prev, current })) {
|
|
156
170
|
callback({ prev, current });
|
|
157
171
|
}
|
|
@@ -161,21 +175,39 @@ function subscribe({
|
|
|
161
175
|
|
|
162
176
|
// src/components/internal/portal.tsx
|
|
163
177
|
function Portal(props) {
|
|
164
|
-
const
|
|
165
|
-
|
|
178
|
+
const [container, setContainer] = (0, import_react.useState)(() => getPortalContainer());
|
|
179
|
+
(0, import_react.useEffect)(() => {
|
|
180
|
+
if (container) {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const resolveContainer = () => {
|
|
184
|
+
const portalContainer = getPortalContainer();
|
|
185
|
+
if (portalContainer) {
|
|
186
|
+
setContainer(portalContainer);
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
window.addEventListener("elementor/panel/init", resolveContainer);
|
|
190
|
+
resolveContainer();
|
|
191
|
+
return () => {
|
|
192
|
+
window.removeEventListener("elementor/panel/init", resolveContainer);
|
|
193
|
+
};
|
|
194
|
+
}, [container]);
|
|
195
|
+
if (!container) {
|
|
166
196
|
return null;
|
|
167
197
|
}
|
|
168
|
-
return /* @__PURE__ */ React.createElement(import_ui.Portal, { container
|
|
198
|
+
return /* @__PURE__ */ React.createElement(import_ui.Portal, { container, ...props });
|
|
169
199
|
}
|
|
170
200
|
|
|
171
201
|
// src/components/internal/panels.tsx
|
|
172
202
|
function Panels() {
|
|
173
|
-
const
|
|
174
|
-
const
|
|
175
|
-
|
|
203
|
+
const injections = usePanelsInjections();
|
|
204
|
+
const openId = (0, import_store4.__useSelector)(selectOpenId);
|
|
205
|
+
const persistentInjections = injections.filter((injection) => injection.keepMounted);
|
|
206
|
+
const openInjection = injections.find((injection) => openId === injection.id);
|
|
207
|
+
if (!persistentInjections.length && !openInjection) {
|
|
176
208
|
return null;
|
|
177
209
|
}
|
|
178
|
-
return /* @__PURE__ */ React2.createElement(Portal, null, /* @__PURE__ */ React2.createElement(Component, null));
|
|
210
|
+
return /* @__PURE__ */ React2.createElement(Portal, null, persistentInjections.map(({ id, component: Component }) => /* @__PURE__ */ React2.createElement("div", { key: id, style: { display: openId === id ? "contents" : "none" } }, /* @__PURE__ */ React2.createElement(Component, null))), openInjection && !openInjection.keepMounted && /* @__PURE__ */ React2.createElement(openInjection.component, null));
|
|
179
211
|
}
|
|
180
212
|
|
|
181
213
|
// src/init.ts
|
|
@@ -195,7 +227,8 @@ function createPanel({
|
|
|
195
227
|
onClose,
|
|
196
228
|
allowedEditModes,
|
|
197
229
|
blockOnKitRoutes,
|
|
198
|
-
isOpenPreviousElement = false
|
|
230
|
+
isOpenPreviousElement = false,
|
|
231
|
+
keepMounted = false
|
|
199
232
|
}) {
|
|
200
233
|
const usePanelStatus = createUseStatus(id, {
|
|
201
234
|
allowedEditModes,
|
|
@@ -213,16 +246,22 @@ function createPanel({
|
|
|
213
246
|
return {
|
|
214
247
|
panel: {
|
|
215
248
|
id,
|
|
216
|
-
component
|
|
249
|
+
component,
|
|
250
|
+
keepMounted
|
|
217
251
|
},
|
|
218
252
|
usePanelStatus,
|
|
219
253
|
usePanelActions
|
|
220
254
|
};
|
|
221
255
|
}
|
|
222
|
-
function registerPanel({
|
|
256
|
+
function registerPanel({
|
|
257
|
+
id,
|
|
258
|
+
component,
|
|
259
|
+
keepMounted
|
|
260
|
+
}) {
|
|
223
261
|
injectIntoPanels({
|
|
224
262
|
id,
|
|
225
|
-
component
|
|
263
|
+
component,
|
|
264
|
+
keepMounted
|
|
226
265
|
});
|
|
227
266
|
}
|
|
228
267
|
function createUseStatus(id, options = {}) {
|
|
@@ -312,7 +351,7 @@ function PanelHeader({ children, ...props }) {
|
|
|
312
351
|
|
|
313
352
|
// src/components/external/panel-header-title.tsx
|
|
314
353
|
var React5 = __toESM(require("react"));
|
|
315
|
-
var
|
|
354
|
+
var import_react2 = require("react");
|
|
316
355
|
var import_ui4 = require("@elementor/ui");
|
|
317
356
|
var Typography = (0, import_ui4.styled)(import_ui4.Typography)(({ theme, variant = "body1" }) => {
|
|
318
357
|
if (variant === "inherit") {
|
|
@@ -324,7 +363,7 @@ var Typography = (0, import_ui4.styled)(import_ui4.Typography)(({ theme, variant
|
|
|
324
363
|
}
|
|
325
364
|
};
|
|
326
365
|
});
|
|
327
|
-
var PanelHeaderTitle = (0,
|
|
366
|
+
var PanelHeaderTitle = (0, import_react2.forwardRef)(({ children, ...props }, ref) => {
|
|
328
367
|
return /* @__PURE__ */ React5.createElement(Typography, { ref, component: "h2", variant: "subtitle1", ...props }, children);
|
|
329
368
|
});
|
|
330
369
|
var panel_header_title_default = PanelHeaderTitle;
|
|
@@ -377,6 +416,8 @@ function PanelFooter({ children, sx, ...props }) {
|
|
|
377
416
|
PanelHeaderTitle,
|
|
378
417
|
__createPanel,
|
|
379
418
|
__registerPanel,
|
|
380
|
-
|
|
419
|
+
createPanel,
|
|
420
|
+
init,
|
|
421
|
+
registerPanel
|
|
381
422
|
});
|
|
382
423
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/init.ts","../src/components/internal/panels.tsx","../src/hooks/use-open-panel-injection.ts","../src/location.ts","../src/store/selectors.ts","../src/store/slice.ts","../src/components/internal/portal.tsx","../src/sync.ts","../src/api.ts","../src/components/external/panel.tsx","../src/components/external/panel-header.tsx","../src/components/external/panel-header-title.tsx","../src/components/external/panel-body.tsx","../src/components/external/panel-footer.tsx"],"sourcesContent":["export { init } from './init';\n\nexport { createPanel as __createPanel, registerPanel as __registerPanel } from './api';\n\nexport * from './components/external';\n","import { injectIntoTop } from '@elementor/editor';\nimport { __registerSlice } from '@elementor/store';\n\nimport Panels from './components/internal/panels';\nimport { slice } from './store';\nimport { sync } from './sync';\n\nexport function init() {\n\tsync();\n\n\t__registerSlice( slice );\n\n\tinjectIntoTop( { id: 'panels', component: Panels } );\n}\n","import * as React from 'react';\n\nimport useOpenPanelInjection from '../../hooks/use-open-panel-injection';\nimport Portal from './portal';\n\nexport default function Panels() {\n\tconst openPanel = useOpenPanelInjection();\n\tconst Component = openPanel?.component ?? null;\n\n\tif ( ! Component ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<Portal>\n\t\t\t<Component />\n\t\t</Portal>\n\t);\n}\n","import { useMemo } from 'react';\nimport { __useSelector as useSelector } from '@elementor/store';\n\nimport { usePanelsInjections } from '../location';\nimport { selectOpenId } from '../store';\n\nexport default function useOpenPanelInjection() {\n\tconst injections = usePanelsInjections();\n\tconst openId = useSelector( selectOpenId );\n\n\treturn useMemo( () => injections.find( ( injection ) => openId === injection.id ), [ injections, openId ] );\n}\n","import { createLocation } from '@elementor/locations';\n\nexport const { inject: injectIntoPanels, useInjections: usePanelsInjections } = createLocation();\n","import { type SliceState } from '@elementor/store';\n\nimport type slice from './slice';\n\ntype State = SliceState< typeof slice >;\n\nexport const selectOpenId = ( state: State ) => state.panels.openId;\n","import { __createSlice, type PayloadAction } from '@elementor/store';\n\nconst initialState: {\n\topenId: string | null;\n} = {\n\topenId: null,\n};\n\nexport default __createSlice( {\n\tname: 'panels',\n\tinitialState,\n\treducers: {\n\t\topen( state, action: PayloadAction< string > ) {\n\t\t\tstate.openId = action.payload;\n\t\t},\n\t\tclose( state, action: PayloadAction< string | undefined > ) {\n\t\t\tif ( ! action.payload || state.openId === action.payload ) {\n\t\t\t\tstate.openId = null;\n\t\t\t}\n\t\t},\n\t},\n} );\n","import * as React from 'react';\nimport { useRef } from 'react';\nimport { Portal as BasePortal, type PortalProps } from '@elementor/ui';\n\nimport { getPortalContainer } from '../../sync';\n\ntype Props = Omit< PortalProps, 'container' >;\n\nexport default function Portal( props: Props ) {\n\tconst containerRef = useRef( getPortalContainer );\n\n\tif ( ! containerRef.current ) {\n\t\treturn null;\n\t}\n\n\treturn <BasePortal container={ containerRef.current } { ...props } />;\n}\n","import {\n\t__privateIsRouteActive as isRouteActive,\n\t__privateListenTo as listenTo,\n\t__privateOpenRoute as openRoute,\n\t__privateRegisterRoute as registerRoute,\n\trouteCloseEvent,\n\trouteOpenEvent,\n\twindowEvent,\n} from '@elementor/editor-v1-adapters';\nimport { __dispatch, __getState, __subscribe as originalSubscribe } from '@elementor/store';\n\nimport { selectOpenId, slice } from './store';\n\nexport const V2_PANEL = 'panel/v2';\n\nexport function getPortalContainer() {\n\treturn document.querySelector( '#elementor-panel-inner' );\n}\n\nexport function sync() {\n\t// Register the V2 panel route on panel init.\n\tlistenTo( windowEvent( 'elementor/panel/init' ), () => registerRoute( V2_PANEL ) );\n\n\t// On empty route open, hide V1 panel elements.\n\tlistenTo( routeOpenEvent( V2_PANEL ), () => {\n\t\tgetV1PanelElements().forEach( ( el ) => {\n\t\t\tel.setAttribute( 'hidden', 'hidden' );\n\t\t\tel.setAttribute( 'inert', 'true' );\n\t\t} );\n\t} );\n\n\t// On empty route close, close the V2 panel.\n\tlistenTo( routeCloseEvent( V2_PANEL ), () => selectOpenId( __getState() ) && __dispatch( slice.actions.close() ) );\n\n\t// On empty route close, show V1 panel elements.\n\tlistenTo( routeCloseEvent( V2_PANEL ), () => {\n\t\tgetV1PanelElements().forEach( ( el ) => {\n\t\t\tel.removeAttribute( 'hidden' );\n\t\t\tel.removeAttribute( 'inert' );\n\t\t} );\n\t} );\n\n\t// On V2 panel open, open the V2 panel route.\n\tlistenTo( windowEvent( 'elementor/panel/init' ), () =>\n\t\tsubscribe( {\n\t\t\ton: ( state ) => selectOpenId( state ),\n\t\t\twhen: ( { prev, current } ) => !! ( ! prev && current ), // is panel opened\n\t\t\tcallback: () => openRoute( V2_PANEL ),\n\t\t} )\n\t);\n\n\t// On V2 panel close, close the V2 panel route.\n\tlistenTo( windowEvent( 'elementor/panel/init' ), () =>\n\t\tsubscribe( {\n\t\t\ton: ( state ) => selectOpenId( state ),\n\t\t\twhen: ( { prev, current } ) => !! ( ! current && prev ), // is panel closed\n\t\t\tcallback: () => isRouteActive( V2_PANEL ) && openRoute( getDefaultRoute() ),\n\t\t} )\n\t);\n}\n\nfunction getV1PanelElements() {\n\tconst v1ElementsSelector = [\n\t\t'#elementor-panel-header-wrapper',\n\t\t'#elementor-panel-content-wrapper',\n\t\t'#elementor-panel-state-loading',\n\t].join( ', ' );\n\n\treturn document.querySelectorAll( v1ElementsSelector );\n}\n\nfunction getDefaultRoute() {\n\ttype ExtendedWindow = Window & {\n\t\telementor?: {\n\t\t\tdocuments?: {\n\t\t\t\tgetCurrent?: () => {\n\t\t\t\t\tconfig?: {\n\t\t\t\t\t\tpanel?: {\n\t\t\t\t\t\t\tdefault_route?: string;\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};\n\t};\n\n\tconst defaultRoute = ( window as unknown as ExtendedWindow )?.elementor?.documents?.getCurrent?.()?.config?.panel\n\t\t?.default_route;\n\n\treturn defaultRoute || 'panel/elements/categories';\n}\n\nfunction subscribe< TVal >( {\n\ton,\n\twhen,\n\tcallback,\n}: {\n\ton: ( state: ReturnType< typeof __getState > ) => TVal;\n\twhen: ( { prev, current }: { prev: TVal; current: TVal } ) => boolean;\n\tcallback: ( { prev, current }: { prev: TVal; current: TVal } ) => void;\n} ) {\n\tlet prev: TVal;\n\n\toriginalSubscribe( () => {\n\t\tconst current = on( __getState() );\n\n\t\tif ( when( { prev, current } ) ) {\n\t\t\tcallback( { prev, current } );\n\t\t}\n\n\t\tprev = current;\n\t} );\n}\n","import { type ComponentType } from 'react';\nimport {\n\t__privateRunCommand as runCommand,\n\t__privateUseRouteStatus as useRouteStatus,\n\ttype UseRouteStatusOptions,\n} from '@elementor/editor-v1-adapters';\nimport { __useDispatch as useDispatch, __useSelector as useSelector } from '@elementor/store';\n\nimport { injectIntoPanels } from './location';\nimport { selectOpenId, slice } from './store';\nimport { V2_PANEL } from './sync';\n\nexport type PanelDeclaration< TOnOpenReturn = unknown > = {\n\tid: string;\n\tcomponent: ComponentType;\n\tisOpenPreviousElement?: boolean;\n} & UseActionsOptions< TOnOpenReturn > &\n\tUseRouteStatusOptions;\n\nexport function createPanel< TOnOpenReturn >( {\n\tid,\n\tcomponent,\n\tonOpen,\n\tonClose,\n\tallowedEditModes,\n\tblockOnKitRoutes,\n\tisOpenPreviousElement = false,\n}: PanelDeclaration< TOnOpenReturn > ) {\n\tconst usePanelStatus = createUseStatus( id, {\n\t\tallowedEditModes,\n\t\tblockOnKitRoutes,\n\t} );\n\n\tconst usePanelActions = createUseActions(\n\t\tid,\n\t\tusePanelStatus,\n\t\t{\n\t\t\tonOpen,\n\t\t\tonClose,\n\t\t},\n\t\tisOpenPreviousElement\n\t);\n\n\treturn {\n\t\tpanel: {\n\t\t\tid,\n\t\t\tcomponent,\n\t\t},\n\t\tusePanelStatus,\n\t\tusePanelActions,\n\t};\n}\n\nexport function registerPanel( { id, component }: Pick< PanelDeclaration, 'id' | 'component' > ) {\n\tinjectIntoPanels( {\n\t\tid,\n\t\tcomponent,\n\t} );\n}\n\ntype UseStatus = () => {\n\tisOpen: boolean;\n\tisBlocked: boolean;\n};\n\nfunction createUseStatus( id: PanelDeclaration[ 'id' ], options: UseRouteStatusOptions = {} ): UseStatus {\n\treturn () => {\n\t\tconst openPanelId = useSelector( selectOpenId );\n\t\tconst v1PanelStatus = useRouteStatus( V2_PANEL, options );\n\n\t\treturn {\n\t\t\tisOpen: openPanelId === id && v1PanelStatus.isActive,\n\t\t\tisBlocked: v1PanelStatus.isBlocked,\n\t\t};\n\t};\n}\n\ntype UseActionsOptions< TOnOpenReturn > = {\n\tonOpen?: () => TOnOpenReturn;\n\tonClose?: ( state: TOnOpenReturn ) => Promise< void >;\n};\n\nfunction createUseActions< TOnOpenReturn >(\n\tid: PanelDeclaration[ 'id' ],\n\tuseStatus: UseStatus,\n\toptions: UseActionsOptions< TOnOpenReturn > = {},\n\tisOpenPreviousElement?: boolean\n) {\n\tlet stateSnapshot: TOnOpenReturn | null = null;\n\tlet previousSelectedElement: string | null = null;\n\n\treturn () => {\n\t\tconst dispatch = useDispatch();\n\t\tconst { isBlocked } = useStatus();\n\n\t\treturn {\n\t\t\topen: async () => {\n\t\t\t\tif ( isBlocked ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( isOpenPreviousElement ) {\n\t\t\t\t\tpreviousSelectedElement =\n\t\t\t\t\t\twindow.elementor?.selection?.getElements?.()[ 0 ]?.model.get( 'id' ) ?? null;\n\t\t\t\t}\n\n\t\t\t\tdispatch( slice.actions.open( id ) );\n\n\t\t\t\tstateSnapshot = options.onOpen?.() ?? null;\n\t\t\t},\n\t\t\tclose: async () => {\n\t\t\t\tif ( isBlocked ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdispatch( slice.actions.close( id ) );\n\n\t\t\t\tawait options.onClose?.( stateSnapshot as TOnOpenReturn );\n\n\t\t\t\tif ( previousSelectedElement ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst container = window.elementor?.getContainer?.( previousSelectedElement );\n\t\t\t\t\t\trunCommand( 'document/elements/select', { container } );\n\t\t\t\t\t} catch {}\n\t\t\t\t\tpreviousSelectedElement = null;\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t};\n}\n","import * as React from 'react';\nimport { Drawer, type DrawerProps } from '@elementor/ui';\n\nexport default function Panel( { children, sx, ...props }: DrawerProps ) {\n\treturn (\n\t\t<Drawer\n\t\t\topen={ true }\n\t\t\tvariant=\"persistent\"\n\t\t\tanchor=\"left\"\n\t\t\tPaperProps={ {\n\t\t\t\tsx: {\n\t\t\t\t\tposition: 'relative',\n\t\t\t\t\twidth: '100%',\n\t\t\t\t\tbgcolor: 'background.default',\n\t\t\t\t\tborder: 'none',\n\t\t\t\t},\n\t\t\t} }\n\t\t\tsx={ { height: '100%', ...sx } }\n\t\t\t{ ...props }\n\t\t>\n\t\t\t{ children }\n\t\t</Drawer>\n\t);\n}\n","import * as React from 'react';\nimport { Box, type BoxProps, styled } from '@elementor/ui';\n\nconst Header = styled( Box )( ( { theme } ) => ( {\n\theight: theme?.spacing( 6 ) || '48px',\n\tdisplay: 'flex',\n\talignItems: 'center',\n\tjustifyContent: 'center',\n\tgap: theme?.spacing( 0.5 ) || '4px',\n} ) );\n\nexport default function PanelHeader( { children, ...props }: BoxProps ) {\n\treturn (\n\t\t<>\n\t\t\t<Header component=\"header\" { ...props }>\n\t\t\t\t{ children }\n\t\t\t</Header>\n\t\t</>\n\t);\n}\n","import * as React from 'react';\nimport { forwardRef } from 'react';\nimport { styled, Typography as TypographySource, type TypographyProps } from '@elementor/ui';\n\n// This is to override Editor reset.scss that overrides eui styles\nconst Typography = styled( TypographySource )< TypographyProps >( ( { theme, variant = 'body1' } ) => {\n\tif ( variant === 'inherit' ) {\n\t\treturn {};\n\t}\n\n\treturn {\n\t\t'&.MuiTypography-root': {\n\t\t\t...theme.typography[ variant ],\n\t\t},\n\t};\n} );\n\nconst PanelHeaderTitle = forwardRef< HTMLHeadingElement, TypographyProps >( ( { children, ...props }, ref ) => {\n\treturn (\n\t\t<Typography ref={ ref } component=\"h2\" variant=\"subtitle1\" { ...props }>\n\t\t\t{ children }\n\t\t</Typography>\n\t);\n} );\n\nexport default PanelHeaderTitle;\n","import * as React from 'react';\nimport { Box, type BoxProps } from '@elementor/ui';\n\nexport default function PanelBody( { children, sx, ...props }: BoxProps ) {\n\treturn (\n\t\t<Box\n\t\t\tcomponent=\"main\"\n\t\t\tsx={ {\n\t\t\t\toverflowY: 'auto',\n\t\t\t\theight: '100%',\n\t\t\t\t...sx,\n\t\t\t} }\n\t\t\t{ ...props }\n\t\t>\n\t\t\t{ children }\n\t\t</Box>\n\t);\n}\n","import * as React from 'react';\nimport { Box, type BoxProps, Divider } from '@elementor/ui';\n\nexport default function PanelFooter( { children, sx, ...props }: BoxProps ) {\n\treturn (\n\t\t<>\n\t\t\t<Divider />\n\t\t\t<Box\n\t\t\t\tcomponent=\"footer\"\n\t\t\t\tsx={ {\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\tposition: 'sticky',\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tpx: 2,\n\t\t\t\t\tpy: 1.5,\n\t\t\t\t} }\n\t\t\t\t{ ...props }\n\t\t\t>\n\t\t\t\t{ children }\n\t\t\t</Box>\n\t\t</>\n\t);\n}\n"],"mappings":"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","names":["import_store","React","import_store","useSelector","import_react","import_store","listenTo","registerRoute","openRoute","isRouteActive","originalSubscribe","BasePortal","import_editor_v1_adapters","import_store","useSelector","useRouteStatus","useDispatch","runCommand","React","import_ui","React","import_ui","React","import_react","import_ui","TypographySource","React","import_ui","React","import_ui"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/init.ts","../src/components/internal/panels.tsx","../src/location.ts","../src/store/selectors.ts","../src/store/slice.ts","../src/components/internal/portal.tsx","../src/sync.ts","../src/api.ts","../src/components/external/panel.tsx","../src/components/external/panel-header.tsx","../src/components/external/panel-header-title.tsx","../src/components/external/panel-body.tsx","../src/components/external/panel-footer.tsx"],"sourcesContent":["export { init } from './init';\n\nexport { createPanel, registerPanel } from './api';\nexport { createPanel as __createPanel, registerPanel as __registerPanel } from './api';\n\nexport * from './components/external';\n","import { injectIntoTop } from '@elementor/editor';\nimport { __registerSlice } from '@elementor/store';\n\nimport Panels from './components/internal/panels';\nimport { slice } from './store';\nimport { sync } from './sync';\n\nexport function init() {\n\tsync();\n\n\t__registerSlice( slice );\n\n\tinjectIntoTop( { id: 'panels', component: Panels } );\n}\n","import * as React from 'react';\nimport { __useSelector as useSelector } from '@elementor/store';\n\nimport { usePanelsInjections } from '../../location';\nimport { selectOpenId } from '../../store';\nimport Portal from './portal';\n\nexport default function Panels() {\n\tconst injections = usePanelsInjections();\n\tconst openId = useSelector( selectOpenId );\n\n\tconst persistentInjections = injections.filter( ( injection ) => injection.keepMounted );\n\tconst openInjection = injections.find( ( injection ) => openId === injection.id );\n\n\tif ( ! persistentInjections.length && ! openInjection ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<Portal>\n\t\t\t{ persistentInjections.map( ( { id, component: Component } ) => (\n\t\t\t\t<div key={ id } style={ { display: openId === id ? 'contents' : 'none' } }>\n\t\t\t\t\t<Component />\n\t\t\t\t</div>\n\t\t\t) ) }\n\t\t\t{ openInjection && ! openInjection.keepMounted && <openInjection.component /> }\n\t\t</Portal>\n\t);\n}\n","import { type ComponentType } from 'react';\nimport { __registerFlushInjections, createLocation } from '@elementor/locations';\n\ntype PanelsInjectionMeta = {\n\tkeepMounted?: boolean;\n};\n\nexport type PanelsInjection = {\n\tid: string;\n\tcomponent: ComponentType;\n\tkeepMounted?: boolean;\n};\n\nconst panelsMeta = new Map< string, PanelsInjectionMeta >();\n\nconst { inject: baseInject, useInjections: baseUseInjections, getInjections } = createLocation();\n\n__registerFlushInjections( () => {\n\tpanelsMeta.clear();\n} );\n\nexport function injectIntoPanels( {\n\tid,\n\tcomponent,\n\tkeepMounted,\n}: {\n\tid: string;\n\tcomponent: ComponentType;\n\tkeepMounted?: boolean;\n} ) {\n\tconst existedBefore = getInjections().some( ( injection ) => injection.id === id );\n\n\tbaseInject( { id, component } );\n\n\tif ( ! existedBefore ) {\n\t\tpanelsMeta.set( id, { keepMounted } );\n\t}\n}\n\nexport function usePanelsInjections(): PanelsInjection[] {\n\tconst injections = baseUseInjections();\n\n\treturn injections.map( ( injection ) => ( {\n\t\t...injection,\n\t\tkeepMounted: panelsMeta.get( injection.id )?.keepMounted ?? false,\n\t} ) );\n}\n","import { type SliceState } from '@elementor/store';\n\nimport type slice from './slice';\n\ntype State = SliceState< typeof slice >;\n\nexport const selectOpenId = ( state: State ) => state.panels.openId;\n","import { __createSlice, type PayloadAction } from '@elementor/store';\n\nconst initialState: {\n\topenId: string | null;\n} = {\n\topenId: null,\n};\n\nexport default __createSlice( {\n\tname: 'panels',\n\tinitialState,\n\treducers: {\n\t\topen( state, action: PayloadAction< string > ) {\n\t\t\tstate.openId = action.payload;\n\t\t},\n\t\tclose( state, action: PayloadAction< string | undefined > ) {\n\t\t\tif ( ! action.payload || state.openId === action.payload ) {\n\t\t\t\tstate.openId = null;\n\t\t\t}\n\t\t},\n\t},\n} );\n","import * as React from 'react';\nimport { useEffect, useState } from 'react';\nimport { Portal as BasePortal, type PortalProps } from '@elementor/ui';\n\nimport { getPortalContainer } from '../../sync';\n\ntype Props = Omit< PortalProps, 'container' >;\n\nexport default function Portal( props: Props ) {\n\tconst [ container, setContainer ] = useState( () => getPortalContainer() );\n\n\tuseEffect( () => {\n\t\tif ( container ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst resolveContainer = () => {\n\t\t\tconst portalContainer = getPortalContainer();\n\n\t\t\tif ( portalContainer ) {\n\t\t\t\tsetContainer( portalContainer );\n\t\t\t}\n\t\t};\n\n\t\twindow.addEventListener( 'elementor/panel/init', resolveContainer );\n\t\tresolveContainer();\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener( 'elementor/panel/init', resolveContainer );\n\t\t};\n\t}, [ container ] );\n\n\tif ( ! container ) {\n\t\treturn null;\n\t}\n\n\treturn <BasePortal container={ container } { ...props } />;\n}\n","import {\n\t__privateIsRouteActive as isRouteActive,\n\t__privateListenTo as listenTo,\n\t__privateOpenRoute as openRoute,\n\t__privateRegisterRoute as registerRoute,\n\trouteCloseEvent,\n\trouteOpenEvent,\n\twindowEvent,\n} from '@elementor/editor-v1-adapters';\nimport { __dispatch, __getState, __subscribe as originalSubscribe } from '@elementor/store';\n\nimport { selectOpenId, slice } from './store';\n\nexport const V2_PANEL = 'panel/v2';\n\nexport function getPortalContainer() {\n\treturn document.querySelector( '#elementor-panel-inner' );\n}\n\nexport function sync() {\n\t// Register the V2 panel route on panel init.\n\tlistenTo( windowEvent( 'elementor/panel/init' ), () => registerRoute( V2_PANEL ) );\n\n\t// On empty route open, hide V1 panel elements.\n\tlistenTo( routeOpenEvent( V2_PANEL ), () => {\n\t\tgetV1PanelElements().forEach( ( el ) => {\n\t\t\tel.setAttribute( 'hidden', 'hidden' );\n\t\t\tel.setAttribute( 'inert', 'true' );\n\t\t} );\n\t} );\n\n\t// On empty route close, close the V2 panel.\n\tlistenTo( routeCloseEvent( V2_PANEL ), () => selectOpenId( __getState() ) && __dispatch( slice.actions.close() ) );\n\n\t// On empty route close, show V1 panel elements.\n\tlistenTo( routeCloseEvent( V2_PANEL ), () => {\n\t\tgetV1PanelElements().forEach( ( el ) => {\n\t\t\tel.removeAttribute( 'hidden' );\n\t\t\tel.removeAttribute( 'inert' );\n\t\t} );\n\t} );\n\n\t// On V2 panel open, open the V2 panel route.\n\tlistenTo( windowEvent( 'elementor/panel/init' ), () =>\n\t\tsubscribe( {\n\t\t\ton: ( state ) => selectOpenId( state ),\n\t\t\twhen: ( { prev, current } ) => !! ( ! prev && current ), // is panel opened\n\t\t\tcallback: () => openRoute( V2_PANEL ),\n\t\t} )\n\t);\n\n\t// On V2 panel close, close the V2 panel route.\n\tlistenTo( windowEvent( 'elementor/panel/init' ), () =>\n\t\tsubscribe( {\n\t\t\ton: ( state ) => selectOpenId( state ),\n\t\t\twhen: ( { prev, current } ) => !! ( ! current && prev ), // is panel closed\n\t\t\tcallback: () => isRouteActive( V2_PANEL ) && openRoute( getDefaultRoute() ),\n\t\t} )\n\t);\n}\n\nfunction getV1PanelElements() {\n\tconst v1ElementsSelector = [\n\t\t'#elementor-panel-header-wrapper',\n\t\t'#elementor-panel-content-wrapper',\n\t\t'#elementor-panel-state-loading',\n\t].join( ', ' );\n\n\treturn document.querySelectorAll( v1ElementsSelector );\n}\n\nfunction getDefaultRoute() {\n\ttype ExtendedWindow = Window & {\n\t\telementor?: {\n\t\t\tdocuments?: {\n\t\t\t\tgetCurrent?: () => {\n\t\t\t\t\tconfig?: {\n\t\t\t\t\t\tpanel?: {\n\t\t\t\t\t\t\tdefault_route?: string;\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};\n\t};\n\n\tconst defaultRoute = ( window as unknown as ExtendedWindow )?.elementor?.documents?.getCurrent?.()?.config?.panel\n\t\t?.default_route;\n\n\treturn defaultRoute || 'panel/elements/categories';\n}\n\nfunction subscribe< TVal >( {\n\ton,\n\twhen,\n\tcallback,\n}: {\n\ton: ( state: ReturnType< typeof __getState > ) => TVal;\n\twhen: ( { prev, current }: { prev: TVal; current: TVal } ) => boolean;\n\tcallback: ( { prev, current }: { prev: TVal; current: TVal } ) => void;\n} ) {\n\tlet prev: TVal;\n\n\toriginalSubscribe( () => {\n\t\tconst current = on( __getState() );\n\n\t\tif ( when( { prev, current } ) ) {\n\t\t\tcallback( { prev, current } );\n\t\t}\n\n\t\tprev = current;\n\t} );\n}\n","import { type ComponentType } from 'react';\nimport {\n\t__privateRunCommand as runCommand,\n\t__privateUseRouteStatus as useRouteStatus,\n\ttype UseRouteStatusOptions,\n} from '@elementor/editor-v1-adapters';\nimport { __useDispatch as useDispatch, __useSelector as useSelector } from '@elementor/store';\n\nimport { injectIntoPanels } from './location';\nimport { selectOpenId, slice } from './store';\nimport { V2_PANEL } from './sync';\n\nexport type PanelDeclaration< TOnOpenReturn = unknown > = {\n\tid: string;\n\tcomponent: ComponentType;\n\tisOpenPreviousElement?: boolean;\n\tkeepMounted?: boolean;\n} & UseActionsOptions< TOnOpenReturn > &\n\tUseRouteStatusOptions;\n\nexport function createPanel< TOnOpenReturn >( {\n\tid,\n\tcomponent,\n\tonOpen,\n\tonClose,\n\tallowedEditModes,\n\tblockOnKitRoutes,\n\tisOpenPreviousElement = false,\n\tkeepMounted = false,\n}: PanelDeclaration< TOnOpenReturn > ) {\n\tconst usePanelStatus = createUseStatus( id, {\n\t\tallowedEditModes,\n\t\tblockOnKitRoutes,\n\t} );\n\n\tconst usePanelActions = createUseActions(\n\t\tid,\n\t\tusePanelStatus,\n\t\t{\n\t\t\tonOpen,\n\t\t\tonClose,\n\t\t},\n\t\tisOpenPreviousElement\n\t);\n\n\treturn {\n\t\tpanel: {\n\t\t\tid,\n\t\t\tcomponent,\n\t\t\tkeepMounted,\n\t\t},\n\t\tusePanelStatus,\n\t\tusePanelActions,\n\t};\n}\n\nexport function registerPanel( {\n\tid,\n\tcomponent,\n\tkeepMounted,\n}: Pick< PanelDeclaration, 'id' | 'component' | 'keepMounted' > ) {\n\tinjectIntoPanels( {\n\t\tid,\n\t\tcomponent,\n\t\tkeepMounted,\n\t} );\n}\n\ntype UseStatus = () => {\n\tisOpen: boolean;\n\tisBlocked: boolean;\n};\n\nfunction createUseStatus( id: PanelDeclaration[ 'id' ], options: UseRouteStatusOptions = {} ): UseStatus {\n\treturn () => {\n\t\tconst openPanelId = useSelector( selectOpenId );\n\t\tconst v1PanelStatus = useRouteStatus( V2_PANEL, options );\n\n\t\treturn {\n\t\t\tisOpen: openPanelId === id && v1PanelStatus.isActive,\n\t\t\tisBlocked: v1PanelStatus.isBlocked,\n\t\t};\n\t};\n}\n\ntype UseActionsOptions< TOnOpenReturn > = {\n\tonOpen?: () => TOnOpenReturn;\n\tonClose?: ( state: TOnOpenReturn ) => Promise< void >;\n};\n\nfunction createUseActions< TOnOpenReturn >(\n\tid: PanelDeclaration[ 'id' ],\n\tuseStatus: UseStatus,\n\toptions: UseActionsOptions< TOnOpenReturn > = {},\n\tisOpenPreviousElement?: boolean\n) {\n\tlet stateSnapshot: TOnOpenReturn | null = null;\n\tlet previousSelectedElement: string | null = null;\n\n\treturn () => {\n\t\tconst dispatch = useDispatch();\n\t\tconst { isBlocked } = useStatus();\n\n\t\treturn {\n\t\t\topen: async () => {\n\t\t\t\tif ( isBlocked ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( isOpenPreviousElement ) {\n\t\t\t\t\tpreviousSelectedElement =\n\t\t\t\t\t\twindow.elementor?.selection?.getElements?.()[ 0 ]?.model.get( 'id' ) ?? null;\n\t\t\t\t}\n\n\t\t\t\tdispatch( slice.actions.open( id ) );\n\n\t\t\t\tstateSnapshot = options.onOpen?.() ?? null;\n\t\t\t},\n\t\t\tclose: async () => {\n\t\t\t\tif ( isBlocked ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdispatch( slice.actions.close( id ) );\n\n\t\t\t\tawait options.onClose?.( stateSnapshot as TOnOpenReturn );\n\n\t\t\t\tif ( previousSelectedElement ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst container = window.elementor?.getContainer?.( previousSelectedElement );\n\t\t\t\t\t\trunCommand( 'document/elements/select', { container } );\n\t\t\t\t\t} catch {}\n\t\t\t\t\tpreviousSelectedElement = null;\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t};\n}\n","import * as React from 'react';\nimport { Drawer, type DrawerProps } from '@elementor/ui';\n\nexport default function Panel( { children, sx, ...props }: DrawerProps ) {\n\treturn (\n\t\t<Drawer\n\t\t\topen={ true }\n\t\t\tvariant=\"persistent\"\n\t\t\tanchor=\"left\"\n\t\t\tPaperProps={ {\n\t\t\t\tsx: {\n\t\t\t\t\tposition: 'relative',\n\t\t\t\t\twidth: '100%',\n\t\t\t\t\tbgcolor: 'background.default',\n\t\t\t\t\tborder: 'none',\n\t\t\t\t},\n\t\t\t} }\n\t\t\tsx={ { height: '100%', ...sx } }\n\t\t\t{ ...props }\n\t\t>\n\t\t\t{ children }\n\t\t</Drawer>\n\t);\n}\n","import * as React from 'react';\nimport { Box, type BoxProps, styled } from '@elementor/ui';\n\nconst Header = styled( Box )( ( { theme } ) => ( {\n\theight: theme?.spacing( 6 ) || '48px',\n\tdisplay: 'flex',\n\talignItems: 'center',\n\tjustifyContent: 'center',\n\tgap: theme?.spacing( 0.5 ) || '4px',\n} ) );\n\nexport default function PanelHeader( { children, ...props }: BoxProps ) {\n\treturn (\n\t\t<>\n\t\t\t<Header component=\"header\" { ...props }>\n\t\t\t\t{ children }\n\t\t\t</Header>\n\t\t</>\n\t);\n}\n","import * as React from 'react';\nimport { forwardRef } from 'react';\nimport { styled, Typography as TypographySource, type TypographyProps } from '@elementor/ui';\n\n// This is to override Editor reset.scss that overrides eui styles\nconst Typography = styled( TypographySource )< TypographyProps >( ( { theme, variant = 'body1' } ) => {\n\tif ( variant === 'inherit' ) {\n\t\treturn {};\n\t}\n\n\treturn {\n\t\t'&.MuiTypography-root': {\n\t\t\t...theme.typography[ variant ],\n\t\t},\n\t};\n} );\n\nconst PanelHeaderTitle = forwardRef< HTMLHeadingElement, TypographyProps >( ( { children, ...props }, ref ) => {\n\treturn (\n\t\t<Typography ref={ ref } component=\"h2\" variant=\"subtitle1\" { ...props }>\n\t\t\t{ children }\n\t\t</Typography>\n\t);\n} );\n\nexport default PanelHeaderTitle;\n","import * as React from 'react';\nimport { Box, type BoxProps } from '@elementor/ui';\n\nexport default function PanelBody( { children, sx, ...props }: BoxProps ) {\n\treturn (\n\t\t<Box\n\t\t\tcomponent=\"main\"\n\t\t\tsx={ {\n\t\t\t\toverflowY: 'auto',\n\t\t\t\theight: '100%',\n\t\t\t\t...sx,\n\t\t\t} }\n\t\t\t{ ...props }\n\t\t>\n\t\t\t{ children }\n\t\t</Box>\n\t);\n}\n","import * as React from 'react';\nimport { Box, type BoxProps, Divider } from '@elementor/ui';\n\nexport default function PanelFooter( { children, sx, ...props }: BoxProps ) {\n\treturn (\n\t\t<>\n\t\t\t<Divider />\n\t\t\t<Box\n\t\t\t\tcomponent=\"footer\"\n\t\t\t\tsx={ {\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\tposition: 'sticky',\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tpx: 2,\n\t\t\t\t\tpy: 1.5,\n\t\t\t\t} }\n\t\t\t\t{ ...props }\n\t\t\t>\n\t\t\t\t{ children }\n\t\t\t</Box>\n\t\t</>\n\t);\n}\n"],"mappings":"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","names":["import_store","React","import_store","import_store","listenTo","registerRoute","openRoute","isRouteActive","originalSubscribe","BasePortal","useSelector","import_editor_v1_adapters","import_store","useSelector","useRouteStatus","useDispatch","runCommand","React","import_ui","React","import_ui","React","import_react","import_ui","TypographySource","React","import_ui","React","import_ui"]}
|
package/dist/index.mjs
CHANGED
|
@@ -4,14 +4,33 @@ import { __registerSlice } from "@elementor/store";
|
|
|
4
4
|
|
|
5
5
|
// src/components/internal/panels.tsx
|
|
6
6
|
import * as React2 from "react";
|
|
7
|
-
|
|
8
|
-
// src/hooks/use-open-panel-injection.ts
|
|
9
|
-
import { useMemo } from "react";
|
|
10
7
|
import { __useSelector as useSelector } from "@elementor/store";
|
|
11
8
|
|
|
12
9
|
// src/location.ts
|
|
13
|
-
import { createLocation } from "@elementor/locations";
|
|
14
|
-
var
|
|
10
|
+
import { __registerFlushInjections, createLocation } from "@elementor/locations";
|
|
11
|
+
var panelsMeta = /* @__PURE__ */ new Map();
|
|
12
|
+
var { inject: baseInject, useInjections: baseUseInjections, getInjections } = createLocation();
|
|
13
|
+
__registerFlushInjections(() => {
|
|
14
|
+
panelsMeta.clear();
|
|
15
|
+
});
|
|
16
|
+
function injectIntoPanels({
|
|
17
|
+
id,
|
|
18
|
+
component,
|
|
19
|
+
keepMounted
|
|
20
|
+
}) {
|
|
21
|
+
const existedBefore = getInjections().some((injection) => injection.id === id);
|
|
22
|
+
baseInject({ id, component });
|
|
23
|
+
if (!existedBefore) {
|
|
24
|
+
panelsMeta.set(id, { keepMounted });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function usePanelsInjections() {
|
|
28
|
+
const injections = baseUseInjections();
|
|
29
|
+
return injections.map((injection) => ({
|
|
30
|
+
...injection,
|
|
31
|
+
keepMounted: panelsMeta.get(injection.id)?.keepMounted ?? false
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
15
34
|
|
|
16
35
|
// src/store/selectors.ts
|
|
17
36
|
var selectOpenId = (state) => state.panels.openId;
|
|
@@ -36,16 +55,9 @@ var slice_default = __createSlice({
|
|
|
36
55
|
}
|
|
37
56
|
});
|
|
38
57
|
|
|
39
|
-
// src/hooks/use-open-panel-injection.ts
|
|
40
|
-
function useOpenPanelInjection() {
|
|
41
|
-
const injections = usePanelsInjections();
|
|
42
|
-
const openId = useSelector(selectOpenId);
|
|
43
|
-
return useMemo(() => injections.find((injection) => openId === injection.id), [injections, openId]);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
58
|
// src/components/internal/portal.tsx
|
|
47
59
|
import * as React from "react";
|
|
48
|
-
import {
|
|
60
|
+
import { useEffect, useState } from "react";
|
|
49
61
|
import { Portal as BasePortal } from "@elementor/ui";
|
|
50
62
|
|
|
51
63
|
// src/sync.ts
|
|
@@ -126,21 +138,39 @@ function subscribe({
|
|
|
126
138
|
|
|
127
139
|
// src/components/internal/portal.tsx
|
|
128
140
|
function Portal(props) {
|
|
129
|
-
const
|
|
130
|
-
|
|
141
|
+
const [container, setContainer] = useState(() => getPortalContainer());
|
|
142
|
+
useEffect(() => {
|
|
143
|
+
if (container) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const resolveContainer = () => {
|
|
147
|
+
const portalContainer = getPortalContainer();
|
|
148
|
+
if (portalContainer) {
|
|
149
|
+
setContainer(portalContainer);
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
window.addEventListener("elementor/panel/init", resolveContainer);
|
|
153
|
+
resolveContainer();
|
|
154
|
+
return () => {
|
|
155
|
+
window.removeEventListener("elementor/panel/init", resolveContainer);
|
|
156
|
+
};
|
|
157
|
+
}, [container]);
|
|
158
|
+
if (!container) {
|
|
131
159
|
return null;
|
|
132
160
|
}
|
|
133
|
-
return /* @__PURE__ */ React.createElement(BasePortal, { container
|
|
161
|
+
return /* @__PURE__ */ React.createElement(BasePortal, { container, ...props });
|
|
134
162
|
}
|
|
135
163
|
|
|
136
164
|
// src/components/internal/panels.tsx
|
|
137
165
|
function Panels() {
|
|
138
|
-
const
|
|
139
|
-
const
|
|
140
|
-
|
|
166
|
+
const injections = usePanelsInjections();
|
|
167
|
+
const openId = useSelector(selectOpenId);
|
|
168
|
+
const persistentInjections = injections.filter((injection) => injection.keepMounted);
|
|
169
|
+
const openInjection = injections.find((injection) => openId === injection.id);
|
|
170
|
+
if (!persistentInjections.length && !openInjection) {
|
|
141
171
|
return null;
|
|
142
172
|
}
|
|
143
|
-
return /* @__PURE__ */ React2.createElement(Portal, null, /* @__PURE__ */ React2.createElement(Component, null));
|
|
173
|
+
return /* @__PURE__ */ React2.createElement(Portal, null, persistentInjections.map(({ id, component: Component }) => /* @__PURE__ */ React2.createElement("div", { key: id, style: { display: openId === id ? "contents" : "none" } }, /* @__PURE__ */ React2.createElement(Component, null))), openInjection && !openInjection.keepMounted && /* @__PURE__ */ React2.createElement(openInjection.component, null));
|
|
144
174
|
}
|
|
145
175
|
|
|
146
176
|
// src/init.ts
|
|
@@ -163,7 +193,8 @@ function createPanel({
|
|
|
163
193
|
onClose,
|
|
164
194
|
allowedEditModes,
|
|
165
195
|
blockOnKitRoutes,
|
|
166
|
-
isOpenPreviousElement = false
|
|
196
|
+
isOpenPreviousElement = false,
|
|
197
|
+
keepMounted = false
|
|
167
198
|
}) {
|
|
168
199
|
const usePanelStatus = createUseStatus(id, {
|
|
169
200
|
allowedEditModes,
|
|
@@ -181,16 +212,22 @@ function createPanel({
|
|
|
181
212
|
return {
|
|
182
213
|
panel: {
|
|
183
214
|
id,
|
|
184
|
-
component
|
|
215
|
+
component,
|
|
216
|
+
keepMounted
|
|
185
217
|
},
|
|
186
218
|
usePanelStatus,
|
|
187
219
|
usePanelActions
|
|
188
220
|
};
|
|
189
221
|
}
|
|
190
|
-
function registerPanel({
|
|
222
|
+
function registerPanel({
|
|
223
|
+
id,
|
|
224
|
+
component,
|
|
225
|
+
keepMounted
|
|
226
|
+
}) {
|
|
191
227
|
injectIntoPanels({
|
|
192
228
|
id,
|
|
193
|
-
component
|
|
229
|
+
component,
|
|
230
|
+
keepMounted
|
|
194
231
|
});
|
|
195
232
|
}
|
|
196
233
|
function createUseStatus(id, options = {}) {
|
|
@@ -344,6 +381,8 @@ export {
|
|
|
344
381
|
panel_header_title_default as PanelHeaderTitle,
|
|
345
382
|
createPanel as __createPanel,
|
|
346
383
|
registerPanel as __registerPanel,
|
|
347
|
-
|
|
384
|
+
createPanel,
|
|
385
|
+
init,
|
|
386
|
+
registerPanel
|
|
348
387
|
};
|
|
349
388
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/init.ts","../src/components/internal/panels.tsx","../src/hooks/use-open-panel-injection.ts","../src/location.ts","../src/store/selectors.ts","../src/store/slice.ts","../src/components/internal/portal.tsx","../src/sync.ts","../src/api.ts","../src/components/external/panel.tsx","../src/components/external/panel-header.tsx","../src/components/external/panel-header-title.tsx","../src/components/external/panel-body.tsx","../src/components/external/panel-footer.tsx"],"sourcesContent":["import { injectIntoTop } from '@elementor/editor';\nimport { __registerSlice } from '@elementor/store';\n\nimport Panels from './components/internal/panels';\nimport { slice } from './store';\nimport { sync } from './sync';\n\nexport function init() {\n\tsync();\n\n\t__registerSlice( slice );\n\n\tinjectIntoTop( { id: 'panels', component: Panels } );\n}\n","import * as React from 'react';\n\nimport useOpenPanelInjection from '../../hooks/use-open-panel-injection';\nimport Portal from './portal';\n\nexport default function Panels() {\n\tconst openPanel = useOpenPanelInjection();\n\tconst Component = openPanel?.component ?? null;\n\n\tif ( ! Component ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<Portal>\n\t\t\t<Component />\n\t\t</Portal>\n\t);\n}\n","import { useMemo } from 'react';\nimport { __useSelector as useSelector } from '@elementor/store';\n\nimport { usePanelsInjections } from '../location';\nimport { selectOpenId } from '../store';\n\nexport default function useOpenPanelInjection() {\n\tconst injections = usePanelsInjections();\n\tconst openId = useSelector( selectOpenId );\n\n\treturn useMemo( () => injections.find( ( injection ) => openId === injection.id ), [ injections, openId ] );\n}\n","import { createLocation } from '@elementor/locations';\n\nexport const { inject: injectIntoPanels, useInjections: usePanelsInjections } = createLocation();\n","import { type SliceState } from '@elementor/store';\n\nimport type slice from './slice';\n\ntype State = SliceState< typeof slice >;\n\nexport const selectOpenId = ( state: State ) => state.panels.openId;\n","import { __createSlice, type PayloadAction } from '@elementor/store';\n\nconst initialState: {\n\topenId: string | null;\n} = {\n\topenId: null,\n};\n\nexport default __createSlice( {\n\tname: 'panels',\n\tinitialState,\n\treducers: {\n\t\topen( state, action: PayloadAction< string > ) {\n\t\t\tstate.openId = action.payload;\n\t\t},\n\t\tclose( state, action: PayloadAction< string | undefined > ) {\n\t\t\tif ( ! action.payload || state.openId === action.payload ) {\n\t\t\t\tstate.openId = null;\n\t\t\t}\n\t\t},\n\t},\n} );\n","import * as React from 'react';\nimport { useRef } from 'react';\nimport { Portal as BasePortal, type PortalProps } from '@elementor/ui';\n\nimport { getPortalContainer } from '../../sync';\n\ntype Props = Omit< PortalProps, 'container' >;\n\nexport default function Portal( props: Props ) {\n\tconst containerRef = useRef( getPortalContainer );\n\n\tif ( ! containerRef.current ) {\n\t\treturn null;\n\t}\n\n\treturn <BasePortal container={ containerRef.current } { ...props } />;\n}\n","import {\n\t__privateIsRouteActive as isRouteActive,\n\t__privateListenTo as listenTo,\n\t__privateOpenRoute as openRoute,\n\t__privateRegisterRoute as registerRoute,\n\trouteCloseEvent,\n\trouteOpenEvent,\n\twindowEvent,\n} from '@elementor/editor-v1-adapters';\nimport { __dispatch, __getState, __subscribe as originalSubscribe } from '@elementor/store';\n\nimport { selectOpenId, slice } from './store';\n\nexport const V2_PANEL = 'panel/v2';\n\nexport function getPortalContainer() {\n\treturn document.querySelector( '#elementor-panel-inner' );\n}\n\nexport function sync() {\n\t// Register the V2 panel route on panel init.\n\tlistenTo( windowEvent( 'elementor/panel/init' ), () => registerRoute( V2_PANEL ) );\n\n\t// On empty route open, hide V1 panel elements.\n\tlistenTo( routeOpenEvent( V2_PANEL ), () => {\n\t\tgetV1PanelElements().forEach( ( el ) => {\n\t\t\tel.setAttribute( 'hidden', 'hidden' );\n\t\t\tel.setAttribute( 'inert', 'true' );\n\t\t} );\n\t} );\n\n\t// On empty route close, close the V2 panel.\n\tlistenTo( routeCloseEvent( V2_PANEL ), () => selectOpenId( __getState() ) && __dispatch( slice.actions.close() ) );\n\n\t// On empty route close, show V1 panel elements.\n\tlistenTo( routeCloseEvent( V2_PANEL ), () => {\n\t\tgetV1PanelElements().forEach( ( el ) => {\n\t\t\tel.removeAttribute( 'hidden' );\n\t\t\tel.removeAttribute( 'inert' );\n\t\t} );\n\t} );\n\n\t// On V2 panel open, open the V2 panel route.\n\tlistenTo( windowEvent( 'elementor/panel/init' ), () =>\n\t\tsubscribe( {\n\t\t\ton: ( state ) => selectOpenId( state ),\n\t\t\twhen: ( { prev, current } ) => !! ( ! prev && current ), // is panel opened\n\t\t\tcallback: () => openRoute( V2_PANEL ),\n\t\t} )\n\t);\n\n\t// On V2 panel close, close the V2 panel route.\n\tlistenTo( windowEvent( 'elementor/panel/init' ), () =>\n\t\tsubscribe( {\n\t\t\ton: ( state ) => selectOpenId( state ),\n\t\t\twhen: ( { prev, current } ) => !! ( ! current && prev ), // is panel closed\n\t\t\tcallback: () => isRouteActive( V2_PANEL ) && openRoute( getDefaultRoute() ),\n\t\t} )\n\t);\n}\n\nfunction getV1PanelElements() {\n\tconst v1ElementsSelector = [\n\t\t'#elementor-panel-header-wrapper',\n\t\t'#elementor-panel-content-wrapper',\n\t\t'#elementor-panel-state-loading',\n\t].join( ', ' );\n\n\treturn document.querySelectorAll( v1ElementsSelector );\n}\n\nfunction getDefaultRoute() {\n\ttype ExtendedWindow = Window & {\n\t\telementor?: {\n\t\t\tdocuments?: {\n\t\t\t\tgetCurrent?: () => {\n\t\t\t\t\tconfig?: {\n\t\t\t\t\t\tpanel?: {\n\t\t\t\t\t\t\tdefault_route?: string;\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};\n\t};\n\n\tconst defaultRoute = ( window as unknown as ExtendedWindow )?.elementor?.documents?.getCurrent?.()?.config?.panel\n\t\t?.default_route;\n\n\treturn defaultRoute || 'panel/elements/categories';\n}\n\nfunction subscribe< TVal >( {\n\ton,\n\twhen,\n\tcallback,\n}: {\n\ton: ( state: ReturnType< typeof __getState > ) => TVal;\n\twhen: ( { prev, current }: { prev: TVal; current: TVal } ) => boolean;\n\tcallback: ( { prev, current }: { prev: TVal; current: TVal } ) => void;\n} ) {\n\tlet prev: TVal;\n\n\toriginalSubscribe( () => {\n\t\tconst current = on( __getState() );\n\n\t\tif ( when( { prev, current } ) ) {\n\t\t\tcallback( { prev, current } );\n\t\t}\n\n\t\tprev = current;\n\t} );\n}\n","import { type ComponentType } from 'react';\nimport {\n\t__privateRunCommand as runCommand,\n\t__privateUseRouteStatus as useRouteStatus,\n\ttype UseRouteStatusOptions,\n} from '@elementor/editor-v1-adapters';\nimport { __useDispatch as useDispatch, __useSelector as useSelector } from '@elementor/store';\n\nimport { injectIntoPanels } from './location';\nimport { selectOpenId, slice } from './store';\nimport { V2_PANEL } from './sync';\n\nexport type PanelDeclaration< TOnOpenReturn = unknown > = {\n\tid: string;\n\tcomponent: ComponentType;\n\tisOpenPreviousElement?: boolean;\n} & UseActionsOptions< TOnOpenReturn > &\n\tUseRouteStatusOptions;\n\nexport function createPanel< TOnOpenReturn >( {\n\tid,\n\tcomponent,\n\tonOpen,\n\tonClose,\n\tallowedEditModes,\n\tblockOnKitRoutes,\n\tisOpenPreviousElement = false,\n}: PanelDeclaration< TOnOpenReturn > ) {\n\tconst usePanelStatus = createUseStatus( id, {\n\t\tallowedEditModes,\n\t\tblockOnKitRoutes,\n\t} );\n\n\tconst usePanelActions = createUseActions(\n\t\tid,\n\t\tusePanelStatus,\n\t\t{\n\t\t\tonOpen,\n\t\t\tonClose,\n\t\t},\n\t\tisOpenPreviousElement\n\t);\n\n\treturn {\n\t\tpanel: {\n\t\t\tid,\n\t\t\tcomponent,\n\t\t},\n\t\tusePanelStatus,\n\t\tusePanelActions,\n\t};\n}\n\nexport function registerPanel( { id, component }: Pick< PanelDeclaration, 'id' | 'component' > ) {\n\tinjectIntoPanels( {\n\t\tid,\n\t\tcomponent,\n\t} );\n}\n\ntype UseStatus = () => {\n\tisOpen: boolean;\n\tisBlocked: boolean;\n};\n\nfunction createUseStatus( id: PanelDeclaration[ 'id' ], options: UseRouteStatusOptions = {} ): UseStatus {\n\treturn () => {\n\t\tconst openPanelId = useSelector( selectOpenId );\n\t\tconst v1PanelStatus = useRouteStatus( V2_PANEL, options );\n\n\t\treturn {\n\t\t\tisOpen: openPanelId === id && v1PanelStatus.isActive,\n\t\t\tisBlocked: v1PanelStatus.isBlocked,\n\t\t};\n\t};\n}\n\ntype UseActionsOptions< TOnOpenReturn > = {\n\tonOpen?: () => TOnOpenReturn;\n\tonClose?: ( state: TOnOpenReturn ) => Promise< void >;\n};\n\nfunction createUseActions< TOnOpenReturn >(\n\tid: PanelDeclaration[ 'id' ],\n\tuseStatus: UseStatus,\n\toptions: UseActionsOptions< TOnOpenReturn > = {},\n\tisOpenPreviousElement?: boolean\n) {\n\tlet stateSnapshot: TOnOpenReturn | null = null;\n\tlet previousSelectedElement: string | null = null;\n\n\treturn () => {\n\t\tconst dispatch = useDispatch();\n\t\tconst { isBlocked } = useStatus();\n\n\t\treturn {\n\t\t\topen: async () => {\n\t\t\t\tif ( isBlocked ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( isOpenPreviousElement ) {\n\t\t\t\t\tpreviousSelectedElement =\n\t\t\t\t\t\twindow.elementor?.selection?.getElements?.()[ 0 ]?.model.get( 'id' ) ?? null;\n\t\t\t\t}\n\n\t\t\t\tdispatch( slice.actions.open( id ) );\n\n\t\t\t\tstateSnapshot = options.onOpen?.() ?? null;\n\t\t\t},\n\t\t\tclose: async () => {\n\t\t\t\tif ( isBlocked ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdispatch( slice.actions.close( id ) );\n\n\t\t\t\tawait options.onClose?.( stateSnapshot as TOnOpenReturn );\n\n\t\t\t\tif ( previousSelectedElement ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst container = window.elementor?.getContainer?.( previousSelectedElement );\n\t\t\t\t\t\trunCommand( 'document/elements/select', { container } );\n\t\t\t\t\t} catch {}\n\t\t\t\t\tpreviousSelectedElement = null;\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t};\n}\n","import * as React from 'react';\nimport { Drawer, type DrawerProps } from '@elementor/ui';\n\nexport default function Panel( { children, sx, ...props }: DrawerProps ) {\n\treturn (\n\t\t<Drawer\n\t\t\topen={ true }\n\t\t\tvariant=\"persistent\"\n\t\t\tanchor=\"left\"\n\t\t\tPaperProps={ {\n\t\t\t\tsx: {\n\t\t\t\t\tposition: 'relative',\n\t\t\t\t\twidth: '100%',\n\t\t\t\t\tbgcolor: 'background.default',\n\t\t\t\t\tborder: 'none',\n\t\t\t\t},\n\t\t\t} }\n\t\t\tsx={ { height: '100%', ...sx } }\n\t\t\t{ ...props }\n\t\t>\n\t\t\t{ children }\n\t\t</Drawer>\n\t);\n}\n","import * as React from 'react';\nimport { Box, type BoxProps, styled } from '@elementor/ui';\n\nconst Header = styled( Box )( ( { theme } ) => ( {\n\theight: theme?.spacing( 6 ) || '48px',\n\tdisplay: 'flex',\n\talignItems: 'center',\n\tjustifyContent: 'center',\n\tgap: theme?.spacing( 0.5 ) || '4px',\n} ) );\n\nexport default function PanelHeader( { children, ...props }: BoxProps ) {\n\treturn (\n\t\t<>\n\t\t\t<Header component=\"header\" { ...props }>\n\t\t\t\t{ children }\n\t\t\t</Header>\n\t\t</>\n\t);\n}\n","import * as React from 'react';\nimport { forwardRef } from 'react';\nimport { styled, Typography as TypographySource, type TypographyProps } from '@elementor/ui';\n\n// This is to override Editor reset.scss that overrides eui styles\nconst Typography = styled( TypographySource )< TypographyProps >( ( { theme, variant = 'body1' } ) => {\n\tif ( variant === 'inherit' ) {\n\t\treturn {};\n\t}\n\n\treturn {\n\t\t'&.MuiTypography-root': {\n\t\t\t...theme.typography[ variant ],\n\t\t},\n\t};\n} );\n\nconst PanelHeaderTitle = forwardRef< HTMLHeadingElement, TypographyProps >( ( { children, ...props }, ref ) => {\n\treturn (\n\t\t<Typography ref={ ref } component=\"h2\" variant=\"subtitle1\" { ...props }>\n\t\t\t{ children }\n\t\t</Typography>\n\t);\n} );\n\nexport default PanelHeaderTitle;\n","import * as React from 'react';\nimport { Box, type BoxProps } from '@elementor/ui';\n\nexport default function PanelBody( { children, sx, ...props }: BoxProps ) {\n\treturn (\n\t\t<Box\n\t\t\tcomponent=\"main\"\n\t\t\tsx={ {\n\t\t\t\toverflowY: 'auto',\n\t\t\t\theight: '100%',\n\t\t\t\t...sx,\n\t\t\t} }\n\t\t\t{ ...props }\n\t\t>\n\t\t\t{ children }\n\t\t</Box>\n\t);\n}\n","import * as React from 'react';\nimport { Box, type BoxProps, Divider } from '@elementor/ui';\n\nexport default function PanelFooter( { children, sx, ...props }: BoxProps ) {\n\treturn (\n\t\t<>\n\t\t\t<Divider />\n\t\t\t<Box\n\t\t\t\tcomponent=\"footer\"\n\t\t\t\tsx={ {\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\tposition: 'sticky',\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tpx: 2,\n\t\t\t\t\tpy: 1.5,\n\t\t\t\t} }\n\t\t\t\t{ ...props }\n\t\t\t>\n\t\t\t\t{ children }\n\t\t\t</Box>\n\t\t</>\n\t);\n}\n"],"mappings":"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","names":["React","useSelector","useSelector","React","React","React","styled","React","Box","React","Box"]}
|
|
1
|
+
{"version":3,"sources":["../src/init.ts","../src/components/internal/panels.tsx","../src/location.ts","../src/store/selectors.ts","../src/store/slice.ts","../src/components/internal/portal.tsx","../src/sync.ts","../src/api.ts","../src/components/external/panel.tsx","../src/components/external/panel-header.tsx","../src/components/external/panel-header-title.tsx","../src/components/external/panel-body.tsx","../src/components/external/panel-footer.tsx"],"sourcesContent":["import { injectIntoTop } from '@elementor/editor';\nimport { __registerSlice } from '@elementor/store';\n\nimport Panels from './components/internal/panels';\nimport { slice } from './store';\nimport { sync } from './sync';\n\nexport function init() {\n\tsync();\n\n\t__registerSlice( slice );\n\n\tinjectIntoTop( { id: 'panels', component: Panels } );\n}\n","import * as React from 'react';\nimport { __useSelector as useSelector } from '@elementor/store';\n\nimport { usePanelsInjections } from '../../location';\nimport { selectOpenId } from '../../store';\nimport Portal from './portal';\n\nexport default function Panels() {\n\tconst injections = usePanelsInjections();\n\tconst openId = useSelector( selectOpenId );\n\n\tconst persistentInjections = injections.filter( ( injection ) => injection.keepMounted );\n\tconst openInjection = injections.find( ( injection ) => openId === injection.id );\n\n\tif ( ! persistentInjections.length && ! openInjection ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<Portal>\n\t\t\t{ persistentInjections.map( ( { id, component: Component } ) => (\n\t\t\t\t<div key={ id } style={ { display: openId === id ? 'contents' : 'none' } }>\n\t\t\t\t\t<Component />\n\t\t\t\t</div>\n\t\t\t) ) }\n\t\t\t{ openInjection && ! openInjection.keepMounted && <openInjection.component /> }\n\t\t</Portal>\n\t);\n}\n","import { type ComponentType } from 'react';\nimport { __registerFlushInjections, createLocation } from '@elementor/locations';\n\ntype PanelsInjectionMeta = {\n\tkeepMounted?: boolean;\n};\n\nexport type PanelsInjection = {\n\tid: string;\n\tcomponent: ComponentType;\n\tkeepMounted?: boolean;\n};\n\nconst panelsMeta = new Map< string, PanelsInjectionMeta >();\n\nconst { inject: baseInject, useInjections: baseUseInjections, getInjections } = createLocation();\n\n__registerFlushInjections( () => {\n\tpanelsMeta.clear();\n} );\n\nexport function injectIntoPanels( {\n\tid,\n\tcomponent,\n\tkeepMounted,\n}: {\n\tid: string;\n\tcomponent: ComponentType;\n\tkeepMounted?: boolean;\n} ) {\n\tconst existedBefore = getInjections().some( ( injection ) => injection.id === id );\n\n\tbaseInject( { id, component } );\n\n\tif ( ! existedBefore ) {\n\t\tpanelsMeta.set( id, { keepMounted } );\n\t}\n}\n\nexport function usePanelsInjections(): PanelsInjection[] {\n\tconst injections = baseUseInjections();\n\n\treturn injections.map( ( injection ) => ( {\n\t\t...injection,\n\t\tkeepMounted: panelsMeta.get( injection.id )?.keepMounted ?? false,\n\t} ) );\n}\n","import { type SliceState } from '@elementor/store';\n\nimport type slice from './slice';\n\ntype State = SliceState< typeof slice >;\n\nexport const selectOpenId = ( state: State ) => state.panels.openId;\n","import { __createSlice, type PayloadAction } from '@elementor/store';\n\nconst initialState: {\n\topenId: string | null;\n} = {\n\topenId: null,\n};\n\nexport default __createSlice( {\n\tname: 'panels',\n\tinitialState,\n\treducers: {\n\t\topen( state, action: PayloadAction< string > ) {\n\t\t\tstate.openId = action.payload;\n\t\t},\n\t\tclose( state, action: PayloadAction< string | undefined > ) {\n\t\t\tif ( ! action.payload || state.openId === action.payload ) {\n\t\t\t\tstate.openId = null;\n\t\t\t}\n\t\t},\n\t},\n} );\n","import * as React from 'react';\nimport { useEffect, useState } from 'react';\nimport { Portal as BasePortal, type PortalProps } from '@elementor/ui';\n\nimport { getPortalContainer } from '../../sync';\n\ntype Props = Omit< PortalProps, 'container' >;\n\nexport default function Portal( props: Props ) {\n\tconst [ container, setContainer ] = useState( () => getPortalContainer() );\n\n\tuseEffect( () => {\n\t\tif ( container ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst resolveContainer = () => {\n\t\t\tconst portalContainer = getPortalContainer();\n\n\t\t\tif ( portalContainer ) {\n\t\t\t\tsetContainer( portalContainer );\n\t\t\t}\n\t\t};\n\n\t\twindow.addEventListener( 'elementor/panel/init', resolveContainer );\n\t\tresolveContainer();\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener( 'elementor/panel/init', resolveContainer );\n\t\t};\n\t}, [ container ] );\n\n\tif ( ! container ) {\n\t\treturn null;\n\t}\n\n\treturn <BasePortal container={ container } { ...props } />;\n}\n","import {\n\t__privateIsRouteActive as isRouteActive,\n\t__privateListenTo as listenTo,\n\t__privateOpenRoute as openRoute,\n\t__privateRegisterRoute as registerRoute,\n\trouteCloseEvent,\n\trouteOpenEvent,\n\twindowEvent,\n} from '@elementor/editor-v1-adapters';\nimport { __dispatch, __getState, __subscribe as originalSubscribe } from '@elementor/store';\n\nimport { selectOpenId, slice } from './store';\n\nexport const V2_PANEL = 'panel/v2';\n\nexport function getPortalContainer() {\n\treturn document.querySelector( '#elementor-panel-inner' );\n}\n\nexport function sync() {\n\t// Register the V2 panel route on panel init.\n\tlistenTo( windowEvent( 'elementor/panel/init' ), () => registerRoute( V2_PANEL ) );\n\n\t// On empty route open, hide V1 panel elements.\n\tlistenTo( routeOpenEvent( V2_PANEL ), () => {\n\t\tgetV1PanelElements().forEach( ( el ) => {\n\t\t\tel.setAttribute( 'hidden', 'hidden' );\n\t\t\tel.setAttribute( 'inert', 'true' );\n\t\t} );\n\t} );\n\n\t// On empty route close, close the V2 panel.\n\tlistenTo( routeCloseEvent( V2_PANEL ), () => selectOpenId( __getState() ) && __dispatch( slice.actions.close() ) );\n\n\t// On empty route close, show V1 panel elements.\n\tlistenTo( routeCloseEvent( V2_PANEL ), () => {\n\t\tgetV1PanelElements().forEach( ( el ) => {\n\t\t\tel.removeAttribute( 'hidden' );\n\t\t\tel.removeAttribute( 'inert' );\n\t\t} );\n\t} );\n\n\t// On V2 panel open, open the V2 panel route.\n\tlistenTo( windowEvent( 'elementor/panel/init' ), () =>\n\t\tsubscribe( {\n\t\t\ton: ( state ) => selectOpenId( state ),\n\t\t\twhen: ( { prev, current } ) => !! ( ! prev && current ), // is panel opened\n\t\t\tcallback: () => openRoute( V2_PANEL ),\n\t\t} )\n\t);\n\n\t// On V2 panel close, close the V2 panel route.\n\tlistenTo( windowEvent( 'elementor/panel/init' ), () =>\n\t\tsubscribe( {\n\t\t\ton: ( state ) => selectOpenId( state ),\n\t\t\twhen: ( { prev, current } ) => !! ( ! current && prev ), // is panel closed\n\t\t\tcallback: () => isRouteActive( V2_PANEL ) && openRoute( getDefaultRoute() ),\n\t\t} )\n\t);\n}\n\nfunction getV1PanelElements() {\n\tconst v1ElementsSelector = [\n\t\t'#elementor-panel-header-wrapper',\n\t\t'#elementor-panel-content-wrapper',\n\t\t'#elementor-panel-state-loading',\n\t].join( ', ' );\n\n\treturn document.querySelectorAll( v1ElementsSelector );\n}\n\nfunction getDefaultRoute() {\n\ttype ExtendedWindow = Window & {\n\t\telementor?: {\n\t\t\tdocuments?: {\n\t\t\t\tgetCurrent?: () => {\n\t\t\t\t\tconfig?: {\n\t\t\t\t\t\tpanel?: {\n\t\t\t\t\t\t\tdefault_route?: string;\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};\n\t};\n\n\tconst defaultRoute = ( window as unknown as ExtendedWindow )?.elementor?.documents?.getCurrent?.()?.config?.panel\n\t\t?.default_route;\n\n\treturn defaultRoute || 'panel/elements/categories';\n}\n\nfunction subscribe< TVal >( {\n\ton,\n\twhen,\n\tcallback,\n}: {\n\ton: ( state: ReturnType< typeof __getState > ) => TVal;\n\twhen: ( { prev, current }: { prev: TVal; current: TVal } ) => boolean;\n\tcallback: ( { prev, current }: { prev: TVal; current: TVal } ) => void;\n} ) {\n\tlet prev: TVal;\n\n\toriginalSubscribe( () => {\n\t\tconst current = on( __getState() );\n\n\t\tif ( when( { prev, current } ) ) {\n\t\t\tcallback( { prev, current } );\n\t\t}\n\n\t\tprev = current;\n\t} );\n}\n","import { type ComponentType } from 'react';\nimport {\n\t__privateRunCommand as runCommand,\n\t__privateUseRouteStatus as useRouteStatus,\n\ttype UseRouteStatusOptions,\n} from '@elementor/editor-v1-adapters';\nimport { __useDispatch as useDispatch, __useSelector as useSelector } from '@elementor/store';\n\nimport { injectIntoPanels } from './location';\nimport { selectOpenId, slice } from './store';\nimport { V2_PANEL } from './sync';\n\nexport type PanelDeclaration< TOnOpenReturn = unknown > = {\n\tid: string;\n\tcomponent: ComponentType;\n\tisOpenPreviousElement?: boolean;\n\tkeepMounted?: boolean;\n} & UseActionsOptions< TOnOpenReturn > &\n\tUseRouteStatusOptions;\n\nexport function createPanel< TOnOpenReturn >( {\n\tid,\n\tcomponent,\n\tonOpen,\n\tonClose,\n\tallowedEditModes,\n\tblockOnKitRoutes,\n\tisOpenPreviousElement = false,\n\tkeepMounted = false,\n}: PanelDeclaration< TOnOpenReturn > ) {\n\tconst usePanelStatus = createUseStatus( id, {\n\t\tallowedEditModes,\n\t\tblockOnKitRoutes,\n\t} );\n\n\tconst usePanelActions = createUseActions(\n\t\tid,\n\t\tusePanelStatus,\n\t\t{\n\t\t\tonOpen,\n\t\t\tonClose,\n\t\t},\n\t\tisOpenPreviousElement\n\t);\n\n\treturn {\n\t\tpanel: {\n\t\t\tid,\n\t\t\tcomponent,\n\t\t\tkeepMounted,\n\t\t},\n\t\tusePanelStatus,\n\t\tusePanelActions,\n\t};\n}\n\nexport function registerPanel( {\n\tid,\n\tcomponent,\n\tkeepMounted,\n}: Pick< PanelDeclaration, 'id' | 'component' | 'keepMounted' > ) {\n\tinjectIntoPanels( {\n\t\tid,\n\t\tcomponent,\n\t\tkeepMounted,\n\t} );\n}\n\ntype UseStatus = () => {\n\tisOpen: boolean;\n\tisBlocked: boolean;\n};\n\nfunction createUseStatus( id: PanelDeclaration[ 'id' ], options: UseRouteStatusOptions = {} ): UseStatus {\n\treturn () => {\n\t\tconst openPanelId = useSelector( selectOpenId );\n\t\tconst v1PanelStatus = useRouteStatus( V2_PANEL, options );\n\n\t\treturn {\n\t\t\tisOpen: openPanelId === id && v1PanelStatus.isActive,\n\t\t\tisBlocked: v1PanelStatus.isBlocked,\n\t\t};\n\t};\n}\n\ntype UseActionsOptions< TOnOpenReturn > = {\n\tonOpen?: () => TOnOpenReturn;\n\tonClose?: ( state: TOnOpenReturn ) => Promise< void >;\n};\n\nfunction createUseActions< TOnOpenReturn >(\n\tid: PanelDeclaration[ 'id' ],\n\tuseStatus: UseStatus,\n\toptions: UseActionsOptions< TOnOpenReturn > = {},\n\tisOpenPreviousElement?: boolean\n) {\n\tlet stateSnapshot: TOnOpenReturn | null = null;\n\tlet previousSelectedElement: string | null = null;\n\n\treturn () => {\n\t\tconst dispatch = useDispatch();\n\t\tconst { isBlocked } = useStatus();\n\n\t\treturn {\n\t\t\topen: async () => {\n\t\t\t\tif ( isBlocked ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( isOpenPreviousElement ) {\n\t\t\t\t\tpreviousSelectedElement =\n\t\t\t\t\t\twindow.elementor?.selection?.getElements?.()[ 0 ]?.model.get( 'id' ) ?? null;\n\t\t\t\t}\n\n\t\t\t\tdispatch( slice.actions.open( id ) );\n\n\t\t\t\tstateSnapshot = options.onOpen?.() ?? null;\n\t\t\t},\n\t\t\tclose: async () => {\n\t\t\t\tif ( isBlocked ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdispatch( slice.actions.close( id ) );\n\n\t\t\t\tawait options.onClose?.( stateSnapshot as TOnOpenReturn );\n\n\t\t\t\tif ( previousSelectedElement ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst container = window.elementor?.getContainer?.( previousSelectedElement );\n\t\t\t\t\t\trunCommand( 'document/elements/select', { container } );\n\t\t\t\t\t} catch {}\n\t\t\t\t\tpreviousSelectedElement = null;\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t};\n}\n","import * as React from 'react';\nimport { Drawer, type DrawerProps } from '@elementor/ui';\n\nexport default function Panel( { children, sx, ...props }: DrawerProps ) {\n\treturn (\n\t\t<Drawer\n\t\t\topen={ true }\n\t\t\tvariant=\"persistent\"\n\t\t\tanchor=\"left\"\n\t\t\tPaperProps={ {\n\t\t\t\tsx: {\n\t\t\t\t\tposition: 'relative',\n\t\t\t\t\twidth: '100%',\n\t\t\t\t\tbgcolor: 'background.default',\n\t\t\t\t\tborder: 'none',\n\t\t\t\t},\n\t\t\t} }\n\t\t\tsx={ { height: '100%', ...sx } }\n\t\t\t{ ...props }\n\t\t>\n\t\t\t{ children }\n\t\t</Drawer>\n\t);\n}\n","import * as React from 'react';\nimport { Box, type BoxProps, styled } from '@elementor/ui';\n\nconst Header = styled( Box )( ( { theme } ) => ( {\n\theight: theme?.spacing( 6 ) || '48px',\n\tdisplay: 'flex',\n\talignItems: 'center',\n\tjustifyContent: 'center',\n\tgap: theme?.spacing( 0.5 ) || '4px',\n} ) );\n\nexport default function PanelHeader( { children, ...props }: BoxProps ) {\n\treturn (\n\t\t<>\n\t\t\t<Header component=\"header\" { ...props }>\n\t\t\t\t{ children }\n\t\t\t</Header>\n\t\t</>\n\t);\n}\n","import * as React from 'react';\nimport { forwardRef } from 'react';\nimport { styled, Typography as TypographySource, type TypographyProps } from '@elementor/ui';\n\n// This is to override Editor reset.scss that overrides eui styles\nconst Typography = styled( TypographySource )< TypographyProps >( ( { theme, variant = 'body1' } ) => {\n\tif ( variant === 'inherit' ) {\n\t\treturn {};\n\t}\n\n\treturn {\n\t\t'&.MuiTypography-root': {\n\t\t\t...theme.typography[ variant ],\n\t\t},\n\t};\n} );\n\nconst PanelHeaderTitle = forwardRef< HTMLHeadingElement, TypographyProps >( ( { children, ...props }, ref ) => {\n\treturn (\n\t\t<Typography ref={ ref } component=\"h2\" variant=\"subtitle1\" { ...props }>\n\t\t\t{ children }\n\t\t</Typography>\n\t);\n} );\n\nexport default PanelHeaderTitle;\n","import * as React from 'react';\nimport { Box, type BoxProps } from '@elementor/ui';\n\nexport default function PanelBody( { children, sx, ...props }: BoxProps ) {\n\treturn (\n\t\t<Box\n\t\t\tcomponent=\"main\"\n\t\t\tsx={ {\n\t\t\t\toverflowY: 'auto',\n\t\t\t\theight: '100%',\n\t\t\t\t...sx,\n\t\t\t} }\n\t\t\t{ ...props }\n\t\t>\n\t\t\t{ children }\n\t\t</Box>\n\t);\n}\n","import * as React from 'react';\nimport { Box, type BoxProps, Divider } from '@elementor/ui';\n\nexport default function PanelFooter( { children, sx, ...props }: BoxProps ) {\n\treturn (\n\t\t<>\n\t\t\t<Divider />\n\t\t\t<Box\n\t\t\t\tcomponent=\"footer\"\n\t\t\t\tsx={ {\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\tposition: 'sticky',\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tpx: 2,\n\t\t\t\t\tpy: 1.5,\n\t\t\t\t} }\n\t\t\t\t{ ...props }\n\t\t\t>\n\t\t\t\t{ children }\n\t\t\t</Box>\n\t\t</>\n\t);\n}\n"],"mappings":"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","names":["React","useSelector","useSelector","React","React","React","styled","React","Box","React","Box"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elementor/editor-panels",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.4.0-1064",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": "Elementor Team",
|
|
6
6
|
"homepage": "https://elementor.com/",
|
|
@@ -39,10 +39,10 @@
|
|
|
39
39
|
"dev": "tsup --config=../../tsup.dev.ts"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@elementor/editor": "4.
|
|
43
|
-
"@elementor/editor-v1-adapters": "4.
|
|
44
|
-
"@elementor/locations": "4.
|
|
45
|
-
"@elementor/store": "4.
|
|
42
|
+
"@elementor/editor": "4.4.0-1064",
|
|
43
|
+
"@elementor/editor-v1-adapters": "4.4.0-1064",
|
|
44
|
+
"@elementor/locations": "4.4.0-1064",
|
|
45
|
+
"@elementor/store": "4.4.0-1064",
|
|
46
46
|
"@elementor/ui": "1.37.5"
|
|
47
47
|
},
|
|
48
48
|
"peerDependencies": {
|
package/src/api.ts
CHANGED
|
@@ -14,6 +14,7 @@ export type PanelDeclaration< TOnOpenReturn = unknown > = {
|
|
|
14
14
|
id: string;
|
|
15
15
|
component: ComponentType;
|
|
16
16
|
isOpenPreviousElement?: boolean;
|
|
17
|
+
keepMounted?: boolean;
|
|
17
18
|
} & UseActionsOptions< TOnOpenReturn > &
|
|
18
19
|
UseRouteStatusOptions;
|
|
19
20
|
|
|
@@ -25,6 +26,7 @@ export function createPanel< TOnOpenReturn >( {
|
|
|
25
26
|
allowedEditModes,
|
|
26
27
|
blockOnKitRoutes,
|
|
27
28
|
isOpenPreviousElement = false,
|
|
29
|
+
keepMounted = false,
|
|
28
30
|
}: PanelDeclaration< TOnOpenReturn > ) {
|
|
29
31
|
const usePanelStatus = createUseStatus( id, {
|
|
30
32
|
allowedEditModes,
|
|
@@ -45,16 +47,22 @@ export function createPanel< TOnOpenReturn >( {
|
|
|
45
47
|
panel: {
|
|
46
48
|
id,
|
|
47
49
|
component,
|
|
50
|
+
keepMounted,
|
|
48
51
|
},
|
|
49
52
|
usePanelStatus,
|
|
50
53
|
usePanelActions,
|
|
51
54
|
};
|
|
52
55
|
}
|
|
53
56
|
|
|
54
|
-
export function registerPanel( {
|
|
57
|
+
export function registerPanel( {
|
|
58
|
+
id,
|
|
59
|
+
component,
|
|
60
|
+
keepMounted,
|
|
61
|
+
}: Pick< PanelDeclaration, 'id' | 'component' | 'keepMounted' > ) {
|
|
55
62
|
injectIntoPanels( {
|
|
56
63
|
id,
|
|
57
64
|
component,
|
|
65
|
+
keepMounted,
|
|
58
66
|
} );
|
|
59
67
|
}
|
|
60
68
|
|
|
@@ -1,19 +1,29 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
+
import { __useSelector as useSelector } from '@elementor/store';
|
|
2
3
|
|
|
3
|
-
import
|
|
4
|
+
import { usePanelsInjections } from '../../location';
|
|
5
|
+
import { selectOpenId } from '../../store';
|
|
4
6
|
import Portal from './portal';
|
|
5
7
|
|
|
6
8
|
export default function Panels() {
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
+
const injections = usePanelsInjections();
|
|
10
|
+
const openId = useSelector( selectOpenId );
|
|
9
11
|
|
|
10
|
-
|
|
12
|
+
const persistentInjections = injections.filter( ( injection ) => injection.keepMounted );
|
|
13
|
+
const openInjection = injections.find( ( injection ) => openId === injection.id );
|
|
14
|
+
|
|
15
|
+
if ( ! persistentInjections.length && ! openInjection ) {
|
|
11
16
|
return null;
|
|
12
17
|
}
|
|
13
18
|
|
|
14
19
|
return (
|
|
15
20
|
<Portal>
|
|
16
|
-
|
|
21
|
+
{ persistentInjections.map( ( { id, component: Component } ) => (
|
|
22
|
+
<div key={ id } style={ { display: openId === id ? 'contents' : 'none' } }>
|
|
23
|
+
<Component />
|
|
24
|
+
</div>
|
|
25
|
+
) ) }
|
|
26
|
+
{ openInjection && ! openInjection.keepMounted && <openInjection.component /> }
|
|
17
27
|
</Portal>
|
|
18
28
|
);
|
|
19
29
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
3
|
import { Portal as BasePortal, type PortalProps } from '@elementor/ui';
|
|
4
4
|
|
|
5
5
|
import { getPortalContainer } from '../../sync';
|
|
@@ -7,11 +7,32 @@ import { getPortalContainer } from '../../sync';
|
|
|
7
7
|
type Props = Omit< PortalProps, 'container' >;
|
|
8
8
|
|
|
9
9
|
export default function Portal( props: Props ) {
|
|
10
|
-
const
|
|
10
|
+
const [ container, setContainer ] = useState( () => getPortalContainer() );
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
useEffect( () => {
|
|
13
|
+
if ( container ) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const resolveContainer = () => {
|
|
18
|
+
const portalContainer = getPortalContainer();
|
|
19
|
+
|
|
20
|
+
if ( portalContainer ) {
|
|
21
|
+
setContainer( portalContainer );
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
window.addEventListener( 'elementor/panel/init', resolveContainer );
|
|
26
|
+
resolveContainer();
|
|
27
|
+
|
|
28
|
+
return () => {
|
|
29
|
+
window.removeEventListener( 'elementor/panel/init', resolveContainer );
|
|
30
|
+
};
|
|
31
|
+
}, [ container ] );
|
|
32
|
+
|
|
33
|
+
if ( ! container ) {
|
|
13
34
|
return null;
|
|
14
35
|
}
|
|
15
36
|
|
|
16
|
-
return <BasePortal container={
|
|
37
|
+
return <BasePortal container={ container } { ...props } />;
|
|
17
38
|
}
|
package/src/index.ts
CHANGED
package/src/location.ts
CHANGED
|
@@ -1,3 +1,47 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type ComponentType } from 'react';
|
|
2
|
+
import { __registerFlushInjections, createLocation } from '@elementor/locations';
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
type PanelsInjectionMeta = {
|
|
5
|
+
keepMounted?: boolean;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export type PanelsInjection = {
|
|
9
|
+
id: string;
|
|
10
|
+
component: ComponentType;
|
|
11
|
+
keepMounted?: boolean;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const panelsMeta = new Map< string, PanelsInjectionMeta >();
|
|
15
|
+
|
|
16
|
+
const { inject: baseInject, useInjections: baseUseInjections, getInjections } = createLocation();
|
|
17
|
+
|
|
18
|
+
__registerFlushInjections( () => {
|
|
19
|
+
panelsMeta.clear();
|
|
20
|
+
} );
|
|
21
|
+
|
|
22
|
+
export function injectIntoPanels( {
|
|
23
|
+
id,
|
|
24
|
+
component,
|
|
25
|
+
keepMounted,
|
|
26
|
+
}: {
|
|
27
|
+
id: string;
|
|
28
|
+
component: ComponentType;
|
|
29
|
+
keepMounted?: boolean;
|
|
30
|
+
} ) {
|
|
31
|
+
const existedBefore = getInjections().some( ( injection ) => injection.id === id );
|
|
32
|
+
|
|
33
|
+
baseInject( { id, component } );
|
|
34
|
+
|
|
35
|
+
if ( ! existedBefore ) {
|
|
36
|
+
panelsMeta.set( id, { keepMounted } );
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function usePanelsInjections(): PanelsInjection[] {
|
|
41
|
+
const injections = baseUseInjections();
|
|
42
|
+
|
|
43
|
+
return injections.map( ( injection ) => ( {
|
|
44
|
+
...injection,
|
|
45
|
+
keepMounted: panelsMeta.get( injection.id )?.keepMounted ?? false,
|
|
46
|
+
} ) );
|
|
47
|
+
}
|