@elementor/editor-global-classes 0.17.5 → 0.17.7
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/CHANGELOG.md +26 -0
- package/dist/index.js +46 -34
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +40 -28
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -9
- package/src/components/class-manager/global-classes-list.tsx +47 -34
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# @elementor/editor-global-classes
|
|
2
2
|
|
|
3
|
+
## 0.17.7
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- bde1731: Change the error component of class rename field
|
|
8
|
+
- Updated dependencies [bde1731]
|
|
9
|
+
- Updated dependencies [7439d73]
|
|
10
|
+
- @elementor/editor-editing-panel@1.36.0
|
|
11
|
+
- @elementor/editor-ui@0.8.2
|
|
12
|
+
- @elementor/editor-v1-adapters@0.12.0
|
|
13
|
+
- @elementor/editor@0.19.3
|
|
14
|
+
- @elementor/editor-documents@0.13.5
|
|
15
|
+
- @elementor/editor-panels@0.15.3
|
|
16
|
+
- @elementor/editor-styles-repository@0.8.8
|
|
17
|
+
- @elementor/editor-styles@0.6.7
|
|
18
|
+
|
|
19
|
+
## 0.17.6
|
|
20
|
+
|
|
21
|
+
### Patch Changes
|
|
22
|
+
|
|
23
|
+
- Updated dependencies [398d703]
|
|
24
|
+
- @elementor/editor-editing-panel@1.35.0
|
|
25
|
+
- @elementor/editor@0.19.2
|
|
26
|
+
- @elementor/editor-panels@0.15.2
|
|
27
|
+
- @elementor/editor-documents@0.13.4
|
|
28
|
+
|
|
3
29
|
## 0.17.5
|
|
4
30
|
|
|
5
31
|
### Patch Changes
|
package/dist/index.js
CHANGED
|
@@ -50,7 +50,7 @@ var import_i18n5 = require("@wordpress/i18n");
|
|
|
50
50
|
|
|
51
51
|
// src/components/class-manager/class-manager-panel.tsx
|
|
52
52
|
var React7 = __toESM(require("react"));
|
|
53
|
-
var
|
|
53
|
+
var import_react5 = require("react");
|
|
54
54
|
var import_editor_documents2 = require("@elementor/editor-documents");
|
|
55
55
|
var import_editor_panels = require("@elementor/editor-panels");
|
|
56
56
|
var import_editor_ui3 = require("@elementor/editor-ui");
|
|
@@ -308,6 +308,7 @@ var FlippedColorSwatchIcon = ({ sx, ...props }) => /* @__PURE__ */ React2.create
|
|
|
308
308
|
|
|
309
309
|
// src/components/class-manager/global-classes-list.tsx
|
|
310
310
|
var React5 = __toESM(require("react"));
|
|
311
|
+
var import_react3 = require("react");
|
|
311
312
|
var import_editor_styles_repository = require("@elementor/editor-styles-repository");
|
|
312
313
|
var import_editor_ui2 = require("@elementor/editor-ui");
|
|
313
314
|
var import_icons4 = require("@elementor/icons");
|
|
@@ -466,6 +467,7 @@ var useReorder = () => {
|
|
|
466
467
|
return [order, reorder];
|
|
467
468
|
};
|
|
468
469
|
var ClassItem = ({ id: id2, label, renameClass, selected, disabled, sortableTriggerProps }) => {
|
|
470
|
+
const itemRef = (0, import_react3.useRef)(null);
|
|
469
471
|
const {
|
|
470
472
|
ref: editableRef,
|
|
471
473
|
openEditMode,
|
|
@@ -483,39 +485,49 @@ var ClassItem = ({ id: id2, label, renameClass, selected, disabled, sortableTrig
|
|
|
483
485
|
disableAutoFocus: true
|
|
484
486
|
});
|
|
485
487
|
const isSelected = (selected || popupState.isOpen) && !disabled;
|
|
486
|
-
return /* @__PURE__ */ React5.createElement(React5.Fragment, null, /* @__PURE__ */ React5.createElement(
|
|
487
|
-
|
|
488
|
+
return /* @__PURE__ */ React5.createElement(React5.Fragment, null, /* @__PURE__ */ React5.createElement(import_ui4.Stack, { p: 0 }, /* @__PURE__ */ React5.createElement(
|
|
489
|
+
import_editor_ui2.WarningInfotip,
|
|
488
490
|
{
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
selected: isSelected,
|
|
495
|
-
disabled,
|
|
496
|
-
focusVisibleClassName: "visible-class-item"
|
|
491
|
+
open: Boolean(error),
|
|
492
|
+
text: error ?? "",
|
|
493
|
+
placement: "bottom",
|
|
494
|
+
width: itemRef.current?.getBoundingClientRect().width,
|
|
495
|
+
offset: [0, -15]
|
|
497
496
|
},
|
|
498
|
-
/* @__PURE__ */ React5.createElement(SortableTrigger, { ...sortableTriggerProps }),
|
|
499
|
-
/* @__PURE__ */ React5.createElement(Indicator, { isActive: isEditing, isError: !!error }, isEditing ? /* @__PURE__ */ React5.createElement(
|
|
500
|
-
import_editor_ui2.EditableField,
|
|
501
|
-
{
|
|
502
|
-
ref: editableRef,
|
|
503
|
-
error,
|
|
504
|
-
as: import_ui4.Typography,
|
|
505
|
-
variant: "caption",
|
|
506
|
-
...getEditableProps()
|
|
507
|
-
}
|
|
508
|
-
) : /* @__PURE__ */ React5.createElement(import_editor_ui2.EllipsisWithTooltip, { title: label, as: import_ui4.Typography, variant: "caption" })),
|
|
509
497
|
/* @__PURE__ */ React5.createElement(
|
|
510
|
-
|
|
498
|
+
StyledListItemButton,
|
|
511
499
|
{
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
500
|
+
ref: itemRef,
|
|
501
|
+
dense: true,
|
|
502
|
+
disableGutters: true,
|
|
503
|
+
showActions: isSelected || isEditing,
|
|
504
|
+
shape: "rounded",
|
|
505
|
+
onDoubleClick: openEditMode,
|
|
506
|
+
selected: isSelected,
|
|
507
|
+
disabled,
|
|
508
|
+
focusVisibleClassName: "visible-class-item"
|
|
515
509
|
},
|
|
516
|
-
/* @__PURE__ */ React5.createElement(
|
|
510
|
+
/* @__PURE__ */ React5.createElement(SortableTrigger, { ...sortableTriggerProps }),
|
|
511
|
+
/* @__PURE__ */ React5.createElement(Indicator, { isActive: isEditing, isError: !!error }, isEditing ? /* @__PURE__ */ React5.createElement(
|
|
512
|
+
import_editor_ui2.EditableField,
|
|
513
|
+
{
|
|
514
|
+
ref: editableRef,
|
|
515
|
+
as: import_ui4.Typography,
|
|
516
|
+
variant: "caption",
|
|
517
|
+
...getEditableProps()
|
|
518
|
+
}
|
|
519
|
+
) : /* @__PURE__ */ React5.createElement(import_editor_ui2.EllipsisWithTooltip, { title: label, as: import_ui4.Typography, variant: "caption" })),
|
|
520
|
+
/* @__PURE__ */ React5.createElement(
|
|
521
|
+
import_ui4.Tooltip,
|
|
522
|
+
{
|
|
523
|
+
placement: "top",
|
|
524
|
+
className: "class-item-more-actions",
|
|
525
|
+
title: (0, import_i18n3.__)("More actions", "elementor")
|
|
526
|
+
},
|
|
527
|
+
/* @__PURE__ */ React5.createElement(import_ui4.IconButton, { size: "tiny", ...(0, import_ui4.bindTrigger)(popupState), "aria-label": "More actions" }, /* @__PURE__ */ React5.createElement(import_icons4.DotsVerticalIcon, { fontSize: "tiny" }))
|
|
528
|
+
)
|
|
517
529
|
)
|
|
518
|
-
), /* @__PURE__ */ React5.createElement(
|
|
530
|
+
)), /* @__PURE__ */ React5.createElement(
|
|
519
531
|
import_ui4.Menu,
|
|
520
532
|
{
|
|
521
533
|
...(0, import_ui4.bindMenu)(popupState),
|
|
@@ -626,7 +638,7 @@ function unblockPanelInteractions() {
|
|
|
626
638
|
|
|
627
639
|
// src/components/class-manager/save-changes-dialog.tsx
|
|
628
640
|
var React6 = __toESM(require("react"));
|
|
629
|
-
var
|
|
641
|
+
var import_react4 = require("react");
|
|
630
642
|
var import_icons5 = require("@elementor/icons");
|
|
631
643
|
var import_ui5 = require("@elementor/ui");
|
|
632
644
|
var TITLE_ID2 = "save-changes-dialog";
|
|
@@ -635,7 +647,7 @@ var SaveChangesDialogTitle = ({ children }) => /* @__PURE__ */ React6.createElem
|
|
|
635
647
|
var SaveChangesDialogContent = ({ children }) => /* @__PURE__ */ React6.createElement(import_ui5.DialogContent, null, children);
|
|
636
648
|
var SaveChangesDialogContentText = (props) => /* @__PURE__ */ React6.createElement(import_ui5.DialogContentText, { variant: "body2", color: "textPrimary", display: "flex", flexDirection: "column", ...props });
|
|
637
649
|
var SaveChangesDialogActions = ({ actions }) => {
|
|
638
|
-
const [isConfirming, setIsConfirming] = (0,
|
|
650
|
+
const [isConfirming, setIsConfirming] = (0, import_react4.useState)(false);
|
|
639
651
|
const { cancel, confirm } = actions;
|
|
640
652
|
const onConfirm = async () => {
|
|
641
653
|
setIsConfirming(true);
|
|
@@ -649,7 +661,7 @@ SaveChangesDialog.Content = SaveChangesDialogContent;
|
|
|
649
661
|
SaveChangesDialog.ContentText = SaveChangesDialogContentText;
|
|
650
662
|
SaveChangesDialog.Actions = SaveChangesDialogActions;
|
|
651
663
|
var useDialog = () => {
|
|
652
|
-
const [isOpen, setIsOpen] = (0,
|
|
664
|
+
const [isOpen, setIsOpen] = (0, import_react4.useState)(false);
|
|
653
665
|
const open = () => setIsOpen(true);
|
|
654
666
|
const close = () => setIsOpen(false);
|
|
655
667
|
return { isOpen, open, close };
|
|
@@ -725,7 +737,7 @@ var CloseButton = ({ onClose, ...props }) => /* @__PURE__ */ React7.createElemen
|
|
|
725
737
|
var ErrorBoundaryFallback = () => /* @__PURE__ */ React7.createElement(import_ui6.Box, { role: "alert", sx: { minHeight: "100%", p: 2 } }, /* @__PURE__ */ React7.createElement(import_ui6.Alert, { severity: "error", sx: { mb: 2, maxWidth: 400, textAlign: "center" } }, /* @__PURE__ */ React7.createElement("strong", null, (0, import_i18n4.__)("Something went wrong", "elementor"))));
|
|
726
738
|
var usePreventUnload = () => {
|
|
727
739
|
const isDirty2 = useDirtyState();
|
|
728
|
-
(0,
|
|
740
|
+
(0, import_react5.useEffect)(() => {
|
|
729
741
|
const handleBeforeUnload = (event) => {
|
|
730
742
|
if (isDirty2) {
|
|
731
743
|
event.preventDefault();
|
|
@@ -787,11 +799,11 @@ var ClassManagerButton = () => {
|
|
|
787
799
|
};
|
|
788
800
|
|
|
789
801
|
// src/components/populate-store.tsx
|
|
790
|
-
var
|
|
802
|
+
var import_react6 = require("react");
|
|
791
803
|
var import_store14 = require("@elementor/store");
|
|
792
804
|
function PopulateStore() {
|
|
793
805
|
const dispatch4 = (0, import_store14.__useDispatch)();
|
|
794
|
-
(0,
|
|
806
|
+
(0, import_react6.useEffect)(() => {
|
|
795
807
|
Promise.all([apiClient.all("preview"), apiClient.all("frontend")]).then(
|
|
796
808
|
([previewRes, frontendRes]) => {
|
|
797
809
|
const { data: previewData } = previewRes;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/init.ts","../src/components/class-manager/class-manager-button.tsx","../src/components/class-manager/class-manager-panel.tsx","../src/hooks/use-dirty-state.ts","../src/store.ts","../src/errors.ts","../src/save-global-classes.ts","../src/api.ts","../src/components/class-manager/class-manager-introduction.tsx","../src/components/class-manager/delete-class.ts","../src/components/class-manager/flipped-color-swatch-icon.tsx","../src/components/class-manager/global-classes-list.tsx","../src/hooks/use-classes-order.ts","../src/hooks/use-ordered-classes.ts","../src/components/class-manager/delete-confirmation-dialog.tsx","../src/components/class-manager/sortable.tsx","../src/components/class-manager/panel-interactions.ts","../src/components/class-manager/save-changes-dialog.tsx","../src/components/populate-store.tsx","../src/global-classes-styles-provider.ts","../src/sync-with-document-save.ts"],"sourcesContent":["export { init } from './init';\n","import { injectIntoLogic } from '@elementor/editor';\nimport { injectIntoClassSelectorActions } from '@elementor/editor-editing-panel';\nimport { __registerPanel as registerPanel } from '@elementor/editor-panels';\nimport { stylesRepository } from '@elementor/editor-styles-repository';\nimport { __privateListenTo as listenTo, v1ReadyEvent } from '@elementor/editor-v1-adapters';\nimport { __registerSlice as registerSlice } from '@elementor/store';\n\nimport { ClassManagerButton } from './components/class-manager/class-manager-button';\nimport { panel } from './components/class-manager/class-manager-panel';\nimport { PopulateStore } from './components/populate-store';\nimport { globalClassesStylesProvider } from './global-classes-styles-provider';\nimport { slice } from './store';\nimport { syncWithDocumentSave } from './sync-with-document-save';\n\nexport function init() {\n\tregisterSlice( slice );\n\tregisterPanel( panel );\n\n\tstylesRepository.register( globalClassesStylesProvider );\n\n\tinjectIntoLogic( {\n\t\tid: 'global-classes-populate-store',\n\t\tcomponent: PopulateStore,\n\t} );\n\n\tinjectIntoClassSelectorActions( {\n\t\tid: 'global-classes-manager-button',\n\t\tcomponent: ClassManagerButton,\n\t} );\n\n\tlistenTo( v1ReadyEvent(), () => {\n\t\tsyncWithDocumentSave();\n\t} );\n}\n","import * as React from 'react';\nimport {\n\t__useActiveDocument as useActiveDocument,\n\t__useActiveDocumentActions as useActiveDocumentActions,\n} from '@elementor/editor-documents';\nimport { IconButton, Tooltip } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { usePanelActions } from './class-manager-panel';\nimport { FlippedColorSwatchIcon } from './flipped-color-swatch-icon';\nimport { SaveChangesDialog, useDialog } from './save-changes-dialog';\n\nexport const ClassManagerButton = () => {\n\tconst document = useActiveDocument();\n\tconst { open: openPanel } = usePanelActions();\n\tconst { save: saveDocument } = useActiveDocumentActions();\n\tconst { open: openSaveChangesDialog, close: closeSaveChangesDialog, isOpen: isSaveChangesDialogOpen } = useDialog();\n\n\tconst handleOpenPanel = () => {\n\t\tif ( document?.isDirty ) {\n\t\t\topenSaveChangesDialog();\n\t\t\treturn;\n\t\t}\n\n\t\topenPanel();\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<Tooltip title={ __( 'Class Manager', 'elementor' ) } placement=\"top\">\n\t\t\t\t<IconButton size=\"tiny\" onClick={ handleOpenPanel } sx={ { marginInlineEnd: -0.75 } }>\n\t\t\t\t\t<FlippedColorSwatchIcon fontSize=\"tiny\" />\n\t\t\t\t</IconButton>\n\t\t\t</Tooltip>\n\t\t\t{ isSaveChangesDialogOpen && (\n\t\t\t\t<SaveChangesDialog>\n\t\t\t\t\t<SaveChangesDialog.Title>{ __( 'You have unsaved changes', 'elementor' ) }</SaveChangesDialog.Title>\n\t\t\t\t\t<SaveChangesDialog.Content>\n\t\t\t\t\t\t<SaveChangesDialog.ContentText sx={ { mb: 2 } }>\n\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t\"To open the Class Manager, save your page first. You can't continue without saving.\",\n\t\t\t\t\t\t\t\t'elementor'\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</SaveChangesDialog.ContentText>\n\t\t\t\t\t</SaveChangesDialog.Content>\n\t\t\t\t\t<SaveChangesDialog.Actions\n\t\t\t\t\t\tactions={ {\n\t\t\t\t\t\t\tcancel: {\n\t\t\t\t\t\t\t\tlabel: __( 'Stay here', 'elementor' ),\n\t\t\t\t\t\t\t\taction: closeSaveChangesDialog,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tconfirm: {\n\t\t\t\t\t\t\t\tlabel: __( 'Save & Continue', 'elementor' ),\n\t\t\t\t\t\t\t\taction: async () => {\n\t\t\t\t\t\t\t\t\tawait saveDocument();\n\t\t\t\t\t\t\t\t\tcloseSaveChangesDialog();\n\t\t\t\t\t\t\t\t\topenPanel();\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} }\n\t\t\t\t\t/>\n\t\t\t\t</SaveChangesDialog>\n\t\t\t) }\n\t\t</>\n\t);\n};\n","import * as React from 'react';\nimport { useEffect } from 'react';\nimport { setDocumentModifiedStatus } from '@elementor/editor-documents';\nimport {\n\t__createPanel as createPanel,\n\tPanel,\n\tPanelBody,\n\tPanelFooter,\n\tPanelHeader,\n\tPanelHeaderTitle,\n} from '@elementor/editor-panels';\nimport { ThemeProvider } from '@elementor/editor-ui';\nimport { changeEditMode } from '@elementor/editor-v1-adapters';\nimport { XIcon } from '@elementor/icons';\nimport { useMutation } from '@elementor/query';\nimport { Alert, Box, Button, ErrorBoundary, IconButton, type IconButtonProps, Stack } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { useDirtyState } from '../../hooks/use-dirty-state';\nimport { saveGlobalClasses } from '../../save-global-classes';\nimport { ClassManagerIntroduction } from './class-manager-introduction';\nimport { hasDeletedItems, onDelete } from './delete-class';\nimport { FlippedColorSwatchIcon } from './flipped-color-swatch-icon';\nimport { GlobalClassesList } from './global-classes-list';\nimport { blockPanelInteractions, unblockPanelInteractions } from './panel-interactions';\nimport { SaveChangesDialog, useDialog } from './save-changes-dialog';\n\nconst id = 'global-classes-manager';\n\n// We need to disable the app-bar buttons, and the elements overlays when opening the classes manager panel.\n// The buttons and overlays are enabled only in edit mode, so we're creating a custom new edit mode that\n// will force them to be disabled. We can't use the `preview` edit mode in this case since it'll force\n// the panel to be closed.\nexport const { panel, usePanelActions } = createPanel( {\n\tid,\n\tcomponent: ClassManagerPanel,\n\tallowedEditModes: [ 'edit', id ],\n\tonOpen: () => {\n\t\tchangeEditMode( id );\n\n\t\tblockPanelInteractions();\n\t},\n\tonClose: () => {\n\t\tchangeEditMode( 'edit' );\n\n\t\tunblockPanelInteractions();\n\t},\n} );\n\nexport function ClassManagerPanel() {\n\tconst isDirty = useDirtyState();\n\n\tconst { close: closePanel } = usePanelActions();\n\tconst { open: openSaveChangesDialog, close: closeSaveChangesDialog, isOpen: isSaveChangesDialogOpen } = useDialog();\n\n\tconst { mutateAsync: publish, isPending: isPublishing } = usePublish();\n\n\tusePreventUnload();\n\n\treturn (\n\t\t<ThemeProvider>\n\t\t\t<ErrorBoundary fallback={ <ErrorBoundaryFallback /> }>\n\t\t\t\t<Panel>\n\t\t\t\t\t<PanelHeader>\n\t\t\t\t\t\t<Stack p={ 1 } pl={ 2 } width=\"100%\" direction=\"row\" alignItems=\"center\">\n\t\t\t\t\t\t\t<PanelHeaderTitle sx={ { display: 'flex', alignItems: 'center', gap: 0.5 } }>\n\t\t\t\t\t\t\t\t<FlippedColorSwatchIcon fontSize=\"inherit\" />\n\t\t\t\t\t\t\t\t{ __( 'Class Manager', 'elementor' ) }\n\t\t\t\t\t\t\t</PanelHeaderTitle>\n\t\t\t\t\t\t\t<CloseButton\n\t\t\t\t\t\t\t\tsx={ { marginLeft: 'auto' } }\n\t\t\t\t\t\t\t\tdisabled={ isPublishing }\n\t\t\t\t\t\t\t\tonClose={ () => {\n\t\t\t\t\t\t\t\t\tif ( isDirty ) {\n\t\t\t\t\t\t\t\t\t\topenSaveChangesDialog();\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tclosePanel();\n\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</PanelHeader>\n\t\t\t\t\t<PanelBody px={ 2 }>\n\t\t\t\t\t\t<GlobalClassesList disabled={ isPublishing } />\n\t\t\t\t\t</PanelBody>\n\t\t\t\t\t<PanelFooter>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\tcolor=\"global\"\n\t\t\t\t\t\t\tvariant=\"contained\"\n\t\t\t\t\t\t\tonClick={ publish }\n\t\t\t\t\t\t\tdisabled={ ! isDirty }\n\t\t\t\t\t\t\tloading={ isPublishing }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Save changes', 'elementor' ) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</PanelFooter>\n\t\t\t\t</Panel>\n\t\t\t</ErrorBoundary>\n\t\t\t<ClassManagerIntroduction />\n\t\t\t{ isSaveChangesDialogOpen && (\n\t\t\t\t<SaveChangesDialog>\n\t\t\t\t\t<SaveChangesDialog.Title>{ __( 'You have unsaved changes', 'elementor' ) }</SaveChangesDialog.Title>\n\t\t\t\t\t<SaveChangesDialog.Content>\n\t\t\t\t\t\t<SaveChangesDialog.ContentText>\n\t\t\t\t\t\t\t{ __( 'You have unsaved changes in the Class Manager.', 'elementor' ) }\n\t\t\t\t\t\t</SaveChangesDialog.ContentText>\n\t\t\t\t\t\t<SaveChangesDialog.ContentText>\n\t\t\t\t\t\t\t{ __( 'To avoid losing your updates, save your changes before leaving.', 'elementor' ) }\n\t\t\t\t\t\t</SaveChangesDialog.ContentText>\n\t\t\t\t\t</SaveChangesDialog.Content>\n\t\t\t\t\t<SaveChangesDialog.Actions\n\t\t\t\t\t\tactions={ {\n\t\t\t\t\t\t\tcancel: {\n\t\t\t\t\t\t\t\tlabel: __( 'Cancel', 'elementor' ),\n\t\t\t\t\t\t\t\taction: closeSaveChangesDialog,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tconfirm: {\n\t\t\t\t\t\t\t\tlabel: __( 'Save & Continue', 'elementor' ),\n\t\t\t\t\t\t\t\taction: async () => {\n\t\t\t\t\t\t\t\t\tawait publish();\n\t\t\t\t\t\t\t\t\tcloseSaveChangesDialog();\n\t\t\t\t\t\t\t\t\tclosePanel();\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} }\n\t\t\t\t\t/>\n\t\t\t\t</SaveChangesDialog>\n\t\t\t) }\n\t\t</ThemeProvider>\n\t);\n}\n\nconst CloseButton = ( { onClose, ...props }: IconButtonProps & { onClose: () => void } ) => (\n\t<IconButton size=\"small\" color=\"secondary\" onClick={ onClose } aria-label=\"Close\" { ...props }>\n\t\t<XIcon fontSize=\"small\" />\n\t</IconButton>\n);\n\nconst ErrorBoundaryFallback = () => (\n\t<Box role=\"alert\" sx={ { minHeight: '100%', p: 2 } }>\n\t\t<Alert severity=\"error\" sx={ { mb: 2, maxWidth: 400, textAlign: 'center' } }>\n\t\t\t<strong>{ __( 'Something went wrong', 'elementor' ) }</strong>\n\t\t</Alert>\n\t</Box>\n);\n\nconst usePreventUnload = () => {\n\tconst isDirty = useDirtyState();\n\n\tuseEffect( () => {\n\t\tconst handleBeforeUnload = ( event: BeforeUnloadEvent ) => {\n\t\t\tif ( isDirty ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t};\n\n\t\twindow.addEventListener( 'beforeunload', handleBeforeUnload );\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener( 'beforeunload', handleBeforeUnload );\n\t\t};\n\t}, [ isDirty ] );\n};\n\nconst usePublish = () => {\n\treturn useMutation( {\n\t\tmutationFn: () => saveGlobalClasses( { context: 'frontend' } ),\n\t\tonSuccess: async () => {\n\t\t\tsetDocumentModifiedStatus( false );\n\n\t\t\tif ( hasDeletedItems() ) {\n\t\t\t\tawait onDelete();\n\t\t\t}\n\t\t},\n\t} );\n};\n","import { __useSelector as useSelector } from '@elementor/store';\n\nimport { selectIsDirty } from '../store';\n\nexport const useDirtyState = () => {\n\treturn useSelector( selectIsDirty );\n};\n","import { mergeProps, type Props } from '@elementor/editor-props';\nimport {\n\tgetVariantByMeta,\n\ttype StyleDefinition,\n\ttype StyleDefinitionID,\n\ttype StyleDefinitionVariant,\n} from '@elementor/editor-styles';\nimport { type UpdateActionPayload } from '@elementor/editor-styles-repository';\nimport {\n\t__createSelector as createSelector,\n\t__createSlice as createSlice,\n\ttype PayloadAction,\n\ttype SliceState,\n} from '@elementor/store';\n\nimport type { ApiContext } from './api';\nimport { GlobalClassNotFoundError } from './errors';\n\nexport type GlobalClasses = {\n\titems: Record< StyleDefinitionID, StyleDefinition >;\n\torder: StyleDefinitionID[];\n};\n\ntype GlobalClassesState = {\n\tdata: GlobalClasses;\n\tinitialData: {\n\t\tfrontend: GlobalClasses;\n\t\tpreview: GlobalClasses;\n\t};\n\tisDirty: boolean;\n};\n\nconst initialState: GlobalClassesState = {\n\tdata: { items: {}, order: [] },\n\tinitialData: {\n\t\tfrontend: { items: {}, order: [] },\n\t\tpreview: { items: {}, order: [] },\n\t},\n\tisDirty: false,\n};\n\nexport type StateWithGlobalClasses = SliceState< typeof slice >;\n\n// Slice\nconst SLICE_NAME = 'globalClasses';\n\nexport const slice = createSlice( {\n\tname: SLICE_NAME,\n\tinitialState,\n\treducers: {\n\t\tload(\n\t\t\tstate,\n\t\t\t{\n\t\t\t\tpayload: { frontend, preview },\n\t\t\t}: PayloadAction< {\n\t\t\t\tfrontend: GlobalClasses;\n\t\t\t\tpreview: GlobalClasses;\n\t\t\t} >\n\t\t) {\n\t\t\tstate.initialData.frontend = frontend;\n\t\t\tstate.initialData.preview = preview;\n\t\t\tstate.data = preview;\n\n\t\t\tstate.isDirty = false;\n\t\t},\n\n\t\tadd( state, { payload }: PayloadAction< StyleDefinition > ) {\n\t\t\tstate.data.items[ payload.id ] = payload;\n\t\t\tstate.data.order.unshift( payload.id );\n\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\tdelete( state, { payload }: PayloadAction< StyleDefinitionID > ) {\n\t\t\tstate.data.items = Object.fromEntries(\n\t\t\t\tObject.entries( state.data.items ).filter( ( [ id ] ) => id !== payload )\n\t\t\t);\n\n\t\t\tstate.data.order = state.data.order.filter( ( id ) => id !== payload );\n\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\tsetOrder( state, { payload }: PayloadAction< StyleDefinitionID[] > ) {\n\t\t\tstate.data.order = payload;\n\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\tupdate( state, { payload }: PayloadAction< { style: UpdateActionPayload } > ) {\n\t\t\tconst style = state.data.items[ payload.style.id ];\n\n\t\t\tconst mergedData = {\n\t\t\t\t...style,\n\t\t\t\t...payload.style,\n\t\t\t};\n\n\t\t\tstate.data.items[ payload.style.id ] = mergedData;\n\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\tupdateProps(\n\t\t\tstate,\n\t\t\t{\n\t\t\t\tpayload,\n\t\t\t}: PayloadAction< { id: StyleDefinitionID; meta: StyleDefinitionVariant[ 'meta' ]; props: Props } >\n\t\t) {\n\t\t\tconst style = state.data.items[ payload.id ];\n\n\t\t\tif ( ! style ) {\n\t\t\t\tthrow new GlobalClassNotFoundError( { context: { styleId: payload.id } } );\n\t\t\t}\n\n\t\t\tconst variant = getVariantByMeta( style, payload.meta );\n\n\t\t\tif ( variant ) {\n\t\t\t\tvariant.props = mergeProps( variant.props, payload.props );\n\t\t\t} else {\n\t\t\t\tstyle.variants.push( { meta: payload.meta, props: payload.props } );\n\t\t\t}\n\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\treset( state, { payload: { context } }: PayloadAction< { context: ApiContext } > ) {\n\t\t\tif ( context === 'frontend' ) {\n\t\t\t\tstate.initialData.frontend = state.data;\n\n\t\t\t\tstate.isDirty = false;\n\t\t\t}\n\n\t\t\tstate.initialData.preview = state.data;\n\t\t},\n\t},\n} );\n\n// Selectors\nexport const selectData = ( state: SliceState< typeof slice > ) => state[ SLICE_NAME ].data;\n\nexport const selectFrontendInitialData = ( state: SliceState< typeof slice > ) =>\n\tstate[ SLICE_NAME ].initialData.frontend;\n\nexport const selectPreviewInitialData = ( state: SliceState< typeof slice > ) =>\n\tstate[ SLICE_NAME ].initialData.preview;\n\nexport const selectOrder = createSelector( selectData, ( { order } ) => order );\n\nexport const selectGlobalClasses = createSelector( selectData, ( { items } ) => items );\n\nexport const selectIsDirty = ( state: SliceState< typeof slice > ) => state[ SLICE_NAME ].isDirty;\n\nexport const selectOrderedClasses = createSelector( selectGlobalClasses, selectOrder, ( items, order ) =>\n\torder.map( ( id ) => items[ id ] )\n);\n\nexport const selectClass = ( state: SliceState< typeof slice >, id: StyleDefinitionID ) =>\n\tstate[ SLICE_NAME ].data.items[ id ] ?? null;\n","import { createError } from '@elementor/utils';\n\nexport const GlobalClassNotFoundError = createError< { styleId: string } >( {\n\tcode: 'global_class_not_found',\n\tmessage: 'Global class not found.',\n} );\n\nexport const GlobalClassLabelAlreadyExistsError = createError< { label: string } >( {\n\tcode: 'global_class_label_already_exists',\n\tmessage: 'Class with this name already exists.',\n} );\n","import { __dispatch as dispatch, __getState as getState } from '@elementor/store';\n\nimport { apiClient, type ApiContext } from './api';\nimport { type GlobalClasses, selectData, selectFrontendInitialData, selectPreviewInitialData, slice } from './store';\n\ntype Options = {\n\tcontext: ApiContext;\n};\n\nexport async function saveGlobalClasses( { context }: Options ) {\n\tconst state = selectData( getState() );\n\n\tif ( context === 'preview' ) {\n\t\tawait apiClient.saveDraft( {\n\t\t\titems: state.items,\n\t\t\torder: state.order,\n\t\t\tchanges: calculateChanges( state, selectPreviewInitialData( getState() ) ),\n\t\t} );\n\t} else {\n\t\tawait apiClient.publish( {\n\t\t\titems: state.items,\n\t\t\torder: state.order,\n\t\t\tchanges: calculateChanges( state, selectFrontendInitialData( getState() ) ),\n\t\t} );\n\t}\n\n\tdispatch( slice.actions.reset( { context } ) );\n}\n\nfunction calculateChanges( state: GlobalClasses, initialData: GlobalClasses ) {\n\tconst stateIds = Object.keys( state.items );\n\tconst initialDataIds = Object.keys( initialData.items );\n\n\treturn {\n\t\tadded: stateIds.filter( ( id ) => ! initialDataIds.includes( id ) ),\n\t\tdeleted: initialDataIds.filter( ( id ) => ! stateIds.includes( id ) ),\n\t\tmodified: stateIds.filter( ( id ) => {\n\t\t\treturn id in initialData.items && hash( state.items[ id ] ) !== hash( initialData.items[ id ] );\n\t\t} ),\n\t};\n}\n\ntype UnknownObject = Record< string, unknown >;\n\n// Inspired by:\n// https://github.com/TanStack/query/blob/66ea5f2fc/packages/query-core/src/utils.ts#L212\nfunction hash( obj: UnknownObject ): string {\n\treturn JSON.stringify( obj, ( _, value ) =>\n\t\tisPlainObject( value )\n\t\t\t? Object.keys( value )\n\t\t\t\t\t.sort()\n\t\t\t\t\t.reduce< UnknownObject >( ( result, key ) => {\n\t\t\t\t\t\tresult[ key ] = value[ key ];\n\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}, {} )\n\t\t\t: value\n\t);\n}\n\nfunction isPlainObject( value: unknown ): value is UnknownObject {\n\treturn !! value && typeof value === 'object' && ! Array.isArray( value );\n}\n","import { type StyleDefinition, type StyleDefinitionID, type StyleDefinitionsMap } from '@elementor/editor-styles';\nimport { type HttpResponse, httpService } from '@elementor/http-client';\n\nimport { type GlobalClasses } from './store';\n\nconst RESOURCE_URL = '/global-classes';\n\nexport type GlobalClassesGetAllResponse = HttpResponse< StyleDefinitionsMap, { order: StyleDefinition[ 'id' ][] } >;\n\ntype UpdatePayload = GlobalClasses & {\n\tchanges: {\n\t\tadded: StyleDefinitionID[];\n\t\tdeleted: StyleDefinitionID[];\n\t\tmodified: StyleDefinitionID[];\n\t};\n};\n\nexport type ApiContext = 'preview' | 'frontend';\n\nexport const apiClient = {\n\tall: ( context: ApiContext = 'preview' ) =>\n\t\thttpService().get< GlobalClassesGetAllResponse >( 'elementor/v1' + RESOURCE_URL, {\n\t\t\tparams: { context },\n\t\t} ),\n\n\tpublish: ( payload: UpdatePayload ) =>\n\t\thttpService().put( 'elementor/v1' + RESOURCE_URL, payload, {\n\t\t\tparams: {\n\t\t\t\tcontext: 'frontend' satisfies ApiContext,\n\t\t\t},\n\t\t} ),\n\n\tsaveDraft: ( payload: UpdatePayload ) =>\n\t\thttpService().put( 'elementor/v1' + RESOURCE_URL, payload, {\n\t\t\tparams: {\n\t\t\t\tcontext: 'preview' satisfies ApiContext,\n\t\t\t},\n\t\t} ),\n};\n","import * as React from 'react';\nimport { useState } from 'react';\nimport { useSuppressedMessage } from '@elementor/editor-current-user';\nimport { IntroductionModal } from '@elementor/editor-ui';\nimport { Box, Image, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nconst MESSAGE_KEY = 'global-class-manager';\n\nexport const ClassManagerIntroduction = () => {\n\tconst [ isMessageSuppressed, suppressMessage ] = useSuppressedMessage( MESSAGE_KEY );\n\tconst [ shouldShowIntroduction, setShouldShowIntroduction ] = useState( ! isMessageSuppressed );\n\n\treturn (\n\t\t<IntroductionModal\n\t\t\topen={ shouldShowIntroduction }\n\t\t\ttitle={ __( 'Class Manager', 'elementor' ) }\n\t\t\thandleClose={ ( shouldShowAgain ) => {\n\t\t\t\tif ( ! shouldShowAgain ) {\n\t\t\t\t\tsuppressMessage();\n\t\t\t\t}\n\n\t\t\t\tsetShouldShowIntroduction( false );\n\t\t\t} }\n\t\t>\n\t\t\t<Image\n\t\t\t\tsx={ { width: '100%', aspectRatio: '16 / 9' } }\n\t\t\t\tsrc={ 'https://assets.elementor.com/packages/v1/images/class-manager-intro.svg' }\n\t\t\t\talt={ '' }\n\t\t\t/>\n\t\t\t<IntroductionContent />\n\t\t</IntroductionModal>\n\t);\n};\n\nconst IntroductionContent = () => {\n\treturn (\n\t\t<Box p={ 3 }>\n\t\t\t<Typography variant={ 'body2' }>\n\t\t\t\t{ __(\n\t\t\t\t\t\"The Class Manager lets you see all the classes you've created, plus adjust their priority, rename them, and delete unused classes to keep your CSS structured.\",\n\t\t\t\t\t'elementor'\n\t\t\t\t) }\n\t\t\t</Typography>\n\t\t\t<br />\n\t\t\t<Typography variant={ 'body2' }>\n\t\t\t\t{ __(\n\t\t\t\t\t'Remember, when editing an item within a specific class, any changes you make will apply across all elements in that class.',\n\t\t\t\t\t'elementor'\n\t\t\t\t) }\n\t\t\t</Typography>\n\t\t</Box>\n\t);\n};\n","import { getCurrentDocument, getV1DocumentsManager } from '@elementor/editor-documents';\nimport { __privateRunCommand as runCommand } from '@elementor/editor-v1-adapters';\nimport { __dispatch as dispatch } from '@elementor/store';\n\nimport { slice } from '../../store';\n\nlet isDeleted = false;\n\nexport const deleteClass = ( id: string ) => {\n\tdispatch( slice.actions.delete( id ) );\n\n\tisDeleted = true;\n};\n\nexport const onDelete = async () => {\n\tawait reloadDocument();\n\n\tisDeleted = false;\n};\n\nexport const hasDeletedItems = () => isDeleted;\n\n// When deleting a class, we remove it from all the documents that have it applied.\n// In order to reflect the changes in the active document, we need to reload it.\nconst reloadDocument = () => {\n\tconst currentDocument = getCurrentDocument();\n\tconst documentsManager = getV1DocumentsManager();\n\n\tdocumentsManager.invalidateCache();\n\n\treturn runCommand( 'editor/documents/switch', {\n\t\tid: currentDocument?.id,\n\t\tshouldScroll: false,\n\t\tshouldNavigateToDefaultRoute: false,\n\t} );\n};\n","import * as React from 'react';\nimport { ColorSwatchIcon } from '@elementor/icons';\nimport { type SvgIconProps } from '@elementor/ui';\n\nexport const FlippedColorSwatchIcon = ( { sx, ...props }: SvgIconProps ) => (\n\t<ColorSwatchIcon sx={ { transform: 'rotate(90deg)', ...sx } } { ...props } />\n);\n","import * as React from 'react';\nimport { type StyleDefinitionID } from '@elementor/editor-styles';\nimport { validateStyleLabel } from '@elementor/editor-styles-repository';\nimport { EditableField, EllipsisWithTooltip, MenuListItem, useEditable } from '@elementor/editor-ui';\nimport { DotsVerticalIcon } from '@elementor/icons';\nimport { __useDispatch as useDispatch } from '@elementor/store';\nimport {\n\tbindMenu,\n\tbindTrigger,\n\tBox,\n\tIconButton,\n\tList,\n\tListItemButton,\n\ttype ListItemButtonProps,\n\tMenu,\n\tStack,\n\tstyled,\n\ttype Theme,\n\tTooltip,\n\tTypography,\n\ttype TypographyProps,\n\tusePopupState,\n} from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { useClassesOrder } from '../../hooks/use-classes-order';\nimport { useOrderedClasses } from '../../hooks/use-ordered-classes';\nimport { slice } from '../../store';\nimport { DeleteConfirmationProvider, useDeleteConfirmation } from './delete-confirmation-dialog';\nimport { FlippedColorSwatchIcon } from './flipped-color-swatch-icon';\nimport { SortableItem, SortableProvider, SortableTrigger, type SortableTriggerProps } from './sortable';\n\nexport const GlobalClassesList = ( { disabled }: { disabled?: boolean } ) => {\n\tconst cssClasses = useOrderedClasses();\n\tconst dispatch = useDispatch();\n\n\tconst [ classesOrder, reorderClasses ] = useReorder();\n\n\tif ( ! cssClasses?.length ) {\n\t\treturn <EmptyState />;\n\t}\n\n\treturn (\n\t\t<DeleteConfirmationProvider>\n\t\t\t<List sx={ { display: 'flex', flexDirection: 'column', gap: 0.5 } }>\n\t\t\t\t<SortableProvider value={ classesOrder } onChange={ reorderClasses }>\n\t\t\t\t\t{ cssClasses?.map( ( { id, label } ) => {\n\t\t\t\t\t\tconst renameClass = ( newLabel: string ) => {\n\t\t\t\t\t\t\tdispatch(\n\t\t\t\t\t\t\t\tslice.actions.update( {\n\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\tlabel: newLabel,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<SortableItem key={ id } id={ id }>\n\t\t\t\t\t\t\t\t{ ( { isDragged, isDragPlaceholder, triggerProps, triggerStyle } ) => (\n\t\t\t\t\t\t\t\t\t<ClassItem\n\t\t\t\t\t\t\t\t\t\tid={ id }\n\t\t\t\t\t\t\t\t\t\tlabel={ label }\n\t\t\t\t\t\t\t\t\t\trenameClass={ renameClass }\n\t\t\t\t\t\t\t\t\t\tselected={ isDragged }\n\t\t\t\t\t\t\t\t\t\tdisabled={ disabled || isDragPlaceholder }\n\t\t\t\t\t\t\t\t\t\tsortableTriggerProps={ { ...triggerProps, style: triggerStyle } }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</SortableItem>\n\t\t\t\t\t\t);\n\t\t\t\t\t} ) }\n\t\t\t\t</SortableProvider>\n\t\t\t</List>\n\t\t</DeleteConfirmationProvider>\n\t);\n};\n\nconst useReorder = () => {\n\tconst dispatch = useDispatch();\n\tconst order = useClassesOrder();\n\n\tconst reorder = ( newIds: StyleDefinitionID[] ) => {\n\t\tdispatch( slice.actions.setOrder( newIds ) );\n\t};\n\n\treturn [ order, reorder ] as const;\n};\n\ntype ClassItemProps = React.PropsWithChildren< {\n\tid: string;\n\tlabel: string;\n\trenameClass: ( newLabel: string ) => void;\n\tselected?: boolean;\n\tdisabled?: boolean;\n\tsortableTriggerProps: SortableTriggerProps;\n} >;\n\nconst ClassItem = ( { id, label, renameClass, selected, disabled, sortableTriggerProps }: ClassItemProps ) => {\n\tconst {\n\t\tref: editableRef,\n\t\topenEditMode,\n\t\tisEditing,\n\t\terror,\n\t\tgetProps: getEditableProps,\n\t} = useEditable( {\n\t\tvalue: label,\n\t\tonSubmit: renameClass,\n\t\tvalidation: validateLabel,\n\t} );\n\n\tconst { openDialog } = useDeleteConfirmation();\n\n\tconst popupState = usePopupState( {\n\t\tvariant: 'popover',\n\t\tdisableAutoFocus: true,\n\t} );\n\n\tconst isSelected = ( selected || popupState.isOpen ) && ! disabled;\n\n\treturn (\n\t\t<>\n\t\t\t<StyledListItemButton\n\t\t\t\tdense\n\t\t\t\tdisableGutters\n\t\t\t\tshowActions={ isSelected || isEditing }\n\t\t\t\tshape=\"rounded\"\n\t\t\t\tonDoubleClick={ openEditMode }\n\t\t\t\tselected={ isSelected }\n\t\t\t\tdisabled={ disabled }\n\t\t\t\tfocusVisibleClassName=\"visible-class-item\"\n\t\t\t>\n\t\t\t\t<SortableTrigger { ...sortableTriggerProps } />\n\t\t\t\t<Indicator isActive={ isEditing } isError={ !! error }>\n\t\t\t\t\t{ isEditing ? (\n\t\t\t\t\t\t<EditableField\n\t\t\t\t\t\t\tref={ editableRef }\n\t\t\t\t\t\t\terror={ error }\n\t\t\t\t\t\t\tas={ Typography }\n\t\t\t\t\t\t\tvariant=\"caption\"\n\t\t\t\t\t\t\t{ ...getEditableProps() }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<EllipsisWithTooltip title={ label } as={ Typography } variant=\"caption\" />\n\t\t\t\t\t) }\n\t\t\t\t</Indicator>\n\t\t\t\t<Tooltip\n\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\tclassName={ 'class-item-more-actions' }\n\t\t\t\t\ttitle={ __( 'More actions', 'elementor' ) }\n\t\t\t\t>\n\t\t\t\t\t<IconButton size=\"tiny\" { ...bindTrigger( popupState ) } aria-label=\"More actions\">\n\t\t\t\t\t\t<DotsVerticalIcon fontSize=\"tiny\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t</StyledListItemButton>\n\t\t\t<Menu\n\t\t\t\t{ ...bindMenu( popupState ) }\n\t\t\t\tanchorOrigin={ {\n\t\t\t\t\tvertical: 'bottom',\n\t\t\t\t\thorizontal: 'right',\n\t\t\t\t} }\n\t\t\t\ttransformOrigin={ {\n\t\t\t\t\tvertical: 'top',\n\t\t\t\t\thorizontal: 'right',\n\t\t\t\t} }\n\t\t\t>\n\t\t\t\t<MenuListItem\n\t\t\t\t\tsx={ { minWidth: '160px' } }\n\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\tpopupState.close();\n\t\t\t\t\t\topenEditMode();\n\t\t\t\t\t} }\n\t\t\t\t>\n\t\t\t\t\t<Typography variant=\"caption\" sx={ { color: 'text.primary' } }>\n\t\t\t\t\t\t{ __( 'Rename', 'elementor' ) }\n\t\t\t\t\t</Typography>\n\t\t\t\t</MenuListItem>\n\t\t\t\t<MenuListItem\n\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\tpopupState.close();\n\t\t\t\t\t\topenDialog( { id, label } );\n\t\t\t\t\t} }\n\t\t\t\t>\n\t\t\t\t\t<Typography variant=\"caption\" sx={ { color: 'error.light' } }>\n\t\t\t\t\t\t{ __( 'Delete', 'elementor' ) }\n\t\t\t\t\t</Typography>\n\t\t\t\t</MenuListItem>\n\t\t\t</Menu>\n\t\t</>\n\t);\n};\n\n// Custom styles for sortable list item, until the component is available in the UI package.\nconst StyledListItemButton = styled( ListItemButton, {\n\tshouldForwardProp: ( prop: string ) => ! [ 'showActions' ].includes( prop ),\n} )< ListItemButtonProps & { showActions: boolean } >(\n\t( { showActions } ) => `\n\tmin-height: 36px;\n\n\t&.visible-class-item {\n\t\tbox-shadow: none !important;\n\t}\n\n\t.class-item-more-actions, .class-item-sortable-trigger {\n\t\tvisibility: ${ showActions ? 'visible' : 'hidden' };\n\t}\n\n\t.class-item-sortable-trigger {\n\t\tvisibility: ${ showActions ? 'visible' : 'hidden' };\n\t}\n\n\t&:hover&:not(:disabled) {\n\t\t.class-item-more-actions, .class-item-sortable-trigger {\n\t\t\tvisibility: visible;\n\t\t}\n\t}\n`\n);\n\nconst EmptyState = () => (\n\t<Stack alignItems=\"center\" gap={ 1.5 } pt={ 10 } px={ 0.5 } maxWidth=\"260px\" margin=\"auto\">\n\t\t<FlippedColorSwatchIcon fontSize=\"large\" />\n\t\t<StyledHeader variant=\"subtitle2\" component=\"h2\" color=\"text.secondary\">\n\t\t\t{ __( 'There are no global classes yet.', 'elementor' ) }\n\t\t</StyledHeader>\n\t\t<Typography align=\"center\" variant=\"caption\" color=\"text.secondary\">\n\t\t\t{ __(\n\t\t\t\t'CSS classes created in the editor panel will appear here. Once they are available, you can arrange their hierarchy, rename them, or delete them as needed.',\n\t\t\t\t'elementor'\n\t\t\t) }\n\t\t</Typography>\n\t</Stack>\n);\n\n// Override panel reset styles.\nconst StyledHeader = styled( Typography )< TypographyProps >( ( { theme, variant } ) => ( {\n\t'&.MuiTypography-root': {\n\t\t...( theme.typography[ variant as keyof typeof theme.typography ] as React.CSSProperties ),\n\t},\n} ) );\n\nconst Indicator = styled( Box, {\n\tshouldForwardProp: ( prop: string ) => ! [ 'isActive', 'isError' ].includes( prop ),\n} )< { isActive: boolean; isError: boolean } >( ( { theme, isActive, isError } ) => ( {\n\tdisplay: 'flex',\n\twidth: '100%',\n\tflexGrow: 1,\n\tborderRadius: theme.spacing( 0.5 ),\n\tborder: getIndicatorBorder( { isActive, isError, theme } ),\n\tpadding: `0 ${ theme.spacing( 1 ) }`,\n\tmarginLeft: isActive ? theme.spacing( 1 ) : 0,\n\tminWidth: 0,\n} ) );\n\nconst getIndicatorBorder = ( { isActive, isError, theme }: { isActive: boolean; isError: boolean; theme: Theme } ) => {\n\tif ( isError ) {\n\t\treturn `2px solid ${ theme.palette.error.main }`;\n\t}\n\n\tif ( isActive ) {\n\t\treturn `2px solid ${ theme.palette.secondary.main }`;\n\t}\n\n\treturn 'none';\n};\n\nconst validateLabel = ( newLabel: string ) => {\n\tconst result = validateStyleLabel( newLabel, 'rename' );\n\n\tif ( result.isValid ) {\n\t\treturn null;\n\t}\n\n\treturn result.errorMessage;\n};\n","import { __useSelector as useSelector } from '@elementor/store';\n\nimport { selectOrder } from '../store';\n\nexport const useClassesOrder = () => {\n\treturn useSelector( selectOrder );\n};\n","import { __useSelector as useSelector } from '@elementor/store';\n\nimport { selectOrderedClasses } from '../store';\n\nexport const useOrderedClasses = () => {\n\treturn useSelector( selectOrderedClasses );\n};\n","import * as React from 'react';\nimport { createContext, useContext, useState } from 'react';\nimport { type StyleDefinition } from '@elementor/editor-styles';\nimport { AlertOctagonFilledIcon } from '@elementor/icons';\nimport {\n\tButton,\n\tDialog,\n\tDialogActions,\n\tDialogContent,\n\tDialogContentText,\n\tDialogTitle,\n\tTypography,\n} from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { deleteClass } from './delete-class';\n\ntype DeleteConfirmationDialogProps = Pick< StyleDefinition, 'id' | 'label' >;\n\ntype DeleteConfirmationContext = {\n\topenDialog: ( props: DeleteConfirmationDialogProps ) => void;\n\tcloseDialog: () => void;\n\tdialogProps: DeleteConfirmationDialogProps | null;\n};\n\nconst context = createContext< DeleteConfirmationContext | null >( null );\n\nexport const DeleteConfirmationProvider = ( { children }: React.PropsWithChildren ) => {\n\tconst [ dialogProps, setDialogProps ] = useState< DeleteConfirmationDialogProps | null >( null );\n\n\tconst openDialog = ( props: DeleteConfirmationDialogProps ) => {\n\t\tsetDialogProps( props );\n\t};\n\n\tconst closeDialog = () => {\n\t\tsetDialogProps( null );\n\t};\n\n\treturn (\n\t\t<context.Provider value={ { openDialog, closeDialog, dialogProps } }>\n\t\t\t{ children }\n\t\t\t{ !! dialogProps && <DeleteConfirmationDialog { ...dialogProps } /> }\n\t\t</context.Provider>\n\t);\n};\n\nconst TITLE_ID = 'delete-class-dialog';\n\nconst DeleteConfirmationDialog = ( { label, id }: DeleteConfirmationDialogProps ) => {\n\tconst { closeDialog } = useDeleteConfirmation();\n\n\tconst onConfirm = () => {\n\t\tdeleteClass( id );\n\n\t\tcloseDialog();\n\t};\n\n\treturn (\n\t\t<Dialog open onClose={ closeDialog } aria-labelledby={ TITLE_ID } maxWidth=\"xs\">\n\t\t\t<DialogTitle id={ TITLE_ID } display=\"flex\" alignItems=\"center\" gap={ 1 } sx={ { lineHeight: 1 } }>\n\t\t\t\t<AlertOctagonFilledIcon color=\"error\" />\n\t\t\t\t{ __( 'Delete this class?', 'elementor' ) }\n\t\t\t</DialogTitle>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogContentText variant=\"body2\" color=\"textPrimary\">\n\t\t\t\t\t{ __( 'Deleting', 'elementor' ) }\n\t\t\t\t\t<Typography variant=\"subtitle2\" component=\"span\">\n\t\t\t\t\t\t { label } \n\t\t\t\t\t</Typography>\n\t\t\t\t\t{ __(\n\t\t\t\t\t\t'will permanently remove it from your project and may affect the design across all elements using it. This action cannot be undone.',\n\t\t\t\t\t\t'elementor'\n\t\t\t\t\t) }\n\t\t\t\t</DialogContentText>\n\t\t\t</DialogContent>\n\t\t\t<DialogActions>\n\t\t\t\t<Button color=\"secondary\" onClick={ closeDialog }>\n\t\t\t\t\t{ __( 'Not now', 'elementor' ) }\n\t\t\t\t</Button>\n\t\t\t\t<Button variant=\"contained\" color=\"error\" onClick={ onConfirm }>\n\t\t\t\t\t{ __( 'Delete', 'elementor' ) }\n\t\t\t\t</Button>\n\t\t\t</DialogActions>\n\t\t</Dialog>\n\t);\n};\n\nexport const useDeleteConfirmation = () => {\n\tconst contextValue = useContext( context );\n\n\tif ( ! contextValue ) {\n\t\tthrow new Error( 'useDeleteConfirmation must be used within a DeleteConfirmationProvider' );\n\t}\n\n\treturn contextValue;\n};\n","import * as React from 'react';\nimport { GripVerticalIcon } from '@elementor/icons';\nimport {\n\tBox,\n\tstyled,\n\tUnstableSortableItem,\n\ttype UnstableSortableItemProps,\n\ttype UnstableSortableItemRenderProps,\n\tUnstableSortableProvider,\n\ttype UnstableSortableProviderProps,\n} from '@elementor/ui';\n\nexport const SortableProvider = < T extends string >( props: UnstableSortableProviderProps< T > ) => (\n\t<UnstableSortableProvider restrictAxis variant=\"static\" dragPlaceholderStyle={ { opacity: '1' } } { ...props } />\n);\n\nexport type SortableTriggerProps = React.HTMLAttributes< HTMLDivElement >;\n\nexport const SortableTrigger = ( props: SortableTriggerProps ) => (\n\t<StyledSortableTrigger { ...props } role=\"button\" className=\"class-item-sortable-trigger\">\n\t\t<GripVerticalIcon fontSize=\"tiny\" />\n\t</StyledSortableTrigger>\n);\n\ntype SortableItemProps = {\n\tid: UnstableSortableItemProps[ 'id' ];\n\tchildren: ( props: Partial< UnstableSortableItemRenderProps > ) => React.ReactNode;\n};\n\nexport const SortableItem = ( { children, id, ...props }: SortableItemProps ) => {\n\treturn (\n\t\t<UnstableSortableItem\n\t\t\t{ ...props }\n\t\t\tid={ id }\n\t\t\trender={ ( {\n\t\t\t\titemProps,\n\t\t\t\tisDragged,\n\t\t\t\ttriggerProps,\n\t\t\t\titemStyle,\n\t\t\t\ttriggerStyle,\n\t\t\t\tdropIndicationStyle,\n\t\t\t\tshowDropIndication,\n\t\t\t\tisDragOverlay,\n\t\t\t\tisDragPlaceholder,\n\t\t\t}: UnstableSortableItemRenderProps ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<Box\n\t\t\t\t\t\t{ ...itemProps }\n\t\t\t\t\t\tstyle={ itemStyle }\n\t\t\t\t\t\tcomponent={ 'li' }\n\t\t\t\t\t\trole=\"listitem\"\n\t\t\t\t\t\tsx={ {\n\t\t\t\t\t\t\tbackgroundColor: isDragOverlay ? 'background.paper' : undefined,\n\t\t\t\t\t\t} }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ children( {\n\t\t\t\t\t\t\titemProps,\n\t\t\t\t\t\t\tisDragged,\n\t\t\t\t\t\t\ttriggerProps,\n\t\t\t\t\t\t\titemStyle,\n\t\t\t\t\t\t\ttriggerStyle,\n\t\t\t\t\t\t\tisDragPlaceholder,\n\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t{ showDropIndication && <SortableItemIndicator style={ dropIndicationStyle } /> }\n\t\t\t\t\t</Box>\n\t\t\t\t);\n\t\t\t} }\n\t\t/>\n\t);\n};\n\nconst StyledSortableTrigger = styled( 'div' )( ( { theme } ) => ( {\n\tposition: 'absolute',\n\tleft: 0,\n\ttop: '50%',\n\ttransform: `translate( -${ theme.spacing( 1.5 ) }, -50% )`,\n\tcolor: theme.palette.action.active,\n} ) );\n\nconst SortableItemIndicator = styled( Box )`\n\twidth: 100%;\n\theight: 1px;\n\tbackground-color: ${ ( { theme } ) => theme.palette.text.primary };\n`;\n","type ExtendedWindow = Window & {\n\t$e?: {\n\t\tcomponents?: {\n\t\t\tget?: ( name: 'panel' ) =>\n\t\t\t\t| {\n\t\t\t\t\t\tblockUserInteractions?: () => void;\n\t\t\t\t\t\tunblockUserInteractions?: () => void;\n\t\t\t\t }\n\t\t\t\t| undefined;\n\t\t};\n\t};\n};\n\nexport function blockPanelInteractions() {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\textendedWindow.$e?.components?.get?.( 'panel' )?.blockUserInteractions?.();\n}\n\nexport function unblockPanelInteractions() {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\textendedWindow.$e?.components?.get?.( 'panel' )?.unblockUserInteractions?.();\n}\n","import * as React from 'react';\nimport { useState } from 'react';\nimport { AlertTriangleFilledIcon } from '@elementor/icons';\nimport {\n\tButton,\n\tDialog,\n\tDialogActions,\n\tDialogContent,\n\tDialogContentText,\n\ttype DialogContentTextProps,\n\ttype DialogProps,\n\tDialogTitle,\n} from '@elementor/ui';\n\nconst TITLE_ID = 'save-changes-dialog';\n\nconst SaveChangesDialog = ( { children, onClose }: Pick< DialogProps, 'children' | 'onClose' > ) => (\n\t<Dialog open onClose={ onClose } aria-labelledby={ TITLE_ID } maxWidth=\"xs\">\n\t\t{ children }\n\t</Dialog>\n);\n\nconst SaveChangesDialogTitle = ( { children }: React.PropsWithChildren ) => (\n\t<DialogTitle id={ TITLE_ID } display=\"flex\" alignItems=\"center\" gap={ 1 } sx={ { lineHeight: 1 } }>\n\t\t<AlertTriangleFilledIcon color=\"secondary\" />\n\t\t{ children }\n\t</DialogTitle>\n);\n\nconst SaveChangesDialogContent = ( { children }: React.PropsWithChildren ) => (\n\t<DialogContent>{ children }</DialogContent>\n);\n\nconst SaveChangesDialogContentText = ( props: DialogContentTextProps ) => (\n\t<DialogContentText variant=\"body2\" color=\"textPrimary\" display=\"flex\" flexDirection=\"column\" { ...props } />\n);\n\ntype Action = {\n\tlabel: string;\n\taction: () => void | Promise< void >;\n};\n\ntype ConfirmationDialogActionsProps = {\n\tactions: {\n\t\tcancel: Action;\n\t\tconfirm: Action;\n\t};\n};\nconst SaveChangesDialogActions = ( { actions }: ConfirmationDialogActionsProps ) => {\n\tconst [ isConfirming, setIsConfirming ] = useState( false );\n\tconst { cancel, confirm } = actions;\n\n\tconst onConfirm = async () => {\n\t\tsetIsConfirming( true );\n\t\tawait confirm.action();\n\t\tsetIsConfirming( false );\n\t};\n\treturn (\n\t\t<DialogActions>\n\t\t\t<Button variant=\"text\" color=\"secondary\" onClick={ cancel.action }>\n\t\t\t\t{ cancel.label }\n\t\t\t</Button>\n\t\t\t<Button variant=\"contained\" color=\"secondary\" onClick={ onConfirm } loading={ isConfirming }>\n\t\t\t\t{ confirm.label }\n\t\t\t</Button>\n\t\t</DialogActions>\n\t);\n};\n\nSaveChangesDialog.Title = SaveChangesDialogTitle;\nSaveChangesDialog.Content = SaveChangesDialogContent;\nSaveChangesDialog.ContentText = SaveChangesDialogContentText;\nSaveChangesDialog.Actions = SaveChangesDialogActions;\n\nconst useDialog = () => {\n\tconst [ isOpen, setIsOpen ] = useState( false );\n\n\tconst open = () => setIsOpen( true );\n\tconst close = () => setIsOpen( false );\n\n\treturn { isOpen, open, close };\n};\n\nexport { SaveChangesDialog, useDialog };\n","import { useEffect } from 'react';\nimport { __useDispatch as useDispatch } from '@elementor/store';\n\nimport { apiClient } from '../api';\nimport { slice } from '../store';\n\nexport function PopulateStore() {\n\tconst dispatch = useDispatch();\n\n\tuseEffect( () => {\n\t\tPromise.all( [ apiClient.all( 'preview' ), apiClient.all( 'frontend' ) ] ).then(\n\t\t\t( [ previewRes, frontendRes ] ) => {\n\t\t\t\tconst { data: previewData } = previewRes;\n\t\t\t\tconst { data: frontendData } = frontendRes;\n\n\t\t\t\tdispatch(\n\t\t\t\t\tslice.actions.load( {\n\t\t\t\t\t\tpreview: {\n\t\t\t\t\t\t\titems: previewData.data,\n\t\t\t\t\t\t\torder: previewData.meta.order,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfrontend: {\n\t\t\t\t\t\t\titems: frontendData.data,\n\t\t\t\t\t\t\torder: frontendData.meta.order,\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}, [ dispatch ] );\n\n\treturn null;\n}\n","import { generateId } from '@elementor/editor-styles';\nimport { createStylesProvider } from '@elementor/editor-styles-repository';\nimport {\n\t__dispatch as dispatch,\n\t__getState as getState,\n\t__subscribeWithSelector as subscribeWithSelector,\n} from '@elementor/store';\nimport { __ } from '@wordpress/i18n';\n\nimport { GlobalClassLabelAlreadyExistsError } from './errors';\nimport { selectClass, selectGlobalClasses, selectOrderedClasses, slice, type StateWithGlobalClasses } from './store';\n\nconst MAX_CLASSES = 50;\n\nexport const globalClassesStylesProvider = createStylesProvider( {\n\tkey: 'global-classes',\n\tpriority: 30,\n\tlimit: MAX_CLASSES,\n\tlabels: {\n\t\tsingular: __( 'class', 'elementor' ),\n\t\tplural: __( 'classes', 'elementor' ),\n\t},\n\tsubscribe: ( cb ) => subscribeWithSelector( ( state: StateWithGlobalClasses ) => state.globalClasses, cb ),\n\tactions: {\n\t\tall: () => selectOrderedClasses( getState() ),\n\t\tget: ( id ) => selectClass( getState(), id ),\n\t\tcreate: ( label ) => {\n\t\t\tconst classes = selectGlobalClasses( getState() );\n\n\t\t\tconst existingLabels = Object.values( classes ).map( ( style ) => style.label );\n\n\t\t\tif ( existingLabels.includes( label ) ) {\n\t\t\t\tthrow new GlobalClassLabelAlreadyExistsError( { context: { label } } );\n\t\t\t}\n\n\t\t\tconst existingIds = Object.keys( classes );\n\t\t\tconst id = generateId( 'g-', existingIds );\n\n\t\t\tdispatch(\n\t\t\t\tslice.actions.add( {\n\t\t\t\t\tid,\n\t\t\t\t\ttype: 'class',\n\t\t\t\t\tlabel,\n\t\t\t\t\tvariants: [],\n\t\t\t\t} )\n\t\t\t);\n\n\t\t\treturn id;\n\t\t},\n\t\tupdate: ( payload ) => {\n\t\t\tdispatch(\n\t\t\t\tslice.actions.update( {\n\t\t\t\t\tstyle: payload,\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\t\tdelete: ( id ) => {\n\t\t\tdispatch( slice.actions.delete( id ) );\n\t\t},\n\t\tupdateProps: ( args ) => {\n\t\t\tdispatch(\n\t\t\t\tslice.actions.updateProps( {\n\t\t\t\t\tid: args.id,\n\t\t\t\t\tmeta: args.meta,\n\t\t\t\t\tprops: args.props,\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\t},\n} );\n","import { setDocumentModifiedStatus } from '@elementor/editor-documents';\nimport { registerDataHook } from '@elementor/editor-v1-adapters';\nimport { __getState as getState, __subscribeWithSelector as subscribeWithSelector } from '@elementor/store';\n\nimport { saveGlobalClasses } from './save-global-classes';\nimport { selectIsDirty } from './store';\n\nexport function syncWithDocumentSave() {\n\tconst unsubscribe = syncDirtyState();\n\n\tbindSaveAction();\n\n\treturn unsubscribe;\n}\n\nfunction syncDirtyState() {\n\treturn subscribeWithSelector( selectIsDirty, () => {\n\t\tif ( ! isDirty() ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetDocumentModifiedStatus( true );\n\t} );\n}\n\nfunction bindSaveAction() {\n\tregisterDataHook( 'after', 'document/save/save', ( args ) => {\n\t\treturn saveGlobalClasses( {\n\t\t\tcontext: args.status === 'publish' ? 'frontend' : 'preview',\n\t\t} );\n\t} );\n}\n\nfunction isDirty() {\n\treturn selectIsDirty( getState() );\n}\n"],"mappings":"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","names":["import_editor_panels","import_editor_styles_repository","import_editor_v1_adapters","import_store","React","import_editor_documents","import_ui","import_i18n","React","import_react","import_editor_documents","import_editor_ui","import_editor_v1_adapters","import_icons","import_ui","import_i18n","import_store","createSlice","id","context","createSelector","useSelector","import_store","context","context","getState","dispatch","id","import_store","id","dispatch","runCommand","React","React","import_editor_ui","import_icons","import_store","import_ui","import_i18n","import_store","useSelector","import_store","useSelector","React","import_react","import_icons","import_ui","import_i18n","id","React","import_icons","import_ui","id","dispatch","useDispatch","id","React","import_react","import_icons","import_ui","TITLE_ID","createPanel","isDirty","useActiveDocument","useActiveDocumentActions","import_react","import_store","dispatch","useDispatch","import_editor_styles","import_editor_styles_repository","import_store","import_i18n","subscribeWithSelector","getState","id","dispatch","import_editor_documents","import_editor_v1_adapters","import_store","subscribeWithSelector","getState","registerSlice","registerPanel","listenTo"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/init.ts","../src/components/class-manager/class-manager-button.tsx","../src/components/class-manager/class-manager-panel.tsx","../src/hooks/use-dirty-state.ts","../src/store.ts","../src/errors.ts","../src/save-global-classes.ts","../src/api.ts","../src/components/class-manager/class-manager-introduction.tsx","../src/components/class-manager/delete-class.ts","../src/components/class-manager/flipped-color-swatch-icon.tsx","../src/components/class-manager/global-classes-list.tsx","../src/hooks/use-classes-order.ts","../src/hooks/use-ordered-classes.ts","../src/components/class-manager/delete-confirmation-dialog.tsx","../src/components/class-manager/sortable.tsx","../src/components/class-manager/panel-interactions.ts","../src/components/class-manager/save-changes-dialog.tsx","../src/components/populate-store.tsx","../src/global-classes-styles-provider.ts","../src/sync-with-document-save.ts"],"sourcesContent":["export { init } from './init';\n","import { injectIntoLogic } from '@elementor/editor';\nimport { injectIntoClassSelectorActions } from '@elementor/editor-editing-panel';\nimport { __registerPanel as registerPanel } from '@elementor/editor-panels';\nimport { stylesRepository } from '@elementor/editor-styles-repository';\nimport { __privateListenTo as listenTo, v1ReadyEvent } from '@elementor/editor-v1-adapters';\nimport { __registerSlice as registerSlice } from '@elementor/store';\n\nimport { ClassManagerButton } from './components/class-manager/class-manager-button';\nimport { panel } from './components/class-manager/class-manager-panel';\nimport { PopulateStore } from './components/populate-store';\nimport { globalClassesStylesProvider } from './global-classes-styles-provider';\nimport { slice } from './store';\nimport { syncWithDocumentSave } from './sync-with-document-save';\n\nexport function init() {\n\tregisterSlice( slice );\n\tregisterPanel( panel );\n\n\tstylesRepository.register( globalClassesStylesProvider );\n\n\tinjectIntoLogic( {\n\t\tid: 'global-classes-populate-store',\n\t\tcomponent: PopulateStore,\n\t} );\n\n\tinjectIntoClassSelectorActions( {\n\t\tid: 'global-classes-manager-button',\n\t\tcomponent: ClassManagerButton,\n\t} );\n\n\tlistenTo( v1ReadyEvent(), () => {\n\t\tsyncWithDocumentSave();\n\t} );\n}\n","import * as React from 'react';\nimport {\n\t__useActiveDocument as useActiveDocument,\n\t__useActiveDocumentActions as useActiveDocumentActions,\n} from '@elementor/editor-documents';\nimport { IconButton, Tooltip } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { usePanelActions } from './class-manager-panel';\nimport { FlippedColorSwatchIcon } from './flipped-color-swatch-icon';\nimport { SaveChangesDialog, useDialog } from './save-changes-dialog';\n\nexport const ClassManagerButton = () => {\n\tconst document = useActiveDocument();\n\tconst { open: openPanel } = usePanelActions();\n\tconst { save: saveDocument } = useActiveDocumentActions();\n\tconst { open: openSaveChangesDialog, close: closeSaveChangesDialog, isOpen: isSaveChangesDialogOpen } = useDialog();\n\n\tconst handleOpenPanel = () => {\n\t\tif ( document?.isDirty ) {\n\t\t\topenSaveChangesDialog();\n\t\t\treturn;\n\t\t}\n\n\t\topenPanel();\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<Tooltip title={ __( 'Class Manager', 'elementor' ) } placement=\"top\">\n\t\t\t\t<IconButton size=\"tiny\" onClick={ handleOpenPanel } sx={ { marginInlineEnd: -0.75 } }>\n\t\t\t\t\t<FlippedColorSwatchIcon fontSize=\"tiny\" />\n\t\t\t\t</IconButton>\n\t\t\t</Tooltip>\n\t\t\t{ isSaveChangesDialogOpen && (\n\t\t\t\t<SaveChangesDialog>\n\t\t\t\t\t<SaveChangesDialog.Title>{ __( 'You have unsaved changes', 'elementor' ) }</SaveChangesDialog.Title>\n\t\t\t\t\t<SaveChangesDialog.Content>\n\t\t\t\t\t\t<SaveChangesDialog.ContentText sx={ { mb: 2 } }>\n\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t\"To open the Class Manager, save your page first. You can't continue without saving.\",\n\t\t\t\t\t\t\t\t'elementor'\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</SaveChangesDialog.ContentText>\n\t\t\t\t\t</SaveChangesDialog.Content>\n\t\t\t\t\t<SaveChangesDialog.Actions\n\t\t\t\t\t\tactions={ {\n\t\t\t\t\t\t\tcancel: {\n\t\t\t\t\t\t\t\tlabel: __( 'Stay here', 'elementor' ),\n\t\t\t\t\t\t\t\taction: closeSaveChangesDialog,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tconfirm: {\n\t\t\t\t\t\t\t\tlabel: __( 'Save & Continue', 'elementor' ),\n\t\t\t\t\t\t\t\taction: async () => {\n\t\t\t\t\t\t\t\t\tawait saveDocument();\n\t\t\t\t\t\t\t\t\tcloseSaveChangesDialog();\n\t\t\t\t\t\t\t\t\topenPanel();\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} }\n\t\t\t\t\t/>\n\t\t\t\t</SaveChangesDialog>\n\t\t\t) }\n\t\t</>\n\t);\n};\n","import * as React from 'react';\nimport { useEffect } from 'react';\nimport { setDocumentModifiedStatus } from '@elementor/editor-documents';\nimport {\n\t__createPanel as createPanel,\n\tPanel,\n\tPanelBody,\n\tPanelFooter,\n\tPanelHeader,\n\tPanelHeaderTitle,\n} from '@elementor/editor-panels';\nimport { ThemeProvider } from '@elementor/editor-ui';\nimport { changeEditMode } from '@elementor/editor-v1-adapters';\nimport { XIcon } from '@elementor/icons';\nimport { useMutation } from '@elementor/query';\nimport { Alert, Box, Button, ErrorBoundary, IconButton, type IconButtonProps, Stack } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { useDirtyState } from '../../hooks/use-dirty-state';\nimport { saveGlobalClasses } from '../../save-global-classes';\nimport { ClassManagerIntroduction } from './class-manager-introduction';\nimport { hasDeletedItems, onDelete } from './delete-class';\nimport { FlippedColorSwatchIcon } from './flipped-color-swatch-icon';\nimport { GlobalClassesList } from './global-classes-list';\nimport { blockPanelInteractions, unblockPanelInteractions } from './panel-interactions';\nimport { SaveChangesDialog, useDialog } from './save-changes-dialog';\n\nconst id = 'global-classes-manager';\n\n// We need to disable the app-bar buttons, and the elements overlays when opening the classes manager panel.\n// The buttons and overlays are enabled only in edit mode, so we're creating a custom new edit mode that\n// will force them to be disabled. We can't use the `preview` edit mode in this case since it'll force\n// the panel to be closed.\nexport const { panel, usePanelActions } = createPanel( {\n\tid,\n\tcomponent: ClassManagerPanel,\n\tallowedEditModes: [ 'edit', id ],\n\tonOpen: () => {\n\t\tchangeEditMode( id );\n\n\t\tblockPanelInteractions();\n\t},\n\tonClose: () => {\n\t\tchangeEditMode( 'edit' );\n\n\t\tunblockPanelInteractions();\n\t},\n} );\n\nexport function ClassManagerPanel() {\n\tconst isDirty = useDirtyState();\n\n\tconst { close: closePanel } = usePanelActions();\n\tconst { open: openSaveChangesDialog, close: closeSaveChangesDialog, isOpen: isSaveChangesDialogOpen } = useDialog();\n\n\tconst { mutateAsync: publish, isPending: isPublishing } = usePublish();\n\n\tusePreventUnload();\n\n\treturn (\n\t\t<ThemeProvider>\n\t\t\t<ErrorBoundary fallback={ <ErrorBoundaryFallback /> }>\n\t\t\t\t<Panel>\n\t\t\t\t\t<PanelHeader>\n\t\t\t\t\t\t<Stack p={ 1 } pl={ 2 } width=\"100%\" direction=\"row\" alignItems=\"center\">\n\t\t\t\t\t\t\t<PanelHeaderTitle sx={ { display: 'flex', alignItems: 'center', gap: 0.5 } }>\n\t\t\t\t\t\t\t\t<FlippedColorSwatchIcon fontSize=\"inherit\" />\n\t\t\t\t\t\t\t\t{ __( 'Class Manager', 'elementor' ) }\n\t\t\t\t\t\t\t</PanelHeaderTitle>\n\t\t\t\t\t\t\t<CloseButton\n\t\t\t\t\t\t\t\tsx={ { marginLeft: 'auto' } }\n\t\t\t\t\t\t\t\tdisabled={ isPublishing }\n\t\t\t\t\t\t\t\tonClose={ () => {\n\t\t\t\t\t\t\t\t\tif ( isDirty ) {\n\t\t\t\t\t\t\t\t\t\topenSaveChangesDialog();\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tclosePanel();\n\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</PanelHeader>\n\t\t\t\t\t<PanelBody px={ 2 }>\n\t\t\t\t\t\t<GlobalClassesList disabled={ isPublishing } />\n\t\t\t\t\t</PanelBody>\n\t\t\t\t\t<PanelFooter>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\tcolor=\"global\"\n\t\t\t\t\t\t\tvariant=\"contained\"\n\t\t\t\t\t\t\tonClick={ publish }\n\t\t\t\t\t\t\tdisabled={ ! isDirty }\n\t\t\t\t\t\t\tloading={ isPublishing }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Save changes', 'elementor' ) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</PanelFooter>\n\t\t\t\t</Panel>\n\t\t\t</ErrorBoundary>\n\t\t\t<ClassManagerIntroduction />\n\t\t\t{ isSaveChangesDialogOpen && (\n\t\t\t\t<SaveChangesDialog>\n\t\t\t\t\t<SaveChangesDialog.Title>{ __( 'You have unsaved changes', 'elementor' ) }</SaveChangesDialog.Title>\n\t\t\t\t\t<SaveChangesDialog.Content>\n\t\t\t\t\t\t<SaveChangesDialog.ContentText>\n\t\t\t\t\t\t\t{ __( 'You have unsaved changes in the Class Manager.', 'elementor' ) }\n\t\t\t\t\t\t</SaveChangesDialog.ContentText>\n\t\t\t\t\t\t<SaveChangesDialog.ContentText>\n\t\t\t\t\t\t\t{ __( 'To avoid losing your updates, save your changes before leaving.', 'elementor' ) }\n\t\t\t\t\t\t</SaveChangesDialog.ContentText>\n\t\t\t\t\t</SaveChangesDialog.Content>\n\t\t\t\t\t<SaveChangesDialog.Actions\n\t\t\t\t\t\tactions={ {\n\t\t\t\t\t\t\tcancel: {\n\t\t\t\t\t\t\t\tlabel: __( 'Cancel', 'elementor' ),\n\t\t\t\t\t\t\t\taction: closeSaveChangesDialog,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tconfirm: {\n\t\t\t\t\t\t\t\tlabel: __( 'Save & Continue', 'elementor' ),\n\t\t\t\t\t\t\t\taction: async () => {\n\t\t\t\t\t\t\t\t\tawait publish();\n\t\t\t\t\t\t\t\t\tcloseSaveChangesDialog();\n\t\t\t\t\t\t\t\t\tclosePanel();\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} }\n\t\t\t\t\t/>\n\t\t\t\t</SaveChangesDialog>\n\t\t\t) }\n\t\t</ThemeProvider>\n\t);\n}\n\nconst CloseButton = ( { onClose, ...props }: IconButtonProps & { onClose: () => void } ) => (\n\t<IconButton size=\"small\" color=\"secondary\" onClick={ onClose } aria-label=\"Close\" { ...props }>\n\t\t<XIcon fontSize=\"small\" />\n\t</IconButton>\n);\n\nconst ErrorBoundaryFallback = () => (\n\t<Box role=\"alert\" sx={ { minHeight: '100%', p: 2 } }>\n\t\t<Alert severity=\"error\" sx={ { mb: 2, maxWidth: 400, textAlign: 'center' } }>\n\t\t\t<strong>{ __( 'Something went wrong', 'elementor' ) }</strong>\n\t\t</Alert>\n\t</Box>\n);\n\nconst usePreventUnload = () => {\n\tconst isDirty = useDirtyState();\n\n\tuseEffect( () => {\n\t\tconst handleBeforeUnload = ( event: BeforeUnloadEvent ) => {\n\t\t\tif ( isDirty ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t};\n\n\t\twindow.addEventListener( 'beforeunload', handleBeforeUnload );\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener( 'beforeunload', handleBeforeUnload );\n\t\t};\n\t}, [ isDirty ] );\n};\n\nconst usePublish = () => {\n\treturn useMutation( {\n\t\tmutationFn: () => saveGlobalClasses( { context: 'frontend' } ),\n\t\tonSuccess: async () => {\n\t\t\tsetDocumentModifiedStatus( false );\n\n\t\t\tif ( hasDeletedItems() ) {\n\t\t\t\tawait onDelete();\n\t\t\t}\n\t\t},\n\t} );\n};\n","import { __useSelector as useSelector } from '@elementor/store';\n\nimport { selectIsDirty } from '../store';\n\nexport const useDirtyState = () => {\n\treturn useSelector( selectIsDirty );\n};\n","import { mergeProps, type Props } from '@elementor/editor-props';\nimport {\n\tgetVariantByMeta,\n\ttype StyleDefinition,\n\ttype StyleDefinitionID,\n\ttype StyleDefinitionVariant,\n} from '@elementor/editor-styles';\nimport { type UpdateActionPayload } from '@elementor/editor-styles-repository';\nimport {\n\t__createSelector as createSelector,\n\t__createSlice as createSlice,\n\ttype PayloadAction,\n\ttype SliceState,\n} from '@elementor/store';\n\nimport type { ApiContext } from './api';\nimport { GlobalClassNotFoundError } from './errors';\n\nexport type GlobalClasses = {\n\titems: Record< StyleDefinitionID, StyleDefinition >;\n\torder: StyleDefinitionID[];\n};\n\ntype GlobalClassesState = {\n\tdata: GlobalClasses;\n\tinitialData: {\n\t\tfrontend: GlobalClasses;\n\t\tpreview: GlobalClasses;\n\t};\n\tisDirty: boolean;\n};\n\nconst initialState: GlobalClassesState = {\n\tdata: { items: {}, order: [] },\n\tinitialData: {\n\t\tfrontend: { items: {}, order: [] },\n\t\tpreview: { items: {}, order: [] },\n\t},\n\tisDirty: false,\n};\n\nexport type StateWithGlobalClasses = SliceState< typeof slice >;\n\n// Slice\nconst SLICE_NAME = 'globalClasses';\n\nexport const slice = createSlice( {\n\tname: SLICE_NAME,\n\tinitialState,\n\treducers: {\n\t\tload(\n\t\t\tstate,\n\t\t\t{\n\t\t\t\tpayload: { frontend, preview },\n\t\t\t}: PayloadAction< {\n\t\t\t\tfrontend: GlobalClasses;\n\t\t\t\tpreview: GlobalClasses;\n\t\t\t} >\n\t\t) {\n\t\t\tstate.initialData.frontend = frontend;\n\t\t\tstate.initialData.preview = preview;\n\t\t\tstate.data = preview;\n\n\t\t\tstate.isDirty = false;\n\t\t},\n\n\t\tadd( state, { payload }: PayloadAction< StyleDefinition > ) {\n\t\t\tstate.data.items[ payload.id ] = payload;\n\t\t\tstate.data.order.unshift( payload.id );\n\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\tdelete( state, { payload }: PayloadAction< StyleDefinitionID > ) {\n\t\t\tstate.data.items = Object.fromEntries(\n\t\t\t\tObject.entries( state.data.items ).filter( ( [ id ] ) => id !== payload )\n\t\t\t);\n\n\t\t\tstate.data.order = state.data.order.filter( ( id ) => id !== payload );\n\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\tsetOrder( state, { payload }: PayloadAction< StyleDefinitionID[] > ) {\n\t\t\tstate.data.order = payload;\n\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\tupdate( state, { payload }: PayloadAction< { style: UpdateActionPayload } > ) {\n\t\t\tconst style = state.data.items[ payload.style.id ];\n\n\t\t\tconst mergedData = {\n\t\t\t\t...style,\n\t\t\t\t...payload.style,\n\t\t\t};\n\n\t\t\tstate.data.items[ payload.style.id ] = mergedData;\n\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\tupdateProps(\n\t\t\tstate,\n\t\t\t{\n\t\t\t\tpayload,\n\t\t\t}: PayloadAction< { id: StyleDefinitionID; meta: StyleDefinitionVariant[ 'meta' ]; props: Props } >\n\t\t) {\n\t\t\tconst style = state.data.items[ payload.id ];\n\n\t\t\tif ( ! style ) {\n\t\t\t\tthrow new GlobalClassNotFoundError( { context: { styleId: payload.id } } );\n\t\t\t}\n\n\t\t\tconst variant = getVariantByMeta( style, payload.meta );\n\n\t\t\tif ( variant ) {\n\t\t\t\tvariant.props = mergeProps( variant.props, payload.props );\n\t\t\t} else {\n\t\t\t\tstyle.variants.push( { meta: payload.meta, props: payload.props } );\n\t\t\t}\n\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\treset( state, { payload: { context } }: PayloadAction< { context: ApiContext } > ) {\n\t\t\tif ( context === 'frontend' ) {\n\t\t\t\tstate.initialData.frontend = state.data;\n\n\t\t\t\tstate.isDirty = false;\n\t\t\t}\n\n\t\t\tstate.initialData.preview = state.data;\n\t\t},\n\t},\n} );\n\n// Selectors\nexport const selectData = ( state: SliceState< typeof slice > ) => state[ SLICE_NAME ].data;\n\nexport const selectFrontendInitialData = ( state: SliceState< typeof slice > ) =>\n\tstate[ SLICE_NAME ].initialData.frontend;\n\nexport const selectPreviewInitialData = ( state: SliceState< typeof slice > ) =>\n\tstate[ SLICE_NAME ].initialData.preview;\n\nexport const selectOrder = createSelector( selectData, ( { order } ) => order );\n\nexport const selectGlobalClasses = createSelector( selectData, ( { items } ) => items );\n\nexport const selectIsDirty = ( state: SliceState< typeof slice > ) => state[ SLICE_NAME ].isDirty;\n\nexport const selectOrderedClasses = createSelector( selectGlobalClasses, selectOrder, ( items, order ) =>\n\torder.map( ( id ) => items[ id ] )\n);\n\nexport const selectClass = ( state: SliceState< typeof slice >, id: StyleDefinitionID ) =>\n\tstate[ SLICE_NAME ].data.items[ id ] ?? null;\n","import { createError } from '@elementor/utils';\n\nexport const GlobalClassNotFoundError = createError< { styleId: string } >( {\n\tcode: 'global_class_not_found',\n\tmessage: 'Global class not found.',\n} );\n\nexport const GlobalClassLabelAlreadyExistsError = createError< { label: string } >( {\n\tcode: 'global_class_label_already_exists',\n\tmessage: 'Class with this name already exists.',\n} );\n","import { __dispatch as dispatch, __getState as getState } from '@elementor/store';\n\nimport { apiClient, type ApiContext } from './api';\nimport { type GlobalClasses, selectData, selectFrontendInitialData, selectPreviewInitialData, slice } from './store';\n\ntype Options = {\n\tcontext: ApiContext;\n};\n\nexport async function saveGlobalClasses( { context }: Options ) {\n\tconst state = selectData( getState() );\n\n\tif ( context === 'preview' ) {\n\t\tawait apiClient.saveDraft( {\n\t\t\titems: state.items,\n\t\t\torder: state.order,\n\t\t\tchanges: calculateChanges( state, selectPreviewInitialData( getState() ) ),\n\t\t} );\n\t} else {\n\t\tawait apiClient.publish( {\n\t\t\titems: state.items,\n\t\t\torder: state.order,\n\t\t\tchanges: calculateChanges( state, selectFrontendInitialData( getState() ) ),\n\t\t} );\n\t}\n\n\tdispatch( slice.actions.reset( { context } ) );\n}\n\nfunction calculateChanges( state: GlobalClasses, initialData: GlobalClasses ) {\n\tconst stateIds = Object.keys( state.items );\n\tconst initialDataIds = Object.keys( initialData.items );\n\n\treturn {\n\t\tadded: stateIds.filter( ( id ) => ! initialDataIds.includes( id ) ),\n\t\tdeleted: initialDataIds.filter( ( id ) => ! stateIds.includes( id ) ),\n\t\tmodified: stateIds.filter( ( id ) => {\n\t\t\treturn id in initialData.items && hash( state.items[ id ] ) !== hash( initialData.items[ id ] );\n\t\t} ),\n\t};\n}\n\ntype UnknownObject = Record< string, unknown >;\n\n// Inspired by:\n// https://github.com/TanStack/query/blob/66ea5f2fc/packages/query-core/src/utils.ts#L212\nfunction hash( obj: UnknownObject ): string {\n\treturn JSON.stringify( obj, ( _, value ) =>\n\t\tisPlainObject( value )\n\t\t\t? Object.keys( value )\n\t\t\t\t\t.sort()\n\t\t\t\t\t.reduce< UnknownObject >( ( result, key ) => {\n\t\t\t\t\t\tresult[ key ] = value[ key ];\n\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}, {} )\n\t\t\t: value\n\t);\n}\n\nfunction isPlainObject( value: unknown ): value is UnknownObject {\n\treturn !! value && typeof value === 'object' && ! Array.isArray( value );\n}\n","import { type StyleDefinition, type StyleDefinitionID, type StyleDefinitionsMap } from '@elementor/editor-styles';\nimport { type HttpResponse, httpService } from '@elementor/http-client';\n\nimport { type GlobalClasses } from './store';\n\nconst RESOURCE_URL = '/global-classes';\n\nexport type GlobalClassesGetAllResponse = HttpResponse< StyleDefinitionsMap, { order: StyleDefinition[ 'id' ][] } >;\n\ntype UpdatePayload = GlobalClasses & {\n\tchanges: {\n\t\tadded: StyleDefinitionID[];\n\t\tdeleted: StyleDefinitionID[];\n\t\tmodified: StyleDefinitionID[];\n\t};\n};\n\nexport type ApiContext = 'preview' | 'frontend';\n\nexport const apiClient = {\n\tall: ( context: ApiContext = 'preview' ) =>\n\t\thttpService().get< GlobalClassesGetAllResponse >( 'elementor/v1' + RESOURCE_URL, {\n\t\t\tparams: { context },\n\t\t} ),\n\n\tpublish: ( payload: UpdatePayload ) =>\n\t\thttpService().put( 'elementor/v1' + RESOURCE_URL, payload, {\n\t\t\tparams: {\n\t\t\t\tcontext: 'frontend' satisfies ApiContext,\n\t\t\t},\n\t\t} ),\n\n\tsaveDraft: ( payload: UpdatePayload ) =>\n\t\thttpService().put( 'elementor/v1' + RESOURCE_URL, payload, {\n\t\t\tparams: {\n\t\t\t\tcontext: 'preview' satisfies ApiContext,\n\t\t\t},\n\t\t} ),\n};\n","import * as React from 'react';\nimport { useState } from 'react';\nimport { useSuppressedMessage } from '@elementor/editor-current-user';\nimport { IntroductionModal } from '@elementor/editor-ui';\nimport { Box, Image, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nconst MESSAGE_KEY = 'global-class-manager';\n\nexport const ClassManagerIntroduction = () => {\n\tconst [ isMessageSuppressed, suppressMessage ] = useSuppressedMessage( MESSAGE_KEY );\n\tconst [ shouldShowIntroduction, setShouldShowIntroduction ] = useState( ! isMessageSuppressed );\n\n\treturn (\n\t\t<IntroductionModal\n\t\t\topen={ shouldShowIntroduction }\n\t\t\ttitle={ __( 'Class Manager', 'elementor' ) }\n\t\t\thandleClose={ ( shouldShowAgain ) => {\n\t\t\t\tif ( ! shouldShowAgain ) {\n\t\t\t\t\tsuppressMessage();\n\t\t\t\t}\n\n\t\t\t\tsetShouldShowIntroduction( false );\n\t\t\t} }\n\t\t>\n\t\t\t<Image\n\t\t\t\tsx={ { width: '100%', aspectRatio: '16 / 9' } }\n\t\t\t\tsrc={ 'https://assets.elementor.com/packages/v1/images/class-manager-intro.svg' }\n\t\t\t\talt={ '' }\n\t\t\t/>\n\t\t\t<IntroductionContent />\n\t\t</IntroductionModal>\n\t);\n};\n\nconst IntroductionContent = () => {\n\treturn (\n\t\t<Box p={ 3 }>\n\t\t\t<Typography variant={ 'body2' }>\n\t\t\t\t{ __(\n\t\t\t\t\t\"The Class Manager lets you see all the classes you've created, plus adjust their priority, rename them, and delete unused classes to keep your CSS structured.\",\n\t\t\t\t\t'elementor'\n\t\t\t\t) }\n\t\t\t</Typography>\n\t\t\t<br />\n\t\t\t<Typography variant={ 'body2' }>\n\t\t\t\t{ __(\n\t\t\t\t\t'Remember, when editing an item within a specific class, any changes you make will apply across all elements in that class.',\n\t\t\t\t\t'elementor'\n\t\t\t\t) }\n\t\t\t</Typography>\n\t\t</Box>\n\t);\n};\n","import { getCurrentDocument, getV1DocumentsManager } from '@elementor/editor-documents';\nimport { __privateRunCommand as runCommand } from '@elementor/editor-v1-adapters';\nimport { __dispatch as dispatch } from '@elementor/store';\n\nimport { slice } from '../../store';\n\nlet isDeleted = false;\n\nexport const deleteClass = ( id: string ) => {\n\tdispatch( slice.actions.delete( id ) );\n\n\tisDeleted = true;\n};\n\nexport const onDelete = async () => {\n\tawait reloadDocument();\n\n\tisDeleted = false;\n};\n\nexport const hasDeletedItems = () => isDeleted;\n\n// When deleting a class, we remove it from all the documents that have it applied.\n// In order to reflect the changes in the active document, we need to reload it.\nconst reloadDocument = () => {\n\tconst currentDocument = getCurrentDocument();\n\tconst documentsManager = getV1DocumentsManager();\n\n\tdocumentsManager.invalidateCache();\n\n\treturn runCommand( 'editor/documents/switch', {\n\t\tid: currentDocument?.id,\n\t\tshouldScroll: false,\n\t\tshouldNavigateToDefaultRoute: false,\n\t} );\n};\n","import * as React from 'react';\nimport { ColorSwatchIcon } from '@elementor/icons';\nimport { type SvgIconProps } from '@elementor/ui';\n\nexport const FlippedColorSwatchIcon = ( { sx, ...props }: SvgIconProps ) => (\n\t<ColorSwatchIcon sx={ { transform: 'rotate(90deg)', ...sx } } { ...props } />\n);\n","import * as React from 'react';\nimport { useRef } from 'react';\nimport { type StyleDefinitionID } from '@elementor/editor-styles';\nimport { validateStyleLabel } from '@elementor/editor-styles-repository';\nimport { EditableField, EllipsisWithTooltip, MenuListItem, useEditable, WarningInfotip } from '@elementor/editor-ui';\nimport { DotsVerticalIcon } from '@elementor/icons';\nimport { __useDispatch as useDispatch } from '@elementor/store';\nimport {\n\tbindMenu,\n\tbindTrigger,\n\tBox,\n\tIconButton,\n\tList,\n\tListItemButton,\n\ttype ListItemButtonProps,\n\tMenu,\n\tStack,\n\tstyled,\n\ttype Theme,\n\tTooltip,\n\tTypography,\n\ttype TypographyProps,\n\tusePopupState,\n} from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { useClassesOrder } from '../../hooks/use-classes-order';\nimport { useOrderedClasses } from '../../hooks/use-ordered-classes';\nimport { slice } from '../../store';\nimport { DeleteConfirmationProvider, useDeleteConfirmation } from './delete-confirmation-dialog';\nimport { FlippedColorSwatchIcon } from './flipped-color-swatch-icon';\nimport { SortableItem, SortableProvider, SortableTrigger, type SortableTriggerProps } from './sortable';\n\nexport const GlobalClassesList = ( { disabled }: { disabled?: boolean } ) => {\n\tconst cssClasses = useOrderedClasses();\n\tconst dispatch = useDispatch();\n\n\tconst [ classesOrder, reorderClasses ] = useReorder();\n\n\tif ( ! cssClasses?.length ) {\n\t\treturn <EmptyState />;\n\t}\n\n\treturn (\n\t\t<DeleteConfirmationProvider>\n\t\t\t<List sx={ { display: 'flex', flexDirection: 'column', gap: 0.5 } }>\n\t\t\t\t<SortableProvider value={ classesOrder } onChange={ reorderClasses }>\n\t\t\t\t\t{ cssClasses?.map( ( { id, label } ) => {\n\t\t\t\t\t\tconst renameClass = ( newLabel: string ) => {\n\t\t\t\t\t\t\tdispatch(\n\t\t\t\t\t\t\t\tslice.actions.update( {\n\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\tlabel: newLabel,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<SortableItem key={ id } id={ id }>\n\t\t\t\t\t\t\t\t{ ( { isDragged, isDragPlaceholder, triggerProps, triggerStyle } ) => (\n\t\t\t\t\t\t\t\t\t<ClassItem\n\t\t\t\t\t\t\t\t\t\tid={ id }\n\t\t\t\t\t\t\t\t\t\tlabel={ label }\n\t\t\t\t\t\t\t\t\t\trenameClass={ renameClass }\n\t\t\t\t\t\t\t\t\t\tselected={ isDragged }\n\t\t\t\t\t\t\t\t\t\tdisabled={ disabled || isDragPlaceholder }\n\t\t\t\t\t\t\t\t\t\tsortableTriggerProps={ { ...triggerProps, style: triggerStyle } }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</SortableItem>\n\t\t\t\t\t\t);\n\t\t\t\t\t} ) }\n\t\t\t\t</SortableProvider>\n\t\t\t</List>\n\t\t</DeleteConfirmationProvider>\n\t);\n};\n\nconst useReorder = () => {\n\tconst dispatch = useDispatch();\n\tconst order = useClassesOrder();\n\n\tconst reorder = ( newIds: StyleDefinitionID[] ) => {\n\t\tdispatch( slice.actions.setOrder( newIds ) );\n\t};\n\n\treturn [ order, reorder ] as const;\n};\n\ntype ClassItemProps = React.PropsWithChildren< {\n\tid: string;\n\tlabel: string;\n\trenameClass: ( newLabel: string ) => void;\n\tselected?: boolean;\n\tdisabled?: boolean;\n\tsortableTriggerProps: SortableTriggerProps;\n} >;\n\nconst ClassItem = ( { id, label, renameClass, selected, disabled, sortableTriggerProps }: ClassItemProps ) => {\n\tconst itemRef = useRef< HTMLElement >( null );\n\n\tconst {\n\t\tref: editableRef,\n\t\topenEditMode,\n\t\tisEditing,\n\t\terror,\n\t\tgetProps: getEditableProps,\n\t} = useEditable( {\n\t\tvalue: label,\n\t\tonSubmit: renameClass,\n\t\tvalidation: validateLabel,\n\t} );\n\n\tconst { openDialog } = useDeleteConfirmation();\n\n\tconst popupState = usePopupState( {\n\t\tvariant: 'popover',\n\t\tdisableAutoFocus: true,\n\t} );\n\n\tconst isSelected = ( selected || popupState.isOpen ) && ! disabled;\n\n\treturn (\n\t\t<>\n\t\t\t<Stack p={ 0 }>\n\t\t\t\t<WarningInfotip\n\t\t\t\t\topen={ Boolean( error ) }\n\t\t\t\t\ttext={ error ?? '' }\n\t\t\t\t\tplacement=\"bottom\"\n\t\t\t\t\twidth={ itemRef.current?.getBoundingClientRect().width }\n\t\t\t\t\toffset={ [ 0, -15 ] }\n\t\t\t\t>\n\t\t\t\t\t<StyledListItemButton\n\t\t\t\t\t\tref={ itemRef }\n\t\t\t\t\t\tdense\n\t\t\t\t\t\tdisableGutters\n\t\t\t\t\t\tshowActions={ isSelected || isEditing }\n\t\t\t\t\t\tshape=\"rounded\"\n\t\t\t\t\t\tonDoubleClick={ openEditMode }\n\t\t\t\t\t\tselected={ isSelected }\n\t\t\t\t\t\tdisabled={ disabled }\n\t\t\t\t\t\tfocusVisibleClassName=\"visible-class-item\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<SortableTrigger { ...sortableTriggerProps } />\n\t\t\t\t\t\t<Indicator isActive={ isEditing } isError={ !! error }>\n\t\t\t\t\t\t\t{ isEditing ? (\n\t\t\t\t\t\t\t\t<EditableField\n\t\t\t\t\t\t\t\t\tref={ editableRef }\n\t\t\t\t\t\t\t\t\tas={ Typography }\n\t\t\t\t\t\t\t\t\tvariant=\"caption\"\n\t\t\t\t\t\t\t\t\t{ ...getEditableProps() }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<EllipsisWithTooltip title={ label } as={ Typography } variant=\"caption\" />\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</Indicator>\n\t\t\t\t\t\t<Tooltip\n\t\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t\tclassName={ 'class-item-more-actions' }\n\t\t\t\t\t\t\ttitle={ __( 'More actions', 'elementor' ) }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<IconButton size=\"tiny\" { ...bindTrigger( popupState ) } aria-label=\"More actions\">\n\t\t\t\t\t\t\t\t<DotsVerticalIcon fontSize=\"tiny\" />\n\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t</StyledListItemButton>\n\t\t\t\t</WarningInfotip>\n\t\t\t</Stack>\n\t\t\t<Menu\n\t\t\t\t{ ...bindMenu( popupState ) }\n\t\t\t\tanchorOrigin={ {\n\t\t\t\t\tvertical: 'bottom',\n\t\t\t\t\thorizontal: 'right',\n\t\t\t\t} }\n\t\t\t\ttransformOrigin={ {\n\t\t\t\t\tvertical: 'top',\n\t\t\t\t\thorizontal: 'right',\n\t\t\t\t} }\n\t\t\t>\n\t\t\t\t<MenuListItem\n\t\t\t\t\tsx={ { minWidth: '160px' } }\n\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\tpopupState.close();\n\t\t\t\t\t\topenEditMode();\n\t\t\t\t\t} }\n\t\t\t\t>\n\t\t\t\t\t<Typography variant=\"caption\" sx={ { color: 'text.primary' } }>\n\t\t\t\t\t\t{ __( 'Rename', 'elementor' ) }\n\t\t\t\t\t</Typography>\n\t\t\t\t</MenuListItem>\n\t\t\t\t<MenuListItem\n\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\tpopupState.close();\n\t\t\t\t\t\topenDialog( { id, label } );\n\t\t\t\t\t} }\n\t\t\t\t>\n\t\t\t\t\t<Typography variant=\"caption\" sx={ { color: 'error.light' } }>\n\t\t\t\t\t\t{ __( 'Delete', 'elementor' ) }\n\t\t\t\t\t</Typography>\n\t\t\t\t</MenuListItem>\n\t\t\t</Menu>\n\t\t</>\n\t);\n};\n\n// Custom styles for sortable list item, until the component is available in the UI package.\nconst StyledListItemButton = styled( ListItemButton, {\n\tshouldForwardProp: ( prop: string ) => ! [ 'showActions' ].includes( prop ),\n} )< ListItemButtonProps & { showActions: boolean } >(\n\t( { showActions } ) => `\n\tmin-height: 36px;\n\n\t&.visible-class-item {\n\t\tbox-shadow: none !important;\n\t}\n\n\t.class-item-more-actions, .class-item-sortable-trigger {\n\t\tvisibility: ${ showActions ? 'visible' : 'hidden' };\n\t}\n\n\t.class-item-sortable-trigger {\n\t\tvisibility: ${ showActions ? 'visible' : 'hidden' };\n\t}\n\n\t&:hover&:not(:disabled) {\n\t\t.class-item-more-actions, .class-item-sortable-trigger {\n\t\t\tvisibility: visible;\n\t\t}\n\t}\n`\n);\n\nconst EmptyState = () => (\n\t<Stack alignItems=\"center\" gap={ 1.5 } pt={ 10 } px={ 0.5 } maxWidth=\"260px\" margin=\"auto\">\n\t\t<FlippedColorSwatchIcon fontSize=\"large\" />\n\t\t<StyledHeader variant=\"subtitle2\" component=\"h2\" color=\"text.secondary\">\n\t\t\t{ __( 'There are no global classes yet.', 'elementor' ) }\n\t\t</StyledHeader>\n\t\t<Typography align=\"center\" variant=\"caption\" color=\"text.secondary\">\n\t\t\t{ __(\n\t\t\t\t'CSS classes created in the editor panel will appear here. Once they are available, you can arrange their hierarchy, rename them, or delete them as needed.',\n\t\t\t\t'elementor'\n\t\t\t) }\n\t\t</Typography>\n\t</Stack>\n);\n\n// Override panel reset styles.\nconst StyledHeader = styled( Typography )< TypographyProps >( ( { theme, variant } ) => ( {\n\t'&.MuiTypography-root': {\n\t\t...( theme.typography[ variant as keyof typeof theme.typography ] as React.CSSProperties ),\n\t},\n} ) );\n\nconst Indicator = styled( Box, {\n\tshouldForwardProp: ( prop: string ) => ! [ 'isActive', 'isError' ].includes( prop ),\n} )< { isActive: boolean; isError: boolean } >( ( { theme, isActive, isError } ) => ( {\n\tdisplay: 'flex',\n\twidth: '100%',\n\tflexGrow: 1,\n\tborderRadius: theme.spacing( 0.5 ),\n\tborder: getIndicatorBorder( { isActive, isError, theme } ),\n\tpadding: `0 ${ theme.spacing( 1 ) }`,\n\tmarginLeft: isActive ? theme.spacing( 1 ) : 0,\n\tminWidth: 0,\n} ) );\n\nconst getIndicatorBorder = ( { isActive, isError, theme }: { isActive: boolean; isError: boolean; theme: Theme } ) => {\n\tif ( isError ) {\n\t\treturn `2px solid ${ theme.palette.error.main }`;\n\t}\n\n\tif ( isActive ) {\n\t\treturn `2px solid ${ theme.palette.secondary.main }`;\n\t}\n\n\treturn 'none';\n};\n\nconst validateLabel = ( newLabel: string ) => {\n\tconst result = validateStyleLabel( newLabel, 'rename' );\n\n\tif ( result.isValid ) {\n\t\treturn null;\n\t}\n\n\treturn result.errorMessage;\n};\n","import { __useSelector as useSelector } from '@elementor/store';\n\nimport { selectOrder } from '../store';\n\nexport const useClassesOrder = () => {\n\treturn useSelector( selectOrder );\n};\n","import { __useSelector as useSelector } from '@elementor/store';\n\nimport { selectOrderedClasses } from '../store';\n\nexport const useOrderedClasses = () => {\n\treturn useSelector( selectOrderedClasses );\n};\n","import * as React from 'react';\nimport { createContext, useContext, useState } from 'react';\nimport { type StyleDefinition } from '@elementor/editor-styles';\nimport { AlertOctagonFilledIcon } from '@elementor/icons';\nimport {\n\tButton,\n\tDialog,\n\tDialogActions,\n\tDialogContent,\n\tDialogContentText,\n\tDialogTitle,\n\tTypography,\n} from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { deleteClass } from './delete-class';\n\ntype DeleteConfirmationDialogProps = Pick< StyleDefinition, 'id' | 'label' >;\n\ntype DeleteConfirmationContext = {\n\topenDialog: ( props: DeleteConfirmationDialogProps ) => void;\n\tcloseDialog: () => void;\n\tdialogProps: DeleteConfirmationDialogProps | null;\n};\n\nconst context = createContext< DeleteConfirmationContext | null >( null );\n\nexport const DeleteConfirmationProvider = ( { children }: React.PropsWithChildren ) => {\n\tconst [ dialogProps, setDialogProps ] = useState< DeleteConfirmationDialogProps | null >( null );\n\n\tconst openDialog = ( props: DeleteConfirmationDialogProps ) => {\n\t\tsetDialogProps( props );\n\t};\n\n\tconst closeDialog = () => {\n\t\tsetDialogProps( null );\n\t};\n\n\treturn (\n\t\t<context.Provider value={ { openDialog, closeDialog, dialogProps } }>\n\t\t\t{ children }\n\t\t\t{ !! dialogProps && <DeleteConfirmationDialog { ...dialogProps } /> }\n\t\t</context.Provider>\n\t);\n};\n\nconst TITLE_ID = 'delete-class-dialog';\n\nconst DeleteConfirmationDialog = ( { label, id }: DeleteConfirmationDialogProps ) => {\n\tconst { closeDialog } = useDeleteConfirmation();\n\n\tconst onConfirm = () => {\n\t\tdeleteClass( id );\n\n\t\tcloseDialog();\n\t};\n\n\treturn (\n\t\t<Dialog open onClose={ closeDialog } aria-labelledby={ TITLE_ID } maxWidth=\"xs\">\n\t\t\t<DialogTitle id={ TITLE_ID } display=\"flex\" alignItems=\"center\" gap={ 1 } sx={ { lineHeight: 1 } }>\n\t\t\t\t<AlertOctagonFilledIcon color=\"error\" />\n\t\t\t\t{ __( 'Delete this class?', 'elementor' ) }\n\t\t\t</DialogTitle>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogContentText variant=\"body2\" color=\"textPrimary\">\n\t\t\t\t\t{ __( 'Deleting', 'elementor' ) }\n\t\t\t\t\t<Typography variant=\"subtitle2\" component=\"span\">\n\t\t\t\t\t\t { label } \n\t\t\t\t\t</Typography>\n\t\t\t\t\t{ __(\n\t\t\t\t\t\t'will permanently remove it from your project and may affect the design across all elements using it. This action cannot be undone.',\n\t\t\t\t\t\t'elementor'\n\t\t\t\t\t) }\n\t\t\t\t</DialogContentText>\n\t\t\t</DialogContent>\n\t\t\t<DialogActions>\n\t\t\t\t<Button color=\"secondary\" onClick={ closeDialog }>\n\t\t\t\t\t{ __( 'Not now', 'elementor' ) }\n\t\t\t\t</Button>\n\t\t\t\t<Button variant=\"contained\" color=\"error\" onClick={ onConfirm }>\n\t\t\t\t\t{ __( 'Delete', 'elementor' ) }\n\t\t\t\t</Button>\n\t\t\t</DialogActions>\n\t\t</Dialog>\n\t);\n};\n\nexport const useDeleteConfirmation = () => {\n\tconst contextValue = useContext( context );\n\n\tif ( ! contextValue ) {\n\t\tthrow new Error( 'useDeleteConfirmation must be used within a DeleteConfirmationProvider' );\n\t}\n\n\treturn contextValue;\n};\n","import * as React from 'react';\nimport { GripVerticalIcon } from '@elementor/icons';\nimport {\n\tBox,\n\tstyled,\n\tUnstableSortableItem,\n\ttype UnstableSortableItemProps,\n\ttype UnstableSortableItemRenderProps,\n\tUnstableSortableProvider,\n\ttype UnstableSortableProviderProps,\n} from '@elementor/ui';\n\nexport const SortableProvider = < T extends string >( props: UnstableSortableProviderProps< T > ) => (\n\t<UnstableSortableProvider restrictAxis variant=\"static\" dragPlaceholderStyle={ { opacity: '1' } } { ...props } />\n);\n\nexport type SortableTriggerProps = React.HTMLAttributes< HTMLDivElement >;\n\nexport const SortableTrigger = ( props: SortableTriggerProps ) => (\n\t<StyledSortableTrigger { ...props } role=\"button\" className=\"class-item-sortable-trigger\">\n\t\t<GripVerticalIcon fontSize=\"tiny\" />\n\t</StyledSortableTrigger>\n);\n\ntype SortableItemProps = {\n\tid: UnstableSortableItemProps[ 'id' ];\n\tchildren: ( props: Partial< UnstableSortableItemRenderProps > ) => React.ReactNode;\n};\n\nexport const SortableItem = ( { children, id, ...props }: SortableItemProps ) => {\n\treturn (\n\t\t<UnstableSortableItem\n\t\t\t{ ...props }\n\t\t\tid={ id }\n\t\t\trender={ ( {\n\t\t\t\titemProps,\n\t\t\t\tisDragged,\n\t\t\t\ttriggerProps,\n\t\t\t\titemStyle,\n\t\t\t\ttriggerStyle,\n\t\t\t\tdropIndicationStyle,\n\t\t\t\tshowDropIndication,\n\t\t\t\tisDragOverlay,\n\t\t\t\tisDragPlaceholder,\n\t\t\t}: UnstableSortableItemRenderProps ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<Box\n\t\t\t\t\t\t{ ...itemProps }\n\t\t\t\t\t\tstyle={ itemStyle }\n\t\t\t\t\t\tcomponent={ 'li' }\n\t\t\t\t\t\trole=\"listitem\"\n\t\t\t\t\t\tsx={ {\n\t\t\t\t\t\t\tbackgroundColor: isDragOverlay ? 'background.paper' : undefined,\n\t\t\t\t\t\t} }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ children( {\n\t\t\t\t\t\t\titemProps,\n\t\t\t\t\t\t\tisDragged,\n\t\t\t\t\t\t\ttriggerProps,\n\t\t\t\t\t\t\titemStyle,\n\t\t\t\t\t\t\ttriggerStyle,\n\t\t\t\t\t\t\tisDragPlaceholder,\n\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t{ showDropIndication && <SortableItemIndicator style={ dropIndicationStyle } /> }\n\t\t\t\t\t</Box>\n\t\t\t\t);\n\t\t\t} }\n\t\t/>\n\t);\n};\n\nconst StyledSortableTrigger = styled( 'div' )( ( { theme } ) => ( {\n\tposition: 'absolute',\n\tleft: 0,\n\ttop: '50%',\n\ttransform: `translate( -${ theme.spacing( 1.5 ) }, -50% )`,\n\tcolor: theme.palette.action.active,\n} ) );\n\nconst SortableItemIndicator = styled( Box )`\n\twidth: 100%;\n\theight: 1px;\n\tbackground-color: ${ ( { theme } ) => theme.palette.text.primary };\n`;\n","type ExtendedWindow = Window & {\n\t$e?: {\n\t\tcomponents?: {\n\t\t\tget?: ( name: 'panel' ) =>\n\t\t\t\t| {\n\t\t\t\t\t\tblockUserInteractions?: () => void;\n\t\t\t\t\t\tunblockUserInteractions?: () => void;\n\t\t\t\t }\n\t\t\t\t| undefined;\n\t\t};\n\t};\n};\n\nexport function blockPanelInteractions() {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\textendedWindow.$e?.components?.get?.( 'panel' )?.blockUserInteractions?.();\n}\n\nexport function unblockPanelInteractions() {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\textendedWindow.$e?.components?.get?.( 'panel' )?.unblockUserInteractions?.();\n}\n","import * as React from 'react';\nimport { useState } from 'react';\nimport { AlertTriangleFilledIcon } from '@elementor/icons';\nimport {\n\tButton,\n\tDialog,\n\tDialogActions,\n\tDialogContent,\n\tDialogContentText,\n\ttype DialogContentTextProps,\n\ttype DialogProps,\n\tDialogTitle,\n} from '@elementor/ui';\n\nconst TITLE_ID = 'save-changes-dialog';\n\nconst SaveChangesDialog = ( { children, onClose }: Pick< DialogProps, 'children' | 'onClose' > ) => (\n\t<Dialog open onClose={ onClose } aria-labelledby={ TITLE_ID } maxWidth=\"xs\">\n\t\t{ children }\n\t</Dialog>\n);\n\nconst SaveChangesDialogTitle = ( { children }: React.PropsWithChildren ) => (\n\t<DialogTitle id={ TITLE_ID } display=\"flex\" alignItems=\"center\" gap={ 1 } sx={ { lineHeight: 1 } }>\n\t\t<AlertTriangleFilledIcon color=\"secondary\" />\n\t\t{ children }\n\t</DialogTitle>\n);\n\nconst SaveChangesDialogContent = ( { children }: React.PropsWithChildren ) => (\n\t<DialogContent>{ children }</DialogContent>\n);\n\nconst SaveChangesDialogContentText = ( props: DialogContentTextProps ) => (\n\t<DialogContentText variant=\"body2\" color=\"textPrimary\" display=\"flex\" flexDirection=\"column\" { ...props } />\n);\n\ntype Action = {\n\tlabel: string;\n\taction: () => void | Promise< void >;\n};\n\ntype ConfirmationDialogActionsProps = {\n\tactions: {\n\t\tcancel: Action;\n\t\tconfirm: Action;\n\t};\n};\nconst SaveChangesDialogActions = ( { actions }: ConfirmationDialogActionsProps ) => {\n\tconst [ isConfirming, setIsConfirming ] = useState( false );\n\tconst { cancel, confirm } = actions;\n\n\tconst onConfirm = async () => {\n\t\tsetIsConfirming( true );\n\t\tawait confirm.action();\n\t\tsetIsConfirming( false );\n\t};\n\treturn (\n\t\t<DialogActions>\n\t\t\t<Button variant=\"text\" color=\"secondary\" onClick={ cancel.action }>\n\t\t\t\t{ cancel.label }\n\t\t\t</Button>\n\t\t\t<Button variant=\"contained\" color=\"secondary\" onClick={ onConfirm } loading={ isConfirming }>\n\t\t\t\t{ confirm.label }\n\t\t\t</Button>\n\t\t</DialogActions>\n\t);\n};\n\nSaveChangesDialog.Title = SaveChangesDialogTitle;\nSaveChangesDialog.Content = SaveChangesDialogContent;\nSaveChangesDialog.ContentText = SaveChangesDialogContentText;\nSaveChangesDialog.Actions = SaveChangesDialogActions;\n\nconst useDialog = () => {\n\tconst [ isOpen, setIsOpen ] = useState( false );\n\n\tconst open = () => setIsOpen( true );\n\tconst close = () => setIsOpen( false );\n\n\treturn { isOpen, open, close };\n};\n\nexport { SaveChangesDialog, useDialog };\n","import { useEffect } from 'react';\nimport { __useDispatch as useDispatch } from '@elementor/store';\n\nimport { apiClient } from '../api';\nimport { slice } from '../store';\n\nexport function PopulateStore() {\n\tconst dispatch = useDispatch();\n\n\tuseEffect( () => {\n\t\tPromise.all( [ apiClient.all( 'preview' ), apiClient.all( 'frontend' ) ] ).then(\n\t\t\t( [ previewRes, frontendRes ] ) => {\n\t\t\t\tconst { data: previewData } = previewRes;\n\t\t\t\tconst { data: frontendData } = frontendRes;\n\n\t\t\t\tdispatch(\n\t\t\t\t\tslice.actions.load( {\n\t\t\t\t\t\tpreview: {\n\t\t\t\t\t\t\titems: previewData.data,\n\t\t\t\t\t\t\torder: previewData.meta.order,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfrontend: {\n\t\t\t\t\t\t\titems: frontendData.data,\n\t\t\t\t\t\t\torder: frontendData.meta.order,\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}, [ dispatch ] );\n\n\treturn null;\n}\n","import { generateId } from '@elementor/editor-styles';\nimport { createStylesProvider } from '@elementor/editor-styles-repository';\nimport {\n\t__dispatch as dispatch,\n\t__getState as getState,\n\t__subscribeWithSelector as subscribeWithSelector,\n} from '@elementor/store';\nimport { __ } from '@wordpress/i18n';\n\nimport { GlobalClassLabelAlreadyExistsError } from './errors';\nimport { selectClass, selectGlobalClasses, selectOrderedClasses, slice, type StateWithGlobalClasses } from './store';\n\nconst MAX_CLASSES = 50;\n\nexport const globalClassesStylesProvider = createStylesProvider( {\n\tkey: 'global-classes',\n\tpriority: 30,\n\tlimit: MAX_CLASSES,\n\tlabels: {\n\t\tsingular: __( 'class', 'elementor' ),\n\t\tplural: __( 'classes', 'elementor' ),\n\t},\n\tsubscribe: ( cb ) => subscribeWithSelector( ( state: StateWithGlobalClasses ) => state.globalClasses, cb ),\n\tactions: {\n\t\tall: () => selectOrderedClasses( getState() ),\n\t\tget: ( id ) => selectClass( getState(), id ),\n\t\tcreate: ( label ) => {\n\t\t\tconst classes = selectGlobalClasses( getState() );\n\n\t\t\tconst existingLabels = Object.values( classes ).map( ( style ) => style.label );\n\n\t\t\tif ( existingLabels.includes( label ) ) {\n\t\t\t\tthrow new GlobalClassLabelAlreadyExistsError( { context: { label } } );\n\t\t\t}\n\n\t\t\tconst existingIds = Object.keys( classes );\n\t\t\tconst id = generateId( 'g-', existingIds );\n\n\t\t\tdispatch(\n\t\t\t\tslice.actions.add( {\n\t\t\t\t\tid,\n\t\t\t\t\ttype: 'class',\n\t\t\t\t\tlabel,\n\t\t\t\t\tvariants: [],\n\t\t\t\t} )\n\t\t\t);\n\n\t\t\treturn id;\n\t\t},\n\t\tupdate: ( payload ) => {\n\t\t\tdispatch(\n\t\t\t\tslice.actions.update( {\n\t\t\t\t\tstyle: payload,\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\t\tdelete: ( id ) => {\n\t\t\tdispatch( slice.actions.delete( id ) );\n\t\t},\n\t\tupdateProps: ( args ) => {\n\t\t\tdispatch(\n\t\t\t\tslice.actions.updateProps( {\n\t\t\t\t\tid: args.id,\n\t\t\t\t\tmeta: args.meta,\n\t\t\t\t\tprops: args.props,\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\t},\n} );\n","import { setDocumentModifiedStatus } from '@elementor/editor-documents';\nimport { registerDataHook } from '@elementor/editor-v1-adapters';\nimport { __getState as getState, __subscribeWithSelector as subscribeWithSelector } from '@elementor/store';\n\nimport { saveGlobalClasses } from './save-global-classes';\nimport { selectIsDirty } from './store';\n\nexport function syncWithDocumentSave() {\n\tconst unsubscribe = syncDirtyState();\n\n\tbindSaveAction();\n\n\treturn unsubscribe;\n}\n\nfunction syncDirtyState() {\n\treturn subscribeWithSelector( selectIsDirty, () => {\n\t\tif ( ! isDirty() ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetDocumentModifiedStatus( true );\n\t} );\n}\n\nfunction bindSaveAction() {\n\tregisterDataHook( 'after', 'document/save/save', ( args ) => {\n\t\treturn saveGlobalClasses( {\n\t\t\tcontext: args.status === 'publish' ? 'frontend' : 'preview',\n\t\t} );\n\t} );\n}\n\nfunction isDirty() {\n\treturn selectIsDirty( getState() );\n}\n"],"mappings":"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","names":["import_editor_panels","import_editor_styles_repository","import_editor_v1_adapters","import_store","React","import_editor_documents","import_ui","import_i18n","React","import_react","import_editor_documents","import_editor_ui","import_editor_v1_adapters","import_icons","import_ui","import_i18n","import_store","createSlice","id","context","createSelector","useSelector","import_store","context","context","getState","dispatch","id","import_store","id","dispatch","runCommand","React","React","import_react","import_editor_ui","import_icons","import_store","import_ui","import_i18n","import_store","useSelector","import_store","useSelector","React","import_react","import_icons","import_ui","import_i18n","id","React","import_icons","import_ui","id","dispatch","useDispatch","id","React","import_react","import_icons","import_ui","TITLE_ID","createPanel","isDirty","useActiveDocument","useActiveDocumentActions","import_react","import_store","dispatch","useDispatch","import_editor_styles","import_editor_styles_repository","import_store","import_i18n","subscribeWithSelector","getState","id","dispatch","import_editor_documents","import_editor_v1_adapters","import_store","subscribeWithSelector","getState","registerSlice","registerPanel","listenTo"]}
|
package/dist/index.mjs
CHANGED
|
@@ -287,8 +287,9 @@ var FlippedColorSwatchIcon = ({ sx, ...props }) => /* @__PURE__ */ React2.create
|
|
|
287
287
|
|
|
288
288
|
// src/components/class-manager/global-classes-list.tsx
|
|
289
289
|
import * as React5 from "react";
|
|
290
|
+
import { useRef } from "react";
|
|
290
291
|
import { validateStyleLabel } from "@elementor/editor-styles-repository";
|
|
291
|
-
import { EditableField, EllipsisWithTooltip, MenuListItem, useEditable } from "@elementor/editor-ui";
|
|
292
|
+
import { EditableField, EllipsisWithTooltip, MenuListItem, useEditable, WarningInfotip } from "@elementor/editor-ui";
|
|
292
293
|
import { DotsVerticalIcon } from "@elementor/icons";
|
|
293
294
|
import { __useDispatch as useDispatch } from "@elementor/store";
|
|
294
295
|
import {
|
|
@@ -471,6 +472,7 @@ var useReorder = () => {
|
|
|
471
472
|
return [order, reorder];
|
|
472
473
|
};
|
|
473
474
|
var ClassItem = ({ id: id2, label, renameClass, selected, disabled, sortableTriggerProps }) => {
|
|
475
|
+
const itemRef = useRef(null);
|
|
474
476
|
const {
|
|
475
477
|
ref: editableRef,
|
|
476
478
|
openEditMode,
|
|
@@ -488,39 +490,49 @@ var ClassItem = ({ id: id2, label, renameClass, selected, disabled, sortableTrig
|
|
|
488
490
|
disableAutoFocus: true
|
|
489
491
|
});
|
|
490
492
|
const isSelected = (selected || popupState.isOpen) && !disabled;
|
|
491
|
-
return /* @__PURE__ */ React5.createElement(React5.Fragment, null, /* @__PURE__ */ React5.createElement(
|
|
492
|
-
|
|
493
|
+
return /* @__PURE__ */ React5.createElement(React5.Fragment, null, /* @__PURE__ */ React5.createElement(Stack, { p: 0 }, /* @__PURE__ */ React5.createElement(
|
|
494
|
+
WarningInfotip,
|
|
493
495
|
{
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
selected: isSelected,
|
|
500
|
-
disabled,
|
|
501
|
-
focusVisibleClassName: "visible-class-item"
|
|
496
|
+
open: Boolean(error),
|
|
497
|
+
text: error ?? "",
|
|
498
|
+
placement: "bottom",
|
|
499
|
+
width: itemRef.current?.getBoundingClientRect().width,
|
|
500
|
+
offset: [0, -15]
|
|
502
501
|
},
|
|
503
|
-
/* @__PURE__ */ React5.createElement(SortableTrigger, { ...sortableTriggerProps }),
|
|
504
|
-
/* @__PURE__ */ React5.createElement(Indicator, { isActive: isEditing, isError: !!error }, isEditing ? /* @__PURE__ */ React5.createElement(
|
|
505
|
-
EditableField,
|
|
506
|
-
{
|
|
507
|
-
ref: editableRef,
|
|
508
|
-
error,
|
|
509
|
-
as: Typography3,
|
|
510
|
-
variant: "caption",
|
|
511
|
-
...getEditableProps()
|
|
512
|
-
}
|
|
513
|
-
) : /* @__PURE__ */ React5.createElement(EllipsisWithTooltip, { title: label, as: Typography3, variant: "caption" })),
|
|
514
502
|
/* @__PURE__ */ React5.createElement(
|
|
515
|
-
|
|
503
|
+
StyledListItemButton,
|
|
516
504
|
{
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
505
|
+
ref: itemRef,
|
|
506
|
+
dense: true,
|
|
507
|
+
disableGutters: true,
|
|
508
|
+
showActions: isSelected || isEditing,
|
|
509
|
+
shape: "rounded",
|
|
510
|
+
onDoubleClick: openEditMode,
|
|
511
|
+
selected: isSelected,
|
|
512
|
+
disabled,
|
|
513
|
+
focusVisibleClassName: "visible-class-item"
|
|
520
514
|
},
|
|
521
|
-
/* @__PURE__ */ React5.createElement(
|
|
515
|
+
/* @__PURE__ */ React5.createElement(SortableTrigger, { ...sortableTriggerProps }),
|
|
516
|
+
/* @__PURE__ */ React5.createElement(Indicator, { isActive: isEditing, isError: !!error }, isEditing ? /* @__PURE__ */ React5.createElement(
|
|
517
|
+
EditableField,
|
|
518
|
+
{
|
|
519
|
+
ref: editableRef,
|
|
520
|
+
as: Typography3,
|
|
521
|
+
variant: "caption",
|
|
522
|
+
...getEditableProps()
|
|
523
|
+
}
|
|
524
|
+
) : /* @__PURE__ */ React5.createElement(EllipsisWithTooltip, { title: label, as: Typography3, variant: "caption" })),
|
|
525
|
+
/* @__PURE__ */ React5.createElement(
|
|
526
|
+
Tooltip,
|
|
527
|
+
{
|
|
528
|
+
placement: "top",
|
|
529
|
+
className: "class-item-more-actions",
|
|
530
|
+
title: __3("More actions", "elementor")
|
|
531
|
+
},
|
|
532
|
+
/* @__PURE__ */ React5.createElement(IconButton, { size: "tiny", ...bindTrigger(popupState), "aria-label": "More actions" }, /* @__PURE__ */ React5.createElement(DotsVerticalIcon, { fontSize: "tiny" }))
|
|
533
|
+
)
|
|
522
534
|
)
|
|
523
|
-
), /* @__PURE__ */ React5.createElement(
|
|
535
|
+
)), /* @__PURE__ */ React5.createElement(
|
|
524
536
|
Menu,
|
|
525
537
|
{
|
|
526
538
|
...bindMenu(popupState),
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/init.ts","../src/components/class-manager/class-manager-button.tsx","../src/components/class-manager/class-manager-panel.tsx","../src/hooks/use-dirty-state.ts","../src/store.ts","../src/errors.ts","../src/save-global-classes.ts","../src/api.ts","../src/components/class-manager/class-manager-introduction.tsx","../src/components/class-manager/delete-class.ts","../src/components/class-manager/flipped-color-swatch-icon.tsx","../src/components/class-manager/global-classes-list.tsx","../src/hooks/use-classes-order.ts","../src/hooks/use-ordered-classes.ts","../src/components/class-manager/delete-confirmation-dialog.tsx","../src/components/class-manager/sortable.tsx","../src/components/class-manager/panel-interactions.ts","../src/components/class-manager/save-changes-dialog.tsx","../src/components/populate-store.tsx","../src/global-classes-styles-provider.ts","../src/sync-with-document-save.ts"],"sourcesContent":["import { injectIntoLogic } from '@elementor/editor';\nimport { injectIntoClassSelectorActions } from '@elementor/editor-editing-panel';\nimport { __registerPanel as registerPanel } from '@elementor/editor-panels';\nimport { stylesRepository } from '@elementor/editor-styles-repository';\nimport { __privateListenTo as listenTo, v1ReadyEvent } from '@elementor/editor-v1-adapters';\nimport { __registerSlice as registerSlice } from '@elementor/store';\n\nimport { ClassManagerButton } from './components/class-manager/class-manager-button';\nimport { panel } from './components/class-manager/class-manager-panel';\nimport { PopulateStore } from './components/populate-store';\nimport { globalClassesStylesProvider } from './global-classes-styles-provider';\nimport { slice } from './store';\nimport { syncWithDocumentSave } from './sync-with-document-save';\n\nexport function init() {\n\tregisterSlice( slice );\n\tregisterPanel( panel );\n\n\tstylesRepository.register( globalClassesStylesProvider );\n\n\tinjectIntoLogic( {\n\t\tid: 'global-classes-populate-store',\n\t\tcomponent: PopulateStore,\n\t} );\n\n\tinjectIntoClassSelectorActions( {\n\t\tid: 'global-classes-manager-button',\n\t\tcomponent: ClassManagerButton,\n\t} );\n\n\tlistenTo( v1ReadyEvent(), () => {\n\t\tsyncWithDocumentSave();\n\t} );\n}\n","import * as React from 'react';\nimport {\n\t__useActiveDocument as useActiveDocument,\n\t__useActiveDocumentActions as useActiveDocumentActions,\n} from '@elementor/editor-documents';\nimport { IconButton, Tooltip } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { usePanelActions } from './class-manager-panel';\nimport { FlippedColorSwatchIcon } from './flipped-color-swatch-icon';\nimport { SaveChangesDialog, useDialog } from './save-changes-dialog';\n\nexport const ClassManagerButton = () => {\n\tconst document = useActiveDocument();\n\tconst { open: openPanel } = usePanelActions();\n\tconst { save: saveDocument } = useActiveDocumentActions();\n\tconst { open: openSaveChangesDialog, close: closeSaveChangesDialog, isOpen: isSaveChangesDialogOpen } = useDialog();\n\n\tconst handleOpenPanel = () => {\n\t\tif ( document?.isDirty ) {\n\t\t\topenSaveChangesDialog();\n\t\t\treturn;\n\t\t}\n\n\t\topenPanel();\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<Tooltip title={ __( 'Class Manager', 'elementor' ) } placement=\"top\">\n\t\t\t\t<IconButton size=\"tiny\" onClick={ handleOpenPanel } sx={ { marginInlineEnd: -0.75 } }>\n\t\t\t\t\t<FlippedColorSwatchIcon fontSize=\"tiny\" />\n\t\t\t\t</IconButton>\n\t\t\t</Tooltip>\n\t\t\t{ isSaveChangesDialogOpen && (\n\t\t\t\t<SaveChangesDialog>\n\t\t\t\t\t<SaveChangesDialog.Title>{ __( 'You have unsaved changes', 'elementor' ) }</SaveChangesDialog.Title>\n\t\t\t\t\t<SaveChangesDialog.Content>\n\t\t\t\t\t\t<SaveChangesDialog.ContentText sx={ { mb: 2 } }>\n\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t\"To open the Class Manager, save your page first. You can't continue without saving.\",\n\t\t\t\t\t\t\t\t'elementor'\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</SaveChangesDialog.ContentText>\n\t\t\t\t\t</SaveChangesDialog.Content>\n\t\t\t\t\t<SaveChangesDialog.Actions\n\t\t\t\t\t\tactions={ {\n\t\t\t\t\t\t\tcancel: {\n\t\t\t\t\t\t\t\tlabel: __( 'Stay here', 'elementor' ),\n\t\t\t\t\t\t\t\taction: closeSaveChangesDialog,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tconfirm: {\n\t\t\t\t\t\t\t\tlabel: __( 'Save & Continue', 'elementor' ),\n\t\t\t\t\t\t\t\taction: async () => {\n\t\t\t\t\t\t\t\t\tawait saveDocument();\n\t\t\t\t\t\t\t\t\tcloseSaveChangesDialog();\n\t\t\t\t\t\t\t\t\topenPanel();\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} }\n\t\t\t\t\t/>\n\t\t\t\t</SaveChangesDialog>\n\t\t\t) }\n\t\t</>\n\t);\n};\n","import * as React from 'react';\nimport { useEffect } from 'react';\nimport { setDocumentModifiedStatus } from '@elementor/editor-documents';\nimport {\n\t__createPanel as createPanel,\n\tPanel,\n\tPanelBody,\n\tPanelFooter,\n\tPanelHeader,\n\tPanelHeaderTitle,\n} from '@elementor/editor-panels';\nimport { ThemeProvider } from '@elementor/editor-ui';\nimport { changeEditMode } from '@elementor/editor-v1-adapters';\nimport { XIcon } from '@elementor/icons';\nimport { useMutation } from '@elementor/query';\nimport { Alert, Box, Button, ErrorBoundary, IconButton, type IconButtonProps, Stack } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { useDirtyState } from '../../hooks/use-dirty-state';\nimport { saveGlobalClasses } from '../../save-global-classes';\nimport { ClassManagerIntroduction } from './class-manager-introduction';\nimport { hasDeletedItems, onDelete } from './delete-class';\nimport { FlippedColorSwatchIcon } from './flipped-color-swatch-icon';\nimport { GlobalClassesList } from './global-classes-list';\nimport { blockPanelInteractions, unblockPanelInteractions } from './panel-interactions';\nimport { SaveChangesDialog, useDialog } from './save-changes-dialog';\n\nconst id = 'global-classes-manager';\n\n// We need to disable the app-bar buttons, and the elements overlays when opening the classes manager panel.\n// The buttons and overlays are enabled only in edit mode, so we're creating a custom new edit mode that\n// will force them to be disabled. We can't use the `preview` edit mode in this case since it'll force\n// the panel to be closed.\nexport const { panel, usePanelActions } = createPanel( {\n\tid,\n\tcomponent: ClassManagerPanel,\n\tallowedEditModes: [ 'edit', id ],\n\tonOpen: () => {\n\t\tchangeEditMode( id );\n\n\t\tblockPanelInteractions();\n\t},\n\tonClose: () => {\n\t\tchangeEditMode( 'edit' );\n\n\t\tunblockPanelInteractions();\n\t},\n} );\n\nexport function ClassManagerPanel() {\n\tconst isDirty = useDirtyState();\n\n\tconst { close: closePanel } = usePanelActions();\n\tconst { open: openSaveChangesDialog, close: closeSaveChangesDialog, isOpen: isSaveChangesDialogOpen } = useDialog();\n\n\tconst { mutateAsync: publish, isPending: isPublishing } = usePublish();\n\n\tusePreventUnload();\n\n\treturn (\n\t\t<ThemeProvider>\n\t\t\t<ErrorBoundary fallback={ <ErrorBoundaryFallback /> }>\n\t\t\t\t<Panel>\n\t\t\t\t\t<PanelHeader>\n\t\t\t\t\t\t<Stack p={ 1 } pl={ 2 } width=\"100%\" direction=\"row\" alignItems=\"center\">\n\t\t\t\t\t\t\t<PanelHeaderTitle sx={ { display: 'flex', alignItems: 'center', gap: 0.5 } }>\n\t\t\t\t\t\t\t\t<FlippedColorSwatchIcon fontSize=\"inherit\" />\n\t\t\t\t\t\t\t\t{ __( 'Class Manager', 'elementor' ) }\n\t\t\t\t\t\t\t</PanelHeaderTitle>\n\t\t\t\t\t\t\t<CloseButton\n\t\t\t\t\t\t\t\tsx={ { marginLeft: 'auto' } }\n\t\t\t\t\t\t\t\tdisabled={ isPublishing }\n\t\t\t\t\t\t\t\tonClose={ () => {\n\t\t\t\t\t\t\t\t\tif ( isDirty ) {\n\t\t\t\t\t\t\t\t\t\topenSaveChangesDialog();\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tclosePanel();\n\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</PanelHeader>\n\t\t\t\t\t<PanelBody px={ 2 }>\n\t\t\t\t\t\t<GlobalClassesList disabled={ isPublishing } />\n\t\t\t\t\t</PanelBody>\n\t\t\t\t\t<PanelFooter>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\tcolor=\"global\"\n\t\t\t\t\t\t\tvariant=\"contained\"\n\t\t\t\t\t\t\tonClick={ publish }\n\t\t\t\t\t\t\tdisabled={ ! isDirty }\n\t\t\t\t\t\t\tloading={ isPublishing }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Save changes', 'elementor' ) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</PanelFooter>\n\t\t\t\t</Panel>\n\t\t\t</ErrorBoundary>\n\t\t\t<ClassManagerIntroduction />\n\t\t\t{ isSaveChangesDialogOpen && (\n\t\t\t\t<SaveChangesDialog>\n\t\t\t\t\t<SaveChangesDialog.Title>{ __( 'You have unsaved changes', 'elementor' ) }</SaveChangesDialog.Title>\n\t\t\t\t\t<SaveChangesDialog.Content>\n\t\t\t\t\t\t<SaveChangesDialog.ContentText>\n\t\t\t\t\t\t\t{ __( 'You have unsaved changes in the Class Manager.', 'elementor' ) }\n\t\t\t\t\t\t</SaveChangesDialog.ContentText>\n\t\t\t\t\t\t<SaveChangesDialog.ContentText>\n\t\t\t\t\t\t\t{ __( 'To avoid losing your updates, save your changes before leaving.', 'elementor' ) }\n\t\t\t\t\t\t</SaveChangesDialog.ContentText>\n\t\t\t\t\t</SaveChangesDialog.Content>\n\t\t\t\t\t<SaveChangesDialog.Actions\n\t\t\t\t\t\tactions={ {\n\t\t\t\t\t\t\tcancel: {\n\t\t\t\t\t\t\t\tlabel: __( 'Cancel', 'elementor' ),\n\t\t\t\t\t\t\t\taction: closeSaveChangesDialog,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tconfirm: {\n\t\t\t\t\t\t\t\tlabel: __( 'Save & Continue', 'elementor' ),\n\t\t\t\t\t\t\t\taction: async () => {\n\t\t\t\t\t\t\t\t\tawait publish();\n\t\t\t\t\t\t\t\t\tcloseSaveChangesDialog();\n\t\t\t\t\t\t\t\t\tclosePanel();\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} }\n\t\t\t\t\t/>\n\t\t\t\t</SaveChangesDialog>\n\t\t\t) }\n\t\t</ThemeProvider>\n\t);\n}\n\nconst CloseButton = ( { onClose, ...props }: IconButtonProps & { onClose: () => void } ) => (\n\t<IconButton size=\"small\" color=\"secondary\" onClick={ onClose } aria-label=\"Close\" { ...props }>\n\t\t<XIcon fontSize=\"small\" />\n\t</IconButton>\n);\n\nconst ErrorBoundaryFallback = () => (\n\t<Box role=\"alert\" sx={ { minHeight: '100%', p: 2 } }>\n\t\t<Alert severity=\"error\" sx={ { mb: 2, maxWidth: 400, textAlign: 'center' } }>\n\t\t\t<strong>{ __( 'Something went wrong', 'elementor' ) }</strong>\n\t\t</Alert>\n\t</Box>\n);\n\nconst usePreventUnload = () => {\n\tconst isDirty = useDirtyState();\n\n\tuseEffect( () => {\n\t\tconst handleBeforeUnload = ( event: BeforeUnloadEvent ) => {\n\t\t\tif ( isDirty ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t};\n\n\t\twindow.addEventListener( 'beforeunload', handleBeforeUnload );\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener( 'beforeunload', handleBeforeUnload );\n\t\t};\n\t}, [ isDirty ] );\n};\n\nconst usePublish = () => {\n\treturn useMutation( {\n\t\tmutationFn: () => saveGlobalClasses( { context: 'frontend' } ),\n\t\tonSuccess: async () => {\n\t\t\tsetDocumentModifiedStatus( false );\n\n\t\t\tif ( hasDeletedItems() ) {\n\t\t\t\tawait onDelete();\n\t\t\t}\n\t\t},\n\t} );\n};\n","import { __useSelector as useSelector } from '@elementor/store';\n\nimport { selectIsDirty } from '../store';\n\nexport const useDirtyState = () => {\n\treturn useSelector( selectIsDirty );\n};\n","import { mergeProps, type Props } from '@elementor/editor-props';\nimport {\n\tgetVariantByMeta,\n\ttype StyleDefinition,\n\ttype StyleDefinitionID,\n\ttype StyleDefinitionVariant,\n} from '@elementor/editor-styles';\nimport { type UpdateActionPayload } from '@elementor/editor-styles-repository';\nimport {\n\t__createSelector as createSelector,\n\t__createSlice as createSlice,\n\ttype PayloadAction,\n\ttype SliceState,\n} from '@elementor/store';\n\nimport type { ApiContext } from './api';\nimport { GlobalClassNotFoundError } from './errors';\n\nexport type GlobalClasses = {\n\titems: Record< StyleDefinitionID, StyleDefinition >;\n\torder: StyleDefinitionID[];\n};\n\ntype GlobalClassesState = {\n\tdata: GlobalClasses;\n\tinitialData: {\n\t\tfrontend: GlobalClasses;\n\t\tpreview: GlobalClasses;\n\t};\n\tisDirty: boolean;\n};\n\nconst initialState: GlobalClassesState = {\n\tdata: { items: {}, order: [] },\n\tinitialData: {\n\t\tfrontend: { items: {}, order: [] },\n\t\tpreview: { items: {}, order: [] },\n\t},\n\tisDirty: false,\n};\n\nexport type StateWithGlobalClasses = SliceState< typeof slice >;\n\n// Slice\nconst SLICE_NAME = 'globalClasses';\n\nexport const slice = createSlice( {\n\tname: SLICE_NAME,\n\tinitialState,\n\treducers: {\n\t\tload(\n\t\t\tstate,\n\t\t\t{\n\t\t\t\tpayload: { frontend, preview },\n\t\t\t}: PayloadAction< {\n\t\t\t\tfrontend: GlobalClasses;\n\t\t\t\tpreview: GlobalClasses;\n\t\t\t} >\n\t\t) {\n\t\t\tstate.initialData.frontend = frontend;\n\t\t\tstate.initialData.preview = preview;\n\t\t\tstate.data = preview;\n\n\t\t\tstate.isDirty = false;\n\t\t},\n\n\t\tadd( state, { payload }: PayloadAction< StyleDefinition > ) {\n\t\t\tstate.data.items[ payload.id ] = payload;\n\t\t\tstate.data.order.unshift( payload.id );\n\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\tdelete( state, { payload }: PayloadAction< StyleDefinitionID > ) {\n\t\t\tstate.data.items = Object.fromEntries(\n\t\t\t\tObject.entries( state.data.items ).filter( ( [ id ] ) => id !== payload )\n\t\t\t);\n\n\t\t\tstate.data.order = state.data.order.filter( ( id ) => id !== payload );\n\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\tsetOrder( state, { payload }: PayloadAction< StyleDefinitionID[] > ) {\n\t\t\tstate.data.order = payload;\n\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\tupdate( state, { payload }: PayloadAction< { style: UpdateActionPayload } > ) {\n\t\t\tconst style = state.data.items[ payload.style.id ];\n\n\t\t\tconst mergedData = {\n\t\t\t\t...style,\n\t\t\t\t...payload.style,\n\t\t\t};\n\n\t\t\tstate.data.items[ payload.style.id ] = mergedData;\n\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\tupdateProps(\n\t\t\tstate,\n\t\t\t{\n\t\t\t\tpayload,\n\t\t\t}: PayloadAction< { id: StyleDefinitionID; meta: StyleDefinitionVariant[ 'meta' ]; props: Props } >\n\t\t) {\n\t\t\tconst style = state.data.items[ payload.id ];\n\n\t\t\tif ( ! style ) {\n\t\t\t\tthrow new GlobalClassNotFoundError( { context: { styleId: payload.id } } );\n\t\t\t}\n\n\t\t\tconst variant = getVariantByMeta( style, payload.meta );\n\n\t\t\tif ( variant ) {\n\t\t\t\tvariant.props = mergeProps( variant.props, payload.props );\n\t\t\t} else {\n\t\t\t\tstyle.variants.push( { meta: payload.meta, props: payload.props } );\n\t\t\t}\n\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\treset( state, { payload: { context } }: PayloadAction< { context: ApiContext } > ) {\n\t\t\tif ( context === 'frontend' ) {\n\t\t\t\tstate.initialData.frontend = state.data;\n\n\t\t\t\tstate.isDirty = false;\n\t\t\t}\n\n\t\t\tstate.initialData.preview = state.data;\n\t\t},\n\t},\n} );\n\n// Selectors\nexport const selectData = ( state: SliceState< typeof slice > ) => state[ SLICE_NAME ].data;\n\nexport const selectFrontendInitialData = ( state: SliceState< typeof slice > ) =>\n\tstate[ SLICE_NAME ].initialData.frontend;\n\nexport const selectPreviewInitialData = ( state: SliceState< typeof slice > ) =>\n\tstate[ SLICE_NAME ].initialData.preview;\n\nexport const selectOrder = createSelector( selectData, ( { order } ) => order );\n\nexport const selectGlobalClasses = createSelector( selectData, ( { items } ) => items );\n\nexport const selectIsDirty = ( state: SliceState< typeof slice > ) => state[ SLICE_NAME ].isDirty;\n\nexport const selectOrderedClasses = createSelector( selectGlobalClasses, selectOrder, ( items, order ) =>\n\torder.map( ( id ) => items[ id ] )\n);\n\nexport const selectClass = ( state: SliceState< typeof slice >, id: StyleDefinitionID ) =>\n\tstate[ SLICE_NAME ].data.items[ id ] ?? null;\n","import { createError } from '@elementor/utils';\n\nexport const GlobalClassNotFoundError = createError< { styleId: string } >( {\n\tcode: 'global_class_not_found',\n\tmessage: 'Global class not found.',\n} );\n\nexport const GlobalClassLabelAlreadyExistsError = createError< { label: string } >( {\n\tcode: 'global_class_label_already_exists',\n\tmessage: 'Class with this name already exists.',\n} );\n","import { __dispatch as dispatch, __getState as getState } from '@elementor/store';\n\nimport { apiClient, type ApiContext } from './api';\nimport { type GlobalClasses, selectData, selectFrontendInitialData, selectPreviewInitialData, slice } from './store';\n\ntype Options = {\n\tcontext: ApiContext;\n};\n\nexport async function saveGlobalClasses( { context }: Options ) {\n\tconst state = selectData( getState() );\n\n\tif ( context === 'preview' ) {\n\t\tawait apiClient.saveDraft( {\n\t\t\titems: state.items,\n\t\t\torder: state.order,\n\t\t\tchanges: calculateChanges( state, selectPreviewInitialData( getState() ) ),\n\t\t} );\n\t} else {\n\t\tawait apiClient.publish( {\n\t\t\titems: state.items,\n\t\t\torder: state.order,\n\t\t\tchanges: calculateChanges( state, selectFrontendInitialData( getState() ) ),\n\t\t} );\n\t}\n\n\tdispatch( slice.actions.reset( { context } ) );\n}\n\nfunction calculateChanges( state: GlobalClasses, initialData: GlobalClasses ) {\n\tconst stateIds = Object.keys( state.items );\n\tconst initialDataIds = Object.keys( initialData.items );\n\n\treturn {\n\t\tadded: stateIds.filter( ( id ) => ! initialDataIds.includes( id ) ),\n\t\tdeleted: initialDataIds.filter( ( id ) => ! stateIds.includes( id ) ),\n\t\tmodified: stateIds.filter( ( id ) => {\n\t\t\treturn id in initialData.items && hash( state.items[ id ] ) !== hash( initialData.items[ id ] );\n\t\t} ),\n\t};\n}\n\ntype UnknownObject = Record< string, unknown >;\n\n// Inspired by:\n// https://github.com/TanStack/query/blob/66ea5f2fc/packages/query-core/src/utils.ts#L212\nfunction hash( obj: UnknownObject ): string {\n\treturn JSON.stringify( obj, ( _, value ) =>\n\t\tisPlainObject( value )\n\t\t\t? Object.keys( value )\n\t\t\t\t\t.sort()\n\t\t\t\t\t.reduce< UnknownObject >( ( result, key ) => {\n\t\t\t\t\t\tresult[ key ] = value[ key ];\n\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}, {} )\n\t\t\t: value\n\t);\n}\n\nfunction isPlainObject( value: unknown ): value is UnknownObject {\n\treturn !! value && typeof value === 'object' && ! Array.isArray( value );\n}\n","import { type StyleDefinition, type StyleDefinitionID, type StyleDefinitionsMap } from '@elementor/editor-styles';\nimport { type HttpResponse, httpService } from '@elementor/http-client';\n\nimport { type GlobalClasses } from './store';\n\nconst RESOURCE_URL = '/global-classes';\n\nexport type GlobalClassesGetAllResponse = HttpResponse< StyleDefinitionsMap, { order: StyleDefinition[ 'id' ][] } >;\n\ntype UpdatePayload = GlobalClasses & {\n\tchanges: {\n\t\tadded: StyleDefinitionID[];\n\t\tdeleted: StyleDefinitionID[];\n\t\tmodified: StyleDefinitionID[];\n\t};\n};\n\nexport type ApiContext = 'preview' | 'frontend';\n\nexport const apiClient = {\n\tall: ( context: ApiContext = 'preview' ) =>\n\t\thttpService().get< GlobalClassesGetAllResponse >( 'elementor/v1' + RESOURCE_URL, {\n\t\t\tparams: { context },\n\t\t} ),\n\n\tpublish: ( payload: UpdatePayload ) =>\n\t\thttpService().put( 'elementor/v1' + RESOURCE_URL, payload, {\n\t\t\tparams: {\n\t\t\t\tcontext: 'frontend' satisfies ApiContext,\n\t\t\t},\n\t\t} ),\n\n\tsaveDraft: ( payload: UpdatePayload ) =>\n\t\thttpService().put( 'elementor/v1' + RESOURCE_URL, payload, {\n\t\t\tparams: {\n\t\t\t\tcontext: 'preview' satisfies ApiContext,\n\t\t\t},\n\t\t} ),\n};\n","import * as React from 'react';\nimport { useState } from 'react';\nimport { useSuppressedMessage } from '@elementor/editor-current-user';\nimport { IntroductionModal } from '@elementor/editor-ui';\nimport { Box, Image, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nconst MESSAGE_KEY = 'global-class-manager';\n\nexport const ClassManagerIntroduction = () => {\n\tconst [ isMessageSuppressed, suppressMessage ] = useSuppressedMessage( MESSAGE_KEY );\n\tconst [ shouldShowIntroduction, setShouldShowIntroduction ] = useState( ! isMessageSuppressed );\n\n\treturn (\n\t\t<IntroductionModal\n\t\t\topen={ shouldShowIntroduction }\n\t\t\ttitle={ __( 'Class Manager', 'elementor' ) }\n\t\t\thandleClose={ ( shouldShowAgain ) => {\n\t\t\t\tif ( ! shouldShowAgain ) {\n\t\t\t\t\tsuppressMessage();\n\t\t\t\t}\n\n\t\t\t\tsetShouldShowIntroduction( false );\n\t\t\t} }\n\t\t>\n\t\t\t<Image\n\t\t\t\tsx={ { width: '100%', aspectRatio: '16 / 9' } }\n\t\t\t\tsrc={ 'https://assets.elementor.com/packages/v1/images/class-manager-intro.svg' }\n\t\t\t\talt={ '' }\n\t\t\t/>\n\t\t\t<IntroductionContent />\n\t\t</IntroductionModal>\n\t);\n};\n\nconst IntroductionContent = () => {\n\treturn (\n\t\t<Box p={ 3 }>\n\t\t\t<Typography variant={ 'body2' }>\n\t\t\t\t{ __(\n\t\t\t\t\t\"The Class Manager lets you see all the classes you've created, plus adjust their priority, rename them, and delete unused classes to keep your CSS structured.\",\n\t\t\t\t\t'elementor'\n\t\t\t\t) }\n\t\t\t</Typography>\n\t\t\t<br />\n\t\t\t<Typography variant={ 'body2' }>\n\t\t\t\t{ __(\n\t\t\t\t\t'Remember, when editing an item within a specific class, any changes you make will apply across all elements in that class.',\n\t\t\t\t\t'elementor'\n\t\t\t\t) }\n\t\t\t</Typography>\n\t\t</Box>\n\t);\n};\n","import { getCurrentDocument, getV1DocumentsManager } from '@elementor/editor-documents';\nimport { __privateRunCommand as runCommand } from '@elementor/editor-v1-adapters';\nimport { __dispatch as dispatch } from '@elementor/store';\n\nimport { slice } from '../../store';\n\nlet isDeleted = false;\n\nexport const deleteClass = ( id: string ) => {\n\tdispatch( slice.actions.delete( id ) );\n\n\tisDeleted = true;\n};\n\nexport const onDelete = async () => {\n\tawait reloadDocument();\n\n\tisDeleted = false;\n};\n\nexport const hasDeletedItems = () => isDeleted;\n\n// When deleting a class, we remove it from all the documents that have it applied.\n// In order to reflect the changes in the active document, we need to reload it.\nconst reloadDocument = () => {\n\tconst currentDocument = getCurrentDocument();\n\tconst documentsManager = getV1DocumentsManager();\n\n\tdocumentsManager.invalidateCache();\n\n\treturn runCommand( 'editor/documents/switch', {\n\t\tid: currentDocument?.id,\n\t\tshouldScroll: false,\n\t\tshouldNavigateToDefaultRoute: false,\n\t} );\n};\n","import * as React from 'react';\nimport { ColorSwatchIcon } from '@elementor/icons';\nimport { type SvgIconProps } from '@elementor/ui';\n\nexport const FlippedColorSwatchIcon = ( { sx, ...props }: SvgIconProps ) => (\n\t<ColorSwatchIcon sx={ { transform: 'rotate(90deg)', ...sx } } { ...props } />\n);\n","import * as React from 'react';\nimport { type StyleDefinitionID } from '@elementor/editor-styles';\nimport { validateStyleLabel } from '@elementor/editor-styles-repository';\nimport { EditableField, EllipsisWithTooltip, MenuListItem, useEditable } from '@elementor/editor-ui';\nimport { DotsVerticalIcon } from '@elementor/icons';\nimport { __useDispatch as useDispatch } from '@elementor/store';\nimport {\n\tbindMenu,\n\tbindTrigger,\n\tBox,\n\tIconButton,\n\tList,\n\tListItemButton,\n\ttype ListItemButtonProps,\n\tMenu,\n\tStack,\n\tstyled,\n\ttype Theme,\n\tTooltip,\n\tTypography,\n\ttype TypographyProps,\n\tusePopupState,\n} from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { useClassesOrder } from '../../hooks/use-classes-order';\nimport { useOrderedClasses } from '../../hooks/use-ordered-classes';\nimport { slice } from '../../store';\nimport { DeleteConfirmationProvider, useDeleteConfirmation } from './delete-confirmation-dialog';\nimport { FlippedColorSwatchIcon } from './flipped-color-swatch-icon';\nimport { SortableItem, SortableProvider, SortableTrigger, type SortableTriggerProps } from './sortable';\n\nexport const GlobalClassesList = ( { disabled }: { disabled?: boolean } ) => {\n\tconst cssClasses = useOrderedClasses();\n\tconst dispatch = useDispatch();\n\n\tconst [ classesOrder, reorderClasses ] = useReorder();\n\n\tif ( ! cssClasses?.length ) {\n\t\treturn <EmptyState />;\n\t}\n\n\treturn (\n\t\t<DeleteConfirmationProvider>\n\t\t\t<List sx={ { display: 'flex', flexDirection: 'column', gap: 0.5 } }>\n\t\t\t\t<SortableProvider value={ classesOrder } onChange={ reorderClasses }>\n\t\t\t\t\t{ cssClasses?.map( ( { id, label } ) => {\n\t\t\t\t\t\tconst renameClass = ( newLabel: string ) => {\n\t\t\t\t\t\t\tdispatch(\n\t\t\t\t\t\t\t\tslice.actions.update( {\n\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\tlabel: newLabel,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<SortableItem key={ id } id={ id }>\n\t\t\t\t\t\t\t\t{ ( { isDragged, isDragPlaceholder, triggerProps, triggerStyle } ) => (\n\t\t\t\t\t\t\t\t\t<ClassItem\n\t\t\t\t\t\t\t\t\t\tid={ id }\n\t\t\t\t\t\t\t\t\t\tlabel={ label }\n\t\t\t\t\t\t\t\t\t\trenameClass={ renameClass }\n\t\t\t\t\t\t\t\t\t\tselected={ isDragged }\n\t\t\t\t\t\t\t\t\t\tdisabled={ disabled || isDragPlaceholder }\n\t\t\t\t\t\t\t\t\t\tsortableTriggerProps={ { ...triggerProps, style: triggerStyle } }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</SortableItem>\n\t\t\t\t\t\t);\n\t\t\t\t\t} ) }\n\t\t\t\t</SortableProvider>\n\t\t\t</List>\n\t\t</DeleteConfirmationProvider>\n\t);\n};\n\nconst useReorder = () => {\n\tconst dispatch = useDispatch();\n\tconst order = useClassesOrder();\n\n\tconst reorder = ( newIds: StyleDefinitionID[] ) => {\n\t\tdispatch( slice.actions.setOrder( newIds ) );\n\t};\n\n\treturn [ order, reorder ] as const;\n};\n\ntype ClassItemProps = React.PropsWithChildren< {\n\tid: string;\n\tlabel: string;\n\trenameClass: ( newLabel: string ) => void;\n\tselected?: boolean;\n\tdisabled?: boolean;\n\tsortableTriggerProps: SortableTriggerProps;\n} >;\n\nconst ClassItem = ( { id, label, renameClass, selected, disabled, sortableTriggerProps }: ClassItemProps ) => {\n\tconst {\n\t\tref: editableRef,\n\t\topenEditMode,\n\t\tisEditing,\n\t\terror,\n\t\tgetProps: getEditableProps,\n\t} = useEditable( {\n\t\tvalue: label,\n\t\tonSubmit: renameClass,\n\t\tvalidation: validateLabel,\n\t} );\n\n\tconst { openDialog } = useDeleteConfirmation();\n\n\tconst popupState = usePopupState( {\n\t\tvariant: 'popover',\n\t\tdisableAutoFocus: true,\n\t} );\n\n\tconst isSelected = ( selected || popupState.isOpen ) && ! disabled;\n\n\treturn (\n\t\t<>\n\t\t\t<StyledListItemButton\n\t\t\t\tdense\n\t\t\t\tdisableGutters\n\t\t\t\tshowActions={ isSelected || isEditing }\n\t\t\t\tshape=\"rounded\"\n\t\t\t\tonDoubleClick={ openEditMode }\n\t\t\t\tselected={ isSelected }\n\t\t\t\tdisabled={ disabled }\n\t\t\t\tfocusVisibleClassName=\"visible-class-item\"\n\t\t\t>\n\t\t\t\t<SortableTrigger { ...sortableTriggerProps } />\n\t\t\t\t<Indicator isActive={ isEditing } isError={ !! error }>\n\t\t\t\t\t{ isEditing ? (\n\t\t\t\t\t\t<EditableField\n\t\t\t\t\t\t\tref={ editableRef }\n\t\t\t\t\t\t\terror={ error }\n\t\t\t\t\t\t\tas={ Typography }\n\t\t\t\t\t\t\tvariant=\"caption\"\n\t\t\t\t\t\t\t{ ...getEditableProps() }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<EllipsisWithTooltip title={ label } as={ Typography } variant=\"caption\" />\n\t\t\t\t\t) }\n\t\t\t\t</Indicator>\n\t\t\t\t<Tooltip\n\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\tclassName={ 'class-item-more-actions' }\n\t\t\t\t\ttitle={ __( 'More actions', 'elementor' ) }\n\t\t\t\t>\n\t\t\t\t\t<IconButton size=\"tiny\" { ...bindTrigger( popupState ) } aria-label=\"More actions\">\n\t\t\t\t\t\t<DotsVerticalIcon fontSize=\"tiny\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</Tooltip>\n\t\t\t</StyledListItemButton>\n\t\t\t<Menu\n\t\t\t\t{ ...bindMenu( popupState ) }\n\t\t\t\tanchorOrigin={ {\n\t\t\t\t\tvertical: 'bottom',\n\t\t\t\t\thorizontal: 'right',\n\t\t\t\t} }\n\t\t\t\ttransformOrigin={ {\n\t\t\t\t\tvertical: 'top',\n\t\t\t\t\thorizontal: 'right',\n\t\t\t\t} }\n\t\t\t>\n\t\t\t\t<MenuListItem\n\t\t\t\t\tsx={ { minWidth: '160px' } }\n\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\tpopupState.close();\n\t\t\t\t\t\topenEditMode();\n\t\t\t\t\t} }\n\t\t\t\t>\n\t\t\t\t\t<Typography variant=\"caption\" sx={ { color: 'text.primary' } }>\n\t\t\t\t\t\t{ __( 'Rename', 'elementor' ) }\n\t\t\t\t\t</Typography>\n\t\t\t\t</MenuListItem>\n\t\t\t\t<MenuListItem\n\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\tpopupState.close();\n\t\t\t\t\t\topenDialog( { id, label } );\n\t\t\t\t\t} }\n\t\t\t\t>\n\t\t\t\t\t<Typography variant=\"caption\" sx={ { color: 'error.light' } }>\n\t\t\t\t\t\t{ __( 'Delete', 'elementor' ) }\n\t\t\t\t\t</Typography>\n\t\t\t\t</MenuListItem>\n\t\t\t</Menu>\n\t\t</>\n\t);\n};\n\n// Custom styles for sortable list item, until the component is available in the UI package.\nconst StyledListItemButton = styled( ListItemButton, {\n\tshouldForwardProp: ( prop: string ) => ! [ 'showActions' ].includes( prop ),\n} )< ListItemButtonProps & { showActions: boolean } >(\n\t( { showActions } ) => `\n\tmin-height: 36px;\n\n\t&.visible-class-item {\n\t\tbox-shadow: none !important;\n\t}\n\n\t.class-item-more-actions, .class-item-sortable-trigger {\n\t\tvisibility: ${ showActions ? 'visible' : 'hidden' };\n\t}\n\n\t.class-item-sortable-trigger {\n\t\tvisibility: ${ showActions ? 'visible' : 'hidden' };\n\t}\n\n\t&:hover&:not(:disabled) {\n\t\t.class-item-more-actions, .class-item-sortable-trigger {\n\t\t\tvisibility: visible;\n\t\t}\n\t}\n`\n);\n\nconst EmptyState = () => (\n\t<Stack alignItems=\"center\" gap={ 1.5 } pt={ 10 } px={ 0.5 } maxWidth=\"260px\" margin=\"auto\">\n\t\t<FlippedColorSwatchIcon fontSize=\"large\" />\n\t\t<StyledHeader variant=\"subtitle2\" component=\"h2\" color=\"text.secondary\">\n\t\t\t{ __( 'There are no global classes yet.', 'elementor' ) }\n\t\t</StyledHeader>\n\t\t<Typography align=\"center\" variant=\"caption\" color=\"text.secondary\">\n\t\t\t{ __(\n\t\t\t\t'CSS classes created in the editor panel will appear here. Once they are available, you can arrange their hierarchy, rename them, or delete them as needed.',\n\t\t\t\t'elementor'\n\t\t\t) }\n\t\t</Typography>\n\t</Stack>\n);\n\n// Override panel reset styles.\nconst StyledHeader = styled( Typography )< TypographyProps >( ( { theme, variant } ) => ( {\n\t'&.MuiTypography-root': {\n\t\t...( theme.typography[ variant as keyof typeof theme.typography ] as React.CSSProperties ),\n\t},\n} ) );\n\nconst Indicator = styled( Box, {\n\tshouldForwardProp: ( prop: string ) => ! [ 'isActive', 'isError' ].includes( prop ),\n} )< { isActive: boolean; isError: boolean } >( ( { theme, isActive, isError } ) => ( {\n\tdisplay: 'flex',\n\twidth: '100%',\n\tflexGrow: 1,\n\tborderRadius: theme.spacing( 0.5 ),\n\tborder: getIndicatorBorder( { isActive, isError, theme } ),\n\tpadding: `0 ${ theme.spacing( 1 ) }`,\n\tmarginLeft: isActive ? theme.spacing( 1 ) : 0,\n\tminWidth: 0,\n} ) );\n\nconst getIndicatorBorder = ( { isActive, isError, theme }: { isActive: boolean; isError: boolean; theme: Theme } ) => {\n\tif ( isError ) {\n\t\treturn `2px solid ${ theme.palette.error.main }`;\n\t}\n\n\tif ( isActive ) {\n\t\treturn `2px solid ${ theme.palette.secondary.main }`;\n\t}\n\n\treturn 'none';\n};\n\nconst validateLabel = ( newLabel: string ) => {\n\tconst result = validateStyleLabel( newLabel, 'rename' );\n\n\tif ( result.isValid ) {\n\t\treturn null;\n\t}\n\n\treturn result.errorMessage;\n};\n","import { __useSelector as useSelector } from '@elementor/store';\n\nimport { selectOrder } from '../store';\n\nexport const useClassesOrder = () => {\n\treturn useSelector( selectOrder );\n};\n","import { __useSelector as useSelector } from '@elementor/store';\n\nimport { selectOrderedClasses } from '../store';\n\nexport const useOrderedClasses = () => {\n\treturn useSelector( selectOrderedClasses );\n};\n","import * as React from 'react';\nimport { createContext, useContext, useState } from 'react';\nimport { type StyleDefinition } from '@elementor/editor-styles';\nimport { AlertOctagonFilledIcon } from '@elementor/icons';\nimport {\n\tButton,\n\tDialog,\n\tDialogActions,\n\tDialogContent,\n\tDialogContentText,\n\tDialogTitle,\n\tTypography,\n} from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { deleteClass } from './delete-class';\n\ntype DeleteConfirmationDialogProps = Pick< StyleDefinition, 'id' | 'label' >;\n\ntype DeleteConfirmationContext = {\n\topenDialog: ( props: DeleteConfirmationDialogProps ) => void;\n\tcloseDialog: () => void;\n\tdialogProps: DeleteConfirmationDialogProps | null;\n};\n\nconst context = createContext< DeleteConfirmationContext | null >( null );\n\nexport const DeleteConfirmationProvider = ( { children }: React.PropsWithChildren ) => {\n\tconst [ dialogProps, setDialogProps ] = useState< DeleteConfirmationDialogProps | null >( null );\n\n\tconst openDialog = ( props: DeleteConfirmationDialogProps ) => {\n\t\tsetDialogProps( props );\n\t};\n\n\tconst closeDialog = () => {\n\t\tsetDialogProps( null );\n\t};\n\n\treturn (\n\t\t<context.Provider value={ { openDialog, closeDialog, dialogProps } }>\n\t\t\t{ children }\n\t\t\t{ !! dialogProps && <DeleteConfirmationDialog { ...dialogProps } /> }\n\t\t</context.Provider>\n\t);\n};\n\nconst TITLE_ID = 'delete-class-dialog';\n\nconst DeleteConfirmationDialog = ( { label, id }: DeleteConfirmationDialogProps ) => {\n\tconst { closeDialog } = useDeleteConfirmation();\n\n\tconst onConfirm = () => {\n\t\tdeleteClass( id );\n\n\t\tcloseDialog();\n\t};\n\n\treturn (\n\t\t<Dialog open onClose={ closeDialog } aria-labelledby={ TITLE_ID } maxWidth=\"xs\">\n\t\t\t<DialogTitle id={ TITLE_ID } display=\"flex\" alignItems=\"center\" gap={ 1 } sx={ { lineHeight: 1 } }>\n\t\t\t\t<AlertOctagonFilledIcon color=\"error\" />\n\t\t\t\t{ __( 'Delete this class?', 'elementor' ) }\n\t\t\t</DialogTitle>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogContentText variant=\"body2\" color=\"textPrimary\">\n\t\t\t\t\t{ __( 'Deleting', 'elementor' ) }\n\t\t\t\t\t<Typography variant=\"subtitle2\" component=\"span\">\n\t\t\t\t\t\t { label } \n\t\t\t\t\t</Typography>\n\t\t\t\t\t{ __(\n\t\t\t\t\t\t'will permanently remove it from your project and may affect the design across all elements using it. This action cannot be undone.',\n\t\t\t\t\t\t'elementor'\n\t\t\t\t\t) }\n\t\t\t\t</DialogContentText>\n\t\t\t</DialogContent>\n\t\t\t<DialogActions>\n\t\t\t\t<Button color=\"secondary\" onClick={ closeDialog }>\n\t\t\t\t\t{ __( 'Not now', 'elementor' ) }\n\t\t\t\t</Button>\n\t\t\t\t<Button variant=\"contained\" color=\"error\" onClick={ onConfirm }>\n\t\t\t\t\t{ __( 'Delete', 'elementor' ) }\n\t\t\t\t</Button>\n\t\t\t</DialogActions>\n\t\t</Dialog>\n\t);\n};\n\nexport const useDeleteConfirmation = () => {\n\tconst contextValue = useContext( context );\n\n\tif ( ! contextValue ) {\n\t\tthrow new Error( 'useDeleteConfirmation must be used within a DeleteConfirmationProvider' );\n\t}\n\n\treturn contextValue;\n};\n","import * as React from 'react';\nimport { GripVerticalIcon } from '@elementor/icons';\nimport {\n\tBox,\n\tstyled,\n\tUnstableSortableItem,\n\ttype UnstableSortableItemProps,\n\ttype UnstableSortableItemRenderProps,\n\tUnstableSortableProvider,\n\ttype UnstableSortableProviderProps,\n} from '@elementor/ui';\n\nexport const SortableProvider = < T extends string >( props: UnstableSortableProviderProps< T > ) => (\n\t<UnstableSortableProvider restrictAxis variant=\"static\" dragPlaceholderStyle={ { opacity: '1' } } { ...props } />\n);\n\nexport type SortableTriggerProps = React.HTMLAttributes< HTMLDivElement >;\n\nexport const SortableTrigger = ( props: SortableTriggerProps ) => (\n\t<StyledSortableTrigger { ...props } role=\"button\" className=\"class-item-sortable-trigger\">\n\t\t<GripVerticalIcon fontSize=\"tiny\" />\n\t</StyledSortableTrigger>\n);\n\ntype SortableItemProps = {\n\tid: UnstableSortableItemProps[ 'id' ];\n\tchildren: ( props: Partial< UnstableSortableItemRenderProps > ) => React.ReactNode;\n};\n\nexport const SortableItem = ( { children, id, ...props }: SortableItemProps ) => {\n\treturn (\n\t\t<UnstableSortableItem\n\t\t\t{ ...props }\n\t\t\tid={ id }\n\t\t\trender={ ( {\n\t\t\t\titemProps,\n\t\t\t\tisDragged,\n\t\t\t\ttriggerProps,\n\t\t\t\titemStyle,\n\t\t\t\ttriggerStyle,\n\t\t\t\tdropIndicationStyle,\n\t\t\t\tshowDropIndication,\n\t\t\t\tisDragOverlay,\n\t\t\t\tisDragPlaceholder,\n\t\t\t}: UnstableSortableItemRenderProps ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<Box\n\t\t\t\t\t\t{ ...itemProps }\n\t\t\t\t\t\tstyle={ itemStyle }\n\t\t\t\t\t\tcomponent={ 'li' }\n\t\t\t\t\t\trole=\"listitem\"\n\t\t\t\t\t\tsx={ {\n\t\t\t\t\t\t\tbackgroundColor: isDragOverlay ? 'background.paper' : undefined,\n\t\t\t\t\t\t} }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ children( {\n\t\t\t\t\t\t\titemProps,\n\t\t\t\t\t\t\tisDragged,\n\t\t\t\t\t\t\ttriggerProps,\n\t\t\t\t\t\t\titemStyle,\n\t\t\t\t\t\t\ttriggerStyle,\n\t\t\t\t\t\t\tisDragPlaceholder,\n\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t{ showDropIndication && <SortableItemIndicator style={ dropIndicationStyle } /> }\n\t\t\t\t\t</Box>\n\t\t\t\t);\n\t\t\t} }\n\t\t/>\n\t);\n};\n\nconst StyledSortableTrigger = styled( 'div' )( ( { theme } ) => ( {\n\tposition: 'absolute',\n\tleft: 0,\n\ttop: '50%',\n\ttransform: `translate( -${ theme.spacing( 1.5 ) }, -50% )`,\n\tcolor: theme.palette.action.active,\n} ) );\n\nconst SortableItemIndicator = styled( Box )`\n\twidth: 100%;\n\theight: 1px;\n\tbackground-color: ${ ( { theme } ) => theme.palette.text.primary };\n`;\n","type ExtendedWindow = Window & {\n\t$e?: {\n\t\tcomponents?: {\n\t\t\tget?: ( name: 'panel' ) =>\n\t\t\t\t| {\n\t\t\t\t\t\tblockUserInteractions?: () => void;\n\t\t\t\t\t\tunblockUserInteractions?: () => void;\n\t\t\t\t }\n\t\t\t\t| undefined;\n\t\t};\n\t};\n};\n\nexport function blockPanelInteractions() {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\textendedWindow.$e?.components?.get?.( 'panel' )?.blockUserInteractions?.();\n}\n\nexport function unblockPanelInteractions() {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\textendedWindow.$e?.components?.get?.( 'panel' )?.unblockUserInteractions?.();\n}\n","import * as React from 'react';\nimport { useState } from 'react';\nimport { AlertTriangleFilledIcon } from '@elementor/icons';\nimport {\n\tButton,\n\tDialog,\n\tDialogActions,\n\tDialogContent,\n\tDialogContentText,\n\ttype DialogContentTextProps,\n\ttype DialogProps,\n\tDialogTitle,\n} from '@elementor/ui';\n\nconst TITLE_ID = 'save-changes-dialog';\n\nconst SaveChangesDialog = ( { children, onClose }: Pick< DialogProps, 'children' | 'onClose' > ) => (\n\t<Dialog open onClose={ onClose } aria-labelledby={ TITLE_ID } maxWidth=\"xs\">\n\t\t{ children }\n\t</Dialog>\n);\n\nconst SaveChangesDialogTitle = ( { children }: React.PropsWithChildren ) => (\n\t<DialogTitle id={ TITLE_ID } display=\"flex\" alignItems=\"center\" gap={ 1 } sx={ { lineHeight: 1 } }>\n\t\t<AlertTriangleFilledIcon color=\"secondary\" />\n\t\t{ children }\n\t</DialogTitle>\n);\n\nconst SaveChangesDialogContent = ( { children }: React.PropsWithChildren ) => (\n\t<DialogContent>{ children }</DialogContent>\n);\n\nconst SaveChangesDialogContentText = ( props: DialogContentTextProps ) => (\n\t<DialogContentText variant=\"body2\" color=\"textPrimary\" display=\"flex\" flexDirection=\"column\" { ...props } />\n);\n\ntype Action = {\n\tlabel: string;\n\taction: () => void | Promise< void >;\n};\n\ntype ConfirmationDialogActionsProps = {\n\tactions: {\n\t\tcancel: Action;\n\t\tconfirm: Action;\n\t};\n};\nconst SaveChangesDialogActions = ( { actions }: ConfirmationDialogActionsProps ) => {\n\tconst [ isConfirming, setIsConfirming ] = useState( false );\n\tconst { cancel, confirm } = actions;\n\n\tconst onConfirm = async () => {\n\t\tsetIsConfirming( true );\n\t\tawait confirm.action();\n\t\tsetIsConfirming( false );\n\t};\n\treturn (\n\t\t<DialogActions>\n\t\t\t<Button variant=\"text\" color=\"secondary\" onClick={ cancel.action }>\n\t\t\t\t{ cancel.label }\n\t\t\t</Button>\n\t\t\t<Button variant=\"contained\" color=\"secondary\" onClick={ onConfirm } loading={ isConfirming }>\n\t\t\t\t{ confirm.label }\n\t\t\t</Button>\n\t\t</DialogActions>\n\t);\n};\n\nSaveChangesDialog.Title = SaveChangesDialogTitle;\nSaveChangesDialog.Content = SaveChangesDialogContent;\nSaveChangesDialog.ContentText = SaveChangesDialogContentText;\nSaveChangesDialog.Actions = SaveChangesDialogActions;\n\nconst useDialog = () => {\n\tconst [ isOpen, setIsOpen ] = useState( false );\n\n\tconst open = () => setIsOpen( true );\n\tconst close = () => setIsOpen( false );\n\n\treturn { isOpen, open, close };\n};\n\nexport { SaveChangesDialog, useDialog };\n","import { useEffect } from 'react';\nimport { __useDispatch as useDispatch } from '@elementor/store';\n\nimport { apiClient } from '../api';\nimport { slice } from '../store';\n\nexport function PopulateStore() {\n\tconst dispatch = useDispatch();\n\n\tuseEffect( () => {\n\t\tPromise.all( [ apiClient.all( 'preview' ), apiClient.all( 'frontend' ) ] ).then(\n\t\t\t( [ previewRes, frontendRes ] ) => {\n\t\t\t\tconst { data: previewData } = previewRes;\n\t\t\t\tconst { data: frontendData } = frontendRes;\n\n\t\t\t\tdispatch(\n\t\t\t\t\tslice.actions.load( {\n\t\t\t\t\t\tpreview: {\n\t\t\t\t\t\t\titems: previewData.data,\n\t\t\t\t\t\t\torder: previewData.meta.order,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfrontend: {\n\t\t\t\t\t\t\titems: frontendData.data,\n\t\t\t\t\t\t\torder: frontendData.meta.order,\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}, [ dispatch ] );\n\n\treturn null;\n}\n","import { generateId } from '@elementor/editor-styles';\nimport { createStylesProvider } from '@elementor/editor-styles-repository';\nimport {\n\t__dispatch as dispatch,\n\t__getState as getState,\n\t__subscribeWithSelector as subscribeWithSelector,\n} from '@elementor/store';\nimport { __ } from '@wordpress/i18n';\n\nimport { GlobalClassLabelAlreadyExistsError } from './errors';\nimport { selectClass, selectGlobalClasses, selectOrderedClasses, slice, type StateWithGlobalClasses } from './store';\n\nconst MAX_CLASSES = 50;\n\nexport const globalClassesStylesProvider = createStylesProvider( {\n\tkey: 'global-classes',\n\tpriority: 30,\n\tlimit: MAX_CLASSES,\n\tlabels: {\n\t\tsingular: __( 'class', 'elementor' ),\n\t\tplural: __( 'classes', 'elementor' ),\n\t},\n\tsubscribe: ( cb ) => subscribeWithSelector( ( state: StateWithGlobalClasses ) => state.globalClasses, cb ),\n\tactions: {\n\t\tall: () => selectOrderedClasses( getState() ),\n\t\tget: ( id ) => selectClass( getState(), id ),\n\t\tcreate: ( label ) => {\n\t\t\tconst classes = selectGlobalClasses( getState() );\n\n\t\t\tconst existingLabels = Object.values( classes ).map( ( style ) => style.label );\n\n\t\t\tif ( existingLabels.includes( label ) ) {\n\t\t\t\tthrow new GlobalClassLabelAlreadyExistsError( { context: { label } } );\n\t\t\t}\n\n\t\t\tconst existingIds = Object.keys( classes );\n\t\t\tconst id = generateId( 'g-', existingIds );\n\n\t\t\tdispatch(\n\t\t\t\tslice.actions.add( {\n\t\t\t\t\tid,\n\t\t\t\t\ttype: 'class',\n\t\t\t\t\tlabel,\n\t\t\t\t\tvariants: [],\n\t\t\t\t} )\n\t\t\t);\n\n\t\t\treturn id;\n\t\t},\n\t\tupdate: ( payload ) => {\n\t\t\tdispatch(\n\t\t\t\tslice.actions.update( {\n\t\t\t\t\tstyle: payload,\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\t\tdelete: ( id ) => {\n\t\t\tdispatch( slice.actions.delete( id ) );\n\t\t},\n\t\tupdateProps: ( args ) => {\n\t\t\tdispatch(\n\t\t\t\tslice.actions.updateProps( {\n\t\t\t\t\tid: args.id,\n\t\t\t\t\tmeta: args.meta,\n\t\t\t\t\tprops: args.props,\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\t},\n} );\n","import { setDocumentModifiedStatus } from '@elementor/editor-documents';\nimport { registerDataHook } from '@elementor/editor-v1-adapters';\nimport { __getState as getState, __subscribeWithSelector as subscribeWithSelector } from '@elementor/store';\n\nimport { saveGlobalClasses } from './save-global-classes';\nimport { selectIsDirty } from './store';\n\nexport function syncWithDocumentSave() {\n\tconst unsubscribe = syncDirtyState();\n\n\tbindSaveAction();\n\n\treturn unsubscribe;\n}\n\nfunction syncDirtyState() {\n\treturn subscribeWithSelector( selectIsDirty, () => {\n\t\tif ( ! isDirty() ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetDocumentModifiedStatus( true );\n\t} );\n}\n\nfunction bindSaveAction() {\n\tregisterDataHook( 'after', 'document/save/save', ( args ) => {\n\t\treturn saveGlobalClasses( {\n\t\t\tcontext: args.status === 'publish' ? 'frontend' : 'preview',\n\t\t} );\n\t} );\n}\n\nfunction isDirty() {\n\treturn selectIsDirty( getState() );\n}\n"],"mappings":"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","names":["React","IconButton","Tooltip","__","React","Box","Button","IconButton","Stack","__","id","context","context","context","id","dispatch","id","dispatch","React","React","Box","styled","Typography","__","useSelector","useSelector","useSelector","useSelector","React","useState","Typography","__","useState","id","__","Typography","React","Box","id","dispatch","id","Typography","__","styled","Box","React","useState","Button","Dialog","DialogActions","DialogContent","DialogContentText","DialogTitle","TITLE_ID","isDirty","Stack","__","Button","IconButton","Box","Tooltip","__","IconButton","useEffect","useDispatch","dispatch","useDispatch","useEffect","dispatch","getState","__","__","getState","id","dispatch","setDocumentModifiedStatus","getState","subscribeWithSelector","subscribeWithSelector","setDocumentModifiedStatus","getState"]}
|
|
1
|
+
{"version":3,"sources":["../src/init.ts","../src/components/class-manager/class-manager-button.tsx","../src/components/class-manager/class-manager-panel.tsx","../src/hooks/use-dirty-state.ts","../src/store.ts","../src/errors.ts","../src/save-global-classes.ts","../src/api.ts","../src/components/class-manager/class-manager-introduction.tsx","../src/components/class-manager/delete-class.ts","../src/components/class-manager/flipped-color-swatch-icon.tsx","../src/components/class-manager/global-classes-list.tsx","../src/hooks/use-classes-order.ts","../src/hooks/use-ordered-classes.ts","../src/components/class-manager/delete-confirmation-dialog.tsx","../src/components/class-manager/sortable.tsx","../src/components/class-manager/panel-interactions.ts","../src/components/class-manager/save-changes-dialog.tsx","../src/components/populate-store.tsx","../src/global-classes-styles-provider.ts","../src/sync-with-document-save.ts"],"sourcesContent":["import { injectIntoLogic } from '@elementor/editor';\nimport { injectIntoClassSelectorActions } from '@elementor/editor-editing-panel';\nimport { __registerPanel as registerPanel } from '@elementor/editor-panels';\nimport { stylesRepository } from '@elementor/editor-styles-repository';\nimport { __privateListenTo as listenTo, v1ReadyEvent } from '@elementor/editor-v1-adapters';\nimport { __registerSlice as registerSlice } from '@elementor/store';\n\nimport { ClassManagerButton } from './components/class-manager/class-manager-button';\nimport { panel } from './components/class-manager/class-manager-panel';\nimport { PopulateStore } from './components/populate-store';\nimport { globalClassesStylesProvider } from './global-classes-styles-provider';\nimport { slice } from './store';\nimport { syncWithDocumentSave } from './sync-with-document-save';\n\nexport function init() {\n\tregisterSlice( slice );\n\tregisterPanel( panel );\n\n\tstylesRepository.register( globalClassesStylesProvider );\n\n\tinjectIntoLogic( {\n\t\tid: 'global-classes-populate-store',\n\t\tcomponent: PopulateStore,\n\t} );\n\n\tinjectIntoClassSelectorActions( {\n\t\tid: 'global-classes-manager-button',\n\t\tcomponent: ClassManagerButton,\n\t} );\n\n\tlistenTo( v1ReadyEvent(), () => {\n\t\tsyncWithDocumentSave();\n\t} );\n}\n","import * as React from 'react';\nimport {\n\t__useActiveDocument as useActiveDocument,\n\t__useActiveDocumentActions as useActiveDocumentActions,\n} from '@elementor/editor-documents';\nimport { IconButton, Tooltip } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { usePanelActions } from './class-manager-panel';\nimport { FlippedColorSwatchIcon } from './flipped-color-swatch-icon';\nimport { SaveChangesDialog, useDialog } from './save-changes-dialog';\n\nexport const ClassManagerButton = () => {\n\tconst document = useActiveDocument();\n\tconst { open: openPanel } = usePanelActions();\n\tconst { save: saveDocument } = useActiveDocumentActions();\n\tconst { open: openSaveChangesDialog, close: closeSaveChangesDialog, isOpen: isSaveChangesDialogOpen } = useDialog();\n\n\tconst handleOpenPanel = () => {\n\t\tif ( document?.isDirty ) {\n\t\t\topenSaveChangesDialog();\n\t\t\treturn;\n\t\t}\n\n\t\topenPanel();\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<Tooltip title={ __( 'Class Manager', 'elementor' ) } placement=\"top\">\n\t\t\t\t<IconButton size=\"tiny\" onClick={ handleOpenPanel } sx={ { marginInlineEnd: -0.75 } }>\n\t\t\t\t\t<FlippedColorSwatchIcon fontSize=\"tiny\" />\n\t\t\t\t</IconButton>\n\t\t\t</Tooltip>\n\t\t\t{ isSaveChangesDialogOpen && (\n\t\t\t\t<SaveChangesDialog>\n\t\t\t\t\t<SaveChangesDialog.Title>{ __( 'You have unsaved changes', 'elementor' ) }</SaveChangesDialog.Title>\n\t\t\t\t\t<SaveChangesDialog.Content>\n\t\t\t\t\t\t<SaveChangesDialog.ContentText sx={ { mb: 2 } }>\n\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t\"To open the Class Manager, save your page first. You can't continue without saving.\",\n\t\t\t\t\t\t\t\t'elementor'\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</SaveChangesDialog.ContentText>\n\t\t\t\t\t</SaveChangesDialog.Content>\n\t\t\t\t\t<SaveChangesDialog.Actions\n\t\t\t\t\t\tactions={ {\n\t\t\t\t\t\t\tcancel: {\n\t\t\t\t\t\t\t\tlabel: __( 'Stay here', 'elementor' ),\n\t\t\t\t\t\t\t\taction: closeSaveChangesDialog,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tconfirm: {\n\t\t\t\t\t\t\t\tlabel: __( 'Save & Continue', 'elementor' ),\n\t\t\t\t\t\t\t\taction: async () => {\n\t\t\t\t\t\t\t\t\tawait saveDocument();\n\t\t\t\t\t\t\t\t\tcloseSaveChangesDialog();\n\t\t\t\t\t\t\t\t\topenPanel();\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} }\n\t\t\t\t\t/>\n\t\t\t\t</SaveChangesDialog>\n\t\t\t) }\n\t\t</>\n\t);\n};\n","import * as React from 'react';\nimport { useEffect } from 'react';\nimport { setDocumentModifiedStatus } from '@elementor/editor-documents';\nimport {\n\t__createPanel as createPanel,\n\tPanel,\n\tPanelBody,\n\tPanelFooter,\n\tPanelHeader,\n\tPanelHeaderTitle,\n} from '@elementor/editor-panels';\nimport { ThemeProvider } from '@elementor/editor-ui';\nimport { changeEditMode } from '@elementor/editor-v1-adapters';\nimport { XIcon } from '@elementor/icons';\nimport { useMutation } from '@elementor/query';\nimport { Alert, Box, Button, ErrorBoundary, IconButton, type IconButtonProps, Stack } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { useDirtyState } from '../../hooks/use-dirty-state';\nimport { saveGlobalClasses } from '../../save-global-classes';\nimport { ClassManagerIntroduction } from './class-manager-introduction';\nimport { hasDeletedItems, onDelete } from './delete-class';\nimport { FlippedColorSwatchIcon } from './flipped-color-swatch-icon';\nimport { GlobalClassesList } from './global-classes-list';\nimport { blockPanelInteractions, unblockPanelInteractions } from './panel-interactions';\nimport { SaveChangesDialog, useDialog } from './save-changes-dialog';\n\nconst id = 'global-classes-manager';\n\n// We need to disable the app-bar buttons, and the elements overlays when opening the classes manager panel.\n// The buttons and overlays are enabled only in edit mode, so we're creating a custom new edit mode that\n// will force them to be disabled. We can't use the `preview` edit mode in this case since it'll force\n// the panel to be closed.\nexport const { panel, usePanelActions } = createPanel( {\n\tid,\n\tcomponent: ClassManagerPanel,\n\tallowedEditModes: [ 'edit', id ],\n\tonOpen: () => {\n\t\tchangeEditMode( id );\n\n\t\tblockPanelInteractions();\n\t},\n\tonClose: () => {\n\t\tchangeEditMode( 'edit' );\n\n\t\tunblockPanelInteractions();\n\t},\n} );\n\nexport function ClassManagerPanel() {\n\tconst isDirty = useDirtyState();\n\n\tconst { close: closePanel } = usePanelActions();\n\tconst { open: openSaveChangesDialog, close: closeSaveChangesDialog, isOpen: isSaveChangesDialogOpen } = useDialog();\n\n\tconst { mutateAsync: publish, isPending: isPublishing } = usePublish();\n\n\tusePreventUnload();\n\n\treturn (\n\t\t<ThemeProvider>\n\t\t\t<ErrorBoundary fallback={ <ErrorBoundaryFallback /> }>\n\t\t\t\t<Panel>\n\t\t\t\t\t<PanelHeader>\n\t\t\t\t\t\t<Stack p={ 1 } pl={ 2 } width=\"100%\" direction=\"row\" alignItems=\"center\">\n\t\t\t\t\t\t\t<PanelHeaderTitle sx={ { display: 'flex', alignItems: 'center', gap: 0.5 } }>\n\t\t\t\t\t\t\t\t<FlippedColorSwatchIcon fontSize=\"inherit\" />\n\t\t\t\t\t\t\t\t{ __( 'Class Manager', 'elementor' ) }\n\t\t\t\t\t\t\t</PanelHeaderTitle>\n\t\t\t\t\t\t\t<CloseButton\n\t\t\t\t\t\t\t\tsx={ { marginLeft: 'auto' } }\n\t\t\t\t\t\t\t\tdisabled={ isPublishing }\n\t\t\t\t\t\t\t\tonClose={ () => {\n\t\t\t\t\t\t\t\t\tif ( isDirty ) {\n\t\t\t\t\t\t\t\t\t\topenSaveChangesDialog();\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tclosePanel();\n\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</PanelHeader>\n\t\t\t\t\t<PanelBody px={ 2 }>\n\t\t\t\t\t\t<GlobalClassesList disabled={ isPublishing } />\n\t\t\t\t\t</PanelBody>\n\t\t\t\t\t<PanelFooter>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\tcolor=\"global\"\n\t\t\t\t\t\t\tvariant=\"contained\"\n\t\t\t\t\t\t\tonClick={ publish }\n\t\t\t\t\t\t\tdisabled={ ! isDirty }\n\t\t\t\t\t\t\tloading={ isPublishing }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Save changes', 'elementor' ) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</PanelFooter>\n\t\t\t\t</Panel>\n\t\t\t</ErrorBoundary>\n\t\t\t<ClassManagerIntroduction />\n\t\t\t{ isSaveChangesDialogOpen && (\n\t\t\t\t<SaveChangesDialog>\n\t\t\t\t\t<SaveChangesDialog.Title>{ __( 'You have unsaved changes', 'elementor' ) }</SaveChangesDialog.Title>\n\t\t\t\t\t<SaveChangesDialog.Content>\n\t\t\t\t\t\t<SaveChangesDialog.ContentText>\n\t\t\t\t\t\t\t{ __( 'You have unsaved changes in the Class Manager.', 'elementor' ) }\n\t\t\t\t\t\t</SaveChangesDialog.ContentText>\n\t\t\t\t\t\t<SaveChangesDialog.ContentText>\n\t\t\t\t\t\t\t{ __( 'To avoid losing your updates, save your changes before leaving.', 'elementor' ) }\n\t\t\t\t\t\t</SaveChangesDialog.ContentText>\n\t\t\t\t\t</SaveChangesDialog.Content>\n\t\t\t\t\t<SaveChangesDialog.Actions\n\t\t\t\t\t\tactions={ {\n\t\t\t\t\t\t\tcancel: {\n\t\t\t\t\t\t\t\tlabel: __( 'Cancel', 'elementor' ),\n\t\t\t\t\t\t\t\taction: closeSaveChangesDialog,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tconfirm: {\n\t\t\t\t\t\t\t\tlabel: __( 'Save & Continue', 'elementor' ),\n\t\t\t\t\t\t\t\taction: async () => {\n\t\t\t\t\t\t\t\t\tawait publish();\n\t\t\t\t\t\t\t\t\tcloseSaveChangesDialog();\n\t\t\t\t\t\t\t\t\tclosePanel();\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} }\n\t\t\t\t\t/>\n\t\t\t\t</SaveChangesDialog>\n\t\t\t) }\n\t\t</ThemeProvider>\n\t);\n}\n\nconst CloseButton = ( { onClose, ...props }: IconButtonProps & { onClose: () => void } ) => (\n\t<IconButton size=\"small\" color=\"secondary\" onClick={ onClose } aria-label=\"Close\" { ...props }>\n\t\t<XIcon fontSize=\"small\" />\n\t</IconButton>\n);\n\nconst ErrorBoundaryFallback = () => (\n\t<Box role=\"alert\" sx={ { minHeight: '100%', p: 2 } }>\n\t\t<Alert severity=\"error\" sx={ { mb: 2, maxWidth: 400, textAlign: 'center' } }>\n\t\t\t<strong>{ __( 'Something went wrong', 'elementor' ) }</strong>\n\t\t</Alert>\n\t</Box>\n);\n\nconst usePreventUnload = () => {\n\tconst isDirty = useDirtyState();\n\n\tuseEffect( () => {\n\t\tconst handleBeforeUnload = ( event: BeforeUnloadEvent ) => {\n\t\t\tif ( isDirty ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t};\n\n\t\twindow.addEventListener( 'beforeunload', handleBeforeUnload );\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener( 'beforeunload', handleBeforeUnload );\n\t\t};\n\t}, [ isDirty ] );\n};\n\nconst usePublish = () => {\n\treturn useMutation( {\n\t\tmutationFn: () => saveGlobalClasses( { context: 'frontend' } ),\n\t\tonSuccess: async () => {\n\t\t\tsetDocumentModifiedStatus( false );\n\n\t\t\tif ( hasDeletedItems() ) {\n\t\t\t\tawait onDelete();\n\t\t\t}\n\t\t},\n\t} );\n};\n","import { __useSelector as useSelector } from '@elementor/store';\n\nimport { selectIsDirty } from '../store';\n\nexport const useDirtyState = () => {\n\treturn useSelector( selectIsDirty );\n};\n","import { mergeProps, type Props } from '@elementor/editor-props';\nimport {\n\tgetVariantByMeta,\n\ttype StyleDefinition,\n\ttype StyleDefinitionID,\n\ttype StyleDefinitionVariant,\n} from '@elementor/editor-styles';\nimport { type UpdateActionPayload } from '@elementor/editor-styles-repository';\nimport {\n\t__createSelector as createSelector,\n\t__createSlice as createSlice,\n\ttype PayloadAction,\n\ttype SliceState,\n} from '@elementor/store';\n\nimport type { ApiContext } from './api';\nimport { GlobalClassNotFoundError } from './errors';\n\nexport type GlobalClasses = {\n\titems: Record< StyleDefinitionID, StyleDefinition >;\n\torder: StyleDefinitionID[];\n};\n\ntype GlobalClassesState = {\n\tdata: GlobalClasses;\n\tinitialData: {\n\t\tfrontend: GlobalClasses;\n\t\tpreview: GlobalClasses;\n\t};\n\tisDirty: boolean;\n};\n\nconst initialState: GlobalClassesState = {\n\tdata: { items: {}, order: [] },\n\tinitialData: {\n\t\tfrontend: { items: {}, order: [] },\n\t\tpreview: { items: {}, order: [] },\n\t},\n\tisDirty: false,\n};\n\nexport type StateWithGlobalClasses = SliceState< typeof slice >;\n\n// Slice\nconst SLICE_NAME = 'globalClasses';\n\nexport const slice = createSlice( {\n\tname: SLICE_NAME,\n\tinitialState,\n\treducers: {\n\t\tload(\n\t\t\tstate,\n\t\t\t{\n\t\t\t\tpayload: { frontend, preview },\n\t\t\t}: PayloadAction< {\n\t\t\t\tfrontend: GlobalClasses;\n\t\t\t\tpreview: GlobalClasses;\n\t\t\t} >\n\t\t) {\n\t\t\tstate.initialData.frontend = frontend;\n\t\t\tstate.initialData.preview = preview;\n\t\t\tstate.data = preview;\n\n\t\t\tstate.isDirty = false;\n\t\t},\n\n\t\tadd( state, { payload }: PayloadAction< StyleDefinition > ) {\n\t\t\tstate.data.items[ payload.id ] = payload;\n\t\t\tstate.data.order.unshift( payload.id );\n\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\tdelete( state, { payload }: PayloadAction< StyleDefinitionID > ) {\n\t\t\tstate.data.items = Object.fromEntries(\n\t\t\t\tObject.entries( state.data.items ).filter( ( [ id ] ) => id !== payload )\n\t\t\t);\n\n\t\t\tstate.data.order = state.data.order.filter( ( id ) => id !== payload );\n\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\tsetOrder( state, { payload }: PayloadAction< StyleDefinitionID[] > ) {\n\t\t\tstate.data.order = payload;\n\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\tupdate( state, { payload }: PayloadAction< { style: UpdateActionPayload } > ) {\n\t\t\tconst style = state.data.items[ payload.style.id ];\n\n\t\t\tconst mergedData = {\n\t\t\t\t...style,\n\t\t\t\t...payload.style,\n\t\t\t};\n\n\t\t\tstate.data.items[ payload.style.id ] = mergedData;\n\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\tupdateProps(\n\t\t\tstate,\n\t\t\t{\n\t\t\t\tpayload,\n\t\t\t}: PayloadAction< { id: StyleDefinitionID; meta: StyleDefinitionVariant[ 'meta' ]; props: Props } >\n\t\t) {\n\t\t\tconst style = state.data.items[ payload.id ];\n\n\t\t\tif ( ! style ) {\n\t\t\t\tthrow new GlobalClassNotFoundError( { context: { styleId: payload.id } } );\n\t\t\t}\n\n\t\t\tconst variant = getVariantByMeta( style, payload.meta );\n\n\t\t\tif ( variant ) {\n\t\t\t\tvariant.props = mergeProps( variant.props, payload.props );\n\t\t\t} else {\n\t\t\t\tstyle.variants.push( { meta: payload.meta, props: payload.props } );\n\t\t\t}\n\n\t\t\tstate.isDirty = true;\n\t\t},\n\n\t\treset( state, { payload: { context } }: PayloadAction< { context: ApiContext } > ) {\n\t\t\tif ( context === 'frontend' ) {\n\t\t\t\tstate.initialData.frontend = state.data;\n\n\t\t\t\tstate.isDirty = false;\n\t\t\t}\n\n\t\t\tstate.initialData.preview = state.data;\n\t\t},\n\t},\n} );\n\n// Selectors\nexport const selectData = ( state: SliceState< typeof slice > ) => state[ SLICE_NAME ].data;\n\nexport const selectFrontendInitialData = ( state: SliceState< typeof slice > ) =>\n\tstate[ SLICE_NAME ].initialData.frontend;\n\nexport const selectPreviewInitialData = ( state: SliceState< typeof slice > ) =>\n\tstate[ SLICE_NAME ].initialData.preview;\n\nexport const selectOrder = createSelector( selectData, ( { order } ) => order );\n\nexport const selectGlobalClasses = createSelector( selectData, ( { items } ) => items );\n\nexport const selectIsDirty = ( state: SliceState< typeof slice > ) => state[ SLICE_NAME ].isDirty;\n\nexport const selectOrderedClasses = createSelector( selectGlobalClasses, selectOrder, ( items, order ) =>\n\torder.map( ( id ) => items[ id ] )\n);\n\nexport const selectClass = ( state: SliceState< typeof slice >, id: StyleDefinitionID ) =>\n\tstate[ SLICE_NAME ].data.items[ id ] ?? null;\n","import { createError } from '@elementor/utils';\n\nexport const GlobalClassNotFoundError = createError< { styleId: string } >( {\n\tcode: 'global_class_not_found',\n\tmessage: 'Global class not found.',\n} );\n\nexport const GlobalClassLabelAlreadyExistsError = createError< { label: string } >( {\n\tcode: 'global_class_label_already_exists',\n\tmessage: 'Class with this name already exists.',\n} );\n","import { __dispatch as dispatch, __getState as getState } from '@elementor/store';\n\nimport { apiClient, type ApiContext } from './api';\nimport { type GlobalClasses, selectData, selectFrontendInitialData, selectPreviewInitialData, slice } from './store';\n\ntype Options = {\n\tcontext: ApiContext;\n};\n\nexport async function saveGlobalClasses( { context }: Options ) {\n\tconst state = selectData( getState() );\n\n\tif ( context === 'preview' ) {\n\t\tawait apiClient.saveDraft( {\n\t\t\titems: state.items,\n\t\t\torder: state.order,\n\t\t\tchanges: calculateChanges( state, selectPreviewInitialData( getState() ) ),\n\t\t} );\n\t} else {\n\t\tawait apiClient.publish( {\n\t\t\titems: state.items,\n\t\t\torder: state.order,\n\t\t\tchanges: calculateChanges( state, selectFrontendInitialData( getState() ) ),\n\t\t} );\n\t}\n\n\tdispatch( slice.actions.reset( { context } ) );\n}\n\nfunction calculateChanges( state: GlobalClasses, initialData: GlobalClasses ) {\n\tconst stateIds = Object.keys( state.items );\n\tconst initialDataIds = Object.keys( initialData.items );\n\n\treturn {\n\t\tadded: stateIds.filter( ( id ) => ! initialDataIds.includes( id ) ),\n\t\tdeleted: initialDataIds.filter( ( id ) => ! stateIds.includes( id ) ),\n\t\tmodified: stateIds.filter( ( id ) => {\n\t\t\treturn id in initialData.items && hash( state.items[ id ] ) !== hash( initialData.items[ id ] );\n\t\t} ),\n\t};\n}\n\ntype UnknownObject = Record< string, unknown >;\n\n// Inspired by:\n// https://github.com/TanStack/query/blob/66ea5f2fc/packages/query-core/src/utils.ts#L212\nfunction hash( obj: UnknownObject ): string {\n\treturn JSON.stringify( obj, ( _, value ) =>\n\t\tisPlainObject( value )\n\t\t\t? Object.keys( value )\n\t\t\t\t\t.sort()\n\t\t\t\t\t.reduce< UnknownObject >( ( result, key ) => {\n\t\t\t\t\t\tresult[ key ] = value[ key ];\n\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}, {} )\n\t\t\t: value\n\t);\n}\n\nfunction isPlainObject( value: unknown ): value is UnknownObject {\n\treturn !! value && typeof value === 'object' && ! Array.isArray( value );\n}\n","import { type StyleDefinition, type StyleDefinitionID, type StyleDefinitionsMap } from '@elementor/editor-styles';\nimport { type HttpResponse, httpService } from '@elementor/http-client';\n\nimport { type GlobalClasses } from './store';\n\nconst RESOURCE_URL = '/global-classes';\n\nexport type GlobalClassesGetAllResponse = HttpResponse< StyleDefinitionsMap, { order: StyleDefinition[ 'id' ][] } >;\n\ntype UpdatePayload = GlobalClasses & {\n\tchanges: {\n\t\tadded: StyleDefinitionID[];\n\t\tdeleted: StyleDefinitionID[];\n\t\tmodified: StyleDefinitionID[];\n\t};\n};\n\nexport type ApiContext = 'preview' | 'frontend';\n\nexport const apiClient = {\n\tall: ( context: ApiContext = 'preview' ) =>\n\t\thttpService().get< GlobalClassesGetAllResponse >( 'elementor/v1' + RESOURCE_URL, {\n\t\t\tparams: { context },\n\t\t} ),\n\n\tpublish: ( payload: UpdatePayload ) =>\n\t\thttpService().put( 'elementor/v1' + RESOURCE_URL, payload, {\n\t\t\tparams: {\n\t\t\t\tcontext: 'frontend' satisfies ApiContext,\n\t\t\t},\n\t\t} ),\n\n\tsaveDraft: ( payload: UpdatePayload ) =>\n\t\thttpService().put( 'elementor/v1' + RESOURCE_URL, payload, {\n\t\t\tparams: {\n\t\t\t\tcontext: 'preview' satisfies ApiContext,\n\t\t\t},\n\t\t} ),\n};\n","import * as React from 'react';\nimport { useState } from 'react';\nimport { useSuppressedMessage } from '@elementor/editor-current-user';\nimport { IntroductionModal } from '@elementor/editor-ui';\nimport { Box, Image, Typography } from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nconst MESSAGE_KEY = 'global-class-manager';\n\nexport const ClassManagerIntroduction = () => {\n\tconst [ isMessageSuppressed, suppressMessage ] = useSuppressedMessage( MESSAGE_KEY );\n\tconst [ shouldShowIntroduction, setShouldShowIntroduction ] = useState( ! isMessageSuppressed );\n\n\treturn (\n\t\t<IntroductionModal\n\t\t\topen={ shouldShowIntroduction }\n\t\t\ttitle={ __( 'Class Manager', 'elementor' ) }\n\t\t\thandleClose={ ( shouldShowAgain ) => {\n\t\t\t\tif ( ! shouldShowAgain ) {\n\t\t\t\t\tsuppressMessage();\n\t\t\t\t}\n\n\t\t\t\tsetShouldShowIntroduction( false );\n\t\t\t} }\n\t\t>\n\t\t\t<Image\n\t\t\t\tsx={ { width: '100%', aspectRatio: '16 / 9' } }\n\t\t\t\tsrc={ 'https://assets.elementor.com/packages/v1/images/class-manager-intro.svg' }\n\t\t\t\talt={ '' }\n\t\t\t/>\n\t\t\t<IntroductionContent />\n\t\t</IntroductionModal>\n\t);\n};\n\nconst IntroductionContent = () => {\n\treturn (\n\t\t<Box p={ 3 }>\n\t\t\t<Typography variant={ 'body2' }>\n\t\t\t\t{ __(\n\t\t\t\t\t\"The Class Manager lets you see all the classes you've created, plus adjust their priority, rename them, and delete unused classes to keep your CSS structured.\",\n\t\t\t\t\t'elementor'\n\t\t\t\t) }\n\t\t\t</Typography>\n\t\t\t<br />\n\t\t\t<Typography variant={ 'body2' }>\n\t\t\t\t{ __(\n\t\t\t\t\t'Remember, when editing an item within a specific class, any changes you make will apply across all elements in that class.',\n\t\t\t\t\t'elementor'\n\t\t\t\t) }\n\t\t\t</Typography>\n\t\t</Box>\n\t);\n};\n","import { getCurrentDocument, getV1DocumentsManager } from '@elementor/editor-documents';\nimport { __privateRunCommand as runCommand } from '@elementor/editor-v1-adapters';\nimport { __dispatch as dispatch } from '@elementor/store';\n\nimport { slice } from '../../store';\n\nlet isDeleted = false;\n\nexport const deleteClass = ( id: string ) => {\n\tdispatch( slice.actions.delete( id ) );\n\n\tisDeleted = true;\n};\n\nexport const onDelete = async () => {\n\tawait reloadDocument();\n\n\tisDeleted = false;\n};\n\nexport const hasDeletedItems = () => isDeleted;\n\n// When deleting a class, we remove it from all the documents that have it applied.\n// In order to reflect the changes in the active document, we need to reload it.\nconst reloadDocument = () => {\n\tconst currentDocument = getCurrentDocument();\n\tconst documentsManager = getV1DocumentsManager();\n\n\tdocumentsManager.invalidateCache();\n\n\treturn runCommand( 'editor/documents/switch', {\n\t\tid: currentDocument?.id,\n\t\tshouldScroll: false,\n\t\tshouldNavigateToDefaultRoute: false,\n\t} );\n};\n","import * as React from 'react';\nimport { ColorSwatchIcon } from '@elementor/icons';\nimport { type SvgIconProps } from '@elementor/ui';\n\nexport const FlippedColorSwatchIcon = ( { sx, ...props }: SvgIconProps ) => (\n\t<ColorSwatchIcon sx={ { transform: 'rotate(90deg)', ...sx } } { ...props } />\n);\n","import * as React from 'react';\nimport { useRef } from 'react';\nimport { type StyleDefinitionID } from '@elementor/editor-styles';\nimport { validateStyleLabel } from '@elementor/editor-styles-repository';\nimport { EditableField, EllipsisWithTooltip, MenuListItem, useEditable, WarningInfotip } from '@elementor/editor-ui';\nimport { DotsVerticalIcon } from '@elementor/icons';\nimport { __useDispatch as useDispatch } from '@elementor/store';\nimport {\n\tbindMenu,\n\tbindTrigger,\n\tBox,\n\tIconButton,\n\tList,\n\tListItemButton,\n\ttype ListItemButtonProps,\n\tMenu,\n\tStack,\n\tstyled,\n\ttype Theme,\n\tTooltip,\n\tTypography,\n\ttype TypographyProps,\n\tusePopupState,\n} from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { useClassesOrder } from '../../hooks/use-classes-order';\nimport { useOrderedClasses } from '../../hooks/use-ordered-classes';\nimport { slice } from '../../store';\nimport { DeleteConfirmationProvider, useDeleteConfirmation } from './delete-confirmation-dialog';\nimport { FlippedColorSwatchIcon } from './flipped-color-swatch-icon';\nimport { SortableItem, SortableProvider, SortableTrigger, type SortableTriggerProps } from './sortable';\n\nexport const GlobalClassesList = ( { disabled }: { disabled?: boolean } ) => {\n\tconst cssClasses = useOrderedClasses();\n\tconst dispatch = useDispatch();\n\n\tconst [ classesOrder, reorderClasses ] = useReorder();\n\n\tif ( ! cssClasses?.length ) {\n\t\treturn <EmptyState />;\n\t}\n\n\treturn (\n\t\t<DeleteConfirmationProvider>\n\t\t\t<List sx={ { display: 'flex', flexDirection: 'column', gap: 0.5 } }>\n\t\t\t\t<SortableProvider value={ classesOrder } onChange={ reorderClasses }>\n\t\t\t\t\t{ cssClasses?.map( ( { id, label } ) => {\n\t\t\t\t\t\tconst renameClass = ( newLabel: string ) => {\n\t\t\t\t\t\t\tdispatch(\n\t\t\t\t\t\t\t\tslice.actions.update( {\n\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\tlabel: newLabel,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<SortableItem key={ id } id={ id }>\n\t\t\t\t\t\t\t\t{ ( { isDragged, isDragPlaceholder, triggerProps, triggerStyle } ) => (\n\t\t\t\t\t\t\t\t\t<ClassItem\n\t\t\t\t\t\t\t\t\t\tid={ id }\n\t\t\t\t\t\t\t\t\t\tlabel={ label }\n\t\t\t\t\t\t\t\t\t\trenameClass={ renameClass }\n\t\t\t\t\t\t\t\t\t\tselected={ isDragged }\n\t\t\t\t\t\t\t\t\t\tdisabled={ disabled || isDragPlaceholder }\n\t\t\t\t\t\t\t\t\t\tsortableTriggerProps={ { ...triggerProps, style: triggerStyle } }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</SortableItem>\n\t\t\t\t\t\t);\n\t\t\t\t\t} ) }\n\t\t\t\t</SortableProvider>\n\t\t\t</List>\n\t\t</DeleteConfirmationProvider>\n\t);\n};\n\nconst useReorder = () => {\n\tconst dispatch = useDispatch();\n\tconst order = useClassesOrder();\n\n\tconst reorder = ( newIds: StyleDefinitionID[] ) => {\n\t\tdispatch( slice.actions.setOrder( newIds ) );\n\t};\n\n\treturn [ order, reorder ] as const;\n};\n\ntype ClassItemProps = React.PropsWithChildren< {\n\tid: string;\n\tlabel: string;\n\trenameClass: ( newLabel: string ) => void;\n\tselected?: boolean;\n\tdisabled?: boolean;\n\tsortableTriggerProps: SortableTriggerProps;\n} >;\n\nconst ClassItem = ( { id, label, renameClass, selected, disabled, sortableTriggerProps }: ClassItemProps ) => {\n\tconst itemRef = useRef< HTMLElement >( null );\n\n\tconst {\n\t\tref: editableRef,\n\t\topenEditMode,\n\t\tisEditing,\n\t\terror,\n\t\tgetProps: getEditableProps,\n\t} = useEditable( {\n\t\tvalue: label,\n\t\tonSubmit: renameClass,\n\t\tvalidation: validateLabel,\n\t} );\n\n\tconst { openDialog } = useDeleteConfirmation();\n\n\tconst popupState = usePopupState( {\n\t\tvariant: 'popover',\n\t\tdisableAutoFocus: true,\n\t} );\n\n\tconst isSelected = ( selected || popupState.isOpen ) && ! disabled;\n\n\treturn (\n\t\t<>\n\t\t\t<Stack p={ 0 }>\n\t\t\t\t<WarningInfotip\n\t\t\t\t\topen={ Boolean( error ) }\n\t\t\t\t\ttext={ error ?? '' }\n\t\t\t\t\tplacement=\"bottom\"\n\t\t\t\t\twidth={ itemRef.current?.getBoundingClientRect().width }\n\t\t\t\t\toffset={ [ 0, -15 ] }\n\t\t\t\t>\n\t\t\t\t\t<StyledListItemButton\n\t\t\t\t\t\tref={ itemRef }\n\t\t\t\t\t\tdense\n\t\t\t\t\t\tdisableGutters\n\t\t\t\t\t\tshowActions={ isSelected || isEditing }\n\t\t\t\t\t\tshape=\"rounded\"\n\t\t\t\t\t\tonDoubleClick={ openEditMode }\n\t\t\t\t\t\tselected={ isSelected }\n\t\t\t\t\t\tdisabled={ disabled }\n\t\t\t\t\t\tfocusVisibleClassName=\"visible-class-item\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<SortableTrigger { ...sortableTriggerProps } />\n\t\t\t\t\t\t<Indicator isActive={ isEditing } isError={ !! error }>\n\t\t\t\t\t\t\t{ isEditing ? (\n\t\t\t\t\t\t\t\t<EditableField\n\t\t\t\t\t\t\t\t\tref={ editableRef }\n\t\t\t\t\t\t\t\t\tas={ Typography }\n\t\t\t\t\t\t\t\t\tvariant=\"caption\"\n\t\t\t\t\t\t\t\t\t{ ...getEditableProps() }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<EllipsisWithTooltip title={ label } as={ Typography } variant=\"caption\" />\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</Indicator>\n\t\t\t\t\t\t<Tooltip\n\t\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t\tclassName={ 'class-item-more-actions' }\n\t\t\t\t\t\t\ttitle={ __( 'More actions', 'elementor' ) }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<IconButton size=\"tiny\" { ...bindTrigger( popupState ) } aria-label=\"More actions\">\n\t\t\t\t\t\t\t\t<DotsVerticalIcon fontSize=\"tiny\" />\n\t\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t</StyledListItemButton>\n\t\t\t\t</WarningInfotip>\n\t\t\t</Stack>\n\t\t\t<Menu\n\t\t\t\t{ ...bindMenu( popupState ) }\n\t\t\t\tanchorOrigin={ {\n\t\t\t\t\tvertical: 'bottom',\n\t\t\t\t\thorizontal: 'right',\n\t\t\t\t} }\n\t\t\t\ttransformOrigin={ {\n\t\t\t\t\tvertical: 'top',\n\t\t\t\t\thorizontal: 'right',\n\t\t\t\t} }\n\t\t\t>\n\t\t\t\t<MenuListItem\n\t\t\t\t\tsx={ { minWidth: '160px' } }\n\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\tpopupState.close();\n\t\t\t\t\t\topenEditMode();\n\t\t\t\t\t} }\n\t\t\t\t>\n\t\t\t\t\t<Typography variant=\"caption\" sx={ { color: 'text.primary' } }>\n\t\t\t\t\t\t{ __( 'Rename', 'elementor' ) }\n\t\t\t\t\t</Typography>\n\t\t\t\t</MenuListItem>\n\t\t\t\t<MenuListItem\n\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\tpopupState.close();\n\t\t\t\t\t\topenDialog( { id, label } );\n\t\t\t\t\t} }\n\t\t\t\t>\n\t\t\t\t\t<Typography variant=\"caption\" sx={ { color: 'error.light' } }>\n\t\t\t\t\t\t{ __( 'Delete', 'elementor' ) }\n\t\t\t\t\t</Typography>\n\t\t\t\t</MenuListItem>\n\t\t\t</Menu>\n\t\t</>\n\t);\n};\n\n// Custom styles for sortable list item, until the component is available in the UI package.\nconst StyledListItemButton = styled( ListItemButton, {\n\tshouldForwardProp: ( prop: string ) => ! [ 'showActions' ].includes( prop ),\n} )< ListItemButtonProps & { showActions: boolean } >(\n\t( { showActions } ) => `\n\tmin-height: 36px;\n\n\t&.visible-class-item {\n\t\tbox-shadow: none !important;\n\t}\n\n\t.class-item-more-actions, .class-item-sortable-trigger {\n\t\tvisibility: ${ showActions ? 'visible' : 'hidden' };\n\t}\n\n\t.class-item-sortable-trigger {\n\t\tvisibility: ${ showActions ? 'visible' : 'hidden' };\n\t}\n\n\t&:hover&:not(:disabled) {\n\t\t.class-item-more-actions, .class-item-sortable-trigger {\n\t\t\tvisibility: visible;\n\t\t}\n\t}\n`\n);\n\nconst EmptyState = () => (\n\t<Stack alignItems=\"center\" gap={ 1.5 } pt={ 10 } px={ 0.5 } maxWidth=\"260px\" margin=\"auto\">\n\t\t<FlippedColorSwatchIcon fontSize=\"large\" />\n\t\t<StyledHeader variant=\"subtitle2\" component=\"h2\" color=\"text.secondary\">\n\t\t\t{ __( 'There are no global classes yet.', 'elementor' ) }\n\t\t</StyledHeader>\n\t\t<Typography align=\"center\" variant=\"caption\" color=\"text.secondary\">\n\t\t\t{ __(\n\t\t\t\t'CSS classes created in the editor panel will appear here. Once they are available, you can arrange their hierarchy, rename them, or delete them as needed.',\n\t\t\t\t'elementor'\n\t\t\t) }\n\t\t</Typography>\n\t</Stack>\n);\n\n// Override panel reset styles.\nconst StyledHeader = styled( Typography )< TypographyProps >( ( { theme, variant } ) => ( {\n\t'&.MuiTypography-root': {\n\t\t...( theme.typography[ variant as keyof typeof theme.typography ] as React.CSSProperties ),\n\t},\n} ) );\n\nconst Indicator = styled( Box, {\n\tshouldForwardProp: ( prop: string ) => ! [ 'isActive', 'isError' ].includes( prop ),\n} )< { isActive: boolean; isError: boolean } >( ( { theme, isActive, isError } ) => ( {\n\tdisplay: 'flex',\n\twidth: '100%',\n\tflexGrow: 1,\n\tborderRadius: theme.spacing( 0.5 ),\n\tborder: getIndicatorBorder( { isActive, isError, theme } ),\n\tpadding: `0 ${ theme.spacing( 1 ) }`,\n\tmarginLeft: isActive ? theme.spacing( 1 ) : 0,\n\tminWidth: 0,\n} ) );\n\nconst getIndicatorBorder = ( { isActive, isError, theme }: { isActive: boolean; isError: boolean; theme: Theme } ) => {\n\tif ( isError ) {\n\t\treturn `2px solid ${ theme.palette.error.main }`;\n\t}\n\n\tif ( isActive ) {\n\t\treturn `2px solid ${ theme.palette.secondary.main }`;\n\t}\n\n\treturn 'none';\n};\n\nconst validateLabel = ( newLabel: string ) => {\n\tconst result = validateStyleLabel( newLabel, 'rename' );\n\n\tif ( result.isValid ) {\n\t\treturn null;\n\t}\n\n\treturn result.errorMessage;\n};\n","import { __useSelector as useSelector } from '@elementor/store';\n\nimport { selectOrder } from '../store';\n\nexport const useClassesOrder = () => {\n\treturn useSelector( selectOrder );\n};\n","import { __useSelector as useSelector } from '@elementor/store';\n\nimport { selectOrderedClasses } from '../store';\n\nexport const useOrderedClasses = () => {\n\treturn useSelector( selectOrderedClasses );\n};\n","import * as React from 'react';\nimport { createContext, useContext, useState } from 'react';\nimport { type StyleDefinition } from '@elementor/editor-styles';\nimport { AlertOctagonFilledIcon } from '@elementor/icons';\nimport {\n\tButton,\n\tDialog,\n\tDialogActions,\n\tDialogContent,\n\tDialogContentText,\n\tDialogTitle,\n\tTypography,\n} from '@elementor/ui';\nimport { __ } from '@wordpress/i18n';\n\nimport { deleteClass } from './delete-class';\n\ntype DeleteConfirmationDialogProps = Pick< StyleDefinition, 'id' | 'label' >;\n\ntype DeleteConfirmationContext = {\n\topenDialog: ( props: DeleteConfirmationDialogProps ) => void;\n\tcloseDialog: () => void;\n\tdialogProps: DeleteConfirmationDialogProps | null;\n};\n\nconst context = createContext< DeleteConfirmationContext | null >( null );\n\nexport const DeleteConfirmationProvider = ( { children }: React.PropsWithChildren ) => {\n\tconst [ dialogProps, setDialogProps ] = useState< DeleteConfirmationDialogProps | null >( null );\n\n\tconst openDialog = ( props: DeleteConfirmationDialogProps ) => {\n\t\tsetDialogProps( props );\n\t};\n\n\tconst closeDialog = () => {\n\t\tsetDialogProps( null );\n\t};\n\n\treturn (\n\t\t<context.Provider value={ { openDialog, closeDialog, dialogProps } }>\n\t\t\t{ children }\n\t\t\t{ !! dialogProps && <DeleteConfirmationDialog { ...dialogProps } /> }\n\t\t</context.Provider>\n\t);\n};\n\nconst TITLE_ID = 'delete-class-dialog';\n\nconst DeleteConfirmationDialog = ( { label, id }: DeleteConfirmationDialogProps ) => {\n\tconst { closeDialog } = useDeleteConfirmation();\n\n\tconst onConfirm = () => {\n\t\tdeleteClass( id );\n\n\t\tcloseDialog();\n\t};\n\n\treturn (\n\t\t<Dialog open onClose={ closeDialog } aria-labelledby={ TITLE_ID } maxWidth=\"xs\">\n\t\t\t<DialogTitle id={ TITLE_ID } display=\"flex\" alignItems=\"center\" gap={ 1 } sx={ { lineHeight: 1 } }>\n\t\t\t\t<AlertOctagonFilledIcon color=\"error\" />\n\t\t\t\t{ __( 'Delete this class?', 'elementor' ) }\n\t\t\t</DialogTitle>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogContentText variant=\"body2\" color=\"textPrimary\">\n\t\t\t\t\t{ __( 'Deleting', 'elementor' ) }\n\t\t\t\t\t<Typography variant=\"subtitle2\" component=\"span\">\n\t\t\t\t\t\t { label } \n\t\t\t\t\t</Typography>\n\t\t\t\t\t{ __(\n\t\t\t\t\t\t'will permanently remove it from your project and may affect the design across all elements using it. This action cannot be undone.',\n\t\t\t\t\t\t'elementor'\n\t\t\t\t\t) }\n\t\t\t\t</DialogContentText>\n\t\t\t</DialogContent>\n\t\t\t<DialogActions>\n\t\t\t\t<Button color=\"secondary\" onClick={ closeDialog }>\n\t\t\t\t\t{ __( 'Not now', 'elementor' ) }\n\t\t\t\t</Button>\n\t\t\t\t<Button variant=\"contained\" color=\"error\" onClick={ onConfirm }>\n\t\t\t\t\t{ __( 'Delete', 'elementor' ) }\n\t\t\t\t</Button>\n\t\t\t</DialogActions>\n\t\t</Dialog>\n\t);\n};\n\nexport const useDeleteConfirmation = () => {\n\tconst contextValue = useContext( context );\n\n\tif ( ! contextValue ) {\n\t\tthrow new Error( 'useDeleteConfirmation must be used within a DeleteConfirmationProvider' );\n\t}\n\n\treturn contextValue;\n};\n","import * as React from 'react';\nimport { GripVerticalIcon } from '@elementor/icons';\nimport {\n\tBox,\n\tstyled,\n\tUnstableSortableItem,\n\ttype UnstableSortableItemProps,\n\ttype UnstableSortableItemRenderProps,\n\tUnstableSortableProvider,\n\ttype UnstableSortableProviderProps,\n} from '@elementor/ui';\n\nexport const SortableProvider = < T extends string >( props: UnstableSortableProviderProps< T > ) => (\n\t<UnstableSortableProvider restrictAxis variant=\"static\" dragPlaceholderStyle={ { opacity: '1' } } { ...props } />\n);\n\nexport type SortableTriggerProps = React.HTMLAttributes< HTMLDivElement >;\n\nexport const SortableTrigger = ( props: SortableTriggerProps ) => (\n\t<StyledSortableTrigger { ...props } role=\"button\" className=\"class-item-sortable-trigger\">\n\t\t<GripVerticalIcon fontSize=\"tiny\" />\n\t</StyledSortableTrigger>\n);\n\ntype SortableItemProps = {\n\tid: UnstableSortableItemProps[ 'id' ];\n\tchildren: ( props: Partial< UnstableSortableItemRenderProps > ) => React.ReactNode;\n};\n\nexport const SortableItem = ( { children, id, ...props }: SortableItemProps ) => {\n\treturn (\n\t\t<UnstableSortableItem\n\t\t\t{ ...props }\n\t\t\tid={ id }\n\t\t\trender={ ( {\n\t\t\t\titemProps,\n\t\t\t\tisDragged,\n\t\t\t\ttriggerProps,\n\t\t\t\titemStyle,\n\t\t\t\ttriggerStyle,\n\t\t\t\tdropIndicationStyle,\n\t\t\t\tshowDropIndication,\n\t\t\t\tisDragOverlay,\n\t\t\t\tisDragPlaceholder,\n\t\t\t}: UnstableSortableItemRenderProps ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<Box\n\t\t\t\t\t\t{ ...itemProps }\n\t\t\t\t\t\tstyle={ itemStyle }\n\t\t\t\t\t\tcomponent={ 'li' }\n\t\t\t\t\t\trole=\"listitem\"\n\t\t\t\t\t\tsx={ {\n\t\t\t\t\t\t\tbackgroundColor: isDragOverlay ? 'background.paper' : undefined,\n\t\t\t\t\t\t} }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ children( {\n\t\t\t\t\t\t\titemProps,\n\t\t\t\t\t\t\tisDragged,\n\t\t\t\t\t\t\ttriggerProps,\n\t\t\t\t\t\t\titemStyle,\n\t\t\t\t\t\t\ttriggerStyle,\n\t\t\t\t\t\t\tisDragPlaceholder,\n\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t{ showDropIndication && <SortableItemIndicator style={ dropIndicationStyle } /> }\n\t\t\t\t\t</Box>\n\t\t\t\t);\n\t\t\t} }\n\t\t/>\n\t);\n};\n\nconst StyledSortableTrigger = styled( 'div' )( ( { theme } ) => ( {\n\tposition: 'absolute',\n\tleft: 0,\n\ttop: '50%',\n\ttransform: `translate( -${ theme.spacing( 1.5 ) }, -50% )`,\n\tcolor: theme.palette.action.active,\n} ) );\n\nconst SortableItemIndicator = styled( Box )`\n\twidth: 100%;\n\theight: 1px;\n\tbackground-color: ${ ( { theme } ) => theme.palette.text.primary };\n`;\n","type ExtendedWindow = Window & {\n\t$e?: {\n\t\tcomponents?: {\n\t\t\tget?: ( name: 'panel' ) =>\n\t\t\t\t| {\n\t\t\t\t\t\tblockUserInteractions?: () => void;\n\t\t\t\t\t\tunblockUserInteractions?: () => void;\n\t\t\t\t }\n\t\t\t\t| undefined;\n\t\t};\n\t};\n};\n\nexport function blockPanelInteractions() {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\textendedWindow.$e?.components?.get?.( 'panel' )?.blockUserInteractions?.();\n}\n\nexport function unblockPanelInteractions() {\n\tconst extendedWindow = window as unknown as ExtendedWindow;\n\n\textendedWindow.$e?.components?.get?.( 'panel' )?.unblockUserInteractions?.();\n}\n","import * as React from 'react';\nimport { useState } from 'react';\nimport { AlertTriangleFilledIcon } from '@elementor/icons';\nimport {\n\tButton,\n\tDialog,\n\tDialogActions,\n\tDialogContent,\n\tDialogContentText,\n\ttype DialogContentTextProps,\n\ttype DialogProps,\n\tDialogTitle,\n} from '@elementor/ui';\n\nconst TITLE_ID = 'save-changes-dialog';\n\nconst SaveChangesDialog = ( { children, onClose }: Pick< DialogProps, 'children' | 'onClose' > ) => (\n\t<Dialog open onClose={ onClose } aria-labelledby={ TITLE_ID } maxWidth=\"xs\">\n\t\t{ children }\n\t</Dialog>\n);\n\nconst SaveChangesDialogTitle = ( { children }: React.PropsWithChildren ) => (\n\t<DialogTitle id={ TITLE_ID } display=\"flex\" alignItems=\"center\" gap={ 1 } sx={ { lineHeight: 1 } }>\n\t\t<AlertTriangleFilledIcon color=\"secondary\" />\n\t\t{ children }\n\t</DialogTitle>\n);\n\nconst SaveChangesDialogContent = ( { children }: React.PropsWithChildren ) => (\n\t<DialogContent>{ children }</DialogContent>\n);\n\nconst SaveChangesDialogContentText = ( props: DialogContentTextProps ) => (\n\t<DialogContentText variant=\"body2\" color=\"textPrimary\" display=\"flex\" flexDirection=\"column\" { ...props } />\n);\n\ntype Action = {\n\tlabel: string;\n\taction: () => void | Promise< void >;\n};\n\ntype ConfirmationDialogActionsProps = {\n\tactions: {\n\t\tcancel: Action;\n\t\tconfirm: Action;\n\t};\n};\nconst SaveChangesDialogActions = ( { actions }: ConfirmationDialogActionsProps ) => {\n\tconst [ isConfirming, setIsConfirming ] = useState( false );\n\tconst { cancel, confirm } = actions;\n\n\tconst onConfirm = async () => {\n\t\tsetIsConfirming( true );\n\t\tawait confirm.action();\n\t\tsetIsConfirming( false );\n\t};\n\treturn (\n\t\t<DialogActions>\n\t\t\t<Button variant=\"text\" color=\"secondary\" onClick={ cancel.action }>\n\t\t\t\t{ cancel.label }\n\t\t\t</Button>\n\t\t\t<Button variant=\"contained\" color=\"secondary\" onClick={ onConfirm } loading={ isConfirming }>\n\t\t\t\t{ confirm.label }\n\t\t\t</Button>\n\t\t</DialogActions>\n\t);\n};\n\nSaveChangesDialog.Title = SaveChangesDialogTitle;\nSaveChangesDialog.Content = SaveChangesDialogContent;\nSaveChangesDialog.ContentText = SaveChangesDialogContentText;\nSaveChangesDialog.Actions = SaveChangesDialogActions;\n\nconst useDialog = () => {\n\tconst [ isOpen, setIsOpen ] = useState( false );\n\n\tconst open = () => setIsOpen( true );\n\tconst close = () => setIsOpen( false );\n\n\treturn { isOpen, open, close };\n};\n\nexport { SaveChangesDialog, useDialog };\n","import { useEffect } from 'react';\nimport { __useDispatch as useDispatch } from '@elementor/store';\n\nimport { apiClient } from '../api';\nimport { slice } from '../store';\n\nexport function PopulateStore() {\n\tconst dispatch = useDispatch();\n\n\tuseEffect( () => {\n\t\tPromise.all( [ apiClient.all( 'preview' ), apiClient.all( 'frontend' ) ] ).then(\n\t\t\t( [ previewRes, frontendRes ] ) => {\n\t\t\t\tconst { data: previewData } = previewRes;\n\t\t\t\tconst { data: frontendData } = frontendRes;\n\n\t\t\t\tdispatch(\n\t\t\t\t\tslice.actions.load( {\n\t\t\t\t\t\tpreview: {\n\t\t\t\t\t\t\titems: previewData.data,\n\t\t\t\t\t\t\torder: previewData.meta.order,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfrontend: {\n\t\t\t\t\t\t\titems: frontendData.data,\n\t\t\t\t\t\t\torder: frontendData.meta.order,\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}, [ dispatch ] );\n\n\treturn null;\n}\n","import { generateId } from '@elementor/editor-styles';\nimport { createStylesProvider } from '@elementor/editor-styles-repository';\nimport {\n\t__dispatch as dispatch,\n\t__getState as getState,\n\t__subscribeWithSelector as subscribeWithSelector,\n} from '@elementor/store';\nimport { __ } from '@wordpress/i18n';\n\nimport { GlobalClassLabelAlreadyExistsError } from './errors';\nimport { selectClass, selectGlobalClasses, selectOrderedClasses, slice, type StateWithGlobalClasses } from './store';\n\nconst MAX_CLASSES = 50;\n\nexport const globalClassesStylesProvider = createStylesProvider( {\n\tkey: 'global-classes',\n\tpriority: 30,\n\tlimit: MAX_CLASSES,\n\tlabels: {\n\t\tsingular: __( 'class', 'elementor' ),\n\t\tplural: __( 'classes', 'elementor' ),\n\t},\n\tsubscribe: ( cb ) => subscribeWithSelector( ( state: StateWithGlobalClasses ) => state.globalClasses, cb ),\n\tactions: {\n\t\tall: () => selectOrderedClasses( getState() ),\n\t\tget: ( id ) => selectClass( getState(), id ),\n\t\tcreate: ( label ) => {\n\t\t\tconst classes = selectGlobalClasses( getState() );\n\n\t\t\tconst existingLabels = Object.values( classes ).map( ( style ) => style.label );\n\n\t\t\tif ( existingLabels.includes( label ) ) {\n\t\t\t\tthrow new GlobalClassLabelAlreadyExistsError( { context: { label } } );\n\t\t\t}\n\n\t\t\tconst existingIds = Object.keys( classes );\n\t\t\tconst id = generateId( 'g-', existingIds );\n\n\t\t\tdispatch(\n\t\t\t\tslice.actions.add( {\n\t\t\t\t\tid,\n\t\t\t\t\ttype: 'class',\n\t\t\t\t\tlabel,\n\t\t\t\t\tvariants: [],\n\t\t\t\t} )\n\t\t\t);\n\n\t\t\treturn id;\n\t\t},\n\t\tupdate: ( payload ) => {\n\t\t\tdispatch(\n\t\t\t\tslice.actions.update( {\n\t\t\t\t\tstyle: payload,\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\t\tdelete: ( id ) => {\n\t\t\tdispatch( slice.actions.delete( id ) );\n\t\t},\n\t\tupdateProps: ( args ) => {\n\t\t\tdispatch(\n\t\t\t\tslice.actions.updateProps( {\n\t\t\t\t\tid: args.id,\n\t\t\t\t\tmeta: args.meta,\n\t\t\t\t\tprops: args.props,\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\t},\n} );\n","import { setDocumentModifiedStatus } from '@elementor/editor-documents';\nimport { registerDataHook } from '@elementor/editor-v1-adapters';\nimport { __getState as getState, __subscribeWithSelector as subscribeWithSelector } from '@elementor/store';\n\nimport { saveGlobalClasses } from './save-global-classes';\nimport { selectIsDirty } from './store';\n\nexport function syncWithDocumentSave() {\n\tconst unsubscribe = syncDirtyState();\n\n\tbindSaveAction();\n\n\treturn unsubscribe;\n}\n\nfunction syncDirtyState() {\n\treturn subscribeWithSelector( selectIsDirty, () => {\n\t\tif ( ! isDirty() ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetDocumentModifiedStatus( true );\n\t} );\n}\n\nfunction bindSaveAction() {\n\tregisterDataHook( 'after', 'document/save/save', ( args ) => {\n\t\treturn saveGlobalClasses( {\n\t\t\tcontext: args.status === 'publish' ? 'frontend' : 'preview',\n\t\t} );\n\t} );\n}\n\nfunction isDirty() {\n\treturn selectIsDirty( getState() );\n}\n"],"mappings":"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","names":["React","IconButton","Tooltip","__","React","Box","Button","IconButton","Stack","__","id","context","context","context","id","dispatch","id","dispatch","React","React","Box","styled","Typography","__","useSelector","useSelector","useSelector","useSelector","React","useState","Typography","__","useState","id","__","Typography","React","Box","id","dispatch","id","Typography","__","styled","Box","React","useState","Button","Dialog","DialogActions","DialogContent","DialogContentText","DialogTitle","TITLE_ID","isDirty","Stack","__","Button","IconButton","Box","Tooltip","__","IconButton","useEffect","useDispatch","dispatch","useDispatch","useEffect","dispatch","getState","__","__","getState","id","dispatch","setDocumentModifiedStatus","getState","subscribeWithSelector","subscribeWithSelector","setDocumentModifiedStatus","getState"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elementor/editor-global-classes",
|
|
3
|
-
"version": "0.17.
|
|
3
|
+
"version": "0.17.7",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": "Elementor Team",
|
|
6
6
|
"homepage": "https://elementor.com/",
|
|
@@ -39,16 +39,16 @@
|
|
|
39
39
|
"dev": "tsup --config=../../tsup.dev.ts"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@elementor/editor": "0.19.
|
|
42
|
+
"@elementor/editor": "0.19.3",
|
|
43
43
|
"@elementor/editor-current-user": "0.3.2",
|
|
44
|
-
"@elementor/editor-documents": "0.13.
|
|
45
|
-
"@elementor/editor-editing-panel": "1.
|
|
46
|
-
"@elementor/editor-panels": "0.15.
|
|
44
|
+
"@elementor/editor-documents": "0.13.5",
|
|
45
|
+
"@elementor/editor-editing-panel": "1.36.0",
|
|
46
|
+
"@elementor/editor-panels": "0.15.3",
|
|
47
47
|
"@elementor/editor-props": "0.12.0",
|
|
48
|
-
"@elementor/editor-styles": "0.6.
|
|
49
|
-
"@elementor/editor-styles-repository": "0.8.
|
|
50
|
-
"@elementor/editor-ui": "0.8.
|
|
51
|
-
"@elementor/editor-v1-adapters": "0.
|
|
48
|
+
"@elementor/editor-styles": "0.6.7",
|
|
49
|
+
"@elementor/editor-styles-repository": "0.8.8",
|
|
50
|
+
"@elementor/editor-ui": "0.8.2",
|
|
51
|
+
"@elementor/editor-v1-adapters": "0.12.0",
|
|
52
52
|
"@elementor/http-client": "0.3.0",
|
|
53
53
|
"@elementor/icons": "1.40.1",
|
|
54
54
|
"@elementor/query": "0.2.4",
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
+
import { useRef } from 'react';
|
|
2
3
|
import { type StyleDefinitionID } from '@elementor/editor-styles';
|
|
3
4
|
import { validateStyleLabel } from '@elementor/editor-styles-repository';
|
|
4
|
-
import { EditableField, EllipsisWithTooltip, MenuListItem, useEditable } from '@elementor/editor-ui';
|
|
5
|
+
import { EditableField, EllipsisWithTooltip, MenuListItem, useEditable, WarningInfotip } from '@elementor/editor-ui';
|
|
5
6
|
import { DotsVerticalIcon } from '@elementor/icons';
|
|
6
7
|
import { __useDispatch as useDispatch } from '@elementor/store';
|
|
7
8
|
import {
|
|
@@ -98,6 +99,8 @@ type ClassItemProps = React.PropsWithChildren< {
|
|
|
98
99
|
} >;
|
|
99
100
|
|
|
100
101
|
const ClassItem = ( { id, label, renameClass, selected, disabled, sortableTriggerProps }: ClassItemProps ) => {
|
|
102
|
+
const itemRef = useRef< HTMLElement >( null );
|
|
103
|
+
|
|
101
104
|
const {
|
|
102
105
|
ref: editableRef,
|
|
103
106
|
openEditMode,
|
|
@@ -121,40 +124,50 @@ const ClassItem = ( { id, label, renameClass, selected, disabled, sortableTrigge
|
|
|
121
124
|
|
|
122
125
|
return (
|
|
123
126
|
<>
|
|
124
|
-
<
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
disabled={ disabled }
|
|
132
|
-
focusVisibleClassName="visible-class-item"
|
|
133
|
-
>
|
|
134
|
-
<SortableTrigger { ...sortableTriggerProps } />
|
|
135
|
-
<Indicator isActive={ isEditing } isError={ !! error }>
|
|
136
|
-
{ isEditing ? (
|
|
137
|
-
<EditableField
|
|
138
|
-
ref={ editableRef }
|
|
139
|
-
error={ error }
|
|
140
|
-
as={ Typography }
|
|
141
|
-
variant="caption"
|
|
142
|
-
{ ...getEditableProps() }
|
|
143
|
-
/>
|
|
144
|
-
) : (
|
|
145
|
-
<EllipsisWithTooltip title={ label } as={ Typography } variant="caption" />
|
|
146
|
-
) }
|
|
147
|
-
</Indicator>
|
|
148
|
-
<Tooltip
|
|
149
|
-
placement="top"
|
|
150
|
-
className={ 'class-item-more-actions' }
|
|
151
|
-
title={ __( 'More actions', 'elementor' ) }
|
|
127
|
+
<Stack p={ 0 }>
|
|
128
|
+
<WarningInfotip
|
|
129
|
+
open={ Boolean( error ) }
|
|
130
|
+
text={ error ?? '' }
|
|
131
|
+
placement="bottom"
|
|
132
|
+
width={ itemRef.current?.getBoundingClientRect().width }
|
|
133
|
+
offset={ [ 0, -15 ] }
|
|
152
134
|
>
|
|
153
|
-
<
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
135
|
+
<StyledListItemButton
|
|
136
|
+
ref={ itemRef }
|
|
137
|
+
dense
|
|
138
|
+
disableGutters
|
|
139
|
+
showActions={ isSelected || isEditing }
|
|
140
|
+
shape="rounded"
|
|
141
|
+
onDoubleClick={ openEditMode }
|
|
142
|
+
selected={ isSelected }
|
|
143
|
+
disabled={ disabled }
|
|
144
|
+
focusVisibleClassName="visible-class-item"
|
|
145
|
+
>
|
|
146
|
+
<SortableTrigger { ...sortableTriggerProps } />
|
|
147
|
+
<Indicator isActive={ isEditing } isError={ !! error }>
|
|
148
|
+
{ isEditing ? (
|
|
149
|
+
<EditableField
|
|
150
|
+
ref={ editableRef }
|
|
151
|
+
as={ Typography }
|
|
152
|
+
variant="caption"
|
|
153
|
+
{ ...getEditableProps() }
|
|
154
|
+
/>
|
|
155
|
+
) : (
|
|
156
|
+
<EllipsisWithTooltip title={ label } as={ Typography } variant="caption" />
|
|
157
|
+
) }
|
|
158
|
+
</Indicator>
|
|
159
|
+
<Tooltip
|
|
160
|
+
placement="top"
|
|
161
|
+
className={ 'class-item-more-actions' }
|
|
162
|
+
title={ __( 'More actions', 'elementor' ) }
|
|
163
|
+
>
|
|
164
|
+
<IconButton size="tiny" { ...bindTrigger( popupState ) } aria-label="More actions">
|
|
165
|
+
<DotsVerticalIcon fontSize="tiny" />
|
|
166
|
+
</IconButton>
|
|
167
|
+
</Tooltip>
|
|
168
|
+
</StyledListItemButton>
|
|
169
|
+
</WarningInfotip>
|
|
170
|
+
</Stack>
|
|
158
171
|
<Menu
|
|
159
172
|
{ ...bindMenu( popupState ) }
|
|
160
173
|
anchorOrigin={ {
|